fmode-ng 0.0.41 → 0.0.43
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/LICENSE.md +8 -0
- package/esm2022/fmode-ng.mjs +10 -5
- package/esm2022/lib/aigc/agent/agent.prompt.mjs +10 -122
- package/esm2022/lib/aigc/agent/index.mjs +10 -2
- package/esm2022/lib/aigc/avatar/avatar.module.mjs +10 -45
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/avatar.role.mjs +10 -2
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/comp-avatar-particle.component.mjs +10 -315
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/index.mjs +10 -3
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/role-points.class.mjs +10 -57
- package/esm2022/lib/aigc/avatar/comp-avatar-role-image/comp-avatar-role-image.component.mjs +10 -97
- package/esm2022/lib/aigc/avatar/comp-avatar-role-video/comp-avatar-role-video.component.mjs +10 -104
- package/esm2022/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.mjs +10 -111
- package/esm2022/lib/aigc/avatar/index.mjs +10 -8
- package/esm2022/lib/aigc/avatar/interface-avatar-role.mjs +10 -2
- package/esm2022/lib/aigc/avatar/modal-chat-voice-input/modal-chat-voice-input.component.mjs +8 -166
- package/esm2022/lib/aigc/chat/chat-header-area/comp-header-area.component.mjs +10 -36
- package/esm2022/lib/aigc/chat/chat-header-area/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-list/chat-list.component.mjs +8 -141
- package/esm2022/lib/aigc/chat/chat-list/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-message-area/comp-message-area.component.mjs +10 -40
- package/esm2022/lib/aigc/chat/chat-message-area/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-message-card/comp-message-card.component.mjs +10 -92
- package/esm2022/lib/aigc/chat/chat-message-card/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-modal-input/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.mjs +8 -207
- package/esm2022/lib/aigc/chat/chat-modal-input/modal-input.component.mjs +10 -236
- package/esm2022/lib/aigc/chat/chat-panel/chat-panel.component.mjs +10 -137
- package/esm2022/lib/aigc/chat/comp-role-prompt/comp-role-prompt.component.mjs +10 -69
- package/esm2022/lib/aigc/chat/comp-role-prompt/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/index.mjs +10 -8
- package/esm2022/lib/aigc/comp-markdown-preview/clipboard.service.mjs +10 -82
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-parse.mjs +8 -269
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.component.mjs +10 -51
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.module.mjs +10 -24
- package/esm2022/lib/aigc/comp-markdown-preview/plugins/md-mathjax/index.mjs +10 -94
- package/esm2022/lib/aigc/index.mjs +10 -13
- package/esm2022/lib/aigc/service-fmai/fmai.service.mjs +10 -21
- package/esm2022/lib/aigc/service-fmai/service-chat/chat-class.mjs +8 -736
- package/esm2022/lib/aigc/service-fmai/service-chat/chat.service.mjs +8 -181
- package/esm2022/lib/aigc/service-fmai/service-chat/index.mjs +10 -7
- package/esm2022/lib/aigc/service-fmai/service-chat/mask-list.mjs +9 -194
- package/esm2022/lib/aigc/service-fmai/service-chat/pipes/chat-content.pipe.mjs +10 -27
- package/esm2022/lib/aigc/service-fmai/service-chat/pipes/hidexml.pipe.mjs +10 -27
- package/esm2022/lib/aigc/service-fmai/service-chat/utilnow.pipe.mjs +10 -68
- package/esm2022/lib/aigc/service-fmai/service-imagine/imagine.service.mjs +8 -229
- package/esm2022/lib/aigc/service-fmai/service-imagine/index.mjs +10 -2
- package/esm2022/lib/aigc/voice/audio.player.mjs +10 -52
- package/esm2022/lib/aigc/voice/class-asr.mjs +8 -79
- package/esm2022/lib/aigc/voice/fmode-voice.service.mjs +8 -501
- package/esm2022/lib/aigc/voice/index.mjs +10 -3
- package/esm2022/lib/aigc/voice/lib/pcm2wav.mjs +10 -38
- package/esm2022/lib/aigc/voice/lib/resample.mjs +10 -34
- package/esm2022/lib/aigc/voice/stream.player.mjs +10 -0
- package/esm2022/lib/aigc/voice/tts/fmode-tts-class.mjs +8 -233
- package/esm2022/lib/aigc/voice/tts/index.mjs +10 -2
- package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.component.mjs +10 -190
- package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.module.mjs +10 -33
- package/esm2022/lib/map/index.mjs +10 -4
- package/esm2022/lib/map/map.module.mjs +10 -61
- package/esm2022/lib/map/page-loca-scatter/page-loca-scatter.component.mjs +10 -110
- package/esm2022/lib/map/page-map.start/page-map.start.component.mjs +8 -98
- package/esm2022/lib/map/page-plan-route/page-plan-route.component.mjs +8 -100
- package/esm2022/lib/nova-cloud/index.mjs +10 -2
- package/esm2022/lib/nova-cloud/nova-cloud.service.mjs +10 -148
- package/esm2022/lib/platform/cross.service.mjs +10 -63
- package/esm2022/lib/platform/index.mjs +10 -2
- package/esm2022/lib/social/index.mjs +10 -2
- package/esm2022/lib/social/wechat/wechat-jssdk.service.mjs +8 -236
- package/esm2022/lib/storage/comp-hwobs-manager/hwobs-manager.component.mjs +10 -59
- package/esm2022/lib/storage/index.mjs +10 -5
- package/esm2022/lib/storage/service-hwobs/hwobs.service.mjs +8 -130
- package/esm2022/lib/storage/service-upload/index.mjs +10 -2
- package/esm2022/lib/storage/service-upload/nova-upload.service.mjs +8 -462
- package/esm2022/lib/storage/service-upload/util-file-md5.mjs +10 -28
- package/esm2022/lib/storage/storage.module.mjs +10 -41
- package/esm2022/lib/user/account/account.service.mjs +10 -221
- package/esm2022/lib/user/captcha/captcha.component.mjs +10 -135
- package/esm2022/lib/user/comp-user-avatar/comp-user-avatar.component.mjs +10 -62
- package/esm2022/lib/user/index.mjs +10 -17
- package/esm2022/lib/user/login/auth.guard.mjs +10 -28
- package/esm2022/lib/user/login/auth.service.mjs +8 -373
- package/esm2022/lib/user/login/login.component.mjs +10 -913
- package/esm2022/lib/user/modal-user-login/modal-user-login.component.mjs +10 -273
- package/esm2022/lib/user/profile/auth-profile.guard.mjs +10 -27
- package/esm2022/lib/user/profile/auth-profile.service.mjs +10 -122
- package/esm2022/lib/user/profile/profile-bind/profile-bind.component.mjs +10 -115
- package/esm2022/lib/user/profile/profile.module.mjs +10 -57
- package/esm2022/lib/user/staff/index.mjs +10 -4
- package/esm2022/lib/user/staff/staff.guard.mjs +10 -26
- package/esm2022/lib/user/staff/staff.module.mjs +10 -18
- package/esm2022/lib/user/staff/staff.service.mjs +10 -85
- package/esm2022/lib/user/user-name.pipe.mjs +10 -29
- package/esm2022/lib/user/user.module.mjs +10 -106
- package/esm2022/lib/video/fm-video/fm-video.component.mjs +10 -67
- package/esm2022/lib/video/index.mjs +10 -2
- package/esm2022/public-api.mjs +10 -13
- package/fesm2022/fmode-ng.mjs +7 -8895
- package/fesm2022/fmode-ng.mjs.map +1 -1
- package/lib/aigc/voice/fmode-voice.service.d.ts +18 -1
- package/lib/aigc/voice/stream.player.d.ts +10 -0
- package/lib/aigc/voice/tts/fmode-tts-class.d.ts +2 -2
- package/package.json +1 -1
|
@@ -1,913 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
import { HttpClient } from "@angular/common/http";
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
import * as i1 from "./auth.service";
|
|
12
|
-
import * as i2 from "../../nova-cloud/nova-cloud.service";
|
|
13
|
-
import * as i3 from "@angular/forms";
|
|
14
|
-
import * as i4 from "ng-zorro-antd/message";
|
|
15
|
-
import * as i5 from "@angular/router";
|
|
16
|
-
import * as i6 from "@angular/common/http";
|
|
17
|
-
import * as i7 from "@angular/common";
|
|
18
|
-
import * as i8 from "ng-zorro-antd/input";
|
|
19
|
-
import * as i9 from "ng-zorro-antd/button";
|
|
20
|
-
import * as i10 from "ng-zorro-antd/core/transition-patch";
|
|
21
|
-
import * as i11 from "ng-zorro-antd/core/wave";
|
|
22
|
-
import * as i12 from "ng-zorro-antd/modal";
|
|
23
|
-
import * as i13 from "ng-zorro-antd/spin";
|
|
24
|
-
import * as i14 from "ng-zorro-antd/tabs";
|
|
25
|
-
import * as i15 from "ng-zorro-antd/grid";
|
|
26
|
-
import * as i16 from "ng-zorro-antd/form";
|
|
27
|
-
export class LoginComponent {
|
|
28
|
-
// 绘制验证码
|
|
29
|
-
drawCode(str) {
|
|
30
|
-
// this.resetCode()
|
|
31
|
-
this.canvas = document.getElementById("verifyCanvas"); //获取HTML端画布
|
|
32
|
-
var context = this.canvas.getContext("2d"); //获取画布2D上下文
|
|
33
|
-
context.fillStyle = "white"; //画布填充色
|
|
34
|
-
context.fillRect(0, 0, this.canvas.width, this.canvas.height); //清空画布
|
|
35
|
-
context.fillStyle = "cornflowerblue"; //设置字体颜色
|
|
36
|
-
context.font = "25px Arial"; //设置字体
|
|
37
|
-
var rand = new Array();
|
|
38
|
-
var x = new Array();
|
|
39
|
-
var y = new Array();
|
|
40
|
-
for (var i = 0; i < 4; i++) {
|
|
41
|
-
rand.push(rand[i]);
|
|
42
|
-
rand[i] = this.nums[i];
|
|
43
|
-
x[i] = i * 20 + 10;
|
|
44
|
-
y[i] = Math.random() * 20 + 20;
|
|
45
|
-
context.fillText(rand[i], x[i], y[i]);
|
|
46
|
-
}
|
|
47
|
-
str = rand.join('').toUpperCase();
|
|
48
|
-
//画3条随机线
|
|
49
|
-
for (var i = 0; i < 3; i++) {
|
|
50
|
-
this.drawline(this.canvas, context);
|
|
51
|
-
}
|
|
52
|
-
// 画30个随机点
|
|
53
|
-
for (var i = 0; i < 30; i++) {
|
|
54
|
-
this.drawDot(this.canvas, context);
|
|
55
|
-
}
|
|
56
|
-
this.convertCanvasToImage(this.canvas);
|
|
57
|
-
return str;
|
|
58
|
-
}
|
|
59
|
-
// 随机线
|
|
60
|
-
drawline(canvas, context) {
|
|
61
|
-
context.moveTo(Math.floor(Math.random() * canvas.width), Math.floor(Math.random() * canvas.height)); //随机线的起点x坐标是画布x坐标0位置,y坐标是画布高度的随机数
|
|
62
|
-
context.lineTo(Math.floor(Math.random() * canvas.width), Math.floor(Math.random() * canvas.height)); //随机线的终点x坐标是画布宽度,y坐标是画布高度的随机数
|
|
63
|
-
context.lineWidth = 0.5; //随机线宽
|
|
64
|
-
context.strokeStyle = 'rgba(50,50,50,0.3)'; //随机线描边属性
|
|
65
|
-
context.stroke(); //描边,即起点描到终点
|
|
66
|
-
}
|
|
67
|
-
// 随机点(所谓画点其实就是画1px像素的线,方法不再赘述)
|
|
68
|
-
drawDot(canvas, context) {
|
|
69
|
-
var px = Math.floor(Math.random() * canvas.width);
|
|
70
|
-
var py = Math.floor(Math.random() * canvas.height);
|
|
71
|
-
context.moveTo(px, py);
|
|
72
|
-
context.lineTo(px + 1, py + 1);
|
|
73
|
-
context.lineWidth = 0.2;
|
|
74
|
-
context.stroke();
|
|
75
|
-
}
|
|
76
|
-
// 绘制图片
|
|
77
|
-
convertCanvasToImage(canvas) {
|
|
78
|
-
document.getElementById("verifyCanvas").style.display = "none";
|
|
79
|
-
this.image = document.getElementById("code_img");
|
|
80
|
-
this.image.src = canvas.toDataURL("image/png");
|
|
81
|
-
return this.image;
|
|
82
|
-
}
|
|
83
|
-
sendSMSCode() {
|
|
84
|
-
if (!this.codeVerified) {
|
|
85
|
-
this.message.create("error", "请先核对验证码");
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
let mobile = this.validateSMSForm.value?.mobile;
|
|
89
|
-
console.log(this.validateSMSForm.value);
|
|
90
|
-
if (mobile) {
|
|
91
|
-
let apigURL = localStorage.getItem("NOVA_APIG_SERVER");
|
|
92
|
-
apigURL = decodeURIComponent(atob(apigURL));
|
|
93
|
-
let url = apigURL + "message";
|
|
94
|
-
this.http.post(url, { company: this.companyId, mobile: mobile, action: 'login' }).subscribe((res) => {
|
|
95
|
-
this.countDownSMS();
|
|
96
|
-
this.message.info(`已发送,请查收验证码`);
|
|
97
|
-
}, error => {
|
|
98
|
-
this.message.error(error?.error?.mess || `系统繁忙中,请稍后重试`);
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
this.message.error("请正确输入手机号");
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
countDownSMS() {
|
|
106
|
-
this.isSended = true;
|
|
107
|
-
this.isSending = true;
|
|
108
|
-
this.smsTimeCount = 60;
|
|
109
|
-
let interval = setInterval(() => {
|
|
110
|
-
this.smsTimeCount--;
|
|
111
|
-
}, 1000);
|
|
112
|
-
setTimeout(() => {
|
|
113
|
-
clearInterval(interval);
|
|
114
|
-
this.isSending = false;
|
|
115
|
-
}, 60 * 1000);
|
|
116
|
-
}
|
|
117
|
-
// 点击登录按钮
|
|
118
|
-
submitFormMobileSMS(value) {
|
|
119
|
-
// localStorage.removeItem("user")
|
|
120
|
-
for (const key in this.validateSMSForm.controls) {
|
|
121
|
-
this.validateSMSForm.controls[key].markAsDirty();
|
|
122
|
-
this.validateSMSForm.controls[key].updateValueAndValidity();
|
|
123
|
-
}
|
|
124
|
-
console.log(value);
|
|
125
|
-
this.username = value.mobile;
|
|
126
|
-
this.smsCode = value.smsCode;
|
|
127
|
-
console.log("smslogin");
|
|
128
|
-
// return
|
|
129
|
-
this.loginSMS();
|
|
130
|
-
}
|
|
131
|
-
// 点击登录按钮
|
|
132
|
-
submitFormMobilePassword(value) {
|
|
133
|
-
// localStorage.removeItem("user")
|
|
134
|
-
for (const key in this.validateForm.controls) {
|
|
135
|
-
this.validateForm.controls[key].markAsDirty();
|
|
136
|
-
this.validateForm.controls[key].updateValueAndValidity();
|
|
137
|
-
}
|
|
138
|
-
this.username = value.mobile || value.username;
|
|
139
|
-
this.password = value.password;
|
|
140
|
-
let checkCode = value.checkCode;
|
|
141
|
-
let c = this.code.toLowerCase();
|
|
142
|
-
let vc = checkCode.toLowerCase();
|
|
143
|
-
console.log(c, vc);
|
|
144
|
-
if (c != vc) {
|
|
145
|
-
console.log(c, vc);
|
|
146
|
-
this.message.create("error", "验证码错误");
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
149
|
-
this.loginMobilePassword();
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
// 点击登录按钮
|
|
153
|
-
submitFormUserPassword(value) {
|
|
154
|
-
// localStorage.removeItem("user")
|
|
155
|
-
for (const key in this.validateForm.controls) {
|
|
156
|
-
this.validateForm.controls[key].markAsDirty();
|
|
157
|
-
this.validateForm.controls[key].updateValueAndValidity();
|
|
158
|
-
}
|
|
159
|
-
this.username = value.mobile || value.username;
|
|
160
|
-
this.password = value.password;
|
|
161
|
-
let checkCode = value.checkCode;
|
|
162
|
-
let c = this.code.toLowerCase();
|
|
163
|
-
let vc = checkCode.toLowerCase();
|
|
164
|
-
console.log(c, vc);
|
|
165
|
-
if (c != vc) {
|
|
166
|
-
console.log(c, vc);
|
|
167
|
-
this.message.create("error", "验证码错误");
|
|
168
|
-
}
|
|
169
|
-
else {
|
|
170
|
-
this.authServ
|
|
171
|
-
.login(this.username, this.password)
|
|
172
|
-
.then(async (data) => {
|
|
173
|
-
}).catch(err => {
|
|
174
|
-
console.log(err);
|
|
175
|
-
this.message.create("error", "错误的用户名或密码");
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
// 点击重置密码
|
|
180
|
-
async forgetFormFun(value) {
|
|
181
|
-
for (const key in this.forgetForm.controls) {
|
|
182
|
-
this.forgetForm.controls[key].markAsDirty();
|
|
183
|
-
this.forgetForm.controls[key].updateValueAndValidity();
|
|
184
|
-
}
|
|
185
|
-
console.log(value.forgetusername, value.forgetPassword, value.forgetConfirmpassword);
|
|
186
|
-
if (value.forgetPassword != value.forgetConfirmpassword) {
|
|
187
|
-
this.message.create("error", "两次密码不一致");
|
|
188
|
-
return;
|
|
189
|
-
}
|
|
190
|
-
if (!value.forgerphoneCode) {
|
|
191
|
-
this.message.create("error", "请输入验证码");
|
|
192
|
-
return;
|
|
193
|
-
}
|
|
194
|
-
let host = Parse.serverURL?.split("parse")?.[0] || "https://server.fmode.cn/";
|
|
195
|
-
let url = host + "api/auth/reset_password";
|
|
196
|
-
this.http.post(url, { company: this.companyId, mobile: value.forgetusername, code: value.forgerphoneCode, password: value.forgetConfirmpassword }).subscribe((res) => {
|
|
197
|
-
if (res.code == 200) {
|
|
198
|
-
this.message.create("success", res.msg);
|
|
199
|
-
this.type = 'login';
|
|
200
|
-
}
|
|
201
|
-
else {
|
|
202
|
-
this.message.create("error", "验证码错误");
|
|
203
|
-
}
|
|
204
|
-
}, error => {
|
|
205
|
-
console.log(error.error);
|
|
206
|
-
this.message.create('error', error.error.mess);
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
async registSubmitForm(value) {
|
|
210
|
-
for (const key in this.registForm.controls) {
|
|
211
|
-
this.registForm.controls[key].markAsDirty();
|
|
212
|
-
this.registForm.controls[key].updateValueAndValidity();
|
|
213
|
-
}
|
|
214
|
-
this.registName = value.registName;
|
|
215
|
-
this.registIdcard = value.registIdcard;
|
|
216
|
-
this.registPhone = value.registPhone;
|
|
217
|
-
this.phoneCode = value.phoneCode;
|
|
218
|
-
this.regpassword = value.regpassword;
|
|
219
|
-
this.confirmPassword = value.confirmPassword;
|
|
220
|
-
let checkInfo = await this.verifyCode(this.registPhone, this.phoneCode);
|
|
221
|
-
if (checkInfo && checkInfo.code != 200) {
|
|
222
|
-
this.message.create("error", checkInfo.mess);
|
|
223
|
-
return;
|
|
224
|
-
}
|
|
225
|
-
this.queryUser();
|
|
226
|
-
}
|
|
227
|
-
getSelectEducation() {
|
|
228
|
-
this.loginMobilePassword();
|
|
229
|
-
this.iseducation = false;
|
|
230
|
-
}
|
|
231
|
-
loginSMS() {
|
|
232
|
-
// 验证码登录
|
|
233
|
-
let host = Parse.serverURL?.split("parse")?.[0] || "https://server.fmode.cn/";
|
|
234
|
-
let url = host + `api/auth/mobile?company=${this.companyId}&mobile=${this.username}&code=${this.smsCode}`;
|
|
235
|
-
this.http.get(url).subscribe((res) => {
|
|
236
|
-
console.log(res);
|
|
237
|
-
if (res.code == 200) {
|
|
238
|
-
this.message.create("success", "登录成功");
|
|
239
|
-
let token = res.data.token;
|
|
240
|
-
Parse.User.become(token).then(user => {
|
|
241
|
-
this.router.navigate([decodeURIComponent(this.rootPage)]);
|
|
242
|
-
});
|
|
243
|
-
}
|
|
244
|
-
else {
|
|
245
|
-
this.message.create("error", "验证码错误");
|
|
246
|
-
}
|
|
247
|
-
}, error => {
|
|
248
|
-
console.log(error.error);
|
|
249
|
-
this.message.create('error', error.error.mess);
|
|
250
|
-
});
|
|
251
|
-
}
|
|
252
|
-
async loginMobilePassword() {
|
|
253
|
-
let profile;
|
|
254
|
-
let education;
|
|
255
|
-
let currentUser;
|
|
256
|
-
let username = await this.getMobileUser(this.username);
|
|
257
|
-
if (!username) {
|
|
258
|
-
this.message.create("error", "用户不存在,请尝试其他登录方式");
|
|
259
|
-
return;
|
|
260
|
-
}
|
|
261
|
-
this.authServ
|
|
262
|
-
.login(username, this.password)
|
|
263
|
-
.then(async (data) => {
|
|
264
|
-
}).catch(err => {
|
|
265
|
-
console.log(err);
|
|
266
|
-
this.message.create("error", "错误的用户名或密码");
|
|
267
|
-
});
|
|
268
|
-
}
|
|
269
|
-
async queryUser() {
|
|
270
|
-
// 查找这个用户存不存在,存在直接绑定登录,不存在注册
|
|
271
|
-
let queryUser = new Parse.Query('_User');
|
|
272
|
-
queryUser.contains("username", this.registPhone);
|
|
273
|
-
queryUser.equalTo("company", this.companyId);
|
|
274
|
-
let user = await queryUser.first();
|
|
275
|
-
if (user?.id) {
|
|
276
|
-
this.message.info(`该账户已激活,使用手机号密码直接登录`);
|
|
277
|
-
return;
|
|
278
|
-
}
|
|
279
|
-
// 核验手机号
|
|
280
|
-
Parse.User.signUp(this.companyId + "-" + this.registPhone, this.regpassword, "").then(async (res) => {
|
|
281
|
-
if (res.id) {
|
|
282
|
-
console.log(res);
|
|
283
|
-
res.set("company", {
|
|
284
|
-
__type: "Pointer",
|
|
285
|
-
className: "Company",
|
|
286
|
-
objectId: this.companyId
|
|
287
|
-
});
|
|
288
|
-
res.set("mobile", this.registPhone);
|
|
289
|
-
res.set("type", "user");
|
|
290
|
-
res.save();
|
|
291
|
-
// 开通账号辅助填写账号密码
|
|
292
|
-
this.username = this.registPhone;
|
|
293
|
-
this.password = this.regpassword;
|
|
294
|
-
}
|
|
295
|
-
});
|
|
296
|
-
}
|
|
297
|
-
async getMobileUser(mobile) {
|
|
298
|
-
if (this.mobileUserMap[mobile])
|
|
299
|
-
return this.mobileUserMap[mobile];
|
|
300
|
-
let result = await this.novaCloud.api("/auth/getusername", {
|
|
301
|
-
company: this.companyId,
|
|
302
|
-
mobile: mobile
|
|
303
|
-
});
|
|
304
|
-
console.log(result);
|
|
305
|
-
if (result?.username) {
|
|
306
|
-
this.mobileUserMap[mobile] = result?.username;
|
|
307
|
-
}
|
|
308
|
-
return this.mobileUserMap[mobile];
|
|
309
|
-
}
|
|
310
|
-
forget() {
|
|
311
|
-
this.type = 'forget';
|
|
312
|
-
}
|
|
313
|
-
backLogin() {
|
|
314
|
-
this.type = 'login';
|
|
315
|
-
}
|
|
316
|
-
handleCancel() {
|
|
317
|
-
this.isVisible = false;
|
|
318
|
-
}
|
|
319
|
-
handleOk() {
|
|
320
|
-
Parse.User.signUp(this.registPhone, this.regpassword, "").then(async (res) => {
|
|
321
|
-
if (res.id) {
|
|
322
|
-
console.log(res);
|
|
323
|
-
res.set("company", {
|
|
324
|
-
__type: "Pointer",
|
|
325
|
-
className: "Company",
|
|
326
|
-
objectId: this.companyId
|
|
327
|
-
});
|
|
328
|
-
res.save();
|
|
329
|
-
this.username = this.registPhone;
|
|
330
|
-
this.password = this.regpassword;
|
|
331
|
-
}
|
|
332
|
-
});
|
|
333
|
-
}
|
|
334
|
-
async getCode() {
|
|
335
|
-
if (this.registPhone == undefined || this.registPhone.trim() == "") {
|
|
336
|
-
this.message.info(`请输入注册手机号`);
|
|
337
|
-
return;
|
|
338
|
-
}
|
|
339
|
-
let a = /^1[3456789]\d{9}$/;
|
|
340
|
-
if (!this.registPhone.match(a)) {
|
|
341
|
-
this.message.info(`请输入正确的手机号`);
|
|
342
|
-
return;
|
|
343
|
-
}
|
|
344
|
-
let User = new Parse.Query('User');
|
|
345
|
-
User.equalTo('username', this.registPhone);
|
|
346
|
-
User.equalTo('company', this.companyId);
|
|
347
|
-
let user = await User.first();
|
|
348
|
-
if (user && user.id) {
|
|
349
|
-
this.message.info(`该手机号已注册,请使用账号密码登录`);
|
|
350
|
-
return;
|
|
351
|
-
}
|
|
352
|
-
// 本地测试
|
|
353
|
-
let apigURL = localStorage.getItem("NOVA_APIG_SERVER");
|
|
354
|
-
apigURL = decodeURIComponent(atob(apigURL));
|
|
355
|
-
let url = apigURL + "message";
|
|
356
|
-
this.http.post(url, { company: this.companyId, mobile: this.registPhone, action: 'regist' }).subscribe((res) => {
|
|
357
|
-
this.vCode = res.data.code;
|
|
358
|
-
this.countDownFun();
|
|
359
|
-
}, error => {
|
|
360
|
-
this.message.info(`系统繁忙中,请稍后重试`);
|
|
361
|
-
console.log(error);
|
|
362
|
-
});
|
|
363
|
-
}
|
|
364
|
-
async getCode2() {
|
|
365
|
-
if (this.forgetusername == undefined || this.forgetusername.trim() == "") {
|
|
366
|
-
this.message.info(`请输入账号`);
|
|
367
|
-
return;
|
|
368
|
-
}
|
|
369
|
-
let a = /^1[3456789]\d{9}$/;
|
|
370
|
-
if (!this.forgetusername.match(a)) {
|
|
371
|
-
this.message.info(`请输入正确的手机号`);
|
|
372
|
-
return;
|
|
373
|
-
}
|
|
374
|
-
console.log(this.forgetusername);
|
|
375
|
-
let User = new Parse.Query('User');
|
|
376
|
-
User.equalTo('username', this.companyId + "-" + this.forgetusername);
|
|
377
|
-
User.equalTo('company', this.companyId);
|
|
378
|
-
let user = await User.first();
|
|
379
|
-
if (!user) {
|
|
380
|
-
this.message.info(`账号不存在`);
|
|
381
|
-
return;
|
|
382
|
-
}
|
|
383
|
-
let apigURL = localStorage.getItem("NOVA_APIG_SERVER");
|
|
384
|
-
apigURL = decodeURIComponent(atob(apigURL));
|
|
385
|
-
let url = apigURL + "message";
|
|
386
|
-
this.http.post(url, { company: this.companyId, mobile: this.forgetusername, action: 'resetPassword' }).subscribe((res) => {
|
|
387
|
-
console.log(res);
|
|
388
|
-
this.vCode = res.data.code;
|
|
389
|
-
this.countDownFun();
|
|
390
|
-
}, error => {
|
|
391
|
-
this.message.info(`系统繁忙中,请稍后重试`);
|
|
392
|
-
console.log(error);
|
|
393
|
-
});
|
|
394
|
-
}
|
|
395
|
-
async verifyCode(mobile, code) {
|
|
396
|
-
let apigURL = localStorage.getItem("NOVA_APIG_SERVER");
|
|
397
|
-
apigURL = decodeURIComponent(atob(apigURL));
|
|
398
|
-
let url = apigURL + "verifyCode";
|
|
399
|
-
return new Promise(async (resolve, reject) => {
|
|
400
|
-
this.http.post(url, { mobile: mobile, code: code }).subscribe((res) => {
|
|
401
|
-
resolve(res);
|
|
402
|
-
}, error => {
|
|
403
|
-
console.log(error);
|
|
404
|
-
resolve(error.error);
|
|
405
|
-
});
|
|
406
|
-
});
|
|
407
|
-
}
|
|
408
|
-
// 倒计时
|
|
409
|
-
countDownFun() {
|
|
410
|
-
this.isCountDown = true;
|
|
411
|
-
if (this.countDown == 0) {
|
|
412
|
-
return;
|
|
413
|
-
}
|
|
414
|
-
let timer = setInterval(() => {
|
|
415
|
-
this.countDown = this.countDown - 1;
|
|
416
|
-
if (this.countDown == 0) {
|
|
417
|
-
clearInterval(timer);
|
|
418
|
-
this.countDown = 60;
|
|
419
|
-
this.isCountDown = false;
|
|
420
|
-
}
|
|
421
|
-
}, 1000);
|
|
422
|
-
}
|
|
423
|
-
constructor(authServ, novaCloud, fb, message, router, route, activatedRoute, http) {
|
|
424
|
-
this.authServ = authServ;
|
|
425
|
-
this.novaCloud = novaCloud;
|
|
426
|
-
this.fb = fb;
|
|
427
|
-
this.message = message;
|
|
428
|
-
this.router = router;
|
|
429
|
-
this.route = route;
|
|
430
|
-
this.activatedRoute = activatedRoute;
|
|
431
|
-
this.http = http;
|
|
432
|
-
this.nums = ['C', '6', 'Z', 't'];
|
|
433
|
-
this.str = '';
|
|
434
|
-
this.tabIndex = 0;
|
|
435
|
-
this.codeVerified = false;
|
|
436
|
-
this.passwordVisible = false;
|
|
437
|
-
this.passwordVisible2 = false;
|
|
438
|
-
this.passwordVisible3 = false;
|
|
439
|
-
// 是否有多个层次
|
|
440
|
-
this.iseducation = false;
|
|
441
|
-
this.redirectUrl = localStorage.getItem("redirectUrl");
|
|
442
|
-
// 手机验证码
|
|
443
|
-
this.isSended = false;
|
|
444
|
-
this.isSending = false;
|
|
445
|
-
this.smsTimeCount = 60;
|
|
446
|
-
this.loading = true;
|
|
447
|
-
this.Lesson = [];
|
|
448
|
-
this.myDate = new Date();
|
|
449
|
-
// 查询该学生信息是否存在
|
|
450
|
-
this.isVisible = false;
|
|
451
|
-
this.type = 'login';
|
|
452
|
-
this.mobileUserMap = {};
|
|
453
|
-
this.isOkLoading = false;
|
|
454
|
-
this.countDown = 60;
|
|
455
|
-
this.isCountDown = false;
|
|
456
|
-
// 页面显示素材
|
|
457
|
-
this.mobileLogin = false;
|
|
458
|
-
this.logo = 'https://www.fmode.cn/images/ewm1.png';
|
|
459
|
-
this.qrcode = 'https://www.fmode.cn/images/logo_main.png';
|
|
460
|
-
// 登录 用户名(手机号码)验证
|
|
461
|
-
this.userNameAsyncValidator = (control) => new Observable((observer) => {
|
|
462
|
-
let reg = /^1[3456789]\d{9}$/;
|
|
463
|
-
// let reg2 = /^\d{17}(\d|X|x)$/;
|
|
464
|
-
let username = control.value;
|
|
465
|
-
setTimeout(() => {
|
|
466
|
-
if (username == undefined || username.trim() == "") {
|
|
467
|
-
this.userErrorTip = "请输入登录账号";
|
|
468
|
-
observer.next({ error: true, duplicated: true });
|
|
469
|
-
observer.complete();
|
|
470
|
-
return;
|
|
471
|
-
}
|
|
472
|
-
if (!username.match(reg)) {
|
|
473
|
-
this.userErrorTip = "请输入正确的登录账号";
|
|
474
|
-
observer.next({ error: true, duplicated: true });
|
|
475
|
-
observer.complete();
|
|
476
|
-
return;
|
|
477
|
-
}
|
|
478
|
-
// if(username.length > 11){
|
|
479
|
-
// if (!username.match(reg2) ) {
|
|
480
|
-
// this.userErrorTip = "请输入正确的登录账号";
|
|
481
|
-
// observer.next({ error: true, duplicated: true });
|
|
482
|
-
// observer.complete();
|
|
483
|
-
// return;
|
|
484
|
-
// }
|
|
485
|
-
// }else {
|
|
486
|
-
// }
|
|
487
|
-
observer.next(null);
|
|
488
|
-
observer.complete();
|
|
489
|
-
}, 1000);
|
|
490
|
-
});
|
|
491
|
-
// 登录 短信验证码验证
|
|
492
|
-
this.smsAsyncValidator = (control) => new Observable((observer) => {
|
|
493
|
-
setTimeout(() => {
|
|
494
|
-
let smsCode = control.value;
|
|
495
|
-
if (smsCode == undefined || smsCode.trim() == "") {
|
|
496
|
-
this.smsCodeErrorTip = "请输入短信验证码";
|
|
497
|
-
observer.next({ error: true, duplicated: true });
|
|
498
|
-
observer.complete();
|
|
499
|
-
return;
|
|
500
|
-
}
|
|
501
|
-
observer.next(null);
|
|
502
|
-
observer.complete();
|
|
503
|
-
}, 1000);
|
|
504
|
-
});
|
|
505
|
-
// 登录 密码验证
|
|
506
|
-
this.passwordAsyncValidator = (control) => new Observable((observer) => {
|
|
507
|
-
setTimeout(() => {
|
|
508
|
-
let password = control.value;
|
|
509
|
-
if (password == undefined || password.trim() == "") {
|
|
510
|
-
this.passwordErrorTip = "请输入密码";
|
|
511
|
-
observer.next({ error: true, duplicated: true });
|
|
512
|
-
observer.complete();
|
|
513
|
-
return;
|
|
514
|
-
}
|
|
515
|
-
if (password.length < 6) {
|
|
516
|
-
this.passwordErrorTip = "密码长度不得小于6位";
|
|
517
|
-
observer.next({ error: true, duplicated: true });
|
|
518
|
-
observer.complete();
|
|
519
|
-
return;
|
|
520
|
-
}
|
|
521
|
-
observer.next(null);
|
|
522
|
-
observer.complete();
|
|
523
|
-
}, 1000);
|
|
524
|
-
});
|
|
525
|
-
this.codeAsyncValidator = (control) => new Observable((observer) => {
|
|
526
|
-
setTimeout(() => {
|
|
527
|
-
let checkCode = control.value;
|
|
528
|
-
if (checkCode == undefined || checkCode.trim() == "") {
|
|
529
|
-
this.codeVerified = false;
|
|
530
|
-
this.codeErrorTip = "请输入验证码";
|
|
531
|
-
observer.next({ error: true, duplicated: true });
|
|
532
|
-
observer.complete();
|
|
533
|
-
return;
|
|
534
|
-
}
|
|
535
|
-
if (checkCode.length < 4) {
|
|
536
|
-
this.codeVerified = false;
|
|
537
|
-
this.codeErrorTip = "验证码长度不得小于4位";
|
|
538
|
-
observer.next({ error: true, duplicated: true });
|
|
539
|
-
observer.complete();
|
|
540
|
-
return;
|
|
541
|
-
}
|
|
542
|
-
let c = this.code.toLowerCase();
|
|
543
|
-
let vc = checkCode.toLowerCase();
|
|
544
|
-
if (c != vc) {
|
|
545
|
-
this.codeVerified = false;
|
|
546
|
-
this.codeErrorTip = "验证码输入错误";
|
|
547
|
-
observer.next({ error: true, duplicated: true });
|
|
548
|
-
observer.complete();
|
|
549
|
-
return;
|
|
550
|
-
}
|
|
551
|
-
this.codeVerified = true;
|
|
552
|
-
observer.next(null);
|
|
553
|
-
observer.complete();
|
|
554
|
-
}, 1000);
|
|
555
|
-
});
|
|
556
|
-
// 注册 身份证号码验证
|
|
557
|
-
this.registIdcardAsyncValidator = (control) => new Observable((observer) => {
|
|
558
|
-
let registIdcard = control.value;
|
|
559
|
-
setTimeout(() => {
|
|
560
|
-
if (registIdcard == undefined || registIdcard.trim() == "") {
|
|
561
|
-
this.registIdcardErrorTip = "请输入正确的身份证号码";
|
|
562
|
-
observer.next({ error: true, duplicated: true });
|
|
563
|
-
observer.complete();
|
|
564
|
-
return;
|
|
565
|
-
}
|
|
566
|
-
if (/^\d{17}(\d|X|x)$/.test(registIdcard) === false) {
|
|
567
|
-
this.registIdcardErrorTip = "请输入正确的身份证号码";
|
|
568
|
-
observer.next({ error: true, duplicated: true });
|
|
569
|
-
observer.complete();
|
|
570
|
-
return;
|
|
571
|
-
}
|
|
572
|
-
observer.next(null);
|
|
573
|
-
observer.complete();
|
|
574
|
-
}, 1000);
|
|
575
|
-
});
|
|
576
|
-
// 忘记密码 验证
|
|
577
|
-
this.forgetNameAsyncValidator = (control) => new Observable((observer) => {
|
|
578
|
-
setTimeout(() => {
|
|
579
|
-
let forgetName = control.value;
|
|
580
|
-
if (forgetName == undefined || forgetName.trim() == "") {
|
|
581
|
-
this.registNameErrorTip = "请输入账户账号或者手机号";
|
|
582
|
-
observer.next({ error: true, duplicated: true });
|
|
583
|
-
observer.complete();
|
|
584
|
-
return;
|
|
585
|
-
}
|
|
586
|
-
this.forgetusername = forgetName;
|
|
587
|
-
observer.next(null);
|
|
588
|
-
observer.complete();
|
|
589
|
-
}, 1000);
|
|
590
|
-
});
|
|
591
|
-
this.forgetPasswordAsyncValidator = (control) => new Observable((observer) => {
|
|
592
|
-
setTimeout(() => {
|
|
593
|
-
let forgetPassword = control.value;
|
|
594
|
-
if (forgetPassword == undefined || forgetPassword.trim() == "") {
|
|
595
|
-
this.passwordErrorTip = "请输入新密码";
|
|
596
|
-
observer.next({ error: true, duplicated: true });
|
|
597
|
-
observer.complete();
|
|
598
|
-
return;
|
|
599
|
-
}
|
|
600
|
-
if (forgetPassword.length < 6) {
|
|
601
|
-
this.passwordErrorTip = "密码长度不得小于6位";
|
|
602
|
-
observer.next({ error: true, duplicated: true });
|
|
603
|
-
observer.complete();
|
|
604
|
-
return;
|
|
605
|
-
}
|
|
606
|
-
this.forgetPassword = forgetPassword;
|
|
607
|
-
observer.next(null);
|
|
608
|
-
observer.complete();
|
|
609
|
-
}, 1000);
|
|
610
|
-
});
|
|
611
|
-
this.forgetConfirmPasswordAsyncValidator = (control) => new Observable((observer) => {
|
|
612
|
-
setTimeout(() => {
|
|
613
|
-
let forgetConfirmpassword = control.value;
|
|
614
|
-
if (forgetConfirmpassword == undefined || forgetConfirmpassword.trim() == "") {
|
|
615
|
-
this.forgetphoneCodesErrorTip = "请确认新密码";
|
|
616
|
-
observer.next({ error: true, duplicated: true });
|
|
617
|
-
observer.complete();
|
|
618
|
-
return;
|
|
619
|
-
}
|
|
620
|
-
if (forgetConfirmpassword.length < 6) {
|
|
621
|
-
this.forgetphoneCodesErrorTip = "密码长度不得小于6位";
|
|
622
|
-
observer.next({ error: true, duplicated: true });
|
|
623
|
-
observer.complete();
|
|
624
|
-
return;
|
|
625
|
-
}
|
|
626
|
-
this.forgetConfirmpassword = forgetConfirmpassword;
|
|
627
|
-
observer.next(null);
|
|
628
|
-
observer.complete();
|
|
629
|
-
}, 1000);
|
|
630
|
-
});
|
|
631
|
-
this.forgetCodeAsyncValidator = (control) => new Observable((observer) => {
|
|
632
|
-
setTimeout(() => {
|
|
633
|
-
let forgerphoneCode = control.value;
|
|
634
|
-
if (forgerphoneCode == undefined || forgerphoneCode.trim() == "") {
|
|
635
|
-
this.phoneCodesErrorTip = "请输入新密码";
|
|
636
|
-
observer.next({ error: true, duplicated: true });
|
|
637
|
-
observer.complete();
|
|
638
|
-
return;
|
|
639
|
-
}
|
|
640
|
-
this.forgerphoneCode = forgerphoneCode;
|
|
641
|
-
observer.next(null);
|
|
642
|
-
observer.complete();
|
|
643
|
-
}, 1000);
|
|
644
|
-
});
|
|
645
|
-
// 注册 姓名验证
|
|
646
|
-
this.registNameAsyncValidator = (control) => new Observable((observer) => {
|
|
647
|
-
setTimeout(() => {
|
|
648
|
-
let registName = control.value;
|
|
649
|
-
if (registName == undefined || registName.trim() == "") {
|
|
650
|
-
this.registNameErrorTip = "请输入姓名";
|
|
651
|
-
observer.next({ error: true, duplicated: true });
|
|
652
|
-
observer.complete();
|
|
653
|
-
return;
|
|
654
|
-
}
|
|
655
|
-
this.registName = registName;
|
|
656
|
-
observer.next(null);
|
|
657
|
-
observer.complete();
|
|
658
|
-
}, 1000);
|
|
659
|
-
});
|
|
660
|
-
// 注册手机号验证
|
|
661
|
-
this.registPhoneAsyncValidator = (control) => new Observable((observer) => {
|
|
662
|
-
let registPhone = control.value;
|
|
663
|
-
setTimeout(() => {
|
|
664
|
-
if (registPhone == undefined || registPhone.trim() == "") {
|
|
665
|
-
this.registIdcardErrorTip = "请输入正确的身份证号码";
|
|
666
|
-
observer.next({ error: true, duplicated: true });
|
|
667
|
-
observer.complete();
|
|
668
|
-
return;
|
|
669
|
-
}
|
|
670
|
-
if (/^1[3456789]\d{9}$/.test(registPhone) === false) {
|
|
671
|
-
this.phoneErrorTip = "请输入正确的手机号";
|
|
672
|
-
observer.next({ error: true, duplicated: true });
|
|
673
|
-
observer.complete();
|
|
674
|
-
return;
|
|
675
|
-
}
|
|
676
|
-
observer.next(null);
|
|
677
|
-
observer.complete();
|
|
678
|
-
}, 1000);
|
|
679
|
-
});
|
|
680
|
-
this.registCodeAsyncValidator = (control) => new Observable((observer) => {
|
|
681
|
-
setTimeout(() => {
|
|
682
|
-
let registCode = control.value;
|
|
683
|
-
if (registCode == undefined || registCode.trim() == "") {
|
|
684
|
-
this.phoneCodesErrorTip = "请输入验证码";
|
|
685
|
-
observer.next({ error: true, duplicated: true });
|
|
686
|
-
observer.complete();
|
|
687
|
-
return;
|
|
688
|
-
}
|
|
689
|
-
observer.next(null);
|
|
690
|
-
observer.complete();
|
|
691
|
-
}, 1000);
|
|
692
|
-
});
|
|
693
|
-
// 注册密码验证
|
|
694
|
-
this.regpasswordAsyncValidator = (control) => new Observable((observer) => {
|
|
695
|
-
setTimeout(() => {
|
|
696
|
-
let regpassword = control.value;
|
|
697
|
-
if (regpassword == undefined || regpassword.trim() == "") {
|
|
698
|
-
this.regpasswordErrorTip = "请输入密码";
|
|
699
|
-
observer.next({ error: true, duplicated: true });
|
|
700
|
-
observer.complete();
|
|
701
|
-
return;
|
|
702
|
-
}
|
|
703
|
-
if (regpassword.length < 6) {
|
|
704
|
-
this.regpasswordErrorTip = "密码长度不得小于6位";
|
|
705
|
-
observer.next({ error: true, duplicated: true });
|
|
706
|
-
observer.complete();
|
|
707
|
-
return;
|
|
708
|
-
}
|
|
709
|
-
if (regpassword.length > 12) {
|
|
710
|
-
this.regpasswordErrorTip = "密码长度不得大于12位";
|
|
711
|
-
observer.next({ error: true, duplicated: true });
|
|
712
|
-
observer.complete();
|
|
713
|
-
return;
|
|
714
|
-
}
|
|
715
|
-
this.regpassword = regpassword;
|
|
716
|
-
observer.next(null);
|
|
717
|
-
observer.complete();
|
|
718
|
-
}, 1000);
|
|
719
|
-
});
|
|
720
|
-
// 注册 确认密码验证
|
|
721
|
-
this.confirmPasswordAsyncValidator = (control) => new Observable((observer) => {
|
|
722
|
-
setTimeout(() => {
|
|
723
|
-
let confirmPassword = control.value;
|
|
724
|
-
if (confirmPassword == undefined || confirmPassword.trim() == "") {
|
|
725
|
-
this.confirmPasswordErrorTip = "请确认密码";
|
|
726
|
-
observer.next({ error: true, duplicated: true });
|
|
727
|
-
observer.complete();
|
|
728
|
-
return;
|
|
729
|
-
}
|
|
730
|
-
if (confirmPassword != this.regpassword) {
|
|
731
|
-
this.confirmPasswordErrorTip = "两次输入密码不一致,请重新输入";
|
|
732
|
-
observer.next({ error: true, duplicated: true });
|
|
733
|
-
observer.complete();
|
|
734
|
-
return;
|
|
735
|
-
}
|
|
736
|
-
this.confirmPassword = confirmPassword;
|
|
737
|
-
observer.next(null);
|
|
738
|
-
observer.complete();
|
|
739
|
-
}, 1000);
|
|
740
|
-
});
|
|
741
|
-
this.code = '';
|
|
742
|
-
this.initLoginForm();
|
|
743
|
-
this.route.paramMap.subscribe(async (params) => {
|
|
744
|
-
console.log(params);
|
|
745
|
-
this.appId = params.get("appId");
|
|
746
|
-
if (!await this.initAppConfig()) {
|
|
747
|
-
this.companyId = params.get("companyId");
|
|
748
|
-
if (!this.companyId) {
|
|
749
|
-
this.companyId = localStorage.getItem("company") || "Q0DryNYA8g";
|
|
750
|
-
}
|
|
751
|
-
await this.initCompanyConfig();
|
|
752
|
-
}
|
|
753
|
-
});
|
|
754
|
-
}
|
|
755
|
-
async initCompanyConfig() {
|
|
756
|
-
if (!this.companyId)
|
|
757
|
-
return;
|
|
758
|
-
let query = new Parse.Query("Company");
|
|
759
|
-
this.company = await query.get(this.companyId);
|
|
760
|
-
// 设置页面
|
|
761
|
-
this.logo = this.company?.get("logo") || this.logo;
|
|
762
|
-
this.qrcode = this.company?.get("qrcode") || this.qrcode;
|
|
763
|
-
this.mobileLogin = this.company?.get('jpush')?.appkey || false;
|
|
764
|
-
this.rootPage = this.company?.get('rootPage');
|
|
765
|
-
}
|
|
766
|
-
async initAppConfig() {
|
|
767
|
-
if (!this.appId)
|
|
768
|
-
return false;
|
|
769
|
-
let query = new Parse.Query("App");
|
|
770
|
-
query.include("company");
|
|
771
|
-
this.app = await query.get(this.appId);
|
|
772
|
-
// 设置页面
|
|
773
|
-
console.log(this.app);
|
|
774
|
-
this.logo = this.app?.get("logo") || this.logo;
|
|
775
|
-
this.qrcode = this.app?.get("qrcode") || this.qrcode;
|
|
776
|
-
this.mobileLogin = this.app?.get('jpush')?.appkey || false;
|
|
777
|
-
this.companyId = this.app?.get("company").id;
|
|
778
|
-
this.rootPage = this.app?.get('rootPage');
|
|
779
|
-
return true;
|
|
780
|
-
}
|
|
781
|
-
initLoginForm() {
|
|
782
|
-
this.validateForm = this.fb.group({
|
|
783
|
-
// 加入验证的表单项 : 初始值、 是否验证 调用的验证方法
|
|
784
|
-
mobile: ["", [Validators.required], [this.userNameAsyncValidator]],
|
|
785
|
-
password: ["", [Validators.required], [this.passwordAsyncValidator]],
|
|
786
|
-
// initCode: [this.code ],
|
|
787
|
-
checkCode: ["", [Validators.required], [this.codeAsyncValidator]]
|
|
788
|
-
});
|
|
789
|
-
this.validateUserForm = this.fb.group({
|
|
790
|
-
// 加入验证的表单项 : 初始值、 是否验证 调用的验证方法
|
|
791
|
-
username: ["", [Validators.required], []],
|
|
792
|
-
password: ["", [Validators.required], [this.passwordAsyncValidator]],
|
|
793
|
-
// initCode: [this.code ],
|
|
794
|
-
checkCode: ["", [Validators.required], [this.codeAsyncValidator]]
|
|
795
|
-
});
|
|
796
|
-
this.validateSMSForm = this.fb.group({
|
|
797
|
-
// 加入验证的表单项 : 初始值、 是否验证 调用的验证方法
|
|
798
|
-
mobile: ["", [Validators.required], [this.userNameAsyncValidator]],
|
|
799
|
-
password: [""],
|
|
800
|
-
smsCode: ["", [Validators.required], [this.smsAsyncValidator]],
|
|
801
|
-
// initCode: [this.code ],
|
|
802
|
-
checkCode: ["", [Validators.required], [this.codeAsyncValidator]]
|
|
803
|
-
});
|
|
804
|
-
this.registForm = this.fb.group({
|
|
805
|
-
// 加入验证的表单项 : 初始值、 是否验证 调用的验证方法
|
|
806
|
-
registName: ["", [Validators.required], [this.registNameAsyncValidator]],
|
|
807
|
-
registIdcard: ["", [Validators.required], [this.registIdcardAsyncValidator]],
|
|
808
|
-
registPhone: ["", [Validators.required], [this.registPhoneAsyncValidator]],
|
|
809
|
-
phoneCode: ["", [Validators.required], [this.registCodeAsyncValidator]],
|
|
810
|
-
regpassword: ["", [Validators.required], [this.regpasswordAsyncValidator]],
|
|
811
|
-
confirmPassword: ["", [Validators.required], [this.confirmPasswordAsyncValidator]]
|
|
812
|
-
});
|
|
813
|
-
this.forgetForm = this.fb.group({
|
|
814
|
-
forgetusername: ["", [Validators.required], [this.forgetNameAsyncValidator]],
|
|
815
|
-
forgetPassword: ["", [Validators.required], [this.forgetPasswordAsyncValidator]],
|
|
816
|
-
forgetConfirmpassword: ["", [Validators.required], [this.forgetConfirmPasswordAsyncValidator]],
|
|
817
|
-
forgerphoneCode: ["", [Validators.required], [this.registCodeAsyncValidator]],
|
|
818
|
-
});
|
|
819
|
-
}
|
|
820
|
-
ngOnInit() {
|
|
821
|
-
// localStorage.removeItem('company')
|
|
822
|
-
// localStorage.removeItem('pid')
|
|
823
|
-
// localStorage.clear();
|
|
824
|
-
this.activatedRoute.paramMap.subscribe(params => {
|
|
825
|
-
if (params.get('p')) {
|
|
826
|
-
localStorage.setItem('pid', params.get('p'));
|
|
827
|
-
}
|
|
828
|
-
else {
|
|
829
|
-
localStorage.setItem('company', this.companyId);
|
|
830
|
-
}
|
|
831
|
-
});
|
|
832
|
-
this.creatCode();
|
|
833
|
-
}
|
|
834
|
-
creatCode() {
|
|
835
|
-
this.code = '';
|
|
836
|
-
let codeLength = 4; //验证码的长度
|
|
837
|
-
let codeChars = [
|
|
838
|
-
0,
|
|
839
|
-
1,
|
|
840
|
-
2,
|
|
841
|
-
3,
|
|
842
|
-
4,
|
|
843
|
-
5,
|
|
844
|
-
6,
|
|
845
|
-
7,
|
|
846
|
-
8,
|
|
847
|
-
9,
|
|
848
|
-
"a",
|
|
849
|
-
"b",
|
|
850
|
-
"c",
|
|
851
|
-
"d",
|
|
852
|
-
"e",
|
|
853
|
-
"f",
|
|
854
|
-
"g",
|
|
855
|
-
"h",
|
|
856
|
-
"i",
|
|
857
|
-
"j",
|
|
858
|
-
"k",
|
|
859
|
-
"l",
|
|
860
|
-
"m",
|
|
861
|
-
"n",
|
|
862
|
-
"o",
|
|
863
|
-
"p",
|
|
864
|
-
"q",
|
|
865
|
-
"r",
|
|
866
|
-
"s",
|
|
867
|
-
"t",
|
|
868
|
-
"u",
|
|
869
|
-
"v",
|
|
870
|
-
"w",
|
|
871
|
-
"x",
|
|
872
|
-
"y",
|
|
873
|
-
"z",
|
|
874
|
-
"A",
|
|
875
|
-
"B",
|
|
876
|
-
"C",
|
|
877
|
-
"D",
|
|
878
|
-
"E",
|
|
879
|
-
"F",
|
|
880
|
-
"G",
|
|
881
|
-
"H",
|
|
882
|
-
"I",
|
|
883
|
-
"J",
|
|
884
|
-
"K",
|
|
885
|
-
"L",
|
|
886
|
-
"M",
|
|
887
|
-
"N",
|
|
888
|
-
"O",
|
|
889
|
-
"P",
|
|
890
|
-
"Q",
|
|
891
|
-
"R",
|
|
892
|
-
"S",
|
|
893
|
-
"T",
|
|
894
|
-
"U",
|
|
895
|
-
"V",
|
|
896
|
-
"W",
|
|
897
|
-
"X",
|
|
898
|
-
"Y",
|
|
899
|
-
"Z"
|
|
900
|
-
];
|
|
901
|
-
for (let i = 0; i < codeLength; i++) {
|
|
902
|
-
let charNum = Math.floor(Math.random() * 52);
|
|
903
|
-
this.code += codeChars[charNum];
|
|
904
|
-
}
|
|
905
|
-
}
|
|
906
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LoginComponent, deps: [{ token: i1.AuthService }, { token: i2.NovaCloudService }, { token: i3.FormBuilder }, { token: i4.NzMessageService }, { token: i5.Router }, { token: i5.ActivatedRoute }, { token: i5.ActivatedRoute }, { token: i6.HttpClient }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
907
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: LoginComponent, selector: "app-pcuser-login", ngImport: i0, template: "<div class=\"student-login-layout\">\n <div class=\"nav_center\">\n <img [src]=\"logo\" alt=\"\" class=\"login_img\">\n <div class=\"nav_login\">\n <nz-tabset [nzSelectedIndex]=\"tabIndex\" [nzTabPosition]=\"'top'\">\n\n <!-- \u767B\u5F55\uFF1A\u624B\u673A\u53F7+\u5BC6\u7801\u767B\u5165 -->\n <nz-tab nzTitle=\"\u624B\u673A\u5BC6\u7801\" style=\"color: #000000;\">\n <ng-container *ngIf=\"type == 'login'\">\n <form nz-form [formGroup]=\"validateForm\" (ngSubmit)=\"submitFormMobilePassword(validateForm.value)\">\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u624B\u673A\u53F7</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{userErrorTip}}\">\n <input nz-input formControlName=\"mobile\" placeholder=\"\u8BF7\u8F93\u5165\u624B\u673A\u53F7\" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u5BC6 \u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{passwordErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"password\" placeholder=\"\u8BF7\u8F93\u5165\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible = !passwordVisible\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item class=\"form-control-contain\">\n <nz-form-label [nzSpan]=\"5\" class=\"contain_yanzm\" nzRequired >\u9A8C\u8BC1\u7801 </nz-form-label>\n <nz-form-control [nzSpan]=\"6\" nzErrorTip=\"{{codeErrorTip}}\" class=\"contain_input_yanzm\">\n <input style=\"font-size:14px\" title=\"\u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801\" nz-input type=\"text\" formControlName=\"checkCode\"\n placeholder=\"\u533A\u5206\u5927\u5C0F\u5199\" />\n </nz-form-control>\n <nz-form-control [nzSpan]=\"4\" class=\"codeText\">\n <div style=\" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;\">{{code}}</div>\n </nz-form-control>\n <nz-form-control [nzSpan]=\"4\" class=\"switch\">\n <div (click)=\"creatCode()\"\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;\">\n \u6362\u4E00\u4E2A\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class=\"login_btn\">\n <button nz-button nzType=\"primary\" [nzSize]=\"'large'\" [disabled]=\"!validateForm.valid\">\u767B\u5F55</button>\n </div>\n <div class=\"forget\">\n <h6 (click)=\"forget()\">\u5FD8\u8BB0\u5BC6\u7801</h6>\n </div>\n </form>\n </ng-container>\n <ng-container *ngIf=\"type == 'forget'\">\n <form nz-form [formGroup]=\"forgetForm\" (ngSubmit)=\"forgetFormFun(forgetForm.value)\">\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u767B\u5F55\u8D26\u53F7</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{userErrorTip}}\">\n <input nz-input formControlName=\"forgetusername\" placeholder=\"\u8BF7\u8F93\u5165\u624B\u673A\u53F7\" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u65B0 \u5BC6 \u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{passwordErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"forgetPassword\" placeholder=\"\u8BF7\u8F93\u5165\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible = !passwordVisible\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u786E\u8BA4\u5BC6\u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{forgetphoneCodesErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"forgetConfirmpassword\" placeholder=\"\u8BF7\u518D\u6B21\u8F93\u5165\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible = !passwordVisible\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item class=\"forget_contain\">\n <nz-form-label [nzSpan]=\"5\" nzRequired >\u9A8C \u8BC1 \u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"8\" nzHasFeedback nzErrorTip=\"{{phoneCodesErrorTip}}\" class=\"codeInput\">\n <input style=\"font-size: 18px;\" nz-input type=\"text\" formControlName=\"forgerphoneCode\"\n placeholder=\"\u624B\u673A\u9A8C\u8BC1\u7801\" />\n </nz-form-control>\n <nz-form-control [nzSpan]=\"6\" class=\"getCode\">\n <div *ngIf=\"!isCountDown\" (click)=\"getCode2()\" class=\"get_code\"\n style=\"background-color:#40a9ff;cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\n \u83B7\u53D6\u9A8C\u8BC1\u7801\n </div>\n <div *ngIf=\"isCountDown\"\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\n {{countDown}}/\u79D2\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class=\"login_btn\">\n <button style=\"width: 348px;\" nz-button nzType=\"primary\" [nzSize]=\"'large'\"\n [disabled]=\"!forgetForm.valid\">\u91CD\u7F6E\u5BC6\u7801</button>\n </div>\n <div class=\"forget\">\n <h6 (click)=\"backLogin()\">\u8FD4\u56DE\u767B\u5F55</h6>\n </div>\n </form>\n </ng-container>\n\n </nz-tab>\n\n <!-- \u767B\u5F55\uFF1A\u5E10\u53F7+\u5BC6\u7801\u767B\u5165 -->\n <nz-tab nzTitle=\"\u5E10\u53F7\u5BC6\u7801\" style=\"color: #000000;\">\n <ng-container *ngIf=\"type == 'login'\">\n <form nz-form [formGroup]=\"validateUserForm\" (ngSubmit)=\"submitFormUserPassword(validateUserForm.value)\">\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u5E10 \u53F7</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{userErrorTip}}\">\n <input nz-input formControlName=\"username\" placeholder=\"\u8BF7\u8F93\u5165\u5E10\u53F7\" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u5BC6 \u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{passwordErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"password\" placeholder=\"\u8BF7\u8F93\u5165\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible = !passwordVisible\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item class=\"form-control-contain\">\n <nz-form-label [nzSpan]=\"5\" class=\"contain_yanzm\" nzRequired >\u9A8C\u8BC1\u7801 </nz-form-label>\n <nz-form-control [nzSpan]=\"6\" nzErrorTip=\"{{codeErrorTip}}\" class=\"contain_input_yanzm\">\n <input style=\"font-size:14px\" title=\"\u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801\" nz-input type=\"text\" formControlName=\"checkCode\"\n placeholder=\"\u533A\u5206\u5927\u5C0F\u5199\" />\n </nz-form-control>\n <nz-form-control [nzSpan]=\"4\" class=\"codeText\">\n <div style=\" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;\">{{code}}</div>\n </nz-form-control>\n <nz-form-control [nzSpan]=\"4\" class=\"switch\">\n <div (click)=\"creatCode()\"\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;\">\n \u6362\u4E00\u4E2A\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class=\"login_btn\">\n <button nz-button nzType=\"primary\" [nzSize]=\"'large'\" [disabled]=\"!validateUserForm.valid\">\u767B\u5F55</button>\n </div>\n </form>\n </ng-container>\n <ng-container *ngIf=\"type == 'forget'\">\n <form nz-form [formGroup]=\"forgetForm\" (ngSubmit)=\"forgetFormFun(forgetForm.value)\">\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u767B\u5F55\u8D26\u53F7</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{userErrorTip}}\">\n <input nz-input formControlName=\"forgetusername\" placeholder=\"\u8BF7\u8F93\u5165\u624B\u673A\u53F7\" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u65B0 \u5BC6 \u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{passwordErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"forgetPassword\" placeholder=\"\u8BF7\u8F93\u5165\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible = !passwordVisible\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u786E\u8BA4\u5BC6\u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{forgetphoneCodesErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"forgetConfirmpassword\" placeholder=\"\u8BF7\u518D\u6B21\u8F93\u5165\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible = !passwordVisible\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item class=\"forget_contain\">\n <nz-form-label [nzSpan]=\"5\" nzRequired >\u9A8C \u8BC1 \u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"8\" nzHasFeedback nzErrorTip=\"{{phoneCodesErrorTip}}\" class=\"codeInput\">\n <input style=\"font-size: 18px;\" nz-input type=\"text\" formControlName=\"forgerphoneCode\"\n placeholder=\"\u624B\u673A\u9A8C\u8BC1\u7801\" />\n </nz-form-control>\n <nz-form-control [nzSpan]=\"6\" class=\"getCode\">\n <div *ngIf=\"!isCountDown\" (click)=\"getCode2()\" class=\"get_code\"\n style=\"background-color:#40a9ff;cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\n \u83B7\u53D6\u9A8C\u8BC1\u7801\n </div>\n <div *ngIf=\"isCountDown\"\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\n {{countDown}}/\u79D2\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class=\"login_btn\">\n <button style=\"width: 348px;\" nz-button nzType=\"primary\" [nzSize]=\"'large'\"\n [disabled]=\"!forgetForm.valid\">\u91CD\u7F6E\u5BC6\u7801</button>\n </div>\n <div class=\"forget\">\n <h6 (click)=\"backLogin()\">\u8FD4\u56DE\u767B\u5F55</h6>\n </div>\n </form>\n </ng-container>\n\n </nz-tab>\n <!-- \u767B\u5F55\uFF1A\u624B\u673A\u53F7+\u9A8C\u8BC1\u7801\u767B\u5165 -->\n <nz-tab nzTitle=\"\u77ED\u4FE1\u9A8C\u8BC1\" style=\"color: #000000;\">\n <ng-container *ngIf=\"type == 'login'\">\n <form nz-form [formGroup]=\"validateSMSForm\" (ngSubmit)=\"submitFormMobileSMS(validateSMSForm.value)\">\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u624B \u673A \u53F7</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{userErrorTip}}\">\n <input nz-input formControlName=\"mobile\" placeholder=\"\u8BF7\u8F93\u5165\u624B\u673A\u53F7\" />\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item class=\"form-control-contain\">\n <nz-form-label [nzSpan]=\"5\" class=\"contain_yanzm\" nzRequired >\u9A8C\u8BC1\u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"6\" nzErrorTip=\"{{codeErrorTip}}\" class=\"contain_input_yanzm\">\n <input style=\"font-size:14px\" title=\"\u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801\" nz-input type=\"text\" formControlName=\"checkCode\"\n placeholder=\"\u533A\u5206\u5927\u5C0F\u5199\" />\n </nz-form-control>\n <nz-form-control [nzSpan]=\"4\" class=\"codeText\">\n <div style=\" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;\">{{code}}</div>\n </nz-form-control>\n <nz-form-control [nzSpan]=\"4\" class=\"switch\">\n <div (click)=\"creatCode()\"\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;\">\n \u6362\u4E00\u4E2A\n </div>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u77ED\u4FE1\u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"10\" nzErrorTip=\"{{smsCodeErrorTip}}\">\n <nz-input-group>\n <input nz-input [type]=\"'text'\" [disabled]=\"!isSended || !codeVerified\" formControlName=\"smsCode\" placeholder=\"\u8BF7\u8F93\u5165\u77ED\u4FE1\u9A8C\u8BC1\u7801\" />\n </nz-input-group>\n </nz-form-control>\n <nz-form-control [nzSpan]=\"4\" class=\"switch\">\n <div *ngIf=\"!isSending\" (click)=\"sendSMSCode()\"\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;\">\n \u83B7\u53D6\u9A8C\u8BC1\u7801\n </div>\n <div *ngIf=\"isSending\"\n style=\"background-color:#eff5f9; color: rgb(118, 117, 117); padding: 5px; text-align: center;\">\n {{smsTimeCount}}\n </div>\n </nz-form-control>\n </nz-form-item>\n \n <div class=\"login_btn\">\n <button nz-button nzType=\"primary\" [nzSize]=\"'large'\" [disabled]=\"!validateSMSForm.valid\">\u767B\u5F55</button>\n </div>\n </form>\n </ng-container>\n </nz-tab>\n\n <!-- \u6CE8\u518C\uFF1A\u4F01\u4E1A\u7528\u6237Profile\u5F00\u901A -->\n <nz-tab *ngIf=\"mobileLogin\" nzTitle=\"\u5F00\u901A\" style=\"color: #000000;\" class=\"activation\">\n <form nz-form [formGroup]=\"registForm\" (ngSubmit)=\"registSubmitForm(registForm.value)\">\n <nz-form-item>\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u5F00\u901A\u8BC1\u4EF6</nz-form-label>\n <nz-form-control [nzSpan]=\"12\" nzHasFeedback nzValidatingTip=\"\u9A8C\u8BC1\u4E2D...\"\n nzErrorTip=\"{{registIdcardErrorTip}}\">\n <input title=\"\u8BF7\u8F93\u5165\u8EAB\u4EFD\u8BC1\u53F7\u7801\" nz-input formControlName=\"registIdcard\" placeholder=\"\u8BF7\u8F93\u5165\u8EAB\u4EFD\u8BC1\u53F7\u7801\" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u5F00\u901A\u59D3\u540D</nz-form-label>\n <nz-form-control [nzSpan]=\"12\" nzHasFeedback nzErrorTip=\"{{registNameErrorTip}}\">\n <input nz-input type=\"text\" formControlName=\"registName\" placeholder=\"\u8BF7\u8F93\u5165\u59D3\u540D\" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u7ED1\u5B9A\u624B\u673A\u53F7</nz-form-label>\n <nz-form-control [nzSpan]=\"12\" nzHasFeedback nzErrorTip=\"{{phoneErrorTip}}\">\n <input [(ngModel)]=\"registPhone\" nz-input style=\"font-size: 18px;\" type=\"text\"\n formControlName=\"registPhone\" placeholder=\"\u8BF7\u8F93\u5165\u624B\u673A\u53F7\" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item class=\"verifyCode\">\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u624B\u673A\u9A8C\u8BC1\u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"6\" class=\"code_input\" nzHasFeedback nzErrorTip=\"{{phoneCodesErrorTip}}\">\n <input style=\"font-size: 18px;\" nz-input type=\"text\" formControlName=\"phoneCode\" placeholder=\"\u624B\u673A\u9A8C\u8BC1\u7801\" />\n </nz-form-control>\n <nz-form-control [nzSpan]=\"6\" class=\"codeContain\">\n <div *ngIf=\"!isCountDown\" (click)=\"getCode()\"\n class=\"get_code\"\n style=\"background-color:#40a9ff; cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\n \u83B7\u9A8C\u8BC1\u7801\n </div>\n <div *ngIf=\"isCountDown\"\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\n {{countDown}}/\u79D2\n </div>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u5F00\u901A\u5BC6\u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"12\" nzHasFeedback nzErrorTip=\"{{regpasswordErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate2\">\n <input nz-input [type]=\"passwordVisible2 ? 'text' : 'password'\" formControlName=\"regpassword\"\n placeholder=\"\u8BF7\u8F93\u5165\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate2>\n <i nz-icon [nzType]=\"passwordVisible2 ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible2 = !passwordVisible2\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u786E\u8BA4\u5BC6\u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"12\" nzHasFeedback nzErrorTip=\"{{confirmPasswordErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate3\">\n <input nz-input [type]=\"passwordVisible3 ? 'text' : 'password'\" formControlName=\"confirmPassword\"\n placeholder=\"\u8BF7\u786E\u8BA4\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate3>\n <i nz-icon [nzType]=\"passwordVisible3 ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible3 = !passwordVisible3\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <div class=\"login_btn\">\n <button nz-button nzType=\"primary\" [disabled]=\"!registForm.valid\">\u7533\u8BF7\u5F00\u901A</button>\n </div>\n </form>\n </nz-tab>\n </nz-tabset>\n <div class=\"nav_login_right\">\n <p class=\"login_right_title\">\u4E8C\u7EF4\u7801</p>\n <img [src]=\"qrcode\" alt=\"\u516C\u4F17\u53F7\u4E8C\u7EF4\u7801\">\n <p>\u626B\u7801\u8FDB\u5165\u5FAE\u4FE1\u7AEF</p>\n <!-- <p class=\"login_right_bottom\">\u9996\u6B21\u767B\u5F55\u6709\u60CA\u559C</p> -->\n </div>\n </div>\n\n <div class=\"loadWrap\" style=\"display: flex;align-items: center;justify-content: center;width: 100%;height: 100%;\"\n *ngIf=\"loading2\">\n <nz-spin nzTip=\"\u52A0\u8F7D\u4E2D\uFF0C\u8BF7\u7A0D\u540E...\">\n <nz-alert nzType=\"info\" nzMessage=\"\u8BFE\u7A0B\u52A0\u8F7D\u4E2D\uFF0C\u8BF7\u7A0D\u540E...\"></nz-alert>\n </nz-spin>\n </div>\n\n <!-- \u6CE8\u9500 -->\n <nz-modal [(nzVisible)]=\"isVisible\" nzTitle=\"\u624B\u673A\u53F7\u9519\u8BEF\" (nzOnCancel)=\"handleCancel()\" (nzOnOk)=\"handleOk()\">\n <ng-container *nzModalContent>\n <p>\u624B\u673A\u53F7\u9519\u8BEF, \u8054\u7CFB\u7BA1\u7406\u5458\u6838\u5BF9\u4FE1\u606F</p>\n </ng-container>\n </nz-modal>\n </div>\n</div>\n", styles: [".student-login-layout{position:fixed;top:0;left:0;background:#fff;width:100%;height:100%;z-index:100;overflow:auto;background:url(https://cloud.fmode.cn/assets/bg-login.jpg) no-repeat;background-size:100% 100%}.student-login-layout .nav_center{width:800px;min-height:450px;margin:0 auto;top:50%;left:50%;transform:translate(-50%,-50%);background-size:inherit;position:absolute;padding:30px;text-align:center}.student-login-layout .nav_center .login_img{max-width:70%;max-height:100px}.student-login-layout .nav_center .nav_login{background:#ffffff1a}.student-login-layout .nav_center ::ng-deep .ant-tabs-tab-btn{font-size:22px}.student-login-layout .nav_center .ant-tabs-tab-btn{border-bottom:2px solid #1890ff}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav{height:55px}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav-list{width:100%;display:flex;justify-content:center;color:#000}.student-login-layout .nav_center ::ng-deep .ant-form-item-required{font-size:18px;font-weight:700}.student-login-layout .nav_center ::ng-deep .ng-invalid{font-size:18px}.student-login-layout .nav_center ::ng-deep .ng-valid{font-size:18px}.student-login-layout .nav_center ::ng-deep .ng-pending{font-size:18px}.student-login-layout .nav_center ::ng-deep .ant-form-item{display:flex;justify-content:center}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav:before{border:none}.student-login-layout .nav_center .nav_login{display:flex;flex-direction:inherit;align-items:center;justify-content:center;width:100%;border-radius:2px;background-color:#fff;margin:0 auto;min-height:500px}.student-login-layout .nav_center .nav_login .login-form{max-width:300px}.student-login-layout .nav_center .nav_login [nz-form]{width:440px;max-width:500px}.student-login-layout .nav_center .nav_login .login_btn{width:400px;margin:0 auto;display:flex;justify-content:center}.student-login-layout .nav_center .nav_login .login_btn button{width:85%}.student-login-layout .nav_center .nav_login .forget{margin:10px 40px 0 auto;display:flex;justify-content:flex-end}.student-login-layout .nav_center .nav_login .forget h6{font-size:14px;color:#40a9ff}.student-login-layout .nav_center .nav_login .login-form-margin{margin-bottom:16px}.student-login-layout .nav_center .nav_login .login-form-forgot{float:right}.student-login-layout .nav_center .nav_login .login-form-button{width:100%}.student-login-layout .nav_center .nav_login .nav_login_right{height:100%;flex:2;border-left:2px dashed #e5e5e5;font-size:16px;display:flex;flex-direction:column;color:#626262;align-items:center;justify-content:center}.student-login-layout .nav_center .nav_login .nav_login_right .login_right_bottom{margin:40px 0 50px}.student-login-layout .nav_center .nav_login .nav_login_right img{width:160px}.student-login-layout .nav_center .iseducation{position:absolute;top:159px;background:#fff;width:90%;flex-direction:column;line-height:50px}.student-login-layout .nav_center .iseducation .login_btn{margin-top:30px}.student-login-layout .nav_center .iseducation .close_education{width:30px;height:30px;position:absolute;top:20px;right:10px;font-size:24px;background-color:#dddddddb;border-radius:15px;line-height:28px;cursor:pointer}.student-login-layout .nav_center .loadWrap{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}@media (min-width: 960px){.nav_center{width:90%}}@media (max-width: 760px){.student-login-layout .nav_center{width:100%}.student-login-layout .nav_center ::ng-deep .ant-form-item-explain{text-align:left!important}.student-login-layout .nav_center ::ng-deep .ng-invalid{font-size:13px!important}.student-login-layout .nav_center ::ng-deep .ant-tabs-tab-btn{font-size:18px}.student-login-layout .nav_center .login_btn{width:100%!important;margin:10px auto!important}.student-login-layout .nav_center .login_btn button{width:100%!important}.student-login-layout .nav_login [nz-form]{width:100%!important;max-width:auto;padding:0 30px;display:flex;justify-content:center;flex-direction:column}.student-login-layout .ant-form-item{margin-bottom:5px}.student-login-layout ::ng-deep .ant-form-item-required{font-size:12px!important;padding-bottom:0!important}.student-login-layout .ant-form-item-label{padding:0}.student-login-layout .form-control-contain{display:flex!important;justify-content:space-between!important;flex-wrap:wrap;margin-top:10px}.student-login-layout .form-control-contain .contain_yanzm{flex:0 0 30%}.student-login-layout .form-control-contain .contain_input_yanzm{flex:0 0 40%}.student-login-layout .form-control-contain .codeText{flex:0 0 30%}.student-login-layout .form-control-contain .switch{flex:0 0 100%}.verifyCode .code_input{flex:0 0 50%}.verifyCode .codeContain{margin-left:10px;flex:0 0 45%}.verifyCode .get_code{font-size:14px!important}.forget_contain .codeInput{flex:0 0 50%}.forget_contain .getCode{margin-left:10px;flex:0 0 45%}.get_code{font-size:14px!important}.iseducation{top:110px!important}.iseducation .close_education #login_btn{width:50%!important}}@media (max-width: 460px){.form-control-contain .switch{margin-top:10px!important}}\n"], dependencies: [{ kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i8.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i8.NzInputGroupComponent, selector: "nz-input-group", inputs: ["nzAddOnBeforeIcon", "nzAddOnAfterIcon", "nzPrefixIcon", "nzSuffixIcon", "nzAddOnBefore", "nzAddOnAfter", "nzPrefix", "nzStatus", "nzSuffix", "nzSize", "nzSearch", "nzCompact"], exportAs: ["nzInputGroup"] }, { kind: "directive", type: i8.NzInputGroupWhitSuffixOrPrefixDirective, selector: "nz-input-group[nzSuffix], nz-input-group[nzPrefix]" }, { kind: "component", type: i9.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i10.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i11.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "component", type: i12.NzModalComponent, selector: "nz-modal", inputs: ["nzMask", "nzMaskClosable", "nzCloseOnNavigation", "nzVisible", "nzClosable", "nzOkLoading", "nzOkDisabled", "nzCancelDisabled", "nzCancelLoading", "nzKeyboard", "nzNoAnimation", "nzCentered", "nzDraggable", "nzContent", "nzFooter", "nzZIndex", "nzWidth", "nzWrapClassName", "nzClassName", "nzStyle", "nzTitle", "nzCloseIcon", "nzMaskStyle", "nzBodyStyle", "nzOkText", "nzCancelText", "nzOkType", "nzOkDanger", "nzIconType", "nzModalType", "nzAutofocus", "nzOnOk", "nzOnCancel"], outputs: ["nzOnOk", "nzOnCancel", "nzAfterOpen", "nzAfterClose", "nzVisibleChange"], exportAs: ["nzModal"] }, { kind: "directive", type: i12.NzModalContentDirective, selector: "[nzModalContent]", exportAs: ["nzModalContent"] }, { kind: "component", type: i13.NzSpinComponent, selector: "nz-spin", inputs: ["nzIndicator", "nzSize", "nzTip", "nzDelay", "nzSimple", "nzSpinning"], exportAs: ["nzSpin"] }, { kind: "component", type: i14.NzTabSetComponent, selector: "nz-tabset", inputs: ["nzSelectedIndex", "nzTabPosition", "nzTabBarExtraContent", "nzCanDeactivate", "nzAddIcon", "nzTabBarStyle", "nzType", "nzSize", "nzAnimated", "nzTabBarGutter", "nzHideAdd", "nzCentered", "nzHideAll", "nzLinkRouter", "nzLinkExact"], outputs: ["nzSelectChange", "nzSelectedIndexChange", "nzTabListScroll", "nzClose", "nzAdd"], exportAs: ["nzTabset"] }, { kind: "component", type: i14.NzTabComponent, selector: "nz-tab", inputs: ["nzTitle", "nzClosable", "nzCloseIcon", "nzDisabled", "nzForceRender"], outputs: ["nzSelect", "nzDeselect", "nzClick", "nzContextmenu"], exportAs: ["nzTab"] }, { kind: "directive", type: i15.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i15.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "directive", type: i16.NzFormDirective, selector: "[nz-form]", inputs: ["nzLayout", "nzNoColon", "nzAutoTips", "nzDisableAutoTips", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzForm"] }, { kind: "component", type: i16.NzFormItemComponent, selector: "nz-form-item", exportAs: ["nzFormItem"] }, { kind: "component", type: i16.NzFormLabelComponent, selector: "nz-form-label", inputs: ["nzFor", "nzRequired", "nzNoColon", "nzTooltipTitle", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzFormLabel"] }, { kind: "component", type: i16.NzFormControlComponent, selector: "nz-form-control", inputs: ["nzSuccessTip", "nzWarningTip", "nzErrorTip", "nzValidatingTip", "nzExtra", "nzAutoTips", "nzDisableAutoTips", "nzHasFeedback", "nzValidateStatus"], exportAs: ["nzFormControl"] }] }); }
|
|
908
|
-
}
|
|
909
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LoginComponent, decorators: [{
|
|
910
|
-
type: Component,
|
|
911
|
-
args: [{ selector: "app-pcuser-login", template: "<div class=\"student-login-layout\">\n <div class=\"nav_center\">\n <img [src]=\"logo\" alt=\"\" class=\"login_img\">\n <div class=\"nav_login\">\n <nz-tabset [nzSelectedIndex]=\"tabIndex\" [nzTabPosition]=\"'top'\">\n\n <!-- \u767B\u5F55\uFF1A\u624B\u673A\u53F7+\u5BC6\u7801\u767B\u5165 -->\n <nz-tab nzTitle=\"\u624B\u673A\u5BC6\u7801\" style=\"color: #000000;\">\n <ng-container *ngIf=\"type == 'login'\">\n <form nz-form [formGroup]=\"validateForm\" (ngSubmit)=\"submitFormMobilePassword(validateForm.value)\">\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u624B\u673A\u53F7</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{userErrorTip}}\">\n <input nz-input formControlName=\"mobile\" placeholder=\"\u8BF7\u8F93\u5165\u624B\u673A\u53F7\" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u5BC6 \u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{passwordErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"password\" placeholder=\"\u8BF7\u8F93\u5165\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible = !passwordVisible\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item class=\"form-control-contain\">\n <nz-form-label [nzSpan]=\"5\" class=\"contain_yanzm\" nzRequired >\u9A8C\u8BC1\u7801 </nz-form-label>\n <nz-form-control [nzSpan]=\"6\" nzErrorTip=\"{{codeErrorTip}}\" class=\"contain_input_yanzm\">\n <input style=\"font-size:14px\" title=\"\u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801\" nz-input type=\"text\" formControlName=\"checkCode\"\n placeholder=\"\u533A\u5206\u5927\u5C0F\u5199\" />\n </nz-form-control>\n <nz-form-control [nzSpan]=\"4\" class=\"codeText\">\n <div style=\" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;\">{{code}}</div>\n </nz-form-control>\n <nz-form-control [nzSpan]=\"4\" class=\"switch\">\n <div (click)=\"creatCode()\"\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;\">\n \u6362\u4E00\u4E2A\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class=\"login_btn\">\n <button nz-button nzType=\"primary\" [nzSize]=\"'large'\" [disabled]=\"!validateForm.valid\">\u767B\u5F55</button>\n </div>\n <div class=\"forget\">\n <h6 (click)=\"forget()\">\u5FD8\u8BB0\u5BC6\u7801</h6>\n </div>\n </form>\n </ng-container>\n <ng-container *ngIf=\"type == 'forget'\">\n <form nz-form [formGroup]=\"forgetForm\" (ngSubmit)=\"forgetFormFun(forgetForm.value)\">\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u767B\u5F55\u8D26\u53F7</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{userErrorTip}}\">\n <input nz-input formControlName=\"forgetusername\" placeholder=\"\u8BF7\u8F93\u5165\u624B\u673A\u53F7\" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u65B0 \u5BC6 \u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{passwordErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"forgetPassword\" placeholder=\"\u8BF7\u8F93\u5165\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible = !passwordVisible\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u786E\u8BA4\u5BC6\u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{forgetphoneCodesErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"forgetConfirmpassword\" placeholder=\"\u8BF7\u518D\u6B21\u8F93\u5165\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible = !passwordVisible\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item class=\"forget_contain\">\n <nz-form-label [nzSpan]=\"5\" nzRequired >\u9A8C \u8BC1 \u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"8\" nzHasFeedback nzErrorTip=\"{{phoneCodesErrorTip}}\" class=\"codeInput\">\n <input style=\"font-size: 18px;\" nz-input type=\"text\" formControlName=\"forgerphoneCode\"\n placeholder=\"\u624B\u673A\u9A8C\u8BC1\u7801\" />\n </nz-form-control>\n <nz-form-control [nzSpan]=\"6\" class=\"getCode\">\n <div *ngIf=\"!isCountDown\" (click)=\"getCode2()\" class=\"get_code\"\n style=\"background-color:#40a9ff;cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\n \u83B7\u53D6\u9A8C\u8BC1\u7801\n </div>\n <div *ngIf=\"isCountDown\"\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\n {{countDown}}/\u79D2\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class=\"login_btn\">\n <button style=\"width: 348px;\" nz-button nzType=\"primary\" [nzSize]=\"'large'\"\n [disabled]=\"!forgetForm.valid\">\u91CD\u7F6E\u5BC6\u7801</button>\n </div>\n <div class=\"forget\">\n <h6 (click)=\"backLogin()\">\u8FD4\u56DE\u767B\u5F55</h6>\n </div>\n </form>\n </ng-container>\n\n </nz-tab>\n\n <!-- \u767B\u5F55\uFF1A\u5E10\u53F7+\u5BC6\u7801\u767B\u5165 -->\n <nz-tab nzTitle=\"\u5E10\u53F7\u5BC6\u7801\" style=\"color: #000000;\">\n <ng-container *ngIf=\"type == 'login'\">\n <form nz-form [formGroup]=\"validateUserForm\" (ngSubmit)=\"submitFormUserPassword(validateUserForm.value)\">\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u5E10 \u53F7</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{userErrorTip}}\">\n <input nz-input formControlName=\"username\" placeholder=\"\u8BF7\u8F93\u5165\u5E10\u53F7\" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u5BC6 \u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{passwordErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"password\" placeholder=\"\u8BF7\u8F93\u5165\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible = !passwordVisible\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item class=\"form-control-contain\">\n <nz-form-label [nzSpan]=\"5\" class=\"contain_yanzm\" nzRequired >\u9A8C\u8BC1\u7801 </nz-form-label>\n <nz-form-control [nzSpan]=\"6\" nzErrorTip=\"{{codeErrorTip}}\" class=\"contain_input_yanzm\">\n <input style=\"font-size:14px\" title=\"\u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801\" nz-input type=\"text\" formControlName=\"checkCode\"\n placeholder=\"\u533A\u5206\u5927\u5C0F\u5199\" />\n </nz-form-control>\n <nz-form-control [nzSpan]=\"4\" class=\"codeText\">\n <div style=\" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;\">{{code}}</div>\n </nz-form-control>\n <nz-form-control [nzSpan]=\"4\" class=\"switch\">\n <div (click)=\"creatCode()\"\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;\">\n \u6362\u4E00\u4E2A\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class=\"login_btn\">\n <button nz-button nzType=\"primary\" [nzSize]=\"'large'\" [disabled]=\"!validateUserForm.valid\">\u767B\u5F55</button>\n </div>\n </form>\n </ng-container>\n <ng-container *ngIf=\"type == 'forget'\">\n <form nz-form [formGroup]=\"forgetForm\" (ngSubmit)=\"forgetFormFun(forgetForm.value)\">\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u767B\u5F55\u8D26\u53F7</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{userErrorTip}}\">\n <input nz-input formControlName=\"forgetusername\" placeholder=\"\u8BF7\u8F93\u5165\u624B\u673A\u53F7\" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u65B0 \u5BC6 \u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{passwordErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"forgetPassword\" placeholder=\"\u8BF7\u8F93\u5165\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible = !passwordVisible\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u786E\u8BA4\u5BC6\u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{forgetphoneCodesErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\n <input nz-input [type]=\"passwordVisible ? 'text' : 'password'\" formControlName=\"forgetConfirmpassword\" placeholder=\"\u8BF7\u518D\u6B21\u8F93\u5165\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible = !passwordVisible\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item class=\"forget_contain\">\n <nz-form-label [nzSpan]=\"5\" nzRequired >\u9A8C \u8BC1 \u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"8\" nzHasFeedback nzErrorTip=\"{{phoneCodesErrorTip}}\" class=\"codeInput\">\n <input style=\"font-size: 18px;\" nz-input type=\"text\" formControlName=\"forgerphoneCode\"\n placeholder=\"\u624B\u673A\u9A8C\u8BC1\u7801\" />\n </nz-form-control>\n <nz-form-control [nzSpan]=\"6\" class=\"getCode\">\n <div *ngIf=\"!isCountDown\" (click)=\"getCode2()\" class=\"get_code\"\n style=\"background-color:#40a9ff;cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\n \u83B7\u53D6\u9A8C\u8BC1\u7801\n </div>\n <div *ngIf=\"isCountDown\"\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\n {{countDown}}/\u79D2\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class=\"login_btn\">\n <button style=\"width: 348px;\" nz-button nzType=\"primary\" [nzSize]=\"'large'\"\n [disabled]=\"!forgetForm.valid\">\u91CD\u7F6E\u5BC6\u7801</button>\n </div>\n <div class=\"forget\">\n <h6 (click)=\"backLogin()\">\u8FD4\u56DE\u767B\u5F55</h6>\n </div>\n </form>\n </ng-container>\n\n </nz-tab>\n <!-- \u767B\u5F55\uFF1A\u624B\u673A\u53F7+\u9A8C\u8BC1\u7801\u767B\u5165 -->\n <nz-tab nzTitle=\"\u77ED\u4FE1\u9A8C\u8BC1\" style=\"color: #000000;\">\n <ng-container *ngIf=\"type == 'login'\">\n <form nz-form [formGroup]=\"validateSMSForm\" (ngSubmit)=\"submitFormMobileSMS(validateSMSForm.value)\">\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u624B \u673A \u53F7</nz-form-label>\n <nz-form-control [nzSpan]=\"14\" nzErrorTip=\"{{userErrorTip}}\">\n <input nz-input formControlName=\"mobile\" placeholder=\"\u8BF7\u8F93\u5165\u624B\u673A\u53F7\" />\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item class=\"form-control-contain\">\n <nz-form-label [nzSpan]=\"5\" class=\"contain_yanzm\" nzRequired >\u9A8C\u8BC1\u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"6\" nzErrorTip=\"{{codeErrorTip}}\" class=\"contain_input_yanzm\">\n <input style=\"font-size:14px\" title=\"\u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801\" nz-input type=\"text\" formControlName=\"checkCode\"\n placeholder=\"\u533A\u5206\u5927\u5C0F\u5199\" />\n </nz-form-control>\n <nz-form-control [nzSpan]=\"4\" class=\"codeText\">\n <div style=\" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;\">{{code}}</div>\n </nz-form-control>\n <nz-form-control [nzSpan]=\"4\" class=\"switch\">\n <div (click)=\"creatCode()\"\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;\">\n \u6362\u4E00\u4E2A\n </div>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label [nzSpan]=\"5\" nzRequired>\u77ED\u4FE1\u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"10\" nzErrorTip=\"{{smsCodeErrorTip}}\">\n <nz-input-group>\n <input nz-input [type]=\"'text'\" [disabled]=\"!isSended || !codeVerified\" formControlName=\"smsCode\" placeholder=\"\u8BF7\u8F93\u5165\u77ED\u4FE1\u9A8C\u8BC1\u7801\" />\n </nz-input-group>\n </nz-form-control>\n <nz-form-control [nzSpan]=\"4\" class=\"switch\">\n <div *ngIf=\"!isSending\" (click)=\"sendSMSCode()\"\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;\">\n \u83B7\u53D6\u9A8C\u8BC1\u7801\n </div>\n <div *ngIf=\"isSending\"\n style=\"background-color:#eff5f9; color: rgb(118, 117, 117); padding: 5px; text-align: center;\">\n {{smsTimeCount}}\n </div>\n </nz-form-control>\n </nz-form-item>\n \n <div class=\"login_btn\">\n <button nz-button nzType=\"primary\" [nzSize]=\"'large'\" [disabled]=\"!validateSMSForm.valid\">\u767B\u5F55</button>\n </div>\n </form>\n </ng-container>\n </nz-tab>\n\n <!-- \u6CE8\u518C\uFF1A\u4F01\u4E1A\u7528\u6237Profile\u5F00\u901A -->\n <nz-tab *ngIf=\"mobileLogin\" nzTitle=\"\u5F00\u901A\" style=\"color: #000000;\" class=\"activation\">\n <form nz-form [formGroup]=\"registForm\" (ngSubmit)=\"registSubmitForm(registForm.value)\">\n <nz-form-item>\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u5F00\u901A\u8BC1\u4EF6</nz-form-label>\n <nz-form-control [nzSpan]=\"12\" nzHasFeedback nzValidatingTip=\"\u9A8C\u8BC1\u4E2D...\"\n nzErrorTip=\"{{registIdcardErrorTip}}\">\n <input title=\"\u8BF7\u8F93\u5165\u8EAB\u4EFD\u8BC1\u53F7\u7801\" nz-input formControlName=\"registIdcard\" placeholder=\"\u8BF7\u8F93\u5165\u8EAB\u4EFD\u8BC1\u53F7\u7801\" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u5F00\u901A\u59D3\u540D</nz-form-label>\n <nz-form-control [nzSpan]=\"12\" nzHasFeedback nzErrorTip=\"{{registNameErrorTip}}\">\n <input nz-input type=\"text\" formControlName=\"registName\" placeholder=\"\u8BF7\u8F93\u5165\u59D3\u540D\" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u7ED1\u5B9A\u624B\u673A\u53F7</nz-form-label>\n <nz-form-control [nzSpan]=\"12\" nzHasFeedback nzErrorTip=\"{{phoneErrorTip}}\">\n <input [(ngModel)]=\"registPhone\" nz-input style=\"font-size: 18px;\" type=\"text\"\n formControlName=\"registPhone\" placeholder=\"\u8BF7\u8F93\u5165\u624B\u673A\u53F7\" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item class=\"verifyCode\">\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u624B\u673A\u9A8C\u8BC1\u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"6\" class=\"code_input\" nzHasFeedback nzErrorTip=\"{{phoneCodesErrorTip}}\">\n <input style=\"font-size: 18px;\" nz-input type=\"text\" formControlName=\"phoneCode\" placeholder=\"\u624B\u673A\u9A8C\u8BC1\u7801\" />\n </nz-form-control>\n <nz-form-control [nzSpan]=\"6\" class=\"codeContain\">\n <div *ngIf=\"!isCountDown\" (click)=\"getCode()\"\n class=\"get_code\"\n style=\"background-color:#40a9ff; cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\n \u83B7\u9A8C\u8BC1\u7801\n </div>\n <div *ngIf=\"isCountDown\"\n style=\"background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;\">\n {{countDown}}/\u79D2\n </div>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u5F00\u901A\u5BC6\u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"12\" nzHasFeedback nzErrorTip=\"{{regpasswordErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate2\">\n <input nz-input [type]=\"passwordVisible2 ? 'text' : 'password'\" formControlName=\"regpassword\"\n placeholder=\"\u8BF7\u8F93\u5165\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate2>\n <i nz-icon [nzType]=\"passwordVisible2 ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible2 = !passwordVisible2\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]=\"7\" nzRequired>\u786E\u8BA4\u5BC6\u7801</nz-form-label>\n <nz-form-control [nzSpan]=\"12\" nzHasFeedback nzErrorTip=\"{{confirmPasswordErrorTip}}\">\n <nz-input-group [nzSuffix]=\"suffixTemplate3\">\n <input nz-input [type]=\"passwordVisible3 ? 'text' : 'password'\" formControlName=\"confirmPassword\"\n placeholder=\"\u8BF7\u786E\u8BA4\u5BC6\u7801\" />\n </nz-input-group>\n <ng-template #suffixTemplate3>\n <i nz-icon [nzType]=\"passwordVisible3 ? 'eye-invisible' : 'eye'\"\n (click)=\"passwordVisible3 = !passwordVisible3\"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <div class=\"login_btn\">\n <button nz-button nzType=\"primary\" [disabled]=\"!registForm.valid\">\u7533\u8BF7\u5F00\u901A</button>\n </div>\n </form>\n </nz-tab>\n </nz-tabset>\n <div class=\"nav_login_right\">\n <p class=\"login_right_title\">\u4E8C\u7EF4\u7801</p>\n <img [src]=\"qrcode\" alt=\"\u516C\u4F17\u53F7\u4E8C\u7EF4\u7801\">\n <p>\u626B\u7801\u8FDB\u5165\u5FAE\u4FE1\u7AEF</p>\n <!-- <p class=\"login_right_bottom\">\u9996\u6B21\u767B\u5F55\u6709\u60CA\u559C</p> -->\n </div>\n </div>\n\n <div class=\"loadWrap\" style=\"display: flex;align-items: center;justify-content: center;width: 100%;height: 100%;\"\n *ngIf=\"loading2\">\n <nz-spin nzTip=\"\u52A0\u8F7D\u4E2D\uFF0C\u8BF7\u7A0D\u540E...\">\n <nz-alert nzType=\"info\" nzMessage=\"\u8BFE\u7A0B\u52A0\u8F7D\u4E2D\uFF0C\u8BF7\u7A0D\u540E...\"></nz-alert>\n </nz-spin>\n </div>\n\n <!-- \u6CE8\u9500 -->\n <nz-modal [(nzVisible)]=\"isVisible\" nzTitle=\"\u624B\u673A\u53F7\u9519\u8BEF\" (nzOnCancel)=\"handleCancel()\" (nzOnOk)=\"handleOk()\">\n <ng-container *nzModalContent>\n <p>\u624B\u673A\u53F7\u9519\u8BEF, \u8054\u7CFB\u7BA1\u7406\u5458\u6838\u5BF9\u4FE1\u606F</p>\n </ng-container>\n </nz-modal>\n </div>\n</div>\n", styles: [".student-login-layout{position:fixed;top:0;left:0;background:#fff;width:100%;height:100%;z-index:100;overflow:auto;background:url(https://cloud.fmode.cn/assets/bg-login.jpg) no-repeat;background-size:100% 100%}.student-login-layout .nav_center{width:800px;min-height:450px;margin:0 auto;top:50%;left:50%;transform:translate(-50%,-50%);background-size:inherit;position:absolute;padding:30px;text-align:center}.student-login-layout .nav_center .login_img{max-width:70%;max-height:100px}.student-login-layout .nav_center .nav_login{background:#ffffff1a}.student-login-layout .nav_center ::ng-deep .ant-tabs-tab-btn{font-size:22px}.student-login-layout .nav_center .ant-tabs-tab-btn{border-bottom:2px solid #1890ff}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav{height:55px}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav-list{width:100%;display:flex;justify-content:center;color:#000}.student-login-layout .nav_center ::ng-deep .ant-form-item-required{font-size:18px;font-weight:700}.student-login-layout .nav_center ::ng-deep .ng-invalid{font-size:18px}.student-login-layout .nav_center ::ng-deep .ng-valid{font-size:18px}.student-login-layout .nav_center ::ng-deep .ng-pending{font-size:18px}.student-login-layout .nav_center ::ng-deep .ant-form-item{display:flex;justify-content:center}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav:before{border:none}.student-login-layout .nav_center .nav_login{display:flex;flex-direction:inherit;align-items:center;justify-content:center;width:100%;border-radius:2px;background-color:#fff;margin:0 auto;min-height:500px}.student-login-layout .nav_center .nav_login .login-form{max-width:300px}.student-login-layout .nav_center .nav_login [nz-form]{width:440px;max-width:500px}.student-login-layout .nav_center .nav_login .login_btn{width:400px;margin:0 auto;display:flex;justify-content:center}.student-login-layout .nav_center .nav_login .login_btn button{width:85%}.student-login-layout .nav_center .nav_login .forget{margin:10px 40px 0 auto;display:flex;justify-content:flex-end}.student-login-layout .nav_center .nav_login .forget h6{font-size:14px;color:#40a9ff}.student-login-layout .nav_center .nav_login .login-form-margin{margin-bottom:16px}.student-login-layout .nav_center .nav_login .login-form-forgot{float:right}.student-login-layout .nav_center .nav_login .login-form-button{width:100%}.student-login-layout .nav_center .nav_login .nav_login_right{height:100%;flex:2;border-left:2px dashed #e5e5e5;font-size:16px;display:flex;flex-direction:column;color:#626262;align-items:center;justify-content:center}.student-login-layout .nav_center .nav_login .nav_login_right .login_right_bottom{margin:40px 0 50px}.student-login-layout .nav_center .nav_login .nav_login_right img{width:160px}.student-login-layout .nav_center .iseducation{position:absolute;top:159px;background:#fff;width:90%;flex-direction:column;line-height:50px}.student-login-layout .nav_center .iseducation .login_btn{margin-top:30px}.student-login-layout .nav_center .iseducation .close_education{width:30px;height:30px;position:absolute;top:20px;right:10px;font-size:24px;background-color:#dddddddb;border-radius:15px;line-height:28px;cursor:pointer}.student-login-layout .nav_center .loadWrap{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}@media (min-width: 960px){.nav_center{width:90%}}@media (max-width: 760px){.student-login-layout .nav_center{width:100%}.student-login-layout .nav_center ::ng-deep .ant-form-item-explain{text-align:left!important}.student-login-layout .nav_center ::ng-deep .ng-invalid{font-size:13px!important}.student-login-layout .nav_center ::ng-deep .ant-tabs-tab-btn{font-size:18px}.student-login-layout .nav_center .login_btn{width:100%!important;margin:10px auto!important}.student-login-layout .nav_center .login_btn button{width:100%!important}.student-login-layout .nav_login [nz-form]{width:100%!important;max-width:auto;padding:0 30px;display:flex;justify-content:center;flex-direction:column}.student-login-layout .ant-form-item{margin-bottom:5px}.student-login-layout ::ng-deep .ant-form-item-required{font-size:12px!important;padding-bottom:0!important}.student-login-layout .ant-form-item-label{padding:0}.student-login-layout .form-control-contain{display:flex!important;justify-content:space-between!important;flex-wrap:wrap;margin-top:10px}.student-login-layout .form-control-contain .contain_yanzm{flex:0 0 30%}.student-login-layout .form-control-contain .contain_input_yanzm{flex:0 0 40%}.student-login-layout .form-control-contain .codeText{flex:0 0 30%}.student-login-layout .form-control-contain .switch{flex:0 0 100%}.verifyCode .code_input{flex:0 0 50%}.verifyCode .codeContain{margin-left:10px;flex:0 0 45%}.verifyCode .get_code{font-size:14px!important}.forget_contain .codeInput{flex:0 0 50%}.forget_contain .getCode{margin-left:10px;flex:0 0 45%}.get_code{font-size:14px!important}.iseducation{top:110px!important}.iseducation .close_education #login_btn{width:50%!important}}@media (max-width: 460px){.form-control-contain .switch{margin-top:10px!important}}\n"] }]
|
|
912
|
-
}], ctorParameters: () => [{ type: i1.AuthService }, { type: i2.NovaCloudService }, { type: i3.FormBuilder }, { type: i4.NzMessageService }, { type: i5.Router }, { type: i5.ActivatedRoute }, { type: i5.ActivatedRoute }, { type: i6.HttpClient }] });
|
|
913
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm1vZGUtbmcvc3JjL2xpYi91c2VyL2xvZ2luL2xvZ2luLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Ztb2RlLW5nL3NyYy9saWIvdXNlci9sb2dpbi9sb2dpbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBbUIsV0FBVyxFQUF5RCxVQUFVLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsSSxPQUFPLEVBQUUsVUFBVSxFQUFZLE1BQU0sTUFBTSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQVksTUFBTSxpQkFBaUIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUNBQXFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU92RSxNQUFNLE9BQU8sY0FBYztJQU16QixRQUFRO0lBQ1IsUUFBUSxDQUFDLEdBQUc7UUFDVixtQkFBbUI7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsV0FBVztRQUNsRSxJQUFJLE9BQU8sR0FBNkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXO1FBQ2pGLE9BQU8sQ0FBQyxTQUFTLEdBQUcsT0FB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WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztZQUNILEdBQUc7WUFDSCxHQUFHO1lBQ0gsR0FBRztTQUNKLENBQUM7UUFDRixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDcEMsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUE7WUFDNUMsSUFBSSxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7K0dBcmdDVSxjQUFjO21HQUFkLGNBQWMsd0RDakIzQiwwMnNCQWlYQTs7NEZEaFdhLGNBQWM7a0JBTDFCLFNBQVM7K0JBQ0Usa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgd2FpdEZvckFzeW5jIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS90ZXN0aW5nJztcbmltcG9ydCB7IExlZ2VuZCB9IGZyb20gJ2pzY2hhcnRpbmcnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRpb25FcnJvcnMsIFZhbGlkYXRvckZuLCBWYWxpZGF0b3JzLCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE9ic2VydmFibGUsIE9ic2VydmVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOek1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9tZXNzYWdlJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IFBhcnNlIGZyb20gXCJwYXJzZVwiO1xuaW1wb3J0IHsgUm91dGVyLCBBY3RpdmF0ZWRSb3V0ZSwgUGFyYW1NYXAgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xuaW1wb3J0IHsgTm92YUNsb3VkU2VydmljZSB9IGZyb20gJy4uLy4uL25vdmEtY2xvdWQvbm92YS1jbG91ZC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImFwcC1wY3VzZXItbG9naW5cIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9sb2dpbi5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vbG9naW4uY29tcG9uZW50LnNjc3NcIl1cbn0pXG5leHBvcnQgY2xhc3MgTG9naW5Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBudW1zID0gWydDJywgJzYnLCAnWicsICd0J107XG4gIHN0ciA9ICcnO1xuICBjYW52YXM6IGFueTtcbiAgaW1hZ2U6IGFueTtcbiAgdGFiSW5kZXg6bnVtYmVyID0gMDtcbiAgLy8g57uY5Yi26aqM6K+B56CBXG4gIGRyYXdDb2RlKHN0cikge1xuICAgIC8vIHRoaXMucmVzZXRDb2RlKClcbiAgICB0aGlzLmNhbnZhcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwidmVyaWZ5Q2FudmFzXCIpOyAvL+iOt+WPlkhUTUznq6/nlLvluINcbiAgICB2YXIgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpOyAvL+iOt+WPlueUu+W4gzJE5LiK5LiL5paHXG4gICAgY29udGV4dC5maWxsU3R5bGUgPSBcIndoaXRlXCI7IC8v55S75biD5aGr5YWF6ImyXG4gICAgY29udGV4dC5maWxsUmVjdCgwLCAwLCB0aGlzLmNhbnZhcy53aWR0aCwgdGhpcy5jYW52YXMuaGVpZ2h0KTsgLy/muIXnqbrnlLvluINcbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9IFwiY29ybmZsb3dlcmJsdWVcIjsgLy/orr7nva7lrZfkvZPpopzoibJcbiAgICBjb250ZXh0LmZvbnQgPSBcIjI1cHggQXJpYWxcIjsgLy/orr7nva7lrZfkvZNcbiAgICB2YXIgcmFuZCA9IG5ldyBBcnJheSgpO1xuICAgIHZhciB4ID0gbmV3IEFycmF5KCk7XG4gICAgdmFyIHkgPSBuZXcgQXJyYXkoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgcmFuZC5wdXNoKHJhbmRbaV0pO1xuICAgICAgcmFuZFtpXSA9IHRoaXMubnVtc1tpXVxuICAgICAgeFtpXSA9IGkgKiAyMCArIDEwO1xuICAgICAgeVtpXSA9IE1hdGgucmFuZG9tKCkgKiAyMCArIDIwO1xuICAgICAgY29udGV4dC5maWxsVGV4dChyYW5kW2ldLCB4W2ldLCB5W2ldKTtcbiAgICB9XG4gICAgc3RyID0gcmFuZC5qb2luKCcnKS50b1VwcGVyQ2FzZSgpO1xuICAgIC8v55S7M+adoemaj+acuue6v1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSsrKSB7XG4gICAgICB0aGlzLmRyYXdsaW5lKHRoaXMuY2FudmFzLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICAvLyDnlLszMOS4qumaj+acuueCuVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMzA7IGkrKykge1xuICAgICAgdGhpcy5kcmF3RG90KHRoaXMuY2FudmFzLCBjb250ZXh0KTtcbiAgICB9XG4gICAgdGhpcy5jb252ZXJ0Q2FudmFzVG9JbWFnZSh0aGlzLmNhbnZhcyk7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIC8vIOmaj+acuue6v1xuICBkcmF3bGluZShjYW52YXMsIGNvbnRleHQpIHtcbiAgICBjb250ZXh0Lm1vdmVUbyhNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjYW52YXMud2lkdGgpLCBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjYW52YXMuaGVpZ2h0KSk7IC8v6ZqP5py657q/55qE6LW354K5eOWdkOagh+aYr+eUu+W4g3jlnZDmoIcw5L2N572u77yMeeWdkOagh+aYr+eUu+W4g+mrmOW6pueahOmaj+acuuaVsFxuICAgIGNvbnRleHQubGluZVRvKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNhbnZhcy53aWR0aCksIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNhbnZhcy5oZWlnaHQpKTsgLy/pmo/mnLrnur/nmoTnu4jngrl45Z2Q5qCH5piv55S75biD5a695bqm77yMeeWdkOagh+aYr+eUu+W4g+mrmOW6pueahOmaj+acuuaVsFxuICAgIGNvbnRleHQubGluZVdpZHRoID0gMC41OyAvL+maj+acuue6v+WuvVxuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAncmdiYSg1MCw1MCw1MCwwLjMpJzsgLy/pmo/mnLrnur/mj4/ovrnlsZ7mgKdcbiAgICBjb250ZXh0LnN0cm9rZSgpOyAvL+aPj+i+ue+8jOWNs+i1t+eCueaPj+WIsOe7iOeCuVxuICB9XG4gIC8vIOmaj+acuueCuSjmiYDosJPnlLvngrnlhbblrp7lsLHmmK/nlLsxcHjlg4/ntKDnmoTnur/vvIzmlrnms5XkuI3lho3otZjov7ApXG4gIGRyYXdEb3QoY2FudmFzLCBjb250ZXh0KSB7XG4gICAgdmFyIHB4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2FudmFzLndpZHRoKTtcbiAgICB2YXIgcHkgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjYW52YXMuaGVpZ2h0KTtcbiAgICBjb250ZXh0Lm1vdmVUbyhweCwgcHkpO1xuICAgIGNvbnRleHQubGluZVRvKHB4ICsgMSwgcHkgKyAxKTtcbiAgICBjb250ZXh0LmxpbmVXaWR0aCA9IDAuMjtcbiAgICBjb250ZXh0LnN0cm9rZSgpO1xuICB9XG4gIC8vIOe7mOWItuWbvueJh1xuICBjb252ZXJ0Q2FudmFzVG9JbWFnZShjYW52YXMpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInZlcmlmeUNhbnZhc1wiKS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgdGhpcy5pbWFnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY29kZV9pbWdcIik7XG4gICAgdGhpcy5pbWFnZS5zcmMgPSBjYW52YXMudG9EYXRhVVJMKFwiaW1hZ2UvcG5nXCIpO1xuICAgIHJldHVybiB0aGlzLmltYWdlO1xuICB9XG4gIC8vIOeZu+W9lVxuICAvLyAgIOmqjOivgeeggVxuICB2Q29kZTogc3RyaW5nO1xuICAvLyDnmbvlvZXpqozor4HooajljZXlr7nosaFcbiAgdmFsaWRhdGVGb3JtITogRm9ybUdyb3VwO1xuICAvLyDluJDlj7flr4bnoIHooajljZXlr7nosaFcbiAgdmFsaWRhdGVVc2VyRm9ybSE6IEZvcm1Hcm91cDtcbiAgLy8g5omL5py66aqM6K+B56CB6KGo5Y2VXG4gIHZhbGlkYXRlU01TRm9ybSE6Rm9ybUdyb3VwO1xuICBzbXNDb2RlRXJyb3JUaXA6c3RyaW5nO1xuICAvLyDnlKjmiLflkI3plJnor6/mj5DnpLpcbiAgdXNlckVycm9yVGlwOiBhbnk7XG4gIC8vIOWvhueggemUmeivr+aPkOekulxuICBwYXNzd29yZEVycm9yVGlwOiBhbnk7XG4gIGZvcmdldHBob25lQ29kZXNFcnJvclRpcDogYW55O1xuICBwaG9uZUVycm9yVGlwOiBhbnk7XG4gIGNvZGVWZXJpZmllZDpib29sZWFuID0gZmFsc2U7XG4gIGNvZGVFcnJvclRpcDogYW55XG4gIC8vIOeUqOaIt+WQje+8iOaJi+acuuWPt+egge+8iVxuICB1c2VybmFtZTogYW55O1xuICAvLyAgIGZvcmdldHVzZXJuYW1lXG4gIGZvcmdldHVzZXJuYW1lOiBzdHJpbmc7XG4gIGZvcmdldFBhc3N3b3JkOiBzdHJpbmc7XG4gIGZvcmdldENvbmZpcm1wYXNzd29yZDogc3RyaW5nO1xuICBmb3JnZXJwaG9uZUNvZGU6IHN0cmluZztcbiAgc21zQ29kZTpzdHJpbmdcbiAgLy8g5a+G56CBXG4gIHBob25lQ29kZTogYW55O1xuICAvLyBjb2RlOiAnNjdkZSdcbiAgLy/miYDmnInlgJnpgInnu4TmiJDpqozor4HnoIHnmoTlrZfnrKbvvIzlvZPnhLbkuZ/lj6/ku6XnlKjkuK3mlofnmoRcbiAgLy8g5qOA5rWL5piv5ZCm5Li65a2m5qCh5a2m55SfXG5cbiAgLy8gLy/nu5HlrprlrabnsY3pqozor4HooajljZXlr7nosaFcbiAgLy8gcHJvZmlsZUZvcm0hOiBGb3JtR3JvdXA7XG4gIC8vIC8vIOWnk+WQjemUmeivr+aPkOekulxuICAvLyBuYW1lRXJyb3JUaXA6IGFueTtcbiAgLy8gLy8g6Lqr5Lu96K+B5Y+356CB6ZSZ6K+v5o+Q56S6XG4gIC8vIGlkY2FyZEVycm9yVGlwOiBhbnk7XG5cbiAgLy8g5rOo5YaMXG4gIHJlZ2lzdEZvcm0hOiBGb3JtR3JvdXA7XG4gIC8vIOW/mOiusOWvhueggVxuICBmb3JnZXRGb3JtITogRm9ybUdyb3VwO1xuICAvLyDms6jlhozlp5PlkI3plJnor6/mj5DnpLpcbiAgcmVnaXN0TmFtZUVycm9yVGlwOiBhbnk7XG4gIC8vIOWvhueggemUmeivr+aPkOekulxuICByZWdpc3RJZGNhcmRFcnJvclRpcDogYW55O1xuICAvLyDms6jlhozlp5PlkI1cbiAgcmVnaXN0TmFtZTogYW55O1xuICBwaG9uZUNvZGVzOiBhbnk7XG4gIHJlZ2lzdFBob25lOiBhbnk7XG4gIC8vIOazqOWGjOi6q+S7veivgeWPt+eggVxuICByZWdpc3RJZGNhcmQ6IGFueTtcbiAgcGFzc3dvcmRWaXNpYmxlID0gZmFsc2U7XG4gIHBhc3N3b3JkVmlzaWJsZTIgPSBmYWxzZTtcbiAgcGFzc3dvcmRWaXNpYmxlMyA9IGZhbHNlO1xuICAvLyDmmK/lkKbmnInlpJrkuKrlsYLmrKFcbiAgaXNlZHVjYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8g5bGC5qyhXG4gIHNlbGVjdEVkdWNhdGlvbjogYW55O1xuICByZWRpcmVjdFVybDogYW55ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJyZWRpcmVjdFVybFwiKTtcblxuICAvLyDmiYvmnLrpqozor4HnoIFcblxuICBpc1NlbmRlZDpib29sZWFuID0gZmFsc2U7XG4gIGlzU2VuZGluZzpib29sZWFuID0gZmFsc2U7XG4gIHNtc1RpbWVDb3VudDogbnVtYmVyID0gNjA7XG4gIHNlbmRTTVNDb2RlKCl7XG4gICAgaWYoIXRoaXMuY29kZVZlcmlmaWVkKXtcbiAgICAgIHRoaXMubWVzc2FnZS5jcmVhdGUoXCJlcnJvclwiLCBcIuivt+WFiOaguOWvuemqjOivgeeggVwiKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgbGV0IG1vYmlsZSA9IHRoaXMudmFsaWRhdGVTTVNGb3JtLnZhbHVlPy5tb2JpbGU7XG4gICAgY29uc29sZS5sb2codGhpcy52YWxpZGF0ZVNNU0Zvcm0udmFsdWUpXG4gICAgaWYobW9iaWxlKXtcbiAgICAgIGxldCBhcGlnVVJMID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJOT1ZBX0FQSUdfU0VSVkVSXCIpXG5hcGlnVVJMID0gZGVjb2RlVVJJQ29tcG9uZW50KGF0b2IoYXBpZ1VSTCkpO1xubGV0IHVybCA9IGFwaWdVUkwrXCJtZXNzYWdlXCJcbiAgICAgIHRoaXMuaHR0cC5wb3N0KHVybCwgeyBjb21wYW55OiB0aGlzLmNvbXBhbnlJZCwgbW9iaWxlOiBtb2JpbGUsIGFjdGlvbjogJ2xvZ2luJyB9KS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuY291bnREb3duU01TKClcbiAgICAgICAgdGhpcy5tZXNzYWdlLmluZm8oYOW3suWPkemAge+8jOivt+afpeaUtumqjOivgeeggWApO1xuICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICB0aGlzLm1lc3NhZ2UuZXJyb3IoZXJyb3I/LmVycm9yPy5tZXNzfHxg57O757uf57mB5b+Z5Lit77yM6K+356iN5ZCO6YeN6K+VYCk7XG4gICAgICB9KVxuICAgIH1lbHNle1xuICAgICAgdGhpcy5tZXNzYWdlLmVycm9yKFwi6K+35q2j56Gu6L6T5YWl5omL5py65Y+3XCIpXG4gICAgfVxuICB9XG4gIGNvdW50RG93blNNUygpe1xuXG4gICAgdGhpcy5pc1NlbmRlZCA9IHRydWU7XG4gICAgdGhpcy5pc1NlbmRpbmcgPSB0cnVlO1xuICAgIHRoaXMuc21zVGltZUNvdW50ID0gNjA7XG4gICAgbGV0IGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCk9PntcbiAgICAgIHRoaXMuc21zVGltZUNvdW50IC0tXG4gICAgfSwxMDAwKVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICAgIHRoaXMuaXNTZW5kaW5nID0gZmFsc2U7XG4gICAgfSwgNjAqMTAwMCk7XG4gIH1cbiAgLy8g54K55Ye755m75b2V5oyJ6ZKuXG4gIHN1Ym1pdEZvcm1Nb2JpbGVTTVModmFsdWU6IHsgbW9iaWxlOiBzdHJpbmc7IHNtc0NvZGU6IHN0cmluZzsgY2hlY2tDb2RlOiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIC8vIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFwidXNlclwiKVxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMudmFsaWRhdGVTTVNGb3JtLmNvbnRyb2xzKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlU01TRm9ybS5jb250cm9sc1trZXldLm1hcmtBc0RpcnR5KCk7XG4gICAgICB0aGlzLnZhbGlkYXRlU01TRm9ybS5jb250cm9sc1trZXldLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2codmFsdWUpXG4gICAgdGhpcy51c2VybmFtZSA9IHZhbHVlLm1vYmlsZTtcbiAgICB0aGlzLnNtc0NvZGUgPSB2YWx1ZS5zbXNDb2RlO1xuICAgIGNvbnNvbGUubG9nKFwic21zbG9naW5cIilcbiAgICAvLyByZXR1cm5cbiAgICB0aGlzLmxvZ2luU01TKCk7XG4gIH1cbiAgLy8g54K55Ye755m75b2V5oyJ6ZKuXG4gIHN1Ym1pdEZvcm1Nb2JpbGVQYXNzd29yZCh2YWx1ZTogeyBtb2JpbGU6IHN0cmluZzsgdXNlcm5hbWU/OnN0cmluZzsgcGFzc3dvcmQ6IHN0cmluZzsgY2hlY2tDb2RlOiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIC8vIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFwidXNlclwiKVxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMudmFsaWRhdGVGb3JtLmNvbnRyb2xzKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlRm9ybS5jb250cm9sc1trZXldLm1hcmtBc0RpcnR5KCk7XG4gICAgICB0aGlzLnZhbGlkYXRlRm9ybS5jb250cm9sc1trZXldLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9XG4gICAgdGhpcy51c2VybmFtZSA9IHZhbHVlLm1vYmlsZSB8fCB2YWx1ZS51c2VybmFtZTtcbiAgICB0aGlzLnBhc3N3b3JkID0gdmFsdWUucGFzc3dvcmQ7XG4gICAgbGV0IGNoZWNrQ29kZSA9IHZhbHVlLmNoZWNrQ29kZTtcbiAgICBsZXQgYyA9IHRoaXMuY29kZS50b0xvd2VyQ2FzZSgpXG4gICAgbGV0IHZjID0gY2hlY2tDb2RlLnRvTG93ZXJDYXNlKClcbiAgICBjb25zb2xlLmxvZyhjLCB2Yyk7XG5cbiAgICBpZiAoYyAhPSB2Yykge1xuICAgICAgY29uc29sZS5sb2coYywgdmMpO1xuXG4gICAgICB0aGlzLm1lc3NhZ2UuY3JlYXRlKFwiZXJyb3JcIiwgXCLpqozor4HnoIHplJnor69cIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9naW5Nb2JpbGVQYXNzd29yZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOeCueWHu+eZu+W9leaMiemSrlxuICBzdWJtaXRGb3JtVXNlclBhc3N3b3JkKHZhbHVlOiB7IG1vYmlsZTogc3RyaW5nOyB1c2VybmFtZT86c3RyaW5nOyBwYXNzd29yZDogc3RyaW5nOyBjaGVja0NvZGU6IHN0cmluZyB9KTogdm9pZCB7XG4gICAgLy8gbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJ1c2VyXCIpXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy52YWxpZGF0ZUZvcm0uY29udHJvbHMpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVGb3JtLmNvbnRyb2xzW2tleV0ubWFya0FzRGlydHkoKTtcbiAgICAgIHRoaXMudmFsaWRhdGVGb3JtLmNvbnRyb2xzW2tleV0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIH1cbiAgICB0aGlzLnVzZXJuYW1lID0gdmFsdWUubW9iaWxlIHx8IHZhbHVlLnVzZXJuYW1lO1xuICAgIHRoaXMucGFzc3dvcmQgPSB2YWx1ZS5wYXNzd29yZDtcbiAgICBsZXQgY2hlY2tDb2RlID0gdmFsdWUuY2hlY2tDb2RlO1xuICAgIGxldCBjID0gdGhpcy5jb2RlLnRvTG93ZXJDYXNlKClcbiAgICBsZXQgdmMgPSBjaGVja0NvZGUudG9Mb3dlckNhc2UoKVxuICAgIGNvbnNvbGUubG9nKGMsIHZjKTtcblxuICAgIGlmIChjICE9IHZjKSB7XG4gICAgICBjb25zb2xlLmxvZyhjLCB2Yyk7XG5cbiAgICAgIHRoaXMubWVzc2FnZS5jcmVhdGUoXCJlcnJvclwiLCBcIumqjOivgeeggemUmeivr1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hdXRoU2VydlxuICAgICAgLmxvZ2luKHRoaXMudXNlcm5hbWUsIHRoaXMucGFzc3dvcmQpXG4gICAgICAudGhlbihhc3luYyBkYXRhID0+IHtcbiAgICAgIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycilcbiAgICAgICAgdGhpcy5tZXNzYWdlLmNyZWF0ZShcImVycm9yXCIsIFwi6ZSZ6K+v55qE55So5oi35ZCN5oiW5a+G56CBXCIpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8g54K55Ye76YeN572u5a+G56CBXG4gIGFzeW5jIGZvcmdldEZvcm1GdW4odmFsdWU6IHsgZm9yZ2V0dXNlcm5hbWU6IHN0cmluZzsgZm9yZ2V0UGFzc3dvcmQ6IHN0cmluZzsgZm9yZ2V0Q29uZmlybXBhc3N3b3JkOiBzdHJpbmc7IGZvcmdlcnBob25lQ29kZTogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmZvcmdldEZvcm0uY29udHJvbHMpIHtcbiAgICAgIHRoaXMuZm9yZ2V0Rm9ybS5jb250cm9sc1trZXldLm1hcmtBc0RpcnR5KCk7XG4gICAgICB0aGlzLmZvcmdldEZvcm0uY29udHJvbHNba2V5XS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKHZhbHVlLmZvcmdldHVzZXJuYW1lLCB2YWx1ZS5mb3JnZXRQYXNzd29yZCwgdmFsdWUuZm9yZ2V0Q29uZmlybXBhc3N3b3JkKVxuICAgIGlmICh2YWx1ZS5mb3JnZXRQYXNzd29yZCAhPSB2YWx1ZS5mb3JnZXRDb25maXJtcGFzc3dvcmQpIHtcbiAgICAgIHRoaXMubWVzc2FnZS5jcmVhdGUoXCJlcnJvclwiLCBcIuS4pOasoeWvhueggeS4jeS4gOiHtFwiKTtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoIXZhbHVlLmZvcmdlcnBob25lQ29kZSkge1xuICAgICAgdGhpcy5tZXNzYWdlLmNyZWF0ZShcImVycm9yXCIsIFwi6K+36L6T5YWl6aqM6K+B56CBXCIpO1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGxldCBob3N0ID0gKFBhcnNlIGFzIGFueSkuc2VydmVyVVJMPy5zcGxpdChcInBhcnNlXCIpPy5bMF0gfHwgXCJodHRwczovL3NlcnZlci5mbW9kZS5jbi9cIlxuXG4gICAgbGV0IHVybCA9IGhvc3QgKyBcImFwaS9hdXRoL3Jlc2V0X3Bhc3N3b3JkXCJcbiAgICB0aGlzLmh0dHAucG9zdCh1cmwsIHsgY29tcGFueTogdGhpcy5jb21wYW55SWQsIG1vYmlsZTogdmFsdWUuZm9yZ2V0dXNlcm5hbWUsIGNvZGU6IHZhbHVlLmZvcmdlcnBob25lQ29kZSwgcGFzc3dvcmQ6IHZhbHVlLmZvcmdldENvbmZpcm1wYXNzd29yZCB9KS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICBpZiAocmVzLmNvZGUgPT0gMjAwKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZS5jcmVhdGUoXCJzdWNjZXNzXCIsIHJlcy5tc2cpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnbG9naW4nXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1lc3NhZ2UuY3JlYXRlKFwiZXJyb3JcIiwgXCLpqozor4HnoIHplJnor69cIik7XG4gICAgICB9XG4gICAgfSwgZXJyb3IgPT4ge1xuICAgICAgY29uc29sZS5sb2coZXJyb3IuZXJyb3IpXG4gICAgICB0aGlzLm1lc3NhZ2UuY3JlYXRlKCdlcnJvcicsIGVycm9yLmVycm9yLm1lc3MpO1xuICAgIH0pXG4gIH1cbiAgLy8g54K55Ye75rOo5YaM5oyJ6ZKuXG4gIHJlZ3Bhc3N3b3JkOiBhbnk7XG4gIGNvbmZpcm1QYXNzd29yZDogYW55O1xuICBhc3luYyByZWdpc3RTdWJtaXRGb3JtKHZhbHVlOiB7IHJlZ2lzdE5hbWU6IHN0cmluZzsgcmVnaXN0SWRjYXJkOiBzdHJpbmcsIHJlZ3Bhc3N3b3JkOiBzdHJpbmc7IGNvbmZpcm1QYXNzd29yZDogc3RyaW5nOyBwaG9uZUNvZGU6IHN0cmluZzsgcmVnaXN0UGhvbmU6IHN0cmluZyB9KSB7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnJlZ2lzdEZvcm0uY29udHJvbHMpIHtcbiAgICAgIHRoaXMucmVnaXN0Rm9ybS5jb250cm9sc1trZXldLm1hcmtBc0RpcnR5KCk7XG4gICAgICB0aGlzLnJlZ2lzdEZvcm0uY29udHJvbHNba2V5XS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgfVxuICAgIHRoaXMucmVnaXN0TmFtZSA9IHZhbHVlLnJlZ2lzdE5hbWU7XG4gICAgdGhpcy5yZWdpc3RJZGNhcmQgPSB2YWx1ZS5yZWdpc3RJZGNhcmQ7XG4gICAgdGhpcy5yZWdpc3RQaG9uZSA9IHZhbHVlLnJlZ2lzdFBob25lO1xuICAgIHRoaXMucGhvbmVDb2RlID0gdmFsdWUucGhvbmVDb2RlO1xuICAgIHRoaXMucmVncGFzc3dvcmQgPSB2YWx1ZS5yZWdwYXNzd29yZDtcbiAgICB0aGlzLmNvbmZpcm1QYXNzd29yZCA9IHZhbHVlLmNvbmZpcm1QYXNzd29yZDtcbiAgICBsZXQgY2hlY2tJbmZvOiBhbnkgPSBhd2FpdCB0aGlzLnZlcmlmeUNvZGUodGhpcy5yZWdpc3RQaG9uZSwgdGhpcy5waG9uZUNvZGUpXG4gICAgaWYgKGNoZWNrSW5mbyAmJiBjaGVja0luZm8uY29kZSAhPSAyMDApIHtcbiAgICAgIHRoaXMubWVzc2FnZS5jcmVhdGUoXCJlcnJvclwiLCBjaGVja0luZm8ubWVzcyk7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy5xdWVyeVVzZXIoKTtcbiAgfVxuICBcbiAgZ2V0U2VsZWN0RWR1Y2F0aW9uKCkge1xuICAgIHRoaXMubG9naW5Nb2JpbGVQYXNzd29yZCgpXG4gICAgdGhpcy5pc2VkdWNhdGlvbiA9IGZhbHNlO1xuICB9XG4gIGxvZ2luU01TKCl7XG4gICAgLy8g6aqM6K+B56CB55m75b2VXG4gICAgbGV0IGhvc3QgPSAoUGFyc2UgYXMgYW55KS5zZXJ2ZXJVUkw/LnNwbGl0KFwicGFyc2VcIik/LlswXSB8fCBcImh0dHBzOi8vc2VydmVyLmZtb2RlLmNuL1wiXG5cbiAgICBsZXQgdXJsID0gaG9zdCArIGBhcGkvYXV0aC9tb2JpbGU/Y29tcGFueT0ke3RoaXMuY29tcGFueUlkfSZtb2JpbGU9JHt0aGlzLnVzZXJuYW1lfSZjb2RlPSR7dGhpcy5zbXNDb2RlfWBcbiAgICB0aGlzLmh0dHAuZ2V0KHVybCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgY29uc29sZS5sb2cocmVzKTtcbiAgICAgIGlmIChyZXMuY29kZSA9PSAyMDApIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlLmNyZWF0ZShcInN1Y2Nlc3NcIiwgXCLnmbvlvZXmiJDlip9cIik7XG4gICAgICAgIGxldCB0b2tlbiA9IHJlcy5kYXRhLnRva2VuO1xuICAgICAgICBQYXJzZS5Vc2VyLmJlY29tZSh0b2tlbikudGhlbih1c2VyPT57XG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2RlY29kZVVSSUNvbXBvbmVudCh0aGlzLnJvb3RQYWdlKV0pXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1lc3NhZ2UuY3JlYXRlKFwiZXJyb3JcIiwgXCLpqozor4HnoIHplJnor69cIik7XG4gICAgICB9XG4gICAgfSwgZXJyb3IgPT4ge1xuICAgICAgY29uc29sZS5sb2coZXJyb3IuZXJyb3IpXG4gICAgICB0aGlzLm1lc3NhZ2UuY3JlYXRlKCdlcnJvcicsIGVycm9yLmVycm9yLm1lc3MpO1xuICAgIH0pXG4gIH1cbiAgYXN5bmMgbG9naW5Nb2JpbGVQYXNzd29yZCgpIHtcbiAgICBsZXQgcHJvZmlsZTogYW55O1xuICAgIGxldCBlZHVjYXRpb246IGFueTtcbiAgICBsZXQgY3VycmVudFVzZXI6IGFueTtcbiAgICBsZXQgdXNlcm5hbWUgPSBhd2FpdCB0aGlzLmdldE1vYmlsZVVzZXIodGhpcy51c2VybmFtZSlcbiAgICBpZighdXNlcm5hbWUpe1xuICAgICAgdGhpcy5tZXNzYWdlLmNyZWF0ZShcImVycm9yXCIsIFwi55So5oi35LiN5a2Y5Zyo77yM6K+35bCd6K+V5YW25LuW55m75b2V5pa55byPXCIpO1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMuYXV0aFNlcnZcbiAgICAgIC5sb2dpbih1c2VybmFtZSwgdGhpcy5wYXNzd29yZClcbiAgICAgIC50aGVuKGFzeW5jIGRhdGEgPT4ge1xuICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coZXJyKVxuICAgICAgICB0aGlzLm1lc3NhZ2UuY3JlYXRlKFwiZXJyb3JcIiwgXCLplJnor6/nmoTnlKjmiLflkI3miJblr4bnoIFcIik7XG4gICAgICB9KTtcbiAgfVxuXG4gIGxvYWRpbmc6IGJvb2xlYW4gPSB0cnVlXG4gIGxvYWRpbmcyOiBib29sZWFuIFxuICBQcm9maWxlOiBhbnlcbiAgTGVzc29uOiBhbnkgPSBbXTtcbiAgbXlEYXRlID0gbmV3IERhdGUoKTtcblxuIFxuICAvLyDmn6Xor6Lor6XlrabnlJ/kv6Hmga/mmK/lkKblrZjlnKhcbiAgaXNWaXNpYmxlOiBib29sZWFuID0gZmFsc2VcbiAgcHJvZmlsZTogYW55XG4gIGFzeW5jIHF1ZXJ5VXNlcigpIHtcbiAgICAgICAgLy8g5p+l5om+6L+Z5Liq55So5oi35a2Y5LiN5a2Y5Zyo77yM5a2Y5Zyo55u05o6l57uR5a6a55m75b2V77yM5LiN5a2Y5Zyo5rOo5YaMXG4gICAgICAgIGxldCBxdWVyeVVzZXIgPSBuZXcgUGFyc2UuUXVlcnkoJ19Vc2VyJylcbiAgICAgICAgcXVlcnlVc2VyLmNvbnRhaW5zKFwidXNlcm5hbWVcIiwgdGhpcy5yZWdpc3RQaG9uZSk7XG4gICAgICAgIHF1ZXJ5VXNlci5lcXVhbFRvKFwiY29tcGFueVwiLCB0aGlzLmNvbXBhbnlJZClcbiAgICAgICAgbGV0IHVzZXIgPSBhd2FpdCBxdWVyeVVzZXIuZmlyc3QoKVxuICAgICAgICBpZih1c2VyPy5pZCl7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlLmluZm8oYOivpei0puaIt+W3sua/gOa0u++8jOS9v+eUqOaJi+acuuWPt+WvhueggeebtOaOpeeZu+W9lWApO1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIC8vIOaguOmqjOaJi+acuuWPt1xuICAgXG4gICAgICAgIFBhcnNlLlVzZXIuc2lnblVwKFxuICAgICAgICAgIHRoaXMuY29tcGFueUlkK1wiLVwiICsgdGhpcy5yZWdpc3RQaG9uZSxcbiAgICAgICAgICB0aGlzLnJlZ3Bhc3N3b3JkLFxuICAgICAgICAgIFwiXCJcbiAgICAgICAgKS50aGVuKGFzeW5jIHJlcyA9PiB7XG4gICAgICAgICAgaWYgKHJlcy5pZCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2cocmVzKVxuICAgICAgICAgICAgcmVzLnNldChcImNvbXBhbnlcIiwge1xuICAgICAgICAgICAgICBfX3R5cGU6IFwiUG9pbnRlclwiLFxuICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiQ29tcGFueVwiLFxuICAgICAgICAgICAgICBvYmplY3RJZDogdGhpcy5jb21wYW55SWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzLnNldChcIm1vYmlsZVwiLCB0aGlzLnJlZ2lzdFBob25lKTtcbiAgICAgICAgICAgIHJlcy5zZXQoXCJ0eXBlXCIsXCJ1c2VyXCIpO1xuICAgICAgICAgICAgcmVzLnNhdmUoKTtcbiAgICAgICAgICAgIC8vIOW8gOmAmui0puWPt+i+heWKqeWhq+WGmei0puWPt+WvhueggVxuICAgICAgICAgICAgdGhpcy51c2VybmFtZSA9IHRoaXMucmVnaXN0UGhvbmU7XG4gICAgICAgICAgICB0aGlzLnBhc3N3b3JkID0gdGhpcy5yZWdwYXNzd29yZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICB9XG4gIHR5cGU6IHN0cmluZyA9ICdsb2dpbidcblxuICBtb2JpbGVVc2VyTWFwID0ge31cbiAgYXN5bmMgZ2V0TW9iaWxlVXNlcihtb2JpbGUpe1xuICAgIGlmKHRoaXMubW9iaWxlVXNlck1hcFttb2JpbGVdKSByZXR1cm4gdGhpcy5tb2JpbGVVc2VyTWFwW21vYmlsZV1cbiAgICBsZXQgcmVzdWx0OmFueSA9IGF3YWl0IHRoaXMubm92YUNsb3VkLmFwaShcIi9hdXRoL2dldHVzZXJuYW1lXCIse1xuICAgICAgY29tcGFueTp0aGlzLmNvbXBhbnlJZCxcbiAgICAgIG1vYmlsZTptb2JpbGVcbiAgICB9KVxuICAgIGNvbnNvbGUubG9nKHJlc3VsdClcbiAgICBpZihyZXN1bHQ/LnVzZXJuYW1lKXtcbiAgICAgIHRoaXMubW9iaWxlVXNlck1hcFttb2JpbGVdID0gcmVzdWx0Py51c2VybmFtZVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tb2JpbGVVc2VyTWFwW21vYmlsZV1cbiAgfVxuXG4gIGZvcmdldCgpIHtcbiAgICB0aGlzLnR5cGUgPSAnZm9yZ2V0J1xuICB9XG5cbiAgYmFja0xvZ2luKCkge1xuICAgIHRoaXMudHlwZSA9ICdsb2dpbidcbiAgfVxuIFxuICBoYW5kbGVDYW5jZWwoKSB7XG4gICAgdGhpcy5pc1Zpc2libGUgPSBmYWxzZVxuICB9XG4gIHBhc3N3b3JkOiBhbnk7XG4gIGhhbmRsZU9rKCkge1xuICAgIFBhcnNlLlVzZXIuc2lnblVwKFxuICAgICAgdGhpcy5yZWdpc3RQaG9uZSxcbiAgICAgIHRoaXMucmVncGFzc3dvcmQsXG4gICAgICBcIlwiXG4gICAgKS50aGVuKGFzeW5jIHJlcyA9PiB7XG4gICAgICBpZiAocmVzLmlkKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHJlcylcbiAgICAgICAgcmVzLnNldChcImNvbXBhbnlcIiwge1xuICAgICAgICAgIF9fdHlwZTogXCJQb2ludGVyXCIsXG4gICAgICAgICAgY2xhc3NOYW1lOiBcIkNvbXBhbnlcIixcbiAgICAgICAgICBvYmplY3RJZDogdGhpcy5jb21wYW55SWRcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcy5zYXZlKCk7XG4gICAgICAgIHRoaXMudXNlcm5hbWUgPSB0aGlzLnJlZ2lzdFBob25lXG4gICAgICAgIHRoaXMucGFzc3dvcmQgPSB0aGlzLnJlZ3Bhc3N3b3JkO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGlzT2tMb2FkaW5nID0gZmFsc2U7XG5cbiAgYXN5bmMgZ2V0Q29kZSgpIHtcbiAgICBpZiAodGhpcy5yZWdpc3RQaG9uZSA9PSB1bmRlZmluZWQgfHwgdGhpcy5yZWdpc3RQaG9uZS50cmltKCkgPT0gXCJcIikge1xuICAgICAgdGhpcy5tZXNzYWdlLmluZm8oYOivt+i+k+WFpeazqOWGjOaJi+acuuWPt2ApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgYSA9IC9eMVszNDU2Nzg5XVxcZHs5fSQvO1xuICAgIGlmICghdGhpcy5yZWdpc3RQaG9uZS5tYXRjaChhKSkge1xuICAgICAgdGhpcy5tZXNzYWdlLmluZm8oYOivt+i+k+WFpeato+ehrueahOaJi+acuuWPt2ApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgVXNlciA9IG5ldyBQYXJzZS5RdWVyeSgnVXNlcicpXG4gICAgVXNlci5lcXVhbFRvKCd1c2VybmFtZScsIHRoaXMucmVnaXN0UGhvbmUpXG4gICAgVXNlci5lcXVhbFRvKCdjb21wYW55JywgdGhpcy5jb21wYW55SWQpXG4gICAgbGV0IHVzZXIgPSBhd2FpdCBVc2VyLmZpcnN0KClcbiAgICBpZiAodXNlciAmJiB1c2VyLmlkKSB7XG4gICAgICB0aGlzLm1lc3NhZ2UuaW5mbyhg6K+l5omL5py65Y+35bey5rOo5YaM77yM6K+35L2/55So6LSm5Y+35a+G56CB55m75b2VYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIOacrOWcsOa1i+ivlVxuICAgIGxldCBhcGlnVVJMID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJOT1ZBX0FQSUdfU0VSVkVSXCIpXG5hcGlnVVJMID0gZGVjb2RlVVJJQ29tcG9uZW50KGF0b2IoYXBpZ1VSTCkpO1xubGV0IHVybCA9IGFwaWdVUkwrXCJtZXNzYWdlXCJcbiAgICB0aGlzLmh0dHAucG9zdCh1cmwsIHsgY29tcGFueTogdGhpcy5jb21wYW55SWQsIG1vYmlsZTogdGhpcy5yZWdpc3RQaG9uZSwgYWN0aW9uOiAncmVnaXN0JyB9KS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICB0aGlzLnZDb2RlID0gcmVzLmRhdGEuY29kZVxuICAgICAgdGhpcy5jb3VudERvd25GdW4oKVxuICAgIH0sIGVycm9yID0+IHtcbiAgICAgIHRoaXMubWVzc2FnZS5pbmZvKGDns7vnu5/nuYHlv5nkuK3vvIzor7fnqI3lkI7ph43or5VgKTtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKVxuICAgIH0pXG4gIH1cblxuICBhc3luYyBnZXRDb2RlMigpIHtcbiAgICBpZiAodGhpcy5mb3JnZXR1c2VybmFtZSA9PSB1bmRlZmluZWQgfHwgdGhpcy5mb3JnZXR1c2VybmFtZS50cmltKCkgPT0gXCJcIikge1xuICAgICAgdGhpcy5tZXNzYWdlLmluZm8oYOivt+i+k+WFpei0puWPt2ApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgYSA9IC9eMVszNDU2Nzg5XVxcZHs5fSQvO1xuICAgIGlmICghdGhpcy5mb3JnZXR1c2VybmFtZS5tYXRjaChhKSkge1xuICAgICAgdGhpcy5tZXNzYWdlLmluZm8oYOivt+i+k+WFpeato+ehrueahOaJi+acuuWPt2ApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyh0aGlzLmZvcmdldHVzZXJuYW1lKVxuICAgIGxldCBVc2VyID0gbmV3IFBhcnNlLlF1ZXJ5KCdVc2VyJylcbiAgICBVc2VyLmVxdWFsVG8oJ3VzZXJuYW1lJyx0aGlzLmNvbXBhbnlJZCArIFwiLVwiICsgdGhpcy5mb3JnZXR1c2VybmFtZSlcbiAgICBVc2VyLmVxdWFsVG8oJ2NvbXBhbnknLCB0aGlzLmNvbXBhbnlJZClcbiAgICBsZXQgdXNlciA9IGF3YWl0IFVzZXIuZmlyc3QoKVxuICAgIGlmICghdXNlcikge1xuICAgICAgdGhpcy5tZXNzYWdlLmluZm8oYOi0puWPt+S4jeWtmOWcqGApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgYXBpZ1VSTCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiTk9WQV9BUElHX1NFUlZFUlwiKVxuYXBpZ1VSTCA9IGRlY29kZVVSSUNvbXBvbmVudChhdG9iKGFwaWdVUkwpKTtcbmxldCB1cmwgPSBhcGlnVVJMK1wibWVzc2FnZVwiXG4gICAgdGhpcy5odHRwLnBvc3QodXJsLCB7IGNvbXBhbnk6IHRoaXMuY29tcGFueUlkLCBtb2JpbGU6IHRoaXMuZm9yZ2V0dXNlcm5hbWUsIGFjdGlvbjogJ3Jlc2V0UGFzc3dvcmQnIH0pLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKHJlcylcbiAgICAgIHRoaXMudkNvZGUgPSByZXMuZGF0YS5jb2RlXG4gICAgICB0aGlzLmNvdW50RG93bkZ1bigpXG4gICAgfSwgZXJyb3IgPT4ge1xuICAgICAgdGhpcy5tZXNzYWdlLmluZm8oYOezu+e7n+e5geW/meS4re+8jOivt+eojeWQjumHjeivlWApO1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIHZlcmlmeUNvZGUobW9iaWxlLCBjb2RlKSB7XG4gICAgbGV0IGFwaWdVUkwgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIk5PVkFfQVBJR19TRVJWRVJcIilcbmFwaWdVUkwgPSBkZWNvZGVVUklDb21wb25lbnQoYXRvYihhcGlnVVJMKSk7XG5sZXQgdXJsID0gYXBpZ1VSTCtcInZlcmlmeUNvZGVcIlxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmh0dHAucG9zdCh1cmwsIHsgbW9iaWxlOiBtb2JpbGUsIGNvZGU6IGNvZGUgfSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICByZXNvbHZlKHJlcylcbiAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpXG4gICAgICAgIHJlc29sdmUoZXJyb3IuZXJyb3IpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuXG4gIGNvdW50RG93bjogbnVtYmVyID0gNjBcbiAgaXNDb3VudERvd246IGJvb2xlYW4gPSBmYWxzZVxuICAvLyDlgJLorqHml7ZcbiAgY291bnREb3duRnVuKCkge1xuICAgIHRoaXMuaXNDb3VudERvd24gPSB0cnVlXG4gICAgaWYgKHRoaXMuY291bnREb3duID09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBsZXQgdGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB0aGlzLmNvdW50RG93biA9IHRoaXMuY291bnREb3duIC0gMVxuICAgICAgaWYgKHRoaXMuY291bnREb3duID09IDApIHtcbiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcilcbiAgICAgICAgdGhpcy5jb3VudERvd24gPSA2MFxuICAgICAgICB0aGlzLmlzQ291bnREb3duID0gZmFsc2VcbiAgICAgIH1cbiAgICB9LCAxMDAwKVxuICB9XG5cbiAgLy8g6aG16Z2i5pi+56S657Sg5p2QXG4gIG1vYmlsZUxvZ2luOmJvb2xlYW4gPSBmYWxzZVxuICByb290UGFnZTpzdHJpbmdcbiAgbG9nbzpzdHJpbmcgPSAnaHR0cHM6Ly93d3cuZm1vZGUuY24vaW1hZ2VzL2V3bTEucG5nJztcbiAgcXJjb2RlOnN0cmluZyA9ICdodHRwczovL3d3dy5mbW9kZS5jbi9pbWFnZXMvbG9nb19tYWluLnBuZyc7XG4gIC8vIOWFrOWPuOW4kOWPt+Wll+aAu+WQjuWPsOeZu+W9lVxuICBjb21wYW55OlBhcnNlLk9iamVjdFxuICBjb21wYW55SWQ6c3RyaW5nXG4gIC8vIOeuoeeQhuerr+WumuWItkFQUOWQjuWPsOeZu+W9lVxuICBhcHA6UGFyc2UuT2JqZWN0XG4gIGFwcElkOnN0cmluZ1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgYXV0aFNlcnY6IEF1dGhTZXJ2aWNlLFxuICAgIHByaXZhdGUgbm92YUNsb3VkOiBOb3ZhQ2xvdWRTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgbWVzc2FnZTogTnpNZXNzYWdlU2VydmljZSxcbiAgICBwdWJsaWMgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSByb3V0ZTpBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnRcbiAgKSB7XG4gICAgdGhpcy5pbml0TG9naW5Gb3JtKClcblxuICAgIHRoaXMucm91dGUucGFyYW1NYXAuc3Vic2NyaWJlKGFzeW5jIHBhcmFtcz0+e1xuICAgICAgY29uc29sZS5sb2cocGFyYW1zKVxuICBcbiAgICAgIHRoaXMuYXBwSWQgPSBwYXJhbXMuZ2V0KFwiYXBwSWRcIik7XG4gICAgICBpZighYXdhaXQgdGhpcy5pbml0QXBwQ29uZmlnKCkpe1xuICAgICAgICB0aGlzLmNvbXBhbnlJZCA9IHBhcmFtcy5nZXQoXCJjb21wYW55SWRcIik7XG4gICAgICAgIGlmKCF0aGlzLmNvbXBhbnlJZCl7XG4gICAgICAgICAgdGhpcy5jb21wYW55SWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImNvbXBhbnlcIikgfHwgXCJRMERyeU5ZQThnXCJcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmluaXRDb21wYW55Q29uZmlnKClcbiAgXG4gICAgICB9XG4gICAgfSlcblxuICB9XG4gIGFzeW5jIGluaXRDb21wYW55Q29uZmlnKCl7XG4gICAgaWYoIXRoaXMuY29tcGFueUlkKSByZXR1cm5cbiAgICBsZXQgcXVlcnkgPSBuZXcgUGFyc2UuUXVlcnkoXCJDb21wYW55XCIpXG4gICAgdGhpcy5jb21wYW55ID0gYXdhaXQgcXVlcnkuZ2V0KHRoaXMuY29tcGFueUlkKTtcbiAgICAvLyDorr7nva7pobXpnaJcbiAgICB0aGlzLmxvZ28gPSB0aGlzLmNvbXBhbnk/LmdldChcImxvZ29cIikgfHwgdGhpcy5sb2dvO1xuICAgIHRoaXMucXJjb2RlID0gdGhpcy5jb21wYW55Py5nZXQoXCJxcmNvZGVcIikgfHwgdGhpcy5xcmNvZGU7XG4gICAgdGhpcy5tb2JpbGVMb2dpbiA9IHRoaXMuY29tcGFueT8uZ2V0KCdqcHVzaCcpPy5hcHBrZXkgfHwgZmFsc2VcbiAgICB0aGlzLnJvb3RQYWdlID0gdGhpcy5jb21wYW55Py5nZXQoJ3Jvb3RQYWdlJylcbiAgfVxuXG4gIGFzeW5jIGluaXRBcHBDb25maWcoKXtcbiAgICBpZighdGhpcy5hcHBJZCkgcmV0dXJuIGZhbHNlXG4gICAgbGV0IHF1ZXJ5ID0gbmV3IFBhcnNlLlF1ZXJ5KFwiQXBwXCIpO1xuICAgIHF1ZXJ5LmluY2x1ZGUoXCJjb21wYW55XCIpO1xuICAgIHRoaXMuYXBwID0gYXdhaXQgcXVlcnkuZ2V0KHRoaXMuYXBwSWQpO1xuICAgIC8vIOiuvue9rumhtemdolxuICAgIGNvbnNvbGUubG9nKHRoaXMuYXBwKVxuICAgIHRoaXMubG9nbyA9IHRoaXMuYXBwPy5nZXQoXCJsb2dvXCIpIHx8IHRoaXMubG9nbztcbiAgICB0aGlzLnFyY29kZSA9IHRoaXMuYXBwPy5nZXQoXCJxcmNvZGVcIikgfHwgdGhpcy5xcmNvZGU7XG4gICAgdGhpcy5tb2JpbGVMb2dpbiA9IHRoaXMuYXBwPy5nZXQoJ2pwdXNoJyk/LmFwcGtleSB8fCBmYWxzZVxuICAgIHRoaXMuY29tcGFueUlkID0gdGhpcy5hcHA/LmdldChcImNvbXBhbnlcIikuaWQ7XG4gICAgdGhpcy5yb290UGFnZSA9IHRoaXMuYXBwPy5nZXQoJ3Jvb3RQYWdlJylcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIGluaXRMb2dpbkZvcm0oKXtcblxuICAgIHRoaXMudmFsaWRhdGVGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAvLyDliqDlhaXpqozor4HnmoTooajljZXpobkg77yaIOWIneWni+WAvOOAgSDmmK/lkKbpqozor4Eg6LCD55So55qE6aqM6K+B5pa55rOVXG4gICAgICBtb2JpbGU6IFtcIlwiLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sIFt0aGlzLnVzZXJOYW1lQXN5bmNWYWxpZGF0b3JdXSxcbiAgICAgIHBhc3N3b3JkOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdLCBbdGhpcy5wYXNzd29yZEFzeW5jVmFsaWRhdG9yXV0sXG4gICAgICAvLyBpbml0Q29kZTogW3RoaXMuY29kZSBdLFxuICAgICAgY2hlY2tDb2RlOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdLCBbdGhpcy5jb2RlQXN5bmNWYWxpZGF0b3JdXVxuICAgIH0pO1xuXG5cbiAgICB0aGlzLnZhbGlkYXRlVXNlckZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIC8vIOWKoOWFpemqjOivgeeahOihqOWNlemhuSDvvJog5Yid5aeL5YC844CBIOaYr+WQpumqjOivgSDosIPnlKjnmoTpqozor4Hmlrnms5VcbiAgICAgIHVzZXJuYW1lOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdLCBbXV0sXG4gICAgICBwYXNzd29yZDogW1wiXCIsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSwgW3RoaXMucGFzc3dvcmRBc3luY1ZhbGlkYXRvcl1dLFxuICAgICAgLy8gaW5pdENvZGU6IFt0aGlzLmNvZGUgXSxcbiAgICAgIGNoZWNrQ29kZTogW1wiXCIsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSwgW3RoaXMuY29kZUFzeW5jVmFsaWRhdG9yXV1cbiAgICB9KVxuXG4gICAgdGhpcy52YWxpZGF0ZVNNU0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIC8vIOWKoOWFpemqjOivgeeahOihqOWNlemhuSDvvJog5Yid5aeL5YC844CBIOaYr+WQpumqjOivgSDosIPnlKjnmoTpqozor4Hmlrnms5VcbiAgICAgIG1vYmlsZTogW1wiXCIsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSwgW3RoaXMudXNlck5hbWVBc3luY1ZhbGlkYXRvcl1dLFxuICAgICAgcGFzc3dvcmQ6IFtcIlwiXSxcbiAgICAgIHNtc0NvZGU6IFtcIlwiLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sIFt0aGlzLnNtc0FzeW5jVmFsaWRhdG9yXV0sXG4gICAgICAvLyBpbml0Q29kZTogW3RoaXMuY29kZSBdLFxuICAgICAgY2hlY2tDb2RlOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdLCBbdGhpcy5jb2RlQXN5bmNWYWxpZGF0b3JdXVxuICAgIH0pO1xuXG5cbiAgICB0aGlzLnJlZ2lzdEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIC8vIOWKoOWFpemqjOivgeeahOihqOWNlemhuSDvvJog5Yid5aeL5YC844CBIOaYr+WQpumqjOivgSDosIPnlKjnmoTpqozor4Hmlrnms5VcbiAgICAgIHJlZ2lzdE5hbWU6IFtcIlwiLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sIFt0aGlzLnJlZ2lzdE5hbWVBc3luY1ZhbGlkYXRvcl1dLFxuICAgICAgcmVnaXN0SWRjYXJkOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdLCBbdGhpcy5yZWdpc3RJZGNhcmRBc3luY1ZhbGlkYXRvcl1dLFxuICAgICAgcmVnaXN0UGhvbmU6IFtcIlwiLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sIFt0aGlzLnJlZ2lzdFBob25lQXN5bmNWYWxpZGF0b3JdXSxcbiAgICAgIHBob25lQ29kZTogW1wiXCIsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSwgW3RoaXMucmVnaXN0Q29kZUFzeW5jVmFsaWRhdG9yXV0sXG4gICAgICByZWdwYXNzd29yZDogW1wiXCIsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSwgW3RoaXMucmVncGFzc3dvcmRBc3luY1ZhbGlkYXRvcl1dLFxuICAgICAgY29uZmlybVBhc3N3b3JkOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdLCBbdGhpcy5jb25maXJtUGFzc3dvcmRBc3luY1ZhbGlkYXRvcl1dXG4gICAgfSk7XG4gICAgdGhpcy5mb3JnZXRGb3JtID0gdGhpcy5mYi5ncm91cCh7XG5cbiAgICAgIGZvcmdldHVzZXJuYW1lOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdLCBbdGhpcy5mb3JnZXROYW1lQXN5bmNWYWxpZGF0b3JdXSxcbiAgICAgIGZvcmdldFBhc3N3b3JkOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdLCBbdGhpcy5mb3JnZXRQYXNzd29yZEFzeW5jVmFsaWRhdG9yXV0sXG4gICAgICBmb3JnZXRDb25maXJtcGFzc3dvcmQ6IFtcIlwiLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sIFt0aGlzLmZvcmdldENvbmZpcm1QYXNzd29yZEFzeW5jVmFsaWRhdG9yXV0sXG4gICAgICBmb3JnZXJwaG9uZUNvZGU6IFtcIlwiLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sIFt0aGlzLnJlZ2lzdENvZGVBc3luY1ZhbGlkYXRvcl1dLFxuICAgIH0pXG4gIH1cblxuICAvLyDnmbvlvZUg55So5oi35ZCN77yI5omL5py65Y+356CB77yJ6aqM6K+BXG4gIHVzZXJOYW1lQXN5bmNWYWxpZGF0b3IgPSAoY29udHJvbDogRm9ybUNvbnRyb2wpID0+XG4gICAgbmV3IE9ic2VydmFibGUoKG9ic2VydmVyOiBPYnNlcnZlcjxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD4pID0+IHtcbiAgICAgIGxldCByZWcgPSAvXjFbMzQ1Njc4OV1cXGR7OX0kLztcbiAgICAgIC8vIGxldCByZWcyID0gL15cXGR7MTd9KFxcZHxYfHgpJC87XG4gICAgICBsZXQgdXNlcm5hbWUgPSBjb250cm9sLnZhbHVlO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh1c2VybmFtZSA9PSB1bmRlZmluZWQgfHwgdXNlcm5hbWUudHJpbSgpID09IFwiXCIpIHtcbiAgICAgICAgICB0aGlzLnVzZXJFcnJvclRpcCA9IFwi6K+36L6T5YWl55m75b2V6LSm5Y+3XCI7XG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IGVycm9yOiB0cnVlLCBkdXBsaWNhdGVkOiB0cnVlIH0pO1xuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdXNlcm5hbWUubWF0Y2gocmVnKSkge1xuICAgICAgICAgIHRoaXMudXNlckVycm9yVGlwID0gXCLor7fovpPlhaXmraPnoa7nmoTnmbvlvZXotKblj7dcIjtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYodXNlcm5hbWUubGVuZ3RoID4gMTEpe1xuICAgICAgICAvLyAgIGlmICghdXNlcm5hbWUubWF0Y2gocmVnMikgKSB7XG4gICAgICAgIC8vICAgICB0aGlzLnVzZXJFcnJvclRpcCA9IFwi6K+36L6T5YWl5q2j56Gu55qE55m75b2V6LSm5Y+3XCI7XG4gICAgICAgIC8vICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XG4gICAgICAgIC8vICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAvLyAgIH1cbiAgICAgICAgLy8gfWVsc2Uge1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0sIDEwMDApO1xuICAgIH0pO1xuICAgIC8vIOeZu+W9lSDnn63kv6Hpqozor4HnoIHpqozor4FcbiAgICBzbXNBc3luY1ZhbGlkYXRvciA9IChjb250cm9sOkZvcm1Db250cm9sKT0+IG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogT2JzZXJ2ZXI8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+KSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgbGV0IHNtc0NvZGUgPSBjb250cm9sLnZhbHVlO1xuICAgICAgICBpZiAoc21zQ29kZSA9PSB1bmRlZmluZWQgfHwgc21zQ29kZS50cmltKCkgPT0gXCJcIikge1xuICAgICAgICAgIHRoaXMuc21zQ29kZUVycm9yVGlwID0gXCLor7fovpPlhaXnn63kv6Hpqozor4HnoIFcIjtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0sIDEwMDApO1xuICAgIH0pO1xuICAvLyDnmbvlvZUg5a+G56CB6aqM6K+BXG4gIHBhc3N3b3JkQXN5bmNWYWxpZGF0b3IgPSAoY29udHJvbDogRm9ybUNvbnRyb2wpID0+XG4gICAgbmV3IE9ic2VydmFibGUoKG9ic2VydmVyOiBPYnNlcnZlcjxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD4pID0+IHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBsZXQgcGFzc3dvcmQgPSBjb250cm9sLnZhbHVlO1xuICAgICAgICBpZiAocGFzc3dvcmQgPT0gdW5kZWZpbmVkIHx8IHBhc3N3b3JkLnRyaW0oKSA9PSBcIlwiKSB7XG4gICAgICAgICAgdGhpcy5wYXNzd29yZEVycm9yVGlwID0gXCLor7fovpPlhaXlr4bnoIFcIjtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc3dvcmQubGVuZ3RoIDwgNikge1xuICAgICAgICAgIHRoaXMucGFzc3dvcmRFcnJvclRpcCA9IFwi5a+G56CB6ZW/5bqm5LiN5b6X5bCP5LqONuS9jVwiO1xuICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBlcnJvcjogdHJ1ZSwgZHVwbGljYXRlZDogdHJ1ZSB9KTtcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBvYnNlcnZlci5uZXh0KG51bGwpO1xuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfSwgMTAwMCk7XG4gICAgfSk7XG5cbiAgY29kZUFzeW5jVmFsaWRhdG9yID0gKGNvbnRyb2w6IEZvcm1Db250cm9sKSA9PlxuICAgIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogT2JzZXJ2ZXI8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+KSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgbGV0IGNoZWNrQ29kZSA9IGNvbnRyb2wudmFsdWU7XG4gICAgICAgIGlmIChjaGVja0NvZGUgPT0gdW5kZWZpbmVkIHx8IGNoZWNrQ29kZS50cmltKCkgPT0gXCJcIikge1xuICAgICAgICAgIHRoaXMuY29kZVZlcmlmaWVkID0gZmFsc2VcbiAgICAgICAgICB0aGlzLmNvZGVFcnJvclRpcCA9IFwi6K+36L6T5YWl6aqM6K+B56CBXCI7XG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IGVycm9yOiB0cnVlLCBkdXBsaWNhdGVkOiB0cnVlIH0pO1xuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGVja0NvZGUubGVuZ3RoIDwgNCkge1xuICAgICAgICAgIHRoaXMuY29kZVZlcmlmaWVkID0gZmFsc2VcbiAgICAgICAgICB0aGlzLmNvZGVFcnJvclRpcCA9IFwi6aqM6K+B56CB6ZW/5bqm5LiN5b6X5bCP5LqONOS9jVwiO1xuICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBlcnJvcjogdHJ1ZSwgZHVwbGljYXRlZDogdHJ1ZSB9KTtcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYyA9IHRoaXMuY29kZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxldCB2YyA9IGNoZWNrQ29kZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGlmKGMhPXZjKXtcbiAgICAgICAgICB0aGlzLmNvZGVWZXJpZmllZCA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5jb2RlRXJyb3JUaXAgPSBcIumqjOivgeeggei+k+WFpemUmeivr1wiO1xuICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBlcnJvcjogdHJ1ZSwgZHVwbGljYXRlZDogdHJ1ZSB9KTtcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29kZVZlcmlmaWVkID0gdHJ1ZVxuICAgICAgICBvYnNlcnZlci5uZXh0KG51bGwpO1xuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfSwgMTAwMCk7XG4gICAgfSk7XG4gIGNvbmZpcm1QYXNzd29yZEVycm9yVGlwOiBhbnk7XG4gIHJlZ3Bhc3N3b3JkRXJyb3JUaXA6IGFueTtcbiAgcGhvbmVDb2Rlc0Vycm9yVGlwOiBhbnlcbiAgLy8g5rOo5YaMIOi6q+S7veivgeWPt+eggemqjOivgVxuICByZWdpc3RJZGNhcmRBc3luY1ZhbGlkYXRvciA9IChjb250cm9sOiBGb3JtQ29udHJvbCkgPT5cbiAgICBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXI6IE9ic2VydmVyPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPikgPT4ge1xuICAgICAgbGV0IHJlZ2lzdElkY2FyZCA9IGNvbnRyb2wudmFsdWU7XG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAocmVnaXN0SWRjYXJkID09IHVuZGVmaW5lZCB8fCByZWdpc3RJZGNhcmQudHJpbSgpID09IFwiXCIpIHtcbiAgICAgICAgICB0aGlzLnJlZ2lzdElkY2FyZEVycm9yVGlwID0gXCLor7fovpPlhaXmraPnoa7nmoTouqvku73or4Hlj7fnoIFcIjtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKC9eXFxkezE3fShcXGR8WHx4KSQvLnRlc3QocmVnaXN0SWRjYXJkKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICB0aGlzLnJlZ2lzdElkY2FyZEVycm9yVGlwID0gXCLor7fovpPlhaXmraPnoa7nmoTouqvku73or4Hlj7fnoIFcIjtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBvYnNlcnZlci5uZXh0KG51bGwpO1xuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfSwgMTAwMCk7XG4gICAgfSk7XG4gIC8vIOW/mOiusOWvhueggSDpqozor4FcbiAgZm9yZ2V0TmFtZUFzeW5jVmFsaWRhdG9yID0gKGNvbnRyb2w6IEZvcm1Db250cm9sKSA9PlxuICAgIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogT2JzZXJ2ZXI8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+KSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgbGV0IGZvcmdldE5hbWUgPSBjb250cm9sLnZhbHVlO1xuICAgICAgICBpZiAoZm9yZ2V0TmFtZSA9PSB1bmRlZmluZWQgfHwgZm9yZ2V0TmFtZS50cmltKCkgPT0gXCJcIikge1xuICAgICAgICAgIHRoaXMucmVnaXN0TmFtZUVycm9yVGlwID0gXCLor7fovpPlhaXotKbmiLfotKblj7fmiJbogIXmiYvmnLrlj7dcIjtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb3JnZXR1c2VybmFtZSA9IGZvcmdldE5hbWU7XG4gICAgICAgIG9ic2VydmVyLm5leHQobnVsbCk7XG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9LCAxMDAwKTtcbiAgICB9KTtcblxuICBmb3JnZXRQYXNzd29yZEFzeW5jVmFsaWRhdG9yID0gKGNvbnRyb2w6IEZvcm1Db250cm9sKSA9PlxuICAgIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogT2JzZXJ2ZXI8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+KSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgbGV0IGZvcmdldFBhc3N3b3JkID0gY29udHJvbC52YWx1ZTtcbiAgICAgICAgaWYgKGZvcmdldFBhc3N3b3JkID09IHVuZGVmaW5lZCB8fCBmb3JnZXRQYXNzd29yZC50cmltKCkgPT0gXCJcIikge1xuICAgICAgICAgIHRoaXMucGFzc3dvcmRFcnJvclRpcCA9IFwi6K+36L6T5YWl5paw5a+G56CBXCI7XG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IGVycm9yOiB0cnVlLCBkdXBsaWNhdGVkOiB0cnVlIH0pO1xuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3JnZXRQYXNzd29yZC5sZW5ndGggPCA2KSB7XG4gICAgICAgICAgdGhpcy5wYXNzd29yZEVycm9yVGlwID0gXCLlr4bnoIHplb/luqbkuI3lvpflsI/kuo425L2NXCI7XG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IGVycm9yOiB0cnVlLCBkdXBsaWNhdGVkOiB0cnVlIH0pO1xuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9yZ2V0UGFzc3dvcmQgPSBmb3JnZXRQYXNzd29yZDtcbiAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0sIDEwMDApO1xuICAgIH0pO1xuXG4gIGZvcmdldENvbmZpcm1QYXNzd29yZEFzeW5jVmFsaWRhdG9yID0gKGNvbnRyb2w6IEZvcm1Db250cm9sKSA9PlxuICAgIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogT2JzZXJ2ZXI8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+KSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgbGV0IGZvcmdldENvbmZpcm1wYXNzd29yZCA9IGNvbnRyb2wudmFsdWU7XG4gICAgICAgIGlmIChmb3JnZXRDb25maXJtcGFzc3dvcmQgPT0gdW5kZWZpbmVkIHx8IGZvcmdldENvbmZpcm1wYXNzd29yZC50cmltKCkgPT0gXCJcIikge1xuICAgICAgICAgIHRoaXMuZm9yZ2V0cGhvbmVDb2Rlc0Vycm9yVGlwID0gXCLor7fnoa7orqTmlrDlr4bnoIFcIjtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcmdldENvbmZpcm1wYXNzd29yZC5sZW5ndGggPCA2KSB7XG4gICAgICAgICAgdGhpcy5mb3JnZXRwaG9uZUNvZGVzRXJyb3JUaXAgPSBcIuWvhueggemVv+W6puS4jeW+l+Wwj+S6jjbkvY1cIjtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb3JnZXRDb25maXJtcGFzc3dvcmQgPSBmb3JnZXRDb25maXJtcGFzc3dvcmQ7XG4gICAgICAgIG9ic2VydmVyLm5leHQobnVsbCk7XG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9LCAxMDAwKTtcbiAgICB9KTtcblxuICBmb3JnZXRDb2RlQXN5bmNWYWxpZGF0b3IgPSAoY29udHJvbDogRm9ybUNvbnRyb2wpID0+XG4gICAgbmV3IE9ic2VydmFibGUoKG9ic2VydmVyOiBPYnNlcnZlcjxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD4pID0+IHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBsZXQgZm9yZ2VycGhvbmVDb2RlID0gY29udHJvbC52YWx1ZTtcbiAgICAgICAgaWYgKGZvcmdlcnBob25lQ29kZSA9PSB1bmRlZmluZWQgfHwgZm9yZ2VycGhvbmVDb2RlLnRyaW0oKSA9PSBcIlwiKSB7XG4gICAgICAgICAgdGhpcy5waG9uZUNvZGVzRXJyb3JUaXAgPSBcIuivt+i+k+WFpeaWsOWvhueggVwiO1xuICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBlcnJvcjogdHJ1ZSwgZHVwbGljYXRlZDogdHJ1ZSB9KTtcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvcmdlcnBob25lQ29kZSA9IGZvcmdlcnBob25lQ29kZTtcbiAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0sIDEwMDApO1xuICAgIH0pO1xuXG5cblxuXG4gIC8vIOazqOWGjCDlp5PlkI3pqozor4FcbiAgcmVnaXN0TmFtZUFzeW5jVmFsaWRhdG9yID0gKGNvbnRyb2w6IEZvcm1Db250cm9sKSA9PlxuICAgIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogT2JzZXJ2ZXI8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+KSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgbGV0IHJlZ2lzdE5hbWUgPSBjb250cm9sLnZhbHVlO1xuICAgICAgICBpZiAocmVnaXN0TmFtZSA9PSB1bmRlZmluZWQgfHwgcmVnaXN0TmFtZS50cmltKCkgPT0gXCJcIikge1xuICAgICAgICAgIHRoaXMucmVnaXN0TmFtZUVycm9yVGlwID0gXCLor7fovpPlhaXlp5PlkI1cIjtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWdpc3ROYW1lID0gcmVnaXN0TmFtZTtcbiAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0sIDEwMDApO1xuICAgIH0pO1xuXG5cbiAgLy8g5rOo5YaM5omL5py65Y+36aqM6K+BXG4gIHJlZ2lzdFBob25lQXN5bmNWYWxpZGF0b3IgPSAoY29udHJvbDogRm9ybUNvbnRyb2wpID0+XG4gICAgbmV3IE9ic2VydmFibGUoKG9ic2VydmVyOiBPYnNlcnZlcjxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD4pID0+IHtcbiAgICAgIGxldCByZWdpc3RQaG9uZSA9IGNvbnRyb2wudmFsdWU7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHJlZ2lzdFBob25lID09IHVuZGVmaW5lZCB8fCByZWdpc3RQaG9uZS50cmltKCkgPT0gXCJcIikge1xuICAgICAgICAgIHRoaXMucmVnaXN0SWRjYXJkRXJyb3JUaXAgPSBcIuivt+i+k+WFpeato+ehrueahOi6q+S7veivgeWPt+eggVwiO1xuICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBlcnJvcjogdHJ1ZSwgZHVwbGljYXRlZDogdHJ1ZSB9KTtcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgvXjFbMzQ1Njc4OV1cXGR7OX0kLy50ZXN0KHJlZ2lzdFBob25lKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICB0aGlzLnBob25lRXJyb3JUaXAgPSBcIuivt+i+k+WFpeato+ehrueahOaJi+acuuWPt1wiO1xuICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBlcnJvcjogdHJ1ZSwgZHVwbGljYXRlZDogdHJ1ZSB9KTtcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG9ic2VydmVyLm5leHQobnVsbCk7XG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9LCAxMDAwKTtcbiAgICB9KTtcblxuXG4gIHJlZ2lzdENvZGVBc3luY1ZhbGlkYXRvciA9IChjb250cm9sOiBGb3JtQ29udHJvbCkgPT5cbiAgICBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXI6IE9ic2VydmVyPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPikgPT4ge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGxldCByZWdpc3RDb2RlID0gY29udHJvbC52YWx1ZTtcbiAgICAgICAgaWYgKHJlZ2lzdENvZGUgPT0gdW5kZWZpbmVkIHx8IHJlZ2lzdENvZGUudHJpbSgpID09IFwiXCIpIHtcbiAgICAgICAgICB0aGlzLnBob25lQ29kZXNFcnJvclRpcCA9IFwi6K+36L6T5YWl6aqM6K+B56CBXCI7XG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IGVycm9yOiB0cnVlLCBkdXBsaWNhdGVkOiB0cnVlIH0pO1xuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG9ic2VydmVyLm5leHQobnVsbCk7XG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9LCAxMDAwKTtcbiAgICB9KTtcbiAgLy8g5rOo5YaM5a+G56CB6aqM6K+BXG4gIHJlZ3Bhc3N3b3JkQXN5bmNWYWxpZGF0b3IgPSAoY29udHJvbDogRm9ybUNvbnRyb2wpID0+XG4gICAgbmV3IE9ic2VydmFibGUoKG9ic2VydmVyOiBPYnNlcnZlcjxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD4pID0+IHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBsZXQgcmVncGFzc3dvcmQgPSBjb250cm9sLnZhbHVlO1xuICAgICAgICBpZiAocmVncGFzc3dvcmQgPT0gdW5kZWZpbmVkIHx8IHJlZ3Bhc3N3b3JkLnRyaW0oKSA9PSBcIlwiKSB7XG4gICAgICAgICAgdGhpcy5yZWdwYXNzd29yZEVycm9yVGlwID0gXCLor7fovpPlhaXlr4bnoIFcIjtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlZ3Bhc3N3b3JkLmxlbmd0aCA8IDYpIHtcbiAgICAgICAgICB0aGlzLnJlZ3Bhc3N3b3JkRXJyb3JUaXAgPSBcIuWvhueggemVv+W6puS4jeW+l+Wwj+S6jjbkvY1cIjtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlZ3Bhc3N3b3JkLmxlbmd0aCA+IDEyKSB7XG4gICAgICAgICAgdGhpcy5yZWdwYXNzd29yZEVycm9yVGlwID0gXCLlr4bnoIHplb/luqbkuI3lvpflpKfkuo4xMuS9jVwiO1xuICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBlcnJvcjogdHJ1ZSwgZHVwbGljYXRlZDogdHJ1ZSB9KTtcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlZ3Bhc3N3b3JkID0gcmVncGFzc3dvcmRcbiAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0sIDEwMDApO1xuICAgIH0pO1xuICAvLyDms6jlhowg56Gu6K6k5a+G56CB6aqM6K+BXG4gIGNvbmZpcm1QYXNzd29yZEFzeW5jVmFsaWRhdG9yID0gKGNvbnRyb2w6IEZvcm1Db250cm9sKSA9PlxuICAgIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogT2JzZXJ2ZXI8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+KSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgbGV0IGNvbmZpcm1QYXNzd29yZCA9IGNvbnRyb2wudmFsdWU7XG4gICAgICAgIGlmIChjb25maXJtUGFzc3dvcmQgPT0gdW5kZWZpbmVkIHx8IGNvbmZpcm1QYXNzd29yZC50cmltKCkgPT0gXCJcIikge1xuICAgICAgICAgIHRoaXMuY29uZmlybVBhc3N3b3JkRXJyb3JUaXAgPSBcIuivt+ehruiupOWvhueggVwiO1xuICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBlcnJvcjogdHJ1ZSwgZHVwbGljYXRlZDogdHJ1ZSB9KTtcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlybVBhc3N3b3JkICE9IHRoaXMucmVncGFzc3dvcmQpIHtcbiAgICAgICAgICB0aGlzLmNvbmZpcm1QYXNzd29yZEVycm9yVGlwID0gXCLkuKTmrKHovpPlhaXlr4bnoIHkuI3kuIDoh7TvvIzor7fph43mlrDovpPlhaVcIjtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZXJyb3I6IHRydWUsIGR1cGxpY2F0ZWQ6IHRydWUgfSk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb25maXJtUGFzc3dvcmQgPSBjb25maXJtUGFzc3dvcmQ7XG5cbiAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0sIDEwMDApO1xuICAgIH0pO1xuXG4gIGNvZGU6IGFueSA9ICcnXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIFxuICAgIC8vIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdjb21wYW55JylcbiAgICAvLyBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgncGlkJylcbiAgICAvLyBsb2NhbFN0b3JhZ2UuY2xlYXIoKTtcbiAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLnBhcmFtTWFwLnN1YnNjcmliZShwYXJhbXMgPT4ge1xuICAgICAgaWYgKHBhcmFtcy5nZXQoJ3AnKSkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncGlkJywgcGFyYW1zLmdldCgncCcpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NvbXBhbnknLCB0aGlzLmNvbXBhbnlJZClcbiAgICAgIH1cbiAgICB9KVxuICAgIHRoaXMuY3JlYXRDb2RlKCk7XG4gIH1cbiAgY3JlYXRDb2RlKCkge1xuICAgIHRoaXMuY29kZSA9ICcnXG4gICAgbGV0IGNvZGVMZW5ndGggPSA0OyAgLy/pqozor4HnoIHnmoTplb/luqZcbiAgICBsZXQgY29kZUNoYXJzID0gW1xuICAgICAgMCxcbiAgICAgIDEsXG4gICAgICAyLFxuICAgICAgMyxcbiAgICAgIDQsXG4gICAgICA1LFxuICAgICAgNixcbiAgICAgIDcsXG4gICAgICA4LFxuICAgICAgOSxcbiAgICAgIFwiYVwiLFxuICAgICAgXCJiXCIsXG4gICAgICBcImNcIixcbiAgICAgIFwiZFwiLFxuICAgICAgXCJlXCIsXG4gICAgICBcImZcIixcbiAgICAgIFwiZ1wiLFxuICAgICAgXCJoXCIsXG4gICAgICBcImlcIixcbiAgICAgIFwialwiLFxuICAgICAgXCJrXCIsXG4gICAgICBcImxcIixcbiAgICAgIFwibVwiLFxuICAgICAgXCJuXCIsXG4gICAgICBcIm9cIixcbiAgICAgIFwicFwiLFxuICAgICAgXCJxXCIsXG4gICAgICBcInJcIixcbiAgICAgIFwic1wiLFxuICAgICAgXCJ0XCIsXG4gICAgICBcInVcIixcbiAgICAgIFwidlwiLFxuICAgICAgXCJ3XCIsXG4gICAgICBcInhcIixcbiAgICAgIFwieVwiLFxuICAgICAgXCJ6XCIsXG4gICAgICBcIkFcIixcbiAgICAgIFwiQlwiLFxuICAgICAgXCJDXCIsXG4gICAgICBcIkRcIixcbiAgICAgIFwiRVwiLFxuICAgICAgXCJGXCIsXG4gICAgICBcIkdcIixcbiAgICAgIFwiSFwiLFxuICAgICAgXCJJXCIsXG4gICAgICBcIkpcIixcbiAgICAgIFwiS1wiLFxuICAgICAgXCJMXCIsXG4gICAgICBcIk1cIixcbiAgICAgIFwiTlwiLFxuICAgICAgXCJPXCIsXG4gICAgICBcIlBcIixcbiAgICAgIFwiUVwiLFxuICAgICAgXCJSXCIsXG4gICAgICBcIlNcIixcbiAgICAgIFwiVFwiLFxuICAgICAgXCJVXCIsXG4gICAgICBcIlZcIixcbiAgICAgIFwiV1wiLFxuICAgICAgXCJYXCIsXG4gICAgICBcIllcIixcbiAgICAgIFwiWlwiXG4gICAgXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZGVMZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGNoYXJOdW0gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA1MilcbiAgICAgIHRoaXMuY29kZSArPSBjb2RlQ2hhcnNbY2hhck51bV07XG4gICAgfVxuICB9XG59XG5cbiIsIjxkaXYgY2xhc3M9XCJzdHVkZW50LWxvZ2luLWxheW91dFwiPlxuICA8ZGl2IGNsYXNzPVwibmF2X2NlbnRlclwiPlxuICAgIDxpbWcgW3NyY109XCJsb2dvXCIgYWx0PVwiXCIgY2xhc3M9XCJsb2dpbl9pbWdcIj5cbiAgICA8ZGl2IGNsYXNzPVwibmF2X2xvZ2luXCI+XG4gICAgICA8bnotdGFic2V0IFtuelNlbGVjdGVkSW5kZXhdPVwidGFiSW5kZXhcIiBbbnpUYWJQb3NpdGlvbl09XCIndG9wJ1wiPlxuXG4gICAgICAgIDwhLS0g55m75b2V77ya5omL5py65Y+3K+WvhueggeeZu+WFpSAtLT5cbiAgICAgICAgPG56LXRhYiBuelRpdGxlPVwi5omL5py65a+G56CBXCIgc3R5bGU9XCJjb2xvcjogIzAwMDAwMDtcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidHlwZSA9PSAnbG9naW4nXCI+XG4gICAgICAgICAgICA8Zm9ybSBuei1mb3JtIFtmb3JtR3JvdXBdPVwidmFsaWRhdGVGb3JtXCIgKG5nU3VibWl0KT1cInN1Ym1pdEZvcm1Nb2JpbGVQYXNzd29yZCh2YWxpZGF0ZUZvcm0udmFsdWUpXCI+XG4gICAgICAgICAgICAgIDxuei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICAgICAgPG56LWZvcm0tbGFiZWwgW256U3Bhbl09XCI1XCIgbnpSZXF1aXJlZD7miYvmnLrlj7c8L256LWZvcm0tbGFiZWw+XG4gICAgICAgICAgICAgICAgPG56LWZvcm0tY29udHJvbCBbbnpTcGFuXT1cIjE0XCIgbnpFcnJvclRpcD1cInt7dXNlckVycm9yVGlwfX1cIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBuei1pbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJtb2JpbGVcIiBwbGFjZWhvbGRlcj1cIuivt+i+k+WFpeaJi+acuuWPt1wiIC8+XG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICAgIDwvbnotZm9ybS1pdGVtPlxuICAgICAgICAgICAgICA8bnotZm9ybS1pdGVtPlxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWxhYmVsIFtuelNwYW5dPVwiNVwiIG56UmVxdWlyZWQ+5a+GIOeggTwvbnotZm9ybS1sYWJlbD5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiMTRcIiBuekVycm9yVGlwPVwie3twYXNzd29yZEVycm9yVGlwfX1cIj5cbiAgICAgICAgICAgICAgICAgIDxuei1pbnB1dC1ncm91cCBbbnpTdWZmaXhdPVwic3VmZml4VGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG56LWlucHV0IFt0eXBlXT1cInBhc3N3b3JkVmlzaWJsZSA/ICd0ZXh0JyA6ICdwYXNzd29yZCdcIiAgZm9ybUNvbnRyb2xOYW1lPVwicGFzc3dvcmRcIiBwbGFjZWhvbGRlcj1cIuivt+i+k+WFpeWvhueggVwiIC8+XG4gICAgICAgICAgICAgICAgICA8L256LWlucHV0LWdyb3VwPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzdWZmaXhUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPGkgbnotaWNvbiBbbnpUeXBlXT1cInBhc3N3b3JkVmlzaWJsZSA/ICdleWUtaW52aXNpYmxlJyA6ICdleWUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicGFzc3dvcmRWaXNpYmxlID0gIXBhc3N3b3JkVmlzaWJsZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICAgIDwvbnotZm9ybS1pdGVtPlxuICAgICAgICAgICAgICA8bnotZm9ybS1pdGVtIGNsYXNzPVwiZm9ybS1jb250cm9sLWNvbnRhaW5cIj5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1sYWJlbCBbbnpTcGFuXT1cIjVcIiBjbGFzcz1cImNvbnRhaW5feWFuem1cIiBuelJlcXVpcmVkID7pqozor4HnoIEgPC9uei1mb3JtLWxhYmVsPlxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgW256U3Bhbl09XCI2XCIgbnpFcnJvclRpcD1cInt7Y29kZUVycm9yVGlwfX1cIiBjbGFzcz1cImNvbnRhaW5faW5wdXRfeWFuem1cIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cImZvbnQtc2l6ZToxNHB4XCIgdGl0bGU9XCLor7fovpPlhaXpqozor4HnoIFcIiBuei1pbnB1dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImNoZWNrQ29kZVwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwi5Yy65YiG5aSn5bCP5YaZXCIgLz5cbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiNFwiIGNsYXNzPVwiY29kZVRleHRcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCIgaGVpZ2h0OiAxMDAlOyBtYXJnaW46IDAgNHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGxldHRlci1zcGFjaW5nOiAycHg7XCI+e3tjb2RlfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiNFwiIGNsYXNzPVwic3dpdGNoXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJjcmVhdENvZGUoKVwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjojNDBhOWZmOyBjb2xvcjogI2ZmZjsgcGFkZGluZzogNXB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XG4gICAgICAgICAgICAgICAgICAgIOaNouS4gOS4qlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICAgIDwvbnotZm9ybS1pdGVtPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9naW5fYnRuXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBuei1idXR0b24gbnpUeXBlPVwicHJpbWFyeVwiIFtuelNpemVdPVwiJ2xhcmdlJ1wiIFtkaXNhYmxlZF09XCIhdmFsaWRhdGVGb3JtLnZhbGlkXCI+55m75b2VPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9yZ2V0XCI+XG4gICAgICAgICAgICAgICAgPGg2IChjbGljayk9XCJmb3JnZXQoKVwiPuW/mOiusOWvhueggTwvaDY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0eXBlID09ICdmb3JnZXQnXCI+XG4gICAgICAgICAgICA8Zm9ybSBuei1mb3JtIFtmb3JtR3JvdXBdPVwiZm9yZ2V0Rm9ybVwiIChuZ1N1Ym1pdCk9XCJmb3JnZXRGb3JtRnVuKGZvcmdldEZvcm0udmFsdWUpXCI+XG4gICAgICAgICAgICAgIDxuei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICAgICAgPG56LWZvcm0tbGFiZWwgW256U3Bhbl09XCI1XCIgbnpSZXF1aXJlZD7nmbvlvZXotKblj7c8L256LWZvcm0tbGFiZWw+XG4gICAgICAgICAgICAgICAgPG56LWZvcm0tY29udHJvbCBbbnpTcGFuXT1cIjE0XCIgbnpFcnJvclRpcD1cInt7dXNlckVycm9yVGlwfX1cIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBuei1pbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJmb3JnZXR1c2VybmFtZVwiIHBsYWNlaG9sZGVyPVwi6K+36L6T5YWl5omL5py65Y+3XCIgLz5cbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cbiAgICAgICAgICAgICAgPC9uei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICAgIDxuei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICAgICAgPG56LWZvcm0tbGFiZWwgW256U3Bhbl09XCI1XCIgbnpSZXF1aXJlZD7mlrAg5a+GIOeggTwvbnotZm9ybS1sYWJlbD5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiMTRcIiBuekVycm9yVGlwPVwie3twYXNzd29yZEVycm9yVGlwfX1cIj5cbiAgICAgICAgICAgICAgICAgIDxuei1pbnB1dC1ncm91cCBbbnpTdWZmaXhdPVwic3VmZml4VGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG56LWlucHV0IFt0eXBlXT1cInBhc3N3b3JkVmlzaWJsZSA/ICd0ZXh0JyA6ICdwYXNzd29yZCdcIiBmb3JtQ29udHJvbE5hbWU9XCJmb3JnZXRQYXNzd29yZFwiIHBsYWNlaG9sZGVyPVwi6K+36L6T5YWl5a+G56CBXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvbnotaW5wdXQtZ3JvdXA+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3N1ZmZpeFRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8aSBuei1pY29uIFtuelR5cGVdPVwicGFzc3dvcmRWaXNpYmxlID8gJ2V5ZS1pbnZpc2libGUnIDogJ2V5ZSdcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwYXNzd29yZFZpc2libGUgPSAhcGFzc3dvcmRWaXNpYmxlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cbiAgICAgICAgICAgICAgPC9uei1mb3JtLWl0ZW0+XG5cbiAgICAgICAgICAgICAgPG56LWZvcm0taXRlbT5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1sYWJlbCBbbnpTcGFuXT1cIjVcIiBuelJlcXVpcmVkPuehruiupOWvhueggTwvbnotZm9ybS1sYWJlbD5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiMTRcIiBuekVycm9yVGlwPVwie3tmb3JnZXRwaG9uZUNvZGVzRXJyb3JUaXB9fVwiPlxuICAgICAgICAgICAgICAgICAgPG56LWlucHV0LWdyb3VwIFtuelN1ZmZpeF09XCJzdWZmaXhUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbnotaW5wdXQgW3R5cGVdPVwicGFzc3dvcmRWaXNpYmxlID8gJ3RleHQnIDogJ3Bhc3N3b3JkJ1wiICBmb3JtQ29udHJvbE5hbWU9XCJmb3JnZXRDb25maXJtcGFzc3dvcmRcIiBwbGFjZWhvbGRlcj1cIuivt+WGjeasoei+k+WFpeWvhueggVwiIC8+XG4gICAgICAgICAgICAgICAgICA8L256LWlucHV0LWdyb3VwPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzdWZmaXhUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPGkgbnotaWNvbiBbbnpUeXBlXT1cInBhc3N3b3JkVmlzaWJsZSA/ICdleWUtaW52aXNpYmxlJyA6ICdleWUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicGFzc3dvcmRWaXNpYmxlID0gIXBhc3N3b3JkVmlzaWJsZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICAgIDwvbnotZm9ybS1pdGVtPlxuXG4gICAgICAgICAgICAgIDxuei1mb3JtLWl0ZW0gY2xhc3M9XCJmb3JnZXRfY29udGFpblwiPlxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWxhYmVsIFtuelNwYW5dPVwiNVwiIG56UmVxdWlyZWQgPumqjCDor4Eg56CBPC9uei1mb3JtLWxhYmVsPlxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgW256U3Bhbl09XCI4XCIgbnpIYXNGZWVkYmFjayBuekVycm9yVGlwPVwie3twaG9uZUNvZGVzRXJyb3JUaXB9fVwiIGNsYXNzPVwiY29kZUlucHV0XCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgc3R5bGU9XCJmb250LXNpemU6IDE4cHg7XCIgbnotaW5wdXQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJmb3JnZXJwaG9uZUNvZGVcIlxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIuaJi+acuumqjOivgeeggVwiIC8+XG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgPG56LWZvcm0tY29udHJvbCBbbnpTcGFuXT1cIjZcIiBjbGFzcz1cImdldENvZGVcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNDb3VudERvd25cIiAoY2xpY2spPVwiZ2V0Q29kZTIoKVwiICBjbGFzcz1cImdldF9jb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiM0MGE5ZmY7Y3Vyc29yOiBwb2ludGVyOyBjb2xvcjogI2ZmZjsgcGFkZGluZzogNXB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogMThweDtcIj5cbiAgICAgICAgICAgICAgICAgICAg6I635Y+W6aqM6K+B56CBXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0NvdW50RG93blwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjojNDBhOWZmOyBjb2xvcjogI2ZmZjsgcGFkZGluZzogNXB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogMThweDtcIj5cbiAgICAgICAgICAgICAgICAgICAge3tjb3VudERvd259fS/np5JcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxuICAgICAgICAgICAgICA8L256LWZvcm0taXRlbT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZ2luX2J0blwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gc3R5bGU9XCJ3aWR0aDogMzQ4cHg7XCIgbnotYnV0dG9uIG56VHlwZT1cInByaW1hcnlcIiBbbnpTaXplXT1cIidsYXJnZSdcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFmb3JnZXRGb3JtLnZhbGlkXCI+6YeN572u5a+G56CBPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9yZ2V0XCI+XG4gICAgICAgICAgICAgICAgPGg2IChjbGljayk9XCJiYWNrTG9naW4oKVwiPui/lOWbnueZu+W9lTwvaDY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwvbnotdGFiPlxuXG4gICAgICAgIDwhLS0g55m75b2V77ya5biQ5Y+3K+WvhueggeeZu+WFpSAtLT5cbiAgICAgICAgPG56LXRhYiBuelRpdGxlPVwi5biQ5Y+35a+G56CBXCIgc3R5bGU9XCJjb2xvcjogIzAwMDAwMDtcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidHlwZSA9PSAnbG9naW4nXCI+XG4gICAgICAgICAgICA8Zm9ybSBuei1mb3JtIFtmb3JtR3JvdXBdPVwidmFsaWRhdGVVc2VyRm9ybVwiIChuZ1N1Ym1pdCk9XCJzdWJtaXRGb3JtVXNlclBhc3N3b3JkKHZhbGlkYXRlVXNlckZvcm0udmFsdWUpXCI+XG4gICAgICAgICAgICAgIDxuei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICAgICAgPG56LWZvcm0tbGFiZWwgW256U3Bhbl09XCI1XCIgbnpSZXF1aXJlZD7luJAg5Y+3PC9uei1mb3JtLWxhYmVsPlxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgW256U3Bhbl09XCIxNFwiIG56RXJyb3JUaXA9XCJ7e3VzZXJFcnJvclRpcH19XCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgbnotaW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwidXNlcm5hbWVcIiBwbGFjZWhvbGRlcj1cIuivt+i+k+WFpeW4kOWPt1wiIC8+XG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICAgIDwvbnotZm9ybS1pdGVtPlxuICAgICAgICAgICAgICA8bnotZm9ybS1pdGVtPlxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWxhYmVsIFtuelNwYW5dPVwiNVwiIG56UmVxdWlyZWQ+5a+GIOeggTwvbnotZm9ybS1sYWJlbD5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiMTRcIiBuekVycm9yVGlwPVwie3twYXNzd29yZEVycm9yVGlwfX1cIj5cbiAgICAgICAgICAgICAgICAgIDxuei1pbnB1dC1ncm91cCBbbnpTdWZmaXhdPVwic3VmZml4VGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG56LWlucHV0IFt0eXBlXT1cInBhc3N3b3JkVmlzaWJsZSA/ICd0ZXh0JyA6ICdwYXNzd29yZCdcIiAgZm9ybUNvbnRyb2xOYW1lPVwicGFzc3dvcmRcIiBwbGFjZWhvbGRlcj1cIuivt+i+k+WFpeWvhueggVwiIC8+XG4gICAgICAgICAgICAgICAgICA8L256LWlucHV0LWdyb3VwPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzdWZmaXhUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPGkgbnotaWNvbiBbbnpUeXBlXT1cInBhc3N3b3JkVmlzaWJsZSA/ICdleWUtaW52aXNpYmxlJyA6ICdleWUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicGFzc3dvcmRWaXNpYmxlID0gIXBhc3N3b3JkVmlzaWJsZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICAgIDwvbnotZm9ybS1pdGVtPlxuICAgICAgICAgICAgICA8bnotZm9ybS1pdGVtIGNsYXNzPVwiZm9ybS1jb250cm9sLWNvbnRhaW5cIj5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1sYWJlbCBbbnpTcGFuXT1cIjVcIiBjbGFzcz1cImNvbnRhaW5feWFuem1cIiBuelJlcXVpcmVkID7pqozor4HnoIEgPC9uei1mb3JtLWxhYmVsPlxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgW256U3Bhbl09XCI2XCIgbnpFcnJvclRpcD1cInt7Y29kZUVycm9yVGlwfX1cIiBjbGFzcz1cImNvbnRhaW5faW5wdXRfeWFuem1cIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cImZvbnQtc2l6ZToxNHB4XCIgdGl0bGU9XCLor7fovpPlhaXpqozor4HnoIFcIiBuei1pbnB1dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImNoZWNrQ29kZVwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwi5Yy65YiG5aSn5bCP5YaZXCIgLz5cbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiNFwiIGNsYXNzPVwiY29kZVRleHRcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCIgaGVpZ2h0OiAxMDAlOyBtYXJnaW46IDAgNHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGxldHRlci1zcGFjaW5nOiAycHg7XCI+e3tjb2RlfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiNFwiIGNsYXNzPVwic3dpdGNoXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJjcmVhdENvZGUoKVwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjojNDBhOWZmOyBjb2xvcjogI2ZmZjsgcGFkZGluZzogNXB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XG4gICAgICAgICAgICAgICAgICAgIOaNouS4gOS4qlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICAgIDwvbnotZm9ybS1pdGVtPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9naW5fYnRuXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBuei1idXR0b24gbnpUeXBlPVwicHJpbWFyeVwiIFtuelNpemVdPVwiJ2xhcmdlJ1wiIFtkaXNhYmxlZF09XCIhdmFsaWRhdGVVc2VyRm9ybS52YWxpZFwiPueZu+W9lTwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidHlwZSA9PSAnZm9yZ2V0J1wiPlxuICAgICAgICAgICAgPGZvcm0gbnotZm9ybSBbZm9ybUdyb3VwXT1cImZvcmdldEZvcm1cIiAobmdTdWJtaXQpPVwiZm9yZ2V0Rm9ybUZ1bihmb3JnZXRGb3JtLnZhbHVlKVwiPlxuICAgICAgICAgICAgICA8bnotZm9ybS1pdGVtPlxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWxhYmVsIFtuelNwYW5dPVwiNVwiIG56UmVxdWlyZWQ+55m75b2V6LSm5Y+3PC9uei1mb3JtLWxhYmVsPlxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgW256U3Bhbl09XCIxNFwiIG56RXJyb3JUaXA9XCJ7e3VzZXJFcnJvclRpcH19XCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgbnotaW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZm9yZ2V0dXNlcm5hbWVcIiBwbGFjZWhvbGRlcj1cIuivt+i+k+WFpeaJi+acuuWPt1wiIC8+XG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICAgIDwvbnotZm9ybS1pdGVtPlxuICAgICAgICAgICAgICA8bnotZm9ybS1pdGVtPlxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWxhYmVsIFtuelNwYW5dPVwiNVwiIG56UmVxdWlyZWQ+5pawIOWvhiDnoIE8L256LWZvcm0tbGFiZWw+XG4gICAgICAgICAgICAgICAgPG56LWZvcm0tY29udHJvbCBbbnpTcGFuXT1cIjE0XCIgbnpFcnJvclRpcD1cInt7cGFzc3dvcmRFcnJvclRpcH19XCI+XG4gICAgICAgICAgICAgICAgICA8bnotaW5wdXQtZ3JvdXAgW256U3VmZml4XT1cInN1ZmZpeFRlbXBsYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuei1pbnB1dCBbdHlwZV09XCJwYXNzd29yZFZpc2libGUgPyAndGV4dCcgOiAncGFzc3dvcmQnXCIgZm9ybUNvbnRyb2xOYW1lPVwiZm9yZ2V0UGFzc3dvcmRcIiBwbGFjZWhvbGRlcj1cIuivt+i+k+WFpeWvhueggVwiIC8+XG4gICAgICAgICAgICAgICAgICA8L256LWlucHV0LWdyb3VwPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzdWZmaXhUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPGkgbnotaWNvbiBbbnpUeXBlXT1cInBhc3N3b3JkVmlzaWJsZSA/ICdleWUtaW52aXNpYmxlJyA6ICdleWUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicGFzc3dvcmRWaXNpYmxlID0gIXBhc3N3b3JkVmlzaWJsZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICAgIDwvbnotZm9ybS1pdGVtPlxuXG4gICAgICAgICAgICAgIDxuei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICAgICAgPG56LWZvcm0tbGFiZWwgW256U3Bhbl09XCI1XCIgbnpSZXF1aXJlZD7noa7orqTlr4bnoIE8L256LWZvcm0tbGFiZWw+XG4gICAgICAgICAgICAgICAgPG56LWZvcm0tY29udHJvbCBbbnpTcGFuXT1cIjE0XCIgbnpFcnJvclRpcD1cInt7Zm9yZ2V0cGhvbmVDb2Rlc0Vycm9yVGlwfX1cIj5cbiAgICAgICAgICAgICAgICAgIDxuei1pbnB1dC1ncm91cCBbbnpTdWZmaXhdPVwic3VmZml4VGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG56LWlucHV0IFt0eXBlXT1cInBhc3N3b3JkVmlzaWJsZSA/ICd0ZXh0JyA6ICdwYXNzd29yZCdcIiAgZm9ybUNvbnRyb2xOYW1lPVwiZm9yZ2V0Q29uZmlybXBhc3N3b3JkXCIgcGxhY2Vob2xkZXI9XCLor7flho3mrKHovpPlhaXlr4bnoIFcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9uei1pbnB1dC1ncm91cD5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc3VmZml4VGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDxpIG56LWljb24gW256VHlwZV09XCJwYXNzd29yZFZpc2libGUgPyAnZXllLWludmlzaWJsZScgOiAnZXllJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInBhc3N3b3JkVmlzaWJsZSA9ICFwYXNzd29yZFZpc2libGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxuICAgICAgICAgICAgICA8L256LWZvcm0taXRlbT5cblxuICAgICAgICAgICAgICA8bnotZm9ybS1pdGVtIGNsYXNzPVwiZm9yZ2V0X2NvbnRhaW5cIj5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1sYWJlbCBbbnpTcGFuXT1cIjVcIiBuelJlcXVpcmVkID7pqowg6K+BIOeggTwvbnotZm9ybS1sYWJlbD5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiOFwiIG56SGFzRmVlZGJhY2sgbnpFcnJvclRpcD1cInt7cGhvbmVDb2Rlc0Vycm9yVGlwfX1cIiBjbGFzcz1cImNvZGVJbnB1dFwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHN0eWxlPVwiZm9udC1zaXplOiAxOHB4O1wiIG56LWlucHV0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiZm9yZ2VycGhvbmVDb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCLmiYvmnLrpqozor4HnoIFcIiAvPlxuICAgICAgICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgW256U3Bhbl09XCI2XCIgY2xhc3M9XCJnZXRDb2RlXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzQ291bnREb3duXCIgKGNsaWNrKT1cImdldENvZGUyKClcIiAgY2xhc3M9XCJnZXRfY29kZVwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjojNDBhOWZmO2N1cnNvcjogcG9pbnRlcjsgY29sb3I6ICNmZmY7IHBhZGRpbmc6IDVweDsgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IDE4cHg7XCI+XG4gICAgICAgICAgICAgICAgICAgIOiOt+WPlumqjOivgeeggVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNDb3VudERvd25cIlxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IzQwYTlmZjsgY29sb3I6ICNmZmY7IHBhZGRpbmc6IDVweDsgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IDE4cHg7XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7Y291bnREb3dufX0v56eSXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cbiAgICAgICAgICAgICAgPC9uei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2dpbl9idG5cIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHN0eWxlPVwid2lkdGg6IDM0OHB4O1wiIG56LWJ1dHRvbiBuelR5cGU9XCJwcmltYXJ5XCIgW256U2l6ZV09XCInbGFyZ2UnXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZm9yZ2V0Rm9ybS52YWxpZFwiPumHjee9ruWvhueggTwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcmdldFwiPlxuICAgICAgICAgICAgICAgIDxoNiAoY2xpY2spPVwiYmFja0xvZ2luKClcIj7ov5Tlm57nmbvlvZU8L2g2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8L256LXRhYj5cbiAgICAgICAgPCEtLSDnmbvlvZXvvJrmiYvmnLrlj7cr6aqM6K+B56CB55m75YWlIC0tPlxuICAgICAgICA8bnotdGFiIG56VGl0bGU9XCLnn63kv6Hpqozor4FcIiBzdHlsZT1cImNvbG9yOiAjMDAwMDAwO1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0eXBlID09ICdsb2dpbidcIj5cbiAgICAgICAgICAgIDxmb3JtIG56LWZvcm0gW2Zvcm1Hcm91cF09XCJ2YWxpZGF0ZVNNU0Zvcm1cIiAobmdTdWJtaXQpPVwic3VibWl0Rm9ybU1vYmlsZVNNUyh2YWxpZGF0ZVNNU0Zvcm0udmFsdWUpXCI+XG4gICAgICAgICAgICAgIDxuei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICAgICAgPG56LWZvcm0tbGFiZWwgW256U3Bhbl09XCI1XCIgbnpSZXF1aXJlZD7miYsg5py6IOWPtzwvbnotZm9ybS1sYWJlbD5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiMTRcIiBuekVycm9yVGlwPVwie3t1c2VyRXJyb3JUaXB9fVwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IG56LWlucHV0IGZvcm1Db250cm9sTmFtZT1cIm1vYmlsZVwiIHBsYWNlaG9sZGVyPVwi6K+36L6T5YWl5omL5py65Y+3XCIgLz5cbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cbiAgICAgICAgICAgICAgPC9uei1mb3JtLWl0ZW0+XG5cbiAgICAgICAgICAgICAgPG56LWZvcm0taXRlbSBjbGFzcz1cImZvcm0tY29udHJvbC1jb250YWluXCI+XG4gICAgICAgICAgICAgICAgPG56LWZvcm0tbGFiZWwgW256U3Bhbl09XCI1XCIgY2xhc3M9XCJjb250YWluX3lhbnptXCIgbnpSZXF1aXJlZCA+6aqM6K+B56CBPC9uei1mb3JtLWxhYmVsPlxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgW256U3Bhbl09XCI2XCIgbnpFcnJvclRpcD1cInt7Y29kZUVycm9yVGlwfX1cIiBjbGFzcz1cImNvbnRhaW5faW5wdXRfeWFuem1cIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cImZvbnQtc2l6ZToxNHB4XCIgdGl0bGU9XCLor7fovpPlhaXpqozor4HnoIFcIiBuei1pbnB1dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImNoZWNrQ29kZVwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwi5Yy65YiG5aSn5bCP5YaZXCIgLz5cbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiNFwiIGNsYXNzPVwiY29kZVRleHRcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCIgaGVpZ2h0OiAxMDAlOyBtYXJnaW46IDAgNHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGxldHRlci1zcGFjaW5nOiAycHg7XCI+e3tjb2RlfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cbiAgICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiNFwiIGNsYXNzPVwic3dpdGNoXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJjcmVhdENvZGUoKVwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjojNDBhOWZmOyBjb2xvcjogI2ZmZjsgcGFkZGluZzogNXB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XG4gICAgICAgICAgICAgICAgICAgIOaNouS4gOS4qlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICAgIDwvbnotZm9ybS1pdGVtPlxuXG4gICAgICAgICAgICAgIDxuei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICAgICAgPG56LWZvcm0tbGFiZWwgW256U3Bhbl09XCI1XCIgbnpSZXF1aXJlZD7nn63kv6HnoIE8L256LWZvcm0tbGFiZWw+XG4gICAgICAgICAgICAgICAgPG56LWZvcm0tY29udHJvbCBbbnpTcGFuXT1cIjEwXCIgbnpFcnJvclRpcD1cInt7c21zQ29kZUVycm9yVGlwfX1cIj5cbiAgICAgICAgICAgICAgICAgIDxuei1pbnB1dC1ncm91cD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG56LWlucHV0IFt0eXBlXT1cIid0ZXh0J1wiIFtkaXNhYmxlZF09XCIhaXNTZW5kZWQgfHwgIWNvZGVWZXJpZmllZFwiIGZvcm1Db250cm9sTmFtZT1cInNtc0NvZGVcIiBwbGFjZWhvbGRlcj1cIuivt+i+k+WFpeefreS/oemqjOivgeeggVwiIC8+XG4gICAgICAgICAgICAgICAgICA8L256LWlucHV0LWdyb3VwPlxuICAgICAgICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxuICAgICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgW256U3Bhbl09XCI0XCIgY2xhc3M9XCJzd2l0Y2hcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNTZW5kaW5nXCIgKGNsaWNrKT1cInNlbmRTTVNDb2RlKClcIlxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IzQwYTlmZjsgY29sb3I6ICNmZmY7IHBhZGRpbmc6IDVweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiPlxuICAgICAgICAgICAgICAgICAgICDojrflj5bpqozor4HnoIFcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzU2VuZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiNlZmY1Zjk7IGNvbG9yOiByZ2IoMTE4LCAxMTcsIDExNyk7IHBhZGRpbmc6IDVweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiPlxuICAgICAgICAgICAgICAgICAgICB7e3Ntc1RpbWVDb3VudH19XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cbiAgICAgICAgICAgICAgPC9uei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9naW5fYnRuXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBuei1idXR0b24gbnpUeXBlPVwicHJpbWFyeVwiIFtuelNpemVdPVwiJ2xhcmdlJ1wiIFtkaXNhYmxlZF09XCIhdmFsaWRhdGVTTVNGb3JtLnZhbGlkXCI+55m75b2VPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L256LXRhYj5cblxuICAgICAgICA8IS0tIOazqOWGjO+8muS8geS4mueUqOaIt1Byb2ZpbGXlvIDpgJogLS0+XG4gICAgICAgIDxuei10YWIgKm5nSWY9XCJtb2JpbGVMb2dpblwiIG56VGl0bGU9XCLlvIDpgJpcIiBzdHlsZT1cImNvbG9yOiAjMDAwMDAwO1wiIGNsYXNzPVwiYWN0aXZhdGlvblwiPlxuICAgICAgICAgIDxmb3JtIG56LWZvcm0gW2Zvcm1Hcm91cF09XCJyZWdpc3RGb3JtXCIgKG5nU3VibWl0KT1cInJlZ2lzdFN1Ym1pdEZvcm0ocmVnaXN0Rm9ybS52YWx1ZSlcIj5cbiAgICAgICAgICAgIDxuei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICAgIDxuei1mb3JtLWxhYmVsIFtuelNwYW5dPVwiN1wiIG56UmVxdWlyZWQ+5byA6YCa6K+B5Lu2PC9uei1mb3JtLWxhYmVsPlxuICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiMTJcIiBuekhhc0ZlZWRiYWNrIG56VmFsaWRhdGluZ1RpcD1cIumqjOivgeS4rS4uLlwiXG4gICAgICAgICAgICAgICAgbnpFcnJvclRpcD1cInt7cmVnaXN0SWRjYXJkRXJyb3JUaXB9fVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0aXRsZT1cIuivt+i+k+WFpei6q+S7veivgeWPt+eggVwiIG56LWlucHV0IGZvcm1Db250cm9sTmFtZT1cInJlZ2lzdElkY2FyZFwiIHBsYWNlaG9sZGVyPVwi6K+36L6T5YWl6Lqr5Lu96K+B5Y+356CBXCIgLz5cbiAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICA8L256LWZvcm0taXRlbT5cbiAgICAgICAgICAgIDxuei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICAgIDxuei1mb3JtLWxhYmVsIFtuelNwYW5dPVwiN1wiIG56UmVxdWlyZWQ+5byA6YCa5aeT5ZCNPC9uei1mb3JtLWxhYmVsPlxuICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiMTJcIiBuekhhc0ZlZWRiYWNrIG56RXJyb3JUaXA9XCJ7e3JlZ2lzdE5hbWVFcnJvclRpcH19XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IG56LWlucHV0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwicmVnaXN0TmFtZVwiIHBsYWNlaG9sZGVyPVwi6K+36L6T5YWl5aeT5ZCNXCIgLz5cbiAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICA8L256LWZvcm0taXRlbT5cbiAgICAgICAgICAgIDxuei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICAgIDxuei1mb3JtLWxhYmVsIFtuelNwYW5dPVwiN1wiIG56UmVxdWlyZWQ+57uR5a6a5omL5py65Y+3PC9uei1mb3JtLWxhYmVsPlxuICAgICAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiMTJcIiBuekhhc0ZlZWRiYWNrIG56RXJyb3JUaXA9XCJ7e3Bob25lRXJyb3JUaXB9fVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cInJlZ2lzdFBob25lXCIgbnotaW5wdXQgIHN0eWxlPVwiZm9udC1zaXplOiAxOHB4O1wiIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJlZ2lzdFBob25lXCIgcGxhY2Vob2xkZXI9XCLor7fovpPlhaXmiYvmnLrlj7dcIiAvPlxuICAgICAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cbiAgICAgICAgICAgIDwvbnotZm9ybS1pdGVtPlxuICAgICAgICAgICAgPG56LWZvcm0taXRlbSBjbGFzcz1cInZlcmlmeUNvZGVcIj5cbiAgICAgICAgICAgICAgPG56LWZvcm0tbGFiZWwgW256U3Bhbl09XCI3XCIgbnpSZXF1aXJlZD7miYvmnLrpqozor4HnoIE8L256LWZvcm0tbGFiZWw+XG4gICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgW256U3Bhbl09XCI2XCIgY2xhc3M9XCJjb2RlX2lucHV0XCIgbnpIYXNGZWVkYmFjayBuekVycm9yVGlwPVwie3twaG9uZUNvZGVzRXJyb3JUaXB9fVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cImZvbnQtc2l6ZTogMThweDtcIiBuei1pbnB1dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cInBob25lQ29kZVwiIHBsYWNlaG9sZGVyPVwi5omL5py66aqM6K+B56CBXCIgLz5cbiAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgW256U3Bhbl09XCI2XCIgY2xhc3M9XCJjb2RlQ29udGFpblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNDb3VudERvd25cIiAoY2xpY2spPVwiZ2V0Q29kZSgpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImdldF9jb2RlXCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjojNDBhOWZmOyBjdXJzb3I6IHBvaW50ZXI7IGNvbG9yOiAjZmZmOyBwYWRkaW5nOiA1cHg7IHRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOiAxOHB4O1wiPlxuICAgICAgICAgICAgICAgICAg6I636aqM6K+B56CBXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzQ291bnREb3duXCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjojNDBhOWZmOyBjb2xvcjogI2ZmZjsgcGFkZGluZzogNXB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogMThweDtcIj5cbiAgICAgICAgICAgICAgICAgIHt7Y291bnREb3dufX0v56eSXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxuICAgICAgICAgICAgPC9uei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICA8bnotZm9ybS1pdGVtPlxuICAgICAgICAgICAgICA8bnotZm9ybS1sYWJlbCBbbnpTcGFuXT1cIjdcIiBuelJlcXVpcmVkPuW8gOmAmuWvhueggTwvbnotZm9ybS1sYWJlbD5cbiAgICAgICAgICAgICAgPG56LWZvcm0tY29udHJvbCBbbnpTcGFuXT1cIjEyXCIgbnpIYXNGZWVkYmFjayBuekVycm9yVGlwPVwie3tyZWdwYXNzd29yZEVycm9yVGlwfX1cIj5cbiAgICAgICAgICAgICAgICA8bnotaW5wdXQtZ3JvdXAgW256U3VmZml4XT1cInN1ZmZpeFRlbXBsYXRlMlwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IG56LWlucHV0IFt0eXBlXT1cInBhc3N3b3JkVmlzaWJsZTIgPyAndGV4dCcgOiAncGFzc3dvcmQnXCIgZm9ybUNvbnRyb2xOYW1lPVwicmVncGFzc3dvcmRcIlxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIuivt+i+k+WFpeWvhueggVwiIC8+XG4gICAgICAgICAgICAgICAgPC9uei1pbnB1dC1ncm91cD5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3N1ZmZpeFRlbXBsYXRlMj5cbiAgICAgICAgICAgICAgICAgIDxpIG56LWljb24gW256VHlwZV09XCJwYXNzd29yZFZpc2libGUyID8gJ2V5ZS1pbnZpc2libGUnIDogJ2V5ZSdcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicGFzc3dvcmRWaXNpYmxlMiA9ICFwYXNzd29yZFZpc2libGUyXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxuICAgICAgICAgICAgPC9uei1mb3JtLWl0ZW0+XG4gICAgICAgICAgICA8bnotZm9ybS1pdGVtPlxuICAgICAgICAgICAgICA8bnotZm9ybS1sYWJlbCBbbnpTcGFuXT1cIjdcIiBuelJlcXVpcmVkPuehruiupOWvhueggTwvbnotZm9ybS1sYWJlbD5cbiAgICAgICAgICAgICAgPG56LWZvcm0tY29udHJvbCBbbnpTcGFuXT1cIjEyXCIgbnpIYXNGZWVkYmFjayBuekVycm9yVGlwPVwie3tjb25maXJtUGFzc3dvcmRFcnJvclRpcH19XCI+XG4gICAgICAgICAgICAgICAgPG56LWlucHV0LWdyb3VwIFtuelN1ZmZpeF09XCJzdWZmaXhUZW1wbGF0ZTNcIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBuei1pbnB1dCBbdHlwZV09XCJwYXNzd29yZFZpc2libGUzID8gJ3RleHQnIDogJ3Bhc3N3b3JkJ1wiIGZvcm1Db250cm9sTmFtZT1cImNvbmZpcm1QYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwi6K+356Gu6K6k5a+G56CBXCIgLz5cbiAgICAgICAgICAgICAgICA8L256LWlucHV0LWdyb3VwPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc3VmZml4VGVtcGxhdGUzPlxuICAgICAgICAgICAgICAgICAgPGkgbnotaWNvbiBbbnpUeXBlXT1cInBhc3N3b3JkVmlzaWJsZTMgPyAnZXllLWludmlzaWJsZScgOiAnZXllJ1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwYXNzd29yZFZpc2libGUzID0gIXBhc3N3b3JkVmlzaWJsZTNcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XG4gICAgICAgICAgICA8L256LWZvcm0taXRlbT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2dpbl9idG5cIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBuei1idXR0b24gbnpUeXBlPVwicHJpbWFyeVwiIFtkaXNhYmxlZF09XCIhcmVnaXN0Rm9ybS52YWxpZFwiPueUs+ivt+W8gOmAmjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L256LXRhYj5cbiAgICAgIDwvbnotdGFic2V0PlxuICAgICAgPGRpdiBjbGFzcz1cIm5hdl9sb2dpbl9yaWdodFwiPlxuICAgICAgICA8cCBjbGFzcz1cImxvZ2luX3JpZ2h0X3RpdGxlXCI+5LqM57u056CBPC9wPlxuICAgICAgICA8aW1nIFtzcmNdPVwicXJjb2RlXCIgYWx0PVwi5YWs5LyX5Y+35LqM57u056CBXCI+XG4gICAgICAgIDxwPuaJq+eggei/m+WFpeW+ruS/oeerrzwvcD5cbiAgICAgICAgPCEtLSA8cCBjbGFzcz1cImxvZ2luX3JpZ2h0X2JvdHRvbVwiPummluasoeeZu+W9leacieaDiuWWnDwvcD4gLS0+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJsb2FkV3JhcFwiIHN0eWxlPVwiZGlzcGxheTogZmxleDthbGlnbi1pdGVtczogY2VudGVyO2p1c3RpZnktY29udGVudDogY2VudGVyO3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTtcIlxuICAgICAgKm5nSWY9XCJsb2FkaW5nMlwiPlxuICAgICAgPG56LXNwaW4gbnpUaXA9XCLliqDovb3kuK3vvIzor7fnqI3lkI4uLi5cIj5cbiAgICAgICAgPG56LWFsZXJ0IG56VHlwZT1cImluZm9cIiBuek1lc3NhZ2U9XCLor77nqIvliqDovb3kuK3vvIzor7fnqI3lkI4uLi5cIj48L256LWFsZXJ0PlxuICAgICAgPC9uei1zcGluPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSDms6jplIAgLS0+XG4gICAgPG56LW1vZGFsIFsobnpWaXNpYmxlKV09XCJpc1Zpc2libGVcIiBuelRpdGxlPVwi5omL5py65Y+36ZSZ6K+vXCIgKG56T25DYW5jZWwpPVwiaGFuZGxlQ2FuY2VsKClcIiAobnpPbk9rKT1cImhhbmRsZU9rKClcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm56TW9kYWxDb250ZW50PlxuICAgICAgICA8cD7miYvmnLrlj7fplJnor68sIOiBlOezu+euoeeQhuWRmOaguOWvueS/oeaBrzwvcD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbnotbW9kYWw+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|
|
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/user/login/login.component.mjs
|
|
7
|
+
*/
|
|
8
|
+
import{Component}from"@angular/core";import{FormBuilder,Validators}from"@angular/forms";import{Observable}from"rxjs";import{NzMessageService}from"ng-zorro-antd/message";import{AuthService}from"./auth.service";import Parse from"parse";import{Router,ActivatedRoute}from"@angular/router";import{HttpClient}from"@angular/common/http";import{NovaCloudService}from"../../nova-cloud/nova-cloud.service";import*as i0 from"@angular/core";import*as i1 from"./auth.service";import*as i2 from"../../nova-cloud/nova-cloud.service";import*as i3 from"@angular/forms";import*as i4 from"ng-zorro-antd/message";import*as i5 from"@angular/router";import*as i6 from"@angular/common/http";import*as i7 from"@angular/common";import*as i8 from"ng-zorro-antd/input";import*as i9 from"ng-zorro-antd/button";import*as i10 from"ng-zorro-antd/core/transition-patch";import*as i11 from"ng-zorro-antd/core/wave";import*as i12 from"ng-zorro-antd/modal";import*as i13 from"ng-zorro-antd/spin";import*as i14 from"ng-zorro-antd/tabs";import*as i15 from"ng-zorro-antd/grid";import*as i16 from"ng-zorro-antd/form";export class LoginComponent{drawCode(n){this.canvas=document.getElementById("verifyCanvas");var e=this.canvas.getContext("2d");e.fillStyle="white",e.fillRect(0,0,this.canvas.width,this.canvas.height),e.fillStyle="cornflowerblue",e.font="25px Arial";for(var o=new Array,t=new Array,r=new Array,i=0;i<4;i++)o.push(o[i]),o[i]=this.nums[i],t[i]=20*i+10,r[i]=20*Math.random()+20,e.fillText(o[i],t[i],r[i]);n=o.join("").toUpperCase();for(i=0;i<3;i++)this.drawline(this.canvas,e);for(i=0;i<30;i++)this.drawDot(this.canvas,e);return this.convertCanvasToImage(this.canvas),n}drawline(n,e){e.moveTo(Math.floor(Math.random()*n.width),Math.floor(Math.random()*n.height)),e.lineTo(Math.floor(Math.random()*n.width),Math.floor(Math.random()*n.height)),e.lineWidth=.5,e.strokeStyle="rgba(50,50,50,0.3)",e.stroke()}drawDot(n,e){var o=Math.floor(Math.random()*n.width),t=Math.floor(Math.random()*n.height);e.moveTo(o,t),e.lineTo(o+1,t+1),e.lineWidth=.2,e.stroke()}convertCanvasToImage(n){return document.getElementById("verifyCanvas").style.display="none",this.image=document.getElementById("code_img"),this.image.src=n.toDataURL("image/png"),this.image}sendSMSCode(){if(!this.codeVerified)return void this.message.create("error","请先核对验证码");let n=this.validateSMSForm.value?.mobile;if(console.log(this.validateSMSForm.value),n){let e=localStorage.getItem("NOVA_APIG_SERVER");e=decodeURIComponent(atob(e));let o=e+"message";this.http.post(o,{company:this.companyId,mobile:n,action:"login"}).subscribe((n=>{this.countDownSMS(),this.message.info("已发送,请查收验证码")}),(n=>{this.message.error(n?.error?.mess||"系统繁忙中,请稍后重试")}))}else this.message.error("请正确输入手机号")}countDownSMS(){this.isSended=!0,this.isSending=!0,this.smsTimeCount=60;let n=setInterval((()=>{this.smsTimeCount--}),1e3);setTimeout((()=>{clearInterval(n),this.isSending=!1}),6e4)}submitFormMobileSMS(n){for(const n in this.validateSMSForm.controls)this.validateSMSForm.controls[n].markAsDirty(),this.validateSMSForm.controls[n].updateValueAndValidity();console.log(n),this.username=n.mobile,this.smsCode=n.smsCode,console.log("smslogin"),this.loginSMS()}submitFormMobilePassword(n){for(const n in this.validateForm.controls)this.validateForm.controls[n].markAsDirty(),this.validateForm.controls[n].updateValueAndValidity();this.username=n.mobile||n.username,this.password=n.password;let e=n.checkCode,o=this.code.toLowerCase(),t=e.toLowerCase();console.log(o,t),o!=t?(console.log(o,t),this.message.create("error","验证码错误")):this.loginMobilePassword()}submitFormUserPassword(n){for(const n in this.validateForm.controls)this.validateForm.controls[n].markAsDirty(),this.validateForm.controls[n].updateValueAndValidity();this.username=n.mobile||n.username,this.password=n.password;let e=n.checkCode,o=this.code.toLowerCase(),t=e.toLowerCase();console.log(o,t),o!=t?(console.log(o,t),this.message.create("error","验证码错误")):this.authServ.login(this.username,this.password).then((async n=>{})).catch((n=>{console.log(n),this.message.create("error","错误的用户名或密码")}))}async forgetFormFun(n){for(const n in this.forgetForm.controls)this.forgetForm.controls[n].markAsDirty(),this.forgetForm.controls[n].updateValueAndValidity();if(console.log(n.forgetusername,n.forgetPassword,n.forgetConfirmpassword),n.forgetPassword!=n.forgetConfirmpassword)return void this.message.create("error","两次密码不一致");if(!n.forgerphoneCode)return void this.message.create("error","请输入验证码");let e=(Parse.serverURL?.split("parse")?.[0]||"https://server.fmode.cn/")+"api/auth/reset_password";this.http.post(e,{company:this.companyId,mobile:n.forgetusername,code:n.forgerphoneCode,password:n.forgetConfirmpassword}).subscribe((n=>{200==n.code?(this.message.create("success",n.msg),this.type="login"):this.message.create("error","验证码错误")}),(n=>{console.log(n.error),this.message.create("error",n.error.mess)}))}async registSubmitForm(n){for(const n in this.registForm.controls)this.registForm.controls[n].markAsDirty(),this.registForm.controls[n].updateValueAndValidity();this.registName=n.registName,this.registIdcard=n.registIdcard,this.registPhone=n.registPhone,this.phoneCode=n.phoneCode,this.regpassword=n.regpassword,this.confirmPassword=n.confirmPassword;let e=await this.verifyCode(this.registPhone,this.phoneCode);e&&200!=e.code?this.message.create("error",e.mess):this.queryUser()}getSelectEducation(){this.loginMobilePassword(),this.iseducation=!1}loginSMS(){let n=(Parse.serverURL?.split("parse")?.[0]||"https://server.fmode.cn/")+`api/auth/mobile?company=${this.companyId}&mobile=${this.username}&code=${this.smsCode}`;this.http.get(n).subscribe((n=>{if(console.log(n),200==n.code){this.message.create("success","登录成功");let e=n.data.token;Parse.User.become(e).then((n=>{this.router.navigate([decodeURIComponent(this.rootPage)])}))}else this.message.create("error","验证码错误")}),(n=>{console.log(n.error),this.message.create("error",n.error.mess)}))}async loginMobilePassword(){let n=await this.getMobileUser(this.username);n?this.authServ.login(n,this.password).then((async n=>{})).catch((n=>{console.log(n),this.message.create("error","错误的用户名或密码")})):this.message.create("error","用户不存在,请尝试其他登录方式")}async queryUser(){let n=new Parse.Query("_User");n.contains("username",this.registPhone),n.equalTo("company",this.companyId);let e=await n.first();e?.id?this.message.info("该账户已激活,使用手机号密码直接登录"):Parse.User.signUp(this.companyId+"-"+this.registPhone,this.regpassword,"").then((async n=>{n.id&&(console.log(n),n.set("company",{__type:"Pointer",className:"Company",objectId:this.companyId}),n.set("mobile",this.registPhone),n.set("type","user"),n.save(),this.username=this.registPhone,this.password=this.regpassword)}))}async getMobileUser(n){if(this.mobileUserMap[n])return this.mobileUserMap[n];let e=await this.novaCloud.api("/auth/getusername",{company:this.companyId,mobile:n});return console.log(e),e?.username&&(this.mobileUserMap[n]=e?.username),this.mobileUserMap[n]}forget(){this.type="forget"}backLogin(){this.type="login"}handleCancel(){this.isVisible=!1}handleOk(){Parse.User.signUp(this.registPhone,this.regpassword,"").then((async n=>{n.id&&(console.log(n),n.set("company",{__type:"Pointer",className:"Company",objectId:this.companyId}),n.save(),this.username=this.registPhone,this.password=this.regpassword)}))}async getCode(){if(null==this.registPhone||""==this.registPhone.trim())return void this.message.info("请输入注册手机号");if(!this.registPhone.match(/^1[3456789]\d{9}$/))return void this.message.info("请输入正确的手机号");let n=new Parse.Query("User");n.equalTo("username",this.registPhone),n.equalTo("company",this.companyId);let e=await n.first();if(e&&e.id)return void this.message.info("该手机号已注册,请使用账号密码登录");let o=localStorage.getItem("NOVA_APIG_SERVER");o=decodeURIComponent(atob(o));let t=o+"message";this.http.post(t,{company:this.companyId,mobile:this.registPhone,action:"regist"}).subscribe((n=>{this.vCode=n.data.code,this.countDownFun()}),(n=>{this.message.info("系统繁忙中,请稍后重试"),console.log(n)}))}async getCode2(){if(null==this.forgetusername||""==this.forgetusername.trim())return void this.message.info("请输入账号");if(!this.forgetusername.match(/^1[3456789]\d{9}$/))return void this.message.info("请输入正确的手机号");console.log(this.forgetusername);let n=new Parse.Query("User");if(n.equalTo("username",this.companyId+"-"+this.forgetusername),n.equalTo("company",this.companyId),!await n.first())return void this.message.info("账号不存在");let e=localStorage.getItem("NOVA_APIG_SERVER");e=decodeURIComponent(atob(e));let o=e+"message";this.http.post(o,{company:this.companyId,mobile:this.forgetusername,action:"resetPassword"}).subscribe((n=>{console.log(n),this.vCode=n.data.code,this.countDownFun()}),(n=>{this.message.info("系统繁忙中,请稍后重试"),console.log(n)}))}async verifyCode(n,e){let o=localStorage.getItem("NOVA_APIG_SERVER");o=decodeURIComponent(atob(o));let t=o+"verifyCode";return new Promise((async(o,r)=>{this.http.post(t,{mobile:n,code:e}).subscribe((n=>{o(n)}),(n=>{console.log(n),o(n.error)}))}))}countDownFun(){if(this.isCountDown=!0,0==this.countDown)return;let n=setInterval((()=>{this.countDown=this.countDown-1,0==this.countDown&&(clearInterval(n),this.countDown=60,this.isCountDown=!1)}),1e3)}constructor(n,e,o,t,r,i,a,s){this.authServ=n,this.novaCloud=e,this.fb=o,this.message=t,this.router=r,this.route=i,this.activatedRoute=a,this.http=s,this.nums=["C","6","Z","t"],this.str="",this.tabIndex=0,this.codeVerified=!1,this.passwordVisible=!1,this.passwordVisible2=!1,this.passwordVisible3=!1,this.iseducation=!1,this.redirectUrl=localStorage.getItem("redirectUrl"),this.isSended=!1,this.isSending=!1,this.smsTimeCount=60,this.loading=!0,this.Lesson=[],this.myDate=new Date,this.isVisible=!1,this.type="login",this.mobileUserMap={},this.isOkLoading=!1,this.countDown=60,this.isCountDown=!1,this.mobileLogin=!1,this.logo="https://www.fmode.cn/images/ewm1.png",this.qrcode="https://www.fmode.cn/images/logo_main.png",this.userNameAsyncValidator=n=>new Observable((e=>{let o=/^1[3456789]\d{9}$/,t=n.value;setTimeout((()=>null==t||""==t.trim()?(this.userErrorTip="请输入登录账号",e.next({error:!0,duplicated:!0}),void e.complete()):t.match(o)?(e.next(null),void e.complete()):(this.userErrorTip="请输入正确的登录账号",e.next({error:!0,duplicated:!0}),void e.complete())),1e3)})),this.smsAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;if(null==o||""==o.trim())return this.smsCodeErrorTip="请输入短信验证码",e.next({error:!0,duplicated:!0}),void e.complete();e.next(null),e.complete()}),1e3)})),this.passwordAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;return null==o||""==o.trim()?(this.passwordErrorTip="请输入密码",e.next({error:!0,duplicated:!0}),void e.complete()):o.length<6?(this.passwordErrorTip="密码长度不得小于6位",e.next({error:!0,duplicated:!0}),void e.complete()):(e.next(null),void e.complete())}),1e3)})),this.codeAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;return null==o||""==o.trim()?(this.codeVerified=!1,this.codeErrorTip="请输入验证码",e.next({error:!0,duplicated:!0}),void e.complete()):o.length<4?(this.codeVerified=!1,this.codeErrorTip="验证码长度不得小于4位",e.next({error:!0,duplicated:!0}),void e.complete()):this.code.toLowerCase()!=o.toLowerCase()?(this.codeVerified=!1,this.codeErrorTip="验证码输入错误",e.next({error:!0,duplicated:!0}),void e.complete()):(this.codeVerified=!0,e.next(null),void e.complete())}),1e3)})),this.registIdcardAsyncValidator=n=>new Observable((e=>{let o=n.value;setTimeout((()=>null==o||""==o.trim()||!1===/^\d{17}(\d|X|x)$/.test(o)?(this.registIdcardErrorTip="请输入正确的身份证号码",e.next({error:!0,duplicated:!0}),void e.complete()):(e.next(null),void e.complete())),1e3)})),this.forgetNameAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;if(null==o||""==o.trim())return this.registNameErrorTip="请输入账户账号或者手机号",e.next({error:!0,duplicated:!0}),void e.complete();this.forgetusername=o,e.next(null),e.complete()}),1e3)})),this.forgetPasswordAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;return null==o||""==o.trim()?(this.passwordErrorTip="请输入新密码",e.next({error:!0,duplicated:!0}),void e.complete()):o.length<6?(this.passwordErrorTip="密码长度不得小于6位",e.next({error:!0,duplicated:!0}),void e.complete()):(this.forgetPassword=o,e.next(null),void e.complete())}),1e3)})),this.forgetConfirmPasswordAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;return null==o||""==o.trim()?(this.forgetphoneCodesErrorTip="请确认新密码",e.next({error:!0,duplicated:!0}),void e.complete()):o.length<6?(this.forgetphoneCodesErrorTip="密码长度不得小于6位",e.next({error:!0,duplicated:!0}),void e.complete()):(this.forgetConfirmpassword=o,e.next(null),void e.complete())}),1e3)})),this.forgetCodeAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;if(null==o||""==o.trim())return this.phoneCodesErrorTip="请输入新密码",e.next({error:!0,duplicated:!0}),void e.complete();this.forgerphoneCode=o,e.next(null),e.complete()}),1e3)})),this.registNameAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;if(null==o||""==o.trim())return this.registNameErrorTip="请输入姓名",e.next({error:!0,duplicated:!0}),void e.complete();this.registName=o,e.next(null),e.complete()}),1e3)})),this.registPhoneAsyncValidator=n=>new Observable((e=>{let o=n.value;setTimeout((()=>null==o||""==o.trim()?(this.registIdcardErrorTip="请输入正确的身份证号码",e.next({error:!0,duplicated:!0}),void e.complete()):!1===/^1[3456789]\d{9}$/.test(o)?(this.phoneErrorTip="请输入正确的手机号",e.next({error:!0,duplicated:!0}),void e.complete()):(e.next(null),void e.complete())),1e3)})),this.registCodeAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;if(null==o||""==o.trim())return this.phoneCodesErrorTip="请输入验证码",e.next({error:!0,duplicated:!0}),void e.complete();e.next(null),e.complete()}),1e3)})),this.regpasswordAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;return null==o||""==o.trim()?(this.regpasswordErrorTip="请输入密码",e.next({error:!0,duplicated:!0}),void e.complete()):o.length<6?(this.regpasswordErrorTip="密码长度不得小于6位",e.next({error:!0,duplicated:!0}),void e.complete()):o.length>12?(this.regpasswordErrorTip="密码长度不得大于12位",e.next({error:!0,duplicated:!0}),void e.complete()):(this.regpassword=o,e.next(null),void e.complete())}),1e3)})),this.confirmPasswordAsyncValidator=n=>new Observable((e=>{setTimeout((()=>{let o=n.value;return null==o||""==o.trim()?(this.confirmPasswordErrorTip="请确认密码",e.next({error:!0,duplicated:!0}),void e.complete()):o!=this.regpassword?(this.confirmPasswordErrorTip="两次输入密码不一致,请重新输入",e.next({error:!0,duplicated:!0}),void e.complete()):(this.confirmPassword=o,e.next(null),void e.complete())}),1e3)})),this.code="",this.initLoginForm(),this.route.paramMap.subscribe((async n=>{console.log(n),this.appId=n.get("appId"),await this.initAppConfig()||(this.companyId=n.get("companyId"),this.companyId||(this.companyId=localStorage.getItem("company")||"Q0DryNYA8g"),await this.initCompanyConfig())}))}async initCompanyConfig(){if(!this.companyId)return;let n=new Parse.Query("Company");this.company=await n.get(this.companyId),this.logo=this.company?.get("logo")||this.logo,this.qrcode=this.company?.get("qrcode")||this.qrcode,this.mobileLogin=this.company?.get("jpush")?.appkey||!1,this.rootPage=this.company?.get("rootPage")}async initAppConfig(){if(!this.appId)return!1;let n=new Parse.Query("App");return n.include("company"),this.app=await n.get(this.appId),console.log(this.app),this.logo=this.app?.get("logo")||this.logo,this.qrcode=this.app?.get("qrcode")||this.qrcode,this.mobileLogin=this.app?.get("jpush")?.appkey||!1,this.companyId=this.app?.get("company").id,this.rootPage=this.app?.get("rootPage"),!0}initLoginForm(){this.validateForm=this.fb.group({mobile:["",[Validators.required],[this.userNameAsyncValidator]],password:["",[Validators.required],[this.passwordAsyncValidator]],checkCode:["",[Validators.required],[this.codeAsyncValidator]]}),this.validateUserForm=this.fb.group({username:["",[Validators.required],[]],password:["",[Validators.required],[this.passwordAsyncValidator]],checkCode:["",[Validators.required],[this.codeAsyncValidator]]}),this.validateSMSForm=this.fb.group({mobile:["",[Validators.required],[this.userNameAsyncValidator]],password:[""],smsCode:["",[Validators.required],[this.smsAsyncValidator]],checkCode:["",[Validators.required],[this.codeAsyncValidator]]}),this.registForm=this.fb.group({registName:["",[Validators.required],[this.registNameAsyncValidator]],registIdcard:["",[Validators.required],[this.registIdcardAsyncValidator]],registPhone:["",[Validators.required],[this.registPhoneAsyncValidator]],phoneCode:["",[Validators.required],[this.registCodeAsyncValidator]],regpassword:["",[Validators.required],[this.regpasswordAsyncValidator]],confirmPassword:["",[Validators.required],[this.confirmPasswordAsyncValidator]]}),this.forgetForm=this.fb.group({forgetusername:["",[Validators.required],[this.forgetNameAsyncValidator]],forgetPassword:["",[Validators.required],[this.forgetPasswordAsyncValidator]],forgetConfirmpassword:["",[Validators.required],[this.forgetConfirmPasswordAsyncValidator]],forgerphoneCode:["",[Validators.required],[this.registCodeAsyncValidator]]})}ngOnInit(){this.activatedRoute.paramMap.subscribe((n=>{n.get("p")?localStorage.setItem("pid",n.get("p")):localStorage.setItem("company",this.companyId)})),this.creatCode()}creatCode(){this.code="";let n=[0,1,2,3,4,5,6,7,8,9,"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"];for(let e=0;e<4;e++){let e=Math.floor(52*Math.random());this.code+=n[e]}}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:LoginComponent,deps:[{token:i1.AuthService},{token:i2.NovaCloudService},{token:i3.FormBuilder},{token:i4.NzMessageService},{token:i5.Router},{token:i5.ActivatedRoute},{token:i5.ActivatedRoute},{token:i6.HttpClient}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"17.3.12",type:LoginComponent,selector:"app-pcuser-login",ngImport:i0,template:'<div class="student-login-layout">\n <div class="nav_center">\n <img [src]="logo" alt="" class="login_img">\n <div class="nav_login">\n <nz-tabset [nzSelectedIndex]="tabIndex" [nzTabPosition]="\'top\'">\n\n \x3c!-- 登录:手机号+密码登入 --\x3e\n <nz-tab nzTitle="手机密码" style="color: #000000;">\n <ng-container *ngIf="type == \'login\'">\n <form nz-form [formGroup]="validateForm" (ngSubmit)="submitFormMobilePassword(validateForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>手机号</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{userErrorTip}}">\n <input nz-input formControlName="mobile" placeholder="请输入手机号" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>密 码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{passwordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="password" placeholder="请输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item class="form-control-contain">\n <nz-form-label [nzSpan]="5" class="contain_yanzm" nzRequired >验证码 </nz-form-label>\n <nz-form-control [nzSpan]="6" nzErrorTip="{{codeErrorTip}}" class="contain_input_yanzm">\n <input style="font-size:14px" title="请输入验证码" nz-input type="text" formControlName="checkCode"\n placeholder="区分大小写" />\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="codeText">\n <div style=" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;">{{code}}</div>\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="switch">\n <div (click)="creatCode()"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;">\n 换一个\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class="login_btn">\n <button nz-button nzType="primary" [nzSize]="\'large\'" [disabled]="!validateForm.valid">登录</button>\n </div>\n <div class="forget">\n <h6 (click)="forget()">忘记密码</h6>\n </div>\n </form>\n </ng-container>\n <ng-container *ngIf="type == \'forget\'">\n <form nz-form [formGroup]="forgetForm" (ngSubmit)="forgetFormFun(forgetForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>登录账号</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{userErrorTip}}">\n <input nz-input formControlName="forgetusername" placeholder="请输入手机号" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>新 密 码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{passwordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="forgetPassword" placeholder="请输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>确认密码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{forgetphoneCodesErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="forgetConfirmpassword" placeholder="请再次输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item class="forget_contain">\n <nz-form-label [nzSpan]="5" nzRequired >验 证 码</nz-form-label>\n <nz-form-control [nzSpan]="8" nzHasFeedback nzErrorTip="{{phoneCodesErrorTip}}" class="codeInput">\n <input style="font-size: 18px;" nz-input type="text" formControlName="forgerphoneCode"\n placeholder="手机验证码" />\n </nz-form-control>\n <nz-form-control [nzSpan]="6" class="getCode">\n <div *ngIf="!isCountDown" (click)="getCode2()" class="get_code"\n style="background-color:#40a9ff;cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n 获取验证码\n </div>\n <div *ngIf="isCountDown"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n {{countDown}}/秒\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class="login_btn">\n <button style="width: 348px;" nz-button nzType="primary" [nzSize]="\'large\'"\n [disabled]="!forgetForm.valid">重置密码</button>\n </div>\n <div class="forget">\n <h6 (click)="backLogin()">返回登录</h6>\n </div>\n </form>\n </ng-container>\n\n </nz-tab>\n\n \x3c!-- 登录:帐号+密码登入 --\x3e\n <nz-tab nzTitle="帐号密码" style="color: #000000;">\n <ng-container *ngIf="type == \'login\'">\n <form nz-form [formGroup]="validateUserForm" (ngSubmit)="submitFormUserPassword(validateUserForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>帐 号</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{userErrorTip}}">\n <input nz-input formControlName="username" placeholder="请输入帐号" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>密 码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{passwordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="password" placeholder="请输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item class="form-control-contain">\n <nz-form-label [nzSpan]="5" class="contain_yanzm" nzRequired >验证码 </nz-form-label>\n <nz-form-control [nzSpan]="6" nzErrorTip="{{codeErrorTip}}" class="contain_input_yanzm">\n <input style="font-size:14px" title="请输入验证码" nz-input type="text" formControlName="checkCode"\n placeholder="区分大小写" />\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="codeText">\n <div style=" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;">{{code}}</div>\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="switch">\n <div (click)="creatCode()"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;">\n 换一个\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class="login_btn">\n <button nz-button nzType="primary" [nzSize]="\'large\'" [disabled]="!validateUserForm.valid">登录</button>\n </div>\n </form>\n </ng-container>\n <ng-container *ngIf="type == \'forget\'">\n <form nz-form [formGroup]="forgetForm" (ngSubmit)="forgetFormFun(forgetForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>登录账号</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{userErrorTip}}">\n <input nz-input formControlName="forgetusername" placeholder="请输入手机号" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>新 密 码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{passwordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="forgetPassword" placeholder="请输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>确认密码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{forgetphoneCodesErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="forgetConfirmpassword" placeholder="请再次输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item class="forget_contain">\n <nz-form-label [nzSpan]="5" nzRequired >验 证 码</nz-form-label>\n <nz-form-control [nzSpan]="8" nzHasFeedback nzErrorTip="{{phoneCodesErrorTip}}" class="codeInput">\n <input style="font-size: 18px;" nz-input type="text" formControlName="forgerphoneCode"\n placeholder="手机验证码" />\n </nz-form-control>\n <nz-form-control [nzSpan]="6" class="getCode">\n <div *ngIf="!isCountDown" (click)="getCode2()" class="get_code"\n style="background-color:#40a9ff;cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n 获取验证码\n </div>\n <div *ngIf="isCountDown"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n {{countDown}}/秒\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class="login_btn">\n <button style="width: 348px;" nz-button nzType="primary" [nzSize]="\'large\'"\n [disabled]="!forgetForm.valid">重置密码</button>\n </div>\n <div class="forget">\n <h6 (click)="backLogin()">返回登录</h6>\n </div>\n </form>\n </ng-container>\n\n </nz-tab>\n \x3c!-- 登录:手机号+验证码登入 --\x3e\n <nz-tab nzTitle="短信验证" style="color: #000000;">\n <ng-container *ngIf="type == \'login\'">\n <form nz-form [formGroup]="validateSMSForm" (ngSubmit)="submitFormMobileSMS(validateSMSForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>手 机 号</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{userErrorTip}}">\n <input nz-input formControlName="mobile" placeholder="请输入手机号" />\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item class="form-control-contain">\n <nz-form-label [nzSpan]="5" class="contain_yanzm" nzRequired >验证码</nz-form-label>\n <nz-form-control [nzSpan]="6" nzErrorTip="{{codeErrorTip}}" class="contain_input_yanzm">\n <input style="font-size:14px" title="请输入验证码" nz-input type="text" formControlName="checkCode"\n placeholder="区分大小写" />\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="codeText">\n <div style=" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;">{{code}}</div>\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="switch">\n <div (click)="creatCode()"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;">\n 换一个\n </div>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>短信码</nz-form-label>\n <nz-form-control [nzSpan]="10" nzErrorTip="{{smsCodeErrorTip}}">\n <nz-input-group>\n <input nz-input [type]="\'text\'" [disabled]="!isSended || !codeVerified" formControlName="smsCode" placeholder="请输入短信验证码" />\n </nz-input-group>\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="switch">\n <div *ngIf="!isSending" (click)="sendSMSCode()"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;">\n 获取验证码\n </div>\n <div *ngIf="isSending"\n style="background-color:#eff5f9; color: rgb(118, 117, 117); padding: 5px; text-align: center;">\n {{smsTimeCount}}\n </div>\n </nz-form-control>\n </nz-form-item>\n \n <div class="login_btn">\n <button nz-button nzType="primary" [nzSize]="\'large\'" [disabled]="!validateSMSForm.valid">登录</button>\n </div>\n </form>\n </ng-container>\n </nz-tab>\n\n \x3c!-- 注册:企业用户Profile开通 --\x3e\n <nz-tab *ngIf="mobileLogin" nzTitle="开通" style="color: #000000;" class="activation">\n <form nz-form [formGroup]="registForm" (ngSubmit)="registSubmitForm(registForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="7" nzRequired>开通证件</nz-form-label>\n <nz-form-control [nzSpan]="12" nzHasFeedback nzValidatingTip="验证中..."\n nzErrorTip="{{registIdcardErrorTip}}">\n <input title="请输入身份证号码" nz-input formControlName="registIdcard" placeholder="请输入身份证号码" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="7" nzRequired>开通姓名</nz-form-label>\n <nz-form-control [nzSpan]="12" nzHasFeedback nzErrorTip="{{registNameErrorTip}}">\n <input nz-input type="text" formControlName="registName" placeholder="请输入姓名" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="7" nzRequired>绑定手机号</nz-form-label>\n <nz-form-control [nzSpan]="12" nzHasFeedback nzErrorTip="{{phoneErrorTip}}">\n <input [(ngModel)]="registPhone" nz-input style="font-size: 18px;" type="text"\n formControlName="registPhone" placeholder="请输入手机号" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item class="verifyCode">\n <nz-form-label [nzSpan]="7" nzRequired>手机验证码</nz-form-label>\n <nz-form-control [nzSpan]="6" class="code_input" nzHasFeedback nzErrorTip="{{phoneCodesErrorTip}}">\n <input style="font-size: 18px;" nz-input type="text" formControlName="phoneCode" placeholder="手机验证码" />\n </nz-form-control>\n <nz-form-control [nzSpan]="6" class="codeContain">\n <div *ngIf="!isCountDown" (click)="getCode()"\n class="get_code"\n style="background-color:#40a9ff; cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n 获验证码\n </div>\n <div *ngIf="isCountDown"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n {{countDown}}/秒\n </div>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="7" nzRequired>开通密码</nz-form-label>\n <nz-form-control [nzSpan]="12" nzHasFeedback nzErrorTip="{{regpasswordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate2">\n <input nz-input [type]="passwordVisible2 ? \'text\' : \'password\'" formControlName="regpassword"\n placeholder="请输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate2>\n <i nz-icon [nzType]="passwordVisible2 ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible2 = !passwordVisible2"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="7" nzRequired>确认密码</nz-form-label>\n <nz-form-control [nzSpan]="12" nzHasFeedback nzErrorTip="{{confirmPasswordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate3">\n <input nz-input [type]="passwordVisible3 ? \'text\' : \'password\'" formControlName="confirmPassword"\n placeholder="请确认密码" />\n </nz-input-group>\n <ng-template #suffixTemplate3>\n <i nz-icon [nzType]="passwordVisible3 ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible3 = !passwordVisible3"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <div class="login_btn">\n <button nz-button nzType="primary" [disabled]="!registForm.valid">申请开通</button>\n </div>\n </form>\n </nz-tab>\n </nz-tabset>\n <div class="nav_login_right">\n <p class="login_right_title">二维码</p>\n <img [src]="qrcode" alt="公众号二维码">\n <p>扫码进入微信端</p>\n \x3c!-- <p class="login_right_bottom">首次登录有惊喜</p> --\x3e\n </div>\n </div>\n\n <div class="loadWrap" style="display: flex;align-items: center;justify-content: center;width: 100%;height: 100%;"\n *ngIf="loading2">\n <nz-spin nzTip="加载中,请稍后...">\n <nz-alert nzType="info" nzMessage="课程加载中,请稍后..."></nz-alert>\n </nz-spin>\n </div>\n\n \x3c!-- 注销 --\x3e\n <nz-modal [(nzVisible)]="isVisible" nzTitle="手机号错误" (nzOnCancel)="handleCancel()" (nzOnOk)="handleOk()">\n <ng-container *nzModalContent>\n <p>手机号错误, 联系管理员核对信息</p>\n </ng-container>\n </nz-modal>\n </div>\n</div>\n',styles:[".student-login-layout{position:fixed;top:0;left:0;background:#fff;width:100%;height:100%;z-index:100;overflow:auto;background:url(https://cloud.fmode.cn/assets/bg-login.jpg) no-repeat;background-size:100% 100%}.student-login-layout .nav_center{width:800px;min-height:450px;margin:0 auto;top:50%;left:50%;transform:translate(-50%,-50%);background-size:inherit;position:absolute;padding:30px;text-align:center}.student-login-layout .nav_center .login_img{max-width:70%;max-height:100px}.student-login-layout .nav_center .nav_login{background:#ffffff1a}.student-login-layout .nav_center ::ng-deep .ant-tabs-tab-btn{font-size:22px}.student-login-layout .nav_center .ant-tabs-tab-btn{border-bottom:2px solid #1890ff}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav{height:55px}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav-list{width:100%;display:flex;justify-content:center;color:#000}.student-login-layout .nav_center ::ng-deep .ant-form-item-required{font-size:18px;font-weight:700}.student-login-layout .nav_center ::ng-deep .ng-invalid{font-size:18px}.student-login-layout .nav_center ::ng-deep .ng-valid{font-size:18px}.student-login-layout .nav_center ::ng-deep .ng-pending{font-size:18px}.student-login-layout .nav_center ::ng-deep .ant-form-item{display:flex;justify-content:center}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav:before{border:none}.student-login-layout .nav_center .nav_login{display:flex;flex-direction:inherit;align-items:center;justify-content:center;width:100%;border-radius:2px;background-color:#fff;margin:0 auto;min-height:500px}.student-login-layout .nav_center .nav_login .login-form{max-width:300px}.student-login-layout .nav_center .nav_login [nz-form]{width:440px;max-width:500px}.student-login-layout .nav_center .nav_login .login_btn{width:400px;margin:0 auto;display:flex;justify-content:center}.student-login-layout .nav_center .nav_login .login_btn button{width:85%}.student-login-layout .nav_center .nav_login .forget{margin:10px 40px 0 auto;display:flex;justify-content:flex-end}.student-login-layout .nav_center .nav_login .forget h6{font-size:14px;color:#40a9ff}.student-login-layout .nav_center .nav_login .login-form-margin{margin-bottom:16px}.student-login-layout .nav_center .nav_login .login-form-forgot{float:right}.student-login-layout .nav_center .nav_login .login-form-button{width:100%}.student-login-layout .nav_center .nav_login .nav_login_right{height:100%;flex:2;border-left:2px dashed #e5e5e5;font-size:16px;display:flex;flex-direction:column;color:#626262;align-items:center;justify-content:center}.student-login-layout .nav_center .nav_login .nav_login_right .login_right_bottom{margin:40px 0 50px}.student-login-layout .nav_center .nav_login .nav_login_right img{width:160px}.student-login-layout .nav_center .iseducation{position:absolute;top:159px;background:#fff;width:90%;flex-direction:column;line-height:50px}.student-login-layout .nav_center .iseducation .login_btn{margin-top:30px}.student-login-layout .nav_center .iseducation .close_education{width:30px;height:30px;position:absolute;top:20px;right:10px;font-size:24px;background-color:#dddddddb;border-radius:15px;line-height:28px;cursor:pointer}.student-login-layout .nav_center .loadWrap{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}@media (min-width: 960px){.nav_center{width:90%}}@media (max-width: 760px){.student-login-layout .nav_center{width:100%}.student-login-layout .nav_center ::ng-deep .ant-form-item-explain{text-align:left!important}.student-login-layout .nav_center ::ng-deep .ng-invalid{font-size:13px!important}.student-login-layout .nav_center ::ng-deep .ant-tabs-tab-btn{font-size:18px}.student-login-layout .nav_center .login_btn{width:100%!important;margin:10px auto!important}.student-login-layout .nav_center .login_btn button{width:100%!important}.student-login-layout .nav_login [nz-form]{width:100%!important;max-width:auto;padding:0 30px;display:flex;justify-content:center;flex-direction:column}.student-login-layout .ant-form-item{margin-bottom:5px}.student-login-layout ::ng-deep .ant-form-item-required{font-size:12px!important;padding-bottom:0!important}.student-login-layout .ant-form-item-label{padding:0}.student-login-layout .form-control-contain{display:flex!important;justify-content:space-between!important;flex-wrap:wrap;margin-top:10px}.student-login-layout .form-control-contain .contain_yanzm{flex:0 0 30%}.student-login-layout .form-control-contain .contain_input_yanzm{flex:0 0 40%}.student-login-layout .form-control-contain .codeText{flex:0 0 30%}.student-login-layout .form-control-contain .switch{flex:0 0 100%}.verifyCode .code_input{flex:0 0 50%}.verifyCode .codeContain{margin-left:10px;flex:0 0 45%}.verifyCode .get_code{font-size:14px!important}.forget_contain .codeInput{flex:0 0 50%}.forget_contain .getCode{margin-left:10px;flex:0 0 45%}.get_code{font-size:14px!important}.iseducation{top:110px!important}.iseducation .close_education #login_btn{width:50%!important}}@media (max-width: 460px){.form-control-contain .switch{margin-top:10px!important}}\n"],dependencies:[{kind:"directive",type:i7.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:i3.ɵNgNoValidate,selector:"form:not([ngNoForm]):not([ngNativeValidate])"},{kind:"directive",type:i3.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:i3.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i3.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:i3.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:i3.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:i8.NzInputDirective,selector:"input[nz-input],textarea[nz-input]",inputs:["nzBorderless","nzSize","nzStepperless","nzStatus","disabled"],exportAs:["nzInput"]},{kind:"component",type:i8.NzInputGroupComponent,selector:"nz-input-group",inputs:["nzAddOnBeforeIcon","nzAddOnAfterIcon","nzPrefixIcon","nzSuffixIcon","nzAddOnBefore","nzAddOnAfter","nzPrefix","nzStatus","nzSuffix","nzSize","nzSearch","nzCompact"],exportAs:["nzInputGroup"]},{kind:"directive",type:i8.NzInputGroupWhitSuffixOrPrefixDirective,selector:"nz-input-group[nzSuffix], nz-input-group[nzPrefix]"},{kind:"component",type:i9.NzButtonComponent,selector:"button[nz-button], a[nz-button]",inputs:["nzBlock","nzGhost","nzSearch","nzLoading","nzDanger","disabled","tabIndex","nzType","nzShape","nzSize"],exportAs:["nzButton"]},{kind:"directive",type:i10.ɵNzTransitionPatchDirective,selector:"[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group",inputs:["hidden"]},{kind:"directive",type:i11.NzWaveDirective,selector:'[nz-wave],button[nz-button]:not([nzType="link"]):not([nzType="text"])',inputs:["nzWaveExtraNode"],exportAs:["nzWave"]},{kind:"component",type:i12.NzModalComponent,selector:"nz-modal",inputs:["nzMask","nzMaskClosable","nzCloseOnNavigation","nzVisible","nzClosable","nzOkLoading","nzOkDisabled","nzCancelDisabled","nzCancelLoading","nzKeyboard","nzNoAnimation","nzCentered","nzDraggable","nzContent","nzFooter","nzZIndex","nzWidth","nzWrapClassName","nzClassName","nzStyle","nzTitle","nzCloseIcon","nzMaskStyle","nzBodyStyle","nzOkText","nzCancelText","nzOkType","nzOkDanger","nzIconType","nzModalType","nzAutofocus","nzOnOk","nzOnCancel"],outputs:["nzOnOk","nzOnCancel","nzAfterOpen","nzAfterClose","nzVisibleChange"],exportAs:["nzModal"]},{kind:"directive",type:i12.NzModalContentDirective,selector:"[nzModalContent]",exportAs:["nzModalContent"]},{kind:"component",type:i13.NzSpinComponent,selector:"nz-spin",inputs:["nzIndicator","nzSize","nzTip","nzDelay","nzSimple","nzSpinning"],exportAs:["nzSpin"]},{kind:"component",type:i14.NzTabSetComponent,selector:"nz-tabset",inputs:["nzSelectedIndex","nzTabPosition","nzTabBarExtraContent","nzCanDeactivate","nzAddIcon","nzTabBarStyle","nzType","nzSize","nzAnimated","nzTabBarGutter","nzHideAdd","nzCentered","nzHideAll","nzLinkRouter","nzLinkExact"],outputs:["nzSelectChange","nzSelectedIndexChange","nzTabListScroll","nzClose","nzAdd"],exportAs:["nzTabset"]},{kind:"component",type:i14.NzTabComponent,selector:"nz-tab",inputs:["nzTitle","nzClosable","nzCloseIcon","nzDisabled","nzForceRender"],outputs:["nzSelect","nzDeselect","nzClick","nzContextmenu"],exportAs:["nzTab"]},{kind:"directive",type:i15.NzColDirective,selector:"[nz-col],nz-col,nz-form-control,nz-form-label",inputs:["nzFlex","nzSpan","nzOrder","nzOffset","nzPush","nzPull","nzXs","nzSm","nzMd","nzLg","nzXl","nzXXl"],exportAs:["nzCol"]},{kind:"directive",type:i15.NzRowDirective,selector:"[nz-row],nz-row,nz-form-item",inputs:["nzAlign","nzJustify","nzGutter"],exportAs:["nzRow"]},{kind:"directive",type:i16.NzFormDirective,selector:"[nz-form]",inputs:["nzLayout","nzNoColon","nzAutoTips","nzDisableAutoTips","nzTooltipIcon","nzLabelAlign","nzLabelWrap"],exportAs:["nzForm"]},{kind:"component",type:i16.NzFormItemComponent,selector:"nz-form-item",exportAs:["nzFormItem"]},{kind:"component",type:i16.NzFormLabelComponent,selector:"nz-form-label",inputs:["nzFor","nzRequired","nzNoColon","nzTooltipTitle","nzTooltipIcon","nzLabelAlign","nzLabelWrap"],exportAs:["nzFormLabel"]},{kind:"component",type:i16.NzFormControlComponent,selector:"nz-form-control",inputs:["nzSuccessTip","nzWarningTip","nzErrorTip","nzValidatingTip","nzExtra","nzAutoTips","nzDisableAutoTips","nzHasFeedback","nzValidateStatus"],exportAs:["nzFormControl"]}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:LoginComponent,decorators:[{type:Component,args:[{selector:"app-pcuser-login",template:'<div class="student-login-layout">\n <div class="nav_center">\n <img [src]="logo" alt="" class="login_img">\n <div class="nav_login">\n <nz-tabset [nzSelectedIndex]="tabIndex" [nzTabPosition]="\'top\'">\n\n \x3c!-- 登录:手机号+密码登入 --\x3e\n <nz-tab nzTitle="手机密码" style="color: #000000;">\n <ng-container *ngIf="type == \'login\'">\n <form nz-form [formGroup]="validateForm" (ngSubmit)="submitFormMobilePassword(validateForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>手机号</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{userErrorTip}}">\n <input nz-input formControlName="mobile" placeholder="请输入手机号" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>密 码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{passwordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="password" placeholder="请输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item class="form-control-contain">\n <nz-form-label [nzSpan]="5" class="contain_yanzm" nzRequired >验证码 </nz-form-label>\n <nz-form-control [nzSpan]="6" nzErrorTip="{{codeErrorTip}}" class="contain_input_yanzm">\n <input style="font-size:14px" title="请输入验证码" nz-input type="text" formControlName="checkCode"\n placeholder="区分大小写" />\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="codeText">\n <div style=" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;">{{code}}</div>\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="switch">\n <div (click)="creatCode()"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;">\n 换一个\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class="login_btn">\n <button nz-button nzType="primary" [nzSize]="\'large\'" [disabled]="!validateForm.valid">登录</button>\n </div>\n <div class="forget">\n <h6 (click)="forget()">忘记密码</h6>\n </div>\n </form>\n </ng-container>\n <ng-container *ngIf="type == \'forget\'">\n <form nz-form [formGroup]="forgetForm" (ngSubmit)="forgetFormFun(forgetForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>登录账号</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{userErrorTip}}">\n <input nz-input formControlName="forgetusername" placeholder="请输入手机号" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>新 密 码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{passwordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="forgetPassword" placeholder="请输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>确认密码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{forgetphoneCodesErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="forgetConfirmpassword" placeholder="请再次输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item class="forget_contain">\n <nz-form-label [nzSpan]="5" nzRequired >验 证 码</nz-form-label>\n <nz-form-control [nzSpan]="8" nzHasFeedback nzErrorTip="{{phoneCodesErrorTip}}" class="codeInput">\n <input style="font-size: 18px;" nz-input type="text" formControlName="forgerphoneCode"\n placeholder="手机验证码" />\n </nz-form-control>\n <nz-form-control [nzSpan]="6" class="getCode">\n <div *ngIf="!isCountDown" (click)="getCode2()" class="get_code"\n style="background-color:#40a9ff;cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n 获取验证码\n </div>\n <div *ngIf="isCountDown"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n {{countDown}}/秒\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class="login_btn">\n <button style="width: 348px;" nz-button nzType="primary" [nzSize]="\'large\'"\n [disabled]="!forgetForm.valid">重置密码</button>\n </div>\n <div class="forget">\n <h6 (click)="backLogin()">返回登录</h6>\n </div>\n </form>\n </ng-container>\n\n </nz-tab>\n\n \x3c!-- 登录:帐号+密码登入 --\x3e\n <nz-tab nzTitle="帐号密码" style="color: #000000;">\n <ng-container *ngIf="type == \'login\'">\n <form nz-form [formGroup]="validateUserForm" (ngSubmit)="submitFormUserPassword(validateUserForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>帐 号</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{userErrorTip}}">\n <input nz-input formControlName="username" placeholder="请输入帐号" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>密 码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{passwordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="password" placeholder="请输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item class="form-control-contain">\n <nz-form-label [nzSpan]="5" class="contain_yanzm" nzRequired >验证码 </nz-form-label>\n <nz-form-control [nzSpan]="6" nzErrorTip="{{codeErrorTip}}" class="contain_input_yanzm">\n <input style="font-size:14px" title="请输入验证码" nz-input type="text" formControlName="checkCode"\n placeholder="区分大小写" />\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="codeText">\n <div style=" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;">{{code}}</div>\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="switch">\n <div (click)="creatCode()"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;">\n 换一个\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class="login_btn">\n <button nz-button nzType="primary" [nzSize]="\'large\'" [disabled]="!validateUserForm.valid">登录</button>\n </div>\n </form>\n </ng-container>\n <ng-container *ngIf="type == \'forget\'">\n <form nz-form [formGroup]="forgetForm" (ngSubmit)="forgetFormFun(forgetForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>登录账号</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{userErrorTip}}">\n <input nz-input formControlName="forgetusername" placeholder="请输入手机号" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>新 密 码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{passwordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="forgetPassword" placeholder="请输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>确认密码</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{forgetphoneCodesErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate">\n <input nz-input [type]="passwordVisible ? \'text\' : \'password\'" formControlName="forgetConfirmpassword" placeholder="请再次输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <i nz-icon [nzType]="passwordVisible ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible = !passwordVisible"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item class="forget_contain">\n <nz-form-label [nzSpan]="5" nzRequired >验 证 码</nz-form-label>\n <nz-form-control [nzSpan]="8" nzHasFeedback nzErrorTip="{{phoneCodesErrorTip}}" class="codeInput">\n <input style="font-size: 18px;" nz-input type="text" formControlName="forgerphoneCode"\n placeholder="手机验证码" />\n </nz-form-control>\n <nz-form-control [nzSpan]="6" class="getCode">\n <div *ngIf="!isCountDown" (click)="getCode2()" class="get_code"\n style="background-color:#40a9ff;cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n 获取验证码\n </div>\n <div *ngIf="isCountDown"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n {{countDown}}/秒\n </div>\n </nz-form-control>\n </nz-form-item>\n <div class="login_btn">\n <button style="width: 348px;" nz-button nzType="primary" [nzSize]="\'large\'"\n [disabled]="!forgetForm.valid">重置密码</button>\n </div>\n <div class="forget">\n <h6 (click)="backLogin()">返回登录</h6>\n </div>\n </form>\n </ng-container>\n\n </nz-tab>\n \x3c!-- 登录:手机号+验证码登入 --\x3e\n <nz-tab nzTitle="短信验证" style="color: #000000;">\n <ng-container *ngIf="type == \'login\'">\n <form nz-form [formGroup]="validateSMSForm" (ngSubmit)="submitFormMobileSMS(validateSMSForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>手 机 号</nz-form-label>\n <nz-form-control [nzSpan]="14" nzErrorTip="{{userErrorTip}}">\n <input nz-input formControlName="mobile" placeholder="请输入手机号" />\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item class="form-control-contain">\n <nz-form-label [nzSpan]="5" class="contain_yanzm" nzRequired >验证码</nz-form-label>\n <nz-form-control [nzSpan]="6" nzErrorTip="{{codeErrorTip}}" class="contain_input_yanzm">\n <input style="font-size:14px" title="请输入验证码" nz-input type="text" formControlName="checkCode"\n placeholder="区分大小写" />\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="codeText">\n <div style=" height: 100%; margin: 0 4px; text-align: center; letter-spacing: 2px;">{{code}}</div>\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="switch">\n <div (click)="creatCode()"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;">\n 换一个\n </div>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label [nzSpan]="5" nzRequired>短信码</nz-form-label>\n <nz-form-control [nzSpan]="10" nzErrorTip="{{smsCodeErrorTip}}">\n <nz-input-group>\n <input nz-input [type]="\'text\'" [disabled]="!isSended || !codeVerified" formControlName="smsCode" placeholder="请输入短信验证码" />\n </nz-input-group>\n </nz-form-control>\n <nz-form-control [nzSpan]="4" class="switch">\n <div *ngIf="!isSending" (click)="sendSMSCode()"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center;">\n 获取验证码\n </div>\n <div *ngIf="isSending"\n style="background-color:#eff5f9; color: rgb(118, 117, 117); padding: 5px; text-align: center;">\n {{smsTimeCount}}\n </div>\n </nz-form-control>\n </nz-form-item>\n \n <div class="login_btn">\n <button nz-button nzType="primary" [nzSize]="\'large\'" [disabled]="!validateSMSForm.valid">登录</button>\n </div>\n </form>\n </ng-container>\n </nz-tab>\n\n \x3c!-- 注册:企业用户Profile开通 --\x3e\n <nz-tab *ngIf="mobileLogin" nzTitle="开通" style="color: #000000;" class="activation">\n <form nz-form [formGroup]="registForm" (ngSubmit)="registSubmitForm(registForm.value)">\n <nz-form-item>\n <nz-form-label [nzSpan]="7" nzRequired>开通证件</nz-form-label>\n <nz-form-control [nzSpan]="12" nzHasFeedback nzValidatingTip="验证中..."\n nzErrorTip="{{registIdcardErrorTip}}">\n <input title="请输入身份证号码" nz-input formControlName="registIdcard" placeholder="请输入身份证号码" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="7" nzRequired>开通姓名</nz-form-label>\n <nz-form-control [nzSpan]="12" nzHasFeedback nzErrorTip="{{registNameErrorTip}}">\n <input nz-input type="text" formControlName="registName" placeholder="请输入姓名" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="7" nzRequired>绑定手机号</nz-form-label>\n <nz-form-control [nzSpan]="12" nzHasFeedback nzErrorTip="{{phoneErrorTip}}">\n <input [(ngModel)]="registPhone" nz-input style="font-size: 18px;" type="text"\n formControlName="registPhone" placeholder="请输入手机号" />\n </nz-form-control>\n </nz-form-item>\n <nz-form-item class="verifyCode">\n <nz-form-label [nzSpan]="7" nzRequired>手机验证码</nz-form-label>\n <nz-form-control [nzSpan]="6" class="code_input" nzHasFeedback nzErrorTip="{{phoneCodesErrorTip}}">\n <input style="font-size: 18px;" nz-input type="text" formControlName="phoneCode" placeholder="手机验证码" />\n </nz-form-control>\n <nz-form-control [nzSpan]="6" class="codeContain">\n <div *ngIf="!isCountDown" (click)="getCode()"\n class="get_code"\n style="background-color:#40a9ff; cursor: pointer; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n 获验证码\n </div>\n <div *ngIf="isCountDown"\n style="background-color:#40a9ff; color: #fff; padding: 5px; text-align: center; font-size: 18px;">\n {{countDown}}/秒\n </div>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="7" nzRequired>开通密码</nz-form-label>\n <nz-form-control [nzSpan]="12" nzHasFeedback nzErrorTip="{{regpasswordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate2">\n <input nz-input [type]="passwordVisible2 ? \'text\' : \'password\'" formControlName="regpassword"\n placeholder="请输入密码" />\n </nz-input-group>\n <ng-template #suffixTemplate2>\n <i nz-icon [nzType]="passwordVisible2 ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible2 = !passwordVisible2"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <nz-form-item>\n <nz-form-label [nzSpan]="7" nzRequired>确认密码</nz-form-label>\n <nz-form-control [nzSpan]="12" nzHasFeedback nzErrorTip="{{confirmPasswordErrorTip}}">\n <nz-input-group [nzSuffix]="suffixTemplate3">\n <input nz-input [type]="passwordVisible3 ? \'text\' : \'password\'" formControlName="confirmPassword"\n placeholder="请确认密码" />\n </nz-input-group>\n <ng-template #suffixTemplate3>\n <i nz-icon [nzType]="passwordVisible3 ? \'eye-invisible\' : \'eye\'"\n (click)="passwordVisible3 = !passwordVisible3"></i>\n </ng-template>\n </nz-form-control>\n </nz-form-item>\n <div class="login_btn">\n <button nz-button nzType="primary" [disabled]="!registForm.valid">申请开通</button>\n </div>\n </form>\n </nz-tab>\n </nz-tabset>\n <div class="nav_login_right">\n <p class="login_right_title">二维码</p>\n <img [src]="qrcode" alt="公众号二维码">\n <p>扫码进入微信端</p>\n \x3c!-- <p class="login_right_bottom">首次登录有惊喜</p> --\x3e\n </div>\n </div>\n\n <div class="loadWrap" style="display: flex;align-items: center;justify-content: center;width: 100%;height: 100%;"\n *ngIf="loading2">\n <nz-spin nzTip="加载中,请稍后...">\n <nz-alert nzType="info" nzMessage="课程加载中,请稍后..."></nz-alert>\n </nz-spin>\n </div>\n\n \x3c!-- 注销 --\x3e\n <nz-modal [(nzVisible)]="isVisible" nzTitle="手机号错误" (nzOnCancel)="handleCancel()" (nzOnOk)="handleOk()">\n <ng-container *nzModalContent>\n <p>手机号错误, 联系管理员核对信息</p>\n </ng-container>\n </nz-modal>\n </div>\n</div>\n',styles:[".student-login-layout{position:fixed;top:0;left:0;background:#fff;width:100%;height:100%;z-index:100;overflow:auto;background:url(https://cloud.fmode.cn/assets/bg-login.jpg) no-repeat;background-size:100% 100%}.student-login-layout .nav_center{width:800px;min-height:450px;margin:0 auto;top:50%;left:50%;transform:translate(-50%,-50%);background-size:inherit;position:absolute;padding:30px;text-align:center}.student-login-layout .nav_center .login_img{max-width:70%;max-height:100px}.student-login-layout .nav_center .nav_login{background:#ffffff1a}.student-login-layout .nav_center ::ng-deep .ant-tabs-tab-btn{font-size:22px}.student-login-layout .nav_center .ant-tabs-tab-btn{border-bottom:2px solid #1890ff}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav{height:55px}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav-list{width:100%;display:flex;justify-content:center;color:#000}.student-login-layout .nav_center ::ng-deep .ant-form-item-required{font-size:18px;font-weight:700}.student-login-layout .nav_center ::ng-deep .ng-invalid{font-size:18px}.student-login-layout .nav_center ::ng-deep .ng-valid{font-size:18px}.student-login-layout .nav_center ::ng-deep .ng-pending{font-size:18px}.student-login-layout .nav_center ::ng-deep .ant-form-item{display:flex;justify-content:center}.student-login-layout .nav_center ::ng-deep .ant-tabs-nav:before{border:none}.student-login-layout .nav_center .nav_login{display:flex;flex-direction:inherit;align-items:center;justify-content:center;width:100%;border-radius:2px;background-color:#fff;margin:0 auto;min-height:500px}.student-login-layout .nav_center .nav_login .login-form{max-width:300px}.student-login-layout .nav_center .nav_login [nz-form]{width:440px;max-width:500px}.student-login-layout .nav_center .nav_login .login_btn{width:400px;margin:0 auto;display:flex;justify-content:center}.student-login-layout .nav_center .nav_login .login_btn button{width:85%}.student-login-layout .nav_center .nav_login .forget{margin:10px 40px 0 auto;display:flex;justify-content:flex-end}.student-login-layout .nav_center .nav_login .forget h6{font-size:14px;color:#40a9ff}.student-login-layout .nav_center .nav_login .login-form-margin{margin-bottom:16px}.student-login-layout .nav_center .nav_login .login-form-forgot{float:right}.student-login-layout .nav_center .nav_login .login-form-button{width:100%}.student-login-layout .nav_center .nav_login .nav_login_right{height:100%;flex:2;border-left:2px dashed #e5e5e5;font-size:16px;display:flex;flex-direction:column;color:#626262;align-items:center;justify-content:center}.student-login-layout .nav_center .nav_login .nav_login_right .login_right_bottom{margin:40px 0 50px}.student-login-layout .nav_center .nav_login .nav_login_right img{width:160px}.student-login-layout .nav_center .iseducation{position:absolute;top:159px;background:#fff;width:90%;flex-direction:column;line-height:50px}.student-login-layout .nav_center .iseducation .login_btn{margin-top:30px}.student-login-layout .nav_center .iseducation .close_education{width:30px;height:30px;position:absolute;top:20px;right:10px;font-size:24px;background-color:#dddddddb;border-radius:15px;line-height:28px;cursor:pointer}.student-login-layout .nav_center .loadWrap{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}@media (min-width: 960px){.nav_center{width:90%}}@media (max-width: 760px){.student-login-layout .nav_center{width:100%}.student-login-layout .nav_center ::ng-deep .ant-form-item-explain{text-align:left!important}.student-login-layout .nav_center ::ng-deep .ng-invalid{font-size:13px!important}.student-login-layout .nav_center ::ng-deep .ant-tabs-tab-btn{font-size:18px}.student-login-layout .nav_center .login_btn{width:100%!important;margin:10px auto!important}.student-login-layout .nav_center .login_btn button{width:100%!important}.student-login-layout .nav_login [nz-form]{width:100%!important;max-width:auto;padding:0 30px;display:flex;justify-content:center;flex-direction:column}.student-login-layout .ant-form-item{margin-bottom:5px}.student-login-layout ::ng-deep .ant-form-item-required{font-size:12px!important;padding-bottom:0!important}.student-login-layout .ant-form-item-label{padding:0}.student-login-layout .form-control-contain{display:flex!important;justify-content:space-between!important;flex-wrap:wrap;margin-top:10px}.student-login-layout .form-control-contain .contain_yanzm{flex:0 0 30%}.student-login-layout .form-control-contain .contain_input_yanzm{flex:0 0 40%}.student-login-layout .form-control-contain .codeText{flex:0 0 30%}.student-login-layout .form-control-contain .switch{flex:0 0 100%}.verifyCode .code_input{flex:0 0 50%}.verifyCode .codeContain{margin-left:10px;flex:0 0 45%}.verifyCode .get_code{font-size:14px!important}.forget_contain .codeInput{flex:0 0 50%}.forget_contain .getCode{margin-left:10px;flex:0 0 45%}.get_code{font-size:14px!important}.iseducation{top:110px!important}.iseducation .close_education #login_btn{width:50%!important}}@media (max-width: 460px){.form-control-contain .switch{margin-top:10px!important}}\n"]}]}],ctorParameters:()=>[{type:i1.AuthService},{type:i2.NovaCloudService},{type:i3.FormBuilder},{type:i4.NzMessageService},{type:i5.Router},{type:i5.ActivatedRoute},{type:i5.ActivatedRoute},{type:i6.HttpClient}]});
|
|
9
|
+
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi91c2VyL2xvZ2luL2xvZ2luLmNvbXBvbmVudC5tanM=`
|
|
10
|
+
|