b2b.service.js 33.1 KB
/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
import * as tslib_1 from "tslib";
import { Injectable } from '@angular/core';
import { Headers, Http, RequestOptions } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import { of } from 'rxjs';
import { AppConfigService } from '../app-config/app-config.service';
import * as _ from 'lodash';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import 'rxjs/add/operator/map';
var B2bService = /** @class */ (function () {
    function B2bService(http, appConfigService) {
        this.http = http;
        this.appConfigService = appConfigService;
        this.verifyTokenUrl = '';
        this.downloadTokenUrl = '';
        this._verifyToken = new BehaviorSubject({});
        this.verifyToken = {
            'username': '$username',
            'sessionId': '$sessionId',
            'groupIntegrationNames': ['groupName1', 'groupName2', 'groupName3'],
            'menus': ['menu1', 'menu2'],
            'menuPermissions': [
                { 'menuName': 'menu1', 'permissions': ['add', 'edit', 'delete'] },
                { 'menuName': 'menu2', 'permissions': ['view', 'add', 'edit'] }
            ],
            'attachmentToken': {
                'token': 'DOWNLOADS_AEB496F6DED34FFF93F668412E3CDD38',
                'expire': '2018-09-21 09:00:00'
            }
        };
        this.config = appConfigService.getConfig();
        // console.log('b2b config',this.config);
        this.verifyTokenUrl = _.get(this.config, 'apiServers.portal-backend.verifyToken');
        this.downloadTokenUrl = _.get(this.config, 'apiServers.portal-backend.downloadToken');
    }
    /**
     * @return {?}
     */
    B2bService.prototype.verify = /**
     * @return {?}
     */
    function () {
        var _this = this;
        /** @type {?} */
        var body = {
            'microIntegrationName': _.get(this.config, 'microIntegrationName')
        };
        return this.http.post(this.verifyTokenUrl, body, this.jwt()).map(function (res) {
            // console.log(res.json());
            // console.log(res);
            res = res.json();
            if (+res['resultCode'] === 20000) {
                _this.verifyToken = res['resultData'];
                _this._verifyToken.next(res['resultData']);
            }
            // else if(+res['resultCode'] === 40100){
            //   let __resultData = res['resultData'];
            //   this.checkSession(__resultData.userMessage);
            // }
            // console.log(this.verifyToken);
            return res;
        }).catch(function (error) { return Observable.throw(error.json().error || 'Server error'); }).toPromise();
    };
    /**
     * @return {?}
     */
    B2bService.prototype.subscribeVerifyToken = /**
     * @return {?}
     */
    function () {
        return this._verifyToken.asObservable();
    };
    /**
     * @return {?}
     */
    B2bService.prototype.getVerifyToken = /**
     * @return {?}
     */
    function () {
        return this._verifyToken.getValue();
    };
    /**
     * @param {?} userMessage
     * @return {?}
     */
    B2bService.prototype.checkSession = /**
     * @param {?} userMessage
     * @return {?}
     */
    function (userMessage) {
        console.log('checkSession');
        /** @type {?} */
        var token = sessionStorage.getItem('token');
        window.parent.postMessage(JSON.stringify({
            command: "checkSession",
            message: token,
            userMessage: userMessage || 'Unknow'
        }), '*');
        console.log('checkSession', JSON.stringify({
            command: "checkSession",
            message: token,
            userMessage: userMessage || 'Unknow'
        }));
    };
    /** รับค่า role ที่มีสิทธิ์ */
    // isCheckGroup(rolePermission) {
    //     console.log("rolePermission",rolePermission);
    //     /** mockup response*/
    //     let verify = [];
    //     this.verifyToken.menuPermissions.forEach(menuPermissions => {
    //         if (menuPermissions.menuName === rolePermission.role) {
    //             verify = menuPermissions.permissions;
    //         }
    //     });
    //     console.log("verify",verify);
    //     const checkArrary = _.intersection(verify, rolePermission.component);
    //     console.log("checkArrary",checkArrary);
    //     if (checkArrary.length !== 0) {
    //         return true;
    //     } else {
    //         return false;
    //     }
    // }
    /**
     * รับค่า role ที่มีสิทธิ์
     * @param {?} route
     * @return {?}
     */
    B2bService.prototype.isCheckGroup = /**
     * รับค่า role ที่มีสิทธิ์
     * @param {?} route
     * @return {?}
     */
    function (route) {
        var e_1, _a;
        /** @type {?} */
        var verify = [];
        try {
            for (var _b = tslib_1.__values(this.verifyToken.menuPermissions), _c = _b.next(); !_c.done; _c = _b.next()) {
                var menuPermissions = _c.value;
                /** @type {?} */
                var url = menuPermissions.url || "";
                /** @type {?} */
                var splitPath = url.split('?');
                splitPath = splitPath.length > 0 ? splitPath[0].split('/') : [];
                /** @type {?} */
                var path = void 0; // ดึง path สุดท้าย
                for (var i = 0; i <= splitPath.length; i++) {
                    // console.log('isCheckGroup splitPath[i]', splitPath[i]);
                    if (splitPath[i] === '#') {
                        path = splitPath[i + 1]; // ดึง path หลัง #
                        break;
                    }
                }
                // console.log("isCheckGroup path", path);
                if (path === route.route) {
                    verify = menuPermissions.permissions;
                }
            }
        }
        catch (e_1_1) { e_1 = { error: e_1_1 }; }
        finally {
            try {
                if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
            }
            finally { if (e_1) throw e_1.error; }
        }
        /** @type {?} */
        var checkArrary = _.intersection(verify, route.component);
        // console.log("isCheckGroup checkArrary", checkArrary);
        if (checkArrary.length !== 0) {
            return true;
        }
        else {
            return false;
        }
    };
    /** รับค่า guard ที่มีสิทธิ์ */
    /**
     * รับค่า guard ที่มีสิทธิ์
     * @param {?} role
     * @return {?}
     */
    B2bService.prototype.isCheckGuard = /**
     * รับค่า guard ที่มีสิทธิ์
     * @param {?} role
     * @return {?}
     */
    function (role) {
        /** *
         * mockup response
          @type {?} */
        var checkArrary = _.intersection(this.verifyToken.menus, [role]);
        // console.log("checkArrary",checkArrary);
        if (checkArrary.length !== 0) {
            return true;
        }
        else {
            return false;
        }
    };
    /**
     * @return {?}
     */
    B2bService.prototype.verifyDemo = /**
     * @return {?}
     */
    function () {
        /** @type {?} */
        var token = sessionStorage.getItem('token');
        // console.log('token', token);
        if (token && token === 'demo') {
            return of({
                'resultCode': '20000',
                'resultDescription': 'Success',
                'resultData': {
                    'b2bToken': '$b2bToken'
                }
            }).toPromise();
        }
        return of({
            'resultCode': '40000',
            'resultDescription': '',
        }).toPromise();
    };
    /**
     * @return {?}
     */
    B2bService.prototype.jwt = /**
     * @return {?}
     */
    function () {
        /** @type {?} */
        var token = sessionStorage.getItem('token');
        if (token) {
            /** @type {?} */
            var headers = new Headers({ 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json', 'x-token': '1' });
            return new RequestOptions({ headers: headers });
        }
    };
    /**
     * @return {?}
     */
    B2bService.prototype.getAttachmentToken = /**
     * @return {?}
     */
    function () {
        return tslib_1.__awaiter(this, void 0, void 0, function () {
            var now, expireDate, checkDateValid, response, e_2;
            return tslib_1.__generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        now = new Date();
                        expireDate = new Date(this.verifyToken.attachmentToken.expire);
                        checkDateValid = now <= expireDate;
                        if (!checkDateValid) return [3 /*break*/, 1];
                        return [2 /*return*/, this.verifyToken.attachmentToken.token];
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        return [4 /*yield*/, this.http.post(this.downloadTokenUrl, {}, this.jwt()).map(function (res) {
                                return res.json();
                            }).catch(function (error) { return Observable.throw(error.json().error || 'Server error'); }).toPromise()];
                    case 2:
                        response = _a.sent();
                        // console.log('response ',response);
                        if (+response['resultCode'] === 20000) {
                            this.verifyToken.attachmentToken = response['resultData'];
                            return [2 /*return*/, response['resultData'].token];
                        }
                        // else if(+response['resultCode'] === 40100){
                        //   let __resultData = response['resultData'];
                        //   this.checkSession(__resultData.userMessage);
                        //   return '';
                        // }
                        else {
                            return [2 /*return*/, ''];
                        }
                        return [3 /*break*/, 4];
                    case 3:
                        e_2 = _a.sent();
                        console.log('error ', e_2);
                        return [2 /*return*/, ''];
                    case 4: return [2 /*return*/];
                }
            });
        });
    };
    /** รับค่า guard ที่มีสิทธิ์ */
    /**
     * รับค่า guard ที่มีสิทธิ์
     * @param {?} route
     * @return {?}
     */
    B2bService.prototype.isCheckGuardRoutePath = /**
     * รับค่า guard ที่มีสิทธิ์
     * @param {?} route
     * @return {?}
     */
    function (route) {
        var e_3, _a;
        try {
            // console.log("route",route);
            // console.log("this.verifyToken",this.verifyToken);
            for (var _b = tslib_1.__values(this.verifyToken.menuPermissions), _c = _b.next(); !_c.done; _c = _b.next()) {
                var menuPermissions = _c.value;
                /** @type {?} */
                var url = menuPermissions.url || "";
                /** @type {?} */
                var splitPath = url.split('?');
                splitPath = splitPath.length > 0 ? splitPath[0].split('/') : [];
                /** @type {?} */
                var path = void 0; // ดึง path สุดท้าย
                for (var i = 0; i <= splitPath.length; i++) {
                    // console.log('splitPath[i]', splitPath[i]);
                    if (splitPath[i] === '#') {
                        path = splitPath[i + 1]; // ดึง path หลัง #
                        break;
                    }
                }
                // console.log("path",path);
                if (path === route) {
                    return true;
                }
            }
        }
        catch (e_3_1) { e_3 = { error: e_3_1 }; }
        finally {
            try {
                if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
            }
            finally { if (e_3) throw e_3.error; }
        }
        return false;
    };
    B2bService.decorators = [
        { type: Injectable }
    ];
    /** @nocollapse */
    B2bService.ctorParameters = function () { return [
        { type: Http },
        { type: AppConfigService }
    ]; };
    return B2bService;
}());
export { B2bService };
if (false) {
    /** @type {?} */
    B2bService.prototype.verifyTokenUrl;
    /** @type {?} */
    B2bService.prototype.downloadTokenUrl;
    /** @type {?} */
    B2bService.prototype._verifyToken;
    /** @type {?} */
    B2bService.prototype.config;
    /** @type {?} */
    B2bService.prototype.verifyToken;
    /** @type {?} */
    B2bService.prototype.http;
    /** @type {?} */
    B2bService.prototype.appConfigService;
}

