ng-pli-commons 1.0.43 → 1.0.44-dev.0

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 (244) hide show
  1. package/fesm2022/ng-pli-commons.mjs +1213 -731
  2. package/fesm2022/ng-pli-commons.mjs.map +1 -1
  3. package/lib/components/pdf-visualizer/pdf-visualizer.component.d.ts +2 -0
  4. package/lib/components/token/token.component.d.ts +7 -2
  5. package/lib/ng-pli-commons.module.d.ts +12 -13
  6. package/lib/services/application.service.d.ts +2 -1
  7. package/lib/services/budget-setup.service.d.ts +12 -0
  8. package/lib/services/budget-simulation.service.d.ts +2 -0
  9. package/lib/services/codebtors.service.d.ts +14 -0
  10. package/lib/services/committee-assistant.service.d.ts +19 -0
  11. package/lib/services/correspondence-manager.service.d.ts +1 -0
  12. package/lib/services/document.service.d.ts +2 -1
  13. package/lib/services/guarantees-summary-service.d.ts +13 -0
  14. package/lib/services/import-excel-gic.service.d.ts +1 -0
  15. package/lib/services/maintenance.service.d.ts +4 -0
  16. package/lib/services/master-university.service.d.ts +7 -0
  17. package/lib/services/pli-cnf-anual-interest-rate.service.d.ts +17 -0
  18. package/lib/services/pli-cnf-committee.service.d.ts +1 -0
  19. package/lib/services/pli-cnf-installment-simulator-config.service.d.ts +17 -0
  20. package/lib/services/post-selection.service.d.ts +11 -0
  21. package/lib/services/send-application.service.d.ts +1 -0
  22. package/lib/services/tag-management.service.d.ts +23 -0
  23. package/lib/services/token.service.d.ts +3 -0
  24. package/lib/services/visualization-committee.service.d.ts +2 -1
  25. package/package.json +3 -6
  26. package/public-api.d.ts +8 -0
  27. package/version.d.ts +1 -1
  28. package/esm2022/lib/components/backoffice.commons.component.mjs +0 -40
  29. package/esm2022/lib/components/common.lists.component.mjs +0 -176
  30. package/esm2022/lib/components/configuration-token/configuration-token-subject.service.mjs +0 -23
  31. package/esm2022/lib/components/configuration-token/configuration-token.component.mjs +0 -665
  32. package/esm2022/lib/components/configuration-token/guarantee-token/guarantee-token.component.mjs +0 -103
  33. package/esm2022/lib/components/configuration-token/snapshot-token/snapshot-token.component.mjs +0 -108
  34. package/esm2022/lib/components/configuration.commons.component.mjs +0 -40
  35. package/esm2022/lib/components/dashboard.commons.component.mjs +0 -84
  36. package/esm2022/lib/components/dynamic-filter/dynamic-filter.component.mjs +0 -131
  37. package/esm2022/lib/components/excel-to-json/excel-to-json.component.mjs +0 -54
  38. package/esm2022/lib/components/frontoffice.commons.component.mjs +0 -88
  39. package/esm2022/lib/components/pdf-analyzer/pdf-analyzer.component.mjs +0 -162
  40. package/esm2022/lib/components/pdf-config/pdf-config.component.mjs +0 -170
  41. package/esm2022/lib/components/pdf-generator/pdf-generator.component.mjs +0 -207
  42. package/esm2022/lib/components/pdf-merge-visualizer/pdf-merge-visualizer.component.mjs +0 -307
  43. package/esm2022/lib/components/pdf-visualizer/pdf-visualizer.component.mjs +0 -387
  44. package/esm2022/lib/components/progress-bar/progress-bar.component.mjs +0 -92
  45. package/esm2022/lib/components/segmentation-tokens/segmentation-tokens.component.mjs +0 -199
  46. package/esm2022/lib/components/select-ppp/select-ppp.component.mjs +0 -200
  47. package/esm2022/lib/components/show-hide-columns/show-hide-columns-table.component.mjs +0 -116
  48. package/esm2022/lib/components/token/token.component.mjs +0 -1026
  49. package/esm2022/lib/components/tokens-calculator/tokens-calculator.component.mjs +0 -128
  50. package/esm2022/lib/directives/currency-colfuturo-formatter.directive.mjs +0 -47
  51. package/esm2022/lib/directives/currency-decimal-colfuturo-formatter.directive.mjs +0 -34
  52. package/esm2022/lib/ng-pli-commons.module.mjs +0 -391
  53. package/esm2022/lib/ng-pli-commons.service.mjs +0 -14
  54. package/esm2022/lib/pipes/currency-colfuturo.pipe.mjs +0 -35
  55. package/esm2022/lib/pipes/currency-decimal-colfuturo.pipe.mjs +0 -36
  56. package/esm2022/lib/pipes/currency-print-colfuturo.pipe.mjs +0 -33
  57. package/esm2022/lib/pipes/thousands.pipe.mjs +0 -60
  58. package/esm2022/lib/services/application-fill-percentage.service.mjs +0 -30
  59. package/esm2022/lib/services/application-pdf-form.service.mjs +0 -27
  60. package/esm2022/lib/services/application-tag.service.mjs +0 -56
  61. package/esm2022/lib/services/application.service.mjs +0 -250
  62. package/esm2022/lib/services/assign-task.service.mjs +0 -30
  63. package/esm2022/lib/services/authentication.service.mjs +0 -133
  64. package/esm2022/lib/services/blocked-beneficiary.service.mjs +0 -42
  65. package/esm2022/lib/services/budget-application.service.mjs +0 -265
  66. package/esm2022/lib/services/budget-simulation.service.mjs +0 -61
  67. package/esm2022/lib/services/budget.service.mjs +0 -205
  68. package/esm2022/lib/services/closure-wallet.service.mjs +0 -39
  69. package/esm2022/lib/services/cnf-correspondence-document-manager.service.mjs +0 -39
  70. package/esm2022/lib/services/committee-money.service.mjs +0 -44
  71. package/esm2022/lib/services/committee-pdf.service.mjs +0 -27
  72. package/esm2022/lib/services/committee-snapshot.service.mjs +0 -60
  73. package/esm2022/lib/services/common-info.service.mjs +0 -51
  74. package/esm2022/lib/services/common.service.mjs +0 -285
  75. package/esm2022/lib/services/configuration-document.service.mjs +0 -297
  76. package/esm2022/lib/services/configuration-minisite.service.mjs +0 -26
  77. package/esm2022/lib/services/configuration.service.mjs +0 -53
  78. package/esm2022/lib/services/correspondence-document-category.service.mjs +0 -31
  79. package/esm2022/lib/services/correspondence-manager.service.mjs +0 -67
  80. package/esm2022/lib/services/credit-score.service.mjs +0 -48
  81. package/esm2022/lib/services/credit-study.service.mjs +0 -292
  82. package/esm2022/lib/services/cube.service.mjs +0 -27
  83. package/esm2022/lib/services/data-form-history.service.mjs +0 -25
  84. package/esm2022/lib/services/data-form.service.mjs +0 -176
  85. package/esm2022/lib/services/data-letter-segmentation.service.mjs +0 -64
  86. package/esm2022/lib/services/document-analysis-auto.service.mjs +0 -27
  87. package/esm2022/lib/services/document-history.service.mjs +0 -43
  88. package/esm2022/lib/services/document-management.service.mjs +0 -57
  89. package/esm2022/lib/services/document-process.service.mjs +0 -27
  90. package/esm2022/lib/services/document-validation-attempt.service.mjs +0 -32
  91. package/esm2022/lib/services/document.service.mjs +0 -138
  92. package/esm2022/lib/services/documentary.type.service.mjs +0 -69
  93. package/esm2022/lib/services/email.service.mjs +0 -30
  94. package/esm2022/lib/services/evaluation.service.mjs +0 -181
  95. package/esm2022/lib/services/export-excel.service.mjs +0 -32
  96. package/esm2022/lib/services/file.service.mjs +0 -153
  97. package/esm2022/lib/services/form.service.mjs +0 -112
  98. package/esm2022/lib/services/gic-client-disbursement-metadata.service.mjs +0 -31
  99. package/esm2022/lib/services/gic-client.service.mjs +0 -49
  100. package/esm2022/lib/services/gic-cnf-bankvision-transaction.service.mjs +0 -31
  101. package/esm2022/lib/services/gic-cnf-closing-date.service.mjs +0 -34
  102. package/esm2022/lib/services/gic-cnf-maintenance.service.mjs +0 -30
  103. package/esm2022/lib/services/gic-collection.service.mjs +0 -53
  104. package/esm2022/lib/services/gic-disbursement.service.mjs +0 -39
  105. package/esm2022/lib/services/gic-extract.service.mjs +0 -41
  106. package/esm2022/lib/services/gic-log.service.mjs +0 -41
  107. package/esm2022/lib/services/gic-payment-application.service.mjs +0 -35
  108. package/esm2022/lib/services/gic-payment-plan-cube.service.mjs +0 -27
  109. package/esm2022/lib/services/gic-payment-plan.service.mjs +0 -32
  110. package/esm2022/lib/services/gic-trm.service.mjs +0 -27
  111. package/esm2022/lib/services/global.show.task.service.mjs +0 -37
  112. package/esm2022/lib/services/guarantee-document.service.mjs +0 -52
  113. package/esm2022/lib/services/guarantee-enrollment.service.mjs +0 -37
  114. package/esm2022/lib/services/guarantee.service.mjs +0 -128
  115. package/esm2022/lib/services/hash.service.mjs +0 -36
  116. package/esm2022/lib/services/import-data.service.mjs +0 -27
  117. package/esm2022/lib/services/import-excel-gic.service.mjs +0 -49
  118. package/esm2022/lib/services/initial-configuration-gic-parameters.service.mjs +0 -51
  119. package/esm2022/lib/services/initial-record.service.mjs +0 -51
  120. package/esm2022/lib/services/integration-ado.service.mjs +0 -54
  121. package/esm2022/lib/services/interaction-application-user.service.mjs +0 -81
  122. package/esm2022/lib/services/interest-adjustment.service.mjs +0 -34
  123. package/esm2022/lib/services/keys-assignation.service.mjs +0 -127
  124. package/esm2022/lib/services/legalization.service.mjs +0 -150
  125. package/esm2022/lib/services/letter-campaing.service.mjs +0 -49
  126. package/esm2022/lib/services/letter-task-mapping.service.mjs +0 -40
  127. package/esm2022/lib/services/log.service.mjs +0 -41
  128. package/esm2022/lib/services/maintenance.service.mjs +0 -66
  129. package/esm2022/lib/services/master-category.service.mjs +0 -66
  130. package/esm2022/lib/services/master-program.service.mjs +0 -78
  131. package/esm2022/lib/services/master-university.service.mjs +0 -68
  132. package/esm2022/lib/services/migration-plis.service.mjs +0 -27
  133. package/esm2022/lib/services/migration-survey-queue.service.mjs +0 -24
  134. package/esm2022/lib/services/openkm-document.service.mjs +0 -27
  135. package/esm2022/lib/services/page.service.mjs +0 -38
  136. package/esm2022/lib/services/partner-system.service.mjs +0 -30
  137. package/esm2022/lib/services/partner.service.mjs +0 -34
  138. package/esm2022/lib/services/pdf-analyzer.service.mjs +0 -33
  139. package/esm2022/lib/services/people-master.service.mjs +0 -42
  140. package/esm2022/lib/services/permission.service.mjs +0 -29
  141. package/esm2022/lib/services/pli-cnf-acuity-fields.service.mjs +0 -34
  142. package/esm2022/lib/services/pli-cnf-app-card-filter.service.mjs +0 -40
  143. package/esm2022/lib/services/pli-cnf-appointment-type.service.mjs +0 -41
  144. package/esm2022/lib/services/pli-cnf-budget-program-type.service.mjs +0 -54
  145. package/esm2022/lib/services/pli-cnf-budget.service.mjs +0 -31
  146. package/esm2022/lib/services/pli-cnf-cloning.service.mjs +0 -27
  147. package/esm2022/lib/services/pli-cnf-committee-pdf-config-table-config.service.mjs +0 -47
  148. package/esm2022/lib/services/pli-cnf-committee-pdf-gen-status.service.mjs +0 -30
  149. package/esm2022/lib/services/pli-cnf-committee-valpro-columns.service.mjs +0 -42
  150. package/esm2022/lib/services/pli-cnf-committee-visualization-mode.service.mjs +0 -42
  151. package/esm2022/lib/services/pli-cnf-committee.service.mjs +0 -60
  152. package/esm2022/lib/services/pli-cnf-config-minisite.service.mjs +0 -90
  153. package/esm2022/lib/services/pli-cnf-configuration-credit-study.service.mjs +0 -41
  154. package/esm2022/lib/services/pli-cnf-document-management.service.mjs +0 -40
  155. package/esm2022/lib/services/pli-cnf-dynamic-keys-assign.service.mjs +0 -52
  156. package/esm2022/lib/services/pli-cnf-evaluation-task-mailing.service.mjs +0 -31
  157. package/esm2022/lib/services/pli-cnf-evaluation-task-template.service.mjs +0 -39
  158. package/esm2022/lib/services/pli-cnf-evaluation-task.service.mjs +0 -112
  159. package/esm2022/lib/services/pli-cnf-evaluation-template.service.mjs +0 -95
  160. package/esm2022/lib/services/pli-cnf-form-edit.service.mjs +0 -68
  161. package/esm2022/lib/services/pli-cnf-form-multiaplicacion.service.mjs +0 -46
  162. package/esm2022/lib/services/pli-cnf-guarantee-documents-template.service.mjs +0 -40
  163. package/esm2022/lib/services/pli-cnf-guarantee-token.service.mjs +0 -42
  164. package/esm2022/lib/services/pli-cnf-header.service.mjs +0 -39
  165. package/esm2022/lib/services/pli-cnf-indicator.service.mjs +0 -39
  166. package/esm2022/lib/services/pli-cnf-information-system.service.mjs +0 -24
  167. package/esm2022/lib/services/pli-cnf-interaction.service.mjs +0 -78
  168. package/esm2022/lib/services/pli-cnf-letter-template-type.service.mjs +0 -29
  169. package/esm2022/lib/services/pli-cnf-letter-template.service.mjs +0 -48
  170. package/esm2022/lib/services/pli-cnf-look-and-feel.service.mjs +0 -28
  171. package/esm2022/lib/services/pli-cnf-mail.service.mjs +0 -30
  172. package/esm2022/lib/services/pli-cnf-menu-form.service.mjs +0 -34
  173. package/esm2022/lib/services/pli-cnf-migration-plis-field-budget.service.mjs +0 -34
  174. package/esm2022/lib/services/pli-cnf-migration-plis-field.service.mjs +0 -47
  175. package/esm2022/lib/services/pli-cnf-migration-status-plis.service.mjs +0 -44
  176. package/esm2022/lib/services/pli-cnf-page-section-form.service.mjs +0 -66
  177. package/esm2022/lib/services/pli-cnf-page-sub-process.service.mjs +0 -25
  178. package/esm2022/lib/services/pli-cnf-pdfs.service.mjs +0 -31
  179. package/esm2022/lib/services/pli-cnf-profile-form.service.mjs +0 -40
  180. package/esm2022/lib/services/pli-cnf-profile-user.service.mjs +0 -49
  181. package/esm2022/lib/services/pli-cnf-project-summary.service.mjs +0 -39
  182. package/esm2022/lib/services/pli-cnf-scenario.service.mjs +0 -47
  183. package/esm2022/lib/services/pli-cnf-segmentation.service.mjs +0 -72
  184. package/esm2022/lib/services/pli-cnf-snapshot-token.service.mjs +0 -42
  185. package/esm2022/lib/services/pli-cnf-status-flow-interaction.service.mjs +0 -74
  186. package/esm2022/lib/services/pli-cnf-status-flow.service.mjs +0 -56
  187. package/esm2022/lib/services/pli-cnf-support-document-category.service.mjs +0 -47
  188. package/esm2022/lib/services/pli-cnf-support-document.service.mjs +0 -56
  189. package/esm2022/lib/services/pli-cnf-survey-document.service.mjs +0 -37
  190. package/esm2022/lib/services/pli-cnf-survey-pdf.service.mjs +0 -34
  191. package/esm2022/lib/services/pli-cnf-survey.service.mjs +0 -46
  192. package/esm2022/lib/services/pli-cnf-task-group.service.mjs +0 -33
  193. package/esm2022/lib/services/pli-cnf-text-category.service.mjs +0 -38
  194. package/esm2022/lib/services/pli-cnf-text-option.service.mjs +0 -39
  195. package/esm2022/lib/services/pli-cnf-text.service.mjs +0 -62
  196. package/esm2022/lib/services/pli-cnf-type-text.service.mjs +0 -45
  197. package/esm2022/lib/services/pli-cnf-university-article.service.mjs +0 -39
  198. package/esm2022/lib/services/pli-cnf-user-calendar.service.mjs +0 -36
  199. package/esm2022/lib/services/pli-cnf-user-workspace.service.mjs +0 -35
  200. package/esm2022/lib/services/pli-cnf-valpro-keys.service.mjs +0 -35
  201. package/esm2022/lib/services/pli-cnf-workspace-segmentation.service.mjs +0 -31
  202. package/esm2022/lib/services/pli-message-type.service.mjs +0 -40
  203. package/esm2022/lib/services/pli-multiple-value-filter.service.mjs +0 -39
  204. package/esm2022/lib/services/pli-promocion-username.service.mjs +0 -57
  205. package/esm2022/lib/services/pli-seg-action-user.service.mjs +0 -37
  206. package/esm2022/lib/services/pli-segmentation.service.mjs +0 -130
  207. package/esm2022/lib/services/pli-tag-assignment.service.mjs +0 -36
  208. package/esm2022/lib/services/pli-tag.service.mjs +0 -55
  209. package/esm2022/lib/services/pli-user.service.mjs +0 -51
  210. package/esm2022/lib/services/plis-beneficiario.service.mjs +0 -29
  211. package/esm2022/lib/services/plis-estatus-change.service.mjs +0 -30
  212. package/esm2022/lib/services/ppp.service.mjs +0 -360
  213. package/esm2022/lib/services/profile.service.mjs +0 -60
  214. package/esm2022/lib/services/progress-bar.service.mjs +0 -40
  215. package/esm2022/lib/services/promotion-score.service.mjs +0 -44
  216. package/esm2022/lib/services/registry-identifier.service.mjs +0 -49
  217. package/esm2022/lib/services/return-refund.service.mjs +0 -53
  218. package/esm2022/lib/services/segmentation-tokens.service.mjs +0 -43
  219. package/esm2022/lib/services/segmentation-user-service.service.mjs +0 -94
  220. package/esm2022/lib/services/segmentation.service.mjs +0 -31
  221. package/esm2022/lib/services/send-application.service.mjs +0 -484
  222. package/esm2022/lib/services/sesion-form.service.mjs +0 -31
  223. package/esm2022/lib/services/sesion.service.mjs +0 -48
  224. package/esm2022/lib/services/spinner.service.mjs +0 -16
  225. package/esm2022/lib/services/sponsorship-letter.service.mjs +0 -68
  226. package/esm2022/lib/services/status.service.mjs +0 -104
  227. package/esm2022/lib/services/summary-budget.service.mjs +0 -24
  228. package/esm2022/lib/services/survey-metadata.service.mjs +0 -28
  229. package/esm2022/lib/services/survey-queue.service.mjs +0 -24
  230. package/esm2022/lib/services/survey.service.mjs +0 -52
  231. package/esm2022/lib/services/tasa.cambio.service.mjs +0 -35
  232. package/esm2022/lib/services/token-transformation.service.mjs +0 -62
  233. package/esm2022/lib/services/token.service.mjs +0 -1431
  234. package/esm2022/lib/services/university.service.mjs +0 -50
  235. package/esm2022/lib/services/upload-documents.service.mjs +0 -60
  236. package/esm2022/lib/services/user.service.mjs +0 -28
  237. package/esm2022/lib/services/visualization-committee.service.mjs +0 -87
  238. package/esm2022/lib/utils/custom-validator.mjs +0 -95
  239. package/esm2022/lib/utils/form-util.mjs +0 -35
  240. package/esm2022/lib/utils/formio-util.mjs +0 -582
  241. package/esm2022/lib/utils/version-commons.mjs +0 -10
  242. package/esm2022/ng-pli-commons.mjs +0 -5
  243. package/esm2022/public-api.mjs +0 -220
  244. package/esm2022/version.mjs +0 -29
