modal-step.component.js
128 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, EventEmitter, Output, ViewChild } from '@angular/core';
import { ModalDirective } from 'ngx-bootstrap';
import { AppConfigService } from '../app-config/app-config.service';
import { Request } from '../_services/request.service';
import { Common } from '../_services/common.service';
import { FormBuilder, Validators } from '@angular/forms';
import { CustomValidators } from 'ng2-validation';
import { DxDataGridComponent } from 'devextreme-angular';
import * as _ from 'lodash';
import { DateService } from '../_services/date.service';
import { UploadAttachmentComponent } from '../upload-attachment/upload-attachment.component';
import { B2bService } from '../_services/b2b.service';
class Options {
}
if (false) {
/**
* title เธเธตเนเธเนเธญเธเธเธฒเธฃเนเธชเธเธ
* @type {?}
*/
Options.prototype.title;
/**
* data
* @type {?}
*/
Options.prototype.data;
}
export class ModalStepComponent extends Options {
/**
* @param {?} appConfigService
* @param {?} request
* @param {?} formBuilder
* @param {?} common
* @param {?} date
* @param {?} b2bService
*/
constructor(appConfigService, request, formBuilder, common, date, b2bService) {
super();
this.appConfigService = appConfigService;
this.request = request;
this.formBuilder = formBuilder;
this.common = common;
this.date = date;
this.b2bService = b2bService;
this.onUpdateModal = new EventEmitter();
this.submitted = false;
this.submittedSend = false;
this.submittedRecieve = false;
this.title = '';
this.selectList = [];
this.sendList = [];
this.recieveList = [];
this.modalConfig = {
ignoreBackdropClick: true
};
this.selectedStep = null;
this.isMore = false;
this.stepData = {};
this.sendData = {};
this.recieveData = {};
this.lastStep = '';
this.isSend = false;
this.isRecieve = false;
this.isEditSend = false;
this.isEditRecieve = false;
this.tmpData = {};
this.filteredDepartments = [];
this.departmentList = [];
this.departmentUrl = "/db/ct_ext_department";
this.causeUrl = "/db/ct_dropdown";
this.causeFilter = "system_id,eq,23)$and(dropdown_type,like,เนเธฃเธทเนเธญเธเธชเนเธเธเธทเธ";
this.tempId = -1;
this.filter_ref_ext_department_id = false;
this.filter_ref_ext_department_id_show = true;
this.config = appConfigService.getConfig();
this.attachmentUrl = _.get(this.config, 'apiServers.alfresco.url') || "https://203.154.32.126:2585/api/mfec/Alfresco";
this.system_id = _.get(this.config, 'system_id');
}
/**
* @return {?}
*/
ngOnInit() {
this.th = this.common.fnLocalPCalendar('th');
this.recieveForm = this.formBuilder.group({
book_no: ['', [Validators.required]],
recv_date: [''],
});
this.sendForm = this.formBuilder.group({
send_to: [''],
book_no: [''],
send_date: [''],
is_important: [''],
});
this.registerForm = this.formBuilder.group({
name: [''],
step_id: ['', Validators.required],
step_date: [''],
remark: [''],
lastStep: [''],
moreField: this.formBuilder.array([]),
soc_recv_no: [''],
soc_recv_date: [''],
gtc_recv_no: [''],
gtc_recv_date: [''],
book_no: [''],
book_date: [''],
'for': [''],
dept_name: [''],
ministry: ['']
});
}
/**
* @param {?=} options
* @return {?}
*/
open(options) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
console.log(options);
this.stepData = {};
if (options) {
this.title = options.title || '';
this.lastStep = options.data.lastStep;
this.stepData = JSON.parse(JSON.stringify(options.data));
this.stepData.step_date = this.date.getNow();
delete this.stepData['lastStep'];
this.selectList = yield this.request.get('/db/ct_step?_where=(category_id,eq,' + options.data.category_id + ')&_sort=seq_no');
}
this.uploadAttachment.clearValue();
this.modal.show();
});
}
/**
* @return {?}
*/
f() { return this.registerForm.controls; }
/**
* @return {?}
*/
fs() { return this.sendForm.controls; }
/**
* @return {?}
*/
fr() { return this.recieveForm.controls; }
/**
* @return {?}
*/
closeModal() {
this.submitted = false;
this.selectList = [];
this.sendList = [];
this.selectedStep = null;
this.isMore = false;
this.isSend = false;
this.moreField = [];
this.stepData = {};
this.lastStep = '';
this.modal.hide();
}
/**
* @return {?}
*/
closeSendModal() {
this.submittedSend = false;
this.sendData = {};
this.isEditSend = false;
this.tmpData = {};
this.sendModal.hide();
}
/**
* @return {?}
*/
closeRecieveModal() {
this.submittedRecieve = false;
this.recieveData = {};
this.isEditRecieve = false;
this.tmpData = {};
this.recieveModal.hide();
}
/**
* @param {?} modal
* @return {?}
*/
onYesClick(modal) {
modal.hide();
}
/**
* @param {?} modal
* @return {?}
*/
onNoClick(modal) {
modal.hide();
}
/**
* @param {?} $event
* @return {?}
*/
onHidden($event) {
console.log('LOG MESSAGE: ModalConfirm -> onHidden -> $event', $event);
}
/**
* @param {?} value
* @return {?}
*/
valueSeleteMinistry(value) {
this.filter_ref_ext_department_id_show = false;
console.log('value', value);
// this.stepData.ministry_id = value && value.id ? value.id : null
if (value && value.id) {
this.stepData.dept_name = null;
this.filter_ref_ext_department_id = `&_where=(ref_ext_department_id,eq,${value.id})$and(type,in,2,3,4,5)`;
}
else {
this.filter_ref_ext_department_id = false;
}
setTimeout(() => {
this.filter_ref_ext_department_id_show = true;
}, 50);
}
/**
* @param {?} value
* @return {?}
*/
valueSeleteDeptName(value) {
console.log('value', value);
this.stepData.code_dept = value && value.id ? value.id : null;
}
/**
* @return {?}
*/
checkExtraField() {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
this.stepData.step_id = this.selectedStep.id;
this.stepData.step_name = this.selectedStep.name;
console.log(this.isMore);
this.moreField = [];
if (this.selectedStep.flag && this.selectedStep.flag !== '') {
for (let i = 0; i < this.selectedStep.flag.length; i++) {
/** @type {?} */
const flag = this.selectedStep.flag.charAt(i);
/** @type {?} */
const requireFlag = this.selectedStep.require_flag ? this.selectedStep.require_flag.charAt(i) : 0;
/** @type {?} */
const ct_step_flag = yield this.request.get('/db/ct_step_flag?_where=(flag,eq,' + flag + ')');
/** @type {?} */
const newField = ct_step_flag[0];
yield this.addField(newField, +requireFlag);
this.moreField.push(newField);
console.log(this.f);
}
this.isMore = true;
this.isSend = false;
this.isRecieve = false;
}
else {
this.isMore = false;
if (this.selectedStep.type_id === 8 || this.selectedStep.type_id === 13) {
this.departmentList = yield this.request.get('/db/ct_ext_department?_sort=name');
this.departmentList = this.departmentList.map(a => a.name);
this.isSend = true;
this.isRecieve = false;
// } else if (this.selectedStep.type_id === 9 || this.selectedStep.type_id === 14) {
// const data = await this.request.post('/sql/getLastSend', this.stepData);
// if (data.resultData && data.resultData.length > 0) {
// const ct_step_data_id = data.resultData[0].id;
// const ct_sendList = await this.request.get('/db/ct_send?_where=(ct_step_data_id,eq,' + ct_step_data_id + ')');
// for (const ct_send of ct_sendList) {
// const recvData: any = {
// ct_send_id: ct_send.id,
// send_book_no: ct_send.book_no,
// send_date: ct_send.send_date,
// recv_from: ct_send.send_to,
// name: ct_send.name
// };
// this.recieveList.push(recvData);
// }
// }
// this.isRecieve = true;
// this.isSend = false;
}
else {
this.isSend = false;
this.isRecieve = false;
}
}
});
}
/**
* @param {?} data
* @return {?}
*/
getFieldId(data) {
/** @type {?} */
let id = '';
if (data.type === 'text') {
id += 'txt';
}
else if (data.type === 'datetime') {
id += 'txt';
}
else {
id += 'txt';
}
/** @type {?} */
const field = data.field_name.charAt(0).toLocaleUpperCase() + data.field_name.substring(1);
id += field;
return id;
}
/**
* @param {?} data
* @param {?} required
* @return {?}
*/
addField(data, required) {
/** @type {?} */
let control = /** @type {?} */ (this.registerForm.controls['moreField']);
/** @type {?} */
let newgroup;
this.stepData[data.field_name] = null;
if (data.type === 'text') {
if (required) {
/** @type {?} */
const group = {};
group[data.field_name] = ['', Validators.required];
newgroup = this.formBuilder.group(group);
}
else {
/** @type {?} */
const group = {};
group[data.field_name] = [''];
newgroup = this.formBuilder.group(group);
}
}
else if (data.type === 'datetime') {
if (required) {
/** @type {?} */
const group = {};
group[data.field_name] = ['', Validators.required, CustomValidators.date];
newgroup = this.formBuilder.group(group);
}
else {
/** @type {?} */
const group = {};
group[data.field_name] = [''];
newgroup = this.formBuilder.group(group);
}
this.stepData[data.field_name] = this.date.getNow();
}
else if (data.type === 'number') {
if (required) {
/** @type {?} */
const group = {};
group[data.field_name] = [Validators.required];
newgroup = this.formBuilder.group(group);
}
else {
/** @type {?} */
const group = {};
group[data.field_name] = [''];
newgroup = this.formBuilder.group(group);
}
}
else if (data.type === 'special') {
if (data.field_name === 'amount') {
if (required) {
/** @type {?} */
const group = {};
group[data.field_name] = ['', Validators.required];
group['amount_type'] = ['', Validators.required];
newgroup = this.formBuilder.group(group);
}
else {
/** @type {?} */
const group = {};
group[data.field_name] = [''];
group['amount_type'] = [''];
newgroup = this.formBuilder.group(group);
}
}
else if (data.field_name === 'follow') {
if (required) {
/** @type {?} */
const group = {};
group[data.field_name] = ['', Validators.required];
group['follow_remark'] = ['', Validators.required];
newgroup = this.formBuilder.group(group);
}
else {
/** @type {?} */
const group = {};
group[data.field_name] = [''];
group['follow_remark'] = [''];
newgroup = this.formBuilder.group(group);
}
}
else {
if (required) {
/** @type {?} */
const group = {};
group[data.field_name] = ['', Validators.required];
newgroup = this.formBuilder.group(group);
}
else {
/** @type {?} */
const group = {};
group[data.field_name] = [''];
newgroup = this.formBuilder.group(group);
}
}
}
control.push(newgroup);
}
/**
* @param {?} i
* @param {?} field
* @param {?=} validateType
* @return {?}
*/
getValidateMoreField(i, field, validateType) {
/** @type {?} */
let formMoreField = this.f()['moreField'];
if (validateType) {
formMoreField = formMoreField.controls[i];
formMoreField = formMoreField.controls[field];
if (formMoreField.errors) {
return formMoreField.errors[validateType];
}
else {
return formMoreField.errors;
}
}
else {
return formMoreField.errors;
}
}
/**
* @param {?} data
* @return {?}
*/
getRowIndex(data) {
if (!data.data) {
return '';
}
/** @type {?} */
const no = data.row.dataIndex + 1;
return no;
}
/**
* @param {?} e
* @return {?}
*/
onCellPrepared(e) {
if (e.rowType === 'data') {
for (const i in e.component.columns) {
if (e.column.dataField === e.component.columns[i]) {
e.cellElement.accessKey = e.component.columns[i];
}
}
}
}
/**
* @return {?}
*/
addSend() {
this.sendData.send_date = this.date.getNow();
this.sendModal.show();
}
/**
* @param {?} data
* @return {?}
*/
editSend(data) {
this.tmpData = data;
this.sendData = JSON.parse(JSON.stringify(data));
// this.sendData.send_date = new Date(this.sendData.send_date);
this.isEditSend = true;
this.sendModal.show();
}
/**
* @param {?} data
* @return {?}
*/
editRecieve(data) {
this.tmpData = data;
this.recieveData = JSON.parse(JSON.stringify(data));
this.recieveData.recv_date = this.recieveData.recv_date ? new Date(this.recieveData.recv_date) : this.recieveData.recv_date;
this.isEditRecieve = true;
this.recieveModal.show();
}
/**
* @param {?} event
* @return {?}
*/
filterDepartments(event) {
this.filteredDepartments = [];
for (let i = 0; i < this.departmentList.length; i++) {
/** @type {?} */
const department = this.departmentList[i];
if (department.toLowerCase().indexOf(event.query.toLowerCase()) == 0) {
this.filteredDepartments.push(department);
}
}
}
/**
* @return {?}
*/
onSubmit() {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
this.submitted = true;
// เธเนเธฒ form เนเธกเนเธเธฃเธเธซเธฃเธทเธญเธเธดเธเธเธฒเธกเนเธเธทเนเธญเธเนเธเธเธตเนเธเธฑเนเธเนเธงเนเธเธฐเธเธเธเธตเนเธเธฃเธเธเธตเน
console.log('this.registerForm.invalid: ', this.registerForm.invalid);
if (this.registerForm.invalid) {
return;
}
/** @type {?} */
let postData = [];
/** @type {?} */
let data = _.cloneDeep(this.stepData);
data.action = "add";
/** @type {?} */
let userData = this.b2bService.getVerifyToken();
data.username = userData.username;
if (data.remind_date)
data.remind_date = this.date.getNow().add(data.remind_date, 'd').toDate();
delete data["ct_main_id"];
delete data["update_date"];
/** @type {?} */
let main = {
"ct_step_data": [data]
};
postData.push(main);
if (this.sendList && this.sendList.length > 0) {
/** @type {?} */
let ct_send = {
"ct_send": []
};
/** @type {?} */
let ct_recieve = {
"ct_recieve": []
};
for (let data of this.sendList) {
data.name = data.name;
data.action = "add";
delete data.id;
ct_send.ct_send.push(data);
}
postData.push(ct_send);
}
if (this.recieveList && this.recieveList.length > 0) {
/** @type {?} */
let ct_recieve = {
"ct_recieve": []
};
for (let data of this.recieveList) {
delete data['send_book_no'];
delete data['send_date'];
data.name = data.name;
data.action = "add";
ct_recieve.ct_recieve.push(data);
}
postData.push(ct_recieve);
}
console.log('postData', postData);
/** @type {?} */
let postResponse = yield this.request.post("/ct/main", postData);
if (this.stepData.update_date) {
/** @type {?} */
let stepList = yield this.getStepList();
console.log("stepList", stepList);
if (stepList.length > 0) {
yield this.request.put("/db/" + this.stepData.ref_table + "/" + this.stepData.ref_id, { status: stepList[0].step_name, status_date: stepList[0].step_date });
this.common.fnCheckResponse(postResponse, this.myModal);
}
}
else {
yield this.request.put("/db/" + this.stepData.ref_table + "/" + this.stepData.ref_id, { status: this.stepData.step_name });
this.common.fnCheckResponse(postResponse, this.myModal);
}
// }else{
// this.onCreateModal.emit(postData);
// }
});
}
/**
* @return {?}
*/
getStepList() {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
console.log('getStepList');
/** @type {?} */
let filter = {
filter: {
ref_table: "=" + this.stepData.ref_table,
ref_id: this.stepData.ref_id,
system_id: this.stepData.system_id
},
order_by: ["step_date desc"]
};
/** @type {?} */
const data = yield this.request.post('/search/ct_step_data', filter);
return data.resultData || [];
});
}
/**
* @return {?}
*/
onClickBack() {
this.onUpdateModal.emit();
this.closeModal();
}
/**
* @return {?}
*/
onSubmitSend() {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
this.submittedSend = true;
// เธเนเธฒ form เนเธกเนเธเธฃเธเธซเธฃเธทเธญเธเธดเธเธเธฒเธกเนเธเธทเนเธญเธเนเธเธเธตเนเธเธฑเนเธเนเธงเนเธเธฐเธเธเธเธตเนเธเธฃเธเธเธตเน
if (this.sendForm.invalid) {
return;
}
if (this.isEditSend) {
/** @type {?} */
const tmpList = [];
for (const tmpSend of this.sendList) {
if (tmpSend.id === this.tmpData.id) {
tmpList.push(this.sendData);
}
else {
tmpList.push(tmpSend);
}
}
this.sendList = tmpList;
}
else {
this.sendData.id = this.tempId;
this.tempId--;
this.sendList.push(this.sendData);
}
this.closeSendModal();
});
}
/**
* @return {?}
*/
onSubmitRecieve() {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
this.submittedSend = true;
// เธเนเธฒ form เนเธกเนเธเธฃเธเธซเธฃเธทเธญเธเธดเธเธเธฒเธกเนเธเธทเนเธญเธเนเธเธเธตเนเธเธฑเนเธเนเธงเนเธเธฐเธเธเธเธตเนเธเธฃเธเธเธตเน
if (this.recieveForm.invalid) {
return;
}
if (this.isEditRecieve) {
/** @type {?} */
const tmpList = [];
for (const tmpSend of this.recieveList) {
if (tmpSend.recv_from === this.tmpData.recv_from) {
tmpList.push(this.recieveData);
}
else {
tmpList.push(tmpSend);
}
}
this.recieveList = tmpList;
}
else {
this.recieveList.push(this.recieveData);
}
this.closeRecieveModal();
});
}
/**
* @param {?} data
* @return {?}
*/
isImportant(data) {
return data.is_important ? "เธชเธณเธเธฑเธ" : "";
}
/**
* @param {?} data
* @return {?}
*/
onUploaded(data) {
this.stepData.url = this.attachmentUrl + '/' + data.uuid;
this.stepData.uuid = data.uuid;
}
/**
* @param {?} field
* @return {?}
*/
checkDisable(field) {
if (this.stepData[field.field_name] !== 'เนเธกเนเธเธฒเธเธเธฒเธฃ') {
return true;
}
else {
return false;
}
}
/**
* @param {?} data
* @return {?}
*/
getImageLink(data) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
/** @type {?} */
let url = yield this.request.getAttachmentLinkToken(data.url);
return url;
});
}
}
ModalStepComponent.decorators = [
{ type: Component, args: [{
selector: 'modal-step',
template: "<div class=\"modal fade\" bsModal #modal=\"bs-modal\" [config]=\"{backdrop: 'static'}\"\n tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"dialog-static-name1\">\n <div class=\"modal-dialog modal-lg\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h4 id=\"dialog-static-name\" class=\"modal-title pull-left\"><label>{{title}}</label></h4>\n <button type=\"button\" class=\"close pull-right\" aria-label=\"Close\" (click)=\"closeModal()\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"row\">\n <div class=\"col-lg-12\">\n <form class=\"m-form m-form--state m-form--fit m-form--label-align-right\" [formGroup]=\"registerForm\" (ngSubmit)=\"onSubmit()\">\n <div class=\"m-portlet__body\">\n\n <!-- \u0E2A\u0E16\u0E32\u0E19\u0E30\u0E25\u0E48\u0E32\u0E2A\u0E38\u0E14 -->\n <div class=\"row\">\n <!--<div class=\"col-sm-3\">-->\n <!--<span>\u0E2A\u0E16\u0E32\u0E19\u0E30\u0E1B\u0E31\u0E08\u0E08\u0E38\u0E1A\u0E31\u0E19 :</span>-->\n <!--</div>-->\n <div class=\"col-sm-6\">\n <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && f().lastStep.errors }\">\n <label class=\"control-label\">\u0E2A\u0E16\u0E32\u0E19\u0E30\u0E1B\u0E31\u0E08\u0E08\u0E38\u0E1A\u0E31\u0E19</label>\n <input type=\"text\" formControlName=\"lastStep\" class=\"form-control m-input\" id=\"txtLastStatus\" [(ngModel)]=\"lastStep\" disabled>\n </div>\n </div>\n <div class=\"col-sm-6\">\n <!--<select id=\"selNewStatus\" style=\"width: 100%\">-->\n <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && f().step_id.errors }\">\n <label class=\"control-label\">\u0E2A\u0E16\u0E32\u0E19\u0E30\u0E43\u0E2B\u0E21\u0E48<span class=\"color-red\"> *</span></label>\n <select id=\"selNewStatus\" class=\"form-control\" style=\"width: 100%\" [(ngModel)]=\"selectedStep\" formControlName=\"step_id\" (change)=\"checkExtraField()\">\n <option value=\"null\">\u0E01\u0E23\u0E38\u0E13\u0E32\u0E40\u0E25\u0E37\u0E2D\u0E01\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23</option>\n <option *ngFor=\"let step of selectList\" [ngValue]=\"step\">{{step.name}}</option>\n </select>\n <!-- <div *ngIf=\"submitted && f().step_id.errors\" class=\"invalid-feedback\">\n <div *ngIf=\"f().step_id.errors.required\"><font color=\"red\"> * \u0E01\u0E23\u0E38\u0E13\u0E32\u0E01\u0E23\u0E2D\u0E01</font></div>\n </div> -->\n </div>\n </div>\n </div>\n <br>\n <!--<div class=\"row\">-->\n <!-- \u0E2A\u0E16\u0E32\u0E19\u0E30\u0E43\u0E2B\u0E21\u0E48 -->\n <!--<div class=\"col-sm-3\">-->\n <!--<span>\u0E2A\u0E16\u0E32\u0E19\u0E30\u0E43\u0E2B\u0E21\u0E48 :</span>-->\n <!--</div>-->\n <!--</div>-->\n <!--<br>-->\n <div class=\"row\">\n <!-- \u0E27\u0E31\u0E19\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23 -->\n <!--<div class=\"col-sm-3\">-->\n <!--<span>\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23 :</span>-->\n <!--</div>-->\n <div class=\"col-sm-6\">\n <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && f().step_date.errors }\">\n <label class=\"control-label\" *ngIf=\"stepData.system_id === 161\">\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48</label>\n <label class=\"control-label\" *ngIf=\"stepData.system_id !== 161\">\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23</label>\n <soc-date-box [id]=\"'txtDate'\" [(value)]=\"stepData.step_date\"></soc-date-box>\n <div *ngIf=\"submitted && f().step_date.errors\" >\n <div *ngIf=\"f().step_date.errors.required\" class=\"lable-error\">Date is required</div>\n <div *ngIf=\"f().step_date.errors.date\" class=\"lable-error\">Date is invalid</div>\n </div>\n </div>\n </div>\n </div>\n <br>\n \n \n \n <!--<div class=\"row\" *ngIf=\"stepData.system_id === 23\">-->\n <!-- \u0E27\u0E31\u0E19\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23 -->\n <!--<div class=\"col-sm-3\">-->\n <!--<span>\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23 :</span>-->\n <!--</div>-->\n <!-- <div class=\"col-sm-6\">-->\n <!-- <label class=\"control-label\">\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E2B\u0E19\u0E31\u0E07\u0E2A\u0E37\u0E2D</label>-->\n <!-- <input type=\"text\" class=\"form-control m-input\" id=\"book_no\" [(ngModel)]=\"stepData.book_no\"-->\n <!-- formControlName=\"book_no\">-->\n <!-- </div>-->\n <!-- <div class=\"col-sm-6\">-->\n <!-- <label class=\"control-label\">\u0E25\u0E07\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48</label>-->\n <!-- <soc-date-box [id]=\"'book_date'\" [(value)]=\"stepData.book_date\" formControlName=\"book_date\"></soc-date-box>-->\n <!-- <input type=\"text\" class=\"form-control m-input\" id=\"book_date\" [(ngModel)]=\"stepData.book_date\"-->\n <!-- formControlName=\"book_date\"> -->\n <!-- </div>-->\n\n <!--</div>-->\n <!--<br>-->\n <!--<div class=\"row\" *ngIf=\"stepData.system_id === 23\">-->\n <!-- \u0E27\u0E31\u0E19\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23 -->\n <!--<div class=\"col-sm-3\">-->\n <!--<span>\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23 :</span>-->\n <!--</div>-->\n <!-- <div class=\"col-sm-6\">-->\n <!-- <label class=\"control-label\">\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A \u0E2A\u0E25\u0E04.</label>-->\n <!-- <input type=\"text\" class=\"form-control m-input\" id=\"soc_recv_no\" formControlName=\"soc_recv_no\" [(ngModel)]=\"stepData.soc_recv_no\">-->\n <!-- </div>-->\n <!-- <div class=\"col-sm-6\">-->\n <!-- <label class=\"control-label\">\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A \u0E2A\u0E25\u0E04.</label>-->\n <!-- <soc-date-box [id]=\"'soc_recv_date'\" [(value)]=\"stepData.soc_recv_date\" formControlName=\"soc_recv_date\"></soc-date-box>-->\n <!-- </div>-->\n <!--</div>-->\n <!--<br>-->\n <!--<div class=\"row\" *ngIf=\"stepData.system_id === 23\">-->\n <!-- \u0E27\u0E31\u0E19\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23 -->\n <!--<div class=\"col-sm-3\">-->\n <!--<span>\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23 :</span>-->\n <!--</div>-->\n <!-- <div class=\"col-sm-6\">-->\n <!-- <label class=\"control-label\">\u0E2B\u0E19\u0E48\u0E27\u0E22\u0E07\u0E32\u0E19\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A-\u0E2A\u0E48\u0E07</label>-->\n <!-- <input type=\"text\" class=\"form-control m-input\" id=\"dept_name\" [(ngModel)]=\"stepData.dept_name\" formControlName=\"dept_name\">-->\n <!-- </div>-->\n <!--</div>-->\n <!--<br>-->\n \n \n \n <div class=\"row\" *ngIf=\"stepData.system_id === 23\">\n <div class=\"col-sm-6\">\n <label class=\"control-label\">\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A \u0E2A\u0E25\u0E04.</label>\n <input type=\"text\" class=\"form-control m-input\" id=\"soc_recv_no\" formControlName=\"soc_recv_no\" [(ngModel)]=\"stepData.soc_recv_no\">\n </div>\n <div class=\"col-sm-6\">\n <label class=\"control-label\">\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A \u0E2A\u0E25\u0E04.</label>\n <soc-date-box [id]=\"'soc_recv_date'\" [(value)]=\"stepData.soc_recv_date\" formControlName=\"soc_recv_date\"></soc-date-box>\n </div>\n </div>\n <br>\n <div class=\"row\" *ngIf=\"stepData.system_id === 23\">\n <div class=\"col-sm-6\">\n <label class=\"control-label\">\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A \u0E01\u0E2D\u0E04.</label>\n <input type=\"text\" class=\"form-control m-input\" id=\"gtc_recv_no\" [(ngModel)]=\"stepData.gtc_recv_no\" formControlName=\"gtc_recv_no\">\n </div>\n <div class=\"col-sm-6\">\n <label class=\"control-label\">\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A \u0E01\u0E2D\u0E04.</label>\n <soc-date-box [id]=\"'gtc_recv_date'\" [(value)]=\"stepData.gtc_recv_date\" formControlName=\"gtc_recv_date\"></soc-date-box>\n </div>\n </div>\n <br>\n <div class=\"row\" *ngIf=\"stepData.system_id === 23\">\n <div class=\"col-sm-6\">\n <label class=\"control-label\">\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E2B\u0E19\u0E31\u0E07\u0E2A\u0E37\u0E2D</label>\n <input type=\"text\" class=\"form-control m-input\" id=\"book_no\" [(ngModel)]=\"stepData.book_no\"\n formControlName=\"book_no\">\n </div>\n <div class=\"col-sm-6\">\n <label class=\"control-label\">\u0E25\u0E07\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48</label>\n <soc-date-box [id]=\"'book_date'\" [(value)]=\"stepData.book_date\" formControlName=\"book_date\"></soc-date-box>\n <!-- <input type=\"text\" class=\"form-control m-input\" id=\"book_date\" [(ngModel)]=\"stepData.book_date\"\n formControlName=\"book_date\"> -->\n </div>\n </div>\n <br>\n <div class=\"row\" *ngIf=\"stepData.system_id === 23\">\n <div class=\"col-sm-6\">\n <label class=\"control-label\">\u0E40\u0E23\u0E35\u0E22\u0E19</label>\n <input type=\"text\" class=\"form-control m-input\" id=\"for\" [(ngModel)]=\"stepData.for\" formControlName=\"for\">\n </div>\n\n </div>\n <br>\n <div class=\"row\" *ngIf=\"stepData.system_id === 23\">\n <div class=\"col-sm-6\">\n <label class=\"control-label\">\u0E01\u0E23\u0E30\u0E17\u0E23\u0E27\u0E07</label>\n <soc-auto-complete-2 [id]=\"'ministry'\" mode=\"local\"\n [api]=\"'/db/ct_ext_department'\" [acceptCustomValue]=\"false\" field=\"name\" fieldApi=\"id,name,code,type\"\n [filter]=\"'&_where=(type,in,1,9)'\" (valueSelete)=\"valueSeleteMinistry($event)\"\n [(value)]=\"stepData.ministry\" [(ngModel)]=\"stepData.ministry\"\n formControlName=\"ministry\">\n </soc-auto-complete-2>\n </div>\n <div class=\"col-sm-6\">\n <label class=\"control-label\">\u0E01\u0E23\u0E21</label>\n <div *ngIf=\"filter_ref_ext_department_id_show\">\n <soc-auto-complete-2 [acceptCustomValue]=\"false\" [id]=\"'dept_name'\"\n mode=\"local\" [filter]=\"filter_ref_ext_department_id\"\n [api]=\"'/db/ct_ext_department'\" field=\"name\"\n fieldApi=\"id,name,code,type\" [(value)]=\"stepData.dept_name\" (valueSelete)=\"valueSeleteDeptName($event)\"\n [(ngModel)]=\"stepData.dept_name\" [disabled]=\"!filter_ref_ext_department_id\"\n formControlName=\"dept_name\">\n </soc-auto-complete-2>\n </div>\n </div>\n\n </div>\n <br>\n \n <!-- \u0E2B\u0E21\u0E32\u0E22\u0E40\u0E2B\u0E15\u0E38 -->\n <div class=\"row\">\n <!--<div class=\"col-sm-3\">-->\n <!--<span>\u0E2B\u0E21\u0E32\u0E22\u0E40\u0E2B\u0E15\u0E38 :</span>-->\n <!--</div>-->\n <div class=\"col-sm-12\">\n <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && f().remark.errors }\">\n <label class=\"control-label\">\u0E2B\u0E21\u0E32\u0E22\u0E40\u0E2B\u0E15\u0E38</label>\n <textarea class=\"form-control m-input\" id=\"txtRemark\" rows=\"5\" formControlName=\"remark\" [(ngModel)]=\"stepData.remark\"></textarea>\n </div>\n </div>\n </div>\n <br>\n <!-- \u0E40\u0E2D\u0E01\u0E2A\u0E32\u0E23\u0E41\u0E19\u0E1A -->\n <div class=\"row\">\n <!--<div class=\"col-sm-3\">-->\n <!--<span>\u0E40\u0E2D\u0E01\u0E2A\u0E32\u0E23\u0E41\u0E19\u0E1A :</span>-->\n <!--</div>-->\n <div class=\"col-sm-12\">\n <label class=\"control-label\">\u0E40\u0E2D\u0E01\u0E2A\u0E32\u0E23\u0E41\u0E19\u0E1A</label>\n <upload-attachment #uploadAttachment [systemId]=\"stepData.system_id\" (uploaded)=\"onUploaded($event)\"></upload-attachment>\n <!--<dx-tab-panel-->\n <!--#tabPanel-->\n <!--[items]=\"upLoadType\"-->\n <!--[selectedIndex]=\"0\"-->\n <!--[loop]=\"false\"-->\n <!--[animationEnabled]=\"false\"-->\n <!--[swipeEnabled]=\"false\"-->\n <!--itemTemplate=\"itemTemplate\"-->\n <!-->-->\n <!--<!–<div *dxTemplate=\"let type of upLoadType\">–>-->\n <!--<!–<span>{{type.name.toUpperCase()}}</span>–>-->\n <!--<!–</div>–>-->\n <!--<div *dxTemplate=\"let item of 'itemTemplate'\">-->\n <!--<div class=\"tabpanel-item\">-->\n <!--<div *ngIf=\"item.type === 1\">-->\n <!--<div class=\"col-sm-10\" style=\"text-align: center\">-->\n <!--<dx-file-uploader selectButtonText=\"\u0E40\u0E25\u0E37\u0E2D\u0E01\u0E44\u0E1F\u0E25\u0E4C\" labelText=\"\" accept=\"*\" uploadMode=\"useForm\" uploadMethod=\"POST\"-->\n <!--multiple=\"true\" uploadMode=\"instantly\" labelText=\"\u0E2B\u0E23\u0E37\u0E2D\u0E27\u0E32\u0E07\u0E44\u0E1F\u0E25\u0E4C\u0E17\u0E35\u0E48\u0E19\u0E35\u0E48\" uploadUrl=\"https://filemanager-dot-smartrms-api.appspot.com/api/http/upload\"-->\n <!-->-->\n <!--</dx-file-uploader>-->\n <!--</div>-->\n <!--</div>-->\n <!--</div>-->\n <!--</div>-->\n <!--</dx-tab-panel>-->\n </div>\n </div>\n <br>\n <!-- field \u0E40\u0E1E\u0E34\u0E48\u0E21\u0E40\u0E15\u0E34\u0E21 -->\n <div *ngIf=\"isMore\">\n <div formArrayName=\"moreField\">\n <div *ngFor=\"let field of moreField; let i=index\">\n <div [formGroupName]=\"i\">\n <div class=\"row\">\n <!--<div class=\"col-sm-3\">-->\n <!--<span>field.display_name :</span>-->\n <!--</div>-->\n <!-- field \u0E40\u0E1E\u0E34\u0E48\u0E21\u0E40\u0E15\u0E34\u0E21 type text -->\n <div *ngIf=\"field.type === 'text'\">\n <div class=\"col-sm-12\">\n <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && getValidateMoreField(i,field.field_name) }\">\n <label class=\"control-label\">{{field.display_name}}</label>\n <input type=\"text\" class=\"form-control m-input\" [id]=\"getFieldId(field)\" [formControlName]=\"field.field_name\" [(ngModel)]=\"stepData[field.field_name]\">\n <div *ngIf=\"submitted && getValidateMoreField(i,field.field_name)\" class=\"invalid-feedback\">\n <div *ngIf=\"getValidateMoreField(i,field.field_name,'required')\"><font color=\"red\"> * \u0E01\u0E23\u0E38\u0E13\u0E32\u0E01\u0E23\u0E2D\u0E01</font></div>\n </div>\n </div>\n </div>\n </div>\n <!-- field \u0E40\u0E1E\u0E34\u0E48\u0E21\u0E40\u0E15\u0E34\u0E21 type datetime -->\n <div *ngIf=\"field.type === 'datetime'\">\n\n <div class=\"col-sm-6\">\n <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && getValidateMoreField(i,field.field_name) }\">\n <label class=\"control-label\">{{field.display_name}}</label>\n <soc-date-box [id]=\"getFieldId(field)\" [(value)]=\"stepData[field.field_name]\"></soc-date-box>\n <!--<div *ngIf=\"getValidateMoreField(i,field.field_name,'required')\" class=\"lable-error\">Date is required</div>-->\n <!--<div *ngIf=\"getValidateMoreField(i,field.field_name,'date')\" class=\"lable-error\">Date is invalid</div>-->\n </div>\n </div>\n </div>\n <div *ngIf=\"field.type === 'number'\">\n <div class=\"col-sm-4\">\n <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && getValidateMoreField(i,field.field_name) }\">\n <label class=\"control-label\">{{field.display_name}}</label>\n <div class=\"input-group\">\n <input type=\"number\" class=\"form-control m-input\" [id]=\"getFieldId(field)\" [formControlName]=\"field.field_name\" [(ngModel)]=\"stepData[field.field_name]\">\n <div *ngIf=\"field.field_name === 'remind_date'\" class=\"input-group-addon\"><span>\u0E27\u0E31\u0E19</span></div>\n </div>\n <div *ngIf=\"submitted && getValidateMoreField(i,field.field_name)\" class=\"invalid-feedback\">\n <div *ngIf=\"getValidateMoreField(i,field.field_name,'required')\"><font color=\"red\"> * \u0E01\u0E23\u0E38\u0E13\u0E32\u0E01\u0E23\u0E2D\u0E01</font></div>\n </div>\n </div>\n </div>\n <!--<div class=\"col-sm-2\" *ngIf=\"field.field_name === 'remind_date'\">-->\n <!--<span>\u0E27\u0E31\u0E19</span>-->\n <!--</div>-->\n </div>\n <div *ngIf=\"field.type === 'special'\">\n <div *ngIf=\"field.field_name === 'term'\">\n\n </div>\n <div *ngIf=\"field.field_name === 'amount'\">\n <div class=\"col-sm-6\">\n <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && getValidateMoreField(i,field.field_name) }\">\n <label class=\"control-label\">{{field.display_name}}</label>\n <input type=\"number\" class=\"form-control m-input\" [id]=\"getFieldId(field)\" [formControlName]=\"field.field_name\" [(ngModel)]=\"stepData[field.field_name]\">\n <div *ngIf=\"submitted && getValidateMoreField(i,field.field_name)\" class=\"invalid-feedback\">\n <div *ngIf=\"getValidateMoreField(i,field.field_name,'required')\"><font color=\"red\"> * \u0E01\u0E23\u0E38\u0E13\u0E32\u0E01\u0E23\u0E2D\u0E01</font></div>\n </div>\n </div>\n </div>\n <div class=\"col-sm-6\">\n <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && getValidateMoreField(i,'amount_type') }\">\n <div class=\"m-radio-inline\">\n <label class=\"m-radio\">\n <input type=\"radio\" id=\"rdlAmountType1\" name=\"amount_type\" value=\"0\" [formControlName]=\"'amount_type'\" [(ngModel)]=\"stepData['amount_type']\" checked>\n \u0E19\u0E31\u0E1A\u0E41\u0E15\u0E48<span></span>\n </label>\n <label class=\"m-radio\">\n <input type=\"radio\" id=\"rdlAmountType2\" name=\"amount_type\" value=\"1\" [formControlName]=\"'amount_type'\" [(ngModel)]=\"stepData['amount_type']\">\n \u0E19\u0E31\u0E1A\u0E16\u0E31\u0E14<span></span>\n </label>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"field.field_name === 'follow'\">\n <div class=\"col-sm-6\">\n <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && getValidateMoreField(i,'amount_type') }\">\n <label class=\"control-label\">{{field.display_name}}</label>\n <div class=\"m-radio-inline\">\n <label class=\"m-radio\">\n <input type=\"radio\" [id]=\"getFieldId(field) + '1'\" [name]=\"field.field_name\" value=\"\u0E17\u0E32\u0E07\u0E01\u0E32\u0E23\" [formControlName]=\"field.field_name\" [(ngModel)]=\"stepData[field.field_name]\" checked>\n \u0E17\u0E32\u0E07\u0E01\u0E32\u0E23<span></span>\n </label>\n <label class=\"m-radio\">\n <input type=\"radio\" [id]=\"getFieldId(field) + '2'\" [name]=\"field.field_name\" value=\"\u0E44\u0E21\u0E48\u0E17\u0E32\u0E07\u0E01\u0E32\u0E23\" [formControlName]=\"field.field_name\" [(ngModel)]=\"stepData[field.field_name]\">\n \u0E44\u0E21\u0E48\u0E17\u0E32\u0E07\u0E01\u0E32\u0E23<span></span>\n </label>\n </div>\n </div>\n </div>\n <!--<div class=\"col-sm-3\">-->\n <!--<span>\u0E2B\u0E21\u0E32\u0E22\u0E40\u0E2B\u0E15\u0E38 :</span>-->\n <!--</div>-->\n <div class=\"col-sm-6\">\n <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && getValidateMoreField(i,'follow_remark') }\">\n <label class=\"control-label\">\u0E2B\u0E21\u0E32\u0E22\u0E40\u0E2B\u0E15\u0E38</label>\n <input type=\"text\" class=\"form-control m-input\" id=\"txtFollowRemark\" [formControlName]=\"'follow_remark'\" [(ngModel)]=\"stepData['follow_remark']\" [disableControl]=\"checkDisable(field)\">\n <!--<div *ngIf=\"submitted && getValidateMoreField(i,'follow_remark')\" class=\"invalid-feedback\">-->\n <!--<div *ngIf=\"getValidateMoreField(i,'follow_remark','required')\">First Name is required</div>-->\n <!--</div>-->\n </div>\n </div>\n </div>\n <div *ngIf=\"field.field_name === 'cause'\">\n <div class=\"col-sm-6\">\n <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && getValidateMoreField(i,field.field_name) }\">\n <label class=\"control-label\">{{field.display_name}}</label>\n <soc-auto-complete id=\"'txtCause'\" mode=\"local\" [orderBy]=\"'name'\" [filter]=\"causeFilter\"\n [api]=\"causeUrl\" field=\"name\" [(value)]=\"stepData['cause']\"></soc-auto-complete>\n <div *ngIf=\"submitted && getValidateMoreField(i,field.field_name)\" class=\"invalid-feedback\">\n <div *ngIf=\"getValidateMoreField(i,field.field_name,'required')\"><font color=\"red\"> * \u0E01\u0E23\u0E38\u0E13\u0E32\u0E01\u0E23\u0E2D\u0E01</font></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <br>\n </div>\n </div>\n <div *ngIf=\"isSend\">\n <div class=\"row\">\n <div class=\"col-sm-3\">\n <span>\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E2A\u0E48\u0E07 :</span>\n </div>\n <div class=\"col-sm-9\">\n <!--<a id=\"btnSendAdd\" (click)=\"sendModal.show()\" class=\"btn btn-default btn-sm icon\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"Add\"><i class=\"fal fa-plus\"></i></a>-->\n <a id=\"btnSendAdd\" class=\"btn btn-default btn-md btn-md-search\" (click)=\"addSend()\">\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E2A\u0E48\u0E07</a>\n </div>\n </div>\n <br>\n <dx-data-grid #dxDataGridStepSendList class=\"card-list-table\"\n id=\"gridStepSendList\" noDataText=\"\"\n (onCellPrepared)=\"onCellPrepared($event)\" [dataSource]=\"sendList\"\n [wordWrapEnabled]=\"true\"\n [showBorders]=\"true\">\n <dxi-column caption=\"\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E17\u0E35\u0E48\" [allowSorting]=\"false\" cellTemplate=\"cellTemplate\" alignment=\"center\"></dxi-column>\n <dxi-column caption=\"\u0E08\u0E31\u0E14\u0E01\u0E32\u0E23\" [allowSorting]=\"false\" cellTemplate=\"cellTemplateAction\" alignment=\"center\"></dxi-column>\n <dxi-column dataField=\"send_to\" caption=\"\u0E2B\u0E19\u0E48\u0E27\u0E22\u0E07\u0E32\u0E19\"></dxi-column>\n <dxi-column dataField=\"book_no\" caption=\"\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E2B\u0E19\u0E31\u0E07\u0E2A\u0E37\u0E2D\u0E2A\u0E48\u0E07\u0E2D\u0E2D\u0E01\"></dxi-column>\n <dxi-column dataField=\"send_date\" caption=\"\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E2A\u0E48\u0E07\u0E2D\u0E2D\u0E01\" dataType=\"date\" alignment=\"center\"></dxi-column>\n <dxi-column [calculateCellValue]=\"isImportant\" caption=\"\u0E04\u0E27\u0E32\u0E21\u0E2A\u0E33\u0E04\u0E31\u0E0D\"></dxi-column>\n <div *dxTemplate=\"let data of 'cellTemplate'\">\n {{getRowIndex(data)}}\n </div>\n <div *dxTemplate=\"let data of 'cellTemplateAction'\">\n <a id=\"btnEditSend\" (click)=\"editSend(data.data)\" class=\"btn btn-default btn-sm icon\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"\u0E41\u0E01\u0E49\u0E44\u0E02\"><i class=\"fal fa-pencil-alt\"></i></a>\n </div>\n </dx-data-grid>\n <br>\n </div>\n <div *ngIf=\"isRecieve\">\n <div class=\"row\">\n <div class=\"col-sm-3\">\n <span>\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E23\u0E31\u0E1A :</span>\n </div>\n <div class=\"col-sm-9\">\n <!--<a id=\"btnSendAdd\" (click)=\"sendModal.show()\" class=\"btn btn-default btn-sm icon\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"Add\"><i class=\"fal fa-plus\"></i></a>-->\n <a id=\"btnRecieveAdd\" class=\"btn btn-default btn-md btn-md-search\" (click)=\"recieveModal.show()\">\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E23\u0E31\u0E1A</a>\n </div>\n </div>\n <br>\n <dx-data-grid #dxDataGridStepRecieveList class=\"card-list-table\"\n id=\"gridStepRecieveList\" noDataText=\"\"\n (onCellPrepared)=\"onCellPrepared($event)\" [dataSource]=\"recieveList\"\n [wordWrapEnabled]=\"true\"\n [showBorders]=\"true\">\n <dxi-column caption=\"\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E17\u0E35\u0E48\" [allowSorting]=\"false\" cellTemplate=\"cellTemplate\"></dxi-column>\n <dxi-column caption=\"\u0E08\u0E31\u0E14\u0E01\u0E32\u0E23\" [allowSorting]=\"false\" cellTemplate=\"cellTemplateAction\"></dxi-column>\n <dxi-column dataField=\"recv_from\" caption=\"\u0E2B\u0E19\u0E48\u0E27\u0E22\u0E07\u0E32\u0E19\"></dxi-column>\n <dxi-column dataField=\"send_book_no\" caption=\"\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E2B\u0E19\u0E31\u0E07\u0E2A\u0E37\u0E2D\u0E2A\u0E48\u0E07\u0E2D\u0E2D\u0E01\"></dxi-column>\n <dxi-column dataField=\"send_date\" caption=\"\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E2A\u0E48\u0E07\u0E2D\u0E2D\u0E01\" dataType=\"date\"></dxi-column>\n <dxi-column dataField=\"book_no\" caption=\"\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A\u0E2B\u0E19\u0E31\u0E07\u0E2A\u0E37\u0E2D\"></dxi-column>\n <dxi-column dataField=\"recv_date\" caption=\"\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A\" dataType=\"date\"></dxi-column>\n <div *dxTemplate=\"let data of 'cellTemplate'\">\n {{getRowIndex(data)}}\n </div>\n <div *dxTemplate=\"let data of 'cellTemplateAction'\">\n <a id=\"btnEditRecieve\" (click)=\"editRecieve(data.data)\" class=\"btn btn-default btn-sm icon\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"\u0E41\u0E01\u0E49\u0E44\u0E02\"><i class=\"fal fa-pencil-alt\"></i></a>\n </div>\n </dx-data-grid>\n <br>\n </div>\n </div>\n <div class=\"m-portlet__foot m-portlet__foot--fit text-right\">\n <div class=\"m-form__actions\">\n <button type=\"submit\" class=\"btn btn-success btn-md btn-md-save\">\n \u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\n </button>\n <button type=\"reset\" class=\"btn btn-default btn-md btn-md-search\" (click)=\"closeModal()\">\n \u0E22\u0E01\u0E40\u0E25\u0E34\u0E01\n </button>\n </div>\n </div>\n </form>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n<div class=\"modal fade\" bsModal #sendModal=\"bs-modal\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"dialog-static-name2\" [config]=\"{backdrop: 'static'}\">\n <div class=\"modal-dialog modal-md\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h4 id=\"dialog-static-send\" class=\"modal-title pull-left\"><label>\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E2A\u0E48\u0E07</label></h4>\n <button type=\"button\" class=\"close pull-right\" aria-label=\"Close\" (click)=\"closeSendModal()\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n <div class=\"modal-body\">\n <form class=\"m-form m-form--state m-form--fit m-form--label-align-right\" [formGroup]=\"sendForm\" (ngSubmit)=\"onSubmitSend()\">\n <div class=\"ibox-body\">\n <div class=\"row\">\n <div class=\"form-group\">\n <label class=\"control-label\">\u0E2B\u0E19\u0E48\u0E27\u0E22\u0E07\u0E32\u0E19</label>\n <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submittedSend && fs().send_to.errors }\">\n <soc-auto-complete [id]=\"'txtSendTo'\" mode=\"local\" [orderBy]=\"'name'\"\n [api]=\"departmentUrl\" field=\"name\" [(value)]=\"sendData.send_to\"></soc-auto-complete>\n <!--<p-autoComplete type=\"text\" styleClass=\"form-control m-input\" id=\"txtSendTo\" formControlName=\"send_to\" [(ngModel)]=\"sendData.send_to\"-->\n <!--[suggestions]=\"filteredDepartments\" (completeMethod)=\"filterDepartments($event)\"></p-autoComplete>-->\n <div *ngIf=\"submittedSend && fs().send_to.errors\" class=\"invalid-feedback\">\n <div *ngIf=\"fs().send_to.errors.required\">First Name is required</div>\n </div>\n </div>\n </div>\n <div class=\"form-group\">\n <label class=\"control-label\">\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E2B\u0E19\u0E31\u0E07\u0E2A\u0E37\u0E2D\u0E2A\u0E48\u0E07\u0E2D\u0E2D\u0E01</label>\n <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submittedSend && fs().book_no.errors }\">\n <input type=\"text\" class=\"form-control m-input\" id=\"txtSendBookNo\" formControlName=\"book_no\" [(ngModel)]=\"sendData.book_no\">\n <div *ngIf=\"submittedSend && fs().book_no.errors\" class=\"invalid-feedback\">\n <div *ngIf=\"fs().book_no.errors.required\">First Name is required</div>\n </div>\n </div>\n </div>\n <div class=\"form-group\">\n <label class=\"control-label\">\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E2A\u0E48\u0E07\u0E2D\u0E2D\u0E01</label>\n <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submittedSend && fs().send_date.errors }\">\n <soc-date-box [id]=\"'txtSendDate'\" [(value)]=\"sendData.send_date\"></soc-date-box>\n <div *ngIf=\"submittedSend && fs().send_date.errors\" >\n <div *ngIf=\"fs().send_date.errors.required\" class=\"lable-error\">Date is required</div>\n <div *ngIf=\"fs().send_date.errors.date\" class=\"lable-error\">Date is invalid</div>\n </div>\n </div>\n </div>\n <div class=\"form-group\">\n <label class=\"control-label\"></label>\n <input type=\"checkbox\" id=\"chkIsImportant\" name=\"is_important\" formControlName=\"is_important\" [(ngModel)]=\"sendData.is_important\" ng-checked> \u0E2A\u0E33\u0E04\u0E31\u0E0D\n </div>\n </div>\n </div>\n <div class=\"m-portlet__foot m-portlet__foot--fit text-right\">\n <div class=\"m-form__actions\">\n <button type=\"submit\" class=\"btn btn-success btn-md btn-md-save\">\n \u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\n </button>\n <button type=\"reset\" class=\"btn btn-default btn-md btn-md-search\" (click)=\"closeSendModal()\">\n \u0E22\u0E01\u0E40\u0E25\u0E34\u0E01\n </button>\n </div>\n </div>\n </form>\n </div>\n </div>\n </div>\n</div>\n<div class=\"modal fade\" bsModal #recieveModal=\"bs-modal\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"dialog-static-name2\" [config]=\"{backdrop: 'static'}\">\n <div class=\"modal-dialog modal-md\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h4 id=\"dialog-static-recieve\" class=\"modal-title pull-left\"><label>\u0E23\u0E31\u0E1A\u0E2B\u0E19\u0E31\u0E07\u0E2A\u0E37\u0E2D \u0E15\u0E2D\u0E1A\u0E04\u0E27\u0E32\u0E21\u0E40\u0E2B\u0E47\u0E19</label></h4>\n <button type=\"button\" class=\"close pull-right\" aria-label=\"Close\" (click)=\"closeRecieveModal()\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n <div class=\"modal-body\">\n <form class=\"m-form m-form--state m-form--fit m-form--label-align-right\" [formGroup]=\"recieveForm\" (ngSubmit)=\"onSubmitRecieve()\">\n <div class=\"ibox-body\">\n <div class=\"row\">\n <div class=\"form-group\">\n <label class=\"control-label\">\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A\u0E2B\u0E19\u0E31\u0E07\u0E2A\u0E37\u0E2D</label>\n <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submittedRecieve && fr().book_no.errors }\">\n <input type=\"text\" class=\"form-control m-input\" id=\"txtRecieveBookNo\" formControlName=\"book_no\" [(ngModel)]=\"recieveData.book_no\">\n <div *ngIf=\"submittedRecieve && fr().book_no.errors\" class=\"invalid-feedback\">\n <div *ngIf=\"fr().book_no.errors.required\">First Name is required</div>\n </div>\n </div>\n </div>\n <div class=\"form-group\">\n <label class=\"control-label\">\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A</label>\n <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submittedRecieve && fr().recv_date.errors }\">\n <soc-date-box [id]=\"'txtRecieveDate'\" [(value)]=\"recieveData.recv_date\"></soc-date-box>\n <div *ngIf=\"submittedRecieve && fr().recv_date.errors\" >\n <div *ngIf=\"fr().recv_date.errors.required\" class=\"lable-error\">Date is required</div>\n <div *ngIf=\"fr().recv_date.errors.date\" class=\"lable-error\">Date is invalid</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"m-portlet__foot m-portlet__foot--fit text-right\">\n <div class=\"m-form__actions\">\n <button type=\"submit\" class=\"btn btn-success btn-md btn-md-save\">\n \u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\n </button>\n <button type=\"reset\" class=\"btn btn-default btn-md btn-md-search\" (click)=\"closeRecieveModal()\">\n \u0E22\u0E01\u0E40\u0E25\u0E34\u0E01\n </button>\n </div>\n </div>\n </form>\n </div>\n </div>\n </div>\n</div>\n<app-alert #myModal (onClickBack)=\"onClickBack()\"></app-alert>\n"
}] }
];
/** @nocollapse */
ModalStepComponent.ctorParameters = () => [
{ type: AppConfigService },
{ type: Request },
{ type: FormBuilder },
{ type: Common },
{ type: DateService },
{ type: B2bService }
];
ModalStepComponent.propDecorators = {
onUpdateModal: [{ type: Output }],
modal: [{ type: ViewChild, args: ['modal',] }],
myModal: [{ type: ViewChild, args: ['myModal',] }],
sendModal: [{ type: ViewChild, args: ['sendModal',] }],
recieveModal: [{ type: ViewChild, args: ['recieveModal',] }],
dxDataGridStepSendList: [{ type: ViewChild, args: ['dxDataGridStepSendList',] }],
uploadAttachment: [{ type: ViewChild, args: ['uploadAttachment',] }]
};
if (false) {
/** @type {?} */
ModalStepComponent.prototype.onUpdateModal;
/** @type {?} */
ModalStepComponent.prototype.modal;
/** @type {?} */
ModalStepComponent.prototype.myModal;
/** @type {?} */
ModalStepComponent.prototype.sendModal;
/** @type {?} */
ModalStepComponent.prototype.recieveModal;
/** @type {?} */
ModalStepComponent.prototype.dxDataGridStepSendList;
/** @type {?} */
ModalStepComponent.prototype.uploadAttachment;
/** @type {?} */
ModalStepComponent.prototype.registerForm;
/** @type {?} */
ModalStepComponent.prototype.sendForm;
/** @type {?} */
ModalStepComponent.prototype.recieveForm;
/** @type {?} */
ModalStepComponent.prototype.submitted;
/** @type {?} */
ModalStepComponent.prototype.submittedSend;
/** @type {?} */
ModalStepComponent.prototype.submittedRecieve;
/** @type {?} */
ModalStepComponent.prototype.title;
/** @type {?} */
ModalStepComponent.prototype.selectList;
/** @type {?} */
ModalStepComponent.prototype.sendList;
/** @type {?} */
ModalStepComponent.prototype.recieveList;
/** @type {?} */
ModalStepComponent.prototype.modalConfig;
/** @type {?} */
ModalStepComponent.prototype.th;
/** @type {?} */
ModalStepComponent.prototype.selectedStep;
/** @type {?} */
ModalStepComponent.prototype.isMore;
/** @type {?} */
ModalStepComponent.prototype.moreField;
/** @type {?} */
ModalStepComponent.prototype.config;
/** @type {?} */
ModalStepComponent.prototype.stepData;
/** @type {?} */
ModalStepComponent.prototype.sendData;
/** @type {?} */
ModalStepComponent.prototype.recieveData;
/** @type {?} */
ModalStepComponent.prototype.lastStep;
/** @type {?} */
ModalStepComponent.prototype.isSend;
/** @type {?} */
ModalStepComponent.prototype.isRecieve;
/** @type {?} */
ModalStepComponent.prototype.isEditSend;
/** @type {?} */
ModalStepComponent.prototype.isEditRecieve;
/** @type {?} */
ModalStepComponent.prototype.tmpData;
/** @type {?} */
ModalStepComponent.prototype.filteredDepartments;
/** @type {?} */
ModalStepComponent.prototype.departmentList;
/** @type {?} */
ModalStepComponent.prototype.departmentUrl;
/** @type {?} */
ModalStepComponent.prototype.causeUrl;
/** @type {?} */
ModalStepComponent.prototype.causeFilter;
/** @type {?} */
ModalStepComponent.prototype.tempId;
/** @type {?} */
ModalStepComponent.prototype.attachmentUrl;
/** @type {?} */
ModalStepComponent.prototype.system_id;
/** @type {?} */
ModalStepComponent.prototype.filter_ref_ext_department_id;
/** @type {?} */
ModalStepComponent.prototype.filter_ref_ext_department_id_show;
/** @type {?} */
ModalStepComponent.prototype.appConfigService;
/** @type {?} */
ModalStepComponent.prototype.request;
/** @type {?} */
ModalStepComponent.prototype.formBuilder;
/** @type {?} */
ModalStepComponent.prototype.common;
/** @type {?} */
ModalStepComponent.prototype.date;
/** @type {?} */
ModalStepComponent.prototype.b2bService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtc3RlcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9zb2MtYXBwLWxpYnJhcnkvIiwic291cmNlcyI6WyJsaWIvbW9kYWwtc3RlcC9tb2RhbC1zdGVwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUE0QixNQUFNLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ25HLE9BQU8sRUFBZSxjQUFjLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDbEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRCxPQUFPLEVBQUMsV0FBVyxFQUF3QixVQUFVLEVBQWtCLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUYsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFdkQsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ3RELE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLGtEQUFrRCxDQUFDO0FBQzNGLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUVwRDtDQUtDOzs7Ozs7Ozs7Ozs7O0FBTUQsTUFBTSx5QkFBMEIsU0FBUSxPQUFPOzs7Ozs7Ozs7SUFnRDNDLFlBQW9CLGdCQUFrQyxFQUFVLE9BQWdCLEVBQVUsV0FBd0IsRUFBUyxNQUFjLEVBQVMsSUFBaUIsRUFBUyxVQUFzQjtRQUM5TCxLQUFLLEVBQUUsQ0FBQztRQURRLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFBVSxZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFBUyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQVMsU0FBSSxHQUFKLElBQUksQ0FBYTtRQUFTLGVBQVUsR0FBVixVQUFVLENBQVk7NkJBL0N4SyxJQUFJLFlBQVksRUFBRTt5QkFhaEMsS0FBSzs2QkFDRCxLQUFLO2dDQUNGLEtBQUs7cUJBQ1gsRUFBRTswQkFDRyxFQUFFO3dCQUNKLEVBQUU7MkJBQ0MsRUFBRTsyQkFDTztZQUN4QixtQkFBbUIsRUFBRSxJQUFJO1NBQzVCOzRCQUVtQixJQUFJO3NCQUNmLEtBQUs7d0JBR0UsRUFBRTt3QkFDRixFQUFFOzJCQUNDLEVBQUU7d0JBQ1YsRUFBRTtzQkFDSixLQUFLO3lCQUNGLEtBQUs7MEJBQ0osS0FBSzs2QkFDRixLQUFLO3VCQUNQLEVBQUU7bUNBQ1UsRUFBRTs4QkFDUCxFQUFFOzZCQUNQLHVCQUF1Qjt3QkFDNUIsaUJBQWlCOzJCQUNkLHNEQUFzRDtzQkFDM0QsQ0FBQyxDQUFDOzRDQUd5QixLQUFLO2lEQUNMLElBQUk7UUFHcEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSx5QkFBeUIsQ0FBQyxJQUFJLCtDQUErQyxDQUFDO1FBQ3RILElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0tBQ3BEOzs7O0lBRUQsUUFBUTtRQUNKLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1lBQ3RDLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNwQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7U0FDbEIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztZQUNuQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDYixPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDYixTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDZixZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUM7U0FDckIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztZQUN2QyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDVixPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUNsQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDZixNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDWixRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDZCxTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JDLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNqQixhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDbkIsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2pCLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNuQixPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDYixTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDWCxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDZixRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUM7U0FFakIsQ0FBQyxDQUFDO0tBQ047Ozs7O0lBRUssSUFBSSxDQUFDLE9BQWlCOztZQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1lBQ25CLElBQUksT0FBTyxFQUFFO2dCQUNULElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUM3QyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQ0FBcUMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO2FBQ2pJO1lBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7O0tBQ3JCOzs7O0lBRUQsQ0FBQyxLQUFLLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsRUFBRTs7OztJQUMxQyxFQUFFLEtBQUssT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFOzs7O0lBQ3ZDLEVBQUUsS0FBSyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUU7Ozs7SUFFMUMsVUFBVTtRQUNOLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7S0FDckI7Ozs7SUFFRCxjQUFjO1FBQ1YsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztLQUN6Qjs7OztJQUVELGlCQUFpQjtRQUNiLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztLQUM1Qjs7Ozs7SUFFRCxVQUFVLENBQUMsS0FBSztRQUNaLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztLQUNoQjs7Ozs7SUFFRCxTQUFTLENBQUMsS0FBSztRQUNYLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztLQUNoQjs7Ozs7SUFFRCxRQUFRLENBQUMsTUFBc0I7UUFDM0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpREFBaUQsRUFBRSxNQUFNLENBQUMsQ0FBQztLQUUxRTs7Ozs7SUFFRCxtQkFBbUIsQ0FBQyxLQUFLO1FBQ3ZCLElBQUksQ0FBQyxpQ0FBaUMsR0FBRyxLQUFLLENBQUM7UUFDL0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUE7O1FBRTNCLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxFQUFFLEVBQUU7WUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFBO1lBQzlCLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxxQ0FBcUMsS0FBSyxDQUFDLEVBQUUsd0JBQXdCLENBQUE7U0FDMUc7YUFBTTtZQUNMLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxLQUFLLENBQUM7U0FDM0M7UUFDRCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGlDQUFpQyxHQUFHLElBQUksQ0FBQztTQUMvQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0tBRVA7Ozs7O0lBRUQsbUJBQW1CLENBQUMsS0FBSztRQUN2QixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsR0FBRyxLQUFLLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO0tBQzlEOzs7O0lBR0ssZUFBZTs7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDN0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7WUFDakQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7WUFDcEIsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksS0FBSyxFQUFFLEVBQUU7Z0JBQ3pELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O29CQUNwRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7O29CQUM5QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O29CQUNsRyxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG1DQUFtQyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQzs7b0JBQzlGLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDakMsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUM1QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3ZCO2dCQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO2dCQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztnQkFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7YUFDMUI7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7Z0JBQ3BCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxLQUFLLEVBQUUsRUFBRTtvQkFDckUsSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7b0JBQ2pGLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzNELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO29CQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztpQkFtQjFCO3FCQUFNO29CQUNILElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO29CQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztpQkFDMUI7YUFDSjs7S0FDSjs7Ozs7SUFFRCxVQUFVLENBQUMsSUFBSTs7UUFDWCxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDWixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFO1lBQ3RCLEVBQUUsSUFBSSxLQUFLLENBQUM7U0FDZjthQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUU7WUFDakMsRUFBRSxJQUFJLEtBQUssQ0FBQztTQUNmO2FBQU07WUFDSCxFQUFFLElBQUksS0FBSyxDQUFDO1NBQ2Y7O1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRixFQUFFLElBQUksS0FBSyxDQUFDO1FBQ1osT0FBTyxFQUFFLENBQUM7S0FDYjs7Ozs7O0lBRUQsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFROztRQUNuQixJQUFJLE9BQU8scUJBQWtCLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFDOztRQUNyRSxJQUFJLFFBQVEsQ0FBQztRQUNiLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUN0QyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFO1lBQ3RCLElBQUksUUFBUSxFQUFFOztnQkFDVixNQUFNLEtBQUssR0FBUSxFQUFFLENBQUM7Z0JBQ3RCLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNuRCxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDNUM7aUJBQU07O2dCQUNILE1BQU0sS0FBSyxHQUFRLEVBQUUsQ0FBQztnQkFDdEIsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUM5QixRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDNUM7U0FDSjthQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUU7WUFDakMsSUFBSSxRQUFRLEVBQUU7O2dCQUNWLE1BQU0sS0FBSyxHQUFRLEVBQUUsQ0FBQztnQkFDdEIsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBQyxVQUFVLENBQUMsUUFBUSxFQUFFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN6RSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDNUM7aUJBQU07O2dCQUNILE1BQU0sS0FBSyxHQUFRLEVBQUUsQ0FBQztnQkFDdEIsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUM5QixRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDNUM7WUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ3ZEO2FBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUMvQixJQUFJLFFBQVEsRUFBRTs7Z0JBQ1YsTUFBTSxLQUFLLEdBQVEsRUFBRSxDQUFDO2dCQUN0QixLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMvQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDNUM7aUJBQU07O2dCQUNILE1BQU0sS0FBSyxHQUFRLEVBQUUsQ0FBQztnQkFDdEIsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUM5QixRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDNUM7U0FDSjthQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUM7WUFDL0IsSUFBRyxJQUFJLENBQUMsVUFBVSxLQUFLLFFBQVEsRUFBQztnQkFDNUIsSUFBSSxRQUFRLEVBQUU7O29CQUNWLE1BQU0sS0FBSyxHQUFRLEVBQUUsQ0FBQztvQkFDdEIsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ25ELEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ2pELFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDNUM7cUJBQU07O29CQUNILE1BQU0sS0FBSyxHQUFRLEVBQUUsQ0FBQztvQkFDdEIsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUM5QixLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDNUIsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUM1QzthQUNKO2lCQUFLLElBQUcsSUFBSSxDQUFDLFVBQVUsS0FBSyxRQUFRLEVBQUM7Z0JBQ2xDLElBQUksUUFBUSxFQUFFOztvQkFDVixNQUFNLEtBQUssR0FBUSxFQUFFLENBQUM7b0JBQ3RCLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUNuRCxLQUFLLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUNuRCxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQzVDO3FCQUFNOztvQkFDSCxNQUFNLEtBQUssR0FBUSxFQUFFLENBQUM7b0JBQ3RCLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDOUIsS0FBSyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQzlCLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDNUM7YUFDSjtpQkFBSTtnQkFDRCxJQUFJLFFBQVEsRUFBRTs7b0JBQ1YsTUFBTSxLQUFLLEdBQVEsRUFBRSxDQUFDO29CQUN0QixLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDbkQsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUM1QztxQkFBTTs7b0JBQ0gsTUFBTSxLQUFLLEdBQVEsRUFBRSxDQUFDO29CQUN0QixLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQzlCLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDNUM7YUFDSjtTQUNKO1FBRUQsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUMxQjs7Ozs7OztJQUVELG9CQUFvQixDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsWUFBYTs7UUFDeEMsSUFBSSxhQUFhLEdBQVEsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQy9DLElBQUksWUFBWSxFQUFFO1lBQ2QsYUFBYSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUMsYUFBYSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUMsSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFO2dCQUN0QixPQUFPLGFBQWEsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDN0M7aUJBQU07Z0JBQ0gsT0FBTyxhQUFhLENBQUMsTUFBTSxDQUFDO2FBQy9CO1NBQ0o7YUFBTTtZQUNILE9BQU8sYUFBYSxDQUFDLE1BQU0sQ0FBQztTQUMvQjtLQUNKOzs7OztJQUVELFdBQVcsQ0FBQyxJQUFJO1FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDWixPQUFPLEVBQUUsQ0FBQztTQUNiOztRQUNELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNsQyxPQUFPLEVBQUUsQ0FBQztLQUNiOzs7OztJQUVELGNBQWMsQ0FBQyxDQUFDO1FBQ1osSUFBSSxDQUFDLENBQUMsT0FBTyxLQUFLLE1BQU0sRUFBRTtZQUN0QixLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFO2dCQUNqQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUMvQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjtTQUNKO0tBQ0o7Ozs7SUFFRCxPQUFPO1FBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO0tBQ3pCOzs7OztJQUVELFFBQVEsQ0FBQyxJQUFJO1FBQ1QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzs7UUFFakQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztLQUN6Qjs7Ozs7SUFFRCxXQUFXLENBQUMsSUFBSTtRQUNaLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDO1FBQzVILElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzFCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7S0FDNUI7Ozs7O0lBRUQsaUJBQWlCLENBQUMsS0FBSztRQUNuQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1FBQzlCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs7WUFDakQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQyxJQUFJLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDbEUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUM3QztTQUNKO0tBQ0o7Ozs7SUFFSyxRQUFROztZQUNWLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDOztZQUV0QixPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRTtnQkFDM0IsT0FBTzthQUNWOztZQUNELElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQzs7WUFDbEIsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7O1lBQ3BCLElBQUksUUFBUSxHQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDcEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO1lBQ2xDLElBQUcsSUFBSSxDQUFDLFdBQVc7Z0JBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQy9GLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzFCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDOztZQUMzQixJQUFJLElBQUksR0FBRztnQkFDUCxjQUFjLEVBQUMsQ0FBQyxJQUFJLENBQUM7YUFDeEIsQ0FBQTtZQUNELFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEIsSUFBRyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBQzs7Z0JBQ3pDLElBQUksT0FBTyxHQUFHO29CQUNWLFNBQVMsRUFBQyxFQUFFO2lCQUNmLENBQUM7O2dCQUNGLElBQUksVUFBVSxHQUFHO29CQUNiLFlBQVksRUFBQyxFQUFFO2lCQUNsQixDQUFDO2dCQUNGLEtBQUksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBQztvQkFDMUIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUN0QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztvQkFDcEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUNmLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUM5QjtnQkFDRCxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzFCO1lBQ0QsSUFBRyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBQzs7Z0JBQy9DLElBQUksVUFBVSxHQUFHO29CQUNiLFlBQVksRUFBQyxFQUFFO2lCQUNsQixDQUFDO2dCQUNGLEtBQUksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBQztvQkFDN0IsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7b0JBQzVCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUN6QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO29CQUNwQixVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDcEM7Z0JBQ0QsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUM3QjtZQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDOztZQUVqQyxJQUFJLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBQyxRQUFRLENBQUMsQ0FBQztZQUNoRSxJQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFDOztnQkFDM0IsSUFBSSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFBO2dCQUNoQyxJQUFHLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFDO29CQUNyQixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsR0FBQyxHQUFHLEdBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUMsRUFBQyxNQUFNLEVBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBQyxXQUFXLEVBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBQyxDQUFDLENBQUM7b0JBQ2pKLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7aUJBQ3hEO2FBQ0Y7aUJBQUk7Z0JBQ0gsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEdBQUMsR0FBRyxHQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFDLEVBQUMsTUFBTSxFQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFDLENBQUMsQ0FBQztnQkFDakgsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTthQUN4RDs7Ozs7S0FLSjs7OztJQUVLLFdBQVc7O1lBQ2IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQzs7WUFDM0IsSUFBSSxNQUFNLEdBQUc7Z0JBQ1QsTUFBTSxFQUFDO29CQUNILFNBQVMsRUFBQyxHQUFHLEdBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTO29CQUNyQyxNQUFNLEVBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNO29CQUMzQixTQUFTLEVBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTO2lCQUNwQztnQkFDRCxRQUFRLEVBQUMsQ0FBQyxnQkFBZ0IsQ0FBQzthQUM5QixDQUFBOztZQUNELE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDckUsT0FBTyxJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQzs7S0FDaEM7Ozs7SUFHRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7S0FDckI7Ozs7SUFFSyxZQUFZOztZQUNkLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDOztZQUUxQixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFO2dCQUN2QixPQUFPO2FBQ1Y7WUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7O2dCQUNqQixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ25CLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtvQkFDakMsSUFBSSxPQUFPLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFO3dCQUNoQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztxQkFDL0I7eUJBQU07d0JBQ0gsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztxQkFDekI7aUJBQ0o7Z0JBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7YUFDM0I7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDL0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNkLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNyQztZQUNELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQzs7S0FDekI7Ozs7SUFFSyxlQUFlOztZQUNqQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQzs7WUFHMUIsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRTtnQkFDMUIsT0FBTzthQUNWO1lBQ0QsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFOztnQkFDcEIsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNuQixLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7b0JBQ3BDLElBQUksT0FBTyxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRTt3QkFDOUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7cUJBQ2xDO3lCQUFNO3dCQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7cUJBQ3pCO2lCQUNKO2dCQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDO2FBQzlCO2lCQUFNO2dCQUNILElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUMzQztZQUNELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDOztLQUM1Qjs7Ozs7SUFDRCxXQUFXLENBQUMsSUFBSTtRQUNaLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQSxDQUFDLENBQUEsT0FBTyxDQUFBLENBQUMsQ0FBQSxFQUFFLENBQUM7S0FDdkM7Ozs7O0lBQ0QsVUFBVSxDQUFDLElBQUk7UUFDWCxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxHQUFDLEdBQUcsR0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3JELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7S0FDbEM7Ozs7O0lBQ0QsWUFBWSxDQUFDLEtBQUs7UUFDZCxJQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLFdBQVcsRUFBQztZQUMvQyxPQUFPLElBQUksQ0FBQztTQUNmO2FBQUk7WUFDRCxPQUFPLEtBQUssQ0FBQztTQUNoQjtLQUNKOzs7OztJQUVLLFlBQVksQ0FBQyxJQUFJOzs7WUFDbkIsSUFBSSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5RCxPQUFPLEdBQUcsQ0FBQzs7S0FDZDs7O1lBamhCSixTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLFlBQVk7Z0JBQ3RCLG0zbERBQTBDO2FBQzdDOzs7O1lBdEJPLGdCQUFnQjtZQUNmLE9BQU87WUFFUixXQUFXO1lBRFgsTUFBTTtZQU1OLFdBQVc7WUFFWCxVQUFVOzs7NEJBY2IsTUFBTTtvQkFFTixTQUFTLFNBQUMsT0FBTztzQkFDakIsU0FBUyxTQUFDLFNBQVM7d0JBQ25CLFNBQVMsU0FBQyxXQUFXOzJCQUNyQixTQUFTLFNBQUMsY0FBYztxQ0FDeEIsU0FBUyxTQUFDLHdCQUF3QjsrQkFFbEMsU0FBUyxTQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtNb2RhbE9wdGlvbnMsIE1vZGFsRGlyZWN0aXZlfSBmcm9tICduZ3gtYm9vdHN0cmFwJztcbmltcG9ydCB7QXBwQ29uZmlnU2VydmljZX0gZnJvbSAnLi4vYXBwLWNvbmZpZy9hcHAtY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVxdWVzdCB9IGZyb20gJy4uL19zZXJ2aWNlcy9yZXF1ZXN0LnNlcnZpY2UnO1xuaW1wb3J0IHtDb21tb259IGZyb20gJy4uL19zZXJ2aWNlcy9jb21tb24uc2VydmljZSc7XG5pbXBvcnQge0Zvcm1CdWlsZGVyLCBGb3JtQXJyYXksIEZvcm1Hcm91cCwgVmFsaWRhdG9ycywgQWJzdHJhY3RDb250cm9sfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge0N1c3RvbVZhbGlkYXRvcnN9IGZyb20gJ25nMi12YWxpZGF0aW9uJztcbmltcG9ydCB7RHhEYXRhR3JpZENvbXBvbmVudH0gZnJvbSAnZGV2ZXh0cmVtZS1hbmd1bGFyJztcbmltcG9ydCAqIGFzIHV1aWQgZnJvbSAndXVpZCc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge0RhdGVTZXJ2aWNlfSBmcm9tICcuLi9fc2VydmljZXMvZGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7VXBsb2FkQXR0YWNobWVudENvbXBvbmVudH0gZnJvbSAnLi4vdXBsb2FkLWF0dGFjaG1lbnQvdXBsb2FkLWF0dGFjaG1lbnQuY29tcG9uZW50JztcbmltcG9ydCB7QjJiU2VydmljZX0gZnJvbSAnLi4vX3NlcnZpY2VzL2IyYi5zZXJ2aWNlJztcblxuY2xhc3MgT3B0aW9ucyB7XG4gICAgLyoqIHRpdGxlIOC4l+C4teC5iOC4leC5ieC4reC4h+C4geC4suC4o+C5geC4quC4lOC4hyAqL1xuICAgIHRpdGxlPzogU3RyaW5nO1xuICAgIC8qKiBkYXRhICovXG4gICAgZGF0YTogYW55O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ21vZGFsLXN0ZXAnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9tb2RhbC1zdGVwLmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgTW9kYWxTdGVwQ29tcG9uZW50IGV4dGVuZHMgT3B0aW9ucyBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgQE91dHB1dCgpIG9uVXBkYXRlTW9kYWwgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgLy8gQE91dHB1dCgpIG9uQ3JlYXRlTW9kYWwgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQFZpZXdDaGlsZCgnbW9kYWwnKSBtb2RhbDogTW9kYWxEaXJlY3RpdmU7XG4gICAgQFZpZXdDaGlsZCgnbXlNb2RhbCcpIG15TW9kYWw7XG4gICAgQFZpZXdDaGlsZCgnc2VuZE1vZGFsJykgc2VuZE1vZGFsOiBNb2RhbERpcmVjdGl2ZTtcbiAgICBAVmlld0NoaWxkKCdyZWNpZXZlTW9kYWwnKSByZWNpZXZlTW9kYWw6IE1vZGFsRGlyZWN0aXZlO1xuICAgIEBWaWV3Q2hpbGQoJ2R4RGF0YUdyaWRTdGVwU2VuZExpc3QnKVxuICAgIGR4RGF0YUdyaWRTdGVwU2VuZExpc3Q6IER4RGF0YUdyaWRDb21wb25lbnQ7XG4gICAgQFZpZXdDaGlsZCgndXBsb2FkQXR0YWNobWVudCcpIHVwbG9hZEF0dGFjaG1lbnQ6IFVwbG9hZEF0dGFjaG1lbnRDb21wb25lbnQ7XG5cbiAgICByZWdpc3RlckZvcm06IEZvcm1Hcm91cDtcbiAgICBzZW5kRm9ybTogRm9ybUdyb3VwO1xuICAgIHJlY2lldmVGb3JtOiBGb3JtR3JvdXA7XG4gICAgc3VibWl0dGVkID0gZmFsc2U7XG4gICAgc3VibWl0dGVkU2VuZCA9IGZhbHNlO1xuICAgIHN1Ym1pdHRlZFJlY2lldmUgPSBmYWxzZTtcbiAgICB0aXRsZTogYW55ID0gJyc7XG4gICAgc2VsZWN0TGlzdDogYW55ID0gW107XG4gICAgc2VuZExpc3Q6IGFueSA9IFtdO1xuICAgIHJlY2lldmVMaXN0OiBhbnkgPSBbXTtcbiAgICBtb2RhbENvbmZpZzogTW9kYWxPcHRpb25zID0ge1xuICAgICAgICBpZ25vcmVCYWNrZHJvcENsaWNrOiB0cnVlXG4gICAgfTtcbiAgICB0aDtcbiAgICBzZWxlY3RlZFN0ZXA6IGFueSA9IG51bGw7XG4gICAgaXNNb3JlID0gZmFsc2U7XG4gICAgbW9yZUZpZWxkOiBhbnk7XG4gICAgcHVibGljIGNvbmZpZzogYW55O1xuICAgIHN0ZXBEYXRhOiBhbnkgPSB7fTtcbiAgICBzZW5kRGF0YTogYW55ID0ge307XG4gICAgcmVjaWV2ZURhdGE6IGFueSA9IHt9O1xuICAgIGxhc3RTdGVwID0gJyc7XG4gICAgaXNTZW5kID0gZmFsc2U7XG4gICAgaXNSZWNpZXZlID0gZmFsc2U7XG4gICAgaXNFZGl0U2VuZCA9IGZhbHNlO1xuICAgIGlzRWRpdFJlY2lldmUgPSBmYWxzZTtcbiAgICB0bXBEYXRhOmFueSA9IHt9O1xuICAgIGZpbHRlcmVkRGVwYXJ0bWVudHM6YW55ID0gW107XG4gICAgZGVwYXJ0bWVudExpc3Q6YW55ID0gW107XG4gICAgZGVwYXJ0bWVudFVybCA9IFwiL2RiL2N0X2V4dF9kZXBhcnRtZW50XCI7XG4gICAgY2F1c2VVcmwgPSBcIi9kYi9jdF9kcm9wZG93blwiO1xuICAgIGNhdXNlRmlsdGVyID0gXCJzeXN0ZW1faWQsZXEsMjMpJGFuZChkcm9wZG93bl90eXBlLGxpa2Us4LmA4Lij4Li34LmI4Lit4LiH4Liq4LmI4LiH4LiE4Li34LiZXCI7XG4gICAgdGVtcElkID0gLTE7XG4gICAgYXR0YWNobWVudFVybDtcbiAgICBzeXN0ZW1faWQ7XG4gICAgZmlsdGVyX3JlZl9leHRfZGVwYXJ0bWVudF9pZDogYW55ID0gZmFsc2U7XG4gICAgZmlsdGVyX3JlZl9leHRfZGVwYXJ0bWVudF9pZF9zaG93ID0gdHJ1ZTtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFwcENvbmZpZ1NlcnZpY2U6IEFwcENvbmZpZ1NlcnZpY2UsIHByaXZhdGUgcmVxdWVzdDogUmVxdWVzdCwgcHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsIHB1YmxpYyBjb21tb246IENvbW1vbiwgcHVibGljIGRhdGU6IERhdGVTZXJ2aWNlLCBwdWJsaWMgYjJiU2VydmljZTogQjJiU2VydmljZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGFwcENvbmZpZ1NlcnZpY2UuZ2V0Q29uZmlnKCk7XG4gICAgICAgIHRoaXMuYXR0YWNobWVudFVybCA9IF8uZ2V0KHRoaXMuY29uZmlnLCAnYXBpU2VydmVycy5hbGZyZXNjby51cmwnKSB8fCBcImh0dHBzOi8vMjAzLjE1NC4zMi4xMjY6MjU4NS9hcGkvbWZlYy9BbGZyZXNjb1wiO1xuICAgICAgICB0aGlzLnN5c3RlbV9pZCA9IF8uZ2V0KHRoaXMuY29uZmlnLCAnc3lzdGVtX2lkJyk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMudGggPSB0aGlzLmNvbW1vbi5mbkxvY2FsUENhbGVuZGFyKCd0aCcpO1xuICAgICAgICB0aGlzLnJlY2lldmVGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICAgICAgICBib29rX25vOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICAgICAgICByZWN2X2RhdGU6IFsnJ10sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNlbmRGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICAgICAgICBzZW5kX3RvOiBbJyddLFxuICAgICAgICAgICAgYm9va19ubzogWycnXSxcbiAgICAgICAgICAgIHNlbmRfZGF0ZTogWycnXSxcbiAgICAgICAgICAgIGlzX2ltcG9ydGFudDogWycnXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICAgICAgICBuYW1lOiBbJyddLFxuICAgICAgICAgICAgc3RlcF9pZDogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgICAgIHN0ZXBfZGF0ZTogWycnXSxcbiAgICAgICAgICAgIHJlbWFyazogWycnXSxcbiAgICAgICAgICAgIGxhc3RTdGVwOiBbJyddLFxuICAgICAgICAgICAgbW9yZUZpZWxkOiB0aGlzLmZvcm1CdWlsZGVyLmFycmF5KFtdKSxcbiAgICAgICAgICAgIHNvY19yZWN2X25vOiBbJyddLFxuICAgICAgICAgICAgc29jX3JlY3ZfZGF0ZTogWycnXSxcbiAgICAgICAgICAgIGd0Y19yZWN2X25vOiBbJyddLFxuICAgICAgICAgICAgZ3RjX3JlY3ZfZGF0ZTogWycnXSxcbiAgICAgICAgICAgIGJvb2tfbm86IFsnJ10sXG4gICAgICAgICAgICBib29rX2RhdGU6IFsnJ10sXG4gICAgICAgICAgICAnZm9yJzogWycnXSxcbiAgICAgICAgICAgIGRlcHRfbmFtZTogWycnXSxcbiAgICAgICAgICAgIG1pbmlzdHJ5OiBbJyddXG5cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgb3BlbihvcHRpb25zPzogT3B0aW9ucykge1xuICAgICAgICBjb25zb2xlLmxvZyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5zdGVwRGF0YSA9IHt9O1xuICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgdGhpcy50aXRsZSA9IG9wdGlvbnMudGl0bGUgfHwgJyc7XG4gICAgICAgICAgICB0aGlzLmxhc3RTdGVwID0gb3B0aW9ucy5kYXRhLmxhc3RTdGVwO1xuICAgICAgICAgICAgdGhpcy5zdGVwRGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5kYXRhKSk7XG4gICAgICAgICAgICB0aGlzLnN0ZXBEYXRhLnN0ZXBfZGF0ZSA9IHRoaXMuZGF0ZS5nZXROb3coKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnN0ZXBEYXRhWydsYXN0U3RlcCddO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RMaXN0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0LmdldCgnL2RiL2N0X3N0ZXA/X3doZXJlPShjYXRlZ29yeV9pZCxlcSwnICsgb3B0aW9ucy5kYXRhLmNhdGVnb3J5X2lkICsgJykmX3NvcnQ9c2VxX25vJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGxvYWRBdHRhY2htZW50LmNsZWFyVmFsdWUoKTtcbiAgICAgICAgdGhpcy5tb2RhbC5zaG93KCk7XG4gICAgfVxuXG4gICAgZigpIHsgcmV0dXJuIHRoaXMucmVnaXN0ZXJGb3JtLmNvbnRyb2xzOyB9XG4gICAgZnMoKSB7IHJldHVybiB0aGlzLnNlbmRGb3JtLmNvbnRyb2xzOyB9XG4gICAgZnIoKSB7IHJldHVybiB0aGlzLnJlY2lldmVGb3JtLmNvbnRyb2xzOyB9XG5cbiAgICBjbG9zZU1vZGFsKCkge1xuICAgICAgICB0aGlzLnN1Ym1pdHRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNlbGVjdExpc3QgPSBbXTtcbiAgICAgICAgdGhpcy5zZW5kTGlzdCA9IFtdO1xuICAgICAgICB0aGlzLnNlbGVjdGVkU3RlcCA9IG51bGw7XG4gICAgICAgIHRoaXMuaXNNb3JlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNTZW5kID0gZmFsc2U7XG4gICAgICAgIHRoaXMubW9yZUZpZWxkID0gW107XG4gICAgICAgIHRoaXMuc3RlcERhdGEgPSB7fTtcbiAgICAgICAgdGhpcy5sYXN0U3RlcCA9ICcnO1xuICAgICAgICB0aGlzLm1vZGFsLmhpZGUoKTtcbiAgICB9XG5cbiAgICBjbG9zZVNlbmRNb2RhbCgpIHtcbiAgICAgICAgdGhpcy5zdWJtaXR0ZWRTZW5kID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2VuZERhdGEgPSB7fTtcbiAgICAgICAgdGhpcy5pc0VkaXRTZW5kID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG1wRGF0YSA9IHt9O1xuICAgICAgICB0aGlzLnNlbmRNb2RhbC5oaWRlKCk7XG4gICAgfVxuXG4gICAgY2xvc2VSZWNpZXZlTW9kYWwoKSB7XG4gICAgICAgIHRoaXMuc3VibWl0dGVkUmVjaWV2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlY2lldmVEYXRhID0ge307XG4gICAgICAgIHRoaXMuaXNFZGl0UmVjaWV2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRtcERhdGEgPSB7fTtcbiAgICAgICAgdGhpcy5yZWNpZXZlTW9kYWwuaGlkZSgpO1xuICAgIH1cblxuICAgIG9uWWVzQ2xpY2sobW9kYWwpIHtcbiAgICAgICAgbW9kYWwuaGlkZSgpO1xuICAgIH1cblxuICAgIG9uTm9DbGljayhtb2RhbCkge1xuICAgICAgICBtb2RhbC5oaWRlKCk7XG4gICAgfVxuXG4gICAgb25IaWRkZW4oJGV2ZW50OiBNb2RhbERpcmVjdGl2ZSkge1xuICAgICAgICBjb25zb2xlLmxvZygnTE9HIE1FU1NBR0U6IE1vZGFsQ29uZmlybSAtPiBvbkhpZGRlbiAtPiAkZXZlbnQnLCAkZXZlbnQpO1xuXG4gICAgfVxuICAgIFxuICAgIHZhbHVlU2VsZXRlTWluaXN0cnkodmFsdWUpIHtcbiAgICAgIHRoaXMuZmlsdGVyX3JlZl9leHRfZGVwYXJ0bWVudF9pZF9zaG93ID0gZmFsc2U7XG4gICAgICBjb25zb2xlLmxvZygndmFsdWUnLCB2YWx1ZSlcbiAgICAgIC8vIHRoaXMuc3RlcERhdGEubWluaXN0cnlfaWQgPSB2YWx1ZSAmJiB2YWx1ZS5pZCA/IHZhbHVlLmlkIDogbnVsbFxuICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLmlkKSB7XG4gICAgICAgIHRoaXMuc3RlcERhdGEuZGVwdF9uYW1lID0gbnVsbFxuICAgICAgICB0aGlzLmZpbHRlcl9yZWZfZXh0X2RlcGFydG1lbnRfaWQgPSBgJl93aGVyZT0ocmVmX2V4dF9kZXBhcnRtZW50X2lkLGVxLCR7dmFsdWUuaWR9KSRhbmQodHlwZSxpbiwyLDMsNCw1KWBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZmlsdGVyX3JlZl9leHRfZGVwYXJ0bWVudF9pZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZmlsdGVyX3JlZl9leHRfZGVwYXJ0bWVudF9pZF9zaG93ID0gdHJ1ZTtcbiAgICAgIH0sIDUwKVxuXG4gICAgfVxuXG4gICAgdmFsdWVTZWxldGVEZXB0TmFtZSh2YWx1ZSkge1xuICAgICAgY29uc29sZS5sb2coJ3ZhbHVlJywgdmFsdWUpXG4gICAgICB0aGlzLnN0ZXBEYXRhLmNvZGVfZGVwdCA9IHZhbHVlICYmIHZhbHVlLmlkID8gdmFsdWUuaWQgOiBudWxsXG4gICAgfVxuXG5cbiAgICBhc3luYyBjaGVja0V4dHJhRmllbGQoKSB7XG4gICAgICAgIHRoaXMuc3RlcERhdGEuc3RlcF9pZCA9IHRoaXMuc2VsZWN0ZWRTdGVwLmlkO1xuICAgICAgICB0aGlzLnN0ZXBEYXRhLnN0ZXBfbmFtZSA9IHRoaXMuc2VsZWN0ZWRTdGVwLm5hbWU7XG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMuaXNNb3JlKTtcbiAgICAgICAgdGhpcy5tb3JlRmllbGQgPSBbXTtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRTdGVwLmZsYWcgJiYgdGhpcy5zZWxlY3RlZFN0ZXAuZmxhZyAhPT0gJycpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWxlY3RlZFN0ZXAuZmxhZy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZsYWcgPSB0aGlzLnNlbGVjdGVkU3RlcC5mbGFnLmNoYXJBdChpKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1aXJlRmxhZyA9IHRoaXMuc2VsZWN0ZWRTdGVwLnJlcXVpcmVfZmxhZyA/IHRoaXMuc2VsZWN0ZWRTdGVwLnJlcXVpcmVfZmxhZy5jaGFyQXQoaSkgOiAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN0X3N0ZXBfZmxhZyA9IGF3YWl0IHRoaXMucmVxdWVzdC5nZXQoJy9kYi9jdF9zdGVwX2ZsYWc/X3doZXJlPShmbGFnLGVxLCcgKyBmbGFnICsgJyknKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdGaWVsZCA9IGN0X3N0ZXBfZmxhZ1swXTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFkZEZpZWxkKG5ld0ZpZWxkLCArcmVxdWlyZUZsYWcpO1xuICAgICAgICAgICAgICAgIHRoaXMubW9yZUZpZWxkLnB1c2gobmV3RmllbGQpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmlzTW9yZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmlzU2VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5pc1JlY2lldmUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaXNNb3JlID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFN0ZXAudHlwZV9pZCA9PT0gOCB8fCB0aGlzLnNlbGVjdGVkU3RlcC50eXBlX2lkID09PSAxMykge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVwYXJ0bWVudExpc3QgPSBhd2FpdCB0aGlzLnJlcXVlc3QuZ2V0KCcvZGIvY3RfZXh0X2RlcGFydG1lbnQ/X3NvcnQ9bmFtZScpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVwYXJ0bWVudExpc3QgPSB0aGlzLmRlcGFydG1lbnRMaXN0Lm1hcChhID0+IGEubmFtZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1NlbmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNSZWNpZXZlID0gZmFsc2U7XG4gICAgICAgICAgICAvLyB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRTdGVwLnR5cGVfaWQgPT09IDkgfHwgdGhpcy5zZWxlY3RlZFN0ZXAudHlwZV9pZCA9PT0gMTQpIHtcbiAgICAgICAgICAgIC8vICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5yZXF1ZXN0LnBvc3QoJy9zcWwvZ2V0TGFzdFNlbmQnLCB0aGlzLnN0ZXBEYXRhKTtcbiAgICAgICAgICAgIC8vICAgICBpZiAoZGF0YS5yZXN1bHREYXRhICYmIGRhdGEucmVzdWx0RGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyAgICAgICAgIGNvbnN0IGN0X3N0ZXBfZGF0YV9pZCA9IGRhdGEucmVzdWx0RGF0YVswXS5pZDtcbiAgICAgICAgICAgIC8vICAgICAgICAgY29uc3QgY3Rfc2VuZExpc3QgPSBhd2FpdCB0aGlzLnJlcXVlc3QuZ2V0KCcvZGIvY3Rfc2VuZD9fd2hlcmU9KGN0X3N0ZXBfZGF0YV9pZCxlcSwnICsgY3Rfc3RlcF9kYXRhX2lkICsgJyknKTtcbiAgICAgICAgICAgIC8vICAgICAgICAgZm9yIChjb25zdCBjdF9zZW5kIG9mIGN0X3NlbmRMaXN0KSB7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBjb25zdCByZWN2RGF0YTogYW55ID0ge1xuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIGN0X3NlbmRfaWQ6IGN0X3NlbmQuaWQsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgc2VuZF9ib29rX25vOiBjdF9zZW5kLmJvb2tfbm8sXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgc2VuZF9kYXRlOiBjdF9zZW5kLnNlbmRfZGF0ZSxcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICByZWN2X2Zyb206IGN0X3NlbmQuc2VuZF90byxcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBuYW1lOiBjdF9zZW5kLm5hbWVcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLnJlY2lldmVMaXN0LnB1c2gocmVjdkRhdGEpO1xuICAgICAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gICAgIHRoaXMuaXNSZWNpZXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmlzU2VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzU2VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNSZWNpZXZlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRGaWVsZElkKGRhdGEpIHtcbiAgICAgICAgbGV0IGlkID0gJyc7XG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgICAgaWQgKz0gJ3R4dCc7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSAnZGF0ZXRpbWUnKSB7XG4gICAgICAgICAgICBpZCArPSAndHh0JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlkICs9ICd0eHQnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpZWxkID0gZGF0YS5maWVsZF9uYW1lLmNoYXJBdCgwKS50b0xvY2FsZVVwcGVyQ2FzZSgpICsgZGF0YS5maWVsZF9uYW1lLnN1YnN0cmluZygxKTtcbiAgICAgICAgaWQgKz0gZmllbGQ7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG5cbiAgICBhZGRGaWVsZChkYXRhLCByZXF1aXJlZCkge1xuICAgICAgICBsZXQgY29udHJvbDphbnkgPSA8Rm9ybUFycmF5PnRoaXMucmVnaXN0ZXJGb3JtLmNvbnRyb2xzWydtb3JlRmllbGQnXTtcbiAgICAgICAgbGV0IG5ld2dyb3VwO1xuICAgICAgICB0aGlzLnN0ZXBEYXRhW2RhdGEuZmllbGRfbmFtZV0gPSBudWxsO1xuICAgICAgICBpZiAoZGF0YS50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgIGlmIChyZXF1aXJlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICBncm91cFtkYXRhLmZpZWxkX25hbWVdID0gWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXTtcbiAgICAgICAgICAgICAgICBuZXdncm91cCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoZ3JvdXApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cDogYW55ID0ge307XG4gICAgICAgICAgICAgICAgZ3JvdXBbZGF0YS5maWVsZF9uYW1lXSA9IFsnJ107XG4gICAgICAgICAgICAgICAgbmV3Z3JvdXAgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKGdyb3VwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICdkYXRldGltZScpIHtcbiAgICAgICAgICAgIGlmIChyZXF1aXJlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICBncm91cFtkYXRhLmZpZWxkX25hbWVdID0gWycnLFZhbGlkYXRvcnMucmVxdWlyZWQsIEN1c3RvbVZhbGlkYXRvcnMuZGF0ZV07XG4gICAgICAgICAgICAgICAgbmV3Z3JvdXAgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKGdyb3VwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXA6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgIGdyb3VwW2RhdGEuZmllbGRfbmFtZV0gPSBbJyddO1xuICAgICAgICAgICAgICAgIG5ld2dyb3VwID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cChncm91cCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN0ZXBEYXRhW2RhdGEuZmllbGRfbmFtZV0gPSB0aGlzLmRhdGUuZ2V0Tm93KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXA6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgIGdyb3VwW2RhdGEuZmllbGRfbmFtZV0gPSBbVmFsaWRhdG9ycy5yZXF1aXJlZF07XG4gICAgICAgICAgICAgICAgbmV3Z3JvdXAgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKGdyb3VwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXA6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgIGdyb3VwW2RhdGEuZmllbGRfbmFtZV0gPSBbJyddO1xuICAgICAgICAgICAgICAgIG5ld2dyb3VwID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cChncm91cCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSAnc3BlY2lhbCcpe1xuICAgICAgICAgICAgaWYoZGF0YS5maWVsZF9uYW1lID09PSAnYW1vdW50Jyl7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBbZGF0YS5maWVsZF9uYW1lXSA9IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF07XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwWydhbW91bnRfdHlwZSddID0gWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXTtcbiAgICAgICAgICAgICAgICAgICAgbmV3Z3JvdXAgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKGdyb3VwKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cDogYW55ID0ge307XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwW2RhdGEuZmllbGRfbmFtZV0gPSBbJyddO1xuICAgICAgICAgICAgICAgICAgICBncm91cFsnYW1vdW50X3R5cGUnXSA9IFsnJ107XG4gICAgICAgICAgICAgICAgICAgIG5ld2dyb3VwID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cChncm91cCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfWVsc2UgaWYoZGF0YS5maWVsZF9uYW1lID09PSAnZm9sbG93Jyl7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBbZGF0YS5maWVsZF9uYW1lXSA9IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF07XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwWydmb2xsb3dfcmVtYXJrJ10gPSBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdO1xuICAgICAgICAgICAgICAgICAgICBuZXdncm91cCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoZ3JvdXApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBbZGF0YS5maWVsZF9uYW1lXSA9IFsnJ107XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwWydmb2xsb3dfcmVtYXJrJ10gPSBbJyddO1xuICAgICAgICAgICAgICAgICAgICBuZXdncm91cCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoZ3JvdXApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cDogYW55ID0ge307XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwW2RhdGEuZmllbGRfbmFtZV0gPSBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdO1xuICAgICAgICAgICAgICAgICAgICBuZXdncm91cCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoZ3JvdXApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBbZGF0YS5maWVsZF9uYW1lXSA9IFsnJ107XG4gICAgICAgICAgICAgICAgICAgIG5ld2dyb3VwID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cChncm91cCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29udHJvbC5wdXNoKG5ld2dyb3VwKTtcbiAgICB9XG5cbiAgICBnZXRWYWxpZGF0ZU1vcmVGaWVsZChpLCBmaWVsZCwgdmFsaWRhdGVUeXBlPykge1xuICAgICAgICBsZXQgZm9ybU1vcmVGaWVsZDogYW55ID0gdGhpcy5mKClbJ21vcmVGaWVsZCddO1xuICAgICAgICBpZiAodmFsaWRhdGVUeXBlKSB7XG4gICAgICAgICAgICBmb3JtTW9yZUZpZWxkID0gZm9ybU1vcmVGaWVsZC5jb250cm9sc1tpXTtcbiAgICAgICAgICAgIGZvcm1Nb3JlRmllbGQgPSBmb3JtTW9yZUZpZWxkLmNvbnRyb2xzW2ZpZWxkXTtcbiAgICAgICAgICAgIGlmIChmb3JtTW9yZUZpZWxkLmVycm9ycykge1xuICAgICAgICAgICAgICAgIHJldHVybiBmb3JtTW9yZUZpZWxkLmVycm9yc1t2YWxpZGF0ZVR5cGVdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybU1vcmVGaWVsZC5lcnJvcnM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybU1vcmVGaWVsZC5lcnJvcnM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRSb3dJbmRleChkYXRhKSB7XG4gICAgICAgIGlmICghZGF0YS5kYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgbm8gPSBkYXRhLnJvdy5kYXRhSW5kZXggKyAxO1xuICAgICAgICByZXR1cm4gbm87XG4gICAgfVxuXG4gICAgb25DZWxsUHJlcGFyZWQoZSkge1xuICAgICAgICBpZiAoZS5yb3dUeXBlID09PSAnZGF0YScpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiBlLmNvbXBvbmVudC5jb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuY29sdW1uLmRhdGFGaWVsZCA9PT0gZS5jb21wb25lbnQuY29sdW1uc1tpXSkge1xuICAgICAgICAgICAgICAgICAgICBlLmNlbGxFbGVtZW50LmFjY2Vzc0tleSA9IGUuY29tcG9uZW50LmNvbHVtbnNbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkU2VuZCgpe1xuICAgICAgICB0aGlzLnNlbmREYXRhLnNlbmRfZGF0ZSA9IHRoaXMuZGF0ZS5nZXROb3coKTtcbiAgICAgICAgdGhpcy5zZW5kTW9kYWwuc2hvdygpO1xuICAgIH1cblxuICAgIGVkaXRTZW5kKGRhdGEpIHtcbiAgICAgICAgdGhpcy50bXBEYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy5zZW5kRGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuICAgICAgICAvLyB0aGlzLnNlbmREYXRhLnNlbmRfZGF0ZSA9IG5ldyBEYXRlKHRoaXMuc2VuZERhdGEuc2VuZF9kYXRlKTtcbiAgICAgICAgdGhpcy5pc0VkaXRTZW5kID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZW5kTW9kYWwuc2hvdygpO1xuICAgIH1cblxuICAgIGVkaXRSZWNpZXZlKGRhdGEpIHtcbiAgICAgICAgdGhpcy50bXBEYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy5yZWNpZXZlRGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuICAgICAgICB0aGlzLnJlY2lldmVEYXRhLnJlY3ZfZGF0ZSA9IHRoaXMucmVjaWV2ZURhdGEucmVjdl9kYXRlID8gbmV3IERhdGUodGhpcy5yZWNpZXZlRGF0YS5yZWN2X2RhdGUpIDogdGhpcy5yZWNpZXZlRGF0YS5yZWN2X2RhdGU7XG4gICAgICAgIHRoaXMuaXNFZGl0UmVjaWV2ZSA9IHRydWU7XG4gICAgICAgIHRoaXMucmVjaWV2ZU1vZGFsLnNob3coKTtcbiAgICB9XG5cbiAgICBmaWx0ZXJEZXBhcnRtZW50cyhldmVudCkge1xuICAgICAgICB0aGlzLmZpbHRlcmVkRGVwYXJ0bWVudHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRlcGFydG1lbnRMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBkZXBhcnRtZW50ID0gdGhpcy5kZXBhcnRtZW50TGlzdFtpXTtcbiAgICAgICAgICAgIGlmIChkZXBhcnRtZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZihldmVudC5xdWVyeS50b0xvd2VyQ2FzZSgpKSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZERlcGFydG1lbnRzLnB1c2goZGVwYXJ0bWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBvblN1Ym1pdCgpIHtcbiAgICAgICAgdGhpcy5zdWJtaXR0ZWQgPSB0cnVlO1xuICAgICAgICAvLyDguJbguYnguLIgZm9ybSDguYTguKHguYjguITguKPguJrguKvguKPguLfguK3guJzguLTguJTguJXguLLguKHguYDguIfguLfguYjguK3guJnguYTguILguJfguLXguYjguJXguLHguYnguIfguYTguKfguYnguIjguLDguIjguJrguJfguLXguYjguJXguKPguIfguJnguLXguYlcbiAgICAgICAgY29uc29sZS5sb2coJ3RoaXMucmVnaXN0ZXJGb3JtLmludmFsaWQ6ICcsIHRoaXMucmVnaXN0ZXJGb3JtLmludmFsaWQpO1xuICAgICAgICBpZiAodGhpcy5yZWdpc3RlckZvcm0uaW52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwb3N0RGF0YSA9IFtdO1xuICAgICAgICBsZXQgZGF0YSA9IF8uY2xvbmVEZWVwKHRoaXMuc3RlcERhdGEpO1xuICAgICAgICBkYXRhLmFjdGlvbiA9IFwiYWRkXCI7XG4gICAgICAgIGxldCB1c2VyRGF0YTphbnkgPSB0aGlzLmIyYlNlcnZpY2UuZ2V0VmVyaWZ5VG9rZW4oKTtcbiAgICAgICAgZGF0YS51c2VybmFtZSA9IHVzZXJEYXRhLnVzZXJuYW1lO1xuICAgICAgICBpZihkYXRhLnJlbWluZF9kYXRlKSBkYXRhLnJlbWluZF9kYXRlID0gdGhpcy5kYXRlLmdldE5vdygpLmFkZChkYXRhLnJlbWluZF9kYXRlLCAnZCcpLnRvRGF0ZSgpO1xuICAgICAgICBkZWxldGUgZGF0YVtcImN0X21haW5faWRcIl07XG4gICAgICAgIGRlbGV0ZSBkYXRhW1widXBkYXRlX2RhdGVcIl07XG4gICAgICAgIGxldCBtYWluID0ge1xuICAgICAgICAgICAgXCJjdF9zdGVwX2RhdGFcIjpbZGF0YV1cbiAgICAgICAgfVxuICAgICAgICBwb3N0RGF0YS5wdXNoKG1haW4pO1xuICAgICAgICBpZih0aGlzLnNlbmRMaXN0ICYmIHRoaXMuc2VuZExpc3QubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICBsZXQgY3Rfc2VuZCA9IHtcbiAgICAgICAgICAgICAgICBcImN0X3NlbmRcIjpbXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCBjdF9yZWNpZXZlID0ge1xuICAgICAgICAgICAgICAgIFwiY3RfcmVjaWV2ZVwiOltdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZm9yKGxldCBkYXRhIG9mIHRoaXMuc2VuZExpc3Qpe1xuICAgICAgICAgICAgICAgIGRhdGEubmFtZSA9IGRhdGEubmFtZTtcbiAgICAgICAgICAgICAgICBkYXRhLmFjdGlvbiA9IFwiYWRkXCI7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGRhdGEuaWQ7XG4gICAgICAgICAgICAgICAgY3Rfc2VuZC5jdF9zZW5kLnB1c2goZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3N0RGF0YS5wdXNoKGN0X3NlbmQpO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMucmVjaWV2ZUxpc3QgJiYgdGhpcy5yZWNpZXZlTGlzdC5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgIGxldCBjdF9yZWNpZXZlID0ge1xuICAgICAgICAgICAgICAgIFwiY3RfcmVjaWV2ZVwiOltdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZm9yKGxldCBkYXRhIG9mIHRoaXMucmVjaWV2ZUxpc3Qpe1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhWydzZW5kX2Jvb2tfbm8nXTtcbiAgICAgICAgICAgICAgICBkZWxldGUgZGF0YVsnc2VuZF9kYXRlJ107XG4gICAgICAgICAgICAgICAgZGF0YS5uYW1lID0gZGF0YS5uYW1lO1xuICAgICAgICAgICAgICAgIGRhdGEuYWN0aW9uID0gXCJhZGRcIjtcbiAgICAgICAgICAgICAgICBjdF9yZWNpZXZlLmN0X3JlY2lldmUucHVzaChkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvc3REYXRhLnB1c2goY3RfcmVjaWV2ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coJ3Bvc3REYXRhJyxwb3N0RGF0YSk7XG4gICAgICAgIC8vIGlmKHRoaXMubW9kZSA9PT0gJ0VESVQnKXtcbiAgICAgICAgbGV0IHBvc3RSZXNwb25zZSA9IGF3YWl0IHRoaXMucmVxdWVzdC5wb3N0KFwiL2N0L21haW5cIixwb3N0RGF0YSk7XG4gICAgICAgIGlmKHRoaXMuc3RlcERhdGEudXBkYXRlX2RhdGUpe1xuICAgICAgICAgIGxldCBzdGVwTGlzdCA9IGF3YWl0IHRoaXMuZ2V0U3RlcExpc3QoKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcInN0ZXBMaXN0XCIsc3RlcExpc3QpXG4gICAgICAgICAgaWYoc3RlcExpc3QubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3QucHV0KFwiL2RiL1wiK3RoaXMuc3RlcERhdGEucmVmX3RhYmxlK1wiL1wiK3RoaXMuc3RlcERhdGEucmVmX2lkLHtzdGF0dXM6c3RlcExpc3RbMF0uc3RlcF9uYW1lLHN0YXR1c19kYXRlOnN0ZXBMaXN0WzBdLnN0ZXBfZGF0ZX0pO1xuICAgICAgICAgICAgdGhpcy5jb21tb24uZm5DaGVja1Jlc3BvbnNlKHBvc3RSZXNwb25zZSwgdGhpcy5teU1vZGFsKVxuICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0LnB1dChcIi9kYi9cIit0aGlzLnN0ZXBEYXRhLnJlZl90YWJsZStcIi9cIit0aGlzLnN0ZXBEYXRhLnJlZl9pZCx7c3RhdHVzOnRoaXMuc3RlcERhdGEuc3RlcF9uYW1lfSk7XG4gICAgICAgICAgdGhpcy5jb21tb24uZm5DaGVja1Jlc3BvbnNlKHBvc3RSZXNwb25zZSwgdGhpcy5teU1vZGFsKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gfWVsc2V7XG4gICAgICAgIC8vICAgICB0aGlzLm9uQ3JlYXRlTW9kYWwuZW1pdChwb3N0RGF0YSk7XG4gICAgICAgIC8vIH1cbiAgICB9XG5cbiAgICBhc3luYyBnZXRTdGVwTGlzdCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ2dldFN0ZXBMaXN0Jyk7XG4gICAgICAgIGxldCBmaWx0ZXIgPSB7XG4gICAgICAgICAgICBmaWx0ZXI6e1xuICAgICAgICAgICAgICAgIHJlZl90YWJsZTpcIj1cIit0aGlzLnN0ZXBEYXRhLnJlZl90YWJsZSxcbiAgICAgICAgICAgICAgICByZWZfaWQ6dGhpcy5zdGVwRGF0YS5yZWZfaWQsXG4gICAgICAgICAgICAgICAgc3lzdGVtX2lkOnRoaXMuc3RlcERhdGEuc3lzdGVtX2lkXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3JkZXJfYnk6W1wic3RlcF9kYXRlIGRlc2NcIl1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5yZXF1ZXN0LnBvc3QoJy9zZWFyY2gvY3Rfc3RlcF9kYXRhJywgZmlsdGVyKTtcbiAgICAgICAgcmV0dXJuIGRhdGEucmVzdWx0RGF0YSB8fCBbXTtcbiAgICB9XG5cblxuICAgIG9uQ2xpY2tCYWNrKCl7XG4gICAgICAgIHRoaXMub25VcGRhdGVNb2RhbC5lbWl0KCk7XG4gICAgICAgIHRoaXMuY2xvc2VNb2RhbCgpO1xuICAgIH1cblxuICAgIGFzeW5jIG9uU3VibWl0U2VuZCgpIHtcbiAgICAgICAgdGhpcy5zdWJtaXR0ZWRTZW5kID0gdHJ1ZTtcbiAgICAgICAgLy8g4LiW4LmJ4LiyIGZvcm0g4LmE4Lih4LmI4LiE4Lij4Lia4Lir4Lij4Li34Lit4Lic4Li04LiU4LiV4Liy4Lih4LmA4LiH4Li34LmI4Lit4LiZ4LmE4LiC4LiX4Li14LmI4LiV4Lix4LmJ4LiH4LmE4Lin4LmJ4LiI4Liw4LiI4Lia4LiX4Li14LmI4LiV4Lij4LiH4LiZ4Li14LmJXG4gICAgICAgIGlmICh0aGlzLnNlbmRGb3JtLmludmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc0VkaXRTZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0bXBMaXN0ID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRtcFNlbmQgb2YgdGhpcy5zZW5kTGlzdCkge1xuICAgICAgICAgICAgICAgIGlmICh0bXBTZW5kLmlkID09PSB0aGlzLnRtcERhdGEuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdG1wTGlzdC5wdXNoKHRoaXMuc2VuZERhdGEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRtcExpc3QucHVzaCh0bXBTZW5kKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNlbmRMaXN0ID0gdG1wTGlzdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZERhdGEuaWQgPSB0aGlzLnRlbXBJZDtcbiAgICAgICAgICAgIHRoaXMudGVtcElkLS07XG4gICAgICAgICAgICB0aGlzLnNlbmRMaXN0LnB1c2godGhpcy5zZW5kRGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbG9zZVNlbmRNb2RhbCgpO1xuICAgIH1cblxuICAgIGFzeW5jIG9uU3VibWl0UmVjaWV2ZSgpIHtcbiAgICAgICAgdGhpcy5zdWJtaXR0ZWRTZW5kID0gdHJ1ZTtcblxuICAgICAgICAvLyDguJbguYnguLIgZm9ybSDguYTguKHguYjguITguKPguJrguKvguKPguLfguK3guJzguLTguJTguJXguLLguKHguYDguIfguLfguYjguK3guJnguYTguILguJfguLXguYjguJXguLHguYnguIfguYTguKfguYnguIjguLDguIjguJrguJfguLXguYjguJXguKPguIfguJnguLXguYlcbiAgICAgICAgaWYgKHRoaXMucmVjaWV2ZUZvcm0uaW52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRWRpdFJlY2lldmUpIHtcbiAgICAgICAgICAgIGNvbnN0IHRtcExpc3QgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdG1wU2VuZCBvZiB0aGlzLnJlY2lldmVMaXN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRtcFNlbmQucmVjdl9mcm9tID09PSB0aGlzLnRtcERhdGEucmVjdl9mcm9tKSB7XG4gICAgICAgICAgICAgICAgICAgIHRtcExpc3QucHVzaCh0aGlzLnJlY2lldmVEYXRhKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0bXBMaXN0LnB1c2godG1wU2VuZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZWNpZXZlTGlzdCA9IHRtcExpc3Q7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlY2lldmVMaXN0LnB1c2godGhpcy5yZWNpZXZlRGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbG9zZVJlY2lldmVNb2RhbCgpO1xuICAgIH1cbiAgICBpc0ltcG9ydGFudChkYXRhKXtcbiAgICAgICAgcmV0dXJuIGRhdGEuaXNfaW1wb3J0YW50P1wi4Liq4Liz4LiE4Lix4LiNXCI6XCJcIjtcbiAgICB9XG4gICAgb25VcGxvYWRlZChkYXRhKXtcbiAgICAgICAgdGhpcy5zdGVwRGF0YS51cmwgPSB0aGlzLmF0dGFjaG1lbnRVcmwrJy8nK2RhdGEudXVpZDtcbiAgICAgICAgdGhpcy5zdGVwRGF0YS51dWlkID0gZGF0YS51dWlkO1xuICAgIH1cbiAgICBjaGVja0Rpc2FibGUoZmllbGQpe1xuICAgICAgICBpZih0aGlzLnN0ZXBEYXRhW2ZpZWxkLmZpZWxkX25hbWVdICE9PSAn4LmE4Lih4LmI4LiX4Liy4LiH4LiB4Liy4LijJyl7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBnZXRJbWFnZUxpbmsoZGF0YSl7XG4gICAgICAgIGxldCB1cmwgPSBhd2FpdCB0aGlzLnJlcXVlc3QuZ2V0QXR0YWNobWVudExpbmtUb2tlbihkYXRhLnVybCk7XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxufVxuIl19