@hestia-earth/ui-components 0.24.0 → 0.24.2

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.
@@ -187,7 +187,7 @@ export class NodeLogsModelsComponent {
187
187
  this.requirementLinkedNode = requirementLinkedNode;
188
188
  this.isSystemBoundary = isSystemBoundary;
189
189
  this.parseLogCompleteness = parseLogCompleteness;
190
- this.loading = true;
190
+ this.loading = signal(true);
191
191
  this.showLegend = true;
192
192
  this.onlyRequired = signal(true);
193
193
  this.filteredType = computed(() => this._filterTermTypesLabel() || this._filterTermTypes()?.map(termTypeLabel).join(' & '));
@@ -264,12 +264,12 @@ export class NodeLogsModelsComponent {
264
264
  }, { allowSignalWrites: true });
265
265
  }
266
266
  loadLogs(node) {
267
- this.loading = true;
267
+ this.loading.set(true);
268
268
  forkJoin({
269
269
  logs: this.nodeService.getLog({ ...node, dataState: DataState.recalculated }),
270
270
  config: this.engineService.ochestratorConfig$(nodeType(node), nodeId(node))
271
271
  })
272
- .pipe(tap(() => (this.loading = false)))
272
+ .pipe(tap(() => this.loading.set(false)))
273
273
  .subscribe(({ logs, config }) => {
274
274
  this.config.set(config);
275
275
  this.allLogs.set(logs);
@@ -298,14 +298,14 @@ export class NodeLogsModelsComponent {
298
298
  .filter(v => termSearch(v).includes(termSearch(term)));
299
299
  }
300
300
  searchTerms(query) {
301
- this.loading = true;
301
+ this.loading.set(true);
302
302
  return this.searchService
303
303
  .search$({
304
304
  fields: ['@type', '@id', 'name'],
305
305
  limit: 10000,
306
306
  query
307
307
  })
308
- .pipe(tap(() => (this.loading = false)), map(({ results }) => results));
308
+ .pipe(tap(() => this.loading.set(false)), map(({ results }) => results));
309
309
  }
310
310
  trackByBlankNode(_index, node) {
311
311
  return node.termId || node.key;
@@ -331,11 +331,11 @@ export class NodeLogsModelsComponent {
331
331
  });
332
332
  }
333
333
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.8", ngImport: i0, type: NodeLogsModelsComponent, deps: [{ token: i1.HeNodeService }, { token: i2.HeSearchService }, { token: i3.HeEngineService }], target: i0.ɵɵFactoryTarget.Component }); }
334
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.8", type: NodeLogsModelsComponent, selector: "he-node-logs-models", inputs: { node: "node", nodeKey: "nodeKey", originalValues: "originalValues", recalculatedValues: "recalculatedValues", terms: "terms", filterTermTypes: "filterTermTypes", filterTermTypesLabel: "filterTermTypesLabel", logsKey: "logsKey", noDataMessage: "noDataMessage" }, ngImport: i0, template: "<div class=\"px-3 pb-3\">\n <div class=\"has-text-right is-mb-2\" *ngIf=\"!isExternal && logsUrl()\">\n <a class=\"is-size-7\" [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 <he-data-table class=\"mb-1 is-small\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-fullwidth is-narrow is-striped\">\n <thead>\n <tr>\n <th class=\"width-auto has-border-right\">\n <div class=\"field\" *ngIf=\"enableFilterByTerm()\">\n <div class=\"control is-expanded has-icons-right\">\n <input\n class=\"input search-input is-small\"\n [ngModel]=\"term()\"\n name=\"term\"\n placeholder=\"Select entry by name\"\n [ngbTypeahead]=\"suggestTerm\"\n [focusFirst]=\"true\"\n (focus)=\"typeaheadFocus($event)\"\n (selectItem)=\"termChanged($event.item)\" />\n <a class=\"icon is-small is-right\" [class.is-hidden]=\"!term()\" (click)=\"termChanged('')\">\n <fa-icon icon=\"times\"></fa-icon>\n </a>\n </div>\n </div>\n </th>\n <th *ngIf=\"isBlankNodes()\">\n <span class=\"is-pr-1\">Units</span>\n <span>(per&nbsp;</span>\n <span [ngSwitch]=\"functionalUnit()\">\n <ng-container *ngSwitchCase=\"CycleFunctionalUnit['1 ha']\">hectare</ng-container>\n <ng-container *ngSwitchDefault>kg product</ng-container>\n </span>\n <span>)</span>\n </th>\n <th>Original</th>\n <th>Recalculated</th>\n <th *ngIf=\"isBlankNodes()\">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 class=\"has-text-centered\" colspan=\"6\">\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 <tr *ngIf=\"!loading && blankNodes().length === 0\">\n <td class=\"has-text-centered\" colspan=\"6\">\n <span>{{ _noDataMessage() || 'No data' }}</span>\n </td>\n </tr>\n <ng-container *ngFor=\"let blankNode of blankNodes(); trackBy: trackByBlankNode\">\n <tr [class.has-sub-rows]=\"blankNode.canOpen\" [class.is-open]=\"blankNode.isOpen\">\n <td class=\"width-auto has-border-right is-nowrap\" [attr.title]=\"blankNode.term?.name || blankNode.key\">\n <a\n class=\"is-inline-block is-align-top pr-2 open-node\"\n (click)=\"blankNode.isOpen = !blankNode.isOpen\"\n *ngIf=\"blankNode.canOpen\">\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 is-pre-wrap\" *ngIf=\"blankNode.term\" [node]=\"blankNode.term\">\n <span [innerHtml]=\"blankNode.term.name | compound\"></span>\n </he-node-link>\n <ng-template #showBlankNodeKey>\n <span>{{ blankNode.key }}</span>\n </ng-template>\n <ng-container *ngIf=\"blankNode.key; else showBlankNodeKey\">\n <a\n *ngIf=\"_nodeKey() === 'completeness'\"\n [href]=\"baseUrl + '/schema/Completeness#' + blankNode.key\"\n target=\"_blank\">\n <span>{{ blankNode.key | keyToLabel }}</span>\n </a>\n </ng-container>\n </td>\n <td *ngIf=\"isBlankNodes()\">\n <span class=\"is-nowrap\" [innerHtml]=\"blankNode.term?.units | compound\"></span>\n </td>\n <td>\n <ng-template #defaultOriginalValue>\n <span>{{ blankNode.originalValue | precision: 3 | default: '-' }}</span>\n </ng-template>\n <ng-container *ngIf=\"blankNode.allParallel; else defaultOriginalValue\">\n <div *ngFor=\"let model of blankNode.configModels[0]\">\n {{ blankNode.originalValueByMethodId[model.methodId] | precision: 3 | default: '-' }}\n </div>\n </ng-container>\n </td>\n <td>\n <ng-container *ngIf=\"!blankNode.isOriginal || blankNode.isRecalculated; else notRecalculated\">\n <ng-template #defaultRecalculatedValue>\n <span>{{ blankNode.recalculatedValue | precision: 3 | default: '-' }}</span>\n </ng-template>\n <ng-container *ngIf=\"blankNode.allParallel; else defaultRecalculatedValue\">\n <div *ngFor=\"let model of blankNode.configModels[0]\">\n {{ blankNode.recalculatedValueByMethodId[model.methodId] | precision: 3 | default: '-' }}\n </div>\n </ng-container>\n </ng-container>\n </td>\n <td *ngIf=\"isBlankNodes()\" class=\"is-nowrap\">\n <ng-template #defaultDeltaValue>\n <he-blank-node-value-delta\n *ngIf=\"blankNode.original.length && blankNode.isRecalculated; else noValue\"\n [value]=\"blankNode.recalculatedValue\"\n [originalValue]=\"blankNode.originalValue\"></he-blank-node-value-delta>\n </ng-template>\n <ng-container *ngIf=\"blankNode.allParallel; else defaultDeltaValue\">\n <div *ngFor=\"let model of blankNode.configModels[0]\">\n <he-blank-node-value-delta\n *ngIf=\"\n blankNode.originalValueByMethodId[model.methodId] !== null &&\n blankNode.recalculatedValueByMethodId[model.methodId] !== null;\n else noValue\n \"\n [value]=\"blankNode.recalculatedValueByMethodId[model.methodId]\"\n [originalValue]=\"blankNode.originalValueByMethodId[model.methodId]\"></he-blank-node-value-delta>\n </div>\n </ng-container>\n </td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: { data: blankNode }\"></ng-container>\n </tr>\n\n <tr\n *ngFor=\"let subValue of blankNode.keys\"\n [class.is-hidden]=\"!blankNode.isOpen\"\n [class.has-sub-rows]=\"blankNode.subValues?.length\"\n [class.is-sub-row]=\"blankNode.canOpen\">\n <td class=\"width-auto has-border-right is-nowrap\">\n <span class=\"is-inline-block is-align-top pl-3 pr-1 field-node\">Field:</span>\n\n <a\n class=\"is-inline-block is-pre-wrap\"\n *ngIf=\"blankNode.type\"\n [href]=\"baseUrl + '/schema/' + blankNode.type + '#' + subValue.key\"\n target=\"_blank\"\n [title]=\"subValue.key\">\n <span>{{ subValue.key }}</span>\n </a>\n <span class=\"is-inline-block is-align-top\" *ngIf=\"!blankNode.type\">{{ subValue.key }}</span>\n </td>\n <td *ngIf=\"isBlankNodes()\"></td>\n <td>\n <span *ngIf=\"subValue.originalValue !== null; else noValue\">\n {{ subValue.originalValue | precision: 3 | default: '-' }}\n </span>\n </td>\n <td>\n <span *ngIf=\"subValue.isRecalculated || subValue.key === 'impactAssessment'; else notRecalculated\">\n {{ subValue.recalculatedValue | precision: 3 | default: '-' }}\n </span>\n </td>\n <td *ngIf=\"isBlankNodes()\">-</td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: { data: subValue }\"></ng-container>\n </tr>\n\n <tr\n *ngFor=\"let subValue of blankNode.subValues\"\n [class.is-hidden]=\"!blankNode.isOpen\"\n [class.is-sub-row]=\"blankNode.canOpen\">\n <td class=\"width-auto has-border-right\">\n <span class=\"is-inline-block is-align-top pl-3\">{{ subValue.key | keyToLabel }}</span>\n\n <ng-container *ngIf=\"subValue.id\">\n <span class=\"is-inline-block\" class=\"is-inline-block is-align-top pr-1\">:</span>\n\n <ng-container [ngSwitch]=\"subValue.key\">\n <span class=\"is-inline-block\" *ngSwitchCase=\"'backgroundData'\">{{ subValue.id | keyToLabel }}</span>\n <he-node-link\n *ngSwitchDefault\n class=\"is-block pl-4\"\n [node]=\"termById(subValue.id)\"\n [attr.title]=\"termById(subValue.id).name\">\n <span [innerHtml]=\"termById(subValue.id).name | compound\"></span>\n </he-node-link>\n </ng-container>\n </ng-container>\n </td>\n <td *ngIf=\"isBlankNodes()\">\n <span class=\"is-nowrap\" *ngIf=\"subValue.showUnits\" [innerHtml]=\"blankNode.term?.units | compound\"></span>\n </td>\n <td>\n <span *ngIf=\"subValue.originalValue !== null; else noValue\">\n {{ subValue.originalValue | precision: 3 | default: '-' }}\n </span>\n </td>\n <td>\n <span *ngIf=\"subValue.isRecalculated; else notRecalculated\">\n {{ subValue.recalculatedValue | precision: 3 | default: '-' }}\n </span>\n </td>\n <td *ngIf=\"isBlankNodes()\">-</td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: { data: subValue }\"></ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </he-data-table>\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\" (click)=\"showLegend = !showLegend\">\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 <ng-container *ngFor=\"let status of LogStatus | keys\">\n <li *ngIf=\"logIcon[status.value]\" class=\"has-text-{{ logColor[status.value] }}\">\n <fa-icon [icon]=\"logIcon[status.value]\"></fa-icon>\n <span class=\"pl-1\">{{ status.value }}</span>\n </li>\n </ng-container>\n </ul>\n </div>\n <div class=\"column has-text-right\" *ngIf=\"filteredType()\">\n <label class=\"is-inline-block checkbox\">\n <input\n type=\"checkbox\"\n class=\"selector\"\n [ngModel]=\"onlyRequired\"\n (change)=\"onlyRequiredChanged($event.target.checked)\"\n [disabled]=\"!!term()\" />\n <span class=\"ml-2\">\n Show only {{ filteredType() | pluralize }} included in the default Hestia system boundary\n </span>\n </label>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #blankNodeModels let-data=\"data\">\n <ng-template #notInSystemBoundary>\n <td [attr.colspan]=\"methodModelsCount()\">\n <span>Not in Hestia system boundary</span>\n </td>\n </ng-template>\n\n <ng-container *ngIf=\"isSystemBoundary(data); else noValue\">\n <td class=\"blank-node-index-{{ i }}\" *ngFor=\"let c of methodModelsCount() | times; let i = index\">\n <ng-container *ngIf=\"getModelsAt(data, i); let models; else: noValue\">\n <ng-template #modelSerie>\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: { model: models, data }\"></ng-container>\n </ng-template>\n <div *ngIf=\"models | isArray; else modelSerie\">\n <p *ngFor=\"let model of models\">\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: { model, data }\"></ng-container>\n </p>\n </div>\n </ng-container>\n </td>\n </ng-container>\n</ng-template>\n\n<ng-template #blankNodeModel let-model=\"model\" let-data=\"data\">\n <span\n class=\"is-nowrap\"\n [class.trigger-popover]=\"model.showLogs\"\n [ngbPopover]=\"logDetails\"\n [autoClose]=\"'outside'\"\n popoverClass=\"is-narrow\"\n triggers=\"manual\"\n #p=\"ngbPopover\"\n placement=\"left\"\n container=\"body\"\n (click)=\"p.isOpen() ? p.close() : model.showLogs ? p.open({ logs: model.logs }) : null\">\n <span class=\"is-capitalized\">{{ methodName(model) }}</span>\n <span class=\"pl-1\" *ngIf=\"model.logs?.methodTier || model.model?.methodTier\">\n [{{ model.logs?.methodTier || model.model?.methodTier }}]\n </span>\n\n <span\n class=\"pl-1 has-text-{{ logColor[model.status] }} trigger-popover\"\n [ngbPopover]=\"logStatusDetails\"\n [autoClose]=\"'outside'\"\n popoverClass=\"is-narrow\"\n triggers=\"manual\"\n #p1=\"ngbPopover\"\n placement=\"left\"\n container=\"body\"\n (click)=\"$event.stopPropagation(); p1.isOpen() ? p1.close() : p1.open({ model, data })\">\n <fa-icon [icon]=\"logIcon[model.status]\"></fa-icon>\n </span>\n\n <span class=\"pl-1\" *ngIf=\"model.model\">\n (\n <ng-container *ngTemplateOutlet=\"docsLink; context: { $implicit: model.model }\"></ng-container>\n )\n </span>\n </span>\n</ng-template>\n\n<ng-template #noValue>-</ng-template>\n\n<ng-template #notRecalculated>not recalculated</ng-template>\n\n<ng-template #logDetails let-logs=\"logs\">\n <div class=\"table-container\" *bindOnce=\"logs\">\n <table class=\"table is-dark is-fullwidth\">\n <tbody>\n <ng-container *ngIf=\"logs?.requirements\">\n <ng-container *ngFor=\"let key of requirementKeys(logs.requirements)\">\n <ng-container *ngTemplateOutlet=\"logLine; context: { key, value: logs.requirements[key] }\"></ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"logs?.logs\">\n <ng-container *ngFor=\"let key of logs.logs | keys\">\n <ng-container *ngTemplateOutlet=\"logLine; context: key\"></ng-container>\n </ng-container>\n </ng-container>\n </tbody>\n </table>\n </div>\n\n <ng-container *bindOnce=\"logs\">\n <div class=\"it-mt-2\" *ngIf=\"logs?.missingLookups?.length\">\n <p>Optional data missing:</p>\n\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 <tr *ngFor=\"let data of logs.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 </div>\n </ng-container>\n</ng-template>\n\n<ng-template #logLineValue let-key=\"key\" let-value=\"value\">\n <ng-template #defaultValue>\n <span class=\"is-inline-block is-align-middle\">{{ value }}</span>\n </ng-template>\n <ng-container *ngIf=\"requirementLinkedNode(key, value); let linkedNode; else: defaultValue\">\n <he-node-link\n class=\"is-inline-block is-align-middle\"\n linkClass=\"is-dark\"\n [node]=\"linkedNode\"\n [showExternalLink]=\"true\"></he-node-link>\n </ng-container>\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 <ng-template #defaultMessage>\n <ng-container [ngSwitch]=\"key\">\n <ng-container *ngSwitchDefault>{{ key | keyToLabel }}</ng-container>\n\n <ng-container *ngSwitchCase=\"'property_id'\">Property Term @id</ng-container>\n <ng-container *ngSwitchCase=\"'product_id'\">Product Term @id</ng-container>\n <ng-container *ngSwitchCase=\"'input_id'\">Input Term @id</ng-container>\n\n <ng-container *ngSwitchCase=\"'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 </ng-container>\n <ng-container *ngSwitchCase=\"'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 </ng-container>\n <ng-container *ngSwitchCase=\"'product_id_allowed'\">\n <span>Are any of the Product</span>\n <code class=\"is-mx-1\">@id</code>\n <span>allowed to run this model</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"'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 </ng-container>\n <ng-container *ngSwitchCase=\"'input_id_allowed'\">\n <span>Are any of the Input</span>\n <code class=\"is-mx-1\">@id</code>\n <span>allowed to run this model</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"'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 </ng-container>\n\n <!-- Deprecated -->\n <ng-container *ngSwitchCase=\"'primary_product_id_allowed'\">\n <span>Is the current primary product</span>\n <code class=\"is-mx-1\">@id</code>\n <span>allowed to run this model</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"'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 </ng-container>\n\n <ng-container *ngSwitchCase=\"'geospatial_data'\">\n Has geospatial data necessary to run this model\n </ng-container>\n <ng-container *ngSwitchCase=\"'contains_geospatial_data'\">\n Has geospatial data necessary to run this model\n </ng-container>\n <ng-container *ngSwitchCase=\"'current_size'\">Current polygon area</ng-container>\n <ng-container *ngSwitchCase=\"'max_area_size'\">Maximum polygon area to run this model</ng-container>\n <ng-container *ngSwitchCase=\"'below_max_area_size'\">Polygon below the maximum area</ng-container>\n <ng-container *ngSwitchCase=\"'region_factor'\">Factor from region lookup</ng-container>\n\n <ng-container *ngSwitchCase=\"'has_pesticides_inputs'\">\n <span>Cycle contains</span>\n <code class=\"is-mx-1\">pesticideAI</code>\n <span>Inputs</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"'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 </ng-container>\n\n <ng-container *ngSwitchCase=\"'has_crop_residue_burnt'\">\n <code class=\"is-mr-1\">aboveGroundCropResidueBurnt</code>\n <span>is present as Product</span>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'liquid_slurry_sludge_P'\">Liquid, Slurry, and Sludge P</ng-container>\n </ng-container>\n </ng-template>\n\n <ng-container *ngIf=\"parseLogCompleteness(key); let completeness; else: defaultMessage\">\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 </ng-container>\n </span>\n <he-clipboard\n class=\"is-inline-block is-align-middle\"\n clipboardClass=\"is-size-7 is-p-1\"\n [icon]=\"['far', 'clone']\"\n [value]=\"key\"\n [hideText]=\"true\"></he-clipboard>\n </td>\n <td>\n <ng-template #singleValue>\n <ng-container *ngTemplateOutlet=\"logLineValue; context: { key, value }\"></ng-container>\n </ng-template>\n <div *ngIf=\"logValueArray(value); let valueArray; else: singleValue\">\n <table class=\"table is-dark is-bordered is-striped\">\n <thead *ngIf=\"valueArray[0] | isObject\">\n <tr>\n <th class=\"has-text-white\" *ngFor=\"let v of valueArray[0] | keys\">{{ v.key }}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let v of valueArray\">\n <ng-template #singleArrayValue>\n <td>{{ v }}</td>\n </ng-template>\n <ng-container *ngIf=\"v | isObject; else singleArrayValue\">\n <td *ngFor=\"let vv of v | keys\">{{ vv.value }}</td>\n </ng-container>\n </tr>\n </tbody>\n </table>\n </div>\n </td>\n </tr>\n</ng-template>\n\n<ng-template #logStatusDetails let-model=\"model\" let-data=\"data\">\n <ng-container *bindOnce=\"model\">\n <div class=\"is-mb-2\">\n <span>Status:</span>\n <span class=\"is-pl-1\">{{ model.status }}</span>\n </div>\n\n <ng-container *ngIf=\"model.status === LogStatus.notRequired && model.logs?.is_not_relevant === 'True'\">\n <ul class=\"is-pl-3 is-list-style-disc\">\n <li *ngIf=\"model.logs.logs?.siteType_allowed === 'False'\">\n The\n <code class=\"is-mx-1\">site.siteType</code>\n is not relevant.\n </li>\n <li *ngIf=\"model.logs.logs?.product_id_allowed === 'False'\">\n None of the\n <code class=\"is-mx-1\">Product</code>\n <code class=\"is-mr-1\">term.@id</code>\n is relevant.\n </li>\n <li *ngIf=\"model.logs.logs?.product_termType_allowed === 'False'\">\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 <li *ngIf=\"model.logs.logs?.input_id_allowed === 'False'\">\n None of the\n <code class=\"is-mx-1\">Input</code>\n <code class=\"is-mr-1\">term.@id</code>\n is relevant.\n </li>\n <li *ngIf=\"model.logs.logs?.input_termType_allowed === 'False'\">\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 </ul>\n </ng-container>\n\n <ng-container\n *ngIf=\"model.logs && model.status !== LogStatus.notRequired && model.status !== LogStatus.skipHierarchy\">\n <ul class=\"is-pl-3 is-list-style-disc\">\n <ng-template #showRunOrchestrator>\n <li class=\"is-run-orchestrator\">\n <p *ngIf=\"model.logs?.shouldRun\">All the requirements were met to run the model.</p>\n <ng-container *ngIf=\"!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 </ng-container>\n <ng-container *ngIf=\"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 </ng-container>\n </li>\n </ng-template>\n\n <li\n class=\"is-no-run-orchestrator\"\n *ngIf=\"model.logs?.shouldRunOrchestrator === false; else showRunOrchestrator\">\n <ng-container *ngIf=\"!model.logs.runRequired\">\n <span class=\"is-run-node-type-not-allowed\" *ngIf=\"model.logs.logs?.node_type_allowed === 'False'\">\n This model should not run for {{ nodeType() | pluralize: 0 }}\n </span>\n </ng-container>\n\n <ng-template #runNoConfig>\n <span class=\"is-run-not-empty\" *ngIf=\"model.logs.logs?.is_empty === 'False'\">\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 </ng-template>\n\n <ng-container *ngIf=\"model.config; else runNoConfig\">\n <p class=\"is-run-strategy-{{ model.config.runStrategy }}\" [ngSwitch]=\"model.config.runStrategy\">\n <span *ngSwitchCase=\"'always'\"></span>\n <span *ngSwitchCase=\"'add_key_if_missing'\">We only gap-fill this key if not present</span>\n <span *ngSwitchCase=\"'add_blank_node_if_missing'\">We only gap-fill this Blank Node if not present.</span>\n </p>\n\n <p class=\"is-mt-1\">\n <span\n class=\"is-run-with-measured\"\n *ngIf=\"\n model.config.runArgs?.runNonMeasured && hasMethodTier(data.original, EmissionMethodTier.measured)\n \">\n The\n <code class=\"is-mx-1\">{{ model.config.value }}</code>\n was reported as measured.\n </span>\n </p>\n </ng-container>\n </li>\n\n <li *ngIf=\"model.logs?.replaceLowerTier !== undefined\">\n <span>\n The recalculated\n <b>methodTier</b>\n was\n </span>\n <span class=\"is-pl-1 is-underlined\" *ngIf=\"!model.logs.replaceLowerTier\">lower than</span>\n <span class=\"is-pl-1 is-underlined\" *ngIf=\"model.logs.replaceLowerTier\">higher than or equal to</span>\n <span class=\"is-pl-1\">\n the original\n <b>methodTier</b>\n .\n </span>\n </li>\n\n <li class=\"is-merge-replaceLowerTier\" *ngIf=\"model.logs.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 <ng-container *ngIf=\"model.config?.mergeArgs\">\n <span class=\"is-underlined\" *ngIf=\"!model.logs.replaceThreshold\">less than</span>\n <span class=\"is-underlined\" *ngIf=\"model.logs.replaceThreshold\">more than or equal to</span>\n <b class=\"is-pl-1\">{{ model.config.mergeArgs.replaceThreshold[1] * 100 }}%</b>\n </ng-container>\n <ng-container *ngIf=\"!model.config?.mergeArgs\">\n <span class=\"is-underlined\" *ngIf=\"!model.logs.replaceThreshold\">not sufficiently</span>\n <span class=\"is-underlined\" *ngIf=\"model.logs.replaceThreshold\">sufficiently</span>\n </ng-container>\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 </ul>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #docsLink let-model>\n <a [href]=\"model.apiDocsPath || model.docPath || model.path\" target=\"_blank\" (click)=\"$event.stopPropagation()\">\n <span>Docs</span>\n <fa-icon class=\"ml-1\" icon=\"external-link-alt\" size=\"sm\"></fa-icon>\n </a>\n</ng-template>\n", styles: [":host{display:block}::ng-deep .table{background-color:transparent}::ng-deep .table td he-node-link{width:190px}@media screen and (max-width: 768px){::ng-deep .table td he-node-link{width:150px}}::ng-deep .table td .open-node+he-node-link{width:170px}@media screen and (max-width: 768px){::ng-deep .table td .open-node+he-node-link{width:130px}}::ng-deep .table td.has-border-right{box-shadow:1px 0 #6c8093}::ng-deep .table .has-sub-rows.is-open>td:first-child:before,::ng-deep .table .is-sub-row>td:first-child:before{display:block;position:absolute;content:\" \";background-color:#6c809333;height:100%;width:1px;top:0;left:12px}::ng-deep .table .has-sub-rows.is-open>td:first-child:before{top:25px}::ng-deep .table .popover-body .table-container{max-height:260px;overflow-y:auto}::ng-deep .copy-log he-clipboard{visibility:hidden}::ng-deep .copy-log:hover he-clipboard{visibility:visible}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgbTypeahead, selector: "input[ngbTypeahead]", inputs: ["autocomplete", "container", "editable", "focusFirst", "inputFormatter", "ngbTypeahead", "resultFormatter", "resultTemplate", "selectOnExact", "showHint", "placement", "popperOptions", "popupClass"], outputs: ["selectItem"], exportAs: ["ngbTypeahead"] }, { kind: "directive", type: i6.NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "ngbPopover", "popoverTitle", "placement", "popperOptions", "triggers", "positionTarget", "container", "disablePopover", "popoverClass", "popoverContext", "openDelay", "closeDelay"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }, { kind: "component", type: i7.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { kind: "directive", type: i8.BindOnceDirective, selector: "[bindOnce]", inputs: ["bindOnce"] }, { kind: "component", type: i9.BlankNodeValueDeltaComponent, selector: "he-blank-node-value-delta", inputs: ["value", "originalValue", "displayType"] }, { kind: "component", type: i10.ClipboardComponent, selector: "he-clipboard", inputs: ["value", "disabled", "hideText", "icon", "size", "rotate", "clipboardClass"] }, { kind: "component", type: i11.DataTableComponent, selector: "he-data-table", inputs: ["minHeight", "maxHeight", "small"] }, { kind: "component", type: i12.NodeLinkComponent, selector: "he-node-link", inputs: ["node", "showExternalLink", "linkClass"] }, { kind: "pipe", type: i13.CompoundPipe, name: "compound" }, { kind: "pipe", type: i14.DefaultPipe, name: "default" }, { kind: "pipe", type: i15.KeysPipe, name: "keys" }, { kind: "pipe", type: i16.PluralizePipe, name: "pluralize" }, { kind: "pipe", type: i17.KeyToLabelPipe, name: "keyToLabel" }, { kind: "pipe", type: i18.PrecisionPipe, name: "precision" }, { kind: "pipe", type: i19.TimesPipe, name: "times" }, { kind: "pipe", type: i20.IsArrayPipe, name: "isArray" }, { kind: "pipe", type: i21.IsObjectPipe, name: "isObject" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
334
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.8", type: NodeLogsModelsComponent, selector: "he-node-logs-models", inputs: { node: "node", nodeKey: "nodeKey", originalValues: "originalValues", recalculatedValues: "recalculatedValues", terms: "terms", filterTermTypes: "filterTermTypes", filterTermTypesLabel: "filterTermTypesLabel", logsKey: "logsKey", noDataMessage: "noDataMessage" }, ngImport: i0, template: "<div class=\"px-3 pb-3\">\n <div class=\"has-text-right is-mb-2\" *ngIf=\"!isExternal && logsUrl()\">\n <a class=\"is-size-7\" [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 <he-data-table class=\"mb-1 is-small\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-fullwidth is-narrow is-striped\">\n <thead>\n <tr>\n <th class=\"width-auto has-border-right\">\n <div class=\"field\" *ngIf=\"enableFilterByTerm()\">\n <div class=\"control is-expanded has-icons-right\">\n <input\n class=\"input search-input is-small\"\n [ngModel]=\"term()\"\n name=\"term\"\n placeholder=\"Select entry by name\"\n [ngbTypeahead]=\"suggestTerm\"\n [focusFirst]=\"true\"\n (focus)=\"typeaheadFocus($event)\"\n (selectItem)=\"termChanged($event.item)\" />\n <a class=\"icon is-small is-right\" [class.is-hidden]=\"!term()\" (click)=\"termChanged('')\">\n <fa-icon icon=\"times\"></fa-icon>\n </a>\n </div>\n </div>\n </th>\n <th *ngIf=\"isBlankNodes()\">\n <span class=\"is-pr-1\">Units</span>\n <span>(per&nbsp;</span>\n <span [ngSwitch]=\"functionalUnit()\">\n <ng-container *ngSwitchCase=\"CycleFunctionalUnit['1 ha']\">hectare</ng-container>\n <ng-container *ngSwitchDefault>kg product</ng-container>\n </span>\n <span>)</span>\n </th>\n <th>Original</th>\n <th>Recalculated</th>\n <th *ngIf=\"isBlankNodes()\">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 class=\"has-text-centered\" colspan=\"6\">\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 <tr *ngIf=\"!loading() && blankNodes().length === 0\">\n <td class=\"has-text-centered\" colspan=\"6\">\n <span>{{ _noDataMessage() || 'No data' }}</span>\n </td>\n </tr>\n <ng-container *ngFor=\"let blankNode of blankNodes(); trackBy: trackByBlankNode\">\n <tr [class.has-sub-rows]=\"blankNode.canOpen\" [class.is-open]=\"blankNode.isOpen\">\n <td class=\"width-auto has-border-right is-nowrap\" [attr.title]=\"blankNode.term?.name || blankNode.key\">\n <a\n class=\"is-inline-block is-align-top pr-2 open-node\"\n (click)=\"blankNode.isOpen = !blankNode.isOpen\"\n *ngIf=\"blankNode.canOpen\">\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 is-pre-wrap\" *ngIf=\"blankNode.term\" [node]=\"blankNode.term\">\n <span [innerHtml]=\"blankNode.term.name | compound\"></span>\n </he-node-link>\n <ng-template #showBlankNodeKey>\n <span>{{ blankNode.key }}</span>\n </ng-template>\n <ng-container *ngIf=\"blankNode.key; else showBlankNodeKey\">\n <a\n *ngIf=\"_nodeKey() === 'completeness'\"\n [href]=\"baseUrl + '/schema/Completeness#' + blankNode.key\"\n target=\"_blank\">\n <span>{{ blankNode.key | keyToLabel }}</span>\n </a>\n </ng-container>\n </td>\n <td *ngIf=\"isBlankNodes()\">\n <span class=\"is-nowrap\" [innerHtml]=\"blankNode.term?.units | compound\"></span>\n </td>\n <td>\n <ng-template #defaultOriginalValue>\n <span>{{ blankNode.originalValue | precision: 3 | default: '-' }}</span>\n </ng-template>\n <ng-container *ngIf=\"blankNode.allParallel; else defaultOriginalValue\">\n <div *ngFor=\"let model of blankNode.configModels[0]\">\n {{ blankNode.originalValueByMethodId[model.methodId] | precision: 3 | default: '-' }}\n </div>\n </ng-container>\n </td>\n <td>\n <ng-container *ngIf=\"!blankNode.isOriginal || blankNode.isRecalculated; else notRecalculated\">\n <ng-template #defaultRecalculatedValue>\n <span>{{ blankNode.recalculatedValue | precision: 3 | default: '-' }}</span>\n </ng-template>\n <ng-container *ngIf=\"blankNode.allParallel; else defaultRecalculatedValue\">\n <div *ngFor=\"let model of blankNode.configModels[0]\">\n {{ blankNode.recalculatedValueByMethodId[model.methodId] | precision: 3 | default: '-' }}\n </div>\n </ng-container>\n </ng-container>\n </td>\n <td *ngIf=\"isBlankNodes()\" class=\"is-nowrap\">\n <ng-template #defaultDeltaValue>\n <he-blank-node-value-delta\n *ngIf=\"blankNode.original.length && blankNode.isRecalculated; else noValue\"\n [value]=\"blankNode.recalculatedValue\"\n [originalValue]=\"blankNode.originalValue\"></he-blank-node-value-delta>\n </ng-template>\n <ng-container *ngIf=\"blankNode.allParallel; else defaultDeltaValue\">\n <div *ngFor=\"let model of blankNode.configModels[0]\">\n <he-blank-node-value-delta\n *ngIf=\"\n blankNode.originalValueByMethodId[model.methodId] !== null &&\n blankNode.recalculatedValueByMethodId[model.methodId] !== null;\n else noValue\n \"\n [value]=\"blankNode.recalculatedValueByMethodId[model.methodId]\"\n [originalValue]=\"blankNode.originalValueByMethodId[model.methodId]\"></he-blank-node-value-delta>\n </div>\n </ng-container>\n </td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: { data: blankNode }\"></ng-container>\n </tr>\n\n <tr\n *ngFor=\"let subValue of blankNode.keys\"\n [class.is-hidden]=\"!blankNode.isOpen\"\n [class.has-sub-rows]=\"blankNode.subValues?.length\"\n [class.is-sub-row]=\"blankNode.canOpen\">\n <td class=\"width-auto has-border-right is-nowrap\">\n <span class=\"is-inline-block is-align-top pl-3 pr-1 field-node\">Field:</span>\n\n <a\n class=\"is-inline-block is-pre-wrap\"\n *ngIf=\"blankNode.type\"\n [href]=\"baseUrl + '/schema/' + blankNode.type + '#' + subValue.key\"\n target=\"_blank\"\n [title]=\"subValue.key\">\n <span>{{ subValue.key }}</span>\n </a>\n <span class=\"is-inline-block is-align-top\" *ngIf=\"!blankNode.type\">{{ subValue.key }}</span>\n </td>\n <td *ngIf=\"isBlankNodes()\"></td>\n <td>\n <span *ngIf=\"subValue.originalValue !== null; else noValue\">\n {{ subValue.originalValue | precision: 3 | default: '-' }}\n </span>\n </td>\n <td>\n <span *ngIf=\"subValue.isRecalculated || subValue.key === 'impactAssessment'; else notRecalculated\">\n {{ subValue.recalculatedValue | precision: 3 | default: '-' }}\n </span>\n </td>\n <td *ngIf=\"isBlankNodes()\">-</td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: { data: subValue }\"></ng-container>\n </tr>\n\n <tr\n *ngFor=\"let subValue of blankNode.subValues\"\n [class.is-hidden]=\"!blankNode.isOpen\"\n [class.is-sub-row]=\"blankNode.canOpen\">\n <td class=\"width-auto has-border-right\">\n <span class=\"is-inline-block is-align-top pl-3\">{{ subValue.key | keyToLabel }}</span>\n\n <ng-container *ngIf=\"subValue.id\">\n <span class=\"is-inline-block\" class=\"is-inline-block is-align-top pr-1\">:</span>\n\n <ng-container [ngSwitch]=\"subValue.key\">\n <span class=\"is-inline-block\" *ngSwitchCase=\"'backgroundData'\">{{ subValue.id | keyToLabel }}</span>\n <he-node-link\n *ngSwitchDefault\n class=\"is-block pl-4\"\n [node]=\"termById(subValue.id)\"\n [attr.title]=\"termById(subValue.id).name\">\n <span [innerHtml]=\"termById(subValue.id).name | compound\"></span>\n </he-node-link>\n </ng-container>\n </ng-container>\n </td>\n <td *ngIf=\"isBlankNodes()\">\n <span class=\"is-nowrap\" *ngIf=\"subValue.showUnits\" [innerHtml]=\"blankNode.term?.units | compound\"></span>\n </td>\n <td>\n <span *ngIf=\"subValue.originalValue !== null; else noValue\">\n {{ subValue.originalValue | precision: 3 | default: '-' }}\n </span>\n </td>\n <td>\n <span *ngIf=\"subValue.isRecalculated; else notRecalculated\">\n {{ subValue.recalculatedValue | precision: 3 | default: '-' }}\n </span>\n </td>\n <td *ngIf=\"isBlankNodes()\">-</td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: { data: subValue }\"></ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </he-data-table>\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\" (click)=\"showLegend = !showLegend\">\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 <ng-container *ngFor=\"let status of LogStatus | keys\">\n <li *ngIf=\"logIcon[status.value]\" class=\"has-text-{{ logColor[status.value] }}\">\n <fa-icon [icon]=\"logIcon[status.value]\"></fa-icon>\n <span class=\"pl-1\">{{ status.value }}</span>\n </li>\n </ng-container>\n </ul>\n </div>\n <div class=\"column has-text-right\" *ngIf=\"filteredType()\">\n <label class=\"is-inline-block checkbox\">\n <input\n type=\"checkbox\"\n class=\"selector\"\n [ngModel]=\"onlyRequired\"\n (change)=\"onlyRequiredChanged($event.target.checked)\"\n [disabled]=\"!!term()\" />\n <span class=\"ml-2\">\n Show only {{ filteredType() | pluralize }} included in the default Hestia system boundary\n </span>\n </label>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #blankNodeModels let-data=\"data\">\n <ng-template #notInSystemBoundary>\n <td [attr.colspan]=\"methodModelsCount()\">\n <span>Not in Hestia system boundary</span>\n </td>\n </ng-template>\n\n <ng-container *ngIf=\"isSystemBoundary(data); else noValue\">\n <td class=\"blank-node-index-{{ i }}\" *ngFor=\"let c of methodModelsCount() | times; let i = index\">\n <ng-container *ngIf=\"getModelsAt(data, i); let models; else: noValue\">\n <ng-template #modelSerie>\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: { model: models, data }\"></ng-container>\n </ng-template>\n <div *ngIf=\"models | isArray; else modelSerie\">\n <p *ngFor=\"let model of models\">\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: { model, data }\"></ng-container>\n </p>\n </div>\n </ng-container>\n </td>\n </ng-container>\n</ng-template>\n\n<ng-template #blankNodeModel let-model=\"model\" let-data=\"data\">\n <span\n class=\"is-nowrap\"\n [class.trigger-popover]=\"model.showLogs\"\n [ngbPopover]=\"logDetails\"\n [autoClose]=\"'outside'\"\n popoverClass=\"is-narrow\"\n triggers=\"manual\"\n #p=\"ngbPopover\"\n placement=\"left\"\n container=\"body\"\n (click)=\"p.isOpen() ? p.close() : model.showLogs ? p.open({ logs: model.logs }) : null\">\n <span class=\"is-capitalized\">{{ methodName(model) }}</span>\n <span class=\"pl-1\" *ngIf=\"model.logs?.methodTier || model.model?.methodTier\">\n [{{ model.logs?.methodTier || model.model?.methodTier }}]\n </span>\n\n <span\n class=\"pl-1 has-text-{{ logColor[model.status] }} trigger-popover\"\n [ngbPopover]=\"logStatusDetails\"\n [autoClose]=\"'outside'\"\n popoverClass=\"is-narrow\"\n triggers=\"manual\"\n #p1=\"ngbPopover\"\n placement=\"left\"\n container=\"body\"\n (click)=\"$event.stopPropagation(); p1.isOpen() ? p1.close() : p1.open({ model, data })\">\n <fa-icon [icon]=\"logIcon[model.status]\"></fa-icon>\n </span>\n\n <span class=\"pl-1\" *ngIf=\"model.model\">\n (\n <ng-container *ngTemplateOutlet=\"docsLink; context: { $implicit: model.model }\"></ng-container>\n )\n </span>\n </span>\n</ng-template>\n\n<ng-template #noValue>-</ng-template>\n\n<ng-template #notRecalculated>not recalculated</ng-template>\n\n<ng-template #logDetails let-logs=\"logs\">\n <div class=\"table-container\" *bindOnce=\"logs\">\n <table class=\"table is-dark is-fullwidth\">\n <tbody>\n <ng-container *ngIf=\"logs?.requirements\">\n <ng-container *ngFor=\"let key of requirementKeys(logs.requirements)\">\n <ng-container *ngTemplateOutlet=\"logLine; context: { key, value: logs.requirements[key] }\"></ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"logs?.logs\">\n <ng-container *ngFor=\"let key of logs.logs | keys\">\n <ng-container *ngTemplateOutlet=\"logLine; context: key\"></ng-container>\n </ng-container>\n </ng-container>\n </tbody>\n </table>\n </div>\n\n <ng-container *bindOnce=\"logs\">\n <div class=\"it-mt-2\" *ngIf=\"logs?.missingLookups?.length\">\n <p>Optional data missing:</p>\n\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 <tr *ngFor=\"let data of logs.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 </div>\n </ng-container>\n</ng-template>\n\n<ng-template #logLineValue let-key=\"key\" let-value=\"value\">\n <ng-template #defaultValue>\n <span class=\"is-inline-block is-align-middle\">{{ value }}</span>\n </ng-template>\n <ng-container *ngIf=\"requirementLinkedNode(key, value); let linkedNode; else: defaultValue\">\n <he-node-link\n class=\"is-inline-block is-align-middle\"\n linkClass=\"is-dark\"\n [node]=\"linkedNode\"\n [showExternalLink]=\"true\"></he-node-link>\n </ng-container>\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 <ng-template #defaultMessage>\n <ng-container [ngSwitch]=\"key\">\n <ng-container *ngSwitchDefault>{{ key | keyToLabel }}</ng-container>\n\n <ng-container *ngSwitchCase=\"'property_id'\">Property Term @id</ng-container>\n <ng-container *ngSwitchCase=\"'product_id'\">Product Term @id</ng-container>\n <ng-container *ngSwitchCase=\"'input_id'\">Input Term @id</ng-container>\n\n <ng-container *ngSwitchCase=\"'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 </ng-container>\n <ng-container *ngSwitchCase=\"'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 </ng-container>\n <ng-container *ngSwitchCase=\"'product_id_allowed'\">\n <span>Are any of the Product</span>\n <code class=\"is-mx-1\">@id</code>\n <span>allowed to run this model</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"'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 </ng-container>\n <ng-container *ngSwitchCase=\"'input_id_allowed'\">\n <span>Are any of the Input</span>\n <code class=\"is-mx-1\">@id</code>\n <span>allowed to run this model</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"'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 </ng-container>\n\n <!-- Deprecated -->\n <ng-container *ngSwitchCase=\"'primary_product_id_allowed'\">\n <span>Is the current primary product</span>\n <code class=\"is-mx-1\">@id</code>\n <span>allowed to run this model</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"'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 </ng-container>\n\n <ng-container *ngSwitchCase=\"'geospatial_data'\">\n Has geospatial data necessary to run this model\n </ng-container>\n <ng-container *ngSwitchCase=\"'contains_geospatial_data'\">\n Has geospatial data necessary to run this model\n </ng-container>\n <ng-container *ngSwitchCase=\"'current_size'\">Current polygon area</ng-container>\n <ng-container *ngSwitchCase=\"'max_area_size'\">Maximum polygon area to run this model</ng-container>\n <ng-container *ngSwitchCase=\"'below_max_area_size'\">Polygon below the maximum area</ng-container>\n <ng-container *ngSwitchCase=\"'region_factor'\">Factor from region lookup</ng-container>\n\n <ng-container *ngSwitchCase=\"'has_pesticides_inputs'\">\n <span>Cycle contains</span>\n <code class=\"is-mx-1\">pesticideAI</code>\n <span>Inputs</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"'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 </ng-container>\n\n <ng-container *ngSwitchCase=\"'has_crop_residue_burnt'\">\n <code class=\"is-mr-1\">aboveGroundCropResidueBurnt</code>\n <span>is present as Product</span>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'liquid_slurry_sludge_P'\">Liquid, Slurry, and Sludge P</ng-container>\n </ng-container>\n </ng-template>\n\n <ng-container *ngIf=\"parseLogCompleteness(key); let completeness; else: defaultMessage\">\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 </ng-container>\n </span>\n <he-clipboard\n class=\"is-inline-block is-align-middle\"\n clipboardClass=\"is-size-7 is-p-1\"\n [icon]=\"['far', 'clone']\"\n [value]=\"key\"\n [hideText]=\"true\"></he-clipboard>\n </td>\n <td>\n <ng-template #singleValue>\n <ng-container *ngTemplateOutlet=\"logLineValue; context: { key, value }\"></ng-container>\n </ng-template>\n <div *ngIf=\"logValueArray(value); let valueArray; else: singleValue\">\n <table class=\"table is-dark is-bordered is-striped\">\n <thead *ngIf=\"valueArray[0] | isObject\">\n <tr>\n <th class=\"has-text-white\" *ngFor=\"let v of valueArray[0] | keys\">{{ v.key }}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let v of valueArray\">\n <ng-template #singleArrayValue>\n <td>{{ v }}</td>\n </ng-template>\n <ng-container *ngIf=\"v | isObject; else singleArrayValue\">\n <td *ngFor=\"let vv of v | keys\">{{ vv.value }}</td>\n </ng-container>\n </tr>\n </tbody>\n </table>\n </div>\n </td>\n </tr>\n</ng-template>\n\n<ng-template #logStatusDetails let-model=\"model\" let-data=\"data\">\n <ng-container *bindOnce=\"model\">\n <div class=\"is-mb-2\">\n <span>Status:</span>\n <span class=\"is-pl-1\">{{ model.status }}</span>\n </div>\n\n <ng-container *ngIf=\"model.status === LogStatus.notRequired && model.logs?.is_not_relevant === 'True'\">\n <ul class=\"is-pl-3 is-list-style-disc\">\n <li *ngIf=\"model.logs.logs?.siteType_allowed === 'False'\">\n The\n <code class=\"is-mx-1\">site.siteType</code>\n is not relevant.\n </li>\n <li *ngIf=\"model.logs.logs?.product_id_allowed === 'False'\">\n None of the\n <code class=\"is-mx-1\">Product</code>\n <code class=\"is-mr-1\">term.@id</code>\n is relevant.\n </li>\n <li *ngIf=\"model.logs.logs?.product_termType_allowed === 'False'\">\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 <li *ngIf=\"model.logs.logs?.input_id_allowed === 'False'\">\n None of the\n <code class=\"is-mx-1\">Input</code>\n <code class=\"is-mr-1\">term.@id</code>\n is relevant.\n </li>\n <li *ngIf=\"model.logs.logs?.input_termType_allowed === 'False'\">\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 </ul>\n </ng-container>\n\n <ng-container\n *ngIf=\"model.logs && model.status !== LogStatus.notRequired && model.status !== LogStatus.skipHierarchy\">\n <ul class=\"is-pl-3 is-list-style-disc\">\n <ng-template #showRunOrchestrator>\n <li class=\"is-run-orchestrator\">\n <p *ngIf=\"model.logs?.shouldRun\">All the requirements were met to run the model.</p>\n <ng-container *ngIf=\"!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 </ng-container>\n <ng-container *ngIf=\"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 </ng-container>\n </li>\n </ng-template>\n\n <li\n class=\"is-no-run-orchestrator\"\n *ngIf=\"model.logs?.shouldRunOrchestrator === false; else showRunOrchestrator\">\n <ng-container *ngIf=\"!model.logs.runRequired\">\n <span class=\"is-run-node-type-not-allowed\" *ngIf=\"model.logs.logs?.node_type_allowed === 'False'\">\n This model should not run for {{ nodeType() | pluralize: 0 }}\n </span>\n </ng-container>\n\n <ng-template #runNoConfig>\n <span class=\"is-run-not-empty\" *ngIf=\"model.logs.logs?.is_empty === 'False'\">\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 </ng-template>\n\n <ng-container *ngIf=\"model.config; else runNoConfig\">\n <p class=\"is-run-strategy-{{ model.config.runStrategy }}\" [ngSwitch]=\"model.config.runStrategy\">\n <span *ngSwitchCase=\"'always'\"></span>\n <span *ngSwitchCase=\"'add_key_if_missing'\">We only gap-fill this key if not present</span>\n <span *ngSwitchCase=\"'add_blank_node_if_missing'\">We only gap-fill this Blank Node if not present.</span>\n </p>\n\n <p class=\"is-mt-1\">\n <span\n class=\"is-run-with-measured\"\n *ngIf=\"\n model.config.runArgs?.runNonMeasured && hasMethodTier(data.original, EmissionMethodTier.measured)\n \">\n The\n <code class=\"is-mx-1\">{{ model.config.value }}</code>\n was reported as measured.\n </span>\n </p>\n </ng-container>\n </li>\n\n <li *ngIf=\"model.logs?.replaceLowerTier !== undefined\">\n <span>\n The recalculated\n <b>methodTier</b>\n was\n </span>\n <span class=\"is-pl-1 is-underlined\" *ngIf=\"!model.logs.replaceLowerTier\">lower than</span>\n <span class=\"is-pl-1 is-underlined\" *ngIf=\"model.logs.replaceLowerTier\">higher than or equal to</span>\n <span class=\"is-pl-1\">\n the original\n <b>methodTier</b>\n .\n </span>\n </li>\n\n <li class=\"is-merge-replaceLowerTier\" *ngIf=\"model.logs.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 <ng-container *ngIf=\"model.config?.mergeArgs\">\n <span class=\"is-underlined\" *ngIf=\"!model.logs.replaceThreshold\">less than</span>\n <span class=\"is-underlined\" *ngIf=\"model.logs.replaceThreshold\">more than or equal to</span>\n <b class=\"is-pl-1\">{{ model.config.mergeArgs.replaceThreshold[1] * 100 }}%</b>\n </ng-container>\n <ng-container *ngIf=\"!model.config?.mergeArgs\">\n <span class=\"is-underlined\" *ngIf=\"!model.logs.replaceThreshold\">not sufficiently</span>\n <span class=\"is-underlined\" *ngIf=\"model.logs.replaceThreshold\">sufficiently</span>\n </ng-container>\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 </ul>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #docsLink let-model>\n <a [href]=\"model.apiDocsPath || model.docPath || model.path\" target=\"_blank\" (click)=\"$event.stopPropagation()\">\n <span>Docs</span>\n <fa-icon class=\"ml-1\" icon=\"external-link-alt\" size=\"sm\"></fa-icon>\n </a>\n</ng-template>\n", styles: [":host{display:block}::ng-deep .table{background-color:transparent}::ng-deep .table td he-node-link{width:190px}@media screen and (max-width: 768px){::ng-deep .table td he-node-link{width:150px}}::ng-deep .table td .open-node+he-node-link{width:170px}@media screen and (max-width: 768px){::ng-deep .table td .open-node+he-node-link{width:130px}}::ng-deep .table td.has-border-right{box-shadow:1px 0 #6c8093}::ng-deep .table .has-sub-rows.is-open>td:first-child:before,::ng-deep .table .is-sub-row>td:first-child:before{display:block;position:absolute;content:\" \";background-color:#6c809333;height:100%;width:1px;top:0;left:12px}::ng-deep .table .has-sub-rows.is-open>td:first-child:before{top:25px}::ng-deep .table .popover-body .table-container{max-height:260px;overflow-y:auto}::ng-deep .copy-log he-clipboard{visibility:hidden}::ng-deep .copy-log:hover he-clipboard{visibility:visible}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgbTypeahead, selector: "input[ngbTypeahead]", inputs: ["autocomplete", "container", "editable", "focusFirst", "inputFormatter", "ngbTypeahead", "resultFormatter", "resultTemplate", "selectOnExact", "showHint", "placement", "popperOptions", "popupClass"], outputs: ["selectItem"], exportAs: ["ngbTypeahead"] }, { kind: "directive", type: i6.NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "ngbPopover", "popoverTitle", "placement", "popperOptions", "triggers", "positionTarget", "container", "disablePopover", "popoverClass", "popoverContext", "openDelay", "closeDelay"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }, { kind: "component", type: i7.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { kind: "directive", type: i8.BindOnceDirective, selector: "[bindOnce]", inputs: ["bindOnce"] }, { kind: "component", type: i9.BlankNodeValueDeltaComponent, selector: "he-blank-node-value-delta", inputs: ["value", "originalValue", "displayType"] }, { kind: "component", type: i10.ClipboardComponent, selector: "he-clipboard", inputs: ["value", "disabled", "hideText", "icon", "size", "rotate", "clipboardClass"] }, { kind: "component", type: i11.DataTableComponent, selector: "he-data-table", inputs: ["minHeight", "maxHeight", "small"] }, { kind: "component", type: i12.NodeLinkComponent, selector: "he-node-link", inputs: ["node", "showExternalLink", "linkClass"] }, { kind: "pipe", type: i13.CompoundPipe, name: "compound" }, { kind: "pipe", type: i14.DefaultPipe, name: "default" }, { kind: "pipe", type: i15.KeysPipe, name: "keys" }, { kind: "pipe", type: i16.PluralizePipe, name: "pluralize" }, { kind: "pipe", type: i17.KeyToLabelPipe, name: "keyToLabel" }, { kind: "pipe", type: i18.PrecisionPipe, name: "precision" }, { kind: "pipe", type: i19.TimesPipe, name: "times" }, { kind: "pipe", type: i20.IsArrayPipe, name: "isArray" }, { kind: "pipe", type: i21.IsObjectPipe, name: "isObject" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
335
335
  }
336
336
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.8", ngImport: i0, type: NodeLogsModelsComponent, decorators: [{
337
337
  type: Component,
338
- args: [{ selector: 'he-node-logs-models', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"px-3 pb-3\">\n <div class=\"has-text-right is-mb-2\" *ngIf=\"!isExternal && logsUrl()\">\n <a class=\"is-size-7\" [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 <he-data-table class=\"mb-1 is-small\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-fullwidth is-narrow is-striped\">\n <thead>\n <tr>\n <th class=\"width-auto has-border-right\">\n <div class=\"field\" *ngIf=\"enableFilterByTerm()\">\n <div class=\"control is-expanded has-icons-right\">\n <input\n class=\"input search-input is-small\"\n [ngModel]=\"term()\"\n name=\"term\"\n placeholder=\"Select entry by name\"\n [ngbTypeahead]=\"suggestTerm\"\n [focusFirst]=\"true\"\n (focus)=\"typeaheadFocus($event)\"\n (selectItem)=\"termChanged($event.item)\" />\n <a class=\"icon is-small is-right\" [class.is-hidden]=\"!term()\" (click)=\"termChanged('')\">\n <fa-icon icon=\"times\"></fa-icon>\n </a>\n </div>\n </div>\n </th>\n <th *ngIf=\"isBlankNodes()\">\n <span class=\"is-pr-1\">Units</span>\n <span>(per&nbsp;</span>\n <span [ngSwitch]=\"functionalUnit()\">\n <ng-container *ngSwitchCase=\"CycleFunctionalUnit['1 ha']\">hectare</ng-container>\n <ng-container *ngSwitchDefault>kg product</ng-container>\n </span>\n <span>)</span>\n </th>\n <th>Original</th>\n <th>Recalculated</th>\n <th *ngIf=\"isBlankNodes()\">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 class=\"has-text-centered\" colspan=\"6\">\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 <tr *ngIf=\"!loading && blankNodes().length === 0\">\n <td class=\"has-text-centered\" colspan=\"6\">\n <span>{{ _noDataMessage() || 'No data' }}</span>\n </td>\n </tr>\n <ng-container *ngFor=\"let blankNode of blankNodes(); trackBy: trackByBlankNode\">\n <tr [class.has-sub-rows]=\"blankNode.canOpen\" [class.is-open]=\"blankNode.isOpen\">\n <td class=\"width-auto has-border-right is-nowrap\" [attr.title]=\"blankNode.term?.name || blankNode.key\">\n <a\n class=\"is-inline-block is-align-top pr-2 open-node\"\n (click)=\"blankNode.isOpen = !blankNode.isOpen\"\n *ngIf=\"blankNode.canOpen\">\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 is-pre-wrap\" *ngIf=\"blankNode.term\" [node]=\"blankNode.term\">\n <span [innerHtml]=\"blankNode.term.name | compound\"></span>\n </he-node-link>\n <ng-template #showBlankNodeKey>\n <span>{{ blankNode.key }}</span>\n </ng-template>\n <ng-container *ngIf=\"blankNode.key; else showBlankNodeKey\">\n <a\n *ngIf=\"_nodeKey() === 'completeness'\"\n [href]=\"baseUrl + '/schema/Completeness#' + blankNode.key\"\n target=\"_blank\">\n <span>{{ blankNode.key | keyToLabel }}</span>\n </a>\n </ng-container>\n </td>\n <td *ngIf=\"isBlankNodes()\">\n <span class=\"is-nowrap\" [innerHtml]=\"blankNode.term?.units | compound\"></span>\n </td>\n <td>\n <ng-template #defaultOriginalValue>\n <span>{{ blankNode.originalValue | precision: 3 | default: '-' }}</span>\n </ng-template>\n <ng-container *ngIf=\"blankNode.allParallel; else defaultOriginalValue\">\n <div *ngFor=\"let model of blankNode.configModels[0]\">\n {{ blankNode.originalValueByMethodId[model.methodId] | precision: 3 | default: '-' }}\n </div>\n </ng-container>\n </td>\n <td>\n <ng-container *ngIf=\"!blankNode.isOriginal || blankNode.isRecalculated; else notRecalculated\">\n <ng-template #defaultRecalculatedValue>\n <span>{{ blankNode.recalculatedValue | precision: 3 | default: '-' }}</span>\n </ng-template>\n <ng-container *ngIf=\"blankNode.allParallel; else defaultRecalculatedValue\">\n <div *ngFor=\"let model of blankNode.configModels[0]\">\n {{ blankNode.recalculatedValueByMethodId[model.methodId] | precision: 3 | default: '-' }}\n </div>\n </ng-container>\n </ng-container>\n </td>\n <td *ngIf=\"isBlankNodes()\" class=\"is-nowrap\">\n <ng-template #defaultDeltaValue>\n <he-blank-node-value-delta\n *ngIf=\"blankNode.original.length && blankNode.isRecalculated; else noValue\"\n [value]=\"blankNode.recalculatedValue\"\n [originalValue]=\"blankNode.originalValue\"></he-blank-node-value-delta>\n </ng-template>\n <ng-container *ngIf=\"blankNode.allParallel; else defaultDeltaValue\">\n <div *ngFor=\"let model of blankNode.configModels[0]\">\n <he-blank-node-value-delta\n *ngIf=\"\n blankNode.originalValueByMethodId[model.methodId] !== null &&\n blankNode.recalculatedValueByMethodId[model.methodId] !== null;\n else noValue\n \"\n [value]=\"blankNode.recalculatedValueByMethodId[model.methodId]\"\n [originalValue]=\"blankNode.originalValueByMethodId[model.methodId]\"></he-blank-node-value-delta>\n </div>\n </ng-container>\n </td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: { data: blankNode }\"></ng-container>\n </tr>\n\n <tr\n *ngFor=\"let subValue of blankNode.keys\"\n [class.is-hidden]=\"!blankNode.isOpen\"\n [class.has-sub-rows]=\"blankNode.subValues?.length\"\n [class.is-sub-row]=\"blankNode.canOpen\">\n <td class=\"width-auto has-border-right is-nowrap\">\n <span class=\"is-inline-block is-align-top pl-3 pr-1 field-node\">Field:</span>\n\n <a\n class=\"is-inline-block is-pre-wrap\"\n *ngIf=\"blankNode.type\"\n [href]=\"baseUrl + '/schema/' + blankNode.type + '#' + subValue.key\"\n target=\"_blank\"\n [title]=\"subValue.key\">\n <span>{{ subValue.key }}</span>\n </a>\n <span class=\"is-inline-block is-align-top\" *ngIf=\"!blankNode.type\">{{ subValue.key }}</span>\n </td>\n <td *ngIf=\"isBlankNodes()\"></td>\n <td>\n <span *ngIf=\"subValue.originalValue !== null; else noValue\">\n {{ subValue.originalValue | precision: 3 | default: '-' }}\n </span>\n </td>\n <td>\n <span *ngIf=\"subValue.isRecalculated || subValue.key === 'impactAssessment'; else notRecalculated\">\n {{ subValue.recalculatedValue | precision: 3 | default: '-' }}\n </span>\n </td>\n <td *ngIf=\"isBlankNodes()\">-</td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: { data: subValue }\"></ng-container>\n </tr>\n\n <tr\n *ngFor=\"let subValue of blankNode.subValues\"\n [class.is-hidden]=\"!blankNode.isOpen\"\n [class.is-sub-row]=\"blankNode.canOpen\">\n <td class=\"width-auto has-border-right\">\n <span class=\"is-inline-block is-align-top pl-3\">{{ subValue.key | keyToLabel }}</span>\n\n <ng-container *ngIf=\"subValue.id\">\n <span class=\"is-inline-block\" class=\"is-inline-block is-align-top pr-1\">:</span>\n\n <ng-container [ngSwitch]=\"subValue.key\">\n <span class=\"is-inline-block\" *ngSwitchCase=\"'backgroundData'\">{{ subValue.id | keyToLabel }}</span>\n <he-node-link\n *ngSwitchDefault\n class=\"is-block pl-4\"\n [node]=\"termById(subValue.id)\"\n [attr.title]=\"termById(subValue.id).name\">\n <span [innerHtml]=\"termById(subValue.id).name | compound\"></span>\n </he-node-link>\n </ng-container>\n </ng-container>\n </td>\n <td *ngIf=\"isBlankNodes()\">\n <span class=\"is-nowrap\" *ngIf=\"subValue.showUnits\" [innerHtml]=\"blankNode.term?.units | compound\"></span>\n </td>\n <td>\n <span *ngIf=\"subValue.originalValue !== null; else noValue\">\n {{ subValue.originalValue | precision: 3 | default: '-' }}\n </span>\n </td>\n <td>\n <span *ngIf=\"subValue.isRecalculated; else notRecalculated\">\n {{ subValue.recalculatedValue | precision: 3 | default: '-' }}\n </span>\n </td>\n <td *ngIf=\"isBlankNodes()\">-</td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: { data: subValue }\"></ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </he-data-table>\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\" (click)=\"showLegend = !showLegend\">\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 <ng-container *ngFor=\"let status of LogStatus | keys\">\n <li *ngIf=\"logIcon[status.value]\" class=\"has-text-{{ logColor[status.value] }}\">\n <fa-icon [icon]=\"logIcon[status.value]\"></fa-icon>\n <span class=\"pl-1\">{{ status.value }}</span>\n </li>\n </ng-container>\n </ul>\n </div>\n <div class=\"column has-text-right\" *ngIf=\"filteredType()\">\n <label class=\"is-inline-block checkbox\">\n <input\n type=\"checkbox\"\n class=\"selector\"\n [ngModel]=\"onlyRequired\"\n (change)=\"onlyRequiredChanged($event.target.checked)\"\n [disabled]=\"!!term()\" />\n <span class=\"ml-2\">\n Show only {{ filteredType() | pluralize }} included in the default Hestia system boundary\n </span>\n </label>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #blankNodeModels let-data=\"data\">\n <ng-template #notInSystemBoundary>\n <td [attr.colspan]=\"methodModelsCount()\">\n <span>Not in Hestia system boundary</span>\n </td>\n </ng-template>\n\n <ng-container *ngIf=\"isSystemBoundary(data); else noValue\">\n <td class=\"blank-node-index-{{ i }}\" *ngFor=\"let c of methodModelsCount() | times; let i = index\">\n <ng-container *ngIf=\"getModelsAt(data, i); let models; else: noValue\">\n <ng-template #modelSerie>\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: { model: models, data }\"></ng-container>\n </ng-template>\n <div *ngIf=\"models | isArray; else modelSerie\">\n <p *ngFor=\"let model of models\">\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: { model, data }\"></ng-container>\n </p>\n </div>\n </ng-container>\n </td>\n </ng-container>\n</ng-template>\n\n<ng-template #blankNodeModel let-model=\"model\" let-data=\"data\">\n <span\n class=\"is-nowrap\"\n [class.trigger-popover]=\"model.showLogs\"\n [ngbPopover]=\"logDetails\"\n [autoClose]=\"'outside'\"\n popoverClass=\"is-narrow\"\n triggers=\"manual\"\n #p=\"ngbPopover\"\n placement=\"left\"\n container=\"body\"\n (click)=\"p.isOpen() ? p.close() : model.showLogs ? p.open({ logs: model.logs }) : null\">\n <span class=\"is-capitalized\">{{ methodName(model) }}</span>\n <span class=\"pl-1\" *ngIf=\"model.logs?.methodTier || model.model?.methodTier\">\n [{{ model.logs?.methodTier || model.model?.methodTier }}]\n </span>\n\n <span\n class=\"pl-1 has-text-{{ logColor[model.status] }} trigger-popover\"\n [ngbPopover]=\"logStatusDetails\"\n [autoClose]=\"'outside'\"\n popoverClass=\"is-narrow\"\n triggers=\"manual\"\n #p1=\"ngbPopover\"\n placement=\"left\"\n container=\"body\"\n (click)=\"$event.stopPropagation(); p1.isOpen() ? p1.close() : p1.open({ model, data })\">\n <fa-icon [icon]=\"logIcon[model.status]\"></fa-icon>\n </span>\n\n <span class=\"pl-1\" *ngIf=\"model.model\">\n (\n <ng-container *ngTemplateOutlet=\"docsLink; context: { $implicit: model.model }\"></ng-container>\n )\n </span>\n </span>\n</ng-template>\n\n<ng-template #noValue>-</ng-template>\n\n<ng-template #notRecalculated>not recalculated</ng-template>\n\n<ng-template #logDetails let-logs=\"logs\">\n <div class=\"table-container\" *bindOnce=\"logs\">\n <table class=\"table is-dark is-fullwidth\">\n <tbody>\n <ng-container *ngIf=\"logs?.requirements\">\n <ng-container *ngFor=\"let key of requirementKeys(logs.requirements)\">\n <ng-container *ngTemplateOutlet=\"logLine; context: { key, value: logs.requirements[key] }\"></ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"logs?.logs\">\n <ng-container *ngFor=\"let key of logs.logs | keys\">\n <ng-container *ngTemplateOutlet=\"logLine; context: key\"></ng-container>\n </ng-container>\n </ng-container>\n </tbody>\n </table>\n </div>\n\n <ng-container *bindOnce=\"logs\">\n <div class=\"it-mt-2\" *ngIf=\"logs?.missingLookups?.length\">\n <p>Optional data missing:</p>\n\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 <tr *ngFor=\"let data of logs.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 </div>\n </ng-container>\n</ng-template>\n\n<ng-template #logLineValue let-key=\"key\" let-value=\"value\">\n <ng-template #defaultValue>\n <span class=\"is-inline-block is-align-middle\">{{ value }}</span>\n </ng-template>\n <ng-container *ngIf=\"requirementLinkedNode(key, value); let linkedNode; else: defaultValue\">\n <he-node-link\n class=\"is-inline-block is-align-middle\"\n linkClass=\"is-dark\"\n [node]=\"linkedNode\"\n [showExternalLink]=\"true\"></he-node-link>\n </ng-container>\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 <ng-template #defaultMessage>\n <ng-container [ngSwitch]=\"key\">\n <ng-container *ngSwitchDefault>{{ key | keyToLabel }}</ng-container>\n\n <ng-container *ngSwitchCase=\"'property_id'\">Property Term @id</ng-container>\n <ng-container *ngSwitchCase=\"'product_id'\">Product Term @id</ng-container>\n <ng-container *ngSwitchCase=\"'input_id'\">Input Term @id</ng-container>\n\n <ng-container *ngSwitchCase=\"'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 </ng-container>\n <ng-container *ngSwitchCase=\"'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 </ng-container>\n <ng-container *ngSwitchCase=\"'product_id_allowed'\">\n <span>Are any of the Product</span>\n <code class=\"is-mx-1\">@id</code>\n <span>allowed to run this model</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"'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 </ng-container>\n <ng-container *ngSwitchCase=\"'input_id_allowed'\">\n <span>Are any of the Input</span>\n <code class=\"is-mx-1\">@id</code>\n <span>allowed to run this model</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"'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 </ng-container>\n\n <!-- Deprecated -->\n <ng-container *ngSwitchCase=\"'primary_product_id_allowed'\">\n <span>Is the current primary product</span>\n <code class=\"is-mx-1\">@id</code>\n <span>allowed to run this model</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"'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 </ng-container>\n\n <ng-container *ngSwitchCase=\"'geospatial_data'\">\n Has geospatial data necessary to run this model\n </ng-container>\n <ng-container *ngSwitchCase=\"'contains_geospatial_data'\">\n Has geospatial data necessary to run this model\n </ng-container>\n <ng-container *ngSwitchCase=\"'current_size'\">Current polygon area</ng-container>\n <ng-container *ngSwitchCase=\"'max_area_size'\">Maximum polygon area to run this model</ng-container>\n <ng-container *ngSwitchCase=\"'below_max_area_size'\">Polygon below the maximum area</ng-container>\n <ng-container *ngSwitchCase=\"'region_factor'\">Factor from region lookup</ng-container>\n\n <ng-container *ngSwitchCase=\"'has_pesticides_inputs'\">\n <span>Cycle contains</span>\n <code class=\"is-mx-1\">pesticideAI</code>\n <span>Inputs</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"'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 </ng-container>\n\n <ng-container *ngSwitchCase=\"'has_crop_residue_burnt'\">\n <code class=\"is-mr-1\">aboveGroundCropResidueBurnt</code>\n <span>is present as Product</span>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'liquid_slurry_sludge_P'\">Liquid, Slurry, and Sludge P</ng-container>\n </ng-container>\n </ng-template>\n\n <ng-container *ngIf=\"parseLogCompleteness(key); let completeness; else: defaultMessage\">\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 </ng-container>\n </span>\n <he-clipboard\n class=\"is-inline-block is-align-middle\"\n clipboardClass=\"is-size-7 is-p-1\"\n [icon]=\"['far', 'clone']\"\n [value]=\"key\"\n [hideText]=\"true\"></he-clipboard>\n </td>\n <td>\n <ng-template #singleValue>\n <ng-container *ngTemplateOutlet=\"logLineValue; context: { key, value }\"></ng-container>\n </ng-template>\n <div *ngIf=\"logValueArray(value); let valueArray; else: singleValue\">\n <table class=\"table is-dark is-bordered is-striped\">\n <thead *ngIf=\"valueArray[0] | isObject\">\n <tr>\n <th class=\"has-text-white\" *ngFor=\"let v of valueArray[0] | keys\">{{ v.key }}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let v of valueArray\">\n <ng-template #singleArrayValue>\n <td>{{ v }}</td>\n </ng-template>\n <ng-container *ngIf=\"v | isObject; else singleArrayValue\">\n <td *ngFor=\"let vv of v | keys\">{{ vv.value }}</td>\n </ng-container>\n </tr>\n </tbody>\n </table>\n </div>\n </td>\n </tr>\n</ng-template>\n\n<ng-template #logStatusDetails let-model=\"model\" let-data=\"data\">\n <ng-container *bindOnce=\"model\">\n <div class=\"is-mb-2\">\n <span>Status:</span>\n <span class=\"is-pl-1\">{{ model.status }}</span>\n </div>\n\n <ng-container *ngIf=\"model.status === LogStatus.notRequired && model.logs?.is_not_relevant === 'True'\">\n <ul class=\"is-pl-3 is-list-style-disc\">\n <li *ngIf=\"model.logs.logs?.siteType_allowed === 'False'\">\n The\n <code class=\"is-mx-1\">site.siteType</code>\n is not relevant.\n </li>\n <li *ngIf=\"model.logs.logs?.product_id_allowed === 'False'\">\n None of the\n <code class=\"is-mx-1\">Product</code>\n <code class=\"is-mr-1\">term.@id</code>\n is relevant.\n </li>\n <li *ngIf=\"model.logs.logs?.product_termType_allowed === 'False'\">\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 <li *ngIf=\"model.logs.logs?.input_id_allowed === 'False'\">\n None of the\n <code class=\"is-mx-1\">Input</code>\n <code class=\"is-mr-1\">term.@id</code>\n is relevant.\n </li>\n <li *ngIf=\"model.logs.logs?.input_termType_allowed === 'False'\">\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 </ul>\n </ng-container>\n\n <ng-container\n *ngIf=\"model.logs && model.status !== LogStatus.notRequired && model.status !== LogStatus.skipHierarchy\">\n <ul class=\"is-pl-3 is-list-style-disc\">\n <ng-template #showRunOrchestrator>\n <li class=\"is-run-orchestrator\">\n <p *ngIf=\"model.logs?.shouldRun\">All the requirements were met to run the model.</p>\n <ng-container *ngIf=\"!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 </ng-container>\n <ng-container *ngIf=\"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 </ng-container>\n </li>\n </ng-template>\n\n <li\n class=\"is-no-run-orchestrator\"\n *ngIf=\"model.logs?.shouldRunOrchestrator === false; else showRunOrchestrator\">\n <ng-container *ngIf=\"!model.logs.runRequired\">\n <span class=\"is-run-node-type-not-allowed\" *ngIf=\"model.logs.logs?.node_type_allowed === 'False'\">\n This model should not run for {{ nodeType() | pluralize: 0 }}\n </span>\n </ng-container>\n\n <ng-template #runNoConfig>\n <span class=\"is-run-not-empty\" *ngIf=\"model.logs.logs?.is_empty === 'False'\">\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 </ng-template>\n\n <ng-container *ngIf=\"model.config; else runNoConfig\">\n <p class=\"is-run-strategy-{{ model.config.runStrategy }}\" [ngSwitch]=\"model.config.runStrategy\">\n <span *ngSwitchCase=\"'always'\"></span>\n <span *ngSwitchCase=\"'add_key_if_missing'\">We only gap-fill this key if not present</span>\n <span *ngSwitchCase=\"'add_blank_node_if_missing'\">We only gap-fill this Blank Node if not present.</span>\n </p>\n\n <p class=\"is-mt-1\">\n <span\n class=\"is-run-with-measured\"\n *ngIf=\"\n model.config.runArgs?.runNonMeasured && hasMethodTier(data.original, EmissionMethodTier.measured)\n \">\n The\n <code class=\"is-mx-1\">{{ model.config.value }}</code>\n was reported as measured.\n </span>\n </p>\n </ng-container>\n </li>\n\n <li *ngIf=\"model.logs?.replaceLowerTier !== undefined\">\n <span>\n The recalculated\n <b>methodTier</b>\n was\n </span>\n <span class=\"is-pl-1 is-underlined\" *ngIf=\"!model.logs.replaceLowerTier\">lower than</span>\n <span class=\"is-pl-1 is-underlined\" *ngIf=\"model.logs.replaceLowerTier\">higher than or equal to</span>\n <span class=\"is-pl-1\">\n the original\n <b>methodTier</b>\n .\n </span>\n </li>\n\n <li class=\"is-merge-replaceLowerTier\" *ngIf=\"model.logs.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 <ng-container *ngIf=\"model.config?.mergeArgs\">\n <span class=\"is-underlined\" *ngIf=\"!model.logs.replaceThreshold\">less than</span>\n <span class=\"is-underlined\" *ngIf=\"model.logs.replaceThreshold\">more than or equal to</span>\n <b class=\"is-pl-1\">{{ model.config.mergeArgs.replaceThreshold[1] * 100 }}%</b>\n </ng-container>\n <ng-container *ngIf=\"!model.config?.mergeArgs\">\n <span class=\"is-underlined\" *ngIf=\"!model.logs.replaceThreshold\">not sufficiently</span>\n <span class=\"is-underlined\" *ngIf=\"model.logs.replaceThreshold\">sufficiently</span>\n </ng-container>\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 </ul>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #docsLink let-model>\n <a [href]=\"model.apiDocsPath || model.docPath || model.path\" target=\"_blank\" (click)=\"$event.stopPropagation()\">\n <span>Docs</span>\n <fa-icon class=\"ml-1\" icon=\"external-link-alt\" size=\"sm\"></fa-icon>\n </a>\n</ng-template>\n", styles: [":host{display:block}::ng-deep .table{background-color:transparent}::ng-deep .table td he-node-link{width:190px}@media screen and (max-width: 768px){::ng-deep .table td he-node-link{width:150px}}::ng-deep .table td .open-node+he-node-link{width:170px}@media screen and (max-width: 768px){::ng-deep .table td .open-node+he-node-link{width:130px}}::ng-deep .table td.has-border-right{box-shadow:1px 0 #6c8093}::ng-deep .table .has-sub-rows.is-open>td:first-child:before,::ng-deep .table .is-sub-row>td:first-child:before{display:block;position:absolute;content:\" \";background-color:#6c809333;height:100%;width:1px;top:0;left:12px}::ng-deep .table .has-sub-rows.is-open>td:first-child:before{top:25px}::ng-deep .table .popover-body .table-container{max-height:260px;overflow-y:auto}::ng-deep .copy-log he-clipboard{visibility:hidden}::ng-deep .copy-log:hover he-clipboard{visibility:visible}\n"] }]
338
+ args: [{ selector: 'he-node-logs-models', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"px-3 pb-3\">\n <div class=\"has-text-right is-mb-2\" *ngIf=\"!isExternal && logsUrl()\">\n <a class=\"is-size-7\" [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 <he-data-table class=\"mb-1 is-small\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-fullwidth is-narrow is-striped\">\n <thead>\n <tr>\n <th class=\"width-auto has-border-right\">\n <div class=\"field\" *ngIf=\"enableFilterByTerm()\">\n <div class=\"control is-expanded has-icons-right\">\n <input\n class=\"input search-input is-small\"\n [ngModel]=\"term()\"\n name=\"term\"\n placeholder=\"Select entry by name\"\n [ngbTypeahead]=\"suggestTerm\"\n [focusFirst]=\"true\"\n (focus)=\"typeaheadFocus($event)\"\n (selectItem)=\"termChanged($event.item)\" />\n <a class=\"icon is-small is-right\" [class.is-hidden]=\"!term()\" (click)=\"termChanged('')\">\n <fa-icon icon=\"times\"></fa-icon>\n </a>\n </div>\n </div>\n </th>\n <th *ngIf=\"isBlankNodes()\">\n <span class=\"is-pr-1\">Units</span>\n <span>(per&nbsp;</span>\n <span [ngSwitch]=\"functionalUnit()\">\n <ng-container *ngSwitchCase=\"CycleFunctionalUnit['1 ha']\">hectare</ng-container>\n <ng-container *ngSwitchDefault>kg product</ng-container>\n </span>\n <span>)</span>\n </th>\n <th>Original</th>\n <th>Recalculated</th>\n <th *ngIf=\"isBlankNodes()\">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 class=\"has-text-centered\" colspan=\"6\">\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 <tr *ngIf=\"!loading() && blankNodes().length === 0\">\n <td class=\"has-text-centered\" colspan=\"6\">\n <span>{{ _noDataMessage() || 'No data' }}</span>\n </td>\n </tr>\n <ng-container *ngFor=\"let blankNode of blankNodes(); trackBy: trackByBlankNode\">\n <tr [class.has-sub-rows]=\"blankNode.canOpen\" [class.is-open]=\"blankNode.isOpen\">\n <td class=\"width-auto has-border-right is-nowrap\" [attr.title]=\"blankNode.term?.name || blankNode.key\">\n <a\n class=\"is-inline-block is-align-top pr-2 open-node\"\n (click)=\"blankNode.isOpen = !blankNode.isOpen\"\n *ngIf=\"blankNode.canOpen\">\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 is-pre-wrap\" *ngIf=\"blankNode.term\" [node]=\"blankNode.term\">\n <span [innerHtml]=\"blankNode.term.name | compound\"></span>\n </he-node-link>\n <ng-template #showBlankNodeKey>\n <span>{{ blankNode.key }}</span>\n </ng-template>\n <ng-container *ngIf=\"blankNode.key; else showBlankNodeKey\">\n <a\n *ngIf=\"_nodeKey() === 'completeness'\"\n [href]=\"baseUrl + '/schema/Completeness#' + blankNode.key\"\n target=\"_blank\">\n <span>{{ blankNode.key | keyToLabel }}</span>\n </a>\n </ng-container>\n </td>\n <td *ngIf=\"isBlankNodes()\">\n <span class=\"is-nowrap\" [innerHtml]=\"blankNode.term?.units | compound\"></span>\n </td>\n <td>\n <ng-template #defaultOriginalValue>\n <span>{{ blankNode.originalValue | precision: 3 | default: '-' }}</span>\n </ng-template>\n <ng-container *ngIf=\"blankNode.allParallel; else defaultOriginalValue\">\n <div *ngFor=\"let model of blankNode.configModels[0]\">\n {{ blankNode.originalValueByMethodId[model.methodId] | precision: 3 | default: '-' }}\n </div>\n </ng-container>\n </td>\n <td>\n <ng-container *ngIf=\"!blankNode.isOriginal || blankNode.isRecalculated; else notRecalculated\">\n <ng-template #defaultRecalculatedValue>\n <span>{{ blankNode.recalculatedValue | precision: 3 | default: '-' }}</span>\n </ng-template>\n <ng-container *ngIf=\"blankNode.allParallel; else defaultRecalculatedValue\">\n <div *ngFor=\"let model of blankNode.configModels[0]\">\n {{ blankNode.recalculatedValueByMethodId[model.methodId] | precision: 3 | default: '-' }}\n </div>\n </ng-container>\n </ng-container>\n </td>\n <td *ngIf=\"isBlankNodes()\" class=\"is-nowrap\">\n <ng-template #defaultDeltaValue>\n <he-blank-node-value-delta\n *ngIf=\"blankNode.original.length && blankNode.isRecalculated; else noValue\"\n [value]=\"blankNode.recalculatedValue\"\n [originalValue]=\"blankNode.originalValue\"></he-blank-node-value-delta>\n </ng-template>\n <ng-container *ngIf=\"blankNode.allParallel; else defaultDeltaValue\">\n <div *ngFor=\"let model of blankNode.configModels[0]\">\n <he-blank-node-value-delta\n *ngIf=\"\n blankNode.originalValueByMethodId[model.methodId] !== null &&\n blankNode.recalculatedValueByMethodId[model.methodId] !== null;\n else noValue\n \"\n [value]=\"blankNode.recalculatedValueByMethodId[model.methodId]\"\n [originalValue]=\"blankNode.originalValueByMethodId[model.methodId]\"></he-blank-node-value-delta>\n </div>\n </ng-container>\n </td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: { data: blankNode }\"></ng-container>\n </tr>\n\n <tr\n *ngFor=\"let subValue of blankNode.keys\"\n [class.is-hidden]=\"!blankNode.isOpen\"\n [class.has-sub-rows]=\"blankNode.subValues?.length\"\n [class.is-sub-row]=\"blankNode.canOpen\">\n <td class=\"width-auto has-border-right is-nowrap\">\n <span class=\"is-inline-block is-align-top pl-3 pr-1 field-node\">Field:</span>\n\n <a\n class=\"is-inline-block is-pre-wrap\"\n *ngIf=\"blankNode.type\"\n [href]=\"baseUrl + '/schema/' + blankNode.type + '#' + subValue.key\"\n target=\"_blank\"\n [title]=\"subValue.key\">\n <span>{{ subValue.key }}</span>\n </a>\n <span class=\"is-inline-block is-align-top\" *ngIf=\"!blankNode.type\">{{ subValue.key }}</span>\n </td>\n <td *ngIf=\"isBlankNodes()\"></td>\n <td>\n <span *ngIf=\"subValue.originalValue !== null; else noValue\">\n {{ subValue.originalValue | precision: 3 | default: '-' }}\n </span>\n </td>\n <td>\n <span *ngIf=\"subValue.isRecalculated || subValue.key === 'impactAssessment'; else notRecalculated\">\n {{ subValue.recalculatedValue | precision: 3 | default: '-' }}\n </span>\n </td>\n <td *ngIf=\"isBlankNodes()\">-</td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: { data: subValue }\"></ng-container>\n </tr>\n\n <tr\n *ngFor=\"let subValue of blankNode.subValues\"\n [class.is-hidden]=\"!blankNode.isOpen\"\n [class.is-sub-row]=\"blankNode.canOpen\">\n <td class=\"width-auto has-border-right\">\n <span class=\"is-inline-block is-align-top pl-3\">{{ subValue.key | keyToLabel }}</span>\n\n <ng-container *ngIf=\"subValue.id\">\n <span class=\"is-inline-block\" class=\"is-inline-block is-align-top pr-1\">:</span>\n\n <ng-container [ngSwitch]=\"subValue.key\">\n <span class=\"is-inline-block\" *ngSwitchCase=\"'backgroundData'\">{{ subValue.id | keyToLabel }}</span>\n <he-node-link\n *ngSwitchDefault\n class=\"is-block pl-4\"\n [node]=\"termById(subValue.id)\"\n [attr.title]=\"termById(subValue.id).name\">\n <span [innerHtml]=\"termById(subValue.id).name | compound\"></span>\n </he-node-link>\n </ng-container>\n </ng-container>\n </td>\n <td *ngIf=\"isBlankNodes()\">\n <span class=\"is-nowrap\" *ngIf=\"subValue.showUnits\" [innerHtml]=\"blankNode.term?.units | compound\"></span>\n </td>\n <td>\n <span *ngIf=\"subValue.originalValue !== null; else noValue\">\n {{ subValue.originalValue | precision: 3 | default: '-' }}\n </span>\n </td>\n <td>\n <span *ngIf=\"subValue.isRecalculated; else notRecalculated\">\n {{ subValue.recalculatedValue | precision: 3 | default: '-' }}\n </span>\n </td>\n <td *ngIf=\"isBlankNodes()\">-</td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: { data: subValue }\"></ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </he-data-table>\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\" (click)=\"showLegend = !showLegend\">\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 <ng-container *ngFor=\"let status of LogStatus | keys\">\n <li *ngIf=\"logIcon[status.value]\" class=\"has-text-{{ logColor[status.value] }}\">\n <fa-icon [icon]=\"logIcon[status.value]\"></fa-icon>\n <span class=\"pl-1\">{{ status.value }}</span>\n </li>\n </ng-container>\n </ul>\n </div>\n <div class=\"column has-text-right\" *ngIf=\"filteredType()\">\n <label class=\"is-inline-block checkbox\">\n <input\n type=\"checkbox\"\n class=\"selector\"\n [ngModel]=\"onlyRequired\"\n (change)=\"onlyRequiredChanged($event.target.checked)\"\n [disabled]=\"!!term()\" />\n <span class=\"ml-2\">\n Show only {{ filteredType() | pluralize }} included in the default Hestia system boundary\n </span>\n </label>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #blankNodeModels let-data=\"data\">\n <ng-template #notInSystemBoundary>\n <td [attr.colspan]=\"methodModelsCount()\">\n <span>Not in Hestia system boundary</span>\n </td>\n </ng-template>\n\n <ng-container *ngIf=\"isSystemBoundary(data); else noValue\">\n <td class=\"blank-node-index-{{ i }}\" *ngFor=\"let c of methodModelsCount() | times; let i = index\">\n <ng-container *ngIf=\"getModelsAt(data, i); let models; else: noValue\">\n <ng-template #modelSerie>\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: { model: models, data }\"></ng-container>\n </ng-template>\n <div *ngIf=\"models | isArray; else modelSerie\">\n <p *ngFor=\"let model of models\">\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: { model, data }\"></ng-container>\n </p>\n </div>\n </ng-container>\n </td>\n </ng-container>\n</ng-template>\n\n<ng-template #blankNodeModel let-model=\"model\" let-data=\"data\">\n <span\n class=\"is-nowrap\"\n [class.trigger-popover]=\"model.showLogs\"\n [ngbPopover]=\"logDetails\"\n [autoClose]=\"'outside'\"\n popoverClass=\"is-narrow\"\n triggers=\"manual\"\n #p=\"ngbPopover\"\n placement=\"left\"\n container=\"body\"\n (click)=\"p.isOpen() ? p.close() : model.showLogs ? p.open({ logs: model.logs }) : null\">\n <span class=\"is-capitalized\">{{ methodName(model) }}</span>\n <span class=\"pl-1\" *ngIf=\"model.logs?.methodTier || model.model?.methodTier\">\n [{{ model.logs?.methodTier || model.model?.methodTier }}]\n </span>\n\n <span\n class=\"pl-1 has-text-{{ logColor[model.status] }} trigger-popover\"\n [ngbPopover]=\"logStatusDetails\"\n [autoClose]=\"'outside'\"\n popoverClass=\"is-narrow\"\n triggers=\"manual\"\n #p1=\"ngbPopover\"\n placement=\"left\"\n container=\"body\"\n (click)=\"$event.stopPropagation(); p1.isOpen() ? p1.close() : p1.open({ model, data })\">\n <fa-icon [icon]=\"logIcon[model.status]\"></fa-icon>\n </span>\n\n <span class=\"pl-1\" *ngIf=\"model.model\">\n (\n <ng-container *ngTemplateOutlet=\"docsLink; context: { $implicit: model.model }\"></ng-container>\n )\n </span>\n </span>\n</ng-template>\n\n<ng-template #noValue>-</ng-template>\n\n<ng-template #notRecalculated>not recalculated</ng-template>\n\n<ng-template #logDetails let-logs=\"logs\">\n <div class=\"table-container\" *bindOnce=\"logs\">\n <table class=\"table is-dark is-fullwidth\">\n <tbody>\n <ng-container *ngIf=\"logs?.requirements\">\n <ng-container *ngFor=\"let key of requirementKeys(logs.requirements)\">\n <ng-container *ngTemplateOutlet=\"logLine; context: { key, value: logs.requirements[key] }\"></ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"logs?.logs\">\n <ng-container *ngFor=\"let key of logs.logs | keys\">\n <ng-container *ngTemplateOutlet=\"logLine; context: key\"></ng-container>\n </ng-container>\n </ng-container>\n </tbody>\n </table>\n </div>\n\n <ng-container *bindOnce=\"logs\">\n <div class=\"it-mt-2\" *ngIf=\"logs?.missingLookups?.length\">\n <p>Optional data missing:</p>\n\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 <tr *ngFor=\"let data of logs.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 </div>\n </ng-container>\n</ng-template>\n\n<ng-template #logLineValue let-key=\"key\" let-value=\"value\">\n <ng-template #defaultValue>\n <span class=\"is-inline-block is-align-middle\">{{ value }}</span>\n </ng-template>\n <ng-container *ngIf=\"requirementLinkedNode(key, value); let linkedNode; else: defaultValue\">\n <he-node-link\n class=\"is-inline-block is-align-middle\"\n linkClass=\"is-dark\"\n [node]=\"linkedNode\"\n [showExternalLink]=\"true\"></he-node-link>\n </ng-container>\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 <ng-template #defaultMessage>\n <ng-container [ngSwitch]=\"key\">\n <ng-container *ngSwitchDefault>{{ key | keyToLabel }}</ng-container>\n\n <ng-container *ngSwitchCase=\"'property_id'\">Property Term @id</ng-container>\n <ng-container *ngSwitchCase=\"'product_id'\">Product Term @id</ng-container>\n <ng-container *ngSwitchCase=\"'input_id'\">Input Term @id</ng-container>\n\n <ng-container *ngSwitchCase=\"'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 </ng-container>\n <ng-container *ngSwitchCase=\"'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 </ng-container>\n <ng-container *ngSwitchCase=\"'product_id_allowed'\">\n <span>Are any of the Product</span>\n <code class=\"is-mx-1\">@id</code>\n <span>allowed to run this model</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"'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 </ng-container>\n <ng-container *ngSwitchCase=\"'input_id_allowed'\">\n <span>Are any of the Input</span>\n <code class=\"is-mx-1\">@id</code>\n <span>allowed to run this model</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"'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 </ng-container>\n\n <!-- Deprecated -->\n <ng-container *ngSwitchCase=\"'primary_product_id_allowed'\">\n <span>Is the current primary product</span>\n <code class=\"is-mx-1\">@id</code>\n <span>allowed to run this model</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"'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 </ng-container>\n\n <ng-container *ngSwitchCase=\"'geospatial_data'\">\n Has geospatial data necessary to run this model\n </ng-container>\n <ng-container *ngSwitchCase=\"'contains_geospatial_data'\">\n Has geospatial data necessary to run this model\n </ng-container>\n <ng-container *ngSwitchCase=\"'current_size'\">Current polygon area</ng-container>\n <ng-container *ngSwitchCase=\"'max_area_size'\">Maximum polygon area to run this model</ng-container>\n <ng-container *ngSwitchCase=\"'below_max_area_size'\">Polygon below the maximum area</ng-container>\n <ng-container *ngSwitchCase=\"'region_factor'\">Factor from region lookup</ng-container>\n\n <ng-container *ngSwitchCase=\"'has_pesticides_inputs'\">\n <span>Cycle contains</span>\n <code class=\"is-mx-1\">pesticideAI</code>\n <span>Inputs</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"'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 </ng-container>\n\n <ng-container *ngSwitchCase=\"'has_crop_residue_burnt'\">\n <code class=\"is-mr-1\">aboveGroundCropResidueBurnt</code>\n <span>is present as Product</span>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'liquid_slurry_sludge_P'\">Liquid, Slurry, and Sludge P</ng-container>\n </ng-container>\n </ng-template>\n\n <ng-container *ngIf=\"parseLogCompleteness(key); let completeness; else: defaultMessage\">\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 </ng-container>\n </span>\n <he-clipboard\n class=\"is-inline-block is-align-middle\"\n clipboardClass=\"is-size-7 is-p-1\"\n [icon]=\"['far', 'clone']\"\n [value]=\"key\"\n [hideText]=\"true\"></he-clipboard>\n </td>\n <td>\n <ng-template #singleValue>\n <ng-container *ngTemplateOutlet=\"logLineValue; context: { key, value }\"></ng-container>\n </ng-template>\n <div *ngIf=\"logValueArray(value); let valueArray; else: singleValue\">\n <table class=\"table is-dark is-bordered is-striped\">\n <thead *ngIf=\"valueArray[0] | isObject\">\n <tr>\n <th class=\"has-text-white\" *ngFor=\"let v of valueArray[0] | keys\">{{ v.key }}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let v of valueArray\">\n <ng-template #singleArrayValue>\n <td>{{ v }}</td>\n </ng-template>\n <ng-container *ngIf=\"v | isObject; else singleArrayValue\">\n <td *ngFor=\"let vv of v | keys\">{{ vv.value }}</td>\n </ng-container>\n </tr>\n </tbody>\n </table>\n </div>\n </td>\n </tr>\n</ng-template>\n\n<ng-template #logStatusDetails let-model=\"model\" let-data=\"data\">\n <ng-container *bindOnce=\"model\">\n <div class=\"is-mb-2\">\n <span>Status:</span>\n <span class=\"is-pl-1\">{{ model.status }}</span>\n </div>\n\n <ng-container *ngIf=\"model.status === LogStatus.notRequired && model.logs?.is_not_relevant === 'True'\">\n <ul class=\"is-pl-3 is-list-style-disc\">\n <li *ngIf=\"model.logs.logs?.siteType_allowed === 'False'\">\n The\n <code class=\"is-mx-1\">site.siteType</code>\n is not relevant.\n </li>\n <li *ngIf=\"model.logs.logs?.product_id_allowed === 'False'\">\n None of the\n <code class=\"is-mx-1\">Product</code>\n <code class=\"is-mr-1\">term.@id</code>\n is relevant.\n </li>\n <li *ngIf=\"model.logs.logs?.product_termType_allowed === 'False'\">\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 <li *ngIf=\"model.logs.logs?.input_id_allowed === 'False'\">\n None of the\n <code class=\"is-mx-1\">Input</code>\n <code class=\"is-mr-1\">term.@id</code>\n is relevant.\n </li>\n <li *ngIf=\"model.logs.logs?.input_termType_allowed === 'False'\">\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 </ul>\n </ng-container>\n\n <ng-container\n *ngIf=\"model.logs && model.status !== LogStatus.notRequired && model.status !== LogStatus.skipHierarchy\">\n <ul class=\"is-pl-3 is-list-style-disc\">\n <ng-template #showRunOrchestrator>\n <li class=\"is-run-orchestrator\">\n <p *ngIf=\"model.logs?.shouldRun\">All the requirements were met to run the model.</p>\n <ng-container *ngIf=\"!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 </ng-container>\n <ng-container *ngIf=\"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 </ng-container>\n </li>\n </ng-template>\n\n <li\n class=\"is-no-run-orchestrator\"\n *ngIf=\"model.logs?.shouldRunOrchestrator === false; else showRunOrchestrator\">\n <ng-container *ngIf=\"!model.logs.runRequired\">\n <span class=\"is-run-node-type-not-allowed\" *ngIf=\"model.logs.logs?.node_type_allowed === 'False'\">\n This model should not run for {{ nodeType() | pluralize: 0 }}\n </span>\n </ng-container>\n\n <ng-template #runNoConfig>\n <span class=\"is-run-not-empty\" *ngIf=\"model.logs.logs?.is_empty === 'False'\">\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 </ng-template>\n\n <ng-container *ngIf=\"model.config; else runNoConfig\">\n <p class=\"is-run-strategy-{{ model.config.runStrategy }}\" [ngSwitch]=\"model.config.runStrategy\">\n <span *ngSwitchCase=\"'always'\"></span>\n <span *ngSwitchCase=\"'add_key_if_missing'\">We only gap-fill this key if not present</span>\n <span *ngSwitchCase=\"'add_blank_node_if_missing'\">We only gap-fill this Blank Node if not present.</span>\n </p>\n\n <p class=\"is-mt-1\">\n <span\n class=\"is-run-with-measured\"\n *ngIf=\"\n model.config.runArgs?.runNonMeasured && hasMethodTier(data.original, EmissionMethodTier.measured)\n \">\n The\n <code class=\"is-mx-1\">{{ model.config.value }}</code>\n was reported as measured.\n </span>\n </p>\n </ng-container>\n </li>\n\n <li *ngIf=\"model.logs?.replaceLowerTier !== undefined\">\n <span>\n The recalculated\n <b>methodTier</b>\n was\n </span>\n <span class=\"is-pl-1 is-underlined\" *ngIf=\"!model.logs.replaceLowerTier\">lower than</span>\n <span class=\"is-pl-1 is-underlined\" *ngIf=\"model.logs.replaceLowerTier\">higher than or equal to</span>\n <span class=\"is-pl-1\">\n the original\n <b>methodTier</b>\n .\n </span>\n </li>\n\n <li class=\"is-merge-replaceLowerTier\" *ngIf=\"model.logs.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 <ng-container *ngIf=\"model.config?.mergeArgs\">\n <span class=\"is-underlined\" *ngIf=\"!model.logs.replaceThreshold\">less than</span>\n <span class=\"is-underlined\" *ngIf=\"model.logs.replaceThreshold\">more than or equal to</span>\n <b class=\"is-pl-1\">{{ model.config.mergeArgs.replaceThreshold[1] * 100 }}%</b>\n </ng-container>\n <ng-container *ngIf=\"!model.config?.mergeArgs\">\n <span class=\"is-underlined\" *ngIf=\"!model.logs.replaceThreshold\">not sufficiently</span>\n <span class=\"is-underlined\" *ngIf=\"model.logs.replaceThreshold\">sufficiently</span>\n </ng-container>\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 </ul>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #docsLink let-model>\n <a [href]=\"model.apiDocsPath || model.docPath || model.path\" target=\"_blank\" (click)=\"$event.stopPropagation()\">\n <span>Docs</span>\n <fa-icon class=\"ml-1\" icon=\"external-link-alt\" size=\"sm\"></fa-icon>\n </a>\n</ng-template>\n", styles: [":host{display:block}::ng-deep .table{background-color:transparent}::ng-deep .table td he-node-link{width:190px}@media screen and (max-width: 768px){::ng-deep .table td he-node-link{width:150px}}::ng-deep .table td .open-node+he-node-link{width:170px}@media screen and (max-width: 768px){::ng-deep .table td .open-node+he-node-link{width:130px}}::ng-deep .table td.has-border-right{box-shadow:1px 0 #6c8093}::ng-deep .table .has-sub-rows.is-open>td:first-child:before,::ng-deep .table .is-sub-row>td:first-child:before{display:block;position:absolute;content:\" \";background-color:#6c809333;height:100%;width:1px;top:0;left:12px}::ng-deep .table .has-sub-rows.is-open>td:first-child:before{top:25px}::ng-deep .table .popover-body .table-container{max-height:260px;overflow-y:auto}::ng-deep .copy-log he-clipboard{visibility:hidden}::ng-deep .copy-log:hover he-clipboard{visibility:visible}\n"] }]
339
339
  }], ctorParameters: function () { return [{ type: i1.HeNodeService }, { type: i2.HeSearchService }, { type: i3.HeEngineService }]; }, propDecorators: { node: [{
340
340
  type: Input
341
341
  }], nodeKey: [{
@@ -355,4 +355,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.8", ngImpor
355
355
  }], noDataMessage: [{
356
356
  type: Input
357
357
  }] } });
