ng-pli-commons 1.0.13 → 1.0.14-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. package/fesm2022/ng-pli-commons.mjs +1401 -827
  2. package/fesm2022/ng-pli-commons.mjs.map +1 -1
  3. package/lib/components/pdf-generator/pdf-generator.component.d.ts +3 -16
  4. package/lib/components/pdf-visualizer/pdf-visualizer.component.d.ts +2 -0
  5. package/lib/components/token/token.component.d.ts +7 -2
  6. package/lib/ng-pli-commons.module.d.ts +12 -13
  7. package/lib/services/application-pdf-form.service.d.ts +14 -0
  8. package/lib/services/application.service.d.ts +3 -1
  9. package/lib/services/budget-setup.service.d.ts +12 -0
  10. package/lib/services/budget-simulation.service.d.ts +2 -0
  11. package/lib/services/codebtors.service.d.ts +14 -0
  12. package/lib/services/committee-assistant.service.d.ts +19 -0
  13. package/lib/services/correspondence-manager.service.d.ts +1 -0
  14. package/lib/services/document-process.service.d.ts +12 -0
  15. package/lib/services/document.service.d.ts +5 -4
  16. package/lib/services/guarantees-summary-service.d.ts +13 -0
  17. package/lib/services/import-excel-gic.service.d.ts +2 -0
  18. package/lib/services/maintenance.service.d.ts +4 -0
  19. package/lib/services/master-university.service.d.ts +7 -0
  20. package/lib/services/openkm-document.service.d.ts +11 -0
  21. package/lib/services/pli-cnf-committee.service.d.ts +2 -0
  22. package/lib/services/pli-cnf-evaluation-task-template.service.d.ts +20 -0
  23. package/lib/services/pli-cnf-installment-simulator-config.service.d.ts +16 -0
  24. package/lib/services/post-selection.service.d.ts +11 -0
  25. package/lib/services/registry-identifier.service.d.ts +2 -1
  26. package/lib/services/send-application.service.d.ts +1 -0
  27. package/lib/services/status.service.d.ts +1 -0
  28. package/lib/services/tag-management.service.d.ts +23 -0
  29. package/lib/services/token.service.d.ts +1 -0
  30. package/lib/services/visualization-committee.service.d.ts +5 -4
  31. package/package.json +3 -6
  32. package/public-api.d.ts +11 -0
  33. package/version.d.ts +1 -1
  34. package/esm2022/lib/components/backoffice.commons.component.mjs +0 -40
  35. package/esm2022/lib/components/common.lists.component.mjs +0 -176
  36. package/esm2022/lib/components/configuration-token/configuration-token-subject.service.mjs +0 -23
  37. package/esm2022/lib/components/configuration-token/configuration-token.component.mjs +0 -665
  38. package/esm2022/lib/components/configuration-token/guarantee-token/guarantee-token.component.mjs +0 -103
  39. package/esm2022/lib/components/configuration-token/snapshot-token/snapshot-token.component.mjs +0 -108
  40. package/esm2022/lib/components/configuration.commons.component.mjs +0 -40
  41. package/esm2022/lib/components/dashboard.commons.component.mjs +0 -84
  42. package/esm2022/lib/components/dynamic-filter/dynamic-filter.component.mjs +0 -131
  43. package/esm2022/lib/components/excel-to-json/excel-to-json.component.mjs +0 -54
  44. package/esm2022/lib/components/frontoffice.commons.component.mjs +0 -88
  45. package/esm2022/lib/components/pdf-analyzer/pdf-analyzer.component.mjs +0 -162
  46. package/esm2022/lib/components/pdf-config/pdf-config.component.mjs +0 -170
  47. package/esm2022/lib/components/pdf-generator/pdf-generator.component.mjs +0 -223
  48. package/esm2022/lib/components/pdf-merge-visualizer/pdf-merge-visualizer.component.mjs +0 -307
  49. package/esm2022/lib/components/pdf-visualizer/pdf-visualizer.component.mjs +0 -387
  50. package/esm2022/lib/components/progress-bar/progress-bar.component.mjs +0 -92
  51. package/esm2022/lib/components/segmentation-tokens/segmentation-tokens.component.mjs +0 -199
  52. package/esm2022/lib/components/select-ppp/select-ppp.component.mjs +0 -199
  53. package/esm2022/lib/components/show-hide-columns/show-hide-columns-table.component.mjs +0 -116
  54. package/esm2022/lib/components/token/token.component.mjs +0 -1026
  55. package/esm2022/lib/components/tokens-calculator/tokens-calculator.component.mjs +0 -128
  56. package/esm2022/lib/directives/currency-colfuturo-formatter.directive.mjs +0 -47
  57. package/esm2022/lib/directives/currency-decimal-colfuturo-formatter.directive.mjs +0 -34
  58. package/esm2022/lib/ng-pli-commons.module.mjs +0 -389
  59. package/esm2022/lib/ng-pli-commons.service.mjs +0 -14
  60. package/esm2022/lib/pipes/currency-colfuturo.pipe.mjs +0 -35
  61. package/esm2022/lib/pipes/currency-decimal-colfuturo.pipe.mjs +0 -36
  62. package/esm2022/lib/pipes/currency-print-colfuturo.pipe.mjs +0 -33
  63. package/esm2022/lib/pipes/thousands.pipe.mjs +0 -60
  64. package/esm2022/lib/services/application-fill-percentage.service.mjs +0 -30
  65. package/esm2022/lib/services/application-tag.service.mjs +0 -56
  66. package/esm2022/lib/services/application.service.mjs +0 -247
  67. package/esm2022/lib/services/assign-task.service.mjs +0 -30
  68. package/esm2022/lib/services/authentication.service.mjs +0 -133
  69. package/esm2022/lib/services/blocked-beneficiary.service.mjs +0 -42
  70. package/esm2022/lib/services/budget-application.service.mjs +0 -265
  71. package/esm2022/lib/services/budget-simulation.service.mjs +0 -61
  72. package/esm2022/lib/services/budget.service.mjs +0 -205
  73. package/esm2022/lib/services/closure-wallet.service.mjs +0 -39
  74. package/esm2022/lib/services/cnf-correspondence-document-manager.service.mjs +0 -39
  75. package/esm2022/lib/services/committee-money.service.mjs +0 -44
  76. package/esm2022/lib/services/committee-pdf.service.mjs +0 -27
  77. package/esm2022/lib/services/committee-snapshot.service.mjs +0 -60
  78. package/esm2022/lib/services/common-info.service.mjs +0 -51
  79. package/esm2022/lib/services/common.service.mjs +0 -285
  80. package/esm2022/lib/services/configuration-document.service.mjs +0 -297
  81. package/esm2022/lib/services/configuration-minisite.service.mjs +0 -26
  82. package/esm2022/lib/services/configuration.service.mjs +0 -53
  83. package/esm2022/lib/services/correspondence-document-category.service.mjs +0 -31
  84. package/esm2022/lib/services/correspondence-manager.service.mjs +0 -67
  85. package/esm2022/lib/services/credit-score.service.mjs +0 -48
  86. package/esm2022/lib/services/credit-study.service.mjs +0 -292
  87. package/esm2022/lib/services/cube.service.mjs +0 -27
  88. package/esm2022/lib/services/data-form-history.service.mjs +0 -25
  89. package/esm2022/lib/services/data-form.service.mjs +0 -176
  90. package/esm2022/lib/services/data-letter-segmentation.service.mjs +0 -64
  91. package/esm2022/lib/services/document-analysis-auto.service.mjs +0 -27
  92. package/esm2022/lib/services/document-history.service.mjs +0 -43
  93. package/esm2022/lib/services/document-management.service.mjs +0 -57
  94. package/esm2022/lib/services/document-validation-attempt.service.mjs +0 -32
  95. package/esm2022/lib/services/document.service.mjs +0 -131
  96. package/esm2022/lib/services/documentary.type.service.mjs +0 -69
  97. package/esm2022/lib/services/email.service.mjs +0 -30
  98. package/esm2022/lib/services/evaluation.service.mjs +0 -181
  99. package/esm2022/lib/services/export-excel.service.mjs +0 -32
  100. package/esm2022/lib/services/file.service.mjs +0 -153
  101. package/esm2022/lib/services/form.service.mjs +0 -112
  102. package/esm2022/lib/services/gic-client-disbursement-metadata.service.mjs +0 -31
  103. package/esm2022/lib/services/gic-client.service.mjs +0 -49
  104. package/esm2022/lib/services/gic-cnf-bankvision-transaction.service.mjs +0 -31
  105. package/esm2022/lib/services/gic-cnf-closing-date.service.mjs +0 -34
  106. package/esm2022/lib/services/gic-cnf-maintenance.service.mjs +0 -30
  107. package/esm2022/lib/services/gic-collection.service.mjs +0 -53
  108. package/esm2022/lib/services/gic-disbursement.service.mjs +0 -39
  109. package/esm2022/lib/services/gic-extract.service.mjs +0 -41
  110. package/esm2022/lib/services/gic-log.service.mjs +0 -41
  111. package/esm2022/lib/services/gic-payment-application.service.mjs +0 -35
  112. package/esm2022/lib/services/gic-payment-plan-cube.service.mjs +0 -27
  113. package/esm2022/lib/services/gic-payment-plan.service.mjs +0 -32
  114. package/esm2022/lib/services/gic-trm.service.mjs +0 -27
  115. package/esm2022/lib/services/global.show.task.service.mjs +0 -37
  116. package/esm2022/lib/services/guarantee-document.service.mjs +0 -52
  117. package/esm2022/lib/services/guarantee-enrollment.service.mjs +0 -37
  118. package/esm2022/lib/services/guarantee.service.mjs +0 -128
  119. package/esm2022/lib/services/hash.service.mjs +0 -36
  120. package/esm2022/lib/services/import-data.service.mjs +0 -27
  121. package/esm2022/lib/services/import-excel-gic.service.mjs +0 -45
  122. package/esm2022/lib/services/initial-configuration-gic-parameters.service.mjs +0 -51
  123. package/esm2022/lib/services/initial-record.service.mjs +0 -51
  124. package/esm2022/lib/services/integration-ado.service.mjs +0 -54
  125. package/esm2022/lib/services/interaction-application-user.service.mjs +0 -81
  126. package/esm2022/lib/services/interest-adjustment.service.mjs +0 -34
  127. package/esm2022/lib/services/keys-assignation.service.mjs +0 -127
  128. package/esm2022/lib/services/legalization.service.mjs +0 -150
  129. package/esm2022/lib/services/letter-campaing.service.mjs +0 -49
  130. package/esm2022/lib/services/letter-task-mapping.service.mjs +0 -40
  131. package/esm2022/lib/services/log.service.mjs +0 -41
  132. package/esm2022/lib/services/maintenance.service.mjs +0 -66
  133. package/esm2022/lib/services/master-category.service.mjs +0 -66
  134. package/esm2022/lib/services/master-program.service.mjs +0 -78
  135. package/esm2022/lib/services/master-university.service.mjs +0 -68
  136. package/esm2022/lib/services/migration-plis.service.mjs +0 -27
  137. package/esm2022/lib/services/migration-survey-queue.service.mjs +0 -24
  138. package/esm2022/lib/services/page.service.mjs +0 -38
  139. package/esm2022/lib/services/partner-system.service.mjs +0 -30
  140. package/esm2022/lib/services/partner.service.mjs +0 -34
  141. package/esm2022/lib/services/pdf-analyzer.service.mjs +0 -33
  142. package/esm2022/lib/services/people-master.service.mjs +0 -42
  143. package/esm2022/lib/services/permission.service.mjs +0 -29
  144. package/esm2022/lib/services/pli-cnf-acuity-fields.service.mjs +0 -34
  145. package/esm2022/lib/services/pli-cnf-app-card-filter.service.mjs +0 -40
  146. package/esm2022/lib/services/pli-cnf-appointment-type.service.mjs +0 -41
  147. package/esm2022/lib/services/pli-cnf-budget-program-type.service.mjs +0 -54
  148. package/esm2022/lib/services/pli-cnf-budget.service.mjs +0 -31
  149. package/esm2022/lib/services/pli-cnf-cloning.service.mjs +0 -27
  150. package/esm2022/lib/services/pli-cnf-committee-pdf-config-table-config.service.mjs +0 -47
  151. package/esm2022/lib/services/pli-cnf-committee-pdf-gen-status.service.mjs +0 -30
  152. package/esm2022/lib/services/pli-cnf-committee-valpro-columns.service.mjs +0 -42
  153. package/esm2022/lib/services/pli-cnf-committee-visualization-mode.service.mjs +0 -42
  154. package/esm2022/lib/services/pli-cnf-committee.service.mjs +0 -51
  155. package/esm2022/lib/services/pli-cnf-config-minisite.service.mjs +0 -90
  156. package/esm2022/lib/services/pli-cnf-configuration-credit-study.service.mjs +0 -41
  157. package/esm2022/lib/services/pli-cnf-document-management.service.mjs +0 -40
  158. package/esm2022/lib/services/pli-cnf-dynamic-keys-assign.service.mjs +0 -52
  159. package/esm2022/lib/services/pli-cnf-evaluation-task-mailing.service.mjs +0 -31
  160. package/esm2022/lib/services/pli-cnf-evaluation-task.service.mjs +0 -112
  161. package/esm2022/lib/services/pli-cnf-evaluation-template.service.mjs +0 -95
  162. package/esm2022/lib/services/pli-cnf-form-edit.service.mjs +0 -68
  163. package/esm2022/lib/services/pli-cnf-form-multiaplicacion.service.mjs +0 -46
  164. package/esm2022/lib/services/pli-cnf-guarantee-documents-template.service.mjs +0 -40
  165. package/esm2022/lib/services/pli-cnf-guarantee-token.service.mjs +0 -42
  166. package/esm2022/lib/services/pli-cnf-header.service.mjs +0 -39
  167. package/esm2022/lib/services/pli-cnf-indicator.service.mjs +0 -39
  168. package/esm2022/lib/services/pli-cnf-information-system.service.mjs +0 -24
  169. package/esm2022/lib/services/pli-cnf-interaction.service.mjs +0 -78
  170. package/esm2022/lib/services/pli-cnf-letter-template-type.service.mjs +0 -29
  171. package/esm2022/lib/services/pli-cnf-letter-template.service.mjs +0 -48
  172. package/esm2022/lib/services/pli-cnf-look-and-feel.service.mjs +0 -28
  173. package/esm2022/lib/services/pli-cnf-mail.service.mjs +0 -30
  174. package/esm2022/lib/services/pli-cnf-menu-form.service.mjs +0 -34
  175. package/esm2022/lib/services/pli-cnf-migration-plis-field-budget.service.mjs +0 -34
  176. package/esm2022/lib/services/pli-cnf-migration-plis-field.service.mjs +0 -47
  177. package/esm2022/lib/services/pli-cnf-migration-status-plis.service.mjs +0 -44
  178. package/esm2022/lib/services/pli-cnf-page-section-form.service.mjs +0 -66
  179. package/esm2022/lib/services/pli-cnf-page-sub-process.service.mjs +0 -25
  180. package/esm2022/lib/services/pli-cnf-pdfs.service.mjs +0 -31
  181. package/esm2022/lib/services/pli-cnf-profile-form.service.mjs +0 -40
  182. package/esm2022/lib/services/pli-cnf-profile-user.service.mjs +0 -49
  183. package/esm2022/lib/services/pli-cnf-project-summary.service.mjs +0 -39
  184. package/esm2022/lib/services/pli-cnf-scenario.service.mjs +0 -47
  185. package/esm2022/lib/services/pli-cnf-segmentation.service.mjs +0 -72
  186. package/esm2022/lib/services/pli-cnf-snapshot-token.service.mjs +0 -42
  187. package/esm2022/lib/services/pli-cnf-status-flow-interaction.service.mjs +0 -74
  188. package/esm2022/lib/services/pli-cnf-status-flow.service.mjs +0 -56
  189. package/esm2022/lib/services/pli-cnf-support-document-category.service.mjs +0 -47
  190. package/esm2022/lib/services/pli-cnf-support-document.service.mjs +0 -56
  191. package/esm2022/lib/services/pli-cnf-survey-document.service.mjs +0 -37
  192. package/esm2022/lib/services/pli-cnf-survey-pdf.service.mjs +0 -34
  193. package/esm2022/lib/services/pli-cnf-survey.service.mjs +0 -46
  194. package/esm2022/lib/services/pli-cnf-task-group.service.mjs +0 -33
  195. package/esm2022/lib/services/pli-cnf-text-category.service.mjs +0 -38
  196. package/esm2022/lib/services/pli-cnf-text-option.service.mjs +0 -39
  197. package/esm2022/lib/services/pli-cnf-text.service.mjs +0 -62
  198. package/esm2022/lib/services/pli-cnf-type-text.service.mjs +0 -45
  199. package/esm2022/lib/services/pli-cnf-university-article.service.mjs +0 -39
  200. package/esm2022/lib/services/pli-cnf-user-calendar.service.mjs +0 -36
  201. package/esm2022/lib/services/pli-cnf-user-workspace.service.mjs +0 -35
  202. package/esm2022/lib/services/pli-cnf-valpro-keys.service.mjs +0 -35
  203. package/esm2022/lib/services/pli-cnf-workspace-segmentation.service.mjs +0 -31
  204. package/esm2022/lib/services/pli-message-type.service.mjs +0 -40
  205. package/esm2022/lib/services/pli-multiple-value-filter.service.mjs +0 -39
  206. package/esm2022/lib/services/pli-promocion-username.service.mjs +0 -57
  207. package/esm2022/lib/services/pli-seg-action-user.service.mjs +0 -37
  208. package/esm2022/lib/services/pli-segmentation.service.mjs +0 -130
  209. package/esm2022/lib/services/pli-tag-assignment.service.mjs +0 -36
  210. package/esm2022/lib/services/pli-tag.service.mjs +0 -55
  211. package/esm2022/lib/services/pli-user.service.mjs +0 -51
  212. package/esm2022/lib/services/plis-beneficiario.service.mjs +0 -29
  213. package/esm2022/lib/services/plis-estatus-change.service.mjs +0 -30
  214. package/esm2022/lib/services/ppp.service.mjs +0 -360
  215. package/esm2022/lib/services/profile.service.mjs +0 -60
  216. package/esm2022/lib/services/progress-bar.service.mjs +0 -40
  217. package/esm2022/lib/services/promotion-score.service.mjs +0 -44
  218. package/esm2022/lib/services/registry-identifier.service.mjs +0 -39
  219. package/esm2022/lib/services/return-refund.service.mjs +0 -53
  220. package/esm2022/lib/services/segmentation-tokens.service.mjs +0 -43
  221. package/esm2022/lib/services/segmentation-user-service.service.mjs +0 -94
  222. package/esm2022/lib/services/segmentation.service.mjs +0 -31
  223. package/esm2022/lib/services/send-application.service.mjs +0 -484
  224. package/esm2022/lib/services/sesion-form.service.mjs +0 -31
  225. package/esm2022/lib/services/sesion.service.mjs +0 -48
  226. package/esm2022/lib/services/spinner.service.mjs +0 -16
  227. package/esm2022/lib/services/sponsorship-letter.service.mjs +0 -68
  228. package/esm2022/lib/services/status.service.mjs +0 -100
  229. package/esm2022/lib/services/summary-budget.service.mjs +0 -24
  230. package/esm2022/lib/services/survey-metadata.service.mjs +0 -28
  231. package/esm2022/lib/services/survey-queue.service.mjs +0 -24
  232. package/esm2022/lib/services/survey.service.mjs +0 -52
  233. package/esm2022/lib/services/tasa.cambio.service.mjs +0 -35
  234. package/esm2022/lib/services/token-transformation.service.mjs +0 -62
  235. package/esm2022/lib/services/token.service.mjs +0 -1429
  236. package/esm2022/lib/services/university.service.mjs +0 -50
  237. package/esm2022/lib/services/upload-documents.service.mjs +0 -60
  238. package/esm2022/lib/services/user.service.mjs +0 -28
  239. package/esm2022/lib/services/visualization-committee.service.mjs +0 -84
  240. package/esm2022/lib/utils/custom-validator.mjs +0 -95
  241. package/esm2022/lib/utils/form-util.mjs +0 -35
  242. package/esm2022/lib/utils/formio-util.mjs +0 -582
  243. package/esm2022/lib/utils/version-commons.mjs +0 -10
  244. package/esm2022/ng-pli-commons.mjs +0 -5
  245. package/esm2022/public-api.mjs +0 -216
  246. package/esm2022/version.mjs +0 -29
