common.service.js 94.5 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
/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
import { Injectable } from '@angular/core';
import * as _ from 'lodash';
import { Observable } from 'rxjs/Observable';
import moment from 'moment-es6';
import { formatDate } from "devextreme/localization";
import { UUID } from 'angular2-uuid';
import { locale } from 'devextreme/localization';
import 'devextreme-intl';
// # Calendar TH
locale('th');
export class Common {
    constructor() {
        this.DATE_FORMAT = 'YYYY-MM-DD HH:mm:ss';
        console.log("lib common version 1.11.21");
    }
    /**
     * fn. เช็ค data ทุกประเภท จะ Return กลับไปเป็น true|false
     * @param {?} data
     * @return {?}
     */
    isNotEmpty(data) {
        /** @type {?} */
        let haveData = false;
        /** @type {?} */
        const type = typeof data;
        // //console.tag('type:').log(type)
        switch (type) {
            // array|object
            case 'object':
                if (!data || data == null) {
                    haveData = false;
                }
                else if (typeof data[0] !== 'undefined') {
                    haveData = data.length !== 0 ? true : false;
                }
                else if (data instanceof Date) {
                    haveData = true;
                }
                else {
                    haveData = Object.keys(data).length ? true : false;
                }
                break;
            // string
            case 'string':
                if (data) {
                    haveData = true;
                }
                break;
            // number
            case 'number':
            // boolean
            case 'boolean':
            // function
            case 'function':
                haveData = true;
                break;
            default:
                haveData = false;
                break;
        }
        return haveData;
    }
    /**
     * fn. ปั้น filter สำหรับ Custom Store แบบมี field,filter,orderby
     * @param {?} filterOptions : {}
     * @return {?}
     */
    fnGenFilter(filterOptions) {
        /** @type {?} */
        const loadOptions = filterOptions.loadOptions || {};
        /** @type {?} */
        const filterList = filterOptions.filterList || {};
        /** @type {?} */
        const exceptionList = filterOptions.exceptionList || [];
        /** @type {?} */
        const options = filterOptions.options || {};
        /** @type {?} */
        const filter = new Observable(observer => {
            /** @type {?} */
            const data1 = this.fnCheckLoadOptions(loadOptions);
            observer.next(data1);
            /** @type {?} */
            const data2 = this.fnCheckFilterData(filterList, exceptionList);
            observer.next(data2);
            /** @type {?} */
            const data3 = this.fnCheckOptions(data1, data2, options);
            observer.next(data3);
            observer.complete();
        });
        /** @type {?} */
        let obj = {};
        /** @type {?} */
        const observerStep = {
            next: data => (obj = data),
            error: err => console.error('Observer got an error: ' + err),
            complete: () => console.log('obj :', obj)
        };
        filter.subscribe(observerStep);
        // return filter กลับไป
        return obj;
    }
    /**
     * @param {?} loadOptions
     * @return {?}
     */
    fnCheckLoadOptions(loadOptions) {
        /** @type {?} */
        const options = {
            limit: '',
            offset: '',
            order_by: []
        };
        if (this.isNotEmpty(loadOptions)) {
            options.offset = this.isNotEmpty(loadOptions.skip)
                ? loadOptions.skip
                : '';
            options.limit = this.isNotEmpty(loadOptions.take) ? loadOptions.take : '';
            if (this.isNotEmpty(loadOptions.sort)) {
                console.log("​Common -> fnCheckLoadOptions -> loadOptions.sort", loadOptions.sort);
                for (let index = 0; index < loadOptions.sort.length; index++) {
                    /** @type {?} */
                    const sort = loadOptions.sort[index];
                    /** @type {?} */
                    const orderbySelector = sort.selector || '';
                    if (orderbySelector) {
                        if (sort.desc) {
                            options.order_by.push(orderbySelector + ' desc');
                        }
                        else {
                            options.order_by.push(orderbySelector + ' asc');
                        }
                    }
                }
            }
            // options.orderby = this.isNotEmpty(loadOptions.sort) ? loadOptions.sort[0].selector : '';
            // options.orderby = this.isNotEmpty(loadOptions.sort) && loadOptions.sort[0].desc ? options.orderby + '|DESC' : options.orderby + '|ASC';
        }
        this.fnRemoveEmptyKey(options);
        return options;
    }
    /**
     * @param {?} filterList
     * @param {?} exceptionList
     * @return {?}
     */
    fnCheckFilterData(filterList, exceptionList) {
        /** @type {?} */
        const filter = {
            fields: '',
            filter: '',
            offset: '',
            limit: '',
            orderby: ''
        };
        if (this.isNotEmpty(filterList)) {
            filter.fields = this.isNotEmpty(filterList.fields)
                ? filterList.fields
                : '';
            if (filterList.filter) {
                filter.filter = this.fnConverstFilterDate(filterList.filter, exceptionList);
            }
            else {
                filter.filter = '';
            }
            // filter.filter = this.isNotEmpty(filterList.filter)
            //   ? filterList.filter
            //   : '';
            filter.offset = this.isNotEmpty(filterList.offset)
                ? filterList.offset
                : '';
            filter.limit = this.isNotEmpty(filterList.limit) ? filterList.limit : '';
            filter.orderby = this.isNotEmpty(filterList.orderby)
                ? filterList.orderby
                : '';
        }
        this.fnRemoveEmptyKey(filter);
        return filter;
    }
    /**
     * @param {?} data1
     * @param {?} data2
     * @param {?} options
     * @return {?}
     */
    fnCheckOptions(data1, data2, options) {
        /** @type {?} */
        const mergeData = _.merge(data1, data2);
        options = options || {};
        /** @type {?} */
        const removeFilterEmpty = options.removeFilterEmpty || false; // if empty string will remove parameter
        if (removeFilterEmpty) {
            mergeData.filter = this.fnRemoveEmptyKey(mergeData.filter);
        }
        return mergeData;
    }
    /**
     * @param {?} obj
     * @return {?}
     */
    fnRemoveEmptyKey(obj) {
        for (const key in obj) {
            if (!this.isNotEmpty(obj[key])) {
                delete obj[key];
            }
            else if (_.isObject(obj[key])) {
                obj[key] = this.fnRemoveEmptyKey(obj[key]);
            }
        }
        return obj;
    }
    /**
     * @param {?} filter
     * @param {?} exceptionList
     * @return {?}
     */
    fnConverstFilterDate(filter, exceptionList) {
        for (const key in filter) {
            /** @type {?} */
            let element = filter[key];
            if (_.isObject(element)) {
                for (const dateKey in element) {
                    if (element[dateKey] && (dateKey === 'from' || dateKey === 'to')) {
                        if (exceptionList.includes(key)) {
                            element[dateKey] = moment(element[dateKey]).format('YYYY-MM-DD HH:mm:ss');
                        }
                        else {
                            if (dateKey === 'from') {
                                element[dateKey] = moment(element[dateKey]).format('YYYY-MM-DD 00:00:00');
                            }
                            else if (dateKey === 'to') {
                                element[dateKey] = moment(element[dateKey]).format('YYYY-MM-DD 23:59:59');
                            }
                        }
                    }
                }
            }
        }
        return filter;
    }
    /**
     * fn. ปั้น filter สำหรับ Custom Store แบบ basic
     * @param {?} loadOptions
     * @return {?}
     */
    fnGenFilterBasic(loadOptions) {
        console.log('​Common -> fnGenFilterBasic -> loadOptions', loadOptions);
        /** @type {?} */
        let params = '?';
        params += 'skip=' + loadOptions.skip || 0;
        params += '&take=' + loadOptions.take || 10;
        if (loadOptions.sort) {
            params += '&orderby=' + loadOptions.sort[0].selector;
            if (loadOptions.sort[0].desc) {
                params += ' desc';
            }
        }
        return params;
    }
    /**
     * แปลงวันที่ จาก String เป็น Type Date
     * @param {?} date วันที่ ที่ต้องการแปลง
     * @param {?=} formatOfDate ถ้ารู้ format ของ date ที่ส่งเข้ามาให้ระบุด้วย
     * @return {?}
     */
    fnToDate(date, formatOfDate) {
        if (date) {
            if (formatOfDate) {
                return moment(date, formatOfDate).toDate();
            }
            else {
                return moment(date).toDate();
            }
        }
        else {
            return null;
        }
    }
    /**
     * แปลงวันที่ จาก String เป็น Type Date โดยมีอิง format จาก DB 'YYYY-MM-DD'
     * @param {?} date วันที่ ที่ต้องการแปลง
     * @return {?}
     */
    fnLToDateFromDB(date) {
        return moment(date, 'YYYY-MM-DD').toDate();
    }
    /**
     * เปลี่ยนภาษา Date Picker ของ Prime NG
     * @param {?} local ภาษา
     * @return {?}
     */
    fnLocalPCalendar(local) {
        switch (local) {
            case 'th':
                return {
                    firstDayOfWeek: 1,
                    dayNames: [
                        'อาทิตย์',
                        'จันทร์',
                        'อังคาร',
                        'พุธ',
                        'พฤหัส',
                        'ศุกร์',
                        'เสาร์'
                    ],
                    dayNamesShort: ['อา', 'จ', 'อ', 'พ', 'พฤ', 'ศ', 'ส'],
                    dayNamesMin: ['อา', 'จ', 'อ', 'พ', 'พฤ', 'ศ', 'ส'],
                    monthNames: [
                        'มกราคม',
                        'กุมภาพันธ์',
                        'มีนาคม',
                        'เมษายน',
                        'พฤษภาคม',
                        'มิถุนายน',
                        'กรกฎาคม',
                        'สิงหาคม',
                        'กันยายน',
                        'ตุลาคม',
                        'พฤศจิกายน',
                        'ธันวาคม'
                    ],
                    monthNamesShort: [
                        'ม.ค.',
                        'ก.พ.',
                        'มี.ค.',
                        'เม.ย.',
                        'พ.ค.',
                        'มิ.ย.',
                        'ก.ค.',
                        'ส.ค.',
                        'ก.ย.',
                        'ต.ค.',
                        'พ.ย.',
                        'ธ.ค.'
                    ],
                    today: 'วันนี้',
                    clear: 'เคลีย'
                };
            default:
                return {
                    firstDayOfWeek: 0,
                    dayNames: [
                        'Sunday',
                        'Monday',
                        'Tuesday',
                        'Wednesday',
                        'Thursday',
                        'Friday',
                        'Saturday'
                    ],
                    dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
                    dayNamesMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
                    monthNames: [
                        'January',
                        'February',
                        'March',
                        'April',
                        'May',
                        'June',
                        'July',
                        'August',
                        'September',
                        'October',
                        'November',
                        'December'
                    ],
                    monthNamesShort: [
                        'Jan',
                        'Feb',
                        'Mar',
                        'Apr',
                        'May',
                        'Jun',
                        'Jul',
                        'Aug',
                        'Sep',
                        'Oct',
                        'Nov',
                        'Dec'
                    ],
                    today: 'Today',
                    clear: 'Clear'
                };
        }
    }
    /**
     * @param {?} id
     * @return {?}
     */
    collapseFn(id) {
        /** @type {?} */
        const ibox = $('#' + id + ' div.collapse-link').closest('div.ibox');
        /** @type {?} */
        const button = $('#' + id + ' div.collapse-link').find('i');
        /** @type {?} */
        const button1 = $('#' + id + ' div.collapse-link').find('svg');
        /** @type {?} */
        const body = ibox.find('div.ibox-body');
        /** @type {?} */
        const content = ibox.find('div.ibox-content');
        /** @type {?} */
        const footer = ibox.find('div.ibox-footer');
        body.slideToggle();
        content.slideToggle();
        footer.slideToggle();
        button.toggleClass('far fa-chevron-up').toggleClass('far fa-chevron-down');
        button1.toggleClass('far fa-chevron-up').toggleClass('far fa-chevron-down');
        ibox.toggleClass('').toggleClass('border-bottom');
        setTimeout(function () {
            ibox.resize();
            ibox.find('[id^=map-]').resize();
        }, 50);
    }
    /**
     * เซ็ต action delete สำหรับส่ง post ไป api
     * @param {?} idList id ที่ลบ
     * @param {?} dataList array data ที่ต้องการจัดการ
     * @return {?}
     */
    fnFlagDelete(idList, dataList) {
        /** @type {?} */
        let resultList = [];
        for (let indexDs = 0; indexDs < dataList.length; indexDs++) {
            /** @type {?} */
            const obj = dataList[indexDs];
            /** @type {?} */
            const id = _.find(idList, value => value === obj.id);
            if (obj.id != id) {
                resultList.push(obj);
            }
        }
        return resultList;
    }
    /**
     *  เซ็ต action edit สำหรับส่ง post ไป api
     * @param {?} dataList array data ที่ต้องการจัดการ
     * @return {?}
     */
    fnFlagEdit(dataList) {
        /** @type {?} */
        let resultList = [];
        for (let index = 0; index < dataList.length; index++) {
            /** @type {?} */
            let obj = dataList[index];
            if (obj.id > 0) {
                obj.action = 'edit';
            }
            resultList.push(obj);
        }
        return resultList;
    }
    /**
     * เซ็ตค่าเมื่อกด edit
     * @param {?} dataList array data ที่ต้องการจัดการ
     * @param {?} data data ของ row ปัจจุบัน หรือ data ที่ต้องการเอาค่าไปอัพเดตให้ array data
     * @return {?}
     */
    fnSetValueEdit(dataList, data) {
        for (let index = 0; index < dataList.length; index++) {
            /** @type {?} */
            let obj = dataList[index];
            if (obj.id === data.id) {
                dataList[index] = data;
            }
        }
        return dataList;
    }
    /**
     * ลบ id ชั่วคราวที่สร้างขึ้นมาใช้สำหรับ datagrid
     * @param {?} dataList array data ที่ต้องการจัดการ
     * @return {?}
     */
    fnRemoveFakeId(dataList) {
        /** @type {?} */
        let resultList = [];
        for (let index = 0; index < dataList.length; index++) {
            /** @type {?} */
            let obj = dataList[index];
            if (obj.id < 0) {
                delete obj.id;
            }
            resultList.push(obj);
        }
        return resultList;
    }
    /**
     * check response และแสดง modal ตาม result code
     * @param {?} response data ที่ส่งมาจาก api
     * @param {?} modal modal ที่ผูกกับ UI นั้น ๆ
     * @return {?}
     */
    fnCheckResponse(response, modal) {
        if (+response.resultCode === 20000) {
            /** @type {?} */
            const dataAlert = {
                'modalId': 'myModalSuccess',
                'userTitle': 'Success',
                'userMessage': 'ดำเนินการสำเร็จ'
            };
            modal.openModal(dataAlert);
        }
        else {
            /** @type {?} */
            const dataAlert = {
                'modalId': 'myModalError',
                'userTitle': 'Error',
                'userMessage': 'ดำเนินการไม่สำเร็จ'
            };
            modal.openModal(dataAlert);
        }
    }
    /**
     * fn จัดการ action ของ data CRUD
     * @param {?} a datalist ที่เก็บไว้ตอน Get
     * @param {?} b datalist ปัจจุบันที่เปลี่ยนแปลง
     * @param {?=} idName key key หลักที่ต้องการใช้เปรียบเทียบ
     * @return {?}
     */
    fnBuildArrayAction(a, b, idName = 'id') {
        /** @type {?} */
        const aClone = _.cloneDeep(a);
        /** @type {?} */
        const bClone = _.cloneDeep(b);
        /** @type {?} */
        const deleted_added = _.xorBy(aClone, bClone, idName);
        /** @type {?} */
        const deleted = _.filter(deleted_added, (o) => o[idName] > 0);
        /** @type {?} */
        const combine = _.unionBy(deleted, bClone, idName);
        // console.log('combine', combine);
        // console.log('----');
        for (let item of combine) {
            if (_.includes(deleted_added, item)) {
                if (item[idName] < 0) {
                    item['action'] = 'add';
                }
                else {
                    for (let field in item) {
                        if (field !== idName) {
                            delete item[field];
                        }
                    }
                    item.action = "delete";
                }
            }
            else {
                item['action'] = 'edit';
            }
            if (item.row_number) {
                delete item['row_number'];
            }
        }
        return combine;
    }
    /**
     * fn ปั้นข้อความหัว Table
     * @param {?} result ผลลัพ data ที่ได้จาก custom store
     * @return {?}
     */
    fnGenTextTotal(result) {
        /** @type {?} */
        const resultCount = result.data.length || 0;
        /** @type {?} */
        const totalCount = result.totalCount || 0;
        /** @type {?} */
        let textTotal = `ผลลัพธ์ ${resultCount} รายการ จากทั้งหมด ${totalCount} รายการ`;
        return textTotal;
    }
    /**
     * fn ปั้นข้อความหัว Table สำหรับ datasource แบบ get ครั้งเดียว
     * @param {?} event event ที่ได้จาก event onOptionChanged
     * @return {?}
     */
    fnGenTextTotalRaw(event) {
        /** @type {?} */
        const promise = new Promise((resolve, reject) => {
            setTimeout(() => {
                if (event.name === 'paging' || event.name === 'dataSource') {
                    /** @type {?} */
                    const getVisibleRows = event.component ? event.component.getVisibleRows() : [];
                    /** @type {?} */
                    const totalCount = event.component ? event.component.totalCount() : 0;
                    /** @type {?} */
                    const resultCount = getVisibleRows.length || 0;
                    resolve(`ผลลัพธ์ ${resultCount} รายการ จากทั้งหมด ${totalCount} รายการ`);
                }
            }, 100);
        });
        return promise;
    }
    /**
     * fn เปลี่ยน calendar devextreme ให้ปี เป็นแบบ พ.ศ.
     * @return {?}
     */
    fnChangeCalendarYear() {
        try {
            /** @type {?} */
            const yearRegex = /^[0-9]{4}-[0-9]{4}$/g;
            /** @type {?} */
            const yearRegex2 = /^[0-9]{4}\s-\s[0-9]{4}$/g;
            /** @type {?} */
            const btnList = document.querySelectorAll('.dx-popup-content .dx-calendar');
            for (let indexBtn = 0; indexBtn < btnList.length; indexBtn++) {
                /** @type {?} */
                const btn = btnList[indexBtn];
                btn.removeEventListener('click', (e) => { });
                btn.addEventListener('click', () => {
                    /** *
                     * เปลี่ยนปีในส่วนของ cell ด้านใน
                      @type {?} */
                    const dxCalendarCell = document.querySelectorAll('.dx-calendar-cell');
                    for (let index = 0; index < dxCalendarCell.length; index++) {
                        /** @type {?} */
                        const cell = dxCalendarCell[index];
                        /** @type {?} */
                        const text = cell.getAttribute('aria-label');
                        /** @type {?} */
                        let num = parseInt(text);
                        if (text.length === 4 && num !== NaN) {
                            /** @type {?} */
                            let num2 = num + 543;
                            cell.textContent = num2.toString();
                        }
                        else if (text.match(yearRegex2)) {
                            /** @type {?} */
                            const arr = text.split('-');
                            /** @type {?} */
                            const year1 = parseInt(arr[0]);
                            /** @type {?} */
                            const year2 = parseInt(arr[1]);
                            /** @type {?} */
                            const str = (year1 + 543).toString() + '-' + (year2 + 543).toString();
                            cell.textContent = str;
                        }
                    }
                    /** *
                     * เปลี่ยนปีในส่วนของ nav ด้านบน
                      @type {?} */
                    const dxCalendarTop = document.querySelectorAll('.dx-calendar-caption-button');
                    for (let indexTop = 0; indexTop < dxCalendarTop.length; indexTop++) {
                        /** @type {?} */
                        const cell = dxCalendarTop[indexTop];
                        /** @type {?} */
                        const text = cell.getAttribute('aria-label');
                        /** @type {?} */
                        let num = parseInt(text);
                        if (text.length === 4 && num !== NaN) {
                            /** @type {?} */
                            let num2 = num + 543;
                            /** @type {?} */
                            let fisrt = cell.children;
                            /** @type {?} */
                            let target = fisrt.item(0).children;
                            target.item(0).textContent = num2.toString();
                        }
                        else if (text.match(yearRegex)) {
                            /** @type {?} */
                            const arr = text.split('-');
                            /** @type {?} */
                            const year1 = parseInt(arr[0]);
                            /** @type {?} */
                            const year2 = parseInt(arr[1]);
                            /** @type {?} */
                            const str = (year1 + 543).toString() + '-' + (year2 + 543).toString();
                            /** @type {?} */
                            let fisrt = cell.children;
                            /** @type {?} */
                            let target = fisrt.item(0).children;
                            target.item(0).textContent = str;
                        }
                    }
                });
            }
        }
        catch (error) {
            console.log("fnChangeCalendarYear -> error", error);
        }
    }
    /**
     * @return {?}
     */
    fnChangeCalendarYearOnce() {
        try {
            /** @type {?} */
            const yearRegex = /^[0-9]{4}-[0-9]{4}$/g;
            /** *
             * เปลี่ยนปีในส่วนของ cell ด้านใน
              @type {?} */
            const dxCalendarCell = document.querySelectorAll('.dx-calendar-cell');
            for (let index = 0; index < dxCalendarCell.length; index++) {
                /** @type {?} */
                const cell = dxCalendarCell[index];
                /** @type {?} */
                const text = cell.getAttribute('aria-label');
                /** @type {?} */
                let num = parseInt(text);
                if (text.length === 4 && num !== NaN) {
                    /** @type {?} */
                    let num2 = num + 543;
                    cell.textContent = num2.toString();
                }
            }
            /** *
             * เปลี่ยนปีในส่วนของ nav ด้านบน
              @type {?} */
            const dxCalendarTop = document.querySelectorAll('.dx-calendar-caption-button');
            for (let indexTop = 0; indexTop < dxCalendarTop.length; indexTop++) {
                /** @type {?} */
                const cell = dxCalendarTop[indexTop];
                /** @type {?} */
                const text = cell.getAttribute('aria-label');
                /** @type {?} */
                let num = parseInt(text);
                if (text.length === 4 && num !== NaN) {
                    /** @type {?} */
                    let num2 = num + 543;
                    /** @type {?} */
                    let fisrt = cell.children;
                    /** @type {?} */
                    let target = fisrt.item(0).children;
                    target.item(0).textContent = num2.toString();
                }
                else if (text.match(yearRegex)) {
                    /** @type {?} */
                    const arr = text.split('-');
                    /** @type {?} */
                    const year1 = parseInt(arr[0]);
                    /** @type {?} */
                    const year2 = parseInt(arr[1]);
                    /** @type {?} */
                    const str = (year1 + 543).toString() + '-' + (year2 + 543).toString();
                    /** @type {?} */
                    let fisrt = cell.children;
                    /** @type {?} */
                    let target = fisrt.item(0).children;
                    target.item(0).textContent = str;
                }
            }
        }
        catch (error) {
            console.log("fnChangeCalendarYear -> error", error);
        }
    }
    /**
     * @return {?}
     */
    fnGenUuid() {
        return UUID.UUID();
    }
    /**
     * fn แปลง date ก่อนส่งไปให้ API
     * @param {?} dataList data ที่ต้องการจัดการหรือ model ที่ผูก
     * @param {?} fieldList list รายชื่อ field ที่ต้องการแปลง date
     * @return {?}
     */
    fnFormatDateList(dataList, fieldList) {
        /** @type {?} */
        const cloneDataList = _.cloneDeep(dataList);
        for (let index = 0; index < fieldList.length; index++) {
            /** @type {?} */
            const field = fieldList[index];
            if (cloneDataList[field]) {
                cloneDataList[field] = moment(cloneDataList[field]).format(this.DATE_FORMAT);
            }
        }
        return cloneDataList;
    }
    /**
     * fn. แปลง string date จาก db เป็น วัน เวลา ประเทศไทย
     * @param {?} value String date ที่ต้องการแปลง
     * @return {?}
     */
    fnDisplayFormatDate(value) {
        /** @type {?} */
        let dateString = formatDate(value, "shortDate");
        /** @type {?} */
        let timeString = formatDate(value, "HH:mm:ss");
        return dateString + ' ' + timeString;
    }
    /**
     * @param {?} key
     * @param {?} value
     * @return {?}
     */
    replacer(key, value) {
        // Filtering out properties
        // console.log("key",key);
        // console.log("value",value);
        // console.log("type",typeof value);
        // const type = typeof value;
        // switch (type) {
        //     case 'string':
        //         return value.trim();
        //     case 'Date':
        //         return moment(value).format('YYYY-MM-dd HH:mm:ss');
        //     default:
        // }
        if (typeof value === "string") {
            if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z$/.test(value)) {
                return moment(value).format('YYYY-MM-DD HH:mm:ss');
            }
            else {
                return value.trim();
            }
        }
        return value;
    }
    /**
     * @param {?} key
     * @param {?} value
     * @return {?}
     */
    replacernotrim(key, value) {
        // Filtering out properties
        // console.log("key",key);
        // console.log("value",value);
        // console.log("type",typeof value);
        // const type = typeof value;
        // switch (type) {
        //     case 'string':
        //         return value.trim();
        //     case 'Date':
        //         return moment(value).format('YYYY-MM-dd HH:mm:ss');
        //     default:
        // }
        if (typeof value === "string") {
            if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z$/.test(value)) {
                return moment(value).format('YYYY-MM-DD HH:mm:ss');
            }
            else {
                return value;
            }
        }
        return value;
    }
    /**
     * @param {?} date
     * @return {?}
     */
    convertTHShortDate(date) {
        date = moment(date);
        /** @type {?} */
        let iMonth = parseInt(moment(date).format('MM'));
        /** @type {?} */
        let iYear = moment(date).format('YYYY');
        iYear = iYear.substr(2, 4);
        /** @type {?} */
        let thShortMonth = ['', 'ม.ค.', 'ก.พ.', 'มี.ค.', 'เม.ย.', 'พ.ค.', 'มิ.ย.', 'ก.ค.', 'ส.ค.', 'ก.ย.', 'ต.ค.', 'พ.ย.', 'ธ.ค.'];
        return this.NumberToThaiNumber(date.format('DD')) + ' ' + thShortMonth[iMonth] + ' ' + this.NumberToThaiNumber(iYear);
    }
    ;
    /**
     * @param {?} Number
     * @return {?}
     */
    NumberToThaiNumber(Number) {
        Number = Number.toString();
        Number = Number.replace(/0/gi, '๐');
        Number = Number.replace(/1/gi, '๑');
        Number = Number.replace(/2/gi, '๒');
        Number = Number.replace(/3/gi, '๓');
        Number = Number.replace(/4/gi, '๔');
        Number = Number.replace(/5/gi, '๕');
        Number = Number.replace(/6/gi, '๖');
        Number = Number.replace(/7/gi, '๗');
        Number = Number.replace(/8/gi, '๘');
        Number = Number.replace(/9/gi, '๙');
        return Number;
    }
    /**
     * @param {?} month
     * @param {?} short
     * @return {?}
     */
    fnGetMonthTH(month, short) {
        month = month - 1;
        /** @type {?} */
        let thMonth = ["มกราคม", "กุมภาพันธ์", "มีนาคม",
            "เมษายน", "พฤษภาคม", "มิถุนายน", "กรกฎาคม", "สิงหาคม", "กันยายน",
            "ตุลาคม", "พฤศจิกายน", "ธันวาคม"];
        /** @type {?} */
        let thShortMonth = ["ม.ค.", "ก.พ.", "มี.ค.", "เม.ย.", "พ.ค.", "มิ.ย.", "ก.ค.", "ส.ค.", "ก.ย.", "ต.ค.", "พ.ย.", "ธ.ค."];
        return short === true ? thShortMonth[month] : thMonth[month];
    }
    ;
    /**
     * @param {?} date
     * @param {?} format
     * @param {?} typeTH
     * @return {?}
     */
    convertTHDate(date, format, typeTH) {
        moment.locale('th');
        console.log(moment(date).add(543, "years").format("DD MMMM YYYY"));
        if (typeTH) {
            return this.NumberToThaiNumber(moment(date).add(543, "years").format(format));
        }
        else {
            return moment(date).add(543, "years").format(format);
        }
    }
    ;
}
Common.decorators = [
    { type: Injectable }
];
/** @nocollapse */
Common.ctorParameters = () => [];
if (false) {
    /** @type {?} */
    Common.prototype.DATE_FORMAT;
}

