modal-step.component.js 137 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 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044
/**
 * @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';
var Options = /** @class */ (function () {
    function Options() {
    }
    return Options;
}());
if (false) {
    /**
     * title เธ—เธตเนˆเธ•เน‰เธญเธ‡เธเธฒเธฃเนเธชเธ”เธ‡
     * @type {?}
     */
    Options.prototype.title;
    /**
     * data
     * @type {?}
     */
    Options.prototype.data;
}
var ModalStepComponent = /** @class */ (function (_super) {
    tslib_1.__extends(ModalStepComponent, _super);
    function ModalStepComponent(appConfigService, request, formBuilder, common, date, b2bService) {
        var _this = _super.call(this) || this;
        _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 _this;
    }
    /**
     * @return {?}
     */
    ModalStepComponent.prototype.ngOnInit = /**
     * @return {?}
     */
    function () {
        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 {?}
     */
    ModalStepComponent.prototype.open = /**
     * @param {?=} options
     * @return {?}
     */
    function (options) {
        return tslib_1.__awaiter(this, void 0, void 0, function () {
            var _a;
            return tslib_1.__generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        console.log(options);
                        this.stepData = {};
                        if (!options) return [3 /*break*/, 2];
                        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'];
                        _a = this;
                        return [4 /*yield*/, this.request.get('/db/ct_step?_where=(category_id,eq,' + options.data.category_id + ')&_sort=seq_no')];
                    case 1:
                        _a.selectList = _b.sent();
                        _b.label = 2;
                    case 2:
                        this.uploadAttachment.clearValue();
                        this.modal.show();
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * @return {?}
     */
    ModalStepComponent.prototype.f = /**
     * @return {?}
     */
    function () { return this.registerForm.controls; };
    /**
     * @return {?}
     */
    ModalStepComponent.prototype.fs = /**
     * @return {?}
     */
    function () { return this.sendForm.controls; };
    /**
     * @return {?}
     */
    ModalStepComponent.prototype.fr = /**
     * @return {?}
     */
    function () { return this.recieveForm.controls; };
    /**
     * @return {?}
     */
    ModalStepComponent.prototype.closeModal = /**
     * @return {?}
     */
    function () {
        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 {?}
     */
    ModalStepComponent.prototype.closeSendModal = /**
     * @return {?}
     */
    function () {
        this.submittedSend = false;
        this.sendData = {};
        this.isEditSend = false;
        this.tmpData = {};
        this.sendModal.hide();
    };
    /**
     * @return {?}
     */
    ModalStepComponent.prototype.closeRecieveModal = /**
     * @return {?}
     */
    function () {
        this.submittedRecieve = false;
        this.recieveData = {};
        this.isEditRecieve = false;
        this.tmpData = {};
        this.recieveModal.hide();
    };
    /**
     * @param {?} modal
     * @return {?}
     */
    ModalStepComponent.prototype.onYesClick = /**
     * @param {?} modal
     * @return {?}
     */
    function (modal) {
        modal.hide();
    };
    /**
     * @param {?} modal
     * @return {?}
     */
    ModalStepComponent.prototype.onNoClick = /**
     * @param {?} modal
     * @return {?}
     */
    function (modal) {
        modal.hide();
    };
    /**
     * @param {?} $event
     * @return {?}
     */
    ModalStepComponent.prototype.onHidden = /**
     * @param {?} $event
     * @return {?}
     */
    function ($event) {
        console.log('LOG MESSAGE: ModalConfirm -> onHidden -> $event', $event);
    };
    /**
     * @param {?} value
     * @return {?}
     */
    ModalStepComponent.prototype.valueSeleteMinistry = /**
     * @param {?} value
     * @return {?}
     */
    function (value) {
        var _this = this;
        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(function () {
            _this.filter_ref_ext_department_id_show = true;
        }, 50);
    };
    /**
     * @param {?} value
     * @return {?}
     */
    ModalStepComponent.prototype.valueSeleteDeptName = /**
     * @param {?} value
     * @return {?}
     */
    function (value) {
        console.log('value', value);
        this.stepData.code_dept = value && value.id ? value.id : null;
    };
    /**
     * @return {?}
     */
    ModalStepComponent.prototype.checkExtraField = /**
     * @return {?}
     */
    function () {
        return tslib_1.__awaiter(this, void 0, void 0, function () {
            var i, flag, requireFlag, ct_step_flag, newField, _a;
            return tslib_1.__generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        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 !== '')) return [3 /*break*/, 6];
                        i = 0;
                        _b.label = 1;
                    case 1:
                        if (!(i < this.selectedStep.flag.length)) return [3 /*break*/, 5];
                        flag = this.selectedStep.flag.charAt(i);
                        requireFlag = this.selectedStep.require_flag ? this.selectedStep.require_flag.charAt(i) : 0;
                        return [4 /*yield*/, this.request.get('/db/ct_step_flag?_where=(flag,eq,' + flag + ')')];
                    case 2:
                        ct_step_flag = _b.sent();
                        newField = ct_step_flag[0];
                        return [4 /*yield*/, this.addField(newField, +requireFlag)];
                    case 3:
                        _b.sent();
                        this.moreField.push(newField);
                        console.log(this.f);
                        _b.label = 4;
                    case 4:
                        i++;
                        return [3 /*break*/, 1];
                    case 5:
                        this.isMore = true;
                        this.isSend = false;
                        this.isRecieve = false;
                        return [3 /*break*/, 9];
                    case 6:
                        this.isMore = false;
                        if (!(this.selectedStep.type_id === 8 || this.selectedStep.type_id === 13)) return [3 /*break*/, 8];
                        _a = this;
                        return [4 /*yield*/, this.request.get('/db/ct_ext_department?_sort=name')];
                    case 7:
                        _a.departmentList = _b.sent();
                        this.departmentList = this.departmentList.map(function (a) { return 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;
                        return [3 /*break*/, 9];
                    case 8:
                        this.isSend = false;
                        this.isRecieve = false;
                        _b.label = 9;
                    case 9: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * @param {?} data
     * @return {?}
     */
    ModalStepComponent.prototype.getFieldId = /**
     * @param {?} data
     * @return {?}
     */
    function (data) {
        /** @type {?} */
        var id = '';
        if (data.type === 'text') {
            id += 'txt';
        }
        else if (data.type === 'datetime') {
            id += 'txt';
        }
        else {
            id += 'txt';
        }
        /** @type {?} */
        var field = data.field_name.charAt(0).toLocaleUpperCase() + data.field_name.substring(1);
        id += field;
        return id;
    };
    /**
     * @param {?} data
     * @param {?} required
     * @return {?}
     */
    ModalStepComponent.prototype.addField = /**
     * @param {?} data
     * @param {?} required
     * @return {?}
     */
    function (data, required) {
        /** @type {?} */
        var control = /** @type {?} */ (this.registerForm.controls['moreField']);
        /** @type {?} */
        var newgroup;
        this.stepData[data.field_name] = null;
        if (data.type === 'text') {
            if (required) {
                /** @type {?} */
                var group = {};
                group[data.field_name] = ['', Validators.required];
                newgroup = this.formBuilder.group(group);
            }
            else {
                /** @type {?} */
                var group = {};
                group[data.field_name] = [''];
                newgroup = this.formBuilder.group(group);
            }
        }
        else if (data.type === 'datetime') {
            if (required) {
                /** @type {?} */
                var group = {};
                group[data.field_name] = ['', Validators.required, CustomValidators.date];
                newgroup = this.formBuilder.group(group);
            }
            else {
                /** @type {?} */
                var 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 {?} */
                var group = {};
                group[data.field_name] = [Validators.required];
                newgroup = this.formBuilder.group(group);
            }
            else {
                /** @type {?} */
                var group = {};
                group[data.field_name] = [''];
                newgroup = this.formBuilder.group(group);
            }
        }
        else if (data.type === 'special') {
            if (data.field_name === 'amount') {
                if (required) {
                    /** @type {?} */
                    var group = {};
                    group[data.field_name] = ['', Validators.required];
                    group['amount_type'] = ['', Validators.required];
                    newgroup = this.formBuilder.group(group);
                }
                else {
                    /** @type {?} */
                    var group = {};
                    group[data.field_name] = [''];
                    group['amount_type'] = [''];
                    newgroup = this.formBuilder.group(group);
                }
            }
            else if (data.field_name === 'follow') {
                if (required) {
                    /** @type {?} */
                    var group = {};
                    group[data.field_name] = ['', Validators.required];
                    group['follow_remark'] = ['', Validators.required];
                    newgroup = this.formBuilder.group(group);
                }
                else {
                    /** @type {?} */
                    var group = {};
                    group[data.field_name] = [''];
                    group['follow_remark'] = [''];
                    newgroup = this.formBuilder.group(group);
                }
            }
            else {
                if (required) {
                    /** @type {?} */
                    var group = {};
                    group[data.field_name] = ['', Validators.required];
                    newgroup = this.formBuilder.group(group);
                }
                else {
                    /** @type {?} */
                    var group = {};
                    group[data.field_name] = [''];
                    newgroup = this.formBuilder.group(group);
                }
            }
        }
        control.push(newgroup);
    };
    /**
     * @param {?} i
     * @param {?} field
     * @param {?=} validateType
     * @return {?}
     */
    ModalStepComponent.prototype.getValidateMoreField = /**
     * @param {?} i
     * @param {?} field
     * @param {?=} validateType
     * @return {?}
     */
    function (i, field, validateType) {
        /** @type {?} */
        var 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 {?}
     */
    ModalStepComponent.prototype.getRowIndex = /**
     * @param {?} data
     * @return {?}
     */
    function (data) {
        if (!data.data) {
            return '';
        }
        /** @type {?} */
        var no = data.row.dataIndex + 1;
        return no;
    };
    /**
     * @param {?} e
     * @return {?}
     */
    ModalStepComponent.prototype.onCellPrepared = /**
     * @param {?} e
     * @return {?}
     */
    function (e) {
        if (e.rowType === 'data') {
            for (var i in e.component.columns) {
                if (e.column.dataField === e.component.columns[i]) {
                    e.cellElement.accessKey = e.component.columns[i];
                }
            }
        }
    };
    /**
     * @return {?}
     */
    ModalStepComponent.prototype.addSend = /**
     * @return {?}
     */
    function () {
        this.sendData.send_date = this.date.getNow();
        this.sendModal.show();
    };
    /**
     * @param {?} data
     * @return {?}
     */
    ModalStepComponent.prototype.editSend = /**
     * @param {?} data
     * @return {?}
     */
    function (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 {?}
     */
    ModalStepComponent.prototype.editRecieve = /**
     * @param {?} data
     * @return {?}
     */
    function (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 {?}
     */
    ModalStepComponent.prototype.filterDepartments = /**
     * @param {?} event
     * @return {?}
     */
    function (event) {
        this.filteredDepartments = [];
        for (var i = 0; i < this.departmentList.length; i++) {
            /** @type {?} */
            var department = this.departmentList[i];
            if (department.toLowerCase().indexOf(event.query.toLowerCase()) == 0) {
                this.filteredDepartments.push(department);
            }
        }
    };
    /**
     * @return {?}
     */
    ModalStepComponent.prototype.onSubmit = /**
     * @return {?}
     */
    function () {
        return tslib_1.__awaiter(this, void 0, void 0, function () {
            var e_1, _a, e_2, _b, postData, data, userData, main, ct_send, ct_recieve, _c, _d, data_1, ct_recieve, _e, _f, data_2, postResponse, stepList;
            return tslib_1.__generator(this, function (_g) {
                switch (_g.label) {
                    case 0:
                        this.submitted = true;
                        // เธ–เน‰เธฒ form เน„เธกเนˆเธ„เธฃเธšเธซเธฃเธทเธญเธœเธดเธ”เธ•เธฒเธกเน€เธ‡เธทเนˆเธญเธ™เน„เธ‚เธ—เธตเนˆเธ•เธฑเน‰เธ‡เน„เธงเน‰เธˆเธฐเธˆเธšเธ—เธตเนˆเธ•เธฃเธ‡เธ™เธตเน‰
                        console.log('this.registerForm.invalid: ', this.registerForm.invalid);
                        if (this.registerForm.invalid) {
                            return [2 /*return*/];
                        }
                        postData = [];
                        data = _.cloneDeep(this.stepData);
                        data.action = "add";
                        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"];
                        main = {
                            "ct_step_data": [data]
                        };
                        postData.push(main);
                        if (this.sendList && this.sendList.length > 0) {
                            ct_send = {
                                "ct_send": []
                            };
                            ct_recieve = {
                                "ct_recieve": []
                            };
                            try {
                                for (_c = tslib_1.__values(this.sendList), _d = _c.next(); !_d.done; _d = _c.next()) {
                                    data_1 = _d.value;
                                    data_1.name = data_1.name;
                                    data_1.action = "add";
                                    delete data_1.id;
                                    ct_send.ct_send.push(data_1);
                                }
                            }
                            catch (e_1_1) { e_1 = { error: e_1_1 }; }
                            finally {
                                try {
                                    if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
                                }
                                finally { if (e_1) throw e_1.error; }
                            }
                            postData.push(ct_send);
                        }
                        if (this.recieveList && this.recieveList.length > 0) {
                            ct_recieve = {
                                "ct_recieve": []
                            };
                            try {
                                for (_e = tslib_1.__values(this.recieveList), _f = _e.next(); !_f.done; _f = _e.next()) {
                                    data_2 = _f.value;
                                    delete data_2['send_book_no'];
                                    delete data_2['send_date'];
                                    data_2.name = data_2.name;
                                    data_2.action = "add";
                                    ct_recieve.ct_recieve.push(data_2);
                                }
                            }
                            catch (e_2_1) { e_2 = { error: e_2_1 }; }
                            finally {
                                try {
                                    if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
                                }
                                finally { if (e_2) throw e_2.error; }
                            }
                            postData.push(ct_recieve);
                        }
                        console.log('postData', postData);
                        return [4 /*yield*/, this.request.post("/ct/main", postData)];
                    case 1:
                        postResponse = _g.sent();
                        if (!this.stepData.update_date) return [3 /*break*/, 5];
                        return [4 /*yield*/, this.getStepList()];
                    case 2:
                        stepList = _g.sent();
                        console.log("stepList", stepList);
                        if (!(stepList.length > 0)) return [3 /*break*/, 4];
                        return [4 /*yield*/, this.request.put("/db/" + this.stepData.ref_table + "/" + this.stepData.ref_id, { status: stepList[0].step_name, status_date: stepList[0].step_date })];
                    case 3:
                        _g.sent();
                        this.common.fnCheckResponse(postResponse, this.myModal);
                        _g.label = 4;
                    case 4: return [3 /*break*/, 7];
                    case 5: return [4 /*yield*/, this.request.put("/db/" + this.stepData.ref_table + "/" + this.stepData.ref_id, { status: this.stepData.step_name })];
                    case 6:
                        _g.sent();
                        this.common.fnCheckResponse(postResponse, this.myModal);
                        _g.label = 7;
                    case 7:
                        // }else{
                        //     this.onCreateModal.emit(postData);
                        // }
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * @return {?}
     */
    ModalStepComponent.prototype.getStepList = /**
     * @return {?}
     */
    function () {
        return tslib_1.__awaiter(this, void 0, void 0, function () {
            var filter, data;
            return tslib_1.__generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        console.log('getStepList');
                        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"]
                        };
                        return [4 /*yield*/, this.request.post('/search/ct_step_data', filter)];
                    case 1:
                        data = _a.sent();
                        return [2 /*return*/, data.resultData || []];
                }
            });
        });
    };
    /**
     * @return {?}
     */
    ModalStepComponent.prototype.onClickBack = /**
     * @return {?}
     */
    function () {
        this.onUpdateModal.emit();
        this.closeModal();
    };
    /**
     * @return {?}
     */
    ModalStepComponent.prototype.onSubmitSend = /**
     * @return {?}
     */
    function () {
        return tslib_1.__awaiter(this, void 0, void 0, function () {
            var e_3, _a, tmpList, _b, _c, tmpSend;
            return tslib_1.__generator(this, function (_d) {
                this.submittedSend = true;
                // เธ–เน‰เธฒ form เน„เธกเนˆเธ„เธฃเธšเธซเธฃเธทเธญเธœเธดเธ”เธ•เธฒเธกเน€เธ‡เธทเนˆเธญเธ™เน„เธ‚เธ—เธตเนˆเธ•เธฑเน‰เธ‡เน„เธงเน‰เธˆเธฐเธˆเธšเธ—เธตเนˆเธ•เธฃเธ‡เธ™เธตเน‰
                if (this.sendForm.invalid) {
                    return [2 /*return*/];
                }
                if (this.isEditSend) {
                    tmpList = [];
                    try {
                        for (_b = tslib_1.__values(this.sendList), _c = _b.next(); !_c.done; _c = _b.next()) {
                            tmpSend = _c.value;
                            if (tmpSend.id === this.tmpData.id) {
                                tmpList.push(this.sendData);
                            }
                            else {
                                tmpList.push(tmpSend);
                            }
                        }
                    }
                    catch (e_3_1) { e_3 = { error: e_3_1 }; }
                    finally {
                        try {
                            if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
                        }
                        finally { if (e_3) throw e_3.error; }
                    }
                    this.sendList = tmpList;
                }
                else {
                    this.sendData.id = this.tempId;
                    this.tempId--;
                    this.sendList.push(this.sendData);
                }
                this.closeSendModal();
                return [2 /*return*/];
            });
        });
    };
    /**
     * @return {?}
     */
    ModalStepComponent.prototype.onSubmitRecieve = /**
     * @return {?}
     */
    function () {
        return tslib_1.__awaiter(this, void 0, void 0, function () {
            var e_4, _a, tmpList, _b, _c, tmpSend;
            return tslib_1.__generator(this, function (_d) {
                this.submittedSend = true;
                // เธ–เน‰เธฒ form เน„เธกเนˆเธ„เธฃเธšเธซเธฃเธทเธญเธœเธดเธ”เธ•เธฒเธกเน€เธ‡เธทเนˆเธญเธ™เน„เธ‚เธ—เธตเนˆเธ•เธฑเน‰เธ‡เน„เธงเน‰เธˆเธฐเธˆเธšเธ—เธตเนˆเธ•เธฃเธ‡เธ™เธตเน‰
                if (this.recieveForm.invalid) {
                    return [2 /*return*/];
                }
                if (this.isEditRecieve) {
                    tmpList = [];
                    try {
                        for (_b = tslib_1.__values(this.recieveList), _c = _b.next(); !_c.done; _c = _b.next()) {
                            tmpSend = _c.value;
                            if (tmpSend.recv_from === this.tmpData.recv_from) {
                                tmpList.push(this.recieveData);
                            }
                            else {
                                tmpList.push(tmpSend);
                            }
                        }
                    }
                    catch (e_4_1) { e_4 = { error: e_4_1 }; }
                    finally {
                        try {
                            if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
                        }
                        finally { if (e_4) throw e_4.error; }
                    }
                    this.recieveList = tmpList;
                }
                else {
                    this.recieveList.push(this.recieveData);
                }
                this.closeRecieveModal();
                return [2 /*return*/];
            });
        });
    };
    /**
     * @param {?} data
     * @return {?}
     */
    ModalStepComponent.prototype.isImportant = /**
     * @param {?} data
     * @return {?}
     */
    function (data) {
        return data.is_important ? "เธชเธณเธ„เธฑเธ" : "";
    };
    /**
     * @param {?} data
     * @return {?}
     */
    ModalStepComponent.prototype.onUploaded = /**
     * @param {?} data
     * @return {?}
     */
    function (data) {
        this.stepData.url = this.attachmentUrl + '/' + data.uuid;
        this.stepData.uuid = data.uuid;
    };
    /**
     * @param {?} field
     * @return {?}
     */
    ModalStepComponent.prototype.checkDisable = /**
     * @param {?} field
     * @return {?}
     */
    function (field) {
        if (this.stepData[field.field_name] !== 'เน„เธกเนˆเธ—เธฒเธ‡เธเธฒเธฃ') {
            return true;
        }
        else {
            return false;
        }
    };
    /**
     * @param {?} data
     * @return {?}
     */
    ModalStepComponent.prototype.getImageLink = /**
     * @param {?} data
     * @return {?}
     */
    function (data) {
        return tslib_1.__awaiter(this, void 0, void 0, function () {
            var url;
            return tslib_1.__generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.request.getAttachmentLinkToken(data.url)];
                    case 1:
                        url = _a.sent();
                        return [2 /*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\">&times;</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\">&nbsp;*</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                                        <!--&gt;-->\n                                            <!--&lt;!&ndash;<div *dxTemplate=\"let type of upLoadType\">&ndash;&gt;-->\n                                                <!--&lt;!&ndash;<span>{{type.name.toUpperCase()}}</span>&ndash;&gt;-->\n                                            <!--&lt;!&ndash;</div>&ndash;&gt;-->\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                                                            <!--&gt;-->\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\">&times;</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\">&times;</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 = function () { return [
        { 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',] }]
    };
    return ModalStepComponent;
}(Options));
export { ModalStepComponent };
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtc3RlcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9zb2MtYXBwLWxpYnJhcnkvIiwic291cmNlcyI6WyJsaWIvbW9kYWwtc3RlcC9tb2RhbC1zdGVwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUE0QixNQUFNLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ25HLE9BQU8sRUFBZSxjQUFjLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDbEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRCxPQUFPLEVBQUMsV0FBVyxFQUF3QixVQUFVLEVBQWtCLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUYsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFdkQsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ3RELE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLGtEQUFrRCxDQUFDO0FBQzNGLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUVwRCxJQUFBOzs7a0JBZEE7SUFtQkMsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7SUFNdUMsOENBQU87SUFnRDNDLDRCQUFvQixnQkFBa0MsRUFBVSxPQUFnQixFQUFVLFdBQXdCLEVBQVMsTUFBYyxFQUFTLElBQWlCLEVBQVMsVUFBc0I7UUFBbE0sWUFDSSxpQkFBTyxTQUlWO1FBTG1CLHNCQUFnQixHQUFoQixnQkFBZ0IsQ0FB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LEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxHQUFDLEdBQUcsR0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3JELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7S0FDbEM7Ozs7O0lBQ0QseUNBQVk7Ozs7SUFBWixVQUFhLEtBQUs7UUFDZCxJQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLFdBQVcsRUFBQztZQUMvQyxPQUFPLElBQUksQ0FBQztTQUNmO2FBQUk7WUFDRCxPQUFPLEtBQUssQ0FBQztTQUNoQjtLQUNKOzs7OztJQUVLLHlDQUFZOzs7O0lBQWxCLFVBQW1CLElBQUk7Ozs7OzRCQUNULHFCQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFBOzt3QkFBekQsR0FBRyxHQUFHLFNBQW1EO3dCQUM3RCxzQkFBTyxHQUFHLEVBQUM7Ozs7S0FDZDs7Z0JBamhCSixTQUFTLFNBQUM7b0JBQ1AsUUFBUSxFQUFFLFlBQVk7b0JBQ3RCLG0zbERBQTBDO2lCQUM3Qzs7OztnQkF0Qk8sZ0JBQWdCO2dCQUNmLE9BQU87Z0JBRVIsV0FBVztnQkFEWCxNQUFNO2dCQU1OLFdBQVc7Z0JBRVgsVUFBVTs7O2dDQWNiLE1BQU07d0JBRU4sU0FBUyxTQUFDLE9BQU87MEJBQ2pCLFNBQVMsU0FBQyxTQUFTOzRCQUNuQixTQUFTLFNBQUMsV0FBVzsrQkFDckIsU0FBUyxTQUFDLGNBQWM7eUNBQ3hCLFNBQVMsU0FBQyx3QkFBd0I7bUNBRWxDLFNBQVMsU0FBQyxrQkFBa0I7OzZCQWxDakM7RUF5QndDLE9BQU87U0FBbEMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge01vZGFsT3B0aW9ucywgTW9kYWxEaXJlY3RpdmV9IGZyb20gJ25neC1ib290c3RyYXAnO1xuaW1wb3J0IHtBcHBDb25maWdTZXJ2aWNlfSBmcm9tICcuLi9hcHAtY29uZmlnL2FwcC1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBSZXF1ZXN0IH0gZnJvbSAnLi4vX3NlcnZpY2VzL3JlcXVlc3Quc2VydmljZSc7XG5pbXBvcnQge0NvbW1vbn0gZnJvbSAnLi4vX3NlcnZpY2VzL2NvbW1vbi5zZXJ2aWNlJztcbmltcG9ydCB7Rm9ybUJ1aWxkZXIsIEZvcm1BcnJheSwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzLCBBYnN0cmFjdENvbnRyb2x9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7Q3VzdG9tVmFsaWRhdG9yc30gZnJvbSAnbmcyLXZhbGlkYXRpb24nO1xuaW1wb3J0IHtEeERhdGFHcmlkQ29tcG9uZW50fSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXInO1xuaW1wb3J0ICogYXMgdXVpZCBmcm9tICd1dWlkJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7RGF0ZVNlcnZpY2V9IGZyb20gJy4uL19zZXJ2aWNlcy9kYXRlLnNlcnZpY2UnO1xuaW1wb3J0IHtVcGxvYWRBdHRhY2htZW50Q29tcG9uZW50fSBmcm9tICcuLi91cGxvYWQtYXR0YWNobWVudC91cGxvYWQtYXR0YWNobWVudC5jb21wb25lbnQnO1xuaW1wb3J0IHtCMmJTZXJ2aWNlfSBmcm9tICcuLi9fc2VydmljZXMvYjJiLnNlcnZpY2UnO1xuXG5jbGFzcyBPcHRpb25zIHtcbiAgICAvKiogdGl0bGUg4LiX4Li14LmI4LiV4LmJ4Lit4LiH4LiB4Liy4Lij4LmB4Liq4LiU4LiHICovXG4gICAgdGl0bGU/OiBTdHJpbmc7XG4gICAgLyoqIGRhdGEgKi9cbiAgICBkYXRhOiBhbnk7XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbW9kYWwtc3RlcCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL21vZGFsLXN0ZXAuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBNb2RhbFN0ZXBDb21wb25lbnQgZXh0ZW5kcyBPcHRpb25zIGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBAT3V0cHV0KCkgb25VcGRhdGVNb2RhbCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAvLyBAT3V0cHV0KCkgb25DcmVhdGVNb2RhbCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAVmlld0NoaWxkKCdtb2RhbCcpIG1vZGFsOiBNb2RhbERpcmVjdGl2ZTtcbiAgICBAVmlld0NoaWxkKCdteU1vZGFsJykgbXlNb2RhbDtcbiAgICBAVmlld0NoaWxkKCdzZW5kTW9kYWwnKSBzZW5kTW9kYWw6IE1vZGFsRGlyZWN0aXZlO1xuICAgIEBWaWV3Q2hpbGQoJ3JlY2lldmVNb2RhbCcpIHJlY2lldmVNb2RhbDogTW9kYWxEaXJlY3RpdmU7XG4gICAgQFZpZXdDaGlsZCgnZHhEYXRhR3JpZFN0ZXBTZW5kTGlzdCcpXG4gICAgZHhEYXRhR3JpZFN0ZXBTZW5kTGlzdDogRHhEYXRhR3JpZENvbXBvbmVudDtcbiAgICBAVmlld0NoaWxkKCd1cGxvYWRBdHRhY2htZW50JykgdXBsb2FkQXR0YWNobWVudDogVXBsb2FkQXR0YWNobWVudENvbXBvbmVudDtcblxuICAgIHJlZ2lzdGVyRm9ybTogRm9ybUdyb3VwO1xuICAgIHNlbmRGb3JtOiBGb3JtR3JvdXA7XG4gICAgcmVjaWV2ZUZvcm06IEZvcm1Hcm91cDtcbiAgICBzdWJtaXR0ZWQgPSBmYWxzZTtcbiAgICBzdWJtaXR0ZWRTZW5kID0gZmFsc2U7XG4gICAgc3VibWl0dGVkUmVjaWV2ZSA9IGZhbHNlO1xuICAgIHRpdGxlOiBhbnkgPSAnJztcbiAgICBzZWxlY3RMaXN0OiBhbnkgPSBbXTtcbiAgICBzZW5kTGlzdDogYW55ID0gW107XG4gICAgcmVjaWV2ZUxpc3Q6IGFueSA9IFtdO1xuICAgIG1vZGFsQ29uZmlnOiBNb2RhbE9wdGlvbnMgPSB7XG4gICAgICAgIGlnbm9yZUJhY2tkcm9wQ2xpY2s6IHRydWVcbiAgICB9O1xuICAgIHRoO1xuICAgIHNlbGVjdGVkU3RlcDogYW55ID0gbnVsbDtcbiAgICBpc01vcmUgPSBmYWxzZTtcbiAgICBtb3JlRmllbGQ6IGFueTtcbiAgICBwdWJsaWMgY29uZmlnOiBhbnk7XG4gICAgc3RlcERhdGE6IGFueSA9IHt9O1xuICAgIHNlbmREYXRhOiBhbnkgPSB7fTtcbiAgICByZWNpZXZlRGF0YTogYW55ID0ge307XG4gICAgbGFzdFN0ZXAgPSAnJztcbiAgICBpc1NlbmQgPSBmYWxzZTtcbiAgICBpc1JlY2lldmUgPSBmYWxzZTtcbiAgICBpc0VkaXRTZW5kID0gZmFsc2U7XG4gICAgaXNFZGl0UmVjaWV2ZSA9IGZhbHNlO1xuICAgIHRtcERhdGE6YW55ID0ge307XG4gICAgZmlsdGVyZWREZXBhcnRtZW50czphbnkgPSBbXTtcbiAgICBkZXBhcnRtZW50TGlzdDphbnkgPSBbXTtcbiAgICBkZXBhcnRtZW50VXJsID0gXCIvZGIvY3RfZXh0X2RlcGFydG1lbnRcIjtcbiAgICBjYXVzZVVybCA9IFwiL2RiL2N0X2Ryb3Bkb3duXCI7XG4gICAgY2F1c2VGaWx0ZXIgPSBcInN5c3RlbV9pZCxlcSwyMykkYW5kKGRyb3Bkb3duX3R5cGUsbGlrZSzguYDguKPguLfguYjguK3guIfguKrguYjguIfguITguLfguJlcIjtcbiAgICB0ZW1wSWQgPSAtMTtcbiAgICBhdHRhY2htZW50VXJsO1xuICAgIHN5c3RlbV9pZDtcbiAgICBmaWx0ZXJfcmVmX2V4dF9kZXBhcnRtZW50X2lkOiBhbnkgPSBmYWxzZTtcbiAgICBmaWx0ZXJfcmVmX2V4dF9kZXBhcnRtZW50X2lkX3Nob3cgPSB0cnVlO1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgYXBwQ29uZmlnU2VydmljZTogQXBwQ29uZmlnU2VydmljZSwgcHJpdmF0ZSByZXF1ZXN0OiBSZXF1ZXN0LCBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlciwgcHVibGljIGNvbW1vbjogQ29tbW9uLCBwdWJsaWMgZGF0ZTogRGF0ZVNlcnZpY2UsIHB1YmxpYyBiMmJTZXJ2aWNlOiBCMmJTZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuY29uZmlnID0gYXBwQ29uZmlnU2VydmljZS5nZXRDb25maWcoKTtcbiAgICAgICAgdGhpcy5hdHRhY2htZW50VXJsID0gXy5nZXQodGhpcy5jb25maWcsICdhcGlTZXJ2ZXJzLmFsZnJlc2NvLnVybCcpIHx8IFwiaHR0cHM6Ly8yMDMuMTU0LjMyLjEyNjoyNTg1L2FwaS9tZmVjL0FsZnJlc2NvXCI7XG4gICAgICAgIHRoaXMuc3lzdGVtX2lkID0gXy5nZXQodGhpcy5jb25maWcsICdzeXN0ZW1faWQnKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy50aCA9IHRoaXMuY29tbW9uLmZuTG9jYWxQQ2FsZW5kYXIoJ3RoJyk7XG4gICAgICAgIHRoaXMucmVjaWV2ZUZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgICAgICAgIGJvb2tfbm86IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgICAgICAgIHJlY3ZfZGF0ZTogWycnXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2VuZEZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgICAgICAgIHNlbmRfdG86IFsnJ10sXG4gICAgICAgICAgICBib29rX25vOiBbJyddLFxuICAgICAgICAgICAgc2VuZF9kYXRlOiBbJyddLFxuICAgICAgICAgICAgaXNfaW1wb3J0YW50OiBbJyddLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgICAgICAgIG5hbWU6IFsnJ10sXG4gICAgICAgICAgICBzdGVwX2lkOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICAgICAgc3RlcF9kYXRlOiBbJyddLFxuICAgICAgICAgICAgcmVtYXJrOiBbJyddLFxuICAgICAgICAgICAgbGFzdFN0ZXA6IFsnJ10sXG4gICAgICAgICAgICBtb3JlRmllbGQ6IHRoaXMuZm9ybUJ1aWxkZXIuYXJyYXkoW10pLFxuICAgICAgICAgICAgc29jX3JlY3Zfbm86IFsnJ10sXG4gICAgICAgICAgICBzb2NfcmVjdl9kYXRlOiBbJyddLFxuICAgICAgICAgICAgZ3RjX3JlY3Zfbm86IFsnJ10sXG4gICAgICAgICAgICBndGNfcmVjdl9kYXRlOiBbJyddLFxuICAgICAgICAgICAgYm9va19ubzogWycnXSxcbiAgICAgICAgICAgIGJvb2tfZGF0ZTogWycnXSxcbiAgICAgICAgICAgICdmb3InOiBbJyddLFxuICAgICAgICAgICAgZGVwdF9uYW1lOiBbJyddLFxuICAgICAgICAgICAgbWluaXN0cnk6IFsnJ11cblxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBvcGVuKG9wdGlvbnM/OiBPcHRpb25zKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnN0ZXBEYXRhID0ge307XG4gICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLnRpdGxlID0gb3B0aW9ucy50aXRsZSB8fCAnJztcbiAgICAgICAgICAgIHRoaXMubGFzdFN0ZXAgPSBvcHRpb25zLmRhdGEubGFzdFN0ZXA7XG4gICAgICAgICAgICB0aGlzLnN0ZXBEYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvcHRpb25zLmRhdGEpKTtcbiAgICAgICAgICAgIHRoaXMuc3RlcERhdGEuc3RlcF9kYXRlID0gdGhpcy5kYXRlLmdldE5vdygpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuc3RlcERhdGFbJ2xhc3RTdGVwJ107XG4gICAgICAgICAgICB0aGlzLnNlbGVjdExpc3QgPSBhd2FpdCB0aGlzLnJlcXVlc3QuZ2V0KCcvZGIvY3Rfc3RlcD9fd2hlcmU9KGNhdGVnb3J5X2lkLGVxLCcgKyBvcHRpb25zLmRhdGEuY2F0ZWdvcnlfaWQgKyAnKSZfc29ydD1zZXFfbm8nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwbG9hZEF0dGFjaG1lbnQuY2xlYXJWYWx1ZSgpO1xuICAgICAgICB0aGlzLm1vZGFsLnNob3coKTtcbiAgICB9XG5cbiAgICBmKCkgeyByZXR1cm4gdGhpcy5yZWdpc3RlckZvcm0uY29udHJvbHM7IH1cbiAgICBmcygpIHsgcmV0dXJuIHRoaXMuc2VuZEZvcm0uY29udHJvbHM7IH1cbiAgICBmcigpIHsgcmV0dXJuIHRoaXMucmVjaWV2ZUZvcm0uY29udHJvbHM7IH1cblxuICAgIGNsb3NlTW9kYWwoKSB7XG4gICAgICAgIHRoaXMuc3VibWl0dGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2VsZWN0TGlzdCA9IFtdO1xuICAgICAgICB0aGlzLnNlbmRMaXN0ID0gW107XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTdGVwID0gbnVsbDtcbiAgICAgICAgdGhpcy5pc01vcmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc1NlbmQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tb3JlRmllbGQgPSBbXTtcbiAgICAgICAgdGhpcy5zdGVwRGF0YSA9IHt9O1xuICAgICAgICB0aGlzLmxhc3RTdGVwID0gJyc7XG4gICAgICAgIHRoaXMubW9kYWwuaGlkZSgpO1xuICAgIH1cblxuICAgIGNsb3NlU2VuZE1vZGFsKCkge1xuICAgICAgICB0aGlzLnN1Ym1pdHRlZFNlbmQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZW5kRGF0YSA9IHt9O1xuICAgICAgICB0aGlzLmlzRWRpdFNlbmQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50bXBEYXRhID0ge307XG4gICAgICAgIHRoaXMuc2VuZE1vZGFsLmhpZGUoKTtcbiAgICB9XG5cbiAgICBjbG9zZVJlY2lldmVNb2RhbCgpIHtcbiAgICAgICAgdGhpcy5zdWJtaXR0ZWRSZWNpZXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVjaWV2ZURhdGEgPSB7fTtcbiAgICAgICAgdGhpcy5pc0VkaXRSZWNpZXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG1wRGF0YSA9IHt9O1xuICAgICAgICB0aGlzLnJlY2lldmVNb2RhbC5oaWRlKCk7XG4gICAgfVxuXG4gICAgb25ZZXNDbGljayhtb2RhbCkge1xuICAgICAgICBtb2RhbC5oaWRlKCk7XG4gICAgfVxuXG4gICAgb25Ob0NsaWNrKG1vZGFsKSB7XG4gICAgICAgIG1vZGFsLmhpZGUoKTtcbiAgICB9XG5cbiAgICBvbkhpZGRlbigkZXZlbnQ6IE1vZGFsRGlyZWN0aXZlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdMT0cgTUVTU0FHRTogTW9kYWxDb25maXJtIC0+IG9uSGlkZGVuIC0+ICRldmVudCcsICRldmVudCk7XG5cbiAgICB9XG4gICAgXG4gICAgdmFsdWVTZWxldGVNaW5pc3RyeSh2YWx1ZSkge1xuICAgICAgdGhpcy5maWx0ZXJfcmVmX2V4dF9kZXBhcnRtZW50X2lkX3Nob3cgPSBmYWxzZTtcbiAgICAgIGNvbnNvbGUubG9nKCd2YWx1ZScsIHZhbHVlKVxuICAgICAgLy8gdGhpcy5zdGVwRGF0YS5taW5pc3RyeV9pZCA9IHZhbHVlICYmIHZhbHVlLmlkID8gdmFsdWUuaWQgOiBudWxsXG4gICAgICBpZiAodmFsdWUgJiYgdmFsdWUuaWQpIHtcbiAgICAgICAgdGhpcy5zdGVwRGF0YS5kZXB0X25hbWUgPSBudWxsXG4gICAgICAgIHRoaXMuZmlsdGVyX3JlZl9leHRfZGVwYXJ0bWVudF9pZCA9IGAmX3doZXJlPShyZWZfZXh0X2RlcGFydG1lbnRfaWQsZXEsJHt2YWx1ZS5pZH0pJGFuZCh0eXBlLGluLDIsMyw0LDUpYFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5maWx0ZXJfcmVmX2V4dF9kZXBhcnRtZW50X2lkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5maWx0ZXJfcmVmX2V4dF9kZXBhcnRtZW50X2lkX3Nob3cgPSB0cnVlO1xuICAgICAgfSwgNTApXG5cbiAgICB9XG5cbiAgICB2YWx1ZVNlbGV0ZURlcHROYW1lKHZhbHVlKSB7XG4gICAgICBjb25zb2xlLmxvZygndmFsdWUnLCB2YWx1ZSlcbiAgICAgIHRoaXMuc3RlcERhdGEuY29kZV9kZXB0ID0gdmFsdWUgJiYgdmFsdWUuaWQgPyB2YWx1ZS5pZCA6IG51bGxcbiAgICB9XG5cblxuICAgIGFzeW5jIGNoZWNrRXh0cmFGaWVsZCgpIHtcbiAgICAgICAgdGhpcy5zdGVwRGF0YS5zdGVwX2lkID0gdGhpcy5zZWxlY3RlZFN0ZXAuaWQ7XG4gICAgICAgIHRoaXMuc3RlcERhdGEuc3RlcF9uYW1lID0gdGhpcy5zZWxlY3RlZFN0ZXAubmFtZTtcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5pc01vcmUpO1xuICAgICAgICB0aGlzLm1vcmVGaWVsZCA9IFtdO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFN0ZXAuZmxhZyAmJiB0aGlzLnNlbGVjdGVkU3RlcC5mbGFnICE9PSAnJykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkU3RlcC5mbGFnLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmxhZyA9IHRoaXMuc2VsZWN0ZWRTdGVwLmZsYWcuY2hhckF0KGkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVpcmVGbGFnID0gdGhpcy5zZWxlY3RlZFN0ZXAucmVxdWlyZV9mbGFnID8gdGhpcy5zZWxlY3RlZFN0ZXAucmVxdWlyZV9mbGFnLmNoYXJBdChpKSA6IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgY3Rfc3RlcF9mbGFnID0gYXdhaXQgdGhpcy5yZXF1ZXN0LmdldCgnL2RiL2N0X3N0ZXBfZmxhZz9fd2hlcmU9KGZsYWcsZXEsJyArIGZsYWcgKyAnKScpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0ZpZWxkID0gY3Rfc3RlcF9mbGFnWzBdO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkRmllbGQobmV3RmllbGQsICtyZXF1aXJlRmxhZyk7XG4gICAgICAgICAgICAgICAgdGhpcy5tb3JlRmllbGQucHVzaChuZXdGaWVsZCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5mKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaXNNb3JlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuaXNTZW5kID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmlzUmVjaWV2ZSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pc01vcmUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkU3RlcC50eXBlX2lkID09PSA4IHx8IHRoaXMuc2VsZWN0ZWRTdGVwLnR5cGVfaWQgPT09IDEzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXBhcnRtZW50TGlzdCA9IGF3YWl0IHRoaXMucmVxdWVzdC5nZXQoJy9kYi9jdF9leHRfZGVwYXJ0bWVudD9fc29ydD1uYW1lJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXBhcnRtZW50TGlzdCA9IHRoaXMuZGVwYXJ0bWVudExpc3QubWFwKGEgPT4gYS5uYW1lKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzU2VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1JlY2lldmUgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZFN0ZXAudHlwZV9pZCA9PT0gOSB8fCB0aGlzLnNlbGVjdGVkU3RlcC50eXBlX2lkID09PSAxNCkge1xuICAgICAgICAgICAgLy8gICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLnJlcXVlc3QucG9zdCgnL3NxbC9nZXRMYXN0U2VuZCcsIHRoaXMuc3RlcERhdGEpO1xuICAgICAgICAgICAgLy8gICAgIGlmIChkYXRhLnJlc3VsdERhdGEgJiYgZGF0YS5yZXN1bHREYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgY29uc3QgY3Rfc3RlcF9kYXRhX2lkID0gZGF0YS5yZXN1bHREYXRhWzBdLmlkO1xuICAgICAgICAgICAgLy8gICAgICAgICBjb25zdCBjdF9zZW5kTGlzdCA9IGF3YWl0IHRoaXMucmVxdWVzdC5nZXQoJy9kYi9jdF9zZW5kP193aGVyZT0oY3Rfc3RlcF9kYXRhX2lkLGVxLCcgKyBjdF9zdGVwX2RhdGFfaWQgKyAnKScpO1xuICAgICAgICAgICAgLy8gICAgICAgICBmb3IgKGNvbnN0IGN0X3NlbmQgb2YgY3Rfc2VuZExpc3QpIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIGNvbnN0IHJlY3ZEYXRhOiBhbnkgPSB7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgY3Rfc2VuZF9pZDogY3Rfc2VuZC5pZCxcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBzZW5kX2Jvb2tfbm86IGN0X3NlbmQuYm9va19ubyxcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBzZW5kX2RhdGU6IGN0X3NlbmQuc2VuZF9kYXRlLFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIHJlY3ZfZnJvbTogY3Rfc2VuZC5zZW5kX3RvLFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIG5hbWU6IGN0X3NlbmQubmFtZVxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIHRoaXMucmVjaWV2ZUxpc3QucHVzaChyZWN2RGF0YSk7XG4gICAgICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyAgICAgdGhpcy5pc1JlY2lldmUgPSB0cnVlO1xuICAgICAgICAgICAgLy8gICAgIHRoaXMuaXNTZW5kID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNTZW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1JlY2lldmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldEZpZWxkSWQoZGF0YSkge1xuICAgICAgICBsZXQgaWQgPSAnJztcbiAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgICBpZCArPSAndHh0JztcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICdkYXRldGltZScpIHtcbiAgICAgICAgICAgIGlkICs9ICd0eHQnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWQgKz0gJ3R4dCc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmllbGQgPSBkYXRhLmZpZWxkX25hbWUuY2hhckF0KDApLnRvTG9jYWxlVXBwZXJDYXNlKCkgKyBkYXRhLmZpZWxkX25hbWUuc3Vic3RyaW5nKDEpO1xuICAgICAgICBpZCArPSBmaWVsZDtcbiAgICAgICAgcmV0dXJuIGlkO1xuICAgIH1cblxuICAgIGFkZEZpZWxkKGRhdGEsIHJlcXVpcmVkKSB7XG4gICAgICAgIGxldCBjb250cm9sOmFueSA9IDxGb3JtQXJyYXk+dGhpcy5yZWdpc3RlckZvcm0uY29udHJvbHNbJ21vcmVGaWVsZCddO1xuICAgICAgICBsZXQgbmV3Z3JvdXA7XG4gICAgICAgIHRoaXMuc3RlcERhdGFbZGF0YS5maWVsZF9uYW1lXSA9IG51bGw7XG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXA6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgIGdyb3VwW2RhdGEuZmllbGRfbmFtZV0gPSBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdO1xuICAgICAgICAgICAgICAgIG5ld2dyb3VwID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cChncm91cCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICBncm91cFtkYXRhLmZpZWxkX25hbWVdID0gWycnXTtcbiAgICAgICAgICAgICAgICBuZXdncm91cCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoZ3JvdXApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gJ2RhdGV0aW1lJykge1xuICAgICAgICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXA6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgIGdyb3VwW2RhdGEuZmllbGRfbmFtZV0gPSBbJycsVmFsaWRhdG9ycy5yZXF1aXJlZCwgQ3VzdG9tVmFsaWRhdG9ycy5kYXRlXTtcbiAgICAgICAgICAgICAgICBuZXdncm91cCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoZ3JvdXApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cDogYW55ID0ge307XG4gICAgICAgICAgICAgICAgZ3JvdXBbZGF0YS5maWVsZF9uYW1lXSA9IFsnJ107XG4gICAgICAgICAgICAgICAgbmV3Z3JvdXAgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKGdyb3VwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3RlcERhdGFbZGF0YS5maWVsZF9uYW1lXSA9IHRoaXMuZGF0ZS5nZXROb3coKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBpZiAocmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cDogYW55ID0ge307XG4gICAgICAgICAgICAgICAgZ3JvdXBbZGF0YS5maWVsZF9uYW1lXSA9IFtWYWxpZGF0b3JzLnJlcXVpcmVkXTtcbiAgICAgICAgICAgICAgICBuZXdncm91cCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoZ3JvdXApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cDogYW55ID0ge307XG4gICAgICAgICAgICAgICAgZ3JvdXBbZGF0YS5maWVsZF9uYW1lXSA9IFsnJ107XG4gICAgICAgICAgICAgICAgbmV3Z3JvdXAgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKGdyb3VwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICdzcGVjaWFsJyl7XG4gICAgICAgICAgICBpZihkYXRhLmZpZWxkX25hbWUgPT09ICdhbW91bnQnKXtcbiAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXA6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBncm91cFtkYXRhLmZpZWxkX25hbWVdID0gWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXTtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBbJ2Ftb3VudF90eXBlJ10gPSBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdO1xuICAgICAgICAgICAgICAgICAgICBuZXdncm91cCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoZ3JvdXApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBbZGF0YS5maWVsZF9uYW1lXSA9IFsnJ107XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwWydhbW91bnRfdHlwZSddID0gWycnXTtcbiAgICAgICAgICAgICAgICAgICAgbmV3Z3JvdXAgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKGdyb3VwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9ZWxzZSBpZihkYXRhLmZpZWxkX25hbWUgPT09ICdmb2xsb3cnKXtcbiAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXA6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBncm91cFtkYXRhLmZpZWxkX25hbWVdID0gWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXTtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBbJ2ZvbGxvd19yZW1hcmsnXSA9IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF07XG4gICAgICAgICAgICAgICAgICAgIG5ld2dyb3VwID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cChncm91cCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXA6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBncm91cFtkYXRhLmZpZWxkX25hbWVdID0gWycnXTtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBbJ2ZvbGxvd19yZW1hcmsnXSA9IFsnJ107XG4gICAgICAgICAgICAgICAgICAgIG5ld2dyb3VwID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cChncm91cCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBbZGF0YS5maWVsZF9uYW1lXSA9IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF07XG4gICAgICAgICAgICAgICAgICAgIG5ld2dyb3VwID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cChncm91cCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXA6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBncm91cFtkYXRhLmZpZWxkX25hbWVdID0gWycnXTtcbiAgICAgICAgICAgICAgICAgICAgbmV3Z3JvdXAgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKGdyb3VwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250cm9sLnB1c2gobmV3Z3JvdXApO1xuICAgIH1cblxuICAgIGdldFZhbGlkYXRlTW9yZUZpZWxkKGksIGZpZWxkLCB2YWxpZGF0ZVR5cGU/KSB7XG4gICAgICAgIGxldCBmb3JtTW9yZUZpZWxkOiBhbnkgPSB0aGlzLmYoKVsnbW9yZUZpZWxkJ107XG4gICAgICAgIGlmICh2YWxpZGF0ZVR5cGUpIHtcbiAgICAgICAgICAgIGZvcm1Nb3JlRmllbGQgPSBmb3JtTW9yZUZpZWxkLmNvbnRyb2xzW2ldO1xuICAgICAgICAgICAgZm9ybU1vcmVGaWVsZCA9IGZvcm1Nb3JlRmllbGQuY29udHJvbHNbZmllbGRdO1xuICAgICAgICAgICAgaWYgKGZvcm1Nb3JlRmllbGQuZXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvcm1Nb3JlRmllbGQuZXJyb3JzW3ZhbGlkYXRlVHlwZV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBmb3JtTW9yZUZpZWxkLmVycm9ycztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtTW9yZUZpZWxkLmVycm9ycztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFJvd0luZGV4KGRhdGEpIHtcbiAgICAgICAgaWYgKCFkYXRhLmRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBubyA9IGRhdGEucm93LmRhdGFJbmRleCArIDE7XG4gICAgICAgIHJldHVybiBubztcbiAgICB9XG5cbiAgICBvbkNlbGxQcmVwYXJlZChlKSB7XG4gICAgICAgIGlmIChlLnJvd1R5cGUgPT09ICdkYXRhJykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpIGluIGUuY29tcG9uZW50LmNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5jb2x1bW4uZGF0YUZpZWxkID09PSBlLmNvbXBvbmVudC5jb2x1bW5zW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIGUuY2VsbEVsZW1lbnQuYWNjZXNzS2V5ID0gZS5jb21wb25lbnQuY29sdW1uc1tpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRTZW5kKCl7XG4gICAgICAgIHRoaXMuc2VuZERhdGEuc2VuZF9kYXRlID0gdGhpcy5kYXRlLmdldE5vdygpO1xuICAgICAgICB0aGlzLnNlbmRNb2RhbC5zaG93KCk7XG4gICAgfVxuXG4gICAgZWRpdFNlbmQoZGF0YSkge1xuICAgICAgICB0aGlzLnRtcERhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLnNlbmREYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSk7XG4gICAgICAgIC8vIHRoaXMuc2VuZERhdGEuc2VuZF9kYXRlID0gbmV3IERhdGUodGhpcy5zZW5kRGF0YS5zZW5kX2RhdGUpO1xuICAgICAgICB0aGlzLmlzRWRpdFNlbmQgPSB0cnVlO1xuICAgICAgICB0aGlzLnNlbmRNb2RhbC5zaG93KCk7XG4gICAgfVxuXG4gICAgZWRpdFJlY2lldmUoZGF0YSkge1xuICAgICAgICB0aGlzLnRtcERhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLnJlY2lldmVEYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSk7XG4gICAgICAgIHRoaXMucmVjaWV2ZURhdGEucmVjdl9kYXRlID0gdGhpcy5yZWNpZXZlRGF0YS5yZWN2X2RhdGUgPyBuZXcgRGF0ZSh0aGlzLnJlY2lldmVEYXRhLnJlY3ZfZGF0ZSkgOiB0aGlzLnJlY2lldmVEYXRhLnJlY3ZfZGF0ZTtcbiAgICAgICAgdGhpcy5pc0VkaXRSZWNpZXZlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZWNpZXZlTW9kYWwuc2hvdygpO1xuICAgIH1cblxuICAgIGZpbHRlckRlcGFydG1lbnRzKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuZmlsdGVyZWREZXBhcnRtZW50cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZGVwYXJ0bWVudExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGRlcGFydG1lbnQgPSB0aGlzLmRlcGFydG1lbnRMaXN0W2ldO1xuICAgICAgICAgICAgaWYgKGRlcGFydG1lbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKGV2ZW50LnF1ZXJ5LnRvTG93ZXJDYXNlKCkpID09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkRGVwYXJ0bWVudHMucHVzaChkZXBhcnRtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIG9uU3VibWl0KCkge1xuICAgICAgICB0aGlzLnN1Ym1pdHRlZCA9IHRydWU7XG4gICAgICAgIC8vIOC4luC5ieC4siBmb3JtIOC5hOC4oeC5iOC4hOC4o+C4muC4q+C4o+C4t+C4reC4nOC4tOC4lOC4leC4suC4oeC5gOC4h+C4t+C5iOC4reC4meC5hOC4guC4l+C4teC5iOC4leC4seC5ieC4h+C5hOC4p+C5ieC4iOC4sOC4iOC4muC4l+C4teC5iOC4leC4o+C4h+C4meC4teC5iVxuICAgICAgICBjb25zb2xlLmxvZygndGhpcy5yZWdpc3RlckZvcm0uaW52YWxpZDogJywgdGhpcy5yZWdpc3RlckZvcm0uaW52YWxpZCk7XG4gICAgICAgIGlmICh0aGlzLnJlZ2lzdGVyRm9ybS5pbnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBvc3REYXRhID0gW107XG4gICAgICAgIGxldCBkYXRhID0gXy5jbG9uZURlZXAodGhpcy5zdGVwRGF0YSk7XG4gICAgICAgIGRhdGEuYWN0aW9uID0gXCJhZGRcIjtcbiAgICAgICAgbGV0IHVzZXJEYXRhOmFueSA9IHRoaXMuYjJiU2VydmljZS5nZXRWZXJpZnlUb2tlbigpO1xuICAgICAgICBkYXRhLnVzZXJuYW1lID0gdXNlckRhdGEudXNlcm5hbWU7XG4gICAgICAgIGlmKGRhdGEucmVtaW5kX2RhdGUpIGRhdGEucmVtaW5kX2RhdGUgPSB0aGlzLmRhdGUuZ2V0Tm93KCkuYWRkKGRhdGEucmVtaW5kX2RhdGUsICdkJykudG9EYXRlKCk7XG4gICAgICAgIGRlbGV0ZSBkYXRhW1wiY3RfbWFpbl9pZFwiXTtcbiAgICAgICAgZGVsZXRlIGRhdGFbXCJ1cGRhdGVfZGF0ZVwiXTtcbiAgICAgICAgbGV0IG1haW4gPSB7XG4gICAgICAgICAgICBcImN0X3N0ZXBfZGF0YVwiOltkYXRhXVxuICAgICAgICB9XG4gICAgICAgIHBvc3REYXRhLnB1c2gobWFpbik7XG4gICAgICAgIGlmKHRoaXMuc2VuZExpc3QgJiYgdGhpcy5zZW5kTGlzdC5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgIGxldCBjdF9zZW5kID0ge1xuICAgICAgICAgICAgICAgIFwiY3Rfc2VuZFwiOltdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IGN0X3JlY2lldmUgPSB7XG4gICAgICAgICAgICAgICAgXCJjdF9yZWNpZXZlXCI6W11cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3IobGV0IGRhdGEgb2YgdGhpcy5zZW5kTGlzdCl7XG4gICAgICAgICAgICAgICAgZGF0YS5uYW1lID0gZGF0YS5uYW1lO1xuICAgICAgICAgICAgICAgIGRhdGEuYWN0aW9uID0gXCJhZGRcIjtcbiAgICAgICAgICAgICAgICBkZWxldGUgZGF0YS5pZDtcbiAgICAgICAgICAgICAgICBjdF9zZW5kLmN0X3NlbmQucHVzaChkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvc3REYXRhLnB1c2goY3Rfc2VuZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy5yZWNpZXZlTGlzdCAmJiB0aGlzLnJlY2lldmVMaXN0Lmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgbGV0IGN0X3JlY2lldmUgPSB7XG4gICAgICAgICAgICAgICAgXCJjdF9yZWNpZXZlXCI6W11cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3IobGV0IGRhdGEgb2YgdGhpcy5yZWNpZXZlTGlzdCl7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGRhdGFbJ3NlbmRfYm9va19ubyddO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhWydzZW5kX2RhdGUnXTtcbiAgICAgICAgICAgICAgICBkYXRhLm5hbWUgPSBkYXRhLm5hbWU7XG4gICAgICAgICAgICAgICAgZGF0YS5hY3Rpb24gPSBcImFkZFwiO1xuICAgICAgICAgICAgICAgIGN0X3JlY2lldmUuY3RfcmVjaWV2ZS5wdXNoKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zdERhdGEucHVzaChjdF9yZWNpZXZlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZygncG9zdERhdGEnLHBvc3REYXRhKTtcbiAgICAgICAgLy8gaWYodGhpcy5tb2RlID09PSAnRURJVCcpe1xuICAgICAgICBsZXQgcG9zdFJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXF1ZXN0LnBvc3QoXCIvY3QvbWFpblwiLHBvc3REYXRhKTtcbiAgICAgICAgaWYodGhpcy5zdGVwRGF0YS51cGRhdGVfZGF0ZSl7XG4gICAgICAgICAgbGV0IHN0ZXBMaXN0ID0gYXdhaXQgdGhpcy5nZXRTdGVwTGlzdCgpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwic3RlcExpc3RcIixzdGVwTGlzdClcbiAgICAgICAgICBpZihzdGVwTGlzdC5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdC5wdXQoXCIvZGIvXCIrdGhpcy5zdGVwRGF0YS5yZWZfdGFibGUrXCIvXCIrdGhpcy5zdGVwRGF0YS5yZWZfaWQse3N0YXR1czpzdGVwTGlzdFswXS5zdGVwX25hbWUsc3RhdHVzX2RhdGU6c3RlcExpc3RbMF0uc3RlcF9kYXRlfSk7XG4gICAgICAgICAgICB0aGlzLmNvbW1vbi5mbkNoZWNrUmVzcG9uc2UocG9zdFJlc3BvbnNlLCB0aGlzLm15TW9kYWwpXG4gICAgICAgICAgfVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3QucHV0KFwiL2RiL1wiK3RoaXMuc3RlcERhdGEucmVmX3RhYmxlK1wiL1wiK3RoaXMuc3RlcERhdGEucmVmX2lkLHtzdGF0dXM6dGhpcy5zdGVwRGF0YS5zdGVwX25hbWV9KTtcbiAgICAgICAgICB0aGlzLmNvbW1vbi5mbkNoZWNrUmVzcG9uc2UocG9zdFJlc3BvbnNlLCB0aGlzLm15TW9kYWwpXG4gICAgICAgIH1cblxuICAgICAgICAvLyB9ZWxzZXtcbiAgICAgICAgLy8gICAgIHRoaXMub25DcmVhdGVNb2RhbC5lbWl0KHBvc3REYXRhKTtcbiAgICAgICAgLy8gfVxuICAgIH1cblxuICAgIGFzeW5jIGdldFN0ZXBMaXN0KCkge1xuICAgICAgICBjb25zb2xlLmxvZygnZ2V0U3RlcExpc3QnKTtcbiAgICAgICAgbGV0IGZpbHRlciA9IHtcbiAgICAgICAgICAgIGZpbHRlcjp7XG4gICAgICAgICAgICAgICAgcmVmX3RhYmxlOlwiPVwiK3RoaXMuc3RlcERhdGEucmVmX3RhYmxlLFxuICAgICAgICAgICAgICAgIHJlZl9pZDp0aGlzLnN0ZXBEYXRhLnJlZl9pZCxcbiAgICAgICAgICAgICAgICBzeXN0ZW1faWQ6dGhpcy5zdGVwRGF0YS5zeXN0ZW1faWRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcmRlcl9ieTpbXCJzdGVwX2RhdGUgZGVzY1wiXVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLnJlcXVlc3QucG9zdCgnL3NlYXJjaC9jdF9zdGVwX2RhdGEnLCBmaWx0ZXIpO1xuICAgICAgICByZXR1cm4gZGF0YS5yZXN1bHREYXRhIHx8IFtdO1xuICAgIH1cblxuXG4gICAgb25DbGlja0JhY2soKXtcbiAgICAgICAgdGhpcy5vblVwZGF0ZU1vZGFsLmVtaXQoKTtcbiAgICAgICAgdGhpcy5jbG9zZU1vZGFsKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgb25TdWJtaXRTZW5kKCkge1xuICAgICAgICB0aGlzLnN1Ym1pdHRlZFNlbmQgPSB0cnVlO1xuICAgICAgICAvLyDguJbguYnguLIgZm9ybSDguYTguKHguYjguITguKPguJrguKvguKPguLfguK3guJzguLTguJTguJXguLLguKHguYDguIfguLfguYjguK3guJnguYTguILguJfguLXguYjguJXguLHguYnguIfguYTguKfguYnguIjguLDguIjguJrguJfguLXguYjguJXguKPguIfguJnguLXguYlcbiAgICAgICAgaWYgKHRoaXMuc2VuZEZvcm0uaW52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRWRpdFNlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRtcExpc3QgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdG1wU2VuZCBvZiB0aGlzLnNlbmRMaXN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRtcFNlbmQuaWQgPT09IHRoaXMudG1wRGF0YS5pZCkge1xuICAgICAgICAgICAgICAgICAgICB0bXBMaXN0LnB1c2godGhpcy5zZW5kRGF0YSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdG1wTGlzdC5wdXNoKHRtcFNlbmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2VuZExpc3QgPSB0bXBMaXN0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZW5kRGF0YS5pZCA9IHRoaXMudGVtcElkO1xuICAgICAgICAgICAgdGhpcy50ZW1wSWQtLTtcbiAgICAgICAgICAgIHRoaXMuc2VuZExpc3QucHVzaCh0aGlzLnNlbmREYXRhKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsb3NlU2VuZE1vZGFsKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgb25TdWJtaXRSZWNpZXZlKCkge1xuICAgICAgICB0aGlzLnN1Ym1pdHRlZFNlbmQgPSB0cnVlO1xuXG4gICAgICAgIC8vIOC4luC5ieC4siBmb3JtIOC5hOC4oeC5iOC4hOC4o+C4muC4q+C4o+C4t+C4reC4nOC4tOC4lOC4leC4suC4oeC5gOC4h+C4t+C5iOC4reC4meC5hOC4guC4l+C4teC5iOC4leC4seC5ieC4h+C5hOC4p+C5ieC4iOC4sOC4iOC4muC4l+C4teC5iOC4leC4o+C4h+C4meC4teC5iVxuICAgICAgICBpZiAodGhpcy5yZWNpZXZlRm9ybS5pbnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNFZGl0UmVjaWV2ZSkge1xuICAgICAgICAgICAgY29uc3QgdG1wTGlzdCA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCB0bXBTZW5kIG9mIHRoaXMucmVjaWV2ZUxpc3QpIHtcbiAgICAgICAgICAgICAgICBpZiAodG1wU2VuZC5yZWN2X2Zyb20gPT09IHRoaXMudG1wRGF0YS5yZWN2X2Zyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgdG1wTGlzdC5wdXNoKHRoaXMucmVjaWV2ZURhdGEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRtcExpc3QucHVzaCh0bXBTZW5kKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlY2lldmVMaXN0ID0gdG1wTGlzdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVjaWV2ZUxpc3QucHVzaCh0aGlzLnJlY2lldmVEYXRhKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsb3NlUmVjaWV2ZU1vZGFsKCk7XG4gICAgfVxuICAgIGlzSW1wb3J0YW50KGRhdGEpe1xuICAgICAgICByZXR1cm4gZGF0YS5pc19pbXBvcnRhbnQ/XCLguKrguLPguITguLHguI1cIjpcIlwiO1xuICAgIH1cbiAgICBvblVwbG9hZGVkKGRhdGEpe1xuICAgICAgICB0aGlzLnN0ZXBEYXRhLnVybCA9IHRoaXMuYXR0YWNobWVudFVybCsnLycrZGF0YS51dWlkO1xuICAgICAgICB0aGlzLnN0ZXBEYXRhLnV1aWQgPSBkYXRhLnV1aWQ7XG4gICAgfVxuICAgIGNoZWNrRGlzYWJsZShmaWVsZCl7XG4gICAgICAgIGlmKHRoaXMuc3RlcERhdGFbZmllbGQuZmllbGRfbmFtZV0gIT09ICfguYTguKHguYjguJfguLLguIfguIHguLLguKMnKXtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGdldEltYWdlTGluayhkYXRhKXtcbiAgICAgICAgbGV0IHVybCA9IGF3YWl0IHRoaXMucmVxdWVzdC5nZXRBdHRhY2htZW50TGlua1Rva2VuKGRhdGEudXJsKTtcbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG59XG4iXX0=