@@ -1,1026 +0,0 @@
1
- import { Component, Input, Output, EventEmitter } from '@angular/core';
2
- import { UtilString, ETipoPresupuesto, PliUsuario, AuthenticationUtil, DateUtil } from 'ng-pli-util';
3
- import { TokenService } from '../../services/token.service';
4
- import 'jquery';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/common";
7
- import * as i2 from "../../services/token.service";
8
- import * as i3 from "ngx-toastr";
9
- import * as i4 from "../../services/authentication.service";
10
- import * as i5 from "../../services/sesion.service";
11
- export class TokenComponent {
12
- constructor(currencyPipe, tokenService, toastrService, authenticationService, sesionService) {
13
- this.currencyPipe = currencyPipe;
14
- this.tokenService = tokenService;
15
- this.toastrService = toastrService;
16
- this.authenticationService = authenticationService;
17
- this.sesionService = sesionService;
18
- /** It notifies the html is generated*/
19
- this.onGenerate = new EventEmitter();
20
- /** It enables the visualization of destination */
21
- this.enableDestination = false;
22
- }
23
- ngOnInit() {
24
- this.lTokenCalculated = null;
25
- this.lFormFieldsToken = null;
26
- this.budgetDtoPrimary = null;
27
- this.budgetDtoSecundary = null;
28
- this.evaluation = null;
29
- }
30
- /** It manages the change of the every @Input */
31
- ngOnChanges(changes) {
32
- // Every time that input values change, call new verification code
33
- this.uniqueVerificationCode = null;
34
- const template = changes.template;
35
- const data = changes.data;
36
- if (template && template.currentValue) {
37
- this.template = template.currentValue;
38
- }
39
- if (data && data.currentValue) {
40
- this.data = data.currentValue;
41
- this.promCodigo = this.data.promCodigo;
42
- }
43
- if (this.data) {
44
- this.budgetDtoPrimary = this.data.budgetDtoPrimary ? this.data.budgetDtoPrimary : null;
45
- this.budgetDtoSecundary = this.data.budgetDtoSecundary
46
- ? this.data.budgetDtoSecundary
47
- : null;
48
- this.evaluation = this.data.evaluation;
49
- }
50
- if (this.data && this.template && this.promCodigo) {
51
- const self = this;
52
- setTimeout(() => {
53
- self.init();
54
- }, 300);
55
- }
56
- }
57
- /** It initializes the process of translation */
58
- init() {
59
- this.translateTokens(this.template, this.data.dataFormByForm);
60
- }
61
- translateCategory(categoryName) {
62
- const languageByDefault = 'en';
63
- // If don't find the lang, get in en.
64
- let categoryNameByDef = categoryName;
65
- if (categoryName && this.data.categories && this.data.idioma) {
66
- // If the locale select is es, this is the dafult category language
67
- if (this.data.idioma.locale === 'es') {
68
- return categoryName;
69
- }
70
- for (const category of this.data.categories) {
71
- if (category.listaRubroIdioma && category.rubRubro === categoryName) {
72
- for (const language of category.listaRubroIdioma) {
73
- if (language.rubiIdioma === this.data.idioma.locale) {
74
- return language.rubiTraduccion;
75
- }
76
- if (language.rubiIdioma === languageByDefault) {
77
- categoryNameByDef = language.rubiTraduccion;
78
- }
79
- }
80
- break;
81
- }
82
- }
83
- }
84
- return categoryNameByDef;
85
- }
86
- translateTokens(html, listData) {
87
- this.alreadyCallReplaceTokens = false;
88
- const lTokens = this.getListTokens(html);
89
- if (!lTokens || Object.keys(lTokens).length === 0) {
90
- this.template = html;
91
- }
92
- this.callListTokens(lTokens, html, listData);
93
- }
94
- callListTokens(lTokens, html, listData) {
95
- if (lTokens[TokenService.TOKEN_LABEL_CALCULATED] &&
96
- Object.keys(lTokens[TokenService.TOKEN_LABEL_CALCULATED]).length > 0) {
97
- if (this.lTokenCalculated) {
98
- this.validateListTokens(lTokens, html, listData);
99
- }
100
- else {
101
- this.tokenService.getListByPromCodigo(this.promCodigo).subscribe((lTokenCalculated) => {
102
- this.lTokenCalculated = lTokenCalculated;
103
- this.validateListTokens(lTokens, html, listData);
104
- }, (error) => {
105
- console.error('Error callListTokens -getListByPromCodigo', error);
106
- this.toastrService.error('Error generando carta');
107
- });
108
- }
109
- }
110
- else {
111
- this.validateListTokens(lTokens, html, listData);
112
- }
113
- if (lTokens[TokenService.TOKEN_LABEL_FORM] &&
114
- Object.keys(lTokens[TokenService.TOKEN_LABEL_FORM]).length > 0) {
115
- if (this.lFormFieldsToken) {
116
- this.validateListTokens(lTokens, html, listData);
117
- }
118
- else {
119
- this.tokenService.getFormFieldsByPromCode(this.promCodigo).then((lFormFieldsToken) => {
120
- this.lFormFieldsToken = lFormFieldsToken;
121
- this.validateListTokens(lTokens, html, listData);
122
- }, (error) => {
123
- console.error('Error callListTokens -getFormFieldsByPromCode', error);
124
- this.toastrService.error('Error generando carta');
125
- });
126
- }
127
- }
128
- else {
129
- this.validateListTokens(lTokens, html, listData);
130
- }
131
- if (lTokens[TokenService.TOKEN_LABEL_STATIC] &&
132
- Object.keys(lTokens[TokenService.TOKEN_LABEL_STATIC]).length > 0) {
133
- if (this.uniqueVerificationCode !== null) {
134
- this.validateListTokens(lTokens, html, listData);
135
- }
136
- else {
137
- const tokenVerificationCode = lTokens[TokenService.TOKEN_LABEL_STATIC].find((token) => {
138
- const subToken = token.key
139
- .replace('{', '')
140
- .replace('}', '')
141
- .split('_');
142
- return (subToken[1].toLowerCase() ==
143
- TokenService.STATIC_TOKENS_KEY_CODIGO_VERIFICACION.toLowerCase());
144
- });
145
- // Only if the static token is the unique verification code
146
- if (tokenVerificationCode && Object.keys(tokenVerificationCode).length > 0) {
147
- let pliUsuarioObject = AuthenticationUtil.getPliUsuario();
148
- if (!pliUsuarioObject) {
149
- this.uniqueVerificationCode = '';
150
- console.error('No se logro consultar el usuario para consultar el token', pliUsuarioObject);
151
- this.validateListTokens(lTokens, html, listData);
152
- }
153
- else {
154
- const pliUsuario = Object.assign(new PliUsuario(), JSON.parse(JSON.stringify(pliUsuarioObject)));
155
- this.authenticationService.getTokenByLogin(pliUsuario.usuLogin).subscribe((sesion) => {
156
- // Try to get the unique verification code with the default value of sesion if is not a valid value
157
- const sesionValue = sesion ? sesion.sesion : '1';
158
- this.getUniqueVerificationCode(pliUsuario.usuLogin, sesionValue, lTokens, html, listData);
159
- }, (error) => {
160
- console.error('Error consultando el login en PLIS, getTokenByLogin', error);
161
- // Try to get the unique verification code with the default value of sesion
162
- this.getUniqueVerificationCode(pliUsuario.usuLogin, '1', lTokens, html, listData);
163
- //this.toastrService.error("Error generando carta");
164
- });
165
- }
166
- }
167
- else {
168
- this.uniqueVerificationCode = '';
169
- this.validateListTokens(lTokens, html, listData);
170
- }
171
- }
172
- }
173
- else {
174
- this.validateListTokens(lTokens, html, listData);
175
- }
176
- }
177
- /**
178
- * Get the unique verification code and call validateListTokens method
179
- */
180
- getUniqueVerificationCode(usuLogin, sesion, lTokens, html, listData) {
181
- this.tokenService.getUniqueVerificationCode(usuLogin, sesion).subscribe((uniqueCodeValue) => {
182
- const uniqueCode = uniqueCodeValue.codigoUnico;
183
- this.uniqueVerificationCode =
184
- uniqueCode.substring(0, 4) + ' ' + uniqueCode.substring(4, 8);
185
- this.validateListTokens(lTokens, html, listData);
186
- }, (error) => {
187
- console.error('Error callListTokens -getListByPromCodigo', error);
188
- this.toastrService.error('Error generando carta');
189
- });
190
- }
191
- validateListTokens(lTokens, html, listData) {
192
- let finishLoadListForm = false;
193
- let finishLoadListCalculated = false;
194
- let finishLoadListStatic = false;
195
- const finishLoadListBudget = true;
196
- if (lTokens[TokenService.TOKEN_LABEL_FORM] &&
197
- lTokens[TokenService.TOKEN_LABEL_FORM].length > 0) {
198
- finishLoadListForm = this.lFormFieldsToken ? true : false;
199
- }
200
- else {
201
- finishLoadListForm = true;
202
- }
203
- if (lTokens[TokenService.TOKEN_LABEL_CALCULATED] &&
204
- lTokens[TokenService.TOKEN_LABEL_CALCULATED].length > 0) {
205
- finishLoadListCalculated = this.lTokenCalculated ? true : false;
206
- }
207
- else {
208
- finishLoadListCalculated = true;
209
- }
210
- if (lTokens[TokenService.TOKEN_LABEL_STATIC] &&
211
- lTokens[TokenService.TOKEN_LABEL_STATIC].length > 0) {
212
- finishLoadListStatic = this.uniqueVerificationCode !== null ? true : false;
213
- }
214
- else {
215
- finishLoadListStatic = true;
216
- }
217
- if (finishLoadListForm &&
218
- finishLoadListBudget &&
219
- finishLoadListStatic &&
220
- finishLoadListCalculated &&
221
- !this.alreadyCallReplaceTokens) {
222
- this.alreadyCallReplaceTokens = true;
223
- this.replaceTokensWithData(lTokens, html, listData);
224
- }
225
- }
226
- async replaceTokensWithData(lTokens, html, listData) {
227
- const lDataOrg = [];
228
- const lFormFieldsTokenOrg = [];
229
- if ((lTokens[TokenService.TOKEN_LABEL_FORM] ||
230
- lTokens[TokenService.TOKEN_LABEL_CALCULATED]) &&
231
- listData) {
232
- for (const dataForm in listData) {
233
- lDataOrg[dataForm.toLowerCase()] = listData[dataForm];
234
- }
235
- if (this.lFormFieldsToken) {
236
- for (const formFieldToken of this.lFormFieldsToken) {
237
- for (const valuesField of formFieldToken.value) {
238
- const keyToken = '${' + formFieldToken.title.key + '_' + valuesField.key + '}';
239
- lFormFieldsTokenOrg[keyToken] = valuesField;
240
- }
241
- }
242
- }
243
- }
244
- const lTokensCalculated = [];
245
- if (lTokens[TokenService.TOKEN_LABEL_CALCULATED]) {
246
- if (this.lTokenCalculated) {
247
- for (const tokenCal of this.lTokenCalculated) {
248
- lTokensCalculated[UtilString.replaceAccentSpacesOthers(tokenCal.name)] =
249
- tokenCal;
250
- }
251
- }
252
- }
253
- let typeToken;
254
- const tokenTypeTranslated = [];
255
- for (typeToken in lTokens) {
256
- if (!lTokens[typeToken]) {
257
- continue;
258
- }
259
- const tokensType = lTokens[typeToken];
260
- tokenTypeTranslated[typeToken] = [];
261
- for (const token of tokensType) {
262
- let tokenTranslated = null;
263
- const subToken = token.key.replace('{', '').replace('}', '').split('_');
264
- switch (typeToken) {
265
- case TokenService.TOKEN_LABEL_FORM: // Form
266
- let valueData = null;
267
- const dataOrgKey = subToken[1].toLowerCase();
268
- // Put this key because there no other way to differentiate the same key in differents forms
269
- const dataOrgKeyByForm = subToken[0].substring(1) + '_' + subToken[1].toLowerCase();
270
- const dataOrgValue = lDataOrg.hasOwnProperty(dataOrgKey)
271
- ? lDataOrg[dataOrgKey]
272
- : lDataOrg.hasOwnProperty(dataOrgKeyByForm)
273
- ? lDataOrg[dataOrgKeyByForm]
274
- : null;
275
- // const dataOrgValueByForm = lDataOrg[dataOrgKeyByForm];
276
- if (subToken.length === 3 &&
277
- typeof dataOrgValue !== 'undefined' &&
278
- dataOrgValue !== null &&
279
- dataOrgValue.hasOwnProperty(subToken[2])) {
280
- valueData = dataOrgValue[subToken[2]];
281
- }
282
- else if (subToken.length === 2 &&
283
- typeof dataOrgValue !== 'undefined' &&
284
- dataOrgValue !== null) {
285
- valueData = dataOrgValue;
286
- if (lFormFieldsTokenOrg[token.key]) {
287
- valueData = this.tokenService.getValueFromFormField(lFormFieldsTokenOrg[token.key], valueData);
288
- }
289
- }
290
- valueData = valueData ? valueData : '';
291
- tokenTranslated = valueData;
292
- html = this.tokenService.replaceToken(html, token.value, valueData);
293
- break;
294
- case TokenService.TOKEN_LABEL_BUDGET: //Budget
295
- const budgetResolveToken = this.resolveBudgetToken(html, token, subToken);
296
- html = budgetResolveToken.html;
297
- tokenTranslated = budgetResolveToken.value;
298
- break;
299
- case TokenService.TOKEN_LABEL_TASKL: //Task
300
- const taskResolveToken = this.resolveTaskoken(html, token, subToken);
301
- html = taskResolveToken.html;
302
- tokenTranslated = taskResolveToken.value;
303
- break;
304
- case TokenService.TOKEN_LABEL_STATIC: //Static
305
- const staticResolveToken = await this.resolveStaticToken(html, token, subToken);
306
- html = staticResolveToken.html;
307
- tokenTranslated = staticResolveToken.value;
308
- break;
309
- case TokenService.TOKEN_LABEL_CALCULATED: //Calculated
310
- // Replaces de tokens of the formula
311
- const tokenName = lTokensCalculated[subToken[1]].name;
312
- let formula = lTokensCalculated[subToken[1]].formula;
313
- try {
314
- //AQUI
315
- formula = this.tokenService.replaceTokensFromListObject(tokenName, formula, lDataOrg);
316
- }
317
- catch (error) {
318
- formula = null;
319
- console.error(error.error ? error.error : error);
320
- this.toastrService.warning(error.message, error.tittle);
321
- return;
322
- }
323
- // Try to evaluate the formula
324
- let result = null;
325
- if (formula !== null) {
326
- try {
327
- result = formula.startsWith('file://')
328
- ? "<img width='250px' height='auto' src='" + formula + "'/>"
329
- : eval(formula);
330
- }
331
- catch (e) {
332
- console.error('Error evaluating the formula.', lTokensCalculated, subToken, e);
333
- this.toastrService.error('No se logro evaluar la formular del token ' + tokenName, 'Error!');
334
- return;
335
- }
336
- if (result !== null) {
337
- html = this.tokenService.replaceToken(html, token.value, result);
338
- tokenTranslated = result;
339
- }
340
- }
341
- break;
342
- }
343
- tokenTypeTranslated[typeToken][token.key] = tokenTranslated;
344
- }
345
- }
346
- this.onGenerate.emit({
347
- html: html,
348
- tokenTypeTranslated: tokenTypeTranslated
349
- });
350
- // }
351
- }
352
- /**
353
- * Try to find the budget info to translate the token.
354
- * @param html
355
- * @param token
356
- * @param subToken
357
- */
358
- resolveBudgetToken(html, token, subToken) {
359
- let tpresCodigo = Number(subToken[1]);
360
- let tokenValue = subToken[2];
361
- let budgetDto = null;
362
- let idTotalBudget = null;
363
- if (this.budgetDtoPrimary &&
364
- this.budgetDtoPrimary.budget &&
365
- tpresCodigo == ETipoPresupuesto.PRIMARY) {
366
- budgetDto = this.budgetDtoPrimary;
367
- idTotalBudget = 'pli-token-principal-budget-total-summary';
368
- }
369
- else if (this.budgetDtoSecundary &&
370
- this.budgetDtoSecundary.budget &&
371
- tpresCodigo == ETipoPresupuesto.SECONDARY) {
372
- budgetDto = this.budgetDtoSecundary;
373
- idTotalBudget = 'pli-token-secundary-budget-total-summary';
374
- }
375
- if (budgetDto === null || !budgetDto.budget) {
376
- console.error('No se logro encontrar el presupuesto del token.', token, this.budgetDtoPrimary, this.budgetDtoSecundary);
377
- return {
378
- html: html,
379
- value: null
380
- };
381
- }
382
- let valueData = null;
383
- const applicationProcess = tokenValue == TokenService.BUDGET_TOKENS_KEY_APPLICATION_PROCESS_TOTAL_AMOUNT ||
384
- tokenValue == TokenService.BUDGET_TOKENS_KEY_APPLICATION_PROCESS_TOTAL_OWN_FOUNDS ||
385
- tokenValue == TokenService.BUDGET_TOKENS_KEY_APPLICATION_PROCESS_TOTAL_FINANCING;
386
- const legalizationProcess = tokenValue == TokenService.BUDGET_TOKENS_KEY_LEGALIZATION_PROCESS_TOTAL_AMOUNT ||
387
- tokenValue == TokenService.BUDGET_TOKENS_KEY_LEGALIZATION_PROCESS_TOTAL_OWN_FOUNDS ||
388
- tokenValue == TokenService.BUDGET_TOKENS_KEY_LEGALIZATION_PROCESS_TOTAL_FINANCING;
389
- if (tokenValue == TokenService.BUDGET_TOKENS_KEY_TOTAL_AMOUNT) {
390
- valueData =
391
- budgetDto.budget && budgetDto.budget.summary
392
- ? this.currencyPipe.transform(budgetDto.budget.summary.budgetTotal, 'default', '', '1.0-0')
393
- : 0;
394
- }
395
- else if (tokenValue == TokenService.BUDGET_TOKENS_KEY_RESUME_CATEGORY_YEAR) {
396
- // this.addInfoTokenResumeCategoryYear(tpresCodigo, idTotalBudget, budgetDto);
397
- this.addInfoTokenResumeCategoryYear(tpresCodigo, idTotalBudget, budgetDto);
398
- const pliTokenTotalBudget = document.getElementById(idTotalBudget);
399
- if (pliTokenTotalBudget) {
400
- valueData = this.removeCommentsHtml(pliTokenTotalBudget.innerHTML);
401
- }
402
- else {
403
- console.log('pliTokenTotalBudget - NULL', pliTokenTotalBudget);
404
- }
405
- }
406
- else if (tokenValue == TokenService.BUDGET_TOKENS_KEY_FECHA_FINANCING_START) {
407
- valueData =
408
- budgetDto.budget && budgetDto.budget.financingStart
409
- ? budgetDto.budget.financingStart
410
- : '';
411
- html = this.tokenService.replaceToken(html, token.value, valueData, this.data?.idioma?.locale);
412
- }
413
- else if (tokenValue == TokenService.BUDGET_TOKENS_KEY_FECHA_FINANCING_END) {
414
- valueData =
415
- budgetDto.budget && budgetDto.budget.financingEnd
416
- ? budgetDto.budget.financingEnd
417
- : '';
418
- html = this.tokenService.replaceToken(html, token.value, valueData, this.data?.idioma?.locale);
419
- }
420
- else if (tokenValue == TokenService.BUDGET_TOKENS_DURATION_STUDIES) {
421
- valueData =
422
- budgetDto.budget && budgetDto.budget.studyStart && budgetDto.budget.studyEnd
423
- ? DateUtil.elapsedMonths(budgetDto.budget.studyStart, budgetDto.budget.studyEnd) + 1
424
- : '';
425
- }
426
- else if (tokenValue == TokenService.BUDGET_TOKENS_FINANCING_DURATION) {
427
- valueData =
428
- budgetDto.budget && budgetDto.budget.financingEnd && budgetDto.budget.financingStart
429
- ? DateUtil.elapsedMonths(budgetDto.budget.financingStart, budgetDto.budget.financingEnd) + 1
430
- : '';
431
- }
432
- else if (tokenValue == TokenService.LEGALIZATION_OR_APPLICATION_TOTAL_FINANCING) {
433
- // JMP - Mantis 6674 - Add logic to legalization or application total financing
434
- if (this.data &&
435
- this.data.dataFormApplication &&
436
- this.data.dataFormApplication.budget) {
437
- const budget = this.data.dataFormApplication.budget;
438
- if (budget.legalizationProcess && budget.legalizationProcess.totalFinancing) {
439
- const totalFinancing = Number(budget.legalizationProcess.totalFinancing);
440
- valueData = totalFinancing * 1.003;
441
- }
442
- else if (budget.applicationProcess && budget.applicationProcess.totalFinancing) {
443
- valueData = Number(budget.applicationProcess.totalFinancing);
444
- }
445
- }
446
- }
447
- else if ((applicationProcess || legalizationProcess) &&
448
- this.data &&
449
- this.data.dataFormApplication &&
450
- this.data.dataFormApplication.budget) {
451
- // Get the total budget amount depend of the process
452
- const appBudgetTotal = applicationProcess
453
- ? this.data.dataFormApplication.budget.applicationProcess
454
- : this.data.dataFormApplication.budget.legalizationProcess;
455
- if (appBudgetTotal != undefined && appBudgetTotal != null) {
456
- // no matter the process, the class is the same
457
- switch (tokenValue) {
458
- case TokenService.BUDGET_TOKENS_KEY_APPLICATION_PROCESS_TOTAL_AMOUNT:
459
- case TokenService.BUDGET_TOKENS_KEY_LEGALIZATION_PROCESS_TOTAL_AMOUNT:
460
- valueData = appBudgetTotal.totalAmount;
461
- break;
462
- case TokenService.BUDGET_TOKENS_KEY_APPLICATION_PROCESS_TOTAL_OWN_FOUNDS:
463
- case TokenService.BUDGET_TOKENS_KEY_LEGALIZATION_PROCESS_TOTAL_OWN_FOUNDS:
464
- valueData = appBudgetTotal.totalOwnFunds;
465
- break;
466
- case TokenService.BUDGET_TOKENS_KEY_APPLICATION_PROCESS_TOTAL_FINANCING:
467
- case TokenService.BUDGET_TOKENS_KEY_LEGALIZATION_PROCESS_TOTAL_FINANCING:
468
- valueData = appBudgetTotal.totalFinancing;
469
- break;
470
- }
471
- }
472
- }
473
- else if (tokenValue == TokenService.BUDGET_TOKENS_KEY_INSURANCE_AMOUNT) {
474
- let totalFinancing = this.data.dataFormApplication.budget.legalizationProcess &&
475
- this.data.dataFormApplication.budget.legalizationProcess.totalFinancing;
476
- totalFinancing =
477
- totalFinancing == undefined || totalFinancing == null ? 0 : Number(totalFinancing);
478
- // let totalInsuranceAmount = this.data.dataFormApplication.totalInsuranceAmount;
479
- // totalInsuranceAmount =
480
- // totalInsuranceAmount == undefined || totalInsuranceAmount == null
481
- // ? 0
482
- // : Number(totalInsuranceAmount);
483
- valueData = totalFinancing * 1.003;
484
- }
485
- else {
486
- // When the token can't be resolve
487
- console.error('resolveBudgetToken -No se logro resolver el token de tipo presupuesto');
488
- }
489
- valueData = valueData === null ? '' : valueData;
490
- html = this.tokenService.replaceToken(html, token.value, valueData);
491
- return {
492
- html: html,
493
- value: valueData
494
- };
495
- }
496
- resolveTaskoken(html, token, subToken) {
497
- let valueTask = null;
498
- if (subToken.length > 2) {
499
- let taskId = Number(subToken[2]);
500
- let task = this.evaluation.tasks.find((t) => t.idTask == taskId);
501
- valueTask = task.result;
502
- }
503
- html = this.tokenService.replaceToken(html, token.value, valueTask);
504
- return {
505
- html: html,
506
- value: valueTask
507
- };
508
- }
509
- async resolveStaticToken(html, token, subToken) {
510
- let valueReplace = null;
511
- if (subToken[1].toLowerCase() ==
512
- TokenService.STATIC_TOKENS_KEY_CODIGO_VERIFICACION.toLowerCase()) {
513
- valueReplace = this.uniqueVerificationCode;
514
- html = this.tokenService.replaceToken(html, token.value, this.uniqueVerificationCode);
515
- }
516
- else if (subToken[1].toLowerCase() ==
517
- TokenService.STATIC_TOKENS_KEY_A_QUIEN_VA_DIRIGIDO.toLowerCase()) {
518
- // if (this.data.dataDestination) {
519
- html = this.resolveStaticTokensKeyAQuienVaDirigido(html, token.value);
520
- valueReplace = '';
521
- // }
522
- }
523
- else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_KEY_LETTER_SIGN.toLowerCase()) {
524
- html = this.resolveStaticTokensKeySign(html, token.value, subToken);
525
- valueReplace = '';
526
- }
527
- else if (subToken[1].toLowerCase() ==
528
- TokenService.STATIC_TOKENS_KEY_SALUDO_COMPLEMENTARIO.toLowerCase()) {
529
- // if (this.data.dataDestination) {
530
- html = this.resolveStaticTokensKeySaludoComplementario(html, token.value);
531
- valueReplace = '';
532
- // }
533
- }
534
- else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_KEY_FECHA_ACTUAL.toLowerCase()) {
535
- valueReplace = new Date();
536
- html = this.tokenService.replaceToken(html, token.value, new Date());
537
- }
538
- else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_KEY_PATROCINADOR.toLowerCase()) {
539
- const patNombre = this.data.pliPromocion &&
540
- this.data.pliPromocion.pliPrograma &&
541
- this.data.pliPromocion.pliPrograma.pliPatrocinador
542
- ? this.data.pliPromocion.pliPrograma.pliPatrocinador.patNombre
543
- : '';
544
- valueReplace = patNombre;
545
- html = this.tokenService.replaceToken(html, token.value, patNombre);
546
- }
547
- else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_KEY_PROGRAMA.toLowerCase()) {
548
- const progNombre = this.data.pliPromocion && this.data.pliPromocion.pliPrograma
549
- ? this.data.pliPromocion.pliPrograma.progNombre
550
- : '';
551
- valueReplace = progNombre;
552
- html = this.tokenService.replaceToken(html, token.value, progNombre);
553
- }
554
- else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_KEY_PROMOCION.toLowerCase()) {
555
- const promNombre = this.data.pliPromocion ? this.data.pliPromocion.promNombre : '';
556
- valueReplace = promNombre;
557
- html = this.tokenService.replaceToken(html, token.value, promNombre);
558
- }
559
- else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_KEY_ANIO_PROMOCION.toLowerCase()) {
560
- const anioPromocion = this.data.pliPromocion && this.data.pliPromocion.promAnio
561
- ? this.data.pliPromocion.promAnio
562
- : 0;
563
- valueReplace = anioPromocion;
564
- html = this.tokenService.replaceToken(html, token.value, anioPromocion);
565
- }
566
- else if (subToken[1].toLowerCase() ==
567
- TokenService.STATIC_TOKENS_KEY_ISO_MONEDA_BASE.toLowerCase()) {
568
- const baseCurrency = this.data.budgetDtoPrimary && this.data.budgetDtoPrimary.budget
569
- ? this.data.budgetDtoPrimary.budget.baseCurrency
570
- : this.data.budgetDtoSecundary && this.data.budgetDtoSecundary.budget
571
- ? this.data.budgetDtoSecundary.budget.baseCurrency
572
- : '';
573
- valueReplace = baseCurrency;
574
- html = this.tokenService.replaceToken(html, token.value, baseCurrency);
575
- }
576
- else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_KEY_STATUS_NAME.toLowerCase()) {
577
- const statusName = this.data.dataFormApplication &&
578
- UtilString.isValid(this.data.dataFormApplication.stateName)
579
- ? this.data.dataFormApplication.stateName
580
- : '';
581
- valueReplace = statusName;
582
- html = this.tokenService.replaceToken(html, token.value, statusName);
583
- }
584
- else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_KEY_USER_INITIALS.toLowerCase()) {
585
- const pliUser = AuthenticationUtil.getPliUser();
586
- valueReplace = UtilString.initialLetters(pliUser.firstname + ' ' + pliUser.lastname);
587
- html = this.tokenService.replaceToken(html, token.value, valueReplace);
588
- }
589
- else if (subToken[1].toLowerCase() ==
590
- TokenService.STATIC_TOKENS_KEY_NUMBER_APPLICATION.toLowerCase()) {
591
- const number = this.data.dataFormApplication && this.data.dataFormApplication.number
592
- ? this.data.dataFormApplication.number
593
- : null;
594
- valueReplace = number;
595
- html = this.tokenService.replaceToken(html, token.value, number);
596
- }
597
- else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_COMMITTEE_NAME.toLowerCase()) {
598
- const comiteNombre = this.data.dataFormByForm && this.data.dataFormByForm.comiteNombre
599
- ? this.data.dataFormByForm.comiteNombre
600
- : null;
601
- valueReplace = comiteNombre;
602
- html = this.tokenService.replaceToken(html, token.value, comiteNombre);
603
- }
604
- else if (subToken[1].toLowerCase() ==
605
- TokenService.STATIC_TOKENS_COMMITTEE_SEGMENTATION.toLowerCase()) {
606
- const comiteSegmentacion = this.data.dataFormByForm &&
607
- this.data.dataFormByForm[TokenService.STATIC_TOKENS_COMMITTEE_SEGMENTATION]
608
- ? this.data.dataFormByForm[TokenService.STATIC_TOKENS_COMMITTEE_SEGMENTATION]
609
- : null;
610
- valueReplace = comiteSegmentacion;
611
- html = this.tokenService.replaceToken(html, token.value, comiteSegmentacion);
612
- }
613
- else if (subToken[1].toLowerCase() ==
614
- TokenService.STATIC_TOKENS_COMMITTEE_AGGRUPATION.toLowerCase()) {
615
- const comiteAgrupacion = this.data.dataFormByForm &&
616
- this.data.dataFormByForm[TokenService.STATIC_TOKENS_COMMITTEE_AGGRUPATION]
617
- ? this.data.dataFormByForm[TokenService.STATIC_TOKENS_COMMITTEE_AGGRUPATION]
618
- : null;
619
- valueReplace = comiteAgrupacion;
620
- html = this.tokenService.replaceToken(html, token.value, comiteAgrupacion);
621
- }
622
- else if (subToken[1].toLowerCase() ==
623
- TokenService.STATIC_TOKENS_COMMITTEE_CUTLINE_DATE.toLowerCase()) {
624
- let cutLineDate = this.data.dataFormByForm &&
625
- this.data.dataFormByForm[TokenService.STATIC_TOKENS_COMMITTEE_CUTLINE_DATE]
626
- ? this.data.dataFormByForm[TokenService.STATIC_TOKENS_COMMITTEE_CUTLINE_DATE]
627
- : null;
628
- if (cutLineDate instanceof Date) {
629
- cutLineDate = cutLineDate.toString();
630
- }
631
- valueReplace = cutLineDate;
632
- html = this.tokenService.replaceToken(html, token.value, cutLineDate);
633
- }
634
- else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_TOTAL_WEIGHTED.toLowerCase()) {
635
- let bestScenarioValue = '';
636
- if (this.evaluation && this.evaluation.scenarios) {
637
- let bestScenario = this.evaluation.scenarios.filter((s) => s.best)[0];
638
- if (bestScenario) {
639
- bestScenarioValue = bestScenario.result;
640
- }
641
- }
642
- html = this.tokenService.replaceToken(html, token.value, bestScenarioValue);
643
- }
644
- else if (subToken[1].toLowerCase() ==
645
- TokenService.STATIC_TOKENS_USER_TYPE_CREDIT_STUDY.toLowerCase()) {
646
- const userTypeCreditStudy = this.data.dataFormByForm &&
647
- this.data.dataFormByForm[TokenService.STATIC_TOKENS_USER_TYPE_CREDIT_STUDY]
648
- ? this.data.dataFormByForm[TokenService.STATIC_TOKENS_USER_TYPE_CREDIT_STUDY]
649
- : null;
650
- valueReplace = userTypeCreditStudy;
651
- html = this.tokenService.replaceToken(html, token.value, userTypeCreditStudy);
652
- }
653
- else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_BEN_CODIGO.toLowerCase()) {
654
- valueReplace = this.data.dataFormApplication.benCodigo;
655
- html = this.tokenService.replaceToken(html, token.value, this.data.dataFormApplication.benCodigo);
656
- }
657
- else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKEN_SURNAME.toLowerCase()) {
658
- if (this.data.dataFormApplication.username &&
659
- this.data.dataFormApplication.username !== null) {
660
- try {
661
- const sesion = await this.sesionService
662
- .getByLogin(this.data.dataFormApplication.username)
663
- .toPromise();
664
- const surnames = sesion.surname !== '' && sesion.surname !== null
665
- ? sesion.surname + ' ' + sesion.lastname
666
- : sesion.lastname;
667
- html = this.tokenService.replaceToken(html, token.value, surnames);
668
- }
669
- catch (error) {
670
- console.error('Error consultando el login en PLIS, getByLogin', error);
671
- }
672
- }
673
- }
674
- else {
675
- // Don't find the token
676
- console.error('No se encontro el token', token);
677
- html = this.tokenService.replaceToken(html, token.value, '');
678
- }
679
- return {
680
- html: html,
681
- value: valueReplace
682
- };
683
- }
684
- async findSesionByLogin(html, token) { }
685
- /**
686
- * Find all the tokens present in the HTML text. Organize this tokens in four categories.
687
- * @param html Text of the html
688
- */
689
- getListTokens(html) {
690
- // let strings: string[] = html.split(" ");
691
- let tokens = this.tokenService.getListTokensByString(html);
692
- let tokensCategory = [];
693
- for (let infoToken of tokens) {
694
- if (infoToken) {
695
- const keyType = TokenService.getKeyType(infoToken.key.replace('{', '').replace('}', ''));
696
- if (keyType) {
697
- switch (keyType) {
698
- case 1: // Form
699
- if (!tokensCategory[TokenService.TOKEN_LABEL_FORM]) {
700
- tokensCategory[TokenService.TOKEN_LABEL_FORM] = [];
701
- }
702
- tokensCategory[TokenService.TOKEN_LABEL_FORM].push(infoToken);
703
- break;
704
- case 2: //Budget
705
- if (!tokensCategory[TokenService.TOKEN_LABEL_BUDGET]) {
706
- tokensCategory[TokenService.TOKEN_LABEL_BUDGET] = [];
707
- }
708
- tokensCategory[TokenService.TOKEN_LABEL_BUDGET].push(infoToken);
709
- break;
710
- case 3: //Static
711
- if (!tokensCategory[TokenService.TOKEN_LABEL_STATIC]) {
712
- tokensCategory[TokenService.TOKEN_LABEL_STATIC] = [];
713
- }
714
- tokensCategory[TokenService.TOKEN_LABEL_STATIC].push(infoToken);
715
- break;
716
- case 4: //Calculated
717
- if (!tokensCategory[TokenService.TOKEN_LABEL_CALCULATED]) {
718
- tokensCategory[TokenService.TOKEN_LABEL_CALCULATED] = [];
719
- }
720
- tokensCategory[TokenService.TOKEN_LABEL_CALCULATED].push(infoToken);
721
- break;
722
- case 5: //Task
723
- if (!tokensCategory[TokenService.TOKEN_LABEL_TASKL]) {
724
- tokensCategory[TokenService.TOKEN_LABEL_TASKL] = [];
725
- }
726
- tokensCategory[TokenService.TOKEN_LABEL_TASKL].push(infoToken);
727
- break;
728
- }
729
- }
730
- }
731
- }
732
- return tokensCategory;
733
- }
734
- /**
735
- * It resolves the static token destination
736
- * @param stringText
737
- * @param token
738
- * @param dataValue
739
- */
740
- resolveStaticTokensKeyAQuienVaDirigido(stringText, tokenValue) {
741
- // if (this.data.dataDestination) {
742
- this.enableDestination = true;
743
- this.addInfoTokenDestination();
744
- const pliTokenDestination = document.getElementById('pli-token-destination');
745
- let html = '';
746
- if (pliTokenDestination && pliTokenDestination.innerHTML.length > 0) {
747
- html = this.removeCommentsHtml(pliTokenDestination.innerHTML);
748
- }
749
- return this.tokenService.replaceToken(stringText, tokenValue, html);
750
- // }
751
- // return stringText;
752
- }
753
- /**
754
- *
755
- */
756
- addInfoTokenDestination() {
757
- let pliTokenDestination = $('#pli-token-destination');
758
- pliTokenDestination.empty();
759
- if (this.data.dataDestination) {
760
- let destinationInfo = $('<div></div>');
761
- if (this.data.dataDestination.text) {
762
- let valueInfo = $('<div></div>').text(this.data.dataDestination.text);
763
- destinationInfo.append(valueInfo);
764
- }
765
- if (this.data.dataDestination.title) {
766
- let valueInfo = $('<div></div>').text(this.data.dataDestination.title);
767
- destinationInfo.append(valueInfo);
768
- }
769
- if (this.data.dataDestination.name || this.data.dataDestination.lastName) {
770
- let valueInfoName = this.data.dataDestination.name
771
- ? this.data.dataDestination.name + ' '
772
- : '';
773
- valueInfoName += this.data.dataDestination.lastName
774
- ? this.data.dataDestination.lastName
775
- : '';
776
- let valueInfo = $('<div></div>').append('<strong>' + valueInfoName + '</strong>');
777
- destinationInfo.append(valueInfo);
778
- }
779
- if (this.data.dataDestination.cargo) {
780
- let valueInfo = $('<div></div>').text(this.data.dataDestination.cargo);
781
- destinationInfo.append(valueInfo);
782
- }
783
- if (this.data.dataDestination.occupation) {
784
- let valueInfo = $('<div></div>').text(this.data.dataDestination.occupation);
785
- destinationInfo.append(valueInfo);
786
- }
787
- if (this.data.dataDestination.company) {
788
- let valueInfo = $('<div></div>').text(this.data.dataDestination.company);
789
- destinationInfo.append(valueInfo);
790
- }
791
- if (this.data.dataDestination.address || this.data.dataDestination.addressDetails) {
792
- let valueInfoName = this.data.dataDestination.address
793
- ? this.data.dataDestination.address + ' '
794
- : '';
795
- valueInfoName += this.data.dataDestination.addressDetails
796
- ? this.data.dataDestination.addressDetails
797
- : '';
798
- let valueInfo = $('<div></div>').text(valueInfoName);
799
- destinationInfo.append(valueInfo);
800
- }
801
- if (this.data.dataDestination.city || this.data.dataDestination.country) {
802
- let valueInfoName = this.data.dataDestination.city
803
- ? this.data.dataDestination.city
804
- : '';
805
- valueInfoName +=
806
- this.data.dataDestination.city && this.data.dataDestination.country ? ', ' : '';
807
- valueInfoName += this.data.dataDestination.country
808
- ? this.data.dataDestination.country
809
- : '';
810
- let valueInfo = $('<div></div>').text(valueInfoName);
811
- destinationInfo.append(valueInfo);
812
- }
813
- pliTokenDestination.append(destinationInfo);
814
- }
815
- }
816
- /**
817
- * It resolves the static token destination
818
- * @param stringText
819
- * @param token
820
- * @param dataValue
821
- */
822
- resolveStaticTokensKeySaludoComplementario(stringText, tokenValue) {
823
- // if (this.data.dataDestination) {
824
- this.enableDestination = true;
825
- this.addInfoTokenSaludoComplementario();
826
- const pliTokenDestination = document.getElementById('pli-token-complementary-greeting');
827
- let html = '';
828
- if (pliTokenDestination) {
829
- html = this.removeCommentsHtml(pliTokenDestination.innerHTML);
830
- }
831
- return this.tokenService.replaceToken(stringText, tokenValue, html);
832
- // }
833
- // return stringText;
834
- }
835
- /**
836
- *
837
- */
838
- addInfoTokenSaludoComplementario() {
839
- let pliTokenDestination = $('#pli-token-complementary-greeting');
840
- pliTokenDestination.empty();
841
- if (this.data.dataDestination) {
842
- let destinationInfo = $('<div></div>');
843
- if (this.data.dataDestination.greeting) {
844
- destinationInfo.html(this.data.dataDestination.greeting);
845
- }
846
- if (this.data.dataDestination.title) {
847
- const valueText = (destinationInfo.html().length == 0 ? '' : ' ') +
848
- this.data.dataDestination.title;
849
- destinationInfo.html(destinationInfo.html() + valueText);
850
- }
851
- if (this.data.dataDestination.lastName) {
852
- let valueInfoName = this.data.dataDestination.lastName
853
- ? this.data.dataDestination.lastName
854
- : '';
855
- const valueText = (destinationInfo.html().length == 0 ? '' : ' ') +
856
- '<strong>' +
857
- valueInfoName +
858
- '</strong>';
859
- destinationInfo.html(destinationInfo.html() + valueText);
860
- }
861
- pliTokenDestination.append(destinationInfo);
862
- }
863
- }
864
- removeCommentsHtml(html) {
865
- return html ? html.replace(/<!--[\s\S]*?-->/g, '') : html;
866
- }
867
- resolveStaticTokensKeySign(html, tokenValue, subToken) {
868
- let container = $('<div></div>');
869
- let img = $('<img id="' + TokenService.SIGN_LETTER_TAG_ID + '">');
870
- img.attr('src', '');
871
- if (subToken.length > 2) {
872
- img.attr('width', subToken[2].toString());
873
- }
874
- if (subToken.length > 3) {
875
- img.attr('height', subToken[3].toString());
876
- }
877
- if (subToken.length > 4) {
878
- img.attr('name', subToken[4].toString());
879
- }
880
- container.append(img);
881
- // return container.html();
882
- return this.tokenService.replaceToken(html, tokenValue, container.html());
883
- }
884
- getRubroLabel() {
885
- return this.data.idioma.locale === 'es'
886
- ? 'Rubro'
887
- : this.data.idioma.locale === 'de'
888
- ? 'Posten'
889
- : 'Item';
890
- }
891
- getTotalLabel() {
892
- return this.data.idioma.locale === 'es'
893
- ? 'Total'
894
- : this.data.idioma.locale === 'de'
895
- ? 'Gesamt'
896
- : this.data.idioma.locale === 'fr'
897
- ? 'Total'
898
- : this.data.idioma.locale === 'it'
899
- ? 'Totale'
900
- : 'Item';
901
- }
902
- getYearLabel() {
903
- return this.data.idioma.locale === 'es'
904
- ? 'Año'
905
- : this.data.idioma.locale === 'de'
906
- ? 'Jahr'
907
- : this.data.idioma.locale === 'fr'
908
- ? 'Année'
909
- : this.data.idioma.locale === 'it'
910
- ? 'Anno'
911
- : 'Year';
912
- }
913
- /**
914
- *
915
- */
916
- addInfoTokenResumeCategoryYear(tpresCodigo, idTotalBudget, budgetDto) {
917
- if (tpresCodigo == ETipoPresupuesto.PRIMARY) {
918
- }
919
- else {
920
- }
921
- let resumeCategoryYearContent = $('#' + idTotalBudget);
922
- resumeCategoryYearContent.empty();
923
- if (budgetDto && budgetDto.budget && budgetDto.budget.summary) {
924
- const summary = budgetDto.budget.summary;
925
- const table = $('<table></table>');
926
- table.css('border-spacing', '2px');
927
- table.css('border-collapse', 'collapse');
928
- //thead
929
- const thead = $('<thead>').appendTo(table);
930
- const thRubro = $('<th>', { html: this.getRubroLabel() }).appendTo(thead);
931
- thRubro.css('text-align', 'center');
932
- thRubro.css('border', '1px solid black');
933
- thRubro.css('color', 'white');
934
- thRubro.css('background-color', 'grey');
935
- let iteracionAnio = 0;
936
- for (const year of summary.years) {
937
- const thYear = $('<th>', { html: this.getYearLabel() + ++iteracionAnio }).appendTo(thead);
938
- thYear.css('text-align', 'center');
939
- thYear.css('border', '1px solid black');
940
- thYear.css('color', 'white');
941
- thYear.css('background-color', 'grey');
942
- thYear.css('width', '80px');
943
- }
944
- const totalLabel = '&nbsp;' + this.getTotalLabel() + summary.baseCurrency + '&nbsp;';
945
- const thTotal = $('<th>', { html: totalLabel }).appendTo(thead);
946
- thTotal.css('text-align', 'center');
947
- thTotal.css('border', '1px solid black');
948
- thTotal.css('color', 'white');
949
- thTotal.css('background-color', 'grey');
950
- thTotal.css('width', '80px');
951
- //tbody
952
- let tbody = $('<tbody>').appendTo(table);
953
- for (let iCat = 0; iCat < summary.categories.length; iCat++) {
954
- const tr = $('<tr>').appendTo(tbody);
955
- const category = summary.categories[iCat];
956
- const rubroLabel = '&nbsp;&nbsp;' +
957
- this.translateCategory(category.category) +
958
- '&nbsp;&nbsp;&nbsp;&nbsp;';
959
- const tdRubro = $('<td>', { html: rubroLabel }).appendTo(tr);
960
- tdRubro.css('text-align', 'left');
961
- tdRubro.css('border', '1px solid black');
962
- tdRubro.css('font-weight', 'bold');
963
- for (const year of category.years) {
964
- const yearTotal = year.total == 0
965
- ? '-'
966
- : this.currencyPipe.transform(year.total, 'default', '', '1.0-0');
967
- const yearLabelTotal = '&nbsp;&nbsp;' + yearTotal + '&nbsp;&nbsp;';
968
- const tdYear = $('<td>', { html: yearLabelTotal }).appendTo(tr);
969
- tdYear.css('text-align', 'right');
970
- tdYear.css('border', '1px solid black');
971
- }
972
- const categoryTotal = category.total == 0
973
- ? '-'
974
- : this.currencyPipe.transform(category.total, 'default', '', '1.0-0');
975
- const categoryLabelTotal = '&nbsp;&nbsp;' + categoryTotal + '&nbsp;&nbsp;';
976
- const tdTotal = $('<td>', { html: categoryLabelTotal }).appendTo(tr);
977
- tdTotal.css('text-align', 'right');
978
- tdTotal.css('border', '1px solid black');
979
- tdTotal.css('font-weight', 'bold');
980
- }
981
- const trFinal = $('<tr>').appendTo(tbody);
982
- const baseCurrency = this.getTotalLabel() + ' ' + summary.baseCurrency + '&nbsp;&nbsp;';
983
- const tdFinalTotalBC = $('<td>', { html: baseCurrency }).appendTo(trFinal);
984
- tdFinalTotalBC.css('text-align', 'right');
985
- tdFinalTotalBC.css('border', '1px solid black');
986
- tdFinalTotalBC.css('color', 'white');
987
- tdFinalTotalBC.css('background-color', 'grey');
988
- let budgetTotal = 0;
989
- for (const year of summary.years) {
990
- const yearTotal = year.total == 0
991
- ? '-'
992
- : this.currencyPipe.transform(year.total, 'default', '', '1.0-0');
993
- const yearLabelTotal = yearTotal + '&nbsp;&nbsp;';
994
- const tdYear = $('<td>', { html: yearLabelTotal }).appendTo(trFinal);
995
- tdYear.css('text-align', 'right');
996
- tdYear.css('border', '1px solid black');
997
- tdYear.css('color', 'white');
998
- tdYear.css('background-color', 'grey');
999
- budgetTotal += year.total;
1000
- }
1001
- const totalBaseCurrency = budgetTotal == 0
1002
- ? '-'
1003
- : this.currencyPipe.transform(budgetTotal, 'default', '', '1.0-0');
1004
- const totalLabelBaseCurrency = '&nbsp;&nbsp;' + totalBaseCurrency + '&nbsp;&nbsp;';
1005
- const tdFinalTotal = $('<td>', { html: totalLabelBaseCurrency }).appendTo(trFinal);
1006
- tdFinalTotal.css('text-align', 'right');
1007
- tdFinalTotal.css('border', '1px solid black');
1008
- tdFinalTotal.css('color', 'white');
1009
- tdFinalTotal.css('background-color', 'grey');
1010
- resumeCategoryYearContent.append(table);
1011
- }
1012
- }
1013
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TokenComponent, deps: [{ token: i1.CurrencyPipe }, { token: i2.TokenService }, { token: i3.ToastrService }, { token: i4.AuthenticationService }, { token: i5.SesionService }], target: i0.ɵɵFactoryTarget.Component }); }
1014
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TokenComponent, selector: "pli-token", inputs: { template: "template", data: "data" }, outputs: { onGenerate: "onGenerate" }, usesOnChanges: true, ngImport: i0, template: "<div style=\"display: none;\" id=\"pli-token-destination\">\r\n\t<!-- <div *ngIf=\"data != undefined && data.dataDestination != undefined\">\r\n\r\n <div *ngIf=\"data.dataDestination.text != undefined\">\r\n {{data.dataDestination.text}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.title != undefined\">\r\n {{data.dataDestination.title}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.name != undefined || data.dataDestination.lastName != undefined\">\r\n <strong>{{data.dataDestination.name}} {{data.dataDestination.lastName}}</strong>\r\n </div>\r\n <div *ngIf=\"data.dataDestination.cargo != undefined\">\r\n {{data.dataDestination.cargo}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.occupation != undefined\">\r\n {{data.dataDestination.occupation}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.company != undefined\">\r\n {{data.dataDestination.company}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.address != undefined || data.dataDestination.addressDetails != undefined \">\r\n {{data.dataDestination.address}} {{data.dataDestination.addressDetails}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.city != undefined || data.dataDestination.country != undefined \">\r\n {{data.dataDestination.city}}<span *ngIf=\"data.dataDestination.city != undefined && data.dataDestination.country != undefined\">,</span>{{data.dataDestination.country}}\r\n </div>\r\n\r\n </div> -->\r\n</div>\r\n<!-- Complementary greeting-->\r\n<div style=\"display: none;\" id=\"pli-token-complementary-greeting\">\r\n\t<!-- <div\r\n\t\t*ngIf=\"\r\n\t\t\tdata != undefined &&\r\n\t\t\tdata.dataDestination != undefined &&\r\n\t\t\tdata.dataDestination.targetId == 2 &&\r\n\t\t\tdata.dataDestination.greeting != undefined\r\n\t\t\"\r\n\t>\r\n\t\t{{ data.dataDestination.greeting\r\n\t\t}}<span *ngIf=\"data.dataDestination.title != undefined\"\r\n\t\t\t>&nbsp;{{ data.dataDestination.title }}</span\r\n\t\t><span *ngIf=\"data.dataDestination.lastName != undefined\"\r\n\t\t\t>&nbsp;{{ data.dataDestination.lastName }}</span\r\n\t\t>:\r\n\t</div>-->\r\n</div>\r\n\r\n<!-- Primary budget total summary ${presupuesto_288_resumeCategoryYear} -->\r\n<div style=\"display: none;\" id=\"pli-token-principal-budget-total-summary\">\r\n\t<!-- <div>\r\n\t\t<table\r\n\t\t\t*ngIf=\"\r\n\t\t\t\tbudgetDtoPrimary !== null &&\r\n\t\t\t\tbudgetDtoPrimary.budget &&\r\n\t\t\t\tbudgetDtoPrimary.budget.summary\r\n\t\t\t\"\r\n\t\t\tstyle=\"border-spacing: 2px;border-collapse: collapse;\"\r\n\t\t>\r\n\t\t\t<thead>\r\n\t\t\t\t<tr style=\"font-weight: bold;\">\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"text-align: center;border: 1px solid black; color: white;background-color: grey;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tRubro\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of budgetDtoPrimary.budget.summary.years\"\r\n\t\t\t\t\t\tstyle=\"text-align: center;border: 1px solid black; color: white;background-color: grey; width:80px;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{ year.yearNumber }}\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"text-align: center;border: 1px solid black; color: white;background-color: grey; width: 110px;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tTotal ({{ budgetDtoPrimary.budget.summary.baseCurrency }})\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t</thead>\r\n\t\t\t<tbody>\r\n\t\t\t\t<tr\r\n\t\t\t\t\t*ngFor=\"\r\n\t\t\t\t\t\tlet category of budgetDtoPrimary.budget.summary.categories;\r\n\t\t\t\t\t\tlet iCat = index\r\n\t\t\t\t\t\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<td style=\"font-weight: bold;text-align: left;border: 1px solid black;\">\r\n\t\t\t\t\t\t&nbsp;&nbsp;{{\r\n\t\t\t\t\t\t\ttranslateCategory(category.category)\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of category.years\"\r\n\t\t\t\t\t\tstyle=\"text-align: right;border: 1px solid black; \"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t&nbsp;&nbsp;{{\r\n\t\t\t\t\t\t\tyear.total == 0 ? '-' : (year.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td style=\"font-weight: bold; text-align: right;border: 1px solid black;\">\r\n\t\t\t\t\t\t&nbsp;&nbsp;{{\r\n\t\t\t\t\t\t\tcategory.total == 0\r\n\t\t\t\t\t\t\t\t? '-'\r\n\t\t\t\t\t\t\t\t: (category.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t\t<tr style=\"font-weight: bold;\">\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"text-align: right;border: 1px solid black; color: white;background-color: grey;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tTotal ({{ budgetDtoPrimary.budget.summary.baseCurrency }})&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of budgetDtoPrimary.budget.summary.years\"\r\n\t\t\t\t\t\tstyle=\"text-align: right;border: 1px solid black; color: white;background-color: grey; \"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{\r\n\t\t\t\t\t\t\tyear.total == 0 ? '-' : (year.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"text-align: right;border: 1px solid black; color: white;background-color: grey;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{\r\n\t\t\t\t\t\t\tbudgetDtoPrimary.budget.summary.budgetTotal == 0\r\n\t\t\t\t\t\t\t\t? '-'\r\n\t\t\t\t\t\t\t\t: (budgetDtoPrimary.budget.summary.budgetTotal\r\n\t\t\t\t\t\t\t\t | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t</tbody>\r\n\t\t</table>\r\n\t</div> -->\r\n</div>\r\n<!-- Secundary budget total summary ${presupuesto_288_resumeCategoryYear} -->\r\n<div style=\"display: none;\" id=\"pli-token-secundary-budget-total-summary\">\r\n\t<div>\r\n\t\t<table\r\n\t\t\t*ngIf=\"\r\n\t\t\t\tbudgetDtoSecundary !== null &&\r\n\t\t\t\tbudgetDtoSecundary.budget &&\r\n\t\t\t\tbudgetDtoSecundary.budget.summary\r\n\t\t\t\"\r\n\t\t\tstyle=\"border-spacing: 2px; border-collapse: collapse; width: 100%;\"\r\n\t\t>\r\n\t\t\t<thead>\r\n\t\t\t\t<tr style=\"font-weight: bold;\">\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: center;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tRubro\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of budgetDtoSecundary.budget.summary.years\"\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: center;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\twidth: 80px;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{ year.yearNumber }}\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: center;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\twidth: 110px;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tTotal ({{ budgetDtoSecundary.budget.summary.baseCurrency }})\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t</thead>\r\n\t\t\t<tbody>\r\n\t\t\t\t<tr\r\n\t\t\t\t\t*ngFor=\"\r\n\t\t\t\t\t\tlet category of budgetDtoSecundary.budget.summary.categories;\r\n\t\t\t\t\t\tlet iCat = index\r\n\t\t\t\t\t\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<td style=\"font-weight: bold; text-align: left; border: 1px solid black;\">\r\n\t\t\t\t\t\t&nbsp;&nbsp;{{\r\n\t\t\t\t\t\t\ttranslateCategory(category.category)\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of category.years\"\r\n\t\t\t\t\t\tstyle=\"text-align: right; border: 1px solid black;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t&nbsp;&nbsp;{{\r\n\t\t\t\t\t\t\tyear.total == 0 ? '-' : (year.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td style=\"font-weight: bold; text-align: right; border: 1px solid black;\">\r\n\t\t\t\t\t\t&nbsp;&nbsp;{{\r\n\t\t\t\t\t\t\tcategory.total == 0\r\n\t\t\t\t\t\t\t\t? '-'\r\n\t\t\t\t\t\t\t\t: (category.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t\t<tr style=\"font-weight: bold;\">\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: right;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tTotal ({{ budgetDtoSecundary.budget.summary.baseCurrency }})&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of budgetDtoSecundary.budget.summary.years\"\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: right;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{\r\n\t\t\t\t\t\t\tyear.total == 0 ? '-' : (year.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: right;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{\r\n\t\t\t\t\t\t\tbudgetDtoSecundary.budget.summary.budgetTotal == 0\r\n\t\t\t\t\t\t\t\t? '-'\r\n\t\t\t\t\t\t\t\t: (budgetDtoSecundary.budget.summary.budgetTotal\r\n\t\t\t\t\t\t\t\t | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t</tbody>\r\n\t\t</table>\r\n\t</div>\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.CurrencyPipe, name: "currency" }] }); }
1015
- }
1016
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TokenComponent, decorators: [{
1017
- type: Component,
1018
- args: [{ selector: 'pli-token', template: "<div style=\"display: none;\" id=\"pli-token-destination\">\r\n\t<!-- <div *ngIf=\"data != undefined && data.dataDestination != undefined\">\r\n\r\n <div *ngIf=\"data.dataDestination.text != undefined\">\r\n {{data.dataDestination.text}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.title != undefined\">\r\n {{data.dataDestination.title}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.name != undefined || data.dataDestination.lastName != undefined\">\r\n <strong>{{data.dataDestination.name}} {{data.dataDestination.lastName}}</strong>\r\n </div>\r\n <div *ngIf=\"data.dataDestination.cargo != undefined\">\r\n {{data.dataDestination.cargo}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.occupation != undefined\">\r\n {{data.dataDestination.occupation}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.company != undefined\">\r\n {{data.dataDestination.company}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.address != undefined || data.dataDestination.addressDetails != undefined \">\r\n {{data.dataDestination.address}} {{data.dataDestination.addressDetails}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.city != undefined || data.dataDestination.country != undefined \">\r\n {{data.dataDestination.city}}<span *ngIf=\"data.dataDestination.city != undefined && data.dataDestination.country != undefined\">,</span>{{data.dataDestination.country}}\r\n </div>\r\n\r\n </div> -->\r\n</div>\r\n<!-- Complementary greeting-->\r\n<div style=\"display: none;\" id=\"pli-token-complementary-greeting\">\r\n\t<!-- <div\r\n\t\t*ngIf=\"\r\n\t\t\tdata != undefined &&\r\n\t\t\tdata.dataDestination != undefined &&\r\n\t\t\tdata.dataDestination.targetId == 2 &&\r\n\t\t\tdata.dataDestination.greeting != undefined\r\n\t\t\"\r\n\t>\r\n\t\t{{ data.dataDestination.greeting\r\n\t\t}}<span *ngIf=\"data.dataDestination.title != undefined\"\r\n\t\t\t>&nbsp;{{ data.dataDestination.title }}</span\r\n\t\t><span *ngIf=\"data.dataDestination.lastName != undefined\"\r\n\t\t\t>&nbsp;{{ data.dataDestination.lastName }}</span\r\n\t\t>:\r\n\t</div>-->\r\n</div>\r\n\r\n<!-- Primary budget total summary ${presupuesto_288_resumeCategoryYear} -->\r\n<div style=\"display: none;\" id=\"pli-token-principal-budget-total-summary\">\r\n\t<!-- <div>\r\n\t\t<table\r\n\t\t\t*ngIf=\"\r\n\t\t\t\tbudgetDtoPrimary !== null &&\r\n\t\t\t\tbudgetDtoPrimary.budget &&\r\n\t\t\t\tbudgetDtoPrimary.budget.summary\r\n\t\t\t\"\r\n\t\t\tstyle=\"border-spacing: 2px;border-collapse: collapse;\"\r\n\t\t>\r\n\t\t\t<thead>\r\n\t\t\t\t<tr style=\"font-weight: bold;\">\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"text-align: center;border: 1px solid black; color: white;background-color: grey;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tRubro\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of budgetDtoPrimary.budget.summary.years\"\r\n\t\t\t\t\t\tstyle=\"text-align: center;border: 1px solid black; color: white;background-color: grey; width:80px;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{ year.yearNumber }}\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"text-align: center;border: 1px solid black; color: white;background-color: grey; width: 110px;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tTotal ({{ budgetDtoPrimary.budget.summary.baseCurrency }})\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t</thead>\r\n\t\t\t<tbody>\r\n\t\t\t\t<tr\r\n\t\t\t\t\t*ngFor=\"\r\n\t\t\t\t\t\tlet category of budgetDtoPrimary.budget.summary.categories;\r\n\t\t\t\t\t\tlet iCat = index\r\n\t\t\t\t\t\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<td style=\"font-weight: bold;text-align: left;border: 1px solid black;\">\r\n\t\t\t\t\t\t&nbsp;&nbsp;{{\r\n\t\t\t\t\t\t\ttranslateCategory(category.category)\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of category.years\"\r\n\t\t\t\t\t\tstyle=\"text-align: right;border: 1px solid black; \"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t&nbsp;&nbsp;{{\r\n\t\t\t\t\t\t\tyear.total == 0 ? '-' : (year.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td style=\"font-weight: bold; text-align: right;border: 1px solid black;\">\r\n\t\t\t\t\t\t&nbsp;&nbsp;{{\r\n\t\t\t\t\t\t\tcategory.total == 0\r\n\t\t\t\t\t\t\t\t? '-'\r\n\t\t\t\t\t\t\t\t: (category.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t\t<tr style=\"font-weight: bold;\">\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"text-align: right;border: 1px solid black; color: white;background-color: grey;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tTotal ({{ budgetDtoPrimary.budget.summary.baseCurrency }})&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of budgetDtoPrimary.budget.summary.years\"\r\n\t\t\t\t\t\tstyle=\"text-align: right;border: 1px solid black; color: white;background-color: grey; \"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{\r\n\t\t\t\t\t\t\tyear.total == 0 ? '-' : (year.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"text-align: right;border: 1px solid black; color: white;background-color: grey;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{\r\n\t\t\t\t\t\t\tbudgetDtoPrimary.budget.summary.budgetTotal == 0\r\n\t\t\t\t\t\t\t\t? '-'\r\n\t\t\t\t\t\t\t\t: (budgetDtoPrimary.budget.summary.budgetTotal\r\n\t\t\t\t\t\t\t\t | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t</tbody>\r\n\t\t</table>\r\n\t</div> -->\r\n</div>\r\n<!-- Secundary budget total summary ${presupuesto_288_resumeCategoryYear} -->\r\n<div style=\"display: none;\" id=\"pli-token-secundary-budget-total-summary\">\r\n\t<div>\r\n\t\t<table\r\n\t\t\t*ngIf=\"\r\n\t\t\t\tbudgetDtoSecundary !== null &&\r\n\t\t\t\tbudgetDtoSecundary.budget &&\r\n\t\t\t\tbudgetDtoSecundary.budget.summary\r\n\t\t\t\"\r\n\t\t\tstyle=\"border-spacing: 2px; border-collapse: collapse; width: 100%;\"\r\n\t\t>\r\n\t\t\t<thead>\r\n\t\t\t\t<tr style=\"font-weight: bold;\">\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: center;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tRubro\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of budgetDtoSecundary.budget.summary.years\"\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: center;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\twidth: 80px;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{ year.yearNumber }}\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: center;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\twidth: 110px;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tTotal ({{ budgetDtoSecundary.budget.summary.baseCurrency }})\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t</thead>\r\n\t\t\t<tbody>\r\n\t\t\t\t<tr\r\n\t\t\t\t\t*ngFor=\"\r\n\t\t\t\t\t\tlet category of budgetDtoSecundary.budget.summary.categories;\r\n\t\t\t\t\t\tlet iCat = index\r\n\t\t\t\t\t\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<td style=\"font-weight: bold; text-align: left; border: 1px solid black;\">\r\n\t\t\t\t\t\t&nbsp;&nbsp;{{\r\n\t\t\t\t\t\t\ttranslateCategory(category.category)\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of category.years\"\r\n\t\t\t\t\t\tstyle=\"text-align: right; border: 1px solid black;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t&nbsp;&nbsp;{{\r\n\t\t\t\t\t\t\tyear.total == 0 ? '-' : (year.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td style=\"font-weight: bold; text-align: right; border: 1px solid black;\">\r\n\t\t\t\t\t\t&nbsp;&nbsp;{{\r\n\t\t\t\t\t\t\tcategory.total == 0\r\n\t\t\t\t\t\t\t\t? '-'\r\n\t\t\t\t\t\t\t\t: (category.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t\t<tr style=\"font-weight: bold;\">\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: right;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tTotal ({{ budgetDtoSecundary.budget.summary.baseCurrency }})&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of budgetDtoSecundary.budget.summary.years\"\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: right;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{\r\n\t\t\t\t\t\t\tyear.total == 0 ? '-' : (year.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: right;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{\r\n\t\t\t\t\t\t\tbudgetDtoSecundary.budget.summary.budgetTotal == 0\r\n\t\t\t\t\t\t\t\t? '-'\r\n\t\t\t\t\t\t\t\t: (budgetDtoSecundary.budget.summary.budgetTotal\r\n\t\t\t\t\t\t\t\t | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t</tbody>\r\n\t\t</table>\r\n\t</div>\r\n</div>\r\n" }]
1019
- }], ctorParameters: () => [{ type: i1.CurrencyPipe }, { type: i2.TokenService }, { type: i3.ToastrService }, { type: i4.AuthenticationService }, { type: i5.SesionService }], propDecorators: { template: [{
1020
- type: Input
1021
- }], data: [{
1022
- type: Input
1023
- }], onGenerate: [{
1024
- type: Output
1025
- }] } });
1026
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctcGxpLWNvbW1vbnMvc3JjL2xpYi9jb21wb25lbnRzL3Rva2VuL3Rva2VuLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXBsaS1jb21tb25zL3NyYy9saWIvY29tcG9uZW50cy90b2tlbi90b2tlbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sU0FBUyxFQUVULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUlaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTixVQUFVLEVBSVYsZ0JBQWdCLEVBQ2hCLFVBQVUsRUFFVixrQkFBa0IsRUFHbEIsUUFBUSxFQUVSLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUc1RCxPQUFPLFFBQVEsQ0FBQzs7Ozs7OztBQVFoQixNQUFNLE9BQU8sY0FBYztJQTZCMUIsWUFDUyxZQUEwQixFQUMxQixZQUEwQixFQUMxQixhQUE0QixFQUM1QixxQkFBNEMsRUFDNUMsYUFBNEI7UUFKNUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQUM1QyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQTdCckMsdUNBQXVDO1FBQzdCLGVBQVUsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUVsRSxrREFBa0Q7UUFDbEQsc0JBQWlCLEdBQVksS0FBSyxDQUFDO0lBMEJoQyxDQUFDO0lBRUosUUFBUTtRQUNQLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixH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LHNCQUFzQixFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbkYsWUFBWSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDeEMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUM5QyxZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNuQyxZQUFZLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzdDLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxDQUFDO0lBQ0YsQ0FBQzsrR0E3cUNXLGNBQWM7bUdBQWQsY0FBYyw2SkNwQzNCLHUvU0FpUUE7OzRGRDdOYSxjQUFjO2tCQUwxQixTQUFTOytCQUNDLFdBQVc7d01BTVosUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcblx0Q29tcG9uZW50LFxyXG5cdE9uSW5pdCxcclxuXHRJbnB1dCxcclxuXHRPdXRwdXQsXHJcblx0RXZlbnRFbWl0dGVyLFxyXG5cdE9uQ2hhbmdlcyxcclxuXHRTaW1wbGVDaGFuZ2VzLFxyXG5cdFNpbXBsZUNoYW5nZVxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG5cdFV0aWxTdHJpbmcsXHJcblx0RGF0YVRvVHJhbnNsYXRlVG9rZW4sXHJcblx0VG9rZW4sXHJcblx0QnVkZ2V0RHRvLFxyXG5cdEVUaXBvUHJlc3VwdWVzdG8sXHJcblx0UGxpVXN1YXJpbyxcclxuXHRzZXNpb24sXHJcblx0QXV0aGVudGljYXRpb25VdGlsLFxyXG5cdFBsaVVzZXIsXHJcblx0QXBwbGljYXRpb25CdWRnZXRUb3RhbCxcclxuXHREYXRlVXRpbCxcclxuXHRFdmFsdWF0aW9uXHJcbn0gZnJvbSAnbmctcGxpLXV0aWwnO1xyXG5pbXBvcnQgeyBDdXJyZW5jeVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBUb2tlblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90b2tlbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xyXG5pbXBvcnQgeyBBdXRoZW50aWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hdXRoZW50aWNhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0ICdqcXVlcnknO1xyXG5pbXBvcnQgeyBTZXNpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc2VzaW9uLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcblx0c2VsZWN0b3I6ICdwbGktdG9rZW4nLFxyXG5cdHRlbXBsYXRlVXJsOiAnLi90b2tlbi5jb21wb25lbnQuaHRtbCcsXHJcblx0c3R5bGVVcmxzOiBbJy4vdG9rZW4uY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUb2tlbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuXHQvKiogSXQgY29udGFpbnMgdGhlIHRlbXBsYXRlIGh0bWwgdG8gdHJhbnNsYXRlICovXHJcblx0QElucHV0KCkgdGVtcGxhdGU6IHN0cmluZztcclxuXHQvKiogSXQgY29udGFpbnMgdGhlIGRhdGEgdG8gaW1wbGVtZW50ICovXHJcblx0QElucHV0KCkgZGF0YTogRGF0YVRvVHJhbnNsYXRlVG9rZW47XHJcblx0LyoqIEl0IG5vdGlmaWVzIHRoZSBodG1sIGlzIGdlbmVyYXRlZCovXHJcblx0QE91dHB1dCgpIG9uR2VuZXJhdGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG5cdC8qKiBJdCBlbmFibGVzIHRoZSB2aXN1YWxpemF0aW9uIG9mIGRlc3RpbmF0aW9uICovXHJcblx0ZW5hYmxlRGVzdGluYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqIEl0IGNvbnRhaW5zIHRoZSBwcm9tIGNvZGUgKi9cclxuXHRwcm9tQ29kaWdvOiBudW1iZXI7XHJcblxyXG5cdC8qKiAqL1xyXG5cdGxUb2tlbkNhbGN1bGF0ZWQ6IFRva2VuW107XHJcblx0LyoqICovXHJcblx0bEZvcm1GaWVsZHNUb2tlbjogYW55W107XHJcblx0LyoqICovXHJcblx0dW5pcXVlVmVyaWZpY2F0aW9uQ29kZTogc3RyaW5nO1xyXG5cdC8qKiAqL1xyXG5cdGJ1ZGdldER0b1ByaW1hcnk6IEJ1ZGdldER0bztcclxuXHQvKiogKi9cclxuXHRidWRnZXREdG9TZWN1bmRhcnk6IEJ1ZGdldER0bztcclxuXHQvKiogQXMgdGhlIGxpc3Qgb2YgdG9rZW4gYXJlIGxvYWRlZCBkeW5hbWljYWxseSwgdGhpcyBtYW5hZ2UgdGhhdCBvbmx5IHJlcGxhY2UgdGhlIGluZm8gb25jZS4gKi9cclxuXHRhbHJlYWR5Q2FsbFJlcGxhY2VUb2tlbnM6IGJvb2xlYW47XHJcblxyXG5cdGV2YWx1YXRpb246IEV2YWx1YXRpb247XHJcblxyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHJpdmF0ZSBjdXJyZW5jeVBpcGU6IEN1cnJlbmN5UGlwZSxcclxuXHRcdHByaXZhdGUgdG9rZW5TZXJ2aWNlOiBUb2tlblNlcnZpY2UsXHJcblx0XHRwcml2YXRlIHRvYXN0clNlcnZpY2U6IFRvYXN0clNlcnZpY2UsXHJcblx0XHRwcml2YXRlIGF1dGhlbnRpY2F0aW9uU2VydmljZTogQXV0aGVudGljYXRpb25TZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSBzZXNpb25TZXJ2aWNlOiBTZXNpb25TZXJ2aWNlXHJcblx0KSB7fVxyXG5cclxuXHRuZ09uSW5pdCgpIHtcclxuXHRcdHRoaXMubFRva2VuQ2FsY3VsYXRlZCA9IG51bGw7XHJcblx0XHR0aGlzLmxGb3JtRmllbGRzVG9rZW4gPSBudWxsO1xyXG5cdFx0dGhpcy5idWRnZXREdG9QcmltYXJ5ID0gbnVsbDtcclxuXHRcdHRoaXMuYnVkZ2V0RHRvU2VjdW5kYXJ5ID0gbnVsbDtcclxuXHRcdHRoaXMuZXZhbHVhdGlvbiA9IG51bGw7XHJcblx0fVxyXG5cclxuXHQvKiogSXQgbWFuYWdlcyB0aGUgY2hhbmdlIG9mIHRoZSBldmVyeSBASW5wdXQgKi9cclxuXHRuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcblx0XHQvLyBFdmVyeSB0aW1lIHRoYXQgaW5wdXQgdmFsdWVzIGNoYW5nZSwgY2FsbCBuZXcgdmVyaWZpY2F0aW9uIGNvZGVcclxuXHRcdHRoaXMudW5pcXVlVmVyaWZpY2F0aW9uQ29kZSA9IG51bGw7XHJcblx0XHRjb25zdCB0ZW1wbGF0ZTogU2ltcGxlQ2hhbmdlID0gY2hhbmdlcy50ZW1wbGF0ZTtcclxuXHRcdGNvbnN0IGRhdGE6IFNpbXBsZUNoYW5nZSA9IGNoYW5nZXMuZGF0YTtcclxuXHJcblx0XHRpZiAodGVtcGxhdGUgJiYgdGVtcGxhdGUuY3VycmVudFZhbHVlKSB7XHJcblx0XHRcdHRoaXMudGVtcGxhdGUgPSB0ZW1wbGF0ZS5jdXJyZW50VmFsdWU7XHJcblx0XHR9XHJcblx0XHRpZiAoZGF0YSAmJiBkYXRhLmN1cnJlbnRWYWx1ZSkge1xyXG5cdFx0XHR0aGlzLmRhdGEgPSBkYXRhLmN1cnJlbnRWYWx1ZTtcclxuXHRcdFx0dGhpcy5wcm9tQ29kaWdvID0gdGhpcy5kYXRhLnByb21Db2RpZ287XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5kYXRhKSB7XHJcblx0XHRcdHRoaXMuYnVkZ2V0RHRvUHJpbWFyeSA9IHRoaXMuZGF0YS5idWRnZXREdG9QcmltYXJ5ID8gdGhpcy5kYXRhLmJ1ZGdldER0b1ByaW1hcnkgOiBudWxsO1xyXG5cdFx0XHR0aGlzLmJ1ZGdldER0b1NlY3VuZGFyeSA9IHRoaXMuZGF0YS5idWRnZXREdG9TZWN1bmRhcnlcclxuXHRcdFx0XHQ/IHRoaXMuZGF0YS5idWRnZXREdG9TZWN1bmRhcnlcclxuXHRcdFx0XHQ6IG51bGw7XHJcblx0XHRcdHRoaXMuZXZhbHVhdGlvbiA9IHRoaXMuZGF0YS5ldmFsdWF0aW9uO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHRoaXMuZGF0YSAmJiB0aGlzLnRlbXBsYXRlICYmIHRoaXMucHJvbUNvZGlnbykge1xyXG5cdFx0XHRjb25zdCBzZWxmID0gdGhpcztcclxuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdFx0c2VsZi5pbml0KCk7XHJcblx0XHRcdH0sIDMwMCk7XHJcblx0XHR9XHJcblx0fVxyXG5cdC8qKiBJdCBpbml0aWFsaXplcyB0aGUgcHJvY2VzcyBvZiB0cmFuc2xhdGlvbiAqL1xyXG5cdHByaXZhdGUgaW5pdCgpIHtcclxuXHRcdHRoaXMudHJhbnNsYXRlVG9rZW5zKHRoaXMudGVtcGxhdGUsIHRoaXMuZGF0YS5kYXRhRm9ybUJ5Rm9ybSk7XHJcblx0fVxyXG5cclxuXHR0cmFuc2xhdGVDYXRlZ29yeShjYXRlZ29yeU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcblx0XHRjb25zdCBsYW5ndWFnZUJ5RGVmYXVsdCA9ICdlbic7XHJcblx0XHQvLyBJZiBkb24ndCBmaW5kIHRoZSBsYW5nLCBnZXQgaW4gZW4uXHJcblx0XHRsZXQgY2F0ZWdvcnlOYW1lQnlEZWY6IHN0cmluZyA9IGNhdGVnb3J5TmFtZTtcclxuXHRcdGlmIChjYXRlZ29yeU5hbWUgJiYgdGhpcy5kYXRhLmNhdGVnb3JpZXMgJiYgdGhpcy5kYXRhLmlkaW9tYSkge1xyXG5cdFx0XHQvLyBJZiB0aGUgbG9jYWxlIHNlbGVjdCBpcyBlcywgdGhpcyBpcyB0aGUgZGFmdWx0IGNhdGVnb3J5IGxhbmd1YWdlXHJcblx0XHRcdGlmICh0aGlzLmRhdGEuaWRpb21hLmxvY2FsZSA9PT0gJ2VzJykge1xyXG5cdFx0XHRcdHJldHVybiBjYXRlZ29yeU5hbWU7XHJcblx0XHRcdH1cclxuXHRcdFx0Zm9yIChjb25zdCBjYXRlZ29yeSBvZiB0aGlzLmRhdGEuY2F0ZWdvcmllcykge1xyXG5cdFx0XHRcdGlmIChjYXRlZ29yeS5saXN0YVJ1YnJvSWRpb21hICYmIGNhdGVnb3J5LnJ1YlJ1YnJvID09PSBjYXRlZ29yeU5hbWUpIHtcclxuXHRcdFx0XHRcdGZvciAoY29uc3QgbGFuZ3VhZ2Ugb2YgY2F0ZWdvcnkubGlzdGFSdWJyb0lkaW9tYSkge1xyXG5cdFx0XHRcdFx0XHRpZiAobGFuZ3VhZ2UucnViaUlkaW9tYSA9PT0gdGhpcy5kYXRhLmlkaW9tYS5sb2NhbGUpIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gbGFuZ3VhZ2UucnViaVRyYWR1Y2Npb247XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYgKGxhbmd1YWdlLnJ1YmlJZGlvbWEgPT09IGxhbmd1YWdlQnlEZWZhdWx0KSB7XHJcblx0XHRcdFx0XHRcdFx0Y2F0ZWdvcnlOYW1lQnlEZWYgPSBsYW5ndWFnZS5ydWJpVHJhZHVjY2lvbjtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gY2F0ZWdvcnlOYW1lQnlEZWY7XHJcblx0fVxyXG5cclxuXHR0cmFuc2xhdGVUb2tlbnMoaHRtbDogc3RyaW5nLCBsaXN0RGF0YTogYW55KSB7XHJcblx0XHR0aGlzLmFscmVhZHlDYWxsUmVwbGFjZVRva2VucyA9IGZhbHNlO1xyXG5cdFx0Y29uc3QgbFRva2VuczogYW55W10gPSB0aGlzLmdldExpc3RUb2tlbnMoaHRtbCk7XHJcblx0XHRpZiAoIWxUb2tlbnMgfHwgT2JqZWN0LmtleXMobFRva2VucykubGVuZ3RoID09PSAwKSB7XHJcblx0XHRcdHRoaXMudGVtcGxhdGUgPSBodG1sO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5jYWxsTGlzdFRva2VucyhsVG9rZW5zLCBodG1sLCBsaXN0RGF0YSk7XHJcblx0fVxyXG5cclxuXHRjYWxsTGlzdFRva2VucyhsVG9rZW5zOiBhbnlbXSwgaHRtbDogc3RyaW5nLCBsaXN0RGF0YTogYW55KSB7XHJcblx0XHRpZiAoXHJcblx0XHRcdGxUb2tlbnNbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0NBTENVTEFURURdICYmXHJcblx0XHRcdE9iamVjdC5rZXlzKGxUb2tlbnNbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0NBTENVTEFURURdKS5sZW5ndGggPiAwXHJcblx0XHQpIHtcclxuXHRcdFx0aWYgKHRoaXMubFRva2VuQ2FsY3VsYXRlZCkge1xyXG5cdFx0XHRcdHRoaXMudmFsaWRhdGVMaXN0VG9rZW5zKGxUb2tlbnMsIGh0bWwsIGxpc3REYXRhKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLnRva2VuU2VydmljZS5nZXRMaXN0QnlQcm9tQ29kaWdvKHRoaXMucHJvbUNvZGlnbykuc3Vic2NyaWJlKFxyXG5cdFx0XHRcdFx0KGxUb2tlbkNhbGN1bGF0ZWQ6IFRva2VuW10pID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5sVG9rZW5DYWxjdWxhdGVkID0gbFRva2VuQ2FsY3VsYXRlZDtcclxuXHRcdFx0XHRcdFx0dGhpcy52YWxpZGF0ZUxpc3RUb2tlbnMobFRva2VucywgaHRtbCwgbGlzdERhdGEpO1xyXG5cdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdChlcnJvcikgPT4ge1xyXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCdFcnJvciBjYWxsTGlzdFRva2VucyAtZ2V0TGlzdEJ5UHJvbUNvZGlnbycsIGVycm9yKTtcclxuXHRcdFx0XHRcdFx0dGhpcy50b2FzdHJTZXJ2aWNlLmVycm9yKCdFcnJvciBnZW5lcmFuZG8gY2FydGEnKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLnZhbGlkYXRlTGlzdFRva2VucyhsVG9rZW5zLCBodG1sLCBsaXN0RGF0YSk7XHJcblx0XHR9XHJcblx0XHRpZiAoXHJcblx0XHRcdGxUb2tlbnNbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0ZPUk1dICYmXHJcblx0XHRcdE9iamVjdC5rZXlzKGxUb2tlbnNbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0ZPUk1dKS5sZW5ndGggPiAwXHJcblx0XHQpIHtcclxuXHRcdFx0aWYgKHRoaXMubEZvcm1GaWVsZHNUb2tlbikge1xyXG5cdFx0XHRcdHRoaXMudmFsaWRhdGVMaXN0VG9rZW5zKGxUb2tlbnMsIGh0bWwsIGxpc3REYXRhKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLnRva2VuU2VydmljZS5nZXRGb3JtRmllbGRzQnlQcm9tQ29kZSh0aGlzLnByb21Db2RpZ28pLnRoZW4oXHJcblx0XHRcdFx0XHQobEZvcm1GaWVsZHNUb2tlbjogYW55W10pID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5sRm9ybUZpZWxkc1Rva2VuID0gbEZvcm1GaWVsZHNUb2tlbjtcclxuXHRcdFx0XHRcdFx0dGhpcy52YWxpZGF0ZUxpc3RUb2tlbnMobFRva2VucywgaHRtbCwgbGlzdERhdGEpO1xyXG5cdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdChlcnJvcikgPT4ge1xyXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCdFcnJvciBjYWxsTGlzdFRva2VucyAtZ2V0Rm9ybUZpZWxkc0J5UHJvbUNvZGUnLCBlcnJvcik7XHJcblx0XHRcdFx0XHRcdHRoaXMudG9hc3RyU2VydmljZS5lcnJvcignRXJyb3IgZ2VuZXJhbmRvIGNhcnRhJyk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0KTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy52YWxpZGF0ZUxpc3RUb2tlbnMobFRva2VucywgaHRtbCwgbGlzdERhdGEpO1xyXG5cdFx0fVxyXG5cdFx0aWYgKFxyXG5cdFx0XHRsVG9rZW5zW1Rva2VuU2VydmljZS5UT0tFTl9MQUJFTF9TVEFUSUNdICYmXHJcblx0XHRcdE9iamVjdC5rZXlzKGxUb2tlbnNbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX1NUQVRJQ10pLmxlbmd0aCA+IDBcclxuXHRcdCkge1xyXG5cdFx0XHRpZiAodGhpcy51bmlxdWVWZXJpZmljYXRpb25Db2RlICE9PSBudWxsKSB7XHJcblx0XHRcdFx0dGhpcy52YWxpZGF0ZUxpc3RUb2tlbnMobFRva2VucywgaHRtbCwgbGlzdERhdGEpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGNvbnN0IHRva2VuVmVyaWZpY2F0aW9uQ29kZTogYW55W10gPSBsVG9rZW5zW1Rva2VuU2VydmljZS5UT0tFTl9MQUJFTF9TVEFUSUNdLmZpbmQoXHJcblx0XHRcdFx0XHQodG9rZW4pID0+IHtcclxuXHRcdFx0XHRcdFx0Y29uc3Qgc3ViVG9rZW46IHN0cmluZ1tdID0gdG9rZW4ua2V5XHJcblx0XHRcdFx0XHRcdFx0LnJlcGxhY2UoJ3snLCAnJylcclxuXHRcdFx0XHRcdFx0XHQucmVwbGFjZSgnfScsICcnKVxyXG5cdFx0XHRcdFx0XHRcdC5zcGxpdCgnXycpO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gKFxyXG5cdFx0XHRcdFx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT1cclxuXHRcdFx0XHRcdFx0XHRUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19LRVlfQ09ESUdPX1ZFUklGSUNBQ0lPTi50b0xvd2VyQ2FzZSgpXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHQvLyBPbmx5IGlmIHRoZSBzdGF0aWMgdG9rZW4gaXMgdGhlIHVuaXF1ZSB2ZXJpZmljYXRpb24gY29kZVxyXG5cdFx0XHRcdGlmICh0b2tlblZlcmlmaWNhdGlvbkNvZGUgJiYgT2JqZWN0LmtleXModG9rZW5WZXJpZmljYXRpb25Db2RlKS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0XHRsZXQgcGxpVXN1YXJpb09iamVjdCA9IEF1dGhlbnRpY2F0aW9uVXRpbC5nZXRQbGlVc3VhcmlvKCk7XHJcblx0XHRcdFx0XHRpZiAoIXBsaVVzdWFyaW9PYmplY3QpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy51bmlxdWVWZXJpZmljYXRpb25Db2RlID0gJyc7XHJcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoXHJcblx0XHRcdFx0XHRcdFx0J05vIHNlIGxvZ3JvIGNvbnN1bHRhciBlbCB1c3VhcmlvIHBhcmEgY29uc3VsdGFyIGVsIHRva2VuJyxcclxuXHRcdFx0XHRcdFx0XHRwbGlVc3VhcmlvT2JqZWN0XHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdHRoaXMudmFsaWRhdGVMaXN0VG9rZW5zKGxUb2tlbnMsIGh0bWwsIGxpc3REYXRhKTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHBsaVVzdWFyaW86IFBsaVVzdWFyaW8gPSBPYmplY3QuYXNzaWduKFxyXG5cdFx0XHRcdFx0XHRcdG5ldyBQbGlVc3VhcmlvKCksXHJcblx0XHRcdFx0XHRcdFx0SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwbGlVc3VhcmlvT2JqZWN0KSlcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0dGhpcy5hdXRoZW50aWNhdGlvblNlcnZpY2UuZ2V0VG9rZW5CeUxvZ2luKHBsaVVzdWFyaW8udXN1TG9naW4pLnN1YnNjcmliZShcclxuXHRcdFx0XHRcdFx0XHQoc2VzaW9uOiBzZXNpb24pID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdC8vIFRyeSB0byBnZXQgdGhlIHVuaXF1ZSB2ZXJpZmljYXRpb24gY29kZSB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHNlc2lvbiBpZiBpcyBub3QgYSB2YWxpZCB2YWx1ZVxyXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc2VzaW9uVmFsdWUgPSBzZXNpb24gPyBzZXNpb24uc2VzaW9uIDogJzEnO1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5nZXRVbmlxdWVWZXJpZmljYXRpb25Db2RlKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRwbGlVc3VhcmlvLnVzdUxvZ2luLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRzZXNpb25WYWx1ZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0bFRva2VucyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0aHRtbCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0bGlzdERhdGFcclxuXHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdFx0XHQoZXJyb3IpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoXHJcblx0XHRcdFx0XHRcdFx0XHRcdCdFcnJvciBjb25zdWx0YW5kbyBlbCBsb2dpbiBlbiBQTElTLCBnZXRUb2tlbkJ5TG9naW4nLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRlcnJvclxyXG5cdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHRcdC8vIFRyeSB0byBnZXQgdGhlIHVuaXF1ZSB2ZXJpZmljYXRpb24gY29kZSB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHNlc2lvblxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5nZXRVbmlxdWVWZXJpZmljYXRpb25Db2RlKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRwbGlVc3VhcmlvLnVzdUxvZ2luLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQnMScsXHJcblx0XHRcdFx0XHRcdFx0XHRcdGxUb2tlbnMsXHJcblx0XHRcdFx0XHRcdFx0XHRcdGh0bWwsXHJcblx0XHRcdFx0XHRcdFx0XHRcdGxpc3REYXRhXHJcblx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0Ly90aGlzLnRvYXN0clNlcnZpY2UuZXJyb3IoXCJFcnJvciBnZW5lcmFuZG8gY2FydGFcIik7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHR0aGlzLnVuaXF1ZVZlcmlmaWNhdGlvbkNvZGUgPSAnJztcclxuXHRcdFx0XHRcdHRoaXMudmFsaWRhdGVMaXN0VG9rZW5zKGxUb2tlbnMsIGh0bWwsIGxpc3REYXRhKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMudmFsaWRhdGVMaXN0VG9rZW5zKGxUb2tlbnMsIGh0bWwsIGxpc3REYXRhKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldCB0aGUgdW5pcXVlIHZlcmlmaWNhdGlvbiBjb2RlIGFuZCBjYWxsIHZhbGlkYXRlTGlzdFRva2VucyBtZXRob2RcclxuXHQgKi9cclxuXHRnZXRVbmlxdWVWZXJpZmljYXRpb25Db2RlKFxyXG5cdFx0dXN1TG9naW46IHN0cmluZyxcclxuXHRcdHNlc2lvbjogc3RyaW5nLFxyXG5cdFx0bFRva2VuczogYW55W10sXHJcblx0XHRodG1sOiBzdHJpbmcsXHJcblx0XHRsaXN0RGF0YTogYW55XHJcblx0KSB7XHJcblx0XHR0aGlzLnRva2VuU2VydmljZS5nZXRVbmlxdWVWZXJpZmljYXRpb25Db2RlKHVzdUxvZ2luLCBzZXNpb24pLnN1YnNjcmliZShcclxuXHRcdFx0KHVuaXF1ZUNvZGVWYWx1ZTogYW55KSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgdW5pcXVlQ29kZTogc3RyaW5nID0gdW5pcXVlQ29kZVZhbHVlLmNvZGlnb1VuaWNvO1xyXG5cdFx0XHRcdHRoaXMudW5pcXVlVmVyaWZpY2F0aW9uQ29kZSA9XHJcblx0XHRcdFx0XHR1bmlxdWVDb2RlLnN1YnN0cmluZygwLCA0KSArICcgJyArIHVuaXF1ZUNvZGUuc3Vic3RyaW5nKDQsIDgpO1xyXG5cdFx0XHRcdHRoaXMudmFsaWRhdGVMaXN0VG9rZW5zKGxUb2tlbnMsIGh0bWwsIGxpc3REYXRhKTtcclxuXHRcdFx0fSxcclxuXHRcdFx0KGVycm9yKSA9PiB7XHJcblx0XHRcdFx0Y29uc29sZS5lcnJvcignRXJyb3IgY2FsbExpc3RUb2tlbnMgLWdldExpc3RCeVByb21Db2RpZ28nLCBlcnJvcik7XHJcblx0XHRcdFx0dGhpcy50b2FzdHJTZXJ2aWNlLmVycm9yKCdFcnJvciBnZW5lcmFuZG8gY2FydGEnKTtcclxuXHRcdFx0fVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdHZhbGlkYXRlTGlzdFRva2VucyhsVG9rZW5zOiBhbnlbXSwgaHRtbDogc3RyaW5nLCBsaXN0RGF0YTogYW55KSB7XHJcblx0XHRsZXQgZmluaXNoTG9hZExpc3RGb3JtOiBib29sZWFuID0gZmFsc2U7XHJcblx0XHRsZXQgZmluaXNoTG9hZExpc3RDYWxjdWxhdGVkOiBib29sZWFuID0gZmFsc2U7XHJcblx0XHRsZXQgZmluaXNoTG9hZExpc3RTdGF0aWM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRcdGNvbnN0IGZpbmlzaExvYWRMaXN0QnVkZ2V0OiBib29sZWFuID0gdHJ1ZTtcclxuXHRcdGlmIChcclxuXHRcdFx0bFRva2Vuc1tUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfRk9STV0gJiZcclxuXHRcdFx0bFRva2Vuc1tUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfRk9STV0ubGVuZ3RoID4gMFxyXG5cdFx0KSB7XHJcblx0XHRcdGZpbmlzaExvYWRMaXN0Rm9ybSA9IHRoaXMubEZvcm1GaWVsZHNUb2tlbiA/IHRydWUgOiBmYWxzZTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGZpbmlzaExvYWRMaXN0Rm9ybSA9IHRydWU7XHJcblx0XHR9XHJcblx0XHRpZiAoXHJcblx0XHRcdGxUb2tlbnNbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0NBTENVTEFURURdICYmXHJcblx0XHRcdGxUb2tlbnNbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0NBTENVTEFURURdLmxlbmd0aCA+IDBcclxuXHRcdCkge1xyXG5cdFx0XHRmaW5pc2hMb2FkTGlzdENhbGN1bGF0ZWQgPSB0aGlzLmxUb2tlbkNhbGN1bGF0ZWQgPyB0cnVlIDogZmFsc2U7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRmaW5pc2hMb2FkTGlzdENhbGN1bGF0ZWQgPSB0cnVlO1xyXG5cdFx0fVxyXG5cdFx0aWYgKFxyXG5cdFx0XHRsVG9rZW5zW1Rva2VuU2VydmljZS5UT0tFTl9MQUJFTF9TVEFUSUNdICYmXHJcblx0XHRcdGxUb2tlbnNbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX1NUQVRJQ10ubGVuZ3RoID4gMFxyXG5cdFx0KSB7XHJcblx0XHRcdGZpbmlzaExvYWRMaXN0U3RhdGljID0gdGhpcy51bmlxdWVWZXJpZmljYXRpb25Db2RlICE9PSBudWxsID8gdHJ1ZSA6IGZhbHNlO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0ZmluaXNoTG9hZExpc3RTdGF0aWMgPSB0cnVlO1xyXG5cdFx0fVxyXG5cdFx0aWYgKFxyXG5cdFx0XHRmaW5pc2hMb2FkTGlzdEZvcm0gJiZcclxuXHRcdFx0ZmluaXNoTG9hZExpc3RCdWRnZXQgJiZcclxuXHRcdFx0ZmluaXNoTG9hZExpc3RTdGF0aWMgJiZcclxuXHRcdFx0ZmluaXNoTG9hZExpc3RDYWxjdWxhdGVkICYmXHJcblx0XHRcdCF0aGlzLmFscmVhZHlDYWxsUmVwbGFjZVRva2Vuc1xyXG5cdFx0KSB7XHJcblx0XHRcdHRoaXMuYWxyZWFkeUNhbGxSZXBsYWNlVG9rZW5zID0gdHJ1ZTtcclxuXHRcdFx0dGhpcy5yZXBsYWNlVG9rZW5zV2l0aERhdGEobFRva2VucywgaHRtbCwgbGlzdERhdGEpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0YXN5bmMgcmVwbGFjZVRva2Vuc1dpdGhEYXRhKGxUb2tlbnM6IGFueVtdLCBodG1sOiBzdHJpbmcsIGxpc3REYXRhOiBhbnkpIHtcclxuXHRcdGNvbnN0IGxEYXRhT3JnOiBhbnlbXSA9IFtdO1xyXG5cdFx0Y29uc3QgbEZvcm1GaWVsZHNUb2tlbk9yZzogYW55W10gPSBbXTtcclxuXHRcdGlmIChcclxuXHRcdFx0KGxUb2tlbnNbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0ZPUk1dIHx8XHJcblx0XHRcdFx0bFRva2Vuc1tUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfQ0FMQ1VMQVRFRF0pICYmXHJcblx0XHRcdGxpc3REYXRhXHJcblx0XHQpIHtcclxuXHRcdFx0Zm9yIChjb25zdCBkYXRhRm9ybSBpbiBsaXN0RGF0YSkge1xyXG5cdFx0XHRcdGxEYXRhT3JnW2RhdGFGb3JtLnRvTG93ZXJDYXNlKCldID0gbGlzdERhdGFbZGF0YUZvcm1dO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICh0aGlzLmxGb3JtRmllbGRzVG9rZW4pIHtcclxuXHRcdFx0XHRmb3IgKGNvbnN0IGZvcm1GaWVsZFRva2VuIG9mIHRoaXMubEZvcm1GaWVsZHNUb2tlbikge1xyXG5cdFx0XHRcdFx0Zm9yIChjb25zdCB2YWx1ZXNGaWVsZCBvZiBmb3JtRmllbGRUb2tlbi52YWx1ZSkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBrZXlUb2tlbjogc3RyaW5nID1cclxuXHRcdFx0XHRcdFx0XHQnJHsnICsgZm9ybUZpZWxkVG9rZW4udGl0bGUua2V5ICsgJ18nICsgdmFsdWVzRmllbGQua2V5ICsgJ30nO1xyXG5cdFx0XHRcdFx0XHRsRm9ybUZpZWxkc1Rva2VuT3JnW2tleVRva2VuXSA9IHZhbHVlc0ZpZWxkO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0Y29uc3QgbFRva2Vuc0NhbGN1bGF0ZWQ6IGFueVtdID0gW107XHJcblx0XHRpZiAobFRva2Vuc1tUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfQ0FMQ1VMQVRFRF0pIHtcclxuXHRcdFx0aWYgKHRoaXMubFRva2VuQ2FsY3VsYXRlZCkge1xyXG5cdFx0XHRcdGZvciAoY29uc3QgdG9rZW5DYWwgb2YgdGhpcy5sVG9rZW5DYWxjdWxhdGVkKSB7XHJcblx0XHRcdFx0XHRsVG9rZW5zQ2FsY3VsYXRlZFtVdGlsU3RyaW5nLnJlcGxhY2VBY2NlbnRTcGFjZXNPdGhlcnModG9rZW5DYWwubmFtZSldID1cclxuXHRcdFx0XHRcdFx0dG9rZW5DYWw7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRsZXQgdHlwZVRva2VuOiBhbnk7XHJcblx0XHRjb25zdCB0b2tlblR5cGVUcmFuc2xhdGVkOiBhbnkgPSBbXTtcclxuXHRcdGZvciAodHlwZVRva2VuIGluIGxUb2tlbnMpIHtcclxuXHRcdFx0aWYgKCFsVG9rZW5zW3R5cGVUb2tlbl0pIHtcclxuXHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjb25zdCB0b2tlbnNUeXBlOiBhbnlbXSA9IGxUb2tlbnNbdHlwZVRva2VuXTtcclxuXHRcdFx0dG9rZW5UeXBlVHJhbnNsYXRlZFt0eXBlVG9rZW5dID0gW107XHJcblx0XHRcdGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zVHlwZSkge1xyXG5cdFx0XHRcdGxldCB0b2tlblRyYW5zbGF0ZWQgPSBudWxsO1xyXG5cdFx0XHRcdGNvbnN0IHN1YlRva2VuOiBzdHJpbmdbXSA9IHRva2VuLmtleS5yZXBsYWNlKCd7JywgJycpLnJlcGxhY2UoJ30nLCAnJykuc3BsaXQoJ18nKTtcclxuXHRcdFx0XHRzd2l0Y2ggKHR5cGVUb2tlbikge1xyXG5cdFx0XHRcdFx0Y2FzZSBUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfRk9STTogLy8gRm9ybVxyXG5cdFx0XHRcdFx0XHRsZXQgdmFsdWVEYXRhID0gbnVsbDtcclxuXHRcdFx0XHRcdFx0Y29uc3QgZGF0YU9yZ0tleSA9IHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCk7XHJcblx0XHRcdFx0XHRcdC8vIFB1dCB0aGlzIGtleSBiZWNhdXNlIHRoZXJlIG5vIG90aGVyIHdheSB0byBkaWZmZXJlbnRpYXRlIHRoZSBzYW1lIGtleSBpbiBkaWZmZXJlbnRzIGZvcm1zXHJcblx0XHRcdFx0XHRcdGNvbnN0IGRhdGFPcmdLZXlCeUZvcm0gPVxyXG5cdFx0XHRcdFx0XHRcdHN1YlRva2VuWzBdLnN1YnN0cmluZygxKSArICdfJyArIHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGRhdGFPcmdWYWx1ZSA9IGxEYXRhT3JnLmhhc093blByb3BlcnR5KGRhdGFPcmdLZXkpXHJcblx0XHRcdFx0XHRcdFx0PyBsRGF0YU9yZ1tkYXRhT3JnS2V5XVxyXG5cdFx0XHRcdFx0XHRcdDogbERhdGFPcmcuaGFzT3duUHJvcGVydHkoZGF0YU9yZ0tleUJ5Rm9ybSlcclxuXHRcdFx0XHRcdFx0XHQ/IGxEYXRhT3JnW2RhdGFPcmdLZXlCeUZvcm1dXHJcblx0XHRcdFx0XHRcdFx0OiBudWxsO1xyXG5cdFx0XHRcdFx0XHQvLyBjb25zdCBkYXRhT3JnVmFsdWVCeUZvcm0gPSBsRGF0YU9yZ1tkYXRhT3JnS2V5QnlGb3JtXTtcclxuXHRcdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHRcdHN1YlRva2VuLmxlbmd0aCA9PT0gMyAmJlxyXG5cdFx0XHRcdFx0XHRcdHR5cGVvZiBkYXRhT3JnVmFsdWUgIT09ICd1bmRlZmluZWQnICYmXHJcblx0XHRcdFx0XHRcdFx0ZGF0YU9yZ1ZhbHVlICE9PSBudWxsICYmXHJcblx0XHRcdFx0XHRcdFx0ZGF0YU9yZ1ZhbHVlLmhhc093blByb3BlcnR5KHN1YlRva2VuWzJdKVxyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHR2YWx1ZURhdGEgPSBkYXRhT3JnVmFsdWVbc3ViVG9rZW5bMl1dO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRcdFx0XHRcdHN1YlRva2VuLmxlbmd0aCA9PT0gMiAmJlxyXG5cdFx0XHRcdFx0XHRcdHR5cGVvZiBkYXRhT3JnVmFsdWUgIT09ICd1bmRlZmluZWQnICYmXHJcblx0XHRcdFx0XHRcdFx0ZGF0YU9yZ1ZhbHVlICE9PSBudWxsXHJcblx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdHZhbHVlRGF0YSA9IGRhdGFPcmdWYWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRpZiAobEZvcm1GaWVsZHNUb2tlbk9yZ1t0b2tlbi5rZXldKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZURhdGEgPSB0aGlzLnRva2VuU2VydmljZS5nZXRWYWx1ZUZyb21Gb3JtRmllbGQoXHJcblx0XHRcdFx0XHRcdFx0XHRcdGxGb3JtRmllbGRzVG9rZW5PcmdbdG9rZW4ua2V5XSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWVEYXRhXHJcblx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR2YWx1ZURhdGEgPSB2YWx1ZURhdGEgPyB2YWx1ZURhdGEgOiAnJztcclxuXHRcdFx0XHRcdFx0dG9rZW5UcmFuc2xhdGVkID0gdmFsdWVEYXRhO1xyXG5cdFx0XHRcdFx0XHRodG1sID0gdGhpcy50b2tlblNlcnZpY2UucmVwbGFjZVRva2VuKGh0bWwsIHRva2VuLnZhbHVlLCB2YWx1ZURhdGEpO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdGNhc2UgVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0JVREdFVDogLy9CdWRnZXRcclxuXHRcdFx0XHRcdFx0Y29uc3QgYnVkZ2V0UmVzb2x2ZVRva2VuID0gdGhpcy5yZXNvbHZlQnVkZ2V0VG9rZW4oaHRtbCwgdG9rZW4sIHN1YlRva2VuKTtcclxuXHRcdFx0XHRcdFx0aHRtbCA9IGJ1ZGdldFJlc29sdmVUb2tlbi5odG1sO1xyXG5cdFx0XHRcdFx0XHR0b2tlblRyYW5zbGF0ZWQgPSBidWRnZXRSZXNvbHZlVG9rZW4udmFsdWU7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0Y2FzZSBUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfVEFTS0w6IC8vVGFza1xyXG5cdFx0XHRcdFx0XHRjb25zdCB0YXNrUmVzb2x2ZVRva2VuID0gdGhpcy5yZXNvbHZlVGFza29rZW4oaHRtbCwgdG9rZW4sIHN1YlRva2VuKTtcclxuXHRcdFx0XHRcdFx0aHRtbCA9IHRhc2tSZXNvbHZlVG9rZW4uaHRtbDtcclxuXHRcdFx0XHRcdFx0dG9rZW5UcmFuc2xhdGVkID0gdGFza1Jlc29sdmVUb2tlbi52YWx1ZTtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRjYXNlIFRva2VuU2VydmljZS5UT0tFTl9MQUJFTF9TVEFUSUM6IC8vU3RhdGljXHJcblx0XHRcdFx0XHRcdGNvbnN0IHN0YXRpY1Jlc29sdmVUb2tlbiA9IGF3YWl0IHRoaXMucmVzb2x2ZVN0YXRpY1Rva2VuKFxyXG5cdFx0XHRcdFx0XHRcdGh0bWwsXHJcblx0XHRcdFx0XHRcdFx0dG9rZW4sXHJcblx0XHRcdFx0XHRcdFx0c3ViVG9rZW5cclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0aHRtbCA9IHN0YXRpY1Jlc29sdmVUb2tlbi5odG1sO1xyXG5cdFx0XHRcdFx0XHR0b2tlblRyYW5zbGF0ZWQgPSBzdGF0aWNSZXNvbHZlVG9rZW4udmFsdWU7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0Y2FzZSBUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfQ0FMQ1VMQVRFRDogLy9DYWxjdWxhdGVkXHJcblx0XHRcdFx0XHRcdC8vIFJlcGxhY2VzIGRlIHRva2VucyBvZiB0aGUgZm9ybXVsYVxyXG5cdFx0XHRcdFx0XHRjb25zdCB0b2tlbk5hbWU6IHN0cmluZyA9IGxUb2tlbnNDYWxjdWxhdGVkW3N1YlRva2VuWzFdXS5uYW1lO1xyXG5cdFx0XHRcdFx0XHRsZXQgZm9ybXVsYTogc3RyaW5nID0gbFRva2Vuc0NhbGN1bGF0ZWRbc3ViVG9rZW5bMV1dLmZvcm11bGE7XHJcblx0XHRcdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRcdFx0Ly9BUVVJXHJcblx0XHRcdFx0XHRcdFx0Zm9ybXVsYSA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbnNGcm9tTGlzdE9iamVjdChcclxuXHRcdFx0XHRcdFx0XHRcdHRva2VuTmFtZSxcclxuXHRcdFx0XHRcdFx0XHRcdGZvcm11bGEsXHJcblx0XHRcdFx0XHRcdFx0XHRsRGF0YU9yZ1xyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdFx0XHRcdFx0Zm9ybXVsYSA9IG51bGw7XHJcblx0XHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvcihlcnJvci5lcnJvciA/IGVycm9yLmVycm9yIDogZXJyb3IpO1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMudG9hc3RyU2VydmljZS53YXJuaW5nKGVycm9yLm1lc3NhZ2UsIGVycm9yLnRpdHRsZSk7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdC8vIFRyeSB0byBldmFsdWF0ZSB0aGUgZm9ybXVsYVxyXG5cdFx0XHRcdFx0XHRsZXQgcmVzdWx0OiBhbnkgPSBudWxsO1xyXG5cdFx0XHRcdFx0XHRpZiAoZm9ybXVsYSAhPT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRcdFx0XHRyZXN1bHQgPSBmb3JtdWxhLnN0YXJ0c1dpdGgoJ2ZpbGU6Ly8nKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ/IFwiPGltZyB3aWR0aD0nMjUwcHgnIGhlaWdodD0nYXV0bycgc3JjPSdcIiArIGZvcm11bGEgKyBcIicvPlwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdDogZXZhbChmb3JtdWxhKTtcclxuXHRcdFx0XHRcdFx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQnRXJyb3IgZXZhbHVhdGluZyB0aGUgZm9ybXVsYS4nLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRsVG9rZW5zQ2FsY3VsYXRlZCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0c3ViVG9rZW4sXHJcblx0XHRcdFx0XHRcdFx0XHRcdGVcclxuXHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnRvYXN0clNlcnZpY2UuZXJyb3IoXHJcblx0XHRcdFx0XHRcdFx0XHRcdCdObyBzZSBsb2dybyBldmFsdWFyIGxhIGZvcm11bGFyIGRlbCB0b2tlbiAnICsgdG9rZW5OYW1lLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQnRXJyb3IhJ1xyXG5cdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0aWYgKHJlc3VsdCAhPT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0aHRtbCA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihodG1sLCB0b2tlbi52YWx1ZSwgcmVzdWx0KTtcclxuXHRcdFx0XHRcdFx0XHRcdHRva2VuVHJhbnNsYXRlZCA9IHJlc3VsdDtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHRva2VuVHlwZVRyYW5zbGF0ZWRbdHlwZVRva2VuXVt0b2tlbi5rZXldID0gdG9rZW5UcmFuc2xhdGVkO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHR0aGlzLm9uR2VuZXJhdGUuZW1pdCh7XHJcblx0XHRcdGh0bWw6IGh0bWwsXHJcblx0XHRcdHRva2VuVHlwZVRyYW5zbGF0ZWQ6IHRva2VuVHlwZVRyYW5zbGF0ZWRcclxuXHRcdH0pO1xyXG5cdFx0Ly8gfVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVHJ5IHRvIGZpbmQgdGhlIGJ1ZGdldCBpbmZvIHRvIHRyYW5zbGF0ZSB0aGUgdG9rZW4uXHJcblx0ICogQHBhcmFtIGh0bWxcclxuXHQgKiBAcGFyYW0gdG9rZW5cclxuXHQgKiBAcGFyYW0gc3ViVG9rZW5cclxuXHQgKi9cclxuXHRyZXNvbHZlQnVkZ2V0VG9rZW4oaHRtbDogc3RyaW5nLCB0b2tlbjogYW55LCBzdWJUb2tlbjogc3RyaW5nW10pOiBhbnkge1xyXG5cdFx0bGV0IHRwcmVzQ29kaWdvOiBudW1iZXIgPSBOdW1iZXIoc3ViVG9rZW5bMV0pO1xyXG5cdFx0bGV0IHRva2VuVmFsdWU6IHN0cmluZyA9IHN1YlRva2VuWzJdO1xyXG5cdFx0bGV0IGJ1ZGdldER0bzogQnVkZ2V0RHRvID0gbnVsbDtcclxuXHRcdGxldCBpZFRvdGFsQnVkZ2V0OiBzdHJpbmcgPSBudWxsO1xyXG5cdFx0aWYgKFxyXG5cdFx0XHR0aGlzLmJ1ZGdldER0b1ByaW1hcnkgJiZcclxuXHRcdFx0dGhpcy5idWRnZXREdG9QcmltYXJ5LmJ1ZGdldCAmJlxyXG5cdFx0XHR0cHJlc0NvZGlnbyA9PSBFVGlwb1ByZXN1cHVlc3RvLlBSSU1BUllcclxuXHRcdCkge1xyXG5cdFx0XHRidWRnZXREdG8gPSB0aGlzLmJ1ZGdldER0b1ByaW1hcnk7XHJcblx0XHRcdGlkVG90YWxCdWRnZXQgPSAncGxpLXRva2VuLXByaW5jaXBhbC1idWRnZXQtdG90YWwtc3VtbWFyeSc7XHJcblx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHR0aGlzLmJ1ZGdldER0b1NlY3VuZGFyeSAmJlxyXG5cdFx0XHR0aGlzLmJ1ZGdldER0b1NlY3VuZGFyeS5idWRnZXQgJiZcclxuXHRcdFx0dHByZXNDb2RpZ28gPT0gRVRpcG9QcmVzdXB1ZXN0by5TRUNPTkRBUllcclxuXHRcdCkge1xyXG5cdFx0XHRidWRnZXREdG8gPSB0aGlzLmJ1ZGdldER0b1NlY3VuZGFyeTtcclxuXHRcdFx0aWRUb3RhbEJ1ZGdldCA9ICdwbGktdG9rZW4tc2VjdW5kYXJ5LWJ1ZGdldC10b3RhbC1zdW1tYXJ5JztcclxuXHRcdH1cclxuXHRcdGlmIChidWRnZXREdG8gPT09IG51bGwgfHwgIWJ1ZGdldER0by5idWRnZXQpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcihcclxuXHRcdFx0XHQnTm8gc2UgbG9ncm8gZW5jb250cmFyIGVsIHByZXN1cHVlc3RvIGRlbCB0b2tlbi4nLFxyXG5cdFx0XHRcdHRva2VuLFxyXG5cdFx0XHRcdHRoaXMuYnVkZ2V0RHRvUHJpbWFyeSxcclxuXHRcdFx0XHR0aGlzLmJ1ZGdldER0b1NlY3VuZGFyeVxyXG5cdFx0XHQpO1xyXG5cdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdGh0bWw6IGh0bWwsXHJcblx0XHRcdFx0dmFsdWU6IG51bGxcclxuXHRcdFx0fTtcclxuXHRcdH1cclxuXHRcdGxldCB2YWx1ZURhdGEgPSBudWxsO1xyXG5cdFx0Y29uc3QgYXBwbGljYXRpb25Qcm9jZXNzID1cclxuXHRcdFx0dG9rZW5WYWx1ZSA9PSBUb2tlblNlcnZpY2UuQlVER0VUX1RPS0VOU19LRVlfQVBQTElDQVRJT05fUFJPQ0VTU19UT1RBTF9BTU9VTlQgfHxcclxuXHRcdFx0dG9rZW5WYWx1ZSA9PSBUb2tlblNlcnZpY2UuQlVER0VUX1RPS0VOU19LRVlfQVBQTElDQVRJT05fUFJPQ0VTU19UT1RBTF9PV05fRk9VTkRTIHx8XHJcblx0XHRcdHRva2VuVmFsdWUgPT0gVG9rZW5TZXJ2aWNlLkJVREdFVF9UT0tFTlNfS0VZX0FQUExJQ0FUSU9OX1BST0NFU1NfVE9UQUxfRklOQU5DSU5HO1xyXG5cdFx0Y29uc3QgbGVnYWxpemF0aW9uUHJvY2VzcyA9XHJcblx0XHRcdHRva2VuVmFsdWUgPT0gVG9rZW5TZXJ2aWNlLkJVREdFVF9UT0tFTlNfS0VZX0xFR0FMSVpBVElPTl9QUk9DRVNTX1RPVEFMX0FNT1VOVCB8fFxyXG5cdFx0XHR0b2tlblZhbHVlID09IFRva2VuU2VydmljZS5CVURHRVRfVE9LRU5TX0tFWV9MRUdBTElaQVRJT05fUFJPQ0VTU19UT1RBTF9PV05fRk9VTkRTIHx8XHJcblx0XHRcdHRva2VuVmFsdWUgPT0gVG9rZW5TZXJ2aWNlLkJVREdFVF9UT0tFTlNfS0VZX0xFR0FMSVpBVElPTl9QUk9DRVNTX1RPVEFMX0ZJTkFOQ0lORztcclxuXHJcblx0XHRpZiAodG9rZW5WYWx1ZSA9PSBUb2tlblNlcnZpY2UuQlVER0VUX1RPS0VOU19LRVlfVE9UQUxfQU1PVU5UKSB7XHJcblx0XHRcdHZhbHVlRGF0YSA9XHJcblx0XHRcdFx0YnVkZ2V0RHRvLmJ1ZGdldCAmJiBidWRnZXREdG8uYnVkZ2V0LnN1bW1hcnlcclxuXHRcdFx0XHRcdD8gdGhpcy5jdXJyZW5jeVBpcGUudHJhbnNmb3JtKFxyXG5cdFx0XHRcdFx0XHRcdGJ1ZGdldER0by5idWRnZXQuc3VtbWFyeS5idWRnZXRUb3RhbCxcclxuXHRcdFx0XHRcdFx0XHQnZGVmYXVsdCcsXHJcblx0XHRcdFx0XHRcdFx0JycsXHJcblx0XHRcdFx0XHRcdFx0JzEuMC0wJ1xyXG5cdFx0XHRcdFx0ICApXHJcblx0XHRcdFx0XHQ6IDA7XHJcblx0XHR9IGVsc2UgaWYgKHRva2VuVmFsdWUgPT0gVG9rZW5TZXJ2aWNlLkJVREdFVF9UT0tFTlNfS0VZX1JFU1VNRV9DQVRFR09SWV9ZRUFSKSB7XHJcblx0XHRcdC8vIHRoaXMuYWRkSW5mb1Rva2VuUmVzdW1lQ2F0ZWdvcnlZZWFyKHRwcmVzQ29kaWdvLCBpZFRvdGFsQnVkZ2V0LCBidWRnZXREdG8pO1xyXG5cdFx0XHR0aGlzLmFkZEluZm9Ub2tlblJlc3VtZUNhdGVnb3J5WWVhcih0cHJlc0NvZGlnbywgaWRUb3RhbEJ1ZGdldCwgYnVkZ2V0RHRvKTtcclxuXHRcdFx0Y29uc3QgcGxpVG9rZW5Ub3RhbEJ1ZGdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkVG90YWxCdWRnZXQpO1xyXG5cdFx0XHRpZiAocGxpVG9rZW5Ub3RhbEJ1ZGdldCkge1xyXG5cdFx0XHRcdHZhbHVlRGF0YSA9IHRoaXMucmVtb3ZlQ29tbWVudHNIdG1sKHBsaVRva2VuVG90YWxCdWRnZXQuaW5uZXJIVE1MKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRjb25zb2xlLmxvZygncGxpVG9rZW5Ub3RhbEJ1ZGdldCAtIE5VTEwnLCBwbGlUb2tlblRvdGFsQnVkZ2V0KTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmICh0b2tlblZhbHVlID09IFRva2VuU2VydmljZS5CVURHRVRfVE9LRU5TX0tFWV9GRUNIQV9GSU5BTkNJTkdfU1RBUlQpIHtcclxuXHRcdFx0dmFsdWVEYXRhID1cclxuXHRcdFx0XHRidWRnZXREdG8uYnVkZ2V0ICYmIGJ1ZGdldER0by5idWRnZXQuZmluYW5jaW5nU3RhcnRcclxuXHRcdFx0XHRcdD8gYnVkZ2V0RHRvLmJ1ZGdldC5maW5hbmNpbmdTdGFydFxyXG5cdFx0XHRcdFx0OiAnJztcclxuXHJcblx0XHRcdGh0bWwgPSB0aGlzLnRva2VuU2VydmljZS5yZXBsYWNlVG9rZW4oXHJcblx0XHRcdFx0aHRtbCxcclxuXHRcdFx0XHR0b2tlbi52YWx1ZSxcclxuXHRcdFx0XHR2YWx1ZURhdGEsXHJcblx0XHRcdFx0dGhpcy5kYXRhPy5pZGlvbWE/LmxvY2FsZVxyXG5cdFx0XHQpO1xyXG5cdFx0fSBlbHNlIGlmICh0b2tlblZhbHVlID09IFRva2VuU2VydmljZS5CVURHRVRfVE9LRU5TX0tFWV9GRUNIQV9GSU5BTkNJTkdfRU5EKSB7XHJcblx0XHRcdHZhbHVlRGF0YSA9XHJcblx0XHRcdFx0YnVkZ2V0RHRvLmJ1ZGdldCAmJiBidWRnZXREdG8uYnVkZ2V0LmZpbmFuY2luZ0VuZFxyXG5cdFx0XHRcdFx0PyBidWRnZXREdG8uYnVkZ2V0LmZpbmFuY2luZ0VuZFxyXG5cdFx0XHRcdFx0OiAnJztcclxuXHJcblx0XHRcdGh0bWwgPSB0aGlzLnRva2VuU2VydmljZS5yZXBsYWNlVG9rZW4oXHJcblx0XHRcdFx0aHRtbCxcclxuXHRcdFx0XHR0b2tlbi52YWx1ZSxcclxuXHRcdFx0XHR2YWx1ZURhdGEsXHJcblx0XHRcdFx0dGhpcy5kYXRhPy5pZGlvbWE/LmxvY2FsZVxyXG5cdFx0XHQpO1xyXG5cdFx0fSBlbHNlIGlmICh0b2tlblZhbHVlID09IFRva2VuU2VydmljZS5CVURHRVRfVE9LRU5TX0RVUkFUSU9OX1NUVURJRVMpIHtcclxuXHRcdFx0dmFsdWVEYXRhID1cclxuXHRcdFx0XHRidWRnZXREdG8uYnVkZ2V0ICYmIGJ1ZGdldER0by5idWRnZXQuc3R1ZHlTdGFydCAmJiBidWRnZXREdG8uYnVkZ2V0LnN0dWR5RW5kXHJcblx0XHRcdFx0XHQ/IERhdGVVdGlsLmVsYXBzZWRNb250aHMoXHJcblx0XHRcdFx0XHRcdFx0YnVkZ2V0RHRvLmJ1ZGdldC5zdHVkeVN0YXJ0LFxyXG5cdFx0XHRcdFx0XHRcdGJ1ZGdldER0by5idWRnZXQuc3R1ZHlFbmRcclxuXHRcdFx0XHRcdCAgKSArIDFcclxuXHRcdFx0XHRcdDogJyc7XHJcblx0XHR9IGVsc2UgaWYgKHRva2VuVmFsdWUgPT0gVG9rZW5TZXJ2aWNlLkJVREdFVF9UT0tFTlNfRklOQU5DSU5HX0RVUkFUSU9OKSB7XHJcblx0XHRcdHZhbHVlRGF0YSA9XHJcblx0XHRcdFx0YnVkZ2V0RHRvLmJ1ZGdldCAmJiBidWRnZXREdG8uYnVkZ2V0LmZpbmFuY2luZ0VuZCAmJiBidWRnZXREdG8uYnVkZ2V0LmZpbmFuY2luZ1N0YXJ0XHJcblx0XHRcdFx0XHQ/IERhdGVVdGlsLmVsYXBzZWRNb250aHMoXHJcblx0XHRcdFx0XHRcdFx0YnVkZ2V0RHRvLmJ1ZGdldC5maW5hbmNpbmdTdGFydCxcclxuXHRcdFx0XHRcdFx0XHRidWRnZXREdG8uYnVkZ2V0LmZpbmFuY2luZ0VuZFxyXG5cdFx0XHRcdFx0ICApICsgMVxyXG5cdFx0XHRcdFx0OiAnJztcclxuXHRcdH0gZWxzZSBpZiAodG9rZW5WYWx1ZSA9PSBUb2tlblNlcnZpY2UuTEVHQUxJWkFUSU9OX09SX0FQUExJQ0FUSU9OX1RPVEFMX0ZJTkFOQ0lORykge1xyXG5cdFx0XHQvLyBKTVAgLSBNYW50aXMgNjY3NCAtIEFkZCBsb2dpYyB0byBsZWdhbGl6YXRpb24gb3IgYXBwbGljYXRpb24gdG90YWwgZmluYW5jaW5nXHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHR0aGlzLmRhdGEgJiZcclxuXHRcdFx0XHR0aGlzLmRhdGEuZGF0YUZvcm1BcHBsaWNhdGlvbiAmJlxyXG5cdFx0XHRcdHRoaXMuZGF0YS5kYXRhRm9ybUFwcGxpY2F0aW9uLmJ1ZGdldFxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRjb25zdCBidWRnZXQgPSB0aGlzLmRhdGEuZGF0YUZvcm1BcHBsaWNhdGlvbi5idWRnZXQ7XHJcblxyXG5cdFx0XHRcdGlmIChidWRnZXQubGVnYWxpemF0aW9uUHJvY2VzcyAmJiBidWRnZXQubGVnYWxpemF0aW9uUHJvY2Vzcy50b3RhbEZpbmFuY2luZykge1xyXG5cdFx0XHRcdFx0Y29uc3QgdG90YWxGaW5hbmNpbmcgPSBOdW1iZXIoYnVkZ2V0LmxlZ2FsaXphdGlvblByb2Nlc3MudG90YWxGaW5hbmNpbmcpO1xyXG5cdFx0XHRcdFx0dmFsdWVEYXRhID0gdG90YWxGaW5hbmNpbmcgKiAxLjAwMztcclxuXHRcdFx0XHR9IGVsc2UgaWYgKGJ1ZGdldC5hcHBsaWNhdGlvblByb2Nlc3MgJiYgYnVkZ2V0LmFwcGxpY2F0aW9uUHJvY2Vzcy50b3RhbEZpbmFuY2luZykge1xyXG5cdFx0XHRcdFx0dmFsdWVEYXRhID0gTnVtYmVyKGJ1ZGdldC5hcHBsaWNhdGlvblByb2Nlc3MudG90YWxGaW5hbmNpbmcpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0KGFwcGxpY2F0aW9uUHJvY2VzcyB8fCBsZWdhbGl6YXRpb25Qcm9jZXNzKSAmJlxyXG5cdFx0XHR0aGlzLmRhdGEgJiZcclxuXHRcdFx0dGhpcy5kYXRhLmRhdGFGb3JtQXBwbGljYXRpb24gJiZcclxuXHRcdFx0dGhpcy5kYXRhLmRhdGFGb3JtQXBwbGljYXRpb24uYnVkZ2V0XHJcblx0XHQpIHtcclxuXHRcdFx0Ly8gR2V0IHRoZSB0b3RhbCBidWRnZXQgYW1vdW50IGRlcGVuZCBvZiB0aGUgcHJvY2Vzc1xyXG5cdFx0XHRjb25zdCBhcHBCdWRnZXRUb3RhbDogQXBwbGljYXRpb25CdWRnZXRUb3RhbCA9IGFwcGxpY2F0aW9uUHJvY2Vzc1xyXG5cdFx0XHRcdD8gdGhpcy5kYXRhLmRhdGFGb3JtQXBwbGljYXRpb24uYnVkZ2V0LmFwcGxpY2F0aW9uUHJvY2Vzc1xyXG5cdFx0XHRcdDogdGhpcy5kYXRhLmRhdGFGb3JtQXBwbGljYXRpb24uYnVkZ2V0LmxlZ2FsaXphdGlvblByb2Nlc3M7XHJcblx0XHRcdGlmIChhcHBCdWRnZXRUb3RhbCAhPSB1bmRlZmluZWQgJiYgYXBwQnVkZ2V0VG90YWwgIT0gbnVsbCkge1xyXG5cdFx0XHRcdC8vIG5vIG1hdHRlciB0aGUgcHJvY2VzcywgdGhlIGNsYXNzIGlzIHRoZSBzYW1lXHJcblx0XHRcdFx0c3dpdGNoICh0b2tlblZhbHVlKSB7XHJcblx0XHRcdFx0XHRjYXNlIFRva2VuU2VydmljZS5CVURHRVRfVE9LRU5TX0tFWV9BUFBMSUNBVElPTl9QUk9DRVNTX1RPVEFMX0FNT1VOVDpcclxuXHRcdFx0XHRcdGNhc2UgVG9rZW5TZXJ2aWNlLkJVREdFVF9UT0tFTlNfS0VZX0xFR0FMSVpBVElPTl9QUk9DRVNTX1RPVEFMX0FNT1VOVDpcclxuXHRcdFx0XHRcdFx0dmFsdWVEYXRhID0gYXBwQnVkZ2V0VG90YWwudG90YWxBbW91bnQ7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0Y2FzZSBUb2tlblNlcnZpY2UuQlVER0VUX1RPS0VOU19LRVlfQVBQTElDQVRJT05fUFJPQ0VTU19UT1RBTF9PV05fRk9VTkRTOlxyXG5cdFx0XHRcdFx0Y2FzZSBUb2tlblNlcnZpY2UuQlVER0VUX1RPS0VOU19LRVlfTEVHQUxJWkFUSU9OX1BST0NFU1NfVE9UQUxfT1dOX0ZPVU5EUzpcclxuXHRcdFx0XHRcdFx0dmFsdWVEYXRhID0gYXBwQnVkZ2V0VG90YWwudG90YWxPd25GdW5kcztcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRjYXNlIFRva2VuU2VydmljZS5CVURHRVRfVE9LRU5TX0tFWV9BUFBMSUNBVElPTl9QUk9DRVNTX1RPVEFMX0ZJTkFOQ0lORzpcclxuXHRcdFx0XHRcdGNhc2UgVG9rZW5TZXJ2aWNlLkJVREdFVF9UT0tFTlNfS0VZX0xFR0FMSVpBVElPTl9QUk9DRVNTX1RPVEFMX0ZJTkFOQ0lORzpcclxuXHRcdFx0XHRcdFx0dmFsdWVEYXRhID0gYXBwQnVkZ2V0VG90YWwudG90YWxGaW5hbmNpbmc7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmICh0b2tlblZhbHVlID09IFRva2VuU2VydmljZS5CVURHRVRfVE9LRU5TX0tFWV9JTlNVUkFOQ0VfQU1PVU5UKSB7XHJcblx0XHRcdGxldCB0b3RhbEZpbmFuY2luZyA9XHJcblx0XHRcdFx0dGhpcy5kYXRhLmRhdGFGb3JtQXBwbGljYXRpb24uYnVkZ2V0LmxlZ2FsaXphdGlvblByb2Nlc3MgJiZcclxuXHRcdFx0XHR0aGlzLmRhdGEuZGF0YUZvcm1BcHBsaWNhdGlvbi5idWRnZXQubGVnYWxpemF0aW9uUHJvY2Vzcy50b3RhbEZpbmFuY2luZztcclxuXHRcdFx0dG90YWxGaW5hbmNpbmcgPVxyXG5cdFx0XHRcdHRvdGFsRmluYW5jaW5nID09IHVuZGVmaW5lZCB8fCB0b3RhbEZpbmFuY2luZyA9PSBudWxsID8gMCA6IE51bWJlcih0b3RhbEZpbmFuY2luZyk7XHJcblx0XHRcdC8vIGxldCB0b3RhbEluc3VyYW5jZUFtb3VudCA9IHRoaXMuZGF0YS5kYXRhRm9ybUFwcGxpY2F0aW9uLnRvdGFsSW5zdXJhbmNlQW1vdW50O1xyXG5cdFx0XHQvLyB0b3RhbEluc3VyYW5jZUFtb3VudCA9XHJcblx0XHRcdC8vIFx0dG90YWxJbnN1cmFuY2VBbW91bnQgPT0gdW5kZWZpbmVkIHx8IHRvdGFsSW5zdXJhbmNlQW1vdW50ID09IG51bGxcclxuXHRcdFx0Ly8gXHRcdD8gMFxyXG5cdFx0XHQvLyBcdFx0OiBOdW1iZXIodG90YWxJbnN1cmFuY2VBbW91bnQpO1xyXG5cdFx0XHR2YWx1ZURhdGEgPSB0b3RhbEZpbmFuY2luZyAqIDEuMDAzO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Ly8gV2hlbiB0aGUgdG9rZW4gY2FuJ3QgYmUgcmVzb2x2ZVxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCdyZXNvbHZlQnVkZ2V0VG9rZW4gLU5vIHNlIGxvZ3JvIHJlc29sdmVyIGVsIHRva2VuIGRlIHRpcG8gcHJlc3VwdWVzdG8nKTtcclxuXHRcdH1cclxuXHRcdHZhbHVlRGF0YSA9IHZhbHVlRGF0YSA9PT0gbnVsbCA/ICcnIDogdmFsdWVEYXRhO1xyXG5cdFx0aHRtbCA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihodG1sLCB0b2tlbi52YWx1ZSwgdmFsdWVEYXRhKTtcclxuXHRcdHJldHVybiB7XHJcblx0XHRcdGh0bWw6IGh0bWwsXHJcblx0XHRcdHZhbHVlOiB2YWx1ZURhdGFcclxuXHRcdH07XHJcblx0fVxyXG5cdHJlc29sdmVUYXNrb2tlbihodG1sOiBzdHJpbmcsIHRva2VuOiBhbnksIHN1YlRva2VuOiBzdHJpbmdbXSk6IGFueSB7XHJcblx0XHRsZXQgdmFsdWVUYXNrID0gbnVsbDtcclxuXHRcdGlmIChzdWJUb2tlbi5sZW5ndGggPiAyKSB7XHJcblx0XHRcdGxldCB0YXNrSWQgPSBOdW1iZXIoc3ViVG9rZW5bMl0pO1xyXG5cdFx0XHRsZXQgdGFzayA9IHRoaXMuZXZhbHVhdGlvbi50YXNrcy5maW5kKCh0KSA9PiB0LmlkVGFzayA9PSB0YXNrSWQpO1xyXG5cdFx0XHR2YWx1ZVRhc2sgPSB0YXNrLnJlc3VsdDtcclxuXHRcdH1cclxuXHRcdGh0bWwgPSB0aGlzLnRva2VuU2VydmljZS5yZXBsYWNlVG9rZW4oaHRtbCwgdG9rZW4udmFsdWUsIHZhbHVlVGFzayk7XHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHRodG1sOiBodG1sLFxyXG5cdFx0XHR2YWx1ZTogdmFsdWVUYXNrXHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0YXN5bmMgcmVzb2x2ZVN0YXRpY1Rva2VuKGh0bWw6IHN0cmluZywgdG9rZW46IGFueSwgc3ViVG9rZW46IHN0cmluZ1tdKTogUHJvbWlzZTxhbnk+IHtcclxuXHRcdGxldCB2YWx1ZVJlcGxhY2U6IGFueSA9IG51bGw7XHJcblx0XHRpZiAoXHJcblx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT1cclxuXHRcdFx0VG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX0NPRElHT19WRVJJRklDQUNJT04udG9Mb3dlckNhc2UoKVxyXG5cdFx0KSB7XHJcblx0XHRcdHZhbHVlUmVwbGFjZSA9IHRoaXMudW5pcXVlVmVyaWZpY2F0aW9uQ29kZTtcclxuXHRcdFx0aHRtbCA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihodG1sLCB0b2tlbi52YWx1ZSwgdGhpcy51bmlxdWVWZXJpZmljYXRpb25Db2RlKTtcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT1cclxuXHRcdFx0VG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX0FfUVVJRU5fVkFfRElSSUdJRE8udG9Mb3dlckNhc2UoKVxyXG5cdFx0KSB7XHJcblx0XHRcdC8vIGlmICh0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uKSB7XHJcblx0XHRcdGh0bWwgPSB0aGlzLnJlc29sdmVTdGF0aWNUb2tlbnNLZXlBUXVpZW5WYURpcmlnaWRvKGh0bWwsIHRva2VuLnZhbHVlKTtcclxuXHRcdFx0dmFsdWVSZXBsYWNlID0gJyc7XHJcblx0XHRcdC8vIH1cclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT0gVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX0xFVFRFUl9TSUdOLnRvTG93ZXJDYXNlKClcclxuXHRcdCkge1xyXG5cdFx0XHRodG1sID0gdGhpcy5yZXNvbHZlU3RhdGljVG9rZW5zS2V5U2lnbihodG1sLCB0b2tlbi52YWx1ZSwgc3ViVG9rZW4pO1xyXG5cdFx0XHR2YWx1ZVJlcGxhY2UgPSAnJztcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT1cclxuXHRcdFx0VG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX1NBTFVET19DT01QTEVNRU5UQVJJTy50b0xvd2VyQ2FzZSgpXHJcblx0XHQpIHtcclxuXHRcdFx0Ly8gaWYgKHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24pIHtcclxuXHRcdFx0aHRtbCA9IHRoaXMucmVzb2x2ZVN0YXRpY1Rva2Vuc0tleVNhbHVkb0NvbXBsZW1lbnRhcmlvKGh0bWwsIHRva2VuLnZhbHVlKTtcclxuXHRcdFx0dmFsdWVSZXBsYWNlID0gJyc7XHJcblx0XHRcdC8vIH1cclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT0gVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX0ZFQ0hBX0FDVFVBTC50b0xvd2VyQ2FzZSgpXHJcblx0XHQpIHtcclxuXHRcdFx0dmFsdWVSZXBsYWNlID0gbmV3IERhdGUoKTtcclxuXHRcdFx0aHRtbCA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihodG1sLCB0b2tlbi52YWx1ZSwgbmV3IERhdGUoKSk7XHJcblx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRzdWJUb2tlblsxXS50b0xvd2VyQ2FzZSgpID09IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9QQVRST0NJTkFET1IudG9Mb3dlckNhc2UoKVxyXG5cdFx0KSB7XHJcblx0XHRcdGNvbnN0IHBhdE5vbWJyZSA9XHJcblx0XHRcdFx0dGhpcy5kYXRhLnBsaVByb21vY2lvbiAmJlxyXG5cdFx0XHRcdHRoaXMuZGF0YS5wbGlQcm9tb2Npb24ucGxpUHJvZ3JhbWEgJiZcclxuXHRcdFx0XHR0aGlzLmRhdGEucGxpUHJvbW9jaW9uLnBsaVByb2dyYW1hLnBsaVBhdHJvY2luYWRvclxyXG5cdFx0XHRcdFx0PyB0aGlzLmRhdGEucGxpUHJvbW9jaW9uLnBsaVByb2dyYW1hLnBsaVBhdHJvY2luYWRvci5wYXROb21icmVcclxuXHRcdFx0XHRcdDogJyc7XHJcblx0XHRcdHZhbHVlUmVwbGFjZSA9IHBhdE5vbWJyZTtcclxuXHRcdFx0aHRtbCA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihodG1sLCB0b2tlbi52YWx1ZSwgcGF0Tm9tYnJlKTtcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT0gVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX1BST0dSQU1BLnRvTG93ZXJDYXNlKClcclxuXHRcdCkge1xyXG5cdFx0XHRjb25zdCBwcm9nTm9tYnJlID1cclxuXHRcdFx0XHR0aGlzLmRhdGEucGxpUHJvbW9jaW9uICYmIHRoaXMuZGF0YS5wbGlQcm9tb2Npb24ucGxpUHJvZ3JhbWFcclxuXHRcdFx0XHRcdD8gdGhpcy5kYXRhLnBsaVByb21vY2lvbi5wbGlQcm9ncmFtYS5wcm9nTm9tYnJlXHJcblx0XHRcdFx0XHQ6ICcnO1xyXG5cdFx0XHR2YWx1ZVJlcGxhY2UgPSBwcm9nTm9tYnJlO1xyXG5cdFx0XHRodG1sID0gdGhpcy50b2tlblNlcnZpY2UucmVwbGFjZVRva2VuKGh0bWwsIHRva2VuLnZhbHVlLCBwcm9nTm9tYnJlKTtcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT0gVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX1BST01PQ0lPTi50b0xvd2VyQ2FzZSgpXHJcblx0XHQpIHtcclxuXHRcdFx0Y29uc3QgcHJvbU5vbWJyZSA9IHRoaXMuZGF0YS5wbGlQcm9tb2Npb24gPyB0aGlzLmRhdGEucGxpUHJvbW9jaW9uLnByb21Ob21icmUgOiAnJztcclxuXHRcdFx0dmFsdWVSZXBsYWNlID0gcHJvbU5vbWJyZTtcclxuXHRcdFx0aHRtbCA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihodG1sLCB0b2tlbi52YWx1ZSwgcHJvbU5vbWJyZSk7XHJcblx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRzdWJUb2tlblsxXS50b0xvd2VyQ2FzZSgpID09IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9BTklPX1BST01PQ0lPTi50b0xvd2VyQ2FzZSgpXHJcblx0XHQpIHtcclxuXHRcdFx0Y29uc3QgYW5pb1Byb21vY2lvbiA9XHJcblx0XHRcdFx0dGhpcy5kYXRhLnBsaVByb21vY2lvbiAmJiB0aGlzLmRhdGEucGxpUHJvbW9jaW9uLnByb21BbmlvXHJcblx0XHRcdFx0XHQ/IHRoaXMuZGF0YS5wbGlQcm9tb2Npb24ucHJvbUFuaW9cclxuXHRcdFx0XHRcdDogMDtcclxuXHRcdFx0dmFsdWVSZXBsYWNlID0gYW5pb1Byb21vY2lvbjtcclxuXHRcdFx0aHRtbCA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihodG1sLCB0b2tlbi52YWx1ZSwgYW5pb1Byb21vY2lvbik7XHJcblx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRzdWJUb2tlblsxXS50b0xvd2VyQ2FzZSgpID09XHJcblx0XHRcdFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9JU09fTU9ORURBX0JBU0UudG9Mb3dlckNhc2UoKVxyXG5cdFx0KSB7XHJcblx0XHRcdGNvbnN0IGJhc2VDdXJyZW5jeSA9XHJcblx0XHRcdFx0dGhpcy5kYXRhLmJ1ZGdldER0b1ByaW1hcnkgJiYgdGhpcy5kYXRhLmJ1ZGdldER0b1ByaW1hcnkuYnVkZ2V0XHJcblx0XHRcdFx0XHQ/IHRoaXMuZGF0YS5idWRnZXREdG9QcmltYXJ5LmJ1ZGdldC5iYXNlQ3VycmVuY3lcclxuXHRcdFx0XHRcdDogdGhpcy5kYXRhLmJ1ZGdldER0b1NlY3VuZGFyeSAmJiB0aGlzLmRhdGEuYnVkZ2V0RHRvU2VjdW5kYXJ5LmJ1ZGdldFxyXG5cdFx0XHRcdFx0PyB0aGlzLmRhdGEuYnVkZ2V0RHRvU2VjdW5kYXJ5LmJ1ZGdldC5iYXNlQ3VycmVuY3lcclxuXHRcdFx0XHRcdDogJyc7XHJcblx0XHRcdHZhbHVlUmVwbGFjZSA9IGJhc2VDdXJyZW5jeTtcclxuXHRcdFx0aHRtbCA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihodG1sLCB0b2tlbi52YWx1ZSwgYmFzZUN1cnJlbmN5KTtcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT0gVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX1NUQVRVU19OQU1FLnRvTG93ZXJDYXNlKClcclxuXHRcdCkge1xyXG5cdFx0XHRjb25zdCBzdGF0dXNOYW1lID1cclxuXHRcdFx0XHR0aGlzLmRhdGEuZGF0YUZvcm1BcHBsaWNhdGlvbiAmJlxyXG5cdFx0XHRcdFV0aWxTdHJpbmcuaXNWYWxpZCh0aGlzLmRhdGEuZGF0YUZvcm1BcHBsaWNhdGlvbi5zdGF0ZU5hbWUpXHJcblx0XHRcdFx0XHQ/IHRoaXMuZGF0YS5kYXRhRm9ybUFwcGxpY2F0aW9uLnN0YXRlTmFtZVxyXG5cdFx0XHRcdFx0OiAnJztcclxuXHRcdFx0dmFsdWVSZXBsYWNlID0gc3RhdHVzTmFtZTtcclxuXHRcdFx0aHRtbCA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihodG1sLCB0b2tlbi52YWx1ZSwgc3RhdHVzTmFtZSk7XHJcblx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRzdWJUb2tlblsxXS50b0xvd2VyQ2FzZSgpID09IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9VU0VSX0lOSVRJQUxTLnRvTG93ZXJDYXNlKClcclxuXHRcdCkge1xyXG5cdFx0XHRjb25zdCBwbGlVc2VyOiBQbGlVc2VyID0gQXV0aGVudGljYXRpb25VdGlsLmdldFBsaVVzZXIoKTtcclxuXHRcdFx0dmFsdWVSZXBsYWNlID0gVXRpbFN0cmluZy5pbml0aWFsTGV0dGVycyhwbGlVc2VyLmZpcnN0bmFtZSArICcgJyArIHBsaVVzZXIubGFzdG5hbWUpO1xyXG5cdFx0XHRodG1sID0gdGhpcy50b2tlblNlcnZpY2UucmVwbGFjZVRva2VuKGh0bWwsIHRva2VuLnZhbHVlLCB2YWx1ZVJlcGxhY2UpO1xyXG5cdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0c3ViVG9rZW5bMV0udG9Mb3dlckNhc2UoKSA9PVxyXG5cdFx0XHRUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19LRVlfTlVNQkVSX0FQUExJQ0FUSU9OLnRvTG93ZXJDYXNlKClcclxuXHRcdCkge1xyXG5cdFx0XHRjb25zdCBudW1iZXIgPVxyXG5cdFx0XHRcdHRoaXMuZGF0YS5kYXRhRm9ybUFwcGxpY2F0aW9uICYmIHRoaXMuZGF0YS5kYXRhRm9ybUFwcGxpY2F0aW9uLm51bWJlclxyXG5cdFx0XHRcdFx0PyB0aGlzLmRhdGEuZGF0YUZvcm1BcHBsaWNhdGlvbi5udW1iZXJcclxuXHRcdFx0XHRcdDogbnVsbDtcclxuXHRcdFx0dmFsdWVSZXBsYWNlID0gbnVtYmVyO1xyXG5cdFx0XHRodG1sID0gdGhpcy50b2tlblNlcnZpY2UucmVwbGFjZVRva2VuKGh0bWwsIHRva2VuLnZhbHVlLCBudW1iZXIpO1xyXG5cdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0c3ViVG9rZW5bMV0udG9Mb3dlckNhc2UoKSA9PSBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DT01NSVRURUVfTkFNRS50b0xvd2VyQ2FzZSgpXHJcblx0XHQpIHtcclxuXHRcdFx0Y29uc3QgY29taXRlTm9tYnJlID1cclxuXHRcdFx0XHR0aGlzLmRhdGEuZGF0YUZvcm1CeUZvcm0gJiYgdGhpcy5kYXRhLmRhdGFGb3JtQnlGb3JtLmNvbWl0ZU5vbWJyZVxyXG5cdFx0XHRcdFx0PyB0aGlzLmRhdGEuZGF0YUZvcm1CeUZvcm0uY29taXRlTm9tYnJlXHJcblx0XHRcdFx0XHQ6IG51bGw7XHJcblx0XHRcdHZhbHVlUmVwbGFjZSA9IGNvbWl0ZU5vbWJyZTtcclxuXHRcdFx0aHRtbCA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihodG1sLCB0b2tlbi52YWx1ZSwgY29taXRlTm9tYnJlKTtcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT1cclxuXHRcdFx0VG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX1NFR01FTlRBVElPTi50b0xvd2VyQ2FzZSgpXHJcblx0XHQpIHtcclxuXHRcdFx0Y29uc3QgY29taXRlU2VnbWVudGFjaW9uID1cclxuXHRcdFx0XHR0aGlzLmRhdGEuZGF0YUZvcm1CeUZvcm0gJiZcclxuXHRcdFx0XHR0aGlzLmRhdGEuZGF0YUZvcm1CeUZvcm1bVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX1NFR01FTlRBVElPTl1cclxuXHRcdFx0XHRcdD8gdGhpcy5kYXRhLmRhdGFGb3JtQnlGb3JtW1Rva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPTU1JVFRFRV9TRUdNRU5UQVRJT05dXHJcblx0XHRcdFx0XHQ6IG51bGw7XHJcblx0XHRcdHZhbHVlUmVwbGFjZSA9IGNvbWl0ZVNlZ21lbnRhY2lvbjtcclxuXHRcdFx0aHRtbCA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihodG1sLCB0b2tlbi52YWx1ZSwgY29taXRlU2VnbWVudGFjaW9uKTtcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT1cclxuXHRcdFx0VG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX0FHR1JVUEFUSU9OLnRvTG93ZXJDYXNlKClcclxuXHRcdCkge1xyXG5cdFx0XHRjb25zdCBjb21pdGVBZ3J1cGFjaW9uID1cclxuXHRcdFx0XHR0aGlzLmRhdGEuZGF0YUZvcm1CeUZvcm0gJiZcclxuXHRcdFx0XHR0aGlzLmRhdGEuZGF0YUZvcm1CeUZvcm1bVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX0FHR1JVUEFUSU9OXVxyXG5cdFx0XHRcdFx0PyB0aGlzLmRhdGEuZGF0YUZvcm1CeUZvcm1bVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX0FHR1JVUEFUSU9OXVxyXG5cdFx0XHRcdFx0OiBudWxsO1xyXG5cdFx0XHR2YWx1ZVJlcGxhY2UgPSBjb21pdGVBZ3J1cGFjaW9uO1xyXG5cdFx0XHRodG1sID0gdGhpcy50b2tlblNlcnZpY2UucmVwbGFjZVRva2VuKGh0bWwsIHRva2VuLnZhbHVlLCBjb21pdGVBZ3J1cGFjaW9uKTtcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT1cclxuXHRcdFx0VG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX0NVVExJTkVfREFURS50b0xvd2VyQ2FzZSgpXHJcblx0XHQpIHtcclxuXHRcdFx0bGV0IGN1dExpbmVEYXRlID1cclxuXHRcdFx0XHR0aGlzLmRhdGEuZGF0YUZvcm1CeUZvcm0gJiZcclxuXHRcdFx0XHR0aGlzLmRhdGEuZGF0YUZvcm1CeUZvcm1bVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX0NVVExJTkVfREFURV1cclxuXHRcdFx0XHRcdD8gdGhpcy5kYXRhLmRhdGFGb3JtQnlGb3JtW1Rva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPTU1JVFRFRV9DVVRMSU5FX0RBVEVdXHJcblx0XHRcdFx0XHQ6IG51bGw7XHJcblx0XHRcdGlmIChjdXRMaW5lRGF0ZSBpbnN0YW5jZW9mIERhdGUpIHtcclxuXHRcdFx0XHRjdXRMaW5lRGF0ZSA9IGN1dExpbmVEYXRlLnRvU3RyaW5nKCk7XHJcblx0XHRcdH1cclxuXHRcdFx0dmFsdWVSZXBsYWNlID0gY3V0TGluZURhdGU7XHJcblx0XHRcdGh0bWwgPSB0aGlzLnRva2VuU2VydmljZS5yZXBsYWNlVG9rZW4oaHRtbCwgdG9rZW4udmFsdWUsIGN1dExpbmVEYXRlKTtcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT0gVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfVE9UQUxfV0VJR0hURUQudG9Mb3dlckNhc2UoKVxyXG5cdFx0KSB7XHJcblx0XHRcdGxldCBiZXN0U2NlbmFyaW9WYWx1ZTogYW55ID0gJyc7XHJcblx0XHRcdGlmICh0aGlzLmV2YWx1YXRpb24gJiYgdGhpcy5ldmFsdWF0aW9uLnNjZW5hcmlvcykge1xyXG5cdFx0XHRcdGxldCBiZXN0U2NlbmFyaW8gPSB0aGlzLmV2YWx1YXRpb24uc2NlbmFyaW9zLmZpbHRlcigocykgPT4gcy5iZXN0KVswXTtcclxuXHRcdFx0XHRpZiAoYmVzdFNjZW5hcmlvKSB7XHJcblx0XHRcdFx0XHRiZXN0U2NlbmFyaW9WYWx1ZSA9IGJlc3RTY2VuYXJpby5yZXN1bHQ7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGh0bWwgPSB0aGlzLnRva2VuU2VydmljZS5yZXBsYWNlVG9rZW4oaHRtbCwgdG9rZW4udmFsdWUsIGJlc3RTY2VuYXJpb1ZhbHVlKTtcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT1cclxuXHRcdFx0VG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfVVNFUl9UWVBFX0NSRURJVF9TVFVEWS50b0xvd2VyQ2FzZSgpXHJcblx0XHQpIHtcclxuXHRcdFx0Y29uc3QgdXNlclR5cGVDcmVkaXRTdHVkeSA9XHJcblx0XHRcdFx0dGhpcy5kYXRhLmRhdGFGb3JtQnlGb3JtICYmXHJcblx0XHRcdFx0dGhpcy5kYXRhLmRhdGFGb3JtQnlGb3JtW1Rva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX1VTRVJfVFlQRV9DUkVESVRfU1RVRFldXHJcblx0XHRcdFx0XHQ/IHRoaXMuZGF0YS5kYXRhRm9ybUJ5Rm9ybVtUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19VU0VSX1RZUEVfQ1JFRElUX1NUVURZXVxyXG5cdFx0XHRcdFx0OiBudWxsO1xyXG5cdFx0XHR2YWx1ZVJlcGxhY2UgPSB1c2VyVHlwZUNyZWRpdFN0dWR5O1xyXG5cdFx0XHRodG1sID0gdGhpcy50b2tlblNlcnZpY2UucmVwbGFjZVRva2VuKGh0bWwsIHRva2VuLnZhbHVlLCB1c2VyVHlwZUNyZWRpdFN0dWR5KTtcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT0gVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQkVOX0NPRElHTy50b0xvd2VyQ2FzZSgpXHJcblx0XHQpIHtcclxuXHRcdFx0dmFsdWVSZXBsYWNlID0gdGhpcy5kYXRhLmRhdGFGb3JtQXBwbGljYXRpb24uYmVuQ29kaWdvO1xyXG5cdFx0XHRodG1sID0gdGhpcy50b2tlblNlcnZpY2UucmVwbGFjZVRva2VuKFxyXG5cdFx0XHRcdGh0bWwsXHJcblx0XHRcdFx0dG9rZW4udmFsdWUsXHJcblx0XHRcdFx0dGhpcy5kYXRhLmRhdGFGb3JtQXBwbGljYXRpb24uYmVuQ29kaWdvXHJcblx0XHRcdCk7XHJcblx0XHR9IGVsc2UgaWYgKHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT0gVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTl9TVVJOQU1FLnRvTG93ZXJDYXNlKCkpIHtcclxuXHRcdFx0aWYgKFxyXG5cdFx0XHRcdHRoaXMuZGF0YS5kYXRhRm9ybUFwcGxpY2F0aW9uLnVzZXJuYW1lICYmXHJcblx0XHRcdFx0dGhpcy5kYXRhLmRhdGFGb3JtQXBwbGljYXRpb24udXNlcm5hbWUgIT09IG51bGxcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdGNvbnN0IHNlc2lvbiA9IGF3YWl0IHRoaXMuc2VzaW9uU2VydmljZVxyXG5cdFx0XHRcdFx0XHQuZ2V0QnlMb2dpbih0aGlzLmRhdGEuZGF0YUZvcm1BcHBsaWNhdGlvbi51c2VybmFtZSlcclxuXHRcdFx0XHRcdFx0LnRvUHJvbWlzZSgpO1xyXG5cdFx0XHRcdFx0Y29uc3Qgc3VybmFtZXMgPVxyXG5cdFx0XHRcdFx0XHRzZXNpb24uc3VybmFtZSAhPT0gJycgJiYgc2VzaW9uLnN1cm5hbWUgIT09IG51bGxcclxuXHRcdFx0XHRcdFx0XHQ/IHNlc2lvbi5zdXJuYW1lICsgJyAnICsgc2VzaW9uLmxhc3RuYW1lXHJcblx0XHRcdFx0XHRcdFx0OiBzZXNpb24ubGFzdG5hbWU7XHJcblx0XHRcdFx0XHRodG1sID0gdGhpcy50b2tlblNlcnZpY2UucmVwbGFjZVRva2VuKGh0bWwsIHRva2VuLnZhbHVlLCBzdXJuYW1lcyk7XHJcblx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNvbnN1bHRhbmRvIGVsIGxvZ2luIGVuIFBMSVMsIGdldEJ5TG9naW4nLCBlcnJvcik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQvLyBEb24ndCBmaW5kIHRoZSB0b2tlblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCdObyBzZSBlbmNvbnRybyBlbCB0b2tlbicsIHRva2VuKTtcclxuXHRcdFx0aHRtbCA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihodG1sLCB0b2tlbi52YWx1ZSwgJycpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0aHRtbDogaHRtbCxcclxuXHRcdFx0dmFsdWU6IHZhbHVlUmVwbGFjZVxyXG5cdFx0fTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIGZpbmRTZXNpb25CeUxvZ2luKGh0bWw6IHN0cmluZywgdG9rZW46IGFueSkge31cclxuXHJcblx0LyoqXHJcblx0ICogRmluZCBhbGwgdGhlIHRva2VucyBwcmVzZW50IGluIHRoZSBIVE1MIHRleHQuIE9yZ2FuaXplIHRoaXMgdG9rZW5zIGluIGZvdXIgY2F0ZWdvcmllcy5cclxuXHQgKiBAcGFyYW0gaHRtbCBUZXh0IG9mIHRoZSBodG1sXHJcblx0ICovXHJcblx0Z2V0TGlzdFRva2VucyhodG1sOiBzdHJpbmcpOiBhbnlbXSB7XHJcblx0XHQvLyBsZXQgc3RyaW5nczogc3RyaW5nW10gPSBodG1sLnNwbGl0KFwiIFwiKTtcclxuXHRcdGxldCB0b2tlbnM6IGFueVtdID0gdGhpcy50b2tlblNlcnZpY2UuZ2V0TGlzdFRva2Vuc0J5U3RyaW5nKGh0bWwpO1xyXG5cdFx0bGV0IHRva2Vuc0NhdGVnb3J5OiBhbnlbXSA9IFtdO1xyXG5cdFx0Zm9yIChsZXQgaW5mb1Rva2VuIG9mIHRva2Vucykge1xyXG5cdFx0XHRpZiAoaW5mb1Rva2VuKSB7XHJcblx0XHRcdFx0Y29uc3Qga2V5VHlwZTogbnVtYmVyID0gVG9rZW5TZXJ2aWNlLmdldEtleVR5cGUoXHJcblx0XHRcdFx0XHRpbmZvVG9rZW4ua2V5LnJlcGxhY2UoJ3snLCAnJykucmVwbGFjZSgnfScsICcnKVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0aWYgKGtleVR5cGUpIHtcclxuXHRcdFx0XHRcdHN3aXRjaCAoa2V5VHlwZSkge1xyXG5cdFx0XHRcdFx0XHRjYXNlIDE6IC8vIEZvcm1cclxuXHRcdFx0XHRcdFx0XHRpZiAoIXRva2Vuc0NhdGVnb3J5W1Rva2VuU2VydmljZS5UT0tFTl9MQUJFTF9GT1JNXSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0dG9rZW5zQ2F0ZWdvcnlbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0ZPUk1dID0gW107XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdHRva2Vuc0NhdGVnb3J5W1Rva2VuU2VydmljZS5UT0tFTl9MQUJFTF9GT1JNXS5wdXNoKGluZm9Ub2tlbik7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdGNhc2UgMjogLy9CdWRnZXRcclxuXHRcdFx0XHRcdFx0XHRpZiAoIXRva2Vuc0NhdGVnb3J5W1Rva2VuU2VydmljZS5UT0tFTl9MQUJFTF9CVURHRVRdKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR0b2tlbnNDYXRlZ29yeVtUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfQlVER0VUXSA9IFtdO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR0b2tlbnNDYXRlZ29yeVtUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfQlVER0VUXS5wdXNoKGluZm9Ub2tlbik7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdGNhc2UgMzogLy9TdGF0aWNcclxuXHRcdFx0XHRcdFx0XHRpZiAoIXRva2Vuc0NhdGVnb3J5W1Rva2VuU2VydmljZS5UT0tFTl9MQUJFTF9TVEFUSUNdKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR0b2tlbnNDYXRlZ29yeVtUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfU1RBVElDXSA9IFtdO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR0b2tlbnNDYXRlZ29yeVtUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfU1RBVElDXS5wdXNoKGluZm9Ub2tlbik7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdGNhc2UgNDogLy9DYWxjdWxhdGVkXHJcblx0XHRcdFx0XHRcdFx0aWYgKCF0b2tlbnNDYXRlZ29yeVtUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfQ0FMQ1VMQVRFRF0pIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRva2Vuc0NhdGVnb3J5W1Rva2VuU2VydmljZS5UT0tFTl9MQUJFTF9DQUxDVUxBVEVEXSA9IFtdO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR0b2tlbnNDYXRlZ29yeVtUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfQ0FMQ1VMQVRFRF0ucHVzaChpbmZvVG9rZW4pO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRjYXNlIDU6IC8vVGFza1xyXG5cdFx0XHRcdFx0XHRcdGlmICghdG9rZW5zQ2F0ZWdvcnlbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX1RBU0tMXSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0dG9rZW5zQ2F0ZWdvcnlbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX1RBU0tMXSA9IFtdO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR0b2tlbnNDYXRlZ29yeVtUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfVEFTS0xdLnB1c2goaW5mb1Rva2VuKTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiB0b2tlbnNDYXRlZ29yeTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEl0IHJlc29sdmVzIHRoZSBzdGF0aWMgdG9rZW4gZGVzdGluYXRpb25cclxuXHQgKiBAcGFyYW0gc3RyaW5nVGV4dFxyXG5cdCAqIEBwYXJhbSB0b2tlblxyXG5cdCAqIEBwYXJhbSBkYXRhVmFsdWVcclxuXHQgKi9cclxuXHRyZXNvbHZlU3RhdGljVG9rZW5zS2V5QVF1aWVuVmFEaXJpZ2lkbyhzdHJpbmdUZXh0OiBzdHJpbmcsIHRva2VuVmFsdWU6IGFueSk6IHN0cmluZyB7XHJcblx0XHQvLyBpZiAodGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbikge1xyXG5cdFx0dGhpcy5lbmFibGVEZXN0aW5hdGlvbiA9IHRydWU7XHJcblx0XHR0aGlzLmFkZEluZm9Ub2tlbkRlc3RpbmF0aW9uKCk7XHJcblx0XHRjb25zdCBwbGlUb2tlbkRlc3RpbmF0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BsaS10b2tlbi1kZXN0aW5hdGlvbicpO1xyXG5cdFx0bGV0IGh0bWwgPSAnJztcclxuXHRcdGlmIChwbGlUb2tlbkRlc3RpbmF0aW9uICYmIHBsaVRva2VuRGVzdGluYXRpb24uaW5uZXJIVE1MLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0aHRtbCA9IHRoaXMucmVtb3ZlQ29tbWVudHNIdG1sKHBsaVRva2VuRGVzdGluYXRpb24uaW5uZXJIVE1MKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiB0aGlzLnRva2VuU2VydmljZS5yZXBsYWNlVG9rZW4oc3RyaW5nVGV4dCwgdG9rZW5WYWx1ZSwgaHRtbCk7XHJcblx0XHQvLyB9XHJcblx0XHQvLyByZXR1cm4gc3RyaW5nVGV4dDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqXHJcblx0ICovXHJcblx0YWRkSW5mb1Rva2VuRGVzdGluYXRpb24oKSB7XHJcblx0XHRsZXQgcGxpVG9rZW5EZXN0aW5hdGlvbiA9ICQoJyNwbGktdG9rZW4tZGVzdGluYXRpb24nKTtcclxuXHRcdHBsaVRva2VuRGVzdGluYXRpb24uZW1wdHkoKTtcclxuXHRcdGlmICh0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uKSB7XHJcblx0XHRcdGxldCBkZXN0aW5hdGlvbkluZm8gPSAkKCc8ZGl2PjwvZGl2PicpO1xyXG5cdFx0XHRpZiAodGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi50ZXh0KSB7XHJcblx0XHRcdFx0bGV0IHZhbHVlSW5mbyA9ICQoJzxkaXY+PC9kaXY+JykudGV4dCh0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLnRleHQpO1xyXG5cdFx0XHRcdGRlc3RpbmF0aW9uSW5mby5hcHBlbmQodmFsdWVJbmZvKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAodGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi50aXRsZSkge1xyXG5cdFx0XHRcdGxldCB2YWx1ZUluZm8gPSAkKCc8ZGl2PjwvZGl2PicpLnRleHQodGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi50aXRsZSk7XHJcblx0XHRcdFx0ZGVzdGluYXRpb25JbmZvLmFwcGVuZCh2YWx1ZUluZm8pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICh0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLm5hbWUgfHwgdGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5sYXN0TmFtZSkge1xyXG5cdFx0XHRcdGxldCB2YWx1ZUluZm9OYW1lID0gdGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5uYW1lXHJcblx0XHRcdFx0XHQ/IHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24ubmFtZSArICcgJ1xyXG5cdFx0XHRcdFx0OiAnJztcclxuXHRcdFx0XHR2YWx1ZUluZm9OYW1lICs9IHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24ubGFzdE5hbWVcclxuXHRcdFx0XHRcdD8gdGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5sYXN0TmFtZVxyXG5cdFx0XHRcdFx0OiAnJztcclxuXHRcdFx0XHRsZXQgdmFsdWVJbmZvID0gJCgnPGRpdj48L2Rpdj4nKS5hcHBlbmQoJzxzdHJvbmc+JyArIHZhbHVlSW5mb05hbWUgKyAnPC9zdHJvbmc+Jyk7XHJcblx0XHRcdFx0ZGVzdGluYXRpb25JbmZvLmFwcGVuZCh2YWx1ZUluZm8pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICh0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLmNhcmdvKSB7XHJcblx0XHRcdFx0bGV0IHZhbHVlSW5mbyA9ICQoJzxkaXY+PC9kaXY+JykudGV4dCh0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLmNhcmdvKTtcclxuXHRcdFx0XHRkZXN0aW5hdGlvbkluZm8uYXBwZW5kKHZhbHVlSW5mbyk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24ub2NjdXBhdGlvbikge1xyXG5cdFx0XHRcdGxldCB2YWx1ZUluZm8gPSAkKCc8ZGl2PjwvZGl2PicpLnRleHQodGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5vY2N1cGF0aW9uKTtcclxuXHRcdFx0XHRkZXN0aW5hdGlvbkluZm8uYXBwZW5kKHZhbHVlSW5mbyk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24uY29tcGFueSkge1xyXG5cdFx0XHRcdGxldCB2YWx1ZUluZm8gPSAkKCc8ZGl2PjwvZGl2PicpLnRleHQodGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5jb21wYW55KTtcclxuXHRcdFx0XHRkZXN0aW5hdGlvbkluZm8uYXBwZW5kKHZhbHVlSW5mbyk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24uYWRkcmVzcyB8fCB0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLmFkZHJlc3NEZXRhaWxzKSB7XHJcblx0XHRcdFx0bGV0IHZhbHVlSW5mb05hbWUgPSB0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLmFkZHJlc3NcclxuXHRcdFx0XHRcdD8gdGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5hZGRyZXNzICsgJyAnXHJcblx0XHRcdFx0XHQ6ICcnO1xyXG5cdFx0XHRcdHZhbHVlSW5mb05hbWUgKz0gdGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5hZGRyZXNzRGV0YWlsc1xyXG5cdFx0XHRcdFx0PyB0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLmFkZHJlc3NEZXRhaWxzXHJcblx0XHRcdFx0XHQ6ICcnO1xyXG5cdFx0XHRcdGxldCB2YWx1ZUluZm8gPSAkKCc8ZGl2PjwvZGl2PicpLnRleHQodmFsdWVJbmZvTmFtZSk7XHJcblx0XHRcdFx0ZGVzdGluYXRpb25JbmZvLmFwcGVuZCh2YWx1ZUluZm8pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICh0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLmNpdHkgfHwgdGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5jb3VudHJ5KSB7XHJcblx0XHRcdFx0bGV0IHZhbHVlSW5mb05hbWUgPSB0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLmNpdHlcclxuXHRcdFx0XHRcdD8gdGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5jaXR5XHJcblx0XHRcdFx0XHQ6ICcnO1xyXG5cdFx0XHRcdHZhbHVlSW5mb05hbWUgKz1cclxuXHRcdFx0XHRcdHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24uY2l0eSAmJiB0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLmNvdW50cnkgPyAnLCAnIDogJyc7XHJcblx0XHRcdFx0dmFsdWVJbmZvTmFtZSArPSB0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLmNvdW50cnlcclxuXHRcdFx0XHRcdD8gdGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5jb3VudHJ5XHJcblx0XHRcdFx0XHQ6ICcnO1xyXG5cdFx0XHRcdGxldCB2YWx1ZUluZm8gPSAkKCc8ZGl2PjwvZGl2PicpLnRleHQodmFsdWVJbmZvTmFtZSk7XHJcblx0XHRcdFx0ZGVzdGluYXRpb25JbmZvLmFwcGVuZCh2YWx1ZUluZm8pO1xyXG5cdFx0XHR9XHJcblx0XHRcdHBsaVRva2VuRGVzdGluYXRpb24uYXBwZW5kKGRlc3RpbmF0aW9uSW5mbyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJdCByZXNvbHZlcyB0aGUgc3RhdGljIHRva2VuIGRlc3RpbmF0aW9uXHJcblx0ICogQHBhcmFtIHN0cmluZ1RleHRcclxuXHQgKiBAcGFyYW0gdG9rZW5cclxuXHQgKiBAcGFyYW0gZGF0YVZhbHVlXHJcblx0ICovXHJcblx0cmVzb2x2ZVN0YXRpY1Rva2Vuc0tleVNhbHVkb0NvbXBsZW1lbnRhcmlvKHN0cmluZ1RleHQ6IHN0cmluZywgdG9rZW5WYWx1ZTogYW55KTogc3RyaW5nIHtcclxuXHRcdC8vIGlmICh0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uKSB7XHJcblx0XHR0aGlzLmVuYWJsZURlc3RpbmF0aW9uID0gdHJ1ZTtcclxuXHRcdHRoaXMuYWRkSW5mb1Rva2VuU2FsdWRvQ29tcGxlbWVudGFyaW8oKTtcclxuXHRcdGNvbnN0IHBsaVRva2VuRGVzdGluYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGxpLXRva2VuLWNvbXBsZW1lbnRhcnktZ3JlZXRpbmcnKTtcclxuXHRcdGxldCBodG1sID0gJyc7XHJcblx0XHRpZiAocGxpVG9rZW5EZXN0aW5hdGlvbikge1xyXG5cdFx0XHRodG1sID0gdGhpcy5yZW1vdmVDb21tZW50c0h0bWwocGxpVG9rZW5EZXN0aW5hdGlvbi5pbm5lckhUTUwpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihzdHJpbmdUZXh0LCB0b2tlblZhbHVlLCBodG1sKTtcclxuXHRcdC8vIH1cclxuXHRcdC8vIHJldHVybiBzdHJpbmdUZXh0O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICpcclxuXHQgKi9cclxuXHRhZGRJbmZvVG9rZW5TYWx1ZG9Db21wbGVtZW50YXJpbygpIHtcclxuXHRcdGxldCBwbGlUb2tlbkRlc3RpbmF0aW9uID0gJCgnI3BsaS10b2tlbi1jb21wbGVtZW50YXJ5LWdyZWV0aW5nJyk7XHJcblx0XHRwbGlUb2tlbkRlc3RpbmF0aW9uLmVtcHR5KCk7XHJcblx0XHRpZiAodGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbikge1xyXG5cdFx0XHRsZXQgZGVzdGluYXRpb25JbmZvID0gJCgnPGRpdj48L2Rpdj4nKTtcclxuXHRcdFx0aWYgKHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24uZ3JlZXRpbmcpIHtcclxuXHRcdFx0XHRkZXN0aW5hdGlvbkluZm8uaHRtbCh0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLmdyZWV0aW5nKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAodGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi50aXRsZSkge1xyXG5cdFx0XHRcdGNvbnN0IHZhbHVlVGV4dCA9XHJcblx0XHRcdFx0XHQoZGVzdGluYXRpb25JbmZvLmh0bWwoKS5sZW5ndGggPT0gMCA/ICcnIDogJyAnKSArXHJcblx0XHRcdFx0XHR0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLnRpdGxlO1xyXG5cdFx0XHRcdGRlc3RpbmF0aW9uSW5mby5odG1sKGRlc3RpbmF0aW9uSW5mby5odG1sKCkgKyB2YWx1ZVRleHQpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICh0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLmxhc3ROYW1lKSB7XHJcblx0XHRcdFx0bGV0IHZhbHVlSW5mb05hbWUgPSB0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLmxhc3ROYW1lXHJcblx0XHRcdFx0XHQ/IHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24ubGFzdE5hbWVcclxuXHRcdFx0XHRcdDogJyc7XHJcblx0XHRcdFx0Y29uc3QgdmFsdWVUZXh0ID1cclxuXHRcdFx0XHRcdChkZXN0aW5hdGlvbkluZm8uaHRtbCgpLmxlbmd0aCA9PSAwID8gJycgOiAnICcpICtcclxuXHRcdFx0XHRcdCc8c3Ryb25nPicgK1xyXG5cdFx0XHRcdFx0dmFsdWVJbmZvTmFtZSArXHJcblx0XHRcdFx0XHQnPC9zdHJvbmc+JztcclxuXHRcdFx0XHRkZXN0aW5hdGlvbkluZm8uaHRtbChkZXN0aW5hdGlvbkluZm8uaHRtbCgpICsgdmFsdWVUZXh0KTtcclxuXHRcdFx0fVxyXG5cdFx0XHRwbGlUb2tlbkRlc3RpbmF0aW9uLmFwcGVuZChkZXN0aW5hdGlvbkluZm8pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSByZW1vdmVDb21tZW50c0h0bWwoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiBodG1sID8gaHRtbC5yZXBsYWNlKC88IS0tW1xcc1xcU10qPy0tPi9nLCAnJykgOiBodG1sO1xyXG5cdH1cclxuXHJcblx0cmVzb2x2ZVN0YXRpY1Rva2Vuc0tleVNpZ24oaHRtbCwgdG9rZW5WYWx1ZTogYW55LCBzdWJUb2tlbjogc3RyaW5nW10pOiBzdHJpbmcge1xyXG5cdFx0bGV0IGNvbnRhaW5lciA9ICQoJzxkaXY+PC9kaXY+Jyk7XHJcblx0XHRsZXQgaW1nID0gJCgnPGltZyBpZD1cIicgKyBUb2tlblNlcnZpY2UuU0lHTl9MRVRURVJfVEFHX0lEICsgJ1wiPicpO1xyXG5cdFx0aW1nLmF0dHIoJ3NyYycsICcnKTtcclxuXHRcdGlmIChzdWJUb2tlbi5sZW5ndGggPiAyKSB7XHJcblx0XHRcdGltZy5hdHRyKCd3aWR0aCcsIHN1YlRva2VuWzJdLnRvU3RyaW5nKCkpO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHN1YlRva2VuLmxlbmd0aCA+IDMpIHtcclxuXHRcdFx0aW1nLmF0dHIoJ2hlaWdodCcsIHN1YlRva2VuWzNdLnRvU3RyaW5nKCkpO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHN1YlRva2VuLmxlbmd0aCA+IDQpIHtcclxuXHRcdFx0aW1nLmF0dHIoJ25hbWUnLCBzdWJUb2tlbls0XS50b1N0cmluZygpKTtcclxuXHRcdH1cclxuXHRcdGNvbnRhaW5lci5hcHBlbmQoaW1nKTtcclxuXHRcdC8vIHJldHVybiBjb250YWluZXIuaHRtbCgpO1xyXG5cdFx0cmV0dXJuIHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihodG1sLCB0b2tlblZhbHVlLCBjb250YWluZXIuaHRtbCgpKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgZ2V0UnVicm9MYWJlbCgpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5pZGlvbWEubG9jYWxlID09PSAnZXMnXHJcblx0XHRcdD8gJ1J1YnJvJ1xyXG5cdFx0XHQ6IHRoaXMuZGF0YS5pZGlvbWEubG9jYWxlID09PSAnZGUnXHJcblx0XHRcdD8gJ1Bvc3RlbidcclxuXHRcdFx0OiAnSXRlbSc7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGdldFRvdGFsTGFiZWwoKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiB0aGlzLmRhdGEuaWRpb21hLmxvY2FsZSA9PT0gJ2VzJ1xyXG5cdFx0XHQ/ICdUb3RhbCdcclxuXHRcdFx0OiB0aGlzLmRhdGEuaWRpb21hLmxvY2FsZSA9PT0gJ2RlJ1xyXG5cdFx0XHQ/ICdHZXNhbXQnXHJcblx0XHRcdDogdGhpcy5kYXRhLmlkaW9tYS5sb2NhbGUgPT09ICdmcidcclxuXHRcdFx0PyAnVG90YWwnXHJcblx0XHRcdDogdGhpcy5kYXRhLmlkaW9tYS5sb2NhbGUgPT09ICdpdCdcclxuXHRcdFx0PyAnVG90YWxlJ1xyXG5cdFx0XHQ6ICdJdGVtJztcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgZ2V0WWVhckxhYmVsKCk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gdGhpcy5kYXRhLmlkaW9tYS5sb2NhbGUgPT09ICdlcydcclxuXHRcdFx0PyAnQcOxbydcclxuXHRcdFx0OiB0aGlzLmRhdGEuaWRpb21hLmxvY2FsZSA9PT0gJ2RlJ1xyXG5cdFx0XHQ/ICdKYWhyJ1xyXG5cdFx0XHQ6IHRoaXMuZGF0YS5pZGlvbWEubG9jYWxlID09PSAnZnInXHJcblx0XHRcdD8gJ0FubsOpZSdcclxuXHRcdFx0OiB0aGlzLmRhdGEuaWRpb21hLmxvY2FsZSA9PT0gJ2l0J1xyXG5cdFx0XHQ/ICdBbm5vJ1xyXG5cdFx0XHQ6ICdZZWFyJztcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqXHJcblx0ICovXHJcblx0YWRkSW5mb1Rva2VuUmVzdW1lQ2F0ZWdvcnlZZWFyKFxyXG5cdFx0dHByZXNDb2RpZ286IG51bWJlcixcclxuXHRcdGlkVG90YWxCdWRnZXQ6IHN0cmluZyxcclxuXHRcdGJ1ZGdldER0bzogQnVkZ2V0RHRvXHJcblx0KSB7XHJcblx0XHRpZiAodHByZXNDb2RpZ28gPT0gRVRpcG9QcmVzdXB1ZXN0by5QUklNQVJZKSB7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0fVxyXG5cdFx0bGV0IHJlc3VtZUNhdGVnb3J5WWVhckNvbnRlbnQgPSAkKCcjJyArIGlkVG90YWxCdWRnZXQpO1xyXG5cdFx0cmVzdW1lQ2F0ZWdvcnlZZWFyQ29udGVudC5lbXB0eSgpO1xyXG5cdFx0aWYgKGJ1ZGdldER0byAmJiBidWRnZXREdG8uYnVkZ2V0ICYmIGJ1ZGdldER0by5idWRnZXQuc3VtbWFyeSkge1xyXG5cdFx0XHRjb25zdCBzdW1tYXJ5ID0gYnVkZ2V0RHRvLmJ1ZGdldC5zdW1tYXJ5O1xyXG5cdFx0XHRjb25zdCB0YWJsZSA9ICQoJzx0YWJsZT48L3RhYmxlPicpO1xyXG5cdFx0XHR0YWJsZS5jc3MoJ2JvcmRlci1zcGFjaW5nJywgJzJweCcpO1xyXG5cdFx0XHR0YWJsZS5jc3MoJ2JvcmRlci1jb2xsYXBzZScsICdjb2xsYXBzZScpO1xyXG5cdFx0XHQvL3RoZWFkXHJcblx0XHRcdGNvbnN0IHRoZWFkID0gJCgnPHRoZWFkPicpLmFwcGVuZFRvKHRhYmxlKTtcclxuXHRcdFx0Y29uc3QgdGhSdWJybyA9ICQoJzx0aD4nLCB7IGh0bWw6IHRoaXMuZ2V0UnVicm9MYWJlbCgpIH0pLmFwcGVuZFRvKHRoZWFkKTtcclxuXHRcdFx0dGhSdWJyby5jc3MoJ3RleHQtYWxpZ24nLCAnY2VudGVyJyk7XHJcblx0XHRcdHRoUnVicm8uY3NzKCdib3JkZXInLCAnMXB4IHNvbGlkIGJsYWNrJyk7XHJcblx0XHRcdHRoUnVicm8uY3NzKCdjb2xvcicsICd3aGl0ZScpO1xyXG5cdFx0XHR0aFJ1YnJvLmNzcygnYmFja2dyb3VuZC1jb2xvcicsICdncmV5Jyk7XHJcblx0XHRcdGxldCBpdGVyYWNpb25BbmlvID0gMDtcclxuXHRcdFx0Zm9yIChjb25zdCB5ZWFyIG9mIHN1bW1hcnkueWVhcnMpIHtcclxuXHRcdFx0XHRjb25zdCB0aFllYXIgPSAkKCc8dGg+JywgeyBodG1sOiB0aGlzLmdldFllYXJMYWJlbCgpICsgKytpdGVyYWNpb25BbmlvIH0pLmFwcGVuZFRvKFxyXG5cdFx0XHRcdFx0dGhlYWRcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHRcdHRoWWVhci5jc3MoJ3RleHQtYWxpZ24nLCAnY2VudGVyJyk7XHJcblx0XHRcdFx0dGhZZWFyLmNzcygnYm9yZGVyJywgJzFweCBzb2xpZCBibGFjaycpO1xyXG5cdFx0XHRcdHRoWWVhci5jc3MoJ2NvbG9yJywgJ3doaXRlJyk7XHJcblx0XHRcdFx0dGhZZWFyLmNzcygnYmFja2dyb3VuZC1jb2xvcicsICdncmV5Jyk7XHJcblx0XHRcdFx0dGhZZWFyLmNzcygnd2lkdGgnLCAnODBweCcpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGNvbnN0IHRvdGFsTGFiZWwgPSAnJm5ic3A7JyArIHRoaXMuZ2V0VG90YWxMYWJlbCgpICsgc3VtbWFyeS5iYXNlQ3VycmVuY3kgKyAnJm5ic3A7JztcclxuXHRcdFx0Y29uc3QgdGhUb3RhbCA9ICQoJzx0aD4nLCB7IGh0bWw6IHRvdGFsTGFiZWwgfSkuYXBwZW5kVG8odGhlYWQpO1xyXG5cdFx0XHR0aFRvdGFsLmNzcygndGV4dC1hbGlnbicsICdjZW50ZXInKTtcclxuXHRcdFx0dGhUb3RhbC5jc3MoJ2JvcmRlcicsICcxcHggc29saWQgYmxhY2snKTtcclxuXHRcdFx0dGhUb3RhbC5jc3MoJ2NvbG9yJywgJ3doaXRlJyk7XHJcblx0XHRcdHRoVG90YWwuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJ2dyZXknKTtcclxuXHRcdFx0dGhUb3RhbC5jc3MoJ3dpZHRoJywgJzgwcHgnKTtcclxuXHRcdFx0Ly90Ym9keVxyXG5cdFx0XHRsZXQgdGJvZHkgPSAkKCc8dGJvZHk+JykuYXBwZW5kVG8odGFibGUpO1xyXG5cdFx0XHRmb3IgKGxldCBpQ2F0ID0gMDsgaUNhdCA8IHN1bW1hcnkuY2F0ZWdvcmllcy5sZW5ndGg7IGlDYXQrKykge1xyXG5cdFx0XHRcdGNvbnN0IHRyID0gJCgnPHRyPicpLmFwcGVuZFRvKHRib2R5KTtcclxuXHRcdFx0XHRjb25zdCBjYXRlZ29yeSA9IHN1bW1hcnkuY2F0ZWdvcmllc1tpQ2F0XTtcclxuXHRcdFx0XHRjb25zdCBydWJyb0xhYmVsID1cclxuXHRcdFx0XHRcdCcmbmJzcDsmbmJzcDsnICtcclxuXHRcdFx0XHRcdHRoaXMudHJhbnNsYXRlQ2F0ZWdvcnkoY2F0ZWdvcnkuY2F0ZWdvcnkpICtcclxuXHRcdFx0XHRcdCcmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsnO1xyXG5cdFx0XHRcdGNvbnN0IHRkUnVicm8gPSAkKCc8dGQ+JywgeyBodG1sOiBydWJyb0xhYmVsIH0pLmFwcGVuZFRvKHRyKTtcclxuXHRcdFx0XHR0ZFJ1YnJvLmNzcygndGV4dC1hbGlnbicsICdsZWZ0Jyk7XHJcblx0XHRcdFx0dGRSdWJyby5jc3MoJ2JvcmRlcicsICcxcHggc29saWQgYmxhY2snKTtcclxuXHRcdFx0XHR0ZFJ1YnJvLmNzcygnZm9udC13ZWlnaHQnLCAnYm9sZCcpO1xyXG5cdFx0XHRcdGZvciAoY29uc3QgeWVhciBvZiBjYXRlZ29yeS55ZWFycykge1xyXG5cdFx0XHRcdFx0Y29uc3QgeWVhclRvdGFsID1cclxuXHRcdFx0XHRcdFx0eWVhci50b3RhbCA9PSAwXHJcblx0XHRcdFx0XHRcdFx0PyAnLSdcclxuXHRcdFx0XHRcdFx0XHQ6IHRoaXMuY3VycmVuY3lQaXBlLnRyYW5zZm9ybSh5ZWFyLnRvdGFsLCAnZGVmYXVsdCcsICcnLCAnMS4wLTAnKTtcclxuXHRcdFx0XHRcdGNvbnN0IHllYXJMYWJlbFRvdGFsID0gJyZuYnNwOyZuYnNwOycgKyB5ZWFyVG90YWwgKyAnJm5ic3A7Jm5ic3A7JztcclxuXHRcdFx0XHRcdGNvbnN0IHRkWWVhciA9ICQoJzx0ZD4nLCB7IGh0bWw6IHllYXJMYWJlbFRvdGFsIH0pLmFwcGVuZFRvKHRyKTtcclxuXHRcdFx0XHRcdHRkWWVhci5jc3MoJ3RleHQtYWxpZ24nLCAncmlnaHQnKTtcclxuXHRcdFx0XHRcdHRkWWVhci5jc3MoJ2JvcmRlcicsICcxcHggc29saWQgYmxhY2snKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Y29uc3QgY2F0ZWdvcnlUb3RhbCA9XHJcblx0XHRcdFx0XHRjYXRlZ29yeS50b3RhbCA9PSAwXHJcblx0XHRcdFx0XHRcdD8gJy0nXHJcblx0XHRcdFx0XHRcdDogdGhpcy5jdXJyZW5jeVBpcGUudHJhbnNmb3JtKGNhdGVnb3J5LnRvdGFsLCAnZGVmYXVsdCcsICcnLCAnMS4wLTAnKTtcclxuXHRcdFx0XHRjb25zdCBjYXRlZ29yeUxhYmVsVG90YWwgPSAnJm5ic3A7Jm5ic3A7JyArIGNhdGVnb3J5VG90YWwgKyAnJm5ic3A7Jm5ic3A7JztcclxuXHRcdFx0XHRjb25zdCB0ZFRvdGFsID0gJCgnPHRkPicsIHsgaHRtbDogY2F0ZWdvcnlMYWJlbFRvdGFsIH0pLmFwcGVuZFRvKHRyKTtcclxuXHRcdFx0XHR0ZFRvdGFsLmNzcygndGV4dC1hbGlnbicsICdyaWdodCcpO1xyXG5cdFx0XHRcdHRkVG90YWwuY3NzKCdib3JkZXInLCAnMXB4IHNvbGlkIGJsYWNrJyk7XHJcblx0XHRcdFx0dGRUb3RhbC5jc3MoJ2ZvbnQtd2VpZ2h0JywgJ2JvbGQnKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjb25zdCB0ckZpbmFsID0gJCgnPHRyPicpLmFwcGVuZFRvKHRib2R5KTtcclxuXHRcdFx0Y29uc3QgYmFzZUN1cnJlbmN5ID0gdGhpcy5nZXRUb3RhbExhYmVsKCkgKyAnICcgKyBzdW1tYXJ5LmJhc2VDdXJyZW5jeSArICcmbmJzcDsmbmJzcDsnO1xyXG5cdFx0XHRjb25zdCB0ZEZpbmFsVG90YWxCQyA9ICQoJzx0ZD4nLCB7IGh0bWw6IGJhc2VDdXJyZW5jeSB9KS5hcHBlbmRUbyh0ckZpbmFsKTtcclxuXHRcdFx0dGRGaW5hbFRvdGFsQkMuY3NzKCd0ZXh0LWFsaWduJywgJ3JpZ2h0Jyk7XHJcblx0XHRcdHRkRmluYWxUb3RhbEJDLmNzcygnYm9yZGVyJywgJzFweCBzb2xpZCBibGFjaycpO1xyXG5cdFx0XHR0ZEZpbmFsVG90YWxCQy5jc3MoJ2NvbG9yJywgJ3doaXRlJyk7XHJcblx0XHRcdHRkRmluYWxUb3RhbEJDLmNzcygnYmFja2dyb3VuZC1jb2xvcicsICdncmV5Jyk7XHJcblx0XHRcdGxldCBidWRnZXRUb3RhbCA9IDA7XHJcblx0XHRcdGZvciAoY29uc3QgeWVhciBvZiBzdW1tYXJ5LnllYXJzKSB7XHJcblx0XHRcdFx0Y29uc3QgeWVhclRvdGFsID1cclxuXHRcdFx0XHRcdHllYXIudG90YWwgPT0gMFxyXG5cdFx0XHRcdFx0XHQ/ICctJ1xyXG5cdFx0XHRcdFx0XHQ6IHRoaXMuY3VycmVuY3lQaXBlLnRyYW5zZm9ybSh5ZWFyLnRvdGFsLCAnZGVmYXVsdCcsICcnLCAnMS4wLTAnKTtcclxuXHRcdFx0XHRjb25zdCB5ZWFyTGFiZWxUb3RhbCA9IHllYXJUb3RhbCArICcmbmJzcDsmbmJzcDsnO1xyXG5cdFx0XHRcdGNvbnN0IHRkWWVhciA9ICQoJzx0ZD4nLCB7IGh0bWw6IHllYXJMYWJlbFRvdGFsIH0pLmFwcGVuZFRvKHRyRmluYWwpO1xyXG5cdFx0XHRcdHRkWWVhci5jc3MoJ3RleHQtYWxpZ24nLCAncmlnaHQnKTtcclxuXHRcdFx0XHR0ZFllYXIuY3NzKCdib3JkZXInLCAnMXB4IHNvbGlkIGJsYWNrJyk7XHJcblx0XHRcdFx0dGRZZWFyLmNzcygnY29sb3InLCAnd2hpdGUnKTtcclxuXHRcdFx0XHR0ZFllYXIuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJ2dyZXknKTtcclxuXHRcdFx0XHRidWRnZXRUb3RhbCArPSB5ZWFyLnRvdGFsO1xyXG5cdFx0XHR9XHJcblx0XHRcdGNvbnN0IHRvdGFsQmFzZUN1cnJlbmN5ID1cclxuXHRcdFx0XHRidWRnZXRUb3RhbCA9PSAwXHJcblx0XHRcdFx0XHQ/ICctJ1xyXG5cdFx0XHRcdFx0OiB0aGlzLmN1cnJlbmN5UGlwZS50cmFuc2Zvcm0oYnVkZ2V0VG90YWwsICdkZWZhdWx0JywgJycsICcxLjAtMCcpO1xyXG5cdFx0XHRjb25zdCB0b3RhbExhYmVsQmFzZUN1cnJlbmN5ID0gJyZuYnNwOyZuYnNwOycgKyB0b3RhbEJhc2VDdXJyZW5jeSArICcmbmJzcDsmbmJzcDsnO1xyXG5cdFx0XHRjb25zdCB0ZEZpbmFsVG90YWwgPSAkKCc8dGQ+JywgeyBodG1sOiB0b3RhbExhYmVsQmFzZUN1cnJlbmN5IH0pLmFwcGVuZFRvKHRyRmluYWwpO1xyXG5cdFx0XHR0ZEZpbmFsVG90YWwuY3NzKCd0ZXh0LWFsaWduJywgJ3JpZ2h0Jyk7XHJcblx0XHRcdHRkRmluYWxUb3RhbC5jc3MoJ2JvcmRlcicsICcxcHggc29saWQgYmxhY2snKTtcclxuXHRcdFx0dGRGaW5hbFRvdGFsLmNzcygnY29sb3InLCAnd2hpdGUnKTtcclxuXHRcdFx0dGRGaW5hbFRvdGFsLmNzcygnYmFja2dyb3VuZC1jb2xvcicsICdncmV5Jyk7XHJcblx0XHRcdHJlc3VtZUNhdGVnb3J5WWVhckNvbnRlbnQuYXBwZW5kKHRhYmxlKTtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuIiwiPGRpdiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgaWQ9XCJwbGktdG9rZW4tZGVzdGluYXRpb25cIj5cclxuXHQ8IS0tIDxkaXYgKm5nSWY9XCJkYXRhICE9IHVuZGVmaW5lZCAmJiBkYXRhLmRhdGFEZXN0aW5hdGlvbiAhPSB1bmRlZmluZWRcIj5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImRhdGEuZGF0YURlc3RpbmF0aW9uLnRleHQgIT0gdW5kZWZpbmVkXCI+XHJcbiAgICAgICAgICAgIHt7ZGF0YS5kYXRhRGVzdGluYXRpb24udGV4dH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImRhdGEuZGF0YURlc3RpbmF0aW9uLnRpdGxlICE9IHVuZGVmaW5lZFwiPlxyXG4gICAgICAgICAgICB7e2RhdGEuZGF0YURlc3RpbmF0aW9uLnRpdGxlfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZGF0YS5kYXRhRGVzdGluYXRpb24ubmFtZSAhPSB1bmRlZmluZWQgfHwgZGF0YS5kYXRhRGVzdGluYXRpb24ubGFzdE5hbWUgIT0gdW5kZWZpbmVkXCI+XHJcbiAgICAgICAgICAgIDxzdHJvbmc+e3tkYXRhLmRhdGFEZXN0aW5hdGlvbi5uYW1lfX0ge3tkYXRhLmRhdGFEZXN0aW5hdGlvbi5sYXN0TmFtZX19PC9zdHJvbmc+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImRhdGEuZGF0YURlc3RpbmF0aW9uLmNhcmdvICE9IHVuZGVmaW5lZFwiPlxyXG4gICAgICAgICAgICB7e2RhdGEuZGF0YURlc3RpbmF0aW9uLmNhcmdvfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZGF0YS5kYXRhRGVzdGluYXRpb24ub2NjdXBhdGlvbiAhPSB1bmRlZmluZWRcIj5cclxuICAgICAgICAgICAge3tkYXRhLmRhdGFEZXN0aW5hdGlvbi5vY2N1cGF0aW9ufX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZGF0YS5kYXRhRGVzdGluYXRpb24uY29tcGFueSAhPSB1bmRlZmluZWRcIj5cclxuICAgICAgICAgICAge3tkYXRhLmRhdGFEZXN0aW5hdGlvbi5jb21wYW55fX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZGF0YS5kYXRhRGVzdGluYXRpb24uYWRkcmVzcyAhPSB1bmRlZmluZWQgfHwgZGF0YS5kYXRhRGVzdGluYXRpb24uYWRkcmVzc0RldGFpbHMgIT0gdW5kZWZpbmVkIFwiPlxyXG4gICAgICAgICAgICB7e2RhdGEuZGF0YURlc3RpbmF0aW9uLmFkZHJlc3N9fSB7e2RhdGEuZGF0YURlc3RpbmF0aW9uLmFkZHJlc3NEZXRhaWxzfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZGF0YS5kYXRhRGVzdGluYXRpb24uY2l0eSAhPSB1bmRlZmluZWQgfHwgZGF0YS5kYXRhRGVzdGluYXRpb24uY291bnRyeSAhPSB1bmRlZmluZWQgXCI+XHJcbiAgICAgICAgICAgIHt7ZGF0YS5kYXRhRGVzdGluYXRpb24uY2l0eX19PHNwYW4gKm5nSWY9XCJkYXRhLmRhdGFEZXN0aW5hdGlvbi5jaXR5ICE9IHVuZGVmaW5lZCAmJiBkYXRhLmRhdGFEZXN0aW5hdGlvbi5jb3VudHJ5ICE9IHVuZGVmaW5lZFwiPiw8L3NwYW4+e3tkYXRhLmRhdGFEZXN0aW5hdGlvbi5jb3VudHJ5fX1cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICA8L2Rpdj4gLS0+XHJcbjwvZGl2PlxyXG48IS0tIENvbXBsZW1lbnRhcnkgZ3JlZXRpbmctLT5cclxuPGRpdiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgaWQ9XCJwbGktdG9rZW4tY29tcGxlbWVudGFyeS1ncmVldGluZ1wiPlxyXG5cdDwhLS0gPGRpdlxyXG5cdFx0Km5nSWY9XCJcclxuXHRcdFx0ZGF0YSAhPSB1bmRlZmluZWQgJiZcclxuXHRcdFx0ZGF0YS5kYXRhRGVzdGluYXRpb24gIT0gdW5kZWZpbmVkICYmXHJcblx0XHRcdGRhdGEuZGF0YURlc3RpbmF0aW9uLnRhcmdldElkID09IDIgJiZcclxuXHRcdFx0ZGF0YS5kYXRhRGVzdGluYXRpb24uZ3JlZXRpbmcgIT0gdW5kZWZpbmVkXHJcblx0XHRcIlxyXG5cdD5cclxuXHRcdHt7IGRhdGEuZGF0YURlc3RpbmF0aW9uLmdyZWV0aW5nXHJcblx0XHR9fTxzcGFuICpuZ0lmPVwiZGF0YS5kYXRhRGVzdGluYXRpb24udGl0bGUgIT0gdW5kZWZpbmVkXCJcclxuXHRcdFx0PiZuYnNwO3t7IGRhdGEuZGF0YURlc3RpbmF0aW9uLnRpdGxlIH19PC9zcGFuXHJcblx0XHQ+PHNwYW4gKm5nSWY9XCJkYXRhLmRhdGFEZXN0aW5hdGlvbi5sYXN0TmFtZSAhPSB1bmRlZmluZWRcIlxyXG5cdFx0XHQ+Jm5ic3A7e3sgZGF0YS5kYXRhRGVzdGluYXRpb24ubGFzdE5hbWUgfX08L3NwYW5cclxuXHRcdD46XHJcblx0PC9kaXY+LS0+XHJcbjwvZGl2PlxyXG5cclxuPCEtLSBQcmltYXJ5IGJ1ZGdldCB0b3RhbCBzdW1tYXJ5ICR7cHJlc3VwdWVzdG9fMjg4X3Jlc3VtZUNhdGVnb3J5WWVhcn0gLS0+XHJcbjxkaXYgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIGlkPVwicGxpLXRva2VuLXByaW5jaXBhbC1idWRnZXQtdG90YWwtc3VtbWFyeVwiPlxyXG5cdDwhLS0gPGRpdj5cclxuXHRcdDx0YWJsZVxyXG5cdFx0XHQqbmdJZj1cIlxyXG5cdFx0XHRcdGJ1ZGdldER0b1ByaW1hcnkgIT09IG51bGwgJiZcclxuXHRcdFx0XHRidWRnZXREdG9QcmltYXJ5LmJ1ZGdldCAmJlxyXG5cdFx0XHRcdGJ1ZGdldER0b1ByaW1hcnkuYnVkZ2V0LnN1bW1hcnlcclxuXHRcdFx0XCJcclxuXHRcdFx0c3R5bGU9XCJib3JkZXItc3BhY2luZzogMnB4O2JvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XCJcclxuXHRcdD5cclxuXHRcdFx0PHRoZWFkPlxyXG5cdFx0XHRcdDx0ciBzdHlsZT1cImZvbnQtd2VpZ2h0OiBib2xkO1wiPlxyXG5cdFx0XHRcdFx0PHRkXHJcblx0XHRcdFx0XHRcdHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO2JvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBjb2xvcjogd2hpdGU7YmFja2dyb3VuZC1jb2xvcjogZ3JleTtcIlxyXG5cdFx0XHRcdFx0PlxyXG5cdFx0XHRcdFx0XHRSdWJyb1xyXG5cdFx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHRcdDx0ZFxyXG5cdFx0XHRcdFx0XHQqbmdGb3I9XCJsZXQgeWVhciBvZiBidWRnZXREdG9QcmltYXJ5LmJ1ZGdldC5zdW1tYXJ5LnllYXJzXCJcclxuXHRcdFx0XHRcdFx0c3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7IGNvbG9yOiB3aGl0ZTtiYWNrZ3JvdW5kLWNvbG9yOiBncmV5OyB3aWR0aDo4MHB4O1wiXHJcblx0XHRcdFx0XHQ+XHJcblx0XHRcdFx0XHRcdHt7IHllYXIueWVhck51bWJlciB9fVxyXG5cdFx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHRcdDx0ZFxyXG5cdFx0XHRcdFx0XHRzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtib3JkZXI6IDFweCBzb2xpZCBibGFjazsgY29sb3I6IHdoaXRlO2JhY2tncm91bmQtY29sb3I6IGdyZXk7IHdpZHRoOiAxMTBweDtcIlxyXG5cdFx0XHRcdFx0PlxyXG5cdFx0XHRcdFx0XHRUb3RhbCAoe3sgYnVkZ2V0RHRvUHJpbWFyeS5idWRnZXQuc3VtbWFyeS5iYXNlQ3VycmVuY3kgfX0pXHJcblx0XHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdDwvdHI+XHJcblx0XHRcdDwvdGhlYWQ+XHJcblx0XHRcdDx0Ym9keT5cclxuXHRcdFx0XHQ8dHJcclxuXHRcdFx0XHRcdCpuZ0Zvcj1cIlxyXG5cdFx0XHRcdFx0XHRsZXQgY2F0ZWdvcnkgb2YgYnVkZ2V0RHRvUHJpbWFyeS5idWRnZXQuc3VtbWFyeS5jYXRlZ29yaWVzO1xyXG5cdFx0XHRcdFx0XHRsZXQgaUNhdCA9IGluZGV4XHJcblx0XHRcdFx0XHRcIlxyXG5cdFx0XHRcdD5cclxuXHRcdFx0XHRcdDx0ZCBzdHlsZT1cImZvbnQtd2VpZ2h0OiBib2xkO3RleHQtYWxpZ246IGxlZnQ7Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7XCI+XHJcblx0XHRcdFx0XHRcdCZuYnNwOyZuYnNwO3t7XHJcblx0XHRcdFx0XHRcdFx0dHJhbnNsYXRlQ2F0ZWdvcnkoY2F0ZWdvcnkuY2F0ZWdvcnkpXHJcblx0XHRcdFx0XHRcdH19Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7XHJcblx0XHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdFx0PHRkXHJcblx0XHRcdFx0XHRcdCpuZ0Zvcj1cImxldCB5ZWFyIG9mIGNhdGVnb3J5LnllYXJzXCJcclxuXHRcdFx0XHRcdFx0c3R5bGU9XCJ0ZXh0LWFsaWduOiByaWdodDtib3JkZXI6IDFweCBzb2xpZCBibGFjazsgXCJcclxuXHRcdFx0XHRcdD5cclxuXHRcdFx0XHRcdFx0Jm5ic3A7Jm5ic3A7e3tcclxuXHRcdFx0XHRcdFx0XHR5ZWFyLnRvdGFsID09IDAgPyAnLScgOiAoeWVhci50b3RhbCB8IGN1cnJlbmN5OiAnZGVmYXVsdCc6Jyc6JzEuMC0wJylcclxuXHRcdFx0XHRcdFx0fX0mbmJzcDsmbmJzcDtcclxuXHRcdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0XHQ8dGQgc3R5bGU9XCJmb250LXdlaWdodDogYm9sZDsgdGV4dC1hbGlnbjogcmlnaHQ7Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7XCI+XHJcblx0XHRcdFx0XHRcdCZuYnNwOyZuYnNwO3t7XHJcblx0XHRcdFx0XHRcdFx0Y2F0ZWdvcnkudG90YWwgPT0gMFxyXG5cdFx0XHRcdFx0XHRcdFx0PyAnLSdcclxuXHRcdFx0XHRcdFx0XHRcdDogKGNhdGVnb3J5LnRvdGFsIHwgY3VycmVuY3k6ICdkZWZhdWx0JzonJzonMS4wLTAnKVxyXG5cdFx0XHRcdFx0XHR9fSZuYnNwOyZuYnNwO1xyXG5cdFx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHQ8L3RyPlxyXG5cdFx0XHRcdDx0ciBzdHlsZT1cImZvbnQtd2VpZ2h0OiBib2xkO1wiPlxyXG5cdFx0XHRcdFx0PHRkXHJcblx0XHRcdFx0XHRcdHN0eWxlPVwidGV4dC1hbGlnbjogcmlnaHQ7Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7IGNvbG9yOiB3aGl0ZTtiYWNrZ3JvdW5kLWNvbG9yOiBncmV5O1wiXHJcblx0XHRcdFx0XHQ+XHJcblx0XHRcdFx0XHRcdFRvdGFsICh7eyBidWRnZXREdG9QcmltYXJ5LmJ1ZGdldC5zdW1tYXJ5LmJhc2VDdXJyZW5jeSB9fSkmbmJzcDsmbmJzcDtcclxuXHRcdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0XHQ8dGRcclxuXHRcdFx0XHRcdFx0Km5nRm9yPVwibGV0IHllYXIgb2YgYnVkZ2V0RHRvUHJpbWFyeS5idWRnZXQuc3VtbWFyeS55ZWFyc1wiXHJcblx0XHRcdFx0XHRcdHN0eWxlPVwidGV4dC1hbGlnbjogcmlnaHQ7Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7IGNvbG9yOiB3aGl0ZTtiYWNrZ3JvdW5kLWNvbG9yOiBncmV5OyBcIlxyXG5cdFx0XHRcdFx0PlxyXG5cdFx0XHRcdFx0XHR7e1xyXG5cdFx0XHRcdFx0XHRcdHllYXIudG90YWwgPT0gMCA/ICctJyA6ICh5ZWFyLnRvdGFsIHwgY3VycmVuY3k6ICdkZWZhdWx0JzonJzonMS4wLTAnKVxyXG5cdFx0XHRcdFx0XHR9fSZuYnNwOyZuYnNwO1xyXG5cdFx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHRcdDx0ZFxyXG5cdFx0XHRcdFx0XHRzdHlsZT1cInRleHQtYWxpZ246IHJpZ2h0O2JvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBjb2xvcjogd2hpdGU7YmFja2dyb3VuZC1jb2xvcjogZ3JleTtcIlxyXG5cdFx0XHRcdFx0PlxyXG5cdFx0XHRcdFx0XHR7e1xyXG5cdFx0XHRcdFx0XHRcdGJ1ZGdldER0b1ByaW1hcnkuYnVkZ2V0LnN1bW1hcnkuYnVkZ2V0VG90YWwgPT0gMFxyXG5cdFx0XHRcdFx0XHRcdFx0PyAnLSdcclxuXHRcdFx0XHRcdFx0XHRcdDogKGJ1ZGdldER0b1ByaW1hcnkuYnVkZ2V0LnN1bW1hcnkuYnVkZ2V0VG90YWxcclxuXHRcdFx0XHRcdFx0XHRcdCAgfCBjdXJyZW5jeTogJ2RlZmF1bHQnOicnOicxLjAtMCcpXHJcblx0XHRcdFx0XHRcdH19Jm5ic3A7Jm5ic3A7XHJcblx0XHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdDwvdHI+XHJcblx0XHRcdDwvdGJvZHk+XHJcblx0XHQ8L3RhYmxlPlxyXG5cdDwvZGl2PiAtLT5cclxuPC9kaXY+XHJcbjwhLS0gU2VjdW5kYXJ5IGJ1ZGdldCB0b3RhbCBzdW1tYXJ5ICR7cHJlc3VwdWVzdG9fMjg4X3Jlc3VtZUNhdGVnb3J5WWVhcn0gLS0+XHJcbjxkaXYgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIGlkPVwicGxpLXRva2VuLXNlY3VuZGFyeS1idWRnZXQtdG90YWwtc3VtbWFyeVwiPlxyXG5cdDxkaXY+XHJcblx0XHQ8dGFibGVcclxuXHRcdFx0Km5nSWY9XCJcclxuXHRcdFx0XHRidWRnZXREdG9TZWN1bmRhcnkgIT09IG51bGwgJiZcclxuXHRcdFx0XHRidWRnZXREdG9TZWN1bmRhcnkuYnVkZ2V0ICYmXHJcblx0XHRcdFx0YnVkZ2V0RHRvU2VjdW5kYXJ5LmJ1ZGdldC5zdW1tYXJ5XHJcblx0XHRcdFwiXHJcblx0XHRcdHN0eWxlPVwiYm9yZGVyLXNwYWNpbmc6IDJweDsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgd2lkdGg6IDEwMCU7XCJcclxuXHRcdD5cclxuXHRcdFx0PHRoZWFkPlxyXG5cdFx0XHRcdDx0ciBzdHlsZT1cImZvbnQtd2VpZ2h0OiBib2xkO1wiPlxyXG5cdFx0XHRcdFx0PHRkXHJcblx0XHRcdFx0XHRcdHN0eWxlPVwiXHJcblx0XHRcdFx0XHRcdFx0dGV4dC1hbGlnbjogY2VudGVyO1xyXG5cdFx0XHRcdFx0XHRcdGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1xyXG5cdFx0XHRcdFx0XHRcdGNvbG9yOiB3aGl0ZTtcclxuXHRcdFx0XHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiBncmV5O1xyXG5cdFx0XHRcdFx0XHRcIlxyXG5cdFx0XHRcdFx0PlxyXG5cdFx0XHRcdFx0XHRSdWJyb1xyXG5cdFx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHRcdDx0ZFxyXG5cdFx0XHRcdFx0XHQqbmdGb3I9XCJsZXQgeWVhciBvZiBidWRnZXREdG9TZWN1bmRhcnkuYnVkZ2V0LnN1bW1hcnkueWVhcnNcIlxyXG5cdFx0XHRcdFx0XHRzdHlsZT1cIlxyXG5cdFx0XHRcdFx0XHRcdHRleHQtYWxpZ246IGNlbnRlcjtcclxuXHRcdFx0XHRcdFx0XHRib3JkZXI6IDFweCBzb2xpZCBibGFjaztcclxuXHRcdFx0XHRcdFx0XHRjb2xvcjogd2hpdGU7XHJcblx0XHRcdFx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogZ3JleTtcclxuXHRcdFx0XHRcdFx0XHR3aWR0aDogODBweDtcclxuXHRcdFx0XHRcdFx0XCJcclxuXHRcdFx0XHRcdD5cclxuXHRcdFx0XHRcdFx0e3sgeWVhci55ZWFyTnVtYmVyIH19XHJcblx0XHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdFx0PHRkXHJcblx0XHRcdFx0XHRcdHN0eWxlPVwiXHJcblx0XHRcdFx0XHRcdFx0dGV4dC1hbGlnbjogY2VudGVyO1xyXG5cdFx0XHRcdFx0XHRcdGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1xyXG5cdFx0XHRcdFx0XHRcdGNvbG9yOiB3aGl0ZTtcclxuXHRcdFx0XHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiBncmV5O1xyXG5cdFx0XHRcdFx0XHRcdHdpZHRoOiAxMTBweDtcclxuXHRcdFx0XHRcdFx0XCJcclxuXHRcdFx0XHRcdD5cclxuXHRcdFx0XHRcdFx0VG90YWwgKHt7IGJ1ZGdldER0b1NlY3VuZGFyeS5idWRnZXQuc3VtbWFyeS5iYXNlQ3VycmVuY3kgfX0pXHJcblx0XHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdDwvdHI+XHJcblx0XHRcdDwvdGhlYWQ+XHJcblx0XHRcdDx0Ym9keT5cclxuXHRcdFx0XHQ8dHJcclxuXHRcdFx0XHRcdCpuZ0Zvcj1cIlxyXG5cdFx0XHRcdFx0XHRsZXQgY2F0ZWdvcnkgb2YgYnVkZ2V0RHRvU2VjdW5kYXJ5LmJ1ZGdldC5zdW1tYXJ5LmNhdGVnb3JpZXM7XHJcblx0XHRcdFx0XHRcdGxldCBpQ2F0ID0gaW5kZXhcclxuXHRcdFx0XHRcdFwiXHJcblx0XHRcdFx0PlxyXG5cdFx0XHRcdFx0PHRkIHN0eWxlPVwiZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtYWxpZ246IGxlZnQ7IGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1wiPlxyXG5cdFx0XHRcdFx0XHQmbmJzcDsmbmJzcDt7e1xyXG5cdFx0XHRcdFx0XHRcdHRyYW5zbGF0ZUNhdGVnb3J5KGNhdGVnb3J5LmNhdGVnb3J5KVxyXG5cdFx0XHRcdFx0XHR9fSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1xyXG5cdFx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHRcdDx0ZFxyXG5cdFx0XHRcdFx0XHQqbmdGb3I9XCJsZXQgeWVhciBvZiBjYXRlZ29yeS55ZWFyc1wiXHJcblx0XHRcdFx0XHRcdHN0eWxlPVwidGV4dC1hbGlnbjogcmlnaHQ7IGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1wiXHJcblx0XHRcdFx0XHQ+XHJcblx0XHRcdFx0XHRcdCZuYnNwOyZuYnNwO3t7XHJcblx0XHRcdFx0XHRcdFx0eWVhci50b3RhbCA9PSAwID8gJy0nIDogKHllYXIudG90YWwgfCBjdXJyZW5jeTogJ2RlZmF1bHQnOicnOicxLjAtMCcpXHJcblx0XHRcdFx0XHRcdH19Jm5ic3A7Jm5ic3A7XHJcblx0XHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdFx0PHRkIHN0eWxlPVwiZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtYWxpZ246IHJpZ2h0OyBib3JkZXI6IDFweCBzb2xpZCBibGFjaztcIj5cclxuXHRcdFx0XHRcdFx0Jm5ic3A7Jm5ic3A7e3tcclxuXHRcdFx0XHRcdFx0XHRjYXRlZ29yeS50b3RhbCA9PSAwXHJcblx0XHRcdFx0XHRcdFx0XHQ/ICctJ1xyXG5cdFx0XHRcdFx0XHRcdFx0OiAoY2F0ZWdvcnkudG90YWwgfCBjdXJyZW5jeTogJ2RlZmF1bHQnOicnOicxLjAtMCcpXHJcblx0XHRcdFx0XHRcdH19Jm5ic3A7Jm5ic3A7XHJcblx0XHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdDwvdHI+XHJcblx0XHRcdFx0PHRyIHN0eWxlPVwiZm9udC13ZWlnaHQ6IGJvbGQ7XCI+XHJcblx0XHRcdFx0XHQ8dGRcclxuXHRcdFx0XHRcdFx0c3R5bGU9XCJcclxuXHRcdFx0XHRcdFx0XHR0ZXh0LWFsaWduOiByaWdodDtcclxuXHRcdFx0XHRcdFx0XHRib3JkZXI6IDFweCBzb2xpZCBibGFjaztcclxuXHRcdFx0XHRcdFx0XHRjb2xvcjogd2hpdGU7XHJcblx0XHRcdFx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogZ3JleTtcclxuXHRcdFx0XHRcdFx0XCJcclxuXHRcdFx0XHRcdD5cclxuXHRcdFx0XHRcdFx0VG90YWwgKHt7IGJ1ZGdldER0b1NlY3VuZGFyeS5idWRnZXQuc3VtbWFyeS5iYXNlQ3VycmVuY3kgfX0pJm5ic3A7Jm5ic3A7XHJcblx0XHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdFx0PHRkXHJcblx0XHRcdFx0XHRcdCpuZ0Zvcj1cImxldCB5ZWFyIG9mIGJ1ZGdldER0b1NlY3VuZGFyeS5idWRnZXQuc3VtbWFyeS55ZWFyc1wiXHJcblx0XHRcdFx0XHRcdHN0eWxlPVwiXHJcblx0XHRcdFx0XHRcdFx0dGV4dC1hbGlnbjogcmlnaHQ7XHJcblx0XHRcdFx0XHRcdFx0Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7XHJcblx0XHRcdFx0XHRcdFx0Y29sb3I6IHdoaXRlO1xyXG5cdFx0XHRcdFx0XHRcdGJhY2tncm91bmQtY29sb3I6IGdyZXk7XHJcblx0XHRcdFx0XHRcdFwiXHJcblx0XHRcdFx0XHQ+XHJcblx0XHRcdFx0XHRcdHt7XHJcblx0XHRcdFx0XHRcdFx0eWVhci50b3RhbCA9PSAwID8gJy0nIDogKHllYXIudG90YWwgfCBjdXJyZW5jeTogJ2RlZmF1bHQnOicnOicxLjAtMCcpXHJcblx0XHRcdFx0XHRcdH19Jm5ic3A7Jm5ic3A7XHJcblx0XHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdFx0PHRkXHJcblx0XHRcdFx0XHRcdHN0eWxlPVwiXHJcblx0XHRcdFx0XHRcdFx0dGV4dC1hbGlnbjogcmlnaHQ7XHJcblx0XHRcdFx0XHRcdFx0Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7XHJcblx0XHRcdFx0XHRcdFx0Y29sb3I6IHdoaXRlO1xyXG5cdFx0XHRcdFx0XHRcdGJhY2tncm91bmQtY29sb3I6IGdyZXk7XHJcblx0XHRcdFx0XHRcdFwiXHJcblx0XHRcdFx0XHQ+XHJcblx0XHRcdFx0XHRcdHt7XHJcblx0XHRcdFx0XHRcdFx0YnVkZ2V0RHRvU2VjdW5kYXJ5LmJ1ZGdldC5zdW1tYXJ5LmJ1ZGdldFRvdGFsID09IDBcclxuXHRcdFx0XHRcdFx0XHRcdD8gJy0nXHJcblx0XHRcdFx0XHRcdFx0XHQ6IChidWRnZXREdG9TZWN1bmRhcnkuYnVkZ2V0LnN1bW1hcnkuYnVkZ2V0VG90YWxcclxuXHRcdFx0XHRcdFx0XHRcdCAgfCBjdXJyZW5jeTogJ2RlZmF1bHQnOicnOicxLjAtMCcpXHJcblx0XHRcdFx0XHRcdH19Jm5ic3A7Jm5ic3A7XHJcblx0XHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdDwvdHI+XHJcblx0XHRcdDwvdGJvZHk+XHJcblx0XHQ8L3RhYmxlPlxyXG5cdDwvZGl2PlxyXG48L2Rpdj5cclxuIl19