//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9zb2MtYXBwLWxpYnJhcnkvIiwic291cmNlcyI6WyJsaWIvX3NlcnZpY2VzL2NvbW1vbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUk3QyxPQUFPLE1BQU0sTUFBTSxZQUFZLENBQUM7QUFFaEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2pELE9BQU8saUJBQWlCLENBQUM7O0FBRXpCLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUdiLE1BQU07SUFFSjsyQkFEYyxxQkFBcUI7UUFFakMsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFBO0tBQzFDOzs7Ozs7SUFNRCxVQUFVLENBQUMsSUFBSTs7UUFDYixJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7O1FBQ3JCLE1BQU0sSUFBSSxHQUFHLE9BQU8sSUFBSSxDQUFDOztRQUV6QixRQUFRLElBQUksRUFBRTs7WUFFWixLQUFLLFFBQVE7Z0JBQ1gsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO29CQUN6QixRQUFRLEdBQUcsS0FBSyxDQUFDO2lCQUNsQjtxQkFBTSxJQUFJLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLFdBQVcsRUFBRTtvQkFDekMsUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztpQkFDN0M7cUJBQU0sSUFBSSxJQUFJLFlBQVksSUFBSSxFQUFFO29CQUMvQixRQUFRLEdBQUcsSUFBSSxDQUFDO2lCQUNqQjtxQkFBTTtvQkFDTCxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2lCQUNwRDtnQkFDRCxNQUFNOztZQUVSLEtBQUssUUFBUTtnQkFDWCxJQUFJLElBQUksRUFBRTtvQkFDUixRQUFRLEdBQUcsSUFBSSxDQUFDO2lCQUNqQjtnQkFDRCxNQUFNOztZQUVSLEtBQUssUUFBUSxDQUFDOztZQUVkLEtBQUssU0FBUyxDQUFDOztZQUVmLEtBQUssVUFBVTtnQkFDYixRQUFRLEdBQUcsSUFBSSxDQUFDO2dCQUNoQixNQUFNO1lBQ1I7Z0JBQ0UsUUFBUSxHQUFHLEtBQUssQ0FBQztnQkFDakIsTUFBTTtTQUNUO1FBQ0QsT0FBTyxRQUFRLENBQUM7S0FDakI7Ozs7OztJQU1ELFdBQVcsQ0FBQyxhQUF3Qjs7UUFFbEMsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7O1FBQ3BELE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDOztRQUNsRCxNQUFNLGFBQWEsR0FBRyxhQUFhLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQzs7UUFDeEQsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7O1FBRTVDLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFOztZQUV2QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDbkQsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzs7WUFFckIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBQyxhQUFhLENBQUMsQ0FBQztZQUMvRCxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDOztZQUVyQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDekQsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQixRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDckIsQ0FBQyxDQUFDOztRQUVILElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQzs7UUFDYixNQUFNLFlBQVksR0FBRztZQUNuQixJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7WUFDMUIsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsR0FBRyxHQUFHLENBQUM7WUFDNUQsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQztTQUMxQyxDQUFDO1FBQ0YsTUFBTSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQzs7UUFFL0IsT0FBTyxHQUFHLENBQUM7S0FDWjs7Ozs7SUFFRCxrQkFBa0IsQ0FBQyxXQUFXOztRQUM1QixNQUFNLE9BQU8sR0FBRztZQUNkLEtBQUssRUFBRSxFQUFFO1lBQ1QsTUFBTSxFQUFFLEVBQUU7WUFDVixRQUFRLEVBQUUsRUFBRTtTQUNiLENBQUM7UUFDRixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDaEMsT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7Z0JBQ2hELENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSTtnQkFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNQLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMxRSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNyQyxPQUFPLENBQUMsR0FBRyxDQUFDLG1EQUFtRCxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFDbEYsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFOztvQkFDNUQsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzs7b0JBQ3JDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO29CQUM1QyxJQUFJLGVBQWUsRUFBRTt3QkFDbkIsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFOzRCQUNiLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUMsQ0FBQzt5QkFDbEQ7NkJBQU07NEJBQ0wsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxDQUFDO3lCQUNqRDtxQkFDRjtpQkFDRjthQUNGOzs7U0FHRjtRQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQixPQUFPLE9BQU8sQ0FBQztLQUNoQjs7Ozs7O0lBRUQsaUJBQWlCLENBQUMsVUFBVSxFQUFDLGFBQWE7O1FBQ3hDLE1BQU0sTUFBTSxHQUFHO1lBQ2IsTUFBTSxFQUFFLEVBQUU7WUFDVixNQUFNLEVBQUUsRUFBRTtZQUNWLE1BQU0sRUFBRSxFQUFFO1lBQ1YsS0FBSyxFQUFFLEVBQUU7WUFDVCxPQUFPLEVBQUUsRUFBRTtTQUNaLENBQUM7UUFDRixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDL0IsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7Z0JBQ2hELENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTTtnQkFDbkIsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNQLElBQUksVUFBVSxDQUFDLE1BQU0sRUFBRTtnQkFDckIsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBQyxhQUFhLENBQUMsQ0FBQzthQUM1RTtpQkFBTTtnQkFDTCxNQUFNLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQTthQUNuQjs7OztZQUlELE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO2dCQUNoRCxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU07Z0JBQ25CLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDUCxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDekUsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7Z0JBQ2xELENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTztnQkFDcEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNSO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlCLE9BQU8sTUFBTSxDQUFDO0tBQ2Y7Ozs7Ozs7SUFFRCxjQUFjLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPOztRQUNsQyxNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4QyxPQUFPLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQzs7UUFDeEIsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsaUJBQWlCLElBQUksS0FBSyxDQUFDO1FBQzdELElBQUksaUJBQWlCLEVBQUU7WUFDckIsU0FBUyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzVEO1FBQ0QsT0FBTyxTQUFTLENBQUM7S0FDbEI7Ozs7O0lBRUQsZ0JBQWdCLENBQUMsR0FBRztRQUNsQixLQUFLLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBRTtZQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtnQkFDOUIsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDakI7aUJBQU0sSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUMvQixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQzVDO1NBQ0Y7UUFDRCxPQUFPLEdBQUcsQ0FBQztLQUNaOzs7Ozs7SUFFRCxvQkFBb0IsQ0FBQyxNQUFNLEVBQUMsYUFBYTtRQUN2QyxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRTs7WUFDeEIsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDdkIsS0FBSyxNQUFNLE9BQU8sSUFBSSxPQUFPLEVBQUU7b0JBQzdCLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxLQUFLLE1BQU0sSUFBSSxPQUFPLEtBQUssSUFBSSxDQUFDLEVBQUU7d0JBQ2hFLElBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBQzs0QkFDM0IsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQzt5QkFDN0U7NkJBQUk7NEJBQ0gsSUFBRyxPQUFPLEtBQUssTUFBTSxFQUFDO2dDQUNsQixPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDOzZCQUM3RTtpQ0FBSyxJQUFHLE9BQU8sS0FBSyxJQUFJLEVBQUM7Z0NBQ3RCLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7NkJBQzdFO3lCQUNGO3FCQUNGO2lCQUNGO2FBQ0Y7U0FDRjtRQUNELE9BQU8sTUFBTSxDQUFDO0tBQ2Y7Ozs7OztJQU1ELGdCQUFnQixDQUFDLFdBQWdCO1FBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsNENBQTRDLEVBQUUsV0FBVyxDQUFDLENBQUM7O1FBQ3ZFLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQztRQUNqQixNQUFNLElBQUksT0FBTyxHQUFHLFdBQVcsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQzFDLE1BQU0sSUFBSSxRQUFRLEdBQUcsV0FBVyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFDNUMsSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFO1lBQ3BCLE1BQU0sSUFBSSxXQUFXLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7WUFDckQsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtnQkFDNUIsTUFBTSxJQUFJLE9BQU8sQ0FBQzthQUNuQjtTQUNGO1FBQ0QsT0FBTyxNQUFNLENBQUM7S0FDZjs7Ozs7OztJQU1ELFFBQVEsQ0FBQyxJQUFJLEVBQUUsWUFBYTtRQUMxQixJQUFJLElBQUksRUFBRTtZQUNSLElBQUksWUFBWSxFQUFFO2dCQUNoQixPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7YUFDNUM7aUJBQU07Z0JBQ0wsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7YUFDOUI7U0FDRjthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUM7U0FDYjtLQUNGOzs7Ozs7SUFLRCxlQUFlLENBQUMsSUFBSTtRQUNsQixPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7S0FDNUM7Ozs7OztJQUtELGdCQUFnQixDQUFDLEtBQUs7UUFDcEIsUUFBUSxLQUFLLEVBQUU7WUFDYixLQUFLLElBQUk7Z0JBQ1AsT0FBTztvQkFDTCxjQUFjLEVBQUUsQ0FBQztvQkFDakIsUUFBUSxFQUFFO3dCQUNSLFNBQVM7d0JBQ1QsUUFBUTt3QkFDUixRQUFRO3dCQUNSLEtBQUs7d0JBQ0wsT0FBTzt3QkFDUCxPQUFPO3dCQUNQLE9BQU87cUJBQ1I7b0JBQ0QsYUFBYSxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO29CQUNwRCxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7b0JBQ2xELFVBQVUsRUFBRTt3QkFDVixRQUFRO3dCQUNSLFlBQVk7d0JBQ1osUUFBUTt3QkFDUixRQUFRO3dCQUNSLFNBQVM7d0JBQ1QsVUFBVTt3QkFDVixTQUFTO3dCQUNULFNBQVM7d0JBQ1QsU0FBUzt3QkFDVCxRQUFRO3dCQUNSLFdBQVc7d0JBQ1gsU0FBUztxQkFDVjtvQkFDRCxlQUFlLEVBQUU7d0JBQ2YsTUFBTTt3QkFDTixNQUFNO3dCQUNOLE9BQU87d0JBQ1AsT0FBTzt3QkFDUCxNQUFNO3dCQUNOLE9BQU87d0JBQ1AsTUFBTTt3QkFDTixNQUFNO3dCQUNOLE1BQU07d0JBQ04sTUFBTTt3QkFDTixNQUFNO3dCQUNOLE1BQU07cUJBQ1A7b0JBQ0QsS0FBSyxFQUFFLFFBQVE7b0JBQ2YsS0FBSyxFQUFFLE9BQU87aUJBQ2YsQ0FBQztZQUVKO2dCQUNFLE9BQU87b0JBQ0wsY0FBYyxFQUFFLENBQUM7b0JBQ2pCLFFBQVEsRUFBRTt3QkFDUixRQUFRO3dCQUNSLFFBQVE7d0JBQ1IsU0FBUzt3QkFDVCxXQUFXO3dCQUNYLFVBQVU7d0JBQ1YsUUFBUTt3QkFDUixVQUFVO3FCQUNYO29CQUNELGFBQWEsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQztvQkFDaEUsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO29CQUN2RCxVQUFVLEVBQUU7d0JBQ1YsU0FBUzt3QkFDVCxVQUFVO3dCQUNWLE9BQU87d0JBQ1AsT0FBTzt3QkFDUCxLQUFLO3dCQUNMLE1BQU07d0JBQ04sTUFBTTt3QkFDTixRQUFRO3dCQUNSLFdBQVc7d0JBQ1gsU0FBUzt3QkFDVCxVQUFVO3dCQUNWLFVBQVU7cUJBQ1g7b0JBQ0QsZUFBZSxFQUFFO3dCQUNmLEtBQUs7d0JBQ0wsS0FBSzt3QkFDTCxLQUFLO3dCQUNMLEtBQUs7d0JBQ0wsS0FBSzt3QkFDTCxLQUFLO3dCQUNMLEtBQUs7d0JBQ0wsS0FBSzt3QkFDTCxLQUFLO3dCQUNMLEtBQUs7d0JBQ0wsS0FBSzt3QkFDTCxLQUFLO3FCQUNOO29CQUNELEtBQUssRUFBRSxPQUFPO29CQUNkLEtBQUssRUFBRSxPQUFPO2lCQUNmLENBQUM7U0FDTDtLQUNGOzs7OztJQUNELFVBQVUsQ0FBQyxFQUFFOztRQUNYLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLG9CQUFvQixDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDOztRQUNwRSxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsR0FBRyxvQkFBb0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzs7UUFDNUQsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7O1FBQy9ELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7O1FBQ3hDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQzs7UUFDOUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdEIsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxXQUFXLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUMzRSxPQUFPLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUMsV0FBVyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDbEQsVUFBVSxDQUFDO1lBQ1QsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNsQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQ1I7Ozs7Ozs7SUFPRCxZQUFZLENBQUMsTUFBYSxFQUFFLFFBQWU7O1FBQ3pDLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNwQixLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsRUFBRTs7WUFDMUQsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDOztZQUM5QixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDckQsSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRTtnQkFDaEIsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUN0QjtTQUNGO1FBQ0QsT0FBTyxVQUFVLENBQUM7S0FDbkI7Ozs7OztJQU9ELFVBQVUsQ0FBQyxRQUFlOztRQUN4QixJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDcEIsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7O1lBQ3BELElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFO2dCQUNkLEdBQUcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO2FBQ3JCO1lBQ0QsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN0QjtRQUNELE9BQU8sVUFBVSxDQUFDO0tBQ25COzs7Ozs7O0lBUUQsY0FBYyxDQUFDLFFBQWUsRUFBRSxJQUFTO1FBQ3ZDLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFOztZQUNwRCxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUIsSUFBSSxHQUFHLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLEVBQUU7Z0JBQ3RCLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUM7YUFDeEI7U0FDRjtRQUNELE9BQU8sUUFBUSxDQUFDO0tBQ2pCOzs7Ozs7SUFLRCxjQUFjLENBQUMsUUFBZTs7UUFDNUIsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFOztZQUNwRCxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUIsSUFBSSxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRTtnQkFDZCxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7YUFDZjtZQUNELFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDdEI7UUFDRCxPQUFPLFVBQVUsQ0FBQztLQUNuQjs7Ozs7OztJQU1ELGVBQWUsQ0FBQyxRQUFRLEVBQUUsS0FBSztRQUM3QixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsS0FBSyxLQUFLLEVBQUU7O1lBQ2xDLE1BQU0sU0FBUyxHQUFHO2dCQUNoQixTQUFTLEVBQUUsZ0JBQWdCO2dCQUMzQixXQUFXLEVBQUUsU0FBUztnQkFDdEIsYUFBYSxFQUFFLGlCQUFpQjthQUNqQyxDQUFDO1lBQ0YsS0FBSyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUM1QjthQUFNOztZQUNMLE1BQU0sU0FBUyxHQUFHO2dCQUNoQixTQUFTLEVBQUUsY0FBYztnQkFDekIsV0FBVyxFQUFFLE9BQU87Z0JBQ3BCLGFBQWEsRUFBRSxvQkFBb0I7YUFDcEMsQ0FBQztZQUNGLEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDNUI7S0FDRjs7Ozs7Ozs7SUFPRCxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sR0FBRyxJQUFJOztRQUNwQyxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDOztRQUM5QixNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDOztRQUM5QixNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7O1FBSXRELE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7O1FBSTlELE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQzs7O1FBSW5ELEtBQUssSUFBSSxJQUFJLElBQUksT0FBTyxFQUFFO1lBQ3hCLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ25DLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEtBQUssQ0FBQztpQkFDeEI7cUJBQU07b0JBQ0wsS0FBSSxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUM7d0JBQ3BCLElBQUcsS0FBSyxLQUFLLE1BQU0sRUFBQzs0QkFDbEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7eUJBQ3BCO3FCQUNGO29CQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDO2lCQUN4QjthQUNGO2lCQUFNO2dCQUVMLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxNQUFNLENBQUM7YUFDekI7WUFDRCxJQUFHLElBQUksQ0FBQyxVQUFVLEVBQUM7Z0JBQ2pCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQzNCO1NBQ0Y7UUFDRCxPQUFPLE9BQU8sQ0FBQztLQUNoQjs7Ozs7O0lBTUQsY0FBYyxDQUFDLE1BQVc7O1FBQ3hCLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQzs7UUFDNUMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUM7O1FBQzFDLElBQUksU0FBUyxHQUFHLFdBQVcsV0FBVyxzQkFBc0IsVUFBVSxTQUFTLENBQUM7UUFDaEYsT0FBTyxTQUFTLENBQUM7S0FDbEI7Ozs7OztJQU1ELGlCQUFpQixDQUFDLEtBQVU7O1FBQzFCLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQzlDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFlBQVksRUFBRTs7b0JBQzFELE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7b0JBQy9FLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7b0JBQ3RFLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO29CQUMvQyxPQUFPLENBQUMsV0FBVyxXQUFXLHNCQUFzQixVQUFVLFNBQVMsQ0FBQyxDQUFDO2lCQUMxRTthQUNGLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDVCxDQUFDLENBQUM7UUFDSCxPQUFPLE9BQU8sQ0FBQztLQUNoQjs7Ozs7SUFHRCxvQkFBb0I7UUFDbEIsSUFBSTs7WUFDRixNQUFNLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQzs7WUFDekMsTUFBTSxVQUFVLEdBQUcsMEJBQTBCLENBQUM7O1lBQzlDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1lBQzVFLEtBQUssSUFBSSxRQUFRLEdBQUcsQ0FBQyxFQUFFLFFBQVEsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFOztnQkFDNUQsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM5QixHQUFHLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzdDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFOzs7O29CQUVqQyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztvQkFDdEUsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLGNBQWMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7O3dCQUMxRCxNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7O3dCQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDOzt3QkFDN0MsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUN6QixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxHQUFHLEVBQUU7OzRCQUNwQyxJQUFJLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOzRCQUNyQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzt5QkFDcEM7NkJBQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFOzs0QkFDakMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzs7NEJBQzVCLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7NEJBQy9CLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7NEJBQy9CLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQzs0QkFDdEUsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7eUJBQ3hCO3FCQUNGOzs7O29CQUVELE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO29CQUMvRSxLQUFLLElBQUksUUFBUSxHQUFHLENBQUMsRUFBRSxRQUFRLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsRUFBRTs7d0JBQ2xFLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7d0JBQ3JDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7O3dCQUM3QyxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ3pCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRTs7NEJBQ3BDLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7OzRCQUNyQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOzs0QkFDMUIsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7NEJBQ3BDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzt5QkFDOUM7NkJBQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFOzs0QkFDaEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzs7NEJBQzVCLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7NEJBQy9CLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7NEJBQy9CLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQzs7NEJBQ3RFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7OzRCQUMxQixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQzs0QkFDcEMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDO3lCQUNsQztxQkFDRjtpQkFDRixDQUFDLENBQUE7YUFDSDtTQUNGO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLCtCQUErQixFQUFFLEtBQUssQ0FBQyxDQUFBO1NBQ3BEO0tBQ0Y7Ozs7SUFDRCx3QkFBd0I7UUFDdEIsSUFBSTs7WUFDRixNQUFNLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQzs7OztZQUV6QyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUN0RSxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTs7Z0JBQzFELE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Z0JBQ25DLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7O2dCQUM3QyxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3pCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRTs7b0JBQ3BDLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7b0JBQ3JCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2lCQUNwQzthQUNGOzs7O1lBRUQsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDLDZCQUE2QixDQUFDLENBQUM7WUFDL0UsS0FBSyxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUUsUUFBUSxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEVBQUU7O2dCQUNsRSxNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7O2dCQUNyQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDOztnQkFDN0MsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN6QixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxHQUFHLEVBQUU7O29CQUNwQyxJQUFJLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztvQkFDckIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7b0JBQzFCLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO29CQUNwQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7aUJBQzlDO3FCQUFNLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRTs7b0JBQ2hDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7O29CQUM1QixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O29CQUMvQixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O29CQUMvQixNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7O29CQUN0RSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztvQkFDMUIsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7b0JBQ3BDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQztpQkFDbEM7YUFDRjtTQUNGO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLCtCQUErQixFQUFFLEtBQUssQ0FBQyxDQUFBO1NBQ3BEO0tBQ0Y7Ozs7SUFHRCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7S0FDcEI7Ozs7Ozs7SUFPRCxnQkFBZ0IsQ0FBQyxRQUFZLEVBQUUsU0FBZTs7UUFDMUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QyxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTs7WUFDbkQsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9CLElBQUksYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUN0QixhQUFhLENBQUMsS0FBSyxDQUFDLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDaEY7U0FDSjtRQUNELE9BQU8sYUFBYSxDQUFDO0tBQ3hCOzs7Ozs7SUFLRCxtQkFBbUIsQ0FBQyxLQUFLOztRQUNyQixJQUFJLFVBQVUsR0FBRyxVQUFVLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDOztRQUNoRCxJQUFJLFVBQVUsR0FBRyxVQUFVLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQy9DLE9BQU8sVUFBVSxHQUFHLEdBQUcsR0FBRyxVQUFVLENBQUE7S0FDdkM7Ozs7OztJQUVELFFBQVEsQ0FBQyxHQUFHLEVBQUUsS0FBSzs7Ozs7Ozs7Ozs7OztRQWNmLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1lBQzdCLElBQUcsOENBQThDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFDO2dCQUMxRCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQzthQUN0RDtpQkFBSTtnQkFDRCxPQUFPLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUN2QjtTQUNGO1FBQ0QsT0FBTyxLQUFLLENBQUM7S0FDaEI7Ozs7OztJQUNELGNBQWMsQ0FBQyxHQUFHLEVBQUUsS0FBSzs7Ozs7Ozs7Ozs7OztRQWN2QixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtZQUM3QixJQUFHLDhDQUE4QyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBQztnQkFDMUQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7YUFDdEQ7aUJBQUk7Z0JBQ0QsT0FBTyxLQUFLLENBQUM7YUFDaEI7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0tBQ2hCOzs7OztJQUNDLGtCQUFrQixDQUFDLElBQUk7UUFDbkIsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQzs7UUFDcEIsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBc0M7O1FBQXRGLElBQWtELEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RGLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzs7UUFDM0IsSUFBSSxZQUFZLEdBQUcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMzSCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFFO0tBQzFIO0lBQUEsQ0FBQzs7Ozs7SUFFRixrQkFBa0IsQ0FBQyxNQUFNO1FBQ3JCLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDM0IsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNwQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDcEMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNwQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDcEMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNwQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDcEMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLE9BQU8sTUFBTSxDQUFDO0tBQ2pCOzs7Ozs7SUFFRCxZQUFZLENBQUMsS0FBSyxFQUFFLEtBQUs7UUFDckIsS0FBSyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7O1FBQ2xCLElBQUksT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxRQUFRO1lBQzNDLFFBQVEsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUztZQUNoRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDOztRQUN0QyxJQUFJLFlBQVksR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdkgsT0FBTyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUNoRTtJQUFBLENBQUM7Ozs7Ozs7SUFFRixhQUFhLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBQyxNQUFNO1FBQzdCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUNsRSxJQUFHLE1BQU0sRUFBQztZQUNOLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1NBQ2hGO2FBQUk7WUFDRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN2RDtLQUNKO0lBQUEsQ0FBQzs7O1lBOXNCSCxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMgaXMgZnJvbSAnaXNfanMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMvT2JzZXJ2YWJsZSc7XG5pbXBvcnQgeyBsb2FkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9zcmMvcmVuZGVyMy9pbnN0cnVjdGlvbnMnO1xuaW1wb3J0IHsgR2VuRmlsdGVyT3B0aW9ucyB9IGZyb20gJy4uL21vZGVsL2dlbi1maWx0ZXItb3B0aW9ucyc7XG5pbXBvcnQgeyBHZW5GaWx0ZXIgfSBmcm9tICcuLi9tb2RlbC9nZW4tZmlsdGVyJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50LWVzNic7XG5kZWNsYXJlIHZhciAkOiBhbnk7XG5pbXBvcnQgeyBmb3JtYXREYXRlIH0gZnJvbSBcImRldmV4dHJlbWUvbG9jYWxpemF0aW9uXCI7XG5pbXBvcnQgeyBVVUlEIH0gZnJvbSAnYW5ndWxhcjItdXVpZCc7XG5pbXBvcnQgeyBsb2NhbGUgfSBmcm9tICdkZXZleHRyZW1lL2xvY2FsaXphdGlvbic7IC8vICMgQ2FsZW5kYXIgVEhcbmltcG9ydCAnZGV2ZXh0cmVtZS1pbnRsJztcbi8vICMgQ2FsZW5kYXIgVEhcbmxvY2FsZSgndGgnKTsvLyAjIENhbGVuZGFyIFRIXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDb21tb24ge1xuICBEQVRFX0ZPUk1BVCA9ICdZWVlZLU1NLUREIEhIOm1tOnNzJztcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc29sZS5sb2coXCJsaWIgY29tbW9uIHZlcnNpb24gMS4xMS4yMVwiKVxuICB9XG5cbiAgLyoqXG4gICAqIGZuLiDguYDguIrguYfguIQgZGF0YSDguJfguLjguIHguJvguKPguLDguYDguKDguJcg4LiI4LiwIFJldHVybiDguIHguKXguLHguJrguYTguJvguYDguJvguYfguJkgdHJ1ZXxmYWxzZVxuICAgKiBAcGFyYW0gZGF0YVxuICAgKi9cbiAgaXNOb3RFbXB0eShkYXRhKSB7XG4gICAgbGV0IGhhdmVEYXRhID0gZmFsc2U7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBkYXRhO1xuICAgIC8vIC8vY29uc29sZS50YWcoJ3R5cGU6JykubG9nKHR5cGUpXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAvLyBhcnJheXxvYmplY3RcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIGlmICghZGF0YSB8fCBkYXRhID09IG51bGwpIHtcbiAgICAgICAgICBoYXZlRGF0YSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhWzBdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGhhdmVEYXRhID0gZGF0YS5sZW5ndGggIT09IDAgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICBoYXZlRGF0YSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGF2ZURhdGEgPSBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBzdHJpbmdcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgaGF2ZURhdGEgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gbnVtYmVyXG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgLy8gYm9vbGVhblxuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAvLyBmdW5jdGlvblxuICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICBoYXZlRGF0YSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaGF2ZURhdGEgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBoYXZlRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBmbi4g4Lib4Lix4LmJ4LiZIGZpbHRlciDguKrguLPguKvguKPguLHguJogQ3VzdG9tIFN0b3JlIOC5geC4muC4muC4oeC4tSBmaWVsZCxmaWx0ZXIsb3JkZXJieVxuICAgKiBAcGFyYW0gZmlsdGVyT3B0aW9ucyA6IHt9XG4gICAqL1xuICBmbkdlbkZpbHRlcihmaWx0ZXJPcHRpb25zOiBHZW5GaWx0ZXIpIHtcbiAgICAvLyAgLy8gY2hlY2sgdmFsdWVcbiAgICBjb25zdCBsb2FkT3B0aW9ucyA9IGZpbHRlck9wdGlvbnMubG9hZE9wdGlvbnMgfHwge307XG4gICAgY29uc3QgZmlsdGVyTGlzdCA9IGZpbHRlck9wdGlvbnMuZmlsdGVyTGlzdCB8fCB7fTtcbiAgICBjb25zdCBleGNlcHRpb25MaXN0ID0gZmlsdGVyT3B0aW9ucy5leGNlcHRpb25MaXN0IHx8IFtdO1xuICAgIGNvbnN0IG9wdGlvbnMgPSBmaWx0ZXJPcHRpb25zLm9wdGlvbnMgfHwge307XG4gICAgLy8gRE9cbiAgICBjb25zdCBmaWx0ZXIgPSBuZXcgT2JzZXJ2YWJsZShvYnNlcnZlciA9PiB7XG4gICAgICAvLyDguYDguIrguYfguIQgbG9hZE9wdGlvbnNcbiAgICAgIGNvbnN0IGRhdGExID0gdGhpcy5mbkNoZWNrTG9hZE9wdGlvbnMobG9hZE9wdGlvbnMpO1xuICAgICAgb2JzZXJ2ZXIubmV4dChkYXRhMSk7XG4gICAgICAvLyDguYDguIrguYfguIQgRmlsdGVyXG4gICAgICBjb25zdCBkYXRhMiA9IHRoaXMuZm5DaGVja0ZpbHRlckRhdGEoZmlsdGVyTGlzdCxleGNlcHRpb25MaXN0KTtcbiAgICAgIG9ic2VydmVyLm5leHQoZGF0YTIpO1xuICAgICAgLy8g4LmA4LiK4LmH4LiE4Lin4LmI4Liy4Lih4Li1IG9wdGlvbnMg4Lit4Liw4LmE4Lij4Lia4LmJ4Liy4LiH4LmB4Lil4Liw4LmB4LiB4LmJIGRhdGEg4LiV4Liy4LihIG9wdGlvbnMg4LiZ4Lix4LmJ4LiZXG4gICAgICBjb25zdCBkYXRhMyA9IHRoaXMuZm5DaGVja09wdGlvbnMoZGF0YTEsIGRhdGEyLCBvcHRpb25zKTtcbiAgICAgIG9ic2VydmVyLm5leHQoZGF0YTMpO1xuICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICB9KTtcbiAgICAvLyBUSEVOXG4gICAgbGV0IG9iaiA9IHt9O1xuICAgIGNvbnN0IG9ic2VydmVyU3RlcCA9IHtcbiAgICAgIG5leHQ6IGRhdGEgPT4gKG9iaiA9IGRhdGEpLFxuICAgICAgZXJyb3I6IGVyciA9PiBjb25zb2xlLmVycm9yKCdPYnNlcnZlciBnb3QgYW4gZXJyb3I6ICcgKyBlcnIpLFxuICAgICAgY29tcGxldGU6ICgpID0+IGNvbnNvbGUubG9nKCdvYmogOicsIG9iailcbiAgICB9O1xuICAgIGZpbHRlci5zdWJzY3JpYmUob2JzZXJ2ZXJTdGVwKTtcbiAgICAvLyByZXR1cm4gZmlsdGVyIOC4geC4peC4seC4muC5hOC4m1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBmbkNoZWNrTG9hZE9wdGlvbnMobG9hZE9wdGlvbnMpIHtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgbGltaXQ6ICcnLFxuICAgICAgb2Zmc2V0OiAnJyxcbiAgICAgIG9yZGVyX2J5OiBbXVxuICAgIH07XG4gICAgaWYgKHRoaXMuaXNOb3RFbXB0eShsb2FkT3B0aW9ucykpIHtcbiAgICAgIG9wdGlvbnMub2Zmc2V0ID0gdGhpcy5pc05vdEVtcHR5KGxvYWRPcHRpb25zLnNraXApXG4gICAgICAgID8gbG9hZE9wdGlvbnMuc2tpcFxuICAgICAgICA6ICcnO1xuICAgICAgb3B0aW9ucy5saW1pdCA9IHRoaXMuaXNOb3RFbXB0eShsb2FkT3B0aW9ucy50YWtlKSA/IGxvYWRPcHRpb25zLnRha2UgOiAnJztcbiAgICAgIGlmICh0aGlzLmlzTm90RW1wdHkobG9hZE9wdGlvbnMuc29ydCkpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCLigItDb21tb24gLT4gZm5DaGVja0xvYWRPcHRpb25zIC0+IGxvYWRPcHRpb25zLnNvcnRcIiwgbG9hZE9wdGlvbnMuc29ydClcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGxvYWRPcHRpb25zLnNvcnQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgY29uc3Qgc29ydCA9IGxvYWRPcHRpb25zLnNvcnRbaW5kZXhdO1xuICAgICAgICAgIGNvbnN0IG9yZGVyYnlTZWxlY3RvciA9IHNvcnQuc2VsZWN0b3IgfHwgJyc7XG4gICAgICAgICAgaWYgKG9yZGVyYnlTZWxlY3Rvcikge1xuICAgICAgICAgICAgaWYgKHNvcnQuZGVzYykge1xuICAgICAgICAgICAgICBvcHRpb25zLm9yZGVyX2J5LnB1c2gob3JkZXJieVNlbGVjdG9yICsgJyBkZXNjJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvcHRpb25zLm9yZGVyX2J5LnB1c2gob3JkZXJieVNlbGVjdG9yICsgJyBhc2MnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIG9wdGlvbnMub3JkZXJieSA9IHRoaXMuaXNOb3RFbXB0eShsb2FkT3B0aW9ucy5zb3J0KSA/IGxvYWRPcHRpb25zLnNvcnRbMF0uc2VsZWN0b3IgOiAnJztcbiAgICAgIC8vIG9wdGlvbnMub3JkZXJieSA9IHRoaXMuaXNOb3RFbXB0eShsb2FkT3B0aW9ucy5zb3J0KSAmJiBsb2FkT3B0aW9ucy5zb3J0WzBdLmRlc2MgPyBvcHRpb25zLm9yZGVyYnkgKyAnfERFU0MnIDogb3B0aW9ucy5vcmRlcmJ5ICsgJ3xBU0MnO1xuICAgIH1cbiAgICB0aGlzLmZuUmVtb3ZlRW1wdHlLZXkob3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnM7XG4gIH1cblxuICBmbkNoZWNrRmlsdGVyRGF0YShmaWx0ZXJMaXN0LGV4Y2VwdGlvbkxpc3QpIHtcbiAgICBjb25zdCBmaWx0ZXIgPSB7XG4gICAgICBmaWVsZHM6ICcnLFxuICAgICAgZmlsdGVyOiAnJyxcbiAgICAgIG9mZnNldDogJycsXG4gICAgICBsaW1pdDogJycsXG4gICAgICBvcmRlcmJ5OiAnJ1xuICAgIH07XG4gICAgaWYgKHRoaXMuaXNOb3RFbXB0eShmaWx0ZXJMaXN0KSkge1xuICAgICAgZmlsdGVyLmZpZWxkcyA9IHRoaXMuaXNOb3RFbXB0eShmaWx0ZXJMaXN0LmZpZWxkcylcbiAgICAgICAgPyBmaWx0ZXJMaXN0LmZpZWxkc1xuICAgICAgICA6ICcnO1xuICAgICAgaWYgKGZpbHRlckxpc3QuZmlsdGVyKSB7XG4gICAgICAgIGZpbHRlci5maWx0ZXIgPSB0aGlzLmZuQ29udmVyc3RGaWx0ZXJEYXRlKGZpbHRlckxpc3QuZmlsdGVyLGV4Y2VwdGlvbkxpc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmlsdGVyLmZpbHRlciA9ICcnXG4gICAgICB9XG4gICAgICAvLyBmaWx0ZXIuZmlsdGVyID0gdGhpcy5pc05vdEVtcHR5KGZpbHRlckxpc3QuZmlsdGVyKVxuICAgICAgLy8gICA/IGZpbHRlckxpc3QuZmlsdGVyXG4gICAgICAvLyAgIDogJyc7XG4gICAgICBmaWx0ZXIub2Zmc2V0ID0gdGhpcy5pc05vdEVtcHR5KGZpbHRlckxpc3Qub2Zmc2V0KVxuICAgICAgICA/IGZpbHRlckxpc3Qub2Zmc2V0XG4gICAgICAgIDogJyc7XG4gICAgICBmaWx0ZXIubGltaXQgPSB0aGlzLmlzTm90RW1wdHkoZmlsdGVyTGlzdC5saW1pdCkgPyBmaWx0ZXJMaXN0LmxpbWl0IDogJyc7XG4gICAgICBmaWx0ZXIub3JkZXJieSA9IHRoaXMuaXNOb3RFbXB0eShmaWx0ZXJMaXN0Lm9yZGVyYnkpXG4gICAgICAgID8gZmlsdGVyTGlzdC5vcmRlcmJ5XG4gICAgICAgIDogJyc7XG4gICAgfVxuICAgIHRoaXMuZm5SZW1vdmVFbXB0eUtleShmaWx0ZXIpO1xuICAgIHJldHVybiBmaWx0ZXI7XG4gIH1cblxuICBmbkNoZWNrT3B0aW9ucyhkYXRhMSwgZGF0YTIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBtZXJnZURhdGEgPSBfLm1lcmdlKGRhdGExLCBkYXRhMik7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgcmVtb3ZlRmlsdGVyRW1wdHkgPSBvcHRpb25zLnJlbW92ZUZpbHRlckVtcHR5IHx8IGZhbHNlOyAvLyBpZiBlbXB0eSBzdHJpbmcgd2lsbCByZW1vdmUgcGFyYW1ldGVyXG4gICAgaWYgKHJlbW92ZUZpbHRlckVtcHR5KSB7XG4gICAgICBtZXJnZURhdGEuZmlsdGVyID0gdGhpcy5mblJlbW92ZUVtcHR5S2V5KG1lcmdlRGF0YS5maWx0ZXIpO1xuICAgIH1cbiAgICByZXR1cm4gbWVyZ2VEYXRhO1xuICB9XG5cbiAgZm5SZW1vdmVFbXB0eUtleShvYmopIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGlmICghdGhpcy5pc05vdEVtcHR5KG9ialtrZXldKSkge1xuICAgICAgICBkZWxldGUgb2JqW2tleV07XG4gICAgICB9IGVsc2UgaWYgKF8uaXNPYmplY3Qob2JqW2tleV0pKSB7XG4gICAgICAgIG9ialtrZXldID0gdGhpcy5mblJlbW92ZUVtcHR5S2V5KG9ialtrZXldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIGZuQ29udmVyc3RGaWx0ZXJEYXRlKGZpbHRlcixleGNlcHRpb25MaXN0KSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZmlsdGVyKSB7XG4gICAgICBsZXQgZWxlbWVudCA9IGZpbHRlcltrZXldO1xuICAgICAgaWYgKF8uaXNPYmplY3QoZWxlbWVudCkpIHtcbiAgICAgICAgZm9yIChjb25zdCBkYXRlS2V5IGluIGVsZW1lbnQpIHtcbiAgICAgICAgICBpZiAoZWxlbWVudFtkYXRlS2V5XSAmJiAoZGF0ZUtleSA9PT0gJ2Zyb20nIHx8IGRhdGVLZXkgPT09ICd0bycpKSB7XG4gICAgICAgICAgICBpZihleGNlcHRpb25MaXN0LmluY2x1ZGVzKGtleSkpe1xuICAgICAgICAgICAgICAgIGVsZW1lbnRbZGF0ZUtleV0gPSBtb21lbnQoZWxlbWVudFtkYXRlS2V5XSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tOnNzJyk7XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgaWYoZGF0ZUtleSA9PT0gJ2Zyb20nKXtcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnRbZGF0ZUtleV0gPSBtb21lbnQoZWxlbWVudFtkYXRlS2V5XSkuZm9ybWF0KCdZWVlZLU1NLUREIDAwOjAwOjAwJyk7XG4gICAgICAgICAgICAgIH1lbHNlIGlmKGRhdGVLZXkgPT09ICd0bycpe1xuICAgICAgICAgICAgICAgICAgZWxlbWVudFtkYXRlS2V5XSA9IG1vbWVudChlbGVtZW50W2RhdGVLZXldKS5mb3JtYXQoJ1lZWVktTU0tREQgMjM6NTk6NTknKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmlsdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIGZuLiDguJvguLHguYnguJkgZmlsdGVyIOC4quC4s+C4q+C4o+C4seC4miBDdXN0b20gU3RvcmUg4LmB4Lia4LiaIGJhc2ljXG4gICAqIEBwYXJhbSBsb2FkT3B0aW9uc1xuICAgKi9cbiAgZm5HZW5GaWx0ZXJCYXNpYyhsb2FkT3B0aW9uczogYW55KSB7XG4gICAgY29uc29sZS5sb2coJ+KAi0NvbW1vbiAtPiBmbkdlbkZpbHRlckJhc2ljIC0+IGxvYWRPcHRpb25zJywgbG9hZE9wdGlvbnMpO1xuICAgIGxldCBwYXJhbXMgPSAnPyc7XG4gICAgcGFyYW1zICs9ICdza2lwPScgKyBsb2FkT3B0aW9ucy5za2lwIHx8IDA7XG4gICAgcGFyYW1zICs9ICcmdGFrZT0nICsgbG9hZE9wdGlvbnMudGFrZSB8fCAxMDtcbiAgICBpZiAobG9hZE9wdGlvbnMuc29ydCkge1xuICAgICAgcGFyYW1zICs9ICcmb3JkZXJieT0nICsgbG9hZE9wdGlvbnMuc29ydFswXS5zZWxlY3RvcjtcbiAgICAgIGlmIChsb2FkT3B0aW9ucy5zb3J0WzBdLmRlc2MpIHtcbiAgICAgICAgcGFyYW1zICs9ICcgZGVzYyc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cbiAgLyoqXG4gICAqIOC5geC4m+C4peC4h+C4p+C4seC4meC4l+C4teC5iCDguIjguLLguIEgU3RyaW5nIOC5gOC4m+C5h+C4mSBUeXBlIERhdGVcbiAgICogQHBhcmFtIGRhdGUg4Lin4Lix4LiZ4LiX4Li14LmIIOC4l+C4teC5iOC4leC5ieC4reC4h+C4geC4suC4o+C5geC4m+C4peC4h1xuICAgKiBAcGFyYW0gZm9ybWF0T2ZEYXRlIOC4luC5ieC4suC4o+C4ueC5iSBmb3JtYXQg4LiC4Lit4LiHIGRhdGUg4LiX4Li14LmI4Liq4LmI4LiH4LmA4LiC4LmJ4Liy4Lih4Liy4LmD4Lir4LmJ4Lij4Liw4Lia4Li44LiU4LmJ4Lin4LiiXG4gICAqL1xuICBmblRvRGF0ZShkYXRlLCBmb3JtYXRPZkRhdGU/KSB7XG4gICAgaWYgKGRhdGUpIHtcbiAgICAgIGlmIChmb3JtYXRPZkRhdGUpIHtcbiAgICAgICAgcmV0dXJuIG1vbWVudChkYXRlLCBmb3JtYXRPZkRhdGUpLnRvRGF0ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG1vbWVudChkYXRlKS50b0RhdGUoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiDguYHguJvguKXguIfguKfguLHguJnguJfguLXguYgg4LiI4Liy4LiBIFN0cmluZyDguYDguJvguYfguJkgVHlwZSBEYXRlIOC5guC4lOC4ouC4oeC4teC4reC4tOC4hyBmb3JtYXQg4LiI4Liy4LiBIERCICdZWVlZLU1NLUREJ1xuICAgKiBAcGFyYW0gZGF0ZSDguKfguLHguJnguJfguLXguYgg4LiX4Li14LmI4LiV4LmJ4Lit4LiH4LiB4Liy4Lij4LmB4Lib4Lil4LiHXG4gICAqL1xuICBmbkxUb0RhdGVGcm9tREIoZGF0ZSkge1xuICAgIHJldHVybiBtb21lbnQoZGF0ZSwgJ1lZWVktTU0tREQnKS50b0RhdGUoKTtcbiAgfVxuICAvKipcbiAgICog4LmA4Lib4Lil4Li14LmI4Lii4LiZ4Lig4Liy4Lip4LiyIERhdGUgUGlja2VyIOC4guC4reC4hyBQcmltZSBOR1xuICAgKiBAcGFyYW0gbG9jYWwg4Lig4Liy4Lip4LiyXG4gICAqL1xuICBmbkxvY2FsUENhbGVuZGFyKGxvY2FsKSB7XG4gICAgc3dpdGNoIChsb2NhbCkge1xuICAgICAgY2FzZSAndGgnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZpcnN0RGF5T2ZXZWVrOiAxLFxuICAgICAgICAgIGRheU5hbWVzOiBbXG4gICAgICAgICAgICAn4Lit4Liy4LiX4Li04LiV4Lii4LmMJyxcbiAgICAgICAgICAgICfguIjguLHguJnguJfguKPguYwnLFxuICAgICAgICAgICAgJ+C4reC4seC4h+C4hOC4suC4oycsXG4gICAgICAgICAgICAn4Lie4Li44LiYJyxcbiAgICAgICAgICAgICfguJ7guKTguKvguLHguKonLFxuICAgICAgICAgICAgJ+C4qOC4uOC4geC4o+C5jCcsXG4gICAgICAgICAgICAn4LmA4Liq4Liy4Lij4LmMJ1xuICAgICAgICAgIF0sXG4gICAgICAgICAgZGF5TmFtZXNTaG9ydDogWyfguK3guLInLCAn4LiIJywgJ+C4rScsICfguJ4nLCAn4Lie4LikJywgJ+C4qCcsICfguKonXSxcbiAgICAgICAgICBkYXlOYW1lc01pbjogWyfguK3guLInLCAn4LiIJywgJ+C4rScsICfguJ4nLCAn4Lie4LikJywgJ+C4qCcsICfguKonXSxcbiAgICAgICAgICBtb250aE5hbWVzOiBbXG4gICAgICAgICAgICAn4Lih4LiB4Lij4Liy4LiE4LihJyxcbiAgICAgICAgICAgICfguIHguLjguKHguKDguLLguJ7guLHguJnguJjguYwnLFxuICAgICAgICAgICAgJ+C4oeC4teC4meC4suC4hOC4oScsXG4gICAgICAgICAgICAn4LmA4Lih4Lip4Liy4Lii4LiZJyxcbiAgICAgICAgICAgICfguJ7guKTguKnguKDguLLguITguKEnLFxuICAgICAgICAgICAgJ+C4oeC4tOC4luC4uOC4meC4suC4ouC4mScsXG4gICAgICAgICAgICAn4LiB4Lij4LiB4LiO4Liy4LiE4LihJyxcbiAgICAgICAgICAgICfguKrguLTguIfguKvguLLguITguKEnLFxuICAgICAgICAgICAgJ+C4geC4seC4meC4ouC4suC4ouC4mScsXG4gICAgICAgICAgICAn4LiV4Li44Lil4Liy4LiE4LihJyxcbiAgICAgICAgICAgICfguJ7guKTguKjguIjguLTguIHguLLguKLguJknLFxuICAgICAgICAgICAgJ+C4mOC4seC4meC4p+C4suC4hOC4oSdcbiAgICAgICAgICBdLFxuICAgICAgICAgIG1vbnRoTmFtZXNTaG9ydDogW1xuICAgICAgICAgICAgJ+C4oS7guIQuJyxcbiAgICAgICAgICAgICfguIEu4LieLicsXG4gICAgICAgICAgICAn4Lih4Li1LuC4hC4nLFxuICAgICAgICAgICAgJ+C5gOC4oS7guKIuJyxcbiAgICAgICAgICAgICfguJ4u4LiELicsXG4gICAgICAgICAgICAn4Lih4Li0LuC4oi4nLFxuICAgICAgICAgICAgJ+C4gS7guIQuJyxcbiAgICAgICAgICAgICfguKou4LiELicsXG4gICAgICAgICAgICAn4LiBLuC4oi4nLFxuICAgICAgICAgICAgJ+C4lS7guIQuJyxcbiAgICAgICAgICAgICfguJ4u4LiiLicsXG4gICAgICAgICAgICAn4LiYLuC4hC4nXG4gICAgICAgICAgXSxcbiAgICAgICAgICB0b2RheTogJ+C4p+C4seC4meC4meC4teC5iScsXG4gICAgICAgICAgY2xlYXI6ICfguYDguITguKXguLXguKInXG4gICAgICAgIH07XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZmlyc3REYXlPZldlZWs6IDAsXG4gICAgICAgICAgZGF5TmFtZXM6IFtcbiAgICAgICAgICAgICdTdW5kYXknLFxuICAgICAgICAgICAgJ01vbmRheScsXG4gICAgICAgICAgICAnVHVlc2RheScsXG4gICAgICAgICAgICAnV2VkbmVzZGF5JyxcbiAgICAgICAgICAgICdUaHVyc2RheScsXG4gICAgICAgICAgICAnRnJpZGF5JyxcbiAgICAgICAgICAgICdTYXR1cmRheSdcbiAgICAgICAgICBdLFxuICAgICAgICAgIGRheU5hbWVzU2hvcnQ6IFsnU3VuJywgJ01vbicsICdUdWUnLCAnV2VkJywgJ1RodScsICdGcmknLCAnU2F0J10sXG4gICAgICAgICAgZGF5TmFtZXNNaW46IFsnU3UnLCAnTW8nLCAnVHUnLCAnV2UnLCAnVGgnLCAnRnInLCAnU2EnXSxcbiAgICAgICAgICBtb250aE5hbWVzOiBbXG4gICAgICAgICAgICAnSmFudWFyeScsXG4gICAgICAgICAgICAnRmVicnVhcnknLFxuICAgICAgICAgICAgJ01hcmNoJyxcbiAgICAgICAgICAgICdBcHJpbCcsXG4gICAgICAgICAgICAnTWF5JyxcbiAgICAgICAgICAgICdKdW5lJyxcbiAgICAgICAgICAgICdKdWx5JyxcbiAgICAgICAgICAgICdBdWd1c3QnLFxuICAgICAgICAgICAgJ1NlcHRlbWJlcicsXG4gICAgICAgICAgICAnT2N0b2JlcicsXG4gICAgICAgICAgICAnTm92ZW1iZXInLFxuICAgICAgICAgICAgJ0RlY2VtYmVyJ1xuICAgICAgICAgIF0sXG4gICAgICAgICAgbW9udGhOYW1lc1Nob3J0OiBbXG4gICAgICAgICAgICAnSmFuJyxcbiAgICAgICAgICAgICdGZWInLFxuICAgICAgICAgICAgJ01hcicsXG4gICAgICAgICAgICAnQXByJyxcbiAgICAgICAgICAgICdNYXknLFxuICAgICAgICAgICAgJ0p1bicsXG4gICAgICAgICAgICAnSnVsJyxcbiAgICAgICAgICAgICdBdWcnLFxuICAgICAgICAgICAgJ1NlcCcsXG4gICAgICAgICAgICAnT2N0JyxcbiAgICAgICAgICAgICdOb3YnLFxuICAgICAgICAgICAgJ0RlYydcbiAgICAgICAgICBdLFxuICAgICAgICAgIHRvZGF5OiAnVG9kYXknLFxuICAgICAgICAgIGNsZWFyOiAnQ2xlYXInXG4gICAgICAgIH07XG4gICAgfVxuICB9XG4gIGNvbGxhcHNlRm4oaWQpIHtcbiAgICBjb25zdCBpYm94ID0gJCgnIycgKyBpZCArICcgZGl2LmNvbGxhcHNlLWxpbmsnKS5jbG9zZXN0KCdkaXYuaWJveCcpO1xuICAgIGNvbnN0IGJ1dHRvbiA9ICQoJyMnICsgaWQgKyAnIGRpdi5jb2xsYXBzZS1saW5rJykuZmluZCgnaScpO1xuICAgIGNvbnN0IGJ1dHRvbjEgPSAkKCcjJyArIGlkICsgJyBkaXYuY29sbGFwc2UtbGluaycpLmZpbmQoJ3N2ZycpO1xuICAgIGNvbnN0IGJvZHkgPSBpYm94LmZpbmQoJ2Rpdi5pYm94LWJvZHknKTtcbiAgICBjb25zdCBjb250ZW50ID0gaWJveC5maW5kKCdkaXYuaWJveC1jb250ZW50Jyk7XG4gICAgY29uc3QgZm9vdGVyID0gaWJveC5maW5kKCdkaXYuaWJveC1mb290ZXInKTtcbiAgICBib2R5LnNsaWRlVG9nZ2xlKCk7XG4gICAgY29udGVudC5zbGlkZVRvZ2dsZSgpO1xuICAgIGZvb3Rlci5zbGlkZVRvZ2dsZSgpO1xuICAgIGJ1dHRvbi50b2dnbGVDbGFzcygnZmFyIGZhLWNoZXZyb24tdXAnKS50b2dnbGVDbGFzcygnZmFyIGZhLWNoZXZyb24tZG93bicpO1xuICAgIGJ1dHRvbjEudG9nZ2xlQ2xhc3MoJ2ZhciBmYS1jaGV2cm9uLXVwJykudG9nZ2xlQ2xhc3MoJ2ZhciBmYS1jaGV2cm9uLWRvd24nKTtcbiAgICBpYm94LnRvZ2dsZUNsYXNzKCcnKS50b2dnbGVDbGFzcygnYm9yZGVyLWJvdHRvbScpO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgaWJveC5yZXNpemUoKTtcbiAgICAgIGlib3guZmluZCgnW2lkXj1tYXAtXScpLnJlc2l6ZSgpO1xuICAgIH0sIDUwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDguYDguIvguYfguJUgYWN0aW9uIGRlbGV0ZSDguKrguLPguKvguKPguLHguJrguKrguYjguIcgcG9zdCDguYTguJsgYXBpXG4gICAqIEBwYXJhbSBpZExpc3QgaWQg4LiX4Li14LmI4Lil4LiaXG4gICAqIEBwYXJhbSBkYXRhTGlzdCBhcnJheSBkYXRhIOC4l+C4teC5iOC4leC5ieC4reC4h+C4geC4suC4o+C4iOC4seC4lOC4geC4suC4o1xuICAgKi9cbiAgZm5GbGFnRGVsZXRlKGlkTGlzdDogYW55W10sIGRhdGFMaXN0OiBhbnlbXSkge1xuICAgIGxldCByZXN1bHRMaXN0ID0gW107XG4gICAgZm9yIChsZXQgaW5kZXhEcyA9IDA7IGluZGV4RHMgPCBkYXRhTGlzdC5sZW5ndGg7IGluZGV4RHMrKykge1xuICAgICAgY29uc3Qgb2JqID0gZGF0YUxpc3RbaW5kZXhEc107XG4gICAgICBjb25zdCBpZCA9IF8uZmluZChpZExpc3QsIHZhbHVlID0+IHZhbHVlID09PSBvYmouaWQpO1xuICAgICAgaWYgKG9iai5pZCAhPSBpZCkge1xuICAgICAgICByZXN1bHRMaXN0LnB1c2gob2JqKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdExpc3Q7XG4gIH1cbiAgLyoqXG4gICAqICDguYDguIvguYfguJUgYWN0aW9uIGVkaXQg4Liq4Liz4Lir4Lij4Lix4Lia4Liq4LmI4LiHIHBvc3Qg4LmE4LibIGFwaVxuICAgKiBAcGFyYW0gZGF0YUxpc3QgYXJyYXkgZGF0YSDguJfguLXguYjguJXguYnguK3guIfguIHguLLguKPguIjguLHguJTguIHguLLguKNcbiAgICogQHBhcmFtIG5hbWVJZCDguIrguLfguYjguK0gcmVmIGlkIOC4guC4reC4hyB0YWJsZVxuICAgKiBAcGFyYW0gbWFpbklkIOC4hOC5iOC4siByZWYgaWQg4LiC4Lit4LiHIHRhYmxlXG4gICAqL1xuICBmbkZsYWdFZGl0KGRhdGFMaXN0OiBhbnlbXSkge1xuICAgIGxldCByZXN1bHRMaXN0ID0gW107XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGRhdGFMaXN0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgbGV0IG9iaiA9IGRhdGFMaXN0W2luZGV4XTtcbiAgICAgIGlmIChvYmouaWQgPiAwKSB7XG4gICAgICAgIG9iai5hY3Rpb24gPSAnZWRpdCc7XG4gICAgICB9XG4gICAgICByZXN1bHRMaXN0LnB1c2gob2JqKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdExpc3Q7XG4gIH1cbiAgLyoqXG4gICAqIOC5gOC4i+C5h+C4leC4hOC5iOC4suC5gOC4oeC4t+C5iOC4reC4geC4lCBlZGl0XG4gICAqIEBwYXJhbSBkYXRhTGlzdCBhcnJheSBkYXRhIOC4l+C4teC5iOC4leC5ieC4reC4h+C4geC4suC4o+C4iOC4seC4lOC4geC4suC4o1xuICAgKiBAcGFyYW0gZGF0YSBkYXRhIOC4guC4reC4hyByb3cg4Lib4Lix4LiI4LiI4Li44Lia4Lix4LiZIOC4q+C4o+C4t+C4rSBkYXRhIOC4l+C4teC5iOC4leC5ieC4reC4h+C4geC4suC4o+C5gOC4reC4suC4hOC5iOC4suC5hOC4m+C4reC4seC4nuC5gOC4lOC4leC5g+C4q+C5iSBhcnJheSBkYXRhXG4gICAqIEBwYXJhbSBuYW1lSWQg4LiK4Li34LmI4LitIHJlZiBpZCDguILguK3guIcgdGFibGVcbiAgICogQHBhcmFtIG1haW5JZCDguITguYjguLIgcmVmIGlkIOC4guC4reC4hyB0YWJsZVxuICAgKi9cbiAgZm5TZXRWYWx1ZUVkaXQoZGF0YUxpc3Q6IGFueVtdLCBkYXRhOiBhbnkpIHtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZGF0YUxpc3QubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBsZXQgb2JqID0gZGF0YUxpc3RbaW5kZXhdO1xuICAgICAgaWYgKG9iai5pZCA9PT0gZGF0YS5pZCkge1xuICAgICAgICBkYXRhTGlzdFtpbmRleF0gPSBkYXRhO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YUxpc3Q7XG4gIH1cbiAgLyoqXG4gICAqIOC4peC4miBpZCDguIrguLHguYjguKfguITguKPguLLguKfguJfguLXguYjguKrguKPguYnguLLguIfguILguLbguYnguJnguKHguLLguYPguIrguYnguKrguLPguKvguKPguLHguJogZGF0YWdyaWRcbiAgICogQHBhcmFtIGRhdGFMaXN0IGFycmF5IGRhdGEg4LiX4Li14LmI4LiV4LmJ4Lit4LiH4LiB4Liy4Lij4LiI4Lix4LiU4LiB4Liy4LijXG4gICAqL1xuICBmblJlbW92ZUZha2VJZChkYXRhTGlzdDogYW55W10pIHtcbiAgICBsZXQgcmVzdWx0TGlzdCA9IFtdO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBkYXRhTGlzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGxldCBvYmogPSBkYXRhTGlzdFtpbmRleF07XG4gICAgICBpZiAob2JqLmlkIDwgMCkge1xuICAgICAgICBkZWxldGUgb2JqLmlkO1xuICAgICAgfVxuICAgICAgcmVzdWx0TGlzdC5wdXNoKG9iaik7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRMaXN0O1xuICB9XG4gIC8qKlxuICAgKiBjaGVjayByZXNwb25zZSDguYHguKXguLDguYHguKrguJTguIcgbW9kYWwg4LiV4Liy4LihIHJlc3VsdCBjb2RlXG4gICAqIEBwYXJhbSByZXNwb25zZSBkYXRhIOC4l+C4teC5iOC4quC5iOC4h+C4oeC4suC4iOC4suC4gSBhcGlcbiAgICogQHBhcmFtIG1vZGFsIG1vZGFsIOC4l+C4teC5iOC4nOC4ueC4geC4geC4seC4miBVSSDguJnguLHguYnguJkg4LmGXG4gICAqL1xuICBmbkNoZWNrUmVzcG9uc2UocmVzcG9uc2UsIG1vZGFsKSB7XG4gICAgaWYgKCtyZXNwb25zZS5yZXN1bHRDb2RlID09PSAyMDAwMCkge1xuICAgICAgY29uc3QgZGF0YUFsZXJ0ID0ge1xuICAgICAgICAnbW9kYWxJZCc6ICdteU1vZGFsU3VjY2VzcycsXG4gICAgICAgICd1c2VyVGl0bGUnOiAnU3VjY2VzcycsXG4gICAgICAgICd1c2VyTWVzc2FnZSc6ICfguJTguLPguYDguJnguLTguJnguIHguLLguKPguKrguLPguYDguKPguYfguIgnXG4gICAgICB9O1xuICAgICAgbW9kYWwub3Blbk1vZGFsKGRhdGFBbGVydCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRhdGFBbGVydCA9IHtcbiAgICAgICAgJ21vZGFsSWQnOiAnbXlNb2RhbEVycm9yJyxcbiAgICAgICAgJ3VzZXJUaXRsZSc6ICdFcnJvcicsXG4gICAgICAgICd1c2VyTWVzc2FnZSc6ICfguJTguLPguYDguJnguLTguJnguIHguLLguKPguYTguKHguYjguKrguLPguYDguKPguYfguIgnXG4gICAgICB9O1xuICAgICAgbW9kYWwub3Blbk1vZGFsKGRhdGFBbGVydCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBmbiDguIjguLHguJTguIHguLLguKMgYWN0aW9uIOC4guC4reC4hyBkYXRhIENSVURcbiAgICogQHBhcmFtIGEgZGF0YWxpc3Qg4LiX4Li14LmI4LmA4LiB4LmH4Lia4LmE4Lin4LmJ4LiV4Lit4LiZIEdldFxuICAgKiBAcGFyYW0gYiBkYXRhbGlzdCDguJvguLHguIjguIjguLjguJrguLHguJnguJfguLXguYjguYDguJvguKXguLXguYjguKLguJnguYHguJvguKXguIdcbiAgICogQHBhcmFtIGlkTmFtZSBrZXkga2V5IOC4q+C4peC4seC4geC4l+C4teC5iOC4leC5ieC4reC4h+C4geC4suC4o+C5g+C4iuC5ieC5gOC4m+C4o+C4teC4ouC4muC5gOC4l+C4teC4ouC4mlxuICAgKi9cbiAgZm5CdWlsZEFycmF5QWN0aW9uKGEsIGIsIGlkTmFtZSA9ICdpZCcpIHtcbiAgICBjb25zdCBhQ2xvbmUgPSBfLmNsb25lRGVlcChhKTtcbiAgICBjb25zdCBiQ2xvbmUgPSBfLmNsb25lRGVlcChiKTtcbiAgICBjb25zdCBkZWxldGVkX2FkZGVkID0gXy54b3JCeShhQ2xvbmUsIGJDbG9uZSwgaWROYW1lKTtcbiAgICAvLyBjb25zb2xlLmxvZygnZGVsZXRlZF9hZGQnLCBkZWxldGVkX2FkZGVkKTtcbiAgICAvLyBjb25zb2xlLmxvZygnLS0tLScpO1xuXG4gICAgY29uc3QgZGVsZXRlZCA9IF8uZmlsdGVyKGRlbGV0ZWRfYWRkZWQsIChvKSA9PiBvW2lkTmFtZV0gPiAwKTtcbiAgICAvLyBjb25zb2xlLmxvZygnZGVsZXRlZCcsIGRlbGV0ZWQpO1xuICAgIC8vIGNvbnNvbGUubG9nKCctLS0tJyk7XG5cbiAgICBjb25zdCBjb21iaW5lID0gXy51bmlvbkJ5KGRlbGV0ZWQsIGJDbG9uZSwgaWROYW1lKTtcbiAgICAvLyBjb25zb2xlLmxvZygnY29tYmluZScsIGNvbWJpbmUpO1xuICAgIC8vIGNvbnNvbGUubG9nKCctLS0tJyk7XG5cbiAgICBmb3IgKGxldCBpdGVtIG9mIGNvbWJpbmUpIHtcbiAgICAgIGlmIChfLmluY2x1ZGVzKGRlbGV0ZWRfYWRkZWQsIGl0ZW0pKSB7XG4gICAgICAgIGlmIChpdGVtW2lkTmFtZV0gPCAwKSB7XG4gICAgICAgICAgaXRlbVsnYWN0aW9uJ10gPSAnYWRkJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IobGV0IGZpZWxkIGluIGl0ZW0pe1xuICAgICAgICAgICAgaWYoZmllbGQgIT09IGlkTmFtZSl7XG4gICAgICAgICAgICAgIGRlbGV0ZSBpdGVtW2ZpZWxkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaXRlbS5hY3Rpb24gPSBcImRlbGV0ZVwiO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIGl0ZW1bJ2FjdGlvbiddID0gJ2VkaXQnO1xuICAgICAgfVxuICAgICAgaWYoaXRlbS5yb3dfbnVtYmVyKXtcbiAgICAgICAgZGVsZXRlIGl0ZW1bJ3Jvd19udW1iZXInXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbWJpbmU7XG4gIH1cblxuICAvKipcbiAgICogZm4g4Lib4Lix4LmJ4LiZ4LiC4LmJ4Lit4LiE4Lin4Liy4Lih4Lir4Lix4LinIFRhYmxlXG4gICAqIEBwYXJhbSByZXN1bHQg4Lic4Lil4Lil4Lix4LieIGRhdGEg4LiX4Li14LmI4LmE4LiU4LmJ4LiI4Liy4LiBIGN1c3RvbSBzdG9yZVxuICAgKi9cbiAgZm5HZW5UZXh0VG90YWwocmVzdWx0OiBhbnkpIHtcbiAgICBjb25zdCByZXN1bHRDb3VudCA9IHJlc3VsdC5kYXRhLmxlbmd0aCB8fCAwO1xuICAgIGNvbnN0IHRvdGFsQ291bnQgPSByZXN1bHQudG90YWxDb3VudCB8fCAwO1xuICAgIGxldCB0ZXh0VG90YWwgPSBg4Lic4Lil4Lil4Lix4Lie4LiY4LmMICR7cmVzdWx0Q291bnR9IOC4o+C4suC4ouC4geC4suC4oyDguIjguLLguIHguJfguLHguYnguIfguKvguKHguJQgJHt0b3RhbENvdW50fSDguKPguLLguKLguIHguLLguKNgO1xuICAgIHJldHVybiB0ZXh0VG90YWw7XG4gIH1cblxuICAvKipcbiAgICogZm4g4Lib4Lix4LmJ4LiZ4LiC4LmJ4Lit4LiE4Lin4Liy4Lih4Lir4Lix4LinIFRhYmxlIOC4quC4s+C4q+C4o+C4seC4miBkYXRhc291cmNlIOC5geC4muC4miBnZXQg4LiE4Lij4Lix4LmJ4LiH4LmA4LiU4Li14Lii4LinXG4gICAqIEBwYXJhbSBldmVudCBldmVudCDguJfguLXguYjguYTguJTguYnguIjguLLguIEgZXZlbnQgb25PcHRpb25DaGFuZ2VkXG4gICAqL1xuICBmbkdlblRleHRUb3RhbFJhdyhldmVudDogYW55KSB7XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQubmFtZSA9PT0gJ3BhZ2luZycgfHwgZXZlbnQubmFtZSA9PT0gJ2RhdGFTb3VyY2UnKSB7XG4gICAgICAgICAgY29uc3QgZ2V0VmlzaWJsZVJvd3MgPSBldmVudC5jb21wb25lbnQgPyBldmVudC5jb21wb25lbnQuZ2V0VmlzaWJsZVJvd3MoKSA6IFtdO1xuICAgICAgICAgIGNvbnN0IHRvdGFsQ291bnQgPSBldmVudC5jb21wb25lbnQgPyBldmVudC5jb21wb25lbnQudG90YWxDb3VudCgpIDogMDtcbiAgICAgICAgICBjb25zdCByZXN1bHRDb3VudCA9IGdldFZpc2libGVSb3dzLmxlbmd0aCB8fCAwO1xuICAgICAgICAgIHJlc29sdmUoYOC4nOC4peC4peC4seC4nuC4mOC5jCAke3Jlc3VsdENvdW50fSDguKPguLLguKLguIHguLLguKMg4LiI4Liy4LiB4LiX4Lix4LmJ4LiH4Lir4Lih4LiUICR7dG90YWxDb3VudH0g4Lij4Liy4Lii4LiB4Liy4LijYCk7XG4gICAgICAgIH1cbiAgICAgIH0sIDEwMCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICAvKiogZm4g4LmA4Lib4Lil4Li14LmI4Lii4LiZIGNhbGVuZGFyIGRldmV4dHJlbWUg4LmD4Lir4LmJ4Lib4Li1IOC5gOC4m+C5h+C4meC5geC4muC4miDguJ4u4LioLiAqL1xuICBmbkNoYW5nZUNhbGVuZGFyWWVhcigpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeWVhclJlZ2V4ID0gL15bMC05XXs0fS1bMC05XXs0fSQvZztcbiAgICAgIGNvbnN0IHllYXJSZWdleDIgPSAvXlswLTldezR9XFxzLVxcc1swLTldezR9JC9nO1xuICAgICAgY29uc3QgYnRuTGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5keC1wb3B1cC1jb250ZW50IC5keC1jYWxlbmRhcicpO1xuICAgICAgZm9yIChsZXQgaW5kZXhCdG4gPSAwOyBpbmRleEJ0biA8IGJ0bkxpc3QubGVuZ3RoOyBpbmRleEJ0bisrKSB7XG4gICAgICAgIGNvbnN0IGJ0biA9IGJ0bkxpc3RbaW5kZXhCdG5dO1xuICAgICAgICBidG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4geyB9KTtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgIC8qKiDguYDguJvguKXguLXguYjguKLguJnguJvguLXguYPguJnguKrguYjguKfguJnguILguK3guIcgY2VsbCDguJTguYnguLLguJnguYPguJkgKi9cbiAgICAgICAgICBjb25zdCBkeENhbGVuZGFyQ2VsbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5keC1jYWxlbmRhci1jZWxsJyk7XG4gICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGR4Q2FsZW5kYXJDZWxsLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgY2VsbCA9IGR4Q2FsZW5kYXJDZWxsW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBjZWxsLmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpO1xuICAgICAgICAgICAgbGV0IG51bSA9IHBhcnNlSW50KHRleHQpO1xuICAgICAgICAgICAgaWYgKHRleHQubGVuZ3RoID09PSA0ICYmIG51bSAhPT0gTmFOKSB7XG4gICAgICAgICAgICAgIGxldCBudW0yID0gbnVtICsgNTQzO1xuICAgICAgICAgICAgICBjZWxsLnRleHRDb250ZW50ID0gbnVtMi50b1N0cmluZygpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0ZXh0Lm1hdGNoKHllYXJSZWdleDIpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGFyciA9IHRleHQuc3BsaXQoJy0nKTtcbiAgICAgICAgICAgICAgY29uc3QgeWVhcjEgPSBwYXJzZUludChhcnJbMF0pO1xuICAgICAgICAgICAgICBjb25zdCB5ZWFyMiA9IHBhcnNlSW50KGFyclsxXSk7XG4gICAgICAgICAgICAgIGNvbnN0IHN0ciA9ICh5ZWFyMSArIDU0MykudG9TdHJpbmcoKSArICctJyArICh5ZWFyMiArIDU0MykudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgY2VsbC50ZXh0Q29udGVudCA9IHN0cjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLyoqIOC5gOC4m+C4peC4teC5iOC4ouC4meC4m+C4teC5g+C4meC4quC5iOC4p+C4meC4guC4reC4hyBuYXYg4LiU4LmJ4Liy4LiZ4Lia4LiZICovXG4gICAgICAgICAgY29uc3QgZHhDYWxlbmRhclRvcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5keC1jYWxlbmRhci1jYXB0aW9uLWJ1dHRvbicpO1xuICAgICAgICAgIGZvciAobGV0IGluZGV4VG9wID0gMDsgaW5kZXhUb3AgPCBkeENhbGVuZGFyVG9wLmxlbmd0aDsgaW5kZXhUb3ArKykge1xuICAgICAgICAgICAgY29uc3QgY2VsbCA9IGR4Q2FsZW5kYXJUb3BbaW5kZXhUb3BdO1xuICAgICAgICAgICAgY29uc3QgdGV4dCA9IGNlbGwuZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJyk7XG4gICAgICAgICAgICBsZXQgbnVtID0gcGFyc2VJbnQodGV4dCk7XG4gICAgICAgICAgICBpZiAodGV4dC5sZW5ndGggPT09IDQgJiYgbnVtICE9PSBOYU4pIHtcbiAgICAgICAgICAgICAgbGV0IG51bTIgPSBudW0gKyA1NDM7XG4gICAgICAgICAgICAgIGxldCBmaXNydCA9IGNlbGwuY2hpbGRyZW47XG4gICAgICAgICAgICAgIGxldCB0YXJnZXQgPSBmaXNydC5pdGVtKDApLmNoaWxkcmVuO1xuICAgICAgICAgICAgICB0YXJnZXQuaXRlbSgwKS50ZXh0Q29udGVudCA9IG51bTIudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGV4dC5tYXRjaCh5ZWFyUmVnZXgpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGFyciA9IHRleHQuc3BsaXQoJy0nKTtcbiAgICAgICAgICAgICAgY29uc3QgeWVhcjEgPSBwYXJzZUludChhcnJbMF0pO1xuICAgICAgICAgICAgICBjb25zdCB5ZWFyMiA9IHBhcnNlSW50KGFyclsxXSk7XG4gICAgICAgICAgICAgIGNvbnN0IHN0ciA9ICh5ZWFyMSArIDU0MykudG9TdHJpbmcoKSArICctJyArICh5ZWFyMiArIDU0MykudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgbGV0IGZpc3J0ID0gY2VsbC5jaGlsZHJlbjtcbiAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IGZpc3J0Lml0ZW0oMCkuY2hpbGRyZW47XG4gICAgICAgICAgICAgIHRhcmdldC5pdGVtKDApLnRleHRDb250ZW50ID0gc3RyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coXCJmbkNoYW5nZUNhbGVuZGFyWWVhciAtPiBlcnJvclwiLCBlcnJvcilcbiAgICB9XG4gIH1cbiAgZm5DaGFuZ2VDYWxlbmRhclllYXJPbmNlKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB5ZWFyUmVnZXggPSAvXlswLTldezR9LVswLTldezR9JC9nO1xuICAgICAgLyoqIOC5gOC4m+C4peC4teC5iOC4ouC4meC4m+C4teC5g+C4meC4quC5iOC4p+C4meC4guC4reC4hyBjZWxsIOC4lOC5ieC4suC4meC5g+C4mSAqL1xuICAgICAgY29uc3QgZHhDYWxlbmRhckNlbGwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZHgtY2FsZW5kYXItY2VsbCcpO1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGR4Q2FsZW5kYXJDZWxsLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBjb25zdCBjZWxsID0gZHhDYWxlbmRhckNlbGxbaW5kZXhdO1xuICAgICAgICBjb25zdCB0ZXh0ID0gY2VsbC5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKTtcbiAgICAgICAgbGV0IG51bSA9IHBhcnNlSW50KHRleHQpO1xuICAgICAgICBpZiAodGV4dC5sZW5ndGggPT09IDQgJiYgbnVtICE9PSBOYU4pIHtcbiAgICAgICAgICBsZXQgbnVtMiA9IG51bSArIDU0MztcbiAgICAgICAgICBjZWxsLnRleHRDb250ZW50ID0gbnVtMi50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvKiog4LmA4Lib4Lil4Li14LmI4Lii4LiZ4Lib4Li14LmD4LiZ4Liq4LmI4Lin4LiZ4LiC4Lit4LiHIG5hdiDguJTguYnguLLguJnguJrguJkgKi9cbiAgICAgIGNvbnN0IGR4Q2FsZW5kYXJUb3AgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZHgtY2FsZW5kYXItY2FwdGlvbi1idXR0b24nKTtcbiAgICAgIGZvciAobGV0IGluZGV4VG9wID0gMDsgaW5kZXhUb3AgPCBkeENhbGVuZGFyVG9wLmxlbmd0aDsgaW5kZXhUb3ArKykge1xuICAgICAgICBjb25zdCBjZWxsID0gZHhDYWxlbmRhclRvcFtpbmRleFRvcF07XG4gICAgICAgIGNvbnN0IHRleHQgPSBjZWxsLmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpO1xuICAgICAgICBsZXQgbnVtID0gcGFyc2VJbnQodGV4dCk7XG4gICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA9PT0gNCAmJiBudW0gIT09IE5hTikge1xuICAgICAgICAgIGxldCBudW0yID0gbnVtICsgNTQzO1xuICAgICAgICAgIGxldCBmaXNydCA9IGNlbGwuY2hpbGRyZW47XG4gICAgICAgICAgbGV0IHRhcmdldCA9IGZpc3J0Lml0ZW0oMCkuY2hpbGRyZW47XG4gICAgICAgICAgdGFyZ2V0Lml0ZW0oMCkudGV4dENvbnRlbnQgPSBudW0yLnRvU3RyaW5nKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGV4dC5tYXRjaCh5ZWFyUmVnZXgpKSB7XG4gICAgICAgICAgY29uc3QgYXJyID0gdGV4dC5zcGxpdCgnLScpO1xuICAgICAgICAgIGNvbnN0IHllYXIxID0gcGFyc2VJbnQoYXJyWzBdKTtcbiAgICAgICAgICBjb25zdCB5ZWFyMiA9IHBhcnNlSW50KGFyclsxXSk7XG4gICAgICAgICAgY29uc3Qgc3RyID0gKHllYXIxICsgNTQzKS50b1N0cmluZygpICsgJy0nICsgKHllYXIyICsgNTQzKS50b1N0cmluZygpO1xuICAgICAgICAgIGxldCBmaXNydCA9IGNlbGwuY2hpbGRyZW47XG4gICAgICAgICAgbGV0IHRhcmdldCA9IGZpc3J0Lml0ZW0oMCkuY2hpbGRyZW47XG4gICAgICAgICAgdGFyZ2V0Lml0ZW0oMCkudGV4dENvbnRlbnQgPSBzdHI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coXCJmbkNoYW5nZUNhbGVuZGFyWWVhciAtPiBlcnJvclwiLCBlcnJvcilcbiAgICB9XG4gIH1cblxuICAvLyBnZW4gdXVpZFxuICBmbkdlblV1aWQoKXtcbiAgICByZXR1cm4gVVVJRC5VVUlEKCk7XG4gIH1cblxuICAvKipcbiAgICogZm4g4LmB4Lib4Lil4LiHIGRhdGUg4LiB4LmI4Lit4LiZ4Liq4LmI4LiH4LmE4Lib4LmD4Lir4LmJIEFQSVxuICAgKiBAcGFyYW0gZGF0YUxpc3QgZGF0YSDguJfguLXguYjguJXguYnguK3guIfguIHguLLguKPguIjguLHguJTguIHguLLguKPguKvguKPguLfguK0gbW9kZWwg4LiX4Li14LmI4Lic4Li54LiBXG4gICAqIEBwYXJhbSBmaWVsZExpc3QgbGlzdCDguKPguLLguKLguIrguLfguYjguK0gZmllbGQg4LiX4Li14LmI4LiV4LmJ4Lit4LiH4LiB4Liy4Lij4LmB4Lib4Lil4LiHIGRhdGVcbiAgICovXG4gIGZuRm9ybWF0RGF0ZUxpc3QoZGF0YUxpc3Q6YW55LCBmaWVsZExpc3Q6YW55W10pIHtcbiAgICAgIGNvbnN0IGNsb25lRGF0YUxpc3QgPSBfLmNsb25lRGVlcChkYXRhTGlzdCk7XG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZmllbGRMaXN0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgIGNvbnN0IGZpZWxkID0gZmllbGRMaXN0W2luZGV4XTtcbiAgICAgICAgICBpZiAoY2xvbmVEYXRhTGlzdFtmaWVsZF0pIHtcbiAgICAgICAgICAgICAgY2xvbmVEYXRhTGlzdFtmaWVsZF0gPSBtb21lbnQoY2xvbmVEYXRhTGlzdFtmaWVsZF0pLmZvcm1hdCh0aGlzLkRBVEVfRk9STUFUKTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xvbmVEYXRhTGlzdDtcbiAgfVxuICAvKipcbiAgICAgKiBmbi4g4LmB4Lib4Lil4LiHIHN0cmluZyBkYXRlIOC4iOC4suC4gSBkYiDguYDguJvguYfguJkg4Lin4Lix4LiZIOC5gOC4p+C4peC4siDguJvguKPguLDguYDguJfguKjguYTguJfguKJcbiAgICAgKiBAcGFyYW0gdmFsdWUgU3RyaW5nIGRhdGUg4LiX4Li14LmI4LiV4LmJ4Lit4LiH4LiB4Liy4Lij4LmB4Lib4Lil4LiHXG4gICAgICovXG4gIGZuRGlzcGxheUZvcm1hdERhdGUodmFsdWUpIHtcbiAgICAgIGxldCBkYXRlU3RyaW5nID0gZm9ybWF0RGF0ZSh2YWx1ZSwgXCJzaG9ydERhdGVcIik7XG4gICAgICBsZXQgdGltZVN0cmluZyA9IGZvcm1hdERhdGUodmFsdWUsIFwiSEg6bW06c3NcIik7XG4gICAgICByZXR1cm4gZGF0ZVN0cmluZyArICcgJyArIHRpbWVTdHJpbmdcbiAgfVxuXG4gIHJlcGxhY2VyKGtleSwgdmFsdWUpIHtcbiAgICAgIC8vIEZpbHRlcmluZyBvdXQgcHJvcGVydGllc1xuICAgICAgLy8gY29uc29sZS5sb2coXCJrZXlcIixrZXkpO1xuICAgICAgLy8gY29uc29sZS5sb2coXCJ2YWx1ZVwiLHZhbHVlKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwidHlwZVwiLHR5cGVvZiB2YWx1ZSk7XG5cbiAgICAgIC8vIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICAvLyBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIC8vICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgLy8gICAgICAgICByZXR1cm4gdmFsdWUudHJpbSgpO1xuICAgICAgLy8gICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgLy8gICAgICAgICByZXR1cm4gbW9tZW50KHZhbHVlKS5mb3JtYXQoJ1lZWVktTU0tZGQgSEg6bW06c3MnKTtcbiAgICAgIC8vICAgICBkZWZhdWx0OlxuICAgICAgLy8gfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBpZigvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9LlxcZHszfVokLy50ZXN0KHZhbHVlKSl7XG4gICAgICAgICAgICByZXR1cm4gbW9tZW50KHZhbHVlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3MnKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUudHJpbSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmVwbGFjZXJub3RyaW0oa2V5LCB2YWx1ZSkge1xuICAgIC8vIEZpbHRlcmluZyBvdXQgcHJvcGVydGllc1xuICAgIC8vIGNvbnNvbGUubG9nKFwia2V5XCIsa2V5KTtcbiAgICAvLyBjb25zb2xlLmxvZyhcInZhbHVlXCIsdmFsdWUpO1xuICAgIC8vIGNvbnNvbGUubG9nKFwidHlwZVwiLHR5cGVvZiB2YWx1ZSk7XG5cbiAgICAvLyBjb25zdCB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgIC8vIHN3aXRjaCAodHlwZSkge1xuICAgIC8vICAgICBjYXNlICdzdHJpbmcnOlxuICAgIC8vICAgICAgICAgcmV0dXJuIHZhbHVlLnRyaW0oKTtcbiAgICAvLyAgICAgY2FzZSAnRGF0ZSc6XG4gICAgLy8gICAgICAgICByZXR1cm4gbW9tZW50KHZhbHVlKS5mb3JtYXQoJ1lZWVktTU0tZGQgSEg6bW06c3MnKTtcbiAgICAvLyAgICAgZGVmYXVsdDpcbiAgICAvLyB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaWYoL15cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfS5cXGR7M31aJC8udGVzdCh2YWx1ZSkpe1xuICAgICAgICAgIHJldHVybiBtb21lbnQodmFsdWUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbTpzcycpO1xuICAgICAgfWVsc2V7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG4gIGNvbnZlcnRUSFNob3J0RGF0ZShkYXRlKSB7XG4gICAgICBkYXRlID0gbW9tZW50KGRhdGUpO1xuICAgICAgbGV0IGlNb250aCA9IHBhcnNlSW50KG1vbWVudChkYXRlKS5mb3JtYXQoJ01NJykpLCBpWWVhciA9IG1vbWVudChkYXRlKS5mb3JtYXQoJ1lZWVknKTtcbiAgICAgIGlZZWFyID0gaVllYXIuc3Vic3RyKDIsIDQpO1xuICAgICAgbGV0IHRoU2hvcnRNb250aCA9IFsnJywgJ+C4oS7guIQuJywgJ+C4gS7guJ4uJywgJ+C4oeC4tS7guIQuJywgJ+C5gOC4oS7guKIuJywgJ+C4ni7guIQuJywgJ+C4oeC4tC7guKIuJywgJ+C4gS7guIQuJywgJ+C4qi7guIQuJywgJ+C4gS7guKIuJywgJ+C4lS7guIQuJywgJ+C4ni7guKIuJywgJ+C4mC7guIQuJ107XG4gICAgICByZXR1cm4gdGhpcy5OdW1iZXJUb1RoYWlOdW1iZXIoZGF0ZS5mb3JtYXQoJ0REJykpICsgJyAnICsgdGhTaG9ydE1vbnRoW2lNb250aF0gKyAnICcgKyB0aGlzLk51bWJlclRvVGhhaU51bWJlcihpWWVhcikgO1xuICB9O1xuXG4gIE51bWJlclRvVGhhaU51bWJlcihOdW1iZXIpIHtcbiAgICAgIE51bWJlciA9IE51bWJlci50b1N0cmluZygpO1xuICAgICAgTnVtYmVyID0gTnVtYmVyLnJlcGxhY2UoLzAvZ2ksICfguZAnKTtcbiAgICAgIE51bWJlciA9IE51bWJlci5yZXBsYWNlKC8xL2dpLCAn4LmRJyk7XG4gICAgICBOdW1iZXIgPSBOdW1iZXIucmVwbGFjZSgvMi9naSwgJ+C5kicpO1xuICAgICAgTnVtYmVyID0gTnVtYmVyLnJlcGxhY2UoLzMvZ2ksICfguZMnKTtcbiAgICAgIE51bWJlciA9IE51bWJlci5yZXBsYWNlKC80L2dpLCAn4LmUJyk7XG4gICAgICBOdW1iZXIgPSBOdW1iZXIucmVwbGFjZSgvNS9naSwgJ+C5lScpO1xuICAgICAgTnVtYmVyID0gTnVtYmVyLnJlcGxhY2UoLzYvZ2ksICfguZYnKTtcbiAgICAgIE51bWJlciA9IE51bWJlci5yZXBsYWNlKC83L2dpLCAn4LmXJyk7XG4gICAgICBOdW1iZXIgPSBOdW1iZXIucmVwbGFjZSgvOC9naSwgJ+C5mCcpO1xuICAgICAgTnVtYmVyID0gTnVtYmVyLnJlcGxhY2UoLzkvZ2ksICfguZknKTtcbiAgICAgIHJldHVybiBOdW1iZXI7XG4gIH1cblxuICBmbkdldE1vbnRoVEgobW9udGgsIHNob3J0KSB7XG4gICAgICBtb250aCA9IG1vbnRoIC0gMTtcbiAgICAgIGxldCB0aE1vbnRoID0gW1wi4Lih4LiB4Lij4Liy4LiE4LihXCIsIFwi4LiB4Li44Lih4Lig4Liy4Lie4Lix4LiZ4LiY4LmMXCIsIFwi4Lih4Li14LiZ4Liy4LiE4LihXCIsXG4gICAgICAgICAgXCLguYDguKHguKnguLLguKLguJlcIiwgXCLguJ7guKTguKnguKDguLLguITguKFcIiwgXCLguKHguLTguJbguLjguJnguLLguKLguJlcIiwgXCLguIHguKPguIHguI7guLLguITguKFcIiwgXCLguKrguLTguIfguKvguLLguITguKFcIiwgXCLguIHguLHguJnguKLguLLguKLguJlcIixcbiAgICAgICAgICBcIuC4leC4uOC4peC4suC4hOC4oVwiLCBcIuC4nuC4pOC4qOC4iOC4tOC4geC4suC4ouC4mVwiLCBcIuC4mOC4seC4meC4p+C4suC4hOC4oVwiXTtcbiAgICAgIGxldCB0aFNob3J0TW9udGggPSBbXCLguKEu4LiELlwiLCBcIuC4gS7guJ4uXCIsIFwi4Lih4Li1LuC4hC5cIiwgXCLguYDguKEu4LiiLlwiLCBcIuC4ni7guIQuXCIsIFwi4Lih4Li0LuC4oi5cIiwgXCLguIEu4LiELlwiLCBcIuC4qi7guIQuXCIsIFwi4LiBLuC4oi5cIiwgXCLguJUu4LiELlwiLCBcIuC4ni7guKIuXCIsIFwi4LiYLuC4hC5cIl07XG4gICAgICByZXR1cm4gc2hvcnQgPT09IHRydWUgPyB0aFNob3J0TW9udGhbbW9udGhdIDogdGhNb250aFttb250aF07XG4gIH07XG5cbiAgY29udmVydFRIRGF0ZShkYXRlLCBmb3JtYXQsdHlwZVRIKSB7XG4gICAgICBtb21lbnQubG9jYWxlKCd0aCcpO1xuICAgICAgY29uc29sZS5sb2cobW9tZW50KGRhdGUpLmFkZCg1NDMsXCJ5ZWFyc1wiKS5mb3JtYXQoXCJERCBNTU1NIFlZWVlcIikpO1xuICAgICAgaWYodHlwZVRIKXtcbiAgICAgICAgICByZXR1cm4gdGhpcy5OdW1iZXJUb1RoYWlOdW1iZXIobW9tZW50KGRhdGUpLmFkZCg1NDMsXCJ5ZWFyc1wiKS5mb3JtYXQoZm9ybWF0KSk7XG4gICAgICB9ZWxzZXtcbiAgICAgICAgICByZXR1cm4gbW9tZW50KGRhdGUpLmFkZCg1NDMsXCJ5ZWFyc1wiKS5mb3JtYXQoZm9ybWF0KTtcbiAgICAgIH1cbiAgfTtcbn1cbiJdfQ==