sf-crud 12.0.5 → 12.1.0
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/bundles/sf-crud.umd.js +2563 -1306
- package/bundles/sf-crud.umd.js.map +1 -1
- package/esm2015/lib/components/control/control.component.js +285 -73
- package/esm2015/lib/components/file-upload/file-upload.component.js +143 -0
- package/esm2015/lib/components/form/form.component.js +267 -0
- package/esm2015/lib/components/registro/registro.component.js +507 -407
- package/esm2015/lib/components/step/step.component.js +79 -0
- package/esm2015/lib/components/tablero/tablero.component.js +87 -27
- package/esm2015/lib/sf-crud.module.js +27 -15
- package/esm2015/lib/sf-crud.routing.module.js +23 -0
- package/esm2015/lib/sf-crud.service.js +486 -12
- package/esm2015/lib/shared/models/Conditions.model.js +81 -0
- package/esm2015/lib/shared/models/Empresa.model.js +2 -0
- package/esm2015/lib/shared/models/Reason.model.js +7 -0
- package/esm2015/lib/shared/models/crud-config.model.js +36 -13
- package/esm2015/lib/shared/models/shema.model.js +5 -1
- package/esm2015/lib/shared/services/general.service.js +41 -17
- package/esm2015/lib/shared/services/notification.service.js +83 -0
- package/esm2015/lib/shared/services/step.service.js +65 -0
- package/esm2015/public-api.js +7 -1
- package/fesm2015/sf-crud.js +2194 -1151
- package/fesm2015/sf-crud.js.map +1 -1
- package/lib/components/control/control.component.d.ts +39 -10
- package/lib/components/file-upload/file-upload.component.d.ts +34 -0
- package/lib/components/form/form.component.d.ts +58 -0
- package/lib/components/registro/registro.component.d.ts +81 -54
- package/lib/components/step/step.component.d.ts +27 -0
- package/lib/components/tablero/tablero.component.d.ts +15 -5
- package/lib/sf-crud.module.d.ts +80 -76
- package/lib/sf-crud.routing.module.d.ts +7 -0
- package/lib/sf-crud.service.d.ts +115 -5
- package/lib/shared/models/Conditions.model.d.ts +32 -0
- package/lib/shared/models/Empresa.model.d.ts +11 -0
- package/lib/shared/models/Reason.model.d.ts +5 -0
- package/lib/shared/models/crud-config.model.d.ts +76 -24
- package/lib/shared/models/shema.model.d.ts +27 -0
- package/lib/shared/services/general.service.d.ts +8 -1
- package/lib/shared/services/notification.service.d.ts +27 -0
- package/lib/shared/services/step.service.d.ts +27 -0
- package/package.json +9 -2
- package/public-api.d.ts +6 -0
- package/esm2015/lib/components/registro-child/registro-child.component.js +0 -348
- package/esm2015/lib/components/registro-detalle/registro-detalle.component.js +0 -232
- package/esm2015/lib/shared/models/data-temp-crud.model.js +0 -6
- package/lib/components/registro-child/registro-child.component.d.ts +0 -48
- package/lib/components/registro-detalle/registro-detalle.component.d.ts +0 -36
- package/lib/shared/models/data-temp-crud.model.d.ts +0 -4
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { RouterModule } from '@angular/router';
|
|
3
|
+
import { FormComponent } from './components/form/form.component';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/router";
|
|
6
|
+
const routes = [
|
|
7
|
+
{ path: ':idStep',
|
|
8
|
+
component: FormComponent
|
|
9
|
+
}
|
|
10
|
+
];
|
|
11
|
+
export class SfCrudRoutingModule {
|
|
12
|
+
}
|
|
13
|
+
SfCrudRoutingModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: SfCrudRoutingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
14
|
+
SfCrudRoutingModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: SfCrudRoutingModule, imports: [i1.RouterModule], exports: [RouterModule] });
|
|
15
|
+
SfCrudRoutingModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: SfCrudRoutingModule, imports: [[RouterModule.forChild(routes)], RouterModule] });
|
|
16
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: SfCrudRoutingModule, decorators: [{
|
|
17
|
+
type: NgModule,
|
|
18
|
+
args: [{
|
|
19
|
+
imports: [RouterModule.forChild(routes)],
|
|
20
|
+
exports: [RouterModule]
|
|
21
|
+
}]
|
|
22
|
+
}] });
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2YtY3J1ZC5yb3V0aW5nLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3NmLWNydWQvc3JjL2xpYi9zZi1jcnVkLnJvdXRpbmcubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBVSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7O0FBSWpFLE1BQU0sTUFBTSxHQUFXO0lBQ2pCLEVBQUMsSUFBSSxFQUFFLFNBQVM7UUFDaEIsU0FBUyxFQUFFLGFBQWE7S0FDdkI7Q0FFTixDQUFDO0FBTUYsTUFBTSxPQUFPLG1CQUFtQjs7aUhBQW5CLG1CQUFtQjtrSEFBbkIsbUJBQW1CLHdDQUZwQixZQUFZO2tIQUVYLG1CQUFtQixZQUhyQixDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFDOUIsWUFBWTs0RkFFWCxtQkFBbUI7a0JBSi9CLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDeEMsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO2lCQUN4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJvdXRlck1vZHVsZSwgUm91dGVzIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgRm9ybUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9mb3JtL2Zvcm0uY29tcG9uZW50JztcclxuaW1wb3J0IHsgUmVnaXN0cm9Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvcmVnaXN0cm8vcmVnaXN0cm8uY29tcG9uZW50JztcclxuXHJcblxyXG5jb25zdCByb3V0ZXM6IFJvdXRlcyA9IFtcclxuICAgICAge3BhdGg6ICc6aWRTdGVwJyxcclxuICAgICAgY29tcG9uZW50OiBGb3JtQ29tcG9uZW50XHJcbiAgICAgIH1cclxuICBcclxuXTtcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgaW1wb3J0czogW1JvdXRlck1vZHVsZS5mb3JDaGlsZChyb3V0ZXMpXSxcclxuICBleHBvcnRzOiBbUm91dGVyTW9kdWxlXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgU2ZDcnVkUm91dGluZ01vZHVsZSB7IH0iXX0=
|
|
@@ -1,20 +1,487 @@
|
|
|
1
1
|
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as jsonpath from 'jsonpath';
|
|
3
|
+
import { BehaviorSubject } from 'rxjs';
|
|
4
|
+
import { Condition } from './shared/models/Conditions.model';
|
|
5
|
+
import * as moment from 'moment';
|
|
2
6
|
import * as i0 from "@angular/core";
|
|
3
7
|
export class SfCrudService {
|
|
4
8
|
constructor() {
|
|
5
|
-
this.
|
|
9
|
+
this._esquemas = [];
|
|
10
|
+
this._uiEsquemas = [];
|
|
11
|
+
this._registros = [];
|
|
12
|
+
this._answers = [];
|
|
13
|
+
this._dataSet = [];
|
|
14
|
+
this._ids = [];
|
|
15
|
+
this.__index = 0;
|
|
16
|
+
this._configEmpresa = undefined;
|
|
17
|
+
this._trx = [];
|
|
18
|
+
this._changeData = new BehaviorSubject(undefined);
|
|
19
|
+
this.__formLoading = new BehaviorSubject({ inProgress: false, target: undefined });
|
|
20
|
+
this._crudLoaded = new BehaviorSubject(false);
|
|
6
21
|
}
|
|
7
|
-
|
|
8
|
-
this.
|
|
9
|
-
|
|
22
|
+
get user() {
|
|
23
|
+
if (!this._tfmUser)
|
|
24
|
+
this._tfmUser = JSON.parse(localStorage.getItem("oSessionTFM"));
|
|
25
|
+
return this._tfmUser;
|
|
10
26
|
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
sessionStorage.removeItem('dataTemp');
|
|
14
|
-
return dataTemp ? JSON.parse(dataTemp) : [];
|
|
27
|
+
get currentOperation() {
|
|
28
|
+
return this.registros[this.index].operations.find(x => x.type.startsWith(this._trx[this.index]));
|
|
15
29
|
}
|
|
16
|
-
|
|
17
|
-
|
|
30
|
+
set environment(val) {
|
|
31
|
+
this.jsonConfig = val;
|
|
32
|
+
}
|
|
33
|
+
get environment() {
|
|
34
|
+
return this.jsonConfig;
|
|
35
|
+
}
|
|
36
|
+
get onCrudLoaded$() {
|
|
37
|
+
return this._crudLoaded.asObservable();
|
|
38
|
+
}
|
|
39
|
+
set crudLoaded(value) {
|
|
40
|
+
this._crudLoaded.next(value);
|
|
41
|
+
}
|
|
42
|
+
get dataExt() {
|
|
43
|
+
return this._dataExt;
|
|
44
|
+
}
|
|
45
|
+
set dataExt(val) {
|
|
46
|
+
this._dataExt = val;
|
|
47
|
+
}
|
|
48
|
+
get index() {
|
|
49
|
+
return this.__index;
|
|
50
|
+
}
|
|
51
|
+
set index(value) {
|
|
52
|
+
this.__index = value;
|
|
53
|
+
}
|
|
54
|
+
get idKatios() {
|
|
55
|
+
return this._idKatios;
|
|
56
|
+
}
|
|
57
|
+
set idKatios(value) {
|
|
58
|
+
var _a;
|
|
59
|
+
this._idKatios = (_a = value === null || value === void 0 ? void 0 : value.trim()) === null || _a === void 0 ? void 0 : _a.toUpperCase();
|
|
60
|
+
}
|
|
61
|
+
get configEmpresa() {
|
|
62
|
+
return this._configEmpresa;
|
|
63
|
+
}
|
|
64
|
+
set configEmpresa(value) {
|
|
65
|
+
this._configEmpresa = value;
|
|
66
|
+
}
|
|
67
|
+
getURL(operation, index = undefined, id = undefined) {
|
|
68
|
+
let url = operation.url || `${this.jsonConfig[operation.server]}${operation.endpoint}`;
|
|
69
|
+
url = url.replace('@idKatios', this.idKatios);
|
|
70
|
+
if (id)
|
|
71
|
+
url = url.replace('@id', id);
|
|
72
|
+
url = this.applyStringKeys(url, index);
|
|
73
|
+
return url;
|
|
74
|
+
}
|
|
75
|
+
getRegistro(index) {
|
|
76
|
+
return this._registros[index];
|
|
77
|
+
}
|
|
78
|
+
getId(index) {
|
|
79
|
+
return this._ids.length == 1 ? this._ids[0] : this._ids[index];
|
|
80
|
+
}
|
|
81
|
+
get dataset() {
|
|
82
|
+
return this._dataSet;
|
|
83
|
+
}
|
|
84
|
+
getData(index) {
|
|
85
|
+
return this._dataSet.length == 1 ? this._dataSet[0] : this._dataSet[index];
|
|
86
|
+
}
|
|
87
|
+
getTrx(index) {
|
|
88
|
+
return this._trx[index];
|
|
89
|
+
}
|
|
90
|
+
get totalData() {
|
|
91
|
+
return this._dataSet.length;
|
|
92
|
+
}
|
|
93
|
+
get totalRegistros() {
|
|
94
|
+
return this._registros.length;
|
|
95
|
+
}
|
|
96
|
+
get uiEsquemas() {
|
|
97
|
+
return this._uiEsquemas;
|
|
98
|
+
}
|
|
99
|
+
getEsquema(index) {
|
|
100
|
+
return this._esquemas.length == 1 ? this._esquemas[0] : this._esquemas[index];
|
|
101
|
+
}
|
|
102
|
+
reset() {
|
|
103
|
+
this._ids = [];
|
|
104
|
+
this._dataSet = [];
|
|
105
|
+
}
|
|
106
|
+
getURLRedirect(initialURL) {
|
|
107
|
+
let finalUrl = this.applyStringKeys(initialURL, undefined);
|
|
108
|
+
finalUrl = finalUrl.replace("@URLBASE", window.location.href.split('?')[0]);
|
|
109
|
+
return finalUrl;
|
|
110
|
+
}
|
|
111
|
+
getUIEsquema(index) {
|
|
112
|
+
return this._uiEsquemas[index];
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* using data, apply each keyEsquema over each dataset indicated on indexData of each key
|
|
116
|
+
* @param data
|
|
117
|
+
* @param content
|
|
118
|
+
* @returns
|
|
119
|
+
*/
|
|
120
|
+
applyObjectKeys(data, keysEsquema, registro) {
|
|
121
|
+
var _a;
|
|
122
|
+
for (let i = 0; i < keysEsquema.length; i++) {
|
|
123
|
+
const opt = keysEsquema[i];
|
|
124
|
+
let value = undefined;
|
|
125
|
+
if (opt.indexKey) {
|
|
126
|
+
let keyFound = ((_a = registro.keys) !== null && _a !== void 0 ? _a : [undefined])[opt.indexKey];
|
|
127
|
+
this.applyKey(keyFound, registro, data);
|
|
128
|
+
}
|
|
129
|
+
else if (opt.indexData !== undefined) {
|
|
130
|
+
if (opt.isArray) {
|
|
131
|
+
value = jsonpath.query(data, opt.scope);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
value = jsonpath.query(data, opt.scope)[0];
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (opt.key == "$")
|
|
138
|
+
Object.assign(this._dataSet[opt.indexData], value);
|
|
139
|
+
else if (opt.key && ((value !== undefined && value !== null) || (opt.canBeValueUndefined === undefined || opt.canBeValueUndefined === true)))
|
|
140
|
+
jsonpath.value(this._dataSet[opt.indexData], opt.key, value);
|
|
141
|
+
}
|
|
142
|
+
return data;
|
|
143
|
+
}
|
|
144
|
+
applyKey(key, registro, data) {
|
|
145
|
+
var _a, _b, _c, _d;
|
|
146
|
+
if (key === null || key === void 0 ? void 0 : key.overrideControl) {
|
|
147
|
+
let newVal = undefined;
|
|
148
|
+
let esquemaToSet = this.getControl(key.scope, this.esquemas[(_a = key.indexData) !== null && _a !== void 0 ? _a : this.index]);
|
|
149
|
+
if (!esquemaToSet) {
|
|
150
|
+
console.error({ message: "la key esta mal configurada", data: key });
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
let completed = this.isConditionsCompleted((_b = key.overrideControl.conditions) !== null && _b !== void 0 ? _b : [], registro.conditions || [], data);
|
|
154
|
+
if ((_c = key.overrideControl) === null || _c === void 0 ? void 0 : _c.property)
|
|
155
|
+
jsonpath.value(esquemaToSet, key.overrideControl.property, completed ? key.overrideControl.value : key.overrideControl.elseValue);
|
|
156
|
+
if (completed && key.overrideControl.newPropertyValue !== undefined) {
|
|
157
|
+
if (key.overrideControl.newPropertyValue == 'RESETOBJECT')
|
|
158
|
+
newVal = this.createObject(esquemaToSet, this.currentOperation);
|
|
159
|
+
else
|
|
160
|
+
newVal = key.overrideControl.newPropertyValue;
|
|
161
|
+
}
|
|
162
|
+
else if (!completed && key.overrideControl.elseNewPropertyValue !== undefined) {
|
|
163
|
+
if (key.overrideControl.elseNewPropertyValue == 'RESETOBJECT')
|
|
164
|
+
newVal = this.createObject(esquemaToSet, this.currentOperation);
|
|
165
|
+
else
|
|
166
|
+
newVal = key.overrideControl.elseNewPropertyValue;
|
|
167
|
+
}
|
|
168
|
+
if (newVal !== undefined)
|
|
169
|
+
jsonpath.value(this._dataSet[(_d = key.indexData) !== null && _d !== void 0 ? _d : this.index], key.scope.replaceAll('..properties', ''), newVal);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Validate conditions on datas
|
|
174
|
+
* @param conditions
|
|
175
|
+
* @param index
|
|
176
|
+
*/
|
|
177
|
+
isConditionsCompleted(iConditions, conditions, data) {
|
|
178
|
+
let cumple = true;
|
|
179
|
+
iConditions.forEach(iCond => {
|
|
180
|
+
const c = Condition.instanceContidion(iCond, conditions);
|
|
181
|
+
let dataToEvaluate = c.indexData !== undefined ? this._dataSet[c.indexData] : data;
|
|
182
|
+
if (!c.isValid(dataToEvaluate))
|
|
183
|
+
cumple = false;
|
|
184
|
+
});
|
|
185
|
+
return cumple;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Apply each key from register over string content
|
|
189
|
+
* @param indexRegistro
|
|
190
|
+
* @param content
|
|
191
|
+
* @returns
|
|
192
|
+
*/
|
|
193
|
+
applyStringKeys(content, index = undefined) {
|
|
194
|
+
var _a;
|
|
195
|
+
let indexRegistro = index || this.__index;
|
|
196
|
+
(_a = this._registros[indexRegistro].keys) === null || _a === void 0 ? void 0 : _a.forEach((opt) => {
|
|
197
|
+
let value;
|
|
198
|
+
if (opt.indexId !== undefined && opt.indexId < this._ids.length)
|
|
199
|
+
value = this._ids[opt.indexId];
|
|
200
|
+
else if (opt.indexAnswer !== undefined && opt.indexAnswer < this._answers.length)
|
|
201
|
+
value = jsonpath.query(this._answers[opt.indexAnswer], opt.scope)[0];
|
|
202
|
+
else if (opt.indexData !== undefined)
|
|
203
|
+
value = jsonpath.query(this._dataSet[opt.indexData], opt.scope)[0];
|
|
204
|
+
if (value === null)
|
|
205
|
+
value = '';
|
|
206
|
+
content = content.replace(opt.key, value);
|
|
207
|
+
});
|
|
208
|
+
return content;
|
|
209
|
+
}
|
|
210
|
+
validateDataLocal(operation, data, conditions) {
|
|
211
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
212
|
+
const err = [];
|
|
213
|
+
//Solo si se cumple la condicion, se valida
|
|
214
|
+
(_b = (_a = operation.validations) === null || _a === void 0 ? void 0 : _a.required) === null || _b === void 0 ? void 0 : _b.forEach(x => {
|
|
215
|
+
const cumpleCond = x.conditions ? this.isConditionsCompleted(x.conditions, conditions, data) : true;
|
|
216
|
+
if (cumpleCond && (!jsonpath.query(data, x.field)[0] ||
|
|
217
|
+
(Array.isArray(jsonpath.query(data, x.field)[0]) && jsonpath.query(data, x.field)[0].length == 0)))
|
|
218
|
+
err.push(x.message);
|
|
219
|
+
});
|
|
220
|
+
(_d = (_c = operation.validations) === null || _c === void 0 ? void 0 : _c.different) === null || _d === void 0 ? void 0 : _d.forEach(x => {
|
|
221
|
+
const cumpleCond = x.conditions ? this.isConditionsCompleted(x.conditions, conditions, data) : true;
|
|
222
|
+
if (cumpleCond && jsonpath.query(data, x.field)[0] === x.value)
|
|
223
|
+
err.push(x.message);
|
|
224
|
+
});
|
|
225
|
+
(_f = (_e = operation.validations) === null || _e === void 0 ? void 0 : _e.equals) === null || _f === void 0 ? void 0 : _f.forEach(x => {
|
|
226
|
+
const cumpleCond = x.conditions ? this.isConditionsCompleted(x.conditions, conditions, data) : true;
|
|
227
|
+
if (cumpleCond && jsonpath.query(data, x.field)[0] != x.value)
|
|
228
|
+
err.push(x.message);
|
|
229
|
+
});
|
|
230
|
+
(_h = (_g = operation.validations) === null || _g === void 0 ? void 0 : _g.operations) === null || _h === void 0 ? void 0 : _h.forEach((op) => {
|
|
231
|
+
switch (op.action) {
|
|
232
|
+
case 'sumArray':
|
|
233
|
+
const var1 = jsonpath.query(data, op.scope[0]).reduce((acc, cur) => acc += cur[op.key], 0);
|
|
234
|
+
const var2 = jsonpath.query(data, op.scope[1]).reduce((acc, cur) => acc += cur[op.key], 0);
|
|
235
|
+
if (var1 != var2)
|
|
236
|
+
err.push(op.message);
|
|
237
|
+
break;
|
|
238
|
+
default:
|
|
239
|
+
break;
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
return err;
|
|
243
|
+
}
|
|
244
|
+
set esquemas(esquemas) {
|
|
245
|
+
this._esquemas = esquemas;
|
|
246
|
+
}
|
|
247
|
+
get esquemas() {
|
|
248
|
+
return this._esquemas;
|
|
249
|
+
}
|
|
250
|
+
set ids(ids) {
|
|
251
|
+
this._ids = ids;
|
|
252
|
+
}
|
|
253
|
+
set uiEsquemas(uiEsquemas) {
|
|
254
|
+
this._uiEsquemas = uiEsquemas;
|
|
255
|
+
}
|
|
256
|
+
get registros() {
|
|
257
|
+
return this._registros;
|
|
258
|
+
}
|
|
259
|
+
set registros(registros) {
|
|
260
|
+
this._registros = registros;
|
|
261
|
+
}
|
|
262
|
+
setDataSet(data, index = undefined) {
|
|
263
|
+
index = index ? index : this.__index;
|
|
264
|
+
if (index >= this.totalData) {
|
|
265
|
+
this._dataSet.push(data);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
setTrx(trx, index) {
|
|
269
|
+
if (Array.isArray(trx))
|
|
270
|
+
this._trx = trx;
|
|
271
|
+
else if (index >= this._trx.length)
|
|
272
|
+
this._trx.push(trx);
|
|
273
|
+
else
|
|
274
|
+
this._trx[index] = trx;
|
|
275
|
+
}
|
|
276
|
+
setAnswers(answer, index) {
|
|
277
|
+
if (Array.isArray(answer))
|
|
278
|
+
this._answers = answer;
|
|
279
|
+
else {
|
|
280
|
+
if (index >= this._answers.length)
|
|
281
|
+
this._answers.push(answer);
|
|
282
|
+
else
|
|
283
|
+
this._answers[index] = answer;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
getControl(scope, esquema) {
|
|
287
|
+
return jsonpath.query(esquema, scope)[0];
|
|
288
|
+
}
|
|
289
|
+
getValue(scope, data) {
|
|
290
|
+
return jsonpath.query(data, scope.replaceAll('.properties', ''))[0];
|
|
291
|
+
}
|
|
292
|
+
createObject(esquema, operation) {
|
|
293
|
+
var _a;
|
|
294
|
+
const object = {};
|
|
295
|
+
switch (esquema.type) {
|
|
296
|
+
case 'numeric':
|
|
297
|
+
case 'string':
|
|
298
|
+
case 'date':
|
|
299
|
+
if (esquema.default && operation) {
|
|
300
|
+
return this.setDefaultValue(esquema.default, operation);
|
|
301
|
+
}
|
|
302
|
+
else
|
|
303
|
+
return (_a = esquema.default) !== null && _a !== void 0 ? _a : null;
|
|
304
|
+
case 'boolean':
|
|
305
|
+
return (esquema === null || esquema === void 0 ? void 0 : esquema.default) || false;
|
|
306
|
+
case 'array':
|
|
307
|
+
return [];
|
|
308
|
+
case 'file':
|
|
309
|
+
return null;
|
|
310
|
+
case 'object':
|
|
311
|
+
Object.getOwnPropertyNames(esquema === null || esquema === void 0 ? void 0 : esquema.properties).forEach(key => {
|
|
312
|
+
let aux = esquema === null || esquema === void 0 ? void 0 : esquema.properties[key];
|
|
313
|
+
if (aux)
|
|
314
|
+
object[key] = this.createObject(aux, operation);
|
|
315
|
+
});
|
|
316
|
+
return object;
|
|
317
|
+
default:
|
|
318
|
+
return null;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
getValueKey(key) {
|
|
322
|
+
let data;
|
|
323
|
+
switch ((key === null || key === void 0 ? void 0 : key.data) || 'externa') {
|
|
324
|
+
case "user":
|
|
325
|
+
data = this.user;
|
|
326
|
+
break;
|
|
327
|
+
default:
|
|
328
|
+
data = this.dataExt;
|
|
329
|
+
break;
|
|
330
|
+
}
|
|
331
|
+
if (data && key) {
|
|
332
|
+
const aux = jsonpath.query(data, key.scope);
|
|
333
|
+
if (aux.length == 0)
|
|
334
|
+
return undefined;
|
|
335
|
+
if (aux.length == 1)
|
|
336
|
+
return aux[0];
|
|
337
|
+
else
|
|
338
|
+
return aux;
|
|
339
|
+
}
|
|
340
|
+
return undefined;
|
|
341
|
+
}
|
|
342
|
+
setDefaultValue(value, operation) {
|
|
343
|
+
let data = null;
|
|
344
|
+
if (value.key && operation.keys) {
|
|
345
|
+
data = this.getValueKey(operation.keys.find(k => k.key == value.key));
|
|
346
|
+
value = data;
|
|
347
|
+
}
|
|
348
|
+
switch (value) {
|
|
349
|
+
case '@uactivo':
|
|
350
|
+
data = `${this.user.UsuarioSistema.TDOC}-${this.user.UsuarioSistema.NDOC}`;
|
|
351
|
+
break;
|
|
352
|
+
case '@tdocactivo':
|
|
353
|
+
data = this.user.UsuarioSistema.TDOC;
|
|
354
|
+
break;
|
|
355
|
+
case '@ndocactivo':
|
|
356
|
+
data = this.user.UsuarioSistema.NDOC;
|
|
357
|
+
break;
|
|
358
|
+
case '@hoy':
|
|
359
|
+
data = new Date();
|
|
360
|
+
break;
|
|
361
|
+
default:
|
|
362
|
+
data = value;
|
|
363
|
+
break;
|
|
364
|
+
}
|
|
365
|
+
return data;
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Validate if schema has pdfsign and it's signed, else return false
|
|
369
|
+
* @param index
|
|
370
|
+
* @returns
|
|
371
|
+
*/
|
|
372
|
+
isSignedPDF(index) {
|
|
373
|
+
return this._dataSet[index].signed;
|
|
374
|
+
}
|
|
375
|
+
get changeData$() {
|
|
376
|
+
return this._changeData.asObservable();
|
|
377
|
+
}
|
|
378
|
+
set changeData(value) {
|
|
379
|
+
this._changeData.next(value);
|
|
380
|
+
}
|
|
381
|
+
get formLoading$() {
|
|
382
|
+
return this.__formLoading.asObservable();
|
|
383
|
+
}
|
|
384
|
+
set formLoading(value) {
|
|
385
|
+
this.__formLoading.next(value);
|
|
386
|
+
}
|
|
387
|
+
loadSession() {
|
|
388
|
+
const existSession = localStorage.getItem("esquemas") !== null;
|
|
389
|
+
if (existSession) {
|
|
390
|
+
this._esquemas = JSON.parse(localStorage.getItem("esquemas"));
|
|
391
|
+
this._uiEsquemas = JSON.parse(localStorage.getItem("uiEsquemas"));
|
|
392
|
+
this._registros = JSON.parse(localStorage.getItem("registros"));
|
|
393
|
+
this._dataSet = JSON.parse(localStorage.getItem("dataSet"));
|
|
394
|
+
this._answers = JSON.parse(localStorage.getItem("answers"));
|
|
395
|
+
this._trx = JSON.parse(localStorage.getItem("trx"));
|
|
396
|
+
this.__index = +localStorage.getItem("index");
|
|
397
|
+
localStorage.clear();
|
|
398
|
+
}
|
|
399
|
+
return existSession;
|
|
400
|
+
}
|
|
401
|
+
get reasons() {
|
|
402
|
+
const reasonsStorage = localStorage.getItem("reasons");
|
|
403
|
+
if (reasonsStorage)
|
|
404
|
+
return JSON.parse(reasonsStorage);
|
|
405
|
+
return [];
|
|
406
|
+
}
|
|
407
|
+
saveProgress(reasons) {
|
|
408
|
+
localStorage.setItem("reasons", JSON.stringify(reasons));
|
|
409
|
+
localStorage.setItem("esquemas", JSON.stringify(this._esquemas));
|
|
410
|
+
localStorage.setItem("trx", JSON.stringify(this._trx));
|
|
411
|
+
localStorage.setItem("uiEsquemas", JSON.stringify(this._uiEsquemas));
|
|
412
|
+
localStorage.setItem("registros", JSON.stringify(this._registros));
|
|
413
|
+
localStorage.setItem("dataSet", JSON.stringify(this._dataSet));
|
|
414
|
+
localStorage.setItem("answers", JSON.stringify(this._answers));
|
|
415
|
+
localStorage.setItem("index", this.__index.toString());
|
|
416
|
+
}
|
|
417
|
+
redirectToInicio() {
|
|
418
|
+
window.location.href = window.location.href.split('?')[0];
|
|
419
|
+
window.location.reload();
|
|
420
|
+
}
|
|
421
|
+
applyValuesOnEvent(event, esquema, key, data) {
|
|
422
|
+
if (key) {
|
|
423
|
+
if (esquema.properties[key][event]) {
|
|
424
|
+
esquema.properties[key][event].forEach((value) => {
|
|
425
|
+
this.setValueEvent(data, value, esquema);
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
else {
|
|
430
|
+
for (const key in esquema.properties) {
|
|
431
|
+
if (esquema.properties[key][event]) {
|
|
432
|
+
esquema.properties[key][event].forEach((value) => {
|
|
433
|
+
this.setValueEvent(data, value, esquema);
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
setValueEvent(data, params, esquema) {
|
|
440
|
+
var _a;
|
|
441
|
+
let date = moment(new Date());
|
|
442
|
+
switch (params.op) {
|
|
443
|
+
case 'sum':
|
|
444
|
+
jsonpath.value(data, params.scope[1], jsonpath.query(data, params.scope[0]).reduce((acc, cur) => acc += (params === null || params === void 0 ? void 0 : params.key) ? cur[params.key] : cur, 0));
|
|
445
|
+
break;
|
|
446
|
+
case 'concat':
|
|
447
|
+
let array = [];
|
|
448
|
+
(_a = params === null || params === void 0 ? void 0 : params.key) === null || _a === void 0 ? void 0 : _a.reduce((acc, cur) => {
|
|
449
|
+
array.push(jsonpath.query(data, cur)[0]);
|
|
450
|
+
}, []);
|
|
451
|
+
if (params === null || params === void 0 ? void 0 : params.separator)
|
|
452
|
+
jsonpath.value(data, params.scope[0], array.join((params === null || params === void 0 ? void 0 : params.separator) || ' '));
|
|
453
|
+
break;
|
|
454
|
+
case 'enable':
|
|
455
|
+
jsonpath.value(esquema, params.scope[0], false);
|
|
456
|
+
break;
|
|
457
|
+
case 'disabled':
|
|
458
|
+
jsonpath.value(esquema, params.scope[0], true);
|
|
459
|
+
break;
|
|
460
|
+
case 'replace:endpoint':
|
|
461
|
+
jsonpath.value(esquema, params.scope[0], esquema.config.endpointtemp.replace(params.scope[1], jsonpath.query(data, `$..${params.key}`)));
|
|
462
|
+
break;
|
|
463
|
+
case 'setNull':
|
|
464
|
+
jsonpath.value(data, `$.${params.key}`, null);
|
|
465
|
+
break;
|
|
466
|
+
case 'datediff:years':
|
|
467
|
+
jsonpath.value(data, params.scope[0], date.diff(moment(jsonpath.query(data, params.scope[1])[0]), 'years'));
|
|
468
|
+
break;
|
|
469
|
+
case 'datediff:months':
|
|
470
|
+
jsonpath.value(data, params.scope[0], date.diff(moment(jsonpath.query(data, params.scope[1])[0]), 'months'));
|
|
471
|
+
break;
|
|
472
|
+
case 'datediff:weeks':
|
|
473
|
+
jsonpath.value(data, params.scope[0], date.diff(moment(jsonpath.query(data, params.scope[1])[0]), 'weeks'));
|
|
474
|
+
break;
|
|
475
|
+
case 'datediff:days':
|
|
476
|
+
jsonpath.value(data, params.scope[0], date.diff(moment(jsonpath.query(data, params.scope[1])[0]), 'days'));
|
|
477
|
+
break;
|
|
478
|
+
default:
|
|
479
|
+
break;
|
|
480
|
+
}
|
|
481
|
+
console.log('setValueEvent sale:');
|
|
482
|
+
console.log(data);
|
|
483
|
+
console.log(esquema);
|
|
484
|
+
console.log(params);
|
|
18
485
|
}
|
|
19
486
|
}
|
|
20
487
|
SfCrudService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: SfCrudService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
@@ -24,5 +491,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
|
|
|
24
491
|
args: [{
|
|
25
492
|
providedIn: 'root'
|
|
26
493
|
}]
|
|
27
|
-
}]
|
|
28
|
-
|
|
494
|
+
}] });
|
|
495
|
+
export class ChangeData {
|
|
496
|
+
constructor(value, scope, index) {
|
|
497
|
+
this.value = value;
|
|
498
|
+
this.scope = scope;
|
|
499
|
+
this.index = index;
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2YtY3J1ZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2YtY3J1ZC9zcmMvbGliL3NmLWNydWQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sS0FBSyxRQUFRLE1BQU0sVUFBVSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFJdkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRTdELE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDOztBQUtqQyxNQUFNLE9BQU8sYUFBYTtJQUgxQjtRQUlVLGNBQVMsR0FBWSxFQUFFLENBQUM7UUFDeEIsZ0JBQVcsR0FBVSxFQUFFLENBQUE7UUFDdkIsZUFBVSxHQUFxQixFQUFFLENBQUM7UUFDbEMsYUFBUSxHQUFVLEVBQUUsQ0FBQztRQUNyQixhQUFRLEdBQVUsRUFBRSxDQUFDO1FBQ3JCLFNBQUksR0FBYSxFQUFFLENBQUM7UUFDcEIsWUFBTyxHQUFXLENBQUMsQ0FBQztRQUVwQixtQkFBYyxHQUF3QixTQUFTLENBQUM7UUFDaEQsU0FBSSxHQUFhLEVBQUUsQ0FBQztRQUVwQixnQkFBVyxHQUFHLElBQUksZUFBZSxDQUF5QixTQUFTLENBQUMsQ0FBQztRQUNyRSxrQkFBYSxHQUFHLElBQUksZUFBZSxDQUFVLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFDLENBQUMsQ0FBQztRQUdyRixnQkFBVyxHQUFHLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBOGVsRDtJQTVlQyxJQUFJLElBQUk7UUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFBRSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFD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O0FBaWdCQyxNQUFNLE9BQU8sVUFBVTtJQUNyQixZQUNTLEtBQWEsRUFDYixLQUFhLEVBQ2IsS0FBYTtRQUZiLFVBQUssR0FBTCxLQUFLLENBQVE7UUFDYixVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2IsVUFBSyxHQUFMLEtBQUssQ0FBUTtJQUNwQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCAqIGFzIGpzb25wYXRoIGZyb20gJ2pzb25wYXRoJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFNoZW1hIH0gZnJvbSAnLi9zaGFyZWQvbW9kZWxzL3NoZW1hLm1vZGVsJztcclxuaW1wb3J0IHsgQ29uZmlnUmVnaXN0cm8sIEtleSwgT3BlcmF0aW9uLCBrZXlFc3F1ZW1hIH0gZnJvbSAnLi9zaGFyZWQvbW9kZWxzL2NydWQtY29uZmlnLm1vZGVsJztcclxuaW1wb3J0IHsgRW1wcmVzYSB9IGZyb20gJy4vc2hhcmVkL21vZGVscy9FbXByZXNhLm1vZGVsJztcclxuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSAnLi9zaGFyZWQvbW9kZWxzL0NvbmRpdGlvbnMubW9kZWwnO1xyXG5pbXBvcnQgeyBSZWFzb24gfSBmcm9tICcuL3NoYXJlZC9tb2RlbHMvUmVhc29uLm1vZGVsJztcclxuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZkNydWRTZXJ2aWNlIHtcclxuICBwcml2YXRlIF9lc3F1ZW1hczogU2hlbWFbXSA9IFtdO1xyXG4gIHByaXZhdGUgX3VpRXNxdWVtYXM6IGFueVtdID0gW11cclxuICBwcml2YXRlIF9yZWdpc3Ryb3M6IENvbmZpZ1JlZ2lzdHJvW10gPSBbXTtcclxuICBwcml2YXRlIF9hbnN3ZXJzOiBhbnlbXSA9IFtdO1xyXG4gIHByaXZhdGUgX2RhdGFTZXQgOmFueVtdID0gW107XHJcbiAgcHJpdmF0ZSBfaWRzIDpzdHJpbmdbXSA9IFtdO1xyXG4gIHByaXZhdGUgX19pbmRleDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIF9pZEthdGlvcyE6IHN0cmluZztcclxuICBwcml2YXRlIF9jb25maWdFbXByZXNhOiBFbXByZXNhIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX3RyeDogc3RyaW5nW10gPSBbXTtcclxuICBwcml2YXRlIGpzb25Db25maWc6IGFueTtcclxuICBwcml2YXRlIF9jaGFuZ2VEYXRhID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDaGFuZ2VEYXRhIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xyXG4gIHByaXZhdGUgX19mb3JtTG9hZGluZyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TG9hZGluZz4oe2luUHJvZ3Jlc3M6IGZhbHNlLCB0YXJnZXQ6IHVuZGVmaW5lZH0pO1xyXG4gIHByaXZhdGUgX2RhdGFFeHQ6IGFueTtcclxuICBwcml2YXRlIF90Zm1Vc2VyOiBhbnk7XHJcbiAgcHJpdmF0ZSBfY3J1ZExvYWRlZCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xyXG5cclxuICBnZXQgdXNlcigpe1xyXG4gICAgaWYgKCF0aGlzLl90Zm1Vc2VyKSB0aGlzLl90Zm1Vc2VyID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIm9TZXNzaW9uVEZNXCIpISlcclxuICAgIHJldHVybiB0aGlzLl90Zm1Vc2VyXHJcbiAgfVxyXG5cclxuICBnZXQgY3VycmVudE9wZXJhdGlvbigpe1xyXG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cm9zW3RoaXMuaW5kZXhdLm9wZXJhdGlvbnMuZmluZCh4ID0+IHgudHlwZS5zdGFydHNXaXRoKHRoaXMuX3RyeFt0aGlzLmluZGV4XSkpXHJcbiAgfVxyXG5cclxuICBzZXQgZW52aXJvbm1lbnQodmFsOiBhbnkpe1xyXG4gICAgdGhpcy5qc29uQ29uZmlnID0gdmFsXHJcbiAgfVxyXG5cclxuICBnZXQgZW52aXJvbm1lbnQoKXtcclxuICAgIHJldHVybiB0aGlzLmpzb25Db25maWdcclxuICB9XHJcblxyXG4gIGdldCBvbkNydWRMb2FkZWQkKCl7XHJcbiAgICByZXR1cm4gdGhpcy5fY3J1ZExvYWRlZC5hc09ic2VydmFibGUoKVxyXG4gIH1cclxuXHJcbiAgc2V0IGNydWRMb2FkZWQodmFsdWU6IGJvb2xlYW4pe1xyXG4gICAgdGhpcy5fY3J1ZExvYWRlZC5uZXh0KHZhbHVlKVxyXG4gIH1cclxuXHJcbiAgZ2V0IGRhdGFFeHQoKXtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhRXh0XHJcbiAgfVxyXG5cclxuICBzZXQgZGF0YUV4dCh2YWwpe1xyXG4gICAgdGhpcy5fZGF0YUV4dCA9IHZhbFxyXG4gIH1cclxuXHJcbiAgZ2V0IGluZGV4KCl7XHJcbiAgICByZXR1cm4gdGhpcy5fX2luZGV4XHJcbiAgfVxyXG5cclxuICBzZXQgaW5kZXgodmFsdWU6IG51bWJlcil7XHJcbiAgICB0aGlzLl9faW5kZXggPSB2YWx1ZVxyXG4gIH1cclxuXHJcbiAgZ2V0IGlkS2F0aW9zKCl7XHJcbiAgICByZXR1cm4gdGhpcy5faWRLYXRpb3NcclxuICB9XHJcblxyXG4gIHNldCBpZEthdGlvcyh2YWx1ZTogc3RyaW5nKXtcclxuICAgIHRoaXMuX2lkS2F0aW9zID0gdmFsdWU/LnRyaW0oKT8udG9VcHBlckNhc2UoKVxyXG4gIH1cclxuXHJcbiAgZ2V0IGNvbmZpZ0VtcHJlc2EoKTogRW1wcmVzYSB8IHVuZGVmaW5lZHtcclxuICAgIHJldHVybiB0aGlzLl9jb25maWdFbXByZXNhXHJcbiAgfVxyXG5cclxuICBzZXQgY29uZmlnRW1wcmVzYSh2YWx1ZTogRW1wcmVzYSB8IHVuZGVmaW5lZCl7XHJcbiAgICB0aGlzLl9jb25maWdFbXByZXNhID0gdmFsdWVcclxuICB9XHJcblxyXG4gIGdldFVSTChvcGVyYXRpb246IE9wZXJhdGlvbiwgaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCwgaWQ6IGFueT11bmRlZmluZWQpe1xyXG5cclxuICAgICAgbGV0IHVybCA9IG9wZXJhdGlvbi51cmwgfHwgYCR7dGhpcy5qc29uQ29uZmlnW29wZXJhdGlvbi5zZXJ2ZXIhXX0ke29wZXJhdGlvbi5lbmRwb2ludH1gXHJcbiAgICAgIHVybCA9IHVybC5yZXBsYWNlKCdAaWRLYXRpb3MnLCB0aGlzLmlkS2F0aW9zKVxyXG4gICAgICBpZiAoaWQpIHVybCA9IHVybC5yZXBsYWNlKCdAaWQnLCBpZClcclxuXHJcbiAgICAgIHVybCA9IHRoaXMuYXBwbHlTdHJpbmdLZXlzKHVybCwgaW5kZXgpXHJcbiAgICAgIHJldHVybiB1cmxcclxuICB9XHJcblxyXG4gIGdldFJlZ2lzdHJvKGluZGV4OiBudW1iZXIpe1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlZ2lzdHJvc1tpbmRleF07XHJcbiAgfVxyXG5cclxuICBnZXRJZChpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9pZHMubGVuZ3RoID09IDEgPyB0aGlzLl9pZHNbMF0gOiB0aGlzLl9pZHNbaW5kZXhdO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRhdGFzZXQoKXtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhU2V0XHJcbiAgfVxyXG4gIGdldERhdGEoaW5kZXg6IG51bWJlcil7XHJcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNldC5sZW5ndGggPT0gMSA/IHRoaXMuX2RhdGFTZXRbMF0gOiB0aGlzLl9kYXRhU2V0W2luZGV4XTtcclxuICB9XHJcblxyXG4gIGdldFRyeChpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl90cnhbaW5kZXhdXHJcbiAgfVxyXG5cclxuICBnZXQgdG90YWxEYXRhKCl7XHJcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNldC5sZW5ndGhcclxuICB9XHJcblxyXG4gIGdldCB0b3RhbFJlZ2lzdHJvcygpe1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlZ2lzdHJvcy5sZW5ndGhcclxuICB9XHJcblxyXG4gIGdldCB1aUVzcXVlbWFzKCl7XHJcbiAgICByZXR1cm4gdGhpcy5fdWlFc3F1ZW1hc1xyXG4gIH1cclxuXHJcbiAgZ2V0RXNxdWVtYShpbmRleDogbnVtYmVyKXtcclxuICAgIHJldHVybiB0aGlzLl9lc3F1ZW1hcy5sZW5ndGggPT0gMSA/IHRoaXMuX2VzcXVlbWFzWzBdIDogdGhpcy5fZXNxdWVtYXNbaW5kZXhdO1xyXG4gIH1cclxuXHJcbiAgcmVzZXQoKXtcclxuICAgIHRoaXMuX2lkcyA9IFtdXHJcbiAgICB0aGlzLl9kYXRhU2V0ID0gW11cclxuICB9XHJcblxyXG4gIGdldFVSTFJlZGlyZWN0KGluaXRpYWxVUkw6IHN0cmluZyl7XHJcbiAgICBsZXQgZmluYWxVcmwgPSB0aGlzLmFwcGx5U3RyaW5nS2V5cyhpbml0aWFsVVJMLCB1bmRlZmluZWQpXHJcbiAgICBmaW5hbFVybCA9IGZpbmFsVXJsLnJlcGxhY2UoXCJAVVJMQkFTRVwiLCB3aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdCgnPycpWzBdKVxyXG4gICAgcmV0dXJuIGZpbmFsVXJsXHJcbiAgfVxyXG5cclxuICBnZXRVSUVzcXVlbWEoaW5kZXg6IG51bWJlcil7XHJcbiAgICByZXR1cm4gdGhpcy5fdWlFc3F1ZW1hc1tpbmRleF07XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogdXNpbmcgZGF0YSwgYXBwbHkgZWFjaCBrZXlFc3F1ZW1hIG92ZXIgZWFjaCBkYXRhc2V0IGluZGljYXRlZCBvbiBpbmRleERhdGEgb2YgZWFjaCBrZXlcclxuICAgKiBAcGFyYW0gZGF0YVxyXG4gICAqIEBwYXJhbSBjb250ZW50XHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBhcHBseU9iamVjdEtleXMoZGF0YTogYW55LCBrZXlzRXNxdWVtYToga2V5RXNxdWVtYVtdLCByZWdpc3RybzogQ29uZmlnUmVnaXN0cm8pOiBhbnl7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXNFc3F1ZW1hLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IG9wdCA9IGtleXNFc3F1ZW1hW2ldO1xyXG4gICAgICBsZXQgdmFsdWUgPSB1bmRlZmluZWQ7XHJcbiAgICAgIGlmIChvcHQuaW5kZXhLZXkpe1xyXG4gICAgICAgIGxldCBrZXlGb3VuZCA9IChyZWdpc3Ryby5rZXlzID8/IFt1bmRlZmluZWRdKVtvcHQuaW5kZXhLZXldXHJcbiAgICAgICAgdGhpcy5hcHBseUtleShrZXlGb3VuZCwgcmVnaXN0cm8sIGRhdGEpXHJcblxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKG9wdC5pbmRleERhdGEgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGlmIChvcHQuaXNBcnJheSl7XHJcbiAgICAgICAgICB2YWx1ZSA9IGpzb25wYXRoLnF1ZXJ5KGRhdGEsIG9wdC5zY29wZSlcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHZhbHVlID0ganNvbnBhdGgucXVlcnkoZGF0YSwgb3B0LnNjb3BlKVswXVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAob3B0LmtleSA9PSBcIiRcIikgT2JqZWN0LmFzc2lnbih0aGlzLl9kYXRhU2V0W29wdC5pbmRleERhdGEhXSwgdmFsdWUpXHJcbiAgICAgIGVsc2UgaWYgKG9wdC5rZXkgJiYgKCh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB8fCAob3B0LmNhbkJlVmFsdWVVbmRlZmluZWQgPT09IHVuZGVmaW5lZCB8fCBvcHQuY2FuQmVWYWx1ZVVuZGVmaW5lZCA9PT0gdHJ1ZSkpKSBqc29ucGF0aC52YWx1ZSh0aGlzLl9kYXRhU2V0W29wdC5pbmRleERhdGEhXSwgb3B0LmtleSwgdmFsdWUpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0YVxyXG4gIH1cclxuXHJcblxyXG4gIGFwcGx5S2V5KGtleTogS2V5IHwgdW5kZWZpbmVkLCByZWdpc3RybzogQ29uZmlnUmVnaXN0cm8sIGRhdGE6IGFueSl7XHJcbiAgICBpZiAoa2V5Py5vdmVycmlkZUNvbnRyb2wpe1xyXG4gICAgICBsZXQgbmV3VmFsID0gdW5kZWZpbmVkO1xyXG4gICAgICBsZXQgZXNxdWVtYVRvU2V0ID0gdGhpcy5nZXRDb250cm9sKGtleS5zY29wZSwgdGhpcy5lc3F1ZW1hc1trZXkuaW5kZXhEYXRhID8/IHRoaXMuaW5kZXhdKVxyXG4gICAgICBpZiAoIWVzcXVlbWFUb1NldCkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3Ioe21lc3NhZ2U6IFwibGEga2V5IGVzdGEgbWFsIGNvbmZpZ3VyYWRhXCIsIGRhdGE6IGtleX0pXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBjb21wbGV0ZWQgPSB0aGlzLmlzQ29uZGl0aW9uc0NvbXBsZXRlZChrZXkub3ZlcnJpZGVDb250cm9sLmNvbmRpdGlvbnMgPz8gW10sIHJlZ2lzdHJvLmNvbmRpdGlvbnMgfHwgW10sIGRhdGEpXHJcbiAgICAgIGlmIChrZXkub3ZlcnJpZGVDb250cm9sPy5wcm9wZXJ0eSkganNvbnBhdGgudmFsdWUoZXNxdWVtYVRvU2V0LCBrZXkub3ZlcnJpZGVDb250cm9sLnByb3BlcnR5LCBjb21wbGV0ZWQgPyBrZXkub3ZlcnJpZGVDb250cm9sLnZhbHVlIDoga2V5Lm92ZXJyaWRlQ29udHJvbC5lbHNlVmFsdWUpXHJcblxyXG4gICAgICBpZiAoY29tcGxldGVkICYmIGtleS5vdmVycmlkZUNvbnRyb2wubmV3UHJvcGVydHlWYWx1ZSAhPT0gdW5kZWZpbmVkKXtcclxuICAgICAgICBpZiAoa2V5Lm92ZXJyaWRlQ29udHJvbC5uZXdQcm9wZXJ0eVZhbHVlID09ICdSRVNFVE9CSkVDVCcpIG5ld1ZhbCA9IHRoaXMuY3JlYXRlT2JqZWN0KGVzcXVlbWFUb1NldCwgdGhpcy5jdXJyZW50T3BlcmF0aW9uKVxyXG4gICAgICAgIGVsc2UgbmV3VmFsID0ga2V5Lm92ZXJyaWRlQ29udHJvbC5uZXdQcm9wZXJ0eVZhbHVlXHJcbiAgICAgIH1lbHNlIGlmICghY29tcGxldGVkICYmIGtleS5vdmVycmlkZUNvbnRyb2wuZWxzZU5ld1Byb3BlcnR5VmFsdWUgIT09IHVuZGVmaW5lZCl7XHJcbiAgICAgICAgaWYgKGtleS5vdmVycmlkZUNvbnRyb2wuZWxzZU5ld1Byb3BlcnR5VmFsdWUgPT0gJ1JFU0VUT0JKRUNUJykgbmV3VmFsID0gdGhpcy5jcmVhdGVPYmplY3QoZXNxdWVtYVRvU2V0LCB0aGlzLmN1cnJlbnRPcGVyYXRpb24pXHJcbiAgICAgICAgZWxzZSBuZXdWYWwgPSBrZXkub3ZlcnJpZGVDb250cm9sLmVsc2VOZXdQcm9wZXJ0eVZhbHVlXHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5ld1ZhbCAhPT0gdW5kZWZpbmVkKSBqc29ucGF0aC52YWx1ZSh0aGlzLl9kYXRhU2V0W2tleS5pbmRleERhdGEgPz8gdGhpcy5pbmRleF0sIGtleS5zY29wZS5yZXBsYWNlQWxsKCcuLnByb3BlcnRpZXMnLCAnJyksIG5ld1ZhbClcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWYWxpZGF0ZSBjb25kaXRpb25zIG9uIGRhdGFzXHJcbiAgICogQHBhcmFtIGNvbmRpdGlvbnNcclxuICAgKiBAcGFyYW0gaW5kZXhcclxuICAgKi9cclxuICBpc0NvbmRpdGlvbnNDb21wbGV0ZWQoaUNvbmRpdGlvbnM6IG51bWJlcltdLCBjb25kaXRpb25zOiBDb25kaXRpb25bXSwgZGF0YTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBsZXQgY3VtcGxlID0gIHRydWVcclxuICAgIGlDb25kaXRpb25zLmZvckVhY2goIGlDb25kID0+IHtcclxuICAgICAgY29uc3QgYyA9IENvbmRpdGlvbi5pbnN0YW5jZUNvbnRpZGlvbihpQ29uZCwgY29uZGl0aW9ucylcclxuICAgICAgbGV0IGRhdGFUb0V2YWx1YXRlID0gYy5pbmRleERhdGEgIT09IHVuZGVmaW5lZCA/IHRoaXMuX2RhdGFTZXRbYy5pbmRleERhdGFdIDogZGF0YVxyXG4gICAgICBpZiAoIWMuaXNWYWxpZChkYXRhVG9FdmFsdWF0ZSkpIGN1bXBsZSA9IGZhbHNlXHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIGN1bXBsZVxyXG4gIH1cclxuICAgIC8qKlxyXG4gICAgICogQXBwbHkgZWFjaCBrZXkgZnJvbSByZWdpc3RlciBvdmVyIHN0cmluZyBjb250ZW50XHJcbiAgICAgKiBAcGFyYW0gaW5kZXhSZWdpc3Ryb1xyXG4gICAgICogQHBhcmFtIGNvbnRlbnRcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIGFwcGx5U3RyaW5nS2V5cyhjb250ZW50OiBzdHJpbmcsIGluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQpOiBzdHJpbmd7XHJcbiAgICAgIGxldCBpbmRleFJlZ2lzdHJvID0gaW5kZXggfHwgdGhpcy5fX2luZGV4XHJcbiAgICAgIHRoaXMuX3JlZ2lzdHJvc1tpbmRleFJlZ2lzdHJvXS5rZXlzPy5mb3JFYWNoKChvcHQpID0+IHtcclxuICAgICAgICBsZXQgdmFsdWU7XHJcbiAgICAgICAgaWYgKG9wdC5pbmRleElkICE9PSB1bmRlZmluZWQgJiYgb3B0LmluZGV4SWQgPCB0aGlzLl9pZHMubGVuZ3RoKSB2YWx1ZSA9IHRoaXMuX2lkc1tvcHQuaW5kZXhJZF1cclxuICAgICAgICBlbHNlIGlmIChvcHQuaW5kZXhBbnN3ZXIgIT09IHVuZGVmaW5lZCAmJiBvcHQuaW5kZXhBbnN3ZXIgPCB0aGlzLl9hbnN3ZXJzLmxlbmd0aCkgdmFsdWUgPSBqc29ucGF0aC5xdWVyeSh0aGlzLl9hbnN3ZXJzW29wdC5pbmRleEFuc3dlcl0sIG9wdC5zY29wZSlbMF1cclxuICAgICAgICBlbHNlIGlmIChvcHQuaW5kZXhEYXRhICE9PSB1bmRlZmluZWQpIHZhbHVlID0ganNvbnBhdGgucXVlcnkodGhpcy5fZGF0YVNldFtvcHQuaW5kZXhEYXRhXSwgb3B0LnNjb3BlKVswXVxyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgdmFsdWUgPSAnJ1xyXG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2Uob3B0LmtleSwgdmFsdWUpXHJcbiAgICAgIH0pXHJcbiAgICByZXR1cm4gY29udGVudFxyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGVEYXRhTG9jYWwob3BlcmF0aW9uOiBPcGVyYXRpb24sIGRhdGE6IGFueSwgY29uZGl0aW9uczogQ29uZGl0aW9uW10pIHtcclxuICAgIGNvbnN0IGVycjogc3RyaW5nW10gPSBbXVxyXG4gICAgLy9Tb2xvIHNpIHNlIGN1bXBsZSBsYSBjb25kaWNpb24sIHNlIHZhbGlkYVxyXG4gICAgb3BlcmF0aW9uLnZhbGlkYXRpb25zPy5yZXF1aXJlZD8uZm9yRWFjaCh4ID0+IHtcclxuICAgICAgY29uc3QgY3VtcGxlQ29uZCA9IHguY29uZGl0aW9ucyA/IHRoaXMuaXNDb25kaXRpb25zQ29tcGxldGVkKHguY29uZGl0aW9ucywgY29uZGl0aW9ucywgZGF0YSk6IHRydWU7XHJcbiAgICAgIGlmIChjdW1wbGVDb25kICYmICghanNvbnBhdGgucXVlcnkoZGF0YSwgeC5maWVsZClbMF0gfHxcclxuICAgICAgKEFycmF5LmlzQXJyYXkoanNvbnBhdGgucXVlcnkoZGF0YSwgeC5maWVsZClbMF0pICYmIGpzb25wYXRoLnF1ZXJ5KGRhdGEsIHguZmllbGQpWzBdLmxlbmd0aCA9PSAwKSkpIGVyci5wdXNoKHgubWVzc2FnZSk7XHJcbiAgICB9KVxyXG5cclxuICAgIG9wZXJhdGlvbi52YWxpZGF0aW9ucz8uZGlmZmVyZW50Py5mb3JFYWNoKHggPT57XHJcbiAgICAgIGNvbnN0IGN1bXBsZUNvbmQgPSB4LmNvbmRpdGlvbnMgPyB0aGlzLmlzQ29uZGl0aW9uc0NvbXBsZXRlZCh4LmNvbmRpdGlvbnMsIGNvbmRpdGlvbnMsIGRhdGEpOiB0cnVlO1xyXG4gICAgICBpZiAoY3VtcGxlQ29uZCAmJiBqc29ucGF0aC5xdWVyeShkYXRhLCB4LmZpZWxkKVswXSA9PT0geC52YWx1ZSkgZXJyLnB1c2goeC5tZXNzYWdlKTtcclxuICAgIH0pXHJcblxyXG4gICAgb3BlcmF0aW9uLnZhbGlkYXRpb25zPy5lcXVhbHM/LmZvckVhY2goeCA9PntcclxuICAgICAgY29uc3QgY3VtcGxlQ29uZCA9IHguY29uZGl0aW9ucyA/IHRoaXMuaXNDb25kaXRpb25zQ29tcGxldGVkKHguY29uZGl0aW9ucywgY29uZGl0aW9ucywgZGF0YSk6IHRydWU7XHJcbiAgICAgIGlmIChjdW1wbGVDb25kICYmIGpzb25wYXRoLnF1ZXJ5KGRhdGEsIHguZmllbGQpWzBdICE9IHgudmFsdWUpIGVyci5wdXNoKHgubWVzc2FnZSk7XHJcbiAgICB9KVxyXG4gICAgb3BlcmF0aW9uLnZhbGlkYXRpb25zPy5vcGVyYXRpb25zPy5mb3JFYWNoKChvcDogYW55KSA9PiB7XHJcbiAgICAgIHN3aXRjaCAob3AuYWN0aW9uKSB7XHJcbiAgICAgICAgY2FzZSAnc3VtQXJyYXknOlxyXG4gICAgICAgICAgY29uc3QgdmFyMSA9IGpzb25wYXRoLnF1ZXJ5KGRhdGEsIG9wLnNjb3BlWzBdKS5yZWR1Y2UoKGFjYywgY3VyKSA9PiBhY2MgKz0gY3VyW29wLmtleV0sIDApO1xyXG4gICAgICAgICAgY29uc3QgdmFyMiA9IGpzb25wYXRoLnF1ZXJ5KGRhdGEsIG9wLnNjb3BlWzFdKS5yZWR1Y2UoKGFjYywgY3VyKSA9PiBhY2MgKz0gY3VyW29wLmtleV0sIDApO1xyXG4gICAgICAgICAgaWYgKHZhcjEgIT0gdmFyMikgZXJyLnB1c2gob3AubWVzc2FnZSlcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIHJldHVybiBlcnI7XHJcbiAgfVxyXG5cclxuICBzZXQgZXNxdWVtYXMoZXNxdWVtYXM6IFNoZW1hW10pe1xyXG4gICAgdGhpcy5fZXNxdWVtYXMgPSBlc3F1ZW1hc1xyXG4gIH1cclxuXHJcbiAgZ2V0IGVzcXVlbWFzKCl7XHJcbiAgICByZXR1cm4gdGhpcy5fZXNxdWVtYXNcclxuICB9XHJcblxyXG4gIHNldCBpZHMoaWRzOiBzdHJpbmdbXSl7XHJcbiAgICB0aGlzLl9pZHMgPSBpZHNcclxuICB9XHJcblxyXG4gIHNldCB1aUVzcXVlbWFzKHVpRXNxdWVtYXM6IGFueVtdKXtcclxuICAgIHRoaXMuX3VpRXNxdWVtYXMgPSB1aUVzcXVlbWFzXHJcbiAgfVxyXG5cclxuICBnZXQgcmVnaXN0cm9zKCl7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVnaXN0cm9zXHJcbiAgfVxyXG5cclxuICBzZXQgcmVnaXN0cm9zKHJlZ2lzdHJvczogQ29uZmlnUmVnaXN0cm9bXSl7XHJcbiAgICB0aGlzLl9yZWdpc3Ryb3MgPSByZWdpc3Ryb3NcclxuICB9XHJcblxyXG4gIHNldERhdGFTZXQoZGF0YTogYW55LCBpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkKXtcclxuICAgIGluZGV4ID0gaW5kZXggPyBpbmRleCA6IHRoaXMuX19pbmRleFxyXG4gICAgaWYgKGluZGV4ID49IHRoaXMudG90YWxEYXRhKSB7XHJcbiAgICAgIHRoaXMuX2RhdGFTZXQucHVzaChkYXRhKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0VHJ4KHRyeDogYW55LCBpbmRleDogbnVtYmVyKXtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHRyeCkpIHRoaXMuX3RyeCA9IHRyeDtcclxuICAgIGVsc2UgaWYgKGluZGV4ID49IHRoaXMuX3RyeC5sZW5ndGgpIHRoaXMuX3RyeC5wdXNoKHRyeClcclxuICAgIGVsc2UgdGhpcy5fdHJ4W2luZGV4XSA9IHRyeFxyXG4gIH1cclxuXHJcbiAgc2V0QW5zd2VycyhhbnN3ZXI6IGFueSwgaW5kZXg6IG51bWJlcil7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhbnN3ZXIpKSB0aGlzLl9hbnN3ZXJzID0gYW5zd2VyO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChpbmRleCA+PSB0aGlzLl9hbnN3ZXJzLmxlbmd0aCkgdGhpcy5fYW5zd2Vycy5wdXNoKGFuc3dlcik7XHJcbiAgICAgIGVsc2UgdGhpcy5fYW5zd2Vyc1tpbmRleF0gPSBhbnN3ZXI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRDb250cm9sKHNjb3BlOiBzdHJpbmcsIGVzcXVlbWE6IFNoZW1hKSB7XHJcbiAgICByZXR1cm4ganNvbnBhdGgucXVlcnkoZXNxdWVtYSwgc2NvcGUpWzBdO1xyXG4gIH1cclxuXHJcblxyXG4gIGdldFZhbHVlKHNjb3BlOiBhbnksIGRhdGE6IGFueSkge1xyXG4gICAgcmV0dXJuIGpzb25wYXRoLnF1ZXJ5KGRhdGEsIHNjb3BlLnJlcGxhY2VBbGwoJy5wcm9wZXJ0aWVzJywgJycpKVswXTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZU9iamVjdChlc3F1ZW1hOiBTaGVtYSwgb3BlcmF0aW9uOiBPcGVyYXRpb24gfCB1bmRlZmluZWQpIHtcclxuICAgIGNvbnN0IG9iamVjdDogYW55ID0ge307XHJcbiAgICBzd2l0Y2ggKGVzcXVlbWEudHlwZSkge1xyXG4gICAgICBjYXNlICdudW1lcmljJzpcclxuICAgICAgY2FzZSAnc3RyaW5nJzpcclxuICAgICAgY2FzZSAnZGF0ZSc6XHJcbiAgICAgICAgaWYgKGVzcXVlbWEuZGVmYXVsdCAmJiBvcGVyYXRpb24pe1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2V0RGVmYXVsdFZhbHVlKGVzcXVlbWEuZGVmYXVsdCwgb3BlcmF0aW9uKVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHJldHVybiBlc3F1ZW1hLmRlZmF1bHQgPz8gbnVsbDtcclxuICAgICAgY2FzZSAnYm9vbGVhbic6XHJcbiAgICAgICAgcmV0dXJuIGVzcXVlbWE/LmRlZmF1bHQgfHwgZmFsc2U7XHJcbiAgICAgIGNhc2UgJ2FycmF5JzpcclxuICAgICAgICByZXR1cm4gW107XHJcbiAgICAgIGNhc2UgJ2ZpbGUnOlxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICBjYXNlICdvYmplY3QnOlxyXG4gICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGVzcXVlbWE/LnByb3BlcnRpZXMpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgIGxldCBhdXggPSBlc3F1ZW1hPy5wcm9wZXJ0aWVzW2tleV1cclxuICAgICAgICAgIGlmIChhdXgpIG9iamVjdFtrZXldID0gdGhpcy5jcmVhdGVPYmplY3QoYXV4LCBvcGVyYXRpb24pXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAgIGdldFZhbHVlS2V5KGtleTogS2V5IHwgdW5kZWZpbmVkKTogYW55IHtcclxuICAgIGxldCBkYXRhO1xyXG4gICAgc3dpdGNoIChrZXk/LmRhdGEgfHwgJ2V4dGVybmEnKSB7XHJcbiAgICAgIGNhc2UgXCJ1c2VyXCI6XHJcbiAgICAgICAgZGF0YSA9IHRoaXMudXNlclxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGRhdGEgPSB0aGlzLmRhdGFFeHRcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIGlmIChkYXRhICYmIGtleSl7XHJcbiAgICAgIGNvbnN0IGF1eCA9IGpzb25wYXRoLnF1ZXJ5KGRhdGEsIGtleS5zY29wZSlcclxuICAgICAgaWYgKGF1eC5sZW5ndGggPT0gMCkgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgICBpZiAoYXV4Lmxlbmd0aCA9PSAxKSByZXR1cm4gYXV4WzBdXHJcbiAgICAgIGVsc2UgcmV0dXJuIGF1eFxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxyXG4gIH1cclxuXHJcblxyXG4gIHNldERlZmF1bHRWYWx1ZSh2YWx1ZTogYW55LCBvcGVyYXRpb246IE9wZXJhdGlvbikge1xyXG4gICAgbGV0IGRhdGEgPSBudWxsO1xyXG4gICAgaWYgKHZhbHVlLmtleSAmJiBvcGVyYXRpb24ua2V5cyl7XHJcbiAgICAgIGRhdGEgPSB0aGlzLmdldFZhbHVlS2V5KG9wZXJhdGlvbi5rZXlzLmZpbmQoayA9PiBrLmtleSA9PSB2YWx1ZS5rZXkpISlcclxuICAgICAgdmFsdWUgPSBkYXRhXHJcbiAgICB9XHJcbiAgICBzd2l0Y2ggKHZhbHVlKSB7XHJcbiAgICAgIGNhc2UgJ0B1YWN0aXZvJzpcclxuICAgICAgICBkYXRhID0gYCR7dGhpcy51c2VyLlVzdWFyaW9TaXN0ZW1hLlRET0N9LSR7dGhpcy51c2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0N9YFxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdAdGRvY2FjdGl2byc6XHJcbiAgICAgICAgZGF0YSA9IHRoaXMudXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ0BuZG9jYWN0aXZvJzpcclxuICAgICAgICBkYXRhID0gdGhpcy51c2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0NcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnQGhveSc6XHJcbiAgICAgICAgZGF0YSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgZGF0YSA9IHZhbHVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRhdGFcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFZhbGlkYXRlIGlmIHNjaGVtYSBoYXMgcGRmc2lnbiBhbmQgaXQncyBzaWduZWQsIGVsc2UgcmV0dXJuIGZhbHNlXHJcbiAgICogQHBhcmFtIGluZGV4XHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBpc1NpZ25lZFBERihpbmRleDogbnVtYmVyKXtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhU2V0W2luZGV4XS5zaWduZWRcclxuICB9XHJcblxyXG4gIGdldCBjaGFuZ2VEYXRhJCgpe1xyXG4gICAgcmV0dXJuIHRoaXMuX2NoYW5nZURhdGEuYXNPYnNlcnZhYmxlKClcclxuICB9XHJcblxyXG4gIHNldCBjaGFuZ2VEYXRhKHZhbHVlOiBDaGFuZ2VEYXRhKXtcclxuICAgIHRoaXMuX2NoYW5nZURhdGEubmV4dCh2YWx1ZSlcclxuICB9XHJcblxyXG4gIGdldCBmb3JtTG9hZGluZyQoKXtcclxuICAgIHJldHVybiB0aGlzLl9fZm9ybUxvYWRpbmcuYXNPYnNlcnZhYmxlKClcclxuICB9XHJcblxyXG4gIHNldCBmb3JtTG9hZGluZyh2YWx1ZTogTG9hZGluZyl7XHJcbiAgICB0aGlzLl9fZm9ybUxvYWRpbmcubmV4dCh2YWx1ZSlcclxuICB9XHJcblxyXG4gIGxvYWRTZXNzaW9uKCkge1xyXG4gICAgY29uc3QgZXhpc3RTZXNzaW9uID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJlc3F1ZW1hc1wiKSAhPT0gbnVsbFxyXG4gICAgaWYgKGV4aXN0U2Vzc2lvbil7XHJcbiAgICAgIHRoaXMuX2VzcXVlbWFzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImVzcXVlbWFzXCIpISlcclxuICAgICAgdGhpcy5fdWlFc3F1ZW1hcyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJ1aUVzcXVlbWFzXCIpISlcclxuICAgICAgdGhpcy5fcmVnaXN0cm9zID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInJlZ2lzdHJvc1wiKSEpXHJcbiAgICAgIHRoaXMuX2RhdGFTZXQgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiZGF0YVNldFwiKSEpXHJcbiAgICAgIHRoaXMuX2Fuc3dlcnMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYW5zd2Vyc1wiKSEpXHJcbiAgICAgIHRoaXMuX3RyeCA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJ0cnhcIikhKVxyXG4gICAgICB0aGlzLl9faW5kZXggPSArbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJpbmRleFwiKSFcclxuICAgICAgbG9jYWxTdG9yYWdlLmNsZWFyKClcclxuICAgIH1cclxuICAgIHJldHVybiBleGlzdFNlc3Npb25cclxuICB9XHJcblxyXG4gIGdldCByZWFzb25zKCk6IFJlYXNvbltde1xyXG4gICAgY29uc3QgcmVhc29uc1N0b3JhZ2UgPWxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicmVhc29uc1wiKVxyXG4gICAgaWYgKHJlYXNvbnNTdG9yYWdlKSByZXR1cm4gPFJlYXNvbltdPkpTT04ucGFyc2UocmVhc29uc1N0b3JhZ2UpXHJcbiAgICByZXR1cm4gW11cclxuICB9XHJcblxyXG4gIHNhdmVQcm9ncmVzcyhyZWFzb25zOiBSZWFzb25bXSl7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcInJlYXNvbnNcIiwgSlNPTi5zdHJpbmdpZnkocmVhc29ucykpXHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImVzcXVlbWFzXCIsIEpTT04uc3RyaW5naWZ5KHRoaXMuX2VzcXVlbWFzKSlcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwidHJ4XCIsIEpTT04uc3RyaW5naWZ5KHRoaXMuX3RyeCkpXHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcInVpRXNxdWVtYXNcIiwgSlNPTi5zdHJpbmdpZnkodGhpcy5fdWlFc3F1ZW1hcykpXHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcInJlZ2lzdHJvc1wiLCBKU09OLnN0cmluZ2lmeSh0aGlzLl9yZWdpc3Ryb3MpKVxyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJkYXRhU2V0XCIsIEpTT04uc3RyaW5naWZ5KHRoaXMuX2RhdGFTZXQpKVxyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJhbnN3ZXJzXCIsIEpTT04uc3RyaW5naWZ5KHRoaXMuX2Fuc3dlcnMpKVxyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJpbmRleFwiLCB0aGlzLl9faW5kZXgudG9TdHJpbmcoKSlcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWRpcmVjdFRvSW5pY2lvKCl7XHJcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gd2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoJz8nKVswXVxyXG4gICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcclxuICB9XHJcblxyXG5cclxuYXBwbHlWYWx1ZXNPbkV2ZW50KGV2ZW50OiBzdHJpbmcsIGVzcXVlbWE6IFNoZW1hLCBrZXk6IHN0cmluZyB8IHVuZGVmaW5lZCwgZGF0YTogYW55KSB7XHJcbiAgICBpZiAoa2V5KSB7IFxyXG4gICAgICBpZiAoZXNxdWVtYS5wcm9wZXJ0aWVzW2tleV1bZXZlbnRdKSB7XHJcbiAgICAgICAgZXNxdWVtYS5wcm9wZXJ0aWVzW2tleV1bZXZlbnRdLmZvckVhY2goKHZhbHVlOiB7IHNjb3BlOiBzdHJpbmdbXSwgb3A6IHN0cmluZywga2V5Pzogc3RyaW5nIH0pID0+IHtcclxuICAgICAgICAgIHRoaXMuc2V0VmFsdWVFdmVudChkYXRhLCB2YWx1ZSwgZXNxdWVtYSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gZXNxdWVtYS5wcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgaWYgKGVzcXVlbWEucHJvcGVydGllc1trZXldW2V2ZW50XSkge1xyXG4gICAgICAgICAgZXNxdWVtYS5wcm9wZXJ0aWVzW2tleV1bZXZlbnRdLmZvckVhY2goKHZhbHVlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZUV2ZW50KGRhdGEsIHZhbHVlLCBlc3F1ZW1hKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRWYWx1ZUV2ZW50KGRhdGE6IGFueSwgcGFyYW1zOiB7IHNjb3BlOiBzdHJpbmdbXSwgb3A6IHN0cmluZywga2V5PzogYW55LCBzZXBhcmF0b3I/OiBzdHJpbmcgfSwgZXNxdWVtYTogU2hlbWEpIHtcclxuICAgIGxldCBkYXRlID0gbW9tZW50KG5ldyBEYXRlKCkpO1xyXG4gICAgc3dpdGNoIChwYXJhbXMub3ApIHtcclxuICAgICAgY2FzZSAnc3VtJzpcclxuICAgICAgICBqc29ucGF0aC52YWx1ZShkYXRhLCBwYXJhbXMuc2NvcGVbMV0sIGpzb25wYXRoLnF1ZXJ5KGRhdGEsIHBhcmFtcy5zY29wZVswXSkucmVkdWNlKChhY2MsIGN1cikgPT4gYWNjICs9IHBhcmFtcz8ua2V5ID8gY3VyW3BhcmFtcy5rZXldIDogY3VyLCAwKSlcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnY29uY2F0JzpcclxuICAgICAgICBsZXQgYXJyYXk6IHN0cmluZ1tdID0gW11cclxuICAgICAgICBwYXJhbXM/LmtleT8ucmVkdWNlKChhY2M6IGFueVtdLCBjdXI6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgYXJyYXkucHVzaChqc29ucGF0aC5xdWVyeShkYXRhLCBjdXIpWzBdKVxyXG4gICAgICAgIH0sIFtdKVxyXG4gICAgICAgIGlmIChwYXJhbXM/LnNlcGFyYXRvcikganNvbnBhdGgudmFsdWUoZGF0YSwgcGFyYW1zLnNjb3BlWzBdLCBhcnJheS5qb2luKHBhcmFtcz8uc2VwYXJhdG9yIHx8ICcgJykpXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2VuYWJsZSc6XHJcbiAgICAgICAganNvbnBhdGgudmFsdWUoZXNxdWVtYSwgcGFyYW1zLnNjb3BlWzBdLCBmYWxzZSlcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnZGlzYWJsZWQnOlxyXG4gICAgICAgIGpzb25wYXRoLnZhbHVlKGVzcXVlbWEsIHBhcmFtcy5zY29wZVswXSwgdHJ1ZSlcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAncmVwbGFjZTplbmRwb2ludCc6XHJcbiAgICAgICAganNvbnBhdGgudmFsdWUoZXNxdWVtYSwgcGFyYW1zLnNjb3BlWzBdLCBlc3F1ZW1hLmNvbmZpZy5lbmRwb2ludHRlbXAucmVwbGFjZShwYXJhbXMuc2NvcGVbMV0sIGpzb25wYXRoLnF1ZXJ5KGRhdGEsIGAkLi4ke3BhcmFtcy5rZXl9YCkpKVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdzZXROdWxsJzpcclxuICAgICAgICBqc29ucGF0aC52YWx1ZShkYXRhLCBgJC4ke3BhcmFtcy5rZXl9YCwgbnVsbCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnZGF0ZWRpZmY6eWVhcnMnOlxyXG4gICAgICAgICAganNvbnBhdGgudmFsdWUoZGF0YSwgcGFyYW1zLnNjb3BlWzBdLCBkYXRlLmRpZmYobW9tZW50KGpzb25wYXRoLnF1ZXJ5KGRhdGEsIHBhcmFtcy5zY29wZVsxXSlbMF0pLCAneWVhcnMnKSlcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ2RhdGVkaWZmOm1vbnRocyc6XHJcbiAgICAgICAgICBqc29ucGF0aC52YWx1ZShkYXRhLCBwYXJhbXMuc2NvcGVbMF0sIGRhdGUuZGlmZihtb21lbnQoanNvbnBhdGgucXVlcnkoZGF0YSwgcGFyYW1zLnNjb3BlWzFdKVswXSksICdtb250aHMnKSlcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ2RhdGVkaWZmOndlZWtzJzpcclxuICAgICAgICAgIGpzb25wYXRoLnZhbHVlKGRhdGEsIHBhcmFtcy5zY29wZVswXSwgZGF0ZS5kaWZmKG1vbWVudChqc29ucGF0aC5xdWVyeShkYXRhLCBwYXJhbXMuc2NvcGVbMV0pWzBdKSwgJ3dlZWtzJykpXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdkYXRlZGlmZjpkYXlzJzpcclxuICAgICAgICAgIGpzb25wYXRoLnZhbHVlKGRhdGEsIHBhcmFtcy5zY29wZVswXSwgZGF0ZS5kaWZmKG1vbWVudChqc29ucGF0aC5xdWVyeShkYXRhLCBwYXJhbXMuc2NvcGVbMV0pWzBdKSwgJ2RheXMnKSlcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2coJ3NldFZhbHVlRXZlbnQgc2FsZTonKVxyXG4gICAgY29uc29sZS5sb2coZGF0YSlcclxuICAgIGNvbnNvbGUubG9nKGVzcXVlbWEpXHJcbiAgICBjb25zb2xlLmxvZyhwYXJhbXMpXHJcblxyXG4gIH1cclxuXHJcblxyXG59XHJcblxyXG4gIGV4cG9ydCBjbGFzcyBDaGFuZ2VEYXRhIHtcclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICBwdWJsaWMgdmFsdWU6IHN0cmluZyxcclxuICAgICAgcHVibGljIHNjb3BlOiBzdHJpbmcsXHJcbiAgICAgIHB1YmxpYyBpbmRleDogbnVtYmVyXHJcbiAgICApe31cclxuICB9XHJcblxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIExvYWRpbmcge1xyXG4gICAgdGFyZ2V0OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCxcclxuICAgIGluUHJvZ3Jlc3M6IGJvb2xlYW5cclxuICB9XHJcbiJdfQ==
|