//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYjJiLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9zb2MtYXBwLWxpYnJhcnkvIiwic291cmNlcyI6WyJsaWIvX3NlcnZpY2VzL2IyYi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQVksTUFBTSxlQUFlLENBQUM7QUFDeEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDcEUsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sdUJBQXVCLENBQUM7O0lBc0IzQixvQkFBb0IsSUFBVSxFQUNWO1FBREEsU0FBSSxHQUFKLElBQUksQ0FBTTtRQUNWLHFCQUFnQixHQUFoQixnQkFBZ0I7OEJBbkJuQixFQUFFO2dDQUNBLEVBQUU7NEJBQ0QsSUFBSSxlQUFlLENBQUMsRUFBRSxDQUFDOzJCQUV4QjtZQUNmLFVBQVUsRUFBRSxXQUFXO1lBQ3ZCLFdBQVcsRUFBRSxZQUFZO1lBQ3pCLHVCQUF1QixFQUFFLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxZQUFZLENBQUM7WUFDbkUsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQztZQUMzQixpQkFBaUIsRUFBRTtnQkFDZixFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsRUFBRTtnQkFDakUsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDLE1BQU0s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b3JlJztcbmltcG9ydCB7IEhlYWRlcnMsIEh0dHAsIFJlcXVlc3RPcHRpb25zLCBSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMvT2JzZXJ2YWJsZSc7XG5pbXBvcnQgeyBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQXBwQ29uZmlnU2VydmljZSB9IGZyb20gJy4uL2FwcC1jb25maWcvYXBwLWNvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMvQmVoYXZpb3JTdWJqZWN0JztcbmltcG9ydCAncnhqcy9hZGQvb3BlcmF0b3IvbWFwJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEIyYlNlcnZpY2Uge1xuICAgIHZlcmlmeVRva2VuVXJsID0gJyc7XG4gICAgZG93bmxvYWRUb2tlblVybCA9ICcnO1xuICAgIF92ZXJpZnlUb2tlbjogYW55ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh7fSk7XG4gICAgY29uZmlnOiBhbnk7XG4gICAgdmVyaWZ5VG9rZW46IGFueSA9IHtcbiAgICAgICAgJ3VzZXJuYW1lJzogJyR1c2VybmFtZScsXG4gICAgICAgICdzZXNzaW9uSWQnOiAnJHNlc3Npb25JZCcsXG4gICAgICAgICdncm91cEludGVncmF0aW9uTmFtZXMnOiBbJ2dyb3VwTmFtZTEnLCAnZ3JvdXBOYW1lMicsICdncm91cE5hbWUzJ10sXG4gICAgICAgICdtZW51cyc6IFsnbWVudTEnLCAnbWVudTInXSxcbiAgICAgICAgJ21lbnVQZXJtaXNzaW9ucyc6IFtcbiAgICAgICAgICAgIHsgJ21lbnVOYW1lJzogJ21lbnUxJywgJ3Blcm1pc3Npb25zJzogWydhZGQnLCAnZWRpdCcsICdkZWxldGUnXSB9LFxuICAgICAgICAgICAgeyAnbWVudU5hbWUnOiAnbWVudTInLCAncGVybWlzc2lvbnMnOiBbJ3ZpZXcnLCAnYWRkJywgJ2VkaXQnXSB9XG4gICAgICAgIF0sXG4gICAgICAgICdhdHRhY2htZW50VG9rZW4nOiB7XG4gICAgICAgICAgICAndG9rZW4nOiAnRE9XTkxPQURTX0FFQjQ5NkY2REVEMzRGRkY5M0Y2Njg0MTJFM0NERDM4JyxcbiAgICAgICAgICAgICdleHBpcmUnOiAnMjAxOC0wOS0yMSAwOTowMDowMCdcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgYXBwQ29uZmlnU2VydmljZTogQXBwQ29uZmlnU2VydmljZSxcbiAgICApIHtcbiAgICAgICAgdGhpcy5jb25maWcgPSBhcHBDb25maWdTZXJ2aWNlLmdldENvbmZpZygpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnYjJiIGNvbmZpZycsdGhpcy5jb25maWcpO1xuICAgICAgICB0aGlzLnZlcmlmeVRva2VuVXJsID0gXy5nZXQodGhpcy5jb25maWcsICdhcGlTZXJ2ZXJzLnBvcnRhbC1iYWNrZW5kLnZlcmlmeVRva2VuJyk7XG4gICAgICAgIHRoaXMuZG93bmxvYWRUb2tlblVybCA9IF8uZ2V0KHRoaXMuY29uZmlnLCAnYXBpU2VydmVycy5wb3J0YWwtYmFja2VuZC5kb3dubG9hZFRva2VuJyk7XG4gICAgfVxuICAgIHZlcmlmeSgpIHtcbiAgICAgICAgLy8gcmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5jb25maWcuYXBpVmVyaWZ5VG9rZW4gKyB0aGlzLnVybCwgdGhpcy5qd3QoKSkudG9Qcm9taXNlKCk7XG4gICAgICAgIGNvbnN0IGJvZHkgPSB7XG4gICAgICAgICAgICAnbWljcm9JbnRlZ3JhdGlvbk5hbWUnOiBfLmdldCh0aGlzLmNvbmZpZywgJ21pY3JvSW50ZWdyYXRpb25OYW1lJylcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KHRoaXMudmVyaWZ5VG9rZW5VcmwsIGJvZHksIHRoaXMuand0KCkpLm1hcCgocmVzOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocmVzLmpzb24oKSk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhyZXMpO1xuICAgICAgICAgICAgcmVzID0gcmVzLmpzb24oKTtcbiAgICAgICAgICAgIGlmICgrcmVzWydyZXN1bHRDb2RlJ10gPT09IDIwMDAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52ZXJpZnlUb2tlbiA9IHJlc1sncmVzdWx0RGF0YSddO1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZlcmlmeVRva2VuLm5leHQocmVzWydyZXN1bHREYXRhJ10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZWxzZSBpZigrcmVzWydyZXN1bHRDb2RlJ10gPT09IDQwMTAwKXtcbiAgICAgICAgICAgIC8vICAgbGV0IF9fcmVzdWx0RGF0YSA9IHJlc1sncmVzdWx0RGF0YSddO1xuICAgICAgICAgICAgLy8gICB0aGlzLmNoZWNrU2Vzc2lvbihfX3Jlc3VsdERhdGEudXNlck1lc3NhZ2UpO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy52ZXJpZnlUb2tlbik7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9KS5jYXRjaCgoZXJyb3I6IGFueSkgPT4gT2JzZXJ2YWJsZS50aHJvdyhlcnJvci5qc29uKCkuZXJyb3IgfHwgJ1NlcnZlciBlcnJvcicpKS50b1Byb21pc2UoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3Vic2NyaWJlVmVyaWZ5VG9rZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92ZXJpZnlUb2tlbi5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cblxuICAgIHB1YmxpYyBnZXRWZXJpZnlUb2tlbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcmlmeVRva2VuLmdldFZhbHVlKCk7XG4gICAgfVxuXG5cbiAgICBjaGVja1Nlc3Npb24odXNlck1lc3NhZ2Upe1xuICAgICAgY29uc29sZS5sb2coJ2NoZWNrU2Vzc2lvbicpO1xuICAgICAgY29uc3QgdG9rZW4gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCd0b2tlbicpO1xuICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgY29tbWFuZDpcImNoZWNrU2Vzc2lvblwiLFxuICAgICAgICAgIG1lc3NhZ2U6IHRva2VuLFxuICAgICAgICAgIHVzZXJNZXNzYWdlOiB1c2VyTWVzc2FnZSB8fCAnVW5rbm93J1xuICAgICAgfSksICcqJyk7XG4gICAgICBjb25zb2xlLmxvZygnY2hlY2tTZXNzaW9uJyxKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgY29tbWFuZDpcImNoZWNrU2Vzc2lvblwiLFxuICAgICAgICAgIG1lc3NhZ2U6IHRva2VuLFxuICAgICAgICAgIHVzZXJNZXNzYWdlOiB1c2VyTWVzc2FnZSB8fCAnVW5rbm93J1xuICAgICAgfSkpO1xuICAgIH1cblxuXG4gICAgLyoqIOC4o+C4seC4muC4hOC5iOC4siByb2xlIOC4l+C4teC5iOC4oeC4teC4quC4tOC4l+C4mOC4tOC5jCAqL1xuICAgIC8vIGlzQ2hlY2tHcm91cChyb2xlUGVybWlzc2lvbikge1xuICAgIC8vICAgICBjb25zb2xlLmxvZyhcInJvbGVQZXJtaXNzaW9uXCIscm9sZVBlcm1pc3Npb24pO1xuICAgIC8vICAgICAvKiogbW9ja3VwIHJlc3BvbnNlKi9cbiAgICAvLyAgICAgbGV0IHZlcmlmeSA9IFtdO1xuICAgIC8vICAgICB0aGlzLnZlcmlmeVRva2VuLm1lbnVQZXJtaXNzaW9ucy5mb3JFYWNoKG1lbnVQZXJtaXNzaW9ucyA9PiB7XG4gICAgLy8gICAgICAgICBpZiAobWVudVBlcm1pc3Npb25zLm1lbnVOYW1lID09PSByb2xlUGVybWlzc2lvbi5yb2xlKSB7XG4gICAgLy8gICAgICAgICAgICAgdmVyaWZ5ID0gbWVudVBlcm1pc3Npb25zLnBlcm1pc3Npb25zO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICB9KTtcbiAgICAvLyAgICAgY29uc29sZS5sb2coXCJ2ZXJpZnlcIix2ZXJpZnkpO1xuXG4gICAgLy8gICAgIGNvbnN0IGNoZWNrQXJyYXJ5ID0gXy5pbnRlcnNlY3Rpb24odmVyaWZ5LCByb2xlUGVybWlzc2lvbi5jb21wb25lbnQpO1xuICAgIC8vICAgICBjb25zb2xlLmxvZyhcImNoZWNrQXJyYXJ5XCIsY2hlY2tBcnJhcnkpO1xuICAgIC8vICAgICBpZiAoY2hlY2tBcnJhcnkubGVuZ3RoICE9PSAwKSB7XG4gICAgLy8gICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAvLyAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyAgICAgfVxuICAgIC8vIH1cblxuICAgIGlzQ2hlY2tHcm91cChyb3V0ZSkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImlzQ2hlY2tHcm91cCByb3V0ZVwiLCByb3V0ZSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaXNDaGVja0dyb3VwIHRoaXMudmVyaWZ5VG9rZW5cIiwgdGhpcy52ZXJpZnlUb2tlbik7XG4gICAgICAgIGxldCB2ZXJpZnkgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgbWVudVBlcm1pc3Npb25zIG9mIHRoaXMudmVyaWZ5VG9rZW4ubWVudVBlcm1pc3Npb25zKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImlzQ2hlY2tHcm91cCBtZW51UGVybWlzc2lvbnNcIiwgbWVudVBlcm1pc3Npb25zKTtcbiAgICAgICAgICAgIGxldCB1cmwgPSBtZW51UGVybWlzc2lvbnMudXJsIHx8IFwiXCI7XG4gICAgICAgICAgICBsZXQgc3BsaXRQYXRoID0gdXJsLnNwbGl0KCc/Jyk7XG4gICAgICAgICAgICBzcGxpdFBhdGggPSBzcGxpdFBhdGgubGVuZ3RoID4gMCA/IHNwbGl0UGF0aFswXS5zcGxpdCgnLycpIDogW107IC8vIHNwbGl0IHBhdGhcbiAgICAgICAgICAgIGxldCBwYXRoOyAvLyDguJTguLbguIcgcGF0aCDguKrguLjguJTguJfguYnguLLguKJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHNwbGl0UGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdpc0NoZWNrR3JvdXAgc3BsaXRQYXRoW2ldJywgc3BsaXRQYXRoW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAoc3BsaXRQYXRoW2ldID09PSAnIycpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHNwbGl0UGF0aFtpICsgMV07IC8vIOC4lOC4tuC4hyBwYXRoIOC4q+C4peC4seC4hyAjXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaXNDaGVja0dyb3VwIHBhdGhcIiwgcGF0aCk7XG4gICAgICAgICAgICBpZiAocGF0aCA9PT0gcm91dGUucm91dGUpIHtcbiAgICAgICAgICAgICAgICB2ZXJpZnkgPSBtZW51UGVybWlzc2lvbnMucGVybWlzc2lvbnM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJpc0NoZWNrR3JvdXAgdmVyaWZ5XCIsIHZlcmlmeSk7XG5cbiAgICAgICAgY29uc3QgY2hlY2tBcnJhcnkgPSBfLmludGVyc2VjdGlvbih2ZXJpZnksIHJvdXRlLmNvbXBvbmVudCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaXNDaGVja0dyb3VwIGNoZWNrQXJyYXJ5XCIsIGNoZWNrQXJyYXJ5KTtcbiAgICAgICAgaWYgKGNoZWNrQXJyYXJ5Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiog4Lij4Lix4Lia4LiE4LmI4LiyIGd1YXJkIOC4l+C4teC5iOC4oeC4teC4quC4tOC4l+C4mOC4tOC5jCAqL1xuICAgIGlzQ2hlY2tHdWFyZChyb2xlKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicm9sZVwiLHJvbGUpO1xuICAgICAgICAvKiogbW9ja3VwIHJlc3BvbnNlKi9cblxuICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnZlcmlmeVRva2VuLm1lbnVzKTtcbiAgICAgICAgY29uc3QgY2hlY2tBcnJhcnkgPSBfLmludGVyc2VjdGlvbih0aGlzLnZlcmlmeVRva2VuLm1lbnVzLCBbcm9sZV0pO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImNoZWNrQXJyYXJ5XCIsY2hlY2tBcnJhcnkpO1xuICAgICAgICBpZiAoY2hlY2tBcnJhcnkubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZlcmlmeURlbW8oKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgndG9rZW4nKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ3Rva2VuJywgdG9rZW4pO1xuICAgICAgICBpZiAodG9rZW4gJiYgdG9rZW4gPT09ICdkZW1vJykge1xuICAgICAgICAgICAgcmV0dXJuIG9mKHtcbiAgICAgICAgICAgICAgICAncmVzdWx0Q29kZSc6ICcyMDAwMCcsXG4gICAgICAgICAgICAgICAgJ3Jlc3VsdERlc2NyaXB0aW9uJzogJ1N1Y2Nlc3MnLFxuICAgICAgICAgICAgICAgICdyZXN1bHREYXRhJzoge1xuICAgICAgICAgICAgICAgICAgICAnYjJiVG9rZW4nOiAnJGIyYlRva2VuJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLnRvUHJvbWlzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvZih7XG4gICAgICAgICAgICAncmVzdWx0Q29kZSc6ICc0MDAwMCcsXG4gICAgICAgICAgICAncmVzdWx0RGVzY3JpcHRpb24nOiAnJyxcbiAgICAgICAgfSkudG9Qcm9taXNlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBqd3QoKSB7XG4gICAgICAgIC8vIGNyZWF0ZSBhdXRob3JpemF0aW9uIGhlYWRlciB3aXRoIGp3dCB0b2tlblxuICAgICAgICBjb25zdCB0b2tlbiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ3Rva2VuJyk7XG5cbiAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoeyAnQXV0aG9yaXphdGlvbic6ICdCZWFyZXIgJyArIHRva2VuICwgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ3gtdG9rZW4nOiAnMScgfSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlcXVlc3RPcHRpb25zKHsgaGVhZGVyczogaGVhZGVycyB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGdldEF0dGFjaG1lbnRUb2tlbigpe1xuXG4gICAgICAgIGxldCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBsZXQgZXhwaXJlRGF0ZSA9IG5ldyBEYXRlKHRoaXMudmVyaWZ5VG9rZW4uYXR0YWNobWVudFRva2VuLmV4cGlyZSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwibm93XCIsbm93KTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJleHBpcmVEYXRlXCIsZXhwaXJlRGF0ZSk7XG4gICAgICAgIGxldCBjaGVja0RhdGVWYWxpZCA9IG5vdyA8PSBleHBpcmVEYXRlO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImNoZWNrRGF0ZVZhbGlkXCIsY2hlY2tEYXRlVmFsaWQpO1xuICAgICAgICBpZihjaGVja0RhdGVWYWxpZCl7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52ZXJpZnlUb2tlbi5hdHRhY2htZW50VG9rZW4udG9rZW47XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdHJ5e1xuICAgICAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHRoaXMuaHR0cC5wb3N0KHRoaXMuZG93bmxvYWRUb2tlblVybCwge30sIHRoaXMuand0KCkpLm1hcCgocmVzOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3I6IGFueSkgPT4gT2JzZXJ2YWJsZS50aHJvdyhlcnJvci5qc29uKCkuZXJyb3IgfHwgJ1NlcnZlciBlcnJvcicpKS50b1Byb21pc2UoKTtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygncmVzcG9uc2UgJyxyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgaWYgKCtyZXNwb25zZVsncmVzdWx0Q29kZSddID09PSAyMDAwMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZlcmlmeVRva2VuLmF0dGFjaG1lbnRUb2tlbiA9IHJlc3BvbnNlWydyZXN1bHREYXRhJ107XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZVsncmVzdWx0RGF0YSddLnRva2VuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlbHNlIGlmKCtyZXNwb25zZVsncmVzdWx0Q29kZSddID09PSA0MDEwMCl7XG4gICAgICAgICAgICAgICAgLy8gICBsZXQgX19yZXN1bHREYXRhID0gcmVzcG9uc2VbJ3Jlc3VsdERhdGEnXTtcbiAgICAgICAgICAgICAgICAvLyAgIHRoaXMuY2hlY2tTZXNzaW9uKF9fcmVzdWx0RGF0YS51c2VyTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgLy8gICByZXR1cm4gJyc7XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9Y2F0Y2ggKGUpe1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciAnLGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiog4Lij4Lix4Lia4LiE4LmI4LiyIGd1YXJkIOC4l+C4teC5iOC4oeC4teC4quC4tOC4l+C4mOC4tOC5jCAqL1xuICAgIGlzQ2hlY2tHdWFyZFJvdXRlUGF0aChyb3V0ZSkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcInJvdXRlXCIscm91dGUpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcInRoaXMudmVyaWZ5VG9rZW5cIix0aGlzLnZlcmlmeVRva2VuKTtcbiAgICAgICAgZm9yKGxldCBtZW51UGVybWlzc2lvbnMgb2YgdGhpcy52ZXJpZnlUb2tlbi5tZW51UGVybWlzc2lvbnMpe1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJtZW51UGVybWlzc2lvbnNcIixtZW51UGVybWlzc2lvbnMpO1xuICAgICAgICAgICAgbGV0IHVybCA9IG1lbnVQZXJtaXNzaW9ucy51cmwgfHwgXCJcIjtcbiAgICAgICAgICAgIGxldCBzcGxpdFBhdGggPSB1cmwuc3BsaXQoJz8nKTtcbiAgICAgICAgICAgIHNwbGl0UGF0aCA9IHNwbGl0UGF0aC5sZW5ndGggPiAwID8gc3BsaXRQYXRoWzBdLnNwbGl0KCcvJykgOiBbXTsgLy8gc3BsaXQgcGF0aFxuICAgICAgICAgICAgbGV0IHBhdGg7IC8vIOC4lOC4tuC4hyBwYXRoIOC4quC4uOC4lOC4l+C5ieC4suC4olxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gc3BsaXRQYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ3NwbGl0UGF0aFtpXScsIHNwbGl0UGF0aFtpXSk7XG4gICAgICAgICAgICAgICAgaWYgKHNwbGl0UGF0aFtpXSA9PT0gJyMnKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGggPSBzcGxpdFBhdGhbaSsxXTsgLy8g4LiU4Li24LiHIHBhdGgg4Lir4Lil4Lix4LiHICNcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJwYXRoXCIscGF0aCk7XG4gICAgICAgICAgICBpZiAocGF0aCA9PT0gcm91dGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuIl19