info-library 2.15.1-beta → 3.0.0-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/controls/alert/alert.component.d.ts +7 -7
- package/controls/autocomplete/autocomplete.component.d.ts +52 -51
- package/controls/big-checkbox/big-checkbox.component.d.ts +41 -41
- package/controls/card/card.component.d.ts +16 -16
- package/controls/card-menu/card-menu.component.d.ts +23 -23
- package/controls/checkbox/checkbox.component.d.ts +27 -27
- package/controls/chips/chips.component.d.ts +23 -23
- package/controls/date/date.component.d.ts +38 -37
- package/controls/date-month/date-month.component.d.ts +40 -39
- package/controls/editor/editor.component.d.ts +40 -40
- package/controls/grid/grid.component.d.ts +172 -172
- package/controls/input/input.component.d.ts +47 -37
- package/controls/input-list/input-list.component.d.ts +29 -29
- package/controls/list-checkbox/list-checkbox.component.d.ts +26 -26
- package/controls/message/message.component.d.ts +10 -10
- package/controls/multi-select/multi-select.component.d.ts +39 -37
- package/controls/paginator/paginator.component.d.ts +25 -25
- package/controls/select/select.component.d.ts +42 -41
- package/controls/timeline/timeline.component.d.ts +17 -17
- package/directives/mask.directive.d.ts +24 -24
- package/directives/unmask.directive.d.ts +12 -11
- package/enum/dialog-buttons.enum.d.ts +7 -7
- package/enum/index.d.ts +3 -3
- package/enum/modal-action.enum.d.ts +10 -10
- package/enum/page-action.enum.d.ts +8 -8
- package/esm2022/controls/alert/alert.component.mjs +72 -0
- package/esm2022/controls/autocomplete/autocomplete.component.mjs +265 -0
- package/esm2022/controls/big-checkbox/big-checkbox.component.mjs +300 -0
- package/esm2022/controls/card/card.component.mjs +83 -0
- package/esm2022/controls/card-menu/card-menu.component.mjs +143 -0
- package/esm2022/controls/checkbox/checkbox.component.mjs +93 -0
- package/esm2022/controls/chips/chips.component.mjs +114 -0
- package/esm2022/controls/date/date.component.mjs +173 -0
- package/esm2022/controls/date-month/date-month.component.mjs +181 -0
- package/esm2022/controls/editor/editor.component.mjs +139 -0
- package/esm2022/controls/grid/grid.component.mjs +1818 -0
- package/esm2022/controls/input/input.component.mjs +389 -0
- package/esm2022/controls/input-list/input-list.component.mjs +259 -0
- package/{esm2020 → esm2022}/controls/list-checkbox/list-checkbox.component.mjs +242 -238
- package/esm2022/controls/message/message.component.mjs +48 -0
- package/esm2022/controls/multi-select/multi-select.component.mjs +174 -0
- package/esm2022/controls/paginator/paginator.component.mjs +177 -0
- package/esm2022/controls/select/select.component.mjs +189 -0
- package/esm2022/controls/timeline/timeline.component.mjs +116 -0
- package/esm2022/directives/mask.directive.mjs +134 -0
- package/esm2022/directives/unmask.directive.mjs +35 -0
- package/{esm2020 → esm2022}/enum/dialog-buttons.enum.mjs +8 -8
- package/{esm2020 → esm2022}/enum/index.mjs +3 -3
- package/{esm2020 → esm2022}/enum/modal-action.enum.mjs +11 -11
- package/{esm2020 → esm2022}/enum/page-action.enum.mjs +9 -9
- package/{esm2020 → esm2022}/global-config.mjs +3 -3
- package/{esm2020 → esm2022}/info-library.mjs +4 -4
- package/esm2022/info-library.module.mjs +283 -0
- package/esm2022/layouts/dialog/dialog.component.mjs +192 -0
- package/esm2022/layouts/filter/filter.component.mjs +179 -0
- package/esm2022/layouts/loading/loading.component.mjs +40 -0
- package/esm2022/layouts/main/main.component.mjs +305 -0
- package/esm2022/layouts/modal/modal.component.mjs +273 -0
- package/esm2022/layouts/pagebar/pagebar.component.mjs +432 -0
- package/esm2022/layouts/sidebar/sidebar.component.mjs +447 -0
- package/esm2022/layouts/topbar/topbar.component.mjs +1032 -0
- package/esm2022/layouts/topmenu/topmenu.component.mjs +173 -0
- package/esm2022/model/app-config.model.mjs +14 -0
- package/esm2022/model/data-access.model.mjs +37 -0
- package/esm2022/model/dialog-result.model.mjs +9 -0
- package/esm2022/model/dialog.model.mjs +15 -0
- package/esm2022/model/form-prop.model.mjs +37 -0
- package/esm2022/model/grid-button.model.mjs +26 -0
- package/{esm2020 → esm2022}/model/index.mjs +14 -14
- package/esm2022/model/last-search.model.mjs +7 -0
- package/esm2022/model/login.model.mjs +11 -0
- package/esm2022/model/method-grid-button.model.mjs +11 -0
- package/esm2022/model/notification.model.mjs +13 -0
- package/{esm2020 → esm2022}/model/pagebar-buttons.model.mjs +15 -15
- package/esm2022/model/permission.model.mjs +6 -0
- package/esm2022/model/platform.model.mjs +20 -0
- package/esm2022/model/session.model.mjs +27 -0
- package/{esm2020 → esm2022}/pipe/index.mjs +2 -2
- package/esm2022/pipe/mask.pipe.mjs +38 -0
- package/esm2022/pipe/translate.pipe.mjs +27 -0
- package/{esm2020 → esm2022}/public_api.mjs +37 -36
- package/esm2022/service/authentication.service.mjs +411 -0
- package/esm2022/service/configuration.service.mjs +90 -0
- package/esm2022/service/data.service.mjs +129 -0
- package/{esm2020 → esm2022}/service/index.mjs +5 -5
- package/esm2022/service/theme.service.mjs +89 -0
- package/esm2022/service/translate.service.mjs +57 -0
- package/esm2022/utils/utilities.mjs +189 -0
- package/fesm2022/info-library.mjs +9364 -0
- package/fesm2022/info-library.mjs.map +1 -0
- package/global-config.d.ts +3 -3
- package/index.d.ts +5 -5
- package/info-library-3.0.0-beta.tgz +0 -0
- package/info-library.module.d.ts +61 -60
- package/layouts/dialog/dialog.component.d.ts +29 -29
- package/layouts/filter/filter.component.d.ts +24 -0
- package/layouts/loading/loading.component.d.ts +8 -8
- package/layouts/main/main.component.d.ts +60 -56
- package/layouts/modal/modal.component.d.ts +40 -39
- package/layouts/pagebar/pagebar.component.d.ts +45 -45
- package/layouts/sidebar/sidebar.component.d.ts +40 -40
- package/layouts/topbar/topbar.component.d.ts +69 -66
- package/layouts/topmenu/topmenu.component.d.ts +34 -34
- package/model/app-config.model.d.ts +13 -11
- package/model/data-access.model.d.ts +12 -12
- package/model/dialog-result.model.d.ts +6 -6
- package/model/dialog.model.d.ts +14 -14
- package/model/form-prop.model.d.ts +12 -12
- package/model/grid-button.model.d.ts +18 -18
- package/model/index.d.ts +14 -14
- package/model/last-search.model.d.ts +6 -6
- package/model/login.model.d.ts +6 -6
- package/model/method-grid-button.model.d.ts +6 -6
- package/model/notification.model.d.ts +12 -12
- package/model/pagebar-buttons.model.d.ts +10 -10
- package/model/permission.model.d.ts +5 -5
- package/model/platform.model.d.ts +16 -16
- package/model/session.model.d.ts +27 -22
- package/package.json +5 -11
- package/pipe/index.d.ts +2 -2
- package/pipe/mask.pipe.d.ts +8 -8
- package/pipe/translate.pipe.d.ts +10 -10
- package/public_api.d.ts +34 -33
- package/service/authentication.service.d.ts +63 -61
- package/service/configuration.service.d.ts +17 -14
- package/service/data.service.d.ts +41 -39
- package/service/index.d.ts +5 -5
- package/service/theme.service.d.ts +16 -16
- package/service/translate.service.d.ts +16 -16
- package/utils/utilities.d.ts +38 -27
- package/esm2020/controls/alert/alert.component.mjs +0 -74
- package/esm2020/controls/autocomplete/autocomplete.component.mjs +0 -258
- package/esm2020/controls/big-checkbox/big-checkbox.component.mjs +0 -298
- package/esm2020/controls/card/card.component.mjs +0 -77
- package/esm2020/controls/card-menu/card-menu.component.mjs +0 -145
- package/esm2020/controls/checkbox/checkbox.component.mjs +0 -93
- package/esm2020/controls/chips/chips.component.mjs +0 -113
- package/esm2020/controls/date/date.component.mjs +0 -141
- package/esm2020/controls/date-month/date-month.component.mjs +0 -148
- package/esm2020/controls/editor/editor.component.mjs +0 -135
- package/esm2020/controls/grid/grid.component.mjs +0 -1800
- package/esm2020/controls/input/input.component.mjs +0 -314
- package/esm2020/controls/input-list/input-list.component.mjs +0 -258
- package/esm2020/controls/message/message.component.mjs +0 -50
- package/esm2020/controls/multi-select/multi-select.component.mjs +0 -161
- package/esm2020/controls/paginator/paginator.component.mjs +0 -178
- package/esm2020/controls/select/select.component.mjs +0 -180
- package/esm2020/controls/timeline/timeline.component.mjs +0 -117
- package/esm2020/directives/mask.directive.mjs +0 -125
- package/esm2020/directives/unmask.directive.mjs +0 -28
- package/esm2020/info-library.module.mjs +0 -278
- package/esm2020/layouts/dialog/dialog.component.mjs +0 -188
- package/esm2020/layouts/loading/loading.component.mjs +0 -42
- package/esm2020/layouts/main/main.component.mjs +0 -258
- package/esm2020/layouts/modal/modal.component.mjs +0 -258
- package/esm2020/layouts/pagebar/pagebar.component.mjs +0 -404
- package/esm2020/layouts/sidebar/sidebar.component.mjs +0 -395
- package/esm2020/layouts/topbar/topbar.component.mjs +0 -868
- package/esm2020/layouts/topmenu/topmenu.component.mjs +0 -165
- package/esm2020/model/app-config.model.mjs +0 -14
- package/esm2020/model/data-access.model.mjs +0 -35
- package/esm2020/model/dialog-result.model.mjs +0 -8
- package/esm2020/model/dialog.model.mjs +0 -16
- package/esm2020/model/form-prop.model.mjs +0 -35
- package/esm2020/model/grid-button.model.mjs +0 -21
- package/esm2020/model/last-search.model.mjs +0 -9
- package/esm2020/model/login.model.mjs +0 -9
- package/esm2020/model/method-grid-button.model.mjs +0 -9
- package/esm2020/model/notification.model.mjs +0 -9
- package/esm2020/model/permission.model.mjs +0 -3
- package/esm2020/model/platform.model.mjs +0 -21
- package/esm2020/model/session.model.mjs +0 -8
- package/esm2020/pipe/mask.pipe.mjs +0 -34
- package/esm2020/pipe/translate.pipe.mjs +0 -26
- package/esm2020/service/authentication.service.mjs +0 -358
- package/esm2020/service/configuration.service.mjs +0 -59
- package/esm2020/service/data.service.mjs +0 -112
- package/esm2020/service/theme.service.mjs +0 -79
- package/esm2020/service/translate.service.mjs +0 -53
- package/esm2020/utils/utilities.mjs +0 -142
- package/fesm2015/info-library.mjs +0 -9312
- package/fesm2015/info-library.mjs.map +0 -1
- package/fesm2020/info-library.mjs +0 -8462
- package/fesm2020/info-library.mjs.map +0 -1
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
import { Component, Injectable } from '@angular/core';
|
|
2
|
+
import { Router } from '@angular/router';
|
|
3
|
+
import { HttpClient } from '@angular/common/http';
|
|
4
|
+
import { Observable, of } from 'rxjs';
|
|
5
|
+
import { map, catchError, switchMap } from 'rxjs/operators';
|
|
6
|
+
import { InfoSessionModel } from '../model/session.model';
|
|
7
|
+
import { InfoPlatformModel } from '../model/platform.model';
|
|
8
|
+
import { InfoLoginModel } from '../model/login.model';
|
|
9
|
+
import { InfoDataService } from '../service/data.service';
|
|
10
|
+
import { MatDialog, MatDialogRef } from '@angular/material/dialog';
|
|
11
|
+
import { InfoModalAction } from '../enum';
|
|
12
|
+
import { Title } from '@angular/platform-browser';
|
|
13
|
+
import { InfoTranslateService } from '../service/translate.service';
|
|
14
|
+
import { Utilities } from '../utils/utilities';
|
|
15
|
+
import * as i0 from "@angular/core";
|
|
16
|
+
import * as i1 from "@angular/router";
|
|
17
|
+
import * as i2 from "@angular/common/http";
|
|
18
|
+
import * as i3 from "../model/session.model";
|
|
19
|
+
import * as i4 from "../model/platform.model";
|
|
20
|
+
import * as i5 from "../service/data.service";
|
|
21
|
+
import * as i6 from "@angular/material/dialog";
|
|
22
|
+
import * as i7 from "../utils/utilities";
|
|
23
|
+
import * as i8 from "../service/translate.service";
|
|
24
|
+
import * as i9 from "@angular/platform-browser";
|
|
25
|
+
import * as i10 from "../layouts/modal/modal.component";
|
|
26
|
+
import * as i11 from "../pipe/translate.pipe";
|
|
27
|
+
export class InfoAuthenticationService {
|
|
28
|
+
_router;
|
|
29
|
+
_http;
|
|
30
|
+
_sessao;
|
|
31
|
+
_plataforma;
|
|
32
|
+
_dataService;
|
|
33
|
+
_modal;
|
|
34
|
+
_utilities;
|
|
35
|
+
_translate;
|
|
36
|
+
_title;
|
|
37
|
+
_sessionTimeInterval;
|
|
38
|
+
_sessionActive = true;
|
|
39
|
+
constructor(_router, _http, _sessao, _plataforma, _dataService, _modal, _utilities, _translate, _title) {
|
|
40
|
+
this._router = _router;
|
|
41
|
+
this._http = _http;
|
|
42
|
+
this._sessao = _sessao;
|
|
43
|
+
this._plataforma = _plataforma;
|
|
44
|
+
this._dataService = _dataService;
|
|
45
|
+
this._modal = _modal;
|
|
46
|
+
this._utilities = _utilities;
|
|
47
|
+
this._translate = _translate;
|
|
48
|
+
this._title = _title;
|
|
49
|
+
}
|
|
50
|
+
getSessao() {
|
|
51
|
+
return this._sessao;
|
|
52
|
+
}
|
|
53
|
+
getPlatform() {
|
|
54
|
+
return this._plataforma;
|
|
55
|
+
}
|
|
56
|
+
canActivate(activatedRouteSnapshot, routerStateSnapshot) {
|
|
57
|
+
if (!this.isLogged() || !this._sessionActive) {
|
|
58
|
+
this.logout();
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
const url = activatedRouteSnapshot.data['URL'] || routerStateSnapshot.url;
|
|
62
|
+
setTimeout(() => {
|
|
63
|
+
this.refreshSessionTime();
|
|
64
|
+
}, 1000);
|
|
65
|
+
this.definePaginaAtiva(url);
|
|
66
|
+
return this.getPermission(url, true)
|
|
67
|
+
.pipe(map(() => {
|
|
68
|
+
if (url == '/')
|
|
69
|
+
return true;
|
|
70
|
+
if (!this.hasPermission(url))
|
|
71
|
+
this._router.navigateByUrl('permission');
|
|
72
|
+
if (url.indexOf('novo') > -1 && !this.hasPermission(url, 'new'))
|
|
73
|
+
this._router.navigateByUrl('permission');
|
|
74
|
+
if (url.indexOf('visualizar') < -1 && activatedRouteSnapshot.paramMap.get('id') != null && !this.hasPermission(url, 'edit'))
|
|
75
|
+
this._router.navigateByUrl('permission');
|
|
76
|
+
return true;
|
|
77
|
+
}, catchError(error => {
|
|
78
|
+
if (error.status == 401)
|
|
79
|
+
this.logout();
|
|
80
|
+
return of(true);
|
|
81
|
+
}))).pipe(switchMap(async (res) => {
|
|
82
|
+
const permissao = activatedRouteSnapshot.data['Permissao'];
|
|
83
|
+
if (!permissao)
|
|
84
|
+
return true;
|
|
85
|
+
var params = (permissao[2] || '').replace(RegExp(/\{(.*?)\}/, 'g'), (_, p) => activatedRouteSnapshot.params[p]);
|
|
86
|
+
var r = await this._dataService.get(permissao[0], permissao[1], params).toPromise();
|
|
87
|
+
if (!r.success || r.data != true)
|
|
88
|
+
this._router.navigateByUrl('permission');
|
|
89
|
+
return true;
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
isLogged() {
|
|
93
|
+
return (this._utilities.getLocalStorage(this._plataforma.TokenKey) != null);
|
|
94
|
+
}
|
|
95
|
+
refreshSessionTime() {
|
|
96
|
+
if (!this._sessionActive)
|
|
97
|
+
return;
|
|
98
|
+
clearInterval(this._sessionTimeInterval);
|
|
99
|
+
if (this._sessao.TempoInatividade == null || this._sessao.TempoInatividade <= 0)
|
|
100
|
+
return;
|
|
101
|
+
let tempoSessao = this._sessao.TempoInatividade;
|
|
102
|
+
this._utilities.setLocalStorage('ms', new Date().valueOf().toString());
|
|
103
|
+
this._sessionTimeInterval = setInterval(() => {
|
|
104
|
+
if (tempoSessao > 0) {
|
|
105
|
+
tempoSessao--;
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
let tempoRestante = Math.round(this._sessao.TempoInatividade - ((new Date().valueOf() - parseInt(this._utilities.getLocalStorage('ms'))) / 1000));
|
|
109
|
+
if (!isNaN(tempoRestante) && tempoRestante > 0) {
|
|
110
|
+
tempoSessao = tempoRestante;
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
clearInterval(this._sessionTimeInterval);
|
|
114
|
+
this._sessionActive = false;
|
|
115
|
+
if (isNaN(tempoRestante))
|
|
116
|
+
this.logout();
|
|
117
|
+
else
|
|
118
|
+
this.showMessage();
|
|
119
|
+
}, 1000);
|
|
120
|
+
}
|
|
121
|
+
showMessage() {
|
|
122
|
+
let ref = this._modal.open(RefreshSessionTimeModalComponent, {
|
|
123
|
+
data: null,
|
|
124
|
+
disableClose: true,
|
|
125
|
+
width: '500px'
|
|
126
|
+
});
|
|
127
|
+
ref.afterClosed().subscribe((r) => {
|
|
128
|
+
if (r != null && (r.modalAction == InfoModalAction.Yes || (this._sessao.TempoInatividade - ((new Date().valueOf() - parseInt(this._utilities.getLocalStorage('ms'))) / 1000)) > 0)) {
|
|
129
|
+
this._sessionActive = true;
|
|
130
|
+
this.refreshSessionTime();
|
|
131
|
+
}
|
|
132
|
+
else
|
|
133
|
+
this.logout();
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
login(usuario, senha, reCaptchaToken = null, codigo2FA = null) {
|
|
137
|
+
this.removeSessao();
|
|
138
|
+
return this._http
|
|
139
|
+
.post(this._plataforma.Config.webapiUrl + 'centrocontrole/usuario/autenticar', this._utilities.jsonToEncrypt({ Usuario: usuario, Senha: senha, ReCaptchaToken: reCaptchaToken, Codigo2FA: codigo2FA }), { headers: this._dataService.getHeaderDefault(), responseType: 'text' })
|
|
140
|
+
.pipe(map((rs) => {
|
|
141
|
+
var r = this._utilities.decryptToJson(rs);
|
|
142
|
+
if (r.Success && r.Data != null)
|
|
143
|
+
this._utilities.setLocalStorage(this._plataforma.TokenKey, r.Data.Token);
|
|
144
|
+
return new InfoLoginModel(r.Success, r.Messages, r.Data);
|
|
145
|
+
}), catchError((e) => this.errorHandling(e)));
|
|
146
|
+
}
|
|
147
|
+
trocarEmpresa(usuario, empresaId) {
|
|
148
|
+
return this._http
|
|
149
|
+
.post(this._plataforma.Config.webapiUrl + 'centrocontrole/usuario/trocarempresa', this._utilities.jsonToEncrypt({ EmpresaId: empresaId }), { headers: this._dataService.getHeaderToken(), responseType: 'text' })
|
|
150
|
+
.pipe(map((rs) => {
|
|
151
|
+
var r = this._utilities.decryptToJson(rs);
|
|
152
|
+
if (r.Success && r.Data != null)
|
|
153
|
+
this._utilities.setLocalStorage(this._plataforma.TokenKey, r.Data);
|
|
154
|
+
return new InfoLoginModel(r.Success, r.Messages, r.Data);
|
|
155
|
+
}), catchError((e) => this.errorHandling(e)));
|
|
156
|
+
}
|
|
157
|
+
trocarUnidade(usuario, empresaId, unidadeId) {
|
|
158
|
+
return this._http
|
|
159
|
+
.post(this._plataforma.Config.webapiUrl + 'centrocontrole/usuario/trocarunidade', this._utilities.jsonToEncrypt({ EmpresaId: empresaId, UnidadeId: unidadeId }), { headers: this._dataService.getHeaderToken(), responseType: 'text' })
|
|
160
|
+
.pipe(map((rs) => {
|
|
161
|
+
var r = this._utilities.decryptToJson(rs);
|
|
162
|
+
if (r.Success && r.Data != null)
|
|
163
|
+
this._utilities.setLocalStorage(this._plataforma.TokenKey, r.Data);
|
|
164
|
+
return new InfoLoginModel(r.Success, r.Messages, r.Data);
|
|
165
|
+
}), catchError((e) => this.errorHandling(e)));
|
|
166
|
+
}
|
|
167
|
+
trocarCliente(usuario, clienteId) {
|
|
168
|
+
return this._http
|
|
169
|
+
.post(this._plataforma.Config.webapiUrl + 'centrocontrole/usuario/trocarcliente', this._utilities.jsonToEncrypt({ ClienteId: clienteId }), { headers: this._dataService.getHeaderToken(), responseType: 'text' })
|
|
170
|
+
.pipe(map((rs) => {
|
|
171
|
+
var r = this._utilities.decryptToJson(rs);
|
|
172
|
+
if (r.Success && r.Data != null)
|
|
173
|
+
this._utilities.setLocalStorage(this._plataforma.TokenKey, r.Data);
|
|
174
|
+
return new InfoLoginModel(r.Success, r.Messages, r.Data);
|
|
175
|
+
}), catchError((e) => this.errorHandling(e)));
|
|
176
|
+
}
|
|
177
|
+
clonar(usuario) {
|
|
178
|
+
return this._http
|
|
179
|
+
.post(this._plataforma.Config.webapiUrl + 'centrocontrole/usuario/clonar', this._utilities.jsonToEncrypt({ Usuario: usuario }), { headers: this._dataService.getHeaderToken(), responseType: 'text' })
|
|
180
|
+
.pipe(map((rs) => {
|
|
181
|
+
var r = this._utilities.decryptToJson(rs);
|
|
182
|
+
if (r.Success && r.Data != null)
|
|
183
|
+
this._utilities.setLocalStorage(this._plataforma.TokenKey, r.Data);
|
|
184
|
+
return new InfoLoginModel(r.Success, r.Messages, r.Data);
|
|
185
|
+
}), catchError((e) => this.errorHandling(e)));
|
|
186
|
+
}
|
|
187
|
+
logout() {
|
|
188
|
+
if (this.isLogged()) {
|
|
189
|
+
this._http.post(this._plataforma.Config.webapiUrl + 'centrocontrole/usuario/Logout', null, { headers: this._dataService.getHeaderToken(), responseType: 'text' })
|
|
190
|
+
.subscribe(() => {
|
|
191
|
+
this.removeSessao();
|
|
192
|
+
this._router.navigateByUrl('login').then(r => { location.reload(); });
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
this.removeSessao();
|
|
197
|
+
this._router.navigateByUrl('login').then(r => { location.reload(); });
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
getPermissions(url, logAtividade = false) {
|
|
201
|
+
return this._http
|
|
202
|
+
.get(this._plataforma.Config.webapiUrl + 'centrocontrole/usuario/getpermissao?' + encodeURIComponent(this._utilities.jsonToEncrypt('url=' + url + '&logatividade=' + logAtividade.toString())), { headers: this._dataService.getHeaderToken(), responseType: 'text' })
|
|
203
|
+
.pipe(map((rs) => {
|
|
204
|
+
var r = this._utilities.decryptToJson(rs);
|
|
205
|
+
return new InfoLoginModel(r.Success, r.Messages, r.Data);
|
|
206
|
+
}), catchError((e) => this.errorHandling(e)));
|
|
207
|
+
}
|
|
208
|
+
setTrocaSenha(model) {
|
|
209
|
+
return this._http
|
|
210
|
+
.post(this._plataforma.Config.webapiUrl + 'centrocontrole/usuario/TrocarSenha', this._utilities.jsonToEncrypt(model), { headers: this._dataService.getHeaderToken(), responseType: 'text' })
|
|
211
|
+
.pipe(map((rs) => {
|
|
212
|
+
var r = this._utilities.decryptToJson(rs);
|
|
213
|
+
return new InfoLoginModel(r.Success, r.Messages, r.Data);
|
|
214
|
+
}), catchError((e) => this.errorHandling(e)));
|
|
215
|
+
}
|
|
216
|
+
setRecuperarSenha(model) {
|
|
217
|
+
return this._http
|
|
218
|
+
.post(this._plataforma.Config.webapiUrl + 'centrocontrole/usuario/RecuperarSenha', this._utilities.jsonToEncrypt(model), { headers: this._dataService.getHeaderToken(), responseType: 'text' })
|
|
219
|
+
.pipe(map((rs) => {
|
|
220
|
+
var r = this._utilities.decryptToJson(rs);
|
|
221
|
+
return new InfoLoginModel(r.Success, r.Messages, r.Data);
|
|
222
|
+
}), catchError((e) => this.errorHandling(e)));
|
|
223
|
+
}
|
|
224
|
+
setResetarSenha(model) {
|
|
225
|
+
return this._http
|
|
226
|
+
.post(this._plataforma.Config.webapiUrl + 'centrocontrole/usuario/ResetarSenha', this._utilities.jsonToEncrypt(model), { headers: this._dataService.getHeaderDefault(), responseType: 'text' })
|
|
227
|
+
.pipe(map((rs) => {
|
|
228
|
+
var r = this._utilities.decryptToJson(rs);
|
|
229
|
+
return new InfoLoginModel(r.Success, r.Messages, r.Data);
|
|
230
|
+
}), catchError((e) => this.errorHandling(e)));
|
|
231
|
+
}
|
|
232
|
+
getLoginResources() {
|
|
233
|
+
return this._http
|
|
234
|
+
.get(this._plataforma.Config.webapiUrl + 'centrocontrole/app/GetLoginResources', { headers: this._dataService.getHeaderDefault(), responseType: 'text' })
|
|
235
|
+
.pipe(map((rs) => {
|
|
236
|
+
var r = this._utilities.decryptToJson(rs);
|
|
237
|
+
return new InfoLoginModel(r.Success, r.Messages, r.Data);
|
|
238
|
+
}), catchError((e) => this.errorHandling(e)));
|
|
239
|
+
}
|
|
240
|
+
hasPermission(url, keyFunction = 'view') {
|
|
241
|
+
if (url == '/' && keyFunction == 'view')
|
|
242
|
+
return true;
|
|
243
|
+
let urlGenerica = this.getUrlGenerica(url);
|
|
244
|
+
return this._sessao.Permissoes.some(s => s.URL == urlGenerica && s.ChaveFuncionalidade == keyFunction && s.Acesso);
|
|
245
|
+
}
|
|
246
|
+
getPermission(url, logAtividade = false) {
|
|
247
|
+
let urlGenerica = this.getUrlGenerica(url);
|
|
248
|
+
let contemUrl = this._sessao.Permissoes.some(s => s.URL == urlGenerica);
|
|
249
|
+
if (contemUrl) {
|
|
250
|
+
if (logAtividade) {
|
|
251
|
+
return this.validaSessao(url).pipe(map(ret => {
|
|
252
|
+
if (!ret.success)
|
|
253
|
+
this.logout();
|
|
254
|
+
return true;
|
|
255
|
+
}), catchError(error => {
|
|
256
|
+
if (error.status == 401)
|
|
257
|
+
this.logout();
|
|
258
|
+
return of(true);
|
|
259
|
+
}));
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
return new Observable(function (observer) {
|
|
263
|
+
observer.next(true);
|
|
264
|
+
observer.complete();
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
return this.getPermissions(urlGenerica, logAtividade).pipe(map(ret => {
|
|
270
|
+
if (ret.success) {
|
|
271
|
+
if (ret.data == null) {
|
|
272
|
+
this.logout();
|
|
273
|
+
return true;
|
|
274
|
+
}
|
|
275
|
+
ret.data.forEach(item => {
|
|
276
|
+
if (this._sessao.Permissoes.filter(s => s.URL == item.URL && s.ChaveFuncionalidade == item.ChaveFuncionalidade).length == 0)
|
|
277
|
+
this._sessao.Permissoes.push(item);
|
|
278
|
+
});
|
|
279
|
+
ret.data.some(s => s.URL == urlGenerica);
|
|
280
|
+
this._utilities.setLocalStorage(this._plataforma.SessionKey, JSON.stringify(this._sessao));
|
|
281
|
+
}
|
|
282
|
+
return true;
|
|
283
|
+
}), catchError(error => {
|
|
284
|
+
if (error.status == 401)
|
|
285
|
+
this.logout();
|
|
286
|
+
return of(true);
|
|
287
|
+
}));
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
validaSessao(url) {
|
|
291
|
+
return this._http
|
|
292
|
+
.get(this._plataforma.Config.webapiUrl + 'centrocontrole/usuario/validasessao?' + encodeURIComponent(this._utilities.jsonToEncrypt('url=' + url)), { headers: this._dataService.getHeaderToken(), responseType: 'text' })
|
|
293
|
+
.pipe(map((rs) => {
|
|
294
|
+
var r = this._utilities.decryptToJson(rs);
|
|
295
|
+
return new InfoLoginModel(r === true, '', r);
|
|
296
|
+
}), catchError((e) => this.errorHandling(e)));
|
|
297
|
+
}
|
|
298
|
+
removeSessao() {
|
|
299
|
+
Object.keys(localStorage).forEach((key) => {
|
|
300
|
+
if (!key.includes('Dashboard') && !key.includes('cols') && !key.includes('_'))
|
|
301
|
+
localStorage.removeItem(key);
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
definePaginaAtiva(url) {
|
|
305
|
+
if (this._plataforma.Menu == null || url == null) {
|
|
306
|
+
this._plataforma.PaginaAtiva = null;
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
let aux = url.substring(1).replace(/-/g, '').toLowerCase().split('/');
|
|
310
|
+
let tituloMenu = aux.length > 0 ? aux[0].toString() : url;
|
|
311
|
+
let parametrosUrl = url.split('/').slice(2);
|
|
312
|
+
if (tituloMenu.indexOf('nicio') > -1)
|
|
313
|
+
this._plataforma.PaginaAtiva = { Icone: 'widgets', Titulo: 'Inicio' };
|
|
314
|
+
else {
|
|
315
|
+
let item = this._plataforma.Menu.filter(m => m.Title.toLowerCase().indexOf(tituloMenu) > -1);
|
|
316
|
+
let subTitulo = "";
|
|
317
|
+
for (var i = 0; i < parametrosUrl.length; i++) {
|
|
318
|
+
if (!this.isGuid(parametrosUrl[i]) && isNaN(parseFloat(parametrosUrl[i])))
|
|
319
|
+
subTitulo += " - " + this._translate.translate(this.toPascalCase(parametrosUrl[i]));
|
|
320
|
+
}
|
|
321
|
+
if (item != null && item.length > 0) {
|
|
322
|
+
this._plataforma.PaginaAtiva = { Icone: item[0].Icon, Titulo: item[0].Title };
|
|
323
|
+
this._title.setTitle(`${this._translate.translate(this._plataforma.Config.title || "Plataforma")} - ${this._translate.translate(item[0].Title)}` + subTitulo);
|
|
324
|
+
}
|
|
325
|
+
else
|
|
326
|
+
this._plataforma.PaginaAtiva = { Icone: 'security', Titulo: this._plataforma.Config.title || 'Plataforma' };
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
getUrlGenerica(url) {
|
|
330
|
+
let retorno = "";
|
|
331
|
+
let urlParts = url.split('/');
|
|
332
|
+
for (var i = 0; i < urlParts.length; i++) {
|
|
333
|
+
if (!isNaN(parseFloat(urlParts[i])) || this.isGuid(urlParts[i]) || urlParts[i].toLowerCase() == 'novo')
|
|
334
|
+
break;
|
|
335
|
+
else
|
|
336
|
+
retorno += '/' + urlParts[i];
|
|
337
|
+
}
|
|
338
|
+
return retorno.substring(1);
|
|
339
|
+
}
|
|
340
|
+
errorHandling(e) {
|
|
341
|
+
if (e.status == 401)
|
|
342
|
+
this.logout();
|
|
343
|
+
else if (e.status == 500)
|
|
344
|
+
this._router.navigateByUrl('500');
|
|
345
|
+
else if (e.error != null && e.error.error_description != null)
|
|
346
|
+
return of(new InfoLoginModel(false, e.error.error_description));
|
|
347
|
+
else
|
|
348
|
+
return of(new InfoLoginModel(false, 'Houve um problema e não foi possível conectar'));
|
|
349
|
+
}
|
|
350
|
+
isGuid(value) {
|
|
351
|
+
return (value || '').match('^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$') !== null;
|
|
352
|
+
}
|
|
353
|
+
toPascalCase(value) {
|
|
354
|
+
return value.replace(/(^\w|-\w)/g, (w1, w2, i) => i == 0 ? w1.toUpperCase() : w1[1].toUpperCase());
|
|
355
|
+
}
|
|
356
|
+
/** @nocollapse */ static ɵfac = function InfoAuthenticationService_Factory(t) { return new (t || InfoAuthenticationService)(i0.ɵɵinject(i1.Router), i0.ɵɵinject(i2.HttpClient), i0.ɵɵinject(i3.InfoSessionModel), i0.ɵɵinject(i4.InfoPlatformModel), i0.ɵɵinject(i5.InfoDataService), i0.ɵɵinject(i6.MatDialog), i0.ɵɵinject(i7.Utilities), i0.ɵɵinject(i8.InfoTranslateService), i0.ɵɵinject(i9.Title)); };
|
|
357
|
+
/** @nocollapse */ static ɵprov = /** @pureOrBreakMyCode */ i0.ɵɵdefineInjectable({ token: InfoAuthenticationService, factory: InfoAuthenticationService.ɵfac, providedIn: 'root' });
|
|
358
|
+
}
|
|
359
|
+
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(InfoAuthenticationService, [{
|
|
360
|
+
type: Injectable,
|
|
361
|
+
args: [{
|
|
362
|
+
providedIn: 'root'
|
|
363
|
+
}]
|
|
364
|
+
}], function () { return [{ type: i1.Router }, { type: i2.HttpClient }, { type: i3.InfoSessionModel }, { type: i4.InfoPlatformModel }, { type: i5.InfoDataService }, { type: i6.MatDialog }, { type: i7.Utilities }, { type: i8.InfoTranslateService }, { type: i9.Title }]; }, null); })();
|
|
365
|
+
export class RefreshSessionTimeModalComponent {
|
|
366
|
+
_ref;
|
|
367
|
+
time = 15;
|
|
368
|
+
interval;
|
|
369
|
+
constructor(_ref) {
|
|
370
|
+
this._ref = _ref;
|
|
371
|
+
}
|
|
372
|
+
ngOnInit() {
|
|
373
|
+
clearInterval(this.interval);
|
|
374
|
+
this.interval = setInterval(() => {
|
|
375
|
+
if (this.time > 0)
|
|
376
|
+
this.time--;
|
|
377
|
+
else {
|
|
378
|
+
this.ativo(false);
|
|
379
|
+
clearInterval(this.interval);
|
|
380
|
+
}
|
|
381
|
+
}, 1000);
|
|
382
|
+
}
|
|
383
|
+
ativo(ativo) {
|
|
384
|
+
this._ref.close({ modalAction: ativo ? InfoModalAction.Yes : InfoModalAction.No });
|
|
385
|
+
}
|
|
386
|
+
/** @nocollapse */ static ɵfac = function RefreshSessionTimeModalComponent_Factory(t) { return new (t || RefreshSessionTimeModalComponent)(i0.ɵɵdirectiveInject(i6.MatDialogRef)); };
|
|
387
|
+
/** @nocollapse */ static ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: RefreshSessionTimeModalComponent, selectors: [["ng-component"]], decls: 5, vars: 7, consts: [["modaltitle", "Inatividade", "labelsubmit", "Sim", 3, "labelcancel", "onsave"], [2, "font-size", "130%"]], template: function RefreshSessionTimeModalComponent_Template(rf, ctx) { if (rf & 1) {
|
|
388
|
+
i0.ɵɵelementStart(0, "info-modal", 0);
|
|
389
|
+
i0.ɵɵlistener("onsave", function RefreshSessionTimeModalComponent_Template_info_modal_onsave_0_listener() { return ctx.ativo(true); });
|
|
390
|
+
i0.ɵɵpipe(1, "translate");
|
|
391
|
+
i0.ɵɵelementStart(2, "label", 1);
|
|
392
|
+
i0.ɵɵtext(3);
|
|
393
|
+
i0.ɵɵpipe(4, "translate");
|
|
394
|
+
i0.ɵɵelementEnd()();
|
|
395
|
+
} if (rf & 2) {
|
|
396
|
+
i0.ɵɵpropertyInterpolate2("labelcancel", "(", ctx.time, ") ", i0.ɵɵpipeBind1(1, 3, "Nao"), "");
|
|
397
|
+
i0.ɵɵadvance(3);
|
|
398
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 5, "VoceAindaEstaUtilizandoPlataforma"));
|
|
399
|
+
} }, dependencies: [i10.InfoModalComponent, i11.InfoTranslatePipe], encapsulation: 2 });
|
|
400
|
+
}
|
|
401
|
+
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(RefreshSessionTimeModalComponent, [{
|
|
402
|
+
type: Component,
|
|
403
|
+
args: [{
|
|
404
|
+
template: `
|
|
405
|
+
<info-modal modaltitle="Inatividade" (onsave)="ativo(true)" labelsubmit="Sim" labelcancel="({{ time }}) {{ 'Nao' | translate }}">
|
|
406
|
+
<label style="font-size:130%">{{ 'VoceAindaEstaUtilizandoPlataforma' | translate }}</label>
|
|
407
|
+
</info-modal>
|
|
408
|
+
`
|
|
409
|
+
}]
|
|
410
|
+
}], function () { return [{ type: i6.MatDialogRef }]; }, null); })();
|
|
411
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aGVudGljYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2luZm8tbGlicmFyeS9zcmMvc2VydmljZS9hdXRoZW50aWNhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFBNEQsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkcsT0FBTyxFQUFFLFVBQVUsRUFBcUIsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsVUFBVSxFQUFtQixFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDMUMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7Ozs7Ozs7OztBQUsvQyxNQUFNLE9BQU8seUJBQXlCO0lBSWQ7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFD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L2NvcmUnO1xyXG5pbXBvcnQgeyBDYW5BY3RpdmF0ZSwgUm91dGVyU3RhdGVTbmFwc2hvdCwgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIE9ic2VydmFibGVJbnB1dCwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWFwLCBjYXRjaEVycm9yLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEluZm9TZXNzaW9uTW9kZWwgfSBmcm9tICcuLi9tb2RlbC9zZXNzaW9uLm1vZGVsJztcclxuaW1wb3J0IHsgSW5mb1BsYXRmb3JtTW9kZWwgfSBmcm9tICcuLi9tb2RlbC9wbGF0Zm9ybS5tb2RlbCc7XHJcbmltcG9ydCB7IEluZm9Mb2dpbk1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvbG9naW4ubW9kZWwnO1xyXG5pbXBvcnQgeyBJbmZvRGF0YVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL2RhdGEuc2VydmljZSc7XHJcbmltcG9ydCB7IEluZm9Gb3JtUHJvcE1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvZm9ybS1wcm9wLm1vZGVsJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBJbmZvTW9kYWxBY3Rpb24gfSBmcm9tICcuLi9lbnVtJztcclxuaW1wb3J0IHsgVGl0bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgSW5mb1RyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL3RyYW5zbGF0ZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVXRpbGl0aWVzIH0gZnJvbSAnLi4vdXRpbHMvdXRpbGl0aWVzJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgSW5mb0F1dGhlbnRpY2F0aW9uU2VydmljZSBpbXBsZW1lbnRzIENhbkFjdGl2YXRlIHtcclxuICAgIHByaXZhdGUgX3Nlc3Npb25UaW1lSW50ZXJ2YWw7XHJcbiAgICBwcml2YXRlIF9zZXNzaW9uQWN0aXZlOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9yb3V0ZXI6IFJvdXRlciwgXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIF9odHRwOiBIdHRwQ2xpZW50LCBcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgX3Nlc3NhbzogSW5mb1Nlc3Npb25Nb2RlbCwgXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIF9wbGF0YWZvcm1hOiBJbmZvUGxhdGZvcm1Nb2RlbCxcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgX2RhdGFTZXJ2aWNlOiBJbmZvRGF0YVNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIF9tb2RhbDogTWF0RGlhbG9nLCBcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgX3V0aWxpdGllczogVXRpbGl0aWVzLCBcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgX3RyYW5zbGF0ZTogSW5mb1RyYW5zbGF0ZVNlcnZpY2UsIFxyXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBfdGl0bGU6IFRpdGxlKSB7IH1cclxuXHJcbiAgICBnZXRTZXNzYW8oKTogSW5mb1Nlc3Npb25Nb2RlbHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2Vzc2FvO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFBsYXRmb3JtKCk6IEluZm9QbGF0Zm9ybU1vZGVsIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcGxhdGFmb3JtYTtcclxuICAgIH1cclxuXHJcbiAgICBjYW5BY3RpdmF0ZShhY3RpdmF0ZWRSb3V0ZVNuYXBzaG90OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCByb3V0ZXJTdGF0ZVNuYXBzaG90OiBSb3V0ZXJTdGF0ZVNuYXBzaG90KTogT2JzZXJ2YWJsZTxib29sZWFuPiB8IGJvb2xlYW4ge1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuaXNMb2dnZWQoKSB8fCAhdGhpcy5fc2Vzc2lvbkFjdGl2ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ291dCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHVybCA9IGFjdGl2YXRlZFJvdXRlU25hcHNob3QuZGF0YVsnVVJMJ10gfHwgcm91dGVyU3RhdGVTbmFwc2hvdC51cmw7XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hTZXNzaW9uVGltZSgpOyAgICAgICAgICAgIFxyXG4gICAgICAgIH0sIDEwMDApO1xyXG5cclxuICAgICAgICB0aGlzLmRlZmluZVBhZ2luYUF0aXZhKHVybCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFBlcm1pc3Npb24odXJsLCB0cnVlKVxyXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVybCA9PSAnLycpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmhhc1Blcm1pc3Npb24odXJsKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGVCeVVybCgncGVybWlzc2lvbicpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cmwuaW5kZXhPZignbm92bycpID4gLTEgJiYgIXRoaXMuaGFzUGVybWlzc2lvbih1cmwsICduZXcnKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGVCeVVybCgncGVybWlzc2lvbicpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cmwuaW5kZXhPZigndmlzdWFsaXphcicpIDwgLTEgJiYgYWN0aXZhdGVkUm91dGVTbmFwc2hvdC5wYXJhbU1hcC5nZXQoJ2lkJykgIT0gbnVsbCAmJiAhdGhpcy5oYXNQZXJtaXNzaW9uKHVybCwgJ2VkaXQnKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGVCeVVybCgncGVybWlzc2lvbicpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSA0MDEpIHRoaXMubG9nb3V0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgKSkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKGFzeW5jIHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwZXJtaXNzYW8gPSBhY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LmRhdGFbJ1Blcm1pc3NhbyddO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGVybWlzc2FvKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSAocGVybWlzc2FvWzJdIHx8ICcnKS5yZXBsYWNlKFJlZ0V4cCgvXFx7KC4qPylcXH0vLCAnZycpLCAoXywgcCkgPT4gYWN0aXZhdGVkUm91dGVTbmFwc2hvdC5wYXJhbXNbcF0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gYXdhaXQgdGhpcy5fZGF0YVNlcnZpY2UuZ2V0KHBlcm1pc3Nhb1swXSwgcGVybWlzc2FvWzFdLCBwYXJhbXMpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyLnN1Y2Nlc3MgfHwgci5kYXRhICE9IHRydWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlQnlVcmwoJ3Blcm1pc3Npb24nKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlzTG9nZ2VkKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5fdXRpbGl0aWVzLmdldExvY2FsU3RvcmFnZSh0aGlzLl9wbGF0YWZvcm1hLlRva2VuS2V5KSAhPSBudWxsKTtcclxuICAgIH1cclxuXHJcblx0cmVmcmVzaFNlc3Npb25UaW1lKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fc2Vzc2lvbkFjdGl2ZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBjbGVhckludGVydmFsKHRoaXMuX3Nlc3Npb25UaW1lSW50ZXJ2YWwpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fc2Vzc2FvLlRlbXBvSW5hdGl2aWRhZGUgPT0gbnVsbCB8fCB0aGlzLl9zZXNzYW8uVGVtcG9JbmF0aXZpZGFkZSA8PSAwKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgXHJcbiAgICAgICAgbGV0IHRlbXBvU2Vzc2FvID0gdGhpcy5fc2Vzc2FvLlRlbXBvSW5hdGl2aWRhZGU7XHJcbiAgICAgICAgdGhpcy5fdXRpbGl0aWVzLnNldExvY2FsU3RvcmFnZSgnbXMnLCBuZXcgRGF0ZSgpLnZhbHVlT2YoKS50b1N0cmluZygpKTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLl9zZXNzaW9uVGltZUludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgaWYgKHRlbXBvU2Vzc2FvID4gMCkgIHtcclxuICAgICAgICAgICAgICAgIHRlbXBvU2Vzc2FvLS07XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGxldCB0ZW1wb1Jlc3RhbnRlID0gTWF0aC5yb3VuZCh0aGlzLl9zZXNzYW8uVGVtcG9JbmF0aXZpZGFkZSAtICgobmV3IERhdGUoKS52YWx1ZU9mKCkgLSBwYXJzZUludCh0aGlzLl91dGlsaXRpZXMuZ2V0TG9jYWxTdG9yYWdlKCdtcycpKSkgLyAxMDAwKSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWlzTmFOKHRlbXBvUmVzdGFudGUpICYmIHRlbXBvUmVzdGFudGUgPiAwKXtcclxuICAgICAgICAgICAgICAgIHRlbXBvU2Vzc2FvID0gdGVtcG9SZXN0YW50ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9zZXNzaW9uVGltZUludGVydmFsKTtcclxuICAgICAgICAgICAgdGhpcy5fc2Vzc2lvbkFjdGl2ZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgaWYgKGlzTmFOKHRlbXBvUmVzdGFudGUpKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dvdXQoKTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBlbHNlIHRoaXMuc2hvd01lc3NhZ2UoKTtcclxuICAgICAgICB9LCAxMDAwKTtcclxuXHR9XHJcblxyXG4gICAgc2hvd01lc3NhZ2UoKXtcclxuICAgICAgICBsZXQgcmVmID0gdGhpcy5fbW9kYWwub3BlbihSZWZyZXNoU2Vzc2lvblRpbWVNb2RhbENvbXBvbmVudCwge1xyXG4gICAgICAgICAgICBkYXRhOiBudWxsLFxyXG4gICAgICAgICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXHJcbiAgICAgICAgICAgIHdpZHRoOiAnNTAwcHgnXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocjogSW5mb0Zvcm1Qcm9wTW9kZWwpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGlmIChyICE9IG51bGwgJiYgKHIubW9kYWxBY3Rpb24gPT0gSW5mb01vZGFsQWN0aW9uLlllcyB8fCAodGhpcy5fc2Vzc2FvLlRlbXBvSW5hdGl2aWRhZGUgLSAoKG5ldyBEYXRlKCkudmFsdWVPZigpIC0gcGFyc2VJbnQodGhpcy5fdXRpbGl0aWVzLmdldExvY2FsU3RvcmFnZSgnbXMnKSkpIC8gMTAwMCkpID4gMCkpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2Vzc2lvbkFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hTZXNzaW9uVGltZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBlbHNlIHRoaXMubG9nb3V0KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgbG9naW4odXN1YXJpbzogc3RyaW5nLCBzZW5oYTogc3RyaW5nLCByZUNhcHRjaGFUb2tlbjogc3RyaW5nID0gbnVsbCwgY29kaWdvMkZBOiBzdHJpbmcgPSBudWxsKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgICB0aGlzLnJlbW92ZVNlc3NhbygpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cFxyXG4gICAgICAgICAgICAgICAgICAgLnBvc3QodGhpcy5fcGxhdGFmb3JtYS5Db25maWcud2ViYXBpVXJsICsgJ2NlbnRyb2NvbnRyb2xlL3VzdWFyaW8vYXV0ZW50aWNhcicsIHRoaXMuX3V0aWxpdGllcy5qc29uVG9FbmNyeXB0KHsgVXN1YXJpbzogdXN1YXJpbywgU2VuaGE6IHNlbmhhLCBSZUNhcHRjaGFUb2tlbjogcmVDYXB0Y2hhVG9rZW4sIENvZGlnbzJGQTogY29kaWdvMkZBIH0pLCB7IGhlYWRlcnM6IHRoaXMuX2RhdGFTZXJ2aWNlLmdldEhlYWRlckRlZmF1bHQoKSwgcmVzcG9uc2VUeXBlOiAndGV4dCcgfSlcclxuICAgICAgICAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgIG1hcCgocnM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgOiBhbnkgPSB0aGlzLl91dGlsaXRpZXMuZGVjcnlwdFRvSnNvbihycyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLlN1Y2Nlc3MgJiYgci5EYXRhICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91dGlsaXRpZXMuc2V0TG9jYWxTdG9yYWdlKHRoaXMuX3BsYXRhZm9ybWEuVG9rZW5LZXksIHIuRGF0YS5Ub2tlbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5mb0xvZ2luTW9kZWwoci5TdWNjZXNzLCByLk1lc3NhZ2VzLCByLkRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGU6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLmVycm9ySGFuZGxpbmcoZSkpXHJcbiAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0cm9jYXJFbXByZXNhKHVzdWFyaW86IHN0cmluZywgZW1wcmVzYUlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwXHJcbiAgICAgICAgICAgICAgICAgICAucG9zdCh0aGlzLl9wbGF0YWZvcm1hLkNvbmZpZy53ZWJhcGlVcmwgKyAnY2VudHJvY29udHJvbGUvdXN1YXJpby90cm9jYXJlbXByZXNhJywgdGhpcy5fdXRpbGl0aWVzLmpzb25Ub0VuY3J5cHQoeyBFbXByZXNhSWQ6IGVtcHJlc2FJZCB9KSwgeyBoZWFkZXJzOiB0aGlzLl9kYXRhU2VydmljZS5nZXRIZWFkZXJUb2tlbigpLCByZXNwb25zZVR5cGU6ICd0ZXh0JyB9KVxyXG4gICAgICAgICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgbWFwKChyczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA6IGFueSA9IHRoaXMuX3V0aWxpdGllcy5kZWNyeXB0VG9Kc29uKHJzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIuU3VjY2VzcyAmJiByLkRhdGEgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91dGlsaXRpZXMuc2V0TG9jYWxTdG9yYWdlKHRoaXMuX3BsYXRhZm9ybWEuVG9rZW5LZXksIHIuRGF0YSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEluZm9Mb2dpbk1vZGVsKHIuU3VjY2Vzcywgci5NZXNzYWdlcywgci5EYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICAgICAgICBjYXRjaEVycm9yKChlOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5lcnJvckhhbmRsaW5nKGUpKVxyXG4gICAgICAgICAgICAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICB0cm9jYXJVbmlkYWRlKHVzdWFyaW86IHN0cmluZywgZW1wcmVzYUlkOiBudW1iZXIsIHVuaWRhZGVJZDogbnVtYmVyKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cFxyXG4gICAgICAgICAgICAgICAgICAgLnBvc3QodGhpcy5fcGxhdGFmb3JtYS5Db25maWcud2ViYXBpVXJsICsgJ2NlbnRyb2NvbnRyb2xlL3VzdWFyaW8vdHJvY2FydW5pZGFkZScsIHRoaXMuX3V0aWxpdGllcy5qc29uVG9FbmNyeXB0KHsgRW1wcmVzYUlkOiBlbXByZXNhSWQsIFVuaWRhZGVJZDogdW5pZGFkZUlkIH0pLCB7IGhlYWRlcnM6IHRoaXMuX2RhdGFTZXJ2aWNlLmdldEhlYWRlclRva2VuKCksIHJlc3BvbnNlVHlwZTogJ3RleHQnIH0pXHJcbiAgICAgICAgICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICBtYXAoKHJzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByIDogYW55ID0gdGhpcy5fdXRpbGl0aWVzLmRlY3J5cHRUb0pzb24ocnMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoci5TdWNjZXNzICYmIHIuRGF0YSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3V0aWxpdGllcy5zZXRMb2NhbFN0b3JhZ2UodGhpcy5fcGxhdGFmb3JtYS5Ub2tlbktleSwgci5EYXRhKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5mb0xvZ2luTW9kZWwoci5TdWNjZXNzLCByLk1lc3NhZ2VzLCByLkRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGU6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLmVycm9ySGFuZGxpbmcoZSkpXHJcbiAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHRyb2NhckNsaWVudGUodXN1YXJpbzogc3RyaW5nLCBjbGllbnRlSWQ6IG51bWJlcik6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHBcclxuICAgICAgICAgICAgICAgICAgIC5wb3N0KHRoaXMuX3BsYXRhZm9ybWEuQ29uZmlnLndlYmFwaVVybCArICdjZW50cm9jb250cm9sZS91c3VhcmlvL3Ryb2NhcmNsaWVudGUnLCB0aGlzLl91dGlsaXRpZXMuanNvblRvRW5jcnlwdCh7IENsaWVudGVJZDogY2xpZW50ZUlkIH0pLCB7IGhlYWRlcnM6IHRoaXMuX2RhdGFTZXJ2aWNlLmdldEhlYWRlclRva2VuKCksIHJlc3BvbnNlVHlwZTogJ3RleHQnIH0pXHJcbiAgICAgICAgICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICBtYXAoKHJzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByIDogYW55ID0gdGhpcy5fdXRpbGl0aWVzLmRlY3J5cHRUb0pzb24ocnMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoci5TdWNjZXNzICYmIHIuRGF0YSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3V0aWxpdGllcy5zZXRMb2NhbFN0b3JhZ2UodGhpcy5fcGxhdGFmb3JtYS5Ub2tlbktleSwgci5EYXRhKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5mb0xvZ2luTW9kZWwoci5TdWNjZXNzLCByLk1lc3NhZ2VzLCByLkRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGU6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLmVycm9ySGFuZGxpbmcoZSkpXHJcbiAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBjbG9uYXIodXN1YXJpbzogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cFxyXG4gICAgICAgICAgICAgICAgICAgLnBvc3QodGhpcy5fcGxhdGFmb3JtYS5Db25maWcud2ViYXBpVXJsICsgJ2NlbnRyb2NvbnRyb2xlL3VzdWFyaW8vY2xvbmFyJywgdGhpcy5fdXRpbGl0aWVzLmpzb25Ub0VuY3J5cHQoeyBVc3VhcmlvOiB1c3VhcmlvIH0pLCB7IGhlYWRlcnM6IHRoaXMuX2RhdGFTZXJ2aWNlLmdldEhlYWRlclRva2VuKCksIHJlc3BvbnNlVHlwZTogJ3RleHQnIH0pXHJcbiAgICAgICAgICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICBtYXAoKHJzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByIDogYW55ID0gdGhpcy5fdXRpbGl0aWVzLmRlY3J5cHRUb0pzb24ocnMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoci5TdWNjZXNzICYmIHIuRGF0YSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3V0aWxpdGllcy5zZXRMb2NhbFN0b3JhZ2UodGhpcy5fcGxhdGFmb3JtYS5Ub2tlbktleSwgci5EYXRhKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5mb0xvZ2luTW9kZWwoci5TdWNjZXNzLCByLk1lc3NhZ2VzLCByLkRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGU6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLmVycm9ySGFuZGxpbmcoZSkpXHJcbiAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGxvZ291dCgpIHtcclxuICAgICAgICBpZiAodGhpcy5pc0xvZ2dlZCgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2h0dHAucG9zdCh0aGlzLl9wbGF0YWZvcm1hLkNvbmZpZy53ZWJhcGlVcmwgKyAnY2VudHJvY29udHJvbGUvdXN1YXJpby9Mb2dvdXQnLCBudWxsLCB7IGhlYWRlcnM6IHRoaXMuX2RhdGFTZXJ2aWNlLmdldEhlYWRlclRva2VuKCksIHJlc3BvbnNlVHlwZTogJ3RleHQnIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZVNlc3NhbygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZUJ5VXJsKCdsb2dpbicpLnRoZW4ociA9PiB7IGxvY2F0aW9uLnJlbG9hZCgpOyB9KTsgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZVNlc3NhbygpO1xyXG4gICAgICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGVCeVVybCgnbG9naW4nKS50aGVuKHIgPT4geyBsb2NhdGlvbi5yZWxvYWQoKTsgfSk7ICAgICAgICAgICAgICBcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UGVybWlzc2lvbnModXJsOiBzdHJpbmcsIGxvZ0F0aXZpZGFkZTogYm9vbGVhbiA9IGZhbHNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cFxyXG4gICAgICAgICAgICAgICAgICAgLmdldCh0aGlzLl9wbGF0YWZvcm1hLkNvbmZpZy53ZWJhcGlVcmwgKyAnY2VudHJvY29udHJvbGUvdXN1YXJpby9nZXRwZXJtaXNzYW8/JyArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLl91dGlsaXRpZXMuanNvblRvRW5jcnlwdCgndXJsPScgKyB1cmwgKyAnJmxvZ2F0aXZpZGFkZT0nICsgbG9nQXRpdmlkYWRlLnRvU3RyaW5nKCkpKSwgeyBoZWFkZXJzOiB0aGlzLl9kYXRhU2VydmljZS5nZXRIZWFkZXJUb2tlbigpLCByZXNwb25zZVR5cGU6ICd0ZXh0JyB9KVxyXG4gICAgICAgICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgocnM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgOiBhbnkgPSB0aGlzLl91dGlsaXRpZXMuZGVjcnlwdFRvSnNvbihycyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEluZm9Mb2dpbk1vZGVsKHIuU3VjY2Vzcywgci5NZXNzYWdlcywgci5EYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZTogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuZXJyb3JIYW5kbGluZyhlKSlcclxuICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VHJvY2FTZW5oYShtb2RlbDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cFxyXG4gICAgICAgICAgICAgICAgICAgLnBvc3QodGhpcy5fcGxhdGFmb3JtYS5Db25maWcud2ViYXBpVXJsICsgJ2NlbnRyb2NvbnRyb2xlL3VzdWFyaW8vVHJvY2FyU2VuaGEnLCB0aGlzLl91dGlsaXRpZXMuanNvblRvRW5jcnlwdChtb2RlbCksIHsgaGVhZGVyczogdGhpcy5fZGF0YVNlcnZpY2UuZ2V0SGVhZGVyVG9rZW4oKSwgcmVzcG9uc2VUeXBlOiAndGV4dCcgfSlcclxuICAgICAgICAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAoKHJzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByIDogYW55ID0gdGhpcy5fdXRpbGl0aWVzLmRlY3J5cHRUb0pzb24ocnMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbmZvTG9naW5Nb2RlbChyLlN1Y2Nlc3MsIHIuTWVzc2FnZXMsIHIuRGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGU6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLmVycm9ySGFuZGxpbmcoZSkpXHJcbiAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFJlY3VwZXJhclNlbmhhKG1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwXHJcbiAgICAgICAgICAgICAgICAgICAucG9zdCh0aGlzLl9wbGF0YWZvcm1hLkNvbmZpZy53ZWJhcGlVcmwgKyAnY2VudHJvY29udHJvbGUvdXN1YXJpby9SZWN1cGVyYXJTZW5oYScsIHRoaXMuX3V0aWxpdGllcy5qc29uVG9FbmNyeXB0KG1vZGVsKSwgeyBoZWFkZXJzOiB0aGlzLl9kYXRhU2VydmljZS5nZXRIZWFkZXJUb2tlbigpLCByZXNwb25zZVR5cGU6ICd0ZXh0JyB9KVxyXG4gICAgICAgICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgocnM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgOiBhbnkgPSB0aGlzLl91dGlsaXRpZXMuZGVjcnlwdFRvSnNvbihycyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEluZm9Mb2dpbk1vZGVsKHIuU3VjY2Vzcywgci5NZXNzYWdlcywgci5EYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZTogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuZXJyb3JIYW5kbGluZyhlKSlcclxuICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0UmVzZXRhclNlbmhhKG1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwXHJcbiAgICAgICAgICAgICAgICAgICAucG9zdCh0aGlzLl9wbGF0YWZvcm1hLkNvbmZpZy53ZWJhcGlVcmwgKyAnY2VudHJvY29udHJvbGUvdXN1YXJpby9SZXNldGFyU2VuaGEnLCB0aGlzLl91dGlsaXRpZXMuanNvblRvRW5jcnlwdChtb2RlbCksIHsgaGVhZGVyczogdGhpcy5fZGF0YVNlcnZpY2UuZ2V0SGVhZGVyRGVmYXVsdCgpLCByZXNwb25zZVR5cGU6ICd0ZXh0JyB9KVxyXG4gICAgICAgICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgocnM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgOiBhbnkgPSB0aGlzLl91dGlsaXRpZXMuZGVjcnlwdFRvSnNvbihycyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEluZm9Mb2dpbk1vZGVsKHIuU3VjY2Vzcywgci5NZXNzYWdlcywgci5EYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZTogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuZXJyb3JIYW5kbGluZyhlKSlcclxuICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TG9naW5SZXNvdXJjZXMoKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cFxyXG4gICAgICAgICAgICAgICAgICAgLmdldCh0aGlzLl9wbGF0YWZvcm1hLkNvbmZpZy53ZWJhcGlVcmwgKyAnY2VudHJvY29udHJvbGUvYXBwL0dldExvZ2luUmVzb3VyY2VzJywgeyBoZWFkZXJzOiB0aGlzLl9kYXRhU2VydmljZS5nZXRIZWFkZXJEZWZhdWx0KCksIHJlc3BvbnNlVHlwZTogJ3RleHQnIH0pXHJcbiAgICAgICAgICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwKChyczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA6IGFueSA9IHRoaXMuX3V0aWxpdGllcy5kZWNyeXB0VG9Kc29uKHJzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5mb0xvZ2luTW9kZWwoci5TdWNjZXNzLCByLk1lc3NhZ2VzLCByLkRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICAgICAgICBjYXRjaEVycm9yKChlOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5lcnJvckhhbmRsaW5nKGUpKVxyXG4gICAgICAgICAgICAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBoYXNQZXJtaXNzaW9uKHVybDogc3RyaW5nLCBrZXlGdW5jdGlvbjogc3RyaW5nID0gJ3ZpZXcnKTogYm9vbGVhbiB7XHJcblxyXG4gICAgICAgIGlmICh1cmwgPT0gJy8nICYmIGtleUZ1bmN0aW9uID09ICd2aWV3JylcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICAgIGxldCB1cmxHZW5lcmljYSA9IHRoaXMuZ2V0VXJsR2VuZXJpY2EodXJsKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2Vzc2FvLlBlcm1pc3NvZXMuc29tZShzID0+IHMuVVJMID09IHVybEdlbmVyaWNhICYmIHMuQ2hhdmVGdW5jaW9uYWxpZGFkZSA9PSBrZXlGdW5jdGlvbiAmJiBzLkFjZXNzbyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UGVybWlzc2lvbih1cmw6IHN0cmluZywgbG9nQXRpdmlkYWRlOiBib29sZWFuID0gZmFsc2UpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuXHJcbiAgICAgICAgbGV0IHVybEdlbmVyaWNhID0gdGhpcy5nZXRVcmxHZW5lcmljYSh1cmwpO1xyXG4gICAgICAgIGxldCBjb250ZW1VcmwgPSB0aGlzLl9zZXNzYW8uUGVybWlzc29lcy5zb21lKHMgPT4gcy5VUkwgPT0gdXJsR2VuZXJpY2EpO1xyXG4gICAgICAgIGlmIChjb250ZW1VcmwpIHtcclxuICAgICAgICAgICAgaWYgKGxvZ0F0aXZpZGFkZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhU2Vzc2FvKHVybCkucGlwZShtYXAocmV0ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXJldC5zdWNjZXNzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ291dCgpO1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHsgXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSA0MDEpIHRoaXMubG9nb3V0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uIChvYnNlcnZlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGVybWlzc2lvbnModXJsR2VuZXJpY2EsIGxvZ0F0aXZpZGFkZSkucGlwZShtYXAocmV0ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXQuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXQuZGF0YSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nb3V0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0LmRhdGEuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Nlc3Nhby5QZXJtaXNzb2VzLmZpbHRlcihzID0+IHMuVVJMID09IGl0ZW0uVVJMICYmIHMuQ2hhdmVGdW5jaW9uYWxpZGFkZSA9PSBpdGVtLkNoYXZlRnVuY2lvbmFsaWRhZGUpLmxlbmd0aCA9PSAwKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2Vzc2FvLlBlcm1pc3NvZXMucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0LmRhdGEuc29tZShzID0+IHMuVVJMID09IHVybEdlbmVyaWNhKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl91dGlsaXRpZXMuc2V0TG9jYWxTdG9yYWdlKHRoaXMuX3BsYXRhZm9ybWEuU2Vzc2lvbktleSwgSlNPTi5zdHJpbmdpZnkodGhpcy5fc2Vzc2FvKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHsgXHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IDQwMSkgdGhpcy5sb2dvdXQoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvZih0cnVlKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB2YWxpZGFTZXNzYW8odXJsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwXHJcbiAgICAgICAgICAgIC5nZXQodGhpcy5fcGxhdGFmb3JtYS5Db25maWcud2ViYXBpVXJsICsgJ2NlbnRyb2NvbnRyb2xlL3VzdWFyaW8vdmFsaWRhc2Vzc2FvPycgKyBlbmNvZGVVUklDb21wb25lbnQodGhpcy5fdXRpbGl0aWVzLmpzb25Ub0VuY3J5cHQoJ3VybD0nICsgdXJsKSksIHsgaGVhZGVyczogdGhpcy5fZGF0YVNlcnZpY2UuZ2V0SGVhZGVyVG9rZW4oKSwgcmVzcG9uc2VUeXBlOiAndGV4dCcgfSlcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBtYXAoKHJzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgciA6IGFueSA9IHRoaXMuX3V0aWxpdGllcy5kZWNyeXB0VG9Kc29uKHJzKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEluZm9Mb2dpbk1vZGVsKHIgPT09IHRydWUsICcnLCByKTtcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZTogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuZXJyb3JIYW5kbGluZyhlKSlcclxuICAgICAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVTZXNzYW8oKSB7XHJcbiAgICAgICAgT2JqZWN0LmtleXMobG9jYWxTdG9yYWdlKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoJ0Rhc2hib2FyZCcpICYmICFrZXkuaW5jbHVkZXMoJ2NvbHMnKSAmJiAha2V5LmluY2x1ZGVzKCdfJykpIFxyXG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBkZWZpbmVQYWdpbmFBdGl2YSh1cmwpIHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3BsYXRhZm9ybWEuTWVudSA9PSBudWxsIHx8IHVybCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BsYXRhZm9ybWEuUGFnaW5hQXRpdmEgPSBudWxsO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgYXV4OiBzdHJpbmdbXSA9IHVybC5zdWJzdHJpbmcoMSkucmVwbGFjZSgvLS9nLCAnJykudG9Mb3dlckNhc2UoKS5zcGxpdCgnLycpO1xyXG4gICAgICAgIGxldCB0aXR1bG9NZW51OiBzdHJpbmcgPSBhdXgubGVuZ3RoID4gMCA/IGF1eFswXS50b1N0cmluZygpIDogdXJsO1xyXG4gICAgICAgIGxldCBwYXJhbWV0cm9zVXJsOiBzdHJpbmdbXSA9IHVybC5zcGxpdCgnLycpLnNsaWNlKDIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0aXR1bG9NZW51LmluZGV4T2YoJ25pY2lvJykgPiAtMSlcclxuICAgICAgICAgICAgdGhpcy5fcGxhdGFmb3JtYS5QYWdpbmFBdGl2YSA9IHsgSWNvbmU6ICd3aWRnZXRzJywgVGl0dWxvOiAnSW5pY2lvJyB9OyAgXHJcblxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgaXRlbTogYW55ID0gdGhpcy5fcGxhdGFmb3JtYS5NZW51LmZpbHRlcihtID0+IG0uVGl0bGUudG9Mb3dlckNhc2UoKS5pbmRleE9mKHRpdHVsb01lbnUpID4gLTEpO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICAgIGxldCBzdWJUaXR1bG8gPSBcIlwiO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtZXRyb3NVcmwubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0d1aWQocGFyYW1ldHJvc1VybFtpXSkgJiYgaXNOYU4ocGFyc2VGbG9hdChwYXJhbWV0cm9zVXJsW2ldKSkpXHJcbiAgICAgICAgICAgICAgICAgICAgc3ViVGl0dWxvICs9IFwiIC0gXCIgKyB0aGlzLl90cmFuc2xhdGUudHJhbnNsYXRlKHRoaXMudG9QYXNjYWxDYXNlKHBhcmFtZXRyb3NVcmxbaV0pKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCAmJiBpdGVtLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3BsYXRhZm9ybWEuUGFnaW5hQXRpdmEgPSB7IEljb25lOiBpdGVtWzBdLkljb24sIFRpdHVsbzogaXRlbVswXS5UaXRsZSB9O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdGl0bGUuc2V0VGl0bGUoYCR7dGhpcy5fdHJhbnNsYXRlLnRyYW5zbGF0ZSh0aGlzLl9wbGF0YWZvcm1hLkNvbmZpZy50aXRsZSB8fCBcIlBsYXRhZm9ybWFcIil9IC0gJHt0aGlzLl90cmFuc2xhdGUudHJhbnNsYXRlKGl0ZW1bMF0uVGl0bGUpfWArIHN1YlRpdHVsbyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGVsc2UgdGhpcy5fcGxhdGFmb3JtYS5QYWdpbmFBdGl2YSA9IHsgSWNvbmU6ICdzZWN1cml0eScsIFRpdHVsbzogdGhpcy5fcGxhdGFmb3JtYS5Db25maWcudGl0bGUgfHwgJ1BsYXRhZm9ybWEnIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFVybEdlbmVyaWNhKHVybDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgcmV0b3JubyA9IFwiXCI7XHJcbiAgICAgICAgbGV0IHVybFBhcnRzOiBzdHJpbmdbXSA9IHVybC5zcGxpdCgnLycpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdXJsUGFydHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKCFpc05hTihwYXJzZUZsb2F0KHVybFBhcnRzW2ldKSkgfHwgdGhpcy5pc0d1aWQodXJsUGFydHNbaV0pIHx8IHVybFBhcnRzW2ldLnRvTG93ZXJDYXNlKCkgPT0gJ25vdm8nKVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHJldG9ybm8gKz0gJy8nICsgdXJsUGFydHNbaV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXRvcm5vLnN1YnN0cmluZygxKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGVycm9ySGFuZGxpbmcoZTogSHR0cEVycm9yUmVzcG9uc2UpOiBPYnNlcnZhYmxlSW5wdXQ8SW5mb0xvZ2luTW9kZWw+IHtcclxuICAgICAgICBpZiAoZS5zdGF0dXMgPT0gNDAxKSBcclxuICAgICAgICAgICAgdGhpcy5sb2dvdXQoKTtcclxuXHJcbiAgICAgICAgZWxzZSBpZiAoZS5zdGF0dXMgPT0gNTAwKVxyXG4gICAgICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGVCeVVybCgnNTAwJyk7XHJcblxyXG4gICAgICAgIGVsc2UgaWYgKGUuZXJyb3IgIT0gbnVsbCAmJiBlLmVycm9yLmVycm9yX2Rlc2NyaXB0aW9uICE9IG51bGwpXHJcbiAgICAgICAgICAgIHJldHVybiBvZihuZXcgSW5mb0xvZ2luTW9kZWwoZmFsc2UsIGUuZXJyb3IuZXJyb3JfZGVzY3JpcHRpb24pKTtcclxuXHJcbiAgICAgICAgZWxzZSByZXR1cm4gb2YobmV3IEluZm9Mb2dpbk1vZGVsKGZhbHNlLCAnSG91dmUgdW0gcHJvYmxlbWEgZSBuw6NvIGZvaSBwb3Nzw612ZWwgY29uZWN0YXInKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpc0d1aWQodmFsdWUpIDogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICh2YWx1ZSB8fCAnJykubWF0Y2goJ15bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kJykgIT09IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB0b1Bhc2NhbENhc2UodmFsdWU6IHN0cmluZyk6IHN0cmluZ3tcclxuICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvKF5cXHd8LVxcdykvZywgKHcxLCB3MiwgaSkgPT4gaSA9PSAwID8gdzEudG9VcHBlckNhc2UoKSA6IHcxWzFdLnRvVXBwZXJDYXNlKCkpO1xyXG4gICAgfVxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHR0ZW1wbGF0ZTogYFxyXG5cdFx0PGluZm8tbW9kYWwgbW9kYWx0aXRsZT1cIkluYXRpdmlkYWRlXCIgKG9uc2F2ZSk9XCJhdGl2byh0cnVlKVwiIGxhYmVsc3VibWl0PVwiU2ltXCIgbGFiZWxjYW5jZWw9XCIoe3sgdGltZSB9fSkge3sgJ05hbycgfCB0cmFuc2xhdGUgfX1cIj5cclxuICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOjEzMCVcIj57eyAnVm9jZUFpbmRhRXN0YVV0aWxpemFuZG9QbGF0YWZvcm1hJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcblx0XHQ8L2luZm8tbW9kYWw+XHJcblx0YFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUmVmcmVzaFNlc3Npb25UaW1lTW9kYWxDb21wb25lbnQge1xyXG4gICAgdGltZSA9IDE1O1xyXG4gICAgaW50ZXJ2YWw7XHJcblxyXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgX3JlZjogTWF0RGlhbG9nUmVmPFJlZnJlc2hTZXNzaW9uVGltZU1vZGFsQ29tcG9uZW50PikgeyB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLmludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy50aW1lID4gMClcclxuICAgICAgICAgICAgICAgIHRoaXMudGltZS0tO1xyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXRpdm8oZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIDEwMDApO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBhdGl2byhhdGl2bzogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuX3JlZi5jbG9zZSh7IG1vZGFsQWN0aW9uOiBhdGl2byA/IEluZm9Nb2RhbEFjdGlvbi5ZZXMgOiBJbmZvTW9kYWxBY3Rpb24uTm8gfSk7XHJcbiAgICB9XHJcbn0iXX0=
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { Injectable } from "@angular/core";
|
|
2
|
+
import { HttpClient } from "@angular/common/http";
|
|
3
|
+
import { InfoPlatformModel } from "../model/platform.model";
|
|
4
|
+
import { InfoThemeService } from "./theme.service";
|
|
5
|
+
import { Utilities } from "../utils/utilities";
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@angular/common/http";
|
|
8
|
+
import * as i2 from "../model/platform.model";
|
|
9
|
+
import * as i3 from "./theme.service";
|
|
10
|
+
import * as i4 from "../utils/utilities";
|
|
11
|
+
export class InfoConfigurationService {
|
|
12
|
+
_http;
|
|
13
|
+
_plataforma;
|
|
14
|
+
_themeService;
|
|
15
|
+
_utilities;
|
|
16
|
+
constructor(_http, _plataforma, _themeService, _utilities) {
|
|
17
|
+
this._http = _http;
|
|
18
|
+
this._plataforma = _plataforma;
|
|
19
|
+
this._themeService = _themeService;
|
|
20
|
+
this._utilities = _utilities;
|
|
21
|
+
}
|
|
22
|
+
initialize() {
|
|
23
|
+
return new Promise((r, e) => {
|
|
24
|
+
this._http
|
|
25
|
+
.get('config.json')
|
|
26
|
+
.subscribe(config => {
|
|
27
|
+
let activeTheme = sessionStorage.getItem('at') || localStorage.getItem('at');
|
|
28
|
+
let menuMin = sessionStorage.getItem('mm') || localStorage.getItem('mm');
|
|
29
|
+
let prime = sessionStorage.getItem('mp') || localStorage.getItem('mp');
|
|
30
|
+
this._plataforma.Config = config;
|
|
31
|
+
this._plataforma.ConfigIsNull = false;
|
|
32
|
+
if (this._plataforma.Config.ux == null || this._plataforma.Config.ux == undefined)
|
|
33
|
+
this._plataforma.Config.ux = 2;
|
|
34
|
+
if (this._plataforma.Config.ux == 2)
|
|
35
|
+
menuMin = 'false';
|
|
36
|
+
const urlEmbedded = '/assets/embedded/temas.css';
|
|
37
|
+
const httpEmbedded = new XMLHttpRequest();
|
|
38
|
+
httpEmbedded.open('GET', urlEmbedded, false);
|
|
39
|
+
httpEmbedded.send();
|
|
40
|
+
if (httpEmbedded.status >= 200 && httpEmbedded.status < 300) {
|
|
41
|
+
const cssText = httpEmbedded.responseText || '';
|
|
42
|
+
if (cssText && cssText.trim().length > 0) {
|
|
43
|
+
const style = document.createElement('style');
|
|
44
|
+
style.setAttribute('data-source', urlEmbedded);
|
|
45
|
+
style.textContent = cssText;
|
|
46
|
+
document.head.appendChild(style);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
this.loadCSSAPI();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
this.loadCSSAPI();
|
|
54
|
+
}
|
|
55
|
+
if (this._plataforma.Config.style != null) {
|
|
56
|
+
var cssClient = document.createElement('link');
|
|
57
|
+
cssClient.href = '/assets/' + this._plataforma.Config.style + '/style.css';
|
|
58
|
+
cssClient.type = 'text/css';
|
|
59
|
+
cssClient.rel = 'stylesheet';
|
|
60
|
+
document.head.appendChild(cssClient);
|
|
61
|
+
}
|
|
62
|
+
if (activeTheme == null || activeTheme == undefined)
|
|
63
|
+
activeTheme = `_${this._plataforma.Config.theme}-theme`;
|
|
64
|
+
this._themeService.setTheme(activeTheme || 'default-theme');
|
|
65
|
+
this._themeService.setMenuMin(menuMin == 'true');
|
|
66
|
+
this._themeService.setModePrime(prime == 'true');
|
|
67
|
+
r(config);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
loadCSSAPI() {
|
|
72
|
+
const xmlhttp = new XMLHttpRequest();
|
|
73
|
+
xmlhttp.open("GET", this._plataforma.Config.webapiUrl.replace(/\/api\/$/ig, '') + '/layout/temas.css', false);
|
|
74
|
+
if (this._plataforma.Config.headers != null)
|
|
75
|
+
this._plataforma.Config.headers.forEach(header => xmlhttp.setRequestHeader(header.key, header.value));
|
|
76
|
+
xmlhttp.send();
|
|
77
|
+
var cssFile = document.createElement('style');
|
|
78
|
+
cssFile.innerHTML = this._utilities.descriptografar(xmlhttp.responseText);
|
|
79
|
+
document.head.appendChild(cssFile);
|
|
80
|
+
}
|
|
81
|
+
/** @nocollapse */ static ɵfac = function InfoConfigurationService_Factory(t) { return new (t || InfoConfigurationService)(i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(i2.InfoPlatformModel), i0.ɵɵinject(i3.InfoThemeService), i0.ɵɵinject(i4.Utilities)); };
|
|
82
|
+
/** @nocollapse */ static ɵprov = /** @pureOrBreakMyCode */ i0.ɵɵdefineInjectable({ token: InfoConfigurationService, factory: InfoConfigurationService.ɵfac, providedIn: 'root' });
|
|
83
|
+
}
|
|
84
|
+
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(InfoConfigurationService, [{
|
|
85
|
+
type: Injectable,
|
|
86
|
+
args: [{
|
|
87
|
+
providedIn: 'root'
|
|
88
|
+
}]
|
|
89
|
+
}], function () { return [{ type: i1.HttpClient }, { type: i2.InfoPlatformModel }, { type: i3.InfoThemeService }, { type: i4.Utilities }]; }, null); })();
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvaW5mby1saWJyYXJ5L3NyYy9zZXJ2aWNlL2NvbmZpZ3VyYXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU1RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7OztBQUsvQyxNQUFNLE9BQU8sd0JBQXdCO0lBRWI7SUFBMkI7SUFBd0M7SUFBeUM7SUFBaEksWUFBb0IsS0FBaUIsRUFBVSxXQUE4QixFQUFVLGFBQStCLEVBQVUsVUFBcUI7UUFBakksVUFBSyxHQUFMLEtBQUssQ0FBWTtRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFtQjtRQUFVLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQUFVLGVBQVUsR0FBVixVQUFVLENBQVc7SUFBSSxDQUFDO0lBRTFKLFVBQVU7UUFFTixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxLQUFLO2lCQUNMLEdBQUcsQ0FBcUIsYUFBYSxDQUFDO2lCQUN0QyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ2hCLElBQUksV0FBVyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDN0UsSUFBSSxPQUFPLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxZ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ZCxDQUFDLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFVBQVU7UUFDTixNQUFNLE9BQU8sR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ3JDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxHQUFHLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzlHLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLElBQUk7WUFDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNmLElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUMsT0FBTyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUUsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdkMsQ0FBQztxR0F4RVEsd0JBQXdCOytGQUF4Qix3QkFBd0IsV0FBeEIsd0JBQXdCLG1CQUZyQixNQUFNOzt1RkFFVCx3QkFBd0I7Y0FIcEMsVUFBVTtlQUFDO2dCQUNSLFVBQVUsRUFBRSxNQUFNO2FBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuaW1wb3J0IHsgSW5mb1BsYXRmb3JtTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvcGxhdGZvcm0ubW9kZWxcIjtcclxuaW1wb3J0IHsgSW5mb0FwcENvbmZpZ01vZGVsIH0gZnJvbSBcIi4uL21vZGVsL2FwcC1jb25maWcubW9kZWxcIjtcclxuaW1wb3J0IHsgSW5mb1RoZW1lU2VydmljZSB9IGZyb20gXCIuL3RoZW1lLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgVXRpbGl0aWVzIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxpdGllc1wiO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBJbmZvQ29uZmlndXJhdGlvblNlcnZpY2Uge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2h0dHA6IEh0dHBDbGllbnQsIHByaXZhdGUgX3BsYXRhZm9ybWE6IEluZm9QbGF0Zm9ybU1vZGVsLCBwcml2YXRlIF90aGVtZVNlcnZpY2U6IEluZm9UaGVtZVNlcnZpY2UsIHByaXZhdGUgX3V0aWxpdGllczogVXRpbGl0aWVzKSB7IH1cclxuXHJcbiAgICBpbml0aWFsaXplKCk6IFByb21pc2U8SW5mb0FwcENvbmZpZ01vZGVsPiB7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgociwgZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9odHRwXHJcbiAgICAgICAgICAgICAgICAuZ2V0PEluZm9BcHBDb25maWdNb2RlbD4oJ2NvbmZpZy5qc29uJylcclxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoY29uZmlnID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgYWN0aXZlVGhlbWUgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdhdCcpIHx8IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdhdCcpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBtZW51TWluID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnbW0nKSB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbW0nKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJpbWUgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdtcCcpIHx8IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdtcCcpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wbGF0YWZvcm1hLkNvbmZpZyA9IGNvbmZpZzsgXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGxhdGFmb3JtYS5Db25maWdJc051bGwgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3BsYXRhZm9ybWEuQ29uZmlnLnV4ID09IG51bGwgfHwgdGhpcy5fcGxhdGFmb3JtYS5Db25maWcudXggPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wbGF0YWZvcm1hLkNvbmZpZy51eCA9IDI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wbGF0YWZvcm1hLkNvbmZpZy51eCA9PSAyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZW51TWluID0gJ2ZhbHNlJztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsRW1iZWRkZWQgPSAnL2Fzc2V0cy9lbWJlZGRlZC90ZW1hcy5jc3MnO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGh0dHBFbWJlZGRlZCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGh0dHBFbWJlZGRlZC5vcGVuKCdHRVQnLCB1cmxFbWJlZGRlZCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGh0dHBFbWJlZGRlZC5zZW5kKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChodHRwRW1iZWRkZWQuc3RhdHVzID49IDIwMCAmJiBodHRwRW1iZWRkZWQuc3RhdHVzIDwgMzAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNzc1RleHQgPSBodHRwRW1iZWRkZWQucmVzcG9uc2VUZXh0IHx8ICcnO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNzc1RleHQgJiYgY3NzVGV4dC50cmltKCkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuc2V0QXR0cmlidXRlKCdkYXRhLXNvdXJjZScsIHVybEVtYmVkZGVkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLnRleHRDb250ZW50ID0gY3NzVGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkQ1NTQVBJKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRDU1NBUEkoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3BsYXRhZm9ybWEuQ29uZmlnLnN0eWxlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNzc0NsaWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3NzQ2xpZW50LmhyZWYgPSAnL2Fzc2V0cy8nICsgdGhpcy5fcGxhdGFmb3JtYS5Db25maWcuc3R5bGUgKyAnL3N0eWxlLmNzcyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNzc0NsaWVudC50eXBlID0gJ3RleHQvY3NzJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3NzQ2xpZW50LnJlbCA9ICdzdHlsZXNoZWV0JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjc3NDbGllbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVRoZW1lID09IG51bGwgfHwgYWN0aXZlVGhlbWUgPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUaGVtZSA9IGBfJHt0aGlzLl9wbGF0YWZvcm1hLkNvbmZpZy50aGVtZX0tdGhlbWVgO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90aGVtZVNlcnZpY2Uuc2V0VGhlbWUoYWN0aXZlVGhlbWUgfHwgJ2RlZmF1bHQtdGhlbWUnKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90aGVtZVNlcnZpY2Uuc2V0TWVudU1pbihtZW51TWluID09ICd0cnVlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGhlbWVTZXJ2aWNlLnNldE1vZGVQcmltZShwcmltZSA9PSAndHJ1ZScpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByKGNvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkQ1NTQVBJKCkge1xyXG4gICAgICAgIGNvbnN0IHhtbGh0dHAgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcclxuICAgICAgICB4bWxodHRwLm9wZW4oXCJHRVRcIiwgdGhpcy5fcGxhdGFmb3JtYS5Db25maWcud2ViYXBpVXJsLnJlcGxhY2UoL1xcL2FwaVxcLyQvaWcsICcnKSArICcvbGF5b3V0L3RlbWFzLmNzcycsIGZhbHNlKTtcclxuICAgICAgICBpZiAodGhpcy5fcGxhdGFmb3JtYS5Db25maWcuaGVhZGVycyAhPSBudWxsKVxyXG4gICAgICAgICAgICB0aGlzLl9wbGF0YWZvcm1hLkNvbmZpZy5oZWFkZXJzLmZvckVhY2goaGVhZGVyID0+IHhtbGh0dHAuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIua2V5LCBoZWFkZXIudmFsdWUpKTtcclxuICAgICAgICB4bWxodHRwLnNlbmQoKTtcclxuICAgICAgICB2YXIgY3NzRmlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XHJcbiAgICAgICAgY3NzRmlsZS5pbm5lckhUTUwgPSB0aGlzLl91dGlsaXRpZXMuZGVzY3JpcHRvZ3JhZmFyKHhtbGh0dHAucmVzcG9uc2VUZXh0KTsgICBcclxuICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGNzc0ZpbGUpO1xyXG4gICAgfVxyXG59Il19
|