@@ -1,1431 +0,0 @@
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 (formFieldToken.searchField) {
843
- return valueData[formFieldToken.searchField];
844
- }
845
- }
846
- }
847
- }
848
- return valueData;
849
- }
850
- formatDate(value, locale) {
851
- const date = new Date(value);
852
- const months = {
853
- es: [
854
- 'enero',
855
- 'febrero',
856
- 'marzo',
857
- 'abril',
858
- 'mayo',
859
- 'junio',
860
- 'julio',
861
- 'agosto',
862
- 'septiembre',
863
- 'octubre',
864
- 'noviembre',
865
- 'diciembre'
866
- ],
867
- en: [
868
- 'January',
869
- 'February',
870
- 'March',
871
- 'April',
872
- 'May',
873
- 'June',
874
- 'July',
875
- 'August',
876
- 'September',
877
- 'October',
878
- 'November',
879
- 'December'
880
- ],
881
- fr: [
882
- 'janvier',
883
- 'février',
884
- 'mars',
885
- 'avril',
886
- 'mai',
887
- 'juin',
888
- 'juillet',
889
- 'août',
890
- 'septembre',
891
- 'octobre',
892
- 'novembre',
893
- 'décembre'
894
- ],
895
- de: [
896
- 'Januar',
897
- 'Februar',
898
- 'März',
899
- 'April',
900
- 'Mai',
901
- 'Juni',
902
- 'Juli',
903
- 'August',
904
- 'September',
905
- 'Oktober',
906
- 'November',
907
- 'Dezember'
908
- ],
909
- it: [
910
- 'gennaio',
911
- 'febbraio',
912
- 'marzo',
913
- 'aprile',
914
- 'maggio',
915
- 'giugno',
916
- 'luglio',
917
- 'agosto',
918
- 'settembre',
919
- 'ottobre',
920
- 'novembre',
921
- 'dicembre'
922
- ]
923
- };
924
- const localeMonths = months[locale];
925
- const month = localeMonths[date.getMonth()];
926
- const year = date.getFullYear();
927
- return `${month} ${year}`;
928
- }
929
- /**
930
- * Try to find the token in the stringText and replace with dataValue. If detect format of number or date try to format the dataValue
931
- * @param stringText
932
- * @param token
933
- * @param dataValue
934
- */
935
- replaceToken(stringText, token, dataValue, locale) {
936
- let valueReplace = null;
937
- if (token && token[0] == '#') {
938
- let typeToken = token.substring(1, token.indexOf('('));
939
- if (typeToken == 'date') {
940
- let dateFormat = token.substring(token.indexOf('}') + 1, token.indexOf(')'));
941
- dateFormat = dateFormat.trim().replace(/\"/g, '').replace(/\'/g, '');
942
- let dateValue = DateUtil.getDate(dataValue);
943
- if (locale != null && locale) {
944
- valueReplace = this.formatDate(dateValue, locale);
945
- }
946
- else if (dateValue) {
947
- valueReplace = DateUtil.getMoment(dateValue).format(dateFormat);
948
- }
949
- else {
950
- valueReplace = '';
951
- }
952
- }
953
- else if (typeToken == 'number') {
954
- let numberValue = Number(dataValue);
955
- if (numberValue != undefined && !isNaN(numberValue)) {
956
- let numberFormat = token.substring(token.indexOf('}') + 1, token.indexOf(')'));
957
- numberFormat = numberFormat.trim().replace(/\"/g, '').replace(/\'/g, '');
958
- valueReplace = this.currencyPipe.transform(numberValue, this.locale, '', numberFormat);
959
- }
960
- else {
961
- console.log('El dato [' +
962
- dataValue +
963
- '] para el token [' +
964
- token +
965
- '] tipo númerico no es valido');
966
- valueReplace = '';
967
- }
968
- }
969
- else {
970
- console.log('tipo de token indefinido. [typeToken[' + typeToken + ']]');
971
- }
972
- }
973
- else if (token && token[0] == '$') {
974
- if (dataValue !== null &&
975
- dataValue !== undefined &&
976
- dataValue.original_name !== undefined &&
977
- dataValue.original_name !== null) {
978
- valueReplace = dataValue.original_name;
979
- }
980
- else {
981
- valueReplace = dataValue;
982
- }
983
- // valueReplace = dataValue;
984
- }
985
- else {
986
- console.log('El token no es valido. [token[' + token + ']]');
987
- }
988
- if (stringText && valueReplace !== null) {
989
- if (token && token === '${estatico_' + TokenService.STATIC_TOKEN_SURNAME + '}') {
990
- valueReplace = dataValue;
991
- stringText = stringText.split(token).join(valueReplace);
992
- }
993
- else {
994
- // replace text in a more efficient way
995
- stringText = stringText.split(token).join(valueReplace);
996
- //stringText = stringText.replace(token, valueReplace);
997
- }
998
- }
999
- return stringText;
1000
- }
1001
- getListTokensByStringSegmentation(stringText) {
1002
- const arrayToken = stringText.match(/\${([^}]+)\}/g);
1003
- const arrayTokenFormattedDate = stringText.match(/\#date[^)]+\)/g);
1004
- const arrayTokenFormattedNumber = stringText.match(/\#number[^)]+\)/g);
1005
- let arrayTokenFormatted = [];
1006
- if (arrayTokenFormattedDate &&
1007
- arrayTokenFormattedDate.length > 0 &&
1008
- arrayTokenFormattedNumber &&
1009
- arrayTokenFormattedNumber.length > 0) {
1010
- arrayTokenFormatted = arrayTokenFormattedDate.concat(arrayTokenFormattedNumber);
1011
- }
1012
- else if (arrayTokenFormattedDate && arrayTokenFormattedDate.length > 0) {
1013
- arrayTokenFormatted = arrayTokenFormattedDate.slice();
1014
- }
1015
- else if (arrayTokenFormattedNumber && arrayTokenFormattedNumber.length > 0) {
1016
- arrayTokenFormatted = arrayTokenFormattedNumber.slice();
1017
- }
1018
- const result = [];
1019
- if (arrayToken) {
1020
- for (const token of arrayToken) {
1021
- const infoToken = { key: token, value: token };
1022
- if (arrayTokenFormatted) {
1023
- for (const tokenFormatted of arrayTokenFormatted) {
1024
- const index = tokenFormatted.indexOf(token);
1025
- if (index >= 0) {
1026
- infoToken.value = tokenFormatted;
1027
- break;
1028
- }
1029
- }
1030
- }
1031
- result.push(infoToken);
1032
- }
1033
- }
1034
- return result;
1035
- }
1036
- changeIdPropertiesOfObject(normalizationColumns, listData) {
1037
- const newData = [];
1038
- listData.forEach((data) => {
1039
- const objData = {};
1040
- Object.keys(data).forEach((property) => {
1041
- if (data.hasOwnProperty(property)) {
1042
- normalizationColumns.forEach((column) => {
1043
- if (column.idColumn.toString() === property) {
1044
- objData[column.key] = data[property];
1045
- }
1046
- });
1047
- }
1048
- });
1049
- if (objData) {
1050
- newData.push(objData);
1051
- }
1052
- });
1053
- return newData;
1054
- }
1055
- generateHtmlByTokensAndData(html, listData, listTokens) {
1056
- const translatedCards = [];
1057
- listData.forEach((data) => {
1058
- const objToken = {};
1059
- const htmlTranslated = { html: html };
1060
- Object.keys(data).forEach((property) => {
1061
- listTokens.forEach((token) => {
1062
- if (property == token.key.replace('${', '').replace('}', '')) {
1063
- objToken[token.key] = data[property];
1064
- htmlTranslated.html = htmlTranslated.html.replace(token.key, data[property]);
1065
- }
1066
- });
1067
- });
1068
- translatedCards.push(htmlTranslated);
1069
- });
1070
- return translatedCards;
1071
- }
1072
- getListTokensByString(stringText) {
1073
- var arrayToken = stringText.match(/\${([^}]+)\}/g);
1074
- var arrayTokenFormattedDate = stringText.match(/\#date[^)]+\)/g);
1075
- var arrayTokenFormattedNumber = stringText.match(/\#number[^)]+\)/g);
1076
- var arrayTokenFormatted = [];
1077
- if (arrayTokenFormattedDate &&
1078
- arrayTokenFormattedDate.length > 0 &&
1079
- arrayTokenFormattedNumber &&
1080
- arrayTokenFormattedNumber.length > 0) {
1081
- arrayTokenFormatted = arrayTokenFormattedDate.concat(arrayTokenFormattedNumber);
1082
- }
1083
- else if (arrayTokenFormattedDate && arrayTokenFormattedDate.length > 0) {
1084
- arrayTokenFormatted = arrayTokenFormattedDate.slice();
1085
- }
1086
- else if (arrayTokenFormattedNumber && arrayTokenFormattedNumber.length > 0) {
1087
- arrayTokenFormatted = arrayTokenFormattedNumber.slice();
1088
- }
1089
- var result = [];
1090
- if (arrayToken) {
1091
- for (const token of arrayToken) {
1092
- let keyType = TokenService.getKeyType(token);
1093
- if (keyType === null) {
1094
- continue;
1095
- }
1096
- var infoToken = { key: token, value: token };
1097
- if (arrayTokenFormatted) {
1098
- for (const tokenFormatted of arrayTokenFormatted) {
1099
- var index = tokenFormatted.indexOf(token);
1100
- if (index >= 0) {
1101
- infoToken.value = tokenFormatted;
1102
- break;
1103
- }
1104
- }
1105
- }
1106
- result.push(infoToken);
1107
- }
1108
- }
1109
- return result;
1110
- // let tokens: any[] = [];
1111
- // let i = this.nextValidPositionTokens(stringText, 0);
1112
- // let count = 0;
1113
- // while (i >= 0 && count <= 10) {
1114
- // let infoToken: {} = null;
1115
- // let nextI: number = i;
1116
- // let character = stringText.substring(i, (i + 1));
1117
- // if (character == "$") {
1118
- // let nextCharacter = stringText.substring((i + 1), (i + 2));
1119
- // // The next character need to be a { sign
1120
- // if (nextCharacter != "{") {
1121
- // i = this.nextValidPositionTokens(stringText, nextI + 1);
1122
- // continue;
1123
- // }
1124
- // let keyToken: string = stringText.substring(i, stringText.indexOf("}", i) + 1);
1125
- // // If the token have a valid key type
1126
- // let keyType: number = TokenService.getKeyType(keyToken.replace("{", "").replace("}", ""));
1127
- // if (keyType === null) {
1128
- // i = this.nextValidPositionTokens(stringText, nextI + 1);
1129
- // continue;
1130
- // }
1131
- // infoToken = {
1132
- // key: keyToken,
1133
- // value: keyToken
1134
- // };
1135
- // nextI = stringText.indexOf("}", i);
1136
- // } else {
1137
- // let nextSign: number = stringText.indexOf("$", i);
1138
- // // We inly support #date($ and #number($ in this 2 scenarios the lenght can't be more than 10 characters
1139
- // if (nextSign < 0 || (nextSign - i) > 10) {
1140
- // i = this.nextValidPositionTokens(stringText, nextI + 1);
1141
- // continue;
1142
- // }
1143
- // let keyToken: string = stringText.substring(stringText.indexOf("$", i), stringText.indexOf("}", i) + 1);
1144
- // let valueToken: string = stringText.substring(i, stringText.indexOf(")", i) + 1);
1145
- // infoToken = {
1146
- // key: keyToken,
1147
- // value: valueToken
1148
- // };
1149
- // nextI = stringText.indexOf(")", i);
1150
- // }
1151
- // tokens.push(infoToken);
1152
- // i = this.nextValidPositionTokens(stringText, nextI);
1153
- // count++;
1154
- // }
1155
- // return tokens;
1156
- }
1157
- nextValidPositionTokens(stringText, nextI) {
1158
- let tokenDollarSign = stringText.indexOf('$', nextI);
1159
- let tokenNumSign = stringText.indexOf('#', nextI);
1160
- let i = tokenDollarSign < 0 && tokenNumSign >= 0
1161
- ? tokenNumSign
1162
- : tokenNumSign < 0 && tokenDollarSign >= 0
1163
- ? tokenDollarSign
1164
- : tokenDollarSign < tokenNumSign
1165
- ? tokenDollarSign
1166
- : tokenNumSign;
1167
- return i;
1168
- }
1169
- /**
1170
- * It reuses replaceTokensFromListObjectPublic but set all keys lobjecttokens as lowercase
1171
- * @param tokenName
1172
- * @param formula
1173
- * @param lObjectTokens
1174
- */
1175
- replaceTokensFromListObjectPublic(tokenName, formula, lObjectTokens) {
1176
- let lDataOrg = [];
1177
- if (lObjectTokens) {
1178
- for (let dataForm in lObjectTokens) {
1179
- lDataOrg[dataForm.toLowerCase()] = lObjectTokens[dataForm];
1180
- }
1181
- }
1182
- return this.replaceTokensFromListObject(tokenName, formula, lDataOrg);
1183
- }
1184
- /**
1185
- * @param tokenName token name
1186
- * @param formula String with the formula to execute
1187
- * @param lObjectTokens List of tokens with the values to replace
1188
- */
1189
- replaceTokensFromListObject(tokenName, formula, lObjectTokens) {
1190
- if (!formula || formula.length == 0) {
1191
- throw {
1192
- message: 'La formula del token ' + tokenName + ' esta vacía',
1193
- title: 'Alerta!',
1194
- error: 'La formula del token ' + tokenName + ' esta vacía. [formula[' + formula + ']]'
1195
- };
1196
- }
1197
- let replacedTokens = formula.toString();
1198
- if (replacedTokens.startsWith('file://')) {
1199
- return replacedTokens;
1200
- }
1201
- // Find the tokens in the formula
1202
- let tokensArray = this.getListTokensByString(replacedTokens);
1203
- if (tokensArray.length == 0) {
1204
- return replacedTokens;
1205
- }
1206
- // If there any token, try to replace
1207
- for (let i = 0; i < tokensArray.length; i++) {
1208
- let objectToken = lObjectTokens[tokensArray[i].key] !== undefined
1209
- ? lObjectTokens[tokensArray[i].key]
1210
- : null;
1211
- let clearKey;
1212
- if (objectToken == null) {
1213
- clearKey = tokensArray[i].key.replace('${', '').replace('}', '').toLowerCase();
1214
- objectToken =
1215
- lObjectTokens[clearKey] !== undefined ? lObjectTokens[clearKey] : null;
1216
- if (objectToken == null) {
1217
- clearKey = tokensArray[i].key
1218
- .replace('{', '')
1219
- .replace('}', '')
1220
- .split('_')[1]
1221
- .toLowerCase();
1222
- objectToken =
1223
- lObjectTokens[clearKey] !== undefined ? lObjectTokens[clearKey] : null;
1224
- if (objectToken === null || objectToken === undefined) {
1225
- const arrayKey = tokensArray[i].key
1226
- .replace('{', '')
1227
- .replace('}', '')
1228
- .split('_')[1]
1229
- .split('.');
1230
- if (arrayKey.length > 0) {
1231
- let value = lObjectTokens;
1232
- for (let index = 0; index < arrayKey.length; index++) {
1233
- let element = arrayKey[index];
1234
- if (index == 0) {
1235
- element = element.toLowerCase();
1236
- }
1237
- value = value[element];
1238
- }
1239
- objectToken = value;
1240
- }
1241
- }
1242
- }
1243
- }
1244
- if (objectToken == null) {
1245
- // If not find the token, by default put an empty string
1246
- /*if (TokenService.excludedToken.indexOf(clearKey) === -1) {
1247
- console.error(
1248
- 'El token ' + tokensArray[i].value + ' no fue encontrado.',
1249
- lObjectTokens,
1250
- tokensArray
1251
- );
1252
- }*/
1253
- objectToken = '';
1254
- }
1255
- if (objectToken != null) {
1256
- // let value: any = Number(objectToken)
1257
- // ? objectToken
1258
- // : Array.isArray(objectToken)
1259
- // ? JSON.stringify(objectToken)
1260
- // : "'" + objectToken + "'";
1261
- let value;
1262
- if (Number(objectToken)) {
1263
- value = Number(objectToken);
1264
- }
1265
- else if (Array.isArray(objectToken)) {
1266
- value = Array.isArray(objectToken);
1267
- }
1268
- else if (JSON.stringify(objectToken)) {
1269
- value = objectToken.original_name
1270
- ? "'" + objectToken.original_name + "'"
1271
- : JSON.stringify(objectToken);
1272
- }
1273
- else {
1274
- value = "'" + objectToken + "'";
1275
- }
1276
- replacedTokens = this.replaceToken(replacedTokens, tokensArray[i].value, value);
1277
- // } else {
1278
- // console.error(lObjectTokens, tokensArray);
1279
- // throw {
1280
- // message: "No se encontró valor para un token",
1281
- // title: "Alerta!",
1282
- // error: "El token " + tokensArray[i].value + " no fue encontrado."
1283
- // };
1284
- //
1285
- // Si es la ultima iteracion y la formula tiene [ es porque tiene un array en el valor que resolvio el token
1286
- if (i == tokensArray.length - 1 && replacedTokens.includes('[')) {
1287
- // Se ponen todos los operandos como elementos en un array ['expresion a', '&&', 'Expresion B']
1288
- let formExpressions = replacedTokens.split(/ (\|\||&&) /);
1289
- let lAuxformExpression = [];
1290
- formExpressions.forEach((expression) => {
1291
- if (expression.charAt(0) == '[') {
1292
- let isTagFound = '';
1293
- isTagFound = this.findTag(expression);
1294
- lAuxformExpression.push(isTagFound);
1295
- }
1296
- else {
1297
- lAuxformExpression.push(expression);
1298
- }
1299
- });
1300
- replacedTokens = lAuxformExpression.join(' ');
1301
- }
1302
- }
1303
- }
1304
- return replacedTokens;
1305
- }
1306
- /**
1307
- * MEtodo que teniendo una expresion de la forma ['tag1', 'tag2']==tag3
1308
- * evalua si tag3 hace parte del array si tiene el operador ==.
1309
- * Si tiene el operador != examina que tag3 no haga parte del array+
1310
- *
1311
- * @param expression Operando que evalua tag. Es de la forma ['tag1', 'tag2']==tag3
1312
- * @returns Retorna 'true' o 'false' en string que despues sera pasado a un eval()
1313
- * mas adelante en el flujo
1314
- */
1315
- findTag(expression) {
1316
- let regexOperator = new RegExp('(===|==|!==|!=)');
1317
- // Retorna el operador
1318
- let operator = expression.match(regexOperator);
1319
- // Si no encuentra un operador segun el patron retorna 'false'
1320
- // para evitar resultados inesperados
1321
- if (operator == null) {
1322
- console.error('No se encontro un operador permitido para la expresion');
1323
- return 'false';
1324
- }
1325
- // Separa la sentencia por el operador
1326
- // La primera parte es el valor por el cual se remplaza el token que es un array en string "['a', 'b']"
1327
- // El segundo es el valor con el cual se va a comparar
1328
- let valueToken, valueToCompare;
1329
- [valueToken, valueToCompare] = expression.split(operator[0]);
1330
- // Se limpia el string correspondiente al array para que los elementos queden separados por ","
1331
- valueToken = valueToken.replace(/[^a-zA-Z0-9 ,]/g, '');
1332
- // Si no hay tags asociados al registro se devuelve 'false'
1333
- if (!valueToken) {
1334
- console.error('No hay tags asociados a esta aplicación');
1335
- return 'false';
1336
- }
1337
- // Se limpia el string correspondiente al valor por comparar
1338
- valueToCompare = valueToCompare.replace(/[^a-zA-Z0-9 ]/g, '');
1339
- // El string correspondiente al array pasa a ser tipo array
1340
- valueToken = valueToken.split(',');
1341
- // Se trata de constatar si el valor a comparar se encuetra o no dentro
1342
- // Si el operador que se encontro == returna true si lo encuentra
1343
- let isTagFound = true;
1344
- switch (operator[0]) {
1345
- case '==':
1346
- isTagFound = valueToken.some((tag) => tag == valueToCompare);
1347
- break;
1348
- case '===':
1349
- isTagFound = valueToken.some((tag) => tag === valueToCompare);
1350
- break;
1351
- case '!==':
1352
- isTagFound = valueToken.some((tag) => tag !== valueToCompare);
1353
- break;
1354
- case '!=':
1355
- isTagFound = valueToken.some((tag) => tag != valueToCompare);
1356
- break;
1357
- default:
1358
- break;
1359
- }
1360
- expression = isTagFound ? 'true' : 'false';
1361
- return expression;
1362
- }
1363
- /**
1364
- * Try to eval the formula depend of the type of fields.
1365
- * @param lStaticToken
1366
- * @param formulaName
1367
- * @param formula
1368
- */
1369
- validateFormula(lStaticToken, formulaName, formula) {
1370
- let evalFormula = false;
1371
- // To validate the formula, first organize the info to key - value array
1372
- let objectTokens = [];
1373
- for (let panel of lStaticToken) {
1374
- for (let groupToken of panel.value) {
1375
- for (let staticToken of groupToken.value) {
1376
- for (let arrayTokenInfo of staticToken) {
1377
- objectTokens[arrayTokenInfo.key] = arrayTokenInfo.object
1378
- ? arrayTokenInfo.object.type == 'number'
1379
- ? '0'
1380
- : ''
1381
- : '';
1382
- }
1383
- }
1384
- }
1385
- }
1386
- try {
1387
- formula = this.replaceTokensFromListObject(formulaName, formula, objectTokens);
1388
- }
1389
- catch (error) {
1390
- //console.error(error);
1391
- throw error;
1392
- }
1393
- if (formula !== null) {
1394
- try {
1395
- let result = formula.startsWith('file://') ? formula : eval(formula);
1396
- evalFormula = true;
1397
- }
1398
- catch (e) {
1399
- //console.error("Error evaluating the formula", e);
1400
- throw {
1401
- message: 'La formula no fue posible evaluar',
1402
- title: 'Alerta!',
1403
- error: e
1404
- };
1405
- }
1406
- }
1407
- return evalFormula;
1408
- }
1409
- getConfigCloningTokenMap(oldPPP, newPPP) {
1410
- return this.httpClient.get(this.environment.host.backend.configuration + 'token/getConfigCloningTokenMap', {
1411
- params: new HttpParams()
1412
- .set('oldPPP', oldPPP.toString())
1413
- .set('newPPP', newPPP.toString())
1414
- });
1415
- }
1416
- 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 }); }
1417
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TokenService, providedIn: 'root' }); }
1418
- }
1419
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TokenService, decorators: [{
1420
- type: Injectable,
1421
- args: [{
1422
- providedIn: 'root'
1423
- }]
1424
- }], ctorParameters: () => [{ type: undefined, decorators: [{
1425
- type: Inject,
1426
- args: ['environment']
1427
- }] }, { type: i1.HttpClient }, { type: i2.FormService }, { type: i3.CurrencyPipe }], propDecorators: { locale: [{
1428
- type: Inject,
1429
- args: [LOCALE_ID]
1430
- }] } });
1431
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXBsaS1jb21tb25zL3NyYy9saWIvc2VydmljZXMvdG9rZW4uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQWMsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDOUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUErQixVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFN0YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7OztBQU1sRCxNQUFNLE9BQU8sWUFBWTtJQUN4QixNQUFNO2FBQ0MsdUJBQWtCLEdBQVcscUJBQXFCLEFBQWhDLENBQWlDO0lBSzFELE1BQU07YUFDQyxxQkFBZ0IsR0FBVyxLQUFLLEFBQWhCLENBQWlCO0lBQ3hDLE1BQU07YUFDQyx1QkFBa0IsR0FBVyxhQUFhLEFBQXhCLENBQXlCO0lBQ2xELE1BQU07YUFDQywyQkFBc0IsR0FBVyxXQUFXLEFBQXRCLENBQXVCO0lBQ3BELE1BQU07YUFDQyx5QkFBb0IsR0FBVyxVQUFVLEFBQXJCLENBQXNCO0lBQ2pELE1BQU07YUFDQyx1QkFBa0IsR0FBVyxVQUFVLEFBQXJCLENBQXNCO0lBQy9DLE1BQU07YUFDQywwQkFBcUIsR0FBVyxXQUFXLEFBQXRCLENBQXVCO0lBQ25ELE1BQU07YUFDQyw4Q0FBeUMsR0FBVyxtQ0FBbUMsQUFBOUMsQ0FBK0M7SUFDL0YsTUFBTTthQUNDLGtDQUE2QixHQUFXLG1CQUFtQixBQUE5QixDQUErQjtJQUNuRSxNQUFNO2FBQ0MscUJBQWdCLEdBQVcsT0FBTyxBQUFsQixDQUFtQjtJQUMxQyxNQUFNO2FBQ0Msc0JBQWlCLEdBQVcsTUFBTSxBQUFqQixDQUFrQjtJ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QVEsRUFBRSxDQUFDO1NBQ2xDLENBQ0QsQ0FBQztJQUNILENBQUM7K0dBM2hEVyxZQUFZLGtCQTBXZixhQUFhO21IQTFXVixZQUFZLGNBRlosTUFBTTs7NEZBRU4sWUFBWTtrQkFIeEIsVUFBVTttQkFBQztvQkFDWCxVQUFVLEVBQUUsTUFBTTtpQkFDbEI7OzBCQTJXRSxNQUFNOzJCQUFDLGFBQWE7dUhBcldJLE1BQU07c0JBQS9CLE1BQU07dUJBQUMsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1cnJlbmN5UGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgTE9DQUxFX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERhdGVVdGlsLCBIRUFERVJfSlNPTiwgUGxpQ25mR3VhcmFudGVlVG9rZW4sIFRva2VuLCBVdGlsU3RyaW5nIH0gZnJvbSAnbmctcGxpLXV0aWwnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEZvcm1pb1V0aWwgfSBmcm9tICcuLi91dGlscy9mb3JtaW8tdXRpbCc7XHJcbmltcG9ydCB7IEZvcm1TZXJ2aWNlIH0gZnJvbSAnLi9mb3JtLnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG5cdHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVG9rZW5TZXJ2aWNlIHtcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU0lHTl9MRVRURVJfVEFHX0lEOiBzdHJpbmcgPSAnX3NpZ24tbGV0dGVyLXRhZy1pZCc7XHJcblxyXG5cdC8qKiAqL1xyXG5cdEBJbmplY3QoTE9DQUxFX0lEKSBwdWJsaWMgbG9jYWxlOiBzdHJpbmc7XHJcblxyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBUT0tFTl9MQUJFTF9GT1JNOiBzdHJpbmcgPSAnRnJtJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgVE9LRU5fTEFCRUxfQlVER0VUOiBzdHJpbmcgPSAnUHJlc3VwdWVzdG8nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBUT0tFTl9MQUJFTF9DQUxDVUxBVEVEOiBzdHJpbmcgPSAnQ2FsY3VsYWRvJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgVE9LRU5fTEFCRUxfU05BUFNIT1Q6IHN0cmluZyA9ICdTbmFwc2hvdCc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFRPS0VOX0xBQkVMX1NUQVRJQzogc3RyaW5nID0gJ0VzdMOhdGljbyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFRPS0VOX0xBQkVMX0RPQ1VNRU5UTzogc3RyaW5nID0gJ0RvY3VtZW50byc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFRPS0VOX0xBQkVMX0RPQ1VNRU5UT19BTkFMSVNJU19BVVRPTUFUSUNPOiBzdHJpbmcgPSAnQW7DoWxpc2lzIGF1dG9tw6F0aWNvIGRlIGRvY3VtZW50b3MnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBUT0tFTl9ET0NVTUVOVE9fQU5BTFlTSVNfVFlQRTogc3RyaW5nID0gJ2RvY3VtZW50X2FuYWx5c2lzJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgVE9LRU5fTEFCRUxfVEFTSzogc3RyaW5nID0gJ1RhcmVhJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgVE9LRU5fTEFCRUxfVEFTS0w6IHN0cmluZyA9ICd0YXNrJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgVE9LRU5fTEFCRUxfR1VBUkFOVEVFOiBzdHJpbmcgPSAnR2FyYW50aWEnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBCVURHRVRfVE9LRU5TX0tFWV9UT1RBTF9BTU9VTlQ6IHN0cmluZyA9ICd0b3RhbEFtb3VudCc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIEJVREdFVF9UT0tFTlNfS0VZX0FQUExJQ0FUSU9OX1BST0NFU1NfVE9UQUxfQU1PVU5UOiBzdHJpbmcgPSAnYXBwbGljYXRpb25Ub3RhbCc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIEJVREdFVF9UT0tFTlNfS0VZX0FQUExJQ0FUSU9OX1BST0NFU1NfVE9UQUxfT1dOX0ZPVU5EUzogc3RyaW5nID0gJ2FwcGxpY2F0aW9uT3duRm91bmRzJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgQlVER0VUX1RPS0VOU19LRVlfQVBQTElDQVRJT05fUFJPQ0VTU19UT1RBTF9GSU5BTkNJTkc6IHN0cmluZyA9ICdhcHBsaWNhdGlvbkZpbmFuY2luZyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIEJVREdFVF9UT0tFTlNfS0VZX0xFR0FMSVpBVElPTl9QUk9DRVNTX1RPVEFMX0FNT1VOVDogc3RyaW5nID0gJ2xlZ2FsaXphdGlvblRvdGFsJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgQlVER0VUX1RPS0VOU19LRVlfTEVHQUxJWkFUSU9OX1BST0NFU1NfVE9UQUxfT1dOX0ZPVU5EUzogc3RyaW5nID1cclxuXHRcdCdsZWdhbGl6YXRpb25Pd25Gb3VuZHMnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBCVURHRVRfVE9LRU5TX0tFWV9MRUdBTElaQVRJT05fUFJPQ0VTU19UT1RBTF9GSU5BTkNJTkc6IHN0cmluZyA9ICdsZWdhbGl6YXRpb25GaW5hbmNpbmcnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBCVURHRVRfVE9LRU5TX0tFWV9JTlNVUkFOQ0VfQU1PVU5UOiBzdHJpbmcgPSAnaW5zdXJhbmNlQW1vdW50JztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgTEVHQUxJWkFUSU9OX09SX0FQUExJQ0FUSU9OX1RPVEFMX0ZJTkFOQ0lORzogc3RyaW5nID1cclxuXHRcdCdsZWdsaXphdGlvbk9yQXBwbGljYXRpb25Ub3RhbEZpbmFuY2luZyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIEJVREdFVF9UT0tFTlNfS0VZX1JFU1VNRV9DQVRFR09SWV9ZRUFSOiBzdHJpbmcgPSAncmVzdW1lQ2F0ZWdvcnlZZWFyJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgQlVER0VUX1RPS0VOU19LRVlfRkVDSEFfRklOQU5DSU5HX1NUQVJUOiBzdHJpbmcgPSAnZmVjaGFJbmljaW9GaW5hbmNpYWNpb24nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBCVURHRVRfVE9LRU5TX0tFWV9GRUNIQV9GSU5BTkNJTkdfRU5EOiBzdHJpbmcgPSAnZmVjaGFGaW5GaW5hbmNpYWNpb24nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBCVURHRVRfVE9LRU5TX0RVUkFUSU9OX1NUVURJRVM6IHN0cmluZyA9ICdkdXJhY2lvbkVzdHVkaW9zJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgQlVER0VUX1RPS0VOU19GSU5BTkNJTkdfRFVSQVRJT046IHN0cmluZyA9ICdkdXJhY2lvbkZpbmFuY2lhY2lvbic7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfS0VZX0NPRElHT19WRVJJRklDQUNJT046IHN0cmluZyA9ICdjb2RpZ29WZXJpZmljYWNpb24nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0tFWV9BX1FVSUVOX1ZBX0RJUklHSURPOiBzdHJpbmcgPSAnYVF1aWVuVmFEaXJpZ2lkbyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfS0VZX0ZFQ0hBX0FDVFVBTDogc3RyaW5nID0gJ2ZlY2hhQWN0dWFsJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfU1RBVFVTX05BTUU6IHN0cmluZyA9ICdzdGF0dXNOYW1lJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfUEFUUk9DSU5BRE9SOiBzdHJpbmcgPSAncGxpUGF0cm9jaW5hZG9yJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfUEFUUk9DSU5BRE9SX0NPUlRPOiBzdHJpbmcgPSAncGxpUGF0cm9jaW5hZG9yQ29ydG8nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0tFWV9QUk9HUkFNQTogc3RyaW5nID0gJ3BsaVByb2dyYW1hJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfUFJPR1JBTUFfQ09SVE86IHN0cmluZyA9ICdwbGlQcm9ncmFtYUNvcnRvJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfUFJPTU9DSU9OOiBzdHJpbmcgPSAncGxpUHJvbW9jaW9uJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfUFJPTU9DSU9OX0NPUlRPOiBzdHJpbmcgPSAncGxpUHJvbW9jaW9uQ29ydG8nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0tFWV9BTklPX1BST01PQ0lPTjogc3RyaW5nID0gJ2FuaW9Qcm9tb2Npb24nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0tFWV9JU09fTU9ORURBX0JBU0U6IHN0cmluZyA9ICdpc29Nb25lZGFCYXNlJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfU0FMVURPX0NPTVBMRU1FTlRBUklPOiBzdHJpbmcgPSAnc2FsdWRvQ29tcGxlbWVudGFyaW8nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0tFWV9OVU1CRVJfQVBQTElDQVRJT046IHN0cmluZyA9ICdudW1lcm9SYWRpY2Fkbyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfS0VZX1VTRVJfSU5JVElBTFM6IHN0cmluZyA9ICdpbmljaWFsZXNVc3VhcmlvJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfTEVUVEVSX1NJR046IHN0cmluZyA9ICdmaXJtYUNhcnRhJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19DT01NSVRURUVfTkFNRTogc3RyaW5nID0gJ2NvbWl0ZU5vbWJyZSc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX1NFR01FTlRBVElPTjogc3RyaW5nID0gJ2NvbWl0ZVNlZ21lbnRhY2lvbic7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX0FHR1JVUEFUSU9OOiBzdHJpbmcgPSAnY29taXRlQWdydXBhY2lvbic7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX0NVVExJTkVfREFURTogc3RyaW5nID0gJ2NvbWl0ZUZlY2hhTGluZWEnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0NPTkZJUk1fTEVHQUxJWkFUSU9OX0FQUE9JTlRNRU5UOiBzdHJpbmcgPSAnY29uZmlybWFjaW9uQ2l0YSc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfQ09ERUJUT1JfRE9DVU1FTlRfTlVNQkVSOiBzdHJpbmcgPSAnbnVtZXJvRG9jdW1lbnRvQ29kZXVkb3InO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0NPREVCVE9SX0RPQ1VNRU5UX1RZUEU6IHN0cmluZyA9ICd0aXBvRG9jdW1lbnRvQ29kZXVkb3InO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0NPREVCVE9SX05BTUU6IHN0cmluZyA9ICdub21icmVzQ29kZXVkb3InO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0NPREVCVE9SX0xBU1ROQU1FOiBzdHJpbmcgPSAnYXBlbGxpZG9zQ29kZXVkb3InO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX1RZUEVfQ09ERUJUT1I6IHN0cmluZyA9ICd0aXBvUGVyc29uYUNvZGV1ZG9yJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19DT0RFQlRPUl9SRVZJRVdFUjogc3RyaW5nID0gJ3Jldmlzb3JDb2RldWRvcmVzJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19UT1RBTF9XRUlHSFRFRDogc3RyaW5nID0gJ3BvbmRlcmFkb1RvdGFsJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19DT05TRUNVVElWRV9HVUFSQU5URUU6IHN0cmluZyA9ICdjb25zZWN1dGl2b0dhcmFudGlhcyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfREFZOiBzdHJpbmcgPSAnZGlhJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19NT05USDogc3RyaW5nID0gJ21lcyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfWUVBUjogc3RyaW5nID0gJ2Fubyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfUkVQUkVTRU5UQVRJVkVfTkFNRTogc3RyaW5nID0gJ25vbWJyZXNSZXByZXNlbnRhbnRlJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19SRVBSRVNFTlRBVElWRV9MQVNUTkFNRTogc3RyaW5nID0gJ2FwZWxsaWRvc1JlcHJlc2VudGFudGUnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX1JFUFJFU0VOVEFUSVZFX0RPQ1VNRU5UX05VTUJFUjogc3RyaW5nID0gJ2NlZHVsYVJlcHJlc2VudGFudGUnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0NJVFlfU0lHTkFUVVJFOiBzdHJpbmcgPSAnY2l1ZGFkRmlybWEnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX1VTRVJfVFlQRV9DUkVESVRfU1RVRFk6IHN0cmluZyA9ICd0aXBvVXN1YXJpb0VzdHVkaW9DcmVkaXRvJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19DT0RFQlRPUl9WRUhJQ0xFU19RVUFOVElUWTogc3RyaW5nID0gJ2NhbnRpZGFkVmVoaWN1bG9zQ29kZXVkb3InO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0NPREVCVE9SX0FTU0VUU19RVUFOVElUWTogc3RyaW5nID0gJ2NhbnRpZGFkQmllbmVzQ29kZXVkb3InO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0xJU1RfQ09ERUJUT1JTOiBzdHJpbmcgPSAnbGlzdGFDb2RldWRvcmVzJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOX0lOR1JFU09fQ09ERVVET1JfSEFCRUFTX0RBVEE6IHN0cmluZyA9ICdpbmdyZXNvQ29kZXVkb3JIYWJlYXNEYXRhJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOX1BERl9SRVNVTUVOX0NPREVVRE9SOiBzdHJpbmcgPSAncGRmUmVzdW1lbkNvZGV1ZG9yJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19RVUFOVElUWV9WRUhJQ0xFX0JFTkVGSUNJQVJZOiBzdHJpbmcgPSAnY2FudGlkYWRWZWhpY3Vsb3NTZWxlY2Npb25hZG8nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX1FVQU5USVRZX0FTU0VUU19CRU5FRklDSUFSWTogc3RyaW5nID0gJ2NhbnRpZGFkQmllbmVzU2VsZWNjaW9uYWRvJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19CRU5fQ09ESUdPOiBzdHJpbmcgPSAnYmVuQ29kaWdvJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOX0NSRURJVF9SRVZJRVdFUl9PQlNFUlZBVElPTlNfQ09ERUJUT1I6IHN0cmluZyA9XHJcblx0XHQnY3JlZGl0UmV2aWV3ZXJPYnNlcnZhdGlvbnNDb2RlYnRvcic7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTl9DUkVESVRfUkVWSUVXRVJfT0JTRVJWQVRJT05TOiBzdHJpbmcgPSAnY3JlZGl0UmV2aWV3ZXJPYnNlcnZhdGlvbnMnO1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5fVEFHX05BTUU6IHN0cmluZyA9ICd0YWdOYW1lJztcclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOX05BTUVfUkVWSUVXRVJfVEFTSyA9ICduYW1lUmV2aXdlclRhc2snO1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5fTEFTVF9OQU1FX1JFVklFV0VSX1RBU0sgPSAnbGFzdE5hbWVSZXZpd2VyVGFzayc7XHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTl9UQVNLX1RPVEFMX0FTU0lHTkVEX1RPX1JFVklFV0VSID0gJ3Rhc2tUb3RhbEFzc2lnbmVkVG9SZXZpZXdlcic7XHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTl9TVVJOQU1FID0gJ3N1cm5hbWUnO1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TOiBhbnlbXSA9IFtcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19LRVlfUEFUUk9DSU5BRE9SLFxyXG5cdFx0XHRsYWJlbDogJ1BhdHJvY2luYWRvcidcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX1BST0dSQU1BLFxyXG5cdFx0XHRsYWJlbDogJ1Byb2dyYW1hJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19LRVlfUFJPTU9DSU9OLFxyXG5cdFx0XHRsYWJlbDogJ1Byb21vY2nDs24nXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9BTklPX1BST01PQ0lPTixcclxuXHRcdFx0bGFiZWw6ICdBw7FvIHByb21vY2nDs24nXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9JU09fTU9ORURBX0JBU0UsXHJcblx0XHRcdGxhYmVsOiAnSVNPIE1vbmVkYSBiYXNlJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19LRVlfU0FMVURPX0NPTVBMRU1FTlRBUklPLFxyXG5cdFx0XHRsYWJlbDogJ1NhbHVkbyBjb21wbGVtZW50YXJpbydcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX0NPRElHT19WRVJJRklDQUNJT04sXHJcblx0XHRcdGxhYmVsOiAnQ8OzZGlnbyBkZSB2ZXJpZmljYWNpw7NuJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19LRVlfQV9RVUlFTl9WQV9ESVJJR0lETyxcclxuXHRcdFx0bGFiZWw6ICdBIHF1aWVuIHZhIGRpcmlnaWRvJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19LRVlfRkVDSEFfQUNUVUFMLFxyXG5cdFx0XHRsYWJlbDogJ0ZlY2hhIGFjdHVhbCdcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX1NUQVRVU19OQU1FLFxyXG5cdFx0XHRsYWJlbDogJ0VzdGFkbyBhY3R1YWwnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9OVU1CRVJfQVBQTElDQVRJT04sXHJcblx0XHRcdGxhYmVsOiAnTsO6bWVybyByYWRpY2FkbydcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX1VTRVJfSU5JVElBTFMsXHJcblx0XHRcdGxhYmVsOiAnSW5pY2lhbGVzIGRlIHVzdWFyaW8nXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9MRVRURVJfU0lHTixcclxuXHRcdFx0bGFiZWw6ICdGaXJtYSBkZSBjYXJ0YXMnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPTU1JVFRFRV9OQU1FLFxyXG5cdFx0XHRsYWJlbDogJ05vbWJyZSBjb21pdMOpJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DT01NSVRURUVfU0VHTUVOVEFUSU9OLFxyXG5cdFx0XHRsYWJlbDogJ1NlZ21lbnRhY2nDs24gY29taXTDqSdcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX0FHR1JVUEFUSU9OLFxyXG5cdFx0XHRsYWJlbDogJ0FncnVwYWNpw7NuIGNvbWl0w6knXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPTU1JVFRFRV9DVVRMSU5FX0RBVEUsXHJcblx0XHRcdGxhYmVsOiAnRmVjaGEgTMOtbmVhIGRlIGNvcnRlJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DT05GSVJNX0xFR0FMSVpBVElPTl9BUFBPSU5UTUVOVCxcclxuXHRcdFx0bGFiZWw6ICdDb25maXJtYWNpw7NuIGRlIGNpdGEnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPREVCVE9SX0RPQ1VNRU5UX05VTUJFUixcclxuXHRcdFx0bGFiZWw6ICdOw7ptZXJvIGRlIGRvY3VtZW50byBkZSBjb2RldWRvcidcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09ERUJUT1JfRE9DVU1FTlRfVFlQRSxcclxuXHRcdFx0bGFiZWw6ICdUaXBvIGRlIGRvY3VtZW50byBkZSBjb2RldWRvcidcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09ERUJUT1JfTkFNRSxcclxuXHRcdFx0bGFiZWw6ICdOb21icmVzIGNvZGV1ZG9yJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DT0RFQlRPUl9MQVNUTkFNRSxcclxuXHRcdFx0bGFiZWw6ICdBcGVsbGlkb3MgY29kZXVkb3InXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX1RZUEVfQ09ERUJUT1IsXHJcblx0XHRcdGxhYmVsOiAnVGlwbyBkZSBwZXJzb25hIGNvZGV1ZG9yJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DT0RFQlRPUl9WRUhJQ0xFU19RVUFOVElUWSxcclxuXHRcdFx0bGFiZWw6ICdDYW50aWRhZCB2ZWhpY3Vsb3MgY29kZXVkb3InXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPREVCVE9SX0FTU0VUU19RVUFOVElUWSxcclxuXHRcdFx0bGFiZWw6ICdDYW50aWRhZCBiaWVuZXMgY29kZXVkb3InXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPREVCVE9SX1JFVklFV0VSLFxyXG5cdFx0XHRsYWJlbDogJ1Jldmlzb3IgZGUgY29kZXVkb3JlcydcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfVE9UQUxfV0VJR0hURUQsXHJcblx0XHRcdGxhYmVsOiAnUG9uZGVyYWRvIHRvdGFsJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DT05TRUNVVElWRV9HVUFSQU5URUUsXHJcblx0XHRcdGxhYmVsOiAnQ29uc2VjdXRpdm8gZGUgZ2FyYW50aWFzJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19SRVBSRVNFTlRBVElWRV9OQU1FLFxyXG5cdFx0XHRsYWJlbDogJ05vbWJyZXMgcmVwcmVzZW50YW50ZSBsZWdhbCdcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfUkVQUkVTRU5UQVRJVkVfTEFTVE5BTUUsXHJcblx0XHRcdGxhYmVsOiAnQXBlbGxpZG9zIHJlcHJlc2VudGFudGUgbGVnYWwnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX1JFUFJFU0VOVEFUSVZFX0RPQ1VNRU5UX05VTUJFUixcclxuXHRcdFx0bGFiZWw6ICdDZWR1bGEgcmVwcmVzZW50YW50ZSBsZWdhbCdcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfVVNFUl9UWVBFX0NSRURJVF9TVFVEWSxcclxuXHRcdFx0bGFiZWw6ICdUaXBvIHVzdWFyaW8gZXN0dWRpbyBjcsOpZGl0bydcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfREFZLFxyXG5cdFx0XHRsYWJlbDogJ0RpYSdcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfTU9OVEgsXHJcblx0XHRcdGxhYmVsOiAnTWVzJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19ZRUFSLFxyXG5cdFx0XHRsYWJlbDogJ0HDsW8nXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NJVFlfU0lHTkFUVVJFLFxyXG5cdFx0XHRsYWJlbDogJ0NpdWRhZCBkZSBsYSBmaXJtYSdcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfTElTVF9DT0RFQlRPUlMsXHJcblx0XHRcdGxhYmVsOiAnTGlzdGEgZGUgY29kZXVkb3JlcydcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTl9JTkdSRVNPX0NPREVVRE9SX0hBQkVBU19EQVRBLFxyXG5cdFx0XHRsYWJlbDogJ0luZ3Jlc28gQ29kZXVkb3IgSGFiZWFzIERhdGEnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5fUERGX1JFU1VNRU5fQ09ERVVET1IsXHJcblx0XHRcdGxhYmVsOiAnUGRmIGNvZGV1ZG9yJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19RVUFOVElUWV9WRUhJQ0xFX0JFTkVGSUNJQVJZLFxyXG5cdFx0XHRsYWJlbDogJ0NhbnRpZGFkIGRlIHZlaMOtY3Vsb3MgZGVsIHNlbGVjY2lvbmFkbydcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfUVVBTlRJVFlfQVNTRVRTX0JFTkVGSUNJQVJZLFxyXG5cdFx0XHRsYWJlbDogJ0NhbnRpZGFkIGJpZW5lcyBkZWwgc2VsZWNjaW9uYWRvJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19CRU5fQ09ESUdPLFxyXG5cdFx0XHRsYWJlbDogJ0PDs2RpZ28gYmVuZWZpY2lhcmlvJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOX0NSRURJVF9SRVZJRVdFUl9PQlNFUlZBVElPTlMsXHJcblx0XHRcdGxhYmVsOiAnT2JzZXJ2YWNpb25lcyByZXZpc29yIGZpbmFuY2llcm8gc2VsZWNjaW9uYWRvJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOX0NSRURJVF9SRVZJRVdFUl9PQlNFUlZBVElPTlNfQ09ERUJUT1IsXHJcblx0XHRcdGxhYmVsOiAnT2JzZXJ2YWNpb25lcyByZXZpc29yIGZpbmFuY2llcm8gY29kZXVkb3JlcydcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTl9UQUdfTkFNRSxcclxuXHRcdFx0bGFiZWw6ICdOb21icmUgZGVsIHRhZydcclxuXHRcdH0sXHJcblx0XHR7IGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTl9OQU1FX1JFVklFV0VSX1RBU0ssIGxhYmVsOiAnTm9tYnJlIHJldmlzb3IgdGFyZWFzJyB9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5fTEFTVF9OQU1FX1JFVklFV0VSX1RBU0ssXHJcblx0XHRcdGxhYmVsOiAnQXBlbGxpZG8gcmV2aXNvciB0YXJlYXMnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5fVEFTS19UT1RBTF9BU1NJR05FRF9UT19SRVZJRVdFUixcclxuXHRcdFx0bGFiZWw6ICdUb3RhbCB0YXJlYXMgYXNpZ25hZGFzIGEgcmV2aXNvcidcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTl9TVVJOQU1FLFxyXG5cdFx0XHRsYWJlbDogJ0FwZWxsaWRvcyBjYW5kaWRhdG8nXHJcblx0XHR9XHJcblx0XTtcclxuXHJcblx0c3RhdGljIGV4Y2x1ZGVkVG9rZW4gPSBbXHJcblx0XHRUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19VU0VSX1RZUEVfQ1JFRElUX1NUVURZLnRvTG93ZXJDYXNlKCksXHJcblx0XHRUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DT0RFQlRPUl9WRUhJQ0xFU19RVUFOVElUWS50b0xvd2VyQ2FzZSgpLFxyXG5cdFx0VG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09ERUJUT1JfQVNTRVRTX1FVQU5USVRZLnRvTG93ZXJDYXNlKClcclxuXHRdO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdEBJbmplY3QoJ2Vudmlyb25tZW50JykgcHJpdmF0ZSBlbnZpcm9ubWVudCxcclxuXHRcdHByaXZhdGUgaHR0cENsaWVudDogSHR0cENsaWVudCxcclxuXHRcdHByaXZhdGUgZm9ybVNlcnZpY2U6IEZvcm1TZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSBjdXJyZW5jeVBpcGU6IEN1cnJlbmN5UGlwZVxyXG5cdCkge31cclxuXHJcblx0LyoqIFRoaXMgcHJvbWlzZSBhbGxvd3MgdG8gZXhlY3V0ZSBhIGZ1bmN0aW9uIHdoZW4gY29uc3VsdGluZyB0aGUgZm9ybSBmaWVsZHMuICovXHJcblx0Z2V0Rm9ybUZpZWxkc0J5UHJvbUNvZGUocHJvbUNvZGlnbyk6IFByb21pc2U8YW55W10+IHtcclxuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblx0XHRcdC8vIFNlYXJjaCB0aGUgZHluYW1pYyBmb3JtXHJcblx0XHRcdGxldCBsRm9ybUZpZWxkc1Rva2VuOiBhbnlbXSA9IG51bGw7XHJcblx0XHRcdHRoaXMuZm9ybVNlcnZpY2UuZ2V0QnlQcm9tQ29kaWdvKHByb21Db2RpZ28pLnN1YnNjcmliZSh7XHJcblx0XHRcdFx0bmV4dDogKGFycmF5Rm9ybXM6IGFueSkgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKGFycmF5Rm9ybXMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGZvcm1zIG9mIGFycmF5Rm9ybXMpIHtcclxuXHRcdFx0XHRcdFx0XHRsZXQgY29tcG9uZW50cyA9IFtdO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnRzLnB1c2goLi4uRm9ybWlvVXRpbC5nZXRDb21wb25lbnRzKGZvcm1zLmNvbXBvbmVudHMpKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKGZvcm1zLmNvbXBvbmVudHMgJiYgZm9ybXMuY29tcG9uZW50cy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGNvbXBvbmVudHMgb2YgZm9ybXMuY29tcG9uZW50cykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoY29tcG9uZW50cy5jb21wb25lbnRzICYmIGNvbXBvbmVudHMuY29tcG9uZW50cy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBjb21wb25lbnQgb2YgY29tcG9uZW50cy5jb21wb25lbnRzKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoY29tcG9uZW50LmNvbHVtbnMgJiYgY29tcG9uZW50LmNvbHVtbnMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGNDb21wb25lbnRzIG9mIGNvbXBvbmVudC5jb2x1bW5zKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y0NvbXBvbmVudHMuY29tcG9uZW50cyAmJlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y0NvbXBvbmVudHMuY29tcG9uZW50cy5sZW5ndGggPiAwXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZXJhdG9yIG9mIGNDb21wb25lbnRzLmNvbXBvbmVudHMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGl0ZXJhdG9yLnR5cGUgPT09ICdhZGRyZXNzJykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlbGV0ZSBpdGVyYXRvci5jb21wb25lbnRzO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0bGV0IGZvcm06IGFueSA9IGFycmF5Rm9ybXM7XHJcblx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdCFmb3JtIHx8XHJcblx0XHRcdFx0XHRcdCFmb3JtWzBdIHx8XHJcblx0XHRcdFx0XHRcdCFmb3JtWzBdLnByb21Db2RpZ28gfHxcclxuXHRcdFx0XHRcdFx0Zm9ybVswXS5wcm9tQ29kaWdvICE9IHByb21Db2RpZ29cclxuXHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHQvLyB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJzQwNCddKTtcclxuXHRcdFx0XHRcdFx0cmVzb2x2ZShsRm9ybUZpZWxkc1Rva2VuKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGxGb3JtRmllbGRzVG9rZW4gPSBbXTtcclxuXHRcdFx0XHRcdGZvciAobGV0IGZvcm1Db21wIG9mIGZvcm0pIHtcclxuXHRcdFx0XHRcdFx0bGV0IG5ld0NvbXBvbmVudHM6IGFueTtcclxuXHRcdFx0XHRcdFx0bGV0IGNvbXBvbmVudHM6IGFueVtdID0gW107XHJcblx0XHRcdFx0XHRcdGlmIChmb3JtQ29tcC5jb21wb25lbnRzKSB7XHJcblx0XHRcdFx0XHRcdFx0bmV3Q29tcG9uZW50cyA9IGZvcm1Db21wLmNvbXBvbmVudHM7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoZm9ybUNvbXAuY29sdW1ucykge1xyXG5cdFx0XHRcdFx0XHRcdG5ld0NvbXBvbmVudHMgPSBmb3JtQ29tcC5jb2x1bW5zO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGlmIChuZXdDb21wb25lbnRzICYmIFV0aWxTdHJpbmcuaXNWYWxpZChmb3JtQ29tcC50aXRsZSkpIHtcclxuXHRcdFx0XHRcdFx0XHRsRm9ybUZpZWxkc1Rva2VuLnB1c2goe1xyXG5cdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuZ2V0S2V5Rm9ybXVsYXJpbyhmb3JtQ29tcC50aXRsZSksXHJcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBmb3JtQ29tcC50aXRsZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0b2JqZWN0OiBmb3JtQ29tcFxyXG5cdFx0XHRcdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBbXVxyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdGxGb3JtRmllbGRzVG9rZW5bbEZvcm1GaWVsZHNUb2tlbi5sZW5ndGggLSAxXS52YWx1ZSA9XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmdldENvbXBvbmVuZXRGb3JtKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb21wb25lbnRzLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRuZXdDb21wb25lbnRzLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRudWxsLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0bnVsbFxyXG5cdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0cmVzb2x2ZShsRm9ybUZpZWxkc1Rva2VuKTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGVycm9yOiAoZXJyb3IpID0+IHtcclxuXHRcdFx0XHRcdHJlamVjdChlcnJvcik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0Z2V0Rm9ybUZpZWxkc0J5UHJvbUNvZGVXaXRoRWRpdEdyaWRzKHByb21Db2RpZ28pOiBQcm9taXNlPGFueVtdPiB7XHJcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cdFx0XHQvLyBTZWFyY2ggdGhlIGR5bmFtaWMgZm9ybVxyXG5cdFx0XHRsZXQgbEZvcm1GaWVsZHNUb2tlbjogYW55W10gPSBudWxsO1xyXG5cdFx0XHR0aGlzLmZvcm1TZXJ2aWNlLmdldEJ5UHJvbUNvZGlnbyhwcm9tQ29kaWdvKS5zdWJzY3JpYmUoe1xyXG5cdFx0XHRcdG5leHQ6IChhcnJheUZvcm1zOiBhbnkpID0+IHtcclxuXHRcdFx0XHRcdGlmIChhcnJheUZvcm1zLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBmb3JtcyBvZiBhcnJheUZvcm1zKSB7XHJcblx0XHRcdFx0XHRcdFx0bGV0IGNvbXBvbmVudHMgPSBbXTtcclxuXHJcblx0XHRcdFx0XHRcdFx0Y29tcG9uZW50cy5wdXNoKFxyXG5cdFx0XHRcdFx0XHRcdFx0Li4uRm9ybWlvVXRpbC5nZXRDb21wb25lbnRzV2l0aEVkaXRHcmlkcyhmb3Jtcy5jb21wb25lbnRzKVxyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmIChmb3Jtcy5jb21wb25lbnRzICYmIGZvcm1zLmNvbXBvbmVudHMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBjb21wb25lbnRzIG9mIGZvcm1zLmNvbXBvbmVudHMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNvbXBvbmVudHMuY29tcG9uZW50cyAmJiBjb21wb25lbnRzLmNvbXBvbmVudHMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgY29tcG9uZW50IG9mIGNvbXBvbmVudHMuY29tcG9uZW50cykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNvbXBvbmVudC5jb2x1bW5zICYmIGNvbXBvbmVudC5jb2x1bW5zLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBjQ29tcG9uZW50cyBvZiBjb21wb25lbnQuY29sdW1ucykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNDb21wb25lbnRzLmNvbXBvbmVudHMgJiZcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNDb21wb25lbnRzLmNvbXBvbmVudHMubGVuZ3RoID4gMFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVyYXRvciBvZiBjQ29tcG9uZW50cy5jb21wb25lbnRzKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChpdGVyYXRvci50eXBlID09PSAnYWRkcmVzcycpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZWxldGUgaXRlcmF0b3IuY29tcG9uZW50cztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGxldCBmb3JtOiBhbnkgPSBhcnJheUZvcm1zO1xyXG5cdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHQhZm9ybSB8fFxyXG5cdFx0XHRcdFx0XHQhZm9ybVswXSB8fFxyXG5cdFx0XHRcdFx0XHQhZm9ybVswXS5wcm9tQ29kaWdvIHx8XHJcblx0XHRcdFx0XHRcdGZvcm1bMF0ucHJvbUNvZGlnbyAhPSBwcm9tQ29kaWdvXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0Ly8gdGhpcy5yb3V0ZXIubmF2aWdhdGUoWyc0MDQnXSk7XHJcblx0XHRcdFx0XHRcdHJlc29sdmUobEZvcm1GaWVsZHNUb2tlbik7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRsRm9ybUZpZWxkc1Rva2VuID0gW107XHJcblx0XHRcdFx0XHRmb3IgKGxldCBmb3JtQ29tcCBvZiBmb3JtKSB7XHJcblx0XHRcdFx0XHRcdGxldCBuZXdDb21wb25lbnRzOiBhbnk7XHJcblx0XHRcdFx0XHRcdGxldCBjb21wb25lbnRzOiBhbnlbXSA9IFtdO1xyXG5cdFx0XHRcdFx0XHRpZiAoZm9ybUNvbXAuY29tcG9uZW50cykge1xyXG5cdFx0XHRcdFx0XHRcdG5ld0NvbXBvbmVudHMgPSBmb3JtQ29tcC5jb21wb25lbnRzO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGZvcm1Db21wLmNvbHVtbnMpIHtcclxuXHRcdFx0XHRcdFx0XHRuZXdDb21wb25lbnRzID0gZm9ybUNvbXAuY29sdW1ucztcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAobmV3Q29tcG9uZW50cyAmJiBVdGlsU3RyaW5nLmlzVmFsaWQoZm9ybUNvbXAudGl0bGUpKSB7XHJcblx0XHRcdFx0XHRcdFx0bEZvcm1GaWVsZHNUb2tlbi5wdXNoKHtcclxuXHRcdFx0XHRcdFx0XHRcdHRpdGxlOiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLmdldEtleUZvcm11bGFyaW8oZm9ybUNvbXAudGl0bGUpLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogZm9ybUNvbXAudGl0bGUsXHJcblx0XHRcdFx0XHRcdFx0XHRcdG9iamVjdDogZm9ybUNvbXBcclxuXHRcdFx0XHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogW11cclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRsRm9ybUZpZWxkc1Rva2VuW2xGb3JtRmllbGRzVG9rZW4ubGVuZ3RoIC0gMV0udmFsdWUgPVxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5nZXRDb21wb25lbmV0Rm9ybShcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50cyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0bmV3Q29tcG9uZW50cyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0bnVsbCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0XHRcdG51bGxcclxuXHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJlc29sdmUobEZvcm1GaWVsZHNUb2tlbik7XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRlcnJvcjogKGVycm9yKSA9PiB7XHJcblx0XHRcdFx0XHRyZWplY3QoZXJyb3IpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGdldEZvcm1GaWVsZHNCeUZvcm1JZChmb3JtSWQ6IHN0cmluZyk6IFByb21pc2U8YW55W10+IHtcclxuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblx0XHRcdC8vIFNlYXJjaCB0aGUgZHluYW1pYyBmb3JtXHJcblx0XHRcdGxldCBsRm9ybUZpZWxkc1Rva2VuOiBhbnlbXSA9IG51bGw7XHJcblx0XHRcdHRoaXMuZm9ybVNlcnZpY2UuZ2V0QnlJZChmb3JtSWQpLnN1YnNjcmliZShcclxuXHRcdFx0XHQocmVzdWx0OiBhbnkpID0+IHtcclxuXHRcdFx0XHRcdGxldCBmb3JtOiBhbnkgPSByZXN1bHQ7XHJcblx0XHRcdFx0XHRpZiAoIWZvcm0gfHwgIWZvcm1bMF0pIHtcclxuXHRcdFx0XHRcdFx0cmVzb2x2ZShsRm9ybUZpZWxkc1Rva2VuKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGxGb3JtRmllbGRzVG9rZW4gPSBbXTtcclxuXHRcdFx0XHRcdGZvciAobGV0IGZvcm1Db21wIG9mIGZvcm0pIHtcclxuXHRcdFx0XHRcdFx0bGV0IG5ld0NvbXBvbmVudHM6IGFueTtcclxuXHRcdFx0XHRcdFx0bGV0IGNvbXBvbmVudHM6IGFueVtdID0gW107XHJcblx0XHRcdFx0XHRcdGlmIChmb3JtQ29tcC5jb21wb25lbnRzKSB7XHJcblx0XHRcdFx0XHRcdFx0bmV3Q29tcG9uZW50cyA9IGZvcm1Db21wLmNvbXBvbmVudHM7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoZm9ybUNvbXAuY29sdW1ucykge1xyXG5cdFx0XHRcdFx0XHRcdG5ld0NvbXBvbmVudHMgPSBmb3JtQ29tcC5jb2x1bW5zO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGlmIChuZXdDb21wb25lbnRzICYmIFV0aWxTdHJpbmcuaXNWYWxpZChmb3JtQ29tcC50aXRsZSkpIHtcclxuXHRcdFx0XHRcdFx0XHRsRm9ybUZpZWxkc1Rva2VuLnB1c2goe1xyXG5cdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuZ2V0S2V5Rm9ybXVsYXJpbyhmb3JtQ29tcC50aXRsZSksXHJcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBmb3JtQ29tcC50aXRsZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0b2JqZWN0OiBmb3JtQ29tcFxyXG5cdFx0XHRcdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBbXVxyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdGxGb3JtRmllbGRzVG9rZW5bbEZvcm1GaWVsZHNUb2tlbi5sZW5ndGggLSAxXS52YWx1ZSA9XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmdldENvbXBvbmVuZXRGb3JtKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb21wb25lbnRzLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRuZXdDb21wb25lbnRzLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRudWxsLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0bnVsbFxyXG5cdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0cmVzb2x2ZShsRm9ybUZpZWxkc1Rva2VuKTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdChlcnJvcikgPT4ge1xyXG5cdFx0XHRcdFx0cmVqZWN0KGVycm9yKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8qKiBUaGlzIHByb21pc2UgYWxsb3dzIHRvIGV4ZWN1dGUgYSBmdW5jdGlvbiB3aGVuIGNvbnN1bHRpbmcgdGhlIGZvcm0gZmllbGRzLiAqL1xyXG5cdGdldEZvcm1QYW5lbHNCeVByb21Db2RlKHByb21Db2RpZ28pOiBQcm9taXNlPGFueVtdPiB7XHJcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cdFx0XHQvLyBTZWFyY2ggdGhlIGR5bmFtaWMgZm9ybVxyXG5cdFx0XHRsZXQgbEZvcm1QYW5uZWxzVG9rZW46IGFueVtdID0gbnVsbDtcclxuXHRcdFx0dGhpcy5mb3JtU2VydmljZS5nZXRCeVByb21Db2RpZ28ocHJvbUNvZGlnbykuc3Vic2NyaWJlKFxyXG5cdFx0XHRcdChyZXN1bHQ6IGFueSkgPT4ge1xyXG5cdFx0XHRcdFx0bGV0IGZvcm06IGFueSA9IHJlc3VsdDtcclxuXHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0IWZvcm0gfHxcclxuXHRcdFx0XHRcdFx0IWZvcm1bMF0gfHxcclxuXHRcdFx0XHRcdFx0IWZvcm1bMF0ucHJvbUNvZGlnbyB8fFxyXG5cdFx0XHRcdFx0XHRmb3JtWzBdLnByb21Db2RpZ28gIT0gcHJvbUNvZGlnb1xyXG5cdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdC8vIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnNDA0J10pO1xyXG5cdFx0XHRcdFx0XHRyZXNvbHZlKGxGb3JtUGFubmVsc1Rva2VuKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGxGb3JtUGFubmVsc1Rva2VuID0gW107XHJcblx0XHRcdFx0XHRmb3IgKGxldCBmb3JtQ29tcCBvZiBmb3JtKSB7XHJcblx0XHRcdFx0XHRcdGxldCBuZXdDb21wb25lbnRzOiBhbnk7XHJcblx0XHRcdFx0XHRcdGxldCBjb21wb25lbnRzOiBhbnlbXSA9IFtdO1xyXG5cdFx0XHRcdFx0XHRpZiAoZm9ybUNvbXAuY29tcG9uZW50cykge1xyXG5cdFx0XHRcdFx0XHRcdG5ld0NvbXBvbmVudHMgPSBmb3JtQ29tcC5jb21wb25lbnRzO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGZvcm1Db21wLmNvbHVtbnMpIHtcclxuXHRcdFx0XHRcdFx0XHRuZXdDb21wb25lbnRzID0gZm9ybUNvbXAuY29sdW1ucztcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAobmV3Q29tcG9uZW50cyAmJiBVdGlsU3RyaW5nLmlzVmFsaWQoZm9ybUNvbXAudGl0bGUpKSB7XHJcblx0XHRcdFx0XHRcdFx0bEZvcm1QYW5uZWxzVG9rZW4ucHVzaCh7XHJcblx0XHRcdFx0XHRcdFx0XHR0aXRsZToge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRrZXk6IFRva2VuU2VydmljZS5nZXRLZXlGb3JtdWxhcmlvKGZvcm1Db21wLnRpdGxlKSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6IGZvcm1Db21wLnRpdGxlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRvYmplY3Q6IGZvcm1Db21wXHJcblx0XHRcdFx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU6IFtdXHJcblx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0bEZvcm1QYW5uZWxzVG9rZW5bbEZvcm1QYW5uZWxzVG9rZW4ubGVuZ3RoIC0gMV0udmFsdWUgPVxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5nZXRQYW5lbENvbXBvbmVuZXQoY29tcG9uZW50cywgbmV3Q29tcG9uZW50cywgbnVsbCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJlc29sdmUobEZvcm1QYW5uZWxzVG9rZW4pO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0KGVycm9yKSA9PiB7XHJcblx0XHRcdFx0XHRyZWplY3QoZXJyb3IpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0KTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQSByZWN1cnNpdmUgbWV0aG9kIHRvIGdldCBhbGwgdGhlIGluZm9ybWF0aW9uIG9mIHRoZSBlZGl0R3JpZCBkeW5hbWljIGZvcm1cclxuXHQgKiBAcGFyYW0gY29tcG9uZW50c1xyXG5cdCAqIEBwYXJhbSBmb3JtXHJcblx0ICovXHJcblx0Z2V0UGFuZWxDb21wb25lbmV0KGNvbXBvbmVudHM6IGFueVtdLCBmb3JtOiBhbnksIHBhbmVsTmFtZTogc3RyaW5nKTogYW55W10ge1xyXG5cdFx0Zm9yIChsZXQgZm9ybUNvbXAgb2YgZm9ybSkge1xyXG5cdFx0XHRpZiAoZm9ybUNvbXAudHlwZSA9PT0gJ3BhbmVsJykge1xyXG5cdFx0XHRcdGNvbXBvbmVudHMucHVzaChmb3JtQ29tcCk7XHJcblx0XHRcdH0gZWxzZSBpZiAoZm9ybUNvbXAuY29tcG9uZW50cyB8fCBmb3JtQ29tcC5jb2x1bW5zKSB7XHJcblx0XHRcdFx0bGV0IG5ld0NvbXBvbmVudHM6IGFueTtcclxuXHRcdFx0XHRpZiAoZm9ybUNvbXAuY29tcG9uZW50cykge1xyXG5cdFx0XHRcdFx0bmV3Q29tcG9uZW50cyA9IGZvcm1Db21wLmNvbXBvbmVudHM7XHJcblx0XHRcdFx0fSBlbHNlIGlmIChmb3JtQ29tcC5jb2x1bW5zKSB7XHJcblx0XHRcdFx0XHRuZXdDb21wb25lbnRzID0gZm9ybUNvbXAuY29sdW1ucztcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Y29tcG9uZW50cyA9IHRoaXMuZ2V0UGFuZWxDb21wb25lbmV0KGNvbXBvbmVudHMsIG5ld0NvbXBvbmVudHMsIHBhbmVsTmFtZSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBjb21wb25lbnRzO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQSByZWN1cnNpdmUgbWV0aG9kIHRvIGdldCBhbGwgdGhlIGluZm9ybWF0aW9uIG9mIHRoZSBjb21wb25lbnRzIGEgY29sdW1ucyBvZiB0aGUgZHluYW1pYyBmb3JtXHJcblx0ICogQHBhcmFtIGNvbXBvbmVudHNcclxuXHQgKiBAcGFyYW0gZm9ybVxyXG5cdCAqL1xyXG5cdGdldENvbXBvbmVuZXRGb3JtKFxyXG5cdFx0Y29tcG9uZW50czogYW55W10sXHJcblx0XHRmb3JtOiBhbnksXHJcblx0XHRwYW5lbE5hbWU6IHN0cmluZyxcclxuXHRcdGVkaXRncmlkOiBib29sZWFuLFxyXG5cdFx0ZWRpdEdyaWRLZXk6IHN0cmluZ1xyXG5cdCk6IGFueVtdIHtcclxuXHRcdGZvciAobGV0IGZvcm1Db21wIG9mIGZvcm0pIHtcclxuXHRcdFx0Ly9NTy0gIG1hbnRpcyA4NzQzIGZpeCBhZGRyZXNzIHRva2VuXHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHQoZm9ybUNvbXAuY29tcG9uZW50cyB8fCBmb3JtQ29tcC5jb2x1bW5zKSAmJlxyXG5cdFx0XHRcdGZvcm1Db21wLnR5cGUgIT09ICdhZGRyZXNzJyAmJlxyXG5cdFx0XHRcdGZvcm1Db21wLnR5cGUgIT09ICdlZGl0Z3JpZCdcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0bGV0IG5ld0NvbXBvbmVudHM6IGFueTtcclxuXHRcdFx0XHRpZiAoZm9ybUNvbXAuY29tcG9uZW50cykge1xyXG5cdFx0XHRcdFx0bmV3Q29tcG9uZW50cyA9IGZvcm1Db21wLmNvbXBvbmVudHM7XHJcblx0XHRcdFx0XHRpZiAoZm9ybUNvbXAudHlwZSA9PT0gJ2VkaXRncmlkJykge1xyXG5cdFx0XHRcdFx0XHRlZGl0Z3JpZCA9IHRydWU7XHJcblx0XHRcdFx0XHRcdGVkaXRHcmlkS2V5ID0gZm9ybUNvbXAua2V5O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoZm9ybUNvbXAuY29sdW1ucykge1xyXG5cdFx0XHRcdFx0bmV3Q29tcG9uZW50cyA9IGZvcm1Db21wLmNvbHVtbnM7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChmb3JtQ29tcC50eXBlICYmIGZvcm1Db21wLnR5cGUgPT09ICdwYW5lbCcpIHtcclxuXHRcdFx0XHRcdHBhbmVsTmFtZSA9IGZvcm1Db21wLnRpdGxlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRjb21wb25lbnRzID0gdGhpcy5nZXRDb21wb25lbmV0Rm9ybShcclxuXHRcdFx0XHRcdGNvbXBvbmVudHMsXHJcblx0XHRcdFx0XHRuZXdDb21wb25lbnRzLFxyXG5cdFx0XHRcdFx0cGFuZWxOYW1lLFxyXG5cdFx0XHRcdFx0ZWRpdGdyaWQsXHJcblx0XHRcdFx0XHRlZGl0R3JpZEtleVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Zm9ybUNvbXAucGFuZWxOYW1lID0gcGFuZWxOYW1lO1xyXG5cdFx0XHRcdGZvcm1Db21wLmVkaXRncmlkID0gZWRpdGdyaWQ7XHJcblx0XHRcdFx0Zm9ybUNvbXAuZWRpdEdyaWRLZXkgPSBlZGl0R3JpZEtleTtcclxuXHRcdFx0XHRjb21wb25lbnRzLnB1c2goZm9ybUNvbXApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gY29tcG9uZW50cztcclxuXHR9XHJcblxyXG5cdC8qKiBUaGlzIHByb21pc2UgYWxsb3dzIHRvIGV4ZWN1dGUgYSBmdW5jdGlvbiB3aGVuIGNvbnN1bHRpbmcgdGhlIGZvcm0gZmllbGRzLiAqL1xyXG5cdGdldEZvcm1FZGl0R3JpZEZpZWxkc0J5UHJvbUNvZGUocHJvbUNvZGlnbyk6IFByb21pc2U8YW55W10+IHtcclxuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblx0XHRcdC8vIFNlYXJjaCB0aGUgZHluYW1pYyBmb3JtXHJcblx0XHRcdGxldCBsRm9ybUZpZWxkc1Rva2VuOiBhbnlbXSA9IG51bGw7XHJcblx0XHRcdHRoaXMuZm9ybVNlcnZpY2UuZ2V0QnlQcm9tQ29kaWdvKHByb21Db2RpZ28pLnN1YnNjcmliZShcclxuXHRcdFx0XHQocmVzdWx0OiBhbnkpID0+IHtcclxuXHRcdFx0XHRcdGxldCBmb3JtOiBhbnkgPSByZXN1bHQ7XHJcblx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdCFmb3JtIHx8XHJcblx0XHRcdFx0XHRcdCFmb3JtWzBdIHx8XHJcblx0XHRcdFx0XHRcdCFmb3JtWzBdLnByb21Db2RpZ28gfHxcclxuXHRcdFx0XHRcdFx0Zm9ybVswXS5wcm9tQ29kaWdvICE9IHByb21Db2RpZ29cclxuXHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHQvLyB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJzQwNCddKTtcclxuXHRcdFx0XHRcdFx0cmVzb2x2ZShsRm9ybUZpZWxkc1Rva2VuKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGxGb3JtRmllbGRzVG9rZW4gPSBbXTtcclxuXHRcdFx0XHRcdGZvciAobGV0IGZvcm1Db21wIG9mIGZvcm0pIHtcclxuXHRcdFx0XHRcdFx0bGV0IG5ld0NvbXBvbmVudHM6IGFueTtcclxuXHRcdFx0XHRcdFx0bGV0IGNvbXBvbmVudHM6IGFueVtdID0gW107XHJcblx0XHRcdFx0XHRcdGlmIChmb3JtQ29tcC5jb21wb25lbnRzKSB7XHJcblx0XHRcdFx0XHRcdFx0bmV3Q29tcG9uZW50cyA9IGZvcm1Db21wLmNvbXBvbmVudHM7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoZm9ybUNvbXAuY29sdW1ucykge1xyXG5cdFx0XHRcdFx0XHRcdG5ld0NvbXBvbmVudHMgPSBmb3JtQ29tcC5jb2x1bW5zO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGlmIChuZXdDb21wb25lbnRzICYmIFV0aWxTdHJpbmcuaXNWYWxpZChmb3JtQ29tcC50aXRsZSkpIHtcclxuXHRcdFx0XHRcdFx0XHRsRm9ybUZpZWxkc1Rva2VuLnB1c2goe1xyXG5cdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuZ2V0S2V5Rm9ybXVsYXJpbyhmb3JtQ29tcC50aXRsZSksXHJcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBmb3JtQ29tcC50aXRsZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0b2JqZWN0OiBmb3JtQ29tcFxyXG5cdFx0XHRcdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBbXVxyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdGxGb3JtRmllbGRzVG9rZW5bbEZvcm1GaWVsZHNUb2tlbi5sZW5ndGggLSAxXS52YWx1ZSA9XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmdldEVkaXRHcmlkQ29tcG9uZW5ldChjb21wb25lbnRzLCBuZXdDb21wb25lbnRzLCBudWxsKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0cmVzb2x2ZShsRm9ybUZpZWxkc1Rva2VuKTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdChlcnJvcikgPT4ge1xyXG5cdFx0XHRcdFx0cmVqZWN0KGVycm9yKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgcmVjdXJzaXZlIG1ldGhvZCB0byBnZXQgYWxsIHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgZWRpdEdyaWQgZHluYW1pYyBmb3JtXHJcblx0ICogQHBhcmFtIGNvbXBvbmVudHNcclxuXHQgKiBAcGFyYW0gZm9ybVxyXG5cdCAqL1xyXG5cdGdldEVkaXRHcmlkQ29tcG9uZW5ldChjb21wb25lbnRzOiBhbnlbXSwgZm9ybTogYW55LCBwYW5lbE5hbWU6IHN0cmluZyk6IGFueVtdIHtcclxuXHRcdGZvciAobGV0IGZvcm1Db21wIG9mIGZvcm0pIHtcclxuXHRcdFx0aWYgKGZvcm1Db21wLnR5cGUgPT09ICdlZGl0Z3JpZCcpIHtcclxuXHRcdFx0XHRmb3JtQ29tcC5wYW5lbE5hbWUgPSBwYW5lbE5hbWU7XHJcblx0XHRcdFx0Y29tcG9uZW50cy5wdXNoKGZvcm1Db21wKTtcclxuXHRcdFx0fSBlbHNlIGlmIChmb3JtQ29tcC5jb21wb25lbnRzIHx8IGZvcm1Db21wLmNvbHVtbnMpIHtcclxuXHRcdFx0XHRsZXQgbmV3Q29tcG9uZW50czogYW55O1xyXG5cdFx0XHRcdGlmIChmb3JtQ29tcC5jb21wb25lbnRzKSB7XHJcblx0XHRcdFx0XHRuZXdDb21wb25lbnRzID0gZm9ybUNvbXAuY29tcG9uZW50cztcclxuXHRcdFx0XHR9IGVsc2UgaWYgKGZvcm1Db21wLmNvbHVtbnMpIHtcclxuXHRcdFx0XHRcdG5ld0NvbXBvbmVudHMgPSBmb3JtQ29tcC5jb2x1bW5zO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAoZm9ybUNvbXAudHlwZSAmJiBmb3JtQ29tcC50eXBlID09PSAncGFuZWwnKSB7XHJcblx0XHRcdFx0XHRwYW5lbE5hbWUgPSBmb3JtQ29tcC50aXRsZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Y29tcG9uZW50cyA9IHRoaXMuZ2V0RWRpdEdyaWRDb21wb25lbmV0KGNvbXBvbmVudHMsIG5ld0NvbXBvbmVudHMsIHBhbmVsTmFtZSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBjb21wb25lbnRzO1xyXG5cdH1cclxuXHJcblx0LyoqIEl0IHJldHVybnMgdGhlIHRva2VucyBieSBwcm9tQ29kaWdvICovXHJcblx0Z2V0TGlzdEJ5UHJvbUNvZGlnbyhwcm9tQ29kZTogbnVtYmVyKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuXHRcdHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0KFxyXG5cdFx0XHR0aGlzLmVudmlyb25tZW50Lmhvc3QuYmFja2VuZC5jb25maWd1cmF0aW9uICsgJ3Rva2VuL2dldEJ5UHJvbUNvZGlnbycsXHJcblx0XHRcdHsgcGFyYW1zOiBuZXcgSHR0cFBhcmFtcygpLnNldCgncHJvbUNvZGlnbycsIHByb21Db2RlLnRvU3RyaW5nKCkpIH1cclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHQvKiogSXQgcmV0dXJucyB0aGUgdG9rZW4gYnkgaWQgKi9cclxuXHRnZXRCeUlkKGlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQodGhpcy5lbnZpcm9ubWVudC5ob3N0LmJhY2tlbmQuY29uZmlndXJhdGlvbiArICd0b2tlbi9nZXRCeUlkJywge1xyXG5cdFx0XHRwYXJhbXM6IG5ldyBIdHRwUGFyYW1zKCkuc2V0KCdpZCcsIGlkLnRvU3RyaW5nKCkpXHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8qKiBJdCBkZWxldGVzIGEgZm9ybSBieSBpZCAqL1xyXG5cdGRlbGV0ZShpZCk6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwQ2xpZW50LmRlbGV0ZShcclxuXHRcdFx0dGhpcy5lbnZpcm9ubWVudC5ob3N0LmJhY2tlbmQuY29uZmlndXJhdGlvbiArICd0b2tlbi9kZWxldGUnLFxyXG5cdFx0XHR7IHBhcmFtczogbmV3IEh0dHBQYXJhbXMoKS5zZXQoJ2lkJywgaWQpIH1cclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHQvKiogSXQgc2F2ZXMgdGhlIHRva2VuICovXHJcblx0c2F2ZSh0b2tlbjogVG9rZW4pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0KFxyXG5cdFx0XHR0aGlzLmVudmlyb25tZW50Lmhvc3QuYmFja2VuZC5jb25maWd1cmF0aW9uICsgJ3Rva2VuL3NhdmUnLFxyXG5cdFx0XHR0b2tlbixcclxuXHRcdFx0SEVBREVSX0pTT05cclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0S2V5Rm9ybXVsYXJpbyhmb3JtVGl0bGU6IHN0cmluZyk6IHN0cmluZyB7XHJcblx0XHRpZiAoVXRpbFN0cmluZy5pc1ZhbGlkKGZvcm1UaXRsZSkpIHtcclxuXHRcdFx0cmV0dXJuIChcclxuXHRcdFx0XHRVdGlsU3RyaW5nLnJlcGxhY2VBY2NlbnRTcGFjZXNPdGhlcnMoVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0ZPUk0pICtcclxuXHRcdFx0XHRVdGlsU3RyaW5nLnJlcGxhY2VBY2NlbnRTcGFjZXNPdGhlcnMoZm9ybVRpdGxlKS5yZXBsYWNlKC9fL2csICctJylcclxuXHRcdFx0KTtcclxuXHRcdH1cclxuXHRcdHJldHVybiAnJztcclxuXHR9XHJcblxyXG5cdC8qKiBJdCByZXR1cm5zIHRoZSB1bmlxdWUgdmVyaWZpY2F0aW9uIGNvZGUgKi9cclxuXHRnZXRVbmlxdWVWZXJpZmljYXRpb25Db2RlKGxvZ2luOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoXHJcblx0XHRcdHRoaXMuZW52aXJvbm1lbnQuaG9zdC5iYWNrZW5kLmRvY3VtZW50c1JlcG9zaXRvcnkgK1xyXG5cdFx0XHRcdCdkb2N1bWVudG8vY29uc3VsdGFyQ29kaWdvVW5pY28vJyArXHJcblx0XHRcdFx0bG9naW4gK1xyXG5cdFx0XHRcdCcvJyArXHJcblx0XHRcdFx0dG9rZW4sXHJcblx0XHRcdHsgcGFyYW1zOiBuZXcgSHR0cFBhcmFtcygpIH1cclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHQvKiogSXQgc2VuZCB0aGUgaW5mb3JtYXRpb24gdG8gY29weSB0aGUgRG9jdW1lbnQgdmlld2VyICovXHJcblx0Y29weURvY3VtZW50SW5mb3JtYXRpb25WaWV3ZXIoXHJcblx0XHRsb2dpbjogc3RyaW5nLFxyXG5cdFx0dG9rZW46IHN0cmluZyxcclxuXHRcdHVuaXF1ZUNvZGU6IHN0cmluZyxcclxuXHRcdGRvY3VtZW50VVJMOiBzdHJpbmcsXHJcblx0XHRkb2N1bWVudE5hbWU6IHN0cmluZ1xyXG5cdCk6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRsZXQgaW5mb0RvY3VtZW50byA9IHtcclxuXHRcdFx0Y29kaWdvVW5pY286IHVuaXF1ZUNvZGUsXHJcblx0XHRcdHJ1dGFEb2N1bWVudG86IGRvY3VtZW50VVJMLFxyXG5cdFx0XHRkb2N1bWVudE5hbWU6IGRvY3VtZW50TmFtZVxyXG5cdFx0fTtcclxuXHRcdHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdChcclxuXHRcdFx0dGhpcy5lbnZpcm9ubWVudC5ob3N0LmJhY2tlbmQuZG9jdW1lbnRzUmVwb3NpdG9yeSArXHJcblx0XHRcdFx0J2RvY3VtZW50by9hZGljaW9uYXJEb2N1bWVudG8vJyArXHJcblx0XHRcdFx0bG9naW4gK1xyXG5cdFx0XHRcdCcvJyArXHJcblx0XHRcdFx0dG9rZW4sXHJcblx0XHRcdGluZm9Eb2N1bWVudG8sXHJcblx0XHRcdEhFQURFUl9KU09OXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldEtleUJ1ZGdldCgpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyhUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfQlVER0VUKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRLZXlEb2N1bWVudCgpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyhUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfRE9DVU1FTlRPKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRLZXlEb2N1bWVudEFuYWx5c2lzKCk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gVXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKFRva2VuU2VydmljZS5UT0tFTl9ET0NVTUVOVE9fQU5BTFlTSVNfVFlQRSk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0S2V5VGFzaygpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyhUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfVEFTS0wpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldEtleVN0YXRpYygpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyhUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfU1RBVElDKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRLZXlDYWxjdWxhdGVkKHRva2VuOiBUb2tlbik6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gKFxyXG5cdFx0XHRVdGlsU3RyaW5nLnJlcGxhY2VBY2NlbnRTcGFjZXNPdGhlcnMoVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0NBTENVTEFURUQpICtcclxuXHRcdFx0J18nICtcclxuXHRcdFx0VXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKHRva2VuLm5hbWUpXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldEtleVNuYXBzaG90KHRva2VuOiBUb2tlbik6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gKFxyXG5cdFx0XHRVdGlsU3RyaW5nLnJlcGxhY2VBY2NlbnRTcGFjZXNPdGhlcnMoVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX1NOQVBTSE9UKSArXHJcblx0XHRcdCdfJyArXHJcblx0XHRcdFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyh0b2tlbi5uYW1lKVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRLZXlHdWFyYW50ZWUodG9rZW46IFBsaUNuZkd1YXJhbnRlZVRva2VuKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiAoXHJcblx0XHRcdFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyhUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfR1VBUkFOVEVFKSArXHJcblx0XHRcdCdfJyArXHJcblx0XHRcdFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyh0b2tlbi5uYW1lKVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybiBhIHZhbHVlIHRoYXQgcmVwcmVzZW50IHRoZSB0eXBlIG9mIGxhYmVsOiAxPUZvcm0sIDI9QnVkZ2V0LCAzPVN0YXRpYywgND1DYWxjdWxhdGVkXHJcblx0ICogQHBhcmFtIGtleSBWYWx1ZSB0byBldmFsdWVhdGVcclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0S2V5VHlwZShrZXk6IHN0cmluZyk6IG51bWJlciB7XHJcblx0XHRrZXkgPSBrZXkucmVwbGFjZSgneycsICcnKS5yZXBsYWNlKCd9JywgJycpO1xyXG5cdFx0a2V5ID0ga2V5LnN1YnN0cmluZygxLCBrZXkuaW5kZXhPZignXycpKTtcclxuXHRcdGlmIChrZXkuc3RhcnRzV2l0aChVdGlsU3RyaW5nLnJlcGxhY2VBY2NlbnRTcGFjZXNPdGhlcnMoVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0ZPUk0pKSkge1xyXG5cdFx0XHRyZXR1cm4gMTtcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdGtleS5zdGFydHNXaXRoKFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyhUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfQlVER0VUKSlcclxuXHRcdCkge1xyXG5cdFx0XHRyZXR1cm4gMjtcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdGtleS5zdGFydHNXaXRoKFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyhUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfU1RBVElDKSlcclxuXHRcdCkge1xyXG5cdFx0XHRyZXR1cm4gMztcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdGtleS5zdGFydHNXaXRoKFxyXG5cdFx0XHRcdFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyhUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfQ0FMQ1VMQVRFRClcclxuXHRcdFx0KVxyXG5cdFx0KSB7XHJcblx0XHRcdHJldHVybiA0O1xyXG5cdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0a2V5LnN0YXJ0c1dpdGgoVXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKFRva2VuU2VydmljZS5UT0tFTl9MQUJFTF9UQVNLTCkpXHJcblx0XHQpIHtcclxuXHRcdFx0cmV0dXJuIDU7XHJcblx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRrZXkuc3RhcnRzV2l0aChcclxuXHRcdFx0XHRVdGlsU3RyaW5nLnJlcGxhY2VBY2NlbnRTcGFjZXNPdGhlcnMoVG9rZW5TZXJ2aWNlLlRPS0VOX0RPQ1VNRU5UT19BTkFMWVNJU19UWVBFKVxyXG5cdFx0XHQpXHJcblx0XHQpIHtcclxuXHRcdFx0cmV0dXJuIDY7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlcGVuZHMgb2YgdGhlIHR5cGUgb2YgZm9ybUZpZWxkVG9rZW4gcmV0dXJuIGRlIHZhbHVlIG9mIHRoZSB2YWx1ZURhdGFcclxuXHQgKiBAcGFyYW0gZm9ybUZpZWxkVG9rZW5cclxuXHQgKiBAcGFyYW0gdmFsdWVEYXRhXHJcblx0ICovXHJcblx0Z2V0VmFsdWVGcm9tRm9ybUZpZWxkKGZvcm1GaWVsZFRva2VuOiBhbnksIHZhbHVlRGF0YTogYW55KTogYW55IHtcclxuXHRcdGlmICh0eXBlb2YgdmFsdWVEYXRhID09ICdvYmplY3QnKSB7XHJcblx0XHRcdGlmIChmb3JtRmllbGRUb2tlbi50eXBlKSB7XHJcblx0XHRcdFx0aWYgKGZvcm1GaWVsZFRva2VuLnR5cGUgPT0gJ2FkZHJlc3MnKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gdmFsdWVEYXRhLmZvcm1hdHRlZF9hZGRyZXNzO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRmb3JtRmllbGRUb2tlbi50eXBlID09ICdzZWxlY3QnICYmXHJcblx0XHRcdFx0XHR2YWx1ZURhdGEuaGFzT3duUHJvcGVydHkoZm9ybUZpZWxkVG9rZW4uc2VhcmNoRmllbGQpXHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRpZiAodmFsdWVEYXRhLmhhc093blByb3BlcnR5KCdvcmlnaW5hbF9uYW1lJykgIT09ICcnKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiB2YWx1ZURhdGEub3JpZ2luYWxfbmFtZTtcclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAodmFsdWVEYXRhLmhhc093blByb3BlcnR5KCduYXRpdmVOYW1lJykgIT09ICcnKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiB2YWx1ZURhdGEubmF0aXZlTmFtZTtcclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoZm9ybUZpZWxkVG9rZW4uc2VhcmNoRmllbGQpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHZhbHVlRGF0YVtmb3JtRmllbGRUb2tlbi5zZWFyY2hGaWVsZF07XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdmFsdWVEYXRhO1xyXG5cdH1cclxuXHRmb3JtYXREYXRlKHZhbHVlOiBEYXRlLCBsb2NhbGU6IHN0cmluZyk6IHN0cmluZyB7XHJcblx0XHRjb25zdCBkYXRlID0gbmV3IERhdGUodmFsdWUpO1xyXG5cclxuXHRcdGNvbnN0IG1vbnRocyA9IHtcclxuXHRcdFx0ZXM6IFtcclxuXHRcdFx0XHQnZW5lcm8nLFxyXG5cdFx0XHRcdCdmZWJyZXJvJyxcclxuXHRcdFx0XHQnbWFyem8nLFxyXG5cdFx0XHRcdCdhYnJpbCcsXHJcblx0XHRcdFx0J21heW8nLFxyXG5cdFx0XHRcdCdqdW5pbycsXHJcblx0XHRcdFx0J2p1bGlvJyxcclxuXHRcdFx0XHQnYWdvc3RvJyxcclxuXHRcdFx0XHQnc2VwdGllbWJyZScsXHJcblx0XHRcdFx0J29jdHVicmUnLFxyXG5cdFx0XHRcdCdub3ZpZW1icmUnLFxyXG5cdFx0XHRcdCdkaWNpZW1icmUnXHJcblx0XHRcdF0sXHJcblx0XHRcdGVuOiBbXHJcblx0XHRcdFx0J0phbnVhcnknLFxyXG5cdFx0XHRcdCdGZWJydWFyeScsXHJcblx0XHRcdFx0J01hcmNoJyxcclxuXHRcdFx0XHQnQXByaWwnLFxyXG5cdFx0XHRcdCdNYXknLFxyXG5cdFx0XHRcdCdKdW5lJyxcclxuXHRcdFx0XHQnSnVseScsXHJcblx0XHRcdFx0J0F1Z3VzdCcsXHJcblx0XHRcdFx0J1NlcHRlbWJlcicsXHJcblx0XHRcdFx0J09jdG9iZXInLFxyXG5cdFx0XHRcdCdOb3ZlbWJlcicsXHJcblx0XHRcdFx0J0RlY2VtYmVyJ1xyXG5cdFx0XHRdLFxyXG5cdFx0XHRmcjogW1xyXG5cdFx0XHRcdCdqYW52aWVyJyxcclxuXHRcdFx0XHQnZsOpdnJpZXInLFxyXG5cdFx0XHRcdCdtYXJzJyxcclxuXHRcdFx0XHQnYXZyaWwnLFxyXG5cdFx0XHRcdCdtYWknLFxyXG5cdFx0XHRcdCdqdWluJyxcclxuXHRcdFx0XHQnanVpbGxldCcsXHJcblx0XHRcdFx0J2Fvw7t0JyxcclxuXHRcdFx0XHQnc2VwdGVtYnJlJyxcclxuXHRcdFx0XHQnb2N0b2JyZScsXHJcblx0XHRcdFx0J25vdmVtYnJlJyxcclxuXHRcdFx0XHQnZMOpY2VtYnJlJ1xyXG5cdFx0XHRdLFxyXG5cdFx0XHRkZTogW1xyXG5cdFx0XHRcdCdKYW51YXInLFxyXG5cdFx0XHRcdCdGZWJydWFyJyxcclxuXHRcdFx0XHQnTcOkcnonLFxyXG5cdFx0XHRcdCdBcHJpbCcsXHJcblx0XHRcdFx0J01haScsXHJcblx0XHRcdFx0J0p1bmknLFxyXG5cdFx0XHRcdCdKdWxpJyxcclxuXHRcdFx0XHQnQXVndXN0JyxcclxuXHRcdFx0XHQnU2VwdGVtYmVyJyxcclxuXHRcdFx0XHQnT2t0b2JlcicsXHJcblx0XHRcdFx0J05vdmVtYmVyJyxcclxuXHRcdFx0XHQnRGV6ZW1iZXInXHJcblx0XHRcdF0sXHJcblx0XHRcdGl0OiBbXHJcblx0XHRcdFx0J2dlbm5haW8nLFxyXG5cdFx0XHRcdCdmZWJicmFpbycsXHJcblx0XHRcdFx0J21hcnpvJyxcclxuXHRcdFx0XHQnYXByaWxlJyxcclxuXHRcdFx0XHQnbWFnZ2lvJyxcclxuXHRcdFx0XHQnZ2l1Z25vJyxcclxuXHRcdFx0XHQnbHVnbGlvJyxcclxuXHRcdFx0XHQnYWdvc3RvJyxcclxuXHRcdFx0XHQnc2V0dGVtYnJlJyxcclxuXHRcdFx0XHQnb3R0b2JyZScsXHJcblx0XHRcdFx0J25vdmVtYnJlJyxcclxuXHRcdFx0XHQnZGljZW1icmUnXHJcblx0XHRcdF1cclxuXHRcdH07XHJcblxyXG5cdFx0Y29uc3QgbG9jYWxlTW9udGhzID0gbW9udGhzW2xvY2FsZV07XHJcblxyXG5cdFx0Y29uc3QgbW9udGggPSBsb2NhbGVNb250aHNbZGF0ZS5nZXRNb250aCgpXTtcclxuXHRcdGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XHJcblxyXG5cdFx0cmV0dXJuIGAke21vbnRofSAke3llYXJ9YDtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogVHJ5IHRvIGZpbmQgdGhlIHRva2VuIGluIHRoZSBzdHJpbmdUZXh0IGFuZCByZXBsYWNlIHdpdGggZGF0YVZhbHVlLiBJZiBkZXRlY3QgZm9ybWF0IG9mIG51bWJlciBvciBkYXRlIHRyeSB0byBmb3JtYXQgdGhlIGRhdGFWYWx1ZVxyXG5cdCAqIEBwYXJhbSBzdHJpbmdUZXh0XHJcblx0ICogQHBhcmFtIHRva2VuXHJcblx0ICogQHBhcmFtIGRhdGFWYWx1ZVxyXG5cdCAqL1xyXG5cdHJlcGxhY2VUb2tlbihzdHJpbmdUZXh0OiBzdHJpbmcsIHRva2VuOiBhbnksIGRhdGFWYWx1ZTogYW55LCBsb2NhbGU/OiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cdFx0bGV0IHZhbHVlUmVwbGFjZTogc3RyaW5nID0gbnVsbDtcclxuXHRcdGlmICh0b2tlbiAmJiB0b2tlblswXSA9PSAnIycpIHtcclxuXHRcdFx0bGV0IHR5cGVUb2tlbiA9IHRva2VuLnN1YnN0cmluZygxLCB0b2tlbi5pbmRleE9mKCcoJykpO1xyXG5cdFx0XHRpZiAodHlwZVRva2VuID09ICdkYXRlJykge1xyXG5cdFx0XHRcdGxldCBkYXRlRm9ybWF0OiBzdHJpbmcgPSB0b2tlbi5zdWJzdHJpbmcoXHJcblx0XHRcdFx0XHR0b2tlbi5pbmRleE9mKCd9JykgKyAxLFxyXG5cdFx0XHRcdFx0dG9rZW4uaW5kZXhPZignKScpXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHRkYXRlRm9ybWF0ID0gZGF0ZUZvcm1hdC50cmltKCkucmVwbGFjZSgvXFxcIi9nLCAnJykucmVwbGFjZSgvXFwnL2csICcnKTtcclxuXHRcdFx0XHRsZXQgZGF0ZVZhbHVlID0gRGF0ZVV0aWwuZ2V0RGF0ZShkYXRhVmFsdWUpO1xyXG5cdFx0XHRcdGlmIChsb2NhbGUgIT0gbnVsbCAmJiBsb2NhbGUpIHtcclxuXHRcdFx0XHRcdHZhbHVlUmVwbGFjZSA9IHRoaXMuZm9ybWF0RGF0ZShkYXRlVmFsdWUsIGxvY2FsZSk7XHJcblx0XHRcdFx0fSBlbHNlIGlmIChkYXRlVmFsdWUpIHtcclxuXHRcdFx0XHRcdHZhbHVlUmVwbGFjZSA9IERhdGVVdGlsLmdldE1vbWVudChkYXRlVmFsdWUpLmZvcm1hdChkYXRlRm9ybWF0KTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0dmFsdWVSZXBsYWNlID0gJyc7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVUb2tlbiA9PSAnbnVtYmVyJykge1xyXG5cdFx0XHRcdGxldCBudW1iZXJWYWx1ZTogbnVtYmVyID0gTnVtYmVyKGRhdGFWYWx1ZSk7XHJcblx0XHRcdFx0aWYgKG51bWJlclZhbHVlICE9IHVuZGVmaW5lZCAmJiAhaXNOYU4obnVtYmVyVmFsdWUpKSB7XHJcblx0XHRcdFx0XHRsZXQgbnVtYmVyRm9ybWF0OiBzdHJpbmcgPSB0b2tlbi5zdWJzdHJpbmcoXHJcblx0XHRcdFx0XHRcdHRva2VuLmluZGV4T2YoJ30nKSArIDEsXHJcblx0XHRcdFx0XHRcdHRva2VuLmluZGV4T2YoJyknKVxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdG51bWJlckZvcm1hdCA9IG51bWJlckZvcm1hdC50cmltKCkucmVwbGFjZSgvXFxcIi9nLCAnJykucmVwbGFjZSgvXFwnL2csICcnKTtcclxuXHRcdFx0XHRcdHZhbHVlUmVwbGFjZSA9IHRoaXMuY3VycmVuY3lQaXBlLnRyYW5zZm9ybShcclxuXHRcdFx0XHRcdFx0bnVtYmVyVmFsdWUsXHJcblx0XHRcdFx0XHRcdHRoaXMubG9jYWxlLFxyXG5cdFx0XHRcdFx0XHQnJyxcclxuXHRcdFx0XHRcdFx0bnVtYmVyRm9ybWF0XHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRjb25zb2xlLmxvZyhcclxuXHRcdFx0XHRcdFx0J0VsIGRhdG8gWycgK1xyXG5cdFx0XHRcdFx0XHRcdGRhdGFWYWx1ZSArXHJcblx0XHRcdFx0XHRcdFx0J10gcGFyYSBlbCB0b2tlbiBbJyArXHJcblx0XHRcdFx0XHRcdFx0dG9rZW4gK1xyXG5cdFx0XHRcdFx0XHRcdCddIHRpcG8gbsO6bWVyaWNvIG5vIGVzIHZhbGlkbydcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHR2YWx1ZVJlcGxhY2UgPSAnJztcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Y29uc29sZS5sb2coJ3RpcG8gZGUgdG9rZW4gaW5kZWZpbmlkby4gW3R5cGVUb2tlblsnICsgdHlwZVRva2VuICsgJ11dJyk7XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSBpZiAodG9rZW4gJiYgdG9rZW5bMF0gPT0gJyQnKSB7XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHRkYXRhVmFsdWUgIT09IG51bGwgJiZcclxuXHRcdFx0XHRkYXRhVmFsdWUgIT09IHVuZGVmaW5lZCAmJlxyXG5cdFx0XHRcdGRhdGFWYWx1ZS5vcmlnaW5hbF9uYW1lICE9PSB1bmRlZmluZWQgJiZcclxuXHRcdFx0XHRkYXRhVmFsdWUub3JpZ2luYWxfbmFtZSAhPT0gbnVsbFxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHR2YWx1ZVJlcGxhY2UgPSBkYXRhVmFsdWUub3JpZ2luYWxfbmFtZTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR2YWx1ZVJlcGxhY2UgPSBkYXRhVmFsdWU7XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8gdmFsdWVSZXBsYWNlID0gZGF0YVZhbHVlO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Y29uc29sZS5sb2coJ0VsIHRva2VuIG5vIGVzIHZhbGlkby4gW3Rva2VuWycgKyB0b2tlbiArICddXScpO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHN0cmluZ1RleHQgJiYgdmFsdWVSZXBsYWNlICE9PSBudWxsKSB7XHJcblx0XHRcdGlmICh0b2tlbiAmJiB0b2tlbiA9PT0gJyR7ZXN0YXRpY29fJyArIFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5fU1VSTkFNRSArICd9Jykge1xyXG5cdFx0XHRcdHZhbHVlUmVwbGFjZSA9IGRhdGFWYWx1ZTtcclxuXHRcdFx0XHRzdHJpbmdUZXh0ID0gc3RyaW5nVGV4dC5zcGxpdCh0b2tlbikuam9pbih2YWx1ZVJlcGxhY2UpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdC8vIHJlcGxhY2UgdGV4dCBpbiBhIG1vcmUgZWZmaWNpZW50IHdheVxyXG5cdFx0XHRcdHN0cmluZ1RleHQgPSBzdHJpbmdUZXh0LnNwbGl0KHRva2VuKS5qb2luKHZhbHVlUmVwbGFjZSk7XHJcblx0XHRcdFx0Ly9zdHJpbmdUZXh0ID0gc3RyaW5nVGV4dC5yZXBsYWNlKHRva2VuLCB2YWx1ZVJlcGxhY2UpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gc3RyaW5nVGV4dDtcclxuXHR9XHJcblxyXG5cdGdldExpc3RUb2tlbnNCeVN0cmluZ1NlZ21lbnRhdGlvbihzdHJpbmdUZXh0OiBzdHJpbmcpOiBhbnlbXSB7XHJcblx0XHRjb25zdCBhcnJheVRva2VuID0gc3RyaW5nVGV4dC5tYXRjaCgvXFwkeyhbXn1dKylcXH0vZyk7XHJcblx0XHRjb25zdCBhcnJheVRva2VuRm9ybWF0dGVkRGF0ZSA9IHN0cmluZ1RleHQubWF0Y2goL1xcI2RhdGVbXildK1xcKS9nKTtcclxuXHRcdGNvbnN0IGFycmF5VG9rZW5Gb3JtYXR0ZWROdW1iZXIgPSBzdHJpbmdUZXh0Lm1hdGNoKC9cXCNudW1iZXJbXildK1xcKS9nKTtcclxuXHRcdGxldCBhcnJheVRva2VuRm9ybWF0dGVkID0gW107XHJcblx0XHRpZiAoXHJcblx0XHRcdGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlICYmXHJcblx0XHRcdGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlLmxlbmd0aCA+IDAgJiZcclxuXHRcdFx0YXJyYXlUb2tlbkZvcm1hdHRlZE51bWJlciAmJlxyXG5cdFx0XHRhcnJheVRva2VuRm9ybWF0dGVkTnVtYmVyLmxlbmd0aCA+IDBcclxuXHRcdCkge1xyXG5cdFx0XHRhcnJheVRva2VuRm9ybWF0dGVkID0gYXJyYXlUb2tlbkZvcm1hdHRlZERhdGUuY29uY2F0KGFycmF5VG9rZW5Gb3JtYXR0ZWROdW1iZXIpO1xyXG5cdFx0fSBlbHNlIGlmIChhcnJheVRva2VuRm9ybWF0dGVkRGF0ZSAmJiBhcnJheVRva2VuRm9ybWF0dGVkRGF0ZS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdGFycmF5VG9rZW5Gb3JtYXR0ZWQgPSBhcnJheVRva2VuRm9ybWF0dGVkRGF0ZS5zbGljZSgpO1xyXG5cdFx0fSBlbHNlIGlmIChhcnJheVRva2VuRm9ybWF0dGVkTnVtYmVyICYmIGFycmF5VG9rZW5Gb3JtYXR0ZWROdW1iZXIubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRhcnJheVRva2VuRm9ybWF0dGVkID0gYXJyYXlUb2tlbkZvcm1hdHRlZE51bWJlci5zbGljZSgpO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgcmVzdWx0OiBhbnlbXSA9IFtdO1xyXG5cclxuXHRcdGlmIChhcnJheVRva2VuKSB7XHJcblx0XHRcdGZvciAoY29uc3QgdG9rZW4gb2YgYXJyYXlUb2tlbikge1xyXG5cdFx0XHRcdGNvbnN0IGluZm9Ub2tlbiA9IHsga2V5OiB0b2tlbiwgdmFsdWU6IHRva2VuIH07XHJcblx0XHRcdFx0aWYgKGFycmF5VG9rZW5Gb3JtYXR0ZWQpIHtcclxuXHRcdFx0XHRcdGZvciAoY29uc3QgdG9rZW5Gb3JtYXR0ZWQgb2YgYXJyYXlUb2tlbkZvcm1hdHRlZCkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBpbmRleCA9IHRva2VuRm9ybWF0dGVkLmluZGV4T2YodG9rZW4pO1xyXG5cdFx0XHRcdFx0XHRpZiAoaW5kZXggPj0gMCkge1xyXG5cdFx0XHRcdFx0XHRcdGluZm9Ub2tlbi52YWx1ZSA9IHRva2VuRm9ybWF0dGVkO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJlc3VsdC5wdXNoKGluZm9Ub2tlbik7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0Y2hhbmdlSWRQcm9wZXJ0aWVzT2ZPYmplY3Qobm9ybWFsaXphdGlvbkNvbHVtbnM6IGFueVtdLCBsaXN0RGF0YTogYW55W10pOiBhbnlbXSB7XHJcblx0XHRjb25zdCBuZXdEYXRhID0gW107XHJcblx0XHRsaXN0RGF0YS5mb3JFYWNoKChkYXRhKSA9PiB7XHJcblx0XHRcdGNvbnN0IG9iakRhdGEgPSB7fTtcclxuXHRcdFx0T2JqZWN0LmtleXMoZGF0YSkuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcclxuXHRcdFx0XHRpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHtcclxuXHRcdFx0XHRcdG5vcm1hbGl6YXRpb25Db2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG5cdFx0XHRcdFx0XHRpZiAoY29sdW1uLmlkQ29sdW1uLnRvU3RyaW5nKCkgPT09IHByb3BlcnR5KSB7XHJcblx0XHRcdFx0XHRcdFx0b2JqRGF0YVtjb2x1bW4ua2V5XSA9IGRhdGFbcHJvcGVydHldO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0XHRpZiAob2JqRGF0YSkge1xyXG5cdFx0XHRcdG5ld0RhdGEucHVzaChvYmpEYXRhKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0XHRyZXR1cm4gbmV3RGF0YTtcclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlSHRtbEJ5VG9rZW5zQW5kRGF0YShodG1sOiBzdHJpbmcsIGxpc3REYXRhOiBhbnlbXSwgbGlzdFRva2VuczogYW55W10pOiBzdHJpbmdbXSB7XHJcblx0XHRjb25zdCB0cmFuc2xhdGVkQ2FyZHM6IGFueVtdID0gW107XHJcblx0XHRsaXN0RGF0YS5mb3JFYWNoKChkYXRhKSA9PiB7XHJcblx0XHRcdGNvbnN0IG9ialRva2VuID0ge307XHJcblx0XHRcdGNvbnN0IGh0bWxUcmFuc2xhdGVkID0geyBodG1sOiBodG1sIH07XHJcblx0XHRcdE9iamVjdC5rZXlzKGRhdGEpLmZvckVhY2goKHByb3BlcnR5KSA9PiB7XHJcblx0XHRcdFx0bGlzdFRva2Vucy5mb3JFYWNoKCh0b2tlbikgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKHByb3BlcnR5ID09IHRva2VuLmtleS5yZXBsYWNlKCckeycsICcnKS5yZXBsYWNlKCd9JywgJycpKSB7XHJcblx0XHRcdFx0XHRcdG9ialRva2VuW3Rva2VuLmtleV0gPSBkYXRhW3Byb3BlcnR5XTtcclxuXHRcdFx0XHRcdFx0aHRtbFRyYW5zbGF0ZWQuaHRtbCA9IGh0bWxUcmFuc2xhdGVkLmh0bWwucmVwbGFjZShcclxuXHRcdFx0XHRcdFx0XHR0b2tlbi5rZXksXHJcblx0XHRcdFx0XHRcdFx0ZGF0YVtwcm9wZXJ0eV1cclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSk7XHJcblx0XHRcdHRyYW5zbGF0ZWRDYXJkcy5wdXNoKGh0bWxUcmFuc2xhdGVkKTtcclxuXHRcdH0pO1xyXG5cdFx0cmV0dXJuIHRyYW5zbGF0ZWRDYXJkcztcclxuXHR9XHJcblxyXG5cdGdldExpc3RUb2tlbnNCeVN0cmluZyhzdHJpbmdUZXh0OiBzdHJpbmcpOiBhbnlbXSB7XHJcblx0XHR2YXIgYXJyYXlUb2tlbiA9IHN0cmluZ1RleHQubWF0Y2goL1xcJHsoW159XSspXFx9L2cpO1xyXG5cdFx0dmFyIGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlID0gc3RyaW5nVGV4dC5tYXRjaCgvXFwjZGF0ZVteKV0rXFwpL2cpO1xyXG5cdFx0dmFyIGFycmF5VG9rZW5Gb3JtYXR0ZWROdW1iZXIgPSBzdHJpbmdUZXh0Lm1hdGNoKC9cXCNudW1iZXJbXildK1xcKS9nKTtcclxuXHRcdHZhciBhcnJheVRva2VuRm9ybWF0dGVkID0gW107XHJcblx0XHRpZiAoXHJcblx0XHRcdGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlICYmXHJcblx0XHRcdGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlLmxlbmd0aCA+IDAgJiZcclxuXHRcdFx0YXJyYXlUb2tlbkZvcm1hdHRlZE51bWJlciAmJlxyXG5cdFx0XHRhcnJheVRva2VuRm9ybWF0dGVkTnVtYmVyLmxlbmd0aCA+IDBcclxuXHRcdCkge1xyXG5cdFx0XHRhcnJheVRva2VuRm9ybWF0dGVkID0gYXJyYXlUb2tlbkZvcm1hdHRlZERhdGUuY29uY2F0KGFycmF5VG9rZW5Gb3JtYXR0ZWROdW1iZXIpO1xyXG5cdFx0fSBlbHNlIGlmIChhcnJheVRva2VuRm9ybWF0dGVkRGF0ZSAmJiBhcnJheVRva2VuRm9ybWF0dGVkRGF0ZS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdGFycmF5VG9rZW5Gb3JtYXR0ZWQgPSBhcnJheVRva2VuRm9ybWF0dGVkRGF0ZS5zbGljZSgpO1xyXG5cdFx0fSBlbHNlIGlmIChhcnJheVRva2VuRm9ybWF0dGVkTnVtYmVyICYmIGFycmF5VG9rZW5Gb3JtYXR0ZWROdW1iZXIubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRhcnJheVRva2VuRm9ybWF0dGVkID0gYXJyYXlUb2tlbkZvcm1hdHRlZE51bWJlci5zbGljZSgpO1xyXG5cdFx0fVxyXG5cdFx0dmFyIHJlc3VsdDogYW55W10gPSBbXTtcclxuXHJcblx0XHRpZiAoYXJyYXlUb2tlbikge1xyXG5cdFx0XHRmb3IgKGNvbnN0IHRva2VuIG9mIGFycmF5VG9rZW4pIHtcclxuXHRcdFx0XHRsZXQga2V5VHlwZTogbnVtYmVyID0gVG9rZW5TZXJ2aWNlLmdldEtleVR5cGUodG9rZW4pO1xyXG5cdFx0XHRcdGlmIChrZXlUeXBlID09PSBudWxsKSB7XHJcblx0XHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0dmFyIGluZm9Ub2tlbiA9IHsga2V5OiB0b2tlbiwgdmFsdWU6IHRva2VuIH07XHJcblx0XHRcdFx0aWYgKGFycmF5VG9rZW5Gb3JtYXR0ZWQpIHtcclxuXHRcdFx0XHRcdGZvciAoY29uc3QgdG9rZW5Gb3JtYXR0ZWQgb2YgYXJyYXlUb2tlbkZvcm1hdHRlZCkge1xyXG5cdFx0XHRcdFx0XHR2YXIgaW5kZXggPSB0b2tlbkZvcm1hdHRlZC5pbmRleE9mKHRva2VuKTtcclxuXHRcdFx0XHRcdFx0aWYgKGluZGV4ID49IDApIHtcclxuXHRcdFx0XHRcdFx0XHRpbmZvVG9rZW4udmFsdWUgPSB0b2tlbkZvcm1hdHRlZDtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXN1bHQucHVzaChpbmZvVG9rZW4pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHJcblx0XHQvLyBsZXQgdG9rZW5zOiBhbnlbXSA9IFtdO1xyXG5cdFx0Ly8gbGV0IGkgPSB0aGlzLm5leHRWYWxpZFBvc2l0aW9uVG9rZW5zKHN0cmluZ1RleHQsIDApO1xyXG5cdFx0Ly8gbGV0IGNvdW50ID0gMDtcclxuXHRcdC8vIHdoaWxlIChpID49IDAgJiYgY291bnQgPD0gMTApIHtcclxuXHRcdC8vICAgbGV0IGluZm9Ub2tlbjoge30gPSBudWxsO1xyXG5cdFx0Ly8gICBsZXQgbmV4dEk6IG51bWJlciA9IGk7XHJcblx0XHQvLyAgIGxldCBjaGFyYWN0ZXIgPSBzdHJpbmdUZXh0LnN1YnN0cmluZyhpLCAoaSArIDEpKTtcclxuXHRcdC8vICAgaWYgKGNoYXJhY3RlciA9PSBcIiRcIikge1xyXG5cdFx0Ly8gICAgIGxldCBuZXh0Q2hhcmFjdGVyID0gc3RyaW5nVGV4dC5zdWJzdHJpbmcoKGkgKyAxKSwgKGkgKyAyKSk7XHJcblx0XHQvLyAgICAgLy8gVGhlIG5leHQgY2hhcmFjdGVyIG5lZWQgdG8gYmUgYSB7IHNpZ25cclxuXHRcdC8vICAgICBpZiAobmV4dENoYXJhY3RlciAhPSBcIntcIikge1xyXG5cdFx0Ly8gICAgICAgaSA9IHRoaXMubmV4dFZhbGlkUG9zaXRpb25Ub2tlbnMoc3RyaW5nVGV4dCwgbmV4dEkgKyAxKTtcclxuXHRcdC8vICAgICAgIGNvbnRpbnVlO1xyXG5cdFx0Ly8gICAgIH1cclxuXHRcdC8vICAgICBsZXQga2V5VG9rZW46IHN0cmluZyA9IHN0cmluZ1RleHQuc3Vic3RyaW5nKGksIHN0cmluZ1RleHQuaW5kZXhPZihcIn1cIiwgaSkgKyAxKTtcclxuXHRcdC8vICAgICAvLyBJZiB0aGUgdG9rZW4gaGF2ZSBhIHZhbGlkIGtleSB0eXBlXHJcblx0XHQvLyAgICAgbGV0IGtleVR5cGU6IG51bWJlciA9IFRva2VuU2VydmljZS5nZXRLZXlUeXBlKGtleVRva2VuLnJlcGxhY2UoXCJ7XCIsIFwiXCIpLnJlcGxhY2UoXCJ9XCIsIFwiXCIpKTtcclxuXHRcdC8vICAgICBpZiAoa2V5VHlwZSA9PT0gbnVsbCkge1xyXG5cdFx0Ly8gICAgICAgaSA9IHRoaXMubmV4dFZhbGlkUG9zaXRpb25Ub2tlbnMoc3RyaW5nVGV4dCwgbmV4dEkgKyAxKTtcclxuXHRcdC8vICAgICAgIGNvbnRpbnVlO1xyXG5cdFx0Ly8gICAgIH1cclxuXHRcdC8vICAgICBpbmZvVG9rZW4gPSB7XHJcblx0XHQvLyAgICAgICBrZXk6IGtleVRva2VuLFxyXG5cdFx0Ly8gICAgICAgdmFsdWU6IGtleVRva2VuXHJcblx0XHQvLyAgICAgfTtcclxuXHRcdC8vICAgICBuZXh0SSA9IHN0cmluZ1RleHQuaW5kZXhPZihcIn1cIiwgaSk7XHJcblx0XHQvLyAgIH0gZWxzZSB7XHJcblx0XHQvLyAgICAgbGV0IG5leHRTaWduOiBudW1iZXIgPSBzdHJpbmdUZXh0LmluZGV4T2YoXCIkXCIsIGkpO1xyXG5cdFx0Ly8gICAgIC8vIFdlIGlubHkgc3VwcG9ydCAjZGF0ZSgkIGFuZCAjbnVtYmVyKCQgaW4gdGhpcyAyIHNjZW5hcmlvcyB0aGUgbGVuZ2h0IGNhbid0IGJlIG1vcmUgdGhhbiAxMCBjaGFyYWN0ZXJzXHJcblx0XHQvLyAgICAgaWYgKG5leHRTaWduIDwgMCB8fCAobmV4dFNpZ24gLSBpKSA+IDEwKSB7XHJcblx0XHQvLyAgICAgICBpID0gdGhpcy5uZXh0VmFsaWRQb3NpdGlvblRva2VucyhzdHJpbmdUZXh0LCBuZXh0SSArIDEpO1xyXG5cdFx0Ly8gICAgICAgY29udGludWU7XHJcblx0XHQvLyAgICAgfVxyXG5cdFx0Ly8gICAgIGxldCBrZXlUb2tlbjogc3RyaW5nID0gc3RyaW5nVGV4dC5zdWJzdHJpbmcoc3RyaW5nVGV4dC5pbmRleE9mKFwiJFwiLCBpKSwgc3RyaW5nVGV4dC5pbmRleE9mKFwifVwiLCBpKSArIDEpO1xyXG5cdFx0Ly8gICAgIGxldCB2YWx1ZVRva2VuOiBzdHJpbmcgPSBzdHJpbmdUZXh0LnN1YnN0cmluZyhpLCBzdHJpbmdUZXh0LmluZGV4T2YoXCIpXCIsIGkpICsgMSk7XHJcblx0XHQvLyAgICAgaW5mb1Rva2VuID0ge1xyXG5cdFx0Ly8gICAgICAga2V5OiBrZXlUb2tlbixcclxuXHRcdC8vICAgICAgIHZhbHVlOiB2YWx1ZVRva2VuXHJcblx0XHQvLyAgICAgfTtcclxuXHRcdC8vICAgICBuZXh0SSA9IHN0cmluZ1RleHQuaW5kZXhPZihcIilcIiwgaSk7XHJcblx0XHQvLyAgIH1cclxuXHRcdC8vICAgdG9rZW5zLnB1c2goaW5mb1Rva2VuKTtcclxuXHRcdC8vICAgaSA9IHRoaXMubmV4dFZhbGlkUG9zaXRpb25Ub2tlbnMoc3RyaW5nVGV4dCwgbmV4dEkpO1xyXG5cdFx0Ly8gICBjb3VudCsrO1xyXG5cdFx0Ly8gfVxyXG5cdFx0Ly8gcmV0dXJuIHRva2VucztcclxuXHR9XHJcblxyXG5cdG5leHRWYWxpZFBvc2l0aW9uVG9rZW5zKHN0cmluZ1RleHQ6IHN0cmluZywgbmV4dEk6IG51bWJlcik6IG51bWJlciB7XHJcblx0XHRsZXQgdG9rZW5Eb2xsYXJTaWduOiBudW1iZXIgPSBzdHJpbmdUZXh0LmluZGV4T2YoJyQnLCBuZXh0SSk7XHJcblx0XHRsZXQgdG9rZW5OdW1TaWduOiBudW1iZXIgPSBzdHJpbmdUZXh0LmluZGV4T2YoJyMnLCBuZXh0SSk7XHJcblx0XHRsZXQgaTogbnVtYmVyID1cclxuXHRcdFx0dG9rZW5Eb2xsYXJTaWduIDwgMCAmJiB0b2tlbk51bVNpZ24gPj0gMFxyXG5cdFx0XHRcdD8gdG9rZW5OdW1TaWduXHJcblx0XHRcdFx0OiB0b2tlbk51bVNpZ24gPCAwICYmIHRva2VuRG9sbGFyU2lnbiA+PSAwXHJcblx0XHRcdFx0PyB0b2tlbkRvbGxhclNpZ25cclxuXHRcdFx0XHQ6IHRva2VuRG9sbGFyU2lnbiA8IHRva2VuTnVtU2lnblxyXG5cdFx0XHRcdD8gdG9rZW5Eb2xsYXJTaWduXHJcblx0XHRcdFx0OiB0b2tlbk51bVNpZ247XHJcblx0XHRyZXR1cm4gaTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEl0IHJldXNlcyByZXBsYWNlVG9rZW5zRnJvbUxpc3RPYmplY3RQdWJsaWMgYnV0IHNldCBhbGwga2V5cyBsb2JqZWN0dG9rZW5zIGFzIGxvd2VyY2FzZVxyXG5cdCAqIEBwYXJhbSB0b2tlbk5hbWVcclxuXHQgKiBAcGFyYW0gZm9ybXVsYVxyXG5cdCAqIEBwYXJhbSBsT2JqZWN0VG9rZW5zXHJcblx0ICovXHJcblx0cmVwbGFjZVRva2Vuc0Zyb21MaXN0T2JqZWN0UHVibGljKFxyXG5cdFx0dG9rZW5OYW1lOiBzdHJpbmcsXHJcblx0XHRmb3JtdWxhOiBzdHJpbmcsXHJcblx0XHRsT2JqZWN0VG9rZW5zOiBhbnlbXVxyXG5cdCk6IHN0cmluZyB7XHJcblx0XHRsZXQgbERhdGFPcmc6IGFueVtdID0gW107XHJcblx0XHRpZiAobE9iamVjdFRva2Vucykge1xyXG5cdFx0XHRmb3IgKGxldCBkYXRhRm9ybSBpbiBsT2JqZWN0VG9rZW5zKSB7XHJcblx0XHRcdFx0bERhdGFPcmdbZGF0YUZvcm0udG9Mb3dlckNhc2UoKV0gPSBsT2JqZWN0VG9rZW5zW2RhdGFGb3JtXTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHRoaXMucmVwbGFjZVRva2Vuc0Zyb21MaXN0T2JqZWN0KHRva2VuTmFtZSwgZm9ybXVsYSwgbERhdGFPcmcpO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBAcGFyYW0gdG9rZW5OYW1lIHRva2VuIG5hbWVcclxuXHQgKiBAcGFyYW0gZm9ybXVsYSBTdHJpbmcgd2l0aCB0aGUgZm9ybXVsYSB0byBleGVjdXRlXHJcblx0ICogQHBhcmFtIGxPYmplY3RUb2tlbnMgTGlzdCBvZiB0b2tlbnMgd2l0aCB0aGUgdmFsdWVzIHRvIHJlcGxhY2VcclxuXHQgKi9cclxuXHRyZXBsYWNlVG9rZW5zRnJvbUxpc3RPYmplY3QodG9rZW5OYW1lOiBzdHJpbmcsIGZvcm11bGE6IHN0cmluZywgbE9iamVjdFRva2VuczogYW55KTogc3RyaW5nIHtcclxuXHRcdGlmICghZm9ybXVsYSB8fCBmb3JtdWxhLmxlbmd0aCA9PSAwKSB7XHJcblx0XHRcdHRocm93IHtcclxuXHRcdFx0XHRtZXNzYWdlOiAnTGEgZm9ybXVsYSBkZWwgdG9rZW4gJyArIHRva2VuTmFtZSArICcgZXN0YSB2YWPDrWEnLFxyXG5cdFx0XHRcdHRpdGxlOiAnQWxlcnRhIScsXHJcblx0XHRcdFx0ZXJyb3I6XHJcblx0XHRcdFx0XHQnTGEgZm9ybXVsYSBkZWwgdG9rZW4gJyArIHRva2VuTmFtZSArICcgZXN0YSB2YWPDrWEuIFtmb3JtdWxhWycgKyBmb3JtdWxhICsgJ11dJ1xyXG5cdFx0XHR9O1xyXG5cdFx0fVxyXG5cdFx0bGV0IHJlcGxhY2VkVG9rZW5zOiBzdHJpbmcgPSBmb3JtdWxhLnRvU3RyaW5nKCk7XHJcblx0XHRpZiAocmVwbGFjZWRUb2tlbnMuc3RhcnRzV2l0aCgnZmlsZTovLycpKSB7XHJcblx0XHRcdHJldHVybiByZXBsYWNlZFRva2VucztcclxuXHRcdH1cclxuXHRcdC8vIEZpbmQgdGhlIHRva2VucyBpbiB0aGUgZm9ybXVsYVxyXG5cdFx0bGV0IHRva2Vuc0FycmF5OiBhbnlbXSA9IHRoaXMuZ2V0TGlzdFRva2Vuc0J5U3RyaW5nKHJlcGxhY2VkVG9rZW5zKTtcclxuXHRcdGlmICh0b2tlbnNBcnJheS5sZW5ndGggPT0gMCkge1xyXG5cdFx0XHRyZXR1cm4gcmVwbGFjZWRUb2tlbnM7XHJcblx0XHR9XHJcblx0XHQvLyBJZiB0aGVyZSBhbnkgdG9rZW4sIHRyeSB0byByZXBsYWNlXHJcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRva2Vuc0FycmF5Lmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdGxldCBvYmplY3RUb2tlbiA9XHJcblx0XHRcdFx0bE9iamVjdFRva2Vuc1t0b2tlbnNBcnJheVtpXS5rZXldICE9PSB1bmRlZmluZWRcclxuXHRcdFx0XHRcdD8gbE9iamVjdFRva2Vuc1t0b2tlbnNBcnJheVtpXS5rZXldXHJcblx0XHRcdFx0XHQ6IG51bGw7XHJcblx0XHRcdGxldCBjbGVhcktleTtcclxuXHRcdFx0aWYgKG9iamVjdFRva2VuID09IG51bGwpIHtcclxuXHRcdFx0XHRjbGVhcktleSA9IHRva2Vuc0FycmF5W2ldLmtleS5yZXBsYWNlKCckeycsICcnKS5yZXBsYWNlKCd9JywgJycpLnRvTG93ZXJDYXNlKCk7XHJcblx0XHRcdFx0b2JqZWN0VG9rZW4gPVxyXG5cdFx0XHRcdFx0bE9iamVjdFRva2Vuc1tjbGVhcktleV0gIT09IHVuZGVmaW5lZCA/IGxPYmplY3RUb2tlbnNbY2xlYXJLZXldIDogbnVsbDtcclxuXHJcblx0XHRcdFx0aWYgKG9iamVjdFRva2VuID09IG51bGwpIHtcclxuXHRcdFx0XHRcdGNsZWFyS2V5ID0gdG9rZW5zQXJyYXlbaV0ua2V5XHJcblx0XHRcdFx0XHRcdC5yZXBsYWNlKCd7JywgJycpXHJcblx0XHRcdFx0XHRcdC5yZXBsYWNlKCd9JywgJycpXHJcblx0XHRcdFx0XHRcdC5zcGxpdCgnXycpWzFdXHJcblx0XHRcdFx0XHRcdC50b0xvd2VyQ2FzZSgpO1xyXG5cdFx0XHRcdFx0b2JqZWN0VG9rZW4gPVxyXG5cdFx0XHRcdFx0XHRsT2JqZWN0VG9rZW5zW2NsZWFyS2V5XSAhPT0gdW5kZWZpbmVkID8gbE9iamVjdFRva2Vuc1tjbGVhcktleV0gOiBudWxsO1xyXG5cdFx0XHRcdFx0aWYgKG9iamVjdFRva2VuID09PSBudWxsIHx8IG9iamVjdFRva2VuID09PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgYXJyYXlLZXkgPSB0b2tlbnNBcnJheVtpXS5rZXlcclxuXHRcdFx0XHRcdFx0XHQucmVwbGFjZSgneycsICcnKVxyXG5cdFx0XHRcdFx0XHRcdC5yZXBsYWNlKCd9JywgJycpXHJcblx0XHRcdFx0XHRcdFx0LnNwbGl0KCdfJylbMV1cclxuXHRcdFx0XHRcdFx0XHQuc3BsaXQoJy4nKTtcclxuXHRcdFx0XHRcdFx0aWYgKGFycmF5S2V5Lmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdFx0XHRsZXQgdmFsdWUgPSBsT2JqZWN0VG9rZW5zO1xyXG5cdFx0XHRcdFx0XHRcdGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhcnJheUtleS5sZW5ndGg7IGluZGV4KyspIHtcclxuXHRcdFx0XHRcdFx0XHRcdGxldCBlbGVtZW50ID0gYXJyYXlLZXlbaW5kZXhdO1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGluZGV4ID09IDApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZWxlbWVudCA9IGVsZW1lbnQudG9Mb3dlckNhc2UoKTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlID0gdmFsdWVbZWxlbWVudF07XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdG9iamVjdFRva2VuID0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKG9iamVjdFRva2VuID09IG51bGwpIHtcclxuXHRcdFx0XHQvLyBJZiBub3QgZmluZCB0aGUgdG9rZW4sIGJ5IGRlZmF1bHQgcHV0IGFuIGVtcHR5IHN0cmluZ1xyXG5cdFx0XHRcdC8qaWYgKFRva2VuU2VydmljZS5leGNsdWRlZFRva2VuLmluZGV4T2YoY2xlYXJLZXkpID09PSAtMSkge1xyXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvcihcclxuXHRcdFx0XHRcdFx0J0VsIHRva2VuICcgKyB0b2tlbnNBcnJheVtpXS52YWx1ZSArICcgbm8gZnVlIGVuY29udHJhZG8uJyxcclxuXHRcdFx0XHRcdFx0bE9iamVjdFRva2VucyxcclxuXHRcdFx0XHRcdFx0dG9rZW5zQXJyYXlcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0fSovXHJcblx0XHRcdFx0b2JqZWN0VG9rZW4gPSAnJztcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAob2JqZWN0VG9rZW4gIT0gbnVsbCkge1xyXG5cdFx0XHRcdC8vIGxldCB2YWx1ZTogYW55ID0gTnVtYmVyKG9iamVjdFRva2VuKVxyXG5cdFx0XHRcdC8vIFx0PyBvYmplY3RUb2tlblxyXG5cdFx0XHRcdC8vIFx0OiBBcnJheS5pc0FycmF5KG9iamVjdFRva2VuKVxyXG5cdFx0XHRcdC8vIFx0PyBKU09OLnN0cmluZ2lmeShvYmplY3RUb2tlbilcclxuXHRcdFx0XHQvLyBcdDogXCInXCIgKyBvYmplY3RUb2tlbiArIFwiJ1wiO1xyXG5cdFx0XHRcdGxldCB2YWx1ZTogYW55O1xyXG5cdFx0XHRcdGlmIChOdW1iZXIob2JqZWN0VG9rZW4pKSB7XHJcblx0XHRcdFx0XHR2YWx1ZSA9IE51bWJlcihvYmplY3RUb2tlbik7XHJcblx0XHRcdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iamVjdFRva2VuKSkge1xyXG5cdFx0XHRcdFx0dmFsdWUgPSBBcnJheS5pc0FycmF5KG9iamVjdFRva2VuKTtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKEpTT04uc3RyaW5naWZ5KG9iamVjdFRva2VuKSkge1xyXG5cdFx0XHRcdFx0dmFsdWUgPSBvYmplY3RUb2tlbi5vcmlnaW5hbF9uYW1lXHJcblx0XHRcdFx0XHRcdD8gXCInXCIgKyBvYmplY3RUb2tlbi5vcmlnaW5hbF9uYW1lICsgXCInXCJcclxuXHRcdFx0XHRcdFx0OiBKU09OLnN0cmluZ2lmeShvYmplY3RUb2tlbik7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHZhbHVlID0gXCInXCIgKyBvYmplY3RUb2tlbiArIFwiJ1wiO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXBsYWNlZFRva2VucyA9IHRoaXMucmVwbGFjZVRva2VuKHJlcGxhY2VkVG9rZW5zLCB0b2tlbnNBcnJheVtpXS52YWx1ZSwgdmFsdWUpO1xyXG5cdFx0XHRcdC8vIH0gZWxzZSB7XHJcblx0XHRcdFx0Ly8gICBjb25zb2xlLmVycm9yKGxPYmplY3RUb2tlbnMsIHRva2Vuc0FycmF5KTtcclxuXHRcdFx0XHQvLyAgIHRocm93IHtcclxuXHRcdFx0XHQvLyAgICAgbWVzc2FnZTogXCJObyBzZSBlbmNvbnRyw7MgdmFsb3IgcGFyYSB1biB0b2tlblwiLFxyXG5cdFx0XHRcdC8vICAgICB0aXRsZTogXCJBbGVydGEhXCIsXHJcblx0XHRcdFx0Ly8gICAgIGVycm9yOiBcIkVsIHRva2VuIFwiICsgdG9rZW5zQXJyYXlbaV0udmFsdWUgKyBcIiBubyBmdWUgZW5jb250cmFkby5cIlxyXG5cdFx0XHRcdC8vICAgfTtcclxuXHRcdFx0XHQvL1xyXG5cdFx0XHRcdC8vIFNpIGVzIGxhIHVsdGltYSBpdGVyYWNpb24geSBsYSBmb3JtdWxhIHRpZW5lIFsgZXMgcG9ycXVlIHRpZW5lIHVuIGFycmF5IGVuIGVsIHZhbG9yIHF1ZSByZXNvbHZpbyBlbCB0b2tlblxyXG5cdFx0XHRcdGlmIChpID09IHRva2Vuc0FycmF5Lmxlbmd0aCAtIDEgJiYgcmVwbGFjZWRUb2tlbnMuaW5jbHVkZXMoJ1snKSkge1xyXG5cdFx0XHRcdFx0Ly8gU2UgcG9uZW4gdG9kb3MgbG9zIG9wZXJhbmRvcyBjb21vIGVsZW1lbnRvcyBlbiB1biBhcnJheSBbJ2V4cHJlc2lvbiBhJywgJyYmJywgJ0V4cHJlc2lvbiBCJ11cclxuXHRcdFx0XHRcdGxldCBmb3JtRXhwcmVzc2lvbnM6IHN0cmluZ1tdID0gcmVwbGFjZWRUb2tlbnMuc3BsaXQoLyAoXFx8XFx8fCYmKSAvKTtcclxuXHRcdFx0XHRcdGxldCBsQXV4Zm9ybUV4cHJlc3Npb246IHN0cmluZ1tdID0gW107XHJcblx0XHRcdFx0XHRmb3JtRXhwcmVzc2lvbnMuZm9yRWFjaCgoZXhwcmVzc2lvbjogc3RyaW5nKSA9PiB7XHJcblx0XHRcdFx0XHRcdGlmIChleHByZXNzaW9uLmNoYXJBdCgwKSA9PSAnWycpIHtcclxuXHRcdFx0XHRcdFx0XHRsZXQgaXNUYWdGb3VuZDogc3RyaW5nID0gJyc7XHJcblx0XHRcdFx0XHRcdFx0aXNUYWdGb3VuZCA9IHRoaXMuZmluZFRhZyhleHByZXNzaW9uKTtcclxuXHRcdFx0XHRcdFx0XHRsQXV4Zm9ybUV4cHJlc3Npb24ucHVzaChpc1RhZ0ZvdW5kKTtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRsQXV4Zm9ybUV4cHJlc3Npb24ucHVzaChleHByZXNzaW9uKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRyZXBsYWNlZFRva2VucyA9IGxBdXhmb3JtRXhwcmVzc2lvbi5qb2luKCcgJyk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmVwbGFjZWRUb2tlbnM7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNRXRvZG8gcXVlIHRlbmllbmRvIHVuYSBleHByZXNpb24gZGUgbGEgZm9ybWEgWyd0YWcxJywgJ3RhZzInXT09dGFnM1xyXG5cdCAqIGV2YWx1YSBzaSB0YWczIGhhY2UgcGFydGUgZGVsIGFycmF5IHNpIHRpZW5lIGVsIG9wZXJhZG9yID09LlxyXG5cdCAqIFNpIHRpZW5lIGVsIG9wZXJhZG9yICE9IGV4YW1pbmEgcXVlIHRhZzMgbm8gaGFnYSBwYXJ0ZSBkZWwgYXJyYXkrXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gZXhwcmVzc2lvbiBPcGVyYW5kbyBxdWUgZXZhbHVhIHRhZy4gRXMgZGUgbGEgZm9ybWEgWyd0YWcxJywgJ3RhZzInXT09dGFnM1xyXG5cdCAqIEByZXR1cm5zIFJldG9ybmEgJ3RydWUnIG8gJ2ZhbHNlJyBlbiBzdHJpbmcgcXVlIGRlc3B1ZXMgc2VyYSBwYXNhZG8gYSB1biBldmFsKClcclxuXHQgKiBtYXMgYWRlbGFudGUgZW4gZWwgZmx1am9cclxuXHQgKi9cclxuXHRmaW5kVGFnKGV4cHJlc3Npb246IHN0cmluZyk6IHN0cmluZyB7XHJcblx0XHRsZXQgcmVnZXhPcGVyYXRvciA9IG5ldyBSZWdFeHAoJyg9PT18PT18IT09fCE9KScpO1xyXG5cdFx0Ly8gUmV0b3JuYSBlbCBvcGVyYWRvclxyXG5cdFx0bGV0IG9wZXJhdG9yOiBzdHJpbmdbXSA9IGV4cHJlc3Npb24ubWF0Y2gocmVnZXhPcGVyYXRvcik7XHJcblx0XHQvLyBTaSBubyBlbmN1ZW50cmEgdW4gb3BlcmFkb3Igc2VndW4gZWwgcGF0cm9uIHJldG9ybmEgJ2ZhbHNlJ1xyXG5cdFx0Ly8gcGFyYSBldml0YXIgcmVzdWx0YWRvcyBpbmVzcGVyYWRvc1xyXG5cdFx0aWYgKG9wZXJhdG9yID09IG51bGwpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcignTm8gc2UgZW5jb250cm8gdW4gb3BlcmFkb3IgcGVybWl0aWRvIHBhcmEgbGEgZXhwcmVzaW9uJyk7XHJcblx0XHRcdHJldHVybiAnZmFsc2UnO1xyXG5cdFx0fVxyXG5cdFx0Ly8gU2VwYXJhIGxhIHNlbnRlbmNpYSBwb3IgZWwgb3BlcmFkb3JcclxuXHRcdC8vIExhIHByaW1lcmEgcGFydGUgZXMgZWwgdmFsb3IgcG9yIGVsIGN1YWwgc2UgcmVtcGxhemEgZWwgdG9rZW4gcXVlIGVzIHVuIGFycmF5IGVuIHN0cmluZyBcIlsnYScsICdiJ11cIlxyXG5cdFx0Ly8gRWwgc2VndW5kbyBlcyBlbCB2YWxvciBjb24gZWwgY3VhbCBzZSB2YSBhIGNvbXBhcmFyXHJcblx0XHRsZXQgdmFsdWVUb2tlbiwgdmFsdWVUb0NvbXBhcmU7XHJcblx0XHRbdmFsdWVUb2tlbiwgdmFsdWVUb0NvbXBhcmVdID0gZXhwcmVzc2lvbi5zcGxpdChvcGVyYXRvclswXSk7XHJcblx0XHQvLyBTZSBsaW1waWEgZWwgc3RyaW5nIGNvcnJlc3BvbmRpZW50ZSBhbCBhcnJheSBwYXJhIHF1ZSBsb3MgZWxlbWVudG9zIHF1ZWRlbiBzZXBhcmFkb3MgcG9yIFwiLFwiXHJcblx0XHR2YWx1ZVRva2VuID0gdmFsdWVUb2tlbi5yZXBsYWNlKC9bXmEtekEtWjAtOSAsXS9nLCAnJyk7XHJcblx0XHQvLyBTaSBubyBoYXkgdGFncyBhc29jaWFkb3MgYWwgcmVnaXN0cm8gc2UgZGV2dWVsdmUgJ2ZhbHNlJ1xyXG5cdFx0aWYgKCF2YWx1ZVRva2VuKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoJ05vIGhheSB0YWdzIGFzb2NpYWRvcyBhIGVzdGEgYXBsaWNhY2nDs24nKTtcclxuXHRcdFx0cmV0dXJuICdmYWxzZSc7XHJcblx0XHR9XHJcblx0XHQvLyBTZSBsaW1waWEgZWwgc3RyaW5nIGNvcnJlc3BvbmRpZW50ZSBhbCB2YWxvciBwb3IgY29tcGFyYXJcclxuXHRcdHZhbHVlVG9Db21wYXJlID0gdmFsdWVUb0NvbXBhcmUucmVwbGFjZSgvW15hLXpBLVowLTkgXS9nLCAnJyk7XHJcblx0XHQvLyBFbCBzdHJpbmcgY29ycmVzcG9uZGllbnRlIGFsIGFycmF5IHBhc2EgYSBzZXIgdGlwbyBhcnJheVxyXG5cdFx0dmFsdWVUb2tlbiA9IHZhbHVlVG9rZW4uc3BsaXQoJywnKTtcclxuXHJcblx0XHQvLyBTZSB0cmF0YSBkZSBjb25zdGF0YXIgc2kgZWwgdmFsb3IgYSBjb21wYXJhciBzZSBlbmN1ZXRyYSBvIG5vIGRlbnRyb1xyXG5cdFx0Ly8gU2kgZWwgb3BlcmFkb3IgcXVlIHNlIGVuY29udHJvID09IHJldHVybmEgdHJ1ZSBzaSBsbyBlbmN1ZW50cmFcclxuXHRcdGxldCBpc1RhZ0ZvdW5kOiBib29sZWFuID0gdHJ1ZTtcclxuXHRcdHN3aXRjaCAob3BlcmF0b3JbMF0pIHtcclxuXHRcdFx0Y2FzZSAnPT0nOlxyXG5cdFx0XHRcdGlzVGFnRm91bmQgPSB2YWx1ZVRva2VuLnNvbWUoKHRhZykgPT4gdGFnID09IHZhbHVlVG9Db21wYXJlKTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSAnPT09JzpcclxuXHRcdFx0XHRpc1RhZ0ZvdW5kID0gdmFsdWVUb2tlbi5zb21lKCh0YWcpID0+IHRhZyA9PT0gdmFsdWVUb0NvbXBhcmUpO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlICchPT0nOlxyXG5cdFx0XHRcdGlzVGFnRm91bmQgPSB2YWx1ZVRva2VuLnNvbWUoKHRhZykgPT4gdGFnICE9PSB2YWx1ZVRvQ29tcGFyZSk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgJyE9JzpcclxuXHRcdFx0XHRpc1RhZ0ZvdW5kID0gdmFsdWVUb2tlbi5zb21lKCh0YWcpID0+IHRhZyAhPSB2YWx1ZVRvQ29tcGFyZSk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHR9XHJcblx0XHRleHByZXNzaW9uID0gaXNUYWdGb3VuZCA/ICd0cnVlJyA6ICdmYWxzZSc7XHJcblx0XHRyZXR1cm4gZXhwcmVzc2lvbjtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyeSB0byBldmFsIHRoZSBmb3JtdWxhIGRlcGVuZCBvZiB0aGUgdHlwZSBvZiBmaWVsZHMuXHJcblx0ICogQHBhcmFtIGxTdGF0aWNUb2tlblxyXG5cdCAqIEBwYXJhbSBmb3JtdWxhTmFtZVxyXG5cdCAqIEBwYXJhbSBmb3JtdWxhXHJcblx0ICovXHJcblx0dmFsaWRhdGVGb3JtdWxhKGxTdGF0aWNUb2tlbjogYW55LCBmb3JtdWxhTmFtZTogc3RyaW5nLCBmb3JtdWxhOiBzdHJpbmcpOiBib29sZWFuIHtcclxuXHRcdGxldCBldmFsRm9ybXVsYTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdFx0Ly8gVG8gdmFsaWRhdGUgdGhlIGZvcm11bGEsIGZpcnN0IG9yZ2FuaXplIHRoZSBpbmZvIHRvIGtleSAtIHZhbHVlIGFycmF5XHJcblx0XHRsZXQgb2JqZWN0VG9rZW5zOiBhbnlbXSA9IFtdO1xyXG5cdFx0Zm9yIChsZXQgcGFuZWwgb2YgbFN0YXRpY1Rva2VuKSB7XHJcblx0XHRcdGZvciAobGV0IGdyb3VwVG9rZW4gb2YgcGFuZWwudmFsdWUpIHtcclxuXHRcdFx0XHRmb3IgKGxldCBzdGF0aWNUb2tlbiBvZiBncm91cFRva2VuLnZhbHVlKSB7XHJcblx0XHRcdFx0XHRmb3IgKGxldCBhcnJheVRva2VuSW5mbyBvZiBzdGF0aWNUb2tlbikge1xyXG5cdFx0XHRcdFx0XHRvYmplY3RUb2tlbnNbYXJyYXlUb2tlbkluZm8ua2V5XSA9IGFycmF5VG9rZW5JbmZvLm9iamVjdFxyXG5cdFx0XHRcdFx0XHRcdD8gYXJyYXlUb2tlbkluZm8ub2JqZWN0LnR5cGUgPT0gJ251bWJlcidcclxuXHRcdFx0XHRcdFx0XHRcdD8gJzAnXHJcblx0XHRcdFx0XHRcdFx0XHQ6ICcnXHJcblx0XHRcdFx0XHRcdFx0OiAnJztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHRyeSB7XHJcblx0XHRcdGZvcm11bGEgPSB0aGlzLnJlcGxhY2VUb2tlbnNGcm9tTGlzdE9iamVjdChmb3JtdWxhTmFtZSwgZm9ybXVsYSwgb2JqZWN0VG9rZW5zKTtcclxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdC8vY29uc29sZS5lcnJvcihlcnJvcik7XHJcblx0XHRcdHRocm93IGVycm9yO1xyXG5cdFx0fVxyXG5cdFx0aWYgKGZvcm11bGEgIT09IG51bGwpIHtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRsZXQgcmVzdWx0ID0gZm9ybXVsYS5zdGFydHNXaXRoKCdmaWxlOi8vJykgPyBmb3JtdWxhIDogZXZhbChmb3JtdWxhKTtcclxuXHRcdFx0XHRldmFsRm9ybXVsYSA9IHRydWU7XHJcblx0XHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0XHQvL2NvbnNvbGUuZXJyb3IoXCJFcnJvciBldmFsdWF0aW5nIHRoZSBmb3JtdWxhXCIsIGUpO1xyXG5cdFx0XHRcdHRocm93IHtcclxuXHRcdFx0XHRcdG1lc3NhZ2U6ICdMYSBmb3JtdWxhIG5vIGZ1ZSBwb3NpYmxlIGV2YWx1YXInLFxyXG5cdFx0XHRcdFx0dGl0bGU6ICdBbGVydGEhJyxcclxuXHRcdFx0XHRcdGVycm9yOiBlXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGV2YWxGb3JtdWxhO1xyXG5cdH1cclxuXHJcblx0Z2V0Q29uZmlnQ2xvbmluZ1Rva2VuTWFwKG9sZFBQUDogbnVtYmVyLCBuZXdQUFA6IG51bWJlcik6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldChcclxuXHRcdFx0dGhpcy5lbnZpcm9ubWVudC5ob3N0LmJhY2tlbmQuY29uZmlndXJhdGlvbiArICd0b2tlbi9nZXRDb25maWdDbG9uaW5nVG9rZW5NYXAnLFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0cGFyYW1zOiBuZXcgSHR0cFBhcmFtcygpXHJcblx0XHRcdFx0XHQuc2V0KCdvbGRQUFAnLCBvbGRQUFAudG9TdHJpbmcoKSlcclxuXHRcdFx0XHRcdC5zZXQoJ25ld1BQUCcsIG5ld1BQUC50b1N0cmluZygpKVxyXG5cdFx0XHR9XHJcblx0XHQpO1xyXG5cdH1cclxufVxyXG4iXX0=