b2b.service.js
29.3 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
/**
* @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';
export class B2bService {
/**
* @param {?} http
* @param {?} appConfigService
*/
constructor(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 {?}
*/
verify() {
/** @type {?} */
const body = {
'microIntegrationName': _.get(this.config, 'microIntegrationName')
};
return this.http.post(this.verifyTokenUrl, body, this.jwt()).map((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((error) => Observable.throw(error.json().error || 'Server error')).toPromise();
}
/**
* @return {?}
*/
subscribeVerifyToken() {
return this._verifyToken.asObservable();
}
/**
* @return {?}
*/
getVerifyToken() {
return this._verifyToken.getValue();
}
/**
* @param {?} userMessage
* @return {?}
*/
checkSession(userMessage) {
console.log('checkSession');
/** @type {?} */
const 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 ที่มีสิทธิ์
* @param {?} route
* @return {?}
*/
isCheckGroup(route) {
/** @type {?} */
let verify = [];
for (let menuPermissions of this.verifyToken.menuPermissions) {
/** @type {?} */
let url = menuPermissions.url || "";
/** @type {?} */
let splitPath = url.split('?');
splitPath = splitPath.length > 0 ? splitPath[0].split('/') : [];
/** @type {?} */
let path; // ดึง path สุดท้าย
for (let 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;
}
}
/** @type {?} */
const checkArrary = _.intersection(verify, route.component);
// console.log("isCheckGroup checkArrary", checkArrary);
if (checkArrary.length !== 0) {
return true;
}
else {
return false;
}
}
/**
* รับค่า guard ที่มีสิทธิ์
* @param {?} role
* @return {?}
*/
isCheckGuard(role) {
/** *
* mockup response
@type {?} */
const checkArrary = _.intersection(this.verifyToken.menus, [role]);
// console.log("checkArrary",checkArrary);
if (checkArrary.length !== 0) {
return true;
}
else {
return false;
}
}
/**
* @return {?}
*/
verifyDemo() {
/** @type {?} */
const 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 {?}
*/
jwt() {
/** @type {?} */
const token = sessionStorage.getItem('token');
if (token) {
/** @type {?} */
const headers = new Headers({ 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json', 'x-token': '1' });
return new RequestOptions({ headers: headers });
}
}
/**
* @return {?}
*/
getAttachmentToken() {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
/** @type {?} */
let now = new Date();
/** @type {?} */
let expireDate = new Date(this.verifyToken.attachmentToken.expire);
/** @type {?} */
let checkDateValid = now <= expireDate;
// console.log("checkDateValid",checkDateValid);
if (checkDateValid) {
return this.verifyToken.attachmentToken.token;
}
else {
try {
/** @type {?} */
let response = yield this.http.post(this.downloadTokenUrl, {}, this.jwt()).map((res) => {
return res.json();
}).catch((error) => Observable.throw(error.json().error || 'Server error')).toPromise();
// console.log('response ',response);
if (+response['resultCode'] === 20000) {
this.verifyToken.attachmentToken = response['resultData'];
return response['resultData'].token;
}
// else if(+response['resultCode'] === 40100){
// let __resultData = response['resultData'];
// this.checkSession(__resultData.userMessage);
// return '';
// }
else {
return '';
}
}
catch (e) {
console.log('error ', e);
return '';
}
}
});
}
/**
* รับค่า guard ที่มีสิทธิ์
* @param {?} route
* @return {?}
*/
isCheckGuardRoutePath(route) {
// console.log("route",route);
// console.log("this.verifyToken",this.verifyToken);
for (let menuPermissions of this.verifyToken.menuPermissions) {
/** @type {?} */
let url = menuPermissions.url || "";
/** @type {?} */
let splitPath = url.split('?');
splitPath = splitPath.length > 0 ? splitPath[0].split('/') : [];
/** @type {?} */
let path; // ดึง path สุดท้าย
for (let 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;
}
}
return false;
}
}
B2bService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
B2bService.ctorParameters = () => [
{ type: Http },
{ type: AppConfigService }
];
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYjJiLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9zb2MtYXBwLWxpYnJhcnkvIiwic291cmNlcyI6WyJsaWIvX3NlcnZpY2VzL2IyYi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQVksTUFBTSxlQUFlLENBQUM7QUFDeEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDcEUsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sdUJBQXVCLENBQUM7QUFHL0IsTUFBTTs7Ozs7SUFtQkYsWUFBb0IsSUFBVSxFQUNWO1FBREEsU0FBSSxHQUFKLElBQUksQ0FBTTtRQUNWLHFCQUFnQixHQUFoQixnQkFBZ0I7OEJBbkJuQixFQUFFO2dDQUNBLEVBQUU7NEJBQ0QsSUFBSSxlQUFlLENBQUMsRUFBRSxDQUFDOzJCQUV4QjtZQUNmLFVBQVUsRUFBRSxXQUFXO1lBQ3ZCLFdBQVcsRUFBRSxZQUFZO1lBQ3pCLHVCQUF1QixFQUFFLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxZQUFZLENBQUM7WUFDbkUsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQztZQUMzQixpQkFBaUIsRUFBRTtnQkFDZixFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsRUFBRTtnQkFDakUsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFB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QUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7WUFDaEUsSUFBSSxJQUFJLENBQUM7WUFDVCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs7Z0JBRXhDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtvQkFDdEIsSUFBSSxHQUFHLFNBQVMsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3RCLE1BQU07aUJBQ1Q7YUFDSjs7WUFFRCxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUU7Z0JBQ2hCLE9BQU8sSUFBSSxDQUFDO2FBQ2Y7U0FDSjtRQUNELE9BQU8sS0FBSyxDQUFDO0tBQ2hCOzs7WUF0T0osVUFBVTs7OztZQVJPLElBQUk7WUFHYixnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIZWFkZXJzLCBIdHRwLCBSZXF1ZXN0T3B0aW9ucywgUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9odHRwJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzL09ic2VydmFibGUnO1xuaW1wb3J0IHsgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFwcENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi9hcHAtY29uZmlnL2FwcC1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzL0JlaGF2aW9yU3ViamVjdCc7XG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL21hcCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBCMmJTZXJ2aWNlIHtcbiAgICB2ZXJpZnlUb2tlblVybCA9ICcnO1xuICAgIGRvd25sb2FkVG9rZW5VcmwgPSAnJztcbiAgICBfdmVyaWZ5VG9rZW46IGFueSA9IG5ldyBCZWhhdmlvclN1YmplY3Qoe30pO1xuICAgIGNvbmZpZzogYW55O1xuICAgIHZlcmlmeVRva2VuOiBhbnkgPSB7XG4gICAgICAgICd1c2VybmFtZSc6ICckdXNlcm5hbWUnLFxuICAgICAgICAnc2Vzc2lvbklkJzogJyRzZXNzaW9uSWQnLFxuICAgICAgICAnZ3JvdXBJbnRlZ3JhdGlvbk5hbWVzJzogWydncm91cE5hbWUxJywgJ2dyb3VwTmFtZTInLCAnZ3JvdXBOYW1lMyddLFxuICAgICAgICAnbWVudXMnOiBbJ21lbnUxJywgJ21lbnUyJ10sXG4gICAgICAgICdtZW51UGVybWlzc2lvbnMnOiBbXG4gICAgICAgICAgICB7ICdtZW51TmFtZSc6ICdtZW51MScsICdwZXJtaXNzaW9ucyc6IFsnYWRkJywgJ2VkaXQnLCAnZGVsZXRlJ10gfSxcbiAgICAgICAgICAgIHsgJ21lbnVOYW1lJzogJ21lbnUyJywgJ3Blcm1pc3Npb25zJzogWyd2aWV3JywgJ2FkZCcsICdlZGl0J10gfVxuICAgICAgICBdLFxuICAgICAgICAnYXR0YWNobWVudFRva2VuJzoge1xuICAgICAgICAgICAgJ3Rva2VuJzogJ0RPV05MT0FEU19BRUI0OTZGNkRFRDM0RkZGOTNGNjY4NDEyRTNDREQzOCcsXG4gICAgICAgICAgICAnZXhwaXJlJzogJzIwMTgtMDktMjEgMDk6MDA6MDAnXG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cCxcbiAgICAgICAgICAgICAgICBwcml2YXRlIGFwcENvbmZpZ1NlcnZpY2U6IEFwcENvbmZpZ1NlcnZpY2UsXG4gICAgKSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gYXBwQ29uZmlnU2VydmljZS5nZXRDb25maWcoKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ2IyYiBjb25maWcnLHRoaXMuY29uZmlnKTtcbiAgICAgICAgdGhpcy52ZXJpZnlUb2tlblVybCA9IF8uZ2V0KHRoaXMuY29uZmlnLCAnYXBpU2VydmVycy5wb3J0YWwtYmFja2VuZC52ZXJpZnlUb2tlbicpO1xuICAgICAgICB0aGlzLmRvd25sb2FkVG9rZW5VcmwgPSBfLmdldCh0aGlzLmNvbmZpZywgJ2FwaVNlcnZlcnMucG9ydGFsLWJhY2tlbmQuZG93bmxvYWRUb2tlbicpO1xuICAgIH1cbiAgICB2ZXJpZnkoKSB7XG4gICAgICAgIC8vIHJldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuY29uZmlnLmFwaVZlcmlmeVRva2VuICsgdGhpcy51cmwsIHRoaXMuand0KCkpLnRvUHJvbWlzZSgpO1xuICAgICAgICBjb25zdCBib2R5ID0ge1xuICAgICAgICAgICAgJ21pY3JvSW50ZWdyYXRpb25OYW1lJzogXy5nZXQodGhpcy5jb25maWcsICdtaWNyb0ludGVncmF0aW9uTmFtZScpXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh0aGlzLnZlcmlmeVRva2VuVXJsLCBib2R5LCB0aGlzLmp3dCgpKS5tYXAoKHJlczogUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHJlcy5qc29uKCkpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocmVzKTtcbiAgICAgICAgICAgIHJlcyA9IHJlcy5qc29uKCk7XG4gICAgICAgICAgICBpZiAoK3Jlc1sncmVzdWx0Q29kZSddID09PSAyMDAwMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudmVyaWZ5VG9rZW4gPSByZXNbJ3Jlc3VsdERhdGEnXTtcbiAgICAgICAgICAgICAgICB0aGlzLl92ZXJpZnlUb2tlbi5uZXh0KHJlc1sncmVzdWx0RGF0YSddKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVsc2UgaWYoK3Jlc1sncmVzdWx0Q29kZSddID09PSA0MDEwMCl7XG4gICAgICAgICAgICAvLyAgIGxldCBfX3Jlc3VsdERhdGEgPSByZXNbJ3Jlc3VsdERhdGEnXTtcbiAgICAgICAgICAgIC8vICAgdGhpcy5jaGVja1Nlc3Npb24oX19yZXN1bHREYXRhLnVzZXJNZXNzYWdlKTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMudmVyaWZ5VG9rZW4pO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfSkuY2F0Y2goKGVycm9yOiBhbnkpID0+IE9ic2VydmFibGUudGhyb3coZXJyb3IuanNvbigpLmVycm9yIHx8ICdTZXJ2ZXIgZXJyb3InKSkudG9Qcm9taXNlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN1YnNjcmliZVZlcmlmeVRva2VuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmVyaWZ5VG9rZW4uYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgZ2V0VmVyaWZ5VG9rZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92ZXJpZnlUb2tlbi5nZXRWYWx1ZSgpO1xuICAgIH1cblxuXG4gICAgY2hlY2tTZXNzaW9uKHVzZXJNZXNzYWdlKXtcbiAgICAgIGNvbnNvbGUubG9nKCdjaGVja1Nlc3Npb24nKTtcbiAgICAgIGNvbnN0IHRva2VuID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgndG9rZW4nKTtcbiAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGNvbW1hbmQ6XCJjaGVja1Nlc3Npb25cIixcbiAgICAgICAgICBtZXNzYWdlOiB0b2tlbixcbiAgICAgICAgICB1c2VyTWVzc2FnZTogdXNlck1lc3NhZ2UgfHwgJ1Vua25vdydcbiAgICAgIH0pLCAnKicpO1xuICAgICAgY29uc29sZS5sb2coJ2NoZWNrU2Vzc2lvbicsSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGNvbW1hbmQ6XCJjaGVja1Nlc3Npb25cIixcbiAgICAgICAgICBtZXNzYWdlOiB0b2tlbixcbiAgICAgICAgICB1c2VyTWVzc2FnZTogdXNlck1lc3NhZ2UgfHwgJ1Vua25vdydcbiAgICAgIH0pKTtcbiAgICB9XG5cblxuICAgIC8qKiDguKPguLHguJrguITguYjguLIgcm9sZSDguJfguLXguYjguKHguLXguKrguLTguJfguJjguLTguYwgKi9cbiAgICAvLyBpc0NoZWNrR3JvdXAocm9sZVBlcm1pc3Npb24pIHtcbiAgICAvLyAgICAgY29uc29sZS5sb2coXCJyb2xlUGVybWlzc2lvblwiLHJvbGVQZXJtaXNzaW9uKTtcbiAgICAvLyAgICAgLyoqIG1vY2t1cCByZXNwb25zZSovXG4gICAgLy8gICAgIGxldCB2ZXJpZnkgPSBbXTtcbiAgICAvLyAgICAgdGhpcy52ZXJpZnlUb2tlbi5tZW51UGVybWlzc2lvbnMuZm9yRWFjaChtZW51UGVybWlzc2lvbnMgPT4ge1xuICAgIC8vICAgICAgICAgaWYgKG1lbnVQZXJtaXNzaW9ucy5tZW51TmFtZSA9PT0gcm9sZVBlcm1pc3Npb24ucm9sZSkge1xuICAgIC8vICAgICAgICAgICAgIHZlcmlmeSA9IG1lbnVQZXJtaXNzaW9ucy5wZXJtaXNzaW9ucztcbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgfSk7XG4gICAgLy8gICAgIGNvbnNvbGUubG9nKFwidmVyaWZ5XCIsdmVyaWZ5KTtcblxuICAgIC8vICAgICBjb25zdCBjaGVja0FycmFyeSA9IF8uaW50ZXJzZWN0aW9uKHZlcmlmeSwgcm9sZVBlcm1pc3Npb24uY29tcG9uZW50KTtcbiAgICAvLyAgICAgY29uc29sZS5sb2coXCJjaGVja0FycmFyeVwiLGNoZWNrQXJyYXJ5KTtcbiAgICAvLyAgICAgaWYgKGNoZWNrQXJyYXJ5Lmxlbmd0aCAhPT0gMCkge1xuICAgIC8vICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgLy8gICAgIH0gZWxzZSB7XG4gICAgLy8gICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG5cbiAgICBpc0NoZWNrR3JvdXAocm91dGUpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJpc0NoZWNrR3JvdXAgcm91dGVcIiwgcm91dGUpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImlzQ2hlY2tHcm91cCB0aGlzLnZlcmlmeVRva2VuXCIsIHRoaXMudmVyaWZ5VG9rZW4pO1xuICAgICAgICBsZXQgdmVyaWZ5ID0gW107XG4gICAgICAgIGZvciAobGV0IG1lbnVQZXJtaXNzaW9ucyBvZiB0aGlzLnZlcmlmeVRva2VuLm1lbnVQZXJtaXNzaW9ucykge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJpc0NoZWNrR3JvdXAgbWVudVBlcm1pc3Npb25zXCIsIG1lbnVQZXJtaXNzaW9ucyk7XG4gICAgICAgICAgICBsZXQgdXJsID0gbWVudVBlcm1pc3Npb25zLnVybCB8fCBcIlwiO1xuICAgICAgICAgICAgbGV0IHNwbGl0UGF0aCA9IHVybC5zcGxpdCgnPycpO1xuICAgICAgICAgICAgc3BsaXRQYXRoID0gc3BsaXRQYXRoLmxlbmd0aCA+IDAgPyBzcGxpdFBhdGhbMF0uc3BsaXQoJy8nKSA6IFtdOyAvLyBzcGxpdCBwYXRoXG4gICAgICAgICAgICBsZXQgcGF0aDsgLy8g4LiU4Li24LiHIHBhdGgg4Liq4Li44LiU4LiX4LmJ4Liy4LiiXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBzcGxpdFBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnaXNDaGVja0dyb3VwIHNwbGl0UGF0aFtpXScsIHNwbGl0UGF0aFtpXSk7XG4gICAgICAgICAgICAgICAgaWYgKHNwbGl0UGF0aFtpXSA9PT0gJyMnKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGggPSBzcGxpdFBhdGhbaSArIDFdOyAvLyDguJTguLbguIcgcGF0aCDguKvguKXguLHguIcgI1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImlzQ2hlY2tHcm91cCBwYXRoXCIsIHBhdGgpO1xuICAgICAgICAgICAgaWYgKHBhdGggPT09IHJvdXRlLnJvdXRlKSB7XG4gICAgICAgICAgICAgICAgdmVyaWZ5ID0gbWVudVBlcm1pc3Npb25zLnBlcm1pc3Npb25zO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaXNDaGVja0dyb3VwIHZlcmlmeVwiLCB2ZXJpZnkpO1xuXG4gICAgICAgIGNvbnN0IGNoZWNrQXJyYXJ5ID0gXy5pbnRlcnNlY3Rpb24odmVyaWZ5LCByb3V0ZS5jb21wb25lbnQpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImlzQ2hlY2tHcm91cCBjaGVja0FycmFyeVwiLCBjaGVja0FycmFyeSk7XG4gICAgICAgIGlmIChjaGVja0FycmFyeS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIOC4o+C4seC4muC4hOC5iOC4siBndWFyZCDguJfguLXguYjguKHguLXguKrguLTguJfguJjguLTguYwgKi9cbiAgICBpc0NoZWNrR3VhcmQocm9sZSkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcInJvbGVcIixyb2xlKTtcbiAgICAgICAgLyoqIG1vY2t1cCByZXNwb25zZSovXG5cbiAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy52ZXJpZnlUb2tlbi5tZW51cyk7XG4gICAgICAgIGNvbnN0IGNoZWNrQXJyYXJ5ID0gXy5pbnRlcnNlY3Rpb24odGhpcy52ZXJpZnlUb2tlbi5tZW51cywgW3JvbGVdKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJjaGVja0FycmFyeVwiLGNoZWNrQXJyYXJ5KTtcbiAgICAgICAgaWYgKGNoZWNrQXJyYXJ5Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2ZXJpZnlEZW1vKCkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ3Rva2VuJyk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCd0b2tlbicsIHRva2VuKTtcbiAgICAgICAgaWYgKHRva2VuICYmIHRva2VuID09PSAnZGVtbycpIHtcbiAgICAgICAgICAgIHJldHVybiBvZih7XG4gICAgICAgICAgICAgICAgJ3Jlc3VsdENvZGUnOiAnMjAwMDAnLFxuICAgICAgICAgICAgICAgICdyZXN1bHREZXNjcmlwdGlvbic6ICdTdWNjZXNzJyxcbiAgICAgICAgICAgICAgICAncmVzdWx0RGF0YSc6IHtcbiAgICAgICAgICAgICAgICAgICAgJ2IyYlRva2VuJzogJyRiMmJUb2tlbidcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KS50b1Byb21pc2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2Yoe1xuICAgICAgICAgICAgJ3Jlc3VsdENvZGUnOiAnNDAwMDAnLFxuICAgICAgICAgICAgJ3Jlc3VsdERlc2NyaXB0aW9uJzogJycsXG4gICAgICAgIH0pLnRvUHJvbWlzZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgand0KCkge1xuICAgICAgICAvLyBjcmVhdGUgYXV0aG9yaXphdGlvbiBoZWFkZXIgd2l0aCBqd3QgdG9rZW5cbiAgICAgICAgY29uc3QgdG9rZW4gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCd0b2tlbicpO1xuXG4gICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHsgJ0F1dGhvcml6YXRpb24nOiAnQmVhcmVyICcgKyB0b2tlbiAsICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICd4LXRva2VuJzogJzEnIH0pO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXF1ZXN0T3B0aW9ucyh7IGhlYWRlcnM6IGhlYWRlcnMgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBnZXRBdHRhY2htZW50VG9rZW4oKXtcblxuICAgICAgICBsZXQgbm93ID0gbmV3IERhdGUoKTtcbiAgICAgICAgbGV0IGV4cGlyZURhdGUgPSBuZXcgRGF0ZSh0aGlzLnZlcmlmeVRva2VuLmF0dGFjaG1lbnRUb2tlbi5leHBpcmUpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIm5vd1wiLG5vdyk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZXhwaXJlRGF0ZVwiLGV4cGlyZURhdGUpO1xuICAgICAgICBsZXQgY2hlY2tEYXRlVmFsaWQgPSBub3cgPD0gZXhwaXJlRGF0ZTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJjaGVja0RhdGVWYWxpZFwiLGNoZWNrRGF0ZVZhbGlkKTtcbiAgICAgICAgaWYoY2hlY2tEYXRlVmFsaWQpe1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmVyaWZ5VG9rZW4uYXR0YWNobWVudFRva2VuLnRva2VuO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHRyeXtcbiAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmh0dHAucG9zdCh0aGlzLmRvd25sb2FkVG9rZW5VcmwsIHt9LCB0aGlzLmp3dCgpKS5tYXAoKHJlczogUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5qc29uKCk7XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycm9yOiBhbnkpID0+IE9ic2VydmFibGUudGhyb3coZXJyb3IuanNvbigpLmVycm9yIHx8ICdTZXJ2ZXIgZXJyb3InKSkudG9Qcm9taXNlKCk7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ3Jlc3BvbnNlICcscmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIGlmICgrcmVzcG9uc2VbJ3Jlc3VsdENvZGUnXSA9PT0gMjAwMDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52ZXJpZnlUb2tlbi5hdHRhY2htZW50VG9rZW4gPSByZXNwb25zZVsncmVzdWx0RGF0YSddO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VbJ3Jlc3VsdERhdGEnXS50b2tlbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZWxzZSBpZigrcmVzcG9uc2VbJ3Jlc3VsdENvZGUnXSA9PT0gNDAxMDApe1xuICAgICAgICAgICAgICAgIC8vICAgbGV0IF9fcmVzdWx0RGF0YSA9IHJlc3BvbnNlWydyZXN1bHREYXRhJ107XG4gICAgICAgICAgICAgICAgLy8gICB0aGlzLmNoZWNrU2Vzc2lvbihfX3Jlc3VsdERhdGEudXNlck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIC8vICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfWNhdGNoIChlKXtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3IgJyxlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqIOC4o+C4seC4muC4hOC5iOC4siBndWFyZCDguJfguLXguYjguKHguLXguKrguLTguJfguJjguLTguYwgKi9cbiAgICBpc0NoZWNrR3VhcmRSb3V0ZVBhdGgocm91dGUpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJyb3V0ZVwiLHJvdXRlKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJ0aGlzLnZlcmlmeVRva2VuXCIsdGhpcy52ZXJpZnlUb2tlbik7XG4gICAgICAgIGZvcihsZXQgbWVudVBlcm1pc3Npb25zIG9mIHRoaXMudmVyaWZ5VG9rZW4ubWVudVBlcm1pc3Npb25zKXtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwibWVudVBlcm1pc3Npb25zXCIsbWVudVBlcm1pc3Npb25zKTtcbiAgICAgICAgICAgIGxldCB1cmwgPSBtZW51UGVybWlzc2lvbnMudXJsIHx8IFwiXCI7XG4gICAgICAgICAgICBsZXQgc3BsaXRQYXRoID0gdXJsLnNwbGl0KCc/Jyk7XG4gICAgICAgICAgICBzcGxpdFBhdGggPSBzcGxpdFBhdGgubGVuZ3RoID4gMCA/IHNwbGl0UGF0aFswXS5zcGxpdCgnLycpIDogW107IC8vIHNwbGl0IHBhdGhcbiAgICAgICAgICAgIGxldCBwYXRoOyAvLyDguJTguLbguIcgcGF0aCDguKrguLjguJTguJfguYnguLLguKJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHNwbGl0UGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdzcGxpdFBhdGhbaV0nLCBzcGxpdFBhdGhbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChzcGxpdFBhdGhbaV0gPT09ICcjJykge1xuICAgICAgICAgICAgICAgICAgICBwYXRoID0gc3BsaXRQYXRoW2krMV07IC8vIOC4lOC4tuC4hyBwYXRoIOC4q+C4peC4seC4hyAjXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwicGF0aFwiLHBhdGgpO1xuICAgICAgICAgICAgaWYgKHBhdGggPT09IHJvdXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbiJdfQ==