ng-pli-commons 0.0.1908 → 1.0.1

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 (471) hide show
  1. package/esm2022/lib/components/backoffice.commons.component.mjs +40 -0
  2. package/esm2022/lib/components/common.lists.component.mjs +194 -0
  3. package/{esm2020 → esm2022}/lib/components/configuration-token/configuration-token-subject.service.mjs +23 -23
  4. package/esm2022/lib/components/configuration-token/configuration-token.component.mjs +665 -0
  5. package/esm2022/lib/components/configuration-token/guarantee-token/guarantee-token.component.mjs +103 -0
  6. package/esm2022/lib/components/configuration-token/snapshot-token/snapshot-token.component.mjs +108 -0
  7. package/esm2022/lib/components/configuration.commons.component.mjs +40 -0
  8. package/{esm2020 → esm2022}/lib/components/dashboard.commons.component.mjs +84 -84
  9. package/esm2022/lib/components/dynamic-filter/dynamic-filter.component.mjs +131 -0
  10. package/esm2022/lib/components/excel-to-json/excel-to-json.component.mjs +54 -0
  11. package/esm2022/lib/components/frontoffice.commons.component.mjs +86 -0
  12. package/esm2022/lib/components/pdf-analyzer/pdf-analyzer.component.mjs +162 -0
  13. package/{esm2020 → esm2022}/lib/components/pdf-config/pdf-config.component.mjs +170 -170
  14. package/esm2022/lib/components/pdf-generator/pdf-generator.component.mjs +223 -0
  15. package/esm2022/lib/components/pdf-merge-visualizer/pdf-merge-visualizer.component.mjs +307 -0
  16. package/esm2022/lib/components/pdf-visualizer/pdf-visualizer.component.mjs +387 -0
  17. package/esm2022/lib/components/progress-bar/progress-bar.component.mjs +92 -0
  18. package/esm2022/lib/components/segmentation-tokens/segmentation-tokens.component.mjs +199 -0
  19. package/esm2022/lib/components/select-ppp/select-ppp.component.mjs +199 -0
  20. package/esm2022/lib/components/show-hide-columns/show-hide-columns-table.component.mjs +116 -0
  21. package/esm2022/lib/components/token/token.component.mjs +1006 -0
  22. package/esm2022/lib/components/tokens-calculator/tokens-calculator.component.mjs +128 -0
  23. package/{esm2020 → esm2022}/lib/directives/currency-colfuturo-formatter.directive.mjs +47 -47
  24. package/{esm2020 → esm2022}/lib/directives/currency-decimal-colfuturo-formatter.directive.mjs +34 -34
  25. package/esm2022/lib/ng-pli-commons.module.mjs +387 -0
  26. package/{esm2020 → esm2022}/lib/ng-pli-commons.service.mjs +14 -14
  27. package/esm2022/lib/pipes/currency-colfuturo.pipe.mjs +35 -0
  28. package/{esm2020 → esm2022}/lib/pipes/currency-decimal-colfuturo.pipe.mjs +36 -36
  29. package/{esm2020 → esm2022}/lib/pipes/currency-print-colfuturo.pipe.mjs +33 -33
  30. package/esm2022/lib/pipes/thousands.pipe.mjs +60 -0
  31. package/{esm2020 → esm2022}/lib/services/application-fill-percentage.service.mjs +30 -30
  32. package/{esm2020 → esm2022}/lib/services/application-tag.service.mjs +56 -56
  33. package/{esm2020 → esm2022}/lib/services/application.service.mjs +247 -247
  34. package/esm2022/lib/services/authentication.service.mjs +133 -0
  35. package/{esm2020 → esm2022}/lib/services/blocked-beneficiary.service.mjs +42 -42
  36. package/esm2022/lib/services/budget-application.service.mjs +265 -0
  37. package/{esm2020 → esm2022}/lib/services/budget-simulation.service.mjs +61 -61
  38. package/esm2022/lib/services/budget.service.mjs +205 -0
  39. package/{esm2020 → esm2022}/lib/services/closure-wallet.service.mjs +39 -39
  40. package/{esm2020 → esm2022}/lib/services/cnf-correspondence-document-manager.service.mjs +39 -39
  41. package/{esm2020 → esm2022}/lib/services/committee-money.service.mjs +44 -44
  42. package/{esm2020 → esm2022}/lib/services/committee-pdf.service.mjs +27 -27
  43. package/{esm2020 → esm2022}/lib/services/committee-snapshot.service.mjs +60 -60
  44. package/{esm2020 → esm2022}/lib/services/common-info.service.mjs +51 -51
  45. package/esm2022/lib/services/common.service.mjs +291 -0
  46. package/esm2022/lib/services/configuration-document.service.mjs +297 -0
  47. package/{esm2020 → esm2022}/lib/services/configuration-minisite.service.mjs +26 -26
  48. package/{esm2020 → esm2022}/lib/services/configuration.service.mjs +53 -53
  49. package/{esm2020 → esm2022}/lib/services/correspondence-document-category.service.mjs +31 -31
  50. package/{esm2020 → esm2022}/lib/services/correspondence-manager.service.mjs +67 -67
  51. package/{esm2020 → esm2022}/lib/services/credit-score.service.mjs +48 -48
  52. package/{esm2020 → esm2022}/lib/services/credit-study.service.mjs +292 -292
  53. package/{esm2020 → esm2022}/lib/services/cube.service.mjs +27 -27
  54. package/{esm2020 → esm2022}/lib/services/data-form-history.service.mjs +25 -25
  55. package/{esm2020 → esm2022}/lib/services/data-form.service.mjs +176 -176
  56. package/{esm2020 → esm2022}/lib/services/data-letter-segmentation.service.mjs +64 -64
  57. package/{esm2020 → esm2022}/lib/services/document-analysis-auto.service.mjs +27 -27
  58. package/{esm2020 → esm2022}/lib/services/document-history.service.mjs +43 -43
  59. package/{esm2020 → esm2022}/lib/services/document-management.service.mjs +57 -57
  60. package/{esm2020 → esm2022}/lib/services/document-validation-attempt.service.mjs +32 -32
  61. package/{esm2020 → esm2022}/lib/services/document.service.mjs +131 -131
  62. package/esm2022/lib/services/documentary.type.service.mjs +69 -0
  63. package/{esm2020 → esm2022}/lib/services/email.service.mjs +30 -30
  64. package/{esm2020 → esm2022}/lib/services/evaluation.service.mjs +181 -181
  65. package/{esm2020 → esm2022}/lib/services/export-excel.service.mjs +32 -32
  66. package/esm2022/lib/services/file.service.mjs +153 -0
  67. package/{esm2020 → esm2022}/lib/services/form.service.mjs +112 -112
  68. package/{esm2020 → esm2022}/lib/services/gic-client-disbursement-metadata.service.mjs +31 -31
  69. package/{esm2020 → esm2022}/lib/services/gic-client.service.mjs +49 -49
  70. package/{esm2020 → esm2022}/lib/services/gic-cnf-bankvision-transaction.service.mjs +31 -31
  71. package/{esm2020 → esm2022}/lib/services/gic-cnf-closing-date.service.mjs +34 -34
  72. package/{esm2020 → esm2022}/lib/services/gic-cnf-maintenance.service.mjs +30 -30
  73. package/{esm2020 → esm2022}/lib/services/gic-collection.service.mjs +53 -53
  74. package/{esm2020 → esm2022}/lib/services/gic-disbursement.service.mjs +39 -39
  75. package/{esm2020 → esm2022}/lib/services/gic-extract.service.mjs +41 -41
  76. package/{esm2020 → esm2022}/lib/services/gic-log.service.mjs +41 -41
  77. package/{esm2020 → esm2022}/lib/services/gic-payment-application.service.mjs +35 -35
  78. package/{esm2020 → esm2022}/lib/services/gic-payment-plan-cube.service.mjs +27 -27
  79. package/{esm2020 → esm2022}/lib/services/gic-payment-plan.service.mjs +32 -32
  80. package/{esm2020 → esm2022}/lib/services/gic-trm.service.mjs +27 -27
  81. package/{esm2020 → esm2022}/lib/services/global.show.task.service.mjs +37 -37
  82. package/{esm2020 → esm2022}/lib/services/guarantee-document.service.mjs +52 -52
  83. package/{esm2020 → esm2022}/lib/services/guarantee-enrollment.service.mjs +37 -37
  84. package/esm2022/lib/services/guarantee.service.mjs +128 -0
  85. package/{esm2020 → esm2022}/lib/services/hash.service.mjs +36 -36
  86. package/{esm2020 → esm2022}/lib/services/import-data.service.mjs +27 -27
  87. package/{esm2020 → esm2022}/lib/services/import-excel-gic.service.mjs +45 -45
  88. package/{esm2020 → esm2022}/lib/services/initial-configuration-gic-parameters.service.mjs +51 -51
  89. package/{esm2020 → esm2022}/lib/services/initial-record.service.mjs +51 -51
  90. package/{esm2020 → esm2022}/lib/services/integration-ado.service.mjs +54 -54
  91. package/{esm2020 → esm2022}/lib/services/interaction-application-user.service.mjs +81 -81
  92. package/{esm2020 → esm2022}/lib/services/interest-adjustment.service.mjs +34 -34
  93. package/esm2022/lib/services/keys-assignation.service.mjs +127 -0
  94. package/{esm2020 → esm2022}/lib/services/legalization.service.mjs +150 -150
  95. package/{esm2020 → esm2022}/lib/services/letter-campaing.service.mjs +49 -49
  96. package/{esm2020 → esm2022}/lib/services/letter-task-mapping.service.mjs +40 -40
  97. package/{esm2020 → esm2022}/lib/services/log.service.mjs +41 -41
  98. package/{esm2020 → esm2022}/lib/services/maintenance.service.mjs +66 -66
  99. package/{esm2020 → esm2022}/lib/services/master-category.service.mjs +66 -66
  100. package/{esm2020 → esm2022}/lib/services/master-program.service.mjs +78 -78
  101. package/{esm2020 → esm2022}/lib/services/master-university.service.mjs +68 -68
  102. package/{esm2020 → esm2022}/lib/services/migration-plis.service.mjs +27 -27
  103. package/{esm2020 → esm2022}/lib/services/migration-survey-queue.service.mjs +24 -24
  104. package/{esm2020 → esm2022}/lib/services/page.service.mjs +38 -38
  105. package/{esm2020 → esm2022}/lib/services/partner-system.service.mjs +30 -30
  106. package/{esm2020 → esm2022}/lib/services/partner.service.mjs +34 -34
  107. package/{esm2020 → esm2022}/lib/services/pdf-analyzer.service.mjs +33 -33
  108. package/{esm2020 → esm2022}/lib/services/people-master.service.mjs +42 -42
  109. package/{esm2020 → esm2022}/lib/services/permission.service.mjs +29 -29
  110. package/{esm2020 → esm2022}/lib/services/pli-cnf-acuity-fields.service.mjs +34 -34
  111. package/{esm2020 → esm2022}/lib/services/pli-cnf-app-card-filter.service.mjs +40 -40
  112. package/{esm2020 → esm2022}/lib/services/pli-cnf-appointment-type.service.mjs +41 -41
  113. package/{esm2020 → esm2022}/lib/services/pli-cnf-budget-program-type.service.mjs +54 -54
  114. package/{esm2020 → esm2022}/lib/services/pli-cnf-budget.service.mjs +31 -31
  115. package/{esm2020 → esm2022}/lib/services/pli-cnf-cloning.service.mjs +27 -27
  116. package/{esm2020 → esm2022}/lib/services/pli-cnf-committee-pdf-config-table-config.service.mjs +47 -47
  117. package/{esm2020 → esm2022}/lib/services/pli-cnf-committee-pdf-gen-status.service.mjs +30 -30
  118. package/{esm2020 → esm2022}/lib/services/pli-cnf-committee-valpro-columns.service.mjs +42 -42
  119. package/{esm2020 → esm2022}/lib/services/pli-cnf-committee-visualization-mode.service.mjs +42 -42
  120. package/{esm2020 → esm2022}/lib/services/pli-cnf-committee.service.mjs +51 -51
  121. package/{esm2020 → esm2022}/lib/services/pli-cnf-config-minisite.service.mjs +90 -90
  122. package/{esm2020 → esm2022}/lib/services/pli-cnf-configuration-credit-study.service.mjs +41 -41
  123. package/{esm2020 → esm2022}/lib/services/pli-cnf-document-management.service.mjs +40 -40
  124. package/{esm2020 → esm2022}/lib/services/pli-cnf-dynamic-keys-assign.service.mjs +52 -52
  125. package/{esm2020 → esm2022}/lib/services/pli-cnf-evaluation-task-mailing.service.mjs +31 -31
  126. package/esm2022/lib/services/pli-cnf-evaluation-task.service.mjs +112 -0
  127. package/{esm2020 → esm2022}/lib/services/pli-cnf-evaluation-template.service.mjs +95 -95
  128. package/{esm2020 → esm2022}/lib/services/pli-cnf-form-edit.service.mjs +68 -68
  129. package/{esm2020 → esm2022}/lib/services/pli-cnf-form-multiaplicacion.service.mjs +46 -46
  130. package/{esm2020 → esm2022}/lib/services/pli-cnf-guarantee-documents-template.service.mjs +40 -40
  131. package/{esm2020 → esm2022}/lib/services/pli-cnf-guarantee-token.service.mjs +42 -42
  132. package/{esm2020 → esm2022}/lib/services/pli-cnf-header.service.mjs +39 -39
  133. package/{esm2020 → esm2022}/lib/services/pli-cnf-indicator.service.mjs +39 -39
  134. package/{esm2020 → esm2022}/lib/services/pli-cnf-information-system.service.mjs +24 -24
  135. package/{esm2020 → esm2022}/lib/services/pli-cnf-interaction.service.mjs +78 -78
  136. package/{esm2020 → esm2022}/lib/services/pli-cnf-letter-template-type.service.mjs +29 -29
  137. package/{esm2020 → esm2022}/lib/services/pli-cnf-letter-template.service.mjs +48 -48
  138. package/{esm2020 → esm2022}/lib/services/pli-cnf-look-and-feel.service.mjs +28 -28
  139. package/{esm2020 → esm2022}/lib/services/pli-cnf-mail.service.mjs +30 -30
  140. package/{esm2020 → esm2022}/lib/services/pli-cnf-menu-form.service.mjs +34 -34
  141. package/{esm2020 → esm2022}/lib/services/pli-cnf-migration-plis-field-budget.service.mjs +33 -33
  142. package/{esm2020 → esm2022}/lib/services/pli-cnf-migration-plis-field.service.mjs +47 -47
  143. package/{esm2020 → esm2022}/lib/services/pli-cnf-migration-status-plis.service.mjs +44 -44
  144. package/{esm2020 → esm2022}/lib/services/pli-cnf-page-section-form.service.mjs +66 -66
  145. package/{esm2020 → esm2022}/lib/services/pli-cnf-page-sub-process.service.mjs +25 -25
  146. package/{esm2020 → esm2022}/lib/services/pli-cnf-pdfs.service.mjs +31 -31
  147. package/{esm2020 → esm2022}/lib/services/pli-cnf-profile-form.service.mjs +40 -40
  148. package/{esm2020 → esm2022}/lib/services/pli-cnf-profile-user.service.mjs +49 -49
  149. package/{esm2020 → esm2022}/lib/services/pli-cnf-project-summary.service.mjs +39 -39
  150. package/{esm2020 → esm2022}/lib/services/pli-cnf-scenario.service.mjs +47 -47
  151. package/{esm2020 → esm2022}/lib/services/pli-cnf-segmentation.service.mjs +72 -72
  152. package/{esm2020 → esm2022}/lib/services/pli-cnf-snapshot-token.service.mjs +42 -42
  153. package/{esm2020 → esm2022}/lib/services/pli-cnf-status-flow-interaction.service.mjs +74 -74
  154. package/{esm2020 → esm2022}/lib/services/pli-cnf-status-flow.service.mjs +56 -56
  155. package/{esm2020 → esm2022}/lib/services/pli-cnf-support-document-category.service.mjs +47 -47
  156. package/{esm2020 → esm2022}/lib/services/pli-cnf-support-document.service.mjs +56 -56
  157. package/{esm2020 → esm2022}/lib/services/pli-cnf-survey-document.service.mjs +37 -37
  158. package/{esm2020 → esm2022}/lib/services/pli-cnf-survey-pdf.service.mjs +34 -34
  159. package/{esm2020 → esm2022}/lib/services/pli-cnf-survey.service.mjs +46 -46
  160. package/{esm2020 → esm2022}/lib/services/pli-cnf-task-group.service.mjs +33 -33
  161. package/{esm2020 → esm2022}/lib/services/pli-cnf-text-category.service.mjs +38 -38
  162. package/{esm2020 → esm2022}/lib/services/pli-cnf-text-option.service.mjs +39 -39
  163. package/{esm2020 → esm2022}/lib/services/pli-cnf-text.service.mjs +62 -62
  164. package/{esm2020 → esm2022}/lib/services/pli-cnf-type-text.service.mjs +45 -45
  165. package/{esm2020 → esm2022}/lib/services/pli-cnf-university-article.service.mjs +39 -39
  166. package/{esm2020 → esm2022}/lib/services/pli-cnf-user-calendar.service.mjs +36 -36
  167. package/{esm2020 → esm2022}/lib/services/pli-cnf-user-workspace.service.mjs +35 -35
  168. package/{esm2020 → esm2022}/lib/services/pli-cnf-valpro-keys.service.mjs +35 -35
  169. package/{esm2020 → esm2022}/lib/services/pli-cnf-workspace-segmentation.service.mjs +31 -31
  170. package/{esm2020 → esm2022}/lib/services/pli-message-type.service.mjs +40 -40
  171. package/{esm2020 → esm2022}/lib/services/pli-multiple-value-filter.service.mjs +39 -39
  172. package/{esm2020 → esm2022}/lib/services/pli-promocion-username.service.mjs +57 -57
  173. package/{esm2020 → esm2022}/lib/services/pli-seg-action-user.service.mjs +37 -37
  174. package/{esm2020 → esm2022}/lib/services/pli-segmentation.service.mjs +130 -130
  175. package/{esm2020 → esm2022}/lib/services/pli-tag-assignment.service.mjs +36 -36
  176. package/{esm2020 → esm2022}/lib/services/pli-tag.service.mjs +55 -55
  177. package/{esm2020 → esm2022}/lib/services/pli-user.service.mjs +51 -51
  178. package/{esm2020 → esm2022}/lib/services/plis-beneficiario.service.mjs +29 -29
  179. package/{esm2020 → esm2022}/lib/services/plis-estatus-change.service.mjs +30 -30
  180. package/esm2022/lib/services/ppp.service.mjs +360 -0
  181. package/{esm2020 → esm2022}/lib/services/profile.service.mjs +60 -60
  182. package/esm2022/lib/services/progress-bar.service.mjs +40 -0
  183. package/{esm2020 → esm2022}/lib/services/promotion-score.service.mjs +44 -44
  184. package/{esm2020 → esm2022}/lib/services/registry-identifier.service.mjs +39 -39
  185. package/{esm2020 → esm2022}/lib/services/return-refund.service.mjs +53 -53
  186. package/esm2022/lib/services/segmentation-tokens.service.mjs +43 -0
  187. package/{esm2020 → esm2022}/lib/services/segmentation-user-service.service.mjs +90 -90
  188. package/{esm2020 → esm2022}/lib/services/segmentation.service.mjs +31 -31
  189. package/esm2022/lib/services/send-application.service.mjs +492 -0
  190. package/{esm2020 → esm2022}/lib/services/sesion-form.service.mjs +31 -31
  191. package/{esm2020 → esm2022}/lib/services/sesion.service.mjs +48 -48
  192. package/{esm2020 → esm2022}/lib/services/spinner.service.mjs +16 -16
  193. package/{esm2020 → esm2022}/lib/services/sponsorship-letter.service.mjs +68 -68
  194. package/{esm2020 → esm2022}/lib/services/status.service.mjs +100 -100
  195. package/{esm2020 → esm2022}/lib/services/summary-budget.service.mjs +24 -24
  196. package/{esm2020 → esm2022}/lib/services/survey-metadata.service.mjs +28 -28
  197. package/{esm2020 → esm2022}/lib/services/survey-queue.service.mjs +24 -24
  198. package/{esm2020 → esm2022}/lib/services/survey.service.mjs +52 -52
  199. package/{esm2020 → esm2022}/lib/services/tasa.cambio.service.mjs +35 -35
  200. package/{esm2020 → esm2022}/lib/services/token-transformation.service.mjs +62 -62
  201. package/esm2022/lib/services/token.service.mjs +1345 -0
  202. package/{esm2020 → esm2022}/lib/services/university.service.mjs +50 -50
  203. package/esm2022/lib/services/upload-documents.service.mjs +60 -0
  204. package/{esm2020 → esm2022}/lib/services/user.service.mjs +28 -28
  205. package/{esm2020 → esm2022}/lib/services/visualization-committee.service.mjs +84 -84
  206. package/esm2022/lib/utils/custom-validator.mjs +95 -0
  207. package/esm2022/lib/utils/form-util.mjs +35 -0
  208. package/esm2022/lib/utils/formio-util.mjs +582 -0
  209. package/{esm2020 → esm2022}/lib/utils/version-commons.mjs +9 -9
  210. package/{esm2020 → esm2022}/ng-pli-commons.mjs +4 -4
  211. package/{esm2020 → esm2022}/public-api.mjs +214 -214
  212. package/{esm2020 → esm2022}/version.mjs +29 -29
  213. package/{fesm2020 → fesm2022}/ng-pli-commons.mjs +16724 -16725
  214. package/fesm2022/ng-pli-commons.mjs.map +1 -0
  215. package/{ng-pli-commons.d.ts → index.d.ts} +5 -5
  216. package/lib/components/backoffice.commons.component.d.ts +15 -15
  217. package/lib/components/common.lists.component.d.ts +61 -61
  218. package/lib/components/configuration-token/configuration-token-subject.service.d.ts +10 -10
  219. package/lib/components/configuration-token/configuration-token.component.d.ts +124 -124
  220. package/lib/components/configuration-token/guarantee-token/guarantee-token.component.d.ts +33 -33
  221. package/lib/components/configuration-token/snapshot-token/snapshot-token.component.d.ts +37 -37
  222. package/lib/components/configuration.commons.component.d.ts +15 -15
  223. package/lib/components/dashboard.commons.component.d.ts +39 -39
  224. package/lib/components/dynamic-filter/dynamic-filter.component.d.ts +50 -50
  225. package/lib/components/excel-to-json/excel-to-json.component.d.ts +12 -12
  226. package/lib/components/frontoffice.commons.component.d.ts +26 -26
  227. package/lib/components/pdf-analyzer/pdf-analyzer.component.d.ts +36 -36
  228. package/lib/components/pdf-config/pdf-config.component.d.ts +78 -78
  229. package/lib/components/pdf-generator/pdf-generator.component.d.ts +69 -69
  230. package/lib/components/pdf-merge-visualizer/pdf-merge-visualizer.component.d.ts +114 -114
  231. package/lib/components/pdf-visualizer/pdf-visualizer.component.d.ts +147 -147
  232. package/lib/components/progress-bar/progress-bar.component.d.ts +30 -30
  233. package/lib/components/segmentation-tokens/segmentation-tokens.component.d.ts +48 -48
  234. package/lib/components/select-ppp/select-ppp.component.d.ts +42 -42
  235. package/lib/components/show-hide-columns/show-hide-columns-table.component.d.ts +39 -39
  236. package/lib/components/token/token.component.d.ts +99 -99
  237. package/lib/components/tokens-calculator/tokens-calculator.component.d.ts +37 -37
  238. package/lib/directives/currency-colfuturo-formatter.directive.d.ts +14 -14
  239. package/lib/directives/currency-decimal-colfuturo-formatter.directive.d.ts +13 -13
  240. package/lib/ng-pli-commons.module.d.ts +47 -47
  241. package/lib/ng-pli-commons.service.d.ts +6 -6
  242. package/lib/pipes/currency-colfuturo.pipe.d.ts +12 -12
  243. package/lib/pipes/currency-decimal-colfuturo.pipe.d.ts +11 -11
  244. package/lib/pipes/currency-print-colfuturo.pipe.d.ts +11 -11
  245. package/lib/pipes/thousands.pipe.d.ts +9 -9
  246. package/lib/services/application-fill-percentage.service.d.ts +15 -15
  247. package/lib/services/application-tag.service.d.ts +23 -23
  248. package/lib/services/application.service.d.ts +107 -107
  249. package/lib/services/authentication.service.d.ts +45 -45
  250. package/lib/services/blocked-beneficiary.service.d.ts +17 -17
  251. package/lib/services/budget-application.service.d.ts +52 -52
  252. package/lib/services/budget-simulation.service.d.ts +32 -32
  253. package/lib/services/budget.service.d.ts +65 -65
  254. package/lib/services/closure-wallet.service.d.ts +16 -16
  255. package/lib/services/cnf-correspondence-document-manager.service.d.ts +14 -14
  256. package/lib/services/committee-money.service.d.ts +12 -12
  257. package/lib/services/committee-pdf.service.d.ts +13 -13
  258. package/lib/services/committee-snapshot.service.d.ts +24 -24
  259. package/lib/services/common-info.service.d.ts +30 -30
  260. package/lib/services/common.service.d.ts +103 -103
  261. package/lib/services/configuration-document.service.d.ts +84 -84
  262. package/lib/services/configuration-minisite.service.d.ts +13 -13
  263. package/lib/services/configuration.service.d.ts +15 -15
  264. package/lib/services/correspondence-document-category.service.d.ts +12 -12
  265. package/lib/services/correspondence-manager.service.d.ts +21 -21
  266. package/lib/services/credit-score.service.d.ts +14 -14
  267. package/lib/services/credit-study.service.d.ts +52 -52
  268. package/lib/services/cube.service.d.ts +14 -14
  269. package/lib/services/data-form-history.service.d.ts +13 -13
  270. package/lib/services/data-form.service.d.ts +82 -82
  271. package/lib/services/data-letter-segmentation.service.d.ts +20 -20
  272. package/lib/services/document-analysis-auto.service.d.ts +14 -14
  273. package/lib/services/document-history.service.d.ts +18 -18
  274. package/lib/services/document-management.service.d.ts +22 -22
  275. package/lib/services/document-validation-attempt.service.d.ts +13 -13
  276. package/lib/services/document.service.d.ts +51 -51
  277. package/lib/services/documentary.type.service.d.ts +23 -23
  278. package/lib/services/email.service.d.ts +15 -15
  279. package/lib/services/evaluation.service.d.ts +58 -58
  280. package/lib/services/export-excel.service.d.ts +8 -8
  281. package/lib/services/file.service.d.ts +63 -63
  282. package/lib/services/form.service.d.ts +39 -39
  283. package/lib/services/gic-client-disbursement-metadata.service.d.ts +12 -12
  284. package/lib/services/gic-client.service.d.ts +20 -20
  285. package/lib/services/gic-cnf-bankvision-transaction.service.d.ts +13 -13
  286. package/lib/services/gic-cnf-closing-date.service.d.ts +15 -15
  287. package/lib/services/gic-cnf-maintenance.service.d.ts +13 -13
  288. package/lib/services/gic-collection.service.d.ts +19 -19
  289. package/lib/services/gic-disbursement.service.d.ts +16 -16
  290. package/lib/services/gic-extract.service.d.ts +15 -15
  291. package/lib/services/gic-log.service.d.ts +17 -17
  292. package/lib/services/gic-payment-application.service.d.ts +15 -15
  293. package/lib/services/gic-payment-plan-cube.service.d.ts +13 -13
  294. package/lib/services/gic-payment-plan.service.d.ts +19 -19
  295. package/lib/services/gic-trm.service.d.ts +14 -14
  296. package/lib/services/global.show.task.service.d.ts +20 -20
  297. package/lib/services/guarantee-document.service.d.ts +17 -17
  298. package/lib/services/guarantee-enrollment.service.d.ts +14 -14
  299. package/lib/services/guarantee.service.d.ts +34 -34
  300. package/lib/services/hash.service.d.ts +18 -18
  301. package/lib/services/import-data.service.d.ts +14 -14
  302. package/lib/services/import-excel-gic.service.d.ts +22 -22
  303. package/lib/services/initial-configuration-gic-parameters.service.d.ts +19 -19
  304. package/lib/services/initial-record.service.d.ts +24 -24
  305. package/lib/services/integration-ado.service.d.ts +15 -15
  306. package/lib/services/interaction-application-user.service.d.ts +28 -28
  307. package/lib/services/interest-adjustment.service.d.ts +16 -16
  308. package/lib/services/keys-assignation.service.d.ts +33 -33
  309. package/lib/services/legalization.service.d.ts +46 -46
  310. package/lib/services/letter-campaing.service.d.ts +24 -24
  311. package/lib/services/letter-task-mapping.service.d.ts +22 -22
  312. package/lib/services/log.service.d.ts +17 -17
  313. package/lib/services/maintenance.service.d.ts +23 -23
  314. package/lib/services/master-category.service.d.ts +40 -40
  315. package/lib/services/master-program.service.d.ts +45 -45
  316. package/lib/services/master-university.service.d.ts +40 -40
  317. package/lib/services/migration-plis.service.d.ts +14 -14
  318. package/lib/services/migration-survey-queue.service.d.ts +12 -12
  319. package/lib/services/page.service.d.ts +18 -18
  320. package/lib/services/partner-system.service.d.ts +13 -13
  321. package/lib/services/partner.service.d.ts +17 -17
  322. package/lib/services/pdf-analyzer.service.d.ts +11 -11
  323. package/lib/services/people-master.service.d.ts +14 -14
  324. package/lib/services/permission.service.d.ts +14 -14
  325. package/lib/services/pli-cnf-acuity-fields.service.d.ts +14 -14
  326. package/lib/services/pli-cnf-app-card-filter.service.d.ts +20 -20
  327. package/lib/services/pli-cnf-appointment-type.service.d.ts +16 -16
  328. package/lib/services/pli-cnf-budget-program-type.service.d.ts +18 -18
  329. package/lib/services/pli-cnf-budget.service.d.ts +13 -13
  330. package/lib/services/pli-cnf-cloning.service.d.ts +12 -12
  331. package/lib/services/pli-cnf-committee-pdf-config-table-config.service.d.ts +19 -19
  332. package/lib/services/pli-cnf-committee-pdf-gen-status.service.d.ts +13 -13
  333. package/lib/services/pli-cnf-committee-valpro-columns.service.d.ts +15 -15
  334. package/lib/services/pli-cnf-committee-visualization-mode.service.d.ts +17 -17
  335. package/lib/services/pli-cnf-committee.service.d.ts +21 -21
  336. package/lib/services/pli-cnf-config-minisite.service.d.ts +26 -26
  337. package/lib/services/pli-cnf-configuration-credit-study.service.d.ts +16 -16
  338. package/lib/services/pli-cnf-document-management.service.d.ts +15 -15
  339. package/lib/services/pli-cnf-dynamic-keys-assign.service.d.ts +21 -21
  340. package/lib/services/pli-cnf-evaluation-task-mailing.service.d.ts +13 -13
  341. package/lib/services/pli-cnf-evaluation-task.service.d.ts +35 -35
  342. package/lib/services/pli-cnf-evaluation-template.service.d.ts +44 -44
  343. package/lib/services/pli-cnf-form-edit.service.d.ts +29 -29
  344. package/lib/services/pli-cnf-form-multiaplicacion.service.d.ts +21 -21
  345. package/lib/services/pli-cnf-guarantee-documents-template.service.d.ts +17 -17
  346. package/lib/services/pli-cnf-guarantee-token.service.d.ts +16 -16
  347. package/lib/services/pli-cnf-header.service.d.ts +18 -18
  348. package/lib/services/pli-cnf-indicator.service.d.ts +20 -20
  349. package/lib/services/pli-cnf-information-system.service.d.ts +12 -12
  350. package/lib/services/pli-cnf-interaction.service.d.ts +31 -31
  351. package/lib/services/pli-cnf-letter-template-type.service.d.ts +15 -15
  352. package/lib/services/pli-cnf-letter-template.service.d.ts +22 -22
  353. package/lib/services/pli-cnf-look-and-feel.service.d.ts +13 -13
  354. package/lib/services/pli-cnf-mail.service.d.ts +13 -13
  355. package/lib/services/pli-cnf-menu-form.service.d.ts +16 -16
  356. package/lib/services/pli-cnf-migration-plis-field-budget.service.d.ts +14 -14
  357. package/lib/services/pli-cnf-migration-plis-field.service.d.ts +17 -17
  358. package/lib/services/pli-cnf-migration-status-plis.service.d.ts +17 -17
  359. package/lib/services/pli-cnf-page-section-form.service.d.ts +24 -24
  360. package/lib/services/pli-cnf-page-sub-process.service.d.ts +12 -12
  361. package/lib/services/pli-cnf-pdfs.service.d.ts +14 -14
  362. package/lib/services/pli-cnf-profile-form.service.d.ts +20 -20
  363. package/lib/services/pli-cnf-profile-user.service.d.ts +24 -24
  364. package/lib/services/pli-cnf-project-summary.service.d.ts +16 -16
  365. package/lib/services/pli-cnf-scenario.service.d.ts +23 -23
  366. package/lib/services/pli-cnf-segmentation.service.d.ts +32 -32
  367. package/lib/services/pli-cnf-snapshot-token.service.d.ts +16 -16
  368. package/lib/services/pli-cnf-status-flow-interaction.service.d.ts +28 -28
  369. package/lib/services/pli-cnf-status-flow.service.d.ts +26 -26
  370. package/lib/services/pli-cnf-support-document-category.service.d.ts +17 -17
  371. package/lib/services/pli-cnf-support-document.service.d.ts +23 -23
  372. package/lib/services/pli-cnf-survey-document.service.d.ts +16 -16
  373. package/lib/services/pli-cnf-survey-pdf.service.d.ts +15 -15
  374. package/lib/services/pli-cnf-survey.service.d.ts +19 -19
  375. package/lib/services/pli-cnf-task-group.service.d.ts +15 -15
  376. package/lib/services/pli-cnf-text-category.service.d.ts +15 -15
  377. package/lib/services/pli-cnf-text-option.service.d.ts +15 -15
  378. package/lib/services/pli-cnf-text.service.d.ts +21 -21
  379. package/lib/services/pli-cnf-type-text.service.d.ts +16 -16
  380. package/lib/services/pli-cnf-university-article.service.d.ts +20 -20
  381. package/lib/services/pli-cnf-user-calendar.service.d.ts +16 -16
  382. package/lib/services/pli-cnf-user-workspace.service.d.ts +18 -18
  383. package/lib/services/pli-cnf-valpro-keys.service.d.ts +18 -18
  384. package/lib/services/pli-cnf-workspace-segmentation.service.d.ts +16 -16
  385. package/lib/services/pli-message-type.service.d.ts +15 -15
  386. package/lib/services/pli-multiple-value-filter.service.d.ts +17 -17
  387. package/lib/services/pli-promocion-username.service.d.ts +26 -26
  388. package/lib/services/pli-seg-action-user.service.d.ts +20 -20
  389. package/lib/services/pli-segmentation.service.d.ts +48 -48
  390. package/lib/services/pli-tag-assignment.service.d.ts +15 -15
  391. package/lib/services/pli-tag.service.d.ts +21 -21
  392. package/lib/services/pli-user.service.d.ts +24 -24
  393. package/lib/services/plis-beneficiario.service.d.ts +10 -10
  394. package/lib/services/plis-estatus-change.service.d.ts +13 -13
  395. package/lib/services/ppp.service.d.ts +77 -77
  396. package/lib/services/profile.service.d.ts +26 -26
  397. package/lib/services/progress-bar.service.d.ts +14 -14
  398. package/lib/services/promotion-score.service.d.ts +14 -14
  399. package/lib/services/registry-identifier.service.d.ts +16 -16
  400. package/lib/services/return-refund.service.d.ts +20 -20
  401. package/lib/services/segmentation-tokens.service.d.ts +22 -22
  402. package/lib/services/segmentation-user-service.service.d.ts +26 -26
  403. package/lib/services/segmentation.service.d.ts +16 -16
  404. package/lib/services/send-application.service.d.ts +71 -71
  405. package/lib/services/sesion-form.service.d.ts +16 -16
  406. package/lib/services/sesion.service.d.ts +27 -27
  407. package/lib/services/spinner.service.d.ts +6 -6
  408. package/lib/services/sponsorship-letter.service.d.ts +34 -34
  409. package/lib/services/status.service.d.ts +31 -31
  410. package/lib/services/summary-budget.service.d.ts +11 -11
  411. package/lib/services/survey-metadata.service.d.ts +13 -13
  412. package/lib/services/survey-queue.service.d.ts +12 -12
  413. package/lib/services/survey.service.d.ts +17 -17
  414. package/lib/services/tasa.cambio.service.d.ts +14 -14
  415. package/lib/services/token-transformation.service.d.ts +19 -19
  416. package/lib/services/token.service.d.ts +270 -270
  417. package/lib/services/university.service.d.ts +28 -28
  418. package/lib/services/upload-documents.service.d.ts +21 -21
  419. package/lib/services/user.service.d.ts +12 -12
  420. package/lib/services/visualization-committee.service.d.ts +32 -32
  421. package/lib/utils/custom-validator.d.ts +19 -19
  422. package/lib/utils/form-util.d.ts +11 -11
  423. package/lib/utils/formio-util.d.ts +105 -105
  424. package/lib/utils/version-commons.d.ts +4 -4
  425. package/package.json +10 -16
  426. package/public-api.d.ts +210 -210
  427. package/version.d.ts +25 -25
  428. package/esm2020/lib/components/backoffice.commons.component.mjs +0 -40
  429. package/esm2020/lib/components/common.lists.component.mjs +0 -194
  430. package/esm2020/lib/components/configuration-token/configuration-token.component.mjs +0 -665
  431. package/esm2020/lib/components/configuration-token/guarantee-token/guarantee-token.component.mjs +0 -103
  432. package/esm2020/lib/components/configuration-token/snapshot-token/snapshot-token.component.mjs +0 -108
  433. package/esm2020/lib/components/configuration.commons.component.mjs +0 -40
  434. package/esm2020/lib/components/dynamic-filter/dynamic-filter.component.mjs +0 -131
  435. package/esm2020/lib/components/excel-to-json/excel-to-json.component.mjs +0 -54
  436. package/esm2020/lib/components/frontoffice.commons.component.mjs +0 -86
  437. package/esm2020/lib/components/pdf-analyzer/pdf-analyzer.component.mjs +0 -162
  438. package/esm2020/lib/components/pdf-generator/pdf-generator.component.mjs +0 -223
  439. package/esm2020/lib/components/pdf-merge-visualizer/pdf-merge-visualizer.component.mjs +0 -307
  440. package/esm2020/lib/components/pdf-visualizer/pdf-visualizer.component.mjs +0 -387
  441. package/esm2020/lib/components/progress-bar/progress-bar.component.mjs +0 -92
  442. package/esm2020/lib/components/segmentation-tokens/segmentation-tokens.component.mjs +0 -199
  443. package/esm2020/lib/components/select-ppp/select-ppp.component.mjs +0 -199
  444. package/esm2020/lib/components/show-hide-columns/show-hide-columns-table.component.mjs +0 -116
  445. package/esm2020/lib/components/token/token.component.mjs +0 -1006
  446. package/esm2020/lib/components/tokens-calculator/tokens-calculator.component.mjs +0 -128
  447. package/esm2020/lib/ng-pli-commons.module.mjs +0 -390
  448. package/esm2020/lib/pipes/currency-colfuturo.pipe.mjs +0 -35
  449. package/esm2020/lib/pipes/thousands.pipe.mjs +0 -60
  450. package/esm2020/lib/services/authentication.service.mjs +0 -133
  451. package/esm2020/lib/services/budget-application.service.mjs +0 -265
  452. package/esm2020/lib/services/budget.service.mjs +0 -205
  453. package/esm2020/lib/services/common.service.mjs +0 -291
  454. package/esm2020/lib/services/configuration-document.service.mjs +0 -297
  455. package/esm2020/lib/services/documentary.type.service.mjs +0 -69
  456. package/esm2020/lib/services/file.service.mjs +0 -153
  457. package/esm2020/lib/services/guarantee.service.mjs +0 -128
  458. package/esm2020/lib/services/keys-assignation.service.mjs +0 -127
  459. package/esm2020/lib/services/pli-cnf-evaluation-task.service.mjs +0 -112
  460. package/esm2020/lib/services/ppp.service.mjs +0 -360
  461. package/esm2020/lib/services/progress-bar.service.mjs +0 -40
  462. package/esm2020/lib/services/segmentation-tokens.service.mjs +0 -43
  463. package/esm2020/lib/services/send-application.service.mjs +0 -492
  464. package/esm2020/lib/services/token.service.mjs +0 -1345
  465. package/esm2020/lib/services/upload-documents.service.mjs +0 -60
  466. package/esm2020/lib/utils/custom-validator.mjs +0 -95
  467. package/esm2020/lib/utils/form-util.mjs +0 -35
  468. package/esm2020/lib/utils/formio-util.mjs +0 -580
  469. package/fesm2015/ng-pli-commons.mjs +0 -17373
  470. package/fesm2015/ng-pli-commons.mjs.map +0 -1
  471. package/fesm2020/ng-pli-commons.mjs.map +0 -1
@@ -1,580 +0,0 @@
1
- // import * as utils_ from 'formiojs-proyectoscolfuturo/utils/utils';
2
- import * as utils_ from 'formiojs-colfuturo/utils/utils';
3
- import { TokenService } from '../services/token.service';
4
- import { EFormioKey } from 'ng-pli-util';
5
- const utils = utils_;
6
- export class FormioUtil {
7
- /**
8
- * It returns the components formated by panel
9
- * @param components
10
- * @return the object is [{panel: , items: [{ value: , label: }]}]
11
- */
12
- static getFormattedComponentsByPanel(components) {
13
- let result = [];
14
- if (components) {
15
- let group = null;
16
- let object = null;
17
- for (const component of components) {
18
- if (component[EFormioKey.TITLE_PANEL] !== group) {
19
- if (group !== null) {
20
- result.push(object);
21
- }
22
- object = { label: component[EFormioKey.TITLE_PANEL], items: [], toggle: false };
23
- group = component[EFormioKey.TITLE_PANEL];
24
- }
25
- object.items.push({
26
- label: component[EFormioKey.LABEL],
27
- value: component[EFormioKey.KEY]
28
- });
29
- }
30
- if (group !== null)
31
- result.push(object);
32
- }
33
- return result;
34
- }
35
- static getSelectBoxes(selectBoxe) {
36
- var istrue = false;
37
- if (selectBoxe != undefined && selectBoxe != null && typeof selectBoxe === 'object') {
38
- let dataHasTrue = Object.values(selectBoxe);
39
- dataHasTrue.forEach(function (value) {
40
- if (typeof value === 'boolean' && value) {
41
- istrue = value;
42
- return value;
43
- }
44
- });
45
- }
46
- // Expected output: Array ["somestring", 42, false]
47
- return istrue;
48
- }
49
- /**
50
- * It returns the components are required according with data
51
- * @param components array of components
52
- * @param data
53
- */
54
- static getRequiredComponentsByData(components, data) {
55
- // get the required components
56
- let array = FormioUtil.getRequiredComponents(components);
57
- // if not data then return components
58
- if (data && array) {
59
- for (let i = 0; i < array.length; i++) {
60
- const component = array[i];
61
- // use formio to check condition according with data
62
- if (utils.checkCondition(component, null, data, null, null)) {
63
- const key = component[EFormioKey.KEY];
64
- if (Array.isArray(data[key]) && data[key].length > 0) {
65
- // remove item from array
66
- array.splice(i, 1);
67
- i--;
68
- }
69
- else if (typeof data[key] === 'object' &&
70
- !Object.prototype.hasOwnProperty.call(data[key], 'formatted_address') &&
71
- !Object.prototype.hasOwnProperty.call(data[key], 'callingCodes') &&
72
- !Object.prototype.hasOwnProperty.call(data[key], 'nativeName') &&
73
- !Object.prototype.hasOwnProperty.call(data[key], 'original_name') &&
74
- (!Object.prototype.hasOwnProperty.call(data[key], 'fullName') || !Object.prototype.hasOwnProperty.call(data[key], 'fullname')) &&
75
- FormioUtil.getSelectBoxes(data[key])) {
76
- // remove item from array
77
- array.splice(i, 1);
78
- i--;
79
- }
80
- else if (typeof data[key] === 'object' &&
81
- !Object.prototype.hasOwnProperty.call(data[key], 'formatted_address') &&
82
- !Object.prototype.hasOwnProperty.call(data[key], 'callingCodes') &&
83
- !Object.prototype.hasOwnProperty.call(data[key], 'nativeName') &&
84
- !Object.prototype.hasOwnProperty.call(data[key], 'original_name') &&
85
- (!Object.prototype.hasOwnProperty.call(data[key], 'fullName') || !Object.prototype.hasOwnProperty.call(data[key], 'fullname')) &&
86
- !FormioUtil.getSelectBoxes(data[key])) {
87
- }
88
- else if (data[key] != undefined && data[key] != null && data[key] != '') {
89
- // remove item from array
90
- array.splice(i, 1);
91
- i--;
92
- }
93
- else {
94
- if (component.customConditional &&
95
- component.customConditional.includes('show')) {
96
- // remove item from array
97
- array.splice(i, 1);
98
- i--;
99
- }
100
- }
101
- }
102
- else {
103
- // remove item from array
104
- array.splice(i, 1);
105
- i--;
106
- }
107
- }
108
- }
109
- return array;
110
- }
111
- /**
112
- * It returns the components that are required
113
- * @param components array of components
114
- */
115
- static getUniqueComponents(components) {
116
- return FormioUtil.getComponentsByFeature(components, [EFormioKey.UNIQUE], true);
117
- }
118
- /**
119
- * It returns the components that are required
120
- * @param components array of components
121
- */
122
- static getRequiredComponents(components) {
123
- return FormioUtil.getComponentsByFeature(components, [EFormioKey.VALIDATE, EFormioKey.REQUIRED], true);
124
- }
125
- /**
126
- * It returns the components that have a specific feature defined by properties and value
127
- * @param components array of components
128
- * @param properties path of properties example [validate, required] or [unique]
129
- * @param value the value that should have the property
130
- */
131
- static getComponentsByFeature(components, properties, value) {
132
- let result = [];
133
- if (properties && properties.length > 0) {
134
- // get components
135
- const fields = FormioUtil.getComponents(components);
136
- // get first and last property
137
- const firstProperty = properties[0];
138
- const lastProperty = properties[properties.length - 1];
139
- if (fields) {
140
- // iterate the fields
141
- for (let i = 0; i < fields.length; i++) {
142
- // it contains the entire object field
143
- const field = fields[i];
144
- // it contains the current component and it is gonna be the component of every property
145
- let component = field;
146
- if (field[firstProperty]) {
147
- for (let j = 0; j < properties.length; j++) {
148
- const property = properties[j];
149
- // if component.property doesnt exist then break
150
- if (!component[property])
151
- break;
152
- if (property === lastProperty) {
153
- // it is the last property so if the value is equals to component.lastproperty then it is added to result
154
- if (component[property] == value)
155
- result.push(field);
156
- }
157
- else {
158
- // otherwise component will be equal to the component.property
159
- component = component[property];
160
- }
161
- }
162
- }
163
- }
164
- }
165
- }
166
- return result;
167
- }
168
- /**
169
- * It returns the components
170
- * @param components
171
- */
172
- static getComponents(components) {
173
- return FormioUtil.getComponentsByRecursion(components, '', null);
174
- }
175
- /**
176
- * It returns the components array of the form by recursion
177
- * @param components array of components
178
- * @param titlePanel name of parent panel, so children components will inherit the panelName
179
- * @param conditionalObject conditional object it will be inherited from panel {conditional: { eq: , value: , when: , json: }, customConditional: }
180
- */
181
- static getComponentsByRecursion(components, titlePanel, conditionalParent) {
182
- // it contains the result array
183
- let result = [];
184
- if (components) {
185
- // iterate over components
186
- for (const component of components) {
187
- // avoid the editgrid component ot if it has a different behavior it should have an else statement
188
- if (component[EFormioKey.TYPE] !== EFormioKey.EDITGRID) {
189
- // if component is panel then titlePanel variable is changed, and it is gonna be inherited
190
- if (component[EFormioKey.TYPE] === EFormioKey.PANEL) {
191
- titlePanel = component[EFormioKey.TITLE];
192
- }
193
- if ((typeof component[EFormioKey.COMPONENTS] !== 'undefined' ||
194
- typeof component[EFormioKey.COLUMNS] !== 'undefined') &&
195
- (typeof component[EFormioKey.TYPE] == 'undefined' ||
196
- component[EFormioKey.TYPE] !== EFormioKey.TYPE_ADDRESS)) {
197
- if (component['type'] !== 'address') {
198
- // resolve conditional parent conditional
199
- const conditional = this.resolveInheritanceConditional(conditionalParent, component[EFormioKey.CONDITIONAL], component[EFormioKey.CUSTOM_CONDITIONAL], component[EFormioKey.ID]);
200
- // change condition
201
- if (conditional)
202
- conditionalParent = conditional;
203
- // it contains the subcomponents depending on the value of component if it has components or columns
204
- let subComponents = typeof component[EFormioKey.COMPONENTS] !== 'undefined'
205
- ? component[EFormioKey.COMPONENTS]
206
- : component[EFormioKey.COLUMNS];
207
- // if component has subComponents, then execute the recursion function to get the recursionnResult
208
- const recursionResult = FormioUtil.getComponentsByRecursion(subComponents, titlePanel, conditionalParent);
209
- // if recursion result then result concats the recursionResult
210
- if (recursionResult)
211
- result = result.concat(recursionResult);
212
- // reset conditional Parent
213
- if (component[EFormioKey.ID] == conditionalParent.id)
214
- conditionalParent = undefined;
215
- }
216
- else {
217
- result.push(component);
218
- }
219
- }
220
- else {
221
- // avoid the component type button
222
- if (component[EFormioKey.TYPE] !== EFormioKey.BUTTON &&
223
- component[EFormioKey.KEY] &&
224
- component[EFormioKey.LABEL]) {
225
- // resolve conditional conditional object
226
- let conditional = this.resolveInheritanceConditional(conditionalParent, component[EFormioKey.CONDITIONAL], component[EFormioKey.CUSTOM_CONDITIONAL], component[EFormioKey.ID]);
227
- if (!conditional)
228
- conditional = conditionalParent;
229
- component[EFormioKey.CONDITIONAL] = conditional[EFormioKey.CONDITIONAL];
230
- component[EFormioKey.CUSTOM_CONDITIONAL] =
231
- conditional[EFormioKey.CUSTOM_CONDITIONAL];
232
- // add namPanel as property
233
- component[EFormioKey.TITLE_PANEL] = titlePanel;
234
- // add component to the result
235
- result.push(component);
236
- }
237
- }
238
- }
239
- else if (component[EFormioKey.TYPE] === EFormioKey.EDITGRID) {
240
- if (component.validate.required) {
241
- result.push(component);
242
- }
243
- }
244
- }
245
- }
246
- return result;
247
- }
248
- /**
249
- * It returns the components
250
- * @param components
251
- * @param keepEditGrids
252
- */
253
- static getComponentsWithEditGrids(components) {
254
- return FormioUtil.getComponentsByRecursionWithEditGrids(components, '', null);
255
- }
256
- /**
257
- * It returns the components array of the form by recursion
258
- * @param components array of components
259
- * @param titlePanel name of parent panel, so children components will inherit the panelName
260
- * @param conditionalObject conditional object it will be inherited from panel {conditional: { eq: , value: , when: , json: }, customConditional: }
261
- */
262
- static getComponentsByRecursionWithEditGrids(components, titlePanel, conditionalParent) {
263
- // it contains the result array
264
- let result = [];
265
- if (components) {
266
- // iterate over components
267
- for (const component of components) {
268
- // avoid the editgrid component ot if it has a different behavior it should have an else statement
269
- // if component is panel then titlePanel variable is changed, and it is gonna be inherited
270
- if (component[EFormioKey.TYPE] === EFormioKey.PANEL) {
271
- titlePanel = component[EFormioKey.TITLE];
272
- }
273
- if ((typeof component[EFormioKey.COMPONENTS] !== 'undefined' ||
274
- typeof component[EFormioKey.COLUMNS] !== 'undefined') &&
275
- (typeof component[EFormioKey.TYPE] == 'undefined' ||
276
- component[EFormioKey.TYPE] !== EFormioKey.TYPE_ADDRESS)) {
277
- // resolve conditional parent conditional
278
- const conditional = this.resolveInheritanceConditional(conditionalParent, component[EFormioKey.CONDITIONAL], component[EFormioKey.CUSTOM_CONDITIONAL], component[EFormioKey.ID]);
279
- // change condition
280
- if (conditional)
281
- conditionalParent = conditional;
282
- // it contains the subcomponents depending on the value of component if it has components or columns
283
- let subComponents = typeof component[EFormioKey.COMPONENTS] !== 'undefined'
284
- ? component[EFormioKey.COMPONENTS]
285
- : component[EFormioKey.COLUMNS];
286
- if (component[EFormioKey.TYPE] === EFormioKey.EDITGRID) {
287
- component[EFormioKey.TITLE_PANEL] = titlePanel;
288
- result.push(component);
289
- }
290
- // if component has subComponents, then execute the recursion function to get the recursionnResult
291
- const recursionResult = FormioUtil.getComponentsByRecursionWithEditGrids(subComponents, titlePanel, conditionalParent);
292
- // if recursion result then result concats the recursionResult
293
- if (recursionResult)
294
- result = result.concat(recursionResult);
295
- // reset conditional Parent
296
- if (component[EFormioKey.ID] == conditionalParent.id)
297
- conditionalParent = undefined;
298
- }
299
- else {
300
- // avoid the component type button
301
- if (component[EFormioKey.TYPE] !== EFormioKey.BUTTON &&
302
- component[EFormioKey.KEY] &&
303
- component[EFormioKey.LABEL]) {
304
- // resolve conditional conditional object
305
- let conditional = this.resolveInheritanceConditional(conditionalParent, component[EFormioKey.CONDITIONAL], component[EFormioKey.CUSTOM_CONDITIONAL], component[EFormioKey.ID]);
306
- if (!conditional)
307
- conditional = conditionalParent;
308
- component[EFormioKey.CONDITIONAL] = conditional[EFormioKey.CONDITIONAL];
309
- component[EFormioKey.CUSTOM_CONDITIONAL] =
310
- conditional[EFormioKey.CUSTOM_CONDITIONAL];
311
- // add namPanel as property
312
- component[EFormioKey.TITLE_PANEL] = titlePanel;
313
- // add component to the result
314
- result.push(component);
315
- }
316
- }
317
- }
318
- }
319
- return result;
320
- }
321
- /**
322
- * It resolve the inheritance conditional
323
- * @param conditionalObject
324
- * @param conditional
325
- * @param customConditional
326
- */
327
- static resolveInheritanceConditional(conditionalObject, conditional, customConditional, parentId) {
328
- // validate if there is a condition with the new fields
329
- if (!conditionalObject ||
330
- customConditional ||
331
- (conditional && conditional[EFormioKey.WHEN] && conditional[EFormioKey.EQ]) ||
332
- (conditional && conditional[EFormioKey.JSON])) {
333
- return { conditional: conditional, customConditional: customConditional, id: parentId };
334
- }
335
- return null;
336
- }
337
- /**
338
- * It returns the edit grid components
339
- * @param components
340
- */
341
- static getEditGridKeyLabels(components) {
342
- return FormioUtil.getEditGridKeyLabelsByRecursion(components, '', null);
343
- }
344
- /**
345
- * It returns the components edit grid array of the form by recursion
346
- * @param components array of components
347
- * @param titlePanel name of parent panel, so children components will inherit the panelName
348
- * @param conditionalObject conditional object it will be inherited from panel {conditional: { eq: , value: , when: , json: }, customConditional: }
349
- */
350
- static getEditGridKeyLabelsByRecursion(components, titlePanel, conditionalParent) {
351
- // it contains the result array
352
- let result = [];
353
- if (components) {
354
- // iterate over components
355
- for (const component of components) {
356
- // if component is panel then titlePanel variable is changed, and it is gonna be inherited
357
- if (component[EFormioKey.TYPE] === EFormioKey.PANEL) {
358
- titlePanel = component[EFormioKey.TITLE];
359
- }
360
- if ((typeof component[EFormioKey.COMPONENTS] !== 'undefined' ||
361
- typeof component[EFormioKey.COLUMNS] !== 'undefined') &&
362
- (typeof component[EFormioKey.TYPE] == 'undefined' ||
363
- component[EFormioKey.TYPE] !== EFormioKey.TYPE_ADDRESS)) {
364
- // resolve conditional parent conditional
365
- const conditional = this.resolveInheritanceConditional(conditionalParent, component[EFormioKey.CONDITIONAL], component[EFormioKey.CUSTOM_CONDITIONAL], component[EFormioKey.ID]);
366
- // change condition
367
- if (conditional)
368
- conditionalParent = conditional;
369
- // it contains the subcomponents depending on the value of component if it has components or columns
370
- let subComponents = typeof component[EFormioKey.COMPONENTS] !== 'undefined'
371
- ? component[EFormioKey.COMPONENTS]
372
- : component[EFormioKey.COLUMNS];
373
- if (component[EFormioKey.TYPE] == EFormioKey.EDITGRID) {
374
- // add namPanel as property
375
- component[EFormioKey.TITLE_PANEL] = titlePanel;
376
- // add component to the result
377
- result.push(component);
378
- }
379
- else {
380
- // if component has subComponents, then execute the recursion function to get the recursionnResult
381
- const recursionResult = FormioUtil.getEditGridKeyLabelsByRecursion(subComponents, titlePanel, conditionalParent);
382
- // if recursion result then result concats the recursionResult
383
- if (recursionResult)
384
- result = result.concat(recursionResult);
385
- // reset conditional Parent
386
- if (component[EFormioKey.ID] == conditionalParent.id)
387
- conditionalParent = undefined;
388
- }
389
- }
390
- else {
391
- }
392
- }
393
- }
394
- return result;
395
- }
396
- /**
397
- * It returns the components
398
- * @param components
399
- * @param keepEditGrids
400
- */
401
- static getComponentsIntoEditGrids(components, editGridName) {
402
- return FormioUtil.getComponentsByRecursionIntoEditGrids(components, '', null, editGridName, false);
403
- }
404
- /**
405
- * It returns the components array of the form by recursion
406
- * @param components array of components
407
- * @param titlePanel name of parent panel, so children components will inherit the panelName
408
- * @param conditionalObject conditional object it will be inherited from panel {conditional: { eq: , value: , when: , json: }, customConditional: }
409
- */
410
- static getComponentsByRecursionIntoEditGrids(components, titlePanel, conditionalParent, editGridName, existEditGrid) {
411
- // it contains the result array
412
- let result = [];
413
- if (components) {
414
- // iterate over components
415
- for (const component of components) {
416
- // avoid the editgrid component ot if it has a different behavior it should have an else statement
417
- // if component is panel then titlePanel variable is changed, and it is gonna be inherited
418
- if (component[EFormioKey.TYPE] === EFormioKey.PANEL) {
419
- titlePanel = component[EFormioKey.TITLE];
420
- }
421
- if ((typeof component[EFormioKey.COMPONENTS] !== 'undefined' ||
422
- typeof component[EFormioKey.COLUMNS] !== 'undefined') &&
423
- (typeof component[EFormioKey.TYPE] == 'undefined' ||
424
- component[EFormioKey.TYPE] !== EFormioKey.TYPE_ADDRESS)) {
425
- // resolve conditional parent conditional
426
- const conditional = this.resolveInheritanceConditional(conditionalParent, component[EFormioKey.CONDITIONAL], component[EFormioKey.CUSTOM_CONDITIONAL], component[EFormioKey.ID]);
427
- // change condition
428
- if (conditional)
429
- conditionalParent = conditional;
430
- // it contains the subcomponents depending on the value of component if it has components or columns
431
- let subComponents = typeof component[EFormioKey.COMPONENTS] !== 'undefined'
432
- ? component[EFormioKey.COMPONENTS]
433
- : component[EFormioKey.COLUMNS];
434
- if (component[EFormioKey.TYPE] === EFormioKey.EDITGRID &&
435
- component['key'] == editGridName) {
436
- existEditGrid = true;
437
- if ((typeof component[EFormioKey.COMPONENTS] !== 'undefined' ||
438
- typeof component[EFormioKey.COLUMNS] !== 'undefined') &&
439
- (typeof component[EFormioKey.TYPE] == 'undefined' ||
440
- component[EFormioKey.TYPE] !== EFormioKey.TYPE_ADDRESS)) {
441
- // resolve conditional parent conditional
442
- const conditional = this.resolveInheritanceConditional(conditionalParent, component[EFormioKey.CONDITIONAL], component[EFormioKey.CUSTOM_CONDITIONAL], component[EFormioKey.ID]);
443
- // change condition
444
- if (conditional)
445
- conditionalParent = conditional;
446
- // it contains the subcomponents depending on the value of component if it has components or columns
447
- let subComponents = typeof component[EFormioKey.COMPONENTS] !== 'undefined'
448
- ? component[EFormioKey.COMPONENTS]
449
- : component[EFormioKey.COLUMNS];
450
- // if component has subComponents, then execute the recursion function to get the recursionnResult
451
- const recursionResult = FormioUtil.getComponentsByRecursionIntoEditGrids(subComponents, titlePanel, conditionalParent, editGridName, existEditGrid);
452
- // if recursion result then result concats the recursionResult
453
- if (recursionResult)
454
- result = result.concat(recursionResult);
455
- // reset conditional Parent
456
- if (component && conditionalParent) {
457
- if (component[EFormioKey.ID] == conditionalParent.id)
458
- conditionalParent = undefined;
459
- }
460
- }
461
- else {
462
- // avoid the component type button
463
- if (component[EFormioKey.TYPE] !== EFormioKey.BUTTON &&
464
- component[EFormioKey.KEY] &&
465
- component[EFormioKey.LABEL] &&
466
- existEditGrid) {
467
- // resolve conditional conditional object
468
- let conditional = this.resolveInheritanceConditional(conditionalParent, component[EFormioKey.CONDITIONAL], component[EFormioKey.CUSTOM_CONDITIONAL], component[EFormioKey.ID]);
469
- if (!conditional)
470
- conditional = conditionalParent;
471
- component[EFormioKey.CONDITIONAL] =
472
- conditional[EFormioKey.CONDITIONAL];
473
- component[EFormioKey.CUSTOM_CONDITIONAL] =
474
- conditional[EFormioKey.CUSTOM_CONDITIONAL];
475
- // add namPanel as property
476
- component[EFormioKey.TITLE_PANEL] = titlePanel;
477
- // add component to the result
478
- result.push(component);
479
- }
480
- }
481
- }
482
- // if component has subComponents, then execute the recursion function to get the recursionnResult
483
- const recursionResult = FormioUtil.getComponentsByRecursionIntoEditGrids(subComponents, titlePanel, conditionalParent, editGridName, existEditGrid);
484
- // if recursion result then result concats the recursionResult
485
- if (recursionResult)
486
- result = result.concat(recursionResult);
487
- // reset conditional Parent
488
- if (component && conditionalParent) {
489
- if (component[EFormioKey.ID] == conditionalParent.id)
490
- conditionalParent = undefined;
491
- }
492
- }
493
- else {
494
- // avoid the component type button
495
- if (component[EFormioKey.TYPE] !== EFormioKey.BUTTON &&
496
- component[EFormioKey.KEY] &&
497
- component[EFormioKey.LABEL] &&
498
- existEditGrid) {
499
- // resolve conditional conditional object
500
- let conditional = this.resolveInheritanceConditional(conditionalParent, component[EFormioKey.CONDITIONAL], component[EFormioKey.CUSTOM_CONDITIONAL], component[EFormioKey.ID]);
501
- if (!conditional)
502
- conditional = conditionalParent;
503
- component[EFormioKey.CONDITIONAL] = conditional[EFormioKey.CONDITIONAL];
504
- component[EFormioKey.CUSTOM_CONDITIONAL] =
505
- conditional[EFormioKey.CUSTOM_CONDITIONAL];
506
- // add namPanel as property
507
- component[EFormioKey.TITLE_PANEL] = titlePanel;
508
- // add component to the result
509
- result.push(component);
510
- }
511
- }
512
- }
513
- }
514
- return result;
515
- }
516
- /**
517
- * Create 2 jason objects of data form by component key and other by component key and title form key
518
- * @param dataForm dataForm model object
519
- * @returns Object of 2 element
520
- */
521
- static createListDataByDataFormList(dataForm, listForm) {
522
- let listData = {};
523
- let listDataByForm = {};
524
- if (dataForm && dataForm.length > 0) {
525
- listData = {};
526
- listDataByForm = {};
527
- let dForm;
528
- for (dForm of dataForm) {
529
- if (!dForm.data) {
530
- continue;
531
- }
532
- const form = listForm.find(function (formTmp) {
533
- return formTmp.id == dForm.formId;
534
- });
535
- if (!form) {
536
- //console.error('No se encontró el formulario con id ' + dForm.formId);
537
- continue;
538
- }
539
- const keyFormTitle = TokenService.getKeyFormulario(form.title) + '_';
540
- for (const key in dForm.data) {
541
- listData[key] = dForm.data[key];
542
- listDataByForm[keyFormTitle + key] = dForm.data[key];
543
- }
544
- }
545
- }
546
- return {
547
- listData: listData,
548
- listDataByForm: listDataByForm
549
- };
550
- }
551
- /**
552
- * It returns the components
553
- * @param components
554
- */
555
- static getPanelComponents(components) {
556
- return FormioUtil.getComponentsByPanel(components);
557
- }
558
- /**
559
- * It returns the components array of the form
560
- * @param components array of components
561
- */
562
- static getComponentsByPanel(components) {
563
- // it contains the result array
564
- let result = [];
565
- if (components) {
566
- // iterate over components
567
- for (const component of components) {
568
- // avoid the editgrid component ot if it has a different behavior it should have an else statement
569
- if (component[EFormioKey.TYPE] !== EFormioKey.EDITGRID) {
570
- // if component is panel then titlePanel variable is changed, and it is gonna be inherited
571
- if (component[EFormioKey.TYPE] === EFormioKey.PANEL) {
572
- result.push(component);
573
- }
574
- }
575
- }
576
- }
577
- return result;
578
- }
579
- }
580
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWlvLXV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wbGktY29tbW9ucy9zcmMvbGliL3V0aWxzL2Zvcm1pby11dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHFFQUFxRTtBQUNyRSxPQUFPLEtBQUssTUFBTSxNQUFNLGdDQUFnQyxDQUFDO0FBRXpELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQztBQUVyQixNQUFNLE9BQU8sVUFBVTtJQUN0Qjs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLDZCQUE2QixDQUFDLFVBQVU7UUFDOUMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksVUFBVSxFQUFFO1lBQ2YsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ2pCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztZQUNsQixLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRTtnQkFDbkMsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEtBQUssRUFBRTtvQkFDaEQsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO3dCQUNuQixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3FCQUNwQjtvQkFDRCxNQUFNLEdBQUcsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQztvQkFDaEYsS0FBSyxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7aUJBQzFDO2dCQUNELE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO29CQUNqQixLQUFLLEVBQUUs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SSxFQUFFO29CQUM3QixRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDaEMsY0FBYyxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUNyRDthQUNEO1NBQ0Q7UUFDRCxPQUFPO1lBQ04sUUFBUSxFQUFFLFFBQVE7WUFDbEIsY0FBYyxFQUFFLGNBQWM7U0FDOUIsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsa0JBQWtCLENBQUMsVUFBaUI7UUFDMUMsT0FBTyxVQUFVLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7T0FHRztJQUNLLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxVQUFpQjtRQUNwRCwrQkFBK0I7UUFDL0IsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksVUFBVSxFQUFFO1lBQ2YsMEJBQTBCO1lBQzFCLEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFO2dCQUNuQyxrR0FBa0c7Z0JBQ2xHLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxVQUFVLENBQUMsUUFBUSxFQUFFO29CQUN2RCwwRkFBMEY7b0JBQzFGLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxVQUFVLENBQUMsS0FBSyxFQUFFO3dCQUNwRCxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO3FCQUN2QjtpQkFDRDthQUNEO1NBQ0Q7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIGltcG9ydCAqIGFzIHV0aWxzXyBmcm9tICdmb3JtaW9qcy1wcm95ZWN0b3Njb2xmdXR1cm8vdXRpbHMvdXRpbHMnO1xyXG5pbXBvcnQgKiBhcyB1dGlsc18gZnJvbSAnZm9ybWlvanMtY29sZnV0dXJvL3V0aWxzL3V0aWxzJztcclxuaW1wb3J0IHsgSWZTdG10IH0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXInO1xyXG5pbXBvcnQgeyBUb2tlblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy90b2tlbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRUZvcm1pb0tleSB9IGZyb20gJ25nLXBsaS11dGlsJztcclxuY29uc3QgdXRpbHMgPSB1dGlsc187XHJcblxyXG5leHBvcnQgY2xhc3MgRm9ybWlvVXRpbCB7XHJcblx0LyoqXHJcblx0ICogSXQgcmV0dXJucyB0aGUgY29tcG9uZW50cyBmb3JtYXRlZCBieSBwYW5lbFxyXG5cdCAqIEBwYXJhbSBjb21wb25lbnRzXHJcblx0ICogQHJldHVybiB0aGUgb2JqZWN0IGlzIFt7cGFuZWw6ICwgaXRlbXM6IFt7IHZhbHVlOiAsIGxhYmVsOiB9XX1dXHJcblx0ICovXHJcblx0c3RhdGljIGdldEZvcm1hdHRlZENvbXBvbmVudHNCeVBhbmVsKGNvbXBvbmVudHMpOiBhbnlbXSB7XHJcblx0XHRsZXQgcmVzdWx0ID0gW107XHJcblx0XHRpZiAoY29tcG9uZW50cykge1xyXG5cdFx0XHRsZXQgZ3JvdXAgPSBudWxsO1xyXG5cdFx0XHRsZXQgb2JqZWN0ID0gbnVsbDtcclxuXHRcdFx0Zm9yIChjb25zdCBjb21wb25lbnQgb2YgY29tcG9uZW50cykge1xyXG5cdFx0XHRcdGlmIChjb21wb25lbnRbRUZvcm1pb0tleS5USVRMRV9QQU5FTF0gIT09IGdyb3VwKSB7XHJcblx0XHRcdFx0XHRpZiAoZ3JvdXAgIT09IG51bGwpIHtcclxuXHRcdFx0XHRcdFx0cmVzdWx0LnB1c2gob2JqZWN0KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdG9iamVjdCA9IHsgbGFiZWw6IGNvbXBvbmVudFtFRm9ybWlvS2V5LlRJVExFX1BBTkVMXSwgaXRlbXM6IFtdLCB0b2dnbGU6IGZhbHNlIH07XHJcblx0XHRcdFx0XHRncm91cCA9IGNvbXBvbmVudFtFRm9ybWlvS2V5LlRJVExFX1BBTkVMXTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0b2JqZWN0Lml0ZW1zLnB1c2goe1xyXG5cdFx0XHRcdFx0bGFiZWw6IGNvbXBvbmVudFtFRm9ybWlvS2V5LkxBQkVMXSxcclxuXHRcdFx0XHRcdHZhbHVlOiBjb21wb25lbnRbRUZvcm1pb0tleS5LRVldXHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKGdyb3VwICE9PSBudWxsKSByZXN1bHQucHVzaChvYmplY3QpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblx0c3RhdGljIGdldFNlbGVjdEJveGVzKHNlbGVjdEJveGUpIHtcclxuXHRcdHZhciBpc3RydWUgPSBmYWxzZTtcclxuXHJcblx0XHRpZiAoc2VsZWN0Qm94ZSAhPSB1bmRlZmluZWQgJiYgc2VsZWN0Qm94ZSAhPSBudWxsICYmIHR5cGVvZiBzZWxlY3RCb3hlID09PSAnb2JqZWN0Jykge1xyXG5cdFx0XHRsZXQgZGF0YUhhc1RydWUgPSBPYmplY3QudmFsdWVzKHNlbGVjdEJveGUpO1xyXG5cclxuXHRcdFx0ZGF0YUhhc1RydWUuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcclxuXHRcdFx0XHRpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgJiYgdmFsdWUpIHtcclxuXHRcdFx0XHRcdGlzdHJ1ZSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gRXhwZWN0ZWQgb3V0cHV0OiBBcnJheSBbXCJzb21lc3RyaW5nXCIsIDQyLCBmYWxzZV1cclxuXHJcblx0XHRyZXR1cm4gaXN0cnVlO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSXQgcmV0dXJucyB0aGUgY29tcG9uZW50cyBhcmUgcmVxdWlyZWQgYWNjb3JkaW5nIHdpdGggZGF0YVxyXG5cdCAqIEBwYXJhbSBjb21wb25lbnRzIGFycmF5IG9mIGNvbXBvbmVudHNcclxuXHQgKiBAcGFyYW0gZGF0YVxyXG5cdCAqL1xyXG5cdHN0YXRpYyBnZXRSZXF1aXJlZENvbXBvbmVudHNCeURhdGEoY29tcG9uZW50cywgZGF0YSkge1xyXG5cdFx0Ly8gZ2V0IHRoZSByZXF1aXJlZCBjb21wb25lbnRzXHJcblxyXG5cdFx0bGV0IGFycmF5ID0gRm9ybWlvVXRpbC5nZXRSZXF1aXJlZENvbXBvbmVudHMoY29tcG9uZW50cyk7XHJcblxyXG5cdFx0Ly8gaWYgbm90IGRhdGEgdGhlbiByZXR1cm4gY29tcG9uZW50c1xyXG5cdFx0aWYgKGRhdGEgJiYgYXJyYXkpIHtcclxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdGNvbnN0IGNvbXBvbmVudCA9IGFycmF5W2ldO1xyXG5cdFx0XHRcdC8vIHVzZSBmb3JtaW8gdG8gY2hlY2sgY29uZGl0aW9uIGFjY29yZGluZyB3aXRoIGRhdGFcclxuXHRcdFx0XHRpZiAodXRpbHMuY2hlY2tDb25kaXRpb24oY29tcG9uZW50LCBudWxsLCBkYXRhLCBudWxsLCBudWxsKSkge1xyXG5cdFx0XHRcdFx0Y29uc3Qga2V5ID0gY29tcG9uZW50W0VGb3JtaW9LZXkuS0VZXTtcclxuXHJcblx0XHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheShkYXRhW2tleV0pICYmIGRhdGFba2V5XS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0XHRcdC8vIHJlbW92ZSBpdGVtIGZyb20gYXJyYXlcclxuXHRcdFx0XHRcdFx0YXJyYXkuc3BsaWNlKGksIDEpO1xyXG5cdFx0XHRcdFx0XHRpLS07XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRcdFx0XHR0eXBlb2YgZGF0YVtrZXldID09PSAnb2JqZWN0JyAmJlxyXG5cdFx0XHRcdFx0XHQhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGFba2V5XSwgJ2Zvcm1hdHRlZF9hZGRyZXNzJykgJiZcclxuXHRcdFx0XHRcdFx0IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhW2tleV0sICdjYWxsaW5nQ29kZXMnKSAmJlxyXG5cdFx0XHRcdFx0XHQhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGFba2V5XSwgJ25hdGl2ZU5hbWUnKSAmJlxyXG5cdFx0XHRcdFx0XHQhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGFba2V5XSwgJ29yaWdpbmFsX25hbWUnKSAmJlxyXG5cdFx0XHRcdFx0XHQoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhW2tleV0sICdmdWxsTmFtZScpIHx8ICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YVtrZXldLCAnZnVsbG5hbWUnKSkgJiZcclxuXHRcdFx0XHRcdFx0Rm9ybWlvVXRpbC5nZXRTZWxlY3RCb3hlcyhkYXRhW2tleV0pXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0Ly8gcmVtb3ZlIGl0ZW0gZnJvbSBhcnJheVxyXG5cdFx0XHRcdFx0XHRhcnJheS5zcGxpY2UoaSwgMSk7XHJcblx0XHRcdFx0XHRcdGktLTtcclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdFx0XHRcdHR5cGVvZiBkYXRhW2tleV0gPT09ICdvYmplY3QnICYmXHJcblx0XHRcdFx0XHRcdCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YVtrZXldLCAnZm9ybWF0dGVkX2FkZHJlc3MnKSAmJlxyXG5cdFx0XHRcdFx0XHQhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGFba2V5XSwgJ2NhbGxpbmdDb2RlcycpICYmXHJcblx0XHRcdFx0XHRcdCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YVtrZXldLCAnbmF0aXZlTmFtZScpICYmXHJcblx0XHRcdFx0XHRcdCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YVtrZXldLCAnb3JpZ2luYWxfbmFtZScpICYmXHJcblx0XHRcdFx0XHRcdCghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGFba2V5XSwgJ2Z1bGxOYW1lJykgfHwgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhW2tleV0sICdmdWxsbmFtZScpKSAmJlxyXG5cdFx0XHRcdFx0XHQhRm9ybWlvVXRpbC5nZXRTZWxlY3RCb3hlcyhkYXRhW2tleV0pXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoZGF0YVtrZXldICE9IHVuZGVmaW5lZCAmJiBkYXRhW2tleV0gIT0gbnVsbCAmJiBkYXRhW2tleV0gIT0gJycpIHtcclxuXHRcdFx0XHRcdFx0Ly8gcmVtb3ZlIGl0ZW0gZnJvbSBhcnJheVxyXG5cdFx0XHRcdFx0XHRhcnJheS5zcGxpY2UoaSwgMSk7XHJcblx0XHRcdFx0XHRcdGktLTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnQuY3VzdG9tQ29uZGl0aW9uYWwgJiZcclxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnQuY3VzdG9tQ29uZGl0aW9uYWwuaW5jbHVkZXMoJ3Nob3cnKVxyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHQvLyByZW1vdmUgaXRlbSBmcm9tIGFycmF5XHJcblx0XHRcdFx0XHRcdFx0YXJyYXkuc3BsaWNlKGksIDEpO1xyXG5cdFx0XHRcdFx0XHRcdGktLTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQvLyByZW1vdmUgaXRlbSBmcm9tIGFycmF5XHJcblx0XHRcdFx0XHRhcnJheS5zcGxpY2UoaSwgMSk7XHJcblx0XHRcdFx0XHRpLS07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gYXJyYXk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJdCByZXR1cm5zIHRoZSBjb21wb25lbnRzIHRoYXQgYXJlIHJlcXVpcmVkXHJcblx0ICogQHBhcmFtIGNvbXBvbmVudHMgYXJyYXkgb2YgY29tcG9uZW50c1xyXG5cdCAqL1xyXG5cdHN0YXRpYyBnZXRVbmlxdWVDb21wb25lbnRzKGNvbXBvbmVudHMpIHtcclxuXHRcdHJldHVybiBGb3JtaW9VdGlsLmdldENvbXBvbmVudHNCeUZlYXR1cmUoY29tcG9uZW50cywgW0VGb3JtaW9LZXkuVU5JUVVFXSwgdHJ1ZSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJdCByZXR1cm5zIHRoZSBjb21wb25lbnRzIHRoYXQgYXJlIHJlcXVpcmVkXHJcblx0ICogQHBhcmFtIGNvbXBvbmVudHMgYXJyYXkgb2YgY29tcG9uZW50c1xyXG5cdCAqL1xyXG5cdHN0YXRpYyBnZXRSZXF1aXJlZENvbXBvbmVudHMoY29tcG9uZW50cykge1xyXG5cdFx0cmV0dXJuIEZvcm1pb1V0aWwuZ2V0Q29tcG9uZW50c0J5RmVhdHVyZShcclxuXHRcdFx0Y29tcG9uZW50cyxcclxuXHRcdFx0W0VGb3JtaW9LZXkuVkFMSURBVEUsIEVGb3JtaW9LZXkuUkVRVUlSRURdLFxyXG5cdFx0XHR0cnVlXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSXQgcmV0dXJucyB0aGUgY29tcG9uZW50cyB0aGF0IGhhdmUgYSBzcGVjaWZpYyBmZWF0dXJlIGRlZmluZWQgYnkgcHJvcGVydGllcyBhbmQgdmFsdWVcclxuXHQgKiBAcGFyYW0gY29tcG9uZW50cyBhcnJheSBvZiBjb21wb25lbnRzXHJcblx0ICogQHBhcmFtIHByb3BlcnRpZXMgcGF0aCBvZiBwcm9wZXJ0aWVzIGV4YW1wbGUgW3ZhbGlkYXRlLCByZXF1aXJlZF0gb3IgW3VuaXF1ZV1cclxuXHQgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRoYXQgc2hvdWxkIGhhdmUgdGhlIHByb3BlcnR5XHJcblx0ICovXHJcblx0cHJpdmF0ZSBzdGF0aWMgZ2V0Q29tcG9uZW50c0J5RmVhdHVyZShjb21wb25lbnRzOiBhbnlbXSwgcHJvcGVydGllczogc3RyaW5nW10sIHZhbHVlOiBhbnkpIHtcclxuXHRcdGxldCByZXN1bHQgPSBbXTtcclxuXHRcdGlmIChwcm9wZXJ0aWVzICYmIHByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHQvLyBnZXQgY29tcG9uZW50c1xyXG5cdFx0XHRjb25zdCBmaWVsZHM6IGFueVtdID0gRm9ybWlvVXRpbC5nZXRDb21wb25lbnRzKGNvbXBvbmVudHMpO1xyXG5cclxuXHRcdFx0Ly8gZ2V0IGZpcnN0IGFuZCBsYXN0IHByb3BlcnR5XHJcblx0XHRcdGNvbnN0IGZpcnN0UHJvcGVydHkgPSBwcm9wZXJ0aWVzWzBdO1xyXG5cdFx0XHRjb25zdCBsYXN0UHJvcGVydHkgPSBwcm9wZXJ0aWVzW3Byb3BlcnRpZXMubGVuZ3RoIC0gMV07XHJcblxyXG5cdFx0XHRpZiAoZmllbGRzKSB7XHJcblx0XHRcdFx0Ly8gaXRlcmF0ZSB0aGUgZmllbGRzXHJcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdC8vIGl0IGNvbnRhaW5zIHRoZSBlbnRpcmUgb2JqZWN0IGZpZWxkXHJcblx0XHRcdFx0XHRjb25zdCBmaWVsZCA9IGZpZWxkc1tpXTtcclxuXHRcdFx0XHRcdC8vIGl0IGNvbnRhaW5zIHRoZSBjdXJyZW50IGNvbXBvbmVudCBhbmQgaXQgaXMgZ29ubmEgYmUgdGhlIGNvbXBvbmVudCBvZiBldmVyeSBwcm9wZXJ0eVxyXG5cdFx0XHRcdFx0bGV0IGNvbXBvbmVudCA9IGZpZWxkO1xyXG5cdFx0XHRcdFx0aWYgKGZpZWxkW2ZpcnN0UHJvcGVydHldKSB7XHJcblx0XHRcdFx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgcHJvcGVydGllcy5sZW5ndGg7IGorKykge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5ID0gcHJvcGVydGllc1tqXTtcclxuXHRcdFx0XHRcdFx0XHQvLyBpZiBjb21wb25lbnQucHJvcGVydHkgZG9lc250IGV4aXN0IHRoZW4gYnJlYWtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIWNvbXBvbmVudFtwcm9wZXJ0eV0pIGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdGlmIChwcm9wZXJ0eSA9PT0gbGFzdFByb3BlcnR5KSB7XHJcblx0XHRcdFx0XHRcdFx0XHQvLyBpdCBpcyB0aGUgbGFzdCBwcm9wZXJ0eSBzbyBpZiB0aGUgdmFsdWUgaXMgZXF1YWxzIHRvIGNvbXBvbmVudC5sYXN0cHJvcGVydHkgdGhlbiBpdCBpcyBhZGRlZCB0byByZXN1bHRcclxuXHRcdFx0XHRcdFx0XHRcdGlmIChjb21wb25lbnRbcHJvcGVydHldID09IHZhbHVlKSByZXN1bHQucHVzaChmaWVsZCk7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdC8vIG90aGVyd2lzZSBjb21wb25lbnQgd2lsbCBiZSBlcXVhbCB0byB0aGUgY29tcG9uZW50LnByb3BlcnR5XHJcblx0XHRcdFx0XHRcdFx0XHRjb21wb25lbnQgPSBjb21wb25lbnRbcHJvcGVydHldO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEl0IHJldHVybnMgdGhlIGNvbXBvbmVudHNcclxuXHQgKiBAcGFyYW0gY29tcG9uZW50c1xyXG5cdCAqL1xyXG5cdHN0YXRpYyBnZXRDb21wb25lbnRzKGNvbXBvbmVudHM6IGFueVtdKTogYW55W10ge1xyXG5cdFx0cmV0dXJuIEZvcm1pb1V0aWwuZ2V0Q29tcG9uZW50c0J5UmVjdXJzaW9uKGNvbXBvbmVudHMsICcnLCBudWxsKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEl0IHJldHVybnMgdGhlIGNvbXBvbmVudHMgYXJyYXkgb2YgdGhlIGZvcm0gYnkgcmVjdXJzaW9uXHJcblx0ICogQHBhcmFtIGNvbXBvbmVudHMgYXJyYXkgb2YgY29tcG9uZW50c1xyXG5cdCAqIEBwYXJhbSB0aXRsZVBhbmVsIG5hbWUgb2YgcGFyZW50IHBhbmVsLCBzbyBjaGlsZHJlbiBjb21wb25lbnRzIHdpbGwgaW5oZXJpdCB0aGUgcGFuZWxOYW1lXHJcblx0ICogQHBhcmFtIGNvbmRpdGlvbmFsT2JqZWN0IGNvbmRpdGlvbmFsIG9iamVjdCBpdCB3aWxsIGJlIGluaGVyaXRlZCBmcm9tIHBhbmVsIHtjb25kaXRpb25hbDogeyBlcTogLCB2YWx1ZTogLCB3aGVuOiAsIGpzb246IH0sIGN1c3RvbUNvbmRpdGlvbmFsOiB9XHJcblx0ICovXHJcblx0cHJpdmF0ZSBzdGF0aWMgZ2V0Q29tcG9uZW50c0J5UmVjdXJzaW9uKFxyXG5cdFx0Y29tcG9uZW50czogYW55W10sXHJcblx0XHR0aXRsZVBhbmVsOiBzdHJpbmcsXHJcblx0XHRjb25kaXRpb25hbFBhcmVudDogYW55XHJcblx0KTogYW55W10ge1xyXG5cdFx0Ly8gaXQgY29udGFpbnMgdGhlIHJlc3VsdCBhcnJheVxyXG5cdFx0bGV0IHJlc3VsdCA9IFtdO1xyXG5cdFx0aWYgKGNvbXBvbmVudHMpIHtcclxuXHRcdFx0Ly8gaXRlcmF0ZSBvdmVyIGNvbXBvbmVudHNcclxuXHRcdFx0Zm9yIChjb25zdCBjb21wb25lbnQgb2YgY29tcG9uZW50cykge1xyXG5cdFx0XHRcdC8vIGF2b2lkIHRoZSBlZGl0Z3JpZCBjb21wb25lbnQgb3QgaWYgaXQgaGFzIGEgZGlmZmVyZW50IGJlaGF2aW9yIGl0IHNob3VsZCBoYXZlIGFuIGVsc2Ugc3RhdGVtZW50XHJcblx0XHRcdFx0aWYgKGNvbXBvbmVudFtFRm9ybWlvS2V5LlRZUEVdICE9PSBFRm9ybWlvS2V5LkVESVRHUklEKSB7XHJcblx0XHRcdFx0XHQvLyBpZiBjb21wb25lbnQgaXMgcGFuZWwgdGhlbiB0aXRsZVBhbmVsIHZhcmlhYmxlIGlzIGNoYW5nZWQsIGFuZCBpdCBpcyBnb25uYSBiZSBpbmhlcml0ZWRcclxuXHRcdFx0XHRcdGlmIChjb21wb25lbnRbRUZvcm1pb0tleS5UWVBFXSA9PT0gRUZvcm1pb0tleS5QQU5FTCkge1xyXG5cdFx0XHRcdFx0XHR0aXRsZVBhbmVsID0gY29tcG9uZW50W0VGb3JtaW9LZXkuVElUTEVdO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0KHR5cGVvZiBjb21wb25lbnRbRUZvcm1pb0tleS5DT01QT05FTlRTXSAhPT0gJ3VuZGVmaW5lZCcgfHxcclxuXHRcdFx0XHRcdFx0XHR0eXBlb2YgY29tcG9uZW50W0VGb3JtaW9LZXkuQ09MVU1OU10gIT09ICd1bmRlZmluZWQnKSAmJlxyXG5cdFx0XHRcdFx0XHQodHlwZW9mIGNvbXBvbmVudFtFRm9ybWlvS2V5LlRZUEVdID09ICd1bmRlZmluZWQnIHx8XHJcblx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuVFlQRV0gIT09IEVGb3JtaW9LZXkuVFlQRV9BRERSRVNTKVxyXG5cdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdGlmIChjb21wb25lbnRbJ3R5cGUnXSAhPT0gJ2FkZHJlc3MnKSB7XHJcblx0XHRcdFx0XHRcdFx0Ly8gcmVzb2x2ZSBjb25kaXRpb25hbCBwYXJlbnQgY29uZGl0aW9uYWxcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBjb25kaXRpb25hbCA9IHRoaXMucmVzb2x2ZUluaGVyaXRhbmNlQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdFx0XHRjb25kaXRpb25hbFBhcmVudCxcclxuXHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTkRJVElPTkFMXSxcclxuXHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LkNVU1RPTV9DT05ESVRJT05BTF0sXHJcblx0XHRcdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5JRF1cclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdC8vIGNoYW5nZSBjb25kaXRpb25cclxuXHRcdFx0XHRcdFx0XHRpZiAoY29uZGl0aW9uYWwpIGNvbmRpdGlvbmFsUGFyZW50ID0gY29uZGl0aW9uYWw7XHJcblx0XHRcdFx0XHRcdFx0Ly8gaXQgY29udGFpbnMgdGhlIHN1YmNvbXBvbmVudHMgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBjb21wb25lbnQgaWYgaXQgaGFzIGNvbXBvbmVudHMgb3IgY29sdW1uc1xyXG5cdFx0XHRcdFx0XHRcdGxldCBzdWJDb21wb25lbnRzID1cclxuXHRcdFx0XHRcdFx0XHRcdHR5cGVvZiBjb21wb25lbnRbRUZvcm1pb0tleS5DT01QT05FTlRTXSAhPT0gJ3VuZGVmaW5lZCdcclxuXHRcdFx0XHRcdFx0XHRcdFx0PyBjb21wb25lbnRbRUZvcm1pb0tleS5DT01QT05FTlRTXVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ6IGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTFVNTlNdO1xyXG5cdFx0XHRcdFx0XHRcdC8vIGlmIGNvbXBvbmVudCBoYXMgc3ViQ29tcG9uZW50cywgdGhlbiBleGVjdXRlIHRoZSByZWN1cnNpb24gZnVuY3Rpb24gdG8gZ2V0IHRoZSByZWN1cnNpb25uUmVzdWx0XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgcmVjdXJzaW9uUmVzdWx0ID0gRm9ybWlvVXRpbC5nZXRDb21wb25lbnRzQnlSZWN1cnNpb24oXHJcblx0XHRcdFx0XHRcdFx0XHRzdWJDb21wb25lbnRzLFxyXG5cdFx0XHRcdFx0XHRcdFx0dGl0bGVQYW5lbCxcclxuXHRcdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsUGFyZW50XHJcblx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHQvLyBpZiByZWN1cnNpb24gcmVzdWx0IHRoZW4gcmVzdWx0IGNvbmNhdHMgdGhlIHJlY3Vyc2lvblJlc3VsdFxyXG5cdFx0XHRcdFx0XHRcdGlmIChyZWN1cnNpb25SZXN1bHQpIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQocmVjdXJzaW9uUmVzdWx0KTtcclxuXHRcdFx0XHRcdFx0XHQvLyByZXNldCBjb25kaXRpb25hbCBQYXJlbnRcclxuXHRcdFx0XHRcdFx0XHRpZiAoY29tcG9uZW50W0VGb3JtaW9LZXkuSURdID09IGNvbmRpdGlvbmFsUGFyZW50LmlkKVxyXG5cdFx0XHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxQYXJlbnQgPSB1bmRlZmluZWQ7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0cmVzdWx0LnB1c2goY29tcG9uZW50KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0Ly8gYXZvaWQgdGhlIGNvbXBvbmVudCB0eXBlIGJ1dHRvblxyXG5cdFx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuVFlQRV0gIT09IEVGb3JtaW9LZXkuQlVUVE9OICYmXHJcblx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuS0VZXSAmJlxyXG5cdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LkxBQkVMXVxyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHQvLyByZXNvbHZlIGNvbmRpdGlvbmFsIGNvbmRpdGlvbmFsIG9iamVjdFxyXG5cdFx0XHRcdFx0XHRcdGxldCBjb25kaXRpb25hbCA9IHRoaXMucmVzb2x2ZUluaGVyaXRhbmNlQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdFx0XHRjb25kaXRpb25hbFBhcmVudCxcclxuXHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTkRJVElPTkFMXSxcclxuXHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LkNVU1RPTV9DT05ESVRJT05BTF0sXHJcblx0XHRcdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5JRF1cclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdGlmICghY29uZGl0aW9uYWwpIGNvbmRpdGlvbmFsID0gY29uZGl0aW9uYWxQYXJlbnQ7XHJcblx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ09ORElUSU9OQUxdID0gY29uZGl0aW9uYWxbRUZvcm1pb0tleS5DT05ESVRJT05BTF07XHJcblx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ1VTVE9NX0NPTkRJVElPTkFMXSA9XHJcblx0XHRcdFx0XHRcdFx0XHRjb25kaXRpb25hbFtFRm9ybWlvS2V5LkNVU1RPTV9DT05ESVRJT05BTF07XHJcblx0XHRcdFx0XHRcdFx0Ly8gYWRkIG5hbVBhbmVsIGFzIHByb3BlcnR5XHJcblx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuVElUTEVfUEFORUxdID0gdGl0bGVQYW5lbDtcclxuXHRcdFx0XHRcdFx0XHQvLyBhZGQgY29tcG9uZW50IHRvIHRoZSByZXN1bHRcclxuXHRcdFx0XHRcdFx0XHRyZXN1bHQucHVzaChjb21wb25lbnQpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIGlmIChjb21wb25lbnRbRUZvcm1pb0tleS5UWVBFXSA9PT0gRUZvcm1pb0tleS5FRElUR1JJRCkge1xyXG5cdFx0XHRcdFx0aWYgKGNvbXBvbmVudC52YWxpZGF0ZS5yZXF1aXJlZCkge1xyXG5cdFx0XHRcdFx0XHRyZXN1bHQucHVzaChjb21wb25lbnQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEl0IHJldHVybnMgdGhlIGNvbXBvbmVudHNcclxuXHQgKiBAcGFyYW0gY29tcG9uZW50c1xyXG5cdCAqIEBwYXJhbSBrZWVwRWRpdEdyaWRzXHJcblx0ICovXHJcblx0c3RhdGljIGdldENvbXBvbmVudHNXaXRoRWRpdEdyaWRzKGNvbXBvbmVudHM6IGFueVtdKTogYW55W10ge1xyXG5cdFx0cmV0dXJuIEZvcm1pb1V0aWwuZ2V0Q29tcG9uZW50c0J5UmVjdXJzaW9uV2l0aEVkaXRHcmlkcyhjb21wb25lbnRzLCAnJywgbnVsbCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJdCByZXR1cm5zIHRoZSBjb21wb25lbnRzIGFycmF5IG9mIHRoZSBmb3JtIGJ5IHJlY3Vyc2lvblxyXG5cdCAqIEBwYXJhbSBjb21wb25lbnRzIGFycmF5IG9mIGNvbXBvbmVudHNcclxuXHQgKiBAcGFyYW0gdGl0bGVQYW5lbCBuYW1lIG9mIHBhcmVudCBwYW5lbCwgc28gY2hpbGRyZW4gY29tcG9uZW50cyB3aWxsIGluaGVyaXQgdGhlIHBhbmVsTmFtZVxyXG5cdCAqIEBwYXJhbSBjb25kaXRpb25hbE9iamVjdCBjb25kaXRpb25hbCBvYmplY3QgaXQgd2lsbCBiZSBpbmhlcml0ZWQgZnJvbSBwYW5lbCB7Y29uZGl0aW9uYWw6IHsgZXE6ICwgdmFsdWU6ICwgd2hlbjogLCBqc29uOiB9LCBjdXN0b21Db25kaXRpb25hbDogfVxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc3RhdGljIGdldENvbXBvbmVudHNCeVJlY3Vyc2lvbldpdGhFZGl0R3JpZHMoXHJcblx0XHRjb21wb25lbnRzOiBhbnlbXSxcclxuXHRcdHRpdGxlUGFuZWw6IHN0cmluZyxcclxuXHRcdGNvbmRpdGlvbmFsUGFyZW50OiBhbnlcclxuXHQpOiBhbnlbXSB7XHJcblx0XHQvLyBpdCBjb250YWlucyB0aGUgcmVzdWx0IGFycmF5XHJcblx0XHRsZXQgcmVzdWx0ID0gW107XHJcblx0XHRpZiAoY29tcG9uZW50cykge1xyXG5cdFx0XHQvLyBpdGVyYXRlIG92ZXIgY29tcG9uZW50c1xyXG5cdFx0XHRmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBjb21wb25lbnRzKSB7XHJcblx0XHRcdFx0Ly8gYXZvaWQgdGhlIGVkaXRncmlkIGNvbXBvbmVudCBvdCBpZiBpdCBoYXMgYSBkaWZmZXJlbnQgYmVoYXZpb3IgaXQgc2hvdWxkIGhhdmUgYW4gZWxzZSBzdGF0ZW1lbnRcclxuXHJcblx0XHRcdFx0Ly8gaWYgY29tcG9uZW50IGlzIHBhbmVsIHRoZW4gdGl0bGVQYW5lbCB2YXJpYWJsZSBpcyBjaGFuZ2VkLCBhbmQgaXQgaXMgZ29ubmEgYmUgaW5oZXJpdGVkXHJcblx0XHRcdFx0aWYgKGNvbXBvbmVudFtFRm9ybWlvS2V5LlRZUEVdID09PSBFRm9ybWlvS2V5LlBBTkVMKSB7XHJcblx0XHRcdFx0XHR0aXRsZVBhbmVsID0gY29tcG9uZW50W0VGb3JtaW9LZXkuVElUTEVdO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0KHR5cGVvZiBjb21wb25lbnRbRUZvcm1pb0tleS5DT01QT05FTlRTXSAhPT0gJ3VuZGVmaW5lZCcgfHxcclxuXHRcdFx0XHRcdFx0dHlwZW9mIGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTFVNTlNdICE9PSAndW5kZWZpbmVkJykgJiZcclxuXHRcdFx0XHRcdCh0eXBlb2YgY29tcG9uZW50W0VGb3JtaW9LZXkuVFlQRV0gPT0gJ3VuZGVmaW5lZCcgfHxcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuVFlQRV0gIT09IEVGb3JtaW9LZXkuVFlQRV9BRERSRVNTKVxyXG5cdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0Ly8gcmVzb2x2ZSBjb25kaXRpb25hbCBwYXJlbnQgY29uZGl0aW9uYWxcclxuXHRcdFx0XHRcdGNvbnN0IGNvbmRpdGlvbmFsID0gdGhpcy5yZXNvbHZlSW5oZXJpdGFuY2VDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxQYXJlbnQsXHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTkRJVElPTkFMXSxcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ1VTVE9NX0NPTkRJVElPTkFMXSxcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuSURdXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0Ly8gY2hhbmdlIGNvbmRpdGlvblxyXG5cdFx0XHRcdFx0aWYgKGNvbmRpdGlvbmFsKSBjb25kaXRpb25hbFBhcmVudCA9IGNvbmRpdGlvbmFsO1xyXG5cdFx0XHRcdFx0Ly8gaXQgY29udGFpbnMgdGhlIHN1YmNvbXBvbmVudHMgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBjb21wb25lbnQgaWYgaXQgaGFzIGNvbXBvbmVudHMgb3IgY29sdW1uc1xyXG5cdFx0XHRcdFx0bGV0IHN1YkNvbXBvbmVudHMgPVxyXG5cdFx0XHRcdFx0XHR0eXBlb2YgY29tcG9uZW50W0VGb3JtaW9LZXkuQ09NUE9ORU5UU10gIT09ICd1bmRlZmluZWQnXHJcblx0XHRcdFx0XHRcdFx0PyBjb21wb25lbnRbRUZvcm1pb0tleS5DT01QT05FTlRTXVxyXG5cdFx0XHRcdFx0XHRcdDogY29tcG9uZW50W0VGb3JtaW9LZXkuQ09MVU1OU107XHJcblxyXG5cdFx0XHRcdFx0aWYgKGNvbXBvbmVudFtFRm9ybWlvS2V5LlRZUEVdID09PSBFRm9ybWlvS2V5LkVESVRHUklEKSB7XHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LlRJVExFX1BBTkVMXSA9IHRpdGxlUGFuZWw7XHJcblx0XHRcdFx0XHRcdHJlc3VsdC5wdXNoKGNvbXBvbmVudCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHQvLyBpZiBjb21wb25lbnQgaGFzIHN1YkNvbXBvbmVudHMsIHRoZW4gZXhlY3V0ZSB0aGUgcmVjdXJzaW9uIGZ1bmN0aW9uIHRvIGdldCB0aGUgcmVjdXJzaW9ublJlc3VsdFxyXG5cdFx0XHRcdFx0Y29uc3QgcmVjdXJzaW9uUmVzdWx0ID0gRm9ybWlvVXRpbC5nZXRDb21wb25lbnRzQnlSZWN1cnNpb25XaXRoRWRpdEdyaWRzKFxyXG5cdFx0XHRcdFx0XHRzdWJDb21wb25lbnRzLFxyXG5cdFx0XHRcdFx0XHR0aXRsZVBhbmVsLFxyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25hbFBhcmVudFxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdC8vIGlmIHJlY3Vyc2lvbiByZXN1bHQgdGhlbiByZXN1bHQgY29uY2F0cyB0aGUgcmVjdXJzaW9uUmVzdWx0XHJcblx0XHRcdFx0XHRpZiAocmVjdXJzaW9uUmVzdWx0KSByZXN1bHQgPSByZXN1bHQuY29uY2F0KHJlY3Vyc2lvblJlc3VsdCk7XHJcblx0XHRcdFx0XHQvLyByZXNldCBjb25kaXRpb25hbCBQYXJlbnRcclxuXHRcdFx0XHRcdGlmIChjb21wb25lbnRbRUZvcm1pb0tleS5JRF0gPT0gY29uZGl0aW9uYWxQYXJlbnQuaWQpXHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsUGFyZW50ID0gdW5kZWZpbmVkO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQvLyBhdm9pZCB0aGUgY29tcG9uZW50IHR5cGUgYnV0dG9uXHJcblx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LlRZUEVdICE9PSBFRm9ybWlvS2V5LkJVVFRPTiAmJlxyXG5cdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5LRVldICYmXHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LkxBQkVMXVxyXG5cdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdC8vIHJlc29sdmUgY29uZGl0aW9uYWwgY29uZGl0aW9uYWwgb2JqZWN0XHJcblx0XHRcdFx0XHRcdGxldCBjb25kaXRpb25hbCA9IHRoaXMucmVzb2x2ZUluaGVyaXRhbmNlQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxQYXJlbnQsXHJcblx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ09ORElUSU9OQUxdLFxyXG5cdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LkNVU1RPTV9DT05ESVRJT05BTF0sXHJcblx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuSURdXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdGlmICghY29uZGl0aW9uYWwpIGNvbmRpdGlvbmFsID0gY29uZGl0aW9uYWxQYXJlbnQ7XHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTkRJVElPTkFMXSA9IGNvbmRpdGlvbmFsW0VGb3JtaW9LZXkuQ09ORElUSU9OQUxdO1xyXG5cdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5DVVNUT01fQ09ORElUSU9OQUxdID1cclxuXHRcdFx0XHRcdFx0XHRjb25kaXRpb25hbFtFRm9ybWlvS2V5LkNVU1RPTV9DT05ESVRJT05BTF07XHJcblx0XHRcdFx0XHRcdC8vIGFkZCBuYW1QYW5lbCBhcyBwcm9wZXJ0eVxyXG5cdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5USVRMRV9QQU5FTF0gPSB0aXRsZVBhbmVsO1xyXG5cdFx0XHRcdFx0XHQvLyBhZGQgY29tcG9uZW50IHRvIHRoZSByZXN1bHRcclxuXHRcdFx0XHRcdFx0cmVzdWx0LnB1c2goY29tcG9uZW50KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJdCByZXNvbHZlIHRoZSBpbmhlcml0YW5jZSBjb25kaXRpb25hbFxyXG5cdCAqIEBwYXJhbSBjb25kaXRpb25hbE9iamVjdFxyXG5cdCAqIEBwYXJhbSBjb25kaXRpb25hbFxyXG5cdCAqIEBwYXJhbSBjdXN0b21Db25kaXRpb25hbFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc3RhdGljIHJlc29sdmVJbmhlcml0YW5jZUNvbmRpdGlvbmFsKFxyXG5cdFx0Y29uZGl0aW9uYWxPYmplY3QsXHJcblx0XHRjb25kaXRpb25hbCxcclxuXHRcdGN1c3RvbUNvbmRpdGlvbmFsLFxyXG5cdFx0cGFyZW50SWRcclxuXHQpOiBhbnkge1xyXG5cdFx0Ly8gdmFsaWRhdGUgaWYgdGhlcmUgaXMgYSBjb25kaXRpb24gd2l0aCB0aGUgbmV3IGZpZWxkc1xyXG5cdFx0aWYgKFxyXG5cdFx0XHQhY29uZGl0aW9uYWxPYmplY3QgfHxcclxuXHRcdFx0Y3VzdG9tQ29uZGl0aW9uYWwgfHxcclxuXHRcdFx0KGNvbmRpdGlvbmFsICYmIGNvbmRpdGlvbmFsW0VGb3JtaW9LZXkuV0hFTl0gJiYgY29uZGl0aW9uYWxbRUZvcm1pb0tleS5FUV0pIHx8XHJcblx0XHRcdChjb25kaXRpb25hbCAmJiBjb25kaXRpb25hbFtFRm9ybWlvS2V5LkpTT05dKVxyXG5cdFx0KSB7XHJcblx0XHRcdHJldHVybiB7IGNvbmRpdGlvbmFsOiBjb25kaXRpb25hbCwgY3VzdG9tQ29uZGl0aW9uYWw6IGN1c3RvbUNvbmRpdGlvbmFsLCBpZDogcGFyZW50SWQgfTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBudWxsO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSXQgcmV0dXJucyB0aGUgZWRpdCBncmlkIGNvbXBvbmVudHNcclxuXHQgKiBAcGFyYW0gY29tcG9uZW50c1xyXG5cdCAqL1xyXG5cdHN0YXRpYyBnZXRFZGl0R3JpZEtleUxhYmVscyhjb21wb25lbnRzOiBhbnlbXSk6IGFueVtdIHtcclxuXHRcdHJldHVybiBGb3JtaW9VdGlsLmdldEVkaXRHcmlkS2V5TGFiZWxzQnlSZWN1cnNpb24oY29tcG9uZW50cywgJycsIG51bGwpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSXQgcmV0dXJucyB0aGUgY29tcG9uZW50cyBlZGl0IGdyaWQgYXJyYXkgb2YgdGhlIGZvcm0gYnkgcmVjdXJzaW9uXHJcblx0ICogQHBhcmFtIGNvbXBvbmVudHMgYXJyYXkgb2YgY29tcG9uZW50c1xyXG5cdCAqIEBwYXJhbSB0aXRsZVBhbmVsIG5hbWUgb2YgcGFyZW50IHBhbmVsLCBzbyBjaGlsZHJlbiBjb21wb25lbnRzIHdpbGwgaW5oZXJpdCB0aGUgcGFuZWxOYW1lXHJcblx0ICogQHBhcmFtIGNvbmRpdGlvbmFsT2JqZWN0IGNvbmRpdGlvbmFsIG9iamVjdCBpdCB3aWxsIGJlIGluaGVyaXRlZCBmcm9tIHBhbmVsIHtjb25kaXRpb25hbDogeyBlcTogLCB2YWx1ZTogLCB3aGVuOiAsIGpzb246IH0sIGN1c3RvbUNvbmRpdGlvbmFsOiB9XHJcblx0ICovXHJcblx0cHJpdmF0ZSBzdGF0aWMgZ2V0RWRpdEdyaWRLZXlMYWJlbHNCeVJlY3Vyc2lvbihcclxuXHRcdGNvbXBvbmVudHM6IGFueVtdLFxyXG5cdFx0dGl0bGVQYW5lbDogc3RyaW5nLFxyXG5cdFx0Y29uZGl0aW9uYWxQYXJlbnQ6IGFueVxyXG5cdCk6IGFueVtdIHtcclxuXHRcdC8vIGl0IGNvbnRhaW5zIHRoZSByZXN1bHQgYXJyYXlcclxuXHRcdGxldCByZXN1bHQgPSBbXTtcclxuXHRcdGlmIChjb21wb25lbnRzKSB7XHJcblx0XHRcdC8vIGl0ZXJhdGUgb3ZlciBjb21wb25lbnRzXHJcblx0XHRcdGZvciAoY29uc3QgY29tcG9uZW50IG9mIGNvbXBvbmVudHMpIHtcclxuXHRcdFx0XHQvLyBpZiBjb21wb25lbnQgaXMgcGFuZWwgdGhlbiB0aXRsZVBhbmVsIHZhcmlhYmxlIGlzIGNoYW5nZWQsIGFuZCBpdCBpcyBnb25uYSBiZSBpbmhlcml0ZWRcclxuXHRcdFx0XHRpZiAoY29tcG9uZW50W0VGb3JtaW9LZXkuVFlQRV0gPT09IEVGb3JtaW9LZXkuUEFORUwpIHtcclxuXHRcdFx0XHRcdHRpdGxlUGFuZWwgPSBjb21wb25lbnRbRUZvcm1pb0tleS5USVRMRV07XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHQodHlwZW9mIGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTVBPTkVOVFNdICE9PSAndW5kZWZpbmVkJyB8fFxyXG5cdFx0XHRcdFx0XHR0eXBlb2YgY29tcG9uZW50W0VGb3JtaW9LZXkuQ09MVU1OU10gIT09ICd1bmRlZmluZWQnKSAmJlxyXG5cdFx0XHRcdFx0KHR5cGVvZiBjb21wb25lbnRbRUZvcm1pb0tleS5UWVBFXSA9PSAndW5kZWZpbmVkJyB8fFxyXG5cdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5UWVBFXSAhPT0gRUZvcm1pb0tleS5UWVBFX0FERFJFU1MpXHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHQvLyByZXNvbHZlIGNvbmRpdGlvbmFsIHBhcmVudCBjb25kaXRpb25hbFxyXG5cdFx0XHRcdFx0Y29uc3QgY29uZGl0aW9uYWwgPSB0aGlzLnJlc29sdmVJbmhlcml0YW5jZUNvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25hbFBhcmVudCxcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ09ORElUSU9OQUxdLFxyXG5cdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5DVVNUT01fQ09ORElUSU9OQUxdLFxyXG5cdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5JRF1cclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHQvLyBjaGFuZ2UgY29uZGl0aW9uXHJcblx0XHRcdFx0XHRpZiAoY29uZGl0aW9uYWwpIGNvbmRpdGlvbmFsUGFyZW50ID0gY29uZGl0aW9uYWw7XHJcblx0XHRcdFx0XHQvLyBpdCBjb250YWlucyB0aGUgc3ViY29tcG9uZW50cyBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIGNvbXBvbmVudCBpZiBpdCBoYXMgY29tcG9uZW50cyBvciBjb2x1bW5zXHJcblx0XHRcdFx0XHRsZXQgc3ViQ29tcG9uZW50cyA9XHJcblx0XHRcdFx0XHRcdHR5cGVvZiBjb21wb25lbnRbRUZvcm1pb0tleS5DT01QT05FTlRTXSAhPT0gJ3VuZGVmaW5lZCdcclxuXHRcdFx0XHRcdFx0XHQ/IGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTVBPTkVOVFNdXHJcblx0XHRcdFx0XHRcdFx0OiBjb21wb25lbnRbRUZvcm1pb0tleS5DT0xVTU5TXTtcclxuXHRcdFx0XHRcdGlmIChjb21wb25lbnRbRUZvcm1pb0tleS5UWVBFXSA9PSBFRm9ybWlvS2V5LkVESVRHUklEKSB7XHJcblx0XHRcdFx0XHRcdC8vIGFkZCBuYW1QYW5lbCBhcyBwcm9wZXJ0eVxyXG5cdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5USVRMRV9QQU5FTF0gPSB0aXRsZVBhbmVsO1xyXG5cdFx0XHRcdFx0XHQvLyBhZGQgY29tcG9uZW50IHRvIHRoZSByZXN1bHRcclxuXHRcdFx0XHRcdFx0cmVzdWx0LnB1c2goY29tcG9uZW50KTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdC8vIGlmIGNvbXBvbmVudCBoYXMgc3ViQ29tcG9uZW50cywgdGhlbiBleGVjdXRlIHRoZSByZWN1cnNpb24gZnVuY3Rpb24gdG8gZ2V0IHRoZSByZWN1cnNpb25uUmVzdWx0XHJcblx0XHRcdFx0XHRcdGNvbnN0IHJlY3Vyc2lvblJlc3VsdCA9IEZvcm1pb1V0aWwuZ2V0RWRpdEdyaWRLZXlMYWJlbHNCeVJlY3Vyc2lvbihcclxuXHRcdFx0XHRcdFx0XHRzdWJDb21wb25lbnRzLFxyXG5cdFx0XHRcdFx0XHRcdHRpdGxlUGFuZWwsXHJcblx0XHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxQYXJlbnRcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0Ly8gaWYgcmVjdXJzaW9uIHJlc3VsdCB0aGVuIHJlc3VsdCBjb25jYXRzIHRoZSByZWN1cnNpb25SZXN1bHRcclxuXHRcdFx0XHRcdFx0aWYgKHJlY3Vyc2lvblJlc3VsdCkgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdChyZWN1cnNpb25SZXN1bHQpO1xyXG5cdFx0XHRcdFx0XHQvLyByZXNldCBjb25kaXRpb25hbCBQYXJlbnRcclxuXHRcdFx0XHRcdFx0aWYgKGNvbXBvbmVudFtFRm9ybWlvS2V5LklEXSA9PSBjb25kaXRpb25hbFBhcmVudC5pZClcclxuXHRcdFx0XHRcdFx0XHRjb25kaXRpb25hbFBhcmVudCA9IHVuZGVmaW5lZDtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEl0IHJldHVybnMgdGhlIGNvbXBvbmVudHNcclxuXHQgKiBAcGFyYW0gY29tcG9uZW50c1xyXG5cdCAqIEBwYXJhbSBrZWVwRWRpdEdyaWRzXHJcblx0ICovXHJcblx0c3RhdGljIGdldENvbXBvbmVudHNJbnRvRWRpdEdyaWRzKGNvbXBvbmVudHM6IGFueVtdLCBlZGl0R3JpZE5hbWU6IHN0cmluZyk6IGFueVtdIHtcclxuXHRcdHJldHVybiBGb3JtaW9VdGlsLmdldENvbXBvbmVudHNCeVJlY3Vyc2lvbkludG9FZGl0R3JpZHMoXHJcblx0XHRcdGNvbXBvbmVudHMsXHJcblx0XHRcdCcnLFxyXG5cdFx0XHRudWxsLFxyXG5cdFx0XHRlZGl0R3JpZE5hbWUsXHJcblx0XHRcdGZhbHNlXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSXQgcmV0dXJucyB0aGUgY29tcG9uZW50cyBhcnJheSBvZiB0aGUgZm9ybSBieSByZWN1cnNpb25cclxuXHQgKiBAcGFyYW0gY29tcG9uZW50cyBhcnJheSBvZiBjb21wb25lbnRzXHJcblx0ICogQHBhcmFtIHRpdGxlUGFuZWwgbmFtZSBvZiBwYXJlbnQgcGFuZWwsIHNvIGNoaWxkcmVuIGNvbXBvbmVudHMgd2lsbCBpbmhlcml0IHRoZSBwYW5lbE5hbWVcclxuXHQgKiBAcGFyYW0gY29uZGl0aW9uYWxPYmplY3QgY29uZGl0aW9uYWwgb2JqZWN0IGl0IHdpbGwgYmUgaW5oZXJpdGVkIGZyb20gcGFuZWwge2NvbmRpdGlvbmFsOiB7IGVxOiAsIHZhbHVlOiAsIHdoZW46ICwganNvbjogfSwgY3VzdG9tQ29uZGl0aW9uYWw6IH1cclxuXHQgKi9cclxuXHRwcml2YXRlIHN0YXRpYyBnZXRDb21wb25lbnRzQnlSZWN1cnNpb25JbnRvRWRpdEdyaWRzKFxyXG5cdFx0Y29tcG9uZW50czogYW55W10sXHJcblx0XHR0aXRsZVBhbmVsOiBzdHJpbmcsXHJcblx0XHRjb25kaXRpb25hbFBhcmVudDogYW55LFxyXG5cdFx0ZWRpdEdyaWROYW1lOiBzdHJpbmcsXHJcblx0XHRleGlzdEVkaXRHcmlkOiBib29sZWFuXHJcblx0KTogYW55W10ge1xyXG5cdFx0Ly8gaXQgY29udGFpbnMgdGhlIHJlc3VsdCBhcnJheVxyXG5cdFx0bGV0IHJlc3VsdCA9IFtdO1xyXG5cdFx0aWYgKGNvbXBvbmVudHMpIHtcclxuXHRcdFx0Ly8gaXRlcmF0ZSBvdmVyIGNvbXBvbmVudHNcclxuXHRcdFx0Zm9yIChjb25zdCBjb21wb25lbnQgb2YgY29tcG9uZW50cykge1xyXG5cdFx0XHRcdC8vIGF2b2lkIHRoZSBlZGl0Z3JpZCBjb21wb25lbnQgb3QgaWYgaXQgaGFzIGEgZGlmZmVyZW50IGJlaGF2aW9yIGl0IHNob3VsZCBoYXZlIGFuIGVsc2Ugc3RhdGVtZW50XHJcblxyXG5cdFx0XHRcdC8vIGlmIGNvbXBvbmVudCBpcyBwYW5lbCB0aGVuIHRpdGxlUGFuZWwgdmFyaWFibGUgaXMgY2hhbmdlZCwgYW5kIGl0IGlzIGdvbm5hIGJlIGluaGVyaXRlZFxyXG5cdFx0XHRcdGlmIChjb21wb25lbnRbRUZvcm1pb0tleS5UWVBFXSA9PT0gRUZvcm1pb0tleS5QQU5FTCkge1xyXG5cdFx0XHRcdFx0dGl0bGVQYW5lbCA9IGNvbXBvbmVudFtFRm9ybWlvS2V5LlRJVExFXTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdCh0eXBlb2YgY29tcG9uZW50W0VGb3JtaW9LZXkuQ09NUE9ORU5UU10gIT09ICd1bmRlZmluZWQnIHx8XHJcblx0XHRcdFx0XHRcdHR5cGVvZiBjb21wb25lbnRbRUZvcm1pb0tleS5DT0xVTU5TXSAhPT0gJ3VuZGVmaW5lZCcpICYmXHJcblx0XHRcdFx0XHQodHlwZW9mIGNvbXBvbmVudFtFRm9ybWlvS2V5LlRZUEVdID09ICd1bmRlZmluZWQnIHx8XHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LlRZUEVdICE9PSBFRm9ybWlvS2V5LlRZUEVfQUREUkVTUylcclxuXHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdC8vIHJlc29sdmUgY29uZGl0aW9uYWwgcGFyZW50IGNvbmRpdGlvbmFsXHJcblx0XHRcdFx0XHRjb25zdCBjb25kaXRpb25hbCA9IHRoaXMucmVzb2x2ZUluaGVyaXRhbmNlQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsUGFyZW50LFxyXG5cdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5DT05ESVRJT05BTF0sXHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LkNVU1RPTV9DT05ESVRJT05BTF0sXHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LklEXVxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdC8vIGNoYW5nZSBjb25kaXRpb25cclxuXHRcdFx0XHRcdGlmIChjb25kaXRpb25hbCkgY29uZGl0aW9uYWxQYXJlbnQgPSBjb25kaXRpb25hbDtcclxuXHRcdFx0XHRcdC8vIGl0IGNvbnRhaW5zIHRoZSBzdWJjb21wb25lbnRzIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgY29tcG9uZW50IGlmIGl0IGhhcyBjb21wb25lbnRzIG9yIGNvbHVtbnNcclxuXHRcdFx0XHRcdGxldCBzdWJDb21wb25lbnRzID1cclxuXHRcdFx0XHRcdFx0dHlwZW9mIGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTVBPTkVOVFNdICE9PSAndW5kZWZpbmVkJ1xyXG5cdFx0XHRcdFx0XHRcdD8gY29tcG9uZW50W0VGb3JtaW9LZXkuQ09NUE9ORU5UU11cclxuXHRcdFx0XHRcdFx0XHQ6IGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTFVNTlNdO1xyXG5cclxuXHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuVFlQRV0gPT09IEVGb3JtaW9LZXkuRURJVEdSSUQgJiZcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50WydrZXknXSA9PSBlZGl0R3JpZE5hbWVcclxuXHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRleGlzdEVkaXRHcmlkID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHRcdCh0eXBlb2YgY29tcG9uZW50W0VGb3JtaW9LZXkuQ09NUE9ORU5UU10gIT09ICd1bmRlZmluZWQnIHx8XHJcblx0XHRcdFx0XHRcdFx0XHR0eXBlb2YgY29tcG9uZW50W0VGb3JtaW9LZXkuQ09MVU1OU10gIT09ICd1bmRlZmluZWQnKSAmJlxyXG5cdFx0XHRcdFx0XHRcdCh0eXBlb2YgY29tcG9uZW50W0VGb3JtaW9LZXkuVFlQRV0gPT0gJ3VuZGVmaW5lZCcgfHxcclxuXHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LlRZUEVdICE9PSBFRm9ybWlvS2V5LlRZUEVfQUREUkVTUylcclxuXHRcdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdFx0Ly8gcmVzb2x2ZSBjb25kaXRpb25hbCBwYXJlbnQgY29uZGl0aW9uYWxcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBjb25kaXRpb25hbCA9IHRoaXMucmVzb2x2ZUluaGVyaXRhbmNlQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdFx0XHRjb25kaXRpb25hbFBhcmVudCxcclxuXHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTkRJVElPTkFMXSxcclxuXHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LkNVU1RPTV9DT05ESVRJT05BTF0sXHJcblx0XHRcdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5JRF1cclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdC8vIGNoYW5nZSBjb25kaXRpb25cclxuXHRcdFx0XHRcdFx0XHRpZiAoY29uZGl0aW9uYWwpIGNvbmRpdGlvbmFsUGFyZW50ID0gY29uZGl0aW9uYWw7XHJcblx0XHRcdFx0XHRcdFx0Ly8gaXQgY29udGFpbnMgdGhlIHN1YmNvbXBvbmVudHMgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBjb21wb25lbnQgaWYgaXQgaGFzIGNvbXBvbmVudHMgb3IgY29sdW1uc1xyXG5cdFx0XHRcdFx0XHRcdGxldCBzdWJDb21wb25lbnRzID1cclxuXHRcdFx0XHRcdFx0XHRcdHR5cGVvZiBjb21wb25lbnRbRUZvcm1pb0tleS5DT01QT05FTlRTXSAhPT0gJ3VuZGVmaW5lZCdcclxuXHRcdFx0XHRcdFx0XHRcdFx0PyBjb21wb25lbnRbRUZvcm1pb0tleS5DT01QT05FTlRTXVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ6IGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTFVNTlNdO1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvLyBpZiBjb21wb25lbnQgaGFzIHN1YkNvbXBvbmVudHMsIHRoZW4gZXhlY3V0ZSB0aGUgcmVjdXJzaW9uIGZ1bmN0aW9uIHRvIGdldCB0aGUgcmVjdXJzaW9ublJlc3VsdFxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IHJlY3Vyc2lvblJlc3VsdCA9XHJcblx0XHRcdFx0XHRcdFx0XHRGb3JtaW9VdGlsLmdldENvbXBvbmVudHNCeVJlY3Vyc2lvbkludG9FZGl0R3JpZHMoXHJcblx0XHRcdFx0XHRcdFx0XHRcdHN1YkNvbXBvbmVudHMsXHJcblx0XHRcdFx0XHRcdFx0XHRcdHRpdGxlUGFuZWwsXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsUGFyZW50LFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRlZGl0R3JpZE5hbWUsXHJcblx0XHRcdFx0XHRcdFx0XHRcdGV4aXN0RWRpdEdyaWRcclxuXHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0Ly8gaWYgcmVjdXJzaW9uIHJlc3VsdCB0aGVuIHJlc3VsdCBjb25jYXRzIHRoZSByZWN1cnNpb25SZXN1bHRcclxuXHRcdFx0XHRcdFx0XHRpZiAocmVjdXJzaW9uUmVzdWx0KSByZXN1bHQgPSByZXN1bHQuY29uY2F0KHJlY3Vyc2lvblJlc3VsdCk7XHJcblx0XHRcdFx0XHRcdFx0Ly8gcmVzZXQgY29uZGl0aW9uYWwgUGFyZW50XHJcblx0XHRcdFx0XHRcdFx0aWYgKGNvbXBvbmVudCAmJiBjb25kaXRpb25hbFBhcmVudCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGNvbXBvbmVudFtFRm9ybWlvS2V5LklEXSA9PSBjb25kaXRpb25hbFBhcmVudC5pZClcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxQYXJlbnQgPSB1bmRlZmluZWQ7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdC8vIGF2b2lkIHRoZSBjb21wb25lbnQgdHlwZSBidXR0b25cclxuXHRcdFx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5UWVBFXSAhPT0gRUZvcm1pb0tleS5CVVRUT04gJiZcclxuXHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LktFWV0gJiZcclxuXHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LkxBQkVMXSAmJlxyXG5cdFx0XHRcdFx0XHRcdFx0ZXhpc3RFZGl0R3JpZFxyXG5cdFx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gcmVzb2x2ZSBjb25kaXRpb25hbCBjb25kaXRpb25hbCBvYmplY3RcclxuXHRcdFx0XHRcdFx0XHRcdGxldCBjb25kaXRpb25hbCA9IHRoaXMucmVzb2x2ZUluaGVyaXRhbmNlQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsUGFyZW50LFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5DT05ESVRJT05BTF0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LkNVU1RPTV9DT05ESVRJT05BTF0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LklEXVxyXG5cdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHRcdGlmICghY29uZGl0aW9uYWwpIGNvbmRpdGlvbmFsID0gY29uZGl0aW9uYWxQYXJlbnQ7XHJcblx0XHRcdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5DT05ESVRJT05BTF0gPVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb25kaXRpb25hbFtFRm9ybWlvS2V5LkNPTkRJVElPTkFMXTtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LkNVU1RPTV9DT05ESVRJT05BTF0gPVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb25kaXRpb25hbFtFRm9ybWlvS2V5LkNVU1RPTV9DT05ESVRJT05BTF07XHJcblx0XHRcdFx0XHRcdFx0XHQvLyBhZGQgbmFtUGFuZWwgYXMgcHJvcGVydHlcclxuXHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LlRJVExFX1BBTkVMXSA9IHRpdGxlUGFuZWw7XHJcblx0XHRcdFx0XHRcdFx0XHQvLyBhZGQgY29tcG9uZW50IHRvIHRoZSByZXN1bHRcclxuXHRcdFx0XHRcdFx0XHRcdHJlc3VsdC5wdXNoKGNvbXBvbmVudCk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHQvLyBpZiBjb21wb25lbnQgaGFzIHN1YkNvbXBvbmVudHMsIHRoZW4gZXhlY3V0ZSB0aGUgcmVjdXJzaW9uIGZ1bmN0aW9uIHRvIGdldCB0aGUgcmVjdXJzaW9ublJlc3VsdFxyXG5cdFx0XHRcdFx0Y29uc3QgcmVjdXJzaW9uUmVzdWx0ID0gRm9ybWlvVXRpbC5nZXRDb21wb25lbnRzQnlSZWN1cnNpb25JbnRvRWRpdEdyaWRzKFxyXG5cdFx0XHRcdFx0XHRzdWJDb21wb25lbnRzLFxyXG5cdFx0XHRcdFx0XHR0aXRsZVBhbmVsLFxyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25hbFBhcmVudCxcclxuXHRcdFx0XHRcdFx0ZWRpdEdyaWROYW1lLFxyXG5cdFx0XHRcdFx0XHRleGlzdEVkaXRHcmlkXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0Ly8gaWYgcmVjdXJzaW9uIHJlc3VsdCB0aGVuIHJlc3VsdCBjb25jYXRzIHRoZSByZWN1cnNpb25SZXN1bHRcclxuXHRcdFx0XHRcdGlmIChyZWN1cnNpb25SZXN1bHQpIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQocmVjdXJzaW9uUmVzdWx0KTtcclxuXHRcdFx0XHRcdC8vIHJlc2V0IGNvbmRpdGlvbmFsIFBhcmVudFxyXG5cdFx0XHRcdFx0aWYgKGNvbXBvbmVudCAmJiBjb25kaXRpb25hbFBhcmVudCkge1xyXG5cdFx0XHRcdFx0XHRpZiAoY29tcG9uZW50W0VGb3JtaW9LZXkuSURdID09IGNvbmRpdGlvbmFsUGFyZW50LmlkKVxyXG5cdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsUGFyZW50ID0gdW5kZWZpbmVkO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQvLyBhdm9pZCB0aGUgY29tcG9uZW50IHR5cGUgYnV0dG9uXHJcblx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LlRZUEVdICE9PSBFRm9ybWlvS2V5LkJVVFRPTiAmJlxyXG5cdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5LRVldICYmXHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LkxBQkVMXSAmJlxyXG5cdFx0XHRcdFx0XHRleGlzdEVkaXRHcmlkXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0Ly8gcmVzb2x2ZSBjb25kaXRpb25hbCBjb25kaXRpb25hbCBvYmplY3RcclxuXHRcdFx0XHRcdFx0bGV0IGNvbmRpdGlvbmFsID0gdGhpcy5yZXNvbHZlSW5oZXJpdGFuY2VDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0XHRjb25kaXRpb25hbFBhcmVudCxcclxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5DT05ESVRJT05BTF0sXHJcblx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ1VTVE9NX0NPTkRJVElPTkFMXSxcclxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5JRF1cclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0aWYgKCFjb25kaXRpb25hbCkgY29uZGl0aW9uYWwgPSBjb25kaXRpb25hbFBhcmVudDtcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ09ORElUSU9OQUxdID0gY29uZGl0aW9uYWxbRUZvcm1pb0tleS5DT05ESVRJT05BTF07XHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LkNVU1RPTV9DT05ESVRJT05BTF0gPVxyXG5cdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsW0VGb3JtaW9LZXkuQ1VTVE9NX0NPTkRJVElPTkFMXTtcclxuXHRcdFx0XHRcdFx0Ly8gYWRkIG5hbVBhbmVsIGFzIHByb3BlcnR5XHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LlRJVExFX1BBTkVMXSA9IHRpdGxlUGFuZWw7XHJcblx0XHRcdFx0XHRcdC8vIGFkZCBjb21wb25lbnQgdG8gdGhlIHJlc3VsdFxyXG5cdFx0XHRcdFx0XHRyZXN1bHQucHVzaChjb21wb25lbnQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZSAyIGphc29uIG9iamVjdHMgb2YgZGF0YSBmb3JtIGJ5IGNvbXBvbmVudCBrZXkgYW5kIG90aGVyIGJ5IGNvbXBvbmVudCBrZXkgYW5kIHRpdGxlIGZvcm0ga2V5XHJcblx0ICogQHBhcmFtIGRhdGFGb3JtIGRhdGFGb3JtIG1vZGVsIG9iamVjdFxyXG5cdCAqIEByZXR1cm5zIE9iamVjdCBvZiAyIGVsZW1lbnRcclxuXHQgKi9cclxuXHRzdGF0aWMgY3JlYXRlTGlzdERhdGFCeURhdGFGb3JtTGlzdChkYXRhRm9ybTogYW55LCBsaXN0Rm9ybTogYW55W10pOiBhbnkge1xyXG5cdFx0bGV0IGxpc3REYXRhOiBhbnkgPSB7fTtcclxuXHRcdGxldCBsaXN0RGF0YUJ5Rm9ybTogYW55ID0ge307XHJcblx0XHRpZiAoZGF0YUZvcm0gJiYgZGF0YUZvcm0ubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRsaXN0RGF0YSA9IHt9O1xyXG5cdFx0XHRsaXN0RGF0YUJ5Rm9ybSA9IHt9O1xyXG5cdFx0XHRsZXQgZEZvcm06IGFueTtcclxuXHRcdFx0Zm9yIChkRm9ybSBvZiBkYXRhRm9ybSkge1xyXG5cdFx0XHRcdGlmICghZEZvcm0uZGF0YSkge1xyXG5cdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGNvbnN0IGZvcm0gPSBsaXN0Rm9ybS5maW5kKGZ1bmN0aW9uIChmb3JtVG1wKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gZm9ybVRtcC5pZCA9PSBkRm9ybS5mb3JtSWQ7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0aWYgKCFmb3JtKSB7XHJcblx0XHRcdFx0XHQvL2NvbnNvbGUuZXJyb3IoJ05vIHNlIGVuY29udHLDsyBlbCBmb3JtdWxhcmlvIGNvbiBpZCAnICsgZEZvcm0uZm9ybUlkKTtcclxuXHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRjb25zdCBrZXlGb3JtVGl0bGUgPSBUb2tlblNlcnZpY2UuZ2V0S2V5Rm9ybXVsYXJpbyhmb3JtLnRpdGxlKSArICdfJztcclxuXHRcdFx0XHRmb3IgKGNvbnN0IGtleSBpbiBkRm9ybS5kYXRhKSB7XHJcblx0XHRcdFx0XHRsaXN0RGF0YVtrZXldID0gZEZvcm0uZGF0YVtrZXldO1xyXG5cdFx0XHRcdFx0bGlzdERhdGFCeUZvcm1ba2V5Rm9ybVRpdGxlICsga2V5XSA9IGRGb3JtLmRhdGFba2V5XTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiB7XHJcblx0XHRcdGxpc3REYXRhOiBsaXN0RGF0YSxcclxuXHRcdFx0bGlzdERhdGFCeUZvcm06IGxpc3REYXRhQnlGb3JtXHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSXQgcmV0dXJucyB0aGUgY29tcG9uZW50c1xyXG5cdCAqIEBwYXJhbSBjb21wb25lbnRzXHJcblx0ICovXHJcblx0c3RhdGljIGdldFBhbmVsQ29tcG9uZW50cyhjb21wb25lbnRzOiBhbnlbXSk6IGFueVtdIHtcclxuXHRcdHJldHVybiBGb3JtaW9VdGlsLmdldENvbXBvbmVudHNCeVBhbmVsKGNvbXBvbmVudHMpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSXQgcmV0dXJucyB0aGUgY29tcG9uZW50cyBhcnJheSBvZiB0aGUgZm9ybVxyXG5cdCAqIEBwYXJhbSBjb21wb25lbnRzIGFycmF5IG9mIGNvbXBvbmVudHNcclxuXHQgKi9cclxuXHRwcml2YXRlIHN0YXRpYyBnZXRDb21wb25lbnRzQnlQYW5lbChjb21wb25lbnRzOiBhbnlbXSk6IGFueVtdIHtcclxuXHRcdC8vIGl0IGNvbnRhaW5zIHRoZSByZXN1bHQgYXJyYXlcclxuXHRcdGxldCByZXN1bHQgPSBbXTtcclxuXHRcdGlmIChjb21wb25lbnRzKSB7XHJcblx0XHRcdC8vIGl0ZXJhdGUgb3ZlciBjb21wb25lbnRzXHJcblx0XHRcdGZvciAoY29uc3QgY29tcG9uZW50IG9mIGNvbXBvbmVudHMpIHtcclxuXHRcdFx0XHQvLyBhdm9pZCB0aGUgZWRpdGdyaWQgY29tcG9uZW50IG90IGlmIGl0IGhhcyBhIGRpZmZlcmVudCBiZWhhdmlvciBpdCBzaG91bGQgaGF2ZSBhbiBlbHNlIHN0YXRlbWVudFxyXG5cdFx0XHRcdGlmIChjb21wb25lbnRbRUZvcm1pb0tleS5UWVBFXSAhPT0gRUZvcm1pb0tleS5FRElUR1JJRCkge1xyXG5cdFx0XHRcdFx0Ly8gaWYgY29tcG9uZW50IGlzIHBhbmVsIHRoZW4gdGl0bGVQYW5lbCB2YXJpYWJsZSBpcyBjaGFuZ2VkLCBhbmQgaXQgaXMgZ29ubmEgYmUgaW5oZXJpdGVkXHJcblx0XHRcdFx0XHRpZiAoY29tcG9uZW50W0VGb3JtaW9LZXkuVFlQRV0gPT09IEVGb3JtaW9LZXkuUEFORUwpIHtcclxuXHRcdFx0XHRcdFx0cmVzdWx0LnB1c2goY29tcG9uZW50KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG59XHJcbiJdfQ==