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.
Files changed (226) hide show
  1. package/esm2022/lib/components/backoffice.commons.component.mjs +41 -0
  2. package/esm2022/lib/components/common.lists.component.mjs +177 -0
  3. package/esm2022/lib/components/configuration-token/configuration-token-subject.service.mjs +23 -0
  4. package/esm2022/lib/components/configuration-token/configuration-token.component.mjs +665 -0
  5. package/esm2022/lib/components/configuration-token/guarantee-token/guarantee-token.component.mjs +103 -0
  6. package/esm2022/lib/components/configuration-token/snapshot-token/snapshot-token.component.mjs +108 -0
  7. package/esm2022/lib/components/configuration.commons.component.mjs +41 -0
  8. package/esm2022/lib/components/dashboard.commons.component.mjs +85 -0
  9. package/esm2022/lib/components/dynamic-filter/dynamic-filter.component.mjs +131 -0
  10. package/esm2022/lib/components/excel-to-json/excel-to-json.component.mjs +54 -0
  11. package/esm2022/lib/components/frontoffice.commons.component.mjs +89 -0
  12. package/esm2022/lib/components/pdf-analyzer/pdf-analyzer.component.mjs +162 -0
  13. package/esm2022/lib/components/pdf-config/pdf-config.component.mjs +170 -0
  14. package/esm2022/lib/components/pdf-generator/pdf-generator.component.mjs +207 -0
  15. package/esm2022/lib/components/pdf-merge-visualizer/pdf-merge-visualizer.component.mjs +307 -0
  16. package/esm2022/lib/components/pdf-visualizer/pdf-visualizer.component.mjs +387 -0
  17. package/esm2022/lib/components/progress-bar/progress-bar.component.mjs +92 -0
  18. package/esm2022/lib/components/segmentation-tokens/segmentation-tokens.component.mjs +199 -0
  19. package/esm2022/lib/components/select-ppp/select-ppp.component.mjs +200 -0
  20. package/esm2022/lib/components/show-hide-columns/show-hide-columns-table.component.mjs +116 -0
  21. package/esm2022/lib/components/token/token.component.mjs +1047 -0
  22. package/esm2022/lib/components/tokens-calculator/tokens-calculator.component.mjs +128 -0
  23. package/esm2022/lib/directives/currency-colfuturo-formatter.directive.mjs +48 -0
  24. package/esm2022/lib/directives/currency-decimal-colfuturo-formatter.directive.mjs +35 -0
  25. package/esm2022/lib/ng-pli-commons.module.mjs +385 -0
  26. package/esm2022/lib/ng-pli-commons.service.mjs +14 -0
  27. package/esm2022/lib/pipes/currency-colfuturo.pipe.mjs +36 -0
  28. package/esm2022/lib/pipes/currency-decimal-colfuturo.pipe.mjs +39 -0
  29. package/esm2022/lib/pipes/currency-print-colfuturo.pipe.mjs +34 -0
  30. package/esm2022/lib/pipes/thousands.pipe.mjs +61 -0
  31. package/esm2022/lib/services/application-fill-percentage.service.mjs +30 -0
  32. package/esm2022/lib/services/application-pdf-form.service.mjs +27 -0
  33. package/esm2022/lib/services/application-tag.service.mjs +56 -0
  34. package/esm2022/lib/services/application.service.mjs +253 -0
  35. package/esm2022/lib/services/assign-task.service.mjs +30 -0
  36. package/esm2022/lib/services/authentication.service.mjs +133 -0
  37. package/esm2022/lib/services/blocked-beneficiary.service.mjs +42 -0
  38. package/esm2022/lib/services/budget-application.service.mjs +265 -0
  39. package/esm2022/lib/services/budget-setup.service.mjs +26 -0
  40. package/esm2022/lib/services/budget-simulation.service.mjs +65 -0
  41. package/esm2022/lib/services/budget.service.mjs +205 -0
  42. package/esm2022/lib/services/closure-wallet.service.mjs +39 -0
  43. package/esm2022/lib/services/cnf-correspondence-document-manager.service.mjs +39 -0
  44. package/esm2022/lib/services/codebtors.service.mjs +28 -0
  45. package/esm2022/lib/services/committee-assistant.service.mjs +55 -0
  46. package/esm2022/lib/services/committee-money.service.mjs +44 -0
  47. package/esm2022/lib/services/committee-pdf.service.mjs +27 -0
  48. package/esm2022/lib/services/committee-snapshot.service.mjs +60 -0
  49. package/esm2022/lib/services/common-info.service.mjs +51 -0
  50. package/esm2022/lib/services/common.service.mjs +285 -0
  51. package/esm2022/lib/services/configuration-document.service.mjs +297 -0
  52. package/esm2022/lib/services/configuration-minisite.service.mjs +26 -0
  53. package/esm2022/lib/services/configuration.service.mjs +53 -0
  54. package/esm2022/lib/services/correspondence-document-category.service.mjs +31 -0
  55. package/esm2022/lib/services/correspondence-manager.service.mjs +74 -0
  56. package/esm2022/lib/services/credit-score.service.mjs +48 -0
  57. package/esm2022/lib/services/credit-study.service.mjs +292 -0
  58. package/esm2022/lib/services/cube.service.mjs +27 -0
  59. package/esm2022/lib/services/data-form-history.service.mjs +25 -0
  60. package/esm2022/lib/services/data-form.service.mjs +176 -0
  61. package/esm2022/lib/services/data-letter-segmentation.service.mjs +64 -0
  62. package/esm2022/lib/services/document-analysis-auto.service.mjs +27 -0
  63. package/esm2022/lib/services/document-history.service.mjs +43 -0
  64. package/esm2022/lib/services/document-management.service.mjs +57 -0
  65. package/esm2022/lib/services/document-process.service.mjs +27 -0
  66. package/esm2022/lib/services/document-validation-attempt.service.mjs +32 -0
  67. package/esm2022/lib/services/document.service.mjs +144 -0
  68. package/esm2022/lib/services/documentary.type.service.mjs +69 -0
  69. package/esm2022/lib/services/email.service.mjs +30 -0
  70. package/esm2022/lib/services/evaluation.service.mjs +181 -0
  71. package/esm2022/lib/services/export-excel.service.mjs +32 -0
  72. package/esm2022/lib/services/file.service.mjs +153 -0
  73. package/esm2022/lib/services/form.service.mjs +112 -0
  74. package/esm2022/lib/services/gic-client-disbursement-metadata.service.mjs +31 -0
  75. package/esm2022/lib/services/gic-client.service.mjs +49 -0
  76. package/esm2022/lib/services/gic-cnf-bankvision-transaction.service.mjs +31 -0
  77. package/esm2022/lib/services/gic-cnf-closing-date.service.mjs +34 -0
  78. package/esm2022/lib/services/gic-cnf-maintenance.service.mjs +30 -0
  79. package/esm2022/lib/services/gic-collection.service.mjs +53 -0
  80. package/esm2022/lib/services/gic-disbursement.service.mjs +39 -0
  81. package/esm2022/lib/services/gic-extract.service.mjs +41 -0
  82. package/esm2022/lib/services/gic-log.service.mjs +41 -0
  83. package/esm2022/lib/services/gic-payment-application.service.mjs +35 -0
  84. package/esm2022/lib/services/gic-payment-plan-cube.service.mjs +27 -0
  85. package/esm2022/lib/services/gic-payment-plan.service.mjs +32 -0
  86. package/esm2022/lib/services/gic-trm.service.mjs +27 -0
  87. package/esm2022/lib/services/global.show.task.service.mjs +37 -0
  88. package/esm2022/lib/services/guarantee-document.service.mjs +52 -0
  89. package/esm2022/lib/services/guarantee-enrollment.service.mjs +37 -0
  90. package/esm2022/lib/services/guarantee.service.mjs +128 -0
  91. package/esm2022/lib/services/guarantees-summary-service.mjs +26 -0
  92. package/esm2022/lib/services/hash.service.mjs +36 -0
  93. package/esm2022/lib/services/import-data.service.mjs +27 -0
  94. package/esm2022/lib/services/import-excel-gic.service.mjs +53 -0
  95. package/esm2022/lib/services/initial-configuration-gic-parameters.service.mjs +51 -0
  96. package/esm2022/lib/services/initial-record.service.mjs +51 -0
  97. package/esm2022/lib/services/integration-ado.service.mjs +54 -0
  98. package/esm2022/lib/services/interaction-application-user.service.mjs +81 -0
  99. package/esm2022/lib/services/interest-adjustment.service.mjs +34 -0
  100. package/esm2022/lib/services/keys-assignation.service.mjs +127 -0
  101. package/esm2022/lib/services/legalization.service.mjs +150 -0
  102. package/esm2022/lib/services/letter-campaing.service.mjs +49 -0
  103. package/esm2022/lib/services/letter-task-mapping.service.mjs +40 -0
  104. package/esm2022/lib/services/log.service.mjs +41 -0
  105. package/esm2022/lib/services/maintenance.service.mjs +86 -0
  106. package/esm2022/lib/services/master-category.service.mjs +66 -0
  107. package/esm2022/lib/services/master-program.service.mjs +78 -0
  108. package/esm2022/lib/services/master-university.service.mjs +79 -0
  109. package/esm2022/lib/services/migration-plis.service.mjs +27 -0
  110. package/esm2022/lib/services/migration-survey-queue.service.mjs +24 -0
  111. package/esm2022/lib/services/openkm-document.service.mjs +27 -0
  112. package/esm2022/lib/services/page.service.mjs +38 -0
  113. package/esm2022/lib/services/partner-system.service.mjs +30 -0
  114. package/esm2022/lib/services/partner.service.mjs +34 -0
  115. package/esm2022/lib/services/pdf-analyzer.service.mjs +33 -0
  116. package/esm2022/lib/services/people-master.service.mjs +42 -0
  117. package/esm2022/lib/services/permission.service.mjs +29 -0
  118. package/esm2022/lib/services/pli-cnf-acuity-fields.service.mjs +34 -0
  119. package/esm2022/lib/services/pli-cnf-app-card-filter.service.mjs +40 -0
  120. package/esm2022/lib/services/pli-cnf-appointment-type.service.mjs +41 -0
  121. package/esm2022/lib/services/pli-cnf-budget-program-type.service.mjs +54 -0
  122. package/esm2022/lib/services/pli-cnf-budget.service.mjs +31 -0
  123. package/esm2022/lib/services/pli-cnf-cloning.service.mjs +27 -0
  124. package/esm2022/lib/services/pli-cnf-committee-pdf-config-table-config.service.mjs +47 -0
  125. package/esm2022/lib/services/pli-cnf-committee-pdf-gen-status.service.mjs +30 -0
  126. package/esm2022/lib/services/pli-cnf-committee-valpro-columns.service.mjs +42 -0
  127. package/esm2022/lib/services/pli-cnf-committee-visualization-mode.service.mjs +42 -0
  128. package/esm2022/lib/services/pli-cnf-committee.service.mjs +66 -0
  129. package/esm2022/lib/services/pli-cnf-config-minisite.service.mjs +90 -0
  130. package/esm2022/lib/services/pli-cnf-configuration-credit-study.service.mjs +41 -0
  131. package/esm2022/lib/services/pli-cnf-document-management.service.mjs +40 -0
  132. package/esm2022/lib/services/pli-cnf-dynamic-keys-assign.service.mjs +52 -0
  133. package/esm2022/lib/services/pli-cnf-evaluation-task-mailing.service.mjs +31 -0
  134. package/esm2022/lib/services/pli-cnf-evaluation-task-template.service.mjs +39 -0
  135. package/esm2022/lib/services/pli-cnf-evaluation-task.service.mjs +112 -0
  136. package/esm2022/lib/services/pli-cnf-evaluation-template.service.mjs +95 -0
  137. package/esm2022/lib/services/pli-cnf-form-edit.service.mjs +68 -0
  138. package/esm2022/lib/services/pli-cnf-form-multiaplicacion.service.mjs +46 -0
  139. package/esm2022/lib/services/pli-cnf-guarantee-documents-template.service.mjs +40 -0
  140. package/esm2022/lib/services/pli-cnf-guarantee-token.service.mjs +42 -0
  141. package/esm2022/lib/services/pli-cnf-header.service.mjs +39 -0
  142. package/esm2022/lib/services/pli-cnf-indicator.service.mjs +39 -0
  143. package/esm2022/lib/services/pli-cnf-information-system.service.mjs +24 -0
  144. package/esm2022/lib/services/pli-cnf-interaction.service.mjs +78 -0
  145. package/esm2022/lib/services/pli-cnf-letter-template-type.service.mjs +29 -0
  146. package/esm2022/lib/services/pli-cnf-letter-template.service.mjs +48 -0
  147. package/esm2022/lib/services/pli-cnf-look-and-feel.service.mjs +28 -0
  148. package/esm2022/lib/services/pli-cnf-mail.service.mjs +30 -0
  149. package/esm2022/lib/services/pli-cnf-menu-form.service.mjs +34 -0
  150. package/esm2022/lib/services/pli-cnf-migration-plis-field-budget.service.mjs +34 -0
  151. package/esm2022/lib/services/pli-cnf-migration-plis-field.service.mjs +47 -0
  152. package/esm2022/lib/services/pli-cnf-migration-status-plis.service.mjs +44 -0
  153. package/esm2022/lib/services/pli-cnf-page-section-form.service.mjs +66 -0
  154. package/esm2022/lib/services/pli-cnf-page-sub-process.service.mjs +25 -0
  155. package/esm2022/lib/services/pli-cnf-pdfs.service.mjs +31 -0
  156. package/esm2022/lib/services/pli-cnf-profile-form.service.mjs +40 -0
  157. package/esm2022/lib/services/pli-cnf-profile-user.service.mjs +49 -0
  158. package/esm2022/lib/services/pli-cnf-project-summary.service.mjs +39 -0
  159. package/esm2022/lib/services/pli-cnf-scenario.service.mjs +47 -0
  160. package/esm2022/lib/services/pli-cnf-segmentation.service.mjs +72 -0
  161. package/esm2022/lib/services/pli-cnf-snapshot-token.service.mjs +42 -0
  162. package/esm2022/lib/services/pli-cnf-status-flow-interaction.service.mjs +74 -0
  163. package/esm2022/lib/services/pli-cnf-status-flow.service.mjs +56 -0
  164. package/esm2022/lib/services/pli-cnf-support-document-category.service.mjs +47 -0
  165. package/esm2022/lib/services/pli-cnf-support-document.service.mjs +56 -0
  166. package/esm2022/lib/services/pli-cnf-survey-document.service.mjs +37 -0
  167. package/esm2022/lib/services/pli-cnf-survey-pdf.service.mjs +34 -0
  168. package/esm2022/lib/services/pli-cnf-survey.service.mjs +46 -0
  169. package/esm2022/lib/services/pli-cnf-task-group.service.mjs +33 -0
  170. package/esm2022/lib/services/pli-cnf-text-category.service.mjs +38 -0
  171. package/esm2022/lib/services/pli-cnf-text-option.service.mjs +39 -0
  172. package/esm2022/lib/services/pli-cnf-text.service.mjs +62 -0
  173. package/esm2022/lib/services/pli-cnf-type-text.service.mjs +45 -0
  174. package/esm2022/lib/services/pli-cnf-university-article.service.mjs +39 -0
  175. package/esm2022/lib/services/pli-cnf-user-calendar.service.mjs +36 -0
  176. package/esm2022/lib/services/pli-cnf-user-workspace.service.mjs +35 -0
  177. package/esm2022/lib/services/pli-cnf-valpro-keys.service.mjs +35 -0
  178. package/esm2022/lib/services/pli-cnf-workspace-segmentation.service.mjs +31 -0
  179. package/esm2022/lib/services/pli-message-type.service.mjs +40 -0
  180. package/esm2022/lib/services/pli-multiple-value-filter.service.mjs +39 -0
  181. package/esm2022/lib/services/pli-promocion-username.service.mjs +57 -0
  182. package/esm2022/lib/services/pli-seg-action-user.service.mjs +37 -0
  183. package/esm2022/lib/services/pli-segmentation.service.mjs +130 -0
  184. package/esm2022/lib/services/pli-tag-assignment.service.mjs +36 -0
  185. package/esm2022/lib/services/pli-tag.service.mjs +55 -0
  186. package/esm2022/lib/services/pli-user.service.mjs +51 -0
  187. package/esm2022/lib/services/plis-beneficiario.service.mjs +29 -0
  188. package/esm2022/lib/services/plis-estatus-change.service.mjs +30 -0
  189. package/esm2022/lib/services/post-selection.service.mjs +25 -0
  190. package/esm2022/lib/services/ppp.service.mjs +360 -0
  191. package/esm2022/lib/services/profile.service.mjs +60 -0
  192. package/esm2022/lib/services/progress-bar.service.mjs +40 -0
  193. package/esm2022/lib/services/promotion-score.service.mjs +44 -0
  194. package/esm2022/lib/services/registry-identifier.service.mjs +49 -0
  195. package/esm2022/lib/services/return-refund.service.mjs +53 -0
  196. package/esm2022/lib/services/segmentation-tokens.service.mjs +43 -0
  197. package/esm2022/lib/services/segmentation-user-service.service.mjs +94 -0
  198. package/esm2022/lib/services/segmentation.service.mjs +31 -0
  199. package/esm2022/lib/services/send-application.service.mjs +541 -0
  200. package/esm2022/lib/services/sesion-form.service.mjs +31 -0
  201. package/esm2022/lib/services/sesion.service.mjs +48 -0
  202. package/esm2022/lib/services/spinner.service.mjs +16 -0
  203. package/esm2022/lib/services/sponsorship-letter.service.mjs +68 -0
  204. package/esm2022/lib/services/status.service.mjs +104 -0
  205. package/esm2022/lib/services/summary-budget.service.mjs +24 -0
  206. package/esm2022/lib/services/survey-metadata.service.mjs +28 -0
  207. package/esm2022/lib/services/survey-queue.service.mjs +24 -0
  208. package/esm2022/lib/services/survey.service.mjs +52 -0
  209. package/esm2022/lib/services/tag-management.service.mjs +58 -0
  210. package/esm2022/lib/services/tasa.cambio.service.mjs +35 -0
  211. package/esm2022/lib/services/token-transformation.service.mjs +62 -0
  212. package/esm2022/lib/services/token.service.mjs +1477 -0
  213. package/esm2022/lib/services/university.service.mjs +50 -0
  214. package/esm2022/lib/services/upload-documents.service.mjs +60 -0
  215. package/esm2022/lib/services/user.service.mjs +28 -0
  216. package/esm2022/lib/services/visualization-committee.service.mjs +91 -0
  217. package/esm2022/lib/utils/custom-validator.mjs +95 -0
  218. package/esm2022/lib/utils/form-util.mjs +35 -0
  219. package/esm2022/lib/utils/formio-util.mjs +582 -0
  220. package/esm2022/lib/utils/version-commons.mjs +10 -0
  221. package/esm2022/ng-pli-commons.mjs +5 -0
  222. package/esm2022/public-api.mjs +226 -0
  223. package/esm2022/version.mjs +29 -0
  224. package/fesm2022/ng-pli-commons.mjs +657 -657
  225. package/fesm2022/ng-pli-commons.mjs.map +1 -1
  226. 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