358
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1sb2dzLW1vZGVscy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbm9kZS9ub2RlLWxvZ3MtbW9kZWxzL25vZGUtbG9ncy1tb2RlbHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vc3JjL25vZGUvbm9kZS1sb2dzLW1vZGVscy9ub2RlLWxvZ3MtbW9kZWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVHLE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEUsT0FBTyxFQUFjLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLG9CQUFvQixFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkgsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixrQkFBa0IsRUFJbEIsUUFBUSxFQUNSLFlBQVksRUFDWixvQkFBb0IsRUFDcEIsNEJBQTRCLEVBQzVCLHVCQUF1QixFQUN4QixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzlELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV6RCxPQUFPLEVBQTRELGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2xILE9BQU8sRUFBRSxPQUFPLEVB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LFdBQVcsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxJQUFJLGFBQWEsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUVTLGFBQWEsQ0FBQyxNQUFtQixFQUFFLFVBQThCO1FBQ3pFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsS0FBSyxVQUFVLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRVMsUUFBUSxDQUFDLEVBQVU7UUFDM0IsT0FBTyxDQUNMLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNyQjtnQkFDQyxPQUFPLEVBQUUsUUFBUSxDQUFDLElBQUk7Z0JBQ3RCLEtBQUssRUFBRSxFQUFFO2dCQUNULElBQUksRUFBRSxhQUFhLENBQUMsRUFBRSxDQUFDO2FBQ1IsQ0FDbEIsQ0FBQztJQUNKLENBQUM7OEdBbFZVLHVCQUF1QjtrR0FBdkIsdUJBQXVCLDJVQ3RNcEMsc3A0QkFpb0JBOzsyRkQzYmEsdUJBQXVCO2tCQU5uQyxTQUFTOytCQUNFLHFCQUFxQixtQkFHZCx1QkFBdUIsQ0FBQyxNQUFNO2dLQUszQyxJQUFJO3NCQURQLEtBQUs7Z0JBUUYsT0FBTztzQkFEVixLQUFLO2dCQU9GLGNBQWM7c0JBRGpCLEtBQUs7Z0JBT0Ysa0JBQWtCO3NCQURyQixLQUFLO2dCQU9GLEtBQUs7c0JBRFIsS0FBSztnQkFPRixlQUFlO3NCQURsQixLQUFLO2dCQU9GLG9CQUFvQjtzQkFEdkIsS0FBSztnQkFPRixPQUFPO3NCQURWLEtBQUs7Z0JBT0YsYUFBYTtzQkFEaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIElucHV0LCBTaWduYWwsIGNvbXB1dGVkLCBlZmZlY3QsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdG9TaWduYWwsIHRvT2JzZXJ2YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGZvcmtKb2luLCBmcm9tLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3QsIGZpbHRlciwgcmVkdWNlLCB0b0FycmF5LCBtYXAsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtZXJnZU1hcCwgdGFwLCBtZXJnZUFsbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIEN5Y2xlRnVuY3Rpb25hbFVuaXQsXG4gIEVtaXNzaW9uTWV0aG9kVGllcixcbiAgSUN5Y2xlSlNPTkxELFxuICBJVGVybUpTT05MRCxcbiAgSlNPTkxELFxuICBOb2RlVHlwZSxcbiAgVGVybVRlcm1UeXBlLFxuICBlbWlzc2lvblRlcm1UZXJtVHlwZSxcbiAgaW1wYWN0QXNzZXNzbWVudFRlcm1UZXJtVHlwZSxcbiAgbWVhc3VyZW1lbnRUZXJtVGVybVR5cGVcbn0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9zY2hlbWEnO1xuaW1wb3J0IHsga2V5VG9MYWJlbCwgdW5pcXVlIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC91dGlscyc7XG5pbXBvcnQgeyBwcm9wZXJ0eVZhbHVlIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC91dGlscy9kaXN0L3Rlcm0nO1xuaW1wb3J0IHsgbG9hZFJlc291cmNlS2V5IH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9nbG9zc2FyeSc7XG5cbmltcG9ydCB7IGJsYW5rTm9kZSwgbm9uQmxhbmtOb2RlLCBibGFua05vZGVzS2V5LCBub25CbGFua05vZGVzS2V5LCBCbGFua05vZGVzS2V5IH0gZnJvbSAnLi4vLi4vY29tbW9uL25vZGUtdXRpbHMnO1xuaW1wb3J0IHsgYmFzZVVybCwgaXNFeHRlcm5hbCwgdHlwZWFoZWFkRm9jdXMgfSBmcm9tICcuLi8uLi9jb21tb24vdXRpbHMnO1xuaW1wb3J0IHtcbiAgSUJsYW5rTm9kZUxvZ1N1YlZhbHVlLFxuICBJQmxhbmtOb2RlTG9nLFxuICBMb2dTdGF0dXMsXG4gIElDb25maWdNb2RlbCxcbiAgZ3JvdXBMb2dzQnlNb2RlbCxcbiAgZ3JvdXBMb2dzQnlUZXJtLFxuICBtb2RlbENvdW50LFxuICBjb21wdXRlVGVybXMsXG4gIGxvZ1ZhbHVlQXJyYXksXG4gIElOb2RlVGVybUxvZ3MsXG4gIElOb2RlTG9ncyxcbiAgZ3JvdXBkTG9nc0J5S2V5LFxuICBJTm9uQmxhbmtOb2RlTG9nLFxuICBJTG9nLFxuICBjb21wdXRlS2V5c1xufSBmcm9tICcuL25vZGUtbG9ncy1tb2RlbHMubW9kZWwnO1xuaW1wb3J0IHsgSUpTT05Ob2RlLCBIZU5vZGVTZXJ2aWNlIH0gZnJvbSAnLi4vbm9kZS5zZXJ2aWNlJztcbmltcG9ydCB7IEhlRW5naW5lU2VydmljZSwgSU1vZGVsLCBJT3JjaGVzdHJhdG9yQ29uZmlnLCBmaW5kT3JjaGVzdHJhdG9yTW9kZWwgfSBmcm9tICcuLi8uLi9lbmdpbmUvZW5naW5lLnNlcnZpY2UnO1xuaW1wb3J0IHsgbWF0Y2hFeGFjdFF1ZXJ5LCBtYXRjaElkLCBtYXRjaFRlcm1UeXBlLCBtYXRjaFR5cGUgfSBmcm9tICcuLi8uLi9zZWFyY2gvc2VhcmNoLm1vZGVsJztcbmltcG9ydCB7IEhlU2VhcmNoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlYXJjaC9zZWFyY2guc2VydmljZSc7XG5pbXBvcnQgeyB0ZXJtVHlwZUxhYmVsIH0gZnJvbSAnLi4vLi4vdGVybXMvdGVybXMubW9kZWwnO1xuaW1wb3J0IHsgRGF0YVN0YXRlIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9hcGknO1xuXG5pbnRlcmZhY2UgSVRlcm1zQnlJZE1hcHBpbmcge1xuICBbaWQ6IHN0cmluZ106IElUZXJtSlNPTkxEO1xufVxuXG5jb25zdCBub2RlVHlwZSA9IChub2RlPzogSUpTT05Ob2RlKSA9PiBub2RlPy5bJ0B0eXBlJ10gfHwgbm9kZT8udHlwZTtcbmNvbnN0IG5vZGVJZCA9IChub2RlPzogSUpTT05Ob2RlKSA9PiBub2RlPy5bJ0BpZCddIHx8IG5vZGU/LmlkO1xuY29uc3Qgbm9kZVR5cGVzTG93ZXJDYXNlID0gT2JqZWN0LnZhbHVlcyhOb2RlVHlwZSkubWFwKHYgPT4gdi50b0xvd2VyQ2FzZSgpKTtcblxuY29uc3QgbG9nSWNvbjoge1xuICBbc3RhdHVzIGluIExvZ1N0YXR1c10/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbn0gPSB7XG4gIFtMb2dTdGF0dXMuc3VjY2Vzc106ICdjaGVjaycsXG4gIFtMb2dTdGF0dXMuZXJyb3JdOiAndGltZXMnLFxuICBbTG9nU3RhdHVzLnNraXBIaWVyYXJjaHldOiBbJ2ZhcicsICdjaXJjbGUnXSxcbiAgW0xvZ1N0YXR1cy5kYXRhUHJvdmlkZWRdOiAnY2lyY2xlJyxcbiAgW0xvZ1N0YXR1cy5ub3RSZXF1aXJlZF06ICdkb3QtY2lyY2xlJ1xufTtcblxuY29uc3QgbG9nQ29sb3I6IHtcbiAgW3N0YXR1cyBpbiBMb2dTdGF0dXNdPzogc3RyaW5nO1xufSA9IHtcbiAgW0xvZ1N0YXR1cy5zdWNjZXNzXTogJ3N1Y2Nlc3MnLFxuICBbTG9nU3RhdHVzLmVycm9yXTogJ2RhbmdlcicsXG4gIFtMb2dTdGF0dXMuc2tpcEhpZXJhcmNoeV06ICdkYXJrJyxcbiAgW0xvZ1N0YXR1cy5kYXRhUHJvdmlkZWRdOiAnZGFyaycsXG4gIFtMb2dTdGF0dXMubm90UmVxdWlyZWRdOiAnZ3JleSdcbn07XG5cbmNvbnN0IHNob3VsZFNob3dCbGFua05vZGUgPSAoYmxhbmtOb2RlTG9nOiBJQmxhbmtOb2RlTG9nKSA9PlxuICBbXG4gICAgYmxhbmtOb2RlTG9nPy5jb25maWdNb2RlbHM/Lmxlbmd0aCxcbiAgICBibGFua05vZGVMb2c/LmtleXM/Lmxlbmd0aCxcbiAgICBibGFua05vZGVMb2c/LnN1YlZhbHVlcz8ubGVuZ3RoLFxuICAgIGJsYW5rTm9kZUxvZz8ub3JpZ2luYWw/Lmxlbmd0aCxcbiAgICBibGFua05vZGVMb2c/LnJlY2FsY3VsYXRlZD8ubGVuZ3RoXG4gIF0uc29tZShCb29sZWFuKTtcblxuY29uc3QgbWV0aG9kSWRMYWJlbCA9IChtZXRob2RJZDogc3RyaW5nLCBfbW9kZWw/OiBJTW9kZWwpID0+XG4gIChtZXRob2RJZFxuICAgID8ge1xuICAgICAgICAnY3ljbGUvdHJhbnNmb3JtYXRpb24nOiAnRGF0YSBGcm9tIFRyYW5zZm9ybWF0aW9uJyxcbiAgICAgICAgaW1wYWN0X2Fzc2Vzc21lbnQ6ICdEYXRhIEZyb20gQ3ljbGUnXG4gICAgICB9W21ldGhvZElkXVxuICAgIDogJycpIHx8IChtZXRob2RJZC5pbmNsdWRlcygnLycpID8gbWV0aG9kSWQuc3BsaXQoJy8nKVswXSA6IGtleVRvTGFiZWwobWV0aG9kSWQpKTtcblxuY29uc3QgZ2V0TW9kZWxzQXQgPSAobG9nOiBJQmxhbmtOb2RlTG9nU3ViVmFsdWUgfCBJQmxhbmtOb2RlTG9nLCBpbmRleDogbnVtYmVyKSA9PlxuICAoJ21vZGVsc0luU3ViVmFsdWVzJyBpbiBsb2cgPyAhbG9nLm1vZGVsc0luU3ViVmFsdWVzIHx8ICFsb2cuaXNPcGVuIDogdHJ1ZSkgJiYgbG9nLmNvbmZpZ01vZGVsc1tpbmRleF07XG5cbmNvbnN0IHJlcXVpcmVtZW50S2V5cyA9IChyZXF1aXJlbWVudHM6IHsgW2tleTogc3RyaW5nXTogYW55IH0pID0+XG4gIE9iamVjdC5rZXlzKHJlcXVpcmVtZW50cykuZmlsdGVyKGsgPT4gIW5vZGVUeXBlc0xvd2VyQ2FzZS5pbmNsdWRlcyhrKSk7XG5cbmNvbnN0IHJlcXVpcmVtZW50Q29sb3IgPSAodmFsdWU6IGFueSkgPT4gKCF2YWx1ZSB8fCBbJ05vbmUnLCAnRmFsc2UnLCAnMCcsICcwLjAnXS5pbmNsdWRlcyh2YWx1ZSkgPyAnZGFuZ2VyJyA6ICd3aGl0ZScpO1xuXG5jb25zdCByZXF1aXJlbWVudExpbmtlZE5vZGVCeUtleToge1xuICBba2V5OiBzdHJpbmddOiAodmFsdWU6IHN0cmluZykgPT4gUGFydGlhbDxKU09OTEQ8Tm9kZVR5cGU+Pjtcbn0gPSB7XG4gIHJlbGF0ZWRfY3ljbGVzOiB2ID0+ICh7ICdAdHlwZSc6IE5vZGVUeXBlLkN5Y2xlLCAnQGlkJzogdiB9KSxcbiAgY3ljbGVfaWQ6IHYgPT4gKHsgJ0B0eXBlJzogTm9kZVR5cGUuQ3ljbGUsICdAaWQnOiB2IH0pLFxuICBpbXBhY3RfYXNzZXNzbWVudF9pZDogdiA9PiAoeyAnQHR5cGUnOiBOb2RlVHlwZS5JbXBhY3RBc3Nlc3NtZW50LCAnQGlkJzogdiB9KSxcbiAgc2l0ZV9pZDogdiA9PiAoeyAnQHR5cGUnOiBOb2RlVHlwZS5TaXRlLCAnQGlkJzogdiB9KSxcbiAgc291cmNlX2lkOiB2ID0+ICh7ICdAdHlwZSc6IE5vZGVUeXBlLlNvdXJjZSwgJ0BpZCc6IHYgfSksXG4gIHByb3BlcnR5X2lkOiB2ID0+ICh7ICdAdHlwZSc6IE5vZGVUeXBlLlRlcm0sICdAaWQnOiB2IH0pLFxuICBpbnB1dF9pZDogdiA9PiAoeyAnQHR5cGUnOiBOb2RlVHlwZS5UZXJtLCAnQGlkJzogdiB9KSxcbiAgcHJvZHVjdF9pZDogdiA9PiAoeyAnQHR5cGUnOiBOb2RlVHlwZS5UZXJtLCAnQGlkJzogdiB9KSxcbiAgcHJhY3RpY2VfaWQ6IHYgPT4gKHsgJ0B0eXBlJzogTm9kZVR5cGUuVGVybSwgJ0BpZCc6IHYgfSlcbn07XG5cbmNvbnN0IHJlcXVpcmVtZW50TGlua2VkTm9kZSA9IChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT5cbiAga2V5IGluIHJlcXVpcmVtZW50TGlua2VkTm9kZUJ5S2V5ICYmIFsnTm9uZScsICcnLCBudWxsXS5pbmNsdWRlcyh2YWx1ZSkgJiYgcmVxdWlyZW1lbnRMaW5rZWROb2RlQnlLZXlba2V5XSh2YWx1ZSk7XG5cbmNvbnN0IGlzU3lzdGVtQm91bmRhcnkgPVxuICAodGVybUlkPzogc3RyaW5nKSA9PlxuICAoeyBpc1JlY2FsY3VsYXRlZCwgaXNSZXF1aXJlZCB9OiBQaWNrPElMb2cgfCBJQmxhbmtOb2RlTG9nU3ViVmFsdWUsICdpc1JlY2FsY3VsYXRlZCcgfCAnaXNSZXF1aXJlZCc+KSA9PiB7XG4gICAgLy8gb25seSBleGlzdHMgZm9yIHNvbWUgdGVybXNcbiAgICBjb25zdCBpblN5c3RlbUJvdW5kYXJ5ID0gbG9hZFJlc291cmNlS2V5KCdpbkhlc3RpYURlZmF1bHRTeXN0ZW1Cb3VuZGFyeS5qc29uJywgdGVybUlkKTtcbiAgICByZXR1cm4gIWluU3lzdGVtQm91bmRhcnkgPyBbaXNSZWNhbGN1bGF0ZWQsIGlzUmVxdWlyZWRdLnNvbWUoQm9vbGVhbikgOiBgJHtpblN5c3RlbUJvdW5kYXJ5fWAgPT09ICd0cnVlJztcbiAgfTtcblxuY29uc3QgaXNHZW5lcmljVGVybSA9ICh0ZXJtSWQ6IHN0cmluZykgPT4gW3Rlcm1JZC5zdGFydHNXaXRoKCdleGNyZXRhJyldLmV2ZXJ5KEJvb2xlYW4pO1xuXG5jb25zdCBleHRyYVRlcm1JZHNGcm9tQ29uZmlnID0gKGNvbmZpZzogSU9yY2hlc3RyYXRvckNvbmZpZywga2V5OiBibGFua05vZGVzS2V5LCBsb2dzOiBJTm9kZUxvZ3MgfCBJTm9kZVRlcm1Mb2dzKSA9PlxuICB1bmlxdWUoW1xuICAgIC4uLihjb25maWc/Lm1vZGVscyB8fCBbXSlcbiAgICAgIC5mbGF0KClcbiAgICAgIC5maWx0ZXIobSA9PiBtLmtleSA9PT0ga2V5KVxuICAgICAgLm1hcChtID0+IG0udmFsdWUpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuZmlsdGVyKHYgPT4gIWlzR2VuZXJpY1Rlcm0odikpLFxuICAgIC8vIG1hdGNoIGxvZ3Mgd2l0aCBhIGNvbmZpZ3VyYXRpb25cbiAgICAuLi5PYmplY3QuZW50cmllcyhsb2dzIHx8IHt9KVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKFtfaWQsIHZhbHVlXSkgPT5cbiAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgT2JqZWN0LmVudHJpZXModmFsdWUpLnNvbWUoKFttb2RlbCwgdl06IFttb2RlbDogc3RyaW5nLCB2YWx1ZTogYW55XSkgPT5cbiAgICAgICAgICAgIGZpbmRPcmNoZXN0cmF0b3JNb2RlbChjb25maWcsIHsga2V5LCBtb2RlbCwgdmFsdWU6IHYubW9kZWxfa2V5IH0pXG4gICAgICAgICAgKVxuICAgICAgKVxuICAgICAgLm1hcCgoW2tleV0pID0+IGtleSlcbiAgXSk7XG5cbmNvbnN0IG1hdGNoVGVybVR5cGVGcm9tS2V5OiB7XG4gIFtrZXkgaW4gQmxhbmtOb2Rlc0tleV0/OiBUZXJtVGVybVR5cGVbXTtcbn0gPSB7XG4gIFtCbGFua05vZGVzS2V5LmVtaXNzaW9uc106IGVtaXNzaW9uVGVybVRlcm1UeXBlLnRlcm0sXG4gIFtCbGFua05vZGVzS2V5Lm1lYXN1cmVtZW50c106IG1lYXN1cmVtZW50VGVybVRlcm1UeXBlLnRlcm0sXG4gIC8vIEltcGFjdEFzc2Vzc21lbnRcbiAgLy8gZGlzYWJsZWQgYXMgaXQgd2lsbCBzaG93IHRlcm1zIGluIGJvdGggYGVtaXNzaW9uc2AgYW5kIGByZXNvdXJjZVVzZWAgY2F0ZWdvcmllcywgc2VlIGlzc3VlICMyNzNcbiAgLy8gZW1pc3Npb25zUmVzb3VyY2VVc2U6IGltcGFjdEFzc2Vzc21lbnRUZXJtVGVybVR5cGUuZW1pc3Npb25zUmVzb3VyY2VVc2UudGVybSxcbiAgW0JsYW5rTm9kZXNLZXkuaW1wYWN0c106IGltcGFjdEFzc2Vzc21lbnRUZXJtVGVybVR5cGUuaW1wYWN0cy50ZXJtLFxuICBbQmxhbmtOb2Rlc0tleS5lbmRwb2ludHNdOiBpbXBhY3RBc3Nlc3NtZW50VGVybVRlcm1UeXBlLmVuZHBvaW50cy50ZXJtXG59O1xuXG5jb25zdCBmaWx0ZXJCbGFua05vZGUgPSAoXG4gIHsgdGVybTogeyBuYW1lLCAnQGlkJzogaWQgfSwgc3ViVmFsdWVzLCAuLi5sb2cgfTogSUJsYW5rTm9kZUxvZyxcbiAgc2VsZWN0ZWRUZXJtPzogc3RyaW5nLFxuICBmaWx0ZXJUZXJtVHlwZXM/OiBUZXJtVGVybVR5cGVbXSxcbiAgb25seVJlcXVpcmVkPzogYm9vbGVhblxuKSA9PlxuICBzZWxlY3RlZFRlcm1cbiAgICA/IG5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWxlY3RlZFRlcm0udG9Mb3dlckNhc2UoKSlcbiAgICA6ICFmaWx0ZXJUZXJtVHlwZXM/Lmxlbmd0aCB8fCAhb25seVJlcXVpcmVkIHx8IGlzU3lzdGVtQm91bmRhcnkoaWQpKGxvZykgfHwgc3ViVmFsdWVzLnNvbWUoaXNTeXN0ZW1Cb3VuZGFyeShpZCkpO1xuXG5jb25zdCB0ZXJtU2VhcmNoID0gKHRlcm0gPSAnJykgPT4gdGVybS5yZXBsYWNlKC9bLFxcc10vZywgJycpLnRvTG93ZXJDYXNlKCk7XG5cbmNvbnN0IGxpc3RUZXJtSWQgPSAodGVybXM6IElUZXJtSlNPTkxEW10pID0+XG4gIHRlcm1zXG4gICAgLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUpXG4gICAgLnNvcnQoKVxuICAgIC5qb2luKCcsJyk7XG5cbmNvbnN0IGNvbXBsZXRlbmVzc0NvbXBsZXRlU3VmZml4ID0gJ19jb21wbGV0ZSc7XG5jb25zdCBjb21wbGV0ZW5lc3NJbmNvbXBsZXRlU3VmZml4ID0gJ19pbmNvbXBsZXRlJztcbmNvbnN0IHBhcnNlTG9nQ29tcGxldGVuZXNzID0gKGtleTogc3RyaW5nKSA9PlxuICBbXG4gICAga2V5LnN0YXJ0c1dpdGgoJ3Rlcm1fdHlwZV8nKSxcbiAgICBrZXkuZW5kc1dpdGgoY29tcGxldGVuZXNzQ29tcGxldGVTdWZmaXgpIHx8IGtleS5lbmRzV2l0aChjb21wbGV0ZW5lc3NJbmNvbXBsZXRlU3VmZml4KVxuICBdLmV2ZXJ5KEJvb2xlYW4pXG4gICAgPyB7XG4gICAgICAgIGtleToga2V5XG4gICAgICAgICAgLnJlcGxhY2UoJ3Rlcm1fdHlwZV8nLCAnJylcbiAgICAgICAgICAucmVwbGFjZShjb21wbGV0ZW5lc3NDb21wbGV0ZVN1ZmZpeCwgJycpXG4gICAgICAgICAgLnJlcGxhY2UoY29tcGxldGVuZXNzSW5jb21wbGV0ZVN1ZmZpeCwgJycpLFxuICAgICAgICB2YWx1ZToga2V5LmVuZHNXaXRoKGNvbXBsZXRlbmVzc0NvbXBsZXRlU3VmZml4KVxuICAgICAgfVxuICAgIDogbnVsbDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaGUtbm9kZS1sb2dzLW1vZGVscycsXG4gIHRlbXBsYXRlVXJsOiAnLi9ub2RlLWxvZ3MtbW9kZWxzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbm9kZS1sb2dzLW1vZGVscy5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBOb2RlTG9nc01vZGVsc0NvbXBvbmVudCB7XG4gIHByaXZhdGUgX25vZGUgPSBzaWduYWwodW5kZWZpbmVkIGFzIElKU09OTm9kZSk7XG4gIEBJbnB1dCgpXG4gIHNldCBub2RlKHZhbHVlOiBJSlNPTk5vZGUpIHtcbiAgICB0aGlzLl9ub2RlLnNldCh2YWx1ZSk7XG4gICAgdmFsdWUgJiYgdGhpcy5sb2FkTG9ncyh2YWx1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX25vZGVLZXkgPSBzaWduYWwodW5kZWZpbmVkIGFzIGJsYW5rTm9kZXNLZXkgfCBub25CbGFua05vZGVzS2V5KTtcbiAgQElucHV0KClcbiAgc2V0IG5vZGVLZXkodmFsdWU6IGJsYW5rTm9kZXNLZXkgfCBub25CbGFua05vZGVzS2V5KSB7XG4gICAgdGhpcy5fbm9kZUtleS5zZXQodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb3JpZ2luYWxWYWx1ZXMgPSBzaWduYWwoW10gYXMgYmxhbmtOb2RlW10gfCBub25CbGFua05vZGUpO1xuICBASW5wdXQoKVxuICBzZXQgb3JpZ2luYWxWYWx1ZXModmFsdWU6IGJsYW5rTm9kZVtdIHwgbm9uQmxhbmtOb2RlKSB7XG4gICAgdGhpcy5fb3JpZ2luYWxWYWx1ZXMuc2V0KHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlY2FsY3VsYXRlZFZhbHVlcyA9IHNpZ25hbChbXSBhcyBibGFua05vZGVbXSB8IG5vbkJsYW5rTm9kZSk7XG4gIEBJbnB1dCgpXG4gIHNldCByZWNhbGN1bGF0ZWRWYWx1ZXModmFsdWU6IGJsYW5rTm9kZVtdIHwgbm9uQmxhbmtOb2RlKSB7XG4gICAgdGhpcy5fcmVjYWxjdWxhdGVkVmFsdWVzLnNldCh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIF90ZXJtcyA9IHNpZ25hbChbXSBhcyBJVGVybUpTT05MRFtdKTtcbiAgQElucHV0KClcbiAgc2V0IHRlcm1zKHZhbHVlOiBJVGVybUpTT05MRFtdKSB7XG4gICAgdGhpcy5fdGVybXMuc2V0KHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpbHRlclRlcm1UeXBlcyA9IHNpZ25hbChbXSBhcyBUZXJtVGVybVR5cGVbXSk7XG4gIEBJbnB1dCgpXG4gIHNldCBmaWx0ZXJUZXJtVHlwZXModmFsdWU6IFRlcm1UZXJtVHlwZVtdKSB7XG4gICAgdGhpcy5fZmlsdGVyVGVybVR5cGVzLnNldCh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIF9maWx0ZXJUZXJtVHlwZXNMYWJlbCA9IHNpZ25hbCgnJyk7XG4gIEBJbnB1dCgpXG4gIHNldCBmaWx0ZXJUZXJtVHlwZXNMYWJlbCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZmlsdGVyVGVybVR5cGVzTGFiZWwuc2V0KHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgX2xvZ3NLZXkgPSBzaWduYWwoJycpO1xuICBASW5wdXQoKVxuICBzZXQgbG9nc0tleSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nc0tleS5zZXQodmFsdWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9ub0RhdGFNZXNzYWdlID0gc2lnbmFsKCcnKTtcbiAgQElucHV0KClcbiAgc2V0IG5vRGF0YU1lc3NhZ2UodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX25vRGF0YU1lc3NhZ2Uuc2V0KHZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBiYXNlVXJsID0gYmFzZVVybCgpO1xuICBwcm90ZWN0ZWQgaXNFeHRlcm5hbCA9IGlzRXh0ZXJuYWwoKTtcbiAgcHJvdGVjdGVkIEN5Y2xlRnVuY3Rpb25hbFVuaXQgPSBDeWNsZUZ1bmN0aW9uYWxVbml0O1xuICBwcm90ZWN0ZWQgRW1pc3Npb25NZXRob2RUaWVyID0gRW1pc3Npb25NZXRob2RUaWVyO1xuICBwcm90ZWN0ZWQgTG9nU3RhdHVzID0gTG9nU3RhdHVzO1xuICBwcm90ZWN0ZWQgbG9nSWNvbiA9IGxvZ0ljb247XG4gIHByb3RlY3RlZCBsb2dDb2xvciA9IGxvZ0NvbG9yO1xuICBwcm90ZWN0ZWQgcHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5VmFsdWU7XG4gIHByb3RlY3RlZCBnZXRNb2RlbHNBdCA9IGdldE1vZGVsc0F0O1xuICBwcm90ZWN0ZWQgcmVxdWlyZW1lbnRLZXlzID0gcmVxdWlyZW1lbnRLZXlzO1xuICBwcm90ZWN0ZWQgcmVxdWlyZW1lbnRDb2xvciA9IHJlcXVpcmVtZW50Q29sb3I7XG4gIHByb3RlY3RlZCBsb2dWYWx1ZUFycmF5ID0gbG9nVmFsdWVBcnJheTtcbiAgcHJvdGVjdGVkIHJlcXVpcmVtZW50TGlua2VkTm9kZSA9IHJlcXVpcmVtZW50TGlua2VkTm9kZTtcbiAgcHJvdGVjdGVkIGlzU3lzdGVtQm91bmRhcnkgPSBpc1N5c3RlbUJvdW5kYXJ5O1xuICBwcm90ZWN0ZWQgcGFyc2VMb2dDb21wbGV0ZW5lc3MgPSBwYXJzZUxvZ0NvbXBsZXRlbmVzcztcbiAgcHJvdGVjdGVkIGxvYWRpbmcgPSB0cnVlO1xuICBwcm90ZWN0ZWQgc2hvd0xlZ2VuZCA9IHRydWU7XG5cbiAgcHJvdGVjdGVkIG9ubHlSZXF1aXJlZCA9IHNpZ25hbCh0cnVlKTtcblxuICBwcm90ZWN0ZWQgZmlsdGVyZWRUeXBlID0gY29tcHV0ZWQoXG4gICAgKCkgPT4gdGhpcy5fZmlsdGVyVGVybVR5cGVzTGFiZWwoKSB8fCB0aGlzLl9maWx0ZXJUZXJtVHlwZXMoKT8ubWFwKHRlcm1UeXBlTGFiZWwpLmpvaW4oJyAmICcpXG4gICk7XG4gIHByb3RlY3RlZCBmdW5jdGlvbmFsVW5pdCA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLl9ub2RlKCkgYXMgSUN5Y2xlSlNPTkxEKT8uZnVuY3Rpb25hbFVuaXQpO1xuXG4gIHByb3RlY3RlZCBsb2dzVXJsID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5ub2RlU2VydmljZS5ub2RlTG9nc1VybCh0aGlzLl9ub2RlKCkpKTtcbiAgcHJvdGVjdGVkIG5vZGVUeXBlID0gY29tcHV0ZWQoKCkgPT4gbm9kZVR5cGUodGhpcy5fbm9kZSgpKSk7XG4gIHByaXZhdGUgbm9kZUlkID0gY29tcHV0ZWQoKCkgPT4gbm9kZUlkKHRoaXMuX25vZGUoKSkpO1xuICBwcml2YXRlIGNvbmZpZyA9IHNpZ25hbCh1bmRlZmluZWQgYXMgSU9yY2hlc3RyYXRvckNvbmZpZyk7XG5cbiAgcHJpdmF0ZSBhbGxMb2dzID0gc2lnbmFsKCcnKTtcbiAgcHJpdmF0ZSBncm91cGVkTG9ncyA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLmFsbExvZ3MoKSA/IGdyb3VwTG9nc0J5TW9kZWwodGhpcy5hbGxMb2dzKCkpIDoge30pKTtcbiAgcHJpdmF0ZSBsb2dzID0gY29tcHV0ZWQoKCkgPT4gKHRoaXMuX2xvZ3NLZXkoKSA/IHRoaXMuZ3JvdXBlZExvZ3MoKT8uW3RoaXMuX2xvZ3NLZXkoKV0gOiB0aGlzLmdyb3VwZWRMb2dzKCkpIHx8IHt9KTtcblxuICBwcml2YXRlIGFsbEJsYW5rTm9kZXMgPSBzaWduYWwoW10gYXMgKElCbGFua05vZGVMb2cgfCBJTm9uQmxhbmtOb2RlTG9nKVtdKTtcbiAgcHJvdGVjdGVkIGJsYW5rTm9kZXMgPSBjb21wdXRlZCgoKSA9PlxuICAgIHRoaXMuYWxsQmxhbmtOb2RlcygpLmZpbHRlcihcbiAgICAgIGxvZyA9PiAhKCd0ZXJtJyBpbiBsb2cpIHx8IGZpbHRlckJsYW5rTm9kZShsb2csIHRoaXMudGVybSgpLCB0aGlzLl9maWx0ZXJUZXJtVHlwZXMoKSwgdGhpcy5vbmx5UmVxdWlyZWQoKSlcbiAgICApXG4gICk7XG5cbiAgcHJvdGVjdGVkIGlzQmxhbmtOb2RlcyA9IGNvbXB1dGVkKFxuICAgICgpID0+IEFycmF5LmlzQXJyYXkodGhpcy5fb3JpZ2luYWxWYWx1ZXMoKSkgfHwgQXJyYXkuaXNBcnJheSh0aGlzLl9yZWNhbGN1bGF0ZWRWYWx1ZXMoKSlcbiAgKTtcbiAgcHJvdGVjdGVkIG1ldGhvZE1vZGVsc0NvdW50ID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLmFsbEJsYW5rTm9kZXMoKT8ubGVuZ3RoICYmICd0ZXJtJyBpbiB0aGlzLmFsbEJsYW5rTm9kZXMoKVswXVxuICAgICAgPyBtb2RlbENvdW50KHRoaXMuYWxsQmxhbmtOb2RlcygpIGFzIElCbGFua05vZGVMb2dbXSlcbiAgICAgIDogMVxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZXh0cmFUZXJtc0lkcyQgPSBmb3JrSm9pbih7XG4gICAgY29uZmlnOiB0b09ic2VydmFibGUodGhpcy5jb25maWcpLFxuICAgIG5vZGVLZXk6IHRvT2JzZXJ2YWJsZSh0aGlzLl9ub2RlS2V5IGFzIFNpZ25hbDxibGFua05vZGVzS2V5PiksXG4gICAgbG9nczogdG9PYnNlcnZhYmxlKHRoaXMubG9ncylcbiAgfSkucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcbiAgcHJpdmF0ZSBleHRyYVRlcm1zQnlJZHMgPSBzaWduYWwoW10gYXMgSVRlcm1KU09OTERbXSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXh0cmFUZXJtVHlwZXMkID0gZm9ya0pvaW4oe1xuICAgIG5vZGVLZXk6IHRvT2JzZXJ2YWJsZSh0aGlzLl9ub2RlS2V5KSxcbiAgICB0ZXJtVHlwZXM6IHRvT2JzZXJ2YWJsZSh0aGlzLl9maWx0ZXJUZXJtVHlwZXMpXG4gIH0pLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gIHByaXZhdGUgZXh0cmFUZXJtc0J5VGVybVR5cGVzID0gc2lnbmFsKFtdIGFzIElUZXJtSlNPTkxEW10pO1xuICBwcml2YXRlIGV4dHJhVGVybXMgPSBjb21wdXRlZCgoKSA9PiBbLi4udGhpcy5leHRyYVRlcm1zQnlJZHMoKSwgLi4udGhpcy5leHRyYVRlcm1zQnlUZXJtVHlwZXMoKV0pO1xuICBwcml2YXRlIGFsbFRlcm1zID0gY29tcHV0ZWQoKCkgPT5cbiAgICBjb21wdXRlVGVybXMoXG4gICAgICB0aGlzLl9vcmlnaW5hbFZhbHVlcygpIGFzIGJsYW5rTm9kZVtdLFxuICAgICAgdGhpcy5fcmVjYWxjdWxhdGVkVmFsdWVzKCkgYXMgYmxhbmtOb2RlW10sXG4gICAgICB0aGlzLl90ZXJtcygpLFxuICAgICAgdGhpcy5fZmlsdGVyVGVybVR5cGVzKCksXG4gICAgICB0aGlzLmV4dHJhVGVybXMoKVxuICAgIClcbiAgKTtcblxuICBwcml2YXRlIG1ldGhvZHNCeUlkID0gdG9TaWduYWwoXG4gICAgdGhpcy5zZWFyY2hUZXJtcyh7XG4gICAgICBib29sOiB7XG4gICAgICAgIG11c3Q6IFttYXRjaFR5cGUoTm9kZVR5cGUuVGVybSksIG1hdGNoVGVybVR5cGUoVGVybVRlcm1UeXBlLm1vZGVsKV1cbiAgICAgIH1cbiAgICB9KS5waXBlKFxuICAgICAgbWVyZ2VBbGwoKSxcbiAgICAgIGZpbHRlcih2ID0+ICEhdiksXG4gICAgICBkaXN0aW5jdCh2ID0+IHZbJ0BpZCddKSxcbiAgICAgIHJlZHVjZSgocHJldiwgY3VycikgPT4gKHsgLi4ucHJldiwgW2N1cnJbJ0BpZCddXTogY3VyciB9KSwge30gYXMgSVRlcm1zQnlJZE1hcHBpbmcpXG4gICAgKVxuICApO1xuXG4gIHByaXZhdGUgdGVybXNCeUlkID0gc2lnbmFsKHt9IGFzIElUZXJtc0J5SWRNYXBwaW5nKTtcblxuICAvLyBmcm9tIGBtb2RlbC1saW5rcy5qc29uYCBmaWxlXG4gIHByaXZhdGUgZW5naW5lTW9kZWxzID0gdG9TaWduYWwodGhpcy5lbmdpbmVTZXJ2aWNlLmFsbE1vZGVscyQoKSk7XG5cbiAgLy8gZmlsdGVyIGxpc3Qgb2YgcmVzdWx0cyBieSBhIHNpbmdsZSBUZXJtXG4gIHByb3RlY3RlZCB0ZXJtID0gc2lnbmFsKCcnKTtcbiAgcHJvdGVjdGVkIGVuYWJsZUZpbHRlckJ5VGVybSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuYWxsVGVybXMoKT8ubGVuZ3RoID4gMCk7XG4gIHByb3RlY3RlZCBzdWdnZXN0VGVybSA9ICh0ZXh0JDogT2JzZXJ2YWJsZTxzdHJpbmc+KSA9PlxuICAgIHRleHQkLnBpcGUoXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgbWFwKHYgPT4gdGhpcy5zdWdnZXN0QnlUZXJtKHYpKVxuICAgICk7XG5cbiAgcHJvdGVjdGVkIHR5cGVhaGVhZEZvY3VzID0gdHlwZWFoZWFkRm9jdXM7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBub2RlU2VydmljZTogSGVOb2RlU2VydmljZSxcbiAgICBwcml2YXRlIHNlYXJjaFNlcnZpY2U6IEhlU2VhcmNoU2VydmljZSxcbiAgICBwcml2YXRlIGVuZ2luZVNlcnZpY2U6IEhlRW5naW5lU2VydmljZVxuICApIHtcbiAgICBlZmZlY3QoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuZXh0cmFUZXJtVHlwZXMkXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICBtYXAoKHsgbm9kZUtleSwgdGVybVR5cGVzIH0pID0+IFsuLi4obWF0Y2hUZXJtVHlwZUZyb21LZXlbbm9kZUtleV0gfHwgW10pLCAuLi4odGVybVR5cGVzIHx8IFtdKV0pLFxuICAgICAgICAgICAgbWVyZ2VNYXAodmFsdWVzID0+XG4gICAgICAgICAgICAgIHZhbHVlcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgPyB0aGlzLnNlYXJjaFRlcm1zKHtcbiAgICAgICAgICAgICAgICAgICAgYm9vbDoge1xuICAgICAgICAgICAgICAgICAgICAgIG11c3Q6IFttYXRjaFR5cGUoTm9kZVR5cGUuVGVybSldLFxuICAgICAgICAgICAgICAgICAgICAgIHNob3VsZDogdmFsdWVzLm1hcChtYXRjaFRlcm1UeXBlKSxcbiAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtX3Nob3VsZF9tYXRjaDogMVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIDogb2YoW10pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zdWJzY3JpYmUodmFsdWVzID0+IHRoaXMuZXh0cmFUZXJtc0J5VGVybVR5cGVzLnNldCh2YWx1ZXMpKTtcbiAgICAgIH0sXG4gICAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgICApO1xuXG4gICAgZWZmZWN0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLmV4dHJhVGVybXNJZHMkXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICBtYXAoKHsgY29uZmlnLCBub2RlS2V5LCBsb2dzIH0pID0+IGV4dHJhVGVybUlkc0Zyb21Db25maWcoY29uZmlnLCBub2RlS2V5LCBsb2dzKSksXG4gICAgICAgICAgICBtZXJnZU1hcCh2YWx1ZXMgPT5cbiAgICAgICAgICAgICAgdmFsdWVzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICA/IHRoaXMuc2VhcmNoVGVybXMoe1xuICAgICAgICAgICAgICAgICAgICBib29sOiB7XG4gICAgICAgICAgICAgICAgICAgICAgbXVzdDogW21hdGNoVHlwZShOb2RlVHlwZS5UZXJtKV0sXG4gICAgICAgICAgICAgICAgICAgICAgc2hvdWxkOiB2YWx1ZXMubWFwKG1hdGNoSWQpLFxuICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW1fc2hvdWxkX21hdGNoOiAxXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgOiBvZihbXSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZSh2YWx1ZXMgPT4gdGhpcy5leHRyYVRlcm1zQnlJZHMuc2V0KHZhbHVlcykpO1xuICAgICAgfSxcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICAgICk7XG5cbiAgICBlZmZlY3QoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIG9mKHRoaXMuaXNCbGFua05vZGVzKCkpXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgICAgbWVyZ2VNYXAoaXNCbGFua05vZGVzID0+IChpc0JsYW5rTm9kZXMgPyB0aGlzLmxvYWRCbGFua05vZGVzKCkgOiB0aGlzLmxvYWROb25CbGFua05vZGVzKCkpKVxuICAgICAgICAgIClcbiAgICAgICAgICAuc3Vic2NyaWJlKHZhbHVlcyA9PiB0aGlzLmFsbEJsYW5rTm9kZXMuc2V0KHZhbHVlcykpO1xuICAgICAgfSxcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRMb2dzKG5vZGU6IElKU09OTm9kZSkge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cbiAgICBmb3JrSm9pbih7XG4gICAgICBsb2dzOiB0aGlzLm5vZGVTZXJ2aWNlLmdldExvZyh7IC4uLm5vZGUsIGRhdGFTdGF0ZTogRGF0YVN0YXRlLnJlY2FsY3VsYXRlZCB9KSxcbiAgICAgIGNvbmZpZzogdGhpcy5lbmdpbmVTZXJ2aWNlLm9jaGVzdHJhdG9yQ29uZmlnJChub2RlVHlwZShub2RlKSwgbm9kZUlkKG5vZGUpKVxuICAgIH0pXG4gICAgICAucGlwZSh0YXAoKCkgPT4gKHRoaXMubG9hZGluZyA9IGZhbHNlKSkpXG4gICAgICAuc3Vic2NyaWJlKCh7IGxvZ3MsIGNvbmZpZyB9KSA9PiB7XG4gICAgICAgIHRoaXMuY29uZmlnLnNldChjb25maWcpO1xuICAgICAgICB0aGlzLmFsbExvZ3Muc2V0KGxvZ3MpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRCbGFua05vZGVzKCkge1xuICAgIHJldHVybiBvZih0aGlzLmFsbFRlcm1zKCkpLnBpcGUoXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocHJldiwgY3VycikgPT4gbGlzdFRlcm1JZChwcmV2KSAhPT0gbGlzdFRlcm1JZChjdXJyKSksXG4gICAgICBtZXJnZUFsbCgpLFxuICAgICAgbWFwKFxuICAgICAgICBncm91cExvZ3NCeVRlcm0oXG4gICAgICAgICAgdGhpcy5ub2RlVHlwZSgpLFxuICAgICAgICAgIHRoaXMubG9ncygpLFxuICAgICAgICAgIHRoaXMuZW5naW5lTW9kZWxzKCksXG4gICAgICAgICAgdGhpcy5jb25maWcoKSxcbiAgICAgICAgICB0aGlzLl9vcmlnaW5hbFZhbHVlcygpIGFzIGJsYW5rTm9kZVtdLFxuICAgICAgICAgIHRoaXMuX3JlY2FsY3VsYXRlZFZhbHVlcygpIGFzIGJsYW5rTm9kZVtdLFxuICAgICAgICAgIHRoaXMuX25vZGVLZXkoKSBhcyBibGFua05vZGVzS2V5XG4gICAgICAgIClcbiAgICAgICksXG4gICAgICBmaWx0ZXIoc2hvdWxkU2hvd0JsYW5rTm9kZSksXG4gICAgICB0b0FycmF5KCksXG4gICAgICBtZXJnZU1hcCh2YWx1ZXMgPT4gdGhpcy5mZXRjaFRlcm1JZHModmFsdWVzKS5waXBlKG1hcCgoKSA9PiB2YWx1ZXMpKSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkTm9uQmxhbmtOb2RlcygpIHtcbiAgICBjb25zdCBtYXBGdW5jID0gZ3JvdXBkTG9nc0J5S2V5KFxuICAgICAgdGhpcy5ub2RlVHlwZSgpLFxuICAgICAgdGhpcy5fbm9kZUtleSgpIGFzIG5vbkJsYW5rTm9kZXNLZXksXG4gICAgICB0aGlzLmxvZ3MoKSxcbiAgICAgIHRoaXMuZW5naW5lTW9kZWxzKCksXG4gICAgICB0aGlzLl9vcmlnaW5hbFZhbHVlcygpIGFzIG5vbkJsYW5rTm9kZSxcbiAgICAgIHRoaXMuX3JlY2FsY3VsYXRlZFZhbHVlcygpIGFzIG5vbkJsYW5rTm9kZVxuICAgICk7XG4gICAgY29uc3Qga2V5cyA9IGNvbXB1dGVLZXlzKHRoaXMuX29yaWdpbmFsVmFsdWVzKCkgYXMgbm9uQmxhbmtOb2RlLCB0aGlzLl9yZWNhbGN1bGF0ZWRWYWx1ZXMoKSBhcyBub25CbGFua05vZGUpO1xuICAgIHJldHVybiBmcm9tKGtleXMpLnBpcGUobWFwKG1hcEZ1bmMpLCB0b0FycmF5KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBmZXRjaFRlcm1JZHModmFsdWVzOiBJQmxhbmtOb2RlTG9nW10pIHtcbiAgICByZXR1cm4gb2YodmFsdWVzKS5waXBlKFxuICAgICAgbWVyZ2VNYXAodiA9PiB2LmZsYXRNYXAodnYgPT4gdnYuc3ViVmFsdWVzKSksXG4gICAgICBtYXAodiA9PiB2LmlkKSxcbiAgICAgIGRpc3RpbmN0KCksXG4gICAgICBmaWx0ZXIodiA9PiAhIXYpLFxuICAgICAgdG9BcnJheSgpLFxuICAgICAgbWVyZ2VNYXAoKGlkczogc3RyaW5nW10pID0+XG4gICAgICAgIHRoaXMuc2VhcmNoVGVybXMoe1xuICAgICAgICAgIGJvb2w6IHtcbiAgICAgICAgICAgIG11c3Q6IFttYXRjaFR5cGUoTm9kZVR5cGUuVGVybSldLFxuICAgICAgICAgICAgc2hvdWxkOiBpZHMubWFwKGlkID0+IG1hdGNoRXhhY3RRdWVyeSgnQGlkJywgaWQpKSxcbiAgICAgICAgICAgIG1pbmltdW1fc2hvdWxkX21hdGNoOiAxXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKSxcbiAgICAgIHJlZHVjZSgocHJldiwgY3VycikgPT4gKHsgLi4ucHJldiwgW2N1cnJbJ0BpZCddXTogY3VyciB9KSwge30gYXMgSVRlcm1zQnlJZE1hcHBpbmcpLFxuICAgICAgdGFwKHZhbHVlcyA9PiB0aGlzLnRlcm1zQnlJZC5zZXQodmFsdWVzKSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWdnZXN0QnlUZXJtKHRlcm06IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmFsbFRlcm1zKClcbiAgICAgIC5tYXAoKHsgbmFtZSB9KSA9PiBuYW1lKVxuICAgICAgLmZpbHRlcih2ID0+IHRlcm1TZWFyY2godikuaW5jbHVkZXModGVybVNlYXJjaCh0ZXJtKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWFyY2hUZXJtcyhxdWVyeTogYW55KSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5zZWFyY2hTZXJ2aWNlXG4gICAgICAuc2VhcmNoJDxJVGVybUpTT05MRCwgTm9kZVR5cGUuVGVybT4oe1xuICAgICAgICBmaWVsZHM6IFsnQHR5cGUnLCAnQGlkJywgJ25hbWUnXSxcbiAgICAgICAgbGltaXQ6IDEwMDAwLFxuICAgICAgICBxdWVyeVxuICAgICAgfSlcblxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoKSA9PiAodGhpcy5sb2FkaW5nID0gZmFsc2UpKSxcbiAgICAgICAgbWFwKCh7IHJlc3VsdHMgfSkgPT4gcmVzdWx0cylcbiAgICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdHJhY2tCeUJsYW5rTm9kZShfaW5kZXg6IG51bWJlciwgbm9kZTogYW55KSB7XG4gICAgcmV0dXJuIG5vZGUudGVybUlkIHx8IG5vZGUua2V5O1xuICB9XG5cbiAgcHJvdGVjdGVkIHRlcm1DaGFuZ2VkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRlcm0uc2V0KHZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbmx5UmVxdWlyZWRDaGFuZ2VkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5vbmx5UmVxdWlyZWQuc2V0KHZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtZXRob2ROYW1lKHsgbWV0aG9kSWQsIG1vZGVsIH06IElDb25maWdNb2RlbCkge1xuICAgIHJldHVybiB0aGlzLm1ldGhvZHNCeUlkKCk/LlttZXRob2RJZF0/Lm5hbWUgfHwgbWV0aG9kSWRMYWJlbChtZXRob2RJZCwgbW9kZWwpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhc01ldGhvZFRpZXIodmFsdWVzOiBibGFua05vZGVbXSwgbWV0aG9kVGllcjogRW1pc3Npb25NZXRob2RUaWVyKSB7XG4gICAgcmV0dXJuIHZhbHVlcy5zb21lKHYgPT4gJ21ldGhvZFRpZXInIGluIHYgJiYgdi5tZXRob2RUaWVyID09PSBtZXRob2RUaWVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0ZXJtQnlJZChpZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMudGVybXNCeUlkKCk/LltpZF0gfHxcbiAgICAgICh7XG4gICAgICAgICdAdHlwZSc6IE5vZGVUeXBlLlRlcm0sXG4gICAgICAgICdAaWQnOiBpZCxcbiAgICAgICAgbmFtZTogdGVybVR5cGVMYWJlbChpZClcbiAgICAgIH0gYXMgSVRlcm1KU09OTEQpXG4gICAgKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInB4LTMgcGItM1wiPlxuICA8ZGl2IGNsYXNzPVwiaGFzLXRleHQtcmlnaHQgaXMtbWItMlwiICpuZ0lmPVwiIWlzRXh0ZXJuYWwgJiYgbG9nc1VybCgpXCI+XG4gICAgPGEgY2xhc3M9XCJpcy1zaXplLTdcIiBbaHJlZl09XCJsb2dzVXJsKClcIiB0YXJnZXQ9XCJfYmxhbmtcIj5cbiAgICAgIDxmYS1pY29uIGljb249XCJleHRlcm5hbC1saW5rLWFsdFwiPjwvZmEtaWNvbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwicGwtMlwiPk9wZW4gRnVsbCBMb2dzPC9zcGFuPlxuICAgIDwvYT5cbiAgPC9kaXY+XG5cbiAgPGhlLWRhdGEtdGFibGUgY2xhc3M9XCJtYi0xIGlzLXNtYWxsXCIgW3NtYWxsXT1cInRydWVcIiBtYXhIZWlnaHQ9XCIzMjBcIj5cbiAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBpcy1mdWxsd2lkdGggaXMtbmFycm93IGlzLXN0cmlwZWRcIj5cbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0aCBjbGFzcz1cIndpZHRoLWF1dG8gaGFzLWJvcmRlci1yaWdodFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCIgKm5nSWY9XCJlbmFibGVGaWx0ZXJCeVRlcm0oKVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbCBpcy1leHBhbmRlZCBoYXMtaWNvbnMtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5wdXQgc2VhcmNoLWlucHV0IGlzLXNtYWxsXCJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInRlcm0oKVwiXG4gICAgICAgICAgICAgICAgICBuYW1lPVwidGVybVwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBlbnRyeSBieSBuYW1lXCJcbiAgICAgICAgICAgICAgICAgIFtuZ2JUeXBlYWhlYWRdPVwic3VnZ2VzdFRlcm1cIlxuICAgICAgICAgICAgICAgICAgW2ZvY3VzRmlyc3RdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAoZm9jdXMpPVwidHlwZWFoZWFkRm9jdXMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAoc2VsZWN0SXRlbSk9XCJ0ZXJtQ2hhbmdlZCgkZXZlbnQuaXRlbSlcIiAvPlxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiaWNvbiBpcy1zbWFsbCBpcy1yaWdodFwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiIXRlcm0oKVwiIChjbGljayk9XCJ0ZXJtQ2hhbmdlZCgnJylcIj5cbiAgICAgICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJ0aW1lc1wiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8dGggKm5nSWY9XCJpc0JsYW5rTm9kZXMoKVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1wci0xXCI+VW5pdHM8L3NwYW4+XG4gICAgICAgICAgICA8c3Bhbj4ocGVyJm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gW25nU3dpdGNoXT1cImZ1bmN0aW9uYWxVbml0KClcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiQ3ljbGVGdW5jdGlvbmFsVW5pdFsnMSBoYSddXCI+aGVjdGFyZTwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+a2cgcHJvZHVjdDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4+KTwvc3Bhbj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0aD5PcmlnaW5hbDwvdGg+XG4gICAgICAgICAgPHRoPlJlY2FsY3VsYXRlZDwvdGg+XG4gICAgICAgICAgPHRoICpuZ0lmPVwiaXNCbGFua05vZGVzKClcIj5EaWZmZXJlbmNlPC90aD5cbiAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGMgb2YgbWV0aG9kTW9kZWxzQ291bnQoKSB8IHRpbWVzOyBsZXQgaSA9IGluZGV4XCI+KHt7IGkgKyAxIH19KTwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuICAgICAgPHRib2R5PlxuICAgICAgICA8dHIgKm5nSWY9XCJsb2FkaW5nXCI+XG4gICAgICAgICAgPHRkIGNsYXNzPVwiaGFzLXRleHQtY2VudGVyZWRcIiBjb2xzcGFuPVwiNlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhhcy10ZXh0LWNlbnRlciBweS0zXCI+XG4gICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJzcGlubmVyXCIgW3B1bHNlXT1cInRydWVcIiBzaXplPVwibGdcIj48L2ZhLWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHIgKm5nSWY9XCIhbG9hZGluZyAmJiBibGFua05vZGVzKCkubGVuZ3RoID09PSAwXCI+XG4gICAgICAgICAgPHRkIGNsYXNzPVwiaGFzLXRleHQtY2VudGVyZWRcIiBjb2xzcGFuPVwiNlwiPlxuICAgICAgICAgICAgPHNwYW4+e3sgX25vRGF0YU1lc3NhZ2UoKSB8fCAnTm8gZGF0YScgfX08L3NwYW4+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYmxhbmtOb2RlIG9mIGJsYW5rTm9kZXMoKTsgdHJhY2tCeTogdHJhY2tCeUJsYW5rTm9kZVwiPlxuICAgICAgICAgIDx0ciBbY2xhc3MuaGFzLXN1Yi1yb3dzXT1cImJsYW5rTm9kZS5jYW5PcGVuXCIgW2NsYXNzLmlzLW9wZW5dPVwiYmxhbmtOb2RlLmlzT3BlblwiPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwid2lkdGgtYXV0byBoYXMtYm9yZGVyLXJpZ2h0IGlzLW5vd3JhcFwiIFthdHRyLnRpdGxlXT1cImJsYW5rTm9kZS50ZXJtPy5uYW1lIHx8IGJsYW5rTm9kZS5rZXlcIj5cbiAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICBjbGFzcz1cImlzLWlubGluZS1ibG9jayBpcy1hbGlnbi10b3AgcHItMiBvcGVuLW5vZGVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJibGFua05vZGUuaXNPcGVuID0gIWJsYW5rTm9kZS5pc09wZW5cIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiYmxhbmtOb2RlLmNhbk9wZW5cIj5cbiAgICAgICAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwiYW5nbGUtZG93blwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiIWJsYW5rTm9kZS5pc09wZW5cIj48L2ZhLWljb24+XG4gICAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cImFuZ2xlLXJpZ2h0XCIgW2NsYXNzLmlzLWhpZGRlbl09XCJibGFua05vZGUuaXNPcGVuXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDxoZS1ub2RlLWxpbmsgY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtcHJlLXdyYXBcIiAqbmdJZj1cImJsYW5rTm9kZS50ZXJtXCIgW25vZGVdPVwiYmxhbmtOb2RlLnRlcm1cIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJIdG1sXT1cImJsYW5rTm9kZS50ZXJtLm5hbWUgfCBjb21wb3VuZFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9oZS1ub2RlLWxpbms+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2hvd0JsYW5rTm9kZUtleT5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBibGFua05vZGUua2V5IH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYmxhbmtOb2RlLmtleTsgZWxzZSBzaG93QmxhbmtOb2RlS2V5XCI+XG4gICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiX25vZGVLZXkoKSA9PT0gJ2NvbXBsZXRlbmVzcydcIlxuICAgICAgICAgICAgICAgICAgW2hyZWZdPVwiYmFzZVVybCArICcvc2NoZW1hL0NvbXBsZXRlbmVzcyMnICsgYmxhbmtOb2RlLmtleVwiXG4gICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGJsYW5rTm9kZS5rZXkgfCBrZXlUb0xhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwiaXNCbGFua05vZGVzKClcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1ub3dyYXBcIiBbaW5uZXJIdG1sXT1cImJsYW5rTm9kZS50ZXJtPy51bml0cyB8IGNvbXBvdW5kXCI+PC9zcGFuPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0T3JpZ2luYWxWYWx1ZT5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBibGFua05vZGUub3JpZ2luYWxWYWx1ZSB8IHByZWNpc2lvbjogMyB8IGRlZmF1bHQ6ICctJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImJsYW5rTm9kZS5hbGxQYXJhbGxlbDsgZWxzZSBkZWZhdWx0T3JpZ2luYWxWYWx1ZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG1vZGVsIG9mIGJsYW5rTm9kZS5jb25maWdNb2RlbHNbMF1cIj5cbiAgICAgICAgICAgICAgICAgIHt7IGJsYW5rTm9kZS5vcmlnaW5hbFZhbHVlQnlNZXRob2RJZFttb2RlbC5tZXRob2RJZF0gfCBwcmVjaXNpb246IDMgfCBkZWZhdWx0OiAnLScgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWJsYW5rTm9kZS5pc09yaWdpbmFsIHx8IGJsYW5rTm9kZS5pc1JlY2FsY3VsYXRlZDsgZWxzZSBub3RSZWNhbGN1bGF0ZWRcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRSZWNhbGN1bGF0ZWRWYWx1ZT5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGJsYW5rTm9kZS5yZWNhbGN1bGF0ZWRWYWx1ZSB8IHByZWNpc2lvbjogMyB8IGRlZmF1bHQ6ICctJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJibGFua05vZGUuYWxsUGFyYWxsZWw7IGVsc2UgZGVmYXVsdFJlY2FsY3VsYXRlZFZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBtb2RlbCBvZiBibGFua05vZGUuY29uZmlnTW9kZWxzWzBdXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGJsYW5rTm9kZS5yZWNhbGN1bGF0ZWRWYWx1ZUJ5TWV0aG9kSWRbbW9kZWwubWV0aG9kSWRdIHwgcHJlY2lzaW9uOiAzIHwgZGVmYXVsdDogJy0nIH19XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwiaXNCbGFua05vZGVzKClcIiBjbGFzcz1cImlzLW5vd3JhcFwiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHREZWx0YVZhbHVlPlxuICAgICAgICAgICAgICAgIDxoZS1ibGFuay1ub2RlLXZhbHVlLWRlbHRhXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImJsYW5rTm9kZS5vcmlnaW5hbC5sZW5ndGggJiYgYmxhbmtOb2RlLmlzUmVjYWxjdWxhdGVkOyBlbHNlIG5vVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImJsYW5rTm9kZS5yZWNhbGN1bGF0ZWRWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICBbb3JpZ2luYWxWYWx1ZV09XCJibGFua05vZGUub3JpZ2luYWxWYWx1ZVwiPjwvaGUtYmxhbmstbm9kZS12YWx1ZS1kZWx0YT5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImJsYW5rTm9kZS5hbGxQYXJhbGxlbDsgZWxzZSBkZWZhdWx0RGVsdGFWYWx1ZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG1vZGVsIG9mIGJsYW5rTm9kZS5jb25maWdNb2RlbHNbMF1cIj5cbiAgICAgICAgICAgICAgICAgIDxoZS1ibGFuay1ub2RlLXZhbHVlLWRlbHRhXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgYmxhbmtOb2RlLm9yaWdpbmFsVmFsdWVCeU1ldGhvZElkW21vZGVsLm1ldGhvZElkXSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgYmxhbmtOb2RlLnJlY2FsY3VsYXRlZFZhbHVlQnlNZXRob2RJZFttb2RlbC5tZXRob2RJZF0gIT09IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgZWxzZSBub1ZhbHVlXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJibGFua05vZGUucmVjYWxjdWxhdGVkVmFsdWVCeU1ldGhvZElkW21vZGVsLm1ldGhvZElkXVwiXG4gICAgICAgICAgICAgICAgICAgIFtvcmlnaW5hbFZhbHVlXT1cImJsYW5rTm9kZS5vcmlnaW5hbFZhbHVlQnlNZXRob2RJZFttb2RlbC5tZXRob2RJZF1cIj48L2hlLWJsYW5rLW5vZGUtdmFsdWUtZGVsdGE+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJibGFua05vZGVNb2RlbHM7IGNvbnRleHQ6IHsgZGF0YTogYmxhbmtOb2RlIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L3RyPlxuXG4gICAgICAgICAgPHRyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgc3ViVmFsdWUgb2YgYmxhbmtOb2RlLmtleXNcIlxuICAgICAgICAgICAgW2NsYXNzLmlzLWhpZGRlbl09XCIhYmxhbmtOb2RlLmlzT3BlblwiXG4gICAgICAgICAgICBbY2xhc3MuaGFzLXN1Yi1yb3dzXT1cImJsYW5rTm9kZS5zdWJWYWx1ZXM/Lmxlbmd0aFwiXG4gICAgICAgICAgICBbY2xhc3MuaXMtc3ViLXJvd109XCJibGFua05vZGUuY2FuT3BlblwiPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwid2lkdGgtYXV0byBoYXMtYm9yZGVyLXJpZ2h0IGlzLW5vd3JhcFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLWlubGluZS1ibG9jayBpcy1hbGlnbi10b3AgcGwtMyBwci0xIGZpZWxkLW5vZGVcIj5GaWVsZDo8L3NwYW4+XG5cbiAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICBjbGFzcz1cImlzLWlubGluZS1ibG9jayBpcy1wcmUtd3JhcFwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJibGFua05vZGUudHlwZVwiXG4gICAgICAgICAgICAgICAgW2hyZWZdPVwiYmFzZVVybCArICcvc2NoZW1hLycgKyBibGFua05vZGUudHlwZSArICcjJyArIHN1YlZhbHVlLmtleVwiXG4gICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwic3ViVmFsdWUua2V5XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgc3ViVmFsdWUua2V5IH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrIGlzLWFsaWduLXRvcFwiICpuZ0lmPVwiIWJsYW5rTm9kZS50eXBlXCI+e3sgc3ViVmFsdWUua2V5IH19PC9zcGFuPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZCAqbmdJZj1cImlzQmxhbmtOb2RlcygpXCI+PC90ZD5cbiAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzdWJWYWx1ZS5vcmlnaW5hbFZhbHVlICE9PSBudWxsOyBlbHNlIG5vVmFsdWVcIj5cbiAgICAgICAgICAgICAgICB7eyBzdWJWYWx1ZS5vcmlnaW5hbFZhbHVlIHwgcHJlY2lzaW9uOiAzIHwgZGVmYXVsdDogJy0nIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic3ViVmFsdWUuaXNSZWNhbGN1bGF0ZWQgfHwgc3ViVmFsdWUua2V5ID09PSAnaW1wYWN0QXNzZXNzbWVudCc7IGVsc2Ugbm90UmVjYWxjdWxhdGVkXCI+XG4gICAgICAgICAgICAgICAge3sgc3ViVmFsdWUucmVjYWxjdWxhdGVkVmFsdWUgfCBwcmVjaXNpb246IDMgfCBkZWZhdWx0OiAnLScgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZCAqbmdJZj1cImlzQmxhbmtOb2RlcygpXCI+LTwvdGQ+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYmxhbmtOb2RlTW9kZWxzOyBjb250ZXh0OiB7IGRhdGE6IHN1YlZhbHVlIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L3RyPlxuXG4gICAgICAgICAgPHRyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgc3ViVmFsdWUgb2YgYmxhbmtOb2RlLnN1YlZhbHVlc1wiXG4gICAgICAgICAgICBbY2xhc3MuaXMtaGlkZGVuXT1cIiFibGFua05vZGUuaXNPcGVuXCJcbiAgICAgICAgICAgIFtjbGFzcy5pcy1zdWItcm93XT1cImJsYW5rTm9kZS5jYW5PcGVuXCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ3aWR0aC1hdXRvIGhhcy1ib3JkZXItcmlnaHRcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtYWxpZ24tdG9wIHBsLTNcIj57eyBzdWJWYWx1ZS5rZXkgfCBrZXlUb0xhYmVsIH19PC9zcGFuPlxuXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdWJWYWx1ZS5pZFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrXCIgY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtYWxpZ24tdG9wIHByLTFcIj46PC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwic3ViVmFsdWUua2V5XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLWlubGluZS1ibG9ja1wiICpuZ1N3aXRjaENhc2U9XCInYmFja2dyb3VuZERhdGEnXCI+e3sgc3ViVmFsdWUuaWQgfCBrZXlUb0xhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPGhlLW5vZGUtbGlua1xuICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hEZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaXMtYmxvY2sgcGwtNFwiXG4gICAgICAgICAgICAgICAgICAgIFtub2RlXT1cInRlcm1CeUlkKHN1YlZhbHVlLmlkKVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cInRlcm1CeUlkKHN1YlZhbHVlLmlkKS5uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFtpbm5lckh0bWxdPVwidGVybUJ5SWQoc3ViVmFsdWUuaWQpLm5hbWUgfCBjb21wb3VuZFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvaGUtbm9kZS1saW5rPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQgKm5nSWY9XCJpc0JsYW5rTm9kZXMoKVwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLW5vd3JhcFwiICpuZ0lmPVwic3ViVmFsdWUuc2hvd1VuaXRzXCIgW2lubmVySHRtbF09XCJibGFua05vZGUudGVybT8udW5pdHMgfCBjb21wb3VuZFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic3ViVmFsdWUub3JpZ2luYWxWYWx1ZSAhPT0gbnVsbDsgZWxzZSBub1ZhbHVlXCI+XG4gICAgICAgICAgICAgICAge3sgc3ViVmFsdWUub3JpZ2luYWxWYWx1ZSB8IHByZWNpc2lvbjogMyB8IGRlZmF1bHQ6ICctJyB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInN1YlZhbHVlLmlzUmVjYWxjdWxhdGVkOyBlbHNlIG5vdFJlY2FsY3VsYXRlZFwiPlxuICAgICAgICAgICAgICAgIHt7IHN1YlZhbHVlLnJlY2FsY3VsYXRlZFZhbHVlIHwgcHJlY2lzaW9uOiAzIHwgZGVmYXVsdDogJy0nIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQgKm5nSWY9XCJpc0JsYW5rTm9kZXMoKVwiPi08L3RkPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJsYW5rTm9kZU1vZGVsczsgY29udGV4dDogeyBkYXRhOiBzdWJWYWx1ZSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3Rib2R5PlxuICAgIDwvdGFibGU+XG4gIDwvaGUtZGF0YS10YWJsZT5cblxuICA8ZGl2IGNsYXNzPVwiaXMtc2l6ZS03IGlzLWl0YWxpY1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5zIGlzLXZhcmlhYmxlIGlzLTEgbXktMFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbiBpcy1uYXJyb3dcIj5cbiAgICAgICAgPHA+XG4gICAgICAgICAgPGEgY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgcHItMlwiIChjbGljayk9XCJzaG93TGVnZW5kID0gIXNob3dMZWdlbmRcIj5cbiAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJhbmdsZS1kb3duXCIgW2NsYXNzLmlzLWhpZGRlbl09XCIhc2hvd0xlZ2VuZFwiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJhbmdsZS1yaWdodFwiIFtjbGFzcy5pcy1oaWRkZW5dPVwic2hvd0xlZ2VuZFwiPjwvZmEtaWNvbj5cbiAgICAgICAgICA8L2E+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2tcIj5MZWdlbmQ6PC9zcGFuPlxuICAgICAgICA8L3A+XG4gICAgICAgIDx1bCBjbGFzcz1cImNvbnRlbnQgcGwtMlwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiIXNob3dMZWdlbmRcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdGF0dXMgb2YgTG9nU3RhdHVzIHwga2V5c1wiPlxuICAgICAgICAgICAgPGxpICpuZ0lmPVwibG9nSWNvbltzdGF0dXMudmFsdWVdXCIgY2xhc3M9XCJoYXMtdGV4dC17eyBsb2dDb2xvcltzdGF0dXMudmFsdWVdIH19XCI+XG4gICAgICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cImxvZ0ljb25bc3RhdHVzLnZhbHVlXVwiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwbC0xXCI+e3sgc3RhdHVzLnZhbHVlIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC91bD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbiBoYXMtdGV4dC1yaWdodFwiICpuZ0lmPVwiZmlsdGVyZWRUeXBlKClcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrIGNoZWNrYm94XCI+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3RvclwiXG4gICAgICAgICAgICBbbmdNb2RlbF09XCJvbmx5UmVxdWlyZWRcIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJvbmx5UmVxdWlyZWRDaGFuZ2VkKCRldmVudC50YXJnZXQuY2hlY2tlZClcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiEhdGVybSgpXCIgLz5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1sLTJcIj5cbiAgICAgICAgICAgIFNob3cgb25seSB7eyBmaWx0ZXJlZFR5cGUoKSB8IHBsdXJhbGl6ZSB9fSBpbmNsdWRlZCBpbiB0aGUgZGVmYXVsdCBIZXN0aWEgc3lzdGVtIGJvdW5kYXJ5XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjYmxhbmtOb2RlTW9kZWxzIGxldC1kYXRhPVwiZGF0YVwiPlxuICA8bmctdGVtcGxhdGUgI25vdEluU3lzdGVtQm91bmRhcnk+XG4gICAgPHRkIFthdHRyLmNvbHNwYW5dPVwibWV0aG9kTW9kZWxzQ291bnQoKVwiPlxuICAgICAgPHNwYW4+Tm90IGluIEhlc3RpYSBzeXN0ZW0gYm91bmRhcnk8L3NwYW4+XG4gICAgPC90ZD5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNTeXN0ZW1Cb3VuZGFyeShkYXRhKTsgZWxzZSBub1ZhbHVlXCI+XG4gICAgPHRkIGNsYXNzPVwiYmxhbmstbm9kZS1pbmRleC17eyBpIH19XCIgKm5nRm9yPVwibGV0IGMgb2YgbWV0aG9kTW9kZWxzQ291bnQoKSB8IHRpbWVzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0TW9kZWxzQXQoZGF0YSwgaSk7IGxldCBtb2RlbHM7IGVsc2U6IG5vVmFsdWVcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNtb2RlbFNlcmllPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJibGFua05vZGVNb2RlbDsgY29udGV4dDogeyBtb2RlbDogbW9kZWxzLCBkYXRhIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPGRpdiAqbmdJZj1cIm1vZGVscyB8IGlzQXJyYXk7IGVsc2UgbW9kZWxTZXJpZVwiPlxuICAgICAgICAgIDxwICpuZ0Zvcj1cImxldCBtb2RlbCBvZiBtb2RlbHNcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJibGFua05vZGVNb2RlbDsgY29udGV4dDogeyBtb2RlbCwgZGF0YSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvdGQ+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNibGFua05vZGVNb2RlbCBsZXQtbW9kZWw9XCJtb2RlbFwiIGxldC1kYXRhPVwiZGF0YVwiPlxuICA8c3BhblxuICAgIGNsYXNzPVwiaXMtbm93cmFwXCJcbiAgICBbY2xhc3MudHJpZ2dlci1wb3BvdmVyXT1cIm1vZGVsLnNob3dMb2dzXCJcbiAgICBbbmdiUG9wb3Zlcl09XCJsb2dEZXRhaWxzXCJcbiAgICBbYXV0b0Nsb3NlXT1cIidvdXRzaWRlJ1wiXG4gICAgcG9wb3ZlckNsYXNzPVwiaXMtbmFycm93XCJcbiAgICB0cmlnZ2Vycz1cIm1hbnVhbFwiXG4gICAgI3A9XCJuZ2JQb3BvdmVyXCJcbiAgICBwbGFjZW1lbnQ9XCJsZWZ0XCJcbiAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAoY2xpY2spPVwicC5pc09wZW4oKSA/IHAuY2xvc2UoKSA6IG1vZGVsLnNob3dMb2dzID8gcC5vcGVuKHsgbG9nczogbW9kZWwubG9ncyB9KSA6IG51bGxcIj5cbiAgICA8c3BhbiBjbGFzcz1cImlzLWNhcGl0YWxpemVkXCI+e3sgbWV0aG9kTmFtZShtb2RlbCkgfX08L3NwYW4+XG4gICAgPHNwYW4gY2xhc3M9XCJwbC0xXCIgKm5nSWY9XCJtb2RlbC5sb2dzPy5tZXRob2RUaWVyIHx8IG1vZGVsLm1vZGVsPy5tZXRob2RUaWVyXCI+XG4gICAgICBbe3sgbW9kZWwubG9ncz8ubWV0aG9kVGllciB8fCBtb2RlbC5tb2RlbD8ubWV0aG9kVGllciB9fV1cbiAgICA8L3NwYW4+XG5cbiAgICA8c3BhblxuICAgICAgY2xhc3M9XCJwbC0xIGhhcy10ZXh0LXt7IGxvZ0NvbG9yW21vZGVsLnN0YXR1c10gfX0gdHJpZ2dlci1wb3BvdmVyXCJcbiAgICAgIFtuZ2JQb3BvdmVyXT1cImxvZ1N0YXR1c0RldGFpbHNcIlxuICAgICAgW2F1dG9DbG9zZV09XCInb3V0c2lkZSdcIlxuICAgICAgcG9wb3ZlckNsYXNzPVwiaXMtbmFycm93XCJcbiAgICAgIHRyaWdnZXJzPVwibWFudWFsXCJcbiAgICAgICNwMT1cIm5nYlBvcG92ZXJcIlxuICAgICAgcGxhY2VtZW50PVwibGVmdFwiXG4gICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHAxLmlzT3BlbigpID8gcDEuY2xvc2UoKSA6IHAxLm9wZW4oeyBtb2RlbCwgZGF0YSB9KVwiPlxuICAgICAgPGZhLWljb24gW2ljb25dPVwibG9nSWNvblttb2RlbC5zdGF0dXNdXCI+PC9mYS1pY29uPlxuICAgIDwvc3Bhbj5cblxuICAgIDxzcGFuIGNsYXNzPVwicGwtMVwiICpuZ0lmPVwibW9kZWwubW9kZWxcIj5cbiAgICAgIChcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkb2NzTGluazsgY29udGV4dDogeyAkaW1wbGljaXQ6IG1vZGVsLm1vZGVsIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIClcbiAgICA8L3NwYW4+XG4gIDwvc3Bhbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbm9WYWx1ZT4tPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNub3RSZWNhbGN1bGF0ZWQ+bm90IHJlY2FsY3VsYXRlZDwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbG9nRGV0YWlscyBsZXQtbG9ncz1cImxvZ3NcIj5cbiAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbnRhaW5lclwiICpiaW5kT25jZT1cImxvZ3NcIj5cbiAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBpcy1kYXJrIGlzLWZ1bGx3aWR0aFwiPlxuICAgICAgPHRib2R5PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9ncz8ucmVxdWlyZW1lbnRzXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQga2V5IG9mIHJlcXVpcmVtZW50S2V5cyhsb2dzLnJlcXVpcmVtZW50cylcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2dMaW5lOyBjb250ZXh0OiB7IGtleSwgdmFsdWU6IGxvZ3MucmVxdWlyZW1lbnRzW2tleV0gfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9ncz8ubG9nc1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGtleSBvZiBsb2dzLmxvZ3MgfCBrZXlzXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9nTGluZTsgY29udGV4dDoga2V5XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC90Ym9keT5cbiAgICA8L3RhYmxlPlxuICA8L2Rpdj5cblxuICA8bmctY29udGFpbmVyICpiaW5kT25jZT1cImxvZ3NcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaXQtbXQtMlwiICpuZ0lmPVwibG9ncz8ubWlzc2luZ0xvb2t1cHM/Lmxlbmd0aFwiPlxuICAgICAgPHA+T3B0aW9uYWwgZGF0YSBtaXNzaW5nOjwvcD5cblxuICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbnRhaW5lciBkYXRhLXRhYmxlLWNvbnRhaW5lclwiPlxuICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBpcy1kYXJrIGlzLWZ1bGx3aWR0aCBpcy1zdHJpcGVkXCI+XG4gICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGggY2xhc3M9XCJoYXMtdGV4dC13aGl0ZVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPkZpbGVuYW1lPC9zcGFuPlxuICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICA8dGggY2xhc3M9XCJoYXMtdGV4dC13aGl0ZVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPkNvbHVtbiBUaXRsZTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiaGFzLXRleHQtd2hpdGVcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj5Sb3cgKHRlcm0uaWQpPC9zcGFuPlxuICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgIDx0Ym9keSBjbGFzcz1cImhhcy10ZXh0LXdoaXRlXCI+XG4gICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGRhdGEgb2YgbG9ncy5taXNzaW5nTG9va3Vwc1wiPlxuICAgICAgICAgICAgICA8dGQ+e3sgZGF0YS5maWxlbmFtZSB9fTwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD57eyBkYXRhLmNvbHVtbiB9fTwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD57eyBkYXRhLnRlcm1JZCB9fTwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgIDwvdGFibGU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xvZ0xpbmVWYWx1ZSBsZXQta2V5PVwia2V5XCIgbGV0LXZhbHVlPVwidmFsdWVcIj5cbiAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VmFsdWU+XG4gICAgPHNwYW4gY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtYWxpZ24tbWlkZGxlXCI+e3sgdmFsdWUgfX08L3NwYW4+XG4gIDwvbmctdGVtcGxhdGU+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZXF1aXJlbWVudExpbmtlZE5vZGUoa2V5LCB2YWx1ZSk7IGxldCBsaW5rZWROb2RlOyBlbHNlOiBkZWZhdWx0VmFsdWVcIj5cbiAgICA8aGUtbm9kZS1saW5rXG4gICAgICBjbGFzcz1cImlzLWlubGluZS1ibG9jayBpcy1hbGlnbi1taWRkbGVcIlxuICAgICAgbGlua0NsYXNzPVwiaXMtZGFya1wiXG4gICAgICBbbm9kZV09XCJsaW5rZWROb2RlXCJcbiAgICAgIFtzaG93RXh0ZXJuYWxMaW5rXT1cInRydWVcIj48L2hlLW5vZGUtbGluaz5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xvZ0xpbmUgbGV0LWtleT1cImtleVwiIGxldC12YWx1ZT1cInZhbHVlXCI+XG4gIDx0cj5cbiAgICA8dGQgY2xhc3M9XCJoYXMtYm9yZGVyLXJpZ2h0IGNvcHktbG9nXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImlzLWlubGluZS1ibG9jayBpcy1hbGlnbi1taWRkbGVcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0TWVzc2FnZT5cbiAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJrZXlcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD57eyBrZXkgfCBrZXlUb0xhYmVsIH19PC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidwcm9wZXJ0eV9pZCdcIj5Qcm9wZXJ0eSBUZXJtIEBpZDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3Byb2R1Y3RfaWQnXCI+UHJvZHVjdCBUZXJtIEBpZDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2lucHV0X2lkJ1wiPklucHV0IFRlcm0gQGlkPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidub2RlX3R5cGVfYWxsb3dlZCdcIj5cbiAgICAgICAgICAgICAgPHNwYW4+SXMgdGhlIGN1cnJlbnQ8L3NwYW4+XG4gICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPk5vZGU8L2NvZGU+XG4gICAgICAgICAgICAgIDxzcGFuPmFsbG93ZWQgdG8gcnVuIHRoaXMgbW9kZWw8L3NwYW4+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzaXRlVHlwZV9hbGxvd2VkJ1wiPlxuICAgICAgICAgICAgICA8c3Bhbj5JcyB0aGUgY3VycmVudDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+c2l0ZVR5cGU8L2NvZGU+XG4gICAgICAgICAgICAgIDxzcGFuPmFsbG93ZWQgdG8gcnVuIHRoaXMgbW9kZWw8L3NwYW4+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidwcm9kdWN0X2lkX2FsbG93ZWQnXCI+XG4gICAgICAgICAgICAgIDxzcGFuPkFyZSBhbnkgb2YgdGhlIFByb2R1Y3Q8L3NwYW4+XG4gICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPkBpZDwvY29kZT5cbiAgICAgICAgICAgICAgPHNwYW4+YWxsb3dlZCB0byBydW4gdGhpcyBtb2RlbDwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3Byb2R1Y3RfdGVybVR5cGVfYWxsb3dlZCdcIj5cbiAgICAgICAgICAgICAgPHNwYW4+QXJlIGFueSBvZiB0aGUgUHJvZHVjdDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+dGVybVR5cGU8L2NvZGU+XG4gICAgICAgICAgICAgIDxzcGFuPmFsbG93ZWQgdG8gcnVuIHRoaXMgbW9kZWw8L3NwYW4+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidpbnB1dF9pZF9hbGxvd2VkJ1wiPlxuICAgICAgICAgICAgICA8c3Bhbj5BcmUgYW55IG9mIHRoZSBJbnB1dDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+QGlkPC9jb2RlPlxuICAgICAgICAgICAgICA8c3Bhbj5hbGxvd2VkIHRvIHJ1biB0aGlzIG1vZGVsPC9zcGFuPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaW5wdXRfdGVybVR5cGVfYWxsb3dlZCdcIj5cbiAgICAgICAgICAgICAgPHNwYW4+QXJlIGFueSBvZiB0aGUgSW5wdXQ8L3NwYW4+XG4gICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPnRlcm1UeXBlPC9jb2RlPlxuICAgICAgICAgICAgICA8c3Bhbj5hbGxvd2VkIHRvIHJ1biB0aGlzIG1vZGVsPC9zcGFuPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDwhLS0gRGVwcmVjYXRlZCAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidwcmltYXJ5X3Byb2R1Y3RfaWRfYWxsb3dlZCdcIj5cbiAgICAgICAgICAgICAgPHNwYW4+SXMgdGhlIGN1cnJlbnQgcHJpbWFyeSBwcm9kdWN0PC9zcGFuPlxuICAgICAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW14LTFcIj5AaWQ8L2NvZGU+XG4gICAgICAgICAgICAgIDxzcGFuPmFsbG93ZWQgdG8gcnVuIHRoaXMgbW9kZWw8L3NwYW4+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidwcmltYXJ5X3Byb2R1Y3RfdGVybVR5cGVfYWxsb3dlZCdcIj5cbiAgICAgICAgICAgICAgPHNwYW4+SXMgdGhlIGN1cnJlbnQgcHJpbWFyeSBwcm9kdWN0PC9zcGFuPlxuICAgICAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW14LTFcIj50ZXJtVHlwZTwvY29kZT5cbiAgICAgICAgICAgICAgPHNwYW4+YWxsb3dlZCB0byBydW4gdGhpcyBtb2RlbDwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZ2Vvc3BhdGlhbF9kYXRhJ1wiPlxuICAgICAgICAgICAgICBIYXMgZ2Vvc3BhdGlhbCBkYXRhIG5lY2Vzc2FyeSB0byBydW4gdGhpcyBtb2RlbFxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY29udGFpbnNfZ2Vvc3BhdGlhbF9kYXRhJ1wiPlxuICAgICAgICAgICAgICBIYXMgZ2Vvc3BhdGlhbCBkYXRhIG5lY2Vzc2FyeSB0byBydW4gdGhpcyBtb2RlbFxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY3VycmVudF9zaXplJ1wiPkN1cnJlbnQgcG9seWdvbiBhcmVhPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbWF4X2FyZWFfc2l6ZSdcIj5NYXhpbXVtIHBvbHlnb24gYXJlYSB0byBydW4gdGhpcyBtb2RlbDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2JlbG93X21heF9hcmVhX3NpemUnXCI+UG9seWdvbiBiZWxvdyB0aGUgbWF4aW11bSBhcmVhPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncmVnaW9uX2ZhY3RvcidcIj5GYWN0b3IgZnJvbSByZWdpb24gbG9va3VwPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidoYXNfcGVzdGljaWRlc19pbnB1dHMnXCI+XG4gICAgICAgICAgICAgIDxzcGFuPkN5Y2xlIGNvbnRhaW5zPC9zcGFuPlxuICAgICAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW14LTFcIj5wZXN0aWNpZGVBSTwvY29kZT5cbiAgICAgICAgICAgICAgPHNwYW4+SW5wdXRzPC9zcGFuPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYWxsX3Blc3RpY2lkZUFJX2hhdmVfbG9va3VwX3ZhbHVlJ1wiPlxuICAgICAgICAgICAgICA8c3Bhbj5BbGw8L3NwYW4+XG4gICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPnBlc3RpY2lkZUFJPC9jb2RlPlxuICAgICAgICAgICAgICA8c3Bhbj5JbnB1dHMgaGF2ZSBhIGxvb2t1cCB2YWx1ZTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaGFzX2Nyb3BfcmVzaWR1ZV9idXJudCdcIj5cbiAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1tci0xXCI+YWJvdmVHcm91bmRDcm9wUmVzaWR1ZUJ1cm50PC9jb2RlPlxuICAgICAgICAgICAgICA8c3Bhbj5pcyBwcmVzZW50IGFzIFByb2R1Y3Q8L3NwYW4+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2xpcXVpZF9zbHVycnlfc2x1ZGdlX1AnXCI+TGlxdWlkLCBTbHVycnksIGFuZCBTbHVkZ2UgUDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYXJzZUxvZ0NvbXBsZXRlbmVzcyhrZXkpOyBsZXQgY29tcGxldGVuZXNzOyBlbHNlOiBkZWZhdWx0TWVzc2FnZVwiPlxuICAgICAgICAgIDxzcGFuPkRhdGEgY29tcGxldGVuZXNzIGZvcjwvc3Bhbj5cbiAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW14LTFcIj57eyBjb21wbGV0ZW5lc3Mua2V5IH19PC9jb2RlPlxuICAgICAgICAgIDxzcGFuPm11c3QgYmU8L3NwYW4+XG4gICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+e3sgY29tcGxldGVuZXNzLnZhbHVlIH19PC9jb2RlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxoZS1jbGlwYm9hcmRcbiAgICAgICAgY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtYWxpZ24tbWlkZGxlXCJcbiAgICAgICAgY2xpcGJvYXJkQ2xhc3M9XCJpcy1zaXplLTcgaXMtcC0xXCJcbiAgICAgICAgW2ljb25dPVwiWydmYXInLCAnY2xvbmUnXVwiXG4gICAgICAgIFt2YWx1ZV09XCJrZXlcIlxuICAgICAgICBbaGlkZVRleHRdPVwidHJ1ZVwiPjwvaGUtY2xpcGJvYXJkPlxuICAgIDwvdGQ+XG4gICAgPHRkPlxuICAgICAgPG5nLXRlbXBsYXRlICNzaW5nbGVWYWx1ZT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvZ0xpbmVWYWx1ZTsgY29udGV4dDogeyBrZXksIHZhbHVlIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8ZGl2ICpuZ0lmPVwibG9nVmFsdWVBcnJheSh2YWx1ZSk7IGxldCB2YWx1ZUFycmF5OyBlbHNlOiBzaW5nbGVWYWx1ZVwiPlxuICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBpcy1kYXJrIGlzLWJvcmRlcmVkIGlzLXN0cmlwZWRcIj5cbiAgICAgICAgICA8dGhlYWQgKm5nSWY9XCJ2YWx1ZUFycmF5WzBdIHwgaXNPYmplY3RcIj5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiaGFzLXRleHQtd2hpdGVcIiAqbmdGb3I9XCJsZXQgdiBvZiB2YWx1ZUFycmF5WzBdIHwga2V5c1wiPnt7IHYua2V5IH19PC90aD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHYgb2YgdmFsdWVBcnJheVwiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3NpbmdsZUFycmF5VmFsdWU+XG4gICAgICAgICAgICAgICAgPHRkPnt7IHYgfX08L3RkPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidiB8IGlzT2JqZWN0OyBlbHNlIHNpbmdsZUFycmF5VmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8dGQgKm5nRm9yPVwibGV0IHZ2IG9mIHYgfCBrZXlzXCI+e3sgdnYudmFsdWUgfX08L3RkPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgPC90YWJsZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvdGQ+XG4gIDwvdHI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xvZ1N0YXR1c0RldGFpbHMgbGV0LW1vZGVsPVwibW9kZWxcIiBsZXQtZGF0YT1cImRhdGFcIj5cbiAgPG5nLWNvbnRhaW5lciAqYmluZE9uY2U9XCJtb2RlbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJpcy1tYi0yXCI+XG4gICAgICA8c3Bhbj5TdGF0dXM6PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJpcy1wbC0xXCI+e3sgbW9kZWwuc3RhdHVzIH19PC9zcGFuPlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1vZGVsLnN0YXR1cyA9PT0gTG9nU3RhdHVzLm5vdFJlcXVpcmVkICYmIG1vZGVsLmxvZ3M/LmlzX25vdF9yZWxldmFudCA9PT0gJ1RydWUnXCI+XG4gICAgICA8dWwgY2xhc3M9XCJpcy1wbC0zIGlzLWxpc3Qtc3R5bGUtZGlzY1wiPlxuICAgICAgICA8bGkgKm5nSWY9XCJtb2RlbC5sb2dzLmxvZ3M/LnNpdGVUeXBlX2FsbG93ZWQgPT09ICdGYWxzZSdcIj5cbiAgICAgICAgICBUaGVcbiAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW14LTFcIj5zaXRlLnNpdGVUeXBlPC9jb2RlPlxuICAgICAgICAgIGlzIG5vdCByZWxldmFudC5cbiAgICAgICAgPC9saT5cbiAgICAgICAgPGxpICpuZ0lmPVwibW9kZWwubG9ncy5sb2dzPy5wcm9kdWN0X2lkX2FsbG93ZWQgPT09ICdGYWxzZSdcIj5cbiAgICAgICAgICBOb25lIG9mIHRoZVxuICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPlByb2R1Y3Q8L2NvZGU+XG4gICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1tci0xXCI+dGVybS5AaWQ8L2NvZGU+XG4gICAgICAgICAgaXMgcmVsZXZhbnQuXG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaSAqbmdJZj1cIm1vZGVsLmxvZ3MubG9ncz8ucHJvZHVjdF90ZXJtVHlwZV9hbGxvd2VkID09PSAnRmFsc2UnXCI+XG4gICAgICAgICAgTm9uZSBvZiB0aGVcbiAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW14LTFcIj5Qcm9kdWN0PC9jb2RlPlxuICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXItMVwiPnRlcm0udGVybVR5cGU8L2NvZGU+XG4gICAgICAgICAgaXMgcmVsZXZhbnQuXG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaSAqbmdJZj1cIm1vZGVsLmxvZ3MubG9ncz8uaW5wdXRfaWRfYWxsb3dlZCA9PT0gJ0ZhbHNlJ1wiPlxuICAgICAgICAgIE5vbmUgb2YgdGhlXG4gICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+SW5wdXQ8L2NvZGU+XG4gICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1tci0xXCI+dGVybS5AaWQ8L2NvZGU+XG4gICAgICAgICAgaXMgcmVsZXZhbnQuXG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaSAqbmdJZj1cIm1vZGVsLmxvZ3MubG9ncz8uaW5wdXRfdGVybVR5cGVfYWxsb3dlZCA9PT0gJ0ZhbHNlJ1wiPlxuICAgICAgICAgIE5vbmUgb2YgdGhlXG4gICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+SW5wdXQ8L2NvZGU+XG4gICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1tci0xXCI+dGVybS50ZXJtVHlwZTwvY29kZT5cbiAgICAgICAgICBpcyByZWxldmFudC5cbiAgICAgICAgPC9saT5cbiAgICAgIDwvdWw+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdJZj1cIm1vZGVsLmxvZ3MgJiYgbW9kZWwuc3RhdHVzICE9PSBMb2dTdGF0dXMubm90UmVxdWlyZWQgJiYgbW9kZWwuc3RhdHVzICE9PSBMb2dTdGF0dXMuc2tpcEhpZXJhcmNoeVwiPlxuICAgICAgPHVsIGNsYXNzPVwiaXMtcGwtMyBpcy1saXN0LXN0eWxlLWRpc2NcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNzaG93UnVuT3JjaGVzdHJhdG9yPlxuICAgICAgICAgIDxsaSBjbGFzcz1cImlzLXJ1bi1vcmNoZXN0cmF0b3JcIj5cbiAgICAgICAgICAgIDxwICpuZ0lmPVwibW9kZWwubG9ncz8uc2hvdWxkUnVuXCI+QWxsIHRoZSByZXF1aXJlbWVudHMgd2VyZSBtZXQgdG8gcnVuIHRoZSBtb2RlbC48L3A+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIW1vZGVsLmxvZ3M/LnNob3VsZFJ1blwiPlxuICAgICAgICAgICAgICA8cD5Tb21lIG9mIHRoZSByZXF1aXJlbWVudHMgd2VyZSBub3QgbWV0IHRvIHJ1biB0aGUgbW9kZWwuPC9wPlxuICAgICAgICAgICAgICA8cD5Zb3UgY2FuIGNsaWNrIG9uIHRoZSBtb2RlbCBuYW1lIG9uIHRoZSBsZWZ0IHRvIHZpZXcgdGhlIGRlYnVnZ2luZyBsb2dzLjwvcD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1vZGVsLmxvZ3M/LmxvZ3M/LmVycm9yXCI+XG4gICAgICAgICAgICAgIDxwPlRoZSBtb2RlbCBmYWlsZWQgdG8gcnVuIGZvciB0aGUgZm9sbG93aW5nIHJlYXNvbjo8L3A+XG4gICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgIDxjb2RlPnt7IG1vZGVsLmxvZ3MubG9ncy5lcnJvciB9fTwvY29kZT5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICA8bGlcbiAgICAgICAgICBjbGFzcz1cImlzLW5vLXJ1bi1vcmNoZXN0cmF0b3JcIlxuICAgICAgICAgICpuZ0lmPVwibW9kZWwubG9ncz8uc2hvdWxkUnVuT3JjaGVzdHJhdG9yID09PSBmYWxzZTsgZWxzZSBzaG93UnVuT3JjaGVzdHJhdG9yXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtb2RlbC5sb2dzLnJ1blJlcXVpcmVkXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXJ1bi1ub2RlLXR5cGUtbm90LWFsbG93ZWRcIiAqbmdJZj1cIm1vZGVsLmxvZ3MubG9ncz8ubm9kZV90eXBlX2FsbG93ZWQgPT09ICdGYWxzZSdcIj5cbiAgICAgICAgICAgICAgVGhpcyBtb2RlbCBzaG91bGQgbm90IHJ1biBmb3Ige3sgbm9kZVR5cGUoKSB8IHBsdXJhbGl6ZTogMCB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNydW5Ob0NvbmZpZz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtcnVuLW5vdC1lbXB0eVwiICpuZ0lmPVwibW9kZWwubG9ncy5sb2dzPy5pc19lbXB0eSA9PT0gJ0ZhbHNlJ1wiPlxuICAgICAgICAgICAgICBUaGUge3sgZGF0YS50eXBlIHx8ICdibGFuayBub2RlJyB9fSB3aXRoIFRlcm1cbiAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+e3sgZGF0YS50ZXJtSWQgfX08L2NvZGU+XG4gICAgICAgICAgICAgIGlzIGFscmVhZHkgcHJlc2VudCBvciBhbHJlYWR5IGFkZGVkIGJ5IGFub3RoZXIgbW9kZWwuXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtb2RlbC5jb25maWc7IGVsc2UgcnVuTm9Db25maWdcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwiaXMtcnVuLXN0cmF0ZWd5LXt7IG1vZGVsLmNvbmZpZy5ydW5TdHJhdGVneSB9fVwiIFtuZ1N3aXRjaF09XCJtb2RlbC5jb25maWcucnVuU3RyYXRlZ3lcIj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidhbHdheXMnXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2FkZF9rZXlfaWZfbWlzc2luZydcIj5XZSBvbmx5IGdhcC1maWxsIHRoaXMga2V5IGlmIG5vdCBwcmVzZW50PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2FkZF9ibGFua19ub2RlX2lmX21pc3NpbmcnXCI+V2Ugb25seSBnYXAtZmlsbCB0aGlzIEJsYW5rIE5vZGUgaWYgbm90IHByZXNlbnQuPC9zcGFuPlxuICAgICAgICAgICAgPC9wPlxuXG4gICAgICAgICAgICA8cCBjbGFzcz1cImlzLW10LTFcIj5cbiAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICBjbGFzcz1cImlzLXJ1bi13aXRoLW1lYXN1cmVkXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgbW9kZWwuY29uZmlnLnJ1bkFyZ3M/LnJ1bk5vbk1lYXN1cmVkICYmIGhhc01ldGhvZFRpZXIoZGF0YS5vcmlnaW5hbCwgRW1pc3Npb25NZXRob2RUaWVyLm1lYXN1cmVkKVxuICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICAgIFRoZVxuICAgICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPnt7IG1vZGVsLmNvbmZpZy52YWx1ZSB9fTwvY29kZT5cbiAgICAgICAgICAgICAgICB3YXMgcmVwb3J0ZWQgYXMgbWVhc3VyZWQuXG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9saT5cblxuICAgICAgICA8bGkgKm5nSWY9XCJtb2RlbC5sb2dzPy5yZXBsYWNlTG93ZXJUaWVyICE9PSB1bmRlZmluZWRcIj5cbiAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgIFRoZSByZWNhbGN1bGF0ZWRcbiAgICAgICAgICAgIDxiPm1ldGhvZFRpZXI8L2I+XG4gICAgICAgICAgICB3YXNcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1wbC0xIGlzLXVuZGVybGluZWRcIiAqbmdJZj1cIiFtb2RlbC5sb2dzLnJlcGxhY2VMb3dlclRpZXJcIj5sb3dlciB0aGFuPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtcGwtMSBpcy11bmRlcmxpbmVkXCIgKm5nSWY9XCJtb2RlbC5sb2dzLnJlcGxhY2VMb3dlclRpZXJcIj5oaWdoZXIgdGhhbiBvciBlcXVhbCB0bzwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXBsLTFcIj5cbiAgICAgICAgICAgIHRoZSBvcmlnaW5hbFxuICAgICAgICAgICAgPGI+bWV0aG9kVGllcjwvYj5cbiAgICAgICAgICAgIC5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvbGk+XG5cbiAgICAgICAgPGxpIGNsYXNzPVwiaXMtbWVyZ2UtcmVwbGFjZUxvd2VyVGllclwiICpuZ0lmPVwibW9kZWwubG9ncy5yZXBsYWNlTG93ZXJUaWVyXCI+XG4gICAgICAgICAgPHNwYW4+VGhlIHJlY2FsY3VsYXRlZDwvc3Bhbj5cbiAgICAgICAgICA8YiBjbGFzcz1cImlzLXBsLTFcIj57eyBtb2RlbC5jb25maWc/Lm1lcmdlQXJncz8ucmVwbGFjZVRocmVzaG9sZD8uWzBdIHx8ICd2YWx1ZScgfX08L2I+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1wbC0xXCI+d2FzPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtcGwtMVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1vZGVsLmNvbmZpZz8ubWVyZ2VBcmdzXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtdW5kZXJsaW5lZFwiICpuZ0lmPVwiIW1vZGVsLmxvZ3MucmVwbGFjZVRocmVzaG9sZFwiPmxlc3MgdGhhbjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy11bmRlcmxpbmVkXCIgKm5nSWY9XCJtb2RlbC5sb2dzLnJlcGxhY2VUaHJlc2hvbGRcIj5tb3JlIHRoYW4gb3IgZXF1YWwgdG88L3NwYW4+XG4gICAgICAgICAgICAgIDxiIGNsYXNzPVwiaXMtcGwtMVwiPnt7IG1vZGVsLmNvbmZpZy5tZXJnZUFyZ3MucmVwbGFjZVRocmVzaG9sZFsxXSAqIDEwMCB9fSU8L2I+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbW9kZWwuY29uZmlnPy5tZXJnZUFyZ3NcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy11bmRlcmxpbmVkXCIgKm5nSWY9XCIhbW9kZWwubG9ncy5yZXBsYWNlVGhyZXNob2xkXCI+bm90IHN1ZmZpY2llbnRseTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy11bmRlcmxpbmVkXCIgKm5nSWY9XCJtb2RlbC5sb2dzLnJlcGxhY2VUaHJlc2hvbGRcIj5zdWZmaWNpZW50bHk8L3NwYW4+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1wbC0xXCI+ZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsPC9zcGFuPlxuICAgICAgICAgIDxiIGNsYXNzPVwiaXMtcGwtMVwiPnt7IG1vZGVsLmNvbmZpZz8ubWVyZ2VBcmdzPy5yZXBsYWNlVGhyZXNob2xkPy5bMF0gfHwgJ3ZhbHVlJyB9fS48L2I+XG4gICAgICAgIDwvbGk+XG4gICAgICA8L3VsPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZG9jc0xpbmsgbGV0LW1vZGVsPlxuICA8YSBbaHJlZl09XCJtb2RlbC5hcGlEb2NzUGF0aCB8fCBtb2RlbC5kb2NQYXRoIHx8IG1vZGVsLnBhdGhcIiB0YXJnZXQ9XCJfYmxhbmtcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgPHNwYW4+RG9jczwvc3Bhbj5cbiAgICA8ZmEtaWNvbiBjbGFzcz1cIm1sLTFcIiBpY29uPVwiZXh0ZXJuYWwtbGluay1hbHRcIiBzaXplPVwic21cIj48L2ZhLWljb24+XG4gIDwvYT5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
358
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1sb2dzLW1vZGVscy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbm9kZS9ub2RlLWxvZ3MtbW9kZWxzL25vZGUtbG9ncy1tb2RlbHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vc3JjL25vZGUvbm9kZS1sb2dzLW1vZGVscy9ub2RlLWxvZ3MtbW9kZWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVHLE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEUsT0FBTyxFQUFjLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLG9CQUFvQixFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkgsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixrQkFBa0IsRUFJbEIsUUFBUSxFQUNSLFlBQVksRUFDWixvQkFBb0IsRUFDcEIsNEJBQTRCLEVBQzVCLHVCQUF1QixFQUN4QixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzlELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV6RCxPQUFPLEVBQTRELGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2xILE9BQU8sRUFBRSxPQUFPLEVB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VUFBVSxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBZ0I7UUFDcEQsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLElBQUksYUFBYSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRVMsYUFBYSxDQUFDLE1BQW1CLEVBQUUsVUFBOEI7UUFDekUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxLQUFLLFVBQVUsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFUyxRQUFRLENBQUMsRUFBVTtRQUMzQixPQUFPLENBQ0wsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3JCO2dCQUNDLE9BQU8sRUFBRSxRQUFRLENBQUMsSUFBSTtnQkFDdEIsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsSUFBSSxFQUFFLGFBQWEsQ0FBQyxFQUFFLENBQUM7YUFDUixDQUNsQixDQUFDO0lBQ0osQ0FBQzs4R0FsVlUsdUJBQXVCO2tHQUF2Qix1QkFBdUIsMlVDdE1wQywwcDRCQWlvQkE7OzJGRDNiYSx1QkFBdUI7a0JBTm5DLFNBQVM7K0JBQ0UscUJBQXFCLG1CQUdkLHVCQUF1QixDQUFDLE1BQU07Z0tBSzNDLElBQUk7c0JBRFAsS0FBSztnQkFRRixPQUFPO3NCQURWLEtBQUs7Z0JBT0YsY0FBYztzQkFEakIsS0FBSztnQkFPRixrQkFBa0I7c0JBRHJCLEtBQUs7Z0JBT0YsS0FBSztzQkFEUixLQUFLO2dCQU9GLGVBQWU7c0JBRGxCLEtBQUs7Z0JBT0Ysb0JBQW9CO3NCQUR2QixLQUFLO2dCQU9GLE9BQU87c0JBRFYsS0FBSztnQkFPRixhQUFhO3NCQURoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQsIFNpZ25hbCwgY29tcHV0ZWQsIGVmZmVjdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0b1NpZ25hbCwgdG9PYnNlcnZhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZm9ya0pvaW4sIGZyb20sIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdCwgZmlsdGVyLCByZWR1Y2UsIHRvQXJyYXksIG1hcCwgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1lcmdlTWFwLCB0YXAsIG1lcmdlQWxsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgQ3ljbGVGdW5jdGlvbmFsVW5pdCxcbiAgRW1pc3Npb25NZXRob2RUaWVyLFxuICBJQ3ljbGVKU09OTEQsXG4gIElUZXJtSlNPTkxELFxuICBKU09OTEQsXG4gIE5vZGVUeXBlLFxuICBUZXJtVGVybVR5cGUsXG4gIGVtaXNzaW9uVGVybVRlcm1UeXBlLFxuICBpbXBhY3RBc3Nlc3NtZW50VGVybVRlcm1UeXBlLFxuICBtZWFzdXJlbWVudFRlcm1UZXJtVHlwZVxufSBmcm9tICdAaGVzdGlhLWVhcnRoL3NjaGVtYSc7XG5pbXBvcnQgeyBrZXlUb0xhYmVsLCB1bmlxdWUgfSBmcm9tICdAaGVzdGlhLWVhcnRoL3V0aWxzJztcbmltcG9ydCB7IHByb3BlcnR5VmFsdWUgfSBmcm9tICdAaGVzdGlhLWVhcnRoL3V0aWxzL2Rpc3QvdGVybSc7XG5pbXBvcnQgeyBsb2FkUmVzb3VyY2VLZXkgfSBmcm9tICdAaGVzdGlhLWVhcnRoL2dsb3NzYXJ5JztcblxuaW1wb3J0IHsgYmxhbmtOb2RlLCBub25CbGFua05vZGUsIGJsYW5rTm9kZXNLZXksIG5vbkJsYW5rTm9kZXNLZXksIEJsYW5rTm9kZXNLZXkgfSBmcm9tICcuLi8uLi9jb21tb24vbm9kZS11dGlscyc7XG5pbXBvcnQgeyBiYXNlVXJsLCBpc0V4dGVybmFsLCB0eXBlYWhlYWRGb2N1cyB9IGZyb20gJy4uLy4uL2NvbW1vbi91dGlscyc7XG5pbXBvcnQge1xuICBJQmxhbmtOb2RlTG9nU3ViVmFsdWUsXG4gIElCbGFua05vZGVMb2csXG4gIExvZ1N0YXR1cyxcbiAgSUNvbmZpZ01vZGVsLFxuICBncm91cExvZ3NCeU1vZGVsLFxuICBncm91cExvZ3NCeVRlcm0sXG4gIG1vZGVsQ291bnQsXG4gIGNvbXB1dGVUZXJtcyxcbiAgbG9nVmFsdWVBcnJheSxcbiAgSU5vZGVUZXJtTG9ncyxcbiAgSU5vZGVMb2dzLFxuICBncm91cGRMb2dzQnlLZXksXG4gIElOb25CbGFua05vZGVMb2csXG4gIElMb2csXG4gIGNvbXB1dGVLZXlzXG59IGZyb20gJy4vbm9kZS1sb2dzLW1vZGVscy5tb2RlbCc7XG5pbXBvcnQgeyBJSlNPTk5vZGUsIEhlTm9kZVNlcnZpY2UgfSBmcm9tICcuLi9ub2RlLnNlcnZpY2UnO1xuaW1wb3J0IHsgSGVFbmdpbmVTZXJ2aWNlLCBJTW9kZWwsIElPcmNoZXN0cmF0b3JDb25maWcsIGZpbmRPcmNoZXN0cmF0b3JNb2RlbCB9IGZyb20gJy4uLy4uL2VuZ2luZS9lbmdpbmUuc2VydmljZSc7XG5pbXBvcnQgeyBtYXRjaEV4YWN0UXVlcnksIG1hdGNoSWQsIG1hdGNoVGVybVR5cGUsIG1hdGNoVHlwZSB9IGZyb20gJy4uLy4uL3NlYXJjaC9zZWFyY2gubW9kZWwnO1xuaW1wb3J0IHsgSGVTZWFyY2hTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VhcmNoL3NlYXJjaC5zZXJ2aWNlJztcbmltcG9ydCB7IHRlcm1UeXBlTGFiZWwgfSBmcm9tICcuLi8uLi90ZXJtcy90ZXJtcy5tb2RlbCc7XG5pbXBvcnQgeyBEYXRhU3RhdGUgfSBmcm9tICdAaGVzdGlhLWVhcnRoL2FwaSc7XG5cbmludGVyZmFjZSBJVGVybXNCeUlkTWFwcGluZyB7XG4gIFtpZDogc3RyaW5nXTogSVRlcm1KU09OTEQ7XG59XG5cbmNvbnN0IG5vZGVUeXBlID0gKG5vZGU/OiBJSlNPTk5vZGUpID0+IG5vZGU/LlsnQHR5cGUnXSB8fCBub2RlPy50eXBlO1xuY29uc3Qgbm9kZUlkID0gKG5vZGU/OiBJSlNPTk5vZGUpID0+IG5vZGU/LlsnQGlkJ10gfHwgbm9kZT8uaWQ7XG5jb25zdCBub2RlVHlwZXNMb3dlckNhc2UgPSBPYmplY3QudmFsdWVzKE5vZGVUeXBlKS5tYXAodiA9PiB2LnRvTG93ZXJDYXNlKCkpO1xuXG5jb25zdCBsb2dJY29uOiB7XG4gIFtzdGF0dXMgaW4gTG9nU3RhdHVzXT86IHN0cmluZyB8IHN0cmluZ1tdO1xufSA9IHtcbiAgW0xvZ1N0YXR1cy5zdWNjZXNzXTogJ2NoZWNrJyxcbiAgW0xvZ1N0YXR1cy5lcnJvcl06ICd0aW1lcycsXG4gIFtMb2dTdGF0dXMuc2tpcEhpZXJhcmNoeV06IFsnZmFyJywgJ2NpcmNsZSddLFxuICBbTG9nU3RhdHVzLmRhdGFQcm92aWRlZF06ICdjaXJjbGUnLFxuICBbTG9nU3RhdHVzLm5vdFJlcXVpcmVkXTogJ2RvdC1jaXJjbGUnXG59O1xuXG5jb25zdCBsb2dDb2xvcjoge1xuICBbc3RhdHVzIGluIExvZ1N0YXR1c10/OiBzdHJpbmc7XG59ID0ge1xuICBbTG9nU3RhdHVzLnN1Y2Nlc3NdOiAnc3VjY2VzcycsXG4gIFtMb2dTdGF0dXMuZXJyb3JdOiAnZGFuZ2VyJyxcbiAgW0xvZ1N0YXR1cy5za2lwSGllcmFyY2h5XTogJ2RhcmsnLFxuICBbTG9nU3RhdHVzLmRhdGFQcm92aWRlZF06ICdkYXJrJyxcbiAgW0xvZ1N0YXR1cy5ub3RSZXF1aXJlZF06ICdncmV5J1xufTtcblxuY29uc3Qgc2hvdWxkU2hvd0JsYW5rTm9kZSA9IChibGFua05vZGVMb2c6IElCbGFua05vZGVMb2cpID0+XG4gIFtcbiAgICBibGFua05vZGVMb2c/LmNvbmZpZ01vZGVscz8ubGVuZ3RoLFxuICAgIGJsYW5rTm9kZUxvZz8ua2V5cz8ubGVuZ3RoLFxuICAgIGJsYW5rTm9kZUxvZz8uc3ViVmFsdWVzPy5sZW5ndGgsXG4gICAgYmxhbmtOb2RlTG9nPy5vcmlnaW5hbD8ubGVuZ3RoLFxuICAgIGJsYW5rTm9kZUxvZz8ucmVjYWxjdWxhdGVkPy5sZW5ndGhcbiAgXS5zb21lKEJvb2xlYW4pO1xuXG5jb25zdCBtZXRob2RJZExhYmVsID0gKG1ldGhvZElkOiBzdHJpbmcsIF9tb2RlbD86IElNb2RlbCkgPT5cbiAgKG1ldGhvZElkXG4gICAgPyB7XG4gICAgICAgICdjeWNsZS90cmFuc2Zvcm1hdGlvbic6ICdEYXRhIEZyb20gVHJhbnNmb3JtYXRpb24nLFxuICAgICAgICBpbXBhY3RfYXNzZXNzbWVudDogJ0RhdGEgRnJvbSBDeWNsZSdcbiAgICAgIH1bbWV0aG9kSWRdXG4gICAgOiAnJykgfHwgKG1ldGhvZElkLmluY2x1ZGVzKCcvJykgPyBtZXRob2RJZC5zcGxpdCgnLycpWzBdIDoga2V5VG9MYWJlbChtZXRob2RJZCkpO1xuXG5jb25zdCBnZXRNb2RlbHNBdCA9IChsb2c6IElCbGFua05vZGVMb2dTdWJWYWx1ZSB8IElCbGFua05vZGVMb2csIGluZGV4OiBudW1iZXIpID0+XG4gICgnbW9kZWxzSW5TdWJWYWx1ZXMnIGluIGxvZyA/ICFsb2cubW9kZWxzSW5TdWJWYWx1ZXMgfHwgIWxvZy5pc09wZW4gOiB0cnVlKSAmJiBsb2cuY29uZmlnTW9kZWxzW2luZGV4XTtcblxuY29uc3QgcmVxdWlyZW1lbnRLZXlzID0gKHJlcXVpcmVtZW50czogeyBba2V5OiBzdHJpbmddOiBhbnkgfSkgPT5cbiAgT2JqZWN0LmtleXMocmVxdWlyZW1lbnRzKS5maWx0ZXIoayA9PiAhbm9kZVR5cGVzTG93ZXJDYXNlLmluY2x1ZGVzKGspKTtcblxuY29uc3QgcmVxdWlyZW1lbnRDb2xvciA9ICh2YWx1ZTogYW55KSA9PiAoIXZhbHVlIHx8IFsnTm9uZScsICdGYWxzZScsICcwJywgJzAuMCddLmluY2x1ZGVzKHZhbHVlKSA/ICdkYW5nZXInIDogJ3doaXRlJyk7XG5cbmNvbnN0IHJlcXVpcmVtZW50TGlua2VkTm9kZUJ5S2V5OiB7XG4gIFtrZXk6IHN0cmluZ106ICh2YWx1ZTogc3RyaW5nKSA9PiBQYXJ0aWFsPEpTT05MRDxOb2RlVHlwZT4+O1xufSA9IHtcbiAgcmVsYXRlZF9jeWNsZXM6IHYgPT4gKHsgJ0B0eXBlJzogTm9kZVR5cGUuQ3ljbGUsICdAaWQnOiB2IH0pLFxuICBjeWNsZV9pZDogdiA9PiAoeyAnQHR5cGUnOiBOb2RlVHlwZS5DeWNsZSwgJ0BpZCc6IHYgfSksXG4gIGltcGFjdF9hc3Nlc3NtZW50X2lkOiB2ID0+ICh7ICdAdHlwZSc6IE5vZGVUeXBlLkltcGFjdEFzc2Vzc21lbnQsICdAaWQnOiB2IH0pLFxuICBzaXRlX2lkOiB2ID0+ICh7ICdAdHlwZSc6IE5vZGVUeXBlLlNpdGUsICdAaWQnOiB2IH0pLFxuICBzb3VyY2VfaWQ6IHYgPT4gKHsgJ0B0eXBlJzogTm9kZVR5cGUuU291cmNlLCAnQGlkJzogdiB9KSxcbiAgcHJvcGVydHlfaWQ6IHYgPT4gKHsgJ0B0eXBlJzogTm9kZVR5cGUuVGVybSwgJ0BpZCc6IHYgfSksXG4gIGlucHV0X2lkOiB2ID0+ICh7ICdAdHlwZSc6IE5vZGVUeXBlLlRlcm0sICdAaWQnOiB2IH0pLFxuICBwcm9kdWN0X2lkOiB2ID0+ICh7ICdAdHlwZSc6IE5vZGVUeXBlLlRlcm0sICdAaWQnOiB2IH0pLFxuICBwcmFjdGljZV9pZDogdiA9PiAoeyAnQHR5cGUnOiBOb2RlVHlwZS5UZXJtLCAnQGlkJzogdiB9KVxufTtcblxuY29uc3QgcmVxdWlyZW1lbnRMaW5rZWROb2RlID0gKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PlxuICBrZXkgaW4gcmVxdWlyZW1lbnRMaW5rZWROb2RlQnlLZXkgJiYgWydOb25lJywgJycsIG51bGxdLmluY2x1ZGVzKHZhbHVlKSAmJiByZXF1aXJlbWVudExpbmtlZE5vZGVCeUtleVtrZXldKHZhbHVlKTtcblxuY29uc3QgaXNTeXN0ZW1Cb3VuZGFyeSA9XG4gICh0ZXJtSWQ/OiBzdHJpbmcpID0+XG4gICh7IGlzUmVjYWxjdWxhdGVkLCBpc1JlcXVpcmVkIH06IFBpY2s8SUxvZyB8IElCbGFua05vZGVMb2dTdWJWYWx1ZSwgJ2lzUmVjYWxjdWxhdGVkJyB8ICdpc1JlcXVpcmVkJz4pID0+IHtcbiAgICAvLyBvbmx5IGV4aXN0cyBmb3Igc29tZSB0ZXJtc1xuICAgIGNvbnN0IGluU3lzdGVtQm91bmRhcnkgPSBsb2FkUmVzb3VyY2VLZXkoJ2luSGVzdGlhRGVmYXVsdFN5c3RlbUJvdW5kYXJ5Lmpzb24nLCB0ZXJtSWQpO1xuICAgIHJldHVybiAhaW5TeXN0ZW1Cb3VuZGFyeSA/IFtpc1JlY2FsY3VsYXRlZCwgaXNSZXF1aXJlZF0uc29tZShCb29sZWFuKSA6IGAke2luU3lzdGVtQm91bmRhcnl9YCA9PT0gJ3RydWUnO1xuICB9O1xuXG5jb25zdCBpc0dlbmVyaWNUZXJtID0gKHRlcm1JZDogc3RyaW5nKSA9PiBbdGVybUlkLnN0YXJ0c1dpdGgoJ2V4Y3JldGEnKV0uZXZlcnkoQm9vbGVhbik7XG5cbmNvbnN0IGV4dHJhVGVybUlkc0Zyb21Db25maWcgPSAoY29uZmlnOiBJT3JjaGVzdHJhdG9yQ29uZmlnLCBrZXk6IGJsYW5rTm9kZXNLZXksIGxvZ3M6IElOb2RlTG9ncyB8IElOb2RlVGVybUxvZ3MpID0+XG4gIHVuaXF1ZShbXG4gICAgLi4uKGNvbmZpZz8ubW9kZWxzIHx8IFtdKVxuICAgICAgLmZsYXQoKVxuICAgICAgLmZpbHRlcihtID0+IG0ua2V5ID09PSBrZXkpXG4gICAgICAubWFwKG0gPT4gbS52YWx1ZSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5maWx0ZXIodiA9PiAhaXNHZW5lcmljVGVybSh2KSksXG4gICAgLy8gbWF0Y2ggbG9ncyB3aXRoIGEgY29uZmlndXJhdGlvblxuICAgIC4uLk9iamVjdC5lbnRyaWVzKGxvZ3MgfHwge30pXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoW19pZCwgdmFsdWVdKSA9PlxuICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICBPYmplY3QuZW50cmllcyh2YWx1ZSkuc29tZSgoW21vZGVsLCB2XTogW21vZGVsOiBzdHJpbmcsIHZhbHVlOiBhbnldKSA9PlxuICAgICAgICAgICAgZmluZE9yY2hlc3RyYXRvck1vZGVsKGNvbmZpZywgeyBrZXksIG1vZGVsLCB2YWx1ZTogdi5tb2RlbF9rZXkgfSlcbiAgICAgICAgICApXG4gICAgICApXG4gICAgICAubWFwKChba2V5XSkgPT4ga2V5KVxuICBdKTtcblxuY29uc3QgbWF0Y2hUZXJtVHlwZUZyb21LZXk6IHtcbiAgW2tleSBpbiBCbGFua05vZGVzS2V5XT86IFRlcm1UZXJtVHlwZVtdO1xufSA9IHtcbiAgW0JsYW5rTm9kZXNLZXkuZW1pc3Npb25zXTogZW1pc3Npb25UZXJtVGVybVR5cGUudGVybSxcbiAgW0JsYW5rTm9kZXNLZXkubWVhc3VyZW1lbnRzXTogbWVhc3VyZW1lbnRUZXJtVGVybVR5cGUudGVybSxcbiAgLy8gSW1wYWN0QXNzZXNzbWVudFxuICAvLyBkaXNhYmxlZCBhcyBpdCB3aWxsIHNob3cgdGVybXMgaW4gYm90aCBgZW1pc3Npb25zYCBhbmQgYHJlc291cmNlVXNlYCBjYXRlZ29yaWVzLCBzZWUgaXNzdWUgIzI3M1xuICAvLyBlbWlzc2lvbnNSZXNvdXJjZVVzZTogaW1wYWN0QXNzZXNzbWVudFRlcm1UZXJtVHlwZS5lbWlzc2lvbnNSZXNvdXJjZVVzZS50ZXJtLFxuICBbQmxhbmtOb2Rlc0tleS5pbXBhY3RzXTogaW1wYWN0QXNzZXNzbWVudFRlcm1UZXJtVHlwZS5pbXBhY3RzLnRlcm0sXG4gIFtCbGFua05vZGVzS2V5LmVuZHBvaW50c106IGltcGFjdEFzc2Vzc21lbnRUZXJtVGVybVR5cGUuZW5kcG9pbnRzLnRlcm1cbn07XG5cbmNvbnN0IGZpbHRlckJsYW5rTm9kZSA9IChcbiAgeyB0ZXJtOiB7IG5hbWUsICdAaWQnOiBpZCB9LCBzdWJWYWx1ZXMsIC4uLmxvZyB9OiBJQmxhbmtOb2RlTG9nLFxuICBzZWxlY3RlZFRlcm0/OiBzdHJpbmcsXG4gIGZpbHRlclRlcm1UeXBlcz86IFRlcm1UZXJtVHlwZVtdLFxuICBvbmx5UmVxdWlyZWQ/OiBib29sZWFuXG4pID0+XG4gIHNlbGVjdGVkVGVybVxuICAgID8gbmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlbGVjdGVkVGVybS50b0xvd2VyQ2FzZSgpKVxuICAgIDogIWZpbHRlclRlcm1UeXBlcz8ubGVuZ3RoIHx8ICFvbmx5UmVxdWlyZWQgfHwgaXNTeXN0ZW1Cb3VuZGFyeShpZCkobG9nKSB8fCBzdWJWYWx1ZXMuc29tZShpc1N5c3RlbUJvdW5kYXJ5KGlkKSk7XG5cbmNvbnN0IHRlcm1TZWFyY2ggPSAodGVybSA9ICcnKSA9PiB0ZXJtLnJlcGxhY2UoL1ssXFxzXS9nLCAnJykudG9Mb3dlckNhc2UoKTtcblxuY29uc3QgbGlzdFRlcm1JZCA9ICh0ZXJtczogSVRlcm1KU09OTERbXSkgPT5cbiAgdGVybXNcbiAgICAubWFwKCh7IG5hbWUgfSkgPT4gbmFtZSlcbiAgICAuc29ydCgpXG4gICAgLmpvaW4oJywnKTtcblxuY29uc3QgY29tcGxldGVuZXNzQ29tcGxldGVTdWZmaXggPSAnX2NvbXBsZXRlJztcbmNvbnN0IGNvbXBsZXRlbmVzc0luY29tcGxldGVTdWZmaXggPSAnX2luY29tcGxldGUnO1xuY29uc3QgcGFyc2VMb2dDb21wbGV0ZW5lc3MgPSAoa2V5OiBzdHJpbmcpID0+XG4gIFtcbiAgICBrZXkuc3RhcnRzV2l0aCgndGVybV90eXBlXycpLFxuICAgIGtleS5lbmRzV2l0aChjb21wbGV0ZW5lc3NDb21wbGV0ZVN1ZmZpeCkgfHwga2V5LmVuZHNXaXRoKGNvbXBsZXRlbmVzc0luY29tcGxldGVTdWZmaXgpXG4gIF0uZXZlcnkoQm9vbGVhbilcbiAgICA/IHtcbiAgICAgICAga2V5OiBrZXlcbiAgICAgICAgICAucmVwbGFjZSgndGVybV90eXBlXycsICcnKVxuICAgICAgICAgIC5yZXBsYWNlKGNvbXBsZXRlbmVzc0NvbXBsZXRlU3VmZml4LCAnJylcbiAgICAgICAgICAucmVwbGFjZShjb21wbGV0ZW5lc3NJbmNvbXBsZXRlU3VmZml4LCAnJyksXG4gICAgICAgIHZhbHVlOiBrZXkuZW5kc1dpdGgoY29tcGxldGVuZXNzQ29tcGxldGVTdWZmaXgpXG4gICAgICB9XG4gICAgOiBudWxsO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdoZS1ub2RlLWxvZ3MtbW9kZWxzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL25vZGUtbG9ncy1tb2RlbHMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9ub2RlLWxvZ3MtbW9kZWxzLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIE5vZGVMb2dzTW9kZWxzQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSBfbm9kZSA9IHNpZ25hbCh1bmRlZmluZWQgYXMgSUpTT05Ob2RlKTtcbiAgQElucHV0KClcbiAgc2V0IG5vZGUodmFsdWU6IElKU09OTm9kZSkge1xuICAgIHRoaXMuX25vZGUuc2V0KHZhbHVlKTtcbiAgICB2YWx1ZSAmJiB0aGlzLmxvYWRMb2dzKHZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfbm9kZUtleSA9IHNpZ25hbCh1bmRlZmluZWQgYXMgYmxhbmtOb2Rlc0tleSB8IG5vbkJsYW5rTm9kZXNLZXkpO1xuICBASW5wdXQoKVxuICBzZXQgbm9kZUtleSh2YWx1ZTogYmxhbmtOb2Rlc0tleSB8IG5vbkJsYW5rTm9kZXNLZXkpIHtcbiAgICB0aGlzLl9ub2RlS2V5LnNldCh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIF9vcmlnaW5hbFZhbHVlcyA9IHNpZ25hbChbXSBhcyBibGFua05vZGVbXSB8IG5vbkJsYW5rTm9kZSk7XG4gIEBJbnB1dCgpXG4gIHNldCBvcmlnaW5hbFZhbHVlcyh2YWx1ZTogYmxhbmtOb2RlW10gfCBub25CbGFua05vZGUpIHtcbiAgICB0aGlzLl9vcmlnaW5hbFZhbHVlcy5zZXQodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVjYWxjdWxhdGVkVmFsdWVzID0gc2lnbmFsKFtdIGFzIGJsYW5rTm9kZVtdIHwgbm9uQmxhbmtOb2RlKTtcbiAgQElucHV0KClcbiAgc2V0IHJlY2FsY3VsYXRlZFZhbHVlcyh2YWx1ZTogYmxhbmtOb2RlW10gfCBub25CbGFua05vZGUpIHtcbiAgICB0aGlzLl9yZWNhbGN1bGF0ZWRWYWx1ZXMuc2V0KHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgX3Rlcm1zID0gc2lnbmFsKFtdIGFzIElUZXJtSlNPTkxEW10pO1xuICBASW5wdXQoKVxuICBzZXQgdGVybXModmFsdWU6IElUZXJtSlNPTkxEW10pIHtcbiAgICB0aGlzLl90ZXJtcy5zZXQodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlsdGVyVGVybVR5cGVzID0gc2lnbmFsKFtdIGFzIFRlcm1UZXJtVHlwZVtdKTtcbiAgQElucHV0KClcbiAgc2V0IGZpbHRlclRlcm1UeXBlcyh2YWx1ZTogVGVybVRlcm1UeXBlW10pIHtcbiAgICB0aGlzLl9maWx0ZXJUZXJtVHlwZXMuc2V0KHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpbHRlclRlcm1UeXBlc0xhYmVsID0gc2lnbmFsKCcnKTtcbiAgQElucHV0KClcbiAgc2V0IGZpbHRlclRlcm1UeXBlc0xhYmVsKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9maWx0ZXJUZXJtVHlwZXNMYWJlbC5zZXQodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfbG9nc0tleSA9IHNpZ25hbCgnJyk7XG4gIEBJbnB1dCgpXG4gIHNldCBsb2dzS2V5KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dzS2V5LnNldCh2YWx1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX25vRGF0YU1lc3NhZ2UgPSBzaWduYWwoJycpO1xuICBASW5wdXQoKVxuICBzZXQgbm9EYXRhTWVzc2FnZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbm9EYXRhTWVzc2FnZS5zZXQodmFsdWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJhc2VVcmwgPSBiYXNlVXJsKCk7XG4gIHByb3RlY3RlZCBpc0V4dGVybmFsID0gaXNFeHRlcm5hbCgpO1xuICBwcm90ZWN0ZWQgQ3ljbGVGdW5jdGlvbmFsVW5pdCA9IEN5Y2xlRnVuY3Rpb25hbFVuaXQ7XG4gIHByb3RlY3RlZCBFbWlzc2lvbk1ldGhvZFRpZXIgPSBFbWlzc2lvbk1ldGhvZFRpZXI7XG4gIHByb3RlY3RlZCBMb2dTdGF0dXMgPSBMb2dTdGF0dXM7XG4gIHByb3RlY3RlZCBsb2dJY29uID0gbG9nSWNvbjtcbiAgcHJvdGVjdGVkIGxvZ0NvbG9yID0gbG9nQ29sb3I7XG4gIHByb3RlY3RlZCBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZTtcbiAgcHJvdGVjdGVkIGdldE1vZGVsc0F0ID0gZ2V0TW9kZWxzQXQ7XG4gIHByb3RlY3RlZCByZXF1aXJlbWVudEtleXMgPSByZXF1aXJlbWVudEtleXM7XG4gIHByb3RlY3RlZCByZXF1aXJlbWVudENvbG9yID0gcmVxdWlyZW1lbnRDb2xvcjtcbiAgcHJvdGVjdGVkIGxvZ1ZhbHVlQXJyYXkgPSBsb2dWYWx1ZUFycmF5O1xuICBwcm90ZWN0ZWQgcmVxdWlyZW1lbnRMaW5rZWROb2RlID0gcmVxdWlyZW1lbnRMaW5rZWROb2RlO1xuICBwcm90ZWN0ZWQgaXNTeXN0ZW1Cb3VuZGFyeSA9IGlzU3lzdGVtQm91bmRhcnk7XG4gIHByb3RlY3RlZCBwYXJzZUxvZ0NvbXBsZXRlbmVzcyA9IHBhcnNlTG9nQ29tcGxldGVuZXNzO1xuICBwcm90ZWN0ZWQgbG9hZGluZyA9IHNpZ25hbCh0cnVlKTtcbiAgcHJvdGVjdGVkIHNob3dMZWdlbmQgPSB0cnVlO1xuXG4gIHByb3RlY3RlZCBvbmx5UmVxdWlyZWQgPSBzaWduYWwodHJ1ZSk7XG5cbiAgcHJvdGVjdGVkIGZpbHRlcmVkVHlwZSA9IGNvbXB1dGVkKFxuICAgICgpID0+IHRoaXMuX2ZpbHRlclRlcm1UeXBlc0xhYmVsKCkgfHwgdGhpcy5fZmlsdGVyVGVybVR5cGVzKCk/Lm1hcCh0ZXJtVHlwZUxhYmVsKS5qb2luKCcgJiAnKVxuICApO1xuICBwcm90ZWN0ZWQgZnVuY3Rpb25hbFVuaXQgPSBjb21wdXRlZCgoKSA9PiAodGhpcy5fbm9kZSgpIGFzIElDeWNsZUpTT05MRCk/LmZ1bmN0aW9uYWxVbml0KTtcblxuICBwcm90ZWN0ZWQgbG9nc1VybCA9IGNvbXB1dGVkKCgpID0+IHRoaXMubm9kZVNlcnZpY2Uubm9kZUxvZ3NVcmwodGhpcy5fbm9kZSgpKSk7XG4gIHByb3RlY3RlZCBub2RlVHlwZSA9IGNvbXB1dGVkKCgpID0+IG5vZGVUeXBlKHRoaXMuX25vZGUoKSkpO1xuICBwcml2YXRlIG5vZGVJZCA9IGNvbXB1dGVkKCgpID0+IG5vZGVJZCh0aGlzLl9ub2RlKCkpKTtcbiAgcHJpdmF0ZSBjb25maWcgPSBzaWduYWwodW5kZWZpbmVkIGFzIElPcmNoZXN0cmF0b3JDb25maWcpO1xuXG4gIHByaXZhdGUgYWxsTG9ncyA9IHNpZ25hbCgnJyk7XG4gIHByaXZhdGUgZ3JvdXBlZExvZ3MgPSBjb21wdXRlZCgoKSA9PiAodGhpcy5hbGxMb2dzKCkgPyBncm91cExvZ3NCeU1vZGVsKHRoaXMuYWxsTG9ncygpKSA6IHt9KSk7XG4gIHByaXZhdGUgbG9ncyA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLl9sb2dzS2V5KCkgPyB0aGlzLmdyb3VwZWRMb2dzKCk/Llt0aGlzLl9sb2dzS2V5KCldIDogdGhpcy5ncm91cGVkTG9ncygpKSB8fCB7fSk7XG5cbiAgcHJpdmF0ZSBhbGxCbGFua05vZGVzID0gc2lnbmFsKFtdIGFzIChJQmxhbmtOb2RlTG9nIHwgSU5vbkJsYW5rTm9kZUxvZylbXSk7XG4gIHByb3RlY3RlZCBibGFua05vZGVzID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLmFsbEJsYW5rTm9kZXMoKS5maWx0ZXIoXG4gICAgICBsb2cgPT4gISgndGVybScgaW4gbG9nKSB8fCBmaWx0ZXJCbGFua05vZGUobG9nLCB0aGlzLnRlcm0oKSwgdGhpcy5fZmlsdGVyVGVybVR5cGVzKCksIHRoaXMub25seVJlcXVpcmVkKCkpXG4gICAgKVxuICApO1xuXG4gIHByb3RlY3RlZCBpc0JsYW5rTm9kZXMgPSBjb21wdXRlZChcbiAgICAoKSA9PiBBcnJheS5pc0FycmF5KHRoaXMuX29yaWdpbmFsVmFsdWVzKCkpIHx8IEFycmF5LmlzQXJyYXkodGhpcy5fcmVjYWxjdWxhdGVkVmFsdWVzKCkpXG4gICk7XG4gIHByb3RlY3RlZCBtZXRob2RNb2RlbHNDb3VudCA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5hbGxCbGFua05vZGVzKCk/Lmxlbmd0aCAmJiAndGVybScgaW4gdGhpcy5hbGxCbGFua05vZGVzKClbMF1cbiAgICAgID8gbW9kZWxDb3VudCh0aGlzLmFsbEJsYW5rTm9kZXMoKSBhcyBJQmxhbmtOb2RlTG9nW10pXG4gICAgICA6IDFcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGV4dHJhVGVybXNJZHMkID0gZm9ya0pvaW4oe1xuICAgIGNvbmZpZzogdG9PYnNlcnZhYmxlKHRoaXMuY29uZmlnKSxcbiAgICBub2RlS2V5OiB0b09ic2VydmFibGUodGhpcy5fbm9kZUtleSBhcyBTaWduYWw8YmxhbmtOb2Rlc0tleT4pLFxuICAgIGxvZ3M6IHRvT2JzZXJ2YWJsZSh0aGlzLmxvZ3MpXG4gIH0pLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gIHByaXZhdGUgZXh0cmFUZXJtc0J5SWRzID0gc2lnbmFsKFtdIGFzIElUZXJtSlNPTkxEW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IGV4dHJhVGVybVR5cGVzJCA9IGZvcmtKb2luKHtcbiAgICBub2RlS2V5OiB0b09ic2VydmFibGUodGhpcy5fbm9kZUtleSksXG4gICAgdGVybVR5cGVzOiB0b09ic2VydmFibGUodGhpcy5fZmlsdGVyVGVybVR5cGVzKVxuICB9KS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICBwcml2YXRlIGV4dHJhVGVybXNCeVRlcm1UeXBlcyA9IHNpZ25hbChbXSBhcyBJVGVybUpTT05MRFtdKTtcbiAgcHJpdmF0ZSBleHRyYVRlcm1zID0gY29tcHV0ZWQoKCkgPT4gWy4uLnRoaXMuZXh0cmFUZXJtc0J5SWRzKCksIC4uLnRoaXMuZXh0cmFUZXJtc0J5VGVybVR5cGVzKCldKTtcbiAgcHJpdmF0ZSBhbGxUZXJtcyA9IGNvbXB1dGVkKCgpID0+XG4gICAgY29tcHV0ZVRlcm1zKFxuICAgICAgdGhpcy5fb3JpZ2luYWxWYWx1ZXMoKSBhcyBibGFua05vZGVbXSxcbiAgICAgIHRoaXMuX3JlY2FsY3VsYXRlZFZhbHVlcygpIGFzIGJsYW5rTm9kZVtdLFxuICAgICAgdGhpcy5fdGVybXMoKSxcbiAgICAgIHRoaXMuX2ZpbHRlclRlcm1UeXBlcygpLFxuICAgICAgdGhpcy5leHRyYVRlcm1zKClcbiAgICApXG4gICk7XG5cbiAgcHJpdmF0ZSBtZXRob2RzQnlJZCA9IHRvU2lnbmFsKFxuICAgIHRoaXMuc2VhcmNoVGVybXMoe1xuICAgICAgYm9vbDoge1xuICAgICAgICBtdXN0OiBbbWF0Y2hUeXBlKE5vZGVUeXBlLlRlcm0pLCBtYXRjaFRlcm1UeXBlKFRlcm1UZXJtVHlwZS5tb2RlbCldXG4gICAgICB9XG4gICAgfSkucGlwZShcbiAgICAgIG1lcmdlQWxsKCksXG4gICAgICBmaWx0ZXIodiA9PiAhIXYpLFxuICAgICAgZGlzdGluY3QodiA9PiB2WydAaWQnXSksXG4gICAgICByZWR1Y2UoKHByZXYsIGN1cnIpID0+ICh7IC4uLnByZXYsIFtjdXJyWydAaWQnXV06IGN1cnIgfSksIHt9IGFzIElUZXJtc0J5SWRNYXBwaW5nKVxuICAgIClcbiAgKTtcblxuICBwcml2YXRlIHRlcm1zQnlJZCA9IHNpZ25hbCh7fSBhcyBJVGVybXNCeUlkTWFwcGluZyk7XG5cbiAgLy8gZnJvbSBgbW9kZWwtbGlua3MuanNvbmAgZmlsZVxuICBwcml2YXRlIGVuZ2luZU1vZGVscyA9IHRvU2lnbmFsKHRoaXMuZW5naW5lU2VydmljZS5hbGxNb2RlbHMkKCkpO1xuXG4gIC8vIGZpbHRlciBsaXN0IG9mIHJlc3VsdHMgYnkgYSBzaW5nbGUgVGVybVxuICBwcm90ZWN0ZWQgdGVybSA9IHNpZ25hbCgnJyk7XG4gIHByb3RlY3RlZCBlbmFibGVGaWx0ZXJCeVRlcm0gPSBjb21wdXRlZCgoKSA9PiB0aGlzLmFsbFRlcm1zKCk/Lmxlbmd0aCA+IDApO1xuICBwcm90ZWN0ZWQgc3VnZ2VzdFRlcm0gPSAodGV4dCQ6IE9ic2VydmFibGU8c3RyaW5nPikgPT5cbiAgICB0ZXh0JC5waXBlKFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIG1hcCh2ID0+IHRoaXMuc3VnZ2VzdEJ5VGVybSh2KSlcbiAgICApO1xuXG4gIHByb3RlY3RlZCB0eXBlYWhlYWRGb2N1cyA9IHR5cGVhaGVhZEZvY3VzO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbm9kZVNlcnZpY2U6IEhlTm9kZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzZWFyY2hTZXJ2aWNlOiBIZVNlYXJjaFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBlbmdpbmVTZXJ2aWNlOiBIZUVuZ2luZVNlcnZpY2VcbiAgKSB7XG4gICAgZWZmZWN0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLmV4dHJhVGVybVR5cGVzJFxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgbWFwKCh7IG5vZGVLZXksIHRlcm1UeXBlcyB9KSA9PiBbLi4uKG1hdGNoVGVybVR5cGVGcm9tS2V5W25vZGVLZXldIHx8IFtdKSwgLi4uKHRlcm1UeXBlcyB8fCBbXSldKSxcbiAgICAgICAgICAgIG1lcmdlTWFwKHZhbHVlcyA9PlxuICAgICAgICAgICAgICB2YWx1ZXMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gdGhpcy5zZWFyY2hUZXJtcyh7XG4gICAgICAgICAgICAgICAgICAgIGJvb2w6IHtcbiAgICAgICAgICAgICAgICAgICAgICBtdXN0OiBbbWF0Y2hUeXBlKE5vZGVUeXBlLlRlcm0pXSxcbiAgICAgICAgICAgICAgICAgICAgICBzaG91bGQ6IHZhbHVlcy5tYXAobWF0Y2hUZXJtVHlwZSksXG4gICAgICAgICAgICAgICAgICAgICAgbWluaW11bV9zaG91bGRfbWF0Y2g6IDFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICA6IG9mKFtdKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgICAuc3Vic2NyaWJlKHZhbHVlcyA9PiB0aGlzLmV4dHJhVGVybXNCeVRlcm1UeXBlcy5zZXQodmFsdWVzKSk7XG4gICAgICB9LFxuICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICAgKTtcblxuICAgIGVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5leHRyYVRlcm1zSWRzJFxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgbWFwKCh7IGNvbmZpZywgbm9kZUtleSwgbG9ncyB9KSA9PiBleHRyYVRlcm1JZHNGcm9tQ29uZmlnKGNvbmZpZywgbm9kZUtleSwgbG9ncykpLFxuICAgICAgICAgICAgbWVyZ2VNYXAodmFsdWVzID0+XG4gICAgICAgICAgICAgIHZhbHVlcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgPyB0aGlzLnNlYXJjaFRlcm1zKHtcbiAgICAgICAgICAgICAgICAgICAgYm9vbDoge1xuICAgICAgICAgICAgICAgICAgICAgIG11c3Q6IFttYXRjaFR5cGUoTm9kZVR5cGUuVGVybSldLFxuICAgICAgICAgICAgICAgICAgICAgIHNob3VsZDogdmFsdWVzLm1hcChtYXRjaElkKSxcbiAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtX3Nob3VsZF9tYXRjaDogMVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIDogb2YoW10pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zdWJzY3JpYmUodmFsdWVzID0+IHRoaXMuZXh0cmFUZXJtc0J5SWRzLnNldCh2YWx1ZXMpKTtcbiAgICAgIH0sXG4gICAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgICApO1xuXG4gICAgZWZmZWN0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICBvZih0aGlzLmlzQmxhbmtOb2RlcygpKVxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgIG1lcmdlTWFwKGlzQmxhbmtOb2RlcyA9PiAoaXNCbGFua05vZGVzID8gdGhpcy5sb2FkQmxhbmtOb2RlcygpIDogdGhpcy5sb2FkTm9uQmxhbmtOb2RlcygpKSlcbiAgICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZSh2YWx1ZXMgPT4gdGhpcy5hbGxCbGFua05vZGVzLnNldCh2YWx1ZXMpKTtcbiAgICAgIH0sXG4gICAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkTG9ncyhub2RlOiBJSlNPTk5vZGUpIHtcbiAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xuXG4gICAgZm9ya0pvaW4oe1xuICAgICAgbG9nczogdGhpcy5ub2RlU2VydmljZS5nZXRMb2coeyAuLi5ub2RlLCBkYXRhU3RhdGU6IERhdGFTdGF0ZS5yZWNhbGN1bGF0ZWQgfSksXG4gICAgICBjb25maWc6IHRoaXMuZW5naW5lU2VydmljZS5vY2hlc3RyYXRvckNvbmZpZyQobm9kZVR5cGUobm9kZSksIG5vZGVJZChub2RlKSlcbiAgICB9KVxuICAgICAgLnBpcGUodGFwKCgpID0+IHRoaXMubG9hZGluZy5zZXQoZmFsc2UpKSlcbiAgICAgIC5zdWJzY3JpYmUoKHsgbG9ncywgY29uZmlnIH0pID0+IHtcbiAgICAgICAgdGhpcy5jb25maWcuc2V0KGNvbmZpZyk7XG4gICAgICAgIHRoaXMuYWxsTG9ncy5zZXQobG9ncyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZEJsYW5rTm9kZXMoKSB7XG4gICAgcmV0dXJuIG9mKHRoaXMuYWxsVGVybXMoKSkucGlwZShcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwcmV2LCBjdXJyKSA9PiBsaXN0VGVybUlkKHByZXYpICE9PSBsaXN0VGVybUlkKGN1cnIpKSxcbiAgICAgIG1lcmdlQWxsKCksXG4gICAgICBtYXAoXG4gICAgICAgIGdyb3VwTG9nc0J5VGVybShcbiAgICAgICAgICB0aGlzLm5vZGVUeXBlKCksXG4gICAgICAgICAgdGhpcy5sb2dzKCksXG4gICAgICAgICAgdGhpcy5lbmdpbmVNb2RlbHMoKSxcbiAgICAgICAgICB0aGlzLmNvbmZpZygpLFxuICAgICAgICAgIHRoaXMuX29yaWdpbmFsVmFsdWVzKCkgYXMgYmxhbmtOb2RlW10sXG4gICAgICAgICAgdGhpcy5fcmVjYWxjdWxhdGVkVmFsdWVzKCkgYXMgYmxhbmtOb2RlW10sXG4gICAgICAgICAgdGhpcy5fbm9kZUtleSgpIGFzIGJsYW5rTm9kZXNLZXlcbiAgICAgICAgKVxuICAgICAgKSxcbiAgICAgIGZpbHRlcihzaG91bGRTaG93QmxhbmtOb2RlKSxcbiAgICAgIHRvQXJyYXkoKSxcbiAgICAgIG1lcmdlTWFwKHZhbHVlcyA9PiB0aGlzLmZldGNoVGVybUlkcyh2YWx1ZXMpLnBpcGUobWFwKCgpID0+IHZhbHVlcykpKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGxvYWROb25CbGFua05vZGVzKCkge1xuICAgIGNvbnN0IG1hcEZ1bmMgPSBncm91cGRMb2dzQnlLZXkoXG4gICAgICB0aGlzLm5vZGVUeXBlKCksXG4gICAgICB0aGlzLl9ub2RlS2V5KCkgYXMgbm9uQmxhbmtOb2Rlc0tleSxcbiAgICAgIHRoaXMubG9ncygpLFxuICAgICAgdGhpcy5lbmdpbmVNb2RlbHMoKSxcbiAgICAgIHRoaXMuX29yaWdpbmFsVmFsdWVzKCkgYXMgbm9uQmxhbmtOb2RlLFxuICAgICAgdGhpcy5fcmVjYWxjdWxhdGVkVmFsdWVzKCkgYXMgbm9uQmxhbmtOb2RlXG4gICAgKTtcbiAgICBjb25zdCBrZXlzID0gY29tcHV0ZUtleXModGhpcy5fb3JpZ2luYWxWYWx1ZXMoKSBhcyBub25CbGFua05vZGUsIHRoaXMuX3JlY2FsY3VsYXRlZFZhbHVlcygpIGFzIG5vbkJsYW5rTm9kZSk7XG4gICAgcmV0dXJuIGZyb20oa2V5cykucGlwZShtYXAobWFwRnVuYyksIHRvQXJyYXkoKSk7XG4gIH1cblxuICBwcml2YXRlIGZldGNoVGVybUlkcyh2YWx1ZXM6IElCbGFua05vZGVMb2dbXSkge1xuICAgIHJldHVybiBvZih2YWx1ZXMpLnBpcGUoXG4gICAgICBtZXJnZU1hcCh2ID0+IHYuZmxhdE1hcCh2diA9PiB2di5zdWJWYWx1ZXMpKSxcbiAgICAgIG1hcCh2ID0+IHYuaWQpLFxuICAgICAgZGlzdGluY3QoKSxcbiAgICAgIGZpbHRlcih2ID0+ICEhdiksXG4gICAgICB0b0FycmF5KCksXG4gICAgICBtZXJnZU1hcCgoaWRzOiBzdHJpbmdbXSkgPT5cbiAgICAgICAgdGhpcy5zZWFyY2hUZXJtcyh7XG4gICAgICAgICAgYm9vbDoge1xuICAgICAgICAgICAgbXVzdDogW21hdGNoVHlwZShOb2RlVHlwZS5UZXJtKV0sXG4gICAgICAgICAgICBzaG91bGQ6IGlkcy5tYXAoaWQgPT4gbWF0Y2hFeGFjdFF1ZXJ5KCdAaWQnLCBpZCkpLFxuICAgICAgICAgICAgbWluaW11bV9zaG91bGRfbWF0Y2g6IDFcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApLFxuICAgICAgcmVkdWNlKChwcmV2LCBjdXJyKSA9PiAoeyAuLi5wcmV2LCBbY3VyclsnQGlkJ11dOiBjdXJyIH0pLCB7fSBhcyBJVGVybXNCeUlkTWFwcGluZyksXG4gICAgICB0YXAodmFsdWVzID0+IHRoaXMudGVybXNCeUlkLnNldCh2YWx1ZXMpKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN1Z2dlc3RCeVRlcm0odGVybTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuYWxsVGVybXMoKVxuICAgICAgLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUpXG4gICAgICAuZmlsdGVyKHYgPT4gdGVybVNlYXJjaCh2KS5pbmNsdWRlcyh0ZXJtU2VhcmNoKHRlcm0pKSk7XG4gIH1cblxuICBwcml2YXRlIHNlYXJjaFRlcm1zKHF1ZXJ5OiBhbnkpIHtcbiAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xuICAgIHJldHVybiB0aGlzLnNlYXJjaFNlcnZpY2VcbiAgICAgIC5zZWFyY2gkPElUZXJtSlNPTkxELCBOb2RlVHlwZS5UZXJtPih7XG4gICAgICAgIGZpZWxkczogWydAdHlwZScsICdAaWQnLCAnbmFtZSddLFxuICAgICAgICBsaW1pdDogMTAwMDAsXG4gICAgICAgIHF1ZXJ5XG4gICAgICB9KVxuXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKCgpID0+IHRoaXMubG9hZGluZy5zZXQoZmFsc2UpKSxcbiAgICAgICAgbWFwKCh7IHJlc3VsdHMgfSkgPT4gcmVzdWx0cylcbiAgICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdHJhY2tCeUJsYW5rTm9kZShfaW5kZXg6IG51bWJlciwgbm9kZTogYW55KSB7XG4gICAgcmV0dXJuIG5vZGUudGVybUlkIHx8IG5vZGUua2V5O1xuICB9XG5cbiAgcHJvdGVjdGVkIHRlcm1DaGFuZ2VkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRlcm0uc2V0KHZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbmx5UmVxdWlyZWRDaGFuZ2VkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5vbmx5UmVxdWlyZWQuc2V0KHZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtZXRob2ROYW1lKHsgbWV0aG9kSWQsIG1vZGVsIH06IElDb25maWdNb2RlbCkge1xuICAgIHJldHVybiB0aGlzLm1ldGhvZHNCeUlkKCk/LlttZXRob2RJZF0/Lm5hbWUgfHwgbWV0aG9kSWRMYWJlbChtZXRob2RJZCwgbW9kZWwpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhc01ldGhvZFRpZXIodmFsdWVzOiBibGFua05vZGVbXSwgbWV0aG9kVGllcjogRW1pc3Npb25NZXRob2RUaWVyKSB7XG4gICAgcmV0dXJuIHZhbHVlcy5zb21lKHYgPT4gJ21ldGhvZFRpZXInIGluIHYgJiYgdi5tZXRob2RUaWVyID09PSBtZXRob2RUaWVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0ZXJtQnlJZChpZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMudGVybXNCeUlkKCk/LltpZF0gfHxcbiAgICAgICh7XG4gICAgICAgICdAdHlwZSc6IE5vZGVUeXBlLlRlcm0sXG4gICAgICAgICdAaWQnOiBpZCxcbiAgICAgICAgbmFtZTogdGVybVR5cGVMYWJlbChpZClcbiAgICAgIH0gYXMgSVRlcm1KU09OTEQpXG4gICAgKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInB4LTMgcGItM1wiPlxuICA8ZGl2IGNsYXNzPVwiaGFzLXRleHQtcmlnaHQgaXMtbWItMlwiICpuZ0lmPVwiIWlzRXh0ZXJuYWwgJiYgbG9nc1VybCgpXCI+XG4gICAgPGEgY2xhc3M9XCJpcy1zaXplLTdcIiBbaHJlZl09XCJsb2dzVXJsKClcIiB0YXJnZXQ9XCJfYmxhbmtcIj5cbiAgICAgIDxmYS1pY29uIGljb249XCJleHRlcm5hbC1saW5rLWFsdFwiPjwvZmEtaWNvbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwicGwtMlwiPk9wZW4gRnVsbCBMb2dzPC9zcGFuPlxuICAgIDwvYT5cbiAgPC9kaXY+XG5cbiAgPGhlLWRhdGEtdGFibGUgY2xhc3M9XCJtYi0xIGlzLXNtYWxsXCIgW3NtYWxsXT1cInRydWVcIiBtYXhIZWlnaHQ9XCIzMjBcIj5cbiAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBpcy1mdWxsd2lkdGggaXMtbmFycm93IGlzLXN0cmlwZWRcIj5cbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0aCBjbGFzcz1cIndpZHRoLWF1dG8gaGFzLWJvcmRlci1yaWdodFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCIgKm5nSWY9XCJlbmFibGVGaWx0ZXJCeVRlcm0oKVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbCBpcy1leHBhbmRlZCBoYXMtaWNvbnMtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5wdXQgc2VhcmNoLWlucHV0IGlzLXNtYWxsXCJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInRlcm0oKVwiXG4gICAgICAgICAgICAgICAgICBuYW1lPVwidGVybVwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBlbnRyeSBieSBuYW1lXCJcbiAgICAgICAgICAgICAgICAgIFtuZ2JUeXBlYWhlYWRdPVwic3VnZ2VzdFRlcm1cIlxuICAgICAgICAgICAgICAgICAgW2ZvY3VzRmlyc3RdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAoZm9jdXMpPVwidHlwZWFoZWFkRm9jdXMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAoc2VsZWN0SXRlbSk9XCJ0ZXJtQ2hhbmdlZCgkZXZlbnQuaXRlbSlcIiAvPlxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiaWNvbiBpcy1zbWFsbCBpcy1yaWdodFwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiIXRlcm0oKVwiIChjbGljayk9XCJ0ZXJtQ2hhbmdlZCgnJylcIj5cbiAgICAgICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJ0aW1lc1wiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8dGggKm5nSWY9XCJpc0JsYW5rTm9kZXMoKVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1wci0xXCI+VW5pdHM8L3NwYW4+XG4gICAgICAgICAgICA8c3Bhbj4ocGVyJm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gW25nU3dpdGNoXT1cImZ1bmN0aW9uYWxVbml0KClcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiQ3ljbGVGdW5jdGlvbmFsVW5pdFsnMSBoYSddXCI+aGVjdGFyZTwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+a2cgcHJvZHVjdDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4+KTwvc3Bhbj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0aD5PcmlnaW5hbDwvdGg+XG4gICAgICAgICAgPHRoPlJlY2FsY3VsYXRlZDwvdGg+XG4gICAgICAgICAgPHRoICpuZ0lmPVwiaXNCbGFua05vZGVzKClcIj5EaWZmZXJlbmNlPC90aD5cbiAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGMgb2YgbWV0aG9kTW9kZWxzQ291bnQoKSB8IHRpbWVzOyBsZXQgaSA9IGluZGV4XCI+KHt7IGkgKyAxIH19KTwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuICAgICAgPHRib2R5PlxuICAgICAgICA8dHIgKm5nSWY9XCJsb2FkaW5nKClcIj5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJoYXMtdGV4dC1jZW50ZXJlZFwiIGNvbHNwYW49XCI2XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGFzLXRleHQtY2VudGVyIHB5LTNcIj5cbiAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cInNwaW5uZXJcIiBbcHVsc2VdPVwidHJ1ZVwiIHNpemU9XCJsZ1wiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDx0ciAqbmdJZj1cIiFsb2FkaW5nKCkgJiYgYmxhbmtOb2RlcygpLmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICAgIDx0ZCBjbGFzcz1cImhhcy10ZXh0LWNlbnRlcmVkXCIgY29sc3Bhbj1cIjZcIj5cbiAgICAgICAgICAgIDxzcGFuPnt7IF9ub0RhdGFNZXNzYWdlKCkgfHwgJ05vIGRhdGEnIH19PC9zcGFuPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJsYW5rTm9kZSBvZiBibGFua05vZGVzKCk7IHRyYWNrQnk6IHRyYWNrQnlCbGFua05vZGVcIj5cbiAgICAgICAgICA8dHIgW2NsYXNzLmhhcy1zdWItcm93c109XCJibGFua05vZGUuY2FuT3BlblwiIFtjbGFzcy5pcy1vcGVuXT1cImJsYW5rTm9kZS5pc09wZW5cIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cIndpZHRoLWF1dG8gaGFzLWJvcmRlci1yaWdodCBpcy1ub3dyYXBcIiBbYXR0ci50aXRsZV09XCJibGFua05vZGUudGVybT8ubmFtZSB8fCBibGFua05vZGUua2V5XCI+XG4gICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtYWxpZ24tdG9wIHByLTIgb3Blbi1ub2RlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiYmxhbmtOb2RlLmlzT3BlbiA9ICFibGFua05vZGUuaXNPcGVuXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImJsYW5rTm9kZS5jYW5PcGVuXCI+XG4gICAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cImFuZ2xlLWRvd25cIiBbY2xhc3MuaXMtaGlkZGVuXT1cIiFibGFua05vZGUuaXNPcGVuXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJhbmdsZS1yaWdodFwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiYmxhbmtOb2RlLmlzT3BlblwiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICA8aGUtbm9kZS1saW5rIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrIGlzLXByZS13cmFwXCIgKm5nSWY9XCJibGFua05vZGUudGVybVwiIFtub2RlXT1cImJsYW5rTm9kZS50ZXJtXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gW2lubmVySHRtbF09XCJibGFua05vZGUudGVybS5uYW1lIHwgY29tcG91bmRcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDwvaGUtbm9kZS1saW5rPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3Nob3dCbGFua05vZGVLZXk+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgYmxhbmtOb2RlLmtleSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImJsYW5rTm9kZS5rZXk7IGVsc2Ugc2hvd0JsYW5rTm9kZUtleVwiPlxuICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIl9ub2RlS2V5KCkgPT09ICdjb21wbGV0ZW5lc3MnXCJcbiAgICAgICAgICAgICAgICAgIFtocmVmXT1cImJhc2VVcmwgKyAnL3NjaGVtYS9Db21wbGV0ZW5lc3MjJyArIGJsYW5rTm9kZS5rZXlcIlxuICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCI+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57eyBibGFua05vZGUua2V5IHwga2V5VG9MYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZCAqbmdJZj1cImlzQmxhbmtOb2RlcygpXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtbm93cmFwXCIgW2lubmVySHRtbF09XCJibGFua05vZGUudGVybT8udW5pdHMgfCBjb21wb3VuZFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdE9yaWdpbmFsVmFsdWU+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgYmxhbmtOb2RlLm9yaWdpbmFsVmFsdWUgfCBwcmVjaXNpb246IDMgfCBkZWZhdWx0OiAnLScgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJibGFua05vZGUuYWxsUGFyYWxsZWw7IGVsc2UgZGVmYXVsdE9yaWdpbmFsVmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBtb2RlbCBvZiBibGFua05vZGUuY29uZmlnTW9kZWxzWzBdXCI+XG4gICAgICAgICAgICAgICAgICB7eyBibGFua05vZGUub3JpZ2luYWxWYWx1ZUJ5TWV0aG9kSWRbbW9kZWwubWV0aG9kSWRdIHwgcHJlY2lzaW9uOiAzIHwgZGVmYXVsdDogJy0nIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFibGFua05vZGUuaXNPcmlnaW5hbCB8fCBibGFua05vZGUuaXNSZWNhbGN1bGF0ZWQ7IGVsc2Ugbm90UmVjYWxjdWxhdGVkXCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0UmVjYWxjdWxhdGVkVmFsdWU+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57eyBibGFua05vZGUucmVjYWxjdWxhdGVkVmFsdWUgfCBwcmVjaXNpb246IDMgfCBkZWZhdWx0OiAnLScgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYmxhbmtOb2RlLmFsbFBhcmFsbGVsOyBlbHNlIGRlZmF1bHRSZWNhbGN1bGF0ZWRWYWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgbW9kZWwgb2YgYmxhbmtOb2RlLmNvbmZpZ01vZGVsc1swXVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBibGFua05vZGUucmVjYWxjdWxhdGVkVmFsdWVCeU1ldGhvZElkW21vZGVsLm1ldGhvZElkXSB8IHByZWNpc2lvbjogMyB8IGRlZmF1bHQ6ICctJyB9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZCAqbmdJZj1cImlzQmxhbmtOb2RlcygpXCIgY2xhc3M9XCJpcy1ub3dyYXBcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0RGVsdGFWYWx1ZT5cbiAgICAgICAgICAgICAgICA8aGUtYmxhbmstbm9kZS12YWx1ZS1kZWx0YVxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJibGFua05vZGUub3JpZ2luYWwubGVuZ3RoICYmIGJsYW5rTm9kZS5pc1JlY2FsY3VsYXRlZDsgZWxzZSBub1ZhbHVlXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJibGFua05vZGUucmVjYWxjdWxhdGVkVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgW29yaWdpbmFsVmFsdWVdPVwiYmxhbmtOb2RlLm9yaWdpbmFsVmFsdWVcIj48L2hlLWJsYW5rLW5vZGUtdmFsdWUtZGVsdGE+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJibGFua05vZGUuYWxsUGFyYWxsZWw7IGVsc2UgZGVmYXVsdERlbHRhVmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBtb2RlbCBvZiBibGFua05vZGUuY29uZmlnTW9kZWxzWzBdXCI+XG4gICAgICAgICAgICAgICAgICA8aGUtYmxhbmstbm9kZS12YWx1ZS1kZWx0YVxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgIGJsYW5rTm9kZS5vcmlnaW5hbFZhbHVlQnlNZXRob2RJZFttb2RlbC5tZXRob2RJZF0gIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGJsYW5rTm9kZS5yZWNhbGN1bGF0ZWRWYWx1ZUJ5TWV0aG9kSWRbbW9kZWwubWV0aG9kSWRdICE9PSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugbm9WYWx1ZVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiYmxhbmtOb2RlLnJlY2FsY3VsYXRlZFZhbHVlQnlNZXRob2RJZFttb2RlbC5tZXRob2RJZF1cIlxuICAgICAgICAgICAgICAgICAgICBbb3JpZ2luYWxWYWx1ZV09XCJibGFua05vZGUub3JpZ2luYWxWYWx1ZUJ5TWV0aG9kSWRbbW9kZWwubWV0aG9kSWRdXCI+PC9oZS1ibGFuay1ub2RlLXZhbHVlLWRlbHRhPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYmxhbmtOb2RlTW9kZWxzOyBjb250ZXh0OiB7IGRhdGE6IGJsYW5rTm9kZSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC90cj5cblxuICAgICAgICAgIDx0clxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IHN1YlZhbHVlIG9mIGJsYW5rTm9kZS5rZXlzXCJcbiAgICAgICAgICAgIFtjbGFzcy5pcy1oaWRkZW5dPVwiIWJsYW5rTm9kZS5pc09wZW5cIlxuICAgICAgICAgICAgW2NsYXNzLmhhcy1zdWItcm93c109XCJibGFua05vZGUuc3ViVmFsdWVzPy5sZW5ndGhcIlxuICAgICAgICAgICAgW2NsYXNzLmlzLXN1Yi1yb3ddPVwiYmxhbmtOb2RlLmNhbk9wZW5cIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cIndpZHRoLWF1dG8gaGFzLWJvcmRlci1yaWdodCBpcy1ub3dyYXBcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtYWxpZ24tdG9wIHBsLTMgcHItMSBmaWVsZC1ub2RlXCI+RmllbGQ6PC9zcGFuPlxuXG4gICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtcHJlLXdyYXBcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiYmxhbmtOb2RlLnR5cGVcIlxuICAgICAgICAgICAgICAgIFtocmVmXT1cImJhc2VVcmwgKyAnL3NjaGVtYS8nICsgYmxhbmtOb2RlLnR5cGUgKyAnIycgKyBzdWJWYWx1ZS5rZXlcIlxuICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cInN1YlZhbHVlLmtleVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IHN1YlZhbHVlLmtleSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLWlubGluZS1ibG9jayBpcy1hbGlnbi10b3BcIiAqbmdJZj1cIiFibGFua05vZGUudHlwZVwiPnt7IHN1YlZhbHVlLmtleSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQgKm5nSWY9XCJpc0JsYW5rTm9kZXMoKVwiPjwvdGQ+XG4gICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic3ViVmFsdWUub3JpZ2luYWxWYWx1ZSAhPT0gbnVsbDsgZWxzZSBub1ZhbHVlXCI+XG4gICAgICAgICAgICAgICAge3sgc3ViVmFsdWUub3JpZ2luYWxWYWx1ZSB8IHByZWNpc2lvbjogMyB8IGRlZmF1bHQ6ICctJyB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInN1YlZhbHVlLmlzUmVjYWxjdWxhdGVkIHx8IHN1YlZhbHVlLmtleSA9PT0gJ2ltcGFjdEFzc2Vzc21lbnQnOyBlbHNlIG5vdFJlY2FsY3VsYXRlZFwiPlxuICAgICAgICAgICAgICAgIHt7IHN1YlZhbHVlLnJlY2FsY3VsYXRlZFZhbHVlIHwgcHJlY2lzaW9uOiAzIHwgZGVmYXVsdDogJy0nIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQgKm5nSWY9XCJpc0JsYW5rTm9kZXMoKVwiPi08L3RkPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJsYW5rTm9kZU1vZGVsczsgY29udGV4dDogeyBkYXRhOiBzdWJWYWx1ZSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC90cj5cblxuICAgICAgICAgIDx0clxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IHN1YlZhbHVlIG9mIGJsYW5rTm9kZS5zdWJWYWx1ZXNcIlxuICAgICAgICAgICAgW2NsYXNzLmlzLWhpZGRlbl09XCIhYmxhbmtOb2RlLmlzT3BlblwiXG4gICAgICAgICAgICBbY2xhc3MuaXMtc3ViLXJvd109XCJibGFua05vZGUuY2FuT3BlblwiPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwid2lkdGgtYXV0byBoYXMtYm9yZGVyLXJpZ2h0XCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrIGlzLWFsaWduLXRvcCBwbC0zXCI+e3sgc3ViVmFsdWUua2V5IHwga2V5VG9MYWJlbCB9fTwvc3Bhbj5cblxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3ViVmFsdWUuaWRcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLWlubGluZS1ibG9ja1wiIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrIGlzLWFsaWduLXRvcCBwci0xXCI+Ojwvc3Bhbj5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInN1YlZhbHVlLmtleVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2tcIiAqbmdTd2l0Y2hDYXNlPVwiJ2JhY2tncm91bmREYXRhJ1wiPnt7IHN1YlZhbHVlLmlkIHwga2V5VG9MYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxoZS1ub2RlLWxpbmtcbiAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoRGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlzLWJsb2NrIHBsLTRcIlxuICAgICAgICAgICAgICAgICAgICBbbm9kZV09XCJ0ZXJtQnlJZChzdWJWYWx1ZS5pZClcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJ0ZXJtQnlJZChzdWJWYWx1ZS5pZCkubmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJIdG1sXT1cInRlcm1CeUlkKHN1YlZhbHVlLmlkKS5uYW1lIHwgY29tcG91bmRcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2hlLW5vZGUtbGluaz5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwiaXNCbGFua05vZGVzKClcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1ub3dyYXBcIiAqbmdJZj1cInN1YlZhbHVlLnNob3dVbml0c1wiIFtpbm5lckh0bWxdPVwiYmxhbmtOb2RlLnRlcm0/LnVuaXRzIHwgY29tcG91bmRcIj48L3NwYW4+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInN1YlZhbHVlLm9yaWdpbmFsVmFsdWUgIT09IG51bGw7IGVsc2Ugbm9WYWx1ZVwiPlxuICAgICAgICAgICAgICAgIHt7IHN1YlZhbHVlLm9yaWdpbmFsVmFsdWUgfCBwcmVjaXNpb246IDMgfCBkZWZhdWx0OiAnLScgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzdWJWYWx1ZS5pc1JlY2FsY3VsYXRlZDsgZWxzZSBub3RSZWNhbGN1bGF0ZWRcIj5cbiAgICAgICAgICAgICAgICB7eyBzdWJWYWx1ZS5yZWNhbGN1bGF0ZWRWYWx1ZSB8IHByZWNpc2lvbjogMyB8IGRlZmF1bHQ6ICctJyB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwiaXNCbGFua05vZGVzKClcIj4tPC90ZD5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJibGFua05vZGVNb2RlbHM7IGNvbnRleHQ6IHsgZGF0YTogc3ViVmFsdWUgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC90Ym9keT5cbiAgICA8L3RhYmxlPlxuICA8L2hlLWRhdGEtdGFibGU+XG5cbiAgPGRpdiBjbGFzcz1cImlzLXNpemUtNyBpcy1pdGFsaWNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sdW1ucyBpcy12YXJpYWJsZSBpcy0xIG15LTBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4gaXMtbmFycm93XCI+XG4gICAgICAgIDxwPlxuICAgICAgICAgIDxhIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrIHByLTJcIiAoY2xpY2spPVwic2hvd0xlZ2VuZCA9ICFzaG93TGVnZW5kXCI+XG4gICAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwiYW5nbGUtZG93blwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiIXNob3dMZWdlbmRcIj48L2ZhLWljb24+XG4gICAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwiYW5nbGUtcmlnaHRcIiBbY2xhc3MuaXMtaGlkZGVuXT1cInNob3dMZWdlbmRcIj48L2ZhLWljb24+XG4gICAgICAgICAgPC9hPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrXCI+TGVnZW5kOjwvc3Bhbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8dWwgY2xhc3M9XCJjb250ZW50IHBsLTJcIiBbY2xhc3MuaXMtaGlkZGVuXT1cIiFzaG93TGVnZW5kXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3RhdHVzIG9mIExvZ1N0YXR1cyB8IGtleXNcIj5cbiAgICAgICAgICAgIDxsaSAqbmdJZj1cImxvZ0ljb25bc3RhdHVzLnZhbHVlXVwiIGNsYXNzPVwiaGFzLXRleHQte3sgbG9nQ29sb3Jbc3RhdHVzLnZhbHVlXSB9fVwiPlxuICAgICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJsb2dJY29uW3N0YXR1cy52YWx1ZV1cIj48L2ZhLWljb24+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGwtMVwiPnt7IHN0YXR1cy52YWx1ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvdWw+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4gaGFzLXRleHQtcmlnaHRcIiAqbmdJZj1cImZpbHRlcmVkVHlwZSgpXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImlzLWlubGluZS1ibG9jayBjaGVja2JveFwiPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0b3JcIlxuICAgICAgICAgICAgW25nTW9kZWxdPVwib25seVJlcXVpcmVkXCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwib25seVJlcXVpcmVkQ2hhbmdlZCgkZXZlbnQudGFyZ2V0LmNoZWNrZWQpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhIXRlcm0oKVwiIC8+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtbC0yXCI+XG4gICAgICAgICAgICBTaG93IG9ubHkge3sgZmlsdGVyZWRUeXBlKCkgfCBwbHVyYWxpemUgfX0gaW5jbHVkZWQgaW4gdGhlIGRlZmF1bHQgSGVzdGlhIHN5c3RlbSBib3VuZGFyeVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2JsYW5rTm9kZU1vZGVscyBsZXQtZGF0YT1cImRhdGFcIj5cbiAgPG5nLXRlbXBsYXRlICNub3RJblN5c3RlbUJvdW5kYXJ5PlxuICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cIm1ldGhvZE1vZGVsc0NvdW50KClcIj5cbiAgICAgIDxzcGFuPk5vdCBpbiBIZXN0aWEgc3lzdGVtIGJvdW5kYXJ5PC9zcGFuPlxuICAgIDwvdGQ+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzU3lzdGVtQm91bmRhcnkoZGF0YSk7IGVsc2Ugbm9WYWx1ZVwiPlxuICAgIDx0ZCBjbGFzcz1cImJsYW5rLW5vZGUtaW5kZXgte3sgaSB9fVwiICpuZ0Zvcj1cImxldCBjIG9mIG1ldGhvZE1vZGVsc0NvdW50KCkgfCB0aW1lczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldE1vZGVsc0F0KGRhdGEsIGkpOyBsZXQgbW9kZWxzOyBlbHNlOiBub1ZhbHVlXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbW9kZWxTZXJpZT5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYmxhbmtOb2RlTW9kZWw7IGNvbnRleHQ6IHsgbW9kZWw6IG1vZGVscywgZGF0YSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJtb2RlbHMgfCBpc0FycmF5OyBlbHNlIG1vZGVsU2VyaWVcIj5cbiAgICAgICAgICA8cCAqbmdGb3I9XCJsZXQgbW9kZWwgb2YgbW9kZWxzXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYmxhbmtOb2RlTW9kZWw7IGNvbnRleHQ6IHsgbW9kZWwsIGRhdGEgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L3RkPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYmxhbmtOb2RlTW9kZWwgbGV0LW1vZGVsPVwibW9kZWxcIiBsZXQtZGF0YT1cImRhdGFcIj5cbiAgPHNwYW5cbiAgICBjbGFzcz1cImlzLW5vd3JhcFwiXG4gICAgW2NsYXNzLnRyaWdnZXItcG9wb3Zlcl09XCJtb2RlbC5zaG93TG9nc1wiXG4gICAgW25nYlBvcG92ZXJdPVwibG9nRGV0YWlsc1wiXG4gICAgW2F1dG9DbG9zZV09XCInb3V0c2lkZSdcIlxuICAgIHBvcG92ZXJDbGFzcz1cImlzLW5hcnJvd1wiXG4gICAgdHJpZ2dlcnM9XCJtYW51YWxcIlxuICAgICNwPVwibmdiUG9wb3ZlclwiXG4gICAgcGxhY2VtZW50PVwibGVmdFwiXG4gICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgKGNsaWNrKT1cInAuaXNPcGVuKCkgPyBwLmNsb3NlKCkgOiBtb2RlbC5zaG93TG9ncyA/IHAub3Blbih7IGxvZ3M6IG1vZGVsLmxvZ3MgfSkgOiBudWxsXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJpcy1jYXBpdGFsaXplZFwiPnt7IG1ldGhvZE5hbWUobW9kZWwpIH19PC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwicGwtMVwiICpuZ0lmPVwibW9kZWwubG9ncz8ubWV0aG9kVGllciB8fCBtb2RlbC5tb2RlbD8ubWV0aG9kVGllclwiPlxuICAgICAgW3t7IG1vZGVsLmxvZ3M/Lm1ldGhvZFRpZXIgfHwgbW9kZWwubW9kZWw/Lm1ldGhvZFRpZXIgfX1dXG4gICAgPC9zcGFuPlxuXG4gICAgPHNwYW5cbiAgICAgIGNsYXNzPVwicGwtMSBoYXMtdGV4dC17eyBsb2dDb2xvclttb2RlbC5zdGF0dXNdIH19IHRyaWdnZXItcG9wb3ZlclwiXG4gICAgICBbbmdiUG9wb3Zlcl09XCJsb2dTdGF0dXNEZXRhaWxzXCJcbiAgICAgIFthdXRvQ2xvc2VdPVwiJ291dHNpZGUnXCJcbiAgICAgIHBvcG92ZXJDbGFzcz1cImlzLW5hcnJvd1wiXG4gICAgICB0cmlnZ2Vycz1cIm1hbnVhbFwiXG4gICAgICAjcDE9XCJuZ2JQb3BvdmVyXCJcbiAgICAgIHBsYWNlbWVudD1cImxlZnRcIlxuICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBwMS5pc09wZW4oKSA/IHAxLmNsb3NlKCkgOiBwMS5vcGVuKHsgbW9kZWwsIGRhdGEgfSlcIj5cbiAgICAgIDxmYS1pY29uIFtpY29uXT1cImxvZ0ljb25bbW9kZWwuc3RhdHVzXVwiPjwvZmEtaWNvbj5cbiAgICA8L3NwYW4+XG5cbiAgICA8c3BhbiBjbGFzcz1cInBsLTFcIiAqbmdJZj1cIm1vZGVsLm1vZGVsXCI+XG4gICAgICAoXG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZG9jc0xpbms7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBtb2RlbC5tb2RlbCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICApXG4gICAgPC9zcGFuPlxuICA8L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI25vVmFsdWU+LTwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbm90UmVjYWxjdWxhdGVkPm5vdCByZWNhbGN1bGF0ZWQ8L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xvZ0RldGFpbHMgbGV0LWxvZ3M9XCJsb2dzXCI+XG4gIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb250YWluZXJcIiAqYmluZE9uY2U9XCJsb2dzXCI+XG4gICAgPHRhYmxlIGNsYXNzPVwidGFibGUgaXMtZGFyayBpcy1mdWxsd2lkdGhcIj5cbiAgICAgIDx0Ym9keT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvZ3M/LnJlcXVpcmVtZW50c1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGtleSBvZiByZXF1aXJlbWVudEtleXMobG9ncy5yZXF1aXJlbWVudHMpXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9nTGluZTsgY29udGV4dDogeyBrZXksIHZhbHVlOiBsb2dzLnJlcXVpcmVtZW50c1trZXldIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvZ3M/LmxvZ3NcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBrZXkgb2YgbG9ncy5sb2dzIHwga2V5c1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvZ0xpbmU7IGNvbnRleHQ6IGtleVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvdGJvZHk+XG4gICAgPC90YWJsZT5cbiAgPC9kaXY+XG5cbiAgPG5nLWNvbnRhaW5lciAqYmluZE9uY2U9XCJsb2dzXCI+XG4gICAgPGRpdiBjbGFzcz1cIml0LW10LTJcIiAqbmdJZj1cImxvZ3M/Lm1pc3NpbmdMb29rdXBzPy5sZW5ndGhcIj5cbiAgICAgIDxwPk9wdGlvbmFsIGRhdGEgbWlzc2luZzo8L3A+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb250YWluZXIgZGF0YS10YWJsZS1jb250YWluZXJcIj5cbiAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgaXMtZGFyayBpcy1mdWxsd2lkdGggaXMtc3RyaXBlZFwiPlxuICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiaGFzLXRleHQtd2hpdGVcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj5GaWxlbmFtZTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiaGFzLXRleHQtd2hpdGVcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj5Db2x1bW4gVGl0bGU8L3NwYW4+XG4gICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgIDx0aCBjbGFzcz1cImhhcy10ZXh0LXdoaXRlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+Um93ICh0ZXJtLmlkKTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICA8dGJvZHkgY2xhc3M9XCJoYXMtdGV4dC13aGl0ZVwiPlxuICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBkYXRhIG9mIGxvZ3MubWlzc2luZ0xvb2t1cHNcIj5cbiAgICAgICAgICAgICAgPHRkPnt7IGRhdGEuZmlsZW5hbWUgfX08L3RkPlxuICAgICAgICAgICAgICA8dGQ+e3sgZGF0YS5jb2x1bW4gfX08L3RkPlxuICAgICAgICAgICAgICA8dGQ+e3sgZGF0YS50ZXJtSWQgfX08L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICA8L3RhYmxlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsb2dMaW5lVmFsdWUgbGV0LWtleT1cImtleVwiIGxldC12YWx1ZT1cInZhbHVlXCI+XG4gIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFZhbHVlPlxuICAgIDxzcGFuIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrIGlzLWFsaWduLW1pZGRsZVwiPnt7IHZhbHVlIH19PC9zcGFuPlxuICA8L25nLXRlbXBsYXRlPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVxdWlyZW1lbnRMaW5rZWROb2RlKGtleSwgdmFsdWUpOyBsZXQgbGlua2VkTm9kZTsgZWxzZTogZGVmYXVsdFZhbHVlXCI+XG4gICAgPGhlLW5vZGUtbGlua1xuICAgICAgY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtYWxpZ24tbWlkZGxlXCJcbiAgICAgIGxpbmtDbGFzcz1cImlzLWRhcmtcIlxuICAgICAgW25vZGVdPVwibGlua2VkTm9kZVwiXG4gICAgICBbc2hvd0V4dGVybmFsTGlua109XCJ0cnVlXCI+PC9oZS1ub2RlLWxpbms+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsb2dMaW5lIGxldC1rZXk9XCJrZXlcIiBsZXQtdmFsdWU9XCJ2YWx1ZVwiPlxuICA8dHI+XG4gICAgPHRkIGNsYXNzPVwiaGFzLWJvcmRlci1yaWdodCBjb3B5LWxvZ1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtYWxpZ24tbWlkZGxlXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdE1lc3NhZ2U+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwia2V5XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+e3sga2V5IHwga2V5VG9MYWJlbCB9fTwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncHJvcGVydHlfaWQnXCI+UHJvcGVydHkgVGVybSBAaWQ8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidwcm9kdWN0X2lkJ1wiPlByb2R1Y3QgVGVybSBAaWQ8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidpbnB1dF9pZCdcIj5JbnB1dCBUZXJtIEBpZDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbm9kZV90eXBlX2FsbG93ZWQnXCI+XG4gICAgICAgICAgICAgIDxzcGFuPklzIHRoZSBjdXJyZW50PC9zcGFuPlxuICAgICAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW14LTFcIj5Ob2RlPC9jb2RlPlxuICAgICAgICAgICAgICA8c3Bhbj5hbGxvd2VkIHRvIHJ1biB0aGlzIG1vZGVsPC9zcGFuPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc2l0ZVR5cGVfYWxsb3dlZCdcIj5cbiAgICAgICAgICAgICAgPHNwYW4+SXMgdGhlIGN1cnJlbnQ8L3NwYW4+XG4gICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPnNpdGVUeXBlPC9jb2RlPlxuICAgICAgICAgICAgICA8c3Bhbj5hbGxvd2VkIHRvIHJ1biB0aGlzIG1vZGVsPC9zcGFuPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncHJvZHVjdF9pZF9hbGxvd2VkJ1wiPlxuICAgICAgICAgICAgICA8c3Bhbj5BcmUgYW55IG9mIHRoZSBQcm9kdWN0PC9zcGFuPlxuICAgICAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW14LTFcIj5AaWQ8L2NvZGU+XG4gICAgICAgICAgICAgIDxzcGFuPmFsbG93ZWQgdG8gcnVuIHRoaXMgbW9kZWw8L3NwYW4+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidwcm9kdWN0X3Rlcm1UeXBlX2FsbG93ZWQnXCI+XG4gICAgICAgICAgICAgIDxzcGFuPkFyZSBhbnkgb2YgdGhlIFByb2R1Y3Q8L3NwYW4+XG4gICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPnRlcm1UeXBlPC9jb2RlPlxuICAgICAgICAgICAgICA8c3Bhbj5hbGxvd2VkIHRvIHJ1biB0aGlzIG1vZGVsPC9zcGFuPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaW5wdXRfaWRfYWxsb3dlZCdcIj5cbiAgICAgICAgICAgICAgPHNwYW4+QXJlIGFueSBvZiB0aGUgSW5wdXQ8L3NwYW4+XG4gICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPkBpZDwvY29kZT5cbiAgICAgICAgICAgICAgPHNwYW4+YWxsb3dlZCB0byBydW4gdGhpcyBtb2RlbDwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2lucHV0X3Rlcm1UeXBlX2FsbG93ZWQnXCI+XG4gICAgICAgICAgICAgIDxzcGFuPkFyZSBhbnkgb2YgdGhlIElucHV0PC9zcGFuPlxuICAgICAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW14LTFcIj50ZXJtVHlwZTwvY29kZT5cbiAgICAgICAgICAgICAgPHNwYW4+YWxsb3dlZCB0byBydW4gdGhpcyBtb2RlbDwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8IS0tIERlcHJlY2F0ZWQgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncHJpbWFyeV9wcm9kdWN0X2lkX2FsbG93ZWQnXCI+XG4gICAgICAgICAgICAgIDxzcGFuPklzIHRoZSBjdXJyZW50IHByaW1hcnkgcHJvZHVjdDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+QGlkPC9jb2RlPlxuICAgICAgICAgICAgICA8c3Bhbj5hbGxvd2VkIHRvIHJ1biB0aGlzIG1vZGVsPC9zcGFuPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncHJpbWFyeV9wcm9kdWN0X3Rlcm1UeXBlX2FsbG93ZWQnXCI+XG4gICAgICAgICAgICAgIDxzcGFuPklzIHRoZSBjdXJyZW50IHByaW1hcnkgcHJvZHVjdDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+dGVybVR5cGU8L2NvZGU+XG4gICAgICAgICAgICAgIDxzcGFuPmFsbG93ZWQgdG8gcnVuIHRoaXMgbW9kZWw8L3NwYW4+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2dlb3NwYXRpYWxfZGF0YSdcIj5cbiAgICAgICAgICAgICAgSGFzIGdlb3NwYXRpYWwgZGF0YSBuZWNlc3NhcnkgdG8gcnVuIHRoaXMgbW9kZWxcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2NvbnRhaW5zX2dlb3NwYXRpYWxfZGF0YSdcIj5cbiAgICAgICAgICAgICAgSGFzIGdlb3NwYXRpYWwgZGF0YSBuZWNlc3NhcnkgdG8gcnVuIHRoaXMgbW9kZWxcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2N1cnJlbnRfc2l6ZSdcIj5DdXJyZW50IHBvbHlnb24gYXJlYTwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ21heF9hcmVhX3NpemUnXCI+TWF4aW11bSBwb2x5Z29uIGFyZWEgdG8gcnVuIHRoaXMgbW9kZWw8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidiZWxvd19tYXhfYXJlYV9zaXplJ1wiPlBvbHlnb24gYmVsb3cgdGhlIG1heGltdW0gYXJlYTwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3JlZ2lvbl9mYWN0b3InXCI+RmFjdG9yIGZyb20gcmVnaW9uIGxvb2t1cDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaGFzX3Blc3RpY2lkZXNfaW5wdXRzJ1wiPlxuICAgICAgICAgICAgICA8c3Bhbj5DeWNsZSBjb250YWluczwvc3Bhbj5cbiAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+cGVzdGljaWRlQUk8L2NvZGU+XG4gICAgICAgICAgICAgIDxzcGFuPklucHV0czwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2FsbF9wZXN0aWNpZGVBSV9oYXZlX2xvb2t1cF92YWx1ZSdcIj5cbiAgICAgICAgICAgICAgPHNwYW4+QWxsPC9zcGFuPlxuICAgICAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW14LTFcIj5wZXN0aWNpZGVBSTwvY29kZT5cbiAgICAgICAgICAgICAgPHNwYW4+SW5wdXRzIGhhdmUgYSBsb29rdXAgdmFsdWU8L3NwYW4+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2hhc19jcm9wX3Jlc2lkdWVfYnVybnQnXCI+XG4gICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXItMVwiPmFib3ZlR3JvdW5kQ3JvcFJlc2lkdWVCdXJudDwvY29kZT5cbiAgICAgICAgICAgICAgPHNwYW4+aXMgcHJlc2VudCBhcyBQcm9kdWN0PC9zcGFuPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidsaXF1aWRfc2x1cnJ5X3NsdWRnZV9QJ1wiPkxpcXVpZCwgU2x1cnJ5LCBhbmQgU2x1ZGdlIFA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFyc2VMb2dDb21wbGV0ZW5lc3Moa2V5KTsgbGV0IGNvbXBsZXRlbmVzczsgZWxzZTogZGVmYXVsdE1lc3NhZ2VcIj5cbiAgICAgICAgICA8c3Bhbj5EYXRhIGNvbXBsZXRlbmVzcyBmb3I8L3NwYW4+XG4gICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+e3sgY29tcGxldGVuZXNzLmtleSB9fTwvY29kZT5cbiAgICAgICAgICA8c3Bhbj5tdXN0IGJlPC9zcGFuPlxuICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPnt7IGNvbXBsZXRlbmVzcy52YWx1ZSB9fTwvY29kZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3NwYW4+XG4gICAgICA8aGUtY2xpcGJvYXJkXG4gICAgICAgIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrIGlzLWFsaWduLW1pZGRsZVwiXG4gICAgICAgIGNsaXBib2FyZENsYXNzPVwiaXMtc2l6ZS03IGlzLXAtMVwiXG4gICAgICAgIFtpY29uXT1cIlsnZmFyJywgJ2Nsb25lJ11cIlxuICAgICAgICBbdmFsdWVdPVwia2V5XCJcbiAgICAgICAgW2hpZGVUZXh0XT1cInRydWVcIj48L2hlLWNsaXBib2FyZD5cbiAgICA8L3RkPlxuICAgIDx0ZD5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjc2luZ2xlVmFsdWU+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2dMaW5lVmFsdWU7IGNvbnRleHQ6IHsga2V5LCB2YWx1ZSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPGRpdiAqbmdJZj1cImxvZ1ZhbHVlQXJyYXkodmFsdWUpOyBsZXQgdmFsdWVBcnJheTsgZWxzZTogc2luZ2xlVmFsdWVcIj5cbiAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgaXMtZGFyayBpcy1ib3JkZXJlZCBpcy1zdHJpcGVkXCI+XG4gICAgICAgICAgPHRoZWFkICpuZ0lmPVwidmFsdWVBcnJheVswXSB8IGlzT2JqZWN0XCI+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0aCBjbGFzcz1cImhhcy10ZXh0LXdoaXRlXCIgKm5nRm9yPVwibGV0IHYgb2YgdmFsdWVBcnJheVswXSB8IGtleXNcIj57eyB2LmtleSB9fTwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCB2IG9mIHZhbHVlQXJyYXlcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzaW5nbGVBcnJheVZhbHVlPlxuICAgICAgICAgICAgICAgIDx0ZD57eyB2IH19PC90ZD5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInYgfCBpc09iamVjdDsgZWxzZSBzaW5nbGVBcnJheVZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCB2diBvZiB2IHwga2V5c1wiPnt7IHZ2LnZhbHVlIH19PC90ZD5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgIDwvdGFibGU+XG4gICAgICA8L2Rpdj5cbiAgICA8L3RkPlxuICA8L3RyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsb2dTdGF0dXNEZXRhaWxzIGxldC1tb2RlbD1cIm1vZGVsXCIgbGV0LWRhdGE9XCJkYXRhXCI+XG4gIDxuZy1jb250YWluZXIgKmJpbmRPbmNlPVwibW9kZWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaXMtbWItMlwiPlxuICAgICAgPHNwYW4+U3RhdHVzOjwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiaXMtcGwtMVwiPnt7IG1vZGVsLnN0YXR1cyB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtb2RlbC5zdGF0dXMgPT09IExvZ1N0YXR1cy5ub3RSZXF1aXJlZCAmJiBtb2RlbC5sb2dzPy5pc19ub3RfcmVsZXZhbnQgPT09ICdUcnVlJ1wiPlxuICAgICAgPHVsIGNsYXNzPVwiaXMtcGwtMyBpcy1saXN0LXN0eWxlLWRpc2NcIj5cbiAgICAgICAgPGxpICpuZ0lmPVwibW9kZWwubG9ncy5sb2dzPy5zaXRlVHlwZV9hbGxvd2VkID09PSAnRmFsc2UnXCI+XG4gICAgICAgICAgVGhlXG4gICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+c2l0ZS5zaXRlVHlwZTwvY29kZT5cbiAgICAgICAgICBpcyBub3QgcmVsZXZhbnQuXG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaSAqbmdJZj1cIm1vZGVsLmxvZ3MubG9ncz8ucHJvZHVjdF9pZF9hbGxvd2VkID09PSAnRmFsc2UnXCI+XG4gICAgICAgICAgTm9uZSBvZiB0aGVcbiAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW14LTFcIj5Qcm9kdWN0PC9jb2RlPlxuICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXItMVwiPnRlcm0uQGlkPC9jb2RlPlxuICAgICAgICAgIGlzIHJlbGV2YW50LlxuICAgICAgICA8L2xpPlxuICAgICAgICA8bGkgKm5nSWY9XCJtb2RlbC5sb2dzLmxvZ3M/LnByb2R1Y3RfdGVybVR5cGVfYWxsb3dlZCA9PT0gJ0ZhbHNlJ1wiPlxuICAgICAgICAgIE5vbmUgb2YgdGhlXG4gICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+UHJvZHVjdDwvY29kZT5cbiAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW1yLTFcIj50ZXJtLnRlcm1UeXBlPC9jb2RlPlxuICAgICAgICAgIGlzIHJlbGV2YW50LlxuICAgICAgICA8L2xpPlxuICAgICAgICA8bGkgKm5nSWY9XCJtb2RlbC5sb2dzLmxvZ3M/LmlucHV0X2lkX2FsbG93ZWQgPT09ICdGYWxzZSdcIj5cbiAgICAgICAgICBOb25lIG9mIHRoZVxuICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPklucHV0PC9jb2RlPlxuICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXItMVwiPnRlcm0uQGlkPC9jb2RlPlxuICAgICAgICAgIGlzIHJlbGV2YW50LlxuICAgICAgICA8L2xpPlxuICAgICAgICA8bGkgKm5nSWY9XCJtb2RlbC5sb2dzLmxvZ3M/LmlucHV0X3Rlcm1UeXBlX2FsbG93ZWQgPT09ICdGYWxzZSdcIj5cbiAgICAgICAgICBOb25lIG9mIHRoZVxuICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPklucHV0PC9jb2RlPlxuICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXItMVwiPnRlcm0udGVybVR5cGU8L2NvZGU+XG4gICAgICAgICAgaXMgcmVsZXZhbnQuXG4gICAgICAgIDwvbGk+XG4gICAgICA8L3VsPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nSWY9XCJtb2RlbC5sb2dzICYmIG1vZGVsLnN0YXR1cyAhPT0gTG9nU3RhdHVzLm5vdFJlcXVpcmVkICYmIG1vZGVsLnN0YXR1cyAhPT0gTG9nU3RhdHVzLnNraXBIaWVyYXJjaHlcIj5cbiAgICAgIDx1bCBjbGFzcz1cImlzLXBsLTMgaXMtbGlzdC1zdHlsZS1kaXNjXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjc2hvd1J1bk9yY2hlc3RyYXRvcj5cbiAgICAgICAgICA8bGkgY2xhc3M9XCJpcy1ydW4tb3JjaGVzdHJhdG9yXCI+XG4gICAgICAgICAgICA8cCAqbmdJZj1cIm1vZGVsLmxvZ3M/LnNob3VsZFJ1blwiPkFsbCB0aGUgcmVxdWlyZW1lbnRzIHdlcmUgbWV0IHRvIHJ1biB0aGUgbW9kZWwuPC9wPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtb2RlbC5sb2dzPy5zaG91bGRSdW5cIj5cbiAgICAgICAgICAgICAgPHA+U29tZSBvZiB0aGUgcmVxdWlyZW1lbnRzIHdlcmUgbm90IG1ldCB0byBydW4gdGhlIG1vZGVsLjwvcD5cbiAgICAgICAgICAgICAgPHA+WW91IGNhbiBjbGljayBvbiB0aGUgbW9kZWwgbmFtZSBvbiB0aGUgbGVmdCB0byB2aWV3IHRoZSBkZWJ1Z2dpbmcgbG9ncy48L3A+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtb2RlbC5sb2dzPy5sb2dzPy5lcnJvclwiPlxuICAgICAgICAgICAgICA8cD5UaGUgbW9kZWwgZmFpbGVkIHRvIHJ1biBmb3IgdGhlIGZvbGxvd2luZyByZWFzb246PC9wPlxuICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICA8Y29kZT57eyBtb2RlbC5sb2dzLmxvZ3MuZXJyb3IgfX08L2NvZGU+XG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPGxpXG4gICAgICAgICAgY2xhc3M9XCJpcy1uby1ydW4tb3JjaGVzdHJhdG9yXCJcbiAgICAgICAgICAqbmdJZj1cIm1vZGVsLmxvZ3M/LnNob3VsZFJ1bk9yY2hlc3RyYXRvciA9PT0gZmFsc2U7IGVsc2Ugc2hvd1J1bk9yY2hlc3RyYXRvclwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbW9kZWwubG9ncy5ydW5SZXF1aXJlZFwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1ydW4tbm9kZS10eXBlLW5vdC1hbGxvd2VkXCIgKm5nSWY9XCJtb2RlbC5sb2dzLmxvZ3M/Lm5vZGVfdHlwZV9hbGxvd2VkID09PSAnRmFsc2UnXCI+XG4gICAgICAgICAgICAgIFRoaXMgbW9kZWwgc2hvdWxkIG5vdCBydW4gZm9yIHt7IG5vZGVUeXBlKCkgfCBwbHVyYWxpemU6IDAgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcnVuTm9Db25maWc+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXJ1bi1ub3QtZW1wdHlcIiAqbmdJZj1cIm1vZGVsLmxvZ3MubG9ncz8uaXNfZW1wdHkgPT09ICdGYWxzZSdcIj5cbiAgICAgICAgICAgICAgVGhlIHt7IGRhdGEudHlwZSB8fCAnYmxhbmsgbm9kZScgfX0gd2l0aCBUZXJtXG4gICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPnt7IGRhdGEudGVybUlkIH19PC9jb2RlPlxuICAgICAgICAgICAgICBpcyBhbHJlYWR5IHByZXNlbnQgb3IgYWxyZWFkeSBhZGRlZCBieSBhbm90aGVyIG1vZGVsLlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibW9kZWwuY29uZmlnOyBlbHNlIHJ1bk5vQ29uZmlnXCI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cImlzLXJ1bi1zdHJhdGVneS17eyBtb2RlbC5jb25maWcucnVuU3RyYXRlZ3kgfX1cIiBbbmdTd2l0Y2hdPVwibW9kZWwuY29uZmlnLnJ1blN0cmF0ZWd5XCI+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInYWx3YXlzJ1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidhZGRfa2V5X2lmX21pc3NpbmcnXCI+V2Ugb25seSBnYXAtZmlsbCB0aGlzIGtleSBpZiBub3QgcHJlc2VudDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidhZGRfYmxhbmtfbm9kZV9pZl9taXNzaW5nJ1wiPldlIG9ubHkgZ2FwLWZpbGwgdGhpcyBCbGFuayBOb2RlIGlmIG5vdCBwcmVzZW50Ljwvc3Bhbj5cbiAgICAgICAgICAgIDwvcD5cblxuICAgICAgICAgICAgPHAgY2xhc3M9XCJpcy1tdC0xXCI+XG4gICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpcy1ydW4td2l0aC1tZWFzdXJlZFwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgIG1vZGVsLmNvbmZpZy5ydW5BcmdzPy5ydW5Ob25NZWFzdXJlZCAmJiBoYXNNZXRob2RUaWVyKGRhdGEub3JpZ2luYWwsIEVtaXNzaW9uTWV0aG9kVGllci5tZWFzdXJlZClcbiAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICBUaGVcbiAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW14LTFcIj57eyBtb2RlbC5jb25maWcudmFsdWUgfX08L2NvZGU+XG4gICAgICAgICAgICAgICAgd2FzIHJlcG9ydGVkIGFzIG1lYXN1cmVkLlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbGk+XG5cbiAgICAgICAgPGxpICpuZ0lmPVwibW9kZWwubG9ncz8ucmVwbGFjZUxvd2VyVGllciAhPT0gdW5kZWZpbmVkXCI+XG4gICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICBUaGUgcmVjYWxjdWxhdGVkXG4gICAgICAgICAgICA8Yj5tZXRob2RUaWVyPC9iPlxuICAgICAgICAgICAgd2FzXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtcGwtMSBpcy11bmRlcmxpbmVkXCIgKm5nSWY9XCIhbW9kZWwubG9ncy5yZXBsYWNlTG93ZXJUaWVyXCI+bG93ZXIgdGhhbjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXBsLTEgaXMtdW5kZXJsaW5lZFwiICpuZ0lmPVwibW9kZWwubG9ncy5yZXBsYWNlTG93ZXJUaWVyXCI+aGlnaGVyIHRoYW4gb3IgZXF1YWwgdG88L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1wbC0xXCI+XG4gICAgICAgICAgICB0aGUgb3JpZ2luYWxcbiAgICAgICAgICAgIDxiPm1ldGhvZFRpZXI8L2I+XG4gICAgICAgICAgICAuXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2xpPlxuXG4gICAgICAgIDxsaSBjbGFzcz1cImlzLW1lcmdlLXJlcGxhY2VMb3dlclRpZXJcIiAqbmdJZj1cIm1vZGVsLmxvZ3MucmVwbGFjZUxvd2VyVGllclwiPlxuICAgICAgICAgIDxzcGFuPlRoZSByZWNhbGN1bGF0ZWQ8L3NwYW4+XG4gICAgICAgICAgPGIgY2xhc3M9XCJpcy1wbC0xXCI+e3sgbW9kZWwuY29uZmlnPy5tZXJnZUFyZ3M/LnJlcGxhY2VUaHJlc2hvbGQ/LlswXSB8fCAndmFsdWUnIH19PC9iPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtcGwtMVwiPndhczwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXBsLTFcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtb2RlbC5jb25maWc/Lm1lcmdlQXJnc1wiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXVuZGVybGluZWRcIiAqbmdJZj1cIiFtb2RlbC5sb2dzLnJlcGxhY2VUaHJlc2hvbGRcIj5sZXNzIHRoYW48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtdW5kZXJsaW5lZFwiICpuZ0lmPVwibW9kZWwubG9ncy5yZXBsYWNlVGhyZXNob2xkXCI+bW9yZSB0aGFuIG9yIGVxdWFsIHRvPC9zcGFuPlxuICAgICAgICAgICAgICA8YiBjbGFzcz1cImlzLXBsLTFcIj57eyBtb2RlbC5jb25maWcubWVyZ2VBcmdzLnJlcGxhY2VUaHJlc2hvbGRbMV0gKiAxMDAgfX0lPC9iPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIW1vZGVsLmNvbmZpZz8ubWVyZ2VBcmdzXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtdW5kZXJsaW5lZFwiICpuZ0lmPVwiIW1vZGVsLmxvZ3MucmVwbGFjZVRocmVzaG9sZFwiPm5vdCBzdWZmaWNpZW50bHk8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtdW5kZXJsaW5lZFwiICpuZ0lmPVwibW9kZWwubG9ncy5yZXBsYWNlVGhyZXNob2xkXCI+c3VmZmljaWVudGx5PC9zcGFuPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtcGwtMVwiPmRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbDwvc3Bhbj5cbiAgICAgICAgICA8YiBjbGFzcz1cImlzLXBsLTFcIj57eyBtb2RlbC5jb25maWc/Lm1lcmdlQXJncz8ucmVwbGFjZVRocmVzaG9sZD8uWzBdIHx8ICd2YWx1ZScgfX0uPC9iPlxuICAgICAgICA8L2xpPlxuICAgICAgPC91bD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RvY3NMaW5rIGxldC1tb2RlbD5cbiAgPGEgW2hyZWZdPVwibW9kZWwuYXBpRG9jc1BhdGggfHwgbW9kZWwuZG9jUGF0aCB8fCBtb2RlbC5wYXRoXCIgdGFyZ2V0PVwiX2JsYW5rXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgIDxzcGFuPkRvY3M8L3NwYW4+XG4gICAgPGZhLWljb24gY2xhc3M9XCJtbC0xXCIgaWNvbj1cImV4dGVybmFsLWxpbmstYWx0XCIgc2l6ZT1cInNtXCI+PC9mYS1pY29uPlxuICA8L2E+XG48L25nLXRlbXBsYXRlPlxuIl19