@hestia-earth/ui-components 0.0.17 → 0.0.20
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/hestia-earth-ui-components.umd.js +114 -53
- package/bundles/hestia-earth-ui-components.umd.js.map +1 -1
- package/common/blank-node-state/blank-node-state.component.d.ts +4 -3
- package/common/blank-node-state-notice/blank-node-state-notice.component.d.ts +2 -1
- package/esm2015/common/blank-node-state/blank-node-state.component.js +7 -4
- package/esm2015/common/blank-node-state-notice/blank-node-state-notice.component.js +5 -2
- package/esm2015/cycles/cycles-activity/cycles-activity.component.js +1 -1
- package/esm2015/cycles/cycles-completeness/cycles-completeness.component.js +1 -1
- package/esm2015/cycles/cycles-emissions/cycles-emissions.component.js +1 -1
- package/esm2015/cycles/cycles-practices/cycles-practices.component.js +1 -1
- package/esm2015/files/files-error.model.js +2 -2
- package/esm2015/fontawesome/fontawesome.module.js +3 -3
- package/esm2015/impact-assessments/impact-assessments-products/impact-assessments-products.component.js +2 -2
- package/esm2015/node/node-logs-models/node-logs-models.component.js +81 -31
- package/esm2015/node/node.service.js +1 -1
- package/esm2015/sites/sites-measurements/sites-measurements.component.js +1 -1
- package/fesm2015/hestia-earth-ui-components.js +97 -41
- package/fesm2015/hestia-earth-ui-components.js.map +1 -1
- package/node/node-logs-models/node-logs-models.component.d.ts +30 -4
- package/node/node.service.d.ts +1 -0
- package/package.json +1 -1
|
@@ -21,11 +21,11 @@ import * as i9 from "../../common/times.pipe";
|
|
|
21
21
|
import * as i10 from "../../common/default.pipe";
|
|
22
22
|
import * as i11 from "../../common/precision.pipe";
|
|
23
23
|
import * as i12 from "../../common/key-to-label.pipe";
|
|
24
|
-
import * as i13 from "../../common/
|
|
25
|
-
import * as i14 from "../../common/
|
|
24
|
+
import * as i13 from "../../common/keys.pipe";
|
|
25
|
+
import * as i14 from "../../common/pluralize.pipe";
|
|
26
26
|
const get = require('lodash.get');
|
|
27
27
|
const orderBy = require('lodash.orderby');
|
|
28
|
-
const reduceValues = (values, termId) => values.length ? values.reduce((p, v) => p + propertyValue(v.value, termId), 0) :
|
|
28
|
+
const reduceValues = (values, termId) => values.length ? values.reduce((p, v) => p + propertyValue(v.value, termId), 0) : undefined;
|
|
29
29
|
const logSubValue = (logs, key, prop) => logs[key][prop] ? (Array.isArray(logs[key][prop]) ?
|
|
30
30
|
logs[key][prop].map(value => ({ key: prop, value })) :
|
|
31
31
|
{ key: prop, value: logs[key][prop] }) : undefined;
|
|
@@ -40,6 +40,28 @@ const logSubValues = (logs) => Object.keys(logs)
|
|
|
40
40
|
.filter(Boolean)
|
|
41
41
|
.map(v => (Object.assign(Object.assign({}, v), { configModels: [key] }))));
|
|
42
42
|
const logKeys = (logs) => Object.keys(logs).filter(key => logs[key].isKey);
|
|
43
|
+
var LogStatus;
|
|
44
|
+
(function (LogStatus) {
|
|
45
|
+
LogStatus["success"] = "successful";
|
|
46
|
+
LogStatus["error"] = "failed";
|
|
47
|
+
LogStatus["skipHierarchy"] = "not run (model higher up hierarchy run instead)";
|
|
48
|
+
LogStatus["dataProvided"] = "not run (user provided data retained)";
|
|
49
|
+
LogStatus["notRequired"] = "not run (not required to run)";
|
|
50
|
+
})(LogStatus || (LogStatus = {}));
|
|
51
|
+
const logIcon = {
|
|
52
|
+
[LogStatus.success]: 'check',
|
|
53
|
+
[LogStatus.error]: 'times',
|
|
54
|
+
[LogStatus.skipHierarchy]: ['far', 'circle'],
|
|
55
|
+
[LogStatus.dataProvided]: 'circle',
|
|
56
|
+
[LogStatus.notRequired]: 'minus-circle'
|
|
57
|
+
};
|
|
58
|
+
const logColor = {
|
|
59
|
+
[LogStatus.success]: 'success',
|
|
60
|
+
[LogStatus.error]: 'danger',
|
|
61
|
+
[LogStatus.skipHierarchy]: 'dark',
|
|
62
|
+
[LogStatus.dataProvided]: 'dark',
|
|
63
|
+
[LogStatus.notRequired]: 'grey'
|
|
64
|
+
};
|
|
43
65
|
export class NodeLogsModelsComponent {
|
|
44
66
|
constructor(searchService, hestiaEngineService) {
|
|
45
67
|
this.searchService = searchService;
|
|
@@ -56,6 +78,10 @@ export class NodeLogsModelsComponent {
|
|
|
56
78
|
this.blankNodes = [];
|
|
57
79
|
this.methodModelsCount = 0;
|
|
58
80
|
this.onlyWithData = true;
|
|
81
|
+
this.showLegend = true;
|
|
82
|
+
this.LogStatus = LogStatus;
|
|
83
|
+
this.logIcon = logIcon;
|
|
84
|
+
this.logColor = logColor;
|
|
59
85
|
this.suggestTerm = (text$) => text$.pipe(distinctUntilChanged(), switchMap(v => this.suggestByTerm(v)));
|
|
60
86
|
}
|
|
61
87
|
ngOnInit() {
|
|
@@ -84,16 +110,16 @@ export class NodeLogsModelsComponent {
|
|
|
84
110
|
undefined;
|
|
85
111
|
this.allTerms = yield this.fetchAllTerms();
|
|
86
112
|
this.allBlankNodes = this.allTerms.flatMap(term => {
|
|
87
|
-
const
|
|
113
|
+
const termLogs = get(this.logs, term['@id'], {});
|
|
88
114
|
const original = originalValues.filter(v => term['@id'] === v.term['@id']);
|
|
89
115
|
const recalculated = recalculatedValues.filter(v => term['@id'] === v.term['@id']);
|
|
90
|
-
const hasData = !!original.length || !!recalculated.length || Object.keys(
|
|
116
|
+
const hasData = !!original.length || !!recalculated.length || Object.keys(termLogs).length > 0;
|
|
91
117
|
const configModels = unique([
|
|
92
118
|
...findConfigModels(this.config, term['@id'], this.nodeKey).map(({ model }) => model),
|
|
93
|
-
...Object.keys(
|
|
94
|
-
]).filter(key => !(key in
|
|
95
|
-
const keys = logKeys(
|
|
96
|
-
const subValues = logSubValues(
|
|
119
|
+
...Object.keys(termLogs).filter(key => !isBackgroundNoInput(termLogs, key))
|
|
120
|
+
]).filter(key => !(key in termLogs) || (!termLogs[key].isKey && !termLogs[key].input && !termLogs[key].property));
|
|
121
|
+
const keys = logKeys(termLogs);
|
|
122
|
+
const subValues = logSubValues(termLogs);
|
|
97
123
|
return {
|
|
98
124
|
isOpen: true,
|
|
99
125
|
canOpen: keys.length > 0 || subValues.length > 0,
|
|
@@ -102,12 +128,13 @@ export class NodeLogsModelsComponent {
|
|
|
102
128
|
configModels,
|
|
103
129
|
original: reduceValues(original, term['@id']),
|
|
104
130
|
recalculated: reduceValues(recalculated, term['@id']),
|
|
105
|
-
|
|
131
|
+
isOriginal: !!original.length,
|
|
132
|
+
isRecalculated: recalculated.some(v => ([
|
|
106
133
|
...(v.added || []),
|
|
107
134
|
...(v.updated || [])
|
|
108
135
|
]).includes('value')),
|
|
109
136
|
hasData,
|
|
110
|
-
logs:
|
|
137
|
+
logs: termLogs,
|
|
111
138
|
keys,
|
|
112
139
|
subValues
|
|
113
140
|
};
|
|
@@ -139,6 +166,28 @@ export class NodeLogsModelsComponent {
|
|
|
139
166
|
togglePopover(popover, context) {
|
|
140
167
|
return popover.isOpen() ? popover.close() : popover.open(context);
|
|
141
168
|
}
|
|
169
|
+
isBackground({ logs }, methodId) {
|
|
170
|
+
const log = logs[methodId];
|
|
171
|
+
return (log === null || log === void 0 ? void 0 : log.methodTier) === EmissionMethodTier.background;
|
|
172
|
+
}
|
|
173
|
+
isRequired({ logs }, methodId) {
|
|
174
|
+
const log = logs[methodId];
|
|
175
|
+
return !('shouldRunOrchestrator' in log) || log.shouldRunOrchestrator;
|
|
176
|
+
}
|
|
177
|
+
shouldRun({ logs }, methodId) {
|
|
178
|
+
const log = logs[methodId];
|
|
179
|
+
return log.shouldRun;
|
|
180
|
+
}
|
|
181
|
+
isUserProvided(node, methodId) {
|
|
182
|
+
const log = node.logs[methodId];
|
|
183
|
+
return [
|
|
184
|
+
typeof node.original === 'undefined',
|
|
185
|
+
node.isRecalculated,
|
|
186
|
+
this.isBackground(node, methodId),
|
|
187
|
+
log === null || log === void 0 ? void 0 : log.isKey,
|
|
188
|
+
this.hasLog(node, methodId, false) // skip if contains logs other than orchestrator
|
|
189
|
+
].every(v => !v);
|
|
190
|
+
}
|
|
142
191
|
validSubValue(node, index, subValue) {
|
|
143
192
|
const methodId = this.getMethodIdAt(node, index, subValue);
|
|
144
193
|
const log = get(node.logs[methodId], subValue === null || subValue === void 0 ? void 0 : subValue.key, null);
|
|
@@ -157,29 +206,30 @@ export class NodeLogsModelsComponent {
|
|
|
157
206
|
((_c = logs[methodId]) === null || _c === void 0 ? void 0 : _c.model) ||
|
|
158
207
|
(methodId ? keyToLabel(methodId) : '');
|
|
159
208
|
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
}
|
|
164
|
-
isSkipped(node, methodId) {
|
|
165
|
-
const log = node.logs[methodId];
|
|
166
|
-
return [
|
|
167
|
-
node.isRecalculated,
|
|
168
|
-
this.isBackground(node, methodId),
|
|
169
|
-
log === null || log === void 0 ? void 0 : log.isKey,
|
|
170
|
-
this.hasLog(node, methodId)
|
|
171
|
-
].every(v => !v);
|
|
172
|
-
}
|
|
173
|
-
hasLog({ logs }, methodId) {
|
|
174
|
-
return methodId in logs && 'shouldRun' in logs[methodId];
|
|
209
|
+
hasLog({ logs }, methodId, withOrchestrator = true) {
|
|
210
|
+
return methodId in logs && ('shouldRun' in logs[methodId] ||
|
|
211
|
+
(withOrchestrator && 'shouldRunOrchestrator' in logs[methodId]));
|
|
175
212
|
}
|
|
176
213
|
hasLogDetails(node, methodId) {
|
|
177
214
|
var _a;
|
|
178
215
|
const log = node.logs[methodId];
|
|
179
|
-
return
|
|
216
|
+
return [
|
|
217
|
+
LogStatus.success,
|
|
218
|
+
LogStatus.error
|
|
219
|
+
].includes(this.logStatus(node, methodId)) && ((log === null || log === void 0 ? void 0 : log.requirements) || (log === null || log === void 0 ? void 0 : log.logs) || ((_a = log === null || log === void 0 ? void 0 : log.missingLookups) === null || _a === void 0 ? void 0 : _a.length));
|
|
180
220
|
}
|
|
181
|
-
|
|
182
|
-
return
|
|
221
|
+
logStatus(node, methodId) {
|
|
222
|
+
return this.isUserProvided(node, methodId) ?
|
|
223
|
+
LogStatus.dataProvided :
|
|
224
|
+
(this.hasLog(node, methodId) ?
|
|
225
|
+
(this.isRequired(node, methodId) ?
|
|
226
|
+
(this.shouldRun(node, methodId) ?
|
|
227
|
+
LogStatus.success :
|
|
228
|
+
LogStatus.error) :
|
|
229
|
+
(node.isRecalculated ?
|
|
230
|
+
LogStatus.skipHierarchy :
|
|
231
|
+
LogStatus.notRequired)) :
|
|
232
|
+
LogStatus.skipHierarchy);
|
|
183
233
|
}
|
|
184
234
|
requirementColor(value) {
|
|
185
235
|
return !value || ['None', 'False', '0', '0.0'].includes(value) ? 'danger' : 'white';
|
|
@@ -192,7 +242,7 @@ export class NodeLogsModelsComponent {
|
|
|
192
242
|
}
|
|
193
243
|
}
|
|
194
244
|
NodeLogsModelsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: NodeLogsModelsComponent, deps: [{ token: i1.HeSearchService }, { token: i2.HeEngineService }], target: i0.ɵɵFactoryTarget.Component });
|
|
195
|
-
NodeLogsModelsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: NodeLogsModelsComponent, selector: "he-node-logs-models", inputs: { nodeType: "nodeType", nodeKey: "nodeKey", logsUrl: "logsUrl", originalValues: "originalValues", recalculatedValues: "recalculatedValues", terms: "terms", logs: "logs", filteredType: "filteredType" }, ngImport: i0, template: "<div class=\"px-3 pb-3\">\n <div class=\"has-text-right mb-2\" *ngIf=\"!isExternal\">\n <a class=\"is-size-7\" *ngIf=\"logsUrl\" [href]=\"logsUrl\" target=\"_blank\">\n <fa-icon icon=\"external-link-alt\"></fa-icon>\n <span class=\"pl-2\">Open Full Logs</span>\n </a>\n </div>\n\n <div class=\"table-container data-table-container mb-1\">\n <table class=\"table is-narrow data-table\">\n <thead>\n <tr>\n <th class=\"width-auto\">\n <div class=\"field\">\n <div class=\"control is-expanded has-icons-right\">\n <input class=\"input search-input is-small\"\n [(ngModel)]=\"term\" name=\"term\"\n placeholder=\"Filter by name\"\n [editable]=\"false\"\n [ngbTypeahead]=\"suggestTerm\"\n (selectItem)=\"filterResults()\"\n >\n <a class=\"icon is-small is-right\"\n [class.is-hidden]=\"!term\"\n (click)=\"term = ''; filterResults();\"\n >\n <fa-icon icon=\"times\"></fa-icon>\n </a>\n </div>\n </div>\n </th>\n <th>Original</th>\n <th>Recalculated</th>\n <th *ngIf=\"originalValues?.length\">Difference</th>\n <th *ngFor=\"let c of methodModelsCount | times; let i = index\">({{i + 1}})</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngIf=\"loading\">\n <td colspan=\"5\">\n <div class=\"has-text-center py-3\">\n <fa-icon icon=\"spinner\" [pulse]=\"true\" size=\"lg\"></fa-icon>\n </div>\n </td>\n </tr>\n <ng-container *ngFor=\"let blankNode of blankNodes; trackBy: trackByBlankNode\">\n <tr [class.has-sub-rows]=\"blankNode.canOpen\">\n <td class=\"width-auto\" [attr.title]=\"blankNode.term.name\">\n <a class=\"is-inline-block is-align-top pr-2 open-node\"\n (click)=\"blankNode.isOpen = !blankNode.isOpen\"\n *ngIf=\"blankNode.canOpen\"\n >\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!blankNode.isOpen\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"blankNode.isOpen\"></fa-icon>\n </a>\n <he-node-link class=\"is-inline-block\" [node]=\"blankNode.term\">\n <span class=\"is-nowrap has-text-ellipsis\">{{blankNode.term.name}}</span>\n </he-node-link>\n </td>\n <td>\n <span>{{blankNode.original | precision:3 | default:'-'}}</span>\n </td>\n <td>\n <span *ngIf=\"blankNode.isRecalculated; else notUpdated\">\n {{blankNode.recalculated | precision:3 | default:'-'}}\n </span>\n </td>\n <td *ngIf=\"originalValues?.length\" class=\"is-nowrap\">\n <he-blank-node-value-delta *ngIf=\"blankNode.isRecalculated\"\n [value]=\"blankNode.recalculated\"\n [originalValue]=\"blankNode.original\"\n ></he-blank-node-value-delta>\n </td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: {blankNode: blankNode}\"></ng-container>\n </tr>\n\n <ng-container *ngIf=\"blankNode.keys?.length\">\n <tr\n *ngFor=\"let key of blankNode.keys\"\n [class.is-hidden]=\"!blankNode.isOpen\"\n [class.has-sub-rows]=\"blankNode.subValues?.length\"\n >\n <td class=\"width-auto\">\n <div class=\"pl-3 has-text-left\">\n <span class=\"pr-1 is-align-top\">Field:</span>\n <a class=\"is-inline-block\" *ngIf=\"blankNode.type\"\n [href]=\"baseUrl + '/schema/' + blankNode.type + '#' + key\" target=\"_blank\" [title]=\"key\"\n >\n <span class=\"is-nowrap has-text-ellipsis\">{{key}}</span>\n </a>\n <span class=\"is-inline-block is-align-top\" *ngIf=\"!blankNode.type\">{{key}}</span>\n </div>\n </td>\n <td [attr.colspan]=\"originalValues?.length ? 3 : 2\"></td>\n <td class=\"blank-node-index-key\">\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: {blankNode: blankNode, methodId: key}\"></ng-container>\n </td>\n <td *ngIf=\"methodModelsCount > 1\" [attr.colspan]=\"methodModelsCount - 1\"></td>\n </tr>\n </ng-container>\n\n <tr\n *ngFor=\"let subValue of blankNode.subValues\"\n [class.is-hidden]=\"!blankNode.isOpen\"\n >\n <td>\n <div class=\"pl-3 has-text-left\">\n <div class=\"is-inline-block is-nowrap has-text-ellipsis\">\n <span class=\"is-align-top\">{{subValue.key | keyToLabel}}</span>\n <ng-container *ngIf=\"subValue.value\">\n <span class=\"pr-1 is-align-top\">:</span>\n <ng-container [ngSwitch]=\"subValue.key\">\n <span *ngSwitchCase=\"'backgroundData'\">{{subValue.value | keyToLabel}}</span>\n <ng-container *ngSwitchDefault>\n <he-node-link class=\"is-inline-block\" [node]=\"{'@type':'Term','@id':subValue.value}\">\n <span class=\"is-nowrap has-text-ellipsis\">{{subValue.value | keyToLabel}}</span>\n </he-node-link>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </td>\n <td [attr.colspan]=\"originalValues?.length ? 3 : 2\"></td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: {blankNode: blankNode, subValue: subValue}\"></ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n\n <div class=\"is-size-7 is-italic\">\n <div class=\"columns is-variable is-1 my-0\">\n <div class=\"column is-narrow\">\n <span>Models:</span>\n </div>\n <div class=\"column is-narrow has-text-success\">\n <fa-icon icon=\"check\"></fa-icon>\n <span class=\"pl-1\">successful</span>\n </div>\n <div class=\"column is-narrow has-text-danger\">\n <fa-icon icon=\"times\"></fa-icon>\n <span class=\"pl-1\">failed</span>\n </div>\n <div class=\"column is-narrow has-text-dark\">\n <fa-icon [icon]=\"['far', 'circle']\"></fa-icon>\n <span class=\"pl-1\">not run (model higher up hierarchy run instead)</span>\n </div>\n <div class=\"column is-narrow has-text-dark\">\n <fa-icon icon=\"circle\"></fa-icon>\n <span class=\"pl-1\">not run (user provided data retained)</span>\n </div>\n <div class=\"column has-text-right\" *ngIf=\"filteredType\">\n <label class=\"is-inline-block checkbox\">\n <input type=\"checkbox\" class=\"selector\"\n [(ngModel)]=\"onlyWithData\"\n (change)=\"filterResults()\"\n >\n <span class=\"ml-2\">Show only recalculated {{filteredType | pluralize}}</span>\n </label>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #blankNodeModels let-blankNode=\"blankNode\" let-subValue=\"subValue\">\n <td class=\"blank-node-index-{{i}}\" *ngFor=\"let c of methodModelsCount | times; let i = index\">\n <ng-container *ngIf=\"validSubValue(blankNode, i, subValue)\">\n <ng-container *ngIf=\"getMethodIdAt(blankNode, i, subValue); let methodId\">\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: {blankNode: blankNode, methodId: methodId}\"></ng-container>\n </ng-container>\n </ng-container>\n </td>\n</ng-template>\n\n<ng-template #blankNodeModel let-blankNode=\"blankNode\" let-methodId=\"methodId\">\n <span\n [class.trigger-popover]=\"hasLogDetails(blankNode, methodId)\"\n [ngbPopover]=\"logDetails\" [autoClose]=\"'outside'\"\n triggers=\"manual\" #p=\"ngbPopover\" placement=\"left\" container=\"body\"\n (click)=\"hasLogDetails(blankNode, methodId) ? togglePopover(p, { log: blankNode.logs[methodId] }) : null\"\n >\n <span class=\"is-capitalized\">{{methodName(blankNode, methodId)}}</span>\n <span class=\"pl-1\" *ngIf=\"hasLog(blankNode, methodId) && blankNode.logs[methodId].methodTier\">[{{blankNode.logs[methodId].methodTier}}]</span>\n <span class=\"pl-1 has-text-{{logColor(blankNode, methodId)}}\">\n <fa-icon *ngIf=\"isSkipped(blankNode, methodId)\" icon=\"circle\"></fa-icon>\n <fa-icon *ngIf=\"!isSkipped(blankNode, methodId) && !hasLog(blankNode, methodId)\" [icon]=\"['far', 'circle']\"></fa-icon>\n <fa-icon *ngIf=\"!isSkipped(blankNode, methodId) && hasLog(blankNode, methodId)\" [icon]=\"blankNode.logs[methodId].shouldRun ? 'check' : 'times'\"></fa-icon>\n </span>\n </span>\n</ng-template>\n\n<ng-template #notUpdated>\n <span>not updated</span>\n</ng-template>\n\n<ng-template #logDetails let-log=\"log\">\n <ng-container *ngIf=\"log.requirements\">\n <p *ngFor=\"let key of log.requirements | keys\" class=\"has-text-{{requirementColor(key.value)}}\">\n {{key.key}}: {{key.value}}\n </p>\n </ng-container>\n <ng-container *ngIf=\"log.logs\">\n <p *ngFor=\"let key of log.logs | keys\">\n {{key.key}}: {{key.value}}\n </p>\n </ng-container>\n <ng-container *ngIf=\"log.missingLookups?.length\">\n <p class=\"mt-2\">Missing lookups:</p>\n\n <div class=\"table-container data-table-container\">\n <table class=\"table is-fullwidth mb-0\">\n <thead class=\"has-background-black\">\n <tr>\n <th>\n <span class=\"has-text-white\">Filename</span>\n </th>\n <th>\n <span class=\"has-text-white\">Column Title</span>\n </th>\n <th>\n <span class=\"has-text-white\">Row (term.id)</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"has-background-black has-text-white\">\n <tr *ngFor=\"let data of log.missingLookups\">\n <td>{{data.filename}}</td>\n <td>{{data.column}}</td>\n <td>{{data.termId}}</td>\n </tr>\n </tbody>\n </table>\n </div>\n </ng-container>\n</ng-template>\n", styles: [":host{display:block}table.data-table th:nth-child(2),table.data-table td:nth-child(2){min-width:60px}table.data-table th:nth-child(3),table.data-table td:nth-child(3){min-width:100px}table.data-table tr.has-sub-rows td{border-bottom-style:dotted}table.data-table td he-node-link{width:190px}table.data-table td .open-node+he-node-link{width:170px}\n"], components: [{ type: i3.FaIconComponent, selector: "fa-icon", inputs: ["classes", "icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }, { type: i4.NodeLinkComponent, selector: "he-node-link", inputs: ["node", "showExternalLink"] }, { type: i5.BlankNodeValueDeltaComponent, selector: "he-blank-node-value-delta", inputs: ["value", "originalValue", "displayType"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i8.NgbTypeahead, selector: "input[ngbTypeahead]", inputs: ["autocomplete", "placement", "container", "editable", "focusFirst", "showHint", "inputFormatter", "ngbTypeahead", "resultFormatter", "resultTemplate"], outputs: ["selectItem"], exportAs: ["ngbTypeahead"] }, { type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i6.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i6.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i6.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i7.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i8.NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disablePopover", "popoverClass", "openDelay", "closeDelay", "ngbPopover", "popoverTitle"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }], pipes: { "times": i9.TimesPipe, "default": i10.DefaultPipe, "precision": i11.PrecisionPipe, "keyToLabel": i12.KeyToLabelPipe, "pluralize": i13.PluralizePipe, "keys": i14.KeysPipe } });
|
|
245
|
+
NodeLogsModelsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: NodeLogsModelsComponent, selector: "he-node-logs-models", inputs: { nodeType: "nodeType", nodeKey: "nodeKey", logsUrl: "logsUrl", originalValues: "originalValues", recalculatedValues: "recalculatedValues", terms: "terms", logs: "logs", filteredType: "filteredType" }, ngImport: i0, template: "<div class=\"px-3 pb-3\">\n <div class=\"has-text-right mb-2\" *ngIf=\"!isExternal\">\n <a class=\"is-size-7\" *ngIf=\"logsUrl\" [href]=\"logsUrl\" target=\"_blank\">\n <fa-icon icon=\"external-link-alt\"></fa-icon>\n <span class=\"pl-2\">Open Full Logs</span>\n </a>\n </div>\n\n <div class=\"table-container data-table-container mb-1\">\n <table class=\"table is-narrow data-table\">\n <thead>\n <tr>\n <th class=\"width-auto\">\n <div class=\"field\">\n <div class=\"control is-expanded has-icons-right\">\n <input class=\"input search-input is-small\"\n [(ngModel)]=\"term\" name=\"term\"\n placeholder=\"Filter by name\"\n [editable]=\"false\"\n [ngbTypeahead]=\"suggestTerm\"\n (selectItem)=\"filterResults()\"\n >\n <a class=\"icon is-small is-right\"\n [class.is-hidden]=\"!term\"\n (click)=\"term = ''; filterResults();\"\n >\n <fa-icon icon=\"times\"></fa-icon>\n </a>\n </div>\n </div>\n </th>\n <th>Original</th>\n <th>Recalculated</th>\n <th *ngIf=\"originalValues?.length\">Difference</th>\n <th *ngFor=\"let c of methodModelsCount | times; let i = index\">({{i + 1}})</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngIf=\"loading\">\n <td colspan=\"5\">\n <div class=\"has-text-center py-3\">\n <fa-icon icon=\"spinner\" [pulse]=\"true\" size=\"lg\"></fa-icon>\n </div>\n </td>\n </tr>\n <ng-container *ngFor=\"let blankNode of blankNodes; trackBy: trackByBlankNode\">\n <tr [class.has-sub-rows]=\"blankNode.canOpen\">\n <td class=\"width-auto\" [attr.title]=\"blankNode.term.name\">\n <a class=\"is-inline-block is-align-top pr-2 open-node\"\n (click)=\"blankNode.isOpen = !blankNode.isOpen\"\n *ngIf=\"blankNode.canOpen\"\n >\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!blankNode.isOpen\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"blankNode.isOpen\"></fa-icon>\n </a>\n <he-node-link class=\"is-inline-block\" [node]=\"blankNode.term\">\n <span class=\"is-nowrap has-text-ellipsis\">{{blankNode.term.name}}</span>\n </he-node-link>\n </td>\n <td>\n <span>{{blankNode.original | precision:3 | default:'-'}}</span>\n </td>\n <td>\n <span *ngIf=\"!blankNode.isOriginal || blankNode.isRecalculated; else notUpdated\">\n {{blankNode.recalculated | precision:3 | default:'-'}}\n </span>\n </td>\n <td *ngIf=\"originalValues?.length\" class=\"is-nowrap\">\n <he-blank-node-value-delta *ngIf=\"blankNode.isRecalculated\"\n [value]=\"blankNode.recalculated\"\n [originalValue]=\"blankNode.original\"\n ></he-blank-node-value-delta>\n </td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: {blankNode: blankNode}\"></ng-container>\n </tr>\n\n <ng-container *ngIf=\"blankNode.keys?.length\">\n <tr\n *ngFor=\"let key of blankNode.keys\"\n [class.is-hidden]=\"!blankNode.isOpen\"\n [class.has-sub-rows]=\"blankNode.subValues?.length\"\n >\n <td class=\"width-auto\">\n <div class=\"pl-3 has-text-left\">\n <span class=\"pr-1 is-align-top\">Field:</span>\n <a class=\"is-inline-block\" *ngIf=\"blankNode.type\"\n [href]=\"baseUrl + '/schema/' + blankNode.type + '#' + key\" target=\"_blank\" [title]=\"key\"\n >\n <span class=\"is-nowrap has-text-ellipsis\">{{key}}</span>\n </a>\n <span class=\"is-inline-block is-align-top\" *ngIf=\"!blankNode.type\">{{key}}</span>\n </div>\n </td>\n <td [attr.colspan]=\"originalValues?.length ? 3 : 2\"></td>\n <td class=\"blank-node-index-key\">\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: {blankNode: blankNode, methodId: key}\"></ng-container>\n </td>\n <td *ngIf=\"methodModelsCount > 1\" [attr.colspan]=\"methodModelsCount - 1\"></td>\n </tr>\n </ng-container>\n\n <tr\n *ngFor=\"let subValue of blankNode.subValues\"\n [class.is-hidden]=\"!blankNode.isOpen\"\n >\n <td>\n <div class=\"pl-3 has-text-left\">\n <div class=\"is-inline-block is-nowrap has-text-ellipsis\">\n <span class=\"is-align-top\">{{subValue.key | keyToLabel}}</span>\n <ng-container *ngIf=\"subValue.value\">\n <span class=\"pr-1 is-align-top\">:</span>\n <ng-container [ngSwitch]=\"subValue.key\">\n <span *ngSwitchCase=\"'backgroundData'\">{{subValue.value | keyToLabel}}</span>\n <ng-container *ngSwitchDefault>\n <he-node-link class=\"is-inline-block\" [node]=\"{'@type':'Term','@id':subValue.value}\">\n <span class=\"is-nowrap has-text-ellipsis\">{{subValue.value | keyToLabel}}</span>\n </he-node-link>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </td>\n <td [attr.colspan]=\"originalValues?.length ? 3 : 2\"></td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: {blankNode: blankNode, subValue: subValue}\"></ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n\n <div class=\"is-size-7 is-italic\">\n <div class=\"columns is-variable is-1 my-0\">\n <div class=\"column is-narrow\">\n <p>\n <a class=\"is-inline-block pr-2\"\n (click)=\"showLegend = !showLegend\"\n >\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!showLegend\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"showLegend\"></fa-icon>\n </a>\n <span class=\"is-inline-block\">Legend:</span>\n </p>\n <ul class=\"content pl-2\" [class.is-hidden]=\"!showLegend\">\n <li\n class=\"has-text-{{logColor[status.value]}}\"\n *ngFor=\"let status of LogStatus | keys\"\n >\n <fa-icon [icon]=\"logIcon[status.value]\"></fa-icon>\n <span class=\"pl-1\">{{status.value}}</span>\n </li>\n </ul>\n </div>\n <div class=\"column has-text-right\" *ngIf=\"filteredType\">\n <label class=\"is-inline-block checkbox\">\n <input type=\"checkbox\" class=\"selector\"\n [(ngModel)]=\"onlyWithData\"\n (change)=\"filterResults()\"\n >\n <span class=\"ml-2\">Show only recalculated {{filteredType | pluralize}}</span>\n </label>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #blankNodeModels let-blankNode=\"blankNode\" let-subValue=\"subValue\">\n <td class=\"blank-node-index-{{i}}\" *ngFor=\"let c of methodModelsCount | times; let i = index\">\n <ng-container *ngIf=\"validSubValue(blankNode, i, subValue)\">\n <ng-container *ngIf=\"getMethodIdAt(blankNode, i, subValue); let methodId\">\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: {blankNode: blankNode, methodId: methodId}\"></ng-container>\n </ng-container>\n </ng-container>\n </td>\n</ng-template>\n\n<ng-template #blankNodeModel let-blankNode=\"blankNode\" let-methodId=\"methodId\">\n <span\n [class.trigger-popover]=\"hasLogDetails(blankNode, methodId)\"\n [ngbPopover]=\"logDetails\" [autoClose]=\"'outside'\"\n triggers=\"manual\" #p=\"ngbPopover\" placement=\"left\" container=\"body\"\n (click)=\"hasLogDetails(blankNode, methodId) ? togglePopover(p, { log: blankNode.logs[methodId] }) : null\"\n >\n <span class=\"is-capitalized\">{{methodName(blankNode, methodId)}}</span>\n <span class=\"pl-1\" *ngIf=\"hasLog(blankNode, methodId) && blankNode.logs[methodId].methodTier\">[{{blankNode.logs[methodId].methodTier}}]</span>\n <span class=\"pl-1 has-text-{{logColor[logStatus(blankNode, methodId)]}}\">\n <fa-icon [icon]=\"logIcon[logStatus(blankNode, methodId)]\"></fa-icon>\n </span>\n </span>\n</ng-template>\n\n<ng-template #notUpdated>\n <span>not updated</span>\n</ng-template>\n\n<ng-template #logDetails let-log=\"log\">\n <ng-container *ngIf=\"log.requirements\">\n <p *ngFor=\"let key of log.requirements | keys\" class=\"has-text-{{requirementColor(key.value)}}\">\n {{key.key}}: {{key.value}}\n </p>\n </ng-container>\n <ng-container *ngIf=\"log.logs\">\n <p *ngFor=\"let key of log.logs | keys\">\n {{key.key}}: {{key.value}}\n </p>\n </ng-container>\n <ng-container *ngIf=\"log.missingLookups?.length\">\n <p class=\"mt-2\">Missing lookups:</p>\n\n <div class=\"table-container data-table-container\">\n <table class=\"table is-fullwidth mb-0\">\n <thead class=\"has-background-black\">\n <tr>\n <th>\n <span class=\"has-text-white\">Filename</span>\n </th>\n <th>\n <span class=\"has-text-white\">Column Title</span>\n </th>\n <th>\n <span class=\"has-text-white\">Row (term.id)</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"has-background-black has-text-white\">\n <tr *ngFor=\"let data of log.missingLookups\">\n <td>{{data.filename}}</td>\n <td>{{data.column}}</td>\n <td>{{data.termId}}</td>\n </tr>\n </tbody>\n </table>\n </div>\n </ng-container>\n</ng-template>\n", styles: [":host{display:block}table.data-table th:nth-child(2),table.data-table td:nth-child(2){min-width:60px}table.data-table th:nth-child(3),table.data-table td:nth-child(3){min-width:100px}table.data-table tr.has-sub-rows td{border-bottom-style:dotted}table.data-table td he-node-link{width:190px}table.data-table td .open-node+he-node-link{width:170px}\n"], components: [{ type: i3.FaIconComponent, selector: "fa-icon", inputs: ["classes", "icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }, { type: i4.NodeLinkComponent, selector: "he-node-link", inputs: ["node", "showExternalLink"] }, { type: i5.BlankNodeValueDeltaComponent, selector: "he-blank-node-value-delta", inputs: ["value", "originalValue", "displayType"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i8.NgbTypeahead, selector: "input[ngbTypeahead]", inputs: ["autocomplete", "placement", "container", "editable", "focusFirst", "showHint", "inputFormatter", "ngbTypeahead", "resultFormatter", "resultTemplate"], outputs: ["selectItem"], exportAs: ["ngbTypeahead"] }, { type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i6.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i6.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i6.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i7.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i8.NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disablePopover", "popoverClass", "openDelay", "closeDelay", "ngbPopover", "popoverTitle"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }], pipes: { "times": i9.TimesPipe, "default": i10.DefaultPipe, "precision": i11.PrecisionPipe, "keyToLabel": i12.KeyToLabelPipe, "keys": i13.KeysPipe, "pluralize": i14.PluralizePipe } });
|
|
196
246
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: NodeLogsModelsComponent, decorators: [{
|
|
197
247
|
type: Component,
|
|
198
248
|
args: [{
|
|
@@ -217,4 +267,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
|
|
|
217
267
|
}], filteredType: [{
|
|
218
268
|
type: Input
|
|
219
269
|
}] } });
|
|
220
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1sb2dzLW1vZGVscy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbm9kZS9ub2RlLWxvZ3MtbW9kZWxzL25vZGUtbG9ncy1tb2RlbHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vc3JjL25vZGUvbm9kZS1sb2dzLW1vZGVscy9ub2RlLWxvZ3MtbW9kZWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFjLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RyxPQUFPLEVBQ0ssa0JBQWtCLEVBQThDLFFBQVEsRUFBRSxZQUFZLEVBQ2pHLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBSzdDLE9BQU8sRUFBd0MsZ0JBQWdCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRyxPQUFPLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXJFLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQVBwRixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDbEMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUErQjFDLE1BQU0sWUFBWSxHQUFHLENBQUMsTUFBYSxFQUFFLE1BQWMsRUFBRSxFQUFFLENB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QUFNLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FDMUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksT0FBTyxDQUFDO2dCQUMvQixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxDQUNuQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOztxSEF2TlUsdUJBQXVCO3lHQUF2Qix1QkFBdUIsNlFDeEVwQyxnMFVBNE9BOzRGRHBLYSx1QkFBdUI7a0JBTG5DLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHFCQUFxQjtvQkFDL0IsV0FBVyxFQUFFLG1DQUFtQztvQkFDaEQsU0FBUyxFQUFFLENBQUMsbUNBQW1DLENBQUM7aUJBQ2pEO29JQVFTLFFBQVE7c0JBRGYsS0FBSztnQkFNRSxPQUFPO3NCQURkLEtBQUs7Z0JBR0MsT0FBTztzQkFEYixLQUFLO2dCQUdDLGNBQWM7c0JBRHBCLEtBQUs7Z0JBR0Usa0JBQWtCO3NCQUR6QixLQUFLO2dCQUdFLEtBQUs7c0JBRFosS0FBSztnQkFHRSxJQUFJO3NCQURYLEtBQUs7Z0JBR0MsWUFBWTtzQkFEbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGNvbXBsZXhpdHkgKi9cbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZnJvbSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3QsIGZpbHRlciwgcmVkdWNlLCB0b0FycmF5LCBtYXAsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBFbWlzc2lvbiwgRW1pc3Npb25NZXRob2RUaWVyLCBJVGVybUpTT05MRCwgUHJvZHVjdCwgSW5wdXQgYXMgSGVzdGlhSW5wdXQsIE5vZGVUeXBlLCBUZXJtVGVybVR5cGVcbn0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9zY2hlbWEnO1xuaW1wb3J0IHsgdW5pcXVlIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC91dGlscyc7XG5jb25zdCBnZXQgPSByZXF1aXJlKCdsb2Rhc2guZ2V0Jyk7XG5jb25zdCBvcmRlckJ5ID0gcmVxdWlyZSgnbG9kYXNoLm9yZGVyYnknKTtcblxuaW1wb3J0IHsgSU5vZGVMb2dzLCBJTm9kZVRlcm1Mb2dzIH0gZnJvbSAnLi4vbm9kZS5zZXJ2aWNlJztcbmltcG9ydCB7IEhlRW5naW5lU2VydmljZSwgSU9yY2hlc3RyYXRvckNvbmZpZywgZmluZENvbmZpZ01vZGVscyB9IGZyb20gJy4uLy4uL2VuZ2luZS9lbmdpbmUuc2VydmljZSc7XG5pbXBvcnQgeyBtYXRjaFRlcm1UeXBlLCBtYXRjaFR5cGUgfSBmcm9tICcuLi8uLi9zZWFyY2gvc2VhcmNoLm1vZGVsJztcbmltcG9ydCB7IEhlU2VhcmNoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlYXJjaC9zZWFyY2guc2VydmljZSc7XG5pbXBvcnQgeyBiYXNlVXJsLCBpc0V4dGVybmFsLCBrZXlUb0xhYmVsLCBwcm9wZXJ0eVZhbHVlIH0gZnJvbSAnLi4vLi4vY29tbW9uL3V0aWxzJztcblxudHlwZSBzdWJWYWx1ZUtleXMgPSAnaW5wdXQnIHwgJ3Byb3BlcnR5JztcblxuaW50ZXJmYWNlIElCbGFua05vZGVMb2dTdWJWYWx1ZSB7XG4gIGtleTogc3ViVmFsdWVLZXlzIHwgJ2JhY2tncm91bmREYXRhJztcbiAgdmFsdWU6IGFueTtcbiAgY29uZmlnTW9kZWxzOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIElCbGFua05vZGVMb2cge1xuICBpc09wZW46IGJvb2xlYW47XG4gIGNhbk9wZW46IGJvb2xlYW47XG4gIHRlcm06IElUZXJtSlNPTkxEO1xuICB0eXBlPzogc3RyaW5nO1xuICBjb25maWdNb2RlbHM6IHN0cmluZ1tdO1xuICBvcmlnaW5hbDogbnVtYmVyO1xuICByZWNhbGN1bGF0ZWQ6IG51bWJlcjtcbiAgaXNSZWNhbGN1bGF0ZWQ6IGJvb2xlYW47XG4gIGhhc0RhdGE6IGJvb2xlYW47XG4gIGxvZ3M/OiBJTm9kZVRlcm1Mb2dzO1xuICBrZXlzOiBzdHJpbmdbXTtcbiAgc3ViVmFsdWVzOiBJQmxhbmtOb2RlTG9nU3ViVmFsdWVbXTtcbn1cblxuY29uc3QgcmVkdWNlVmFsdWVzID0gKHZhbHVlczogYW55W10sIHRlcm1JZDogc3RyaW5nKSA9PlxuICB2YWx1ZXMubGVuZ3RoID8gdmFsdWVzLnJlZHVjZSgocCwgdikgPT4gcCArIHByb3BlcnR5VmFsdWUodi52YWx1ZSwgdGVybUlkKSwgMCkgOiBudWxsO1xuXG5jb25zdCBsb2dTdWJWYWx1ZSA9IChsb2dzOiBJTm9kZVRlcm1Mb2dzLCBrZXk6IHN0cmluZywgcHJvcDogc3ViVmFsdWVLZXlzKSA9PlxuICBsb2dzW2tleV1bcHJvcF0gPyAoXG4gICAgQXJyYXkuaXNBcnJheShsb2dzW2tleV1bcHJvcF0pID9cbiAgICAgIChsb2dzW2tleV1bcHJvcF0gYXMgc3RyaW5nW10pLm1hcCh2YWx1ZSA9PiAoeyBrZXk6IHByb3AsIHZhbHVlIH0gYXMgSUJsYW5rTm9kZUxvZ1N1YlZhbHVlKSk6XG4gICAgICB7IGtleTogcHJvcCwgdmFsdWU6IGxvZ3Nba2V5XVtwcm9wXSB9IGFzIElCbGFua05vZGVMb2dTdWJWYWx1ZVxuICApIDogdW5kZWZpbmVkO1xuXG5jb25zdCBpc0JhY2tncm91bmROb0lucHV0ID0gKGxvZ3M6IElOb2RlVGVybUxvZ3MsIGtleTogc3RyaW5nKSA9PlxuICBsb2dzW2tleV0ubWV0aG9kVGllciA9PT0gRW1pc3Npb25NZXRob2RUaWVyLmJhY2tncm91bmQgJiYgIWxvZ3Nba2V5XS5pbnB1dDtcblxuY29uc3QgbG9nU3ViVmFsdWVzID0gKGxvZ3M6IElOb2RlVGVybUxvZ3MpOiBJQmxhbmtOb2RlTG9nU3ViVmFsdWVbXSA9PlxuICBPYmplY3Qua2V5cyhsb2dzKVxuICAgIC5mbGF0TWFwKGtleSA9PlxuICAgICAgW1xuICAgICAgICBsb2dTdWJWYWx1ZShsb2dzLCBrZXksICdpbnB1dCcpLFxuICAgICAgICBsb2dTdWJWYWx1ZShsb2dzLCBrZXksICdwcm9wZXJ0eScpLFxuICAgICAgICAvLyBmb3IgYmFja2dyb3VuZCBkYXRhIHdpdGhvdXQgaW5wdXQsIGNvbnZlcnQgdGVybSB0byBpbnB1dCBzbyBpdCBpcyBkaXNwbGF5ZWQgYmVsb3cgdGhlIHRlcm1cbiAgICAgICAgaXNCYWNrZ3JvdW5kTm9JbnB1dChsb2dzLCBrZXkpID8geyBrZXk6ICdiYWNrZ3JvdW5kRGF0YScgfSBhcyBJQmxhbmtOb2RlTG9nU3ViVmFsdWUgOiB1bmRlZmluZWRcbiAgICAgIF0uZmxhdCgpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAubWFwKHYgPT4gKHsgLi4udiwgY29uZmlnTW9kZWxzOiBba2V5XSB9KSkpO1xuXG5jb25zdCBsb2dLZXlzID0gKGxvZ3M6IElOb2RlVGVybUxvZ3MpID0+IE9iamVjdC5rZXlzKGxvZ3MpLmZpbHRlcihrZXkgPT4gbG9nc1trZXldLmlzS2V5KTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaGUtbm9kZS1sb2dzLW1vZGVscycsXG4gIHRlbXBsYXRlVXJsOiAnLi9ub2RlLWxvZ3MtbW9kZWxzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbm9kZS1sb2dzLW1vZGVscy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIE5vZGVMb2dzTW9kZWxzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHJpdmF0ZSBjb25maWc/OiBJT3JjaGVzdHJhdG9yQ29uZmlnO1xuICBwcml2YXRlIG1vZGVsczogSVRlcm1KU09OTERbXSA9IFtdO1xuICBwcml2YXRlIGFsbFRlcm1zOiBJVGVybUpTT05MRFtdID0gW107XG4gIHByaXZhdGUgYWxsQmxhbmtOb2RlczogSUJsYW5rTm9kZUxvZ1tdID0gW107XG5cbiAgQElucHV0KClcbiAgcHJpdmF0ZSBub2RlVHlwZT86IE5vZGVUeXBlO1xuICAvKipcbiAgICogUmVzdHJpY3QgbW9kZWxzIGJ5IGtleS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHByaXZhdGUgbm9kZUtleT86IHN0cmluZztcbiAgQElucHV0KClcbiAgcHVibGljIGxvZ3NVcmw/OiBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBvcmlnaW5hbFZhbHVlczogKEVtaXNzaW9uIHwgUHJvZHVjdCB8IEhlc3RpYUlucHV0KVtdID0gW107XG4gIEBJbnB1dCgpXG4gIHByaXZhdGUgcmVjYWxjdWxhdGVkVmFsdWVzOiAoRW1pc3Npb24gfCBQcm9kdWN0IHwgSGVzdGlhSW5wdXQpW10gPSBbXTtcbiAgQElucHV0KClcbiAgcHJpdmF0ZSB0ZXJtczogSVRlcm1KU09OTERbXSA9IFtdO1xuICBASW5wdXQoKVxuICBwcml2YXRlIGxvZ3M/OiBJTm9kZUxvZ3M7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBmaWx0ZXJlZFR5cGU/OiBzdHJpbmc7XG5cbiAgcHVibGljIGJhc2VVcmwgPSBiYXNlVXJsKCk7XG4gIHB1YmxpYyBpc0V4dGVybmFsID0gaXNFeHRlcm5hbCgpO1xuICBwdWJsaWMgbG9hZGluZyA9IHRydWU7XG4gIHB1YmxpYyBibGFua05vZGVzOiBJQmxhbmtOb2RlTG9nW10gPSBbXTtcbiAgcHVibGljIG1ldGhvZE1vZGVsc0NvdW50ID0gMDtcbiAgcHVibGljIG1ldGhvZHNCeUlkPzogYW55O1xuICBwdWJsaWMgb25seVdpdGhEYXRhID0gdHJ1ZTtcblxuICBwdWJsaWMgdGVybT86IHN0cmluZztcbiAgcHVibGljIHN1Z2dlc3RUZXJtID0gKHRleHQkOiBPYnNlcnZhYmxlPHN0cmluZz4pID0+XG4gICAgdGV4dCQucGlwZShcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICBzd2l0Y2hNYXAodiA9PiB0aGlzLnN1Z2dlc3RCeVRlcm0odikpLFxuICAgICk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzZWFyY2hTZXJ2aWNlOiBIZVNlYXJjaFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBoZXN0aWFFbmdpbmVTZXJ2aWNlOiBIZUVuZ2luZVNlcnZpY2VcbiAgKSB7IH1cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNvbmZpZyA9IGF3YWl0IHRoaXMuaGVzdGlhRW5naW5lU2VydmljZS5vY2hlc3RyYXRvckNvbmZpZyh0aGlzLm5vZGVUeXBlISk7XG5cbiAgICBjb25zdCB7IHJlc3VsdHM6IG1vZGVscyB9ID0gYXdhaXQgdGhpcy5zZWFyY2hTZXJ2aWNlLnNlYXJjaDxJVGVybUpTT05MRCwgTm9kZVR5cGUuVGVybT4oe1xuICAgICAgZmllbGRzOiBbJ0B0eXBlJywgJ0BpZCcsICduYW1lJ10sXG4gICAgICBsaW1pdDogMTAwMCxcbiAgICAgIHF1ZXJ5OiB7XG4gICAgICAgIGJvb2w6IHtcbiAgICAgICAgICBtdXN0OiBbXG4gICAgICAgICAgICBtYXRjaFR5cGUoTm9kZVR5cGUuVGVybSksXG4gICAgICAgICAgICBtYXRjaFRlcm1UeXBlKFRlcm1UZXJtVHlwZS5tb2RlbClcbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLm1vZGVscyA9IG1vZGVscztcblxuICAgIHRoaXMubWV0aG9kc0J5SWQgPSBhd2FpdCBmcm9tKHRoaXMubW9kZWxzKS5waXBlKFxuICAgICAgZmlsdGVyKHYgPT4gISF2KSxcbiAgICAgIGRpc3RpbmN0KHYgPT4gdlsnQGlkJ10pLFxuICAgICAgcmVkdWNlKChwcmV2LCBjdXJyKSA9PiAoeyAuLi5wcmV2LCBbY3VyclsnQGlkJ11dOiBjdXJyIH0pLCB7fSlcbiAgICApLnRvUHJvbWlzZSgpO1xuXG4gICAgY29uc3Qgb3JpZ2luYWxWYWx1ZXMgPSAodGhpcy5vcmlnaW5hbFZhbHVlcyB8fCBbXSkuZmlsdGVyKHZhbHVlID0+ICEodmFsdWUgYXMgYW55KS5kZWxldGVkKTtcbiAgICBjb25zdCByZWNhbGN1bGF0ZWRWYWx1ZXMgPSAodGhpcy5yZWNhbGN1bGF0ZWRWYWx1ZXMgfHwgW10pLmZpbHRlcih2YWx1ZSA9PiAhKHZhbHVlIGFzIGFueSkuZGVsZXRlZCk7XG4gICAgY29uc3QgdHlwZSA9IG9yaWdpbmFsVmFsdWVzLmxlbmd0aCA/XG4gICAgICBvcmlnaW5hbFZhbHVlc1swXVsnQHR5cGUnXSB8fCBvcmlnaW5hbFZhbHVlc1swXS50eXBlIDpcbiAgICAgIHJlY2FsY3VsYXRlZFZhbHVlcy5sZW5ndGggP1xuICAgICAgICByZWNhbGN1bGF0ZWRWYWx1ZXNbMF1bJ0B0eXBlJ10gfHwgcmVjYWxjdWxhdGVkVmFsdWVzWzBdLnR5cGUgOlxuICAgICAgICB1bmRlZmluZWQ7XG4gICAgdGhpcy5hbGxUZXJtcyA9IGF3YWl0IHRoaXMuZmV0Y2hBbGxUZXJtcygpO1xuICAgIHRoaXMuYWxsQmxhbmtOb2RlcyA9IHRoaXMuYWxsVGVybXMuZmxhdE1hcCh0ZXJtID0+IHtcbiAgICAgIGNvbnN0IGVtaXNzaW9uTG9ncyA9IGdldCh0aGlzLmxvZ3MsIHRlcm1bJ0BpZCddLCB7fSkgYXMgSU5vZGVUZXJtTG9ncztcbiAgICAgIGNvbnN0IG9yaWdpbmFsID0gb3JpZ2luYWxWYWx1ZXMuZmlsdGVyKHYgPT4gdGVybVsnQGlkJ10gPT09IHYudGVybSFbJ0BpZCddKTtcbiAgICAgIGNvbnN0IHJlY2FsY3VsYXRlZCA9IHJlY2FsY3VsYXRlZFZhbHVlcy5maWx0ZXIodiA9PiB0ZXJtWydAaWQnXSA9PT0gdi50ZXJtIVsnQGlkJ10pO1xuICAgICAgY29uc3QgaGFzRGF0YSA9ICEhb3JpZ2luYWwubGVuZ3RoIHx8ICEhcmVjYWxjdWxhdGVkLmxlbmd0aCB8fCBPYmplY3Qua2V5cyhlbWlzc2lvbkxvZ3MpLmxlbmd0aCA+IDA7XG4gICAgICBjb25zdCBjb25maWdNb2RlbHMgPSB1bmlxdWUoW1xuICAgICAgICAuLi5maW5kQ29uZmlnTW9kZWxzKHRoaXMuY29uZmlnISwgdGVybVsnQGlkJ10sIHRoaXMubm9kZUtleSEpLm1hcCgoeyBtb2RlbCB9KSA9PiBtb2RlbCksXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKGVtaXNzaW9uTG9ncykuZmlsdGVyKGtleSA9PiAhaXNCYWNrZ3JvdW5kTm9JbnB1dChlbWlzc2lvbkxvZ3MsIGtleSkpXG4gICAgICBdKS5maWx0ZXIoa2V5ID0+ICEoXG4gICAgICAgIGtleSBpbiBlbWlzc2lvbkxvZ3NcbiAgICAgICkgfHwgKFxuICAgICAgICAhZW1pc3Npb25Mb2dzW2tleV0uaXNLZXkgJiYgIWVtaXNzaW9uTG9nc1trZXldLmlucHV0ICYmICFlbWlzc2lvbkxvZ3Nba2V5XS5wcm9wZXJ0eVxuICAgICAgKSk7XG4gICAgICBjb25zdCBrZXlzID0gbG9nS2V5cyhlbWlzc2lvbkxvZ3MpO1xuICAgICAgY29uc3Qgc3ViVmFsdWVzID0gbG9nU3ViVmFsdWVzKGVtaXNzaW9uTG9ncyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc09wZW46IHRydWUsXG4gICAgICAgIGNhbk9wZW46IGtleXMubGVuZ3RoID4gMCB8fCBzdWJWYWx1ZXMubGVuZ3RoID4gMCxcbiAgICAgICAgdGVybSxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgY29uZmlnTW9kZWxzLFxuICAgICAgICBvcmlnaW5hbDogcmVkdWNlVmFsdWVzKG9yaWdpbmFsLCB0ZXJtWydAaWQnXSksXG4gICAgICAgIHJlY2FsY3VsYXRlZDogcmVkdWNlVmFsdWVzKHJlY2FsY3VsYXRlZCwgdGVybVsnQGlkJ10pLFxuICAgICAgICBpc1JlY2FsY3VsYXRlZDogIXJlY2FsY3VsYXRlZC5sZW5ndGggfHwgcmVjYWxjdWxhdGVkLnNvbWUodiA9PiAoW1xuICAgICAgICAgIC4uLih2LmFkZGVkIHx8IFtdKSxcbiAgICAgICAgICAuLi4odi51cGRhdGVkIHx8IFtdKVxuICAgICAgICBdKS5pbmNsdWRlcygndmFsdWUnKSksXG4gICAgICAgIGhhc0RhdGEsXG4gICAgICAgIGxvZ3M6IGVtaXNzaW9uTG9ncyxcbiAgICAgICAga2V5cyxcbiAgICAgICAgc3ViVmFsdWVzXG4gICAgICB9O1xuICAgIH0pO1xuICAgIHRoaXMubWV0aG9kTW9kZWxzQ291bnQgPSBNYXRoLm1heC5hcHBseShNYXRoLm1heCwgdGhpcy5hbGxCbGFua05vZGVzLmZsYXRNYXAodiA9PiBbXG4gICAgICB2LmNvbmZpZ01vZGVscy5sZW5ndGgsXG4gICAgICAuLi52LnN1YlZhbHVlcy5tYXAocyA9PiBzLmNvbmZpZ01vZGVscz8ubGVuZ3RoID8/IDApXG4gICAgXSkpO1xuXG4gICAgdGhpcy5maWx0ZXJSZXN1bHRzKCk7XG5cbiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hBbGxUZXJtcygpIHtcbiAgICByZXR1cm4gZnJvbShcbiAgICAgIHRoaXMudGVybXMubGVuZ3RoID9cbiAgICAgICAgdGhpcy50ZXJtcyA6XG4gICAgICAgIFtcbiAgICAgICAgICAuLi4odGhpcy5vcmlnaW5hbFZhbHVlcyB8fCBbXSkubWFwKCh7IHRlcm0gfSkgPT4gdGVybSksXG4gICAgICAgICAgLi4uKHRoaXMucmVjYWxjdWxhdGVkVmFsdWVzIHx8IFtdKS5tYXAoKHsgdGVybSB9KSA9PiB0ZXJtKVxuICAgICAgICBdXG4gICAgKS5waXBlKFxuICAgICAgZGlzdGluY3QodiA9PiB2IVsnQGlkJ10pLFxuICAgICAgdG9BcnJheSgpLFxuICAgICAgbWFwKHYgPT4gb3JkZXJCeSh2LCBbJ25hbWUnXSwgWydhc2MnXSkpXG4gICAgKS50b1Byb21pc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgc3VnZ2VzdEJ5VGVybSh0ZXJtOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZnJvbSh0aGlzLmFsbFRlcm1zKS5waXBlKFxuICAgICAgbWFwKHYgPT4gdi5uYW1lKSxcbiAgICAgIGZpbHRlcih2ID0+IHYudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtLnRvTG93ZXJDYXNlKCkpKSxcbiAgICAgIHRvQXJyYXkoKVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgdHJhY2tCeUJsYW5rTm9kZShfaW5kZXg6IG51bWJlciwgbm9kZTogSUJsYW5rTm9kZUxvZykge1xuICAgIHJldHVybiBub2RlLnRlcm1bJ0BpZCddO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZVBvcG92ZXIocG9wb3ZlciwgY29udGV4dCkge1xuICAgIHJldHVybiBwb3BvdmVyLmlzT3BlbigpID8gcG9wb3Zlci5jbG9zZSgpIDogcG9wb3Zlci5vcGVuKGNvbnRleHQpO1xuICB9XG5cbiAgcHVibGljIHZhbGlkU3ViVmFsdWUobm9kZTogSUJsYW5rTm9kZUxvZywgaW5kZXg6IG51bWJlciwgc3ViVmFsdWU/OiBJQmxhbmtOb2RlTG9nU3ViVmFsdWUpIHtcbiAgICBjb25zdCBtZXRob2RJZCA9IHRoaXMuZ2V0TWV0aG9kSWRBdChub2RlLCBpbmRleCwgc3ViVmFsdWUpO1xuICAgIGNvbnN0IGxvZyA9IGdldChub2RlLmxvZ3MhW21ldGhvZElkXSwgc3ViVmFsdWU/LmtleSwgbnVsbCk7XG4gICAgcmV0dXJuICFzdWJWYWx1ZT8udmFsdWUgfHwgKFxuICAgICAgLy8gaW5wdXQvcHJvcGVydHkgY2FuIGJlIGFuIGFycmF5XG4gICAgICBBcnJheS5pc0FycmF5KGxvZykgPyBsb2cuaW5jbHVkZXMoc3ViVmFsdWU/LnZhbHVlKSA6IGxvZyA9PT0gc3ViVmFsdWU/LnZhbHVlXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNZXRob2RJZEF0KG5vZGU6IElCbGFua05vZGVMb2csIGluZGV4OiBudW1iZXIsIHN1YlZhbHVlPzogSUJsYW5rTm9kZUxvZ1N1YlZhbHVlKSB7XG4gICAgY29uc3QgeyBjb25maWdNb2RlbHMgfSA9IHN1YlZhbHVlIHx8IG5vZGU7XG4gICAgcmV0dXJuIGNvbmZpZ01vZGVsc1tpbmRleF07XG4gIH1cblxuICBwdWJsaWMgbWV0aG9kTmFtZSh7IGxvZ3MgfTogSUJsYW5rTm9kZUxvZywgbWV0aG9kSWQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm1ldGhvZHNCeUlkW21ldGhvZElkXT8ubmFtZSB8fFxuICAgICAgbG9ncyFbbWV0aG9kSWRdPy5rZXkgfHxcbiAgICAgIGxvZ3MhW21ldGhvZElkXT8ubW9kZWwgfHxcbiAgICAgIChtZXRob2RJZCA/IGtleVRvTGFiZWwobWV0aG9kSWQpIDogJycpO1xuICB9XG5cbiAgcHVibGljIGlzQmFja2dyb3VuZChub2RlOiBJQmxhbmtOb2RlTG9nLCBtZXRob2RJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgbG9nID0gbm9kZS5sb2dzIVttZXRob2RJZF07XG4gICAgcmV0dXJuIGxvZz8ubWV0aG9kVGllciA9PT0gRW1pc3Npb25NZXRob2RUaWVyLmJhY2tncm91bmQ7XG4gIH1cblxuICBwdWJsaWMgaXNTa2lwcGVkKG5vZGU6IElCbGFua05vZGVMb2csIG1ldGhvZElkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBsb2cgPSBub2RlLmxvZ3MhW21ldGhvZElkXTtcbiAgICByZXR1cm4gW1xuICAgICAgbm9kZS5pc1JlY2FsY3VsYXRlZCxcbiAgICAgIHRoaXMuaXNCYWNrZ3JvdW5kKG5vZGUsIG1ldGhvZElkKSxcbiAgICAgIGxvZz8uaXNLZXksXG4gICAgICB0aGlzLmhhc0xvZyhub2RlLCBtZXRob2RJZClcbiAgICBdLmV2ZXJ5KHYgPT4gIXYpO1xuICB9XG5cbiAgcHVibGljIGhhc0xvZyh7IGxvZ3MgfTogSUJsYW5rTm9kZUxvZywgbWV0aG9kSWQ6IHN0cmluZykge1xuICAgIHJldHVybiBtZXRob2RJZCBpbiBsb2dzISAmJiAnc2hvdWxkUnVuJyBpbiBsb2dzIVttZXRob2RJZF07XG4gIH1cblxuICBwdWJsaWMgaGFzTG9nRGV0YWlscyhub2RlOiBJQmxhbmtOb2RlTG9nLCBtZXRob2RJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgbG9nID0gbm9kZS5sb2dzIVttZXRob2RJZF07XG4gICAgcmV0dXJuICF0aGlzLmlzU2tpcHBlZChub2RlLCBtZXRob2RJZCkgJiYgKFxuICAgICAgbG9nPy5yZXF1aXJlbWVudHMgfHwgbG9nPy5sb2dzIHx8IGxvZz8ubWlzc2luZ0xvb2t1cHM/Lmxlbmd0aFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgbG9nQ29sb3Iobm9kZTogSUJsYW5rTm9kZUxvZywgbWV0aG9kSWQ6IHN0cmluZykge1xuICAgIHJldHVybiAhdGhpcy5pc1NraXBwZWQobm9kZSwgbWV0aG9kSWQpICYmIHRoaXMuaGFzTG9nKG5vZGUsIG1ldGhvZElkKSA/IChcbiAgICAgIG5vZGUubG9ncyFbbWV0aG9kSWRdLnNob3VsZFJ1biA/ICdzdWNjZXNzJyA6ICdkYW5nZXInXG4gICAgKSA6ICdkYXJrJztcbiAgfVxuXG4gIHB1YmxpYyByZXF1aXJlbWVudENvbG9yKHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gIXZhbHVlIHx8IFsnTm9uZScsICdGYWxzZScsICcwJywgJzAuMCddLmluY2x1ZGVzKHZhbHVlKSA/ICdkYW5nZXInIDogJ3doaXRlJztcbiAgfVxuXG4gIHB1YmxpYyBmaWx0ZXJSZXN1bHRzKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5ibGFua05vZGVzID0gdGhpcy5hbGxCbGFua05vZGVzLmZpbHRlcigoeyBoYXNEYXRhLCB0ZXJtOiB7IG5hbWUgfSB9KSA9PlxuICAgICAgICAoIXRoaXMub25seVdpdGhEYXRhIHx8IGhhc0RhdGEpICYmXG4gICAgICAgICghdGhpcy50ZXJtIHx8IG5hbWUgPT09IHRoaXMudGVybSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJweC0zIHBiLTNcIj5cbiAgPGRpdiBjbGFzcz1cImhhcy10ZXh0LXJpZ2h0IG1iLTJcIiAqbmdJZj1cIiFpc0V4dGVybmFsXCI+XG4gICAgPGEgY2xhc3M9XCJpcy1zaXplLTdcIiAqbmdJZj1cImxvZ3NVcmxcIiBbaHJlZl09XCJsb2dzVXJsXCIgdGFyZ2V0PVwiX2JsYW5rXCI+XG4gICAgICA8ZmEtaWNvbiBpY29uPVwiZXh0ZXJuYWwtbGluay1hbHRcIj48L2ZhLWljb24+XG4gICAgICA8c3BhbiBjbGFzcz1cInBsLTJcIj5PcGVuIEZ1bGwgTG9nczwvc3Bhbj5cbiAgICA8L2E+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb250YWluZXIgZGF0YS10YWJsZS1jb250YWluZXIgbWItMVwiPlxuICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIGlzLW5hcnJvdyBkYXRhLXRhYmxlXCI+XG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGggY2xhc3M9XCJ3aWR0aC1hdXRvXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2wgaXMtZXhwYW5kZWQgaGFzLWljb25zLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiaW5wdXQgc2VhcmNoLWlucHV0IGlzLXNtYWxsXCJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidGVybVwiIG5hbWU9XCJ0ZXJtXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRmlsdGVyIGJ5IG5hbWVcIlxuICAgICAgICAgICAgICAgICAgW2VkaXRhYmxlXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgIFtuZ2JUeXBlYWhlYWRdPVwic3VnZ2VzdFRlcm1cIlxuICAgICAgICAgICAgICAgICAgKHNlbGVjdEl0ZW0pPVwiZmlsdGVyUmVzdWx0cygpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJpY29uIGlzLXNtYWxsIGlzLXJpZ2h0XCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1oaWRkZW5dPVwiIXRlcm1cIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRlcm0gPSAnJzsgZmlsdGVyUmVzdWx0cygpO1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cInRpbWVzXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0aD5PcmlnaW5hbDwvdGg+XG4gICAgICAgICAgPHRoPlJlY2FsY3VsYXRlZDwvdGg+XG4gICAgICAgICAgPHRoICpuZ0lmPVwib3JpZ2luYWxWYWx1ZXM/Lmxlbmd0aFwiPkRpZmZlcmVuY2U8L3RoPlxuICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgYyBvZiBtZXRob2RNb2RlbHNDb3VudCB8IHRpbWVzOyBsZXQgaSA9IGluZGV4XCI+KHt7aSArIDF9fSk8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT5cbiAgICAgICAgPHRyICpuZ0lmPVwibG9hZGluZ1wiPlxuICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiNVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhhcy10ZXh0LWNlbnRlciBweS0zXCI+XG4gICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJzcGlubmVyXCIgW3B1bHNlXT1cInRydWVcIiBzaXplPVwibGdcIj48L2ZhLWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBibGFua05vZGUgb2YgYmxhbmtOb2RlczsgdHJhY2tCeTogdHJhY2tCeUJsYW5rTm9kZVwiPlxuICAgICAgICAgIDx0ciBbY2xhc3MuaGFzLXN1Yi1yb3dzXT1cImJsYW5rTm9kZS5jYW5PcGVuXCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ3aWR0aC1hdXRvXCIgW2F0dHIudGl0bGVdPVwiYmxhbmtOb2RlLnRlcm0ubmFtZVwiPlxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImlzLWlubGluZS1ibG9jayBpcy1hbGlnbi10b3AgcHItMiBvcGVuLW5vZGVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJibGFua05vZGUuaXNPcGVuID0gIWJsYW5rTm9kZS5pc09wZW5cIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiYmxhbmtOb2RlLmNhbk9wZW5cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cImFuZ2xlLWRvd25cIiBbY2xhc3MuaXMtaGlkZGVuXT1cIiFibGFua05vZGUuaXNPcGVuXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJhbmdsZS1yaWdodFwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiYmxhbmtOb2RlLmlzT3BlblwiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICA8aGUtbm9kZS1saW5rIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrXCIgW25vZGVdPVwiYmxhbmtOb2RlLnRlcm1cIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLW5vd3JhcCBoYXMtdGV4dC1lbGxpcHNpc1wiPnt7YmxhbmtOb2RlLnRlcm0ubmFtZX19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2hlLW5vZGUtbGluaz5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgIDxzcGFuPnt7YmxhbmtOb2RlLm9yaWdpbmFsIHwgcHJlY2lzaW9uOjMgfCBkZWZhdWx0OictJ319PC9zcGFuPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJibGFua05vZGUuaXNSZWNhbGN1bGF0ZWQ7IGVsc2Ugbm90VXBkYXRlZFwiPlxuICAgICAgICAgICAgICAgIHt7YmxhbmtOb2RlLnJlY2FsY3VsYXRlZCB8IHByZWNpc2lvbjozIHwgZGVmYXVsdDonLSd9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwib3JpZ2luYWxWYWx1ZXM/Lmxlbmd0aFwiIGNsYXNzPVwiaXMtbm93cmFwXCI+XG4gICAgICAgICAgICAgIDxoZS1ibGFuay1ub2RlLXZhbHVlLWRlbHRhICpuZ0lmPVwiYmxhbmtOb2RlLmlzUmVjYWxjdWxhdGVkXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiYmxhbmtOb2RlLnJlY2FsY3VsYXRlZFwiXG4gICAgICAgICAgICAgICAgW29yaWdpbmFsVmFsdWVdPVwiYmxhbmtOb2RlLm9yaWdpbmFsXCJcbiAgICAgICAgICAgICAgPjwvaGUtYmxhbmstbm9kZS12YWx1ZS1kZWx0YT5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYmxhbmtOb2RlTW9kZWxzOyBjb250ZXh0OiB7YmxhbmtOb2RlOiBibGFua05vZGV9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC90cj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJibGFua05vZGUua2V5cz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICA8dHJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGtleSBvZiBibGFua05vZGUua2V5c1wiXG4gICAgICAgICAgICAgIFtjbGFzcy5pcy1oaWRkZW5dPVwiIWJsYW5rTm9kZS5pc09wZW5cIlxuICAgICAgICAgICAgICBbY2xhc3MuaGFzLXN1Yi1yb3dzXT1cImJsYW5rTm9kZS5zdWJWYWx1ZXM/Lmxlbmd0aFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cIndpZHRoLWF1dG9cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGwtMyBoYXMtdGV4dC1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInByLTEgaXMtYWxpZ24tdG9wXCI+RmllbGQ6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2tcIiAqbmdJZj1cImJsYW5rTm9kZS50eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgW2hyZWZdPVwiYmFzZVVybCArICcvc2NoZW1hLycgKyBibGFua05vZGUudHlwZSArICcjJyArIGtleVwiIHRhcmdldD1cIl9ibGFua1wiIFt0aXRsZV09XCJrZXlcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLW5vd3JhcCBoYXMtdGV4dC1lbGxpcHNpc1wiPnt7a2V5fX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLWlubGluZS1ibG9jayBpcy1hbGlnbi10b3BcIiAqbmdJZj1cIiFibGFua05vZGUudHlwZVwiPnt7a2V5fX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cIm9yaWdpbmFsVmFsdWVzPy5sZW5ndGggPyAzIDogMlwiPjwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImJsYW5rLW5vZGUtaW5kZXgta2V5XCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJsYW5rTm9kZU1vZGVsOyBjb250ZXh0OiB7YmxhbmtOb2RlOiBibGFua05vZGUsIG1ldGhvZElkOiBrZXl9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIm1ldGhvZE1vZGVsc0NvdW50ID4gMVwiIFthdHRyLmNvbHNwYW5dPVwibWV0aG9kTW9kZWxzQ291bnQgLSAxXCI+PC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8dHJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzdWJWYWx1ZSBvZiBibGFua05vZGUuc3ViVmFsdWVzXCJcbiAgICAgICAgICAgIFtjbGFzcy5pcy1oaWRkZW5dPVwiIWJsYW5rTm9kZS5pc09wZW5cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBsLTMgaGFzLXRleHQtbGVmdFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtbm93cmFwIGhhcy10ZXh0LWVsbGlwc2lzXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLWFsaWduLXRvcFwiPnt7c3ViVmFsdWUua2V5IHwga2V5VG9MYWJlbH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN1YlZhbHVlLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHItMSBpcy1hbGlnbi10b3BcIj46PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJzdWJWYWx1ZS5rZXlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2JhY2tncm91bmREYXRhJ1wiPnt7c3ViVmFsdWUudmFsdWUgfCBrZXlUb0xhYmVsfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGhlLW5vZGUtbGluayBjbGFzcz1cImlzLWlubGluZS1ibG9ja1wiIFtub2RlXT1cInsnQHR5cGUnOidUZXJtJywnQGlkJzpzdWJWYWx1ZS52YWx1ZX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1ub3dyYXAgaGFzLXRleHQtZWxsaXBzaXNcIj57e3N1YlZhbHVlLnZhbHVlIHwga2V5VG9MYWJlbH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oZS1ub2RlLWxpbms+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cIm9yaWdpbmFsVmFsdWVzPy5sZW5ndGggPyAzIDogMlwiPjwvdGQ+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYmxhbmtOb2RlTW9kZWxzOyBjb250ZXh0OiB7YmxhbmtOb2RlOiBibGFua05vZGUsIHN1YlZhbHVlOiBzdWJWYWx1ZX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvdGJvZHk+XG4gICAgPC90YWJsZT5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImlzLXNpemUtNyBpcy1pdGFsaWNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sdW1ucyBpcy12YXJpYWJsZSBpcy0xIG15LTBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4gaXMtbmFycm93XCI+XG4gICAgICAgIDxzcGFuPk1vZGVsczo8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4gaXMtbmFycm93IGhhcy10ZXh0LXN1Y2Nlc3NcIj5cbiAgICAgICAgPGZhLWljb24gaWNvbj1cImNoZWNrXCI+PC9mYS1pY29uPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTFcIj5zdWNjZXNzZnVsPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sdW1uIGlzLW5hcnJvdyBoYXMtdGV4dC1kYW5nZXJcIj5cbiAgICAgICAgPGZhLWljb24gaWNvbj1cInRpbWVzXCI+PC9mYS1pY29uPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTFcIj5mYWlsZWQ8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4gaXMtbmFycm93IGhhcy10ZXh0LWRhcmtcIj5cbiAgICAgICAgPGZhLWljb24gW2ljb25dPVwiWydmYXInLCAnY2lyY2xlJ11cIj48L2ZhLWljb24+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicGwtMVwiPm5vdCBydW4gKG1vZGVsIGhpZ2hlciB1cCBoaWVyYXJjaHkgcnVuIGluc3RlYWQpPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sdW1uIGlzLW5hcnJvdyBoYXMtdGV4dC1kYXJrXCI+XG4gICAgICAgIDxmYS1pY29uIGljb249XCJjaXJjbGVcIj48L2ZhLWljb24+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicGwtMVwiPm5vdCBydW4gKHVzZXIgcHJvdmlkZWQgZGF0YSByZXRhaW5lZCk8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4gaGFzLXRleHQtcmlnaHRcIiAqbmdJZj1cImZpbHRlcmVkVHlwZVwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgY2hlY2tib3hcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJzZWxlY3RvclwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm9ubHlXaXRoRGF0YVwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cImZpbHRlclJlc3VsdHMoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWwtMlwiPlNob3cgb25seSByZWNhbGN1bGF0ZWQge3tmaWx0ZXJlZFR5cGUgfCBwbHVyYWxpemV9fTwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2JsYW5rTm9kZU1vZGVscyBsZXQtYmxhbmtOb2RlPVwiYmxhbmtOb2RlXCIgbGV0LXN1YlZhbHVlPVwic3ViVmFsdWVcIj5cbiAgPHRkIGNsYXNzPVwiYmxhbmstbm9kZS1pbmRleC17e2l9fVwiICpuZ0Zvcj1cImxldCBjIG9mIG1ldGhvZE1vZGVsc0NvdW50IHwgdGltZXM7IGxldCBpID0gaW5kZXhcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFsaWRTdWJWYWx1ZShibGFua05vZGUsIGksIHN1YlZhbHVlKVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldE1ldGhvZElkQXQoYmxhbmtOb2RlLCBpLCBzdWJWYWx1ZSk7IGxldCBtZXRob2RJZFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYmxhbmtOb2RlTW9kZWw7IGNvbnRleHQ6IHtibGFua05vZGU6IGJsYW5rTm9kZSwgbWV0aG9kSWQ6IG1ldGhvZElkfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvdGQ+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2JsYW5rTm9kZU1vZGVsIGxldC1ibGFua05vZGU9XCJibGFua05vZGVcIiBsZXQtbWV0aG9kSWQ9XCJtZXRob2RJZFwiPlxuICA8c3BhblxuICAgIFtjbGFzcy50cmlnZ2VyLXBvcG92ZXJdPVwiaGFzTG9nRGV0YWlscyhibGFua05vZGUsIG1ldGhvZElkKVwiXG4gICAgW25nYlBvcG92ZXJdPVwibG9nRGV0YWlsc1wiIFthdXRvQ2xvc2VdPVwiJ291dHNpZGUnXCJcbiAgICB0cmlnZ2Vycz1cIm1hbnVhbFwiICNwPVwibmdiUG9wb3ZlclwiIHBsYWNlbWVudD1cImxlZnRcIiBjb250YWluZXI9XCJib2R5XCJcbiAgICAoY2xpY2spPVwiaGFzTG9nRGV0YWlscyhibGFua05vZGUsIG1ldGhvZElkKSA/IHRvZ2dsZVBvcG92ZXIocCwgeyBsb2c6IGJsYW5rTm9kZS5sb2dzW21ldGhvZElkXSB9KSA6IG51bGxcIlxuICA+XG4gICAgPHNwYW4gY2xhc3M9XCJpcy1jYXBpdGFsaXplZFwiPnt7bWV0aG9kTmFtZShibGFua05vZGUsIG1ldGhvZElkKX19PC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwicGwtMVwiICpuZ0lmPVwiaGFzTG9nKGJsYW5rTm9kZSwgbWV0aG9kSWQpICYmIGJsYW5rTm9kZS5sb2dzW21ldGhvZElkXS5tZXRob2RUaWVyXCI+W3t7YmxhbmtOb2RlLmxvZ3NbbWV0aG9kSWRdLm1ldGhvZFRpZXJ9fV08L3NwYW4+XG4gICAgPHNwYW4gY2xhc3M9XCJwbC0xIGhhcy10ZXh0LXt7bG9nQ29sb3IoYmxhbmtOb2RlLCBtZXRob2RJZCl9fVwiPlxuICAgICAgPGZhLWljb24gKm5nSWY9XCJpc1NraXBwZWQoYmxhbmtOb2RlLCBtZXRob2RJZClcIiBpY29uPVwiY2lyY2xlXCI+PC9mYS1pY29uPlxuICAgICAgPGZhLWljb24gKm5nSWY9XCIhaXNTa2lwcGVkKGJsYW5rTm9kZSwgbWV0aG9kSWQpICYmICFoYXNMb2coYmxhbmtOb2RlLCBtZXRob2RJZClcIiBbaWNvbl09XCJbJ2ZhcicsICdjaXJjbGUnXVwiPjwvZmEtaWNvbj5cbiAgICAgIDxmYS1pY29uICpuZ0lmPVwiIWlzU2tpcHBlZChibGFua05vZGUsIG1ldGhvZElkKSAmJiBoYXNMb2coYmxhbmtOb2RlLCBtZXRob2RJZClcIiBbaWNvbl09XCJibGFua05vZGUubG9nc1ttZXRob2RJZF0uc2hvdWxkUnVuID8gJ2NoZWNrJyA6ICd0aW1lcydcIj48L2ZhLWljb24+XG4gICAgPC9zcGFuPlxuICA8L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI25vdFVwZGF0ZWQ+XG4gIDxzcGFuPm5vdCB1cGRhdGVkPC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsb2dEZXRhaWxzIGxldC1sb2c9XCJsb2dcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvZy5yZXF1aXJlbWVudHNcIj5cbiAgICA8cCAqbmdGb3I9XCJsZXQga2V5IG9mIGxvZy5yZXF1aXJlbWVudHMgfCBrZXlzXCIgY2xhc3M9XCJoYXMtdGV4dC17e3JlcXVpcmVtZW50Q29sb3Ioa2V5LnZhbHVlKX19XCI+XG4gICAgICB7e2tleS5rZXl9fToge3trZXkudmFsdWV9fVxuICAgIDwvcD5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb2cubG9nc1wiPlxuICAgIDxwICpuZ0Zvcj1cImxldCBrZXkgb2YgbG9nLmxvZ3MgfCBrZXlzXCI+XG4gICAgICB7e2tleS5rZXl9fToge3trZXkudmFsdWV9fVxuICAgIDwvcD5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb2cubWlzc2luZ0xvb2t1cHM/Lmxlbmd0aFwiPlxuICAgIDxwIGNsYXNzPVwibXQtMlwiPk1pc3NpbmcgbG9va3Vwczo8L3A+XG5cbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29udGFpbmVyIGRhdGEtdGFibGUtY29udGFpbmVyXCI+XG4gICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBpcy1mdWxsd2lkdGggbWItMFwiPlxuICAgICAgICA8dGhlYWQgY2xhc3M9XCJoYXMtYmFja2dyb3VuZC1ibGFja1wiPlxuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0aD5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoYXMtdGV4dC13aGl0ZVwiPkZpbGVuYW1lPC9zcGFuPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDx0aD5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoYXMtdGV4dC13aGl0ZVwiPkNvbHVtbiBUaXRsZTwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICA8dGg+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGFzLXRleHQtd2hpdGVcIj5Sb3cgKHRlcm0uaWQpPC9zcGFuPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHkgY2xhc3M9XCJoYXMtYmFja2dyb3VuZC1ibGFjayBoYXMtdGV4dC13aGl0ZVwiPlxuICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgZGF0YSBvZiBsb2cubWlzc2luZ0xvb2t1cHNcIj5cbiAgICAgICAgICAgIDx0ZD57e2RhdGEuZmlsZW5hbWV9fTwvdGQ+XG4gICAgICAgICAgICA8dGQ+e3tkYXRhLmNvbHVtbn19PC90ZD5cbiAgICAgICAgICAgIDx0ZD57e2RhdGEudGVybUlkfX08L3RkPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
270
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1sb2dzLW1vZGVscy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbm9kZS9ub2RlLWxvZ3MtbW9kZWxzL25vZGUtbG9ncy1tb2RlbHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vc3JjL25vZGUvbm9kZS1sb2dzLW1vZGVscy9ub2RlLWxvZ3MtbW9kZWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFjLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RyxPQUFPLEVBQ0ssa0JBQWtCLEVBQThDLFFBQVEsRUFBRSxZQUFZLEVBQ2pHLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBSzdDLE9BQU8sRUFBd0MsZ0JBQWdCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRyxPQUFPLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXJFLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQVBwRixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDbEMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFnQzFDLE1BQU0sWUFBWSxHQUFHLENBQUMsTUFBYSxFQUFFLE1BQWMsRUFBRSxFQUFFLENBQ3JELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUU3RixNQUFNLFdBQVcsR0FBRyxDQUFDLElBQW1CLEVBQUUsR0FBVyxFQUFFLElBQWtCLEVBQUUsRUFBRSxDQUMzRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ2hCLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFjLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUE0QixDQUFBLENBQUMsQ0FBQSxDQUFDO0lBQzVGLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUEyQixDQUNqRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFFaEIsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLElBQW1CLEVBQUUsR0FBVyxFQUFFLEVBQUUsQ0FDL0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsS0FBSyxrQkFBa0IsQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBRTdFLE1BQU0sWUFBWSxHQUFHLENBQUMsSUFBbUIsRUFBMkIsRUFBRSxDQUNwRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztLQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUNiO0lBQ0UsV0FBVyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDO0lBQy9CLFdBQVcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLFVBQVUsQ0FBQztJQUNsQyw2RkFBNkY7SUFDN0YsbUJBQW1CLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBMkIsQ0FBQyxDQUFDLENBQUMsU0FBUztDQUNoRyxDQUFDLElBQUksRUFBRTtLQUNQLE1BQU0sQ0FBQyxPQUFPLENBQUM7S0FDZixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxpQ0FBTSxDQUFDLEtBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUcsQ0FBQyxDQUFDLENBQUM7QUFFbEQsTUFBTSxPQUFPLEdBQUcsQ0FBQyxJQUFtQixFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUUxRixJQUFLLFNBTUo7QUFORCxXQUFLLFNBQVM7SUFDWixtQ0FBc0IsQ0FBQTtJQUN0Qiw2QkFBZ0IsQ0FBQTtJQUNoQiw4RUFBaUUsQ0FBQTtJQUNqRSxtRUFBc0QsQ0FBQTtJQUN0RCwwREFBNkMsQ0FBQTtBQUMvQyxDQUFDLEVBTkksU0FBUyxLQUFULFNBQVMsUUFNYjtBQUVELE1BQU0sT0FBTyxHQUVUO0lBQ0YsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsT0FBTztJQUM1QixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPO0lBQzFCLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQztJQUM1QyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSxRQUFRO0lBQ2xDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFLGNBQWM7Q0FDeEMsQ0FBQztBQUVGLE1BQU0sUUFBUSxHQUVWO0lBQ0YsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsU0FBUztJQUM5QixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxRQUFRO0lBQzNCLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxFQUFFLE1BQU07SUFDakMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUUsTUFBTTtJQUNoQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRSxNQUFNO0NBQ2hDLENBQUM7QUFPRixNQUFNLE9BQU8sdUJBQXVCO0lBOENsQyxZQUNVLGFBQThCLEVBQzlCLG1CQUFvQztRQURwQyxrQkFBYSxHQUFiLGFBQWEsQ0FBaUI7UUFDOUIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFpQjtRQTlDdEMsV0FBTSxHQUFrQixFQUFFLENBQUM7UUFDM0IsYUFBUSxHQUFrQixFQUFFLENBQUM7UUFDN0Isa0JBQWEsR0FBb0IsRUFBRSxDQUFDO1FBWXJDLG1CQUFjLEdBQXlDLEVBQUUsQ0FBQztRQUV6RCx1QkFBa0IsR0FBeUMsRUFBRSxDQUFDO1FBRTlELFVBQUssR0FBa0IsRUFBRSxDQUFDO1FBTTNCLFlBQU8sR0FBRyxPQUFPLEVBQUUsQ0FBQztRQUNwQixlQUFVLEdBQUcsVUFBVSxFQUFFLENBQUM7UUFDMUIsWUFBTyxHQUFHLElBQUksQ0FBQztRQUNmLGVBQVUsR0FBb0IsRUFBRSxDQUFDO1FBQ2pDLHNCQUFpQixHQUFHLENBQUMsQ0FBQztRQUV0QixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUVwQixlQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLGNBQVMsR0FBRyxTQUFTLENBQUM7UUFDdEIsWUFBTyxHQUFHLE9BQU8sQ0FBQztRQUNsQixhQUFRLEdBQUcsUUFBUSxDQUFDO1FBR3BCLGdCQUFXLEdBQUcsQ0FBQyxLQUF5QixFQUFFLEVBQUUsQ0FDakQsS0FBSyxDQUFDLElBQUksQ0FDUixvQkFBb0IsRUFBRSxFQUN0QixTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3RDLENBQUM7SUFLQSxDQUFDO0lBRUMsUUFBUTs7WUFDWixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFTLENBQUMsQ0FBQztZQUUvRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQTZCO2dCQUN0RixNQUFNLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQztnQkFDaEMsS0FBSyxFQUFFLElBQUk7Z0JBQ1gsS0FBSyxFQUFFO29CQUNMLElBQUksRUFBRTt3QkFDSixJQUFJLEVBQUU7NEJBQ0osU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7NEJBQ3hCLGFBQWEsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO3lCQUNsQztxQkFDRjtpQkFDRjthQUNGLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBRXJCLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FDN0MsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNoQixRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFDdkIsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsaUNBQU0sSUFBSSxLQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFHLEVBQUUsRUFBRSxDQUFDLENBQy9ELENBQUMsU0FBUyxFQUFFLENBQUM7WUFFZCxNQUFNLGNBQWMsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBRSxLQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDNUYsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFFLEtBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNwRyxNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2xDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3RELGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUN6QixrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDOUQsU0FBUyxDQUFDO1lBQ2QsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNoRCxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFrQixDQUFDO2dCQUNsRSxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDNUUsTUFBTSxZQUFZLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDcEYsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dCQUMvRixNQUFNLFlBQVksR0FBRyxNQUFNLENBQUM7b0JBQzFCLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQztvQkFDdkYsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2lCQUM1RSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUNoQixHQUFHLElBQUksUUFBUSxDQUNoQixJQUFJLENBQ0gsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQ3hFLENBQUMsQ0FBQztnQkFDSCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQy9CLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDekMsT0FBTztvQkFDTCxNQUFNLEVBQUUsSUFBSTtvQkFDWixPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDO29CQUNoRCxJQUFJO29CQUNKLElBQUk7b0JBQ0osWUFBWTtvQkFDWixRQUFRLEVBQUUsWUFBWSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzdDLFlBQVksRUFBRSxZQUFZLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDckQsVUFBVSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTTtvQkFDN0IsY0FBYyxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUN0QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7d0JBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztxQkFDckIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDckIsT0FBTztvQkFDUCxJQUFJLEVBQUUsUUFBUTtvQkFDZCxJQUFJO29CQUNKLFNBQVM7aUJBQ1YsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDaEYsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNO2dCQUNyQixHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQUMsT0FBQSxNQUFBLE1BQUEsQ0FBQyxDQUFDLFlBQVksMENBQUUsTUFBTSxtQ0FBSSxDQUFDLENBQUEsRUFBQSxDQUFDO2FBQ3JELENBQUMsQ0FBQyxDQUFDO1lBRUosSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBRXJCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLENBQUM7S0FBQTtJQUVhLGFBQWE7O1lBQ3pCLE9BQU8sSUFBSSxDQUNULElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2pCLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDWjtvQkFDRSxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUM7b0JBQ3RELEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDO2lCQUMzRCxDQUNKLENBQUMsSUFBSSxDQUNKLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUN4QixPQUFPLEVBQUUsRUFDVCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQ3hDLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDaEIsQ0FBQztLQUFBO0lBRU8sYUFBYSxDQUFDLElBQVk7UUFDaEMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUNoQixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLEVBQ3pELE9BQU8sRUFBRSxDQUNWLENBQUM7SUFDSixDQUFDO0lBRU0sZ0JBQWdCLENBQUMsTUFBYyxFQUFFLElBQW1CO1FBQ3pELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRU0sYUFBYSxDQUFDLE9BQU8sRUFBRSxPQUFPO1FBQ25DLE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVPLFlBQVksQ0FBQyxFQUFFLElBQUksRUFBaUIsRUFBRSxRQUFnQjtRQUM1RCxNQUFNLEdBQUcsR0FBRyxJQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUIsT0FBTyxDQUFBLEdBQUcsYUFBSCxHQUFHLHVCQUFILEdBQUcsQ0FBRSxVQUFVLE1BQUssa0JBQWtCLENBQUMsVUFBVSxDQUFDO0lBQzNELENBQUM7SUFFTyxVQUFVLENBQUMsRUFBRSxJQUFJLEVBQWlCLEVBQUUsUUFBZ0I7UUFDMUQsTUFBTSxHQUFHLEdBQUcsSUFBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVCLE9BQU8sQ0FBQyxDQUFDLHVCQUF1QixJQUFJLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQztJQUN4RSxDQUFDO0lBRU8sU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFpQixFQUFFLFFBQWdCO1FBQ3pELE1BQU0sR0FBRyxHQUFHLElBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QixPQUFPLEdBQUcsQ0FBQyxTQUFTLENBQUM7SUFDdkIsQ0FBQztJQUVPLGNBQWMsQ0FBQyxJQUFtQixFQUFFLFFBQWdCO1FBQzFELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakMsT0FBTztZQUNMLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxXQUFXO1lBQ3BDLElBQUksQ0FBQyxjQUFjO1lBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQztZQUNqQyxHQUFHLGFBQUgsR0FBRyx1QkFBSCxHQUFHLENBQUUsS0FBSztZQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxnREFBZ0Q7U0FDcEYsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFTSxhQUFhLENBQUMsSUFBbUIsRUFBRSxLQUFhLEVBQUUsUUFBZ0M7UUFDdkYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzNELE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFFBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0QsT0FBTyxDQUFDLENBQUEsUUFBUSxhQUFSLFFBQVEsdUJBQVIsUUFBUSxDQUFFLEtBQUssQ0FBQSxJQUFJO1FBQ3pCLGlDQUFpQztRQUNqQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFLLFFBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxLQUFLLENBQUEsQ0FDN0UsQ0FBQztJQUNKLENBQUM7SUFFTSxhQUFhLENBQUMsSUFBbUIsRUFBRSxLQUFhLEVBQUUsUUFBZ0M7UUFDdkYsTUFBTSxFQUFFLFlBQVksRUFBRSxHQUFHLFFBQVEsSUFBSSxJQUFJLENBQUM7UUFDMUMsT0FBTyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVNLFVBQVUsQ0FBQyxFQUFFLElBQUksRUFBaUIsRUFBRSxRQUFnQjs7UUFDekQsT0FBTyxDQUFBLE1BQUEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsMENBQUUsSUFBSTthQUNyQyxNQUFBLElBQUssQ0FBQyxRQUFRLENBQUMsMENBQUUsR0FBRyxDQUFBO2FBQ3BCLE1BQUEsSUFBSyxDQUFDLFFBQVEsQ0FBQywwQ0FBRSxLQUFLLENBQUE7WUFDdEIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVNLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBaUIsRUFBRSxRQUFnQixFQUFFLGdCQUFnQixHQUFHLElBQUk7UUFDOUUsT0FBTyxRQUFRLElBQUksSUFBSyxJQUFJLENBQzFCLFdBQVcsSUFBSSxJQUFLLENBQUMsUUFBUSxDQUFDO1lBQzlCLENBQUMsZ0JBQWdCLElBQUksdUJBQXVCLElBQUksSUFBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQ2pFLENBQUM7SUFDSixDQUFDO0lBRU0sYUFBYSxDQUFDLElBQW1CLEVBQUUsUUFBZ0I7O1FBQ3hELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakMsT0FBTztZQUNMLFNBQVMsQ0FBQyxPQUFPO1lBQ2pCLFNBQVMsQ0FBQyxLQUFLO1NBQ2hCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FDNUMsQ0FBQSxHQUFHLGFBQUgsR0FBRyx1QkFBSCxHQUFHLENBQUUsWUFBWSxNQUFJLEdBQUcsYUFBSCxHQUFHLHVCQUFILEdBQUcsQ0FBRSxJQUFJLENBQUEsS0FBSSxNQUFBLEdBQUcsYUFBSCxHQUFHLHVCQUFILEdBQUcsQ0FBRSxjQUFjLDBDQUFFLE1BQU0sQ0FBQSxDQUM5RCxDQUFDO0lBQ0osQ0FBQztJQUVNLFNBQVMsQ0FBQyxJQUFtQixFQUFFLFFBQWdCO1FBQ3BELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUMxQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDeEIsQ0FDRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUMzQixDQUNFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7b0JBQy9CLENBQ0UsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQzt3QkFDOUIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUNuQixTQUFTLENBQUMsS0FBSyxDQUNsQixDQUFDLENBQUM7b0JBQ0gsQ0FDRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7d0JBQ25CLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQzt3QkFDekIsU0FBUyxDQUFDLFdBQVcsQ0FDeEIsQ0FDSixDQUFDLENBQUM7Z0JBQ0gsU0FBUyxDQUFDLGFBQWEsQ0FDMUIsQ0FBQztJQUNOLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxLQUFVO1FBQ2hDLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0lBQ3RGLENBQUM7SUFFTSxhQUFhO1FBQ2xCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQzFFLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLE9BQU8sQ0FBQztnQkFDL0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FDbkMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7cUhBOVBVLHVCQUF1Qjt5R0FBdkIsdUJBQXVCLDZRQ3JHcEMsd2pVQTJPQTs0RkR0SWEsdUJBQXVCO2tCQUxuQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxxQkFBcUI7b0JBQy9CLFdBQVcsRUFBRSxtQ0FBbUM7b0JBQ2hELFNBQVMsRUFBRSxDQUFDLG1DQUFtQyxDQUFDO2lCQUNqRDtvSUFRUyxRQUFRO3NCQURmLEtBQUs7Z0JBTUUsT0FBTztzQkFEZCxLQUFLO2dCQUdDLE9BQU87c0JBRGIsS0FBSztnQkFHQyxjQUFjO3NCQURwQixLQUFLO2dCQUdFLGtCQUFrQjtzQkFEekIsS0FBSztnQkFHRSxLQUFLO3NCQURaLEtBQUs7Z0JBR0UsSUFBSTtzQkFEWCxLQUFLO2dCQUdDLFlBQVk7c0JBRGxCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBjb21wbGV4aXR5ICovXG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0LCBmaWx0ZXIsIHJlZHVjZSwgdG9BcnJheSwgbWFwLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgRW1pc3Npb24sIEVtaXNzaW9uTWV0aG9kVGllciwgSVRlcm1KU09OTEQsIFByb2R1Y3QsIElucHV0IGFzIEhlc3RpYUlucHV0LCBOb2RlVHlwZSwgVGVybVRlcm1UeXBlXG59IGZyb20gJ0BoZXN0aWEtZWFydGgvc2NoZW1hJztcbmltcG9ydCB7IHVuaXF1ZSB9IGZyb20gJ0BoZXN0aWEtZWFydGgvdXRpbHMnO1xuY29uc3QgZ2V0ID0gcmVxdWlyZSgnbG9kYXNoLmdldCcpO1xuY29uc3Qgb3JkZXJCeSA9IHJlcXVpcmUoJ2xvZGFzaC5vcmRlcmJ5Jyk7XG5cbmltcG9ydCB7IElOb2RlTG9ncywgSU5vZGVUZXJtTG9ncyB9IGZyb20gJy4uL25vZGUuc2VydmljZSc7XG5pbXBvcnQgeyBIZUVuZ2luZVNlcnZpY2UsIElPcmNoZXN0cmF0b3JDb25maWcsIGZpbmRDb25maWdNb2RlbHMgfSBmcm9tICcuLi8uLi9lbmdpbmUvZW5naW5lLnNlcnZpY2UnO1xuaW1wb3J0IHsgbWF0Y2hUZXJtVHlwZSwgbWF0Y2hUeXBlIH0gZnJvbSAnLi4vLi4vc2VhcmNoL3NlYXJjaC5tb2RlbCc7XG5pbXBvcnQgeyBIZVNlYXJjaFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZWFyY2gvc2VhcmNoLnNlcnZpY2UnO1xuaW1wb3J0IHsgYmFzZVVybCwgaXNFeHRlcm5hbCwga2V5VG9MYWJlbCwgcHJvcGVydHlWYWx1ZSB9IGZyb20gJy4uLy4uL2NvbW1vbi91dGlscyc7XG5cbnR5cGUgc3ViVmFsdWVLZXlzID0gJ2lucHV0JyB8ICdwcm9wZXJ0eSc7XG5cbmludGVyZmFjZSBJQmxhbmtOb2RlTG9nU3ViVmFsdWUge1xuICBrZXk6IHN1YlZhbHVlS2V5cyB8ICdiYWNrZ3JvdW5kRGF0YSc7XG4gIHZhbHVlOiBhbnk7XG4gIGNvbmZpZ01vZGVsczogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBJQmxhbmtOb2RlTG9nIHtcbiAgaXNPcGVuOiBib29sZWFuO1xuICBjYW5PcGVuOiBib29sZWFuO1xuICB0ZXJtOiBJVGVybUpTT05MRDtcbiAgdHlwZT86IHN0cmluZztcbiAgY29uZmlnTW9kZWxzOiBzdHJpbmdbXTtcbiAgb3JpZ2luYWw6IG51bWJlcjtcbiAgcmVjYWxjdWxhdGVkOiBudW1iZXI7XG4gIGlzT3JpZ2luYWw6IGJvb2xlYW47XG4gIGlzUmVjYWxjdWxhdGVkOiBib29sZWFuO1xuICBoYXNEYXRhOiBib29sZWFuO1xuICBsb2dzPzogSU5vZGVUZXJtTG9ncztcbiAga2V5czogc3RyaW5nW107XG4gIHN1YlZhbHVlczogSUJsYW5rTm9kZUxvZ1N1YlZhbHVlW107XG59XG5cbmNvbnN0IHJlZHVjZVZhbHVlcyA9ICh2YWx1ZXM6IGFueVtdLCB0ZXJtSWQ6IHN0cmluZykgPT5cbiAgdmFsdWVzLmxlbmd0aCA/IHZhbHVlcy5yZWR1Y2UoKHAsIHYpID0+IHAgKyBwcm9wZXJ0eVZhbHVlKHYudmFsdWUsIHRlcm1JZCksIDApIDogdW5kZWZpbmVkO1xuXG5jb25zdCBsb2dTdWJWYWx1ZSA9IChsb2dzOiBJTm9kZVRlcm1Mb2dzLCBrZXk6IHN0cmluZywgcHJvcDogc3ViVmFsdWVLZXlzKSA9PlxuICBsb2dzW2tleV1bcHJvcF0gPyAoXG4gICAgQXJyYXkuaXNBcnJheShsb2dzW2tleV1bcHJvcF0pID9cbiAgICAgIChsb2dzW2tleV1bcHJvcF0gYXMgc3RyaW5nW10pLm1hcCh2YWx1ZSA9PiAoeyBrZXk6IHByb3AsIHZhbHVlIH0gYXMgSUJsYW5rTm9kZUxvZ1N1YlZhbHVlKSk6XG4gICAgICB7IGtleTogcHJvcCwgdmFsdWU6IGxvZ3Nba2V5XVtwcm9wXSB9IGFzIElCbGFua05vZGVMb2dTdWJWYWx1ZVxuICApIDogdW5kZWZpbmVkO1xuXG5jb25zdCBpc0JhY2tncm91bmROb0lucHV0ID0gKGxvZ3M6IElOb2RlVGVybUxvZ3MsIGtleTogc3RyaW5nKSA9PlxuICBsb2dzW2tleV0ubWV0aG9kVGllciA9PT0gRW1pc3Npb25NZXRob2RUaWVyLmJhY2tncm91bmQgJiYgIWxvZ3Nba2V5XS5pbnB1dDtcblxuY29uc3QgbG9nU3ViVmFsdWVzID0gKGxvZ3M6IElOb2RlVGVybUxvZ3MpOiBJQmxhbmtOb2RlTG9nU3ViVmFsdWVbXSA9PlxuICBPYmplY3Qua2V5cyhsb2dzKVxuICAgIC5mbGF0TWFwKGtleSA9PlxuICAgICAgW1xuICAgICAgICBsb2dTdWJWYWx1ZShsb2dzLCBrZXksICdpbnB1dCcpLFxuICAgICAgICBsb2dTdWJWYWx1ZShsb2dzLCBrZXksICdwcm9wZXJ0eScpLFxuICAgICAgICAvLyBmb3IgYmFja2dyb3VuZCBkYXRhIHdpdGhvdXQgaW5wdXQsIGNvbnZlcnQgdGVybSB0byBpbnB1dCBzbyBpdCBpcyBkaXNwbGF5ZWQgYmVsb3cgdGhlIHRlcm1cbiAgICAgICAgaXNCYWNrZ3JvdW5kTm9JbnB1dChsb2dzLCBrZXkpID8geyBrZXk6ICdiYWNrZ3JvdW5kRGF0YScgfSBhcyBJQmxhbmtOb2RlTG9nU3ViVmFsdWUgOiB1bmRlZmluZWRcbiAgICAgIF0uZmxhdCgpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAubWFwKHYgPT4gKHsgLi4udiwgY29uZmlnTW9kZWxzOiBba2V5XSB9KSkpO1xuXG5jb25zdCBsb2dLZXlzID0gKGxvZ3M6IElOb2RlVGVybUxvZ3MpID0+IE9iamVjdC5rZXlzKGxvZ3MpLmZpbHRlcihrZXkgPT4gbG9nc1trZXldLmlzS2V5KTtcblxuZW51bSBMb2dTdGF0dXMge1xuICBzdWNjZXNzID0gJ3N1Y2Nlc3NmdWwnLFxuICBlcnJvciA9ICdmYWlsZWQnLFxuICBza2lwSGllcmFyY2h5ID0gJ25vdCBydW4gKG1vZGVsIGhpZ2hlciB1cCBoaWVyYXJjaHkgcnVuIGluc3RlYWQpJyxcbiAgZGF0YVByb3ZpZGVkID0gJ25vdCBydW4gKHVzZXIgcHJvdmlkZWQgZGF0YSByZXRhaW5lZCknLFxuICBub3RSZXF1aXJlZCA9ICdub3QgcnVuIChub3QgcmVxdWlyZWQgdG8gcnVuKSdcbn1cblxuY29uc3QgbG9nSWNvbjoge1xuICBbc3RhdHVzIGluIExvZ1N0YXR1c106IHN0cmluZyB8IHN0cmluZ1tdO1xufSA9IHtcbiAgW0xvZ1N0YXR1cy5zdWNjZXNzXTogJ2NoZWNrJyxcbiAgW0xvZ1N0YXR1cy5lcnJvcl06ICd0aW1lcycsXG4gIFtMb2dTdGF0dXMuc2tpcEhpZXJhcmNoeV06IFsnZmFyJywgJ2NpcmNsZSddLFxuICBbTG9nU3RhdHVzLmRhdGFQcm92aWRlZF06ICdjaXJjbGUnLFxuICBbTG9nU3RhdHVzLm5vdFJlcXVpcmVkXTogJ21pbnVzLWNpcmNsZSdcbn07XG5cbmNvbnN0IGxvZ0NvbG9yOiB7XG4gIFtzdGF0dXMgaW4gTG9nU3RhdHVzXTogc3RyaW5nO1xufSA9IHtcbiAgW0xvZ1N0YXR1cy5zdWNjZXNzXTogJ3N1Y2Nlc3MnLFxuICBbTG9nU3RhdHVzLmVycm9yXTogJ2RhbmdlcicsXG4gIFtMb2dTdGF0dXMuc2tpcEhpZXJhcmNoeV06ICdkYXJrJyxcbiAgW0xvZ1N0YXR1cy5kYXRhUHJvdmlkZWRdOiAnZGFyaycsXG4gIFtMb2dTdGF0dXMubm90UmVxdWlyZWRdOiAnZ3JleSdcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2hlLW5vZGUtbG9ncy1tb2RlbHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vbm9kZS1sb2dzLW1vZGVscy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL25vZGUtbG9ncy1tb2RlbHMuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBOb2RlTG9nc01vZGVsc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgY29uZmlnPzogSU9yY2hlc3RyYXRvckNvbmZpZztcbiAgcHJpdmF0ZSBtb2RlbHM6IElUZXJtSlNPTkxEW10gPSBbXTtcbiAgcHJpdmF0ZSBhbGxUZXJtczogSVRlcm1KU09OTERbXSA9IFtdO1xuICBwcml2YXRlIGFsbEJsYW5rTm9kZXM6IElCbGFua05vZGVMb2dbXSA9IFtdO1xuXG4gIEBJbnB1dCgpXG4gIHByaXZhdGUgbm9kZVR5cGU/OiBOb2RlVHlwZTtcbiAgLyoqXG4gICAqIFJlc3RyaWN0IG1vZGVscyBieSBrZXkuXG4gICAqL1xuICBASW5wdXQoKVxuICBwcml2YXRlIG5vZGVLZXk/OiBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBsb2dzVXJsPzogc3RyaW5nO1xuICBASW5wdXQoKVxuICBwdWJsaWMgb3JpZ2luYWxWYWx1ZXM6IChFbWlzc2lvbiB8IFByb2R1Y3QgfCBIZXN0aWFJbnB1dClbXSA9IFtdO1xuICBASW5wdXQoKVxuICBwcml2YXRlIHJlY2FsY3VsYXRlZFZhbHVlczogKEVtaXNzaW9uIHwgUHJvZHVjdCB8IEhlc3RpYUlucHV0KVtdID0gW107XG4gIEBJbnB1dCgpXG4gIHByaXZhdGUgdGVybXM6IElUZXJtSlNPTkxEW10gPSBbXTtcbiAgQElucHV0KClcbiAgcHJpdmF0ZSBsb2dzPzogSU5vZGVMb2dzO1xuICBASW5wdXQoKVxuICBwdWJsaWMgZmlsdGVyZWRUeXBlPzogc3RyaW5nO1xuXG4gIHB1YmxpYyBiYXNlVXJsID0gYmFzZVVybCgpO1xuICBwdWJsaWMgaXNFeHRlcm5hbCA9IGlzRXh0ZXJuYWwoKTtcbiAgcHVibGljIGxvYWRpbmcgPSB0cnVlO1xuICBwdWJsaWMgYmxhbmtOb2RlczogSUJsYW5rTm9kZUxvZ1tdID0gW107XG4gIHB1YmxpYyBtZXRob2RNb2RlbHNDb3VudCA9IDA7XG4gIHB1YmxpYyBtZXRob2RzQnlJZD86IGFueTtcbiAgcHVibGljIG9ubHlXaXRoRGF0YSA9IHRydWU7XG5cbiAgcHVibGljIHNob3dMZWdlbmQgPSB0cnVlO1xuICBwdWJsaWMgTG9nU3RhdHVzID0gTG9nU3RhdHVzO1xuICBwdWJsaWMgbG9nSWNvbiA9IGxvZ0ljb247XG4gIHB1YmxpYyBsb2dDb2xvciA9IGxvZ0NvbG9yO1xuXG4gIHB1YmxpYyB0ZXJtPzogc3RyaW5nO1xuICBwdWJsaWMgc3VnZ2VzdFRlcm0gPSAodGV4dCQ6IE9ic2VydmFibGU8c3RyaW5nPikgPT5cbiAgICB0ZXh0JC5waXBlKFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIHN3aXRjaE1hcCh2ID0+IHRoaXMuc3VnZ2VzdEJ5VGVybSh2KSksXG4gICAgKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHNlYXJjaFNlcnZpY2U6IEhlU2VhcmNoU2VydmljZSxcbiAgICBwcml2YXRlIGhlc3RpYUVuZ2luZVNlcnZpY2U6IEhlRW5naW5lU2VydmljZVxuICApIHsgfVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY29uZmlnID0gYXdhaXQgdGhpcy5oZXN0aWFFbmdpbmVTZXJ2aWNlLm9jaGVzdHJhdG9yQ29uZmlnKHRoaXMubm9kZVR5cGUhKTtcblxuICAgIGNvbnN0IHsgcmVzdWx0czogbW9kZWxzIH0gPSBhd2FpdCB0aGlzLnNlYXJjaFNlcnZpY2Uuc2VhcmNoPElUZXJtSlNPTkxELCBOb2RlVHlwZS5UZXJtPih7XG4gICAgICBmaWVsZHM6IFsnQHR5cGUnLCAnQGlkJywgJ25hbWUnXSxcbiAgICAgIGxpbWl0OiAxMDAwLFxuICAgICAgcXVlcnk6IHtcbiAgICAgICAgYm9vbDoge1xuICAgICAgICAgIG11c3Q6IFtcbiAgICAgICAgICAgIG1hdGNoVHlwZShOb2RlVHlwZS5UZXJtKSxcbiAgICAgICAgICAgIG1hdGNoVGVybVR5cGUoVGVybVRlcm1UeXBlLm1vZGVsKVxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMubW9kZWxzID0gbW9kZWxzO1xuXG4gICAgdGhpcy5tZXRob2RzQnlJZCA9IGF3YWl0IGZyb20odGhpcy5tb2RlbHMpLnBpcGUoXG4gICAgICBmaWx0ZXIodiA9PiAhIXYpLFxuICAgICAgZGlzdGluY3QodiA9PiB2WydAaWQnXSksXG4gICAgICByZWR1Y2UoKHByZXYsIGN1cnIpID0+ICh7IC4uLnByZXYsIFtjdXJyWydAaWQnXV06IGN1cnIgfSksIHt9KVxuICAgICkudG9Qcm9taXNlKCk7XG5cbiAgICBjb25zdCBvcmlnaW5hbFZhbHVlcyA9ICh0aGlzLm9yaWdpbmFsVmFsdWVzIHx8IFtdKS5maWx0ZXIodmFsdWUgPT4gISh2YWx1ZSBhcyBhbnkpLmRlbGV0ZWQpO1xuICAgIGNvbnN0IHJlY2FsY3VsYXRlZFZhbHVlcyA9ICh0aGlzLnJlY2FsY3VsYXRlZFZhbHVlcyB8fCBbXSkuZmlsdGVyKHZhbHVlID0+ICEodmFsdWUgYXMgYW55KS5kZWxldGVkKTtcbiAgICBjb25zdCB0eXBlID0gb3JpZ2luYWxWYWx1ZXMubGVuZ3RoID9cbiAgICAgIG9yaWdpbmFsVmFsdWVzWzBdWydAdHlwZSddIHx8IG9yaWdpbmFsVmFsdWVzWzBdLnR5cGUgOlxuICAgICAgcmVjYWxjdWxhdGVkVmFsdWVzLmxlbmd0aCA/XG4gICAgICAgIHJlY2FsY3VsYXRlZFZhbHVlc1swXVsnQHR5cGUnXSB8fCByZWNhbGN1bGF0ZWRWYWx1ZXNbMF0udHlwZSA6XG4gICAgICAgIHVuZGVmaW5lZDtcbiAgICB0aGlzLmFsbFRlcm1zID0gYXdhaXQgdGhpcy5mZXRjaEFsbFRlcm1zKCk7XG4gICAgdGhpcy5hbGxCbGFua05vZGVzID0gdGhpcy5hbGxUZXJtcy5mbGF0TWFwKHRlcm0gPT4ge1xuICAgICAgY29uc3QgdGVybUxvZ3MgPSBnZXQodGhpcy5sb2dzLCB0ZXJtWydAaWQnXSwge30pIGFzIElOb2RlVGVybUxvZ3M7XG4gICAgICBjb25zdCBvcmlnaW5hbCA9IG9yaWdpbmFsVmFsdWVzLmZpbHRlcih2ID0+IHRlcm1bJ0BpZCddID09PSB2LnRlcm0hWydAaWQnXSk7XG4gICAgICBjb25zdCByZWNhbGN1bGF0ZWQgPSByZWNhbGN1bGF0ZWRWYWx1ZXMuZmlsdGVyKHYgPT4gdGVybVsnQGlkJ10gPT09IHYudGVybSFbJ0BpZCddKTtcbiAgICAgIGNvbnN0IGhhc0RhdGEgPSAhIW9yaWdpbmFsLmxlbmd0aCB8fCAhIXJlY2FsY3VsYXRlZC5sZW5ndGggfHwgT2JqZWN0LmtleXModGVybUxvZ3MpLmxlbmd0aCA+IDA7XG4gICAgICBjb25zdCBjb25maWdNb2RlbHMgPSB1bmlxdWUoW1xuICAgICAgICAuLi5maW5kQ29uZmlnTW9kZWxzKHRoaXMuY29uZmlnISwgdGVybVsnQGlkJ10sIHRoaXMubm9kZUtleSEpLm1hcCgoeyBtb2RlbCB9KSA9PiBtb2RlbCksXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKHRlcm1Mb2dzKS5maWx0ZXIoa2V5ID0+ICFpc0JhY2tncm91bmROb0lucHV0KHRlcm1Mb2dzLCBrZXkpKVxuICAgICAgXSkuZmlsdGVyKGtleSA9PiAhKFxuICAgICAgICBrZXkgaW4gdGVybUxvZ3NcbiAgICAgICkgfHwgKFxuICAgICAgICAhdGVybUxvZ3Nba2V5XS5pc0tleSAmJiAhdGVybUxvZ3Nba2V5XS5pbnB1dCAmJiAhdGVybUxvZ3Nba2V5XS5wcm9wZXJ0eVxuICAgICAgKSk7XG4gICAgICBjb25zdCBrZXlzID0gbG9nS2V5cyh0ZXJtTG9ncyk7XG4gICAgICBjb25zdCBzdWJWYWx1ZXMgPSBsb2dTdWJWYWx1ZXModGVybUxvZ3MpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNPcGVuOiB0cnVlLFxuICAgICAgICBjYW5PcGVuOiBrZXlzLmxlbmd0aCA+IDAgfHwgc3ViVmFsdWVzLmxlbmd0aCA+IDAsXG4gICAgICAgIHRlcm0sXG4gICAgICAgIHR5cGUsXG4gICAgICAgIGNvbmZpZ01vZGVscyxcbiAgICAgICAgb3JpZ2luYWw6IHJlZHVjZVZhbHVlcyhvcmlnaW5hbCwgdGVybVsnQGlkJ10pLFxuICAgICAgICByZWNhbGN1bGF0ZWQ6IHJlZHVjZVZhbHVlcyhyZWNhbGN1bGF0ZWQsIHRlcm1bJ0BpZCddKSxcbiAgICAgICAgaXNPcmlnaW5hbDogISFvcmlnaW5hbC5sZW5ndGgsXG4gICAgICAgIGlzUmVjYWxjdWxhdGVkOiByZWNhbGN1bGF0ZWQuc29tZSh2ID0+IChbXG4gICAgICAgICAgLi4uKHYuYWRkZWQgfHwgW10pLFxuICAgICAgICAgIC4uLih2LnVwZGF0ZWQgfHwgW10pXG4gICAgICAgIF0pLmluY2x1ZGVzKCd2YWx1ZScpKSxcbiAgICAgICAgaGFzRGF0YSxcbiAgICAgICAgbG9nczogdGVybUxvZ3MsXG4gICAgICAgIGtleXMsXG4gICAgICAgIHN1YlZhbHVlc1xuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLm1ldGhvZE1vZGVsc0NvdW50ID0gTWF0aC5tYXguYXBwbHkoTWF0aC5tYXgsIHRoaXMuYWxsQmxhbmtOb2Rlcy5mbGF0TWFwKHYgPT4gW1xuICAgICAgdi5jb25maWdNb2RlbHMubGVuZ3RoLFxuICAgICAgLi4udi5zdWJWYWx1ZXMubWFwKHMgPT4gcy5jb25maWdNb2RlbHM/Lmxlbmd0aCA/PyAwKVxuICAgIF0pKTtcblxuICAgIHRoaXMuZmlsdGVyUmVzdWx0cygpO1xuXG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoQWxsVGVybXMoKSB7XG4gICAgcmV0dXJuIGZyb20oXG4gICAgICB0aGlzLnRlcm1zLmxlbmd0aCA/XG4gICAgICAgIHRoaXMudGVybXMgOlxuICAgICAgICBbXG4gICAgICAgICAgLi4uKHRoaXMub3JpZ2luYWxWYWx1ZXMgfHwgW10pLm1hcCgoeyB0ZXJtIH0pID0+IHRlcm0pLFxuICAgICAgICAgIC4uLih0aGlzLnJlY2FsY3VsYXRlZFZhbHVlcyB8fCBbXSkubWFwKCh7IHRlcm0gfSkgPT4gdGVybSlcbiAgICAgICAgXVxuICAgICkucGlwZShcbiAgICAgIGRpc3RpbmN0KHYgPT4gdiFbJ0BpZCddKSxcbiAgICAgIHRvQXJyYXkoKSxcbiAgICAgIG1hcCh2ID0+IG9yZGVyQnkodiwgWyduYW1lJ10sIFsnYXNjJ10pKVxuICAgICkudG9Qcm9taXNlKCk7XG4gIH1cblxuICBwcml2YXRlIHN1Z2dlc3RCeVRlcm0odGVybTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGZyb20odGhpcy5hbGxUZXJtcykucGlwZShcbiAgICAgIG1hcCh2ID0+IHYubmFtZSksXG4gICAgICBmaWx0ZXIodiA9PiB2LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybS50b0xvd2VyQ2FzZSgpKSksXG4gICAgICB0b0FycmF5KClcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHRyYWNrQnlCbGFua05vZGUoX2luZGV4OiBudW1iZXIsIG5vZGU6IElCbGFua05vZGVMb2cpIHtcbiAgICByZXR1cm4gbm9kZS50ZXJtWydAaWQnXTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVQb3BvdmVyKHBvcG92ZXIsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gcG9wb3Zlci5pc09wZW4oKSA/IHBvcG92ZXIuY2xvc2UoKSA6IHBvcG92ZXIub3Blbihjb250ZXh0KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNCYWNrZ3JvdW5kKHsgbG9ncyB9OiBJQmxhbmtOb2RlTG9nLCBtZXRob2RJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgbG9nID0gbG9ncyFbbWV0aG9kSWRdO1xuICAgIHJldHVybiBsb2c/Lm1ldGhvZFRpZXIgPT09IEVtaXNzaW9uTWV0aG9kVGllci5iYWNrZ3JvdW5kO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1JlcXVpcmVkKHsgbG9ncyB9OiBJQmxhbmtOb2RlTG9nLCBtZXRob2RJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgbG9nID0gbG9ncyFbbWV0aG9kSWRdO1xuICAgIHJldHVybiAhKCdzaG91bGRSdW5PcmNoZXN0cmF0b3InIGluIGxvZykgfHwgbG9nLnNob3VsZFJ1bk9yY2hlc3RyYXRvcjtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkUnVuKHsgbG9ncyB9OiBJQmxhbmtOb2RlTG9nLCBtZXRob2RJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgbG9nID0gbG9ncyFbbWV0aG9kSWRdO1xuICAgIHJldHVybiBsb2cuc2hvdWxkUnVuO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1VzZXJQcm92aWRlZChub2RlOiBJQmxhbmtOb2RlTG9nLCBtZXRob2RJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgbG9nID0gbm9kZS5sb2dzIVttZXRob2RJZF07XG4gICAgcmV0dXJuIFtcbiAgICAgIHR5cGVvZiBub2RlLm9yaWdpbmFsID09PSAndW5kZWZpbmVkJywgLy8gaGFzIHZhbHVlXG4gICAgICBub2RlLmlzUmVjYWxjdWxhdGVkLCAvLyBpcyBub3QgcmVjYWxjdWxhdGVkXG4gICAgICB0aGlzLmlzQmFja2dyb3VuZChub2RlLCBtZXRob2RJZCksIC8vIGlzIG5vdCBiYWNrZ3JvdW5kIGRhdGFcbiAgICAgIGxvZz8uaXNLZXksIC8vIGlzIG5vdCBrZXlcbiAgICAgIHRoaXMuaGFzTG9nKG5vZGUsIG1ldGhvZElkLCBmYWxzZSkgLy8gc2tpcCBpZiBjb250YWlucyBsb2dzIG90aGVyIHRoYW4gb3JjaGVzdHJhdG9yXG4gICAgXS5ldmVyeSh2ID0+ICF2KTtcbiAgfVxuXG4gIHB1YmxpYyB2YWxpZFN1YlZhbHVlKG5vZGU6IElCbGFua05vZGVMb2csIGluZGV4OiBudW1iZXIsIHN1YlZhbHVlPzogSUJsYW5rTm9kZUxvZ1N1YlZhbHVlKSB7XG4gICAgY29uc3QgbWV0aG9kSWQgPSB0aGlzLmdldE1ldGhvZElkQXQobm9kZSwgaW5kZXgsIHN1YlZhbHVlKTtcbiAgICBjb25zdCBsb2cgPSBnZXQobm9kZS5sb2dzIVttZXRob2RJZF0sIHN1YlZhbHVlPy5rZXksIG51bGwpO1xuICAgIHJldHVybiAhc3ViVmFsdWU/LnZhbHVlIHx8IChcbiAgICAgIC8vIGlucHV0L3Byb3BlcnR5IGNhbiBiZSBhbiBhcnJheVxuICAgICAgQXJyYXkuaXNBcnJheShsb2cpID8gbG9nLmluY2x1ZGVzKHN1YlZhbHVlPy52YWx1ZSkgOiBsb2cgPT09IHN1YlZhbHVlPy52YWx1ZVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWV0aG9kSWRBdChub2RlOiBJQmxhbmtOb2RlTG9nLCBpbmRleDogbnVtYmVyLCBzdWJWYWx1ZT86IElCbGFua05vZGVMb2dTdWJWYWx1ZSkge1xuICAgIGNvbnN0IHsgY29uZmlnTW9kZWxzIH0gPSBzdWJWYWx1ZSB8fCBub2RlO1xuICAgIHJldHVybiBjb25maWdNb2RlbHNbaW5kZXhdO1xuICB9XG5cbiAgcHVibGljIG1ldGhvZE5hbWUoeyBsb2dzIH06IElCbGFua05vZGVMb2csIG1ldGhvZElkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5tZXRob2RzQnlJZFttZXRob2RJZF0/Lm5hbWUgfHxcbiAgICAgIGxvZ3MhW21ldGhvZElkXT8ua2V5IHx8XG4gICAgICBsb2dzIVttZXRob2RJZF0/Lm1vZGVsIHx8XG4gICAgICAobWV0aG9kSWQgPyBrZXlUb0xhYmVsKG1ldGhvZElkKSA6ICcnKTtcbiAgfVxuXG4gIHB1YmxpYyBoYXNMb2coeyBsb2dzIH06IElCbGFua05vZGVMb2csIG1ldGhvZElkOiBzdHJpbmcsIHdpdGhPcmNoZXN0cmF0b3IgPSB0cnVlKSB7XG4gICAgcmV0dXJuIG1ldGhvZElkIGluIGxvZ3MhICYmIChcbiAgICAgICdzaG91bGRSdW4nIGluIGxvZ3MhW21ldGhvZElkXSB8fFxuICAgICAgKHdpdGhPcmNoZXN0cmF0b3IgJiYgJ3Nob3VsZFJ1bk9yY2hlc3RyYXRvcicgaW4gbG9ncyFbbWV0aG9kSWRdKVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgaGFzTG9nRGV0YWlscyhub2RlOiBJQmxhbmtOb2RlTG9nLCBtZXRob2RJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgbG9nID0gbm9kZS5sb2dzIVttZXRob2RJZF07XG4gICAgcmV0dXJuIFtcbiAgICAgIExvZ1N0YXR1cy5zdWNjZXNzLFxuICAgICAgTG9nU3RhdHVzLmVycm9yXG4gICAgXS5pbmNsdWRlcyh0aGlzLmxvZ1N0YXR1cyhub2RlLCBtZXRob2RJZCkpICYmIChcbiAgICAgIGxvZz8ucmVxdWlyZW1lbnRzIHx8IGxvZz8ubG9ncyB8fCBsb2c/Lm1pc3NpbmdMb29rdXBzPy5sZW5ndGhcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGxvZ1N0YXR1cyhub2RlOiBJQmxhbmtOb2RlTG9nLCBtZXRob2RJZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNVc2VyUHJvdmlkZWQobm9kZSwgbWV0aG9kSWQpID9cbiAgICAgIExvZ1N0YXR1cy5kYXRhUHJvdmlkZWQgOlxuICAgICAgKFxuICAgICAgICB0aGlzLmhhc0xvZyhub2RlLCBtZXRob2RJZCkgP1xuICAgICAgICAgIChcbiAgICAgICAgICAgIHRoaXMuaXNSZXF1aXJlZChub2RlLCBtZXRob2RJZCkgP1xuICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgdGhpcy5zaG91bGRSdW4obm9kZSwgbWV0aG9kSWQpID9cbiAgICAgICAgICAgICAgICAgIExvZ1N0YXR1cy5zdWNjZXNzIDpcbiAgICAgICAgICAgICAgICAgIExvZ1N0YXR1cy5lcnJvclxuICAgICAgICAgICAgICApIDpcbiAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgIG5vZGUuaXNSZWNhbGN1bGF0ZWQgP1xuICAgICAgICAgICAgICAgICAgTG9nU3RhdHVzLnNraXBIaWVyYXJjaHkgOlxuICAgICAgICAgICAgICAgICAgTG9nU3RhdHVzLm5vdFJlcXVpcmVkXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICApIDpcbiAgICAgICAgICBMb2dTdGF0dXMuc2tpcEhpZXJhcmNoeVxuICAgICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZXF1aXJlbWVudENvbG9yKHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gIXZhbHVlIHx8IFsnTm9uZScsICdGYWxzZScsICcwJywgJzAuMCddLmluY2x1ZGVzKHZhbHVlKSA/ICdkYW5nZXInIDogJ3doaXRlJztcbiAgfVxuXG4gIHB1YmxpYyBmaWx0ZXJSZXN1bHRzKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5ibGFua05vZGVzID0gdGhpcy5hbGxCbGFua05vZGVzLmZpbHRlcigoeyBoYXNEYXRhLCB0ZXJtOiB7IG5hbWUgfSB9KSA9PlxuICAgICAgICAoIXRoaXMub25seVdpdGhEYXRhIHx8IGhhc0RhdGEpICYmXG4gICAgICAgICghdGhpcy50ZXJtIHx8IG5hbWUgPT09IHRoaXMudGVybSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJweC0zIHBiLTNcIj5cbiAgPGRpdiBjbGFzcz1cImhhcy10ZXh0LXJpZ2h0IG1iLTJcIiAqbmdJZj1cIiFpc0V4dGVybmFsXCI+XG4gICAgPGEgY2xhc3M9XCJpcy1zaXplLTdcIiAqbmdJZj1cImxvZ3NVcmxcIiBbaHJlZl09XCJsb2dzVXJsXCIgdGFyZ2V0PVwiX2JsYW5rXCI+XG4gICAgICA8ZmEtaWNvbiBpY29uPVwiZXh0ZXJuYWwtbGluay1hbHRcIj48L2ZhLWljb24+XG4gICAgICA8c3BhbiBjbGFzcz1cInBsLTJcIj5PcGVuIEZ1bGwgTG9nczwvc3Bhbj5cbiAgICA8L2E+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb250YWluZXIgZGF0YS10YWJsZS1jb250YWluZXIgbWItMVwiPlxuICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIGlzLW5hcnJvdyBkYXRhLXRhYmxlXCI+XG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGggY2xhc3M9XCJ3aWR0aC1hdXRvXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2wgaXMtZXhwYW5kZWQgaGFzLWljb25zLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiaW5wdXQgc2VhcmNoLWlucHV0IGlzLXNtYWxsXCJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidGVybVwiIG5hbWU9XCJ0ZXJtXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRmlsdGVyIGJ5IG5hbWVcIlxuICAgICAgICAgICAgICAgICAgW2VkaXRhYmxlXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgIFtuZ2JUeXBlYWhlYWRdPVwic3VnZ2VzdFRlcm1cIlxuICAgICAgICAgICAgICAgICAgKHNlbGVjdEl0ZW0pPVwiZmlsdGVyUmVzdWx0cygpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJpY29uIGlzLXNtYWxsIGlzLXJpZ2h0XCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1oaWRkZW5dPVwiIXRlcm1cIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRlcm0gPSAnJzsgZmlsdGVyUmVzdWx0cygpO1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cInRpbWVzXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0aD5PcmlnaW5hbDwvdGg+XG4gICAgICAgICAgPHRoPlJlY2FsY3VsYXRlZDwvdGg+XG4gICAgICAgICAgPHRoICpuZ0lmPVwib3JpZ2luYWxWYWx1ZXM/Lmxlbmd0aFwiPkRpZmZlcmVuY2U8L3RoPlxuICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgYyBvZiBtZXRob2RNb2RlbHNDb3VudCB8IHRpbWVzOyBsZXQgaSA9IGluZGV4XCI+KHt7aSArIDF9fSk8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT5cbiAgICAgICAgPHRyICpuZ0lmPVwibG9hZGluZ1wiPlxuICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiNVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhhcy10ZXh0LWNlbnRlciBweS0zXCI+XG4gICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJzcGlubmVyXCIgW3B1bHNlXT1cInRydWVcIiBzaXplPVwibGdcIj48L2ZhLWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBibGFua05vZGUgb2YgYmxhbmtOb2RlczsgdHJhY2tCeTogdHJhY2tCeUJsYW5rTm9kZVwiPlxuICAgICAgICAgIDx0ciBbY2xhc3MuaGFzLXN1Yi1yb3dzXT1cImJsYW5rTm9kZS5jYW5PcGVuXCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ3aWR0aC1hdXRvXCIgW2F0dHIudGl0bGVdPVwiYmxhbmtOb2RlLnRlcm0ubmFtZVwiPlxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImlzLWlubGluZS1ibG9jayBpcy1hbGlnbi10b3AgcHItMiBvcGVuLW5vZGVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJibGFua05vZGUuaXNPcGVuID0gIWJsYW5rTm9kZS5pc09wZW5cIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiYmxhbmtOb2RlLmNhbk9wZW5cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cImFuZ2xlLWRvd25cIiBbY2xhc3MuaXMtaGlkZGVuXT1cIiFibGFua05vZGUuaXNPcGVuXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJhbmdsZS1yaWdodFwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiYmxhbmtOb2RlLmlzT3BlblwiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICA8aGUtbm9kZS1saW5rIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrXCIgW25vZGVdPVwiYmxhbmtOb2RlLnRlcm1cIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLW5vd3JhcCBoYXMtdGV4dC1lbGxpcHNpc1wiPnt7YmxhbmtOb2RlLnRlcm0ubmFtZX19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2hlLW5vZGUtbGluaz5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgIDxzcGFuPnt7YmxhbmtOb2RlLm9yaWdpbmFsIHwgcHJlY2lzaW9uOjMgfCBkZWZhdWx0OictJ319PC9zcGFuPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhYmxhbmtOb2RlLmlzT3JpZ2luYWwgfHwgYmxhbmtOb2RlLmlzUmVjYWxjdWxhdGVkOyBlbHNlIG5vdFVwZGF0ZWRcIj5cbiAgICAgICAgICAgICAgICB7e2JsYW5rTm9kZS5yZWNhbGN1bGF0ZWQgfCBwcmVjaXNpb246MyB8IGRlZmF1bHQ6Jy0nfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZCAqbmdJZj1cIm9yaWdpbmFsVmFsdWVzPy5sZW5ndGhcIiBjbGFzcz1cImlzLW5vd3JhcFwiPlxuICAgICAgICAgICAgICA8aGUtYmxhbmstbm9kZS12YWx1ZS1kZWx0YSAqbmdJZj1cImJsYW5rTm9kZS5pc1JlY2FsY3VsYXRlZFwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImJsYW5rTm9kZS5yZWNhbGN1bGF0ZWRcIlxuICAgICAgICAgICAgICAgIFtvcmlnaW5hbFZhbHVlXT1cImJsYW5rTm9kZS5vcmlnaW5hbFwiXG4gICAgICAgICAgICAgID48L2hlLWJsYW5rLW5vZGUtdmFsdWUtZGVsdGE+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJsYW5rTm9kZU1vZGVsczsgY29udGV4dDoge2JsYW5rTm9kZTogYmxhbmtOb2RlfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvdHI+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYmxhbmtOb2RlLmtleXM/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgPHRyXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBrZXkgb2YgYmxhbmtOb2RlLmtleXNcIlxuICAgICAgICAgICAgICBbY2xhc3MuaXMtaGlkZGVuXT1cIiFibGFua05vZGUuaXNPcGVuXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmhhcy1zdWItcm93c109XCJibGFua05vZGUuc3ViVmFsdWVzPy5sZW5ndGhcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ3aWR0aC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBsLTMgaGFzLXRleHQtbGVmdFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwci0xIGlzLWFsaWduLXRvcFwiPkZpZWxkOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrXCIgKm5nSWY9XCJibGFua05vZGUudHlwZVwiXG4gICAgICAgICAgICAgICAgICAgIFtocmVmXT1cImJhc2VVcmwgKyAnL3NjaGVtYS8nICsgYmxhbmtOb2RlLnR5cGUgKyAnIycgKyBrZXlcIiB0YXJnZXQ9XCJfYmxhbmtcIiBbdGl0bGVdPVwia2V5XCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1ub3dyYXAgaGFzLXRleHQtZWxsaXBzaXNcIj57e2tleX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtYWxpZ24tdG9wXCIgKm5nSWY9XCIhYmxhbmtOb2RlLnR5cGVcIj57e2tleX19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgW2F0dHIuY29sc3Bhbl09XCJvcmlnaW5hbFZhbHVlcz8ubGVuZ3RoID8gMyA6IDJcIj48L3RkPlxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJibGFuay1ub2RlLWluZGV4LWtleVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJibGFua05vZGVNb2RlbDsgY29udGV4dDoge2JsYW5rTm9kZTogYmxhbmtOb2RlLCBtZXRob2RJZDoga2V5fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJtZXRob2RNb2RlbHNDb3VudCA+IDFcIiBbYXR0ci5jb2xzcGFuXT1cIm1ldGhvZE1vZGVsc0NvdW50IC0gMVwiPjwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPHRyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgc3ViVmFsdWUgb2YgYmxhbmtOb2RlLnN1YlZhbHVlc1wiXG4gICAgICAgICAgICBbY2xhc3MuaXMtaGlkZGVuXT1cIiFibGFua05vZGUuaXNPcGVuXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwbC0zIGhhcy10ZXh0LWxlZnRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrIGlzLW5vd3JhcCBoYXMtdGV4dC1lbGxpcHNpc1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1hbGlnbi10b3BcIj57e3N1YlZhbHVlLmtleSB8IGtleVRvTGFiZWx9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdWJWYWx1ZS52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInByLTEgaXMtYWxpZ24tdG9wXCI+Ojwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwic3ViVmFsdWUua2V5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidiYWNrZ3JvdW5kRGF0YSdcIj57e3N1YlZhbHVlLnZhbHVlIHwga2V5VG9MYWJlbH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoZS1ub2RlLWxpbmsgY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2tcIiBbbm9kZV09XCJ7J0B0eXBlJzonVGVybScsJ0BpZCc6c3ViVmFsdWUudmFsdWV9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtbm93cmFwIGhhcy10ZXh0LWVsbGlwc2lzXCI+e3tzdWJWYWx1ZS52YWx1ZSB8IGtleVRvTGFiZWx9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaGUtbm9kZS1saW5rPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQgW2F0dHIuY29sc3Bhbl09XCJvcmlnaW5hbFZhbHVlcz8ubGVuZ3RoID8gMyA6IDJcIj48L3RkPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJsYW5rTm9kZU1vZGVsczsgY29udGV4dDoge2JsYW5rTm9kZTogYmxhbmtOb2RlLCBzdWJWYWx1ZTogc3ViVmFsdWV9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3Rib2R5PlxuICAgIDwvdGFibGU+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJpcy1zaXplLTcgaXMtaXRhbGljXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbHVtbnMgaXMtdmFyaWFibGUgaXMtMSBteS0wXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sdW1uIGlzLW5hcnJvd1wiPlxuICAgICAgICA8cD5cbiAgICAgICAgICA8YSBjbGFzcz1cImlzLWlubGluZS1ibG9jayBwci0yXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzaG93TGVnZW5kID0gIXNob3dMZWdlbmRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJhbmdsZS1kb3duXCIgW2NsYXNzLmlzLWhpZGRlbl09XCIhc2hvd0xlZ2VuZFwiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJhbmdsZS1yaWdodFwiIFtjbGFzcy5pcy1oaWRkZW5dPVwic2hvd0xlZ2VuZFwiPjwvZmEtaWNvbj5cbiAgICAgICAgICA8L2E+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2tcIj5MZWdlbmQ6PC9zcGFuPlxuICAgICAgICA8L3A+XG4gICAgICAgIDx1bCBjbGFzcz1cImNvbnRlbnQgcGwtMlwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiIXNob3dMZWdlbmRcIj5cbiAgICAgICAgICA8bGlcbiAgICAgICAgICAgIGNsYXNzPVwiaGFzLXRleHQte3tsb2dDb2xvcltzdGF0dXMudmFsdWVdfX1cIlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IHN0YXR1cyBvZiBMb2dTdGF0dXMgfCBrZXlzXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJsb2dJY29uW3N0YXR1cy52YWx1ZV1cIj48L2ZhLWljb24+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTFcIj57e3N0YXR1cy52YWx1ZX19PC9zcGFuPlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgIDwvdWw+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4gaGFzLXRleHQtcmlnaHRcIiAqbmdJZj1cImZpbHRlcmVkVHlwZVwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgY2hlY2tib3hcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJzZWxlY3RvclwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm9ubHlXaXRoRGF0YVwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cImZpbHRlclJlc3VsdHMoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWwtMlwiPlNob3cgb25seSByZWNhbGN1bGF0ZWQge3tmaWx0ZXJlZFR5cGUgfCBwbHVyYWxpemV9fTwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2JsYW5rTm9kZU1vZGVscyBsZXQtYmxhbmtOb2RlPVwiYmxhbmtOb2RlXCIgbGV0LXN1YlZhbHVlPVwic3ViVmFsdWVcIj5cbiAgPHRkIGNsYXNzPVwiYmxhbmstbm9kZS1pbmRleC17e2l9fVwiICpuZ0Zvcj1cImxldCBjIG9mIG1ldGhvZE1vZGVsc0NvdW50IHwgdGltZXM7IGxldCBpID0gaW5kZXhcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFsaWRTdWJWYWx1ZShibGFua05vZGUsIGksIHN1YlZhbHVlKVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldE1ldGhvZElkQXQoYmxhbmtOb2RlLCBpLCBzdWJWYWx1ZSk7IGxldCBtZXRob2RJZFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYmxhbmtOb2RlTW9kZWw7IGNvbnRleHQ6IHtibGFua05vZGU6IGJsYW5rTm9kZSwgbWV0aG9kSWQ6IG1ldGhvZElkfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvdGQ+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2JsYW5rTm9kZU1vZGVsIGxldC1ibGFua05vZGU9XCJibGFua05vZGVcIiBsZXQtbWV0aG9kSWQ9XCJtZXRob2RJZFwiPlxuICA8c3BhblxuICAgIFtjbGFzcy50cmlnZ2VyLXBvcG92ZXJdPVwiaGFzTG9nRGV0YWlscyhibGFua05vZGUsIG1ldGhvZElkKVwiXG4gICAgW25nYlBvcG92ZXJdPVwibG9nRGV0YWlsc1wiIFthdXRvQ2xvc2VdPVwiJ291dHNpZGUnXCJcbiAgICB0cmlnZ2Vycz1cIm1hbnVhbFwiICNwPVwibmdiUG9wb3ZlclwiIHBsYWNlbWVudD1cImxlZnRcIiBjb250YWluZXI9XCJib2R5XCJcbiAgICAoY2xpY2spPVwiaGFzTG9nRGV0YWlscyhibGFua05vZGUsIG1ldGhvZElkKSA/IHRvZ2dsZVBvcG92ZXIocCwgeyBsb2c6IGJsYW5rTm9kZS5sb2dzW21ldGhvZElkXSB9KSA6IG51bGxcIlxuICA+XG4gICAgPHNwYW4gY2xhc3M9XCJpcy1jYXBpdGFsaXplZFwiPnt7bWV0aG9kTmFtZShibGFua05vZGUsIG1ldGhvZElkKX19PC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwicGwtMVwiICpuZ0lmPVwiaGFzTG9nKGJsYW5rTm9kZSwgbWV0aG9kSWQpICYmIGJsYW5rTm9kZS5sb2dzW21ldGhvZElkXS5tZXRob2RUaWVyXCI+W3t7YmxhbmtOb2RlLmxvZ3NbbWV0aG9kSWRdLm1ldGhvZFRpZXJ9fV08L3NwYW4+XG4gICAgPHNwYW4gY2xhc3M9XCJwbC0xIGhhcy10ZXh0LXt7bG9nQ29sb3JbbG9nU3RhdHVzKGJsYW5rTm9kZSwgbWV0aG9kSWQpXX19XCI+XG4gICAgICA8ZmEtaWNvbiBbaWNvbl09XCJsb2dJY29uW2xvZ1N0YXR1cyhibGFua05vZGUsIG1ldGhvZElkKV1cIj48L2ZhLWljb24+XG4gICAgPC9zcGFuPlxuICA8L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI25vdFVwZGF0ZWQ+XG4gIDxzcGFuPm5vdCB1cGRhdGVkPC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsb2dEZXRhaWxzIGxldC1sb2c9XCJsb2dcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvZy5yZXF1aXJlbWVudHNcIj5cbiAgICA8cCAqbmdGb3I9XCJsZXQga2V5IG9mIGxvZy5yZXF1aXJlbWVudHMgfCBrZXlzXCIgY2xhc3M9XCJoYXMtdGV4dC17e3JlcXVpcmVtZW50Q29sb3Ioa2V5LnZhbHVlKX19XCI+XG4gICAgICB7e2tleS5rZXl9fToge3trZXkudmFsdWV9fVxuICAgIDwvcD5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb2cubG9nc1wiPlxuICAgIDxwICpuZ0Zvcj1cImxldCBrZXkgb2YgbG9nLmxvZ3MgfCBrZXlzXCI+XG4gICAgICB7e2tleS5rZXl9fToge3trZXkudmFsdWV9fVxuICAgIDwvcD5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb2cubWlzc2luZ0xvb2t1cHM/Lmxlbmd0aFwiPlxuICAgIDxwIGNsYXNzPVwibXQtMlwiPk1pc3NpbmcgbG9va3Vwczo8L3A+XG5cbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29udGFpbmVyIGRhdGEtdGFibGUtY29udGFpbmVyXCI+XG4gICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBpcy1mdWxsd2lkdGggbWItMFwiPlxuICAgICAgICA8dGhlYWQgY2xhc3M9XCJoYXMtYmFja2dyb3VuZC1ibGFja1wiPlxuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0aD5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoYXMtdGV4dC13aGl0ZVwiPkZpbGVuYW1lPC9zcGFuPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDx0aD5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoYXMtdGV4dC13aGl0ZVwiPkNvbHVtbiBUaXRsZTwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICA8dGg+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGFzLXRleHQtd2hpdGVcIj5Sb3cgKHRlcm0uaWQpPC9zcGFuPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHkgY2xhc3M9XCJoYXMtYmFja2dyb3VuZC1ibGFjayBoYXMtdGV4dC13aGl0ZVwiPlxuICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgZGF0YSBvZiBsb2cubWlzc2luZ0xvb2t1cHNcIj5cbiAgICAgICAgICAgIDx0ZD57e2RhdGEuZmlsZW5hbWV9fTwvdGQ+XG4gICAgICAgICAgICA8dGQ+e3tkYXRhLmNvbHVtbn19PC90ZD5cbiAgICAgICAgICAgIDx0ZD57e2RhdGEudGVybUlkfX08L3RkPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
@@ -120,4 +120,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
|
|
|
120
120
|
providedIn: 'root'
|
|
121
121
|
}]
|
|
122
122
|
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.HeAuthService }, { type: i3.HeCommonService }]; } });
|
|
123
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25vZGUvbm9kZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVDLE9BQU8sRUFBYSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMvRCxPQUFPLEVBQXNELFFBQVEsRUFBZ0IsTUFBTSxzQkFBc0IsQ0FBQztBQUVsSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7QUFHMUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxVQUFrQixFQUFFLElBQWUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBRWxIOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxDQUFDLFVBQWtCLEVBQUUsRUFBaUMsRUFBRSxFQUFFO1FBQXJDLEVBQUUsU0FBUyxPQUFzQixFQUFqQixJQUFJLGNBQXBCLGFBQXNCLENBQUY7SUFDOUQsT0FBQSxHQUFHLFdBQVcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLGNBQWMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQzNILEVBQUUsQ0FBQTtDQUFBLENBQUM7QUFFTCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxVQUFrQixFQUFFLEVBQWlDLEVBQUUsRUFBRTtRQUFyQyxFQUFFLFNBQVMsT0FBc0IsRUFBakIsSUFBSSxjQUFwQixhQUFzQixDQUFGO0lBQ2xFLE9BQUEsR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsY0FBYyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUE7Q0FBQSxDQUFDO0FBRWxGLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxDQUFDLFFBQWdCLEVBQUUsRUFBRSxDQUM1QyxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxFQUFFLHFCQUFxQixRQUFRLE1BQU0sQ0FBQztBQUUzRixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLFFBQXNCLEVBQUUsRUFBRSxDQUMxRCxHQUFHLE9BQU8sRUFBRSxhQUFhLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsSUFBSSxRQUFRLE1BQU0sQ0FBQztBQXNEbEYsTUFBTSxPQUFPLGFBQWE7SUFDeEIsWUFDWSxJQUFnQixFQUNoQixXQUEwQixFQUMxQixhQUE4QjtRQUY5QixTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLGdCQUFXLEdBQVgsV0FBVyxDQUFlO1FBQzFCLGtCQUFhLEdBQWIsYUFBYSxDQUFpQjtJQUN0QyxDQUFDO0lBRUwsSUFBSSxDQUFJLEVBQWlDO1lBQWpDLEVBQUUsU0FBUyxPQUFzQixFQUFqQixJQUFJLGNBQXBCLGFBQXNCLENBQUY7UUFDMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzFDLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU87WUFDakMsTUFBTSxFQUFFLFlBQVksQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDO1NBQ3BDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxHQUFHLENBQUksSUFBZSxFQUFFLGVBQWUsR0FBRyxJQUFJO1FBQzVDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBSSxJQUFJLENBQUM7YUFDdEIsU0FBUyxFQUFFO2FBQ1gsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBRyxJQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBTSxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUVELE1BQU0sQ0FBQyxFQUFpQztZQUFqQyxFQUFFLFNBQVMsT0FBc0IsRUFBakIsSUFBSSxjQUFwQixhQUFzQixDQUFGO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDaEQsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTztZQUNqQyxZQUFZLEVBQUUsTUFBTTtZQUNwQixNQUFNLEVBQUUsWUFBWSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUM7U0FDcEMsQ0FBQyxDQUFDLElBQUksQ0FDTCxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQ3pCLENBQUM7SUFDSixDQUFDO0lBRUQsb0JBQW9CLENBQUMsRUFBaUM7WUFBakMsRUFBRSxTQUFTLE9BQXNCLEVBQWpCLElBQUksY0FBcEIsYUFBc0IsQ0FBRjtRQUN2QyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUEwQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNqRixPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPO1lBQ2pDLE1BQU0sRUFBRSxZQUFZLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQztTQUNwQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxZQUFZLENBQUMsRUFBaUM7WUFBakMsRUFBRSxTQUFTLE9BQXNCLEVBQWpCLElBQUksY0FBcEIsYUFBc0IsQ0FBRjtRQUMvQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQzVELE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU87WUFDakMsTUFBTSxFQUFFLFlBQVksQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDO1NBQ3BDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELGVBQWUsQ0FBQyxFQUFpQztZQUFqQyxFQUFFLFNBQVMsT0FBc0IsRUFBakIsSUFBSSxjQUFwQixhQUFzQixDQUFGO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDdEYsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTztTQUNsQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxXQUFXLENBQVUsR0FBVyxFQUFFLGVBQW9CLE1BQU07UUFDMUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBSSxHQUFHLEVBQUUsRUFBRSxZQUFZLEVBQUUsQ0FBQzthQUMzQyxTQUFTLEVBQUU7YUFDWCxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxZQUFZLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQU0sQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFTSxXQUFXLENBQUMsSUFBUztRQUMxQixPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRU0sT0FBTyxDQUFDLElBQWU7UUFDNUIsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVNLFdBQVcsQ0FBQyxJQUFlO1FBQ2hDLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFWSxjQUFjLENBQUMsUUFBZ0I7O1lBQzFDLElBQUk7Z0JBQ0YsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNoQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQVMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2FBQzlDO1lBQ0QsT0FBTyxJQUFJLEVBQUU7Z0JBQ1gsT0FBTyxJQUFJLENBQUM7YUFDYjtRQUNILENBQUM7S0FBQTtJQUVZLFVBQVUsQ0FBQyxRQUFzQjs7WUFDNUMsSUFBSTtnQkFDRixNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ2pELE9BQU8sQ0FBQSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzthQUNqRTtZQUNELE9BQU8sSUFBSSxFQUFFO2dCQUNYLE9BQU8sSUFBSSxDQUFDO2FBQ2I7UUFDSCxDQUFDO0tBQUE7OzJHQXRGVSxhQUFhOytHQUFiLGFBQWEsY0FGWixNQUFNOzRGQUVQLGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRGF0YVN0YXRlLCBub2RlVHlwZVRvUGFyYW0gfSBmcm9tICdAaGVzdGlhLWVhcnRoL2FwaSc7XG5pbXBvcnQgeyBJQ3ljbGVKU09OTEQsIElJbXBhY3RBc3Nlc3NtZW50SlNPTkxELCBJU2l0ZUpTT05MRCwgTm9kZVR5cGUsIFRlcm1UZXJtVHlwZSB9IGZyb20gJ0BoZXN0aWEtZWFydGgvc2NoZW1hJztcblxuaW1wb3J0IHsgdGVybUNoaWxkVG9QYXJlbnQgfSBmcm9tICcuLi90ZXJtcy90ZXJtcy5tb2RlbCc7XG5pbXBvcnQgeyBmaWx0ZXJQYXJhbXMsIGhhbmRsZUFQSUVycm9yIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzJztcbmltcG9ydCB7IEhlQ29tbW9uU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi9jb21tb24uc2VydmljZSc7XG5pbXBvcnQgeyBiYXNlVXJsIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzJztcbmltcG9ydCB7IEhlQXV0aFNlcnZpY2UgfSBmcm9tICcuLi9hdXRoL2F1dGguc2VydmljZSc7XG5cbmNvbnN0IG5vZGVUeXBlVXJsID0gKGFwaUJhc2VVcmw6IHN0cmluZywgdHlwZT86IE5vZGVUeXBlKSA9PiB0eXBlID8gYCR7YXBpQmFzZVVybH0vJHtub2RlVHlwZVRvUGFyYW0odHlwZSl9YCA6ICcnO1xuXG4vKipcbiAqIEdldCB0aGUgZnVsbCB1cmwgdG8gZmV0Y2ggdGhlIG5vZGUgZGF0YS5cbiAqXG4gKiBAcGFyYW0gYXBpQmFzZVVybCBUaGUgdXJsIG9mIHRoZSBBUEkgaG9zdGluZyB0aGUgZGF0YS5cbiAqIEBwYXJhbSBub2RlIFRoZSBub2RlIHdpdGggYSB0eXBlLCBpZCBhbmQgb3B0aW9uYWxseSBhIGRhdGFTdGF0ZVxuICogQHJldHVybnMgVGhlIGZ1bGwgdXJsLlxuICovXG5leHBvcnQgY29uc3Qgbm9kZVVybCA9IChhcGlCYXNlVXJsOiBzdHJpbmcsIHsgZGF0YVN0YXRlLCAuLi5ub2RlIH06IElKU09OTm9kZSkgPT5cbiAgYCR7bm9kZVR5cGVVcmwoYXBpQmFzZVVybCwgbm9kZVsnQHR5cGUnXSB8fCBub2RlLnR5cGUpfS8ke25vZGVbJ0BpZCddIHx8IG5vZGUuaWR9JHtkYXRhU3RhdGUgPyBgP2RhdGFTdGF0ZT0ke2RhdGFTdGF0ZX1gIDogJydcbiAgfWA7XG5cbmV4cG9ydCBjb25zdCBub2RlTG9nc1VybCA9IChhcGlCYXNlVXJsOiBzdHJpbmcsIHsgZGF0YVN0YXRlLCAuLi5ub2RlIH06IElKU09OTm9kZSkgPT5cbiAgYCR7bm9kZVVybChhcGlCYXNlVXJsLCBub2RlKX0vbG9nJHtkYXRhU3RhdGUgPyBgP2RhdGFTdGF0ZT0ke2RhdGFTdGF0ZX1gIDogJyd9YDtcblxuZXhwb3J0IGNvbnN0IGxvb2t1cFVybCA9IChmaWxlbmFtZTogc3RyaW5nKSA9PlxuICBmaWxlbmFtZS5zdGFydHNXaXRoKCdodHRwJykgPyBmaWxlbmFtZSA6IGAke2Jhc2VVcmwoKX0vZ2xvc3NhcnkvbG9va3Vwcy8ke2ZpbGVuYW1lfS5jc3ZgO1xuXG5leHBvcnQgY29uc3QgdGVybVR5cGVMb29rdXBVcmwgPSAodGVybVR5cGU6IFRlcm1UZXJtVHlwZSkgPT5cbiAgYCR7YmFzZVVybCgpfS9nbG9zc2FyeS8ke3Rlcm1DaGlsZFRvUGFyZW50KHRlcm1UeXBlKS50ZXJtVHlwZX0vJHt0ZXJtVHlwZX0uY3N2YDtcblxuZXhwb3J0IGludGVyZmFjZSBJSlNPTk5vZGUge1xuICAnQHR5cGUnPzogTm9kZVR5cGU7XG4gICdAaWQnPzogc3RyaW5nO1xuICB0eXBlPzogTm9kZVR5cGU7XG4gIGlkPzogc3RyaW5nO1xuICBkYXRhU3RhdGU/OiBEYXRhU3RhdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlbGF0ZWROb2RlIHtcbiAgJ0B0eXBlJzogTm9kZVR5cGU7XG4gICdAaWQnOiBzdHJpbmc7XG4gIFt4OiBzdHJpbmddOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUpTT05EYXRhIHtcbiAgW05vZGVUeXBlLkN5Y2xlXT86IElDeWNsZUpTT05MRFtdO1xuICBbTm9kZVR5cGUuU2l0ZV0/OiBJU2l0ZUpTT05MRFtdO1xuICBbTm9kZVR5cGUuSW1wYWN0QXNzZXNzbWVudF0/OiBJSW1wYWN0QXNzZXNzbWVudEpTT05MRFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElOb2RlTWlzc2luZ0xvb2t1cExvZyB7XG4gIGZpbGVuYW1lOiBzdHJpbmc7XG4gIHRlcm1JZDogc3RyaW5nO1xuICBjb2x1bW46IHN0cmluZztcbiAgLy8gYXR0cmlidXRlcyBsaW5rZWQgdG8gdGhlIG1vZGVsc1xuICBtb2RlbD86IHN0cmluZztcbiAgdGVybT86IHN0cmluZztcbiAga2V5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElOb2RlVGVybUxvZ3Mge1xuICBbbW9kZWxLZXk6IHN0cmluZ106IHtcbiAgICBtb2RlbDogc3RyaW5nO1xuICAgIGlzS2V5OiBib29sZWFuO1xuICAgIHNob3VsZFJ1bj86IGJvb2xlYW47XG4gICAgbWlzc2luZ0xvb2t1cHM/OiBJTm9kZU1pc3NpbmdMb29rdXBMb2dbXTtcbiAgICByZXF1aXJlbWVudHM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuICAgIGxvZ3M/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAvLyBwb3NzaWJsZSBzdWIgdmFsdWVzXG4gICAgaW5wdXQ/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICBwcm9wZXJ0eT86IHN0cmluZyB8IHN0cmluZ1tdO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElOb2RlTG9ncyB7XG4gIFt0ZXJtOiBzdHJpbmddOiBJTm9kZVRlcm1Mb2dzO1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBIZU5vZGVTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJvdGVjdGVkIGF1dGhTZXJ2aWNlOiBIZUF1dGhTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBjb21tb25TZXJ2aWNlOiBIZUNvbW1vblNlcnZpY2VcbiAgKSB7IH1cblxuICBnZXQkPFQ+KHsgZGF0YVN0YXRlLCAuLi5ub2RlIH06IElKU09OTm9kZSkge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFQ+KHRoaXMubm9kZVVybChub2RlKSwge1xuICAgICAgaGVhZGVyczogdGhpcy5hdXRoU2VydmljZS5oZWFkZXJzLFxuICAgICAgcGFyYW1zOiBmaWx0ZXJQYXJhbXMoeyBkYXRhU3RhdGUgfSlcbiAgICB9KTtcbiAgfVxuXG4gIGdldDxUPihub2RlOiBJSlNPTk5vZGUsIGRlZmF1bHRGb3JTdGF0ZSA9IHRydWUpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQkPFQ+KG5vZGUpXG4gICAgICAudG9Qcm9taXNlKClcbiAgICAgIC5jYXRjaCgoKSA9PiBub2RlLmRhdGFTdGF0ZSAmJiBkZWZhdWx0Rm9yU3RhdGUgPyAoKG5vZGUgYXMgYW55KSBhcyBUKSA6ICh7fSkgYXMgVCk7XG4gIH1cblxuICBnZXRMb2coeyBkYXRhU3RhdGUsIC4uLm5vZGUgfTogSUpTT05Ob2RlKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7dGhpcy5ub2RlVXJsKG5vZGUpfS9sb2dgLCB7XG4gICAgICBoZWFkZXJzOiB0aGlzLmF1dGhTZXJ2aWNlLmhlYWRlcnMsXG4gICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JyxcbiAgICAgIHBhcmFtczogZmlsdGVyUGFyYW1zKHsgZGF0YVN0YXRlIH0pXG4gICAgfSkucGlwZShcbiAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoJycpKVxuICAgICk7XG4gIH1cblxuICBnZXRNaXNzaW5nTG9va3Vwc0xvZyh7IGRhdGFTdGF0ZSwgLi4ubm9kZSB9OiBJSlNPTk5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJTm9kZU1pc3NpbmdMb29rdXBMb2dbXT4oYCR7dGhpcy5ub2RlVXJsKG5vZGUpfS9sb2cvbG9va3Vwc2AsIHtcbiAgICAgIGhlYWRlcnM6IHRoaXMuYXV0aFNlcnZpY2UuaGVhZGVycyxcbiAgICAgIHBhcmFtczogZmlsdGVyUGFyYW1zKHsgZGF0YVN0YXRlIH0pXG4gICAgfSkudG9Qcm9taXNlKCkuY2F0Y2goaGFuZGxlQVBJRXJyb3IpO1xuICB9XG5cbiAgZ2V0TW9kZWxzTG9nKHsgZGF0YVN0YXRlLCAuLi5ub2RlIH06IElKU09OTm9kZSkge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PGFueT4oYCR7dGhpcy5ub2RlVXJsKG5vZGUpfS9sb2cvbW9kZWxzYCwge1xuICAgICAgaGVhZGVyczogdGhpcy5hdXRoU2VydmljZS5oZWFkZXJzLFxuICAgICAgcGFyYW1zOiBmaWx0ZXJQYXJhbXMoeyBkYXRhU3RhdGUgfSlcbiAgICB9KS50b1Byb21pc2UoKS5jYXRjaChoYW5kbGVBUElFcnJvcik7XG4gIH1cblxuICB0cmlnZ2VyUGlwZWxpbmUoeyBkYXRhU3RhdGUsIC4uLm5vZGUgfTogSUpTT05Ob2RlKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMubm9kZVVybChub2RlKX0vcGlwZWxpbmVgLCBkYXRhU3RhdGUgPyB7IGRhdGFTdGF0ZSB9IDoge30sIHtcbiAgICAgIGhlYWRlcnM6IHRoaXMuYXV0aFNlcnZpY2UuaGVhZGVyc1xuICAgIH0pLnRvUHJvbWlzZSgpLmNhdGNoKGhhbmRsZUFQSUVycm9yKTtcbiAgfVxuXG4gIGRvd25sb2FkUmF3PFQgPSBhbnk+KHVybDogc3RyaW5nLCByZXNwb25zZVR5cGU6IGFueSA9ICdqc29uJykge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFQ+KHVybCwgeyByZXNwb25zZVR5cGUgfSlcbiAgICAgIC50b1Byb21pc2UoKVxuICAgICAgLmNhdGNoKCgpID0+IChyZXNwb25zZVR5cGUgPT09ICdqc29uJyA/ICh7fSkgOiAnJykgYXMgVCk7XG4gIH1cblxuICBwdWJsaWMgbm9kZVR5cGVVcmwodHlwZTogYW55KSB7XG4gICAgcmV0dXJuIG5vZGVUeXBlVXJsKHRoaXMuY29tbW9uU2VydmljZS5hcGlCYXNlVXJsLCB0eXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBub2RlVXJsKG5vZGU6IElKU09OTm9kZSkge1xuICAgIHJldHVybiBub2RlVXJsKHRoaXMuY29tbW9uU2VydmljZS5hcGlCYXNlVXJsLCBub2RlKTtcbiAgfVxuXG4gIHB1YmxpYyBub2RlTG9nc1VybChub2RlOiBJSlNPTk5vZGUpIHtcbiAgICByZXR1cm4gbm9kZUxvZ3NVcmwodGhpcy5jb21tb25TZXJ2aWNlLmFwaUJhc2VVcmwsIG5vZGUpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGRvd25sb2FkTG9va3VwKGZpbGVuYW1lOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gbG9va3VwVXJsKGZpbGVuYW1lKTtcbiAgICAgIHJldHVybiB0aGlzLmRvd25sb2FkUmF3PHN0cmluZz4odXJsLCAndGV4dCcpO1xuICAgIH1cbiAgICBjYXRjaCAoX2Vycikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvb2t1cExpbmsodGVybVR5cGU6IFRlcm1UZXJtVHlwZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5kb3dubG9hZExvb2t1cCh0ZXJtVHlwZSk7XG4gICAgICByZXR1cm4gZGF0YT8uc3RhcnRzV2l0aCgndGVybS5pZCcpID8gbG9va3VwVXJsKHRlcm1UeXBlKSA6IG51bGw7XG4gICAgfVxuICAgIGNhdGNoIChfZXJyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25vZGUvbm9kZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVDLE9BQU8sRUFBYSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMvRCxPQUFPLEVBQXNELFFBQVEsRUFBZ0IsTUFBTSxzQkFBc0IsQ0FBQztBQUVsSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7QUFHMUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxVQUFrQixFQUFFLElBQWUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBRWxIOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxDQUFDLFVBQWtCLEVBQUUsRUFBaUMsRUFBRSxFQUFFO1FBQXJDLEVBQUUsU0FBUyxPQUFzQixFQUFqQixJQUFJLGNBQXBCLGFBQXNCLENBQUY7SUFDOUQsT0FBQSxHQUFHLFdBQVcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQyxD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WixNQUFNOzRGQUVQLGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRGF0YVN0YXRlLCBub2RlVHlwZVRvUGFyYW0gfSBmcm9tICdAaGVzdGlhLWVhcnRoL2FwaSc7XG5pbXBvcnQgeyBJQ3ljbGVKU09OTEQsIElJbXBhY3RBc3Nlc3NtZW50SlNPTkxELCBJU2l0ZUpTT05MRCwgTm9kZVR5cGUsIFRlcm1UZXJtVHlwZSB9IGZyb20gJ0BoZXN0aWEtZWFydGgvc2NoZW1hJztcblxuaW1wb3J0IHsgdGVybUNoaWxkVG9QYXJlbnQgfSBmcm9tICcuLi90ZXJtcy90ZXJtcy5tb2RlbCc7XG5pbXBvcnQgeyBmaWx0ZXJQYXJhbXMsIGhhbmRsZUFQSUVycm9yIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzJztcbmltcG9ydCB7IEhlQ29tbW9uU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi9jb21tb24uc2VydmljZSc7XG5pbXBvcnQgeyBiYXNlVXJsIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzJztcbmltcG9ydCB7IEhlQXV0aFNlcnZpY2UgfSBmcm9tICcuLi9hdXRoL2F1dGguc2VydmljZSc7XG5cbmNvbnN0IG5vZGVUeXBlVXJsID0gKGFwaUJhc2VVcmw6IHN0cmluZywgdHlwZT86IE5vZGVUeXBlKSA9PiB0eXBlID8gYCR7YXBpQmFzZVVybH0vJHtub2RlVHlwZVRvUGFyYW0odHlwZSl9YCA6ICcnO1xuXG4vKipcbiAqIEdldCB0aGUgZnVsbCB1cmwgdG8gZmV0Y2ggdGhlIG5vZGUgZGF0YS5cbiAqXG4gKiBAcGFyYW0gYXBpQmFzZVVybCBUaGUgdXJsIG9mIHRoZSBBUEkgaG9zdGluZyB0aGUgZGF0YS5cbiAqIEBwYXJhbSBub2RlIFRoZSBub2RlIHdpdGggYSB0eXBlLCBpZCBhbmQgb3B0aW9uYWxseSBhIGRhdGFTdGF0ZVxuICogQHJldHVybnMgVGhlIGZ1bGwgdXJsLlxuICovXG5leHBvcnQgY29uc3Qgbm9kZVVybCA9IChhcGlCYXNlVXJsOiBzdHJpbmcsIHsgZGF0YVN0YXRlLCAuLi5ub2RlIH06IElKU09OTm9kZSkgPT5cbiAgYCR7bm9kZVR5cGVVcmwoYXBpQmFzZVVybCwgbm9kZVsnQHR5cGUnXSB8fCBub2RlLnR5cGUpfS8ke25vZGVbJ0BpZCddIHx8IG5vZGUuaWR9JHtkYXRhU3RhdGUgPyBgP2RhdGFTdGF0ZT0ke2RhdGFTdGF0ZX1gIDogJydcbiAgfWA7XG5cbmV4cG9ydCBjb25zdCBub2RlTG9nc1VybCA9IChhcGlCYXNlVXJsOiBzdHJpbmcsIHsgZGF0YVN0YXRlLCAuLi5ub2RlIH06IElKU09OTm9kZSkgPT5cbiAgYCR7bm9kZVVybChhcGlCYXNlVXJsLCBub2RlKX0vbG9nJHtkYXRhU3RhdGUgPyBgP2RhdGFTdGF0ZT0ke2RhdGFTdGF0ZX1gIDogJyd9YDtcblxuZXhwb3J0IGNvbnN0IGxvb2t1cFVybCA9IChmaWxlbmFtZTogc3RyaW5nKSA9PlxuICBmaWxlbmFtZS5zdGFydHNXaXRoKCdodHRwJykgPyBmaWxlbmFtZSA6IGAke2Jhc2VVcmwoKX0vZ2xvc3NhcnkvbG9va3Vwcy8ke2ZpbGVuYW1lfS5jc3ZgO1xuXG5leHBvcnQgY29uc3QgdGVybVR5cGVMb29rdXBVcmwgPSAodGVybVR5cGU6IFRlcm1UZXJtVHlwZSkgPT5cbiAgYCR7YmFzZVVybCgpfS9nbG9zc2FyeS8ke3Rlcm1DaGlsZFRvUGFyZW50KHRlcm1UeXBlKS50ZXJtVHlwZX0vJHt0ZXJtVHlwZX0uY3N2YDtcblxuZXhwb3J0IGludGVyZmFjZSBJSlNPTk5vZGUge1xuICAnQHR5cGUnPzogTm9kZVR5cGU7XG4gICdAaWQnPzogc3RyaW5nO1xuICB0eXBlPzogTm9kZVR5cGU7XG4gIGlkPzogc3RyaW5nO1xuICBkYXRhU3RhdGU/OiBEYXRhU3RhdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlbGF0ZWROb2RlIHtcbiAgJ0B0eXBlJzogTm9kZVR5cGU7XG4gICdAaWQnOiBzdHJpbmc7XG4gIFt4OiBzdHJpbmddOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUpTT05EYXRhIHtcbiAgW05vZGVUeXBlLkN5Y2xlXT86IElDeWNsZUpTT05MRFtdO1xuICBbTm9kZVR5cGUuU2l0ZV0/OiBJU2l0ZUpTT05MRFtdO1xuICBbTm9kZVR5cGUuSW1wYWN0QXNzZXNzbWVudF0/OiBJSW1wYWN0QXNzZXNzbWVudEpTT05MRFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElOb2RlTWlzc2luZ0xvb2t1cExvZyB7XG4gIGZpbGVuYW1lOiBzdHJpbmc7XG4gIHRlcm1JZDogc3RyaW5nO1xuICBjb2x1bW46IHN0cmluZztcbiAgLy8gYXR0cmlidXRlcyBsaW5rZWQgdG8gdGhlIG1vZGVsc1xuICBtb2RlbD86IHN0cmluZztcbiAgdGVybT86IHN0cmluZztcbiAga2V5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElOb2RlVGVybUxvZ3Mge1xuICBbbW9kZWxLZXk6IHN0cmluZ106IHtcbiAgICBtb2RlbDogc3RyaW5nO1xuICAgIGlzS2V5OiBib29sZWFuO1xuICAgIHNob3VsZFJ1bj86IGJvb2xlYW47XG4gICAgc2hvdWxkUnVuT3JjaGVzdHJhdG9yPzogYm9vbGVhbjtcbiAgICBtaXNzaW5nTG9va3Vwcz86IElOb2RlTWlzc2luZ0xvb2t1cExvZ1tdO1xuICAgIHJlcXVpcmVtZW50cz86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG4gICAgbG9ncz86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG4gICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgIC8vIHBvc3NpYmxlIHN1YiB2YWx1ZXNcbiAgICBpbnB1dD86IHN0cmluZyB8IHN0cmluZ1tdO1xuICAgIHByb3BlcnR5Pzogc3RyaW5nIHwgc3RyaW5nW107XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU5vZGVMb2dzIHtcbiAgW3Rlcm06IHN0cmluZ106IElOb2RlVGVybUxvZ3M7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEhlTm9kZVNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcm90ZWN0ZWQgYXV0aFNlcnZpY2U6IEhlQXV0aFNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGNvbW1vblNlcnZpY2U6IEhlQ29tbW9uU2VydmljZVxuICApIHsgfVxuXG4gIGdldCQ8VD4oeyBkYXRhU3RhdGUsIC4uLm5vZGUgfTogSUpTT05Ob2RlKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VD4odGhpcy5ub2RlVXJsKG5vZGUpLCB7XG4gICAgICBoZWFkZXJzOiB0aGlzLmF1dGhTZXJ2aWNlLmhlYWRlcnMsXG4gICAgICBwYXJhbXM6IGZpbHRlclBhcmFtcyh7IGRhdGFTdGF0ZSB9KVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0PFQ+KG5vZGU6IElKU09OTm9kZSwgZGVmYXVsdEZvclN0YXRlID0gdHJ1ZSkge1xuICAgIHJldHVybiB0aGlzLmdldCQ8VD4obm9kZSlcbiAgICAgIC50b1Byb21pc2UoKVxuICAgICAgLmNhdGNoKCgpID0+IG5vZGUuZGF0YVN0YXRlICYmIGRlZmF1bHRGb3JTdGF0ZSA/ICgobm9kZSBhcyBhbnkpIGFzIFQpIDogKHt9KSBhcyBUKTtcbiAgfVxuXG4gIGdldExvZyh7IGRhdGFTdGF0ZSwgLi4ubm9kZSB9OiBJSlNPTk5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChgJHt0aGlzLm5vZGVVcmwobm9kZSl9L2xvZ2AsIHtcbiAgICAgIGhlYWRlcnM6IHRoaXMuYXV0aFNlcnZpY2UuaGVhZGVycyxcbiAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxuICAgICAgcGFyYW1zOiBmaWx0ZXJQYXJhbXMoeyBkYXRhU3RhdGUgfSlcbiAgICB9KS5waXBlKFxuICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZignJykpXG4gICAgKTtcbiAgfVxuXG4gIGdldE1pc3NpbmdMb29rdXBzTG9nKHsgZGF0YVN0YXRlLCAuLi5ub2RlIH06IElKU09OTm9kZSkge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElOb2RlTWlzc2luZ0xvb2t1cExvZ1tdPihgJHt0aGlzLm5vZGVVcmwobm9kZSl9L2xvZy9sb29rdXBzYCwge1xuICAgICAgaGVhZGVyczogdGhpcy5hdXRoU2VydmljZS5oZWFkZXJzLFxuICAgICAgcGFyYW1zOiBmaWx0ZXJQYXJhbXMoeyBkYXRhU3RhdGUgfSlcbiAgICB9KS50b1Byb21pc2UoKS5jYXRjaChoYW5kbGVBUElFcnJvcik7XG4gIH1cblxuICBnZXRNb2RlbHNMb2coeyBkYXRhU3RhdGUsIC4uLm5vZGUgfTogSUpTT05Ob2RlKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8YW55PihgJHt0aGlzLm5vZGVVcmwobm9kZSl9L2xvZy9tb2RlbHNgLCB7XG4gICAgICBoZWFkZXJzOiB0aGlzLmF1dGhTZXJ2aWNlLmhlYWRlcnMsXG4gICAgICBwYXJhbXM6IGZpbHRlclBhcmFtcyh7IGRhdGFTdGF0ZSB9KVxuICAgIH0pLnRvUHJvbWlzZSgpLmNhdGNoKGhhbmRsZUFQSUVycm9yKTtcbiAgfVxuXG4gIHRyaWdnZXJQaXBlbGluZSh7IGRhdGFTdGF0ZSwgLi4ubm9kZSB9OiBJSlNPTk5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5ub2RlVXJsKG5vZGUpfS9waXBlbGluZWAsIGRhdGFTdGF0ZSA/IHsgZGF0YVN0YXRlIH0gOiB7fSwge1xuICAgICAgaGVhZGVyczogdGhpcy5hdXRoU2VydmljZS5oZWFkZXJzXG4gICAgfSkudG9Qcm9taXNlKCkuY2F0Y2goaGFuZGxlQVBJRXJyb3IpO1xuICB9XG5cbiAgZG93bmxvYWRSYXc8VCA9IGFueT4odXJsOiBzdHJpbmcsIHJlc3BvbnNlVHlwZTogYW55ID0gJ2pzb24nKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VD4odXJsLCB7IHJlc3BvbnNlVHlwZSB9KVxuICAgICAgLnRvUHJvbWlzZSgpXG4gICAgICAuY2F0Y2goKCkgPT4gKHJlc3BvbnNlVHlwZSA9PT0gJ2pzb24nID8gKHt9KSA6ICcnKSBhcyBUKTtcbiAgfVxuXG4gIHB1YmxpYyBub2RlVHlwZVVybCh0eXBlOiBhbnkpIHtcbiAgICByZXR1cm4gbm9kZVR5cGVVcmwodGhpcy5jb21tb25TZXJ2aWNlLmFwaUJhc2VVcmwsIHR5cGUpO1xuICB9XG5cbiAgcHVibGljIG5vZGVVcmwobm9kZTogSUpTT05Ob2RlKSB7XG4gICAgcmV0dXJuIG5vZGVVcmwodGhpcy5jb21tb25TZXJ2aWNlLmFwaUJhc2VVcmwsIG5vZGUpO1xuICB9XG5cbiAgcHVibGljIG5vZGVMb2dzVXJsKG5vZGU6IElKU09OTm9kZSkge1xuICAgIHJldHVybiBub2RlTG9nc1VybCh0aGlzLmNvbW1vblNlcnZpY2UuYXBpQmFzZVVybCwgbm9kZSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZG93bmxvYWRMb29rdXAoZmlsZW5hbWU6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSBsb29rdXBVcmwoZmlsZW5hbWUpO1xuICAgICAgcmV0dXJuIHRoaXMuZG93bmxvYWRSYXc8c3RyaW5nPih1cmwsICd0ZXh0Jyk7XG4gICAgfVxuICAgIGNhdGNoIChfZXJyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbG9va3VwTGluayh0ZXJtVHlwZTogVGVybVRlcm1UeXBlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmRvd25sb2FkTG9va3VwKHRlcm1UeXBlKTtcbiAgICAgIHJldHVybiBkYXRhPy5zdGFydHNXaXRoKCd0ZXJtLmlkJykgPyBsb29rdXBVcmwodGVybVR5cGUpIDogbnVsbDtcbiAgICB9XG4gICAgY2F0Y2ggKF9lcnIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -60,7 +60,7 @@ export class SitesMeasurementsComponent {
|
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
SitesMeasurementsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SitesMeasurementsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
63
|
-
SitesMeasurementsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: SitesMeasurementsComponent, selector: "he-sites-measurements", inputs: { originalValues: "originalValues", sites: "sites", dataState: "dataState" }, usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"measurements.length; else emptyTable\">\n <div class=\"columns is-variable is-2 m-0\">\n <div class=\"column is-hidden-mobile\"></div>\n <div class=\"column is-narrow\">\n <div class=\"field has-addons\">\n <div class=\"control\">\n <button class=\"button is-small\" [class.is-active]=\"selectedView === View.table\" (click)=\"selectedView = View.table\">\n <span class=\"icon is-small\">\n <fa-icon icon=\"list\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span>Table view</span>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"!isOriginal && sites.length === 1\">\n <button class=\"button is-small\" [class.is-active]=\"selectedView === View.logs\" (click)=\"selectedView = View.logs\">\n <span class=\"icon is-small\">\n <fa-icon icon=\"calculator\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span>Recalculations logs</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"px-3 pb-3\" [class.is-hidden]=\"selectedView !== View.table\">\n <div class=\"has-text-right mb-2\">\n <button class=\"button is-dark is-outlined is-small\" (click)=\"showDownload = true\">\n <fa-icon icon=\"download\"></fa-icon>\n <span class=\"pl-2\">Download (CSV)</span>\n </button>\n </div>\n\n <div class=\"table-container data-table-container mb-1\">\n <table class=\"table is-narrow data-table has-children-{{measurements.length}}\">\n <thead>\n <tr>\n <th class=\"width-auto\"></th>\n <th *ngFor=\"let measurement of measurements\"\n [attr.title]=\"measurement.value.term.name\"\n >\n <he-node-link [node]=\"measurement.value.term\">\n <span>{{measurement.value.term.name | ellipsis:30}}</span>\n </he-node-link>\n </th>\n </tr>\n <tr>\n <th class=\"width-auto\"></th>\n <th *ngFor=\"let measurement of measurements\"\n [attr.title]=\"measurement.value.term.units\"\n >{{measurement.value.term.units}}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let site of sites; trackBy: trackById; let i = index\">\n <td class=\"width-auto\" [attr.title]=\"defaultLabel(site)\">\n <he-node-link [node]=\"site\">\n <span class=\"is-nowrap has-text-ellipsis\">{{i + 1}}. {{defaultLabel(site)}}</span>\n </he-node-link>\n </td>\n <td class=\"is-nowrap\" *ngFor=\"let measurement of measurements\">\n <span *ngIf=\"measurement.value.values[site['@id']]\"\n class=\"trigger-popover\"\n [ngbPopover]=\"details\" [autoClose]=\"'outside'\"\n triggers=\"manual\" #p=\"ngbPopover\" placement=\"left\" container=\"body\"\n (click)=\"togglePopover(p, { data: measurement.value.values[site['@id']], site: site, key: 'measurements' })\"\n >\n <span pointer>{{measurementValue(measurement.value.values[site['@id']], measurement.value.term['@id']) | precision:3 | default:'-'}}</span>\n <he-blank-node-state class=\"ml-1\"\n [node]=\"measurement.value.values[site['@id']].nodes[0]\"\n key=\"value\"\n ></he-blank-node-state>\n </span>\n <span *ngIf=\"!measurement.value.values[site['@id']]\">\n <span>-</span>\n <sup class=\"pl-1\" *ngIf=\"siteTooBig(site)\">(1)</sup>\n </span>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <he-blank-node-state-notice [dataState]=\"dataState\"></he-blank-node-state-notice>\n\n <p class=\"is-size-7 is-italic\" *ngIf=\"showAreaTooBig\">\n (1) This region is >{{maxAreaSize}}km2 and is too large to reliably gap fill Measurements.\n </p>\n </div>\n\n <he-sites-measurements-logs *ngIf=\"selectedView === View.logs && !isOriginal\"\n [site]=\"sites[0]\"\n [originalValues]=\"originalValues[0].measurements\"\n [recalculatedValues]=\"sites[0].measurements\"\n ></he-sites-measurements-logs>\n</ng-container>\n\n<he-node-csv-export-confirm *ngIf=\"showDownload\"\n [nodes]=\"sites\" filename=\"site-measurements.csv\" [isUpload]=\"false\"\n [headerKeys]=\"['site.id', 'site.@id', 'site.measurements.']\"\n (closed)=\"showDownload = false\"\n></he-node-csv-export-confirm>\n\n<ng-template #emptyTable>\n <div class=\"panel-block\">\n <span>No data</span>\n </div>\n</ng-template>\n\n<ng-template #emptyValue>\n <span>-</span>\n</ng-template>\n\n<ng-template #details let-node=\"site\" let-data=\"data\" let-key=\"key\">\n <p><b>{{node.name}}</b></p>\n <he-node-value-details\n [data]=\"data\" [nodeType]=\"node['@type']\" [dataKey]=\"key\"\n ></he-node-value-details>\n</ng-template>\n", styles: ["fa-icon{display:inline-block;width:10px}\n"], components: [{ type: i1.FaIconComponent, selector: "fa-icon", inputs: ["classes", "icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }, { type: i2.NodeLinkComponent, selector: "he-node-link", inputs: ["node", "showExternalLink"] }, { type: i3.BlankNodeStateComponent, selector: "he-blank-node-state", inputs: ["nodeType", "dataKey", "key", "node", "state"] }, { type: i4.BlankNodeStateNoticeComponent, selector: "he-blank-node-state-notice", inputs: ["dataState", "showAggregated", "showDeleted"] }, { type: i5.SitesMeasurementsLogsComponent, selector: "he-sites-measurements-logs", inputs: ["site", "originalValues", "recalculatedValues"] }, { type: i6.NodeCsvExportConfirmComponent, selector: "he-node-csv-export-confirm", inputs: ["nodes", "filename", "headerKeys", "extension", "isUpload"], outputs: ["closed"] }, { type: i7.NodeValueDetailsComponent, selector: "he-node-value-details", inputs: ["data", "nodeType", "dataKey"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i9.NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disablePopover", "popoverClass", "openDelay", "closeDelay", "ngbPopover", "popoverTitle"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }], pipes: { "ellipsis": i10.EllipsisPipe, "default": i11.DefaultPipe, "precision": i12.PrecisionPipe } });
|
|
63
|
+
SitesMeasurementsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: SitesMeasurementsComponent, selector: "he-sites-measurements", inputs: { originalValues: "originalValues", sites: "sites", dataState: "dataState" }, usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"measurements.length; else emptyTable\">\n <div class=\"columns is-variable is-2 m-0\">\n <div class=\"column is-hidden-mobile\"></div>\n <div class=\"column is-narrow\">\n <div class=\"field has-addons\">\n <div class=\"control\">\n <button class=\"button is-small\" [class.is-active]=\"selectedView === View.table\" (click)=\"selectedView = View.table\">\n <span class=\"icon is-small\">\n <fa-icon icon=\"list\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span>Table view</span>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"!isOriginal && sites.length === 1\">\n <button class=\"button is-small\" [class.is-active]=\"selectedView === View.logs\" (click)=\"selectedView = View.logs\">\n <span class=\"icon is-small\">\n <fa-icon icon=\"calculator\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span>Recalculations logs</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"px-3 pb-3\" [class.is-hidden]=\"selectedView !== View.table\">\n <div class=\"has-text-right mb-2\">\n <button class=\"button is-dark is-outlined is-small\" (click)=\"showDownload = true\">\n <fa-icon icon=\"download\"></fa-icon>\n <span class=\"pl-2\">Download (CSV)</span>\n </button>\n </div>\n\n <div class=\"table-container data-table-container mb-1\">\n <table class=\"table is-narrow data-table has-children-{{measurements.length}}\">\n <thead>\n <tr>\n <th class=\"width-auto\"></th>\n <th *ngFor=\"let measurement of measurements\"\n [attr.title]=\"measurement.value.term.name\"\n >\n <he-node-link [node]=\"measurement.value.term\">\n <span>{{measurement.value.term.name | ellipsis:30}}</span>\n </he-node-link>\n </th>\n </tr>\n <tr>\n <th class=\"width-auto\"></th>\n <th *ngFor=\"let measurement of measurements\"\n [attr.title]=\"measurement.value.term.units\"\n >{{measurement.value.term.units}}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let site of sites; trackBy: trackById; let i = index\">\n <td class=\"width-auto\" [attr.title]=\"defaultLabel(site)\">\n <he-node-link [node]=\"site\">\n <span class=\"is-nowrap has-text-ellipsis\">{{i + 1}}. {{defaultLabel(site)}}</span>\n </he-node-link>\n </td>\n <td class=\"is-nowrap\" *ngFor=\"let measurement of measurements\">\n <span *ngIf=\"measurement.value.values[site['@id']]\"\n class=\"trigger-popover\"\n [ngbPopover]=\"details\" [autoClose]=\"'outside'\"\n triggers=\"manual\" #p=\"ngbPopover\" placement=\"left\" container=\"body\"\n (click)=\"togglePopover(p, { data: measurement.value.values[site['@id']], site: site, key: 'measurements' })\"\n >\n <span pointer>{{measurementValue(measurement.value.values[site['@id']], measurement.value.term['@id']) | precision:3 | default:'-'}}</span>\n <he-blank-node-state class=\"ml-1\"\n [node]=\"measurement.value.values[site['@id']].nodes[0]\"\n key=\"value\"\n ></he-blank-node-state>\n </span>\n <span *ngIf=\"!measurement.value.values[site['@id']]\">\n <span>-</span>\n <sup class=\"pl-1\" *ngIf=\"siteTooBig(site)\">(1)</sup>\n </span>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <he-blank-node-state-notice [dataState]=\"dataState\"></he-blank-node-state-notice>\n\n <p class=\"is-size-7 is-italic\" *ngIf=\"showAreaTooBig\">\n (1) This region is >{{maxAreaSize}}km2 and is too large to reliably gap fill Measurements.\n </p>\n </div>\n\n <he-sites-measurements-logs *ngIf=\"selectedView === View.logs && !isOriginal\"\n [site]=\"sites[0]\"\n [originalValues]=\"originalValues[0].measurements\"\n [recalculatedValues]=\"sites[0].measurements\"\n ></he-sites-measurements-logs>\n</ng-container>\n\n<he-node-csv-export-confirm *ngIf=\"showDownload\"\n [nodes]=\"sites\" filename=\"site-measurements.csv\" [isUpload]=\"false\"\n [headerKeys]=\"['site.id', 'site.@id', 'site.measurements.']\"\n (closed)=\"showDownload = false\"\n></he-node-csv-export-confirm>\n\n<ng-template #emptyTable>\n <div class=\"panel-block\">\n <span>No data</span>\n </div>\n</ng-template>\n\n<ng-template #emptyValue>\n <span>-</span>\n</ng-template>\n\n<ng-template #details let-node=\"site\" let-data=\"data\" let-key=\"key\">\n <p><b>{{node.name}}</b></p>\n <he-node-value-details\n [data]=\"data\" [nodeType]=\"node['@type']\" [dataKey]=\"key\"\n ></he-node-value-details>\n</ng-template>\n", styles: ["fa-icon{display:inline-block;width:10px}\n"], components: [{ type: i1.FaIconComponent, selector: "fa-icon", inputs: ["classes", "icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }, { type: i2.NodeLinkComponent, selector: "he-node-link", inputs: ["node", "showExternalLink"] }, { type: i3.BlankNodeStateComponent, selector: "he-blank-node-state", inputs: ["nodeType", "dataKey", "key", "node", "state"] }, { type: i4.BlankNodeStateNoticeComponent, selector: "he-blank-node-state-notice", inputs: ["dataState", "showAggregated", "showDeleted", "showUnchanged"] }, { type: i5.SitesMeasurementsLogsComponent, selector: "he-sites-measurements-logs", inputs: ["site", "originalValues", "recalculatedValues"] }, { type: i6.NodeCsvExportConfirmComponent, selector: "he-node-csv-export-confirm", inputs: ["nodes", "filename", "headerKeys", "extension", "isUpload"], outputs: ["closed"] }, { type: i7.NodeValueDetailsComponent, selector: "he-node-value-details", inputs: ["data", "nodeType", "dataKey"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i9.NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disablePopover", "popoverClass", "openDelay", "closeDelay", "ngbPopover", "popoverTitle"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }], pipes: { "ellipsis": i10.EllipsisPipe, "default": i11.DefaultPipe, "precision": i12.PrecisionPipe } });
|
|
64
64
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SitesMeasurementsComponent, decorators: [{
|
|
65
65
|
type: Component,
|
|
66
66
|
args: [{
|