ng-pli-commons 1.0.135 → 1.0.137
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/backoffice.commons.component.mjs +41 -0
- package/esm2022/lib/components/common.lists.component.mjs +177 -0
- package/esm2022/lib/components/configuration-token/configuration-token-subject.service.mjs +23 -0
- package/esm2022/lib/components/configuration-token/configuration-token.component.mjs +665 -0
- package/esm2022/lib/components/configuration-token/guarantee-token/guarantee-token.component.mjs +103 -0
- package/esm2022/lib/components/configuration-token/snapshot-token/snapshot-token.component.mjs +108 -0
- package/esm2022/lib/components/configuration.commons.component.mjs +41 -0
- package/esm2022/lib/components/dashboard.commons.component.mjs +85 -0
- package/esm2022/lib/components/dynamic-filter/dynamic-filter.component.mjs +131 -0
- package/esm2022/lib/components/excel-to-json/excel-to-json.component.mjs +54 -0
- package/esm2022/lib/components/frontoffice.commons.component.mjs +89 -0
- package/esm2022/lib/components/pdf-analyzer/pdf-analyzer.component.mjs +162 -0
- package/esm2022/lib/components/pdf-config/pdf-config.component.mjs +170 -0
- package/esm2022/lib/components/pdf-generator/pdf-generator.component.mjs +207 -0
- package/esm2022/lib/components/pdf-merge-visualizer/pdf-merge-visualizer.component.mjs +307 -0
- package/esm2022/lib/components/pdf-visualizer/pdf-visualizer.component.mjs +387 -0
- package/esm2022/lib/components/progress-bar/progress-bar.component.mjs +92 -0
- package/esm2022/lib/components/segmentation-tokens/segmentation-tokens.component.mjs +199 -0
- package/esm2022/lib/components/select-ppp/select-ppp.component.mjs +200 -0
- package/esm2022/lib/components/show-hide-columns/show-hide-columns-table.component.mjs +116 -0
- package/esm2022/lib/components/token/token.component.mjs +1047 -0
- package/esm2022/lib/components/tokens-calculator/tokens-calculator.component.mjs +128 -0
- package/esm2022/lib/directives/currency-colfuturo-formatter.directive.mjs +48 -0
- package/esm2022/lib/directives/currency-decimal-colfuturo-formatter.directive.mjs +35 -0
- package/esm2022/lib/ng-pli-commons.module.mjs +385 -0
- package/esm2022/lib/ng-pli-commons.service.mjs +14 -0
- package/esm2022/lib/pipes/currency-colfuturo.pipe.mjs +36 -0
- package/esm2022/lib/pipes/currency-decimal-colfuturo.pipe.mjs +39 -0
- package/esm2022/lib/pipes/currency-print-colfuturo.pipe.mjs +34 -0
- package/esm2022/lib/pipes/thousands.pipe.mjs +61 -0
- package/esm2022/lib/services/application-fill-percentage.service.mjs +30 -0
- package/esm2022/lib/services/application-pdf-form.service.mjs +27 -0
- package/esm2022/lib/services/application-tag.service.mjs +56 -0
- package/esm2022/lib/services/application.service.mjs +253 -0
- package/esm2022/lib/services/assign-task.service.mjs +30 -0
- package/esm2022/lib/services/authentication.service.mjs +133 -0
- package/esm2022/lib/services/blocked-beneficiary.service.mjs +42 -0
- package/esm2022/lib/services/budget-application.service.mjs +265 -0
- package/esm2022/lib/services/budget-setup.service.mjs +26 -0
- package/esm2022/lib/services/budget-simulation.service.mjs +65 -0
- package/esm2022/lib/services/budget.service.mjs +205 -0
- package/esm2022/lib/services/closure-wallet.service.mjs +39 -0
- package/esm2022/lib/services/cnf-correspondence-document-manager.service.mjs +39 -0
- package/esm2022/lib/services/codebtors.service.mjs +28 -0
- package/esm2022/lib/services/committee-assistant.service.mjs +55 -0
- package/esm2022/lib/services/committee-money.service.mjs +44 -0
- package/esm2022/lib/services/committee-pdf.service.mjs +27 -0
- package/esm2022/lib/services/committee-snapshot.service.mjs +60 -0
- package/esm2022/lib/services/common-info.service.mjs +51 -0
- package/esm2022/lib/services/common.service.mjs +285 -0
- package/esm2022/lib/services/configuration-document.service.mjs +297 -0
- package/esm2022/lib/services/configuration-minisite.service.mjs +26 -0
- package/esm2022/lib/services/configuration.service.mjs +53 -0
- package/esm2022/lib/services/correspondence-document-category.service.mjs +31 -0
- package/esm2022/lib/services/correspondence-manager.service.mjs +74 -0
- package/esm2022/lib/services/credit-score.service.mjs +48 -0
- package/esm2022/lib/services/credit-study.service.mjs +292 -0
- package/esm2022/lib/services/cube.service.mjs +27 -0
- package/esm2022/lib/services/data-form-history.service.mjs +25 -0
- package/esm2022/lib/services/data-form.service.mjs +176 -0
- package/esm2022/lib/services/data-letter-segmentation.service.mjs +64 -0
- package/esm2022/lib/services/document-analysis-auto.service.mjs +27 -0
- package/esm2022/lib/services/document-history.service.mjs +43 -0
- package/esm2022/lib/services/document-management.service.mjs +57 -0
- package/esm2022/lib/services/document-process.service.mjs +27 -0
- package/esm2022/lib/services/document-validation-attempt.service.mjs +32 -0
- package/esm2022/lib/services/document.service.mjs +144 -0
- package/esm2022/lib/services/documentary.type.service.mjs +69 -0
- package/esm2022/lib/services/email.service.mjs +30 -0
- package/esm2022/lib/services/evaluation.service.mjs +181 -0
- package/esm2022/lib/services/export-excel.service.mjs +32 -0
- package/esm2022/lib/services/file.service.mjs +153 -0
- package/esm2022/lib/services/form.service.mjs +112 -0
- package/esm2022/lib/services/gic-client-disbursement-metadata.service.mjs +31 -0
- package/esm2022/lib/services/gic-client.service.mjs +49 -0
- package/esm2022/lib/services/gic-cnf-bankvision-transaction.service.mjs +31 -0
- package/esm2022/lib/services/gic-cnf-closing-date.service.mjs +34 -0
- package/esm2022/lib/services/gic-cnf-maintenance.service.mjs +30 -0
- package/esm2022/lib/services/gic-collection.service.mjs +53 -0
- package/esm2022/lib/services/gic-disbursement.service.mjs +39 -0
- package/esm2022/lib/services/gic-extract.service.mjs +41 -0
- package/esm2022/lib/services/gic-log.service.mjs +41 -0
- package/esm2022/lib/services/gic-payment-application.service.mjs +35 -0
- package/esm2022/lib/services/gic-payment-plan-cube.service.mjs +27 -0
- package/esm2022/lib/services/gic-payment-plan.service.mjs +32 -0
- package/esm2022/lib/services/gic-trm.service.mjs +27 -0
- package/esm2022/lib/services/global.show.task.service.mjs +37 -0
- package/esm2022/lib/services/guarantee-document.service.mjs +52 -0
- package/esm2022/lib/services/guarantee-enrollment.service.mjs +37 -0
- package/esm2022/lib/services/guarantee.service.mjs +128 -0
- package/esm2022/lib/services/guarantees-summary-service.mjs +26 -0
- package/esm2022/lib/services/hash.service.mjs +36 -0
- package/esm2022/lib/services/import-data.service.mjs +27 -0
- package/esm2022/lib/services/import-excel-gic.service.mjs +53 -0
- package/esm2022/lib/services/initial-configuration-gic-parameters.service.mjs +51 -0
- package/esm2022/lib/services/initial-record.service.mjs +51 -0
- package/esm2022/lib/services/integration-ado.service.mjs +54 -0
- package/esm2022/lib/services/interaction-application-user.service.mjs +81 -0
- package/esm2022/lib/services/interest-adjustment.service.mjs +34 -0
- package/esm2022/lib/services/keys-assignation.service.mjs +127 -0
- package/esm2022/lib/services/legalization.service.mjs +150 -0
- package/esm2022/lib/services/letter-campaing.service.mjs +49 -0
- package/esm2022/lib/services/letter-task-mapping.service.mjs +40 -0
- package/esm2022/lib/services/log.service.mjs +41 -0
- package/esm2022/lib/services/maintenance.service.mjs +86 -0
- package/esm2022/lib/services/master-category.service.mjs +66 -0
- package/esm2022/lib/services/master-program.service.mjs +78 -0
- package/esm2022/lib/services/master-university.service.mjs +79 -0
- package/esm2022/lib/services/migration-plis.service.mjs +27 -0
- package/esm2022/lib/services/migration-survey-queue.service.mjs +24 -0
- package/esm2022/lib/services/openkm-document.service.mjs +27 -0
- package/esm2022/lib/services/page.service.mjs +38 -0
- package/esm2022/lib/services/partner-system.service.mjs +30 -0
- package/esm2022/lib/services/partner.service.mjs +34 -0
- package/esm2022/lib/services/pdf-analyzer.service.mjs +33 -0
- package/esm2022/lib/services/people-master.service.mjs +42 -0
- package/esm2022/lib/services/permission.service.mjs +29 -0
- package/esm2022/lib/services/pli-cnf-acuity-fields.service.mjs +34 -0
- package/esm2022/lib/services/pli-cnf-app-card-filter.service.mjs +40 -0
- package/esm2022/lib/services/pli-cnf-appointment-type.service.mjs +41 -0
- package/esm2022/lib/services/pli-cnf-budget-program-type.service.mjs +54 -0
- package/esm2022/lib/services/pli-cnf-budget.service.mjs +31 -0
- package/esm2022/lib/services/pli-cnf-cloning.service.mjs +27 -0
- package/esm2022/lib/services/pli-cnf-committee-pdf-config-table-config.service.mjs +47 -0
- package/esm2022/lib/services/pli-cnf-committee-pdf-gen-status.service.mjs +30 -0
- package/esm2022/lib/services/pli-cnf-committee-valpro-columns.service.mjs +42 -0
- package/esm2022/lib/services/pli-cnf-committee-visualization-mode.service.mjs +42 -0
- package/esm2022/lib/services/pli-cnf-committee.service.mjs +66 -0
- package/esm2022/lib/services/pli-cnf-config-minisite.service.mjs +90 -0
- package/esm2022/lib/services/pli-cnf-configuration-credit-study.service.mjs +41 -0
- package/esm2022/lib/services/pli-cnf-document-management.service.mjs +40 -0
- package/esm2022/lib/services/pli-cnf-dynamic-keys-assign.service.mjs +52 -0
- package/esm2022/lib/services/pli-cnf-evaluation-task-mailing.service.mjs +31 -0
- package/esm2022/lib/services/pli-cnf-evaluation-task-template.service.mjs +39 -0
- package/esm2022/lib/services/pli-cnf-evaluation-task.service.mjs +112 -0
- package/esm2022/lib/services/pli-cnf-evaluation-template.service.mjs +95 -0
- package/esm2022/lib/services/pli-cnf-form-edit.service.mjs +68 -0
- package/esm2022/lib/services/pli-cnf-form-multiaplicacion.service.mjs +46 -0
- package/esm2022/lib/services/pli-cnf-guarantee-documents-template.service.mjs +40 -0
- package/esm2022/lib/services/pli-cnf-guarantee-token.service.mjs +42 -0
- package/esm2022/lib/services/pli-cnf-header.service.mjs +39 -0
- package/esm2022/lib/services/pli-cnf-indicator.service.mjs +39 -0
- package/esm2022/lib/services/pli-cnf-information-system.service.mjs +24 -0
- package/esm2022/lib/services/pli-cnf-interaction.service.mjs +78 -0
- package/esm2022/lib/services/pli-cnf-letter-template-type.service.mjs +29 -0
- package/esm2022/lib/services/pli-cnf-letter-template.service.mjs +48 -0
- package/esm2022/lib/services/pli-cnf-look-and-feel.service.mjs +28 -0
- package/esm2022/lib/services/pli-cnf-mail.service.mjs +30 -0
- package/esm2022/lib/services/pli-cnf-menu-form.service.mjs +34 -0
- package/esm2022/lib/services/pli-cnf-migration-plis-field-budget.service.mjs +34 -0
- package/esm2022/lib/services/pli-cnf-migration-plis-field.service.mjs +47 -0
- package/esm2022/lib/services/pli-cnf-migration-status-plis.service.mjs +44 -0
- package/esm2022/lib/services/pli-cnf-page-section-form.service.mjs +66 -0
- package/esm2022/lib/services/pli-cnf-page-sub-process.service.mjs +25 -0
- package/esm2022/lib/services/pli-cnf-pdfs.service.mjs +31 -0
- package/esm2022/lib/services/pli-cnf-profile-form.service.mjs +40 -0
- package/esm2022/lib/services/pli-cnf-profile-user.service.mjs +49 -0
- package/esm2022/lib/services/pli-cnf-project-summary.service.mjs +39 -0
- package/esm2022/lib/services/pli-cnf-scenario.service.mjs +47 -0
- package/esm2022/lib/services/pli-cnf-segmentation.service.mjs +72 -0
- package/esm2022/lib/services/pli-cnf-snapshot-token.service.mjs +42 -0
- package/esm2022/lib/services/pli-cnf-status-flow-interaction.service.mjs +74 -0
- package/esm2022/lib/services/pli-cnf-status-flow.service.mjs +56 -0
- package/esm2022/lib/services/pli-cnf-support-document-category.service.mjs +47 -0
- package/esm2022/lib/services/pli-cnf-support-document.service.mjs +56 -0
- package/esm2022/lib/services/pli-cnf-survey-document.service.mjs +37 -0
- package/esm2022/lib/services/pli-cnf-survey-pdf.service.mjs +34 -0
- package/esm2022/lib/services/pli-cnf-survey.service.mjs +46 -0
- package/esm2022/lib/services/pli-cnf-task-group.service.mjs +33 -0
- package/esm2022/lib/services/pli-cnf-text-category.service.mjs +38 -0
- package/esm2022/lib/services/pli-cnf-text-option.service.mjs +39 -0
- package/esm2022/lib/services/pli-cnf-text.service.mjs +62 -0
- package/esm2022/lib/services/pli-cnf-type-text.service.mjs +45 -0
- package/esm2022/lib/services/pli-cnf-university-article.service.mjs +39 -0
- package/esm2022/lib/services/pli-cnf-user-calendar.service.mjs +36 -0
- package/esm2022/lib/services/pli-cnf-user-workspace.service.mjs +35 -0
- package/esm2022/lib/services/pli-cnf-valpro-keys.service.mjs +35 -0
- package/esm2022/lib/services/pli-cnf-workspace-segmentation.service.mjs +31 -0
- package/esm2022/lib/services/pli-message-type.service.mjs +40 -0
- package/esm2022/lib/services/pli-multiple-value-filter.service.mjs +39 -0
- package/esm2022/lib/services/pli-promocion-username.service.mjs +57 -0
- package/esm2022/lib/services/pli-seg-action-user.service.mjs +37 -0
- package/esm2022/lib/services/pli-segmentation.service.mjs +130 -0
- package/esm2022/lib/services/pli-tag-assignment.service.mjs +36 -0
- package/esm2022/lib/services/pli-tag.service.mjs +55 -0
- package/esm2022/lib/services/pli-user.service.mjs +51 -0
- package/esm2022/lib/services/plis-beneficiario.service.mjs +29 -0
- package/esm2022/lib/services/plis-estatus-change.service.mjs +30 -0
- package/esm2022/lib/services/post-selection.service.mjs +25 -0
- package/esm2022/lib/services/ppp.service.mjs +360 -0
- package/esm2022/lib/services/profile.service.mjs +60 -0
- package/esm2022/lib/services/progress-bar.service.mjs +40 -0
- package/esm2022/lib/services/promotion-score.service.mjs +44 -0
- package/esm2022/lib/services/registry-identifier.service.mjs +49 -0
- package/esm2022/lib/services/return-refund.service.mjs +53 -0
- package/esm2022/lib/services/segmentation-tokens.service.mjs +43 -0
- package/esm2022/lib/services/segmentation-user-service.service.mjs +94 -0
- package/esm2022/lib/services/segmentation.service.mjs +31 -0
- package/esm2022/lib/services/send-application.service.mjs +541 -0
- package/esm2022/lib/services/sesion-form.service.mjs +31 -0
- package/esm2022/lib/services/sesion.service.mjs +48 -0
- package/esm2022/lib/services/spinner.service.mjs +16 -0
- package/esm2022/lib/services/sponsorship-letter.service.mjs +68 -0
- package/esm2022/lib/services/status.service.mjs +104 -0
- package/esm2022/lib/services/summary-budget.service.mjs +24 -0
- package/esm2022/lib/services/survey-metadata.service.mjs +28 -0
- package/esm2022/lib/services/survey-queue.service.mjs +24 -0
- package/esm2022/lib/services/survey.service.mjs +52 -0
- package/esm2022/lib/services/tag-management.service.mjs +58 -0
- package/esm2022/lib/services/tasa.cambio.service.mjs +35 -0
- package/esm2022/lib/services/token-transformation.service.mjs +62 -0
- package/esm2022/lib/services/token.service.mjs +1477 -0
- package/esm2022/lib/services/university.service.mjs +50 -0
- package/esm2022/lib/services/upload-documents.service.mjs +60 -0
- package/esm2022/lib/services/user.service.mjs +28 -0
- package/esm2022/lib/services/visualization-committee.service.mjs +91 -0
- package/esm2022/lib/utils/custom-validator.mjs +95 -0
- package/esm2022/lib/utils/form-util.mjs +35 -0
- package/esm2022/lib/utils/formio-util.mjs +582 -0
- package/esm2022/lib/utils/version-commons.mjs +10 -0
- package/esm2022/ng-pli-commons.mjs +5 -0
- package/esm2022/public-api.mjs +226 -0
- package/esm2022/version.mjs +29 -0
- package/fesm2022/ng-pli-commons.mjs +657 -657
- package/fesm2022/ng-pli-commons.mjs.map +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1,1477 @@
|
|
|
1
|
+
import { HttpParams } from '@angular/common/http';
|
|
2
|
+
import { Inject, Injectable, LOCALE_ID } from '@angular/core';
|
|
3
|
+
import { DateUtil, HEADER_JSON, UtilString } from 'ng-pli-util';
|
|
4
|
+
import { FormioUtil } from '../utils/formio-util';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/common/http";
|
|
7
|
+
import * as i2 from "./form.service";
|
|
8
|
+
import * as i3 from "@angular/common";
|
|
9
|
+
export class TokenService {
|
|
10
|
+
/** */
|
|
11
|
+
static { this.SIGN_LETTER_TAG_ID = '_sign-letter-tag-id'; }
|
|
12
|
+
/** */
|
|
13
|
+
static { this.TOKEN_LABEL_FORM = 'Frm'; }
|
|
14
|
+
/** */
|
|
15
|
+
static { this.TOKEN_LABEL_BUDGET = 'Presupuesto'; }
|
|
16
|
+
/** */
|
|
17
|
+
static { this.TOKEN_LABEL_CALCULATED = 'Calculado'; }
|
|
18
|
+
/** */
|
|
19
|
+
static { this.TOKEN_LABEL_SNAPSHOT = 'Snapshot'; }
|
|
20
|
+
/** */
|
|
21
|
+
static { this.TOKEN_LABEL_STATIC = 'Estático'; }
|
|
22
|
+
/** */
|
|
23
|
+
static { this.TOKEN_LABEL_DOCUMENTO = 'Documento'; }
|
|
24
|
+
/** */
|
|
25
|
+
static { this.TOKEN_LABEL_DOCUMENTO_ANALISIS_AUTOMATICO = 'Análisis automático de documentos'; }
|
|
26
|
+
/** */
|
|
27
|
+
static { this.TOKEN_DOCUMENTO_ANALYSIS_TYPE = 'document_analysis'; }
|
|
28
|
+
/** */
|
|
29
|
+
static { this.TOKEN_LABEL_TASK = 'Tarea'; }
|
|
30
|
+
/** */
|
|
31
|
+
static { this.TOKEN_LABEL_TASKL = 'task'; }
|
|
32
|
+
/** */
|
|
33
|
+
static { this.TOKEN_LABEL_GUARANTEE = 'Garantia'; }
|
|
34
|
+
/** */
|
|
35
|
+
static { this.BUDGET_TOKENS_KEY_TOTAL_AMOUNT = 'totalAmount'; }
|
|
36
|
+
/** */
|
|
37
|
+
static { this.BUDGET_TOKENS_KEY_APPLICATION_PROCESS_TOTAL_AMOUNT = 'applicationTotal'; }
|
|
38
|
+
/** */
|
|
39
|
+
static { this.BUDGET_TOKENS_KEY_APPLICATION_PROCESS_TOTAL_OWN_FOUNDS = 'applicationOwnFounds'; }
|
|
40
|
+
/** */
|
|
41
|
+
static { this.BUDGET_TOKENS_KEY_APPLICATION_PROCESS_TOTAL_FINANCING = 'applicationFinancing'; }
|
|
42
|
+
/** */
|
|
43
|
+
static { this.BUDGET_TOKENS_KEY_LEGALIZATION_PROCESS_TOTAL_AMOUNT = 'legalizationTotal'; }
|
|
44
|
+
/** */
|
|
45
|
+
static { this.BUDGET_TOKENS_KEY_LEGALIZATION_PROCESS_TOTAL_OWN_FOUNDS = 'legalizationOwnFounds'; }
|
|
46
|
+
/** */
|
|
47
|
+
static { this.BUDGET_TOKENS_KEY_LEGALIZATION_PROCESS_TOTAL_FINANCING = 'legalizationFinancing'; }
|
|
48
|
+
/** */
|
|
49
|
+
static { this.BUDGET_TOKENS_KEY_INSURANCE_AMOUNT = 'insuranceAmount'; }
|
|
50
|
+
/** */
|
|
51
|
+
static { this.LEGALIZATION_OR_APPLICATION_TOTAL_FINANCING = 'leglizationOrApplicationTotalFinancing'; }
|
|
52
|
+
/** */
|
|
53
|
+
static { this.BUDGET_TOKENS_KEY_RESUME_CATEGORY_YEAR = 'resumeCategoryYear'; }
|
|
54
|
+
/** */
|
|
55
|
+
static { this.BUDGET_TOKENS_KEY_FECHA_FINANCING_START = 'fechaInicioFinanciacion'; }
|
|
56
|
+
/** */
|
|
57
|
+
static { this.BUDGET_TOKENS_KEY_FECHA_FINANCING_END = 'fechaFinFinanciacion'; }
|
|
58
|
+
/** */
|
|
59
|
+
static { this.BUDGET_TOKENS_DURATION_STUDIES = 'duracionEstudios'; }
|
|
60
|
+
/** */
|
|
61
|
+
static { this.BUDGET_TOKENS_FINANCING_DURATION = 'duracionFinanciacion'; }
|
|
62
|
+
/** */
|
|
63
|
+
static { this.STATIC_TOKENS_KEY_CODIGO_VERIFICACION = 'codigoVerificacion'; }
|
|
64
|
+
/** */
|
|
65
|
+
static { this.STATIC_TOKENS_KEY_A_QUIEN_VA_DIRIGIDO = 'aQuienVaDirigido'; }
|
|
66
|
+
/** */
|
|
67
|
+
static { this.STATIC_TOKENS_KEY_FECHA_ACTUAL = 'fechaActual'; }
|
|
68
|
+
/** */
|
|
69
|
+
static { this.STATIC_TOKENS_KEY_STATUS_NAME = 'statusName'; }
|
|
70
|
+
/** */
|
|
71
|
+
static { this.STATIC_TOKENS_KEY_PATROCINADOR = 'pliPatrocinador'; }
|
|
72
|
+
/** */
|
|
73
|
+
static { this.STATIC_TOKENS_KEY_PATROCINADOR_CORTO = 'pliPatrocinadorCorto'; }
|
|
74
|
+
/** */
|
|
75
|
+
static { this.STATIC_TOKENS_KEY_PROGRAMA = 'pliPrograma'; }
|
|
76
|
+
/** */
|
|
77
|
+
static { this.STATIC_TOKENS_KEY_PROGRAMA_CORTO = 'pliProgramaCorto'; }
|
|
78
|
+
/** */
|
|
79
|
+
static { this.STATIC_TOKENS_KEY_PROMOCION = 'pliPromocion'; }
|
|
80
|
+
/** */
|
|
81
|
+
static { this.STATIC_TOKENS_KEY_PROMOCION_CORTO = 'pliPromocionCorto'; }
|
|
82
|
+
/** */
|
|
83
|
+
static { this.STATIC_TOKENS_KEY_ANIO_PROMOCION = 'anioPromocion'; }
|
|
84
|
+
/** */
|
|
85
|
+
static { this.STATIC_TOKENS_KEY_ISO_MONEDA_BASE = 'isoMonedaBase'; }
|
|
86
|
+
/** */
|
|
87
|
+
static { this.STATIC_TOKENS_KEY_SALUDO_COMPLEMENTARIO = 'saludoComplementario'; }
|
|
88
|
+
/** */
|
|
89
|
+
static { this.STATIC_TOKENS_KEY_NUMBER_APPLICATION = 'numeroRadicado'; }
|
|
90
|
+
/** */
|
|
91
|
+
static { this.STATIC_TOKENS_KEY_USER_INITIALS = 'inicialesUsuario'; }
|
|
92
|
+
/** */
|
|
93
|
+
static { this.STATIC_TOKENS_KEY_LETTER_SIGN = 'firmaCarta'; }
|
|
94
|
+
/** */
|
|
95
|
+
static { this.STATIC_TOKENS_COMMITTEE_NAME = 'comiteNombre'; }
|
|
96
|
+
/** */
|
|
97
|
+
static { this.STATIC_TOKENS_COMMITTEE_SEGMENTATION = 'comiteSegmentacion'; }
|
|
98
|
+
/** */
|
|
99
|
+
static { this.STATIC_TOKENS_COMMITTEE_AGGRUPATION = 'comiteAgrupacion'; }
|
|
100
|
+
/** */
|
|
101
|
+
static { this.STATIC_TOKENS_COMMITTEE_CUTLINE_DATE = 'comiteFechaLinea'; }
|
|
102
|
+
/** */
|
|
103
|
+
static { this.STATIC_TOKENS_CONFIRM_LEGALIZATION_APPOINTMENT = 'confirmacionCita'; }
|
|
104
|
+
/** */
|
|
105
|
+
static { this.STATIC_TOKENS_CODEBTOR_DOCUMENT_NUMBER = 'numeroDocumentoCodeudor'; }
|
|
106
|
+
/** */
|
|
107
|
+
static { this.STATIC_TOKENS_CODEBTOR_DOCUMENT_TYPE = 'tipoDocumentoCodeudor'; }
|
|
108
|
+
/** */
|
|
109
|
+
static { this.STATIC_TOKENS_CODEBTOR_NAME = 'nombresCodeudor'; }
|
|
110
|
+
/** */
|
|
111
|
+
static { this.STATIC_TOKENS_CODEBTOR_LASTNAME = 'apellidosCodeudor'; }
|
|
112
|
+
/** */
|
|
113
|
+
static { this.STATIC_TOKENS_TYPE_CODEBTOR = 'tipoPersonaCodeudor'; }
|
|
114
|
+
/** */
|
|
115
|
+
static { this.STATIC_TOKENS_CODEBTOR_REVIEWER = 'revisorCodeudores'; }
|
|
116
|
+
/** */
|
|
117
|
+
static { this.STATIC_TOKENS_TOTAL_WEIGHTED = 'ponderadoTotal'; }
|
|
118
|
+
/** */
|
|
119
|
+
static { this.STATIC_TOKENS_CONSECUTIVE_GUARANTEE = 'consecutivoGarantias'; }
|
|
120
|
+
/** */
|
|
121
|
+
static { this.STATIC_TOKENS_DAY = 'dia'; }
|
|
122
|
+
/** */
|
|
123
|
+
static { this.STATIC_TOKENS_MONTH = 'mes'; }
|
|
124
|
+
/** */
|
|
125
|
+
static { this.STATIC_TOKENS_YEAR = 'ano'; }
|
|
126
|
+
/** */
|
|
127
|
+
static { this.STATIC_TOKENS_REPRESENTATIVE_NAME = 'nombresRepresentante'; }
|
|
128
|
+
/** */
|
|
129
|
+
static { this.STATIC_TOKENS_REPRESENTATIVE_LASTNAME = 'apellidosRepresentante'; }
|
|
130
|
+
/** */
|
|
131
|
+
static { this.STATIC_TOKENS_REPRESENTATIVE_DOCUMENT_NUMBER = 'cedulaRepresentante'; }
|
|
132
|
+
/** */
|
|
133
|
+
static { this.STATIC_TOKENS_CITY_SIGNATURE = 'ciudadFirma'; }
|
|
134
|
+
/** */
|
|
135
|
+
static { this.STATIC_TOKENS_USER_TYPE_CREDIT_STUDY = 'tipoUsuarioEstudioCredito'; }
|
|
136
|
+
/** */
|
|
137
|
+
static { this.STATIC_TOKENS_CODEBTOR_VEHICLES_QUANTITY = 'cantidadVehiculosCodeudor'; }
|
|
138
|
+
/** */
|
|
139
|
+
static { this.STATIC_TOKENS_CODEBTOR_ASSETS_QUANTITY = 'cantidadBienesCodeudor'; }
|
|
140
|
+
/** */
|
|
141
|
+
static { this.STATIC_TOKENS_LIST_CODEBTORS = 'listaCodeudores'; }
|
|
142
|
+
/** */
|
|
143
|
+
static { this.STATIC_TOKEN_INGRESO_CODEUDOR_HABEAS_DATA = 'ingresoCodeudorHabeasData'; }
|
|
144
|
+
/** */
|
|
145
|
+
static { this.STATIC_TOKEN_PDF_RESUMEN_CODEUDOR = 'pdfResumenCodeudor'; }
|
|
146
|
+
/** */
|
|
147
|
+
static { this.STATIC_TOKENS_QUANTITY_VEHICLE_BENEFICIARY = 'cantidadVehiculosSeleccionado'; }
|
|
148
|
+
/** */
|
|
149
|
+
static { this.STATIC_TOKENS_QUANTITY_ASSETS_BENEFICIARY = 'cantidadBienesSeleccionado'; }
|
|
150
|
+
/** */
|
|
151
|
+
static { this.STATIC_TOKENS_BEN_CODIGO = 'benCodigo'; }
|
|
152
|
+
/** */
|
|
153
|
+
static { this.STATIC_TOKEN_CREDIT_REVIEWER_OBSERVATIONS_CODEBTOR = 'creditReviewerObservationsCodebtor'; }
|
|
154
|
+
/** */
|
|
155
|
+
static { this.STATIC_TOKEN_CREDIT_REVIEWER_OBSERVATIONS = 'creditReviewerObservations'; }
|
|
156
|
+
static { this.STATIC_TOKEN_TAG_NAME = 'tagName'; }
|
|
157
|
+
static { this.STATIC_TOKEN_NAME_REVIEWER_TASK = 'nameReviwerTask'; }
|
|
158
|
+
static { this.STATIC_TOKEN_LAST_NAME_REVIEWER_TASK = 'lastNameReviwerTask'; }
|
|
159
|
+
static { this.STATIC_TOKEN_TASK_TOTAL_ASSIGNED_TO_REVIEWER = 'taskTotalAssignedToReviewer'; }
|
|
160
|
+
static { this.STATIC_TOKEN_SURNAME = 'surname'; }
|
|
161
|
+
static { this.STATIC_TOKENS = [
|
|
162
|
+
{
|
|
163
|
+
key: TokenService.STATIC_TOKENS_KEY_PATROCINADOR,
|
|
164
|
+
label: 'Patrocinador'
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
key: TokenService.STATIC_TOKENS_KEY_PROGRAMA,
|
|
168
|
+
label: 'Programa'
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
key: TokenService.STATIC_TOKENS_KEY_PROMOCION,
|
|
172
|
+
label: 'Promoción'
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
key: TokenService.STATIC_TOKENS_KEY_ANIO_PROMOCION,
|
|
176
|
+
label: 'Año promoción'
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
key: TokenService.STATIC_TOKENS_KEY_ISO_MONEDA_BASE,
|
|
180
|
+
label: 'ISO Moneda base'
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
key: TokenService.STATIC_TOKENS_KEY_SALUDO_COMPLEMENTARIO,
|
|
184
|
+
label: 'Saludo complementario'
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
key: TokenService.STATIC_TOKENS_KEY_CODIGO_VERIFICACION,
|
|
188
|
+
label: 'Código de verificación'
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
key: TokenService.STATIC_TOKENS_KEY_A_QUIEN_VA_DIRIGIDO,
|
|
192
|
+
label: 'A quien va dirigido'
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
key: TokenService.STATIC_TOKENS_KEY_FECHA_ACTUAL,
|
|
196
|
+
label: 'Fecha actual'
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
key: TokenService.STATIC_TOKENS_KEY_STATUS_NAME,
|
|
200
|
+
label: 'Estado actual'
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
key: TokenService.STATIC_TOKENS_KEY_NUMBER_APPLICATION,
|
|
204
|
+
label: 'Número radicado'
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
key: TokenService.STATIC_TOKENS_KEY_USER_INITIALS,
|
|
208
|
+
label: 'Iniciales de usuario'
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
key: TokenService.STATIC_TOKENS_KEY_LETTER_SIGN,
|
|
212
|
+
label: 'Firma de cartas'
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
key: TokenService.STATIC_TOKENS_COMMITTEE_NAME,
|
|
216
|
+
label: 'Nombre comité'
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
key: TokenService.STATIC_TOKENS_COMMITTEE_SEGMENTATION,
|
|
220
|
+
label: 'Segmentación comité'
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
key: TokenService.STATIC_TOKENS_COMMITTEE_AGGRUPATION,
|
|
224
|
+
label: 'Agrupación comité'
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
key: TokenService.STATIC_TOKENS_COMMITTEE_CUTLINE_DATE,
|
|
228
|
+
label: 'Fecha Línea de corte'
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
key: TokenService.STATIC_TOKENS_CONFIRM_LEGALIZATION_APPOINTMENT,
|
|
232
|
+
label: 'Confirmación de cita'
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
key: TokenService.STATIC_TOKENS_CODEBTOR_DOCUMENT_NUMBER,
|
|
236
|
+
label: 'Número de documento de codeudor'
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
key: TokenService.STATIC_TOKENS_CODEBTOR_DOCUMENT_TYPE,
|
|
240
|
+
label: 'Tipo de documento de codeudor'
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
key: TokenService.STATIC_TOKENS_CODEBTOR_NAME,
|
|
244
|
+
label: 'Nombres codeudor'
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
key: TokenService.STATIC_TOKENS_CODEBTOR_LASTNAME,
|
|
248
|
+
label: 'Apellidos codeudor'
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
key: TokenService.STATIC_TOKENS_TYPE_CODEBTOR,
|
|
252
|
+
label: 'Tipo de persona codeudor'
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
key: TokenService.STATIC_TOKENS_CODEBTOR_VEHICLES_QUANTITY,
|
|
256
|
+
label: 'Cantidad vehiculos codeudor'
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
key: TokenService.STATIC_TOKENS_CODEBTOR_ASSETS_QUANTITY,
|
|
260
|
+
label: 'Cantidad bienes codeudor'
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
key: TokenService.STATIC_TOKENS_CODEBTOR_REVIEWER,
|
|
264
|
+
label: 'Revisor de codeudores'
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
key: TokenService.STATIC_TOKENS_TOTAL_WEIGHTED,
|
|
268
|
+
label: 'Ponderado total'
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
key: TokenService.STATIC_TOKENS_CONSECUTIVE_GUARANTEE,
|
|
272
|
+
label: 'Consecutivo de garantias'
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
key: TokenService.STATIC_TOKENS_REPRESENTATIVE_NAME,
|
|
276
|
+
label: 'Nombres representante legal'
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
key: TokenService.STATIC_TOKENS_REPRESENTATIVE_LASTNAME,
|
|
280
|
+
label: 'Apellidos representante legal'
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
key: TokenService.STATIC_TOKENS_REPRESENTATIVE_DOCUMENT_NUMBER,
|
|
284
|
+
label: 'Cedula representante legal'
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
key: TokenService.STATIC_TOKENS_USER_TYPE_CREDIT_STUDY,
|
|
288
|
+
label: 'Tipo usuario estudio crédito'
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
key: TokenService.STATIC_TOKENS_DAY,
|
|
292
|
+
label: 'Dia'
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
key: TokenService.STATIC_TOKENS_MONTH,
|
|
296
|
+
label: 'Mes'
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
key: TokenService.STATIC_TOKENS_YEAR,
|
|
300
|
+
label: 'Año'
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
key: TokenService.STATIC_TOKENS_CITY_SIGNATURE,
|
|
304
|
+
label: 'Ciudad de la firma'
|
|
305
|
+
},
|
|
306
|
+
{
|
|
307
|
+
key: TokenService.STATIC_TOKENS_LIST_CODEBTORS,
|
|
308
|
+
label: 'Lista de codeudores'
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
key: TokenService.STATIC_TOKEN_INGRESO_CODEUDOR_HABEAS_DATA,
|
|
312
|
+
label: 'Ingreso Codeudor Habeas Data'
|
|
313
|
+
},
|
|
314
|
+
{
|
|
315
|
+
key: TokenService.STATIC_TOKEN_PDF_RESUMEN_CODEUDOR,
|
|
316
|
+
label: 'Pdf codeudor'
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
key: TokenService.STATIC_TOKENS_QUANTITY_VEHICLE_BENEFICIARY,
|
|
320
|
+
label: 'Cantidad de vehículos del seleccionado'
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
key: TokenService.STATIC_TOKENS_QUANTITY_ASSETS_BENEFICIARY,
|
|
324
|
+
label: 'Cantidad bienes del seleccionado'
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
key: TokenService.STATIC_TOKENS_BEN_CODIGO,
|
|
328
|
+
label: 'Código beneficiario'
|
|
329
|
+
},
|
|
330
|
+
{
|
|
331
|
+
key: TokenService.STATIC_TOKEN_CREDIT_REVIEWER_OBSERVATIONS,
|
|
332
|
+
label: 'Observaciones revisor financiero seleccionado'
|
|
333
|
+
},
|
|
334
|
+
{
|
|
335
|
+
key: TokenService.STATIC_TOKEN_CREDIT_REVIEWER_OBSERVATIONS_CODEBTOR,
|
|
336
|
+
label: 'Observaciones revisor financiero codeudores'
|
|
337
|
+
},
|
|
338
|
+
{
|
|
339
|
+
key: TokenService.STATIC_TOKEN_TAG_NAME,
|
|
340
|
+
label: 'Nombre del tag'
|
|
341
|
+
},
|
|
342
|
+
{ key: TokenService.STATIC_TOKEN_NAME_REVIEWER_TASK, label: 'Nombre revisor tareas' },
|
|
343
|
+
{
|
|
344
|
+
key: TokenService.STATIC_TOKEN_LAST_NAME_REVIEWER_TASK,
|
|
345
|
+
label: 'Apellido revisor tareas'
|
|
346
|
+
},
|
|
347
|
+
{
|
|
348
|
+
key: TokenService.STATIC_TOKEN_TASK_TOTAL_ASSIGNED_TO_REVIEWER,
|
|
349
|
+
label: 'Total tareas asignadas a revisor'
|
|
350
|
+
},
|
|
351
|
+
{
|
|
352
|
+
key: TokenService.STATIC_TOKEN_SURNAME,
|
|
353
|
+
label: 'Apellidos candidato'
|
|
354
|
+
}
|
|
355
|
+
]; }
|
|
356
|
+
static { this.excludedToken = [
|
|
357
|
+
TokenService.STATIC_TOKENS_USER_TYPE_CREDIT_STUDY.toLowerCase(),
|
|
358
|
+
TokenService.STATIC_TOKENS_CODEBTOR_VEHICLES_QUANTITY.toLowerCase(),
|
|
359
|
+
TokenService.STATIC_TOKENS_CODEBTOR_ASSETS_QUANTITY.toLowerCase()
|
|
360
|
+
]; }
|
|
361
|
+
constructor(environment, httpClient, formService, currencyPipe) {
|
|
362
|
+
this.environment = environment;
|
|
363
|
+
this.httpClient = httpClient;
|
|
364
|
+
this.formService = formService;
|
|
365
|
+
this.currencyPipe = currencyPipe;
|
|
366
|
+
}
|
|
367
|
+
/** This promise allows to execute a function when consulting the form fields. */
|
|
368
|
+
getFormFieldsByPromCode(promCodigo) {
|
|
369
|
+
return new Promise((resolve, reject) => {
|
|
370
|
+
// Search the dynamic form
|
|
371
|
+
let lFormFieldsToken = null;
|
|
372
|
+
this.formService.getByPromCodigo(promCodigo).subscribe({
|
|
373
|
+
next: (arrayForms) => {
|
|
374
|
+
if (arrayForms.length > 0) {
|
|
375
|
+
for (const forms of arrayForms) {
|
|
376
|
+
let components = [];
|
|
377
|
+
components.push(...FormioUtil.getComponents(forms.components));
|
|
378
|
+
if (forms.components && forms.components.length > 0) {
|
|
379
|
+
for (const components of forms.components) {
|
|
380
|
+
if (components.components && components.components.length > 0) {
|
|
381
|
+
for (const component of components.components) {
|
|
382
|
+
if (component.columns && component.columns.length > 0) {
|
|
383
|
+
for (const cComponents of component.columns) {
|
|
384
|
+
if (cComponents.components &&
|
|
385
|
+
cComponents.components.length > 0) {
|
|
386
|
+
for (const iterator of cComponents.components) {
|
|
387
|
+
if (iterator.type === 'address') {
|
|
388
|
+
delete iterator.components;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
let form = arrayForms;
|
|
401
|
+
if (!form ||
|
|
402
|
+
!form[0] ||
|
|
403
|
+
!form[0].promCodigo ||
|
|
404
|
+
form[0].promCodigo != promCodigo) {
|
|
405
|
+
// this.router.navigate(['404']);
|
|
406
|
+
resolve(lFormFieldsToken);
|
|
407
|
+
}
|
|
408
|
+
lFormFieldsToken = [];
|
|
409
|
+
for (let formComp of form) {
|
|
410
|
+
let newComponents;
|
|
411
|
+
let components = [];
|
|
412
|
+
if (formComp.components) {
|
|
413
|
+
newComponents = formComp.components;
|
|
414
|
+
}
|
|
415
|
+
else if (formComp.columns) {
|
|
416
|
+
newComponents = formComp.columns;
|
|
417
|
+
}
|
|
418
|
+
if (newComponents && UtilString.isValid(formComp.title)) {
|
|
419
|
+
lFormFieldsToken.push({
|
|
420
|
+
title: {
|
|
421
|
+
key: TokenService.getKeyFormulario(formComp.title),
|
|
422
|
+
value: formComp.title,
|
|
423
|
+
object: formComp
|
|
424
|
+
},
|
|
425
|
+
value: []
|
|
426
|
+
});
|
|
427
|
+
lFormFieldsToken[lFormFieldsToken.length - 1].value =
|
|
428
|
+
this.getComponenetForm(components, newComponents, null, false, null);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
resolve(lFormFieldsToken);
|
|
432
|
+
},
|
|
433
|
+
error: (error) => {
|
|
434
|
+
reject(error);
|
|
435
|
+
}
|
|
436
|
+
});
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
getFormFieldsByPromCodeWithEditGrids(promCodigo) {
|
|
440
|
+
return new Promise((resolve, reject) => {
|
|
441
|
+
// Search the dynamic form
|
|
442
|
+
let lFormFieldsToken = null;
|
|
443
|
+
this.formService.getByPromCodigo(promCodigo).subscribe({
|
|
444
|
+
next: (arrayForms) => {
|
|
445
|
+
if (arrayForms.length > 0) {
|
|
446
|
+
for (const forms of arrayForms) {
|
|
447
|
+
let components = [];
|
|
448
|
+
components.push(...FormioUtil.getComponentsWithEditGrids(forms.components));
|
|
449
|
+
if (forms.components && forms.components.length > 0) {
|
|
450
|
+
for (const components of forms.components) {
|
|
451
|
+
if (components.components && components.components.length > 0) {
|
|
452
|
+
for (const component of components.components) {
|
|
453
|
+
if (component.columns && component.columns.length > 0) {
|
|
454
|
+
for (const cComponents of component.columns) {
|
|
455
|
+
if (cComponents.components &&
|
|
456
|
+
cComponents.components.length > 0) {
|
|
457
|
+
for (const iterator of cComponents.components) {
|
|
458
|
+
if (iterator.type === 'address') {
|
|
459
|
+
delete iterator.components;
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
let form = arrayForms;
|
|
472
|
+
if (!form ||
|
|
473
|
+
!form[0] ||
|
|
474
|
+
!form[0].promCodigo ||
|
|
475
|
+
form[0].promCodigo != promCodigo) {
|
|
476
|
+
// this.router.navigate(['404']);
|
|
477
|
+
resolve(lFormFieldsToken);
|
|
478
|
+
}
|
|
479
|
+
lFormFieldsToken = [];
|
|
480
|
+
for (let formComp of form) {
|
|
481
|
+
let newComponents;
|
|
482
|
+
let components = [];
|
|
483
|
+
if (formComp.components) {
|
|
484
|
+
newComponents = formComp.components;
|
|
485
|
+
}
|
|
486
|
+
else if (formComp.columns) {
|
|
487
|
+
newComponents = formComp.columns;
|
|
488
|
+
}
|
|
489
|
+
if (newComponents && UtilString.isValid(formComp.title)) {
|
|
490
|
+
lFormFieldsToken.push({
|
|
491
|
+
title: {
|
|
492
|
+
key: TokenService.getKeyFormulario(formComp.title),
|
|
493
|
+
value: formComp.title,
|
|
494
|
+
object: formComp
|
|
495
|
+
},
|
|
496
|
+
value: []
|
|
497
|
+
});
|
|
498
|
+
lFormFieldsToken[lFormFieldsToken.length - 1].value =
|
|
499
|
+
this.getComponenetForm(components, newComponents, null, false, null);
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
resolve(lFormFieldsToken);
|
|
503
|
+
},
|
|
504
|
+
error: (error) => {
|
|
505
|
+
reject(error);
|
|
506
|
+
}
|
|
507
|
+
});
|
|
508
|
+
});
|
|
509
|
+
}
|
|
510
|
+
getFormFieldsByFormId(formId) {
|
|
511
|
+
return new Promise((resolve, reject) => {
|
|
512
|
+
// Search the dynamic form
|
|
513
|
+
let lFormFieldsToken = null;
|
|
514
|
+
this.formService.getById(formId).subscribe((result) => {
|
|
515
|
+
let form = result;
|
|
516
|
+
if (!form || !form[0]) {
|
|
517
|
+
resolve(lFormFieldsToken);
|
|
518
|
+
}
|
|
519
|
+
lFormFieldsToken = [];
|
|
520
|
+
for (let formComp of form) {
|
|
521
|
+
let newComponents;
|
|
522
|
+
let components = [];
|
|
523
|
+
if (formComp.components) {
|
|
524
|
+
newComponents = formComp.components;
|
|
525
|
+
}
|
|
526
|
+
else if (formComp.columns) {
|
|
527
|
+
newComponents = formComp.columns;
|
|
528
|
+
}
|
|
529
|
+
if (newComponents && UtilString.isValid(formComp.title)) {
|
|
530
|
+
lFormFieldsToken.push({
|
|
531
|
+
title: {
|
|
532
|
+
key: TokenService.getKeyFormulario(formComp.title),
|
|
533
|
+
value: formComp.title,
|
|
534
|
+
object: formComp
|
|
535
|
+
},
|
|
536
|
+
value: []
|
|
537
|
+
});
|
|
538
|
+
lFormFieldsToken[lFormFieldsToken.length - 1].value =
|
|
539
|
+
this.getComponenetForm(components, newComponents, null, false, null);
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
resolve(lFormFieldsToken);
|
|
543
|
+
}, (error) => {
|
|
544
|
+
reject(error);
|
|
545
|
+
});
|
|
546
|
+
});
|
|
547
|
+
}
|
|
548
|
+
/** This promise allows to execute a function when consulting the form fields. */
|
|
549
|
+
getFormPanelsByPromCode(promCodigo) {
|
|
550
|
+
return new Promise((resolve, reject) => {
|
|
551
|
+
// Search the dynamic form
|
|
552
|
+
let lFormPannelsToken = null;
|
|
553
|
+
this.formService.getByPromCodigo(promCodigo).subscribe((result) => {
|
|
554
|
+
let form = result;
|
|
555
|
+
if (!form ||
|
|
556
|
+
!form[0] ||
|
|
557
|
+
!form[0].promCodigo ||
|
|
558
|
+
form[0].promCodigo != promCodigo) {
|
|
559
|
+
// this.router.navigate(['404']);
|
|
560
|
+
resolve(lFormPannelsToken);
|
|
561
|
+
}
|
|
562
|
+
lFormPannelsToken = [];
|
|
563
|
+
for (let formComp of form) {
|
|
564
|
+
let newComponents;
|
|
565
|
+
let components = [];
|
|
566
|
+
if (formComp.components) {
|
|
567
|
+
newComponents = formComp.components;
|
|
568
|
+
}
|
|
569
|
+
else if (formComp.columns) {
|
|
570
|
+
newComponents = formComp.columns;
|
|
571
|
+
}
|
|
572
|
+
if (newComponents && UtilString.isValid(formComp.title)) {
|
|
573
|
+
lFormPannelsToken.push({
|
|
574
|
+
title: {
|
|
575
|
+
key: TokenService.getKeyFormulario(formComp.title),
|
|
576
|
+
value: formComp.title,
|
|
577
|
+
object: formComp
|
|
578
|
+
},
|
|
579
|
+
value: []
|
|
580
|
+
});
|
|
581
|
+
lFormPannelsToken[lFormPannelsToken.length - 1].value =
|
|
582
|
+
this.getPanelComponenet(components, newComponents, null);
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
resolve(lFormPannelsToken);
|
|
586
|
+
}, (error) => {
|
|
587
|
+
reject(error);
|
|
588
|
+
});
|
|
589
|
+
});
|
|
590
|
+
}
|
|
591
|
+
/**
|
|
592
|
+
* A recursive method to get all the information of the editGrid dynamic form
|
|
593
|
+
* @param components
|
|
594
|
+
* @param form
|
|
595
|
+
*/
|
|
596
|
+
getPanelComponenet(components, form, panelName) {
|
|
597
|
+
for (let formComp of form) {
|
|
598
|
+
if (formComp.type === 'panel') {
|
|
599
|
+
components.push(formComp);
|
|
600
|
+
}
|
|
601
|
+
else if (formComp.components || formComp.columns) {
|
|
602
|
+
let newComponents;
|
|
603
|
+
if (formComp.components) {
|
|
604
|
+
newComponents = formComp.components;
|
|
605
|
+
}
|
|
606
|
+
else if (formComp.columns) {
|
|
607
|
+
newComponents = formComp.columns;
|
|
608
|
+
}
|
|
609
|
+
components = this.getPanelComponenet(components, newComponents, panelName);
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
return components;
|
|
613
|
+
}
|
|
614
|
+
/**
|
|
615
|
+
* A recursive method to get all the information of the components a columns of the dynamic form
|
|
616
|
+
* @param components
|
|
617
|
+
* @param form
|
|
618
|
+
*/
|
|
619
|
+
getComponenetForm(components, form, panelName, editgrid, editGridKey) {
|
|
620
|
+
for (let formComp of form) {
|
|
621
|
+
//MO- mantis 8743 fix address token
|
|
622
|
+
if ((formComp.components || formComp.columns) &&
|
|
623
|
+
formComp.type !== 'address' &&
|
|
624
|
+
formComp.type !== 'editgrid') {
|
|
625
|
+
let newComponents;
|
|
626
|
+
if (formComp.components) {
|
|
627
|
+
newComponents = formComp.components;
|
|
628
|
+
if (formComp.type === 'editgrid') {
|
|
629
|
+
editgrid = true;
|
|
630
|
+
editGridKey = formComp.key;
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
else if (formComp.columns) {
|
|
634
|
+
newComponents = formComp.columns;
|
|
635
|
+
}
|
|
636
|
+
if (formComp.type && formComp.type === 'panel') {
|
|
637
|
+
panelName = formComp.title;
|
|
638
|
+
}
|
|
639
|
+
components = this.getComponenetForm(components, newComponents, panelName, editgrid, editGridKey);
|
|
640
|
+
}
|
|
641
|
+
else {
|
|
642
|
+
formComp.panelName = panelName;
|
|
643
|
+
formComp.editgrid = editgrid;
|
|
644
|
+
formComp.editGridKey = editGridKey;
|
|
645
|
+
components.push(formComp);
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
return components;
|
|
649
|
+
}
|
|
650
|
+
/** This promise allows to execute a function when consulting the form fields. */
|
|
651
|
+
getFormEditGridFieldsByPromCode(promCodigo) {
|
|
652
|
+
return new Promise((resolve, reject) => {
|
|
653
|
+
// Search the dynamic form
|
|
654
|
+
let lFormFieldsToken = null;
|
|
655
|
+
this.formService.getByPromCodigo(promCodigo).subscribe((result) => {
|
|
656
|
+
let form = result;
|
|
657
|
+
if (!form ||
|
|
658
|
+
!form[0] ||
|
|
659
|
+
!form[0].promCodigo ||
|
|
660
|
+
form[0].promCodigo != promCodigo) {
|
|
661
|
+
// this.router.navigate(['404']);
|
|
662
|
+
resolve(lFormFieldsToken);
|
|
663
|
+
}
|
|
664
|
+
lFormFieldsToken = [];
|
|
665
|
+
for (let formComp of form) {
|
|
666
|
+
let newComponents;
|
|
667
|
+
let components = [];
|
|
668
|
+
if (formComp.components) {
|
|
669
|
+
newComponents = formComp.components;
|
|
670
|
+
}
|
|
671
|
+
else if (formComp.columns) {
|
|
672
|
+
newComponents = formComp.columns;
|
|
673
|
+
}
|
|
674
|
+
if (newComponents && UtilString.isValid(formComp.title)) {
|
|
675
|
+
lFormFieldsToken.push({
|
|
676
|
+
title: {
|
|
677
|
+
key: TokenService.getKeyFormulario(formComp.title),
|
|
678
|
+
value: formComp.title,
|
|
679
|
+
object: formComp
|
|
680
|
+
},
|
|
681
|
+
value: []
|
|
682
|
+
});
|
|
683
|
+
lFormFieldsToken[lFormFieldsToken.length - 1].value =
|
|
684
|
+
this.getEditGridComponenet(components, newComponents, null);
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
resolve(lFormFieldsToken);
|
|
688
|
+
}, (error) => {
|
|
689
|
+
reject(error);
|
|
690
|
+
});
|
|
691
|
+
});
|
|
692
|
+
}
|
|
693
|
+
/**
|
|
694
|
+
* A recursive method to get all the information of the editGrid dynamic form
|
|
695
|
+
* @param components
|
|
696
|
+
* @param form
|
|
697
|
+
*/
|
|
698
|
+
getEditGridComponenet(components, form, panelName) {
|
|
699
|
+
for (let formComp of form) {
|
|
700
|
+
if (formComp.type === 'editgrid') {
|
|
701
|
+
formComp.panelName = panelName;
|
|
702
|
+
components.push(formComp);
|
|
703
|
+
}
|
|
704
|
+
else if (formComp.components || formComp.columns) {
|
|
705
|
+
let newComponents;
|
|
706
|
+
if (formComp.components) {
|
|
707
|
+
newComponents = formComp.components;
|
|
708
|
+
}
|
|
709
|
+
else if (formComp.columns) {
|
|
710
|
+
newComponents = formComp.columns;
|
|
711
|
+
}
|
|
712
|
+
if (formComp.type && formComp.type === 'panel') {
|
|
713
|
+
panelName = formComp.title;
|
|
714
|
+
}
|
|
715
|
+
components = this.getEditGridComponenet(components, newComponents, panelName);
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
return components;
|
|
719
|
+
}
|
|
720
|
+
/** It returns the tokens by promCodigo */
|
|
721
|
+
getListByPromCodigo(promCode) {
|
|
722
|
+
return this.httpClient.get(this.environment.host.backend.configuration + 'token/getByPromCodigo', { params: new HttpParams().set('promCodigo', promCode.toString()) });
|
|
723
|
+
}
|
|
724
|
+
/** It returns the token by id */
|
|
725
|
+
getById(id) {
|
|
726
|
+
return this.httpClient.get(this.environment.host.backend.configuration + 'token/getById', {
|
|
727
|
+
params: new HttpParams().set('id', id.toString())
|
|
728
|
+
});
|
|
729
|
+
}
|
|
730
|
+
/** It deletes a form by id */
|
|
731
|
+
delete(id) {
|
|
732
|
+
return this.httpClient.delete(this.environment.host.backend.configuration + 'token/delete', { params: new HttpParams().set('id', id) });
|
|
733
|
+
}
|
|
734
|
+
/** It saves the token */
|
|
735
|
+
save(token) {
|
|
736
|
+
return this.httpClient.post(this.environment.host.backend.configuration + 'token/save', token, HEADER_JSON);
|
|
737
|
+
}
|
|
738
|
+
static getKeyFormulario(formTitle) {
|
|
739
|
+
if (UtilString.isValid(formTitle)) {
|
|
740
|
+
return (UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_FORM) +
|
|
741
|
+
UtilString.replaceAccentSpacesOthers(formTitle).replace(/_/g, '-'));
|
|
742
|
+
}
|
|
743
|
+
return '';
|
|
744
|
+
}
|
|
745
|
+
/** It returns the unique verification code */
|
|
746
|
+
getUniqueVerificationCode(login, token) {
|
|
747
|
+
return this.httpClient.get(this.environment.host.backend.documentsRepository +
|
|
748
|
+
'documento/consultarCodigoUnico/' +
|
|
749
|
+
login +
|
|
750
|
+
'/' +
|
|
751
|
+
token, { params: new HttpParams() });
|
|
752
|
+
}
|
|
753
|
+
/** It send the information to copy the Document viewer */
|
|
754
|
+
copyDocumentInformationViewer(login, token, uniqueCode, documentURL, documentName) {
|
|
755
|
+
let infoDocumento = {
|
|
756
|
+
codigoUnico: uniqueCode,
|
|
757
|
+
rutaDocumento: documentURL,
|
|
758
|
+
documentName: documentName
|
|
759
|
+
};
|
|
760
|
+
return this.httpClient.post(this.environment.host.backend.documentsRepository +
|
|
761
|
+
'documento/adicionarDocumento/' +
|
|
762
|
+
login +
|
|
763
|
+
'/' +
|
|
764
|
+
token, infoDocumento, HEADER_JSON);
|
|
765
|
+
}
|
|
766
|
+
static getKeyBudget() {
|
|
767
|
+
return UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_BUDGET);
|
|
768
|
+
}
|
|
769
|
+
static getKeyDocument() {
|
|
770
|
+
return UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_DOCUMENTO);
|
|
771
|
+
}
|
|
772
|
+
static getKeyDocumentAnalysis() {
|
|
773
|
+
return UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_DOCUMENTO_ANALYSIS_TYPE);
|
|
774
|
+
}
|
|
775
|
+
static getKeyTask() {
|
|
776
|
+
return UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_TASKL);
|
|
777
|
+
}
|
|
778
|
+
static getKeyStatic() {
|
|
779
|
+
return UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_STATIC);
|
|
780
|
+
}
|
|
781
|
+
static getKeyCalculated(token) {
|
|
782
|
+
return (UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_CALCULATED) +
|
|
783
|
+
'_' +
|
|
784
|
+
UtilString.replaceAccentSpacesOthers(token.name));
|
|
785
|
+
}
|
|
786
|
+
static getKeySnapshot(token) {
|
|
787
|
+
return (UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_SNAPSHOT) +
|
|
788
|
+
'_' +
|
|
789
|
+
UtilString.replaceAccentSpacesOthers(token.name));
|
|
790
|
+
}
|
|
791
|
+
static getKeyGuarantee(token) {
|
|
792
|
+
return (UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_GUARANTEE) +
|
|
793
|
+
'_' +
|
|
794
|
+
UtilString.replaceAccentSpacesOthers(token.name));
|
|
795
|
+
}
|
|
796
|
+
/**
|
|
797
|
+
* Return a value that represent the type of label: 1=Form, 2=Budget, 3=Static, 4=Calculated
|
|
798
|
+
* @param key Value to evalueate
|
|
799
|
+
*/
|
|
800
|
+
static getKeyType(key) {
|
|
801
|
+
key = key.replace('{', '').replace('}', '');
|
|
802
|
+
key = key.substring(1, key.indexOf('_'));
|
|
803
|
+
if (key.startsWith(UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_FORM))) {
|
|
804
|
+
return 1;
|
|
805
|
+
}
|
|
806
|
+
else if (key.startsWith(UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_BUDGET))) {
|
|
807
|
+
return 2;
|
|
808
|
+
}
|
|
809
|
+
else if (key.startsWith(UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_STATIC))) {
|
|
810
|
+
return 3;
|
|
811
|
+
}
|
|
812
|
+
else if (key.startsWith(UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_CALCULATED))) {
|
|
813
|
+
return 4;
|
|
814
|
+
}
|
|
815
|
+
else if (key.startsWith(UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_TASKL))) {
|
|
816
|
+
return 5;
|
|
817
|
+
}
|
|
818
|
+
else if (key.startsWith(UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_DOCUMENTO_ANALYSIS_TYPE))) {
|
|
819
|
+
return 6;
|
|
820
|
+
}
|
|
821
|
+
return null;
|
|
822
|
+
}
|
|
823
|
+
/**
|
|
824
|
+
* Depends of the type of formFieldToken return de value of the valueData
|
|
825
|
+
* @param formFieldToken
|
|
826
|
+
* @param valueData
|
|
827
|
+
*/
|
|
828
|
+
getValueFromFormField(formFieldToken, valueData) {
|
|
829
|
+
if (typeof valueData == 'object') {
|
|
830
|
+
if (formFieldToken.type) {
|
|
831
|
+
if (formFieldToken.type == 'address') {
|
|
832
|
+
return valueData.formatted_address;
|
|
833
|
+
}
|
|
834
|
+
if (formFieldToken.type == 'select' &&
|
|
835
|
+
valueData.hasOwnProperty(formFieldToken.searchField)) {
|
|
836
|
+
if (valueData.hasOwnProperty('original_name') !== '') {
|
|
837
|
+
return valueData.original_name;
|
|
838
|
+
}
|
|
839
|
+
else if (valueData.hasOwnProperty('nativeName') !== '') {
|
|
840
|
+
return valueData.nativeName;
|
|
841
|
+
}
|
|
842
|
+
else if (valueData.hasOwnProperty('formatted_address')) {
|
|
843
|
+
return valueData.formatted_address;
|
|
844
|
+
}
|
|
845
|
+
else if (formFieldToken.searchField) {
|
|
846
|
+
return valueData[formFieldToken.searchField];
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
if (formFieldToken.type == 'select') {
|
|
850
|
+
if (valueData.hasOwnProperty('formatted_address')) {
|
|
851
|
+
return valueData.formatted_address;
|
|
852
|
+
}
|
|
853
|
+
}
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
return valueData;
|
|
857
|
+
}
|
|
858
|
+
formatDate(value, locale) {
|
|
859
|
+
const date = new Date(value);
|
|
860
|
+
const months = {
|
|
861
|
+
es: [
|
|
862
|
+
'enero',
|
|
863
|
+
'febrero',
|
|
864
|
+
'marzo',
|
|
865
|
+
'abril',
|
|
866
|
+
'mayo',
|
|
867
|
+
'junio',
|
|
868
|
+
'julio',
|
|
869
|
+
'agosto',
|
|
870
|
+
'septiembre',
|
|
871
|
+
'octubre',
|
|
872
|
+
'noviembre',
|
|
873
|
+
'diciembre'
|
|
874
|
+
],
|
|
875
|
+
en: [
|
|
876
|
+
'January',
|
|
877
|
+
'February',
|
|
878
|
+
'March',
|
|
879
|
+
'April',
|
|
880
|
+
'May',
|
|
881
|
+
'June',
|
|
882
|
+
'July',
|
|
883
|
+
'August',
|
|
884
|
+
'September',
|
|
885
|
+
'October',
|
|
886
|
+
'November',
|
|
887
|
+
'December'
|
|
888
|
+
],
|
|
889
|
+
fr: [
|
|
890
|
+
'janvier',
|
|
891
|
+
'février',
|
|
892
|
+
'mars',
|
|
893
|
+
'avril',
|
|
894
|
+
'mai',
|
|
895
|
+
'juin',
|
|
896
|
+
'juillet',
|
|
897
|
+
'août',
|
|
898
|
+
'septembre',
|
|
899
|
+
'octobre',
|
|
900
|
+
'novembre',
|
|
901
|
+
'décembre'
|
|
902
|
+
],
|
|
903
|
+
de: [
|
|
904
|
+
'Januar',
|
|
905
|
+
'Februar',
|
|
906
|
+
'März',
|
|
907
|
+
'April',
|
|
908
|
+
'Mai',
|
|
909
|
+
'Juni',
|
|
910
|
+
'Juli',
|
|
911
|
+
'August',
|
|
912
|
+
'September',
|
|
913
|
+
'Oktober',
|
|
914
|
+
'November',
|
|
915
|
+
'Dezember'
|
|
916
|
+
],
|
|
917
|
+
it: [
|
|
918
|
+
'gennaio',
|
|
919
|
+
'febbraio',
|
|
920
|
+
'marzo',
|
|
921
|
+
'aprile',
|
|
922
|
+
'maggio',
|
|
923
|
+
'giugno',
|
|
924
|
+
'luglio',
|
|
925
|
+
'agosto',
|
|
926
|
+
'settembre',
|
|
927
|
+
'ottobre',
|
|
928
|
+
'novembre',
|
|
929
|
+
'dicembre'
|
|
930
|
+
]
|
|
931
|
+
};
|
|
932
|
+
const localeMonths = months[locale];
|
|
933
|
+
const month = localeMonths[date.getMonth()];
|
|
934
|
+
const year = date.getFullYear();
|
|
935
|
+
return `${month} ${year}`;
|
|
936
|
+
}
|
|
937
|
+
/**
|
|
938
|
+
* Try to find the token in the stringText and replace with dataValue. If detect format of number or date try to format the dataValue
|
|
939
|
+
* @param stringText
|
|
940
|
+
* @param token
|
|
941
|
+
* @param dataValue
|
|
942
|
+
*/
|
|
943
|
+
replaceToken(stringText, token, dataValue, locale) {
|
|
944
|
+
let valueReplace = null;
|
|
945
|
+
if (token && token[0] == '#') {
|
|
946
|
+
let typeToken = token.substring(1, token.indexOf('('));
|
|
947
|
+
if (typeToken == 'date') {
|
|
948
|
+
let dateFormat = token.substring(token.indexOf('}') + 1, token.indexOf(')'));
|
|
949
|
+
dateFormat = dateFormat.trim().replace(/\"/g, '').replace(/\'/g, '');
|
|
950
|
+
let dateValue = DateUtil.getDate(dataValue);
|
|
951
|
+
if (locale != null && locale) {
|
|
952
|
+
valueReplace = this.formatDate(dateValue, locale);
|
|
953
|
+
}
|
|
954
|
+
else if (dateValue) {
|
|
955
|
+
valueReplace = DateUtil.getMoment(dateValue).format(dateFormat);
|
|
956
|
+
}
|
|
957
|
+
else {
|
|
958
|
+
valueReplace = '';
|
|
959
|
+
}
|
|
960
|
+
}
|
|
961
|
+
else if (typeToken == 'number') {
|
|
962
|
+
let numberValue = Number(dataValue);
|
|
963
|
+
if (numberValue != undefined && !isNaN(numberValue)) {
|
|
964
|
+
let numberFormat = token.substring(token.indexOf('}') + 1, token.indexOf(')'));
|
|
965
|
+
numberFormat = numberFormat.trim().replace(/\"/g, '').replace(/\'/g, '');
|
|
966
|
+
valueReplace = this.currencyPipe.transform(numberValue, this.locale, '', numberFormat);
|
|
967
|
+
}
|
|
968
|
+
else {
|
|
969
|
+
console.log('El dato [' +
|
|
970
|
+
dataValue +
|
|
971
|
+
'] para el token [' +
|
|
972
|
+
token +
|
|
973
|
+
'] tipo númerico no es valido');
|
|
974
|
+
valueReplace = '';
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
else {
|
|
978
|
+
console.log('tipo de token indefinido. [typeToken[' + typeToken + ']]');
|
|
979
|
+
}
|
|
980
|
+
}
|
|
981
|
+
else if (token && token[0] == '$') {
|
|
982
|
+
if (dataValue !== null &&
|
|
983
|
+
dataValue !== undefined &&
|
|
984
|
+
dataValue.original_name !== undefined &&
|
|
985
|
+
dataValue.original_name !== null) {
|
|
986
|
+
valueReplace = dataValue.original_name;
|
|
987
|
+
}
|
|
988
|
+
else {
|
|
989
|
+
valueReplace = dataValue;
|
|
990
|
+
}
|
|
991
|
+
// valueReplace = dataValue;
|
|
992
|
+
}
|
|
993
|
+
else {
|
|
994
|
+
console.log('El token no es valido. [token[' + token + ']]');
|
|
995
|
+
}
|
|
996
|
+
if (stringText && valueReplace !== null) {
|
|
997
|
+
if (token && token === '${estatico_' + TokenService.STATIC_TOKEN_SURNAME + '}') {
|
|
998
|
+
valueReplace = dataValue;
|
|
999
|
+
stringText = stringText.split(token).join(valueReplace);
|
|
1000
|
+
}
|
|
1001
|
+
else {
|
|
1002
|
+
// replace text in a more efficient way
|
|
1003
|
+
stringText = stringText.split(token).join(valueReplace);
|
|
1004
|
+
//stringText = stringText.replace(token, valueReplace);
|
|
1005
|
+
}
|
|
1006
|
+
}
|
|
1007
|
+
return stringText;
|
|
1008
|
+
}
|
|
1009
|
+
getListTokensByStringSegmentation(stringText) {
|
|
1010
|
+
const arrayToken = stringText.match(/\${([^}]+)\}/g);
|
|
1011
|
+
const arrayTokenFormattedDate = stringText.match(/\#date[^)]+\)/g);
|
|
1012
|
+
const arrayTokenFormattedNumber = stringText.match(/\#number[^)]+\)/g);
|
|
1013
|
+
let arrayTokenFormatted = [];
|
|
1014
|
+
if (arrayTokenFormattedDate &&
|
|
1015
|
+
arrayTokenFormattedDate.length > 0 &&
|
|
1016
|
+
arrayTokenFormattedNumber &&
|
|
1017
|
+
arrayTokenFormattedNumber.length > 0) {
|
|
1018
|
+
arrayTokenFormatted = arrayTokenFormattedDate.concat(arrayTokenFormattedNumber);
|
|
1019
|
+
}
|
|
1020
|
+
else if (arrayTokenFormattedDate && arrayTokenFormattedDate.length > 0) {
|
|
1021
|
+
arrayTokenFormatted = arrayTokenFormattedDate.slice();
|
|
1022
|
+
}
|
|
1023
|
+
else if (arrayTokenFormattedNumber && arrayTokenFormattedNumber.length > 0) {
|
|
1024
|
+
arrayTokenFormatted = arrayTokenFormattedNumber.slice();
|
|
1025
|
+
}
|
|
1026
|
+
const result = [];
|
|
1027
|
+
if (arrayToken) {
|
|
1028
|
+
for (const token of arrayToken) {
|
|
1029
|
+
const infoToken = { key: token, value: token };
|
|
1030
|
+
if (arrayTokenFormatted) {
|
|
1031
|
+
for (const tokenFormatted of arrayTokenFormatted) {
|
|
1032
|
+
const index = tokenFormatted.indexOf(token);
|
|
1033
|
+
if (index >= 0) {
|
|
1034
|
+
infoToken.value = tokenFormatted;
|
|
1035
|
+
break;
|
|
1036
|
+
}
|
|
1037
|
+
}
|
|
1038
|
+
}
|
|
1039
|
+
result.push(infoToken);
|
|
1040
|
+
}
|
|
1041
|
+
}
|
|
1042
|
+
return result;
|
|
1043
|
+
}
|
|
1044
|
+
changeIdPropertiesOfObject(normalizationColumns, listData) {
|
|
1045
|
+
const newData = [];
|
|
1046
|
+
listData.forEach((data) => {
|
|
1047
|
+
const objData = {};
|
|
1048
|
+
Object.keys(data).forEach((property) => {
|
|
1049
|
+
if (data.hasOwnProperty(property)) {
|
|
1050
|
+
normalizationColumns.forEach((column) => {
|
|
1051
|
+
if (column.idColumn.toString() === property) {
|
|
1052
|
+
objData[column.key] = data[property];
|
|
1053
|
+
}
|
|
1054
|
+
});
|
|
1055
|
+
}
|
|
1056
|
+
});
|
|
1057
|
+
if (objData) {
|
|
1058
|
+
newData.push(objData);
|
|
1059
|
+
}
|
|
1060
|
+
});
|
|
1061
|
+
return newData;
|
|
1062
|
+
}
|
|
1063
|
+
generateHtmlByTokensAndData(html, listData, listTokens) {
|
|
1064
|
+
const translatedCards = [];
|
|
1065
|
+
listData.forEach((data) => {
|
|
1066
|
+
const objToken = {};
|
|
1067
|
+
const htmlTranslated = { html: html };
|
|
1068
|
+
Object.keys(data).forEach((property) => {
|
|
1069
|
+
listTokens.forEach((token) => {
|
|
1070
|
+
if (property == token.key.replace('${', '').replace('}', '')) {
|
|
1071
|
+
objToken[token.key] = data[property];
|
|
1072
|
+
htmlTranslated.html = htmlTranslated.html.replace(token.key, data[property]);
|
|
1073
|
+
}
|
|
1074
|
+
});
|
|
1075
|
+
});
|
|
1076
|
+
translatedCards.push(htmlTranslated);
|
|
1077
|
+
});
|
|
1078
|
+
return translatedCards;
|
|
1079
|
+
}
|
|
1080
|
+
getListTokensByString(stringText) {
|
|
1081
|
+
var arrayToken = stringText.match(/\${([^}]+)\}/g);
|
|
1082
|
+
var arrayTokenFormattedDate = stringText.match(/\#date[^)]+\)/g);
|
|
1083
|
+
var arrayTokenFormattedNumber = stringText.match(/\#number[^)]+\)/g);
|
|
1084
|
+
var arrayTokenFormatted = [];
|
|
1085
|
+
if (arrayTokenFormattedDate &&
|
|
1086
|
+
arrayTokenFormattedDate.length > 0 &&
|
|
1087
|
+
arrayTokenFormattedNumber &&
|
|
1088
|
+
arrayTokenFormattedNumber.length > 0) {
|
|
1089
|
+
arrayTokenFormatted = arrayTokenFormattedDate.concat(arrayTokenFormattedNumber);
|
|
1090
|
+
}
|
|
1091
|
+
else if (arrayTokenFormattedDate && arrayTokenFormattedDate.length > 0) {
|
|
1092
|
+
arrayTokenFormatted = arrayTokenFormattedDate.slice();
|
|
1093
|
+
}
|
|
1094
|
+
else if (arrayTokenFormattedNumber && arrayTokenFormattedNumber.length > 0) {
|
|
1095
|
+
arrayTokenFormatted = arrayTokenFormattedNumber.slice();
|
|
1096
|
+
}
|
|
1097
|
+
var result = [];
|
|
1098
|
+
if (arrayToken) {
|
|
1099
|
+
for (const token of arrayToken) {
|
|
1100
|
+
let keyType = TokenService.getKeyType(token);
|
|
1101
|
+
if (keyType === null) {
|
|
1102
|
+
continue;
|
|
1103
|
+
}
|
|
1104
|
+
var infoToken = { key: token, value: token };
|
|
1105
|
+
if (arrayTokenFormatted) {
|
|
1106
|
+
for (const tokenFormatted of arrayTokenFormatted) {
|
|
1107
|
+
var index = tokenFormatted.indexOf(token);
|
|
1108
|
+
if (index >= 0) {
|
|
1109
|
+
infoToken.value = tokenFormatted;
|
|
1110
|
+
break;
|
|
1111
|
+
}
|
|
1112
|
+
}
|
|
1113
|
+
}
|
|
1114
|
+
result.push(infoToken);
|
|
1115
|
+
}
|
|
1116
|
+
}
|
|
1117
|
+
return result;
|
|
1118
|
+
// let tokens: any[] = [];
|
|
1119
|
+
// let i = this.nextValidPositionTokens(stringText, 0);
|
|
1120
|
+
// let count = 0;
|
|
1121
|
+
// while (i >= 0 && count <= 10) {
|
|
1122
|
+
// let infoToken: {} = null;
|
|
1123
|
+
// let nextI: number = i;
|
|
1124
|
+
// let character = stringText.substring(i, (i + 1));
|
|
1125
|
+
// if (character == "$") {
|
|
1126
|
+
// let nextCharacter = stringText.substring((i + 1), (i + 2));
|
|
1127
|
+
// // The next character need to be a { sign
|
|
1128
|
+
// if (nextCharacter != "{") {
|
|
1129
|
+
// i = this.nextValidPositionTokens(stringText, nextI + 1);
|
|
1130
|
+
// continue;
|
|
1131
|
+
// }
|
|
1132
|
+
// let keyToken: string = stringText.substring(i, stringText.indexOf("}", i) + 1);
|
|
1133
|
+
// // If the token have a valid key type
|
|
1134
|
+
// let keyType: number = TokenService.getKeyType(keyToken.replace("{", "").replace("}", ""));
|
|
1135
|
+
// if (keyType === null) {
|
|
1136
|
+
// i = this.nextValidPositionTokens(stringText, nextI + 1);
|
|
1137
|
+
// continue;
|
|
1138
|
+
// }
|
|
1139
|
+
// infoToken = {
|
|
1140
|
+
// key: keyToken,
|
|
1141
|
+
// value: keyToken
|
|
1142
|
+
// };
|
|
1143
|
+
// nextI = stringText.indexOf("}", i);
|
|
1144
|
+
// } else {
|
|
1145
|
+
// let nextSign: number = stringText.indexOf("$", i);
|
|
1146
|
+
// // We inly support #date($ and #number($ in this 2 scenarios the lenght can't be more than 10 characters
|
|
1147
|
+
// if (nextSign < 0 || (nextSign - i) > 10) {
|
|
1148
|
+
// i = this.nextValidPositionTokens(stringText, nextI + 1);
|
|
1149
|
+
// continue;
|
|
1150
|
+
// }
|
|
1151
|
+
// let keyToken: string = stringText.substring(stringText.indexOf("$", i), stringText.indexOf("}", i) + 1);
|
|
1152
|
+
// let valueToken: string = stringText.substring(i, stringText.indexOf(")", i) + 1);
|
|
1153
|
+
// infoToken = {
|
|
1154
|
+
// key: keyToken,
|
|
1155
|
+
// value: valueToken
|
|
1156
|
+
// };
|
|
1157
|
+
// nextI = stringText.indexOf(")", i);
|
|
1158
|
+
// }
|
|
1159
|
+
// tokens.push(infoToken);
|
|
1160
|
+
// i = this.nextValidPositionTokens(stringText, nextI);
|
|
1161
|
+
// count++;
|
|
1162
|
+
// }
|
|
1163
|
+
// return tokens;
|
|
1164
|
+
}
|
|
1165
|
+
nextValidPositionTokens(stringText, nextI) {
|
|
1166
|
+
let tokenDollarSign = stringText.indexOf('$', nextI);
|
|
1167
|
+
let tokenNumSign = stringText.indexOf('#', nextI);
|
|
1168
|
+
let i = tokenDollarSign < 0 && tokenNumSign >= 0
|
|
1169
|
+
? tokenNumSign
|
|
1170
|
+
: tokenNumSign < 0 && tokenDollarSign >= 0
|
|
1171
|
+
? tokenDollarSign
|
|
1172
|
+
: tokenDollarSign < tokenNumSign
|
|
1173
|
+
? tokenDollarSign
|
|
1174
|
+
: tokenNumSign;
|
|
1175
|
+
return i;
|
|
1176
|
+
}
|
|
1177
|
+
/**
|
|
1178
|
+
* It reuses replaceTokensFromListObjectPublic but set all keys lobjecttokens as lowercase
|
|
1179
|
+
* @param tokenName
|
|
1180
|
+
* @param formula
|
|
1181
|
+
* @param lObjectTokens
|
|
1182
|
+
*/
|
|
1183
|
+
replaceTokensFromListObjectPublic(tokenName, formula, lObjectTokens) {
|
|
1184
|
+
let lDataOrg = [];
|
|
1185
|
+
if (lObjectTokens) {
|
|
1186
|
+
for (let dataForm in lObjectTokens) {
|
|
1187
|
+
lDataOrg[dataForm.toLowerCase()] = lObjectTokens[dataForm];
|
|
1188
|
+
}
|
|
1189
|
+
}
|
|
1190
|
+
return this.replaceTokensFromListObject(tokenName, formula, lDataOrg);
|
|
1191
|
+
}
|
|
1192
|
+
/**
|
|
1193
|
+
* @param tokenName token name
|
|
1194
|
+
* @param formula String with the formula to execute
|
|
1195
|
+
* @param lObjectTokens List of tokens with the values to replace
|
|
1196
|
+
*/
|
|
1197
|
+
replaceTokensFromListObject(tokenName, formula, lObjectTokens) {
|
|
1198
|
+
if (!formula || formula.length == 0) {
|
|
1199
|
+
throw {
|
|
1200
|
+
message: 'La formula del token ' + tokenName + ' esta vacía',
|
|
1201
|
+
title: 'Alerta!',
|
|
1202
|
+
error: 'La formula del token ' + tokenName + ' esta vacía. [formula[' + formula + ']]'
|
|
1203
|
+
};
|
|
1204
|
+
}
|
|
1205
|
+
let replacedTokens = formula.toString();
|
|
1206
|
+
if (replacedTokens.startsWith('file://')) {
|
|
1207
|
+
return replacedTokens;
|
|
1208
|
+
}
|
|
1209
|
+
// Find the tokens in the formula
|
|
1210
|
+
let tokensArray = this.getListTokensByString(replacedTokens);
|
|
1211
|
+
if (tokensArray.length == 0) {
|
|
1212
|
+
return replacedTokens;
|
|
1213
|
+
}
|
|
1214
|
+
// If there any token, try to replace
|
|
1215
|
+
for (let i = 0; i < tokensArray.length; i++) {
|
|
1216
|
+
let objectToken = lObjectTokens[tokensArray[i].key] !== undefined
|
|
1217
|
+
? lObjectTokens[tokensArray[i].key]
|
|
1218
|
+
: null;
|
|
1219
|
+
let clearKey;
|
|
1220
|
+
if (objectToken == null) {
|
|
1221
|
+
clearKey = tokensArray[i].key.replace('${', '').replace('}', '').toLowerCase();
|
|
1222
|
+
objectToken =
|
|
1223
|
+
lObjectTokens[clearKey] !== undefined ? lObjectTokens[clearKey] : null;
|
|
1224
|
+
if (objectToken == null) {
|
|
1225
|
+
clearKey = tokensArray[i].key
|
|
1226
|
+
.replace('{', '')
|
|
1227
|
+
.replace('}', '')
|
|
1228
|
+
.split('_')[1]
|
|
1229
|
+
.toLowerCase();
|
|
1230
|
+
objectToken =
|
|
1231
|
+
lObjectTokens[clearKey] !== undefined ? lObjectTokens[clearKey] : null;
|
|
1232
|
+
if (objectToken === null || objectToken === undefined) {
|
|
1233
|
+
const arrayKey = tokensArray[i].key
|
|
1234
|
+
.replace('{', '')
|
|
1235
|
+
.replace('}', '')
|
|
1236
|
+
.split('_')[1]
|
|
1237
|
+
.split('.');
|
|
1238
|
+
if (arrayKey.length > 0) {
|
|
1239
|
+
let value = lObjectTokens;
|
|
1240
|
+
for (let index = 0; index < arrayKey.length; index++) {
|
|
1241
|
+
let element = arrayKey[index];
|
|
1242
|
+
if (index == 0) {
|
|
1243
|
+
element = element.toLowerCase();
|
|
1244
|
+
}
|
|
1245
|
+
value = value[element];
|
|
1246
|
+
}
|
|
1247
|
+
objectToken = value;
|
|
1248
|
+
}
|
|
1249
|
+
}
|
|
1250
|
+
}
|
|
1251
|
+
}
|
|
1252
|
+
if (objectToken == null) {
|
|
1253
|
+
// If not find the token, by default put an empty string
|
|
1254
|
+
/*if (TokenService.excludedToken.indexOf(clearKey) === -1) {
|
|
1255
|
+
console.error(
|
|
1256
|
+
'El token ' + tokensArray[i].value + ' no fue encontrado.',
|
|
1257
|
+
lObjectTokens,
|
|
1258
|
+
tokensArray
|
|
1259
|
+
);
|
|
1260
|
+
}*/
|
|
1261
|
+
objectToken = '';
|
|
1262
|
+
}
|
|
1263
|
+
if (objectToken != null) {
|
|
1264
|
+
// let value: any = Number(objectToken)
|
|
1265
|
+
// ? objectToken
|
|
1266
|
+
// : Array.isArray(objectToken)
|
|
1267
|
+
// ? JSON.stringify(objectToken)
|
|
1268
|
+
// : "'" + objectToken + "'";
|
|
1269
|
+
const tokenLiteral = tokensArray[i].value;
|
|
1270
|
+
const pos = replacedTokens.indexOf(tokenLiteral);
|
|
1271
|
+
//Mantis 11649
|
|
1272
|
+
const quoteCtx = this.getQuoteContext(replacedTokens, pos);
|
|
1273
|
+
const escapeForJs = (s, ctx) => {
|
|
1274
|
+
let t = String(s ?? '');
|
|
1275
|
+
t = t.replace(/\\/g, '\\\\'); // backslashes
|
|
1276
|
+
if (ctx === 'double')
|
|
1277
|
+
t = t.replace(/"/g, '\\"');
|
|
1278
|
+
if (ctx === 'single')
|
|
1279
|
+
t = t.replace(/'/g, "\\'");
|
|
1280
|
+
return t;
|
|
1281
|
+
};
|
|
1282
|
+
if (quoteCtx) {
|
|
1283
|
+
const raw = escapeForJs(objectToken, quoteCtx);
|
|
1284
|
+
replacedTokens = this.replaceToken(replacedTokens, tokenLiteral, raw);
|
|
1285
|
+
}
|
|
1286
|
+
else {
|
|
1287
|
+
let value;
|
|
1288
|
+
if (Number(objectToken)) {
|
|
1289
|
+
value = Number(objectToken);
|
|
1290
|
+
}
|
|
1291
|
+
else if (Array.isArray(objectToken)) {
|
|
1292
|
+
value = Array.isArray(objectToken);
|
|
1293
|
+
}
|
|
1294
|
+
else if (JSON.stringify(objectToken)) {
|
|
1295
|
+
value = objectToken.original_name
|
|
1296
|
+
? '"' + objectToken.original_name + '"'
|
|
1297
|
+
: JSON.stringify(objectToken);
|
|
1298
|
+
}
|
|
1299
|
+
else {
|
|
1300
|
+
value = '"' + objectToken + '"';
|
|
1301
|
+
}
|
|
1302
|
+
replacedTokens = this.replaceToken(replacedTokens, tokenLiteral, value);
|
|
1303
|
+
}
|
|
1304
|
+
// } else {
|
|
1305
|
+
// console.error(lObjectTokens, tokensArray);
|
|
1306
|
+
// throw {
|
|
1307
|
+
// message: "No se encontró valor para un token",
|
|
1308
|
+
// title: "Alerta!",
|
|
1309
|
+
// error: "El token " + tokensArray[i].value + " no fue encontrado."
|
|
1310
|
+
// };
|
|
1311
|
+
//
|
|
1312
|
+
// Si es la ultima iteracion y la formula tiene [ es porque tiene un array en el valor que resolvio el token
|
|
1313
|
+
if (i == tokensArray.length - 1 && replacedTokens.includes('[')) {
|
|
1314
|
+
// Se ponen todos los operandos como elementos en un array ['expresion a', '&&', 'Expresion B']
|
|
1315
|
+
let formExpressions = replacedTokens.split(/ (\|\||&&) /);
|
|
1316
|
+
let lAuxformExpression = [];
|
|
1317
|
+
formExpressions.forEach((expression) => {
|
|
1318
|
+
if (expression.charAt(0) == '[') {
|
|
1319
|
+
let isTagFound = '';
|
|
1320
|
+
isTagFound = this.findTag(expression);
|
|
1321
|
+
lAuxformExpression.push(isTagFound);
|
|
1322
|
+
}
|
|
1323
|
+
else {
|
|
1324
|
+
lAuxformExpression.push(expression);
|
|
1325
|
+
}
|
|
1326
|
+
});
|
|
1327
|
+
replacedTokens = lAuxformExpression.join(' ');
|
|
1328
|
+
}
|
|
1329
|
+
}
|
|
1330
|
+
}
|
|
1331
|
+
return replacedTokens;
|
|
1332
|
+
}
|
|
1333
|
+
getQuoteContext(src, idx) {
|
|
1334
|
+
let inDouble = false, inSingle = false, esc = false;
|
|
1335
|
+
for (let k = 0; k < idx; k++) {
|
|
1336
|
+
const ch = src[k];
|
|
1337
|
+
if (esc) {
|
|
1338
|
+
esc = false;
|
|
1339
|
+
continue;
|
|
1340
|
+
}
|
|
1341
|
+
if (ch === '\\') {
|
|
1342
|
+
esc = true;
|
|
1343
|
+
continue;
|
|
1344
|
+
}
|
|
1345
|
+
if (ch === '"' && !inSingle)
|
|
1346
|
+
inDouble = !inDouble;
|
|
1347
|
+
else if (ch === "'" && !inDouble)
|
|
1348
|
+
inSingle = !inSingle;
|
|
1349
|
+
}
|
|
1350
|
+
return inDouble ? 'double' : inSingle ? 'single' : null;
|
|
1351
|
+
}
|
|
1352
|
+
/**
|
|
1353
|
+
* MEtodo que teniendo una expresion de la forma ['tag1', 'tag2']==tag3
|
|
1354
|
+
* evalua si tag3 hace parte del array si tiene el operador ==.
|
|
1355
|
+
* Si tiene el operador != examina que tag3 no haga parte del array+
|
|
1356
|
+
*
|
|
1357
|
+
* @param expression Operando que evalua tag. Es de la forma ['tag1', 'tag2']==tag3
|
|
1358
|
+
* @returns Retorna 'true' o 'false' en string que despues sera pasado a un eval()
|
|
1359
|
+
* mas adelante en el flujo
|
|
1360
|
+
*/
|
|
1361
|
+
findTag(expression) {
|
|
1362
|
+
let regexOperator = new RegExp('(===|==|!==|!=)');
|
|
1363
|
+
// Retorna el operador
|
|
1364
|
+
let operator = expression.match(regexOperator);
|
|
1365
|
+
// Si no encuentra un operador segun el patron retorna 'false'
|
|
1366
|
+
// para evitar resultados inesperados
|
|
1367
|
+
if (operator == null) {
|
|
1368
|
+
console.error('No se encontro un operador permitido para la expresion');
|
|
1369
|
+
return 'false';
|
|
1370
|
+
}
|
|
1371
|
+
// Separa la sentencia por el operador
|
|
1372
|
+
// La primera parte es el valor por el cual se remplaza el token que es un array en string "['a', 'b']"
|
|
1373
|
+
// El segundo es el valor con el cual se va a comparar
|
|
1374
|
+
let valueToken, valueToCompare;
|
|
1375
|
+
[valueToken, valueToCompare] = expression.split(operator[0]);
|
|
1376
|
+
// Se limpia el string correspondiente al array para que los elementos queden separados por ","
|
|
1377
|
+
valueToken = valueToken.replace(/[^a-zA-Z0-9 ,]/g, '');
|
|
1378
|
+
// Si no hay tags asociados al registro se devuelve 'false'
|
|
1379
|
+
if (!valueToken) {
|
|
1380
|
+
console.error('No hay tags asociados a esta aplicación');
|
|
1381
|
+
return 'false';
|
|
1382
|
+
}
|
|
1383
|
+
// Se limpia el string correspondiente al valor por comparar
|
|
1384
|
+
valueToCompare = valueToCompare.replace(/[^a-zA-Z0-9 ]/g, '');
|
|
1385
|
+
// El string correspondiente al array pasa a ser tipo array
|
|
1386
|
+
valueToken = valueToken.split(',');
|
|
1387
|
+
// Se trata de constatar si el valor a comparar se encuetra o no dentro
|
|
1388
|
+
// Si el operador que se encontro == returna true si lo encuentra
|
|
1389
|
+
let isTagFound = true;
|
|
1390
|
+
switch (operator[0]) {
|
|
1391
|
+
case '==':
|
|
1392
|
+
isTagFound = valueToken.some((tag) => tag == valueToCompare);
|
|
1393
|
+
break;
|
|
1394
|
+
case '===':
|
|
1395
|
+
isTagFound = valueToken.some((tag) => tag === valueToCompare);
|
|
1396
|
+
break;
|
|
1397
|
+
case '!==':
|
|
1398
|
+
isTagFound = valueToken.some((tag) => tag !== valueToCompare);
|
|
1399
|
+
break;
|
|
1400
|
+
case '!=':
|
|
1401
|
+
isTagFound = valueToken.some((tag) => tag != valueToCompare);
|
|
1402
|
+
break;
|
|
1403
|
+
default:
|
|
1404
|
+
break;
|
|
1405
|
+
}
|
|
1406
|
+
expression = isTagFound ? 'true' : 'false';
|
|
1407
|
+
return expression;
|
|
1408
|
+
}
|
|
1409
|
+
/**
|
|
1410
|
+
* Try to eval the formula depend of the type of fields.
|
|
1411
|
+
* @param lStaticToken
|
|
1412
|
+
* @param formulaName
|
|
1413
|
+
* @param formula
|
|
1414
|
+
*/
|
|
1415
|
+
validateFormula(lStaticToken, formulaName, formula) {
|
|
1416
|
+
let evalFormula = false;
|
|
1417
|
+
// To validate the formula, first organize the info to key - value array
|
|
1418
|
+
let objectTokens = [];
|
|
1419
|
+
for (let panel of lStaticToken) {
|
|
1420
|
+
for (let groupToken of panel.value) {
|
|
1421
|
+
for (let staticToken of groupToken.value) {
|
|
1422
|
+
for (let arrayTokenInfo of staticToken) {
|
|
1423
|
+
objectTokens[arrayTokenInfo.key] = arrayTokenInfo.object
|
|
1424
|
+
? arrayTokenInfo.object.type == 'number'
|
|
1425
|
+
? '0'
|
|
1426
|
+
: ''
|
|
1427
|
+
: '';
|
|
1428
|
+
}
|
|
1429
|
+
}
|
|
1430
|
+
}
|
|
1431
|
+
}
|
|
1432
|
+
try {
|
|
1433
|
+
formula = this.replaceTokensFromListObject(formulaName, formula, objectTokens);
|
|
1434
|
+
}
|
|
1435
|
+
catch (error) {
|
|
1436
|
+
//console.error(error);
|
|
1437
|
+
throw error;
|
|
1438
|
+
}
|
|
1439
|
+
if (formula !== null) {
|
|
1440
|
+
try {
|
|
1441
|
+
let result = formula.startsWith('file://') ? formula : eval(formula);
|
|
1442
|
+
evalFormula = true;
|
|
1443
|
+
}
|
|
1444
|
+
catch (e) {
|
|
1445
|
+
//console.error("Error evaluating the formula", e);
|
|
1446
|
+
throw {
|
|
1447
|
+
message: 'La formula no fue posible evaluar',
|
|
1448
|
+
title: 'Alerta!',
|
|
1449
|
+
error: e
|
|
1450
|
+
};
|
|
1451
|
+
}
|
|
1452
|
+
}
|
|
1453
|
+
return evalFormula;
|
|
1454
|
+
}
|
|
1455
|
+
getConfigCloningTokenMap(oldPPP, newPPP) {
|
|
1456
|
+
return this.httpClient.get(this.environment.host.backend.configuration + 'token/getConfigCloningTokenMap', {
|
|
1457
|
+
params: new HttpParams()
|
|
1458
|
+
.set('oldPPP', oldPPP.toString())
|
|
1459
|
+
.set('newPPP', newPPP.toString())
|
|
1460
|
+
});
|
|
1461
|
+
}
|
|
1462
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TokenService, deps: [{ token: 'environment' }, { token: i1.HttpClient }, { token: i2.FormService }, { token: i3.CurrencyPipe }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1463
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TokenService, providedIn: 'root' }); }
|
|
1464
|
+
}
|
|
1465
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TokenService, decorators: [{
|
|
1466
|
+
type: Injectable,
|
|
1467
|
+
args: [{
|
|
1468
|
+
providedIn: 'root'
|
|
1469
|
+
}]
|
|
1470
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
1471
|
+
type: Inject,
|
|
1472
|
+
args: ['environment']
|
|
1473
|
+
}] }, { type: i1.HttpClient }, { type: i2.FormService }, { type: i3.CurrencyPipe }], propDecorators: { locale: [{
|
|
1474
|
+
type: Inject,
|
|
1475
|
+
args: [LOCALE_ID]
|
|
1476
|
+
}] } });
|
|
1477
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXBsaS1jb21tb25zL3NyYy9saWIvc2VydmljZXMvdG9rZW4uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQWMsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDOUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUErQixVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFN0YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7OztBQU1sRCxNQUFNLE9BQU8sWUFBWTtJQUN4QixNQUFNO2FBQ0MsdUJBQWtCLEdBQVcscUJBQXFCLEFBQWhDLENBQWlDO0lBSzFELE1BQU07YUFDQyxxQkFBZ0IsR0FBVyxLQUFLLEFBQWhCLENBQWlCO0lBQ3hDLE1BQU07YUFDQyx1QkFBa0IsR0FBVyxhQUFhLEFBQXhCLENBQXlCO0lBQ2xELE1BQU07YUFDQywyQkFBc0IsR0FBVyxXQUFXLEFBQXRCLENBQXVCO0lBQ3BELE1BQU07YUFDQyx5QkFBb0IsR0FBVyxVQUFVLEFBQXJCLENBQXNCO0lBQ2pELE1BQU07YUFDQyx1QkFBa0IsR0FBVyxVQUFVLEFBQXJCLENBQXNCO0lBQy9DLE1BQU07YUFDQywwQkFBcUIsR0FBVyxXQUFXLEFBQXRCLENBQXVCO0lBQ25ELE1BQU07YUFDQyw4Q0FBeUMsR0FBVyxtQ0FBbUMsQUFBOUMsQ0FBK0M7SUFDL0YsTUFBTTthQUNDLGtDQUE2QixHQUFXLG1CQUFtQixBQUE5QixDQUErQjtJQUNuRSxNQUFNO2FBQ0MscUJBQWdCLEdBQVcsT0FBTyxBQUFsQixDQUFtQjtJQUMxQyxNQUFNO2FBQ0Msc0JBQWlCLEdBQVcsTUFBTSxBQUFqQixDQUFrQjtJ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V0UsTUFBTTsyQkFBQyxhQUFhO3VIQXJXSSxNQUFNO3NCQUEvQixNQUFNO3VCQUFDLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDdXJyZW5jeVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIExPQ0FMRV9JRCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEYXRlVXRpbCwgSEVBREVSX0pTT04sIFBsaUNuZkd1YXJhbnRlZVRva2VuLCBUb2tlbiwgVXRpbFN0cmluZyB9IGZyb20gJ25nLXBsaS11dGlsJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBGb3JtaW9VdGlsIH0gZnJvbSAnLi4vdXRpbHMvZm9ybWlvLXV0aWwnO1xyXG5pbXBvcnQgeyBGb3JtU2VydmljZSB9IGZyb20gJy4vZm9ybS5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuXHRwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFRva2VuU2VydmljZSB7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNJR05fTEVUVEVSX1RBR19JRDogc3RyaW5nID0gJ19zaWduLWxldHRlci10YWctaWQnO1xyXG5cclxuXHQvKiogKi9cclxuXHRASW5qZWN0KExPQ0FMRV9JRCkgcHVibGljIGxvY2FsZTogc3RyaW5nO1xyXG5cclxuXHQvKiogKi9cclxuXHRzdGF0aWMgVE9LRU5fTEFCRUxfRk9STTogc3RyaW5nID0gJ0ZybSc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFRPS0VOX0xBQkVMX0JVREdFVDogc3RyaW5nID0gJ1ByZXN1cHVlc3RvJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgVE9LRU5fTEFCRUxfQ0FMQ1VMQVRFRDogc3RyaW5nID0gJ0NhbGN1bGFkbyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFRPS0VOX0xBQkVMX1NOQVBTSE9UOiBzdHJpbmcgPSAnU25hcHNob3QnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBUT0tFTl9MQUJFTF9TVEFUSUM6IHN0cmluZyA9ICdFc3TDoXRpY28nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBUT0tFTl9MQUJFTF9ET0NVTUVOVE86IHN0cmluZyA9ICdEb2N1bWVudG8nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBUT0tFTl9MQUJFTF9ET0NVTUVOVE9fQU5BTElTSVNfQVVUT01BVElDTzogc3RyaW5nID0gJ0Fuw6FsaXNpcyBhdXRvbcOhdGljbyBkZSBkb2N1bWVudG9zJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgVE9LRU5fRE9DVU1FTlRPX0FOQUxZU0lTX1RZUEU6IHN0cmluZyA9ICdkb2N1bWVudF9hbmFseXNpcyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFRPS0VOX0xBQkVMX1RBU0s6IHN0cmluZyA9ICdUYXJlYSc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFRPS0VOX0xBQkVMX1RBU0tMOiBzdHJpbmcgPSAndGFzayc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFRPS0VOX0xBQkVMX0dVQVJBTlRFRTogc3RyaW5nID0gJ0dhcmFudGlhJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgQlVER0VUX1RPS0VOU19LRVlfVE9UQUxfQU1PVU5UOiBzdHJpbmcgPSAndG90YWxBbW91bnQnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBCVURHRVRfVE9LRU5TX0tFWV9BUFBMSUNBVElPTl9QUk9DRVNTX1RPVEFMX0FNT1VOVDogc3RyaW5nID0gJ2FwcGxpY2F0aW9uVG90YWwnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBCVURHRVRfVE9LRU5TX0tFWV9BUFBMSUNBVElPTl9QUk9DRVNTX1RPVEFMX09XTl9GT1VORFM6IHN0cmluZyA9ICdhcHBsaWNhdGlvbk93bkZvdW5kcyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIEJVREdFVF9UT0tFTlNfS0VZX0FQUExJQ0FUSU9OX1BST0NFU1NfVE9UQUxfRklOQU5DSU5HOiBzdHJpbmcgPSAnYXBwbGljYXRpb25GaW5hbmNpbmcnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBCVURHRVRfVE9LRU5TX0tFWV9MRUdBTElaQVRJT05fUFJPQ0VTU19UT1RBTF9BTU9VTlQ6IHN0cmluZyA9ICdsZWdhbGl6YXRpb25Ub3RhbCc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIEJVREdFVF9UT0tFTlNfS0VZX0xFR0FMSVpBVElPTl9QUk9DRVNTX1RPVEFMX09XTl9GT1VORFM6IHN0cmluZyA9XHJcblx0XHQnbGVnYWxpemF0aW9uT3duRm91bmRzJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgQlVER0VUX1RPS0VOU19LRVlfTEVHQUxJWkFUSU9OX1BST0NFU1NfVE9UQUxfRklOQU5DSU5HOiBzdHJpbmcgPSAnbGVnYWxpemF0aW9uRmluYW5jaW5nJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgQlVER0VUX1RPS0VOU19LRVlfSU5TVVJBTkNFX0FNT1VOVDogc3RyaW5nID0gJ2luc3VyYW5jZUFtb3VudCc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIExFR0FMSVpBVElPTl9PUl9BUFBMSUNBVElPTl9UT1RBTF9GSU5BTkNJTkc6IHN0cmluZyA9XHJcblx0XHQnbGVnbGl6YXRpb25PckFwcGxpY2F0aW9uVG90YWxGaW5hbmNpbmcnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBCVURHRVRfVE9LRU5TX0tFWV9SRVNVTUVfQ0FURUdPUllfWUVBUjogc3RyaW5nID0gJ3Jlc3VtZUNhdGVnb3J5WWVhcic7XHJcblx0LyoqICovXHJcblx0c3RhdGljIEJVREdFVF9UT0tFTlNfS0VZX0ZFQ0hBX0ZJTkFOQ0lOR19TVEFSVDogc3RyaW5nID0gJ2ZlY2hhSW5pY2lvRmluYW5jaWFjaW9uJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgQlVER0VUX1RPS0VOU19LRVlfRkVDSEFfRklOQU5DSU5HX0VORDogc3RyaW5nID0gJ2ZlY2hhRmluRmluYW5jaWFjaW9uJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgQlVER0VUX1RPS0VOU19EVVJBVElPTl9TVFVESUVTOiBzdHJpbmcgPSAnZHVyYWNpb25Fc3R1ZGlvcyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIEJVREdFVF9UT0tFTlNfRklOQU5DSU5HX0RVUkFUSU9OOiBzdHJpbmcgPSAnZHVyYWNpb25GaW5hbmNpYWNpb24nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0tFWV9DT0RJR09fVkVSSUZJQ0FDSU9OOiBzdHJpbmcgPSAnY29kaWdvVmVyaWZpY2FjaW9uJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfQV9RVUlFTl9WQV9ESVJJR0lETzogc3RyaW5nID0gJ2FRdWllblZhRGlyaWdpZG8nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0tFWV9GRUNIQV9BQ1RVQUw6IHN0cmluZyA9ICdmZWNoYUFjdHVhbCc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfS0VZX1NUQVRVU19OQU1FOiBzdHJpbmcgPSAnc3RhdHVzTmFtZSc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfS0VZX1BBVFJPQ0lOQURPUjogc3RyaW5nID0gJ3BsaVBhdHJvY2luYWRvcic7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfS0VZX1BBVFJPQ0lOQURPUl9DT1JUTzogc3RyaW5nID0gJ3BsaVBhdHJvY2luYWRvckNvcnRvJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfUFJPR1JBTUE6IHN0cmluZyA9ICdwbGlQcm9ncmFtYSc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfS0VZX1BST0dSQU1BX0NPUlRPOiBzdHJpbmcgPSAncGxpUHJvZ3JhbWFDb3J0byc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfS0VZX1BST01PQ0lPTjogc3RyaW5nID0gJ3BsaVByb21vY2lvbic7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfS0VZX1BST01PQ0lPTl9DT1JUTzogc3RyaW5nID0gJ3BsaVByb21vY2lvbkNvcnRvJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfQU5JT19QUk9NT0NJT046IHN0cmluZyA9ICdhbmlvUHJvbW9jaW9uJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfSVNPX01PTkVEQV9CQVNFOiBzdHJpbmcgPSAnaXNvTW9uZWRhQmFzZSc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfS0VZX1NBTFVET19DT01QTEVNRU5UQVJJTzogc3RyaW5nID0gJ3NhbHVkb0NvbXBsZW1lbnRhcmlvJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfTlVNQkVSX0FQUExJQ0FUSU9OOiBzdHJpbmcgPSAnbnVtZXJvUmFkaWNhZG8nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0tFWV9VU0VSX0lOSVRJQUxTOiBzdHJpbmcgPSAnaW5pY2lhbGVzVXN1YXJpbyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfS0VZX0xFVFRFUl9TSUdOOiBzdHJpbmcgPSAnZmlybWFDYXJ0YSc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX05BTUU6IHN0cmluZyA9ICdjb21pdGVOb21icmUnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0NPTU1JVFRFRV9TRUdNRU5UQVRJT046IHN0cmluZyA9ICdjb21pdGVTZWdtZW50YWNpb24nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0NPTU1JVFRFRV9BR0dSVVBBVElPTjogc3RyaW5nID0gJ2NvbWl0ZUFncnVwYWNpb24nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0NPTU1JVFRFRV9DVVRMSU5FX0RBVEU6IHN0cmluZyA9ICdjb21pdGVGZWNoYUxpbmVhJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19DT05GSVJNX0xFR0FMSVpBVElPTl9BUFBPSU5UTUVOVDogc3RyaW5nID0gJ2NvbmZpcm1hY2lvbkNpdGEnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0NPREVCVE9SX0RPQ1VNRU5UX05VTUJFUjogc3RyaW5nID0gJ251bWVyb0RvY3VtZW50b0NvZGV1ZG9yJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19DT0RFQlRPUl9ET0NVTUVOVF9UWVBFOiBzdHJpbmcgPSAndGlwb0RvY3VtZW50b0NvZGV1ZG9yJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19DT0RFQlRPUl9OQU1FOiBzdHJpbmcgPSAnbm9tYnJlc0NvZGV1ZG9yJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19DT0RFQlRPUl9MQVNUTkFNRTogc3RyaW5nID0gJ2FwZWxsaWRvc0NvZGV1ZG9yJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19UWVBFX0NPREVCVE9SOiBzdHJpbmcgPSAndGlwb1BlcnNvbmFDb2RldWRvcic7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfQ09ERUJUT1JfUkVWSUVXRVI6IHN0cmluZyA9ICdyZXZpc29yQ29kZXVkb3Jlcyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfVE9UQUxfV0VJR0hURUQ6IHN0cmluZyA9ICdwb25kZXJhZG9Ub3RhbCc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfQ09OU0VDVVRJVkVfR1VBUkFOVEVFOiBzdHJpbmcgPSAnY29uc2VjdXRpdm9HYXJhbnRpYXMnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0RBWTogc3RyaW5nID0gJ2RpYSc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfTU9OVEg6IHN0cmluZyA9ICdtZXMnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX1lFQVI6IHN0cmluZyA9ICdhbm8nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX1JFUFJFU0VOVEFUSVZFX05BTUU6IHN0cmluZyA9ICdub21icmVzUmVwcmVzZW50YW50ZSc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfUkVQUkVTRU5UQVRJVkVfTEFTVE5BTUU6IHN0cmluZyA9ICdhcGVsbGlkb3NSZXByZXNlbnRhbnRlJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19SRVBSRVNFTlRBVElWRV9ET0NVTUVOVF9OVU1CRVI6IHN0cmluZyA9ICdjZWR1bGFSZXByZXNlbnRhbnRlJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19DSVRZX1NJR05BVFVSRTogc3RyaW5nID0gJ2NpdWRhZEZpcm1hJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19VU0VSX1RZUEVfQ1JFRElUX1NUVURZOiBzdHJpbmcgPSAndGlwb1VzdWFyaW9Fc3R1ZGlvQ3JlZGl0byc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfQ09ERUJUT1JfVkVISUNMRVNfUVVBTlRJVFk6IHN0cmluZyA9ICdjYW50aWRhZFZlaGljdWxvc0NvZGV1ZG9yJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19DT0RFQlRPUl9BU1NFVFNfUVVBTlRJVFk6IHN0cmluZyA9ICdjYW50aWRhZEJpZW5lc0NvZGV1ZG9yJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19MSVNUX0NPREVCVE9SUzogc3RyaW5nID0gJ2xpc3RhQ29kZXVkb3Jlcyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTl9JTkdSRVNPX0NPREVVRE9SX0hBQkVBU19EQVRBOiBzdHJpbmcgPSAnaW5ncmVzb0NvZGV1ZG9ySGFiZWFzRGF0YSc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTl9QREZfUkVTVU1FTl9DT0RFVURPUjogc3RyaW5nID0gJ3BkZlJlc3VtZW5Db2RldWRvcic7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfUVVBTlRJVFlfVkVISUNMRV9CRU5FRklDSUFSWTogc3RyaW5nID0gJ2NhbnRpZGFkVmVoaWN1bG9zU2VsZWNjaW9uYWRvJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19RVUFOVElUWV9BU1NFVFNfQkVORUZJQ0lBUlk6IHN0cmluZyA9ICdjYW50aWRhZEJpZW5lc1NlbGVjY2lvbmFkbyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfQkVOX0NPRElHTzogc3RyaW5nID0gJ2JlbkNvZGlnbyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTl9DUkVESVRfUkVWSUVXRVJfT0JTRVJWQVRJT05TX0NPREVCVE9SOiBzdHJpbmcgPVxyXG5cdFx0J2NyZWRpdFJldmlld2VyT2JzZXJ2YXRpb25zQ29kZWJ0b3InO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5fQ1JFRElUX1JFVklFV0VSX09CU0VSVkFUSU9OUzogc3RyaW5nID0gJ2NyZWRpdFJldmlld2VyT2JzZXJ2YXRpb25zJztcclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOX1RBR19OQU1FOiBzdHJpbmcgPSAndGFnTmFtZSc7XHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTl9OQU1FX1JFVklFV0VSX1RBU0sgPSAnbmFtZVJldml3ZXJUYXNrJztcclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOX0xBU1RfTkFNRV9SRVZJRVdFUl9UQVNLID0gJ2xhc3ROYW1lUmV2aXdlclRhc2snO1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5fVEFTS19UT1RBTF9BU1NJR05FRF9UT19SRVZJRVdFUiA9ICd0YXNrVG90YWxBc3NpZ25lZFRvUmV2aWV3ZXInO1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5fU1VSTkFNRSA9ICdzdXJuYW1lJztcclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOUzogYW55W10gPSBbXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX1BBVFJPQ0lOQURPUixcclxuXHRcdFx0bGFiZWw6ICdQYXRyb2NpbmFkb3InXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9QUk9HUkFNQSxcclxuXHRcdFx0bGFiZWw6ICdQcm9ncmFtYSdcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX1BST01PQ0lPTixcclxuXHRcdFx0bGFiZWw6ICdQcm9tb2Npw7NuJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19LRVlfQU5JT19QUk9NT0NJT04sXHJcblx0XHRcdGxhYmVsOiAnQcOxbyBwcm9tb2Npw7NuJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19LRVlfSVNPX01PTkVEQV9CQVNFLFxyXG5cdFx0XHRsYWJlbDogJ0lTTyBNb25lZGEgYmFzZSdcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX1NBTFVET19DT01QTEVNRU5UQVJJTyxcclxuXHRcdFx0bGFiZWw6ICdTYWx1ZG8gY29tcGxlbWVudGFyaW8nXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9DT0RJR09fVkVSSUZJQ0FDSU9OLFxyXG5cdFx0XHRsYWJlbDogJ0PDs2RpZ28gZGUgdmVyaWZpY2FjacOzbidcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX0FfUVVJRU5fVkFfRElSSUdJRE8sXHJcblx0XHRcdGxhYmVsOiAnQSBxdWllbiB2YSBkaXJpZ2lkbydcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX0ZFQ0hBX0FDVFVBTCxcclxuXHRcdFx0bGFiZWw6ICdGZWNoYSBhY3R1YWwnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9TVEFUVVNfTkFNRSxcclxuXHRcdFx0bGFiZWw6ICdFc3RhZG8gYWN0dWFsJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19LRVlfTlVNQkVSX0FQUExJQ0FUSU9OLFxyXG5cdFx0XHRsYWJlbDogJ07Dum1lcm8gcmFkaWNhZG8nXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9VU0VSX0lOSVRJQUxTLFxyXG5cdFx0XHRsYWJlbDogJ0luaWNpYWxlcyBkZSB1c3VhcmlvJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19LRVlfTEVUVEVSX1NJR04sXHJcblx0XHRcdGxhYmVsOiAnRmlybWEgZGUgY2FydGFzJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DT01NSVRURUVfTkFNRSxcclxuXHRcdFx0bGFiZWw6ICdOb21icmUgY29taXTDqSdcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX1NFR01FTlRBVElPTixcclxuXHRcdFx0bGFiZWw6ICdTZWdtZW50YWNpw7NuIGNvbWl0w6knXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPTU1JVFRFRV9BR0dSVVBBVElPTixcclxuXHRcdFx0bGFiZWw6ICdBZ3J1cGFjacOzbiBjb21pdMOpJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DT01NSVRURUVfQ1VUTElORV9EQVRFLFxyXG5cdFx0XHRsYWJlbDogJ0ZlY2hhIEzDrW5lYSBkZSBjb3J0ZSdcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09ORklSTV9MRUdBTElaQVRJT05fQVBQT0lOVE1FTlQsXHJcblx0XHRcdGxhYmVsOiAnQ29uZmlybWFjacOzbiBkZSBjaXRhJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DT0RFQlRPUl9ET0NVTUVOVF9OVU1CRVIsXHJcblx0XHRcdGxhYmVsOiAnTsO6bWVybyBkZSBkb2N1bWVudG8gZGUgY29kZXVkb3InXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPREVCVE9SX0RPQ1VNRU5UX1RZUEUsXHJcblx0XHRcdGxhYmVsOiAnVGlwbyBkZSBkb2N1bWVudG8gZGUgY29kZXVkb3InXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPREVCVE9SX05BTUUsXHJcblx0XHRcdGxhYmVsOiAnTm9tYnJlcyBjb2RldWRvcidcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09ERUJUT1JfTEFTVE5BTUUsXHJcblx0XHRcdGxhYmVsOiAnQXBlbGxpZG9zIGNvZGV1ZG9yJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19UWVBFX0NPREVCVE9SLFxyXG5cdFx0XHRsYWJlbDogJ1RpcG8gZGUgcGVyc29uYSBjb2RldWRvcidcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09ERUJUT1JfVkVISUNMRVNfUVVBTlRJVFksXHJcblx0XHRcdGxhYmVsOiAnQ2FudGlkYWQgdmVoaWN1bG9zIGNvZGV1ZG9yJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DT0RFQlRPUl9BU1NFVFNfUVVBTlRJVFksXHJcblx0XHRcdGxhYmVsOiAnQ2FudGlkYWQgYmllbmVzIGNvZGV1ZG9yJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DT0RFQlRPUl9SRVZJRVdFUixcclxuXHRcdFx0bGFiZWw6ICdSZXZpc29yIGRlIGNvZGV1ZG9yZXMnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX1RPVEFMX1dFSUdIVEVELFxyXG5cdFx0XHRsYWJlbDogJ1BvbmRlcmFkbyB0b3RhbCdcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09OU0VDVVRJVkVfR1VBUkFOVEVFLFxyXG5cdFx0XHRsYWJlbDogJ0NvbnNlY3V0aXZvIGRlIGdhcmFudGlhcydcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfUkVQUkVTRU5UQVRJVkVfTkFNRSxcclxuXHRcdFx0bGFiZWw6ICdOb21icmVzIHJlcHJlc2VudGFudGUgbGVnYWwnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX1JFUFJFU0VOVEFUSVZFX0xBU1ROQU1FLFxyXG5cdFx0XHRsYWJlbDogJ0FwZWxsaWRvcyByZXByZXNlbnRhbnRlIGxlZ2FsJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19SRVBSRVNFTlRBVElWRV9ET0NVTUVOVF9OVU1CRVIsXHJcblx0XHRcdGxhYmVsOiAnQ2VkdWxhIHJlcHJlc2VudGFudGUgbGVnYWwnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX1VTRVJfVFlQRV9DUkVESVRfU1RVRFksXHJcblx0XHRcdGxhYmVsOiAnVGlwbyB1c3VhcmlvIGVzdHVkaW8gY3LDqWRpdG8nXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0RBWSxcclxuXHRcdFx0bGFiZWw6ICdEaWEnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX01PTlRILFxyXG5cdFx0XHRsYWJlbDogJ01lcydcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfWUVBUixcclxuXHRcdFx0bGFiZWw6ICdBw7FvJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DSVRZX1NJR05BVFVSRSxcclxuXHRcdFx0bGFiZWw6ICdDaXVkYWQgZGUgbGEgZmlybWEnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0xJU1RfQ09ERUJUT1JTLFxyXG5cdFx0XHRsYWJlbDogJ0xpc3RhIGRlIGNvZGV1ZG9yZXMnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5fSU5HUkVTT19DT0RFVURPUl9IQUJFQVNfREFUQSxcclxuXHRcdFx0bGFiZWw6ICdJbmdyZXNvIENvZGV1ZG9yIEhhYmVhcyBEYXRhJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOX1BERl9SRVNVTUVOX0NPREVVRE9SLFxyXG5cdFx0XHRsYWJlbDogJ1BkZiBjb2RldWRvcidcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfUVVBTlRJVFlfVkVISUNMRV9CRU5FRklDSUFSWSxcclxuXHRcdFx0bGFiZWw6ICdDYW50aWRhZCBkZSB2ZWjDrWN1bG9zIGRlbCBzZWxlY2Npb25hZG8nXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX1FVQU5USVRZX0FTU0VUU19CRU5FRklDSUFSWSxcclxuXHRcdFx0bGFiZWw6ICdDYW50aWRhZCBiaWVuZXMgZGVsIHNlbGVjY2lvbmFkbydcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQkVOX0NPRElHTyxcclxuXHRcdFx0bGFiZWw6ICdDw7NkaWdvIGJlbmVmaWNpYXJpbydcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTl9DUkVESVRfUkVWSUVXRVJfT0JTRVJWQVRJT05TLFxyXG5cdFx0XHRsYWJlbDogJ09ic2VydmFjaW9uZXMgcmV2aXNvciBmaW5hbmNpZXJvIHNlbGVjY2lvbmFkbydcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTl9DUkVESVRfUkVWSUVXRVJfT0JTRVJWQVRJT05TX0NPREVCVE9SLFxyXG5cdFx0XHRsYWJlbDogJ09ic2VydmFjaW9uZXMgcmV2aXNvciBmaW5hbmNpZXJvIGNvZGV1ZG9yZXMnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5fVEFHX05BTUUsXHJcblx0XHRcdGxhYmVsOiAnTm9tYnJlIGRlbCB0YWcnXHJcblx0XHR9LFxyXG5cdFx0eyBrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5fTkFNRV9SRVZJRVdFUl9UQVNLLCBsYWJlbDogJ05vbWJyZSByZXZpc29yIHRhcmVhcycgfSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOX0xBU1RfTkFNRV9SRVZJRVdFUl9UQVNLLFxyXG5cdFx0XHRsYWJlbDogJ0FwZWxsaWRvIHJldmlzb3IgdGFyZWFzJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOX1RBU0tfVE9UQUxfQVNTSUdORURfVE9fUkVWSUVXRVIsXHJcblx0XHRcdGxhYmVsOiAnVG90YWwgdGFyZWFzIGFzaWduYWRhcyBhIHJldmlzb3InXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5fU1VSTkFNRSxcclxuXHRcdFx0bGFiZWw6ICdBcGVsbGlkb3MgY2FuZGlkYXRvJ1xyXG5cdFx0fVxyXG5cdF07XHJcblxyXG5cdHN0YXRpYyBleGNsdWRlZFRva2VuID0gW1xyXG5cdFx0VG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfVVNFUl9UWVBFX0NSRURJVF9TVFVEWS50b0xvd2VyQ2FzZSgpLFxyXG5cdFx0VG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09ERUJUT1JfVkVISUNMRVNfUVVBTlRJVFkudG9Mb3dlckNhc2UoKSxcclxuXHRcdFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPREVCVE9SX0FTU0VUU19RVUFOVElUWS50b0xvd2VyQ2FzZSgpXHJcblx0XTtcclxuXHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRASW5qZWN0KCdlbnZpcm9ubWVudCcpIHByaXZhdGUgZW52aXJvbm1lbnQsXHJcblx0XHRwcml2YXRlIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsXHJcblx0XHRwcml2YXRlIGZvcm1TZXJ2aWNlOiBGb3JtU2VydmljZSxcclxuXHRcdHByaXZhdGUgY3VycmVuY3lQaXBlOiBDdXJyZW5jeVBpcGVcclxuXHQpIHt9XHJcblxyXG5cdC8qKiBUaGlzIHByb21pc2UgYWxsb3dzIHRvIGV4ZWN1dGUgYSBmdW5jdGlvbiB3aGVuIGNvbnN1bHRpbmcgdGhlIGZvcm0gZmllbGRzLiAqL1xyXG5cdGdldEZvcm1GaWVsZHNCeVByb21Db2RlKHByb21Db2RpZ28pOiBQcm9taXNlPGFueVtdPiB7XHJcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cdFx0XHQvLyBTZWFyY2ggdGhlIGR5bmFtaWMgZm9ybVxyXG5cdFx0XHRsZXQgbEZvcm1GaWVsZHNUb2tlbjogYW55W10gPSBudWxsO1xyXG5cdFx0XHR0aGlzLmZvcm1TZXJ2aWNlLmdldEJ5UHJvbUNvZGlnbyhwcm9tQ29kaWdvKS5zdWJzY3JpYmUoe1xyXG5cdFx0XHRcdG5leHQ6IChhcnJheUZvcm1zOiBhbnkpID0+IHtcclxuXHRcdFx0XHRcdGlmIChhcnJheUZvcm1zLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBmb3JtcyBvZiBhcnJheUZvcm1zKSB7XHJcblx0XHRcdFx0XHRcdFx0bGV0IGNvbXBvbmVudHMgPSBbXTtcclxuXHJcblx0XHRcdFx0XHRcdFx0Y29tcG9uZW50cy5wdXNoKC4uLkZvcm1pb1V0aWwuZ2V0Q29tcG9uZW50cyhmb3Jtcy5jb21wb25lbnRzKSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmIChmb3Jtcy5jb21wb25lbnRzICYmIGZvcm1zLmNvbXBvbmVudHMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBjb21wb25lbnRzIG9mIGZvcm1zLmNvbXBvbmVudHMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNvbXBvbmVudHMuY29tcG9uZW50cyAmJiBjb21wb25lbnRzLmNvbXBvbmVudHMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgY29tcG9uZW50IG9mIGNvbXBvbmVudHMuY29tcG9uZW50cykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNvbXBvbmVudC5jb2x1bW5zICYmIGNvbXBvbmVudC5jb2x1bW5zLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBjQ29tcG9uZW50cyBvZiBjb21wb25lbnQuY29sdW1ucykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNDb21wb25lbnRzLmNvbXBvbmVudHMgJiZcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNDb21wb25lbnRzLmNvbXBvbmVudHMubGVuZ3RoID4gMFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVyYXRvciBvZiBjQ29tcG9uZW50cy5jb21wb25lbnRzKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChpdGVyYXRvci50eXBlID09PSAnYWRkcmVzcycpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZWxldGUgaXRlcmF0b3IuY29tcG9uZW50cztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGxldCBmb3JtOiBhbnkgPSBhcnJheUZvcm1zO1xyXG5cdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHQhZm9ybSB8fFxyXG5cdFx0XHRcdFx0XHQhZm9ybVswXSB8fFxyXG5cdFx0XHRcdFx0XHQhZm9ybVswXS5wcm9tQ29kaWdvIHx8XHJcblx0XHRcdFx0XHRcdGZvcm1bMF0ucHJvbUNvZGlnbyAhPSBwcm9tQ29kaWdvXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0Ly8gdGhpcy5yb3V0ZXIubmF2aWdhdGUoWyc0MDQnXSk7XHJcblx0XHRcdFx0XHRcdHJlc29sdmUobEZvcm1GaWVsZHNUb2tlbik7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRsRm9ybUZpZWxkc1Rva2VuID0gW107XHJcblx0XHRcdFx0XHRmb3IgKGxldCBmb3JtQ29tcCBvZiBmb3JtKSB7XHJcblx0XHRcdFx0XHRcdGxldCBuZXdDb21wb25lbnRzOiBhbnk7XHJcblx0XHRcdFx0XHRcdGxldCBjb21wb25lbnRzOiBhbnlbXSA9IFtdO1xyXG5cdFx0XHRcdFx0XHRpZiAoZm9ybUNvbXAuY29tcG9uZW50cykge1xyXG5cdFx0XHRcdFx0XHRcdG5ld0NvbXBvbmVudHMgPSBmb3JtQ29tcC5jb21wb25lbnRzO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGZvcm1Db21wLmNvbHVtbnMpIHtcclxuXHRcdFx0XHRcdFx0XHRuZXdDb21wb25lbnRzID0gZm9ybUNvbXAuY29sdW1ucztcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAobmV3Q29tcG9uZW50cyAmJiBVdGlsU3RyaW5nLmlzVmFsaWQoZm9ybUNvbXAudGl0bGUpKSB7XHJcblx0XHRcdFx0XHRcdFx0bEZvcm1GaWVsZHNUb2tlbi5wdXNoKHtcclxuXHRcdFx0XHRcdFx0XHRcdHRpdGxlOiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLmdldEtleUZvcm11bGFyaW8oZm9ybUNvbXAudGl0bGUpLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogZm9ybUNvbXAudGl0bGUsXHJcblx0XHRcdFx0XHRcdFx0XHRcdG9iamVjdDogZm9ybUNvbXBcclxuXHRcdFx0XHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogW11cclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRsRm9ybUZpZWxkc1Rva2VuW2xGb3JtRmllbGRzVG9rZW4ubGVuZ3RoIC0gMV0udmFsdWUgPVxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5nZXRDb21wb25lbmV0Rm9ybShcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50cyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0bmV3Q29tcG9uZW50cyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0bnVsbCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0XHRcdG51bGxcclxuXHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJlc29sdmUobEZvcm1GaWVsZHNUb2tlbik7XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRlcnJvcjogKGVycm9yKSA9PiB7XHJcblx0XHRcdFx0XHRyZWplY3QoZXJyb3IpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGdldEZvcm1GaWVsZHNCeVByb21Db2RlV2l0aEVkaXRHcmlkcyhwcm9tQ29kaWdvKTogUHJvbWlzZTxhbnlbXT4ge1xyXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHRcdFx0Ly8gU2VhcmNoIHRoZSBkeW5hbWljIGZvcm1cclxuXHRcdFx0bGV0IGxGb3JtRmllbGRzVG9rZW46IGFueVtdID0gbnVsbDtcclxuXHRcdFx0dGhpcy5mb3JtU2VydmljZS5nZXRCeVByb21Db2RpZ28ocHJvbUNvZGlnbykuc3Vic2NyaWJlKHtcclxuXHRcdFx0XHRuZXh0OiAoYXJyYXlGb3JtczogYW55KSA9PiB7XHJcblx0XHRcdFx0XHRpZiAoYXJyYXlGb3Jtcy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0XHRcdGZvciAoY29uc3QgZm9ybXMgb2YgYXJyYXlGb3Jtcykge1xyXG5cdFx0XHRcdFx0XHRcdGxldCBjb21wb25lbnRzID0gW107XHJcblxyXG5cdFx0XHRcdFx0XHRcdGNvbXBvbmVudHMucHVzaChcclxuXHRcdFx0XHRcdFx0XHRcdC4uLkZvcm1pb1V0aWwuZ2V0Q29tcG9uZW50c1dpdGhFZGl0R3JpZHMoZm9ybXMuY29tcG9uZW50cylcclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoZm9ybXMuY29tcG9uZW50cyAmJiBmb3Jtcy5jb21wb25lbnRzLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgY29tcG9uZW50cyBvZiBmb3Jtcy5jb21wb25lbnRzKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChjb21wb25lbnRzLmNvbXBvbmVudHMgJiYgY29tcG9uZW50cy5jb21wb25lbnRzLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBjb21wb25lbnRzLmNvbXBvbmVudHMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChjb21wb25lbnQuY29sdW1ucyAmJiBjb21wb25lbnQuY29sdW1ucy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgY0NvbXBvbmVudHMgb2YgY29tcG9uZW50LmNvbHVtbnMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjQ29tcG9uZW50cy5jb21wb25lbnRzICYmXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjQ29tcG9uZW50cy5jb21wb25lbnRzLmxlbmd0aCA+IDBcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgaXRlcmF0b3Igb2YgY0NvbXBvbmVudHMuY29tcG9uZW50cykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoaXRlcmF0b3IudHlwZSA9PT0gJ2FkZHJlc3MnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVsZXRlIGl0ZXJhdG9yLmNvbXBvbmVudHM7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRsZXQgZm9ybTogYW55ID0gYXJyYXlGb3JtcztcclxuXHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0IWZvcm0gfHxcclxuXHRcdFx0XHRcdFx0IWZvcm1bMF0gfHxcclxuXHRcdFx0XHRcdFx0IWZvcm1bMF0ucHJvbUNvZGlnbyB8fFxyXG5cdFx0XHRcdFx0XHRmb3JtWzBdLnByb21Db2RpZ28gIT0gcHJvbUNvZGlnb1xyXG5cdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdC8vIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnNDA0J10pO1xyXG5cdFx0XHRcdFx0XHRyZXNvbHZlKGxGb3JtRmllbGRzVG9rZW4pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0bEZvcm1GaWVsZHNUb2tlbiA9IFtdO1xyXG5cdFx0XHRcdFx0Zm9yIChsZXQgZm9ybUNvbXAgb2YgZm9ybSkge1xyXG5cdFx0XHRcdFx0XHRsZXQgbmV3Q29tcG9uZW50czogYW55O1xyXG5cdFx0XHRcdFx0XHRsZXQgY29tcG9uZW50czogYW55W10gPSBbXTtcclxuXHRcdFx0XHRcdFx0aWYgKGZvcm1Db21wLmNvbXBvbmVudHMpIHtcclxuXHRcdFx0XHRcdFx0XHRuZXdDb21wb25lbnRzID0gZm9ybUNvbXAuY29tcG9uZW50cztcclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChmb3JtQ29tcC5jb2x1bW5zKSB7XHJcblx0XHRcdFx0XHRcdFx0bmV3Q29tcG9uZW50cyA9IGZvcm1Db21wLmNvbHVtbnM7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYgKG5ld0NvbXBvbmVudHMgJiYgVXRpbFN0cmluZy5pc1ZhbGlkKGZvcm1Db21wLnRpdGxlKSkge1xyXG5cdFx0XHRcdFx0XHRcdGxGb3JtRmllbGRzVG9rZW4ucHVzaCh7XHJcblx0XHRcdFx0XHRcdFx0XHR0aXRsZToge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRrZXk6IFRva2VuU2VydmljZS5nZXRLZXlGb3JtdWxhcmlvKGZvcm1Db21wLnRpdGxlKSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6IGZvcm1Db21wLnRpdGxlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRvYmplY3Q6IGZvcm1Db21wXHJcblx0XHRcdFx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU6IFtdXHJcblx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0bEZvcm1GaWVsZHNUb2tlbltsRm9ybUZpZWxkc1Rva2VuLmxlbmd0aCAtIDFdLnZhbHVlID1cclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuZ2V0Q29tcG9uZW5ldEZvcm0oXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudHMsXHJcblx0XHRcdFx0XHRcdFx0XHRcdG5ld0NvbXBvbmVudHMsXHJcblx0XHRcdFx0XHRcdFx0XHRcdG51bGwsXHJcblx0XHRcdFx0XHRcdFx0XHRcdGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRudWxsXHJcblx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXNvbHZlKGxGb3JtRmllbGRzVG9rZW4pO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0ZXJyb3I6IChlcnJvcikgPT4ge1xyXG5cdFx0XHRcdFx0cmVqZWN0KGVycm9yKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRnZXRGb3JtRmllbGRzQnlGb3JtSWQoZm9ybUlkOiBzdHJpbmcpOiBQcm9taXNlPGFueVtdPiB7XHJcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cdFx0XHQvLyBTZWFyY2ggdGhlIGR5bmFtaWMgZm9ybVxyXG5cdFx0XHRsZXQgbEZvcm1GaWVsZHNUb2tlbjogYW55W10gPSBudWxsO1xyXG5cdFx0XHR0aGlzLmZvcm1TZXJ2aWNlLmdldEJ5SWQoZm9ybUlkKS5zdWJzY3JpYmUoXHJcblx0XHRcdFx0KHJlc3VsdDogYW55KSA9PiB7XHJcblx0XHRcdFx0XHRsZXQgZm9ybTogYW55ID0gcmVzdWx0O1xyXG5cdFx0XHRcdFx0aWYgKCFmb3JtIHx8ICFmb3JtWzBdKSB7XHJcblx0XHRcdFx0XHRcdHJlc29sdmUobEZvcm1GaWVsZHNUb2tlbik7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRsRm9ybUZpZWxkc1Rva2VuID0gW107XHJcblx0XHRcdFx0XHRmb3IgKGxldCBmb3JtQ29tcCBvZiBmb3JtKSB7XHJcblx0XHRcdFx0XHRcdGxldCBuZXdDb21wb25lbnRzOiBhbnk7XHJcblx0XHRcdFx0XHRcdGxldCBjb21wb25lbnRzOiBhbnlbXSA9IFtdO1xyXG5cdFx0XHRcdFx0XHRpZiAoZm9ybUNvbXAuY29tcG9uZW50cykge1xyXG5cdFx0XHRcdFx0XHRcdG5ld0NvbXBvbmVudHMgPSBmb3JtQ29tcC5jb21wb25lbnRzO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGZvcm1Db21wLmNvbHVtbnMpIHtcclxuXHRcdFx0XHRcdFx0XHRuZXdDb21wb25lbnRzID0gZm9ybUNvbXAuY29sdW1ucztcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAobmV3Q29tcG9uZW50cyAmJiBVdGlsU3RyaW5nLmlzVmFsaWQoZm9ybUNvbXAudGl0bGUpKSB7XHJcblx0XHRcdFx0XHRcdFx0bEZvcm1GaWVsZHNUb2tlbi5wdXNoKHtcclxuXHRcdFx0XHRcdFx0XHRcdHRpdGxlOiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLmdldEtleUZvcm11bGFyaW8oZm9ybUNvbXAudGl0bGUpLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogZm9ybUNvbXAudGl0bGUsXHJcblx0XHRcdFx0XHRcdFx0XHRcdG9iamVjdDogZm9ybUNvbXBcclxuXHRcdFx0XHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogW11cclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRsRm9ybUZpZWxkc1Rva2VuW2xGb3JtRmllbGRzVG9rZW4ubGVuZ3RoIC0gMV0udmFsdWUgPVxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5nZXRDb21wb25lbmV0Rm9ybShcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50cyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0bmV3Q29tcG9uZW50cyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0bnVsbCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0XHRcdG51bGxcclxuXHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJlc29sdmUobEZvcm1GaWVsZHNUb2tlbik7XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHQoZXJyb3IpID0+IHtcclxuXHRcdFx0XHRcdHJlamVjdChlcnJvcik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHQpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHQvKiogVGhpcyBwcm9taXNlIGFsbG93cyB0byBleGVjdXRlIGEgZnVuY3Rpb24gd2hlbiBjb25zdWx0aW5nIHRoZSBmb3JtIGZpZWxkcy4gKi9cclxuXHRnZXRGb3JtUGFuZWxzQnlQcm9tQ29kZShwcm9tQ29kaWdvKTogUHJvbWlzZTxhbnlbXT4ge1xyXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHRcdFx0Ly8gU2VhcmNoIHRoZSBkeW5hbWljIGZvcm1cclxuXHRcdFx0bGV0IGxGb3JtUGFubmVsc1Rva2VuOiBhbnlbXSA9IG51bGw7XHJcblx0XHRcdHRoaXMuZm9ybVNlcnZpY2UuZ2V0QnlQcm9tQ29kaWdvKHByb21Db2RpZ28pLnN1YnNjcmliZShcclxuXHRcdFx0XHQocmVzdWx0OiBhbnkpID0+IHtcclxuXHRcdFx0XHRcdGxldCBmb3JtOiBhbnkgPSByZXN1bHQ7XHJcblx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdCFmb3JtIHx8XHJcblx0XHRcdFx0XHRcdCFmb3JtWzBdIHx8XHJcblx0XHRcdFx0XHRcdCFmb3JtWzBdLnByb21Db2RpZ28gfHxcclxuXHRcdFx0XHRcdFx0Zm9ybVswXS5wcm9tQ29kaWdvICE9IHByb21Db2RpZ29cclxuXHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHQvLyB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJzQwNCddKTtcclxuXHRcdFx0XHRcdFx0cmVzb2x2ZShsRm9ybVBhbm5lbHNUb2tlbik7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRsRm9ybVBhbm5lbHNUb2tlbiA9IFtdO1xyXG5cdFx0XHRcdFx0Zm9yIChsZXQgZm9ybUNvbXAgb2YgZm9ybSkge1xyXG5cdFx0XHRcdFx0XHRsZXQgbmV3Q29tcG9uZW50czogYW55O1xyXG5cdFx0XHRcdFx0XHRsZXQgY29tcG9uZW50czogYW55W10gPSBbXTtcclxuXHRcdFx0XHRcdFx0aWYgKGZvcm1Db21wLmNvbXBvbmVudHMpIHtcclxuXHRcdFx0XHRcdFx0XHRuZXdDb21wb25lbnRzID0gZm9ybUNvbXAuY29tcG9uZW50cztcclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChmb3JtQ29tcC5jb2x1bW5zKSB7XHJcblx0XHRcdFx0XHRcdFx0bmV3Q29tcG9uZW50cyA9IGZvcm1Db21wLmNvbHVtbnM7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYgKG5ld0NvbXBvbmVudHMgJiYgVXRpbFN0cmluZy5pc1ZhbGlkKGZvcm1Db21wLnRpdGxlKSkge1xyXG5cdFx0XHRcdFx0XHRcdGxGb3JtUGFubmVsc1Rva2VuLnB1c2goe1xyXG5cdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuZ2V0S2V5Rm9ybXVsYXJpbyhmb3JtQ29tcC50aXRsZSksXHJcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBmb3JtQ29tcC50aXRsZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0b2JqZWN0OiBmb3JtQ29tcFxyXG5cdFx0XHRcdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBbXVxyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdGxGb3JtUGFubmVsc1Rva2VuW2xGb3JtUGFubmVsc1Rva2VuLmxlbmd0aCAtIDFdLnZhbHVlID1cclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuZ2V0UGFuZWxDb21wb25lbmV0KGNvbXBvbmVudHMsIG5ld0NvbXBvbmVudHMsIG51bGwpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXNvbHZlKGxGb3JtUGFubmVsc1Rva2VuKTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdChlcnJvcikgPT4ge1xyXG5cdFx0XHRcdFx0cmVqZWN0KGVycm9yKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgcmVjdXJzaXZlIG1ldGhvZCB0byBnZXQgYWxsIHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgZWRpdEdyaWQgZHluYW1pYyBmb3JtXHJcblx0ICogQHBhcmFtIGNvbXBvbmVudHNcclxuXHQgKiBAcGFyYW0gZm9ybVxyXG5cdCAqL1xyXG5cdGdldFBhbmVsQ29tcG9uZW5ldChjb21wb25lbnRzOiBhbnlbXSwgZm9ybTogYW55LCBwYW5lbE5hbWU6IHN0cmluZyk6IGFueVtdIHtcclxuXHRcdGZvciAobGV0IGZvcm1Db21wIG9mIGZvcm0pIHtcclxuXHRcdFx0aWYgKGZvcm1Db21wLnR5cGUgPT09ICdwYW5lbCcpIHtcclxuXHRcdFx0XHRjb21wb25lbnRzLnB1c2goZm9ybUNvbXApO1xyXG5cdFx0XHR9IGVsc2UgaWYgKGZvcm1Db21wLmNvbXBvbmVudHMgfHwgZm9ybUNvbXAuY29sdW1ucykge1xyXG5cdFx0XHRcdGxldCBuZXdDb21wb25lbnRzOiBhbnk7XHJcblx0XHRcdFx0aWYgKGZvcm1Db21wLmNvbXBvbmVudHMpIHtcclxuXHRcdFx0XHRcdG5ld0NvbXBvbmVudHMgPSBmb3JtQ29tcC5jb21wb25lbnRzO1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAoZm9ybUNvbXAuY29sdW1ucykge1xyXG5cdFx0XHRcdFx0bmV3Q29tcG9uZW50cyA9IGZvcm1Db21wLmNvbHVtbnM7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGNvbXBvbmVudHMgPSB0aGlzLmdldFBhbmVsQ29tcG9uZW5ldChjb21wb25lbnRzLCBuZXdDb21wb25lbnRzLCBwYW5lbE5hbWUpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gY29tcG9uZW50cztcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgcmVjdXJzaXZlIG1ldGhvZCB0byBnZXQgYWxsIHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgY29tcG9uZW50cyBhIGNvbHVtbnMgb2YgdGhlIGR5bmFtaWMgZm9ybVxyXG5cdCAqIEBwYXJhbSBjb21wb25lbnRzXHJcblx0ICogQHBhcmFtIGZvcm1cclxuXHQgKi9cclxuXHRnZXRDb21wb25lbmV0Rm9ybShcclxuXHRcdGNvbXBvbmVudHM6IGFueVtdLFxyXG5cdFx0Zm9ybTogYW55LFxyXG5cdFx0cGFuZWxOYW1lOiBzdHJpbmcsXHJcblx0XHRlZGl0Z3JpZDogYm9vbGVhbixcclxuXHRcdGVkaXRHcmlkS2V5OiBzdHJpbmdcclxuXHQpOiBhbnlbXSB7XHJcblx0XHRmb3IgKGxldCBmb3JtQ29tcCBvZiBmb3JtKSB7XHJcblx0XHRcdC8vTU8tICBtYW50aXMgODc0MyBmaXggYWRkcmVzcyB0b2tlblxyXG5cdFx0XHRpZiAoXHJcblx0XHRcdFx0KGZvcm1Db21wLmNvbXBvbmVudHMgfHwgZm9ybUNvbXAuY29sdW1ucykgJiZcclxuXHRcdFx0XHRmb3JtQ29tcC50eXBlICE9PSAnYWRkcmVzcycgJiZcclxuXHRcdFx0XHRmb3JtQ29tcC50eXBlICE9PSAnZWRpdGdyaWQnXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdGxldCBuZXdDb21wb25lbnRzOiBhbnk7XHJcblx0XHRcdFx0aWYgKGZvcm1Db21wLmNvbXBvbmVudHMpIHtcclxuXHRcdFx0XHRcdG5ld0NvbXBvbmVudHMgPSBmb3JtQ29tcC5jb21wb25lbnRzO1xyXG5cdFx0XHRcdFx0aWYgKGZvcm1Db21wLnR5cGUgPT09ICdlZGl0Z3JpZCcpIHtcclxuXHRcdFx0XHRcdFx0ZWRpdGdyaWQgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHRlZGl0R3JpZEtleSA9IGZvcm1Db21wLmtleTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9IGVsc2UgaWYgKGZvcm1Db21wLmNvbHVtbnMpIHtcclxuXHRcdFx0XHRcdG5ld0NvbXBvbmVudHMgPSBmb3JtQ29tcC5jb2x1bW5zO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAoZm9ybUNvbXAudHlwZSAmJiBmb3JtQ29tcC50eXBlID09PSAncGFuZWwnKSB7XHJcblx0XHRcdFx0XHRwYW5lbE5hbWUgPSBmb3JtQ29tcC50aXRsZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Y29tcG9uZW50cyA9IHRoaXMuZ2V0Q29tcG9uZW5ldEZvcm0oXHJcblx0XHRcdFx0XHRjb21wb25lbnRzLFxyXG5cdFx0XHRcdFx0bmV3Q29tcG9uZW50cyxcclxuXHRcdFx0XHRcdHBhbmVsTmFtZSxcclxuXHRcdFx0XHRcdGVkaXRncmlkLFxyXG5cdFx0XHRcdFx0ZWRpdEdyaWRLZXlcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGZvcm1Db21wLnBhbmVsTmFtZSA9IHBhbmVsTmFtZTtcclxuXHRcdFx0XHRmb3JtQ29tcC5lZGl0Z3JpZCA9IGVkaXRncmlkO1xyXG5cdFx0XHRcdGZvcm1Db21wLmVkaXRHcmlkS2V5ID0gZWRpdEdyaWRLZXk7XHJcblx0XHRcdFx0Y29tcG9uZW50cy5wdXNoKGZvcm1Db21wKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGNvbXBvbmVudHM7XHJcblx0fVxyXG5cclxuXHQvKiogVGhpcyBwcm9taXNlIGFsbG93cyB0byBleGVjdXRlIGEgZnVuY3Rpb24gd2hlbiBjb25zdWx0aW5nIHRoZSBmb3JtIGZpZWxkcy4gKi9cclxuXHRnZXRGb3JtRWRpdEdyaWRGaWVsZHNCeVByb21Db2RlKHByb21Db2RpZ28pOiBQcm9taXNlPGFueVtdPiB7XHJcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cdFx0XHQvLyBTZWFyY2ggdGhlIGR5bmFtaWMgZm9ybVxyXG5cdFx0XHRsZXQgbEZvcm1GaWVsZHNUb2tlbjogYW55W10gPSBudWxsO1xyXG5cdFx0XHR0aGlzLmZvcm1TZXJ2aWNlLmdldEJ5UHJvbUNvZGlnbyhwcm9tQ29kaWdvKS5zdWJzY3JpYmUoXHJcblx0XHRcdFx0KHJlc3VsdDogYW55KSA9PiB7XHJcblx0XHRcdFx0XHRsZXQgZm9ybTogYW55ID0gcmVzdWx0O1xyXG5cdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHQhZm9ybSB8fFxyXG5cdFx0XHRcdFx0XHQhZm9ybVswXSB8fFxyXG5cdFx0XHRcdFx0XHQhZm9ybVswXS5wcm9tQ29kaWdvIHx8XHJcblx0XHRcdFx0XHRcdGZvcm1bMF0ucHJvbUNvZGlnbyAhPSBwcm9tQ29kaWdvXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0Ly8gdGhpcy5yb3V0ZXIubmF2aWdhdGUoWyc0MDQnXSk7XHJcblx0XHRcdFx0XHRcdHJlc29sdmUobEZvcm1GaWVsZHNUb2tlbik7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRsRm9ybUZpZWxkc1Rva2VuID0gW107XHJcblx0XHRcdFx0XHRmb3IgKGxldCBmb3JtQ29tcCBvZiBmb3JtKSB7XHJcblx0XHRcdFx0XHRcdGxldCBuZXdDb21wb25lbnRzOiBhbnk7XHJcblx0XHRcdFx0XHRcdGxldCBjb21wb25lbnRzOiBhbnlbXSA9IFtdO1xyXG5cdFx0XHRcdFx0XHRpZiAoZm9ybUNvbXAuY29tcG9uZW50cykge1xyXG5cdFx0XHRcdFx0XHRcdG5ld0NvbXBvbmVudHMgPSBmb3JtQ29tcC5jb21wb25lbnRzO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGZvcm1Db21wLmNvbHVtbnMpIHtcclxuXHRcdFx0XHRcdFx0XHRuZXdDb21wb25lbnRzID0gZm9ybUNvbXAuY29sdW1ucztcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAobmV3Q29tcG9uZW50cyAmJiBVdGlsU3RyaW5nLmlzVmFsaWQoZm9ybUNvbXAudGl0bGUpKSB7XHJcblx0XHRcdFx0XHRcdFx0bEZvcm1GaWVsZHNUb2tlbi5wdXNoKHtcclxuXHRcdFx0XHRcdFx0XHRcdHRpdGxlOiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLmdldEtleUZvcm11bGFyaW8oZm9ybUNvbXAudGl0bGUpLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogZm9ybUNvbXAudGl0bGUsXHJcblx0XHRcdFx0XHRcdFx0XHRcdG9iamVjdDogZm9ybUNvbXBcclxuXHRcdFx0XHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogW11cclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRsRm9ybUZpZWxkc1Rva2VuW2xGb3JtRmllbGRzVG9rZW4ubGVuZ3RoIC0gMV0udmFsdWUgPVxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5nZXRFZGl0R3JpZENvbXBvbmVuZXQoY29tcG9uZW50cywgbmV3Q29tcG9uZW50cywgbnVsbCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJlc29sdmUobEZvcm1GaWVsZHNUb2tlbik7XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHQoZXJyb3IpID0+IHtcclxuXHRcdFx0XHRcdHJlamVjdChlcnJvcik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHQpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBIHJlY3Vyc2l2ZSBtZXRob2QgdG8gZ2V0IGFsbCB0aGUgaW5mb3JtYXRpb24gb2YgdGhlIGVkaXRHcmlkIGR5bmFtaWMgZm9ybVxyXG5cdCAqIEBwYXJhbSBjb21wb25lbnRzXHJcblx0ICogQHBhcmFtIGZvcm1cclxuXHQgKi9cclxuXHRnZXRFZGl0R3JpZENvbXBvbmVuZXQoY29tcG9uZW50czogYW55W10sIGZvcm06IGFueSwgcGFuZWxOYW1lOiBzdHJpbmcpOiBhbnlbXSB7XHJcblx0XHRmb3IgKGxldCBmb3JtQ29tcCBvZiBmb3JtKSB7XHJcblx0XHRcdGlmIChmb3JtQ29tcC50eXBlID09PSAnZWRpdGdyaWQnKSB7XHJcblx0XHRcdFx0Zm9ybUNvbXAucGFuZWxOYW1lID0gcGFuZWxOYW1lO1xyXG5cdFx0XHRcdGNvbXBvbmVudHMucHVzaChmb3JtQ29tcCk7XHJcblx0XHRcdH0gZWxzZSBpZiAoZm9ybUNvbXAuY29tcG9uZW50cyB8fCBmb3JtQ29tcC5jb2x1bW5zKSB7XHJcblx0XHRcdFx0bGV0IG5ld0NvbXBvbmVudHM6IGFueTtcclxuXHRcdFx0XHRpZiAoZm9ybUNvbXAuY29tcG9uZW50cykge1xyXG5cdFx0XHRcdFx0bmV3Q29tcG9uZW50cyA9IGZvcm1Db21wLmNvbXBvbmVudHM7XHJcblx0XHRcdFx0fSBlbHNlIGlmIChmb3JtQ29tcC5jb2x1bW5zKSB7XHJcblx0XHRcdFx0XHRuZXdDb21wb25lbnRzID0gZm9ybUNvbXAuY29sdW1ucztcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKGZvcm1Db21wLnR5cGUgJiYgZm9ybUNvbXAudHlwZSA9PT0gJ3BhbmVsJykge1xyXG5cdFx0XHRcdFx0cGFuZWxOYW1lID0gZm9ybUNvbXAudGl0bGU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGNvbXBvbmVudHMgPSB0aGlzLmdldEVkaXRHcmlkQ29tcG9uZW5ldChjb21wb25lbnRzLCBuZXdDb21wb25lbnRzLCBwYW5lbE5hbWUpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gY29tcG9uZW50cztcclxuXHR9XHJcblxyXG5cdC8qKiBJdCByZXR1cm5zIHRoZSB0b2tlbnMgYnkgcHJvbUNvZGlnbyAqL1xyXG5cdGdldExpc3RCeVByb21Db2RpZ28ocHJvbUNvZGU6IG51bWJlcik6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldChcclxuXHRcdFx0dGhpcy5lbnZpcm9ubWVudC5ob3N0LmJhY2tlbmQuY29uZmlndXJhdGlvbiArICd0b2tlbi9nZXRCeVByb21Db2RpZ28nLFxyXG5cdFx0XHR7IHBhcmFtczogbmV3IEh0dHBQYXJhbXMoKS5zZXQoJ3Byb21Db2RpZ28nLCBwcm9tQ29kZS50b1N0cmluZygpKSB9XHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0LyoqIEl0IHJldHVybnMgdGhlIHRva2VuIGJ5IGlkICovXHJcblx0Z2V0QnlJZChpZDogbnVtYmVyKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuXHRcdHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0KHRoaXMuZW52aXJvbm1lbnQuaG9zdC5iYWNrZW5kLmNvbmZpZ3VyYXRpb24gKyAndG9rZW4vZ2V0QnlJZCcsIHtcclxuXHRcdFx0cGFyYW1zOiBuZXcgSHR0cFBhcmFtcygpLnNldCgnaWQnLCBpZC50b1N0cmluZygpKVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHQvKiogSXQgZGVsZXRlcyBhIGZvcm0gYnkgaWQgKi9cclxuXHRkZWxldGUoaWQpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cENsaWVudC5kZWxldGUoXHJcblx0XHRcdHRoaXMuZW52aXJvbm1lbnQuaG9zdC5iYWNrZW5kLmNvbmZpZ3VyYXRpb24gKyAndG9rZW4vZGVsZXRlJyxcclxuXHRcdFx0eyBwYXJhbXM6IG5ldyBIdHRwUGFyYW1zKCkuc2V0KCdpZCcsIGlkKSB9XHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0LyoqIEl0IHNhdmVzIHRoZSB0b2tlbiAqL1xyXG5cdHNhdmUodG9rZW46IFRva2VuKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuXHRcdHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdChcclxuXHRcdFx0dGhpcy5lbnZpcm9ubWVudC5ob3N0LmJhY2tlbmQuY29uZmlndXJhdGlvbiArICd0b2tlbi9zYXZlJyxcclxuXHRcdFx0dG9rZW4sXHJcblx0XHRcdEhFQURFUl9KU09OXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldEtleUZvcm11bGFyaW8oZm9ybVRpdGxlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cdFx0aWYgKFV0aWxTdHJpbmcuaXNWYWxpZChmb3JtVGl0bGUpKSB7XHJcblx0XHRcdHJldHVybiAoXHJcblx0XHRcdFx0VXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKFRva2VuU2VydmljZS5UT0tFTl9MQUJFTF9GT1JNKSArXHJcblx0XHRcdFx0VXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKGZvcm1UaXRsZSkucmVwbGFjZSgvXy9nLCAnLScpXHJcblx0XHRcdCk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gJyc7XHJcblx0fVxyXG5cclxuXHQvKiogSXQgcmV0dXJucyB0aGUgdW5pcXVlIHZlcmlmaWNhdGlvbiBjb2RlICovXHJcblx0Z2V0VW5pcXVlVmVyaWZpY2F0aW9uQ29kZShsb2dpbjogc3RyaW5nLCB0b2tlbjogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuXHRcdHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0KFxyXG5cdFx0XHR0aGlzLmVudmlyb25tZW50Lmhvc3QuYmFja2VuZC5kb2N1bWVudHNSZXBvc2l0b3J5ICtcclxuXHRcdFx0XHQnZG9jdW1lbnRvL2NvbnN1bHRhckNvZGlnb1VuaWNvLycgK1xyXG5cdFx0XHRcdGxvZ2luICtcclxuXHRcdFx0XHQnLycgK1xyXG5cdFx0XHRcdHRva2VuLFxyXG5cdFx0XHR7IHBhcmFtczogbmV3IEh0dHBQYXJhbXMoKSB9XHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0LyoqIEl0IHNlbmQgdGhlIGluZm9ybWF0aW9uIHRvIGNvcHkgdGhlIERvY3VtZW50IHZpZXdlciAqL1xyXG5cdGNvcHlEb2N1bWVudEluZm9ybWF0aW9uVmlld2VyKFxyXG5cdFx0bG9naW46IHN0cmluZyxcclxuXHRcdHRva2VuOiBzdHJpbmcsXHJcblx0XHR1bmlxdWVDb2RlOiBzdHJpbmcsXHJcblx0XHRkb2N1bWVudFVSTDogc3RyaW5nLFxyXG5cdFx0ZG9jdW1lbnROYW1lOiBzdHJpbmdcclxuXHQpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0bGV0IGluZm9Eb2N1bWVudG8gPSB7XHJcblx0XHRcdGNvZGlnb1VuaWNvOiB1bmlxdWVDb2RlLFxyXG5cdFx0XHRydXRhRG9jdW1lbnRvOiBkb2N1bWVudFVSTCxcclxuXHRcdFx0ZG9jdW1lbnROYW1lOiBkb2N1bWVudE5hbWVcclxuXHRcdH07XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwQ2xpZW50LnBvc3QoXHJcblx0XHRcdHRoaXMuZW52aXJvbm1lbnQuaG9zdC5iYWNrZW5kLmRvY3VtZW50c1JlcG9zaXRvcnkgK1xyXG5cdFx0XHRcdCdkb2N1bWVudG8vYWRpY2lvbmFyRG9jdW1lbnRvLycgK1xyXG5cdFx0XHRcdGxvZ2luICtcclxuXHRcdFx0XHQnLycgK1xyXG5cdFx0XHRcdHRva2VuLFxyXG5cdFx0XHRpbmZvRG9jdW1lbnRvLFxyXG5cdFx0XHRIRUFERVJfSlNPTlxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRLZXlCdWRnZXQoKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiBVdGlsU3RyaW5nLnJlcGxhY2VBY2NlbnRTcGFjZXNPdGhlcnMoVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0JVREdFVCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0S2V5RG9jdW1lbnQoKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiBVdGlsU3RyaW5nLnJlcGxhY2VBY2NlbnRTcGFjZXNPdGhlcnMoVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0RPQ1VNRU5UTyk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0S2V5RG9jdW1lbnRBbmFseXNpcygpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyhUb2tlblNlcnZpY2UuVE9LRU5fRE9DVU1FTlRPX0FOQUxZU0lTX1RZUEUpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldEtleVRhc2soKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiBVdGlsU3RyaW5nLnJlcGxhY2VBY2NlbnRTcGFjZXNPdGhlcnMoVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX1RBU0tMKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRLZXlTdGF0aWMoKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiBVdGlsU3RyaW5nLnJlcGxhY2VBY2NlbnRTcGFjZXNPdGhlcnMoVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX1NUQVRJQyk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0S2V5Q2FsY3VsYXRlZCh0b2tlbjogVG9rZW4pOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIChcclxuXHRcdFx0VXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKFRva2VuU2VydmljZS5UT0tFTl9MQUJFTF9DQUxDVUxBVEVEKSArXHJcblx0XHRcdCdfJyArXHJcblx0XHRcdFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyh0b2tlbi5uYW1lKVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRLZXlTbmFwc2hvdCh0b2tlbjogVG9rZW4pOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIChcclxuXHRcdFx0VXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKFRva2VuU2VydmljZS5UT0tFTl9MQUJFTF9TTkFQU0hPVCkgK1xyXG5cdFx0XHQnXycgK1xyXG5cdFx0XHRVdGlsU3RyaW5nLnJlcGxhY2VBY2NlbnRTcGFjZXNPdGhlcnModG9rZW4ubmFtZSlcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0S2V5R3VhcmFudGVlKHRva2VuOiBQbGlDbmZHdWFyYW50ZWVUb2tlbik6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gKFxyXG5cdFx0XHRVdGlsU3RyaW5nLnJlcGxhY2VBY2NlbnRTcGFjZXNPdGhlcnMoVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0dVQVJBTlRFRSkgK1xyXG5cdFx0XHQnXycgK1xyXG5cdFx0XHRVdGlsU3RyaW5nLnJlcGxhY2VBY2NlbnRTcGFjZXNPdGhlcnModG9rZW4ubmFtZSlcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm4gYSB2YWx1ZSB0aGF0IHJlcHJlc2VudCB0aGUgdHlwZSBvZiBsYWJlbDogMT1Gb3JtLCAyPUJ1ZGdldCwgMz1TdGF0aWMsIDQ9Q2FsY3VsYXRlZFxyXG5cdCAqIEBwYXJhbSBrZXkgVmFsdWUgdG8gZXZhbHVlYXRlXHJcblx0ICovXHJcblx0c3RhdGljIGdldEtleVR5cGUoa2V5OiBzdHJpbmcpOiBudW1iZXIge1xyXG5cdFx0a2V5ID0ga2V5LnJlcGxhY2UoJ3snLCAnJykucmVwbGFjZSgnfScsICcnKTtcclxuXHRcdGtleSA9IGtleS5zdWJzdHJpbmcoMSwga2V5LmluZGV4T2YoJ18nKSk7XHJcblx0XHRpZiAoa2V5LnN0YXJ0c1dpdGgoVXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKFRva2VuU2VydmljZS5UT0tFTl9MQUJFTF9GT1JNKSkpIHtcclxuXHRcdFx0cmV0dXJuIDE7XHJcblx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRrZXkuc3RhcnRzV2l0aChVdGlsU3RyaW5nLnJlcGxhY2VBY2NlbnRTcGFjZXNPdGhlcnMoVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0JVREdFVCkpXHJcblx0XHQpIHtcclxuXHRcdFx0cmV0dXJuIDI7XHJcblx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRrZXkuc3RhcnRzV2l0aChVdGlsU3RyaW5nLnJlcGxhY2VBY2NlbnRTcGFjZXNPdGhlcnMoVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX1NUQVRJQykpXHJcblx0XHQpIHtcclxuXHRcdFx0cmV0dXJuIDM7XHJcblx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRrZXkuc3RhcnRzV2l0aChcclxuXHRcdFx0XHRVdGlsU3RyaW5nLnJlcGxhY2VBY2NlbnRTcGFjZXNPdGhlcnMoVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0NBTENVTEFURUQpXHJcblx0XHRcdClcclxuXHRcdCkge1xyXG5cdFx0XHRyZXR1cm4gNDtcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdGtleS5zdGFydHNXaXRoKFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyhUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfVEFTS0wpKVxyXG5cdFx0KSB7XHJcblx0XHRcdHJldHVybiA1O1xyXG5cdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0a2V5LnN0YXJ0c1dpdGgoXHJcblx0XHRcdFx0VXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKFRva2VuU2VydmljZS5UT0tFTl9ET0NVTUVOVE9fQU5BTFlTSVNfVFlQRSlcclxuXHRcdFx0KVxyXG5cdFx0KSB7XHJcblx0XHRcdHJldHVybiA2O1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZXBlbmRzIG9mIHRoZSB0eXBlIG9mIGZvcm1GaWVsZFRva2VuIHJldHVybiBkZSB2YWx1ZSBvZiB0aGUgdmFsdWVEYXRhXHJcblx0ICogQHBhcmFtIGZvcm1GaWVsZFRva2VuXHJcblx0ICogQHBhcmFtIHZhbHVlRGF0YVxyXG5cdCAqL1xyXG5cdGdldFZhbHVlRnJvbUZvcm1GaWVsZChmb3JtRmllbGRUb2tlbjogYW55LCB2YWx1ZURhdGE6IGFueSk6IGFueSB7XHJcblx0XHRpZiAodHlwZW9mIHZhbHVlRGF0YSA9PSAnb2JqZWN0Jykge1xyXG5cdFx0XHRpZiAoZm9ybUZpZWxkVG9rZW4udHlwZSkge1xyXG5cdFx0XHRcdGlmIChmb3JtRmllbGRUb2tlbi50eXBlID09ICdhZGRyZXNzJykge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlRGF0YS5mb3JtYXR0ZWRfYWRkcmVzcztcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0Zm9ybUZpZWxkVG9rZW4udHlwZSA9PSAnc2VsZWN0JyAmJlxyXG5cdFx0XHRcdFx0dmFsdWVEYXRhLmhhc093blByb3BlcnR5KGZvcm1GaWVsZFRva2VuLnNlYXJjaEZpZWxkKVxyXG5cdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0aWYgKHZhbHVlRGF0YS5oYXNPd25Qcm9wZXJ0eSgnb3JpZ2luYWxfbmFtZScpICE9PSAnJykge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWVEYXRhLm9yaWdpbmFsX25hbWU7XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHZhbHVlRGF0YS5oYXNPd25Qcm9wZXJ0eSgnbmF0aXZlTmFtZScpICE9PSAnJykge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWVEYXRhLm5hdGl2ZU5hbWU7XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHZhbHVlRGF0YS5oYXNPd25Qcm9wZXJ0eSgnZm9ybWF0dGVkX2FkZHJlc3MnKSkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWVEYXRhLmZvcm1hdHRlZF9hZGRyZXNzO1xyXG5cdFx0XHRcdFx0fSBlbHNlIGlmIChmb3JtRmllbGRUb2tlbi5zZWFyY2hGaWVsZCkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWVEYXRhW2Zvcm1GaWVsZFRva2VuLnNlYXJjaEZpZWxkXTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKGZvcm1GaWVsZFRva2VuLnR5cGUgPT0gJ3NlbGVjdCcpIHtcclxuXHRcdFx0XHRcdGlmICh2YWx1ZURhdGEuaGFzT3duUHJvcGVydHkoJ2Zvcm1hdHRlZF9hZGRyZXNzJykpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHZhbHVlRGF0YS5mb3JtYXR0ZWRfYWRkcmVzcztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiB2YWx1ZURhdGE7XHJcblx0fVxyXG5cdGZvcm1hdERhdGUodmFsdWU6IERhdGUsIGxvY2FsZTogc3RyaW5nKTogc3RyaW5nIHtcclxuXHRcdGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7XHJcblxyXG5cdFx0Y29uc3QgbW9udGhzID0ge1xyXG5cdFx0XHRlczogW1xyXG5cdFx0XHRcdCdlbmVybycsXHJcblx0XHRcdFx0J2ZlYnJlcm8nLFxyXG5cdFx0XHRcdCdtYXJ6bycsXHJcblx0XHRcdFx0J2FicmlsJyxcclxuXHRcdFx0XHQnbWF5bycsXHJcblx0XHRcdFx0J2p1bmlvJyxcclxuXHRcdFx0XHQnanVsaW8nLFxyXG5cdFx0XHRcdCdhZ29zdG8nLFxyXG5cdFx0XHRcdCdzZXB0aWVtYnJlJyxcclxuXHRcdFx0XHQnb2N0dWJyZScsXHJcblx0XHRcdFx0J25vdmllbWJyZScsXHJcblx0XHRcdFx0J2RpY2llbWJyZSdcclxuXHRcdFx0XSxcclxuXHRcdFx0ZW46IFtcclxuXHRcdFx0XHQnSmFudWFyeScsXHJcblx0XHRcdFx0J0ZlYnJ1YXJ5JyxcclxuXHRcdFx0XHQnTWFyY2gnLFxyXG5cdFx0XHRcdCdBcHJpbCcsXHJcblx0XHRcdFx0J01heScsXHJcblx0XHRcdFx0J0p1bmUnLFxyXG5cdFx0XHRcdCdKdWx5JyxcclxuXHRcdFx0XHQnQXVndXN0JyxcclxuXHRcdFx0XHQnU2VwdGVtYmVyJyxcclxuXHRcdFx0XHQnT2N0b2JlcicsXHJcblx0XHRcdFx0J05vdmVtYmVyJyxcclxuXHRcdFx0XHQnRGVjZW1iZXInXHJcblx0XHRcdF0sXHJcblx0XHRcdGZyOiBbXHJcblx0XHRcdFx0J2phbnZpZXInLFxyXG5cdFx0XHRcdCdmw6l2cmllcicsXHJcblx0XHRcdFx0J21hcnMnLFxyXG5cdFx0XHRcdCdhdnJpbCcsXHJcblx0XHRcdFx0J21haScsXHJcblx0XHRcdFx0J2p1aW4nLFxyXG5cdFx0XHRcdCdqdWlsbGV0JyxcclxuXHRcdFx0XHQnYW/Du3QnLFxyXG5cdFx0XHRcdCdzZXB0ZW1icmUnLFxyXG5cdFx0XHRcdCdvY3RvYnJlJyxcclxuXHRcdFx0XHQnbm92ZW1icmUnLFxyXG5cdFx0XHRcdCdkw6ljZW1icmUnXHJcblx0XHRcdF0sXHJcblx0XHRcdGRlOiBbXHJcblx0XHRcdFx0J0phbnVhcicsXHJcblx0XHRcdFx0J0ZlYnJ1YXInLFxyXG5cdFx0XHRcdCdNw6RyeicsXHJcblx0XHRcdFx0J0FwcmlsJyxcclxuXHRcdFx0XHQnTWFpJyxcclxuXHRcdFx0XHQnSnVuaScsXHJcblx0XHRcdFx0J0p1bGknLFxyXG5cdFx0XHRcdCdBdWd1c3QnLFxyXG5cdFx0XHRcdCdTZXB0ZW1iZXInLFxyXG5cdFx0XHRcdCdPa3RvYmVyJyxcclxuXHRcdFx0XHQnTm92ZW1iZXInLFxyXG5cdFx0XHRcdCdEZXplbWJlcidcclxuXHRcdFx0XSxcclxuXHRcdFx0aXQ6IFtcclxuXHRcdFx0XHQnZ2VubmFpbycsXHJcblx0XHRcdFx0J2ZlYmJyYWlvJyxcclxuXHRcdFx0XHQnbWFyem8nLFxyXG5cdFx0XHRcdCdhcHJpbGUnLFxyXG5cdFx0XHRcdCdtYWdnaW8nLFxyXG5cdFx0XHRcdCdnaXVnbm8nLFxyXG5cdFx0XHRcdCdsdWdsaW8nLFxyXG5cdFx0XHRcdCdhZ29zdG8nLFxyXG5cdFx0XHRcdCdzZXR0ZW1icmUnLFxyXG5cdFx0XHRcdCdvdHRvYnJlJyxcclxuXHRcdFx0XHQnbm92ZW1icmUnLFxyXG5cdFx0XHRcdCdkaWNlbWJyZSdcclxuXHRcdFx0XVxyXG5cdFx0fTtcclxuXHJcblx0XHRjb25zdCBsb2NhbGVNb250aHMgPSBtb250aHNbbG9jYWxlXTtcclxuXHJcblx0XHRjb25zdCBtb250aCA9IGxvY2FsZU1vbnRoc1tkYXRlLmdldE1vbnRoKCldO1xyXG5cdFx0Y29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcclxuXHJcblx0XHRyZXR1cm4gYCR7bW9udGh9ICR7eWVhcn1gO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBUcnkgdG8gZmluZCB0aGUgdG9rZW4gaW4gdGhlIHN0cmluZ1RleHQgYW5kIHJlcGxhY2Ugd2l0aCBkYXRhVmFsdWUuIElmIGRldGVjdCBmb3JtYXQgb2YgbnVtYmVyIG9yIGRhdGUgdHJ5IHRvIGZvcm1hdCB0aGUgZGF0YVZhbHVlXHJcblx0ICogQHBhcmFtIHN0cmluZ1RleHRcclxuXHQgKiBAcGFyYW0gdG9rZW5cclxuXHQgKiBAcGFyYW0gZGF0YVZhbHVlXHJcblx0ICovXHJcblx0cmVwbGFjZVRva2VuKHN0cmluZ1RleHQ6IHN0cmluZywgdG9rZW46IGFueSwgZGF0YVZhbHVlOiBhbnksIGxvY2FsZT86IHN0cmluZyk6IHN0cmluZyB7XHJcblx0XHRsZXQgdmFsdWVSZXBsYWNlOiBzdHJpbmcgPSBudWxsO1xyXG5cdFx0aWYgKHRva2VuICYmIHRva2VuWzBdID09ICcjJykge1xyXG5cdFx0XHRsZXQgdHlwZVRva2VuID0gdG9rZW4uc3Vic3RyaW5nKDEsIHRva2VuLmluZGV4T2YoJygnKSk7XHJcblx0XHRcdGlmICh0eXBlVG9rZW4gPT0gJ2RhdGUnKSB7XHJcblx0XHRcdFx0bGV0IGRhdGVGb3JtYXQ6IHN0cmluZyA9IHRva2VuLnN1YnN0cmluZyhcclxuXHRcdFx0XHRcdHRva2VuLmluZGV4T2YoJ30nKSArIDEsXHJcblx0XHRcdFx0XHR0b2tlbi5pbmRleE9mKCcpJylcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHRcdGRhdGVGb3JtYXQgPSBkYXRlRm9ybWF0LnRyaW0oKS5yZXBsYWNlKC9cXFwiL2csICcnKS5yZXBsYWNlKC9cXCcvZywgJycpO1xyXG5cdFx0XHRcdGxldCBkYXRlVmFsdWUgPSBEYXRlVXRpbC5nZXREYXRlKGRhdGFWYWx1ZSk7XHJcblx0XHRcdFx0aWYgKGxvY2FsZSAhPSBudWxsICYmIGxvY2FsZSkge1xyXG5cdFx0XHRcdFx0dmFsdWVSZXBsYWNlID0gdGhpcy5mb3JtYXREYXRlKGRhdGVWYWx1ZSwgbG9jYWxlKTtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKGRhdGVWYWx1ZSkge1xyXG5cdFx0XHRcdFx0dmFsdWVSZXBsYWNlID0gRGF0ZVV0aWwuZ2V0TW9tZW50KGRhdGVWYWx1ZSkuZm9ybWF0KGRhdGVGb3JtYXQpO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHR2YWx1ZVJlcGxhY2UgPSAnJztcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSBpZiAodHlwZVRva2VuID09ICdudW1iZXInKSB7XHJcblx0XHRcdFx0bGV0IG51bWJlclZhbHVlOiBudW1iZXIgPSBOdW1iZXIoZGF0YVZhbHVlKTtcclxuXHRcdFx0XHRpZiAobnVtYmVyVmFsdWUgIT0gdW5kZWZpbmVkICYmICFpc05hTihudW1iZXJWYWx1ZSkpIHtcclxuXHRcdFx0XHRcdGxldCBudW1iZXJGb3JtYXQ6IHN0cmluZyA9IHRva2VuLnN1YnN0cmluZyhcclxuXHRcdFx0XHRcdFx0dG9rZW4uaW5kZXhPZignfScpICsgMSxcclxuXHRcdFx0XHRcdFx0dG9rZW4uaW5kZXhPZignKScpXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0bnVtYmVyRm9ybWF0ID0gbnVtYmVyRm9ybWF0LnRyaW0oKS5yZXBsYWNlKC9cXFwiL2csICcnKS5yZXBsYWNlKC9cXCcvZywgJycpO1xyXG5cdFx0XHRcdFx0dmFsdWVSZXBsYWNlID0gdGhpcy5jdXJyZW5jeVBpcGUudHJhbnNmb3JtKFxyXG5cdFx0XHRcdFx0XHRudW1iZXJWYWx1ZSxcclxuXHRcdFx0XHRcdFx0dGhpcy5sb2NhbGUsXHJcblx0XHRcdFx0XHRcdCcnLFxyXG5cdFx0XHRcdFx0XHRudW1iZXJGb3JtYXRcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGNvbnNvbGUubG9nKFxyXG5cdFx0XHRcdFx0XHQnRWwgZGF0byBbJyArXHJcblx0XHRcdFx0XHRcdFx0ZGF0YVZhbHVlICtcclxuXHRcdFx0XHRcdFx0XHQnXSBwYXJhIGVsIHRva2VuIFsnICtcclxuXHRcdFx0XHRcdFx0XHR0b2tlbiArXHJcblx0XHRcdFx0XHRcdFx0J10gdGlwbyBuw7ptZXJpY28gbm8gZXMgdmFsaWRvJ1xyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdHZhbHVlUmVwbGFjZSA9ICcnO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRjb25zb2xlLmxvZygndGlwbyBkZSB0b2tlbiBpbmRlZmluaWRvLiBbdHlwZVRva2VuWycgKyB0eXBlVG9rZW4gKyAnXV0nKTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmICh0b2tlbiAmJiB0b2tlblswXSA9PSAnJCcpIHtcclxuXHRcdFx0aWYgKFxyXG5cdFx0XHRcdGRhdGFWYWx1ZSAhPT0gbnVsbCAmJlxyXG5cdFx0XHRcdGRhdGFWYWx1ZSAhPT0gdW5kZWZpbmVkICYmXHJcblx0XHRcdFx0ZGF0YVZhbHVlLm9yaWdpbmFsX25hbWUgIT09IHVuZGVmaW5lZCAmJlxyXG5cdFx0XHRcdGRhdGFWYWx1ZS5vcmlnaW5hbF9uYW1lICE9PSBudWxsXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdHZhbHVlUmVwbGFjZSA9IGRhdGFWYWx1ZS5vcmlnaW5hbF9uYW1lO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHZhbHVlUmVwbGFjZSA9IGRhdGFWYWx1ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHQvLyB2YWx1ZVJlcGxhY2UgPSBkYXRhVmFsdWU7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRjb25zb2xlLmxvZygnRWwgdG9rZW4gbm8gZXMgdmFsaWRvLiBbdG9rZW5bJyArIHRva2VuICsgJ11dJyk7XHJcblx0XHR9XHJcblx0XHRpZiAoc3RyaW5nVGV4dCAmJiB2YWx1ZVJlcGxhY2UgIT09IG51bGwpIHtcclxuXHRcdFx0aWYgKHRva2VuICYmIHRva2VuID09PSAnJHtlc3RhdGljb18nICsgVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTl9TVVJOQU1FICsgJ30nKSB7XHJcblx0XHRcdFx0dmFsdWVSZXBsYWNlID0gZGF0YVZhbHVlO1xyXG5cdFx0XHRcdHN0cmluZ1RleHQgPSBzdHJpbmdUZXh0LnNwbGl0KHRva2VuKS5qb2luKHZhbHVlUmVwbGFjZSk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Ly8gcmVwbGFjZSB0ZXh0IGluIGEgbW9yZSBlZmZpY2llbnQgd2F5XHJcblx0XHRcdFx0c3RyaW5nVGV4dCA9IHN0cmluZ1RleHQuc3BsaXQodG9rZW4pLmpvaW4odmFsdWVSZXBsYWNlKTtcclxuXHRcdFx0XHQvL3N0cmluZ1RleHQgPSBzdHJpbmdUZXh0LnJlcGxhY2UodG9rZW4sIHZhbHVlUmVwbGFjZSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBzdHJpbmdUZXh0O1xyXG5cdH1cclxuXHJcblx0Z2V0TGlzdFRva2Vuc0J5U3RyaW5nU2VnbWVudGF0aW9uKHN0cmluZ1RleHQ6IHN0cmluZyk6IGFueVtdIHtcclxuXHRcdGNvbnN0IGFycmF5VG9rZW4gPSBzdHJpbmdUZXh0Lm1hdGNoKC9cXCR7KFtefV0rKVxcfS9nKTtcclxuXHRcdGNvbnN0IGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlID0gc3RyaW5nVGV4dC5tYXRjaCgvXFwjZGF0ZVteKV0rXFwpL2cpO1xyXG5cdFx0Y29uc3QgYXJyYXlUb2tlbkZvcm1hdHRlZE51bWJlciA9IHN0cmluZ1RleHQubWF0Y2goL1xcI251bWJlclteKV0rXFwpL2cpO1xyXG5cdFx0bGV0IGFycmF5VG9rZW5Gb3JtYXR0ZWQgPSBbXTtcclxuXHRcdGlmIChcclxuXHRcdFx0YXJyYXlUb2tlbkZvcm1hdHRlZERhdGUgJiZcclxuXHRcdFx0YXJyYXlUb2tlbkZvcm1hdHRlZERhdGUubGVuZ3RoID4gMCAmJlxyXG5cdFx0XHRhcnJheVRva2VuRm9ybWF0dGVkTnVtYmVyICYmXHJcblx0XHRcdGFycmF5VG9rZW5Gb3JtYXR0ZWROdW1iZXIubGVuZ3RoID4gMFxyXG5cdFx0KSB7XHJcblx0XHRcdGFycmF5VG9rZW5Gb3JtYXR0ZWQgPSBhcnJheVRva2VuRm9ybWF0dGVkRGF0ZS5jb25jYXQoYXJyYXlUb2tlbkZvcm1hdHRlZE51bWJlcik7XHJcblx0XHR9IGVsc2UgaWYgKGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlICYmIGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0YXJyYXlUb2tlbkZvcm1hdHRlZCA9IGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlLnNsaWNlKCk7XHJcblx0XHR9IGVsc2UgaWYgKGFycmF5VG9rZW5Gb3JtYXR0ZWROdW1iZXIgJiYgYXJyYXlUb2tlbkZvcm1hdHRlZE51bWJlci5sZW5ndGggPiAwKSB7XHJcblx0XHRcdGFycmF5VG9rZW5Gb3JtYXR0ZWQgPSBhcnJheVRva2VuRm9ybWF0dGVkTnVtYmVyLnNsaWNlKCk7XHJcblx0XHR9XHJcblx0XHRjb25zdCByZXN1bHQ6IGFueVtdID0gW107XHJcblxyXG5cdFx0aWYgKGFycmF5VG9rZW4pIHtcclxuXHRcdFx0Zm9yIChjb25zdCB0b2tlbiBvZiBhcnJheVRva2VuKSB7XHJcblx0XHRcdFx0Y29uc3QgaW5mb1Rva2VuID0geyBrZXk6IHRva2VuLCB2YWx1ZTogdG9rZW4gfTtcclxuXHRcdFx0XHRpZiAoYXJyYXlUb2tlbkZvcm1hdHRlZCkge1xyXG5cdFx0XHRcdFx0Zm9yIChjb25zdCB0b2tlbkZvcm1hdHRlZCBvZiBhcnJheVRva2VuRm9ybWF0dGVkKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGluZGV4ID0gdG9rZW5Gb3JtYXR0ZWQuaW5kZXhPZih0b2tlbik7XHJcblx0XHRcdFx0XHRcdGlmIChpbmRleCA+PSAwKSB7XHJcblx0XHRcdFx0XHRcdFx0aW5mb1Rva2VuLnZhbHVlID0gdG9rZW5Gb3JtYXR0ZWQ7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmVzdWx0LnB1c2goaW5mb1Rva2VuKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRjaGFuZ2VJZFByb3BlcnRpZXNPZk9iamVjdChub3JtYWxpemF0aW9uQ29sdW1uczogYW55W10sIGxpc3REYXRhOiBhbnlbXSk6IGFueVtdIHtcclxuXHRcdGNvbnN0IG5ld0RhdGEgPSBbXTtcclxuXHRcdGxpc3REYXRhLmZvckVhY2goKGRhdGEpID0+IHtcclxuXHRcdFx0Y29uc3Qgb2JqRGF0YSA9IHt9O1xyXG5cdFx0XHRPYmplY3Qua2V5cyhkYXRhKS5mb3JFYWNoKChwcm9wZXJ0eSkgPT4ge1xyXG5cdFx0XHRcdGlmIChkYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5KSkge1xyXG5cdFx0XHRcdFx0bm9ybWFsaXphdGlvbkNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcblx0XHRcdFx0XHRcdGlmIChjb2x1bW4uaWRDb2x1bW4udG9TdHJpbmcoKSA9PT0gcHJvcGVydHkpIHtcclxuXHRcdFx0XHRcdFx0XHRvYmpEYXRhW2NvbHVtbi5rZXldID0gZGF0YVtwcm9wZXJ0eV07XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHRcdGlmIChvYmpEYXRhKSB7XHJcblx0XHRcdFx0bmV3RGF0YS5wdXNoKG9iakRhdGEpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHRcdHJldHVybiBuZXdEYXRhO1xyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGVIdG1sQnlUb2tlbnNBbmREYXRhKGh0bWw6IHN0cmluZywgbGlzdERhdGE6IGFueVtdLCBsaXN0VG9rZW5zOiBhbnlbXSk6IHN0cmluZ1tdIHtcclxuXHRcdGNvbnN0IHRyYW5zbGF0ZWRDYXJkczogYW55W10gPSBbXTtcclxuXHRcdGxpc3REYXRhLmZvckVhY2goKGRhdGEpID0+IHtcclxuXHRcdFx0Y29uc3Qgb2JqVG9rZW4gPSB7fTtcclxuXHRcdFx0Y29uc3QgaHRtbFRyYW5zbGF0ZWQgPSB7IGh0bWw6IGh0bWwgfTtcclxuXHRcdFx0T2JqZWN0LmtleXMoZGF0YSkuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcclxuXHRcdFx0XHRsaXN0VG9rZW5zLmZvckVhY2goKHRva2VuKSA9PiB7XHJcblx0XHRcdFx0XHRpZiAocHJvcGVydHkgPT0gdG9rZW4ua2V5LnJlcGxhY2UoJyR7JywgJycpLnJlcGxhY2UoJ30nLCAnJykpIHtcclxuXHRcdFx0XHRcdFx0b2JqVG9rZW5bdG9rZW4ua2V5XSA9IGRhdGFbcHJvcGVydHldO1xyXG5cdFx0XHRcdFx0XHRodG1sVHJhbnNsYXRlZC5odG1sID0gaHRtbFRyYW5zbGF0ZWQuaHRtbC5yZXBsYWNlKFxyXG5cdFx0XHRcdFx0XHRcdHRva2VuLmtleSxcclxuXHRcdFx0XHRcdFx0XHRkYXRhW3Byb3BlcnR5XVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0dHJhbnNsYXRlZENhcmRzLnB1c2goaHRtbFRyYW5zbGF0ZWQpO1xyXG5cdFx0fSk7XHJcblx0XHRyZXR1cm4gdHJhbnNsYXRlZENhcmRzO1xyXG5cdH1cclxuXHJcblx0Z2V0TGlzdFRva2Vuc0J5U3RyaW5nKHN0cmluZ1RleHQ6IHN0cmluZyk6IGFueVtdIHtcclxuXHRcdHZhciBhcnJheVRva2VuID0gc3RyaW5nVGV4dC5tYXRjaCgvXFwkeyhbXn1dKylcXH0vZyk7XHJcblx0XHR2YXIgYXJyYXlUb2tlbkZvcm1hdHRlZERhdGUgPSBzdHJpbmdUZXh0Lm1hdGNoKC9cXCNkYXRlW14pXStcXCkvZyk7XHJcblx0XHR2YXIgYXJyYXlUb2tlbkZvcm1hdHRlZE51bWJlciA9IHN0cmluZ1RleHQubWF0Y2goL1xcI251bWJlclteKV0rXFwpL2cpO1xyXG5cdFx0dmFyIGFycmF5VG9rZW5Gb3JtYXR0ZWQgPSBbXTtcclxuXHRcdGlmIChcclxuXHRcdFx0YXJyYXlUb2tlbkZvcm1hdHRlZERhdGUgJiZcclxuXHRcdFx0YXJyYXlUb2tlbkZvcm1hdHRlZERhdGUubGVuZ3RoID4gMCAmJlxyXG5cdFx0XHRhcnJheVRva2VuRm9ybWF0dGVkTnVtYmVyICYmXHJcblx0XHRcdGFycmF5VG9rZW5Gb3JtYXR0ZWROdW1iZXIubGVuZ3RoID4gMFxyXG5cdFx0KSB7XHJcblx0XHRcdGFycmF5VG9rZW5Gb3JtYXR0ZWQgPSBhcnJheVRva2VuRm9ybWF0dGVkRGF0ZS5jb25jYXQoYXJyYXlUb2tlbkZvcm1hdHRlZE51bWJlcik7XHJcblx0XHR9IGVsc2UgaWYgKGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlICYmIGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0YXJyYXlUb2tlbkZvcm1hdHRlZCA9IGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlLnNsaWNlKCk7XHJcblx0XHR9IGVsc2UgaWYgKGFycmF5VG9rZW5Gb3JtYXR0ZWROdW1iZXIgJiYgYXJyYXlUb2tlbkZvcm1hdHRlZE51bWJlci5sZW5ndGggPiAwKSB7XHJcblx0XHRcdGFycmF5VG9rZW5Gb3JtYXR0ZWQgPSBhcnJheVRva2VuRm9ybWF0dGVkTnVtYmVyLnNsaWNlKCk7XHJcblx0XHR9XHJcblx0XHR2YXIgcmVzdWx0OiBhbnlbXSA9IFtdO1xyXG5cclxuXHRcdGlmIChhcnJheVRva2VuKSB7XHJcblx0XHRcdGZvciAoY29uc3QgdG9rZW4gb2YgYXJyYXlUb2tlbikge1xyXG5cdFx0XHRcdGxldCBrZXlUeXBlOiBudW1iZXIgPSBUb2tlblNlcnZpY2UuZ2V0S2V5VHlwZSh0b2tlbik7XHJcblx0XHRcdFx0aWYgKGtleVR5cGUgPT09IG51bGwpIHtcclxuXHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR2YXIgaW5mb1Rva2VuID0geyBrZXk6IHRva2VuLCB2YWx1ZTogdG9rZW4gfTtcclxuXHRcdFx0XHRpZiAoYXJyYXlUb2tlbkZvcm1hdHRlZCkge1xyXG5cdFx0XHRcdFx0Zm9yIChjb25zdCB0b2tlbkZvcm1hdHRlZCBvZiBhcnJheVRva2VuRm9ybWF0dGVkKSB7XHJcblx0XHRcdFx0XHRcdHZhciBpbmRleCA9IHRva2VuRm9ybWF0dGVkLmluZGV4T2YodG9rZW4pO1xyXG5cdFx0XHRcdFx0XHRpZiAoaW5kZXggPj0gMCkge1xyXG5cdFx0XHRcdFx0XHRcdGluZm9Ub2tlbi52YWx1ZSA9IHRva2VuRm9ybWF0dGVkO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJlc3VsdC5wdXNoKGluZm9Ub2tlbik7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cclxuXHRcdC8vIGxldCB0b2tlbnM6IGFueVtdID0gW107XHJcblx0XHQvLyBsZXQgaSA9IHRoaXMubmV4dFZhbGlkUG9zaXRpb25Ub2tlbnMoc3RyaW5nVGV4dCwgMCk7XHJcblx0XHQvLyBsZXQgY291bnQgPSAwO1xyXG5cdFx0Ly8gd2hpbGUgKGkgPj0gMCAmJiBjb3VudCA8PSAxMCkge1xyXG5cdFx0Ly8gICBsZXQgaW5mb1Rva2VuOiB7fSA9IG51bGw7XHJcblx0XHQvLyAgIGxldCBuZXh0STogbnVtYmVyID0gaTtcclxuXHRcdC8vICAgbGV0IGNoYXJhY3RlciA9IHN0cmluZ1RleHQuc3Vic3RyaW5nKGksIChpICsgMSkpO1xyXG5cdFx0Ly8gICBpZiAoY2hhcmFjdGVyID09IFwiJFwiKSB7XHJcblx0XHQvLyAgICAgbGV0IG5leHRDaGFyYWN0ZXIgPSBzdHJpbmdUZXh0LnN1YnN0cmluZygoaSArIDEpLCAoaSArIDIpKTtcclxuXHRcdC8vICAgICAvLyBUaGUgbmV4dCBjaGFyYWN0ZXIgbmVlZCB0byBiZSBhIHsgc2lnblxyXG5cdFx0Ly8gICAgIGlmIChuZXh0Q2hhcmFjdGVyICE9IFwie1wiKSB7XHJcblx0XHQvLyAgICAgICBpID0gdGhpcy5uZXh0VmFsaWRQb3NpdGlvblRva2VucyhzdHJpbmdUZXh0LCBuZXh0SSArIDEpO1xyXG5cdFx0Ly8gICAgICAgY29udGludWU7XHJcblx0XHQvLyAgICAgfVxyXG5cdFx0Ly8gICAgIGxldCBrZXlUb2tlbjogc3RyaW5nID0gc3RyaW5nVGV4dC5zdWJzdHJpbmcoaSwgc3RyaW5nVGV4dC5pbmRleE9mKFwifVwiLCBpKSArIDEpO1xyXG5cdFx0Ly8gICAgIC8vIElmIHRoZSB0b2tlbiBoYXZlIGEgdmFsaWQga2V5IHR5cGVcclxuXHRcdC8vICAgICBsZXQga2V5VHlwZTogbnVtYmVyID0gVG9rZW5TZXJ2aWNlLmdldEtleVR5cGUoa2V5VG9rZW4ucmVwbGFjZShcIntcIiwgXCJcIikucmVwbGFjZShcIn1cIiwgXCJcIikpO1xyXG5cdFx0Ly8gICAgIGlmIChrZXlUeXBlID09PSBudWxsKSB7XHJcblx0XHQvLyAgICAgICBpID0gdGhpcy5uZXh0VmFsaWRQb3NpdGlvblRva2VucyhzdHJpbmdUZXh0LCBuZXh0SSArIDEpO1xyXG5cdFx0Ly8gICAgICAgY29udGludWU7XHJcblx0XHQvLyAgICAgfVxyXG5cdFx0Ly8gICAgIGluZm9Ub2tlbiA9IHtcclxuXHRcdC8vICAgICAgIGtleToga2V5VG9rZW4sXHJcblx0XHQvLyAgICAgICB2YWx1ZToga2V5VG9rZW5cclxuXHRcdC8vICAgICB9O1xyXG5cdFx0Ly8gICAgIG5leHRJID0gc3RyaW5nVGV4dC5pbmRleE9mKFwifVwiLCBpKTtcclxuXHRcdC8vICAgfSBlbHNlIHtcclxuXHRcdC8vICAgICBsZXQgbmV4dFNpZ246IG51bWJlciA9IHN0cmluZ1RleHQuaW5kZXhPZihcIiRcIiwgaSk7XHJcblx0XHQvLyAgICAgLy8gV2UgaW5seSBzdXBwb3J0ICNkYXRlKCQgYW5kICNudW1iZXIoJCBpbiB0aGlzIDIgc2NlbmFyaW9zIHRoZSBsZW5naHQgY2FuJ3QgYmUgbW9yZSB0aGFuIDEwIGNoYXJhY3RlcnNcclxuXHRcdC8vICAgICBpZiAobmV4dFNpZ24gPCAwIHx8IChuZXh0U2lnbiAtIGkpID4gMTApIHtcclxuXHRcdC8vICAgICAgIGkgPSB0aGlzLm5leHRWYWxpZFBvc2l0aW9uVG9rZW5zKHN0cmluZ1RleHQsIG5leHRJICsgMSk7XHJcblx0XHQvLyAgICAgICBjb250aW51ZTtcclxuXHRcdC8vICAgICB9XHJcblx0XHQvLyAgICAgbGV0IGtleVRva2VuOiBzdHJpbmcgPSBzdHJpbmdUZXh0LnN1YnN0cmluZyhzdHJpbmdUZXh0LmluZGV4T2YoXCIkXCIsIGkpLCBzdHJpbmdUZXh0LmluZGV4T2YoXCJ9XCIsIGkpICsgMSk7XHJcblx0XHQvLyAgICAgbGV0IHZhbHVlVG9rZW46IHN0cmluZyA9IHN0cmluZ1RleHQuc3Vic3RyaW5nKGksIHN0cmluZ1RleHQuaW5kZXhPZihcIilcIiwgaSkgKyAxKTtcclxuXHRcdC8vICAgICBpbmZvVG9rZW4gPSB7XHJcblx0XHQvLyAgICAgICBrZXk6IGtleVRva2VuLFxyXG5cdFx0Ly8gICAgICAgdmFsdWU6IHZhbHVlVG9rZW5cclxuXHRcdC8vICAgICB9O1xyXG5cdFx0Ly8gICAgIG5leHRJID0gc3RyaW5nVGV4dC5pbmRleE9mKFwiKVwiLCBpKTtcclxuXHRcdC8vICAgfVxyXG5cdFx0Ly8gICB0b2tlbnMucHVzaChpbmZvVG9rZW4pO1xyXG5cdFx0Ly8gICBpID0gdGhpcy5uZXh0VmFsaWRQb3NpdGlvblRva2VucyhzdHJpbmdUZXh0LCBuZXh0SSk7XHJcblx0XHQvLyAgIGNvdW50Kys7XHJcblx0XHQvLyB9XHJcblx0XHQvLyByZXR1cm4gdG9rZW5zO1xyXG5cdH1cclxuXHJcblx0bmV4dFZhbGlkUG9zaXRpb25Ub2tlbnMoc3RyaW5nVGV4dDogc3RyaW5nLCBuZXh0STogbnVtYmVyKTogbnVtYmVyIHtcclxuXHRcdGxldCB0b2tlbkRvbGxhclNpZ246IG51bWJlciA9IHN0cmluZ1RleHQuaW5kZXhPZignJCcsIG5leHRJKTtcclxuXHRcdGxldCB0b2tlbk51bVNpZ246IG51bWJlciA9IHN0cmluZ1RleHQuaW5kZXhPZignIycsIG5leHRJKTtcclxuXHRcdGxldCBpOiBudW1iZXIgPVxyXG5cdFx0XHR0b2tlbkRvbGxhclNpZ24gPCAwICYmIHRva2VuTnVtU2lnbiA+PSAwXHJcblx0XHRcdFx0PyB0b2tlbk51bVNpZ25cclxuXHRcdFx0XHQ6IHRva2VuTnVtU2lnbiA8IDAgJiYgdG9rZW5Eb2xsYXJTaWduID49IDBcclxuXHRcdFx0XHQ/IHRva2VuRG9sbGFyU2lnblxyXG5cdFx0XHRcdDogdG9rZW5Eb2xsYXJTaWduIDwgdG9rZW5OdW1TaWduXHJcblx0XHRcdFx0PyB0b2tlbkRvbGxhclNpZ25cclxuXHRcdFx0XHQ6IHRva2VuTnVtU2lnbjtcclxuXHRcdHJldHVybiBpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSXQgcmV1c2VzIHJlcGxhY2VUb2tlbnNGcm9tTGlzdE9iamVjdFB1YmxpYyBidXQgc2V0IGFsbCBrZXlzIGxvYmplY3R0b2tlbnMgYXMgbG93ZXJjYXNlXHJcblx0ICogQHBhcmFtIHRva2VuTmFtZVxyXG5cdCAqIEBwYXJhbSBmb3JtdWxhXHJcblx0ICogQHBhcmFtIGxPYmplY3RUb2tlbnNcclxuXHQgKi9cclxuXHRyZXBsYWNlVG9rZW5zRnJvbUxpc3RPYmplY3RQdWJsaWMoXHJcblx0XHR0b2tlbk5hbWU6IHN0cmluZyxcclxuXHRcdGZvcm11bGE6IHN0cmluZyxcclxuXHRcdGxPYmplY3RUb2tlbnM6IGFueVtdXHJcblx0KTogc3RyaW5nIHtcclxuXHRcdGxldCBsRGF0YU9yZzogYW55W10gPSBbXTtcclxuXHRcdGlmIChsT2JqZWN0VG9rZW5zKSB7XHJcblx0XHRcdGZvciAobGV0IGRhdGFGb3JtIGluIGxPYmplY3RUb2tlbnMpIHtcclxuXHRcdFx0XHRsRGF0YU9yZ1tkYXRhRm9ybS50b0xvd2VyQ2FzZSgpXSA9IGxPYmplY3RUb2tlbnNbZGF0YUZvcm1dO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdGhpcy5yZXBsYWNlVG9rZW5zRnJvbUxpc3RPYmplY3QodG9rZW5OYW1lLCBmb3JtdWxhLCBsRGF0YU9yZyk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIEBwYXJhbSB0b2tlbk5hbWUgdG9rZW4gbmFtZVxyXG5cdCAqIEBwYXJhbSBmb3JtdWxhIFN0cmluZyB3aXRoIHRoZSBmb3JtdWxhIHRvIGV4ZWN1dGVcclxuXHQgKiBAcGFyYW0gbE9iamVjdFRva2VucyBMaXN0IG9mIHRva2VucyB3aXRoIHRoZSB2YWx1ZXMgdG8gcmVwbGFjZVxyXG5cdCAqL1xyXG5cdHJlcGxhY2VUb2tlbnNGcm9tTGlzdE9iamVjdCh0b2tlbk5hbWU6IHN0cmluZywgZm9ybXVsYTogc3RyaW5nLCBsT2JqZWN0VG9rZW5zOiBhbnkpOiBzdHJpbmcge1xyXG5cdFx0aWYgKCFmb3JtdWxhIHx8IGZvcm11bGEubGVuZ3RoID09IDApIHtcclxuXHRcdFx0dGhyb3cge1xyXG5cdFx0XHRcdG1lc3NhZ2U6ICdMYSBmb3JtdWxhIGRlbCB0b2tlbiAnICsgdG9rZW5OYW1lICsgJyBlc3RhIHZhY8OtYScsXHJcblx0XHRcdFx0dGl0bGU6ICdBbGVydGEhJyxcclxuXHRcdFx0XHRlcnJvcjpcclxuXHRcdFx0XHRcdCdMYSBmb3JtdWxhIGRlbCB0b2tlbiAnICsgdG9rZW5OYW1lICsgJyBlc3RhIHZhY8OtYS4gW2Zvcm11bGFbJyArIGZvcm11bGEgKyAnXV0nXHJcblx0XHRcdH07XHJcblx0XHR9XHJcblx0XHRsZXQgcmVwbGFjZWRUb2tlbnM6IHN0cmluZyA9IGZvcm11bGEudG9TdHJpbmcoKTtcclxuXHRcdGlmIChyZXBsYWNlZFRva2Vucy5zdGFydHNXaXRoKCdmaWxlOi8vJykpIHtcclxuXHRcdFx0cmV0dXJuIHJlcGxhY2VkVG9rZW5zO1xyXG5cdFx0fVxyXG5cdFx0Ly8gRmluZCB0aGUgdG9rZW5zIGluIHRoZSBmb3JtdWxhXHJcblx0XHRsZXQgdG9rZW5zQXJyYXk6IGFueVtdID0gdGhpcy5nZXRMaXN0VG9rZW5zQnlTdHJpbmcocmVwbGFjZWRUb2tlbnMpO1xyXG5cdFx0aWYgKHRva2Vuc0FycmF5Lmxlbmd0aCA9PSAwKSB7XHJcblx0XHRcdHJldHVybiByZXBsYWNlZFRva2VucztcclxuXHRcdH1cclxuXHRcdC8vIElmIHRoZXJlIGFueSB0b2tlbiwgdHJ5IHRvIHJlcGxhY2VcclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdG9rZW5zQXJyYXkubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0bGV0IG9iamVjdFRva2VuID1cclxuXHRcdFx0XHRsT2JqZWN0VG9rZW5zW3Rva2Vuc0FycmF5W2ldLmtleV0gIT09IHVuZGVmaW5lZFxyXG5cdFx0XHRcdFx0PyBsT2JqZWN0VG9rZW5zW3Rva2Vuc0FycmF5W2ldLmtleV1cclxuXHRcdFx0XHRcdDogbnVsbDtcclxuXHRcdFx0bGV0IGNsZWFyS2V5O1xyXG5cdFx0XHRpZiAob2JqZWN0VG9rZW4gPT0gbnVsbCkge1xyXG5cdFx0XHRcdGNsZWFyS2V5ID0gdG9rZW5zQXJyYXlbaV0ua2V5LnJlcGxhY2UoJyR7JywgJycpLnJlcGxhY2UoJ30nLCAnJykudG9Mb3dlckNhc2UoKTtcclxuXHRcdFx0XHRvYmplY3RUb2tlbiA9XHJcblx0XHRcdFx0XHRsT2JqZWN0VG9rZW5zW2NsZWFyS2V5XSAhPT0gdW5kZWZpbmVkID8gbE9iamVjdFRva2Vuc1tjbGVhcktleV0gOiBudWxsO1xyXG5cclxuXHRcdFx0XHRpZiAob2JqZWN0VG9rZW4gPT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0Y2xlYXJLZXkgPSB0b2tlbnNBcnJheVtpXS5rZXlcclxuXHRcdFx0XHRcdFx0LnJlcGxhY2UoJ3snLCAnJylcclxuXHRcdFx0XHRcdFx0LnJlcGxhY2UoJ30nLCAnJylcclxuXHRcdFx0XHRcdFx0LnNwbGl0KCdfJylbMV1cclxuXHRcdFx0XHRcdFx0LnRvTG93ZXJDYXNlKCk7XHJcblx0XHRcdFx0XHRvYmplY3RUb2tlbiA9XHJcblx0XHRcdFx0XHRcdGxPYmplY3RUb2tlbnNbY2xlYXJLZXldICE9PSB1bmRlZmluZWQgPyBsT2JqZWN0VG9rZW5zW2NsZWFyS2V5XSA6IG51bGw7XHJcblx0XHRcdFx0XHRpZiAob2JqZWN0VG9rZW4gPT09IG51bGwgfHwgb2JqZWN0VG9rZW4gPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBhcnJheUtleSA9IHRva2Vuc0FycmF5W2ldLmtleVxyXG5cdFx0XHRcdFx0XHRcdC5yZXBsYWNlKCd7JywgJycpXHJcblx0XHRcdFx0XHRcdFx0LnJlcGxhY2UoJ30nLCAnJylcclxuXHRcdFx0XHRcdFx0XHQuc3BsaXQoJ18nKVsxXVxyXG5cdFx0XHRcdFx0XHRcdC5zcGxpdCgnLicpO1xyXG5cdFx0XHRcdFx0XHRpZiAoYXJyYXlLZXkubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0XHRcdGxldCB2YWx1ZSA9IGxPYmplY3RUb2tlbnM7XHJcblx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFycmF5S2V5Lmxlbmd0aDsgaW5kZXgrKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0bGV0IGVsZW1lbnQgPSBhcnJheUtleVtpbmRleF07XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoaW5kZXggPT0gMCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRlbGVtZW50ID0gZWxlbWVudC50b0xvd2VyQ2FzZSgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZVtlbGVtZW50XTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0b2JqZWN0VG9rZW4gPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAob2JqZWN0VG9rZW4gPT0gbnVsbCkge1xyXG5cdFx0XHRcdC8vIElmIG5vdCBmaW5kIHRoZSB0b2tlbiwgYnkgZGVmYXVsdCBwdXQgYW4gZW1wdHkgc3RyaW5nXHJcblx0XHRcdFx0LyppZiAoVG9rZW5TZXJ2aWNlLmV4Y2x1ZGVkVG9rZW4uaW5kZXhPZihjbGVhcktleSkgPT09IC0xKSB7XHJcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKFxyXG5cdFx0XHRcdFx0XHQnRWwgdG9rZW4gJyArIHRva2Vuc0FycmF5W2ldLnZhbHVlICsgJyBubyBmdWUgZW5jb250cmFkby4nLFxyXG5cdFx0XHRcdFx0XHRsT2JqZWN0VG9rZW5zLFxyXG5cdFx0XHRcdFx0XHR0b2tlbnNBcnJheVxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHR9Ki9cclxuXHRcdFx0XHRvYmplY3RUb2tlbiA9ICcnO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChvYmplY3RUb2tlbiAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBsZXQgdmFsdWU6IGFueSA9IE51bWJlcihvYmplY3RUb2tlbilcclxuICAgICAgICAgICAgICAgIC8vIFx0PyBvYmplY3RUb2tlblxyXG4gICAgICAgICAgICAgICAgLy8gXHQ6IEFycmF5LmlzQXJyYXkob2JqZWN0VG9rZW4pXHJcbiAgICAgICAgICAgICAgICAvLyBcdD8gSlNPTi5zdHJpbmdpZnkob2JqZWN0VG9rZW4pXHJcbiAgICAgICAgICAgICAgICAvLyBcdDogXCInXCIgKyBvYmplY3RUb2tlbiArIFwiJ1wiO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdG9rZW5MaXRlcmFsID0gdG9rZW5zQXJyYXlbaV0udmFsdWU7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwb3MgPSByZXBsYWNlZFRva2Vucy5pbmRleE9mKHRva2VuTGl0ZXJhbCk7XHJcbiAgICAgICAgICAgICAgICAvL01hbnRpcyAgMTE2NDlcclxuICAgICAgICAgICAgICAgIGNvbnN0IHF1b3RlQ3R4ID0gdGhpcy5nZXRRdW90ZUNvbnRleHQocmVwbGFjZWRUb2tlbnMsIHBvcyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlc2NhcGVGb3JKcyA9IChzLCBjdHgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdCA9IFN0cmluZyhzID8/ICcnKTtcclxuICAgICAgICAgICAgICAgICAgICB0ID0gdC5yZXBsYWNlKC9cXFxcL2csICdcXFxcXFxcXCcpOyAvLyBiYWNrc2xhc2hlc1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjdHggPT09ICdkb3VibGUnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ID0gdC5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN0eCA9PT0gJ3NpbmdsZScpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0LnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBpZiAocXVvdGVDdHgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByYXcgPSBlc2NhcGVGb3JKcyhvYmplY3RUb2tlbiwgcXVvdGVDdHgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkVG9rZW5zID0gdGhpcy5yZXBsYWNlVG9rZW4ocmVwbGFjZWRUb2tlbnMsIHRva2VuTGl0ZXJhbCwgcmF3KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoTnVtYmVyKG9iamVjdFRva2VuKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IE51bWJlcihvYmplY3RUb2tlbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0VG9rZW4pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gQXJyYXkuaXNBcnJheShvYmplY3RUb2tlbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEpTT04uc3RyaW5naWZ5KG9iamVjdFRva2VuKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG9iamVjdFRva2VuLm9yaWdpbmFsX25hbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ1wiJyArIG9iamVjdFRva2VuLm9yaWdpbmFsX25hbWUgKyAnXCInXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEpTT04uc3RyaW5naWZ5KG9iamVjdFRva2VuKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gJ1wiJyArIG9iamVjdFRva2VuICsgJ1wiJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmVwbGFjZWRUb2tlbnMgPSB0aGlzLnJlcGxhY2VUb2tlbihyZXBsYWNlZFRva2VucywgdG9rZW5MaXRlcmFsLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gICBjb25zb2xlLmVycm9yKGxPYmplY3RUb2tlbnMsIHRva2Vuc0FycmF5KTtcclxuICAgICAgICAgICAgICAgIC8vICAgdGhyb3cge1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIG1lc3NhZ2U6IFwiTm8gc2UgZW5jb250csOzIHZhbG9yIHBhcmEgdW4gdG9rZW5cIixcclxuICAgICAgICAgICAgICAgIC8vICAgICB0aXRsZTogXCJBbGVydGEhXCIsXHJcbiAgICAgICAgICAgICAgICAvLyAgICAgZXJyb3I6IFwiRWwgdG9rZW4gXCIgKyB0b2tlbnNBcnJheVtpXS52YWx1ZSArIFwiIG5vIGZ1ZSBlbmNvbnRyYWRvLlwiXHJcbiAgICAgICAgICAgICAgICAvLyAgIH07XHJcbiAgICAgICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICAgICAgLy8gU2kgZXMgbGEgdWx0aW1hIGl0ZXJhY2lvbiB5IGxhIGZvcm11bGEgdGllbmUgWyBlcyBwb3JxdWUgdGllbmUgdW4gYXJyYXkgZW4gZWwgdmFsb3IgcXVlIHJlc29sdmlvIGVsIHRva2VuXHJcbiAgICAgICAgICAgICAgICBpZiAoaSA9PSB0b2tlbnNBcnJheS5sZW5ndGggLSAxICYmIHJlcGxhY2VkVG9rZW5zLmluY2x1ZGVzKCdbJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBTZSBwb25lbiB0b2RvcyBsb3Mgb3BlcmFuZG9zIGNvbW8gZWxlbWVudG9zIGVuIHVuIGFycmF5IFsnZXhwcmVzaW9uIGEnLCAnJiYnLCAnRXhwcmVzaW9uIEInXVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBmb3JtRXhwcmVzc2lvbnMgPSByZXBsYWNlZFRva2Vucy5zcGxpdCgvIChcXHxcXHx8JiYpIC8pO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBsQXV4Zm9ybUV4cHJlc3Npb24gPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICBmb3JtRXhwcmVzc2lvbnMuZm9yRWFjaCgoZXhwcmVzc2lvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwcmVzc2lvbi5jaGFyQXQoMCkgPT0gJ1snKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNUYWdGb3VuZCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUYWdGb3VuZCA9IHRoaXMuZmluZFRhZyhleHByZXNzaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxBdXhmb3JtRXhwcmVzc2lvbi5wdXNoKGlzVGFnRm91bmQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbEF1eGZvcm1FeHByZXNzaW9uLnB1c2goZXhwcmVzc2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZXBsYWNlZFRva2VucyA9IGxBdXhmb3JtRXhwcmVzc2lvbi5qb2luKCcgJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlcGxhY2VkVG9rZW5zO1xyXG5cdH1cclxuXHJcblx0Z2V0UXVvdGVDb250ZXh0KHNyYywgaWR4KSB7XHJcbiAgICAgICAgbGV0IGluRG91YmxlID0gZmFsc2UsIGluU2luZ2xlID0gZmFsc2UsIGVzYyA9IGZhbHNlO1xyXG4gICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgaWR4OyBrKyspIHtcclxuICAgICAgICAgICAgY29uc3QgY2ggPSBzcmNba107XHJcbiAgICAgICAgICAgIGlmIChlc2MpIHtcclxuICAgICAgICAgICAgICAgIGVzYyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGNoID09PSAnXFxcXCcpIHtcclxuICAgICAgICAgICAgICAgIGVzYyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY2ggPT09ICdcIicgJiYgIWluU2luZ2xlKVxyXG4gICAgICAgICAgICAgICAgaW5Eb3VibGUgPSAhaW5Eb3VibGU7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGNoID09PSBcIidcIiAmJiAhaW5Eb3VibGUpXHJcbiAgICAgICAgICAgICAgICBpblNpbmdsZSA9ICFpblNpbmdsZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGluRG91YmxlID8gJ2RvdWJsZScgOiBpblNpbmdsZSA/ICdzaW5nbGUnIDogbnVsbDtcclxuICAgIH1cclxuXHJcblx0LyoqXHJcblx0ICogTUV0b2RvIHF1ZSB0ZW5pZW5kbyB1bmEgZXhwcmVzaW9uIGRlIGxhIGZvcm1hIFsndGFnMScsICd0YWcyJ109PXRhZzNcclxuXHQgKiBldmFsdWEgc2kgdGFnMyBoYWNlIHBhcnRlIGRlbCBhcnJheSBzaSB0aWVuZSBlbCBvcGVyYWRvciA9PS5cclxuXHQgKiBTaSB0aWVuZSBlbCBvcGVyYWRvciAhPSBleGFtaW5hIHF1ZSB0YWczIG5vIGhhZ2EgcGFydGUgZGVsIGFycmF5K1xyXG5cdCAqXHJcblx0ICogQHBhcmFtIGV4cHJlc3Npb24gT3BlcmFuZG8gcXVlIGV2YWx1YSB0YWcuIEVzIGRlIGxhIGZvcm1hIFsndGFnMScsICd0YWcyJ109PXRhZzNcclxuXHQgKiBAcmV0dXJucyBSZXRvcm5hICd0cnVlJyBvICdmYWxzZScgZW4gc3RyaW5nIHF1ZSBkZXNwdWVzIHNlcmEgcGFzYWRvIGEgdW4gZXZhbCgpXHJcblx0ICogbWFzIGFkZWxhbnRlIGVuIGVsIGZsdWpvXHJcblx0ICovXHJcblx0ZmluZFRhZyhleHByZXNzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cdFx0bGV0IHJlZ2V4T3BlcmF0b3IgPSBuZXcgUmVnRXhwKCcoPT09fD09fCE9PXwhPSknKTtcclxuXHRcdC8vIFJldG9ybmEgZWwgb3BlcmFkb3JcclxuXHRcdGxldCBvcGVyYXRvcjogc3RyaW5nW10gPSBleHByZXNzaW9uLm1hdGNoKHJlZ2V4T3BlcmF0b3IpO1xyXG5cdFx0Ly8gU2kgbm8gZW5jdWVudHJhIHVuIG9wZXJhZG9yIHNlZ3VuIGVsIHBhdHJvbiByZXRvcm5hICdmYWxzZSdcclxuXHRcdC8vIHBhcmEgZXZpdGFyIHJlc3VsdGFkb3MgaW5lc3BlcmFkb3NcclxuXHRcdGlmIChvcGVyYXRvciA9PSBudWxsKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoJ05vIHNlIGVuY29udHJvIHVuIG9wZXJhZG9yIHBlcm1pdGlkbyBwYXJhIGxhIGV4cHJlc2lvbicpO1xyXG5cdFx0XHRyZXR1cm4gJ2ZhbHNlJztcclxuXHRcdH1cclxuXHRcdC8vIFNlcGFyYSBsYSBzZW50ZW5jaWEgcG9yIGVsIG9wZXJhZG9yXHJcblx0XHQvLyBMYSBwcmltZXJhIHBhcnRlIGVzIGVsIHZhbG9yIHBvciBlbCBjdWFsIHNlIHJlbXBsYXphIGVsIHRva2VuIHF1ZSBlcyB1biBhcnJheSBlbiBzdHJpbmcgXCJbJ2EnLCAnYiddXCJcclxuXHRcdC8vIEVsIHNlZ3VuZG8gZXMgZWwgdmFsb3IgY29uIGVsIGN1YWwgc2UgdmEgYSBjb21wYXJhclxyXG5cdFx0bGV0IHZhbHVlVG9rZW4sIHZhbHVlVG9Db21wYXJlO1xyXG5cdFx0W3ZhbHVlVG9rZW4sIHZhbHVlVG9Db21wYXJlXSA9IGV4cHJlc3Npb24uc3BsaXQob3BlcmF0b3JbMF0pO1xyXG5cdFx0Ly8gU2UgbGltcGlhIGVsIHN0cmluZyBjb3JyZXNwb25kaWVudGUgYWwgYXJyYXkgcGFyYSBxdWUgbG9zIGVsZW1lbnRvcyBxdWVkZW4gc2VwYXJhZG9zIHBvciBcIixcIlxyXG5cdFx0dmFsdWVUb2tlbiA9IHZhbHVlVG9rZW4ucmVwbGFjZSgvW15hLXpBLVowLTkgLF0vZywgJycpO1xyXG5cdFx0Ly8gU2kgbm8gaGF5IHRhZ3MgYXNvY2lhZG9zIGFsIHJlZ2lzdHJvIHNlIGRldnVlbHZlICdmYWxzZSdcclxuXHRcdGlmICghdmFsdWVUb2tlbikge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKCdObyBoYXkgdGFncyBhc29jaWFkb3MgYSBlc3RhIGFwbGljYWNpw7NuJyk7XHJcblx0XHRcdHJldHVybiAnZmFsc2UnO1xyXG5cdFx0fVxyXG5cdFx0Ly8gU2UgbGltcGlhIGVsIHN0cmluZyBjb3JyZXNwb25kaWVudGUgYWwgdmFsb3IgcG9yIGNvbXBhcmFyXHJcblx0XHR2YWx1ZVRvQ29tcGFyZSA9IHZhbHVlVG9Db21wYXJlLnJlcGxhY2UoL1teYS16QS1aMC05IF0vZywgJycpO1xyXG5cdFx0Ly8gRWwgc3RyaW5nIGNvcnJlc3BvbmRpZW50ZSBhbCBhcnJheSBwYXNhIGEgc2VyIHRpcG8gYXJyYXlcclxuXHRcdHZhbHVlVG9rZW4gPSB2YWx1ZVRva2VuLnNwbGl0KCcsJyk7XHJcblxyXG5cdFx0Ly8gU2UgdHJhdGEgZGUgY29uc3RhdGFyIHNpIGVsIHZhbG9yIGEgY29tcGFyYXIgc2UgZW5jdWV0cmEgbyBubyBkZW50cm9cclxuXHRcdC8vIFNpIGVsIG9wZXJhZG9yIHF1ZSBzZSBlbmNvbnRybyA9PSByZXR1cm5hIHRydWUgc2kgbG8gZW5jdWVudHJhXHJcblx0XHRsZXQgaXNUYWdGb3VuZDogYm9vbGVhbiA9IHRydWU7XHJcblx0XHRzd2l0Y2ggKG9wZXJhdG9yWzBdKSB7XHJcblx0XHRcdGNhc2UgJz09JzpcclxuXHRcdFx0XHRpc1RhZ0ZvdW5kID0gdmFsdWVUb2tlbi5zb21lKCh0YWcpID0+IHRhZyA9PSB2YWx1ZVRvQ29tcGFyZSk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgJz09PSc6XHJcblx0XHRcdFx0aXNUYWdGb3VuZCA9IHZhbHVlVG9rZW4uc29tZSgodGFnKSA9PiB0YWcgPT09IHZhbHVlVG9Db21wYXJlKTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSAnIT09JzpcclxuXHRcdFx0XHRpc1RhZ0ZvdW5kID0gdmFsdWVUb2tlbi5zb21lKCh0YWcpID0+IHRhZyAhPT0gdmFsdWVUb0NvbXBhcmUpO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlICchPSc6XHJcblx0XHRcdFx0aXNUYWdGb3VuZCA9IHZhbHVlVG9rZW4uc29tZSgodGFnKSA9PiB0YWcgIT0gdmFsdWVUb0NvbXBhcmUpO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0fVxyXG5cdFx0ZXhwcmVzc2lvbiA9IGlzVGFnRm91bmQgPyAndHJ1ZScgOiAnZmFsc2UnO1xyXG5cdFx0cmV0dXJuIGV4cHJlc3Npb247XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUcnkgdG8gZXZhbCB0aGUgZm9ybXVsYSBkZXBlbmQgb2YgdGhlIHR5cGUgb2YgZmllbGRzLlxyXG5cdCAqIEBwYXJhbSBsU3RhdGljVG9rZW5cclxuXHQgKiBAcGFyYW0gZm9ybXVsYU5hbWVcclxuXHQgKiBAcGFyYW0gZm9ybXVsYVxyXG5cdCAqL1xyXG5cdHZhbGlkYXRlRm9ybXVsYShsU3RhdGljVG9rZW46IGFueSwgZm9ybXVsYU5hbWU6IHN0cmluZywgZm9ybXVsYTogc3RyaW5nKTogYm9vbGVhbiB7XHJcblx0XHRsZXQgZXZhbEZvcm11bGE6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRcdC8vIFRvIHZhbGlkYXRlIHRoZSBmb3JtdWxhLCBmaXJzdCBvcmdhbml6ZSB0aGUgaW5mbyB0byBrZXkgLSB2YWx1ZSBhcnJheVxyXG5cdFx0bGV0IG9iamVjdFRva2VuczogYW55W10gPSBbXTtcclxuXHRcdGZvciAobGV0IHBhbmVsIG9mIGxTdGF0aWNUb2tlbikge1xyXG5cdFx0XHRmb3IgKGxldCBncm91cFRva2VuIG9mIHBhbmVsLnZhbHVlKSB7XHJcblx0XHRcdFx0Zm9yIChsZXQgc3RhdGljVG9rZW4gb2YgZ3JvdXBUb2tlbi52YWx1ZSkge1xyXG5cdFx0XHRcdFx0Zm9yIChsZXQgYXJyYXlUb2tlbkluZm8gb2Ygc3RhdGljVG9rZW4pIHtcclxuXHRcdFx0XHRcdFx0b2JqZWN0VG9rZW5zW2FycmF5VG9rZW5JbmZvLmtleV0gPSBhcnJheVRva2VuSW5mby5vYmplY3RcclxuXHRcdFx0XHRcdFx0XHQ/IGFycmF5VG9rZW5JbmZvLm9iamVjdC50eXBlID09ICdudW1iZXInXHJcblx0XHRcdFx0XHRcdFx0XHQ/ICcwJ1xyXG5cdFx0XHRcdFx0XHRcdFx0OiAnJ1xyXG5cdFx0XHRcdFx0XHRcdDogJyc7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHR0cnkge1xyXG5cdFx0XHRmb3JtdWxhID0gdGhpcy5yZXBsYWNlVG9rZW5zRnJvbUxpc3RPYmplY3QoZm9ybXVsYU5hbWUsIGZvcm11bGEsIG9iamVjdFRva2Vucyk7XHJcblx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHQvL2NvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG5cdFx0XHR0aHJvdyBlcnJvcjtcclxuXHRcdH1cclxuXHRcdGlmIChmb3JtdWxhICE9PSBudWxsKSB7XHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0bGV0IHJlc3VsdCA9IGZvcm11bGEuc3RhcnRzV2l0aCgnZmlsZTovLycpID8gZm9ybXVsYSA6IGV2YWwoZm9ybXVsYSk7XHJcblx0XHRcdFx0ZXZhbEZvcm11bGEgPSB0cnVlO1xyXG5cdFx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdFx0Ly9jb25zb2xlLmVycm9yKFwiRXJyb3IgZXZhbHVhdGluZyB0aGUgZm9ybXVsYVwiLCBlKTtcclxuXHRcdFx0XHR0aHJvdyB7XHJcblx0XHRcdFx0XHRtZXNzYWdlOiAnTGEgZm9ybXVsYSBubyBmdWUgcG9zaWJsZSBldmFsdWFyJyxcclxuXHRcdFx0XHRcdHRpdGxlOiAnQWxlcnRhIScsXHJcblx0XHRcdFx0XHRlcnJvcjogZVxyXG5cdFx0XHRcdH07XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBldmFsRm9ybXVsYTtcclxuXHR9XHJcblxyXG5cdGdldENvbmZpZ0Nsb25pbmdUb2tlbk1hcChvbGRQUFA6IG51bWJlciwgbmV3UFBQOiBudW1iZXIpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoXHJcblx0XHRcdHRoaXMuZW52aXJvbm1lbnQuaG9zdC5iYWNrZW5kLmNvbmZpZ3VyYXRpb24gKyAndG9rZW4vZ2V0Q29uZmlnQ2xvbmluZ1Rva2VuTWFwJyxcclxuXHRcdFx0e1xyXG5cdFx0XHRcdHBhcmFtczogbmV3IEh0dHBQYXJhbXMoKVxyXG5cdFx0XHRcdFx0LnNldCgnb2xkUFBQJywgb2xkUFBQLnRvU3RyaW5nKCkpXHJcblx0XHRcdFx0XHQuc2V0KCduZXdQUFAnLCBuZXdQUFAudG9TdHJpbmcoKSlcclxuXHRcdFx0fVxyXG5cdFx0KTtcclxuXHR9XHJcbn1cclxuIl19
|