@hestia-earth/ui-components 0.30.2 → 0.30.4

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.
@@ -0,0 +1,79 @@
1
+ import { KeyValuePipe, NgTemplateOutlet } from '@angular/common';
2
+ import { Component, computed, input } from '@angular/core';
3
+ import { NodeType } from '@hestia-earth/schema';
4
+ import { FaIconComponent } from '@fortawesome/angular-fontawesome';
5
+ import { faClone as farClone } from '@fortawesome/free-regular-svg-icons';
6
+ import { SvgIconComponent } from 'angular-svg-icon';
7
+ import { ClipboardComponent, KeyToLabelPipe, IsArrayPipe, IsObjectPipe, SortByPipe } from '../../../common';
8
+ import { NodeLinkComponent } from '../../node-link/node-link.component';
9
+ import { logValueArray } from '../node-logs-models.model';
10
+ import * as i0 from "@angular/core";
11
+ const requirementColor = (value) => (!value || ['None', 'False', '0', '0.0'].includes(value) ? 'danger' : 'white');
12
+ const nodeTypesLowerCase = Object.values(NodeType).map(v => v.toLowerCase());
13
+ const requirementKeys = (requirements) => Object.keys(requirements).filter(k => !nodeTypesLowerCase.includes(k) && !['model_key'].includes(k));
14
+ const requirementLinkedNodeByKey = {
15
+ related_cycles: v => ({ '@type': NodeType.Cycle, '@id': v }),
16
+ cycle_id: v => ({ '@type': NodeType.Cycle, '@id': v }),
17
+ impact_assessment_id: v => ({ '@type': NodeType.ImpactAssessment, '@id': v }),
18
+ site_id: v => ({ '@type': NodeType.Site, '@id': v }),
19
+ source_id: v => ({ '@type': NodeType.Source, '@id': v }),
20
+ property_id: v => ({ '@type': NodeType.Term, '@id': v }),
21
+ input_id: v => ({ '@type': NodeType.Term, '@id': v }),
22
+ product_id: v => ({ '@type': NodeType.Term, '@id': v }),
23
+ practice_id: v => ({ '@type': NodeType.Term, '@id': v }),
24
+ crop_product_id: v => ({ '@type': NodeType.Term, '@id': v })
25
+ };
26
+ const requirementLinkedNode = (key, value) => key in requirementLinkedNodeByKey && !['None', '', null].includes(value)
27
+ ? Array.isArray(value)
28
+ ? value.map(v => requirementLinkedNode(key, v))
29
+ : requirementLinkedNodeByKey[key](value)
30
+ : null;
31
+ const completenessCompleteSuffix = '_complete';
32
+ const completenessIncompleteSuffix = '_incomplete';
33
+ const parseLogCompleteness = (key) => [
34
+ key?.startsWith('term_type_'),
35
+ key?.endsWith(completenessCompleteSuffix) || key?.endsWith(completenessIncompleteSuffix)
36
+ ].every(Boolean)
37
+ ? {
38
+ key: key
39
+ .replace('term_type_', '')
40
+ .replace(completenessCompleteSuffix, '')
41
+ .replace(completenessIncompleteSuffix, ''),
42
+ value: key.endsWith(completenessCompleteSuffix)
43
+ }
44
+ : null;
45
+ export class NodeLogsModelsLogsComponent {
46
+ constructor() {
47
+ this.farClone = farClone;
48
+ this.logs = input.required();
49
+ this.logValueArray = logValueArray;
50
+ this.requirementLinkedNode = requirementLinkedNode;
51
+ this.requirementColor = requirementColor;
52
+ this.parseLogCompleteness = parseLogCompleteness;
53
+ this.requirements = computed(() => this.logs()?.requirements ?? {});
54
+ this.requirementKeys = computed(() => requirementKeys(this.requirements()));
55
+ }
56
+ toggleSort(sortBy, sorting) {
57
+ const sortOrder = sorting.sortOrder === 'asc' ? 'desc' : 'asc';
58
+ sorting.sortBy = sortBy;
59
+ sorting.sortOrder = sortOrder;
60
+ }
61
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NodeLogsModelsLogsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
62
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: NodeLogsModelsLogsComponent, isStandalone: true, selector: "he-node-logs-models-logs", inputs: { logs: { classPropertyName: "logs", publicName: "logs", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<div class=\"table-container\">\n <table class=\"table is-dark is-fullwidth\">\n <tbody>\n @if (requirements()) {\n @for (key of requirementKeys(); track key) {\n <ng-container *ngTemplateOutlet=\"logLine; context: { key, value: requirements()[key] }\" />\n }\n }\n\n @if (logs()?.logs) {\n @for (key of logs().logs | keyvalue; track key) {\n <ng-container *ngTemplateOutlet=\"logLine; context: key\" />\n }\n }\n </tbody>\n </table>\n</div>\n\n@if (logs()?.missingLookups?.length) {\n <div class=\"it-mt-2\">\n <p>Data missing (might be optional):</p>\n <div class=\"table-container data-table-container\">\n <table class=\"table is-dark is-fullwidth is-striped\">\n <thead>\n <tr>\n <th class=\"has-text-white\">\n <span>Filename</span>\n </th>\n <th class=\"has-text-white\">\n <span>Column Title</span>\n </th>\n <th class=\"has-text-white\">\n <span>Row (term.id)</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"has-text-white\">\n @for (data of logs().missingLookups; track dataIndex; let dataIndex = $index) {\n <tr>\n <td>{{ data.filename }}</td>\n <td>{{ data.column }}</td>\n <td>{{ data.termId }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n}\n\n<ng-template #sortColumn let-column=\"column\" let-sorting=\"sorting\">\n <a class=\"is-p-1 has-text-white\" (click)=\"toggleSort(column, sorting)\">\n @if (sorting.sortBy === column) {\n @if (sorting.sortOrder === 'asc') {\n <svg-icon name=\"sort-up\" />\n } @else {\n <svg-icon name=\"sort-down\" />\n }\n } @else {\n <svg-icon name=\"sort\" />\n }\n </a>\n</ng-template>\n\n<ng-template #logLineArray let-value=\"value\" let-sorting=\"sorting\">\n <table class=\"table is-dark is-bordered is-striped\">\n @if (value[0] | isObject) {\n <thead>\n <tr>\n @for (v of value[0] | keyvalue; track v.key) {\n <th class=\"has-text-white\">\n <div class=\"is-nowrap\">\n {{ v.key }}\n <ng-container *ngTemplateOutlet=\"sortColumn; context: { column: v.key, sorting }\" />\n </div>\n </th>\n }\n </tr>\n </thead>\n }\n <tbody>\n @for (v of value | sortBy: sorting.sortBy : sorting.sortOrder; track i; let i = $index) {\n <tr>\n @if (v | isObject) {\n @for (vv of v | keyvalue; track vv.value) {\n <td>{{ vv.value }}</td>\n }\n } @else {\n <td>{{ v }}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n</ng-template>\n\n<ng-template #logLineValue let-key=\"key\" let-value=\"value\">\n @if (requirementLinkedNode(key, value); as linkedNode) {\n <he-node-link\n class=\"is-inline-block is-align-middle\"\n linkClass=\"is-dark\"\n [node]=\"linkedNode\"\n [showExternalLink]=\"true\" />\n } @else {\n <span class=\"is-inline-block is-align-middle\">{{ value }}</span>\n }\n</ng-template>\n\n<ng-template #logLine let-key=\"key\" let-value=\"value\">\n <tr>\n <td class=\"has-border-right | copy-log\">\n <span class=\"is-inline-block is-align-middle\">\n @if (parseLogCompleteness(key); as completeness) {\n <span>Data completeness for</span>\n <code class=\"is-mx-1\">{{ completeness.key }}</code>\n <span>must be</span>\n <code class=\"is-mx-1\">{{ completeness.value }}</code>\n } @else {\n @switch (key) {\n @default {\n {{ key | keyToLabel }}\n }\n @case ('property_id') {\n Property Term &#64;id\n }\n @case ('product_id') {\n Product Term &#64;id\n }\n @case ('crop_product_id') {\n Crop Product Term &#64;id\n }\n @case ('input_id') {\n Input Term &#64;id\n }\n @case ('node_type_allowed') {\n <span>Is the current</span>\n <code class=\"is-mx-1\">Node</code>\n <span>allowed to run this model</span>\n }\n @case ('siteType_allowed') {\n <span>Is the current</span>\n <code class=\"is-mx-1\">siteType</code>\n <span>allowed to run this model</span>\n }\n @case ('product_id_allowed') {\n <span>Are any of the Product</span>\n <code class=\"is-mx-1\">&#64;id</code>\n <span>allowed to run this model</span>\n }\n @case ('product_termType_allowed') {\n <span>Are any of the Product</span>\n <code class=\"is-mx-1\">termType</code>\n <span>allowed to run this model</span>\n }\n @case ('input_id_allowed') {\n <span>Are any of the Input</span>\n <code class=\"is-mx-1\">&#64;id</code>\n <span>allowed to run this model</span>\n }\n @case ('input_termType_allowed') {\n <span>Are any of the Input</span>\n <code class=\"is-mx-1\">termType</code>\n <span>allowed to run this model</span>\n }\n <!-- Deprecated -->\n @case ('primary_product_id_allowed') {\n <span>Is the current primary product</span>\n <code class=\"is-mx-1\">&#64;id</code>\n <span>allowed to run this model</span>\n }\n @case ('primary_product_termType_allowed') {\n <span>Is the current primary product</span>\n <code class=\"is-mx-1\">termType</code>\n <span>allowed to run this model</span>\n }\n @case ('geospatial_data') {\n Has geospatial data necessary to run this model\n }\n @case ('contains_geospatial_data') {\n Has geospatial data necessary to run this model\n }\n @case ('current_size') {\n Current polygon area\n }\n @case ('max_area_size') {\n Maximum polygon area to run this model\n }\n @case ('below_max_area_size') {\n Polygon below the maximum area\n }\n @case ('region_factor') {\n Factor from region lookup\n }\n @case ('has_pesticides_inputs') {\n <span>Cycle contains</span>\n <code class=\"is-mx-1\">pesticideAI</code>\n <span>Inputs</span>\n }\n @case ('all_pesticideAI_have_lookup_value') {\n <span>All</span>\n <code class=\"is-mx-1\">pesticideAI</code>\n <span>Inputs have a lookup value</span>\n }\n @case ('has_crop_residue_burnt') {\n <code class=\"is-mr-1\">aboveGroundCropResidueBurnt</code>\n <span>is present as Product</span>\n }\n @case ('liquid_slurry_sludge_P') {\n Liquid, Slurry, and Sludge P\n }\n @case ('no_cycle_inputs_feed') {\n <span>\n Cycle has\n <b>no</b>\n Input with\n </span>\n <code>isAnimalFeed=true</code>\n }\n @case ('has_cycle_inputs_feed') {\n <span>\n Cycle has\n <b>some</b>\n Input with\n </span>\n <code>isAnimalFeed=true</code>\n }\n }\n }\n </span>\n <he-clipboard\n class=\"is-inline-block is-align-middle\"\n clipboardClass=\"is-size-7 is-p-1\"\n [icon]=\"farClone\"\n [value]=\"key\"\n [hideText]=\"true\" />\n </td>\n <td>\n @if (logValueArray(value); as valueArray) {\n <ng-container *ngTemplateOutlet=\"logLineArray; context: { value: valueArray, sorting: {} }\" />\n } @else {\n <ng-container *ngTemplateOutlet=\"logLineValue; context: { key, value }\" />\n }\n </td>\n </tr>\n</ng-template>\n", styles: [".copy-log he-clipboard{visibility:hidden}.copy-log:hover he-clipboard{visibility:visible}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }, { kind: "component", type: SvgIconComponent, selector: "svg-icon", inputs: ["src", "name", "stretch", "applyClass", "svgClass", "class", "viewBox", "svgAriaLabel", "svgStyle"] }, { kind: "component", type: NodeLinkComponent, selector: "he-node-link", inputs: ["node", "showExternalLink", "linkClass"] }, { kind: "component", type: ClipboardComponent, selector: "he-clipboard", inputs: ["icon", "value", "disabled", "hideText", "size", "rotate", "clipboardClass"] }, { kind: "pipe", type: KeyToLabelPipe, name: "keyToLabel" }, { kind: "pipe", type: IsObjectPipe, name: "isObject" }, { kind: "pipe", type: SortByPipe, name: "sortBy" }] }); }
63
+ }
64
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NodeLogsModelsLogsComponent, decorators: [{
65
+ type: Component,
66
+ args: [{ selector: 'he-node-logs-models-logs', standalone: true, imports: [
67
+ NgTemplateOutlet,
68
+ KeyValuePipe,
69
+ FaIconComponent,
70
+ SvgIconComponent,
71
+ NodeLinkComponent,
72
+ ClipboardComponent,
73
+ KeyToLabelPipe,
74
+ IsArrayPipe,
75
+ IsObjectPipe,
76
+ SortByPipe
77
+ ], template: "<div class=\"table-container\">\n <table class=\"table is-dark is-fullwidth\">\n <tbody>\n @if (requirements()) {\n @for (key of requirementKeys(); track key) {\n <ng-container *ngTemplateOutlet=\"logLine; context: { key, value: requirements()[key] }\" />\n }\n }\n\n @if (logs()?.logs) {\n @for (key of logs().logs | keyvalue; track key) {\n <ng-container *ngTemplateOutlet=\"logLine; context: key\" />\n }\n }\n </tbody>\n </table>\n</div>\n\n@if (logs()?.missingLookups?.length) {\n <div class=\"it-mt-2\">\n <p>Data missing (might be optional):</p>\n <div class=\"table-container data-table-container\">\n <table class=\"table is-dark is-fullwidth is-striped\">\n <thead>\n <tr>\n <th class=\"has-text-white\">\n <span>Filename</span>\n </th>\n <th class=\"has-text-white\">\n <span>Column Title</span>\n </th>\n <th class=\"has-text-white\">\n <span>Row (term.id)</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"has-text-white\">\n @for (data of logs().missingLookups; track dataIndex; let dataIndex = $index) {\n <tr>\n <td>{{ data.filename }}</td>\n <td>{{ data.column }}</td>\n <td>{{ data.termId }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n}\n\n<ng-template #sortColumn let-column=\"column\" let-sorting=\"sorting\">\n <a class=\"is-p-1 has-text-white\" (click)=\"toggleSort(column, sorting)\">\n @if (sorting.sortBy === column) {\n @if (sorting.sortOrder === 'asc') {\n <svg-icon name=\"sort-up\" />\n } @else {\n <svg-icon name=\"sort-down\" />\n }\n } @else {\n <svg-icon name=\"sort\" />\n }\n </a>\n</ng-template>\n\n<ng-template #logLineArray let-value=\"value\" let-sorting=\"sorting\">\n <table class=\"table is-dark is-bordered is-striped\">\n @if (value[0] | isObject) {\n <thead>\n <tr>\n @for (v of value[0] | keyvalue; track v.key) {\n <th class=\"has-text-white\">\n <div class=\"is-nowrap\">\n {{ v.key }}\n <ng-container *ngTemplateOutlet=\"sortColumn; context: { column: v.key, sorting }\" />\n </div>\n </th>\n }\n </tr>\n </thead>\n }\n <tbody>\n @for (v of value | sortBy: sorting.sortBy : sorting.sortOrder; track i; let i = $index) {\n <tr>\n @if (v | isObject) {\n @for (vv of v | keyvalue; track vv.value) {\n <td>{{ vv.value }}</td>\n }\n } @else {\n <td>{{ v }}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n</ng-template>\n\n<ng-template #logLineValue let-key=\"key\" let-value=\"value\">\n @if (requirementLinkedNode(key, value); as linkedNode) {\n <he-node-link\n class=\"is-inline-block is-align-middle\"\n linkClass=\"is-dark\"\n [node]=\"linkedNode\"\n [showExternalLink]=\"true\" />\n } @else {\n <span class=\"is-inline-block is-align-middle\">{{ value }}</span>\n }\n</ng-template>\n\n<ng-template #logLine let-key=\"key\" let-value=\"value\">\n <tr>\n <td class=\"has-border-right | copy-log\">\n <span class=\"is-inline-block is-align-middle\">\n @if (parseLogCompleteness(key); as completeness) {\n <span>Data completeness for</span>\n <code class=\"is-mx-1\">{{ completeness.key }}</code>\n <span>must be</span>\n <code class=\"is-mx-1\">{{ completeness.value }}</code>\n } @else {\n @switch (key) {\n @default {\n {{ key | keyToLabel }}\n }\n @case ('property_id') {\n Property Term &#64;id\n }\n @case ('product_id') {\n Product Term &#64;id\n }\n @case ('crop_product_id') {\n Crop Product Term &#64;id\n }\n @case ('input_id') {\n Input Term &#64;id\n }\n @case ('node_type_allowed') {\n <span>Is the current</span>\n <code class=\"is-mx-1\">Node</code>\n <span>allowed to run this model</span>\n }\n @case ('siteType_allowed') {\n <span>Is the current</span>\n <code class=\"is-mx-1\">siteType</code>\n <span>allowed to run this model</span>\n }\n @case ('product_id_allowed') {\n <span>Are any of the Product</span>\n <code class=\"is-mx-1\">&#64;id</code>\n <span>allowed to run this model</span>\n }\n @case ('product_termType_allowed') {\n <span>Are any of the Product</span>\n <code class=\"is-mx-1\">termType</code>\n <span>allowed to run this model</span>\n }\n @case ('input_id_allowed') {\n <span>Are any of the Input</span>\n <code class=\"is-mx-1\">&#64;id</code>\n <span>allowed to run this model</span>\n }\n @case ('input_termType_allowed') {\n <span>Are any of the Input</span>\n <code class=\"is-mx-1\">termType</code>\n <span>allowed to run this model</span>\n }\n <!-- Deprecated -->\n @case ('primary_product_id_allowed') {\n <span>Is the current primary product</span>\n <code class=\"is-mx-1\">&#64;id</code>\n <span>allowed to run this model</span>\n }\n @case ('primary_product_termType_allowed') {\n <span>Is the current primary product</span>\n <code class=\"is-mx-1\">termType</code>\n <span>allowed to run this model</span>\n }\n @case ('geospatial_data') {\n Has geospatial data necessary to run this model\n }\n @case ('contains_geospatial_data') {\n Has geospatial data necessary to run this model\n }\n @case ('current_size') {\n Current polygon area\n }\n @case ('max_area_size') {\n Maximum polygon area to run this model\n }\n @case ('below_max_area_size') {\n Polygon below the maximum area\n }\n @case ('region_factor') {\n Factor from region lookup\n }\n @case ('has_pesticides_inputs') {\n <span>Cycle contains</span>\n <code class=\"is-mx-1\">pesticideAI</code>\n <span>Inputs</span>\n }\n @case ('all_pesticideAI_have_lookup_value') {\n <span>All</span>\n <code class=\"is-mx-1\">pesticideAI</code>\n <span>Inputs have a lookup value</span>\n }\n @case ('has_crop_residue_burnt') {\n <code class=\"is-mr-1\">aboveGroundCropResidueBurnt</code>\n <span>is present as Product</span>\n }\n @case ('liquid_slurry_sludge_P') {\n Liquid, Slurry, and Sludge P\n }\n @case ('no_cycle_inputs_feed') {\n <span>\n Cycle has\n <b>no</b>\n Input with\n </span>\n <code>isAnimalFeed=true</code>\n }\n @case ('has_cycle_inputs_feed') {\n <span>\n Cycle has\n <b>some</b>\n Input with\n </span>\n <code>isAnimalFeed=true</code>\n }\n }\n }\n </span>\n <he-clipboard\n class=\"is-inline-block is-align-middle\"\n clipboardClass=\"is-size-7 is-p-1\"\n [icon]=\"farClone\"\n [value]=\"key\"\n [hideText]=\"true\" />\n </td>\n <td>\n @if (logValueArray(value); as valueArray) {\n <ng-container *ngTemplateOutlet=\"logLineArray; context: { value: valueArray, sorting: {} }\" />\n } @else {\n <ng-container *ngTemplateOutlet=\"logLineValue; context: { key, value }\" />\n }\n </td>\n </tr>\n</ng-template>\n", styles: [".copy-log he-clipboard{visibility:hidden}.copy-log:hover he-clipboard{visibility:visible}\n"] }]
78
+ }] });
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1sb2dzLW1vZGVscy1sb2dzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9ub2RlL25vZGUtbG9ncy1tb2RlbHMvbm9kZS1sb2dzLW1vZGVscy1sb2dzL25vZGUtbG9ncy1tb2RlbHMtbG9ncy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbm9kZS9ub2RlLWxvZ3MtbW9kZWxzL25vZGUtbG9ncy1tb2RlbHMtbG9ncy9ub2RlLWxvZ3MtbW9kZWxzLWxvZ3MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQVUsUUFBUSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxPQUFPLElBQUksUUFBUSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDMUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFHcEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3hFLE9BQU8sRUFBZ0IsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7O0FBRXhFLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxLQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FB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VSxDQUFDLE1BQWMsRUFBRSxPQUFpQjtRQUNwRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDL0QsT0FBTyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDeEIsT0FBTyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDaEMsQ0FBQzsrR0FqQlUsMkJBQTJCO21HQUEzQiwyQkFBMkIsb05DaEZ4Qyw0c1FBcVBBLHFKRG5MSSxnQkFBZ0IsK0lBQ2hCLFlBQVksaURBRVosZ0JBQWdCLG1LQUNoQixpQkFBaUIsNEdBQ2pCLGtCQUFrQiwySUFDbEIsY0FBYyw4Q0FFZCxZQUFZLDRDQUNaLFVBQVU7OzRGQUtELDJCQUEyQjtrQkFsQnZDLFNBQVM7K0JBQ0UsMEJBQTBCLGNBQ3hCLElBQUksV0FDUDt3QkFDUCxnQkFBZ0I7d0JBQ2hCLFlBQVk7d0JBQ1osZUFBZTt3QkFDZixnQkFBZ0I7d0JBQ2hCLGlCQUFpQjt3QkFDakIsa0JBQWtCO3dCQUNsQixjQUFjO3dCQUNkLFdBQVc7d0JBQ1gsWUFBWTt3QkFDWixVQUFVO3FCQUNYIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgS2V5VmFsdWVQaXBlLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgY29tcHV0ZWQsIGlucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBKU09OTEQsIE5vZGVUeXBlIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9zY2hlbWEnO1xuaW1wb3J0IHsgRmFJY29uQ29tcG9uZW50IH0gZnJvbSAnQGZvcnRhd2Vzb21lL2FuZ3VsYXItZm9udGF3ZXNvbWUnO1xuaW1wb3J0IHsgZmFDbG9uZSBhcyBmYXJDbG9uZSB9IGZyb20gJ0Bmb3J0YXdlc29tZS9mcmVlLXJlZ3VsYXItc3ZnLWljb25zJztcbmltcG9ydCB7IFN2Z0ljb25Db21wb25lbnQgfSBmcm9tICdhbmd1bGFyLXN2Zy1pY29uJztcbmltcG9ydCBvcmRlckJ5IGZyb20gJ2xvZGFzaC5vcmRlcmJ5JztcblxuaW1wb3J0IHsgQ2xpcGJvYXJkQ29tcG9uZW50LCBLZXlUb0xhYmVsUGlwZSwgSXNBcnJheVBpcGUsIElzT2JqZWN0UGlwZSwgU29ydEJ5UGlwZSB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbic7XG5pbXBvcnQgeyBOb2RlTGlua0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL25vZGUtbGluay9ub2RlLWxpbmsuY29tcG9uZW50JztcbmltcG9ydCB7IElOb2RlVGVybUxvZywgbG9nVmFsdWVBcnJheSB9IGZyb20gJy4uL25vZGUtbG9ncy1tb2RlbHMubW9kZWwnO1xuXG5jb25zdCByZXF1aXJlbWVudENvbG9yID0gKHZhbHVlOiBhbnkpID0+ICghdmFsdWUgfHwgWydOb25lJywgJ0ZhbHNlJywgJzAnLCAnMC4wJ10uaW5jbHVkZXModmFsdWUpID8gJ2RhbmdlcicgOiAnd2hpdGUnKTtcblxuY29uc3Qgbm9kZVR5cGVzTG93ZXJDYXNlID0gT2JqZWN0LnZhbHVlcyhOb2RlVHlwZSkubWFwKHYgPT4gdi50b0xvd2VyQ2FzZSgpKTtcblxuY29uc3QgcmVxdWlyZW1lbnRLZXlzID0gKHJlcXVpcmVtZW50czogeyBba2V5OiBzdHJpbmddOiBhbnkgfSkgPT5cbiAgT2JqZWN0LmtleXMocmVxdWlyZW1lbnRzKS5maWx0ZXIoayA9PiAhbm9kZVR5cGVzTG93ZXJDYXNlLmluY2x1ZGVzKGspICYmICFbJ21vZGVsX2tleSddLmluY2x1ZGVzKGspKTtcblxuY29uc3QgcmVxdWlyZW1lbnRMaW5rZWROb2RlQnlLZXk6IHtcbiAgW2tleTogc3RyaW5nXTogKHZhbHVlOiBzdHJpbmcpID0+IFBhcnRpYWw8SlNPTkxEPE5vZGVUeXBlPj47XG59ID0ge1xuICByZWxhdGVkX2N5Y2xlczogdiA9PiAoeyAnQHR5cGUnOiBOb2RlVHlwZS5DeWNsZSwgJ0BpZCc6IHYgfSksXG4gIGN5Y2xlX2lkOiB2ID0+ICh7ICdAdHlwZSc6IE5vZGVUeXBlLkN5Y2xlLCAnQGlkJzogdiB9KSxcbiAgaW1wYWN0X2Fzc2Vzc21lbnRfaWQ6IHYgPT4gKHsgJ0B0eXBlJzogTm9kZVR5cGUuSW1wYWN0QXNzZXNzbWVudCwgJ0BpZCc6IHYgfSksXG4gIHNpdGVfaWQ6IHYgPT4gKHsgJ0B0eXBlJzogTm9kZVR5cGUuU2l0ZSwgJ0BpZCc6IHYgfSksXG4gIHNvdXJjZV9pZDogdiA9PiAoeyAnQHR5cGUnOiBOb2RlVHlwZS5Tb3VyY2UsICdAaWQnOiB2IH0pLFxuICBwcm9wZXJ0eV9pZDogdiA9PiAoeyAnQHR5cGUnOiBOb2RlVHlwZS5UZXJtLCAnQGlkJzogdiB9KSxcbiAgaW5wdXRfaWQ6IHYgPT4gKHsgJ0B0eXBlJzogTm9kZVR5cGUuVGVybSwgJ0BpZCc6IHYgfSksXG4gIHByb2R1Y3RfaWQ6IHYgPT4gKHsgJ0B0eXBlJzogTm9kZVR5cGUuVGVybSwgJ0BpZCc6IHYgfSksXG4gIHByYWN0aWNlX2lkOiB2ID0+ICh7ICdAdHlwZSc6IE5vZGVUeXBlLlRlcm0sICdAaWQnOiB2IH0pLFxuICBjcm9wX3Byb2R1Y3RfaWQ6IHYgPT4gKHsgJ0B0eXBlJzogTm9kZVR5cGUuVGVybSwgJ0BpZCc6IHYgfSlcbn07XG5cbmNvbnN0IHJlcXVpcmVtZW50TGlua2VkTm9kZSA9IChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT5cbiAga2V5IGluIHJlcXVpcmVtZW50TGlua2VkTm9kZUJ5S2V5ICYmICFbJ05vbmUnLCAnJywgbnVsbF0uaW5jbHVkZXModmFsdWUpXG4gICAgPyBBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgPyB2YWx1ZS5tYXAodiA9PiByZXF1aXJlbWVudExpbmtlZE5vZGUoa2V5LCB2KSlcbiAgICAgIDogcmVxdWlyZW1lbnRMaW5rZWROb2RlQnlLZXlba2V5XSh2YWx1ZSlcbiAgICA6IG51bGw7XG5cbmNvbnN0IGNvbXBsZXRlbmVzc0NvbXBsZXRlU3VmZml4ID0gJ19jb21wbGV0ZSc7XG5jb25zdCBjb21wbGV0ZW5lc3NJbmNvbXBsZXRlU3VmZml4ID0gJ19pbmNvbXBsZXRlJztcbmNvbnN0IHBhcnNlTG9nQ29tcGxldGVuZXNzID0gKGtleT86IHN0cmluZykgPT5cbiAgW1xuICAgIGtleT8uc3RhcnRzV2l0aCgndGVybV90eXBlXycpLFxuICAgIGtleT8uZW5kc1dpdGgoY29tcGxldGVuZXNzQ29tcGxldGVTdWZmaXgpIHx8IGtleT8uZW5kc1dpdGgoY29tcGxldGVuZXNzSW5jb21wbGV0ZVN1ZmZpeClcbiAgXS5ldmVyeShCb29sZWFuKVxuICAgID8ge1xuICAgICAgICBrZXk6IGtleVxuICAgICAgICAgIC5yZXBsYWNlKCd0ZXJtX3R5cGVfJywgJycpXG4gICAgICAgICAgLnJlcGxhY2UoY29tcGxldGVuZXNzQ29tcGxldGVTdWZmaXgsICcnKVxuICAgICAgICAgIC5yZXBsYWNlKGNvbXBsZXRlbmVzc0luY29tcGxldGVTdWZmaXgsICcnKSxcbiAgICAgICAgdmFsdWU6IGtleS5lbmRzV2l0aChjb21wbGV0ZW5lc3NDb21wbGV0ZVN1ZmZpeClcbiAgICAgIH1cbiAgICA6IG51bGw7XG5cbmludGVyZmFjZSBJU29ydGluZyB7XG4gIHNvcnRCeTogc3RyaW5nO1xuICBzb3J0T3JkZXI6ICdhc2MnIHwgJ2Rlc2MnO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdoZS1ub2RlLWxvZ3MtbW9kZWxzLWxvZ3MnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBLZXlWYWx1ZVBpcGUsXG4gICAgRmFJY29uQ29tcG9uZW50LFxuICAgIFN2Z0ljb25Db21wb25lbnQsXG4gICAgTm9kZUxpbmtDb21wb25lbnQsXG4gICAgQ2xpcGJvYXJkQ29tcG9uZW50LFxuICAgIEtleVRvTGFiZWxQaXBlLFxuICAgIElzQXJyYXlQaXBlLFxuICAgIElzT2JqZWN0UGlwZSxcbiAgICBTb3J0QnlQaXBlXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9ub2RlLWxvZ3MtbW9kZWxzLWxvZ3MuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vbm9kZS1sb2dzLW1vZGVscy1sb2dzLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBOb2RlTG9nc01vZGVsc0xvZ3NDb21wb25lbnQge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmFyQ2xvbmUgPSBmYXJDbG9uZTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbG9ncyA9IGlucHV0LnJlcXVpcmVkPElOb2RlVGVybUxvZz4oKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbG9nVmFsdWVBcnJheSA9IGxvZ1ZhbHVlQXJyYXk7XG4gIHByb3RlY3RlZCByZWFkb25seSByZXF1aXJlbWVudExpbmtlZE5vZGUgPSByZXF1aXJlbWVudExpbmtlZE5vZGU7XG4gIHByb3RlY3RlZCByZWFkb25seSByZXF1aXJlbWVudENvbG9yID0gcmVxdWlyZW1lbnRDb2xvcjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBhcnNlTG9nQ29tcGxldGVuZXNzID0gcGFyc2VMb2dDb21wbGV0ZW5lc3M7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlcXVpcmVtZW50cyA9IGNvbXB1dGVkKCgpID0+IHRoaXMubG9ncygpPy5yZXF1aXJlbWVudHMgPz8ge30pO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVxdWlyZW1lbnRLZXlzID0gY29tcHV0ZWQoKCkgPT4gcmVxdWlyZW1lbnRLZXlzKHRoaXMucmVxdWlyZW1lbnRzKCkpKTtcblxuICBwcm90ZWN0ZWQgdG9nZ2xlU29ydChzb3J0Qnk6IHN0cmluZywgc29ydGluZzogSVNvcnRpbmcpIHtcbiAgICBjb25zdCBzb3J0T3JkZXIgPSBzb3J0aW5nLnNvcnRPcmRlciA9PT0gJ2FzYycgPyAnZGVzYycgOiAnYXNjJztcbiAgICBzb3J0aW5nLnNvcnRCeSA9IHNvcnRCeTtcbiAgICBzb3J0aW5nLnNvcnRPcmRlciA9IHNvcnRPcmRlcjtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInRhYmxlLWNvbnRhaW5lclwiPlxuICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBpcy1kYXJrIGlzLWZ1bGx3aWR0aFwiPlxuICAgIDx0Ym9keT5cbiAgICAgIEBpZiAocmVxdWlyZW1lbnRzKCkpIHtcbiAgICAgICAgQGZvciAoa2V5IG9mIHJlcXVpcmVtZW50S2V5cygpOyB0cmFjayBrZXkpIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9nTGluZTsgY29udGV4dDogeyBrZXksIHZhbHVlOiByZXF1aXJlbWVudHMoKVtrZXldIH1cIiAvPlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIEBpZiAobG9ncygpPy5sb2dzKSB7XG4gICAgICAgIEBmb3IgKGtleSBvZiBsb2dzKCkubG9ncyB8IGtleXZhbHVlOyB0cmFjayBrZXkpIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9nTGluZTsgY29udGV4dDoga2V5XCIgLz5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvdGJvZHk+XG4gIDwvdGFibGU+XG48L2Rpdj5cblxuQGlmIChsb2dzKCk/Lm1pc3NpbmdMb29rdXBzPy5sZW5ndGgpIHtcbiAgPGRpdiBjbGFzcz1cIml0LW10LTJcIj5cbiAgICA8cD5EYXRhIG1pc3NpbmcgKG1pZ2h0IGJlIG9wdGlvbmFsKTo8L3A+XG4gICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbnRhaW5lciBkYXRhLXRhYmxlLWNvbnRhaW5lclwiPlxuICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgaXMtZGFyayBpcy1mdWxsd2lkdGggaXMtc3RyaXBlZFwiPlxuICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRoIGNsYXNzPVwiaGFzLXRleHQtd2hpdGVcIj5cbiAgICAgICAgICAgICAgPHNwYW4+RmlsZW5hbWU8L3NwYW4+XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgPHRoIGNsYXNzPVwiaGFzLXRleHQtd2hpdGVcIj5cbiAgICAgICAgICAgICAgPHNwYW4+Q29sdW1uIFRpdGxlPC9zcGFuPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImhhcy10ZXh0LXdoaXRlXCI+XG4gICAgICAgICAgICAgIDxzcGFuPlJvdyAodGVybS5pZCk8L3NwYW4+XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGhlYWQ+XG4gICAgICAgIDx0Ym9keSBjbGFzcz1cImhhcy10ZXh0LXdoaXRlXCI+XG4gICAgICAgICAgQGZvciAoZGF0YSBvZiBsb2dzKCkubWlzc2luZ0xvb2t1cHM7IHRyYWNrIGRhdGFJbmRleDsgbGV0IGRhdGFJbmRleCA9ICRpbmRleCkge1xuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGQ+e3sgZGF0YS5maWxlbmFtZSB9fTwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD57eyBkYXRhLmNvbHVtbiB9fTwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD57eyBkYXRhLnRlcm1JZCB9fTwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIH1cbiAgICAgICAgPC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxufVxuXG48bmctdGVtcGxhdGUgI3NvcnRDb2x1bW4gbGV0LWNvbHVtbj1cImNvbHVtblwiIGxldC1zb3J0aW5nPVwic29ydGluZ1wiPlxuICA8YSBjbGFzcz1cImlzLXAtMSBoYXMtdGV4dC13aGl0ZVwiIChjbGljayk9XCJ0b2dnbGVTb3J0KGNvbHVtbiwgc29ydGluZylcIj5cbiAgICBAaWYgKHNvcnRpbmcuc29ydEJ5ID09PSBjb2x1bW4pIHtcbiAgICAgIEBpZiAoc29ydGluZy5zb3J0T3JkZXIgPT09ICdhc2MnKSB7XG4gICAgICAgIDxzdmctaWNvbiBuYW1lPVwic29ydC11cFwiIC8+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPHN2Zy1pY29uIG5hbWU9XCJzb3J0LWRvd25cIiAvPlxuICAgICAgfVxuICAgIH0gQGVsc2Uge1xuICAgICAgPHN2Zy1pY29uIG5hbWU9XCJzb3J0XCIgLz5cbiAgICB9XG4gIDwvYT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbG9nTGluZUFycmF5IGxldC12YWx1ZT1cInZhbHVlXCIgbGV0LXNvcnRpbmc9XCJzb3J0aW5nXCI+XG4gIDx0YWJsZSBjbGFzcz1cInRhYmxlIGlzLWRhcmsgaXMtYm9yZGVyZWQgaXMtc3RyaXBlZFwiPlxuICAgIEBpZiAodmFsdWVbMF0gfCBpc09iamVjdCkge1xuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgQGZvciAodiBvZiB2YWx1ZVswXSB8IGtleXZhbHVlOyB0cmFjayB2LmtleSkge1xuICAgICAgICAgICAgPHRoIGNsYXNzPVwiaGFzLXRleHQtd2hpdGVcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlzLW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgIHt7IHYua2V5IH19XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNvcnRDb2x1bW47IGNvbnRleHQ6IHsgY29sdW1uOiB2LmtleSwgc29ydGluZyB9XCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgIH1cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG4gICAgfVxuICAgIDx0Ym9keT5cbiAgICAgIEBmb3IgKHYgb2YgdmFsdWUgfCBzb3J0Qnk6IHNvcnRpbmcuc29ydEJ5IDogc29ydGluZy5zb3J0T3JkZXI7IHRyYWNrIGk7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgIDx0cj5cbiAgICAgICAgICBAaWYgKHYgfCBpc09iamVjdCkge1xuICAgICAgICAgICAgQGZvciAodnYgb2YgdiB8IGtleXZhbHVlOyB0cmFjayB2di52YWx1ZSkge1xuICAgICAgICAgICAgICA8dGQ+e3sgdnYudmFsdWUgfX08L3RkPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPHRkPnt7IHYgfX08L3RkPlxuICAgICAgICAgIH1cbiAgICAgICAgPC90cj5cbiAgICAgIH1cbiAgICA8L3Rib2R5PlxuICA8L3RhYmxlPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsb2dMaW5lVmFsdWUgbGV0LWtleT1cImtleVwiIGxldC12YWx1ZT1cInZhbHVlXCI+XG4gIEBpZiAocmVxdWlyZW1lbnRMaW5rZWROb2RlKGtleSwgdmFsdWUpOyBhcyBsaW5rZWROb2RlKSB7XG4gICAgPGhlLW5vZGUtbGlua1xuICAgICAgY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtYWxpZ24tbWlkZGxlXCJcbiAgICAgIGxpbmtDbGFzcz1cImlzLWRhcmtcIlxuICAgICAgW25vZGVdPVwibGlua2VkTm9kZVwiXG4gICAgICBbc2hvd0V4dGVybmFsTGlua109XCJ0cnVlXCIgLz5cbiAgfSBAZWxzZSB7XG4gICAgPHNwYW4gY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtYWxpZ24tbWlkZGxlXCI+e3sgdmFsdWUgfX08L3NwYW4+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbG9nTGluZSBsZXQta2V5PVwia2V5XCIgbGV0LXZhbHVlPVwidmFsdWVcIj5cbiAgPHRyPlxuICAgIDx0ZCBjbGFzcz1cImhhcy1ib3JkZXItcmlnaHQgfCBjb3B5LWxvZ1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtYWxpZ24tbWlkZGxlXCI+XG4gICAgICAgIEBpZiAocGFyc2VMb2dDb21wbGV0ZW5lc3Moa2V5KTsgYXMgY29tcGxldGVuZXNzKSB7XG4gICAgICAgICAgPHNwYW4+RGF0YSBjb21wbGV0ZW5lc3MgZm9yPC9zcGFuPlxuICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPnt7IGNvbXBsZXRlbmVzcy5rZXkgfX08L2NvZGU+XG4gICAgICAgICAgPHNwYW4+bXVzdCBiZTwvc3Bhbj5cbiAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW14LTFcIj57eyBjb21wbGV0ZW5lc3MudmFsdWUgfX08L2NvZGU+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIEBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgQGRlZmF1bHQge1xuICAgICAgICAgICAgICB7eyBrZXkgfCBrZXlUb0xhYmVsIH19XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ3Byb3BlcnR5X2lkJykge1xuICAgICAgICAgICAgICBQcm9wZXJ0eSBUZXJtICYjNjQ7aWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgncHJvZHVjdF9pZCcpIHtcbiAgICAgICAgICAgICAgUHJvZHVjdCBUZXJtICYjNjQ7aWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgnY3JvcF9wcm9kdWN0X2lkJykge1xuICAgICAgICAgICAgICBDcm9wIFByb2R1Y3QgVGVybSAmIzY0O2lkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ2lucHV0X2lkJykge1xuICAgICAgICAgICAgICBJbnB1dCBUZXJtICYjNjQ7aWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgnbm9kZV90eXBlX2FsbG93ZWQnKSB7XG4gICAgICAgICAgICAgIDxzcGFuPklzIHRoZSBjdXJyZW50PC9zcGFuPlxuICAgICAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW14LTFcIj5Ob2RlPC9jb2RlPlxuICAgICAgICAgICAgICA8c3Bhbj5hbGxvd2VkIHRvIHJ1biB0aGlzIG1vZGVsPC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdzaXRlVHlwZV9hbGxvd2VkJykge1xuICAgICAgICAgICAgICA8c3Bhbj5JcyB0aGUgY3VycmVudDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+c2l0ZVR5cGU8L2NvZGU+XG4gICAgICAgICAgICAgIDxzcGFuPmFsbG93ZWQgdG8gcnVuIHRoaXMgbW9kZWw8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ3Byb2R1Y3RfaWRfYWxsb3dlZCcpIHtcbiAgICAgICAgICAgICAgPHNwYW4+QXJlIGFueSBvZiB0aGUgUHJvZHVjdDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+JiM2NDtpZDwvY29kZT5cbiAgICAgICAgICAgICAgPHNwYW4+YWxsb3dlZCB0byBydW4gdGhpcyBtb2RlbDwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgncHJvZHVjdF90ZXJtVHlwZV9hbGxvd2VkJykge1xuICAgICAgICAgICAgICA8c3Bhbj5BcmUgYW55IG9mIHRoZSBQcm9kdWN0PC9zcGFuPlxuICAgICAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW14LTFcIj50ZXJtVHlwZTwvY29kZT5cbiAgICAgICAgICAgICAgPHNwYW4+YWxsb3dlZCB0byBydW4gdGhpcyBtb2RlbDwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgnaW5wdXRfaWRfYWxsb3dlZCcpIHtcbiAgICAgICAgICAgICAgPHNwYW4+QXJlIGFueSBvZiB0aGUgSW5wdXQ8L3NwYW4+XG4gICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPiYjNjQ7aWQ8L2NvZGU+XG4gICAgICAgICAgICAgIDxzcGFuPmFsbG93ZWQgdG8gcnVuIHRoaXMgbW9kZWw8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ2lucHV0X3Rlcm1UeXBlX2FsbG93ZWQnKSB7XG4gICAgICAgICAgICAgIDxzcGFuPkFyZSBhbnkgb2YgdGhlIElucHV0PC9zcGFuPlxuICAgICAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW14LTFcIj50ZXJtVHlwZTwvY29kZT5cbiAgICAgICAgICAgICAgPHNwYW4+YWxsb3dlZCB0byBydW4gdGhpcyBtb2RlbDwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwhLS0gRGVwcmVjYXRlZCAtLT5cbiAgICAgICAgICAgIEBjYXNlICgncHJpbWFyeV9wcm9kdWN0X2lkX2FsbG93ZWQnKSB7XG4gICAgICAgICAgICAgIDxzcGFuPklzIHRoZSBjdXJyZW50IHByaW1hcnkgcHJvZHVjdDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+JiM2NDtpZDwvY29kZT5cbiAgICAgICAgICAgICAgPHNwYW4+YWxsb3dlZCB0byBydW4gdGhpcyBtb2RlbDwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgncHJpbWFyeV9wcm9kdWN0X3Rlcm1UeXBlX2FsbG93ZWQnKSB7XG4gICAgICAgICAgICAgIDxzcGFuPklzIHRoZSBjdXJyZW50IHByaW1hcnkgcHJvZHVjdDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+dGVybVR5cGU8L2NvZGU+XG4gICAgICAgICAgICAgIDxzcGFuPmFsbG93ZWQgdG8gcnVuIHRoaXMgbW9kZWw8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ2dlb3NwYXRpYWxfZGF0YScpIHtcbiAgICAgICAgICAgICAgSGFzIGdlb3NwYXRpYWwgZGF0YSBuZWNlc3NhcnkgdG8gcnVuIHRoaXMgbW9kZWxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgnY29udGFpbnNfZ2Vvc3BhdGlhbF9kYXRhJykge1xuICAgICAgICAgICAgICBIYXMgZ2Vvc3BhdGlhbCBkYXRhIG5lY2Vzc2FyeSB0byBydW4gdGhpcyBtb2RlbFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdjdXJyZW50X3NpemUnKSB7XG4gICAgICAgICAgICAgIEN1cnJlbnQgcG9seWdvbiBhcmVhXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ21heF9hcmVhX3NpemUnKSB7XG4gICAgICAgICAgICAgIE1heGltdW0gcG9seWdvbiBhcmVhIHRvIHJ1biB0aGlzIG1vZGVsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ2JlbG93X21heF9hcmVhX3NpemUnKSB7XG4gICAgICAgICAgICAgIFBvbHlnb24gYmVsb3cgdGhlIG1heGltdW0gYXJlYVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdyZWdpb25fZmFjdG9yJykge1xuICAgICAgICAgICAgICBGYWN0b3IgZnJvbSByZWdpb24gbG9va3VwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ2hhc19wZXN0aWNpZGVzX2lucHV0cycpIHtcbiAgICAgICAgICAgICAgPHNwYW4+Q3ljbGUgY29udGFpbnM8L3NwYW4+XG4gICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPnBlc3RpY2lkZUFJPC9jb2RlPlxuICAgICAgICAgICAgICA8c3Bhbj5JbnB1dHM8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ2FsbF9wZXN0aWNpZGVBSV9oYXZlX2xvb2t1cF92YWx1ZScpIHtcbiAgICAgICAgICAgICAgPHNwYW4+QWxsPC9zcGFuPlxuICAgICAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW14LTFcIj5wZXN0aWNpZGVBSTwvY29kZT5cbiAgICAgICAgICAgICAgPHNwYW4+SW5wdXRzIGhhdmUgYSBsb29rdXAgdmFsdWU8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ2hhc19jcm9wX3Jlc2lkdWVfYnVybnQnKSB7XG4gICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXItMVwiPmFib3ZlR3JvdW5kQ3JvcFJlc2lkdWVCdXJudDwvY29kZT5cbiAgICAgICAgICAgICAgPHNwYW4+aXMgcHJlc2VudCBhcyBQcm9kdWN0PC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdsaXF1aWRfc2x1cnJ5X3NsdWRnZV9QJykge1xuICAgICAgICAgICAgICBMaXF1aWQsIFNsdXJyeSwgYW5kIFNsdWRnZSBQXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ25vX2N5Y2xlX2lucHV0c19mZWVkJykge1xuICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICBDeWNsZSBoYXNcbiAgICAgICAgICAgICAgICA8Yj5ubzwvYj5cbiAgICAgICAgICAgICAgICBJbnB1dCB3aXRoXG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGNvZGU+aXNBbmltYWxGZWVkPXRydWU8L2NvZGU+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ2hhc19jeWNsZV9pbnB1dHNfZmVlZCcpIHtcbiAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgQ3ljbGUgaGFzXG4gICAgICAgICAgICAgICAgPGI+c29tZTwvYj5cbiAgICAgICAgICAgICAgICBJbnB1dCB3aXRoXG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGNvZGU+aXNBbmltYWxGZWVkPXRydWU8L2NvZGU+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICA8L3NwYW4+XG4gICAgICA8aGUtY2xpcGJvYXJkXG4gICAgICAgIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrIGlzLWFsaWduLW1pZGRsZVwiXG4gICAgICAgIGNsaXBib2FyZENsYXNzPVwiaXMtc2l6ZS03IGlzLXAtMVwiXG4gICAgICAgIFtpY29uXT1cImZhckNsb25lXCJcbiAgICAgICAgW3ZhbHVlXT1cImtleVwiXG4gICAgICAgIFtoaWRlVGV4dF09XCJ0cnVlXCIgLz5cbiAgICA8L3RkPlxuICAgIDx0ZD5cbiAgICAgIEBpZiAobG9nVmFsdWVBcnJheSh2YWx1ZSk7IGFzIHZhbHVlQXJyYXkpIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvZ0xpbmVBcnJheTsgY29udGV4dDogeyB2YWx1ZTogdmFsdWVBcnJheSwgc29ydGluZzoge30gfVwiIC8+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvZ0xpbmVWYWx1ZTsgY29udGV4dDogeyBrZXksIHZhbHVlIH1cIiAvPlxuICAgICAgfVxuICAgIDwvdGQ+XG4gIDwvdHI+XG48L25nLXRlbXBsYXRlPlxuIl19
@@ -0,0 +1,24 @@
1
+ import { Component, input } from '@angular/core';
2
+ import { EmissionMethodTier } from '@hestia-earth/schema';
3
+ import { PluralizePipe } from '../../../common';
4
+ import { LogStatus } from '../node-logs-models.model';
5
+ import * as i0 from "@angular/core";
6
+ export class NodeLogsModelsLogsStatusComponent {
7
+ constructor() {
8
+ this.EmissionMethodTier = EmissionMethodTier;
9
+ this.LogStatus = LogStatus;
10
+ this.nodeType = input.required();
11
+ this.model = input.required();
12
+ this.data = input.required();
13
+ }
14
+ hasMethodTier(values, methodTier) {
15
+ return values.some(v => 'methodTier' in v && v.methodTier === methodTier);
16
+ }
17
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NodeLogsModelsLogsStatusComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
18
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: NodeLogsModelsLogsStatusComponent, isStandalone: true, selector: "he-node-logs-models-logs-status", inputs: { nodeType: { classPropertyName: "nodeType", publicName: "nodeType", isSignal: true, isRequired: true, transformFunction: null }, model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<div class=\"is-mb-2\">\n <span>Status:</span>\n <span class=\"is-pl-1\">{{ model().status }}</span>\n</div>\n\n@if (model().status === LogStatus.notRequired && model().logs?.is_not_relevant === 'True') {\n <ul class=\"is-pl-3 is-list-style-disc\">\n @if (model().logs.logs?.siteType_allowed === 'False') {\n <li>\n The\n <code class=\"is-mx-1\">site.siteType</code>\n is not relevant.\n </li>\n }\n @if (model().logs.logs?.product_id_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Product</code>\n <code class=\"is-mr-1\">term.&#64;id</code>\n is relevant.\n </li>\n }\n @if (model().logs.logs?.product_termType_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Product</code>\n <code class=\"is-mr-1\">term.termType</code>\n is relevant.\n </li>\n }\n @if (model().logs.logs?.input_id_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Input</code>\n <code class=\"is-mr-1\">term.&#64;id</code>\n is relevant.\n </li>\n }\n @if (model().logs.logs?.input_termType_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Input</code>\n <code class=\"is-mr-1\">term.termType</code>\n is relevant.\n </li>\n }\n </ul>\n}\n\n@if (model().logs && model().status !== LogStatus.notRequired && model().status !== LogStatus.skipHierarchy) {\n <ul class=\"is-pl-3 is-list-style-disc\">\n @if (model().logs?.shouldRunOrchestrator === false) {\n <li class=\"is-no-run-orchestrator\">\n @if (!model().logs.runRequired) {\n @if (model().logs.logs?.node_type_allowed === 'False') {\n <span class=\"is-run-node-type-not-allowed\">\n This model should not run for {{ nodeType() | pluralize: 0 }}\n </span>\n }\n }\n @if (model().config) {\n <p class=\"is-run-strategy-{{ model().config.runStrategy }}\">\n @switch (model().config.runStrategy) {\n @case ('always') {\n <span></span>\n }\n @case ('add_key_if_missing') {\n <span>We only gap-fill this key if not present</span>\n }\n @case ('add_blank_node_if_missing') {\n <span>We only gap-fill this Blank Node if not present.</span>\n }\n }\n </p>\n <p class=\"is-mt-1\">\n @if (\n model().config.runArgs?.runNonMeasured && hasMethodTier(data().original, EmissionMethodTier.measured)\n ) {\n <span class=\"is-run-with-measured\">\n The\n <code class=\"is-mx-1\">{{ model().config.value }}</code>\n was reported as measured.\n </span>\n }\n </p>\n } @else if (model().logs.logs?.is_empty === 'False') {\n <span class=\"is-run-not-empty\">\n The {{ data().type || 'blank node' }} with Term\n <code class=\"is-mx-1\">{{ data().termId }}</code>\n is already present or already added by another model().\n </span>\n }\n </li>\n } @else {\n <li class=\"is-run-orchestrator\">\n @if (model().logs?.shouldRun) {\n <p>All the requirements were met to run the model().</p>\n }\n @if (!model().logs?.shouldRun) {\n <p>Some of the requirements were not met to run the model().</p>\n <p>You can click on the model name on the left to view the debugging logs.</p>\n }\n @if (model().logs?.logs?.error) {\n <p>The model failed to run for the following reason:</p>\n <p>\n <code>{{ model().logs.logs.error }}</code>\n </p>\n }\n </li>\n }\n @if (model().logs?.replaceLowerTier !== undefined) {\n <li>\n <span>\n The recalculated\n <b>methodTier</b>\n was\n </span>\n @if (!model().logs.replaceLowerTier) {\n <span class=\"is-pl-1 is-underlined\">lower than</span>\n }\n @if (model().logs.replaceLowerTier) {\n <span class=\"is-pl-1 is-underlined\">higher than or equal to</span>\n }\n <span class=\"is-pl-1\">\n the original\n <b>methodTier</b>\n .\n </span>\n </li>\n }\n @if (model().logs.replaceLowerTier) {\n <li class=\"is-merge-replaceLowerTier\">\n <span>The recalculated</span>\n <b class=\"is-pl-1\">{{ model().config?.mergeArgs?.replaceThreshold?.[0] || 'value' }}</b>\n <span class=\"is-pl-1\">was</span>\n <span class=\"is-pl-1\">\n @if (model().config?.mergeArgs) {\n @if (!model().logs.replaceThreshold) {\n <span class=\"is-underlined\">less than</span>\n }\n @if (model().logs.replaceThreshold) {\n <span class=\"is-underlined\">more than or equal to</span>\n }\n <b class=\"is-pl-1\">{{ model().config.mergeArgs.replaceThreshold[1] * 100 }}%</b>\n }\n @if (!model().config?.mergeArgs) {\n @if (!model().logs.replaceThreshold) {\n <span class=\"is-underlined\">not sufficiently</span>\n }\n @if (model().logs.replaceThreshold) {\n <span class=\"is-underlined\">sufficiently</span>\n }\n }\n </span>\n <span class=\"is-pl-1\">different from the original</span>\n <b class=\"is-pl-1\">{{ model().config?.mergeArgs?.replaceThreshold?.[0] || 'value' }}.</b>\n </li>\n }\n </ul>\n}\n", styles: [""], dependencies: [{ kind: "pipe", type: PluralizePipe, name: "pluralize" }] }); }
19
+ }
20
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NodeLogsModelsLogsStatusComponent, decorators: [{
21
+ type: Component,
22
+ args: [{ selector: 'he-node-logs-models-logs-status', standalone: true, imports: [PluralizePipe], template: "<div class=\"is-mb-2\">\n <span>Status:</span>\n <span class=\"is-pl-1\">{{ model().status }}</span>\n</div>\n\n@if (model().status === LogStatus.notRequired && model().logs?.is_not_relevant === 'True') {\n <ul class=\"is-pl-3 is-list-style-disc\">\n @if (model().logs.logs?.siteType_allowed === 'False') {\n <li>\n The\n <code class=\"is-mx-1\">site.siteType</code>\n is not relevant.\n </li>\n }\n @if (model().logs.logs?.product_id_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Product</code>\n <code class=\"is-mr-1\">term.&#64;id</code>\n is relevant.\n </li>\n }\n @if (model().logs.logs?.product_termType_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Product</code>\n <code class=\"is-mr-1\">term.termType</code>\n is relevant.\n </li>\n }\n @if (model().logs.logs?.input_id_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Input</code>\n <code class=\"is-mr-1\">term.&#64;id</code>\n is relevant.\n </li>\n }\n @if (model().logs.logs?.input_termType_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Input</code>\n <code class=\"is-mr-1\">term.termType</code>\n is relevant.\n </li>\n }\n </ul>\n}\n\n@if (model().logs && model().status !== LogStatus.notRequired && model().status !== LogStatus.skipHierarchy) {\n <ul class=\"is-pl-3 is-list-style-disc\">\n @if (model().logs?.shouldRunOrchestrator === false) {\n <li class=\"is-no-run-orchestrator\">\n @if (!model().logs.runRequired) {\n @if (model().logs.logs?.node_type_allowed === 'False') {\n <span class=\"is-run-node-type-not-allowed\">\n This model should not run for {{ nodeType() | pluralize: 0 }}\n </span>\n }\n }\n @if (model().config) {\n <p class=\"is-run-strategy-{{ model().config.runStrategy }}\">\n @switch (model().config.runStrategy) {\n @case ('always') {\n <span></span>\n }\n @case ('add_key_if_missing') {\n <span>We only gap-fill this key if not present</span>\n }\n @case ('add_blank_node_if_missing') {\n <span>We only gap-fill this Blank Node if not present.</span>\n }\n }\n </p>\n <p class=\"is-mt-1\">\n @if (\n model().config.runArgs?.runNonMeasured && hasMethodTier(data().original, EmissionMethodTier.measured)\n ) {\n <span class=\"is-run-with-measured\">\n The\n <code class=\"is-mx-1\">{{ model().config.value }}</code>\n was reported as measured.\n </span>\n }\n </p>\n } @else if (model().logs.logs?.is_empty === 'False') {\n <span class=\"is-run-not-empty\">\n The {{ data().type || 'blank node' }} with Term\n <code class=\"is-mx-1\">{{ data().termId }}</code>\n is already present or already added by another model().\n </span>\n }\n </li>\n } @else {\n <li class=\"is-run-orchestrator\">\n @if (model().logs?.shouldRun) {\n <p>All the requirements were met to run the model().</p>\n }\n @if (!model().logs?.shouldRun) {\n <p>Some of the requirements were not met to run the model().</p>\n <p>You can click on the model name on the left to view the debugging logs.</p>\n }\n @if (model().logs?.logs?.error) {\n <p>The model failed to run for the following reason:</p>\n <p>\n <code>{{ model().logs.logs.error }}</code>\n </p>\n }\n </li>\n }\n @if (model().logs?.replaceLowerTier !== undefined) {\n <li>\n <span>\n The recalculated\n <b>methodTier</b>\n was\n </span>\n @if (!model().logs.replaceLowerTier) {\n <span class=\"is-pl-1 is-underlined\">lower than</span>\n }\n @if (model().logs.replaceLowerTier) {\n <span class=\"is-pl-1 is-underlined\">higher than or equal to</span>\n }\n <span class=\"is-pl-1\">\n the original\n <b>methodTier</b>\n .\n </span>\n </li>\n }\n @if (model().logs.replaceLowerTier) {\n <li class=\"is-merge-replaceLowerTier\">\n <span>The recalculated</span>\n <b class=\"is-pl-1\">{{ model().config?.mergeArgs?.replaceThreshold?.[0] || 'value' }}</b>\n <span class=\"is-pl-1\">was</span>\n <span class=\"is-pl-1\">\n @if (model().config?.mergeArgs) {\n @if (!model().logs.replaceThreshold) {\n <span class=\"is-underlined\">less than</span>\n }\n @if (model().logs.replaceThreshold) {\n <span class=\"is-underlined\">more than or equal to</span>\n }\n <b class=\"is-pl-1\">{{ model().config.mergeArgs.replaceThreshold[1] * 100 }}%</b>\n }\n @if (!model().config?.mergeArgs) {\n @if (!model().logs.replaceThreshold) {\n <span class=\"is-underlined\">not sufficiently</span>\n }\n @if (model().logs.replaceThreshold) {\n <span class=\"is-underlined\">sufficiently</span>\n }\n }\n </span>\n <span class=\"is-pl-1\">different from the original</span>\n <b class=\"is-pl-1\">{{ model().config?.mergeArgs?.replaceThreshold?.[0] || 'value' }}.</b>\n </li>\n }\n </ul>\n}\n" }]
23
+ }] });
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1sb2dzLW1vZGVscy1sb2dzLXN0YXR1cy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbm9kZS9ub2RlLWxvZ3MtbW9kZWxzL25vZGUtbG9ncy1tb2RlbHMtbG9ncy1zdGF0dXMvbm9kZS1sb2dzLW1vZGVscy1sb2dzLXN0YXR1cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbm9kZS9ub2RlLWxvZ3MtbW9kZWxzL25vZGUtbG9ncy1tb2RlbHMtbG9ncy1zdGF0dXMvbm9kZS1sb2dzLW1vZGVscy1sb2dzLXN0YXR1cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsa0JBQWtCLEVBQVksTUFBTSxzQkFBc0IsQ0FBQztBQUVwRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFvRCxTQUFTLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7QUFTeEcsTUFBTSxPQUFPLGlDQUFpQztJQVA5QztRQVFxQix1QkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztRQUN4QyxjQUFTLEdBQUcsU0FBUyxDQUFDO1FBRXRCLGFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFZLENBQUM7UUFDdEMsVUFBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQWdCLENBQUM7UUFDdkMsU0FBSSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQWlCLENBQUM7S0FLM0Q7SUFIVyxhQUFhLENBQUMsTUFBNkIsRUFBRSxVQUE4QjtRQUNuRixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEtBQUssVUFBVSxDQUFDLENBQUM7SUFDNUUsQ0FBQzsrR0FWVSxpQ0FBaUM7bUdBQWpDLGlDQUFpQyxrZENiOUMsa3BMQWdLQSxxRER2SlksYUFBYTs7NEZBSVosaUNBQWlDO2tCQVA3QyxTQUFTOytCQUNFLGlDQUFpQyxjQUMvQixJQUFJLFdBQ1AsQ0FBQyxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGlucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFbWlzc2lvbk1ldGhvZFRpZXIsIE5vZGVUeXBlIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9zY2hlbWEnO1xuXG5pbXBvcnQgeyBQbHVyYWxpemVQaXBlIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uJztcbmltcG9ydCB7IGJsYW5rTm9kZXNUeXBlVmFsdWUsIElCbGFua05vZGVMb2csIElDb25maWdNb2RlbCwgTG9nU3RhdHVzIH0gZnJvbSAnLi4vbm9kZS1sb2dzLW1vZGVscy5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2hlLW5vZGUtbG9ncy1tb2RlbHMtbG9ncy1zdGF0dXMnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbUGx1cmFsaXplUGlwZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9ub2RlLWxvZ3MtbW9kZWxzLWxvZ3Mtc3RhdHVzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL25vZGUtbG9ncy1tb2RlbHMtbG9ncy1zdGF0dXMuY29tcG9uZW50LnNjc3MnXG59KVxuZXhwb3J0IGNsYXNzIE5vZGVMb2dzTW9kZWxzTG9nc1N0YXR1c0NvbXBvbmVudCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBFbWlzc2lvbk1ldGhvZFRpZXIgPSBFbWlzc2lvbk1ldGhvZFRpZXI7XG4gIHByb3RlY3RlZCByZWFkb25seSBMb2dTdGF0dXMgPSBMb2dTdGF0dXM7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG5vZGVUeXBlID0gaW5wdXQucmVxdWlyZWQ8Tm9kZVR5cGU+KCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBtb2RlbCA9IGlucHV0LnJlcXVpcmVkPElDb25maWdNb2RlbD4oKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRhdGEgPSBpbnB1dC5yZXF1aXJlZDxJQmxhbmtOb2RlTG9nPigpO1xuXG4gIHByb3RlY3RlZCBoYXNNZXRob2RUaWVyKHZhbHVlczogYmxhbmtOb2Rlc1R5cGVWYWx1ZVtdLCBtZXRob2RUaWVyOiBFbWlzc2lvbk1ldGhvZFRpZXIpIHtcbiAgICByZXR1cm4gdmFsdWVzLnNvbWUodiA9PiAnbWV0aG9kVGllcicgaW4gdiAmJiB2Lm1ldGhvZFRpZXIgPT09IG1ldGhvZFRpZXIpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiaXMtbWItMlwiPlxuICA8c3Bhbj5TdGF0dXM6PC9zcGFuPlxuICA8c3BhbiBjbGFzcz1cImlzLXBsLTFcIj57eyBtb2RlbCgpLnN0YXR1cyB9fTwvc3Bhbj5cbjwvZGl2PlxuXG5AaWYgKG1vZGVsKCkuc3RhdHVzID09PSBMb2dTdGF0dXMubm90UmVxdWlyZWQgJiYgbW9kZWwoKS5sb2dzPy5pc19ub3RfcmVsZXZhbnQgPT09ICdUcnVlJykge1xuICA8dWwgY2xhc3M9XCJpcy1wbC0zIGlzLWxpc3Qtc3R5bGUtZGlzY1wiPlxuICAgIEBpZiAobW9kZWwoKS5sb2dzLmxvZ3M/LnNpdGVUeXBlX2FsbG93ZWQgPT09ICdGYWxzZScpIHtcbiAgICAgIDxsaT5cbiAgICAgICAgVGhlXG4gICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPnNpdGUuc2l0ZVR5cGU8L2NvZGU+XG4gICAgICAgIGlzIG5vdCByZWxldmFudC5cbiAgICAgIDwvbGk+XG4gICAgfVxuICAgIEBpZiAobW9kZWwoKS5sb2dzLmxvZ3M/LnByb2R1Y3RfaWRfYWxsb3dlZCA9PT0gJ0ZhbHNlJykge1xuICAgICAgPGxpPlxuICAgICAgICBOb25lIG9mIHRoZVxuICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW14LTFcIj5Qcm9kdWN0PC9jb2RlPlxuICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW1yLTFcIj50ZXJtLiYjNjQ7aWQ8L2NvZGU+XG4gICAgICAgIGlzIHJlbGV2YW50LlxuICAgICAgPC9saT5cbiAgICB9XG4gICAgQGlmIChtb2RlbCgpLmxvZ3MubG9ncz8ucHJvZHVjdF90ZXJtVHlwZV9hbGxvd2VkID09PSAnRmFsc2UnKSB7XG4gICAgICA8bGk+XG4gICAgICAgIE5vbmUgb2YgdGhlXG4gICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPlByb2R1Y3Q8L2NvZGU+XG4gICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXItMVwiPnRlcm0udGVybVR5cGU8L2NvZGU+XG4gICAgICAgIGlzIHJlbGV2YW50LlxuICAgICAgPC9saT5cbiAgICB9XG4gICAgQGlmIChtb2RlbCgpLmxvZ3MubG9ncz8uaW5wdXRfaWRfYWxsb3dlZCA9PT0gJ0ZhbHNlJykge1xuICAgICAgPGxpPlxuICAgICAgICBOb25lIG9mIHRoZVxuICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW14LTFcIj5JbnB1dDwvY29kZT5cbiAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1tci0xXCI+dGVybS4mIzY0O2lkPC9jb2RlPlxuICAgICAgICBpcyByZWxldmFudC5cbiAgICAgIDwvbGk+XG4gICAgfVxuICAgIEBpZiAobW9kZWwoKS5sb2dzLmxvZ3M/LmlucHV0X3Rlcm1UeXBlX2FsbG93ZWQgPT09ICdGYWxzZScpIHtcbiAgICAgIDxsaT5cbiAgICAgICAgTm9uZSBvZiB0aGVcbiAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+SW5wdXQ8L2NvZGU+XG4gICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXItMVwiPnRlcm0udGVybVR5cGU8L2NvZGU+XG4gICAgICAgIGlzIHJlbGV2YW50LlxuICAgICAgPC9saT5cbiAgICB9XG4gIDwvdWw+XG59XG5cbkBpZiAobW9kZWwoKS5sb2dzICYmIG1vZGVsKCkuc3RhdHVzICE9PSBMb2dTdGF0dXMubm90UmVxdWlyZWQgJiYgbW9kZWwoKS5zdGF0dXMgIT09IExvZ1N0YXR1cy5za2lwSGllcmFyY2h5KSB7XG4gIDx1bCBjbGFzcz1cImlzLXBsLTMgaXMtbGlzdC1zdHlsZS1kaXNjXCI+XG4gICAgQGlmIChtb2RlbCgpLmxvZ3M/LnNob3VsZFJ1bk9yY2hlc3RyYXRvciA9PT0gZmFsc2UpIHtcbiAgICAgIDxsaSBjbGFzcz1cImlzLW5vLXJ1bi1vcmNoZXN0cmF0b3JcIj5cbiAgICAgICAgQGlmICghbW9kZWwoKS5sb2dzLnJ1blJlcXVpcmVkKSB7XG4gICAgICAgICAgQGlmIChtb2RlbCgpLmxvZ3MubG9ncz8ubm9kZV90eXBlX2FsbG93ZWQgPT09ICdGYWxzZScpIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtcnVuLW5vZGUtdHlwZS1ub3QtYWxsb3dlZFwiPlxuICAgICAgICAgICAgICBUaGlzIG1vZGVsIHNob3VsZCBub3QgcnVuIGZvciB7eyBub2RlVHlwZSgpIHwgcGx1cmFsaXplOiAwIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIEBpZiAobW9kZWwoKS5jb25maWcpIHtcbiAgICAgICAgICA8cCBjbGFzcz1cImlzLXJ1bi1zdHJhdGVneS17eyBtb2RlbCgpLmNvbmZpZy5ydW5TdHJhdGVneSB9fVwiPlxuICAgICAgICAgICAgQHN3aXRjaCAobW9kZWwoKS5jb25maWcucnVuU3RyYXRlZ3kpIHtcbiAgICAgICAgICAgICAgQGNhc2UgKCdhbHdheXMnKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEBjYXNlICgnYWRkX2tleV9pZl9taXNzaW5nJykge1xuICAgICAgICAgICAgICAgIDxzcGFuPldlIG9ubHkgZ2FwLWZpbGwgdGhpcyBrZXkgaWYgbm90IHByZXNlbnQ8L3NwYW4+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGNhc2UgKCdhZGRfYmxhbmtfbm9kZV9pZl9taXNzaW5nJykge1xuICAgICAgICAgICAgICAgIDxzcGFuPldlIG9ubHkgZ2FwLWZpbGwgdGhpcyBCbGFuayBOb2RlIGlmIG5vdCBwcmVzZW50Ljwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8cCBjbGFzcz1cImlzLW10LTFcIj5cbiAgICAgICAgICAgIEBpZiAoXG4gICAgICAgICAgICAgIG1vZGVsKCkuY29uZmlnLnJ1bkFyZ3M/LnJ1bk5vbk1lYXN1cmVkICYmIGhhc01ldGhvZFRpZXIoZGF0YSgpLm9yaWdpbmFsLCBFbWlzc2lvbk1ldGhvZFRpZXIubWVhc3VyZWQpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1ydW4td2l0aC1tZWFzdXJlZFwiPlxuICAgICAgICAgICAgICAgIFRoZVxuICAgICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPnt7IG1vZGVsKCkuY29uZmlnLnZhbHVlIH19PC9jb2RlPlxuICAgICAgICAgICAgICAgIHdhcyByZXBvcnRlZCBhcyBtZWFzdXJlZC5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgfSBAZWxzZSBpZiAobW9kZWwoKS5sb2dzLmxvZ3M/LmlzX2VtcHR5ID09PSAnRmFsc2UnKSB7XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1ydW4tbm90LWVtcHR5XCI+XG4gICAgICAgICAgICBUaGUge3sgZGF0YSgpLnR5cGUgfHwgJ2JsYW5rIG5vZGUnIH19IHdpdGggVGVybVxuICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+e3sgZGF0YSgpLnRlcm1JZCB9fTwvY29kZT5cbiAgICAgICAgICAgIGlzIGFscmVhZHkgcHJlc2VudCBvciBhbHJlYWR5IGFkZGVkIGJ5IGFub3RoZXIgbW9kZWwoKS5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIH1cbiAgICAgIDwvbGk+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8bGkgY2xhc3M9XCJpcy1ydW4tb3JjaGVzdHJhdG9yXCI+XG4gICAgICAgIEBpZiAobW9kZWwoKS5sb2dzPy5zaG91bGRSdW4pIHtcbiAgICAgICAgICA8cD5BbGwgdGhlIHJlcXVpcmVtZW50cyB3ZXJlIG1ldCB0byBydW4gdGhlIG1vZGVsKCkuPC9wPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoIW1vZGVsKCkubG9ncz8uc2hvdWxkUnVuKSB7XG4gICAgICAgICAgPHA+U29tZSBvZiB0aGUgcmVxdWlyZW1lbnRzIHdlcmUgbm90IG1ldCB0byBydW4gdGhlIG1vZGVsKCkuPC9wPlxuICAgICAgICAgIDxwPllvdSBjYW4gY2xpY2sgb24gdGhlIG1vZGVsIG5hbWUgb24gdGhlIGxlZnQgdG8gdmlldyB0aGUgZGVidWdnaW5nIGxvZ3MuPC9wPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAobW9kZWwoKS5sb2dzPy5sb2dzPy5lcnJvcikge1xuICAgICAgICAgIDxwPlRoZSBtb2RlbCBmYWlsZWQgdG8gcnVuIGZvciB0aGUgZm9sbG93aW5nIHJlYXNvbjo8L3A+XG4gICAgICAgICAgPHA+XG4gICAgICAgICAgICA8Y29kZT57eyBtb2RlbCgpLmxvZ3MubG9ncy5lcnJvciB9fTwvY29kZT5cbiAgICAgICAgICA8L3A+XG4gICAgICAgIH1cbiAgICAgIDwvbGk+XG4gICAgfVxuICAgIEBpZiAobW9kZWwoKS5sb2dzPy5yZXBsYWNlTG93ZXJUaWVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIDxsaT5cbiAgICAgICAgPHNwYW4+XG4gICAgICAgICAgVGhlIHJlY2FsY3VsYXRlZFxuICAgICAgICAgIDxiPm1ldGhvZFRpZXI8L2I+XG4gICAgICAgICAgd2FzXG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgQGlmICghbW9kZWwoKS5sb2dzLnJlcGxhY2VMb3dlclRpZXIpIHtcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXBsLTEgaXMtdW5kZXJsaW5lZFwiPmxvd2VyIHRoYW48L3NwYW4+XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChtb2RlbCgpLmxvZ3MucmVwbGFjZUxvd2VyVGllcikge1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtcGwtMSBpcy11bmRlcmxpbmVkXCI+aGlnaGVyIHRoYW4gb3IgZXF1YWwgdG88L3NwYW4+XG4gICAgICAgIH1cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1wbC0xXCI+XG4gICAgICAgICAgdGhlIG9yaWdpbmFsXG4gICAgICAgICAgPGI+bWV0aG9kVGllcjwvYj5cbiAgICAgICAgICAuXG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvbGk+XG4gICAgfVxuICAgIEBpZiAobW9kZWwoKS5sb2dzLnJlcGxhY2VMb3dlclRpZXIpIHtcbiAgICAgIDxsaSBjbGFzcz1cImlzLW1lcmdlLXJlcGxhY2VMb3dlclRpZXJcIj5cbiAgICAgICAgPHNwYW4+VGhlIHJlY2FsY3VsYXRlZDwvc3Bhbj5cbiAgICAgICAgPGIgY2xhc3M9XCJpcy1wbC0xXCI+e3sgbW9kZWwoKS5jb25maWc/Lm1lcmdlQXJncz8ucmVwbGFjZVRocmVzaG9sZD8uWzBdIHx8ICd2YWx1ZScgfX08L2I+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtcGwtMVwiPndhczwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1wbC0xXCI+XG4gICAgICAgICAgQGlmIChtb2RlbCgpLmNvbmZpZz8ubWVyZ2VBcmdzKSB7XG4gICAgICAgICAgICBAaWYgKCFtb2RlbCgpLmxvZ3MucmVwbGFjZVRocmVzaG9sZCkge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXVuZGVybGluZWRcIj5sZXNzIHRoYW48L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKG1vZGVsKCkubG9ncy5yZXBsYWNlVGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtdW5kZXJsaW5lZFwiPm1vcmUgdGhhbiBvciBlcXVhbCB0bzwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxiIGNsYXNzPVwiaXMtcGwtMVwiPnt7IG1vZGVsKCkuY29uZmlnLm1lcmdlQXJncy5yZXBsYWNlVGhyZXNob2xkWzFdICogMTAwIH19JTwvYj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmICghbW9kZWwoKS5jb25maWc/Lm1lcmdlQXJncykge1xuICAgICAgICAgICAgQGlmICghbW9kZWwoKS5sb2dzLnJlcGxhY2VUaHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy11bmRlcmxpbmVkXCI+bm90IHN1ZmZpY2llbnRseTwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAobW9kZWwoKS5sb2dzLnJlcGxhY2VUaHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy11bmRlcmxpbmVkXCI+c3VmZmljaWVudGx5PC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXBsLTFcIj5kaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWw8L3NwYW4+XG4gICAgICAgIDxiIGNsYXNzPVwiaXMtcGwtMVwiPnt7IG1vZGVsKCkuY29uZmlnPy5tZXJnZUFyZ3M/LnJlcGxhY2VUaHJlc2hvbGQ/LlswXSB8fCAndmFsdWUnIH19LjwvYj5cbiAgICAgIDwvbGk+XG4gICAgfVxuICA8L3VsPlxufVxuIl19