/** * @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