@po-ui/ng-templates 18.23.1 → 19.0.0-rc.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 (205) hide show
  1. package/fesm2022/po-ui-ng-templates.mjs +139 -122
  2. package/fesm2022/po-ui-ng-templates.mjs.map +1 -1
  3. package/lib/components/po-modal-password-recovery/po-modal-password-recovery-base.component.d.ts +1 -1
  4. package/lib/components/po-modal-password-recovery/po-modal-password-recovery.service.d.ts +1 -1
  5. package/lib/components/po-page-blocked-user/po-page-blocked-user-base.component.d.ts +1 -1
  6. package/lib/components/po-page-blocked-user/po-page-blocked-user.component.d.ts +1 -1
  7. package/lib/components/po-page-change-password/po-page-change-password-base.component.d.ts +1 -1
  8. package/lib/components/po-page-change-password/po-page-change-password.service.d.ts +1 -1
  9. package/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter-base.component.d.ts +1 -1
  10. package/lib/components/po-page-dynamic-search/po-page-dynamic-search-base.component.d.ts +1 -1
  11. package/lib/components/po-page-dynamic-search/po-page-dynamic-search.component.d.ts +2 -2
  12. package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-custom-action.interface.d.ts +1 -1
  13. package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-custom-table-action.interface.d.ts +1 -1
  14. package/lib/components/po-page-dynamic-table/po-page-dynamic-list-base.component.d.ts +2 -2
  15. package/lib/components/po-page-dynamic-table/po-page-dynamic-table.component.d.ts +2 -2
  16. package/lib/components/po-page-job-scheduler/po-page-job-scheduler-base.component.d.ts +1 -1
  17. package/lib/components/po-page-job-scheduler/po-page-job-scheduler-execution/po-page-job-scheduler-execution.component.d.ts +2 -2
  18. package/lib/components/po-page-job-scheduler/po-page-job-scheduler-parameters/po-job-scheduler-parameters-template/po-job-scheduler-parameters-template.directive.d.ts +1 -1
  19. package/lib/components/po-page-job-scheduler/po-page-job-scheduler-summary/po-page-job-scheduler-summary.component.d.ts +1 -1
  20. package/lib/components/po-page-login/po-page-login-base.component.d.ts +1 -1
  21. package/lib/components/po-page-login/po-page-login.service.d.ts +1 -1
  22. package/package.json +13 -15
  23. package/po-ui-ng-templates-19.0.0-rc.0.tgz +0 -0
  24. package/schematics/ng-add/index.js +2 -2
  25. package/schematics/ng-add/index.js.map +1 -1
  26. package/schematics/ng-generate/po-page-blocked-user/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
  27. package/schematics/ng-generate/po-page-blocked-user/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
  28. package/schematics/ng-generate/po-page-blocked-user/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
  29. package/schematics/ng-generate/po-page-blocked-user/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
  30. package/schematics/ng-generate/po-page-blocked-user/index.js +1 -1
  31. package/schematics/ng-generate/po-page-blocked-user/index.js.map +1 -1
  32. package/schematics/ng-generate/po-page-change-password/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
  33. package/schematics/ng-generate/po-page-change-password/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
  34. package/schematics/ng-generate/po-page-change-password/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
  35. package/schematics/ng-generate/po-page-change-password/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
  36. package/schematics/ng-generate/po-page-change-password/index.js +1 -1
  37. package/schematics/ng-generate/po-page-change-password/index.js.map +1 -1
  38. package/schematics/ng-generate/po-page-dynamic-detail/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
  39. package/schematics/ng-generate/po-page-dynamic-detail/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
  40. package/schematics/ng-generate/po-page-dynamic-detail/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
  41. package/schematics/ng-generate/po-page-dynamic-detail/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
  42. package/schematics/ng-generate/po-page-dynamic-detail/index.js +1 -1
  43. package/schematics/ng-generate/po-page-dynamic-detail/index.js.map +1 -1
  44. package/schematics/ng-generate/po-page-dynamic-edit/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
  45. package/schematics/ng-generate/po-page-dynamic-edit/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
  46. package/schematics/ng-generate/po-page-dynamic-edit/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
  47. package/schematics/ng-generate/po-page-dynamic-edit/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
  48. package/schematics/ng-generate/po-page-dynamic-edit/index.js +1 -1
  49. package/schematics/ng-generate/po-page-dynamic-edit/index.js.map +1 -1
  50. package/schematics/ng-generate/po-page-dynamic-search/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
  51. package/schematics/ng-generate/po-page-dynamic-search/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
  52. package/schematics/ng-generate/po-page-dynamic-search/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
  53. package/schematics/ng-generate/po-page-dynamic-search/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
  54. package/schematics/ng-generate/po-page-dynamic-search/index.js +1 -1
  55. package/schematics/ng-generate/po-page-dynamic-search/index.js.map +1 -1
  56. package/schematics/ng-generate/po-page-dynamic-table/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
  57. package/schematics/ng-generate/po-page-dynamic-table/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
  58. package/schematics/ng-generate/po-page-dynamic-table/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
  59. package/schematics/ng-generate/po-page-dynamic-table/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
  60. package/schematics/ng-generate/po-page-dynamic-table/index.js +1 -1
  61. package/schematics/ng-generate/po-page-dynamic-table/index.js.map +1 -1
  62. package/schematics/ng-generate/po-page-job-scheduler/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
  63. package/schematics/ng-generate/po-page-job-scheduler/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
  64. package/schematics/ng-generate/po-page-job-scheduler/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
  65. package/schematics/ng-generate/po-page-job-scheduler/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
  66. package/schematics/ng-generate/po-page-job-scheduler/index.js +1 -1
  67. package/schematics/ng-generate/po-page-job-scheduler/index.js.map +1 -1
  68. package/schematics/ng-generate/po-page-login/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
  69. package/schematics/ng-generate/po-page-login/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
  70. package/schematics/ng-generate/po-page-login/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
  71. package/schematics/ng-generate/po-page-login/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
  72. package/schematics/ng-generate/po-page-login/index.js +1 -1
  73. package/schematics/ng-generate/po-page-login/index.js.map +1 -1
  74. package/esm2022/lib/components/components.module.mjs +0 -84
  75. package/esm2022/lib/components/index.mjs +0 -12
  76. package/esm2022/lib/components/po-modal-password-recovery/enums/po-modal-password-recovery-modal-content.enum.mjs +0 -17
  77. package/esm2022/lib/components/po-modal-password-recovery/enums/po-modal-password-recovery-type.enum.mjs +0 -17
  78. package/esm2022/lib/components/po-modal-password-recovery/index.mjs +0 -8
  79. package/esm2022/lib/components/po-modal-password-recovery/interfaces/po-modal-password-recovery.interface.mjs +0 -2
  80. package/esm2022/lib/components/po-modal-password-recovery/literals/i18n/po-modal-password-recovery-literals.mjs +0 -119
  81. package/esm2022/lib/components/po-modal-password-recovery/po-modal-password-recovery-base.component.mjs +0 -293
  82. package/esm2022/lib/components/po-modal-password-recovery/po-modal-password-recovery-error-message/po-modal-password-recovery-error-message.component.mjs +0 -34
  83. package/esm2022/lib/components/po-modal-password-recovery/po-modal-password-recovery.component.mjs +0 -451
  84. package/esm2022/lib/components/po-modal-password-recovery/po-modal-password-recovery.module.mjs +0 -29
  85. package/esm2022/lib/components/po-modal-password-recovery/po-modal-password-recovery.service.mjs +0 -18
  86. package/esm2022/lib/components/po-page-background/index.mjs +0 -3
  87. package/esm2022/lib/components/po-page-background/po-page-background.component.mjs +0 -191
  88. package/esm2022/lib/components/po-page-background/po-page-background.module.mjs +0 -27
  89. package/esm2022/lib/components/po-page-blocked-user/enums/po-page-blocked-user-reason.enum.mjs +0 -17
  90. package/esm2022/lib/components/po-page-blocked-user/index.mjs +0 -8
  91. package/esm2022/lib/components/po-page-blocked-user/interfaces/po-page-blocked-user-reason-params.interface.mjs +0 -2
  92. package/esm2022/lib/components/po-page-blocked-user/literals/i18n/po-page-blocked-user-literals.mjs +0 -78
  93. package/esm2022/lib/components/po-page-blocked-user/po-page-blocked-user-base.component.mjs +0 -197
  94. package/esm2022/lib/components/po-page-blocked-user/po-page-blocked-user-contacts/po-page-blocked-user-contacts.component.mjs +0 -105
  95. package/esm2022/lib/components/po-page-blocked-user/po-page-blocked-user-reason/po-page-blocked-user-reason.component.mjs +0 -107
  96. package/esm2022/lib/components/po-page-blocked-user/po-page-blocked-user.component.mjs +0 -108
  97. package/esm2022/lib/components/po-page-blocked-user/po-page-blocked-user.module.mjs +0 -29
  98. package/esm2022/lib/components/po-page-change-password/index.mjs +0 -7
  99. package/esm2022/lib/components/po-page-change-password/interfaces/po-page-change-password-recovery.interface.mjs +0 -2
  100. package/esm2022/lib/components/po-page-change-password/interfaces/po-page-change-password-requirement.interface.mjs +0 -2
  101. package/esm2022/lib/components/po-page-change-password/interfaces/po-page-change-password.interface.mjs +0 -2
  102. package/esm2022/lib/components/po-page-change-password/literals/i18n/po-page-change-password-literals.mjs +0 -79
  103. package/esm2022/lib/components/po-page-change-password/po-page-change-password-base.component.mjs +0 -300
  104. package/esm2022/lib/components/po-page-change-password/po-page-change-password.component.mjs +0 -401
  105. package/esm2022/lib/components/po-page-change-password/po-page-change-password.module.mjs +0 -30
  106. package/esm2022/lib/components/po-page-change-password/po-page-change-password.service.mjs +0 -18
  107. package/esm2022/lib/components/po-page-dynamic-detail/index.mjs +0 -10
  108. package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-actions.interface.mjs +0 -2
  109. package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-before-back.interface.mjs +0 -2
  110. package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-before-edit.interface.mjs +0 -2
  111. package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-before-remove.interface.mjs +0 -2
  112. package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-field.interface.mjs +0 -2
  113. package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-metadata.interface.mjs +0 -2
  114. package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-options.interface.mjs +0 -2
  115. package/esm2022/lib/components/po-page-dynamic-detail/po-page-dynamic-detail-actions.service.mjs +0 -44
  116. package/esm2022/lib/components/po-page-dynamic-detail/po-page-dynamic-detail.component.mjs +0 -546
  117. package/esm2022/lib/components/po-page-dynamic-detail/po-page-dynamic-detail.module.mjs +0 -54
  118. package/esm2022/lib/components/po-page-dynamic-edit/index.mjs +0 -11
  119. package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-actions.interface.mjs +0 -2
  120. package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-before-cancel.interface.mjs +0 -2
  121. package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-before-save-new.interface.mjs +0 -2
  122. package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-before-save.interface.mjs +0 -2
  123. package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-field.interface.mjs +0 -2
  124. package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-literals.interface.mjs +0 -2
  125. package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-metadata.interface.mjs +0 -2
  126. package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-options.interface.mjs +0 -2
  127. package/esm2022/lib/components/po-page-dynamic-edit/po-page-dynamic-edit-actions.service.mjs +0 -44
  128. package/esm2022/lib/components/po-page-dynamic-edit/po-page-dynamic-edit.component.mjs +0 -889
  129. package/esm2022/lib/components/po-page-dynamic-edit/po-page-dynamic-edit.module.mjs +0 -60
  130. package/esm2022/lib/components/po-page-dynamic-search/index.mjs +0 -7
  131. package/esm2022/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter-base.component.mjs +0 -133
  132. package/esm2022/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter-literals.interface.mjs +0 -2
  133. package/esm2022/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter.component.mjs +0 -76
  134. package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search-base.component.mjs +0 -365
  135. package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search-filters.interface.mjs +0 -2
  136. package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search-literals.interface.mjs +0 -2
  137. package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search-options.interface.mjs +0 -2
  138. package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search.component.mjs +0 -349
  139. package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search.interface.mjs +0 -2
  140. package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search.module.mjs +0 -52
  141. package/esm2022/lib/components/po-page-dynamic-table/index.mjs +0 -16
  142. package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-actions.interface.mjs +0 -2
  143. package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-detail.interface.mjs +0 -2
  144. package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-duplicate.interface.mjs +0 -2
  145. package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-edit.interface.mjs +0 -2
  146. package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-new.interface.mjs +0 -2
  147. package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-remove-all.interface.mjs +0 -2
  148. package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-remove.interface.mjs +0 -2
  149. package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-custom-action.interface.mjs +0 -2
  150. package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-custom-table-action.interface.mjs +0 -2
  151. package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-field.interface.mjs +0 -2
  152. package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-filters.interface.mjs +0 -2
  153. package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-metadata.interface.mjs +0 -2
  154. package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-options.interface.mjs +0 -2
  155. package/esm2022/lib/components/po-page-dynamic-table/po-page-dynamic-list-base.component.mjs +0 -271
  156. package/esm2022/lib/components/po-page-dynamic-table/po-page-dynamic-table-actions.service.mjs +0 -59
  157. package/esm2022/lib/components/po-page-dynamic-table/po-page-dynamic-table-literals.mjs +0 -63
  158. package/esm2022/lib/components/po-page-dynamic-table/po-page-dynamic-table.component.mjs +0 -1257
  159. package/esm2022/lib/components/po-page-dynamic-table/po-page-dynamic-table.module.mjs +0 -50
  160. package/esm2022/lib/components/po-page-job-scheduler/index.mjs +0 -6
  161. package/esm2022/lib/components/po-page-job-scheduler/interfaces/po-job-scheduler-internal.interface.mjs +0 -2
  162. package/esm2022/lib/components/po-page-job-scheduler/interfaces/po-job-scheduler.interface.mjs +0 -2
  163. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-base.component.mjs +0 -302
  164. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-execution/po-page-job-scheduler-execution.component.mjs +0 -393
  165. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-internal.mjs +0 -13
  166. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-literals.mjs +0 -195
  167. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-lookup.service.mjs +0 -22
  168. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-parameters/index.mjs +0 -2
  169. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-parameters/po-job-scheduler-parameters-template/index.mjs +0 -2
  170. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-parameters/po-job-scheduler-parameters-template/po-job-scheduler-parameters-template.directive.mjs +0 -92
  171. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-parameters/po-page-job-scheduler-parameters.component.mjs +0 -79
  172. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-summary/index.mjs +0 -2
  173. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-summary/po-job-scheduler-summary-template/index.mjs +0 -2
  174. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-summary/po-job-scheduler-summary-template/po-job-scheduler-summary-template.directive.mjs +0 -44
  175. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-summary/po-page-job-scheduler-summary.component.mjs +0 -211
  176. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler.component.mjs +0 -418
  177. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler.module.mjs +0 -85
  178. package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler.service.mjs +0 -224
  179. package/esm2022/lib/components/po-page-login/enums/po-page-login-authentication-type.enum.mjs +0 -15
  180. package/esm2022/lib/components/po-page-login/index.mjs +0 -8
  181. package/esm2022/lib/components/po-page-login/interfaces/po-page-login-custom-field.interface.mjs +0 -2
  182. package/esm2022/lib/components/po-page-login/interfaces/po-page-login-literals.interface.mjs +0 -2
  183. package/esm2022/lib/components/po-page-login/interfaces/po-page-login-recovery.interface.mjs +0 -2
  184. package/esm2022/lib/components/po-page-login/interfaces/po-page-login.interface.mjs +0 -2
  185. package/esm2022/lib/components/po-page-login/po-page-login-base.component.mjs +0 -1099
  186. package/esm2022/lib/components/po-page-login/po-page-login-popover/po-page-login-popover.component.mjs +0 -137
  187. package/esm2022/lib/components/po-page-login/po-page-login.component.mjs +0 -483
  188. package/esm2022/lib/components/po-page-login/po-page-login.module.mjs +0 -31
  189. package/esm2022/lib/components/po-page-login/po-page-login.service.mjs +0 -32
  190. package/esm2022/lib/index.mjs +0 -4
  191. package/esm2022/lib/po-templates.module.mjs +0 -18
  192. package/esm2022/lib/services/index.mjs +0 -4
  193. package/esm2022/lib/services/po-page-customization/index.mjs +0 -4
  194. package/esm2022/lib/services/po-page-customization/po-page-customization.module.mjs +0 -23
  195. package/esm2022/lib/services/po-page-customization/po-page-customization.service.mjs +0 -86
  196. package/esm2022/lib/services/po-page-customization/po-page-dynamic-options.interface.mjs +0 -2
  197. package/esm2022/lib/services/po-page-dynamic/index.mjs +0 -3
  198. package/esm2022/lib/services/po-page-dynamic/po-page-dynamic-literals.interface.mjs +0 -2
  199. package/esm2022/lib/services/po-page-dynamic/po-page-dynamic.module.mjs +0 -23
  200. package/esm2022/lib/services/po-page-dynamic/po-page-dynamic.service.mjs +0 -106
  201. package/esm2022/lib/services/services.module.mjs +0 -18
  202. package/esm2022/lib/utils/util.mjs +0 -428
  203. package/esm2022/po-ui-ng-templates.mjs +0 -5
  204. package/esm2022/public-api.mjs +0 -2
  205. package/po-ui-ng-templates-18.23.1.tgz +0 -0
@@ -1,1099 +0,0 @@
1
- import { EventEmitter, Input, Output, Directive } from '@angular/core';
2
- import { convertToBoolean, convertToInt, getShortBrowserLanguage, isExternalLink, isTypeof } from './../../utils/util';
3
- import { poLocaleDefault, poLanguageDefault } from '@po-ui/ng-components';
4
- import { PoPageLoginAuthenticationType } from './enums/po-page-login-authentication-type.enum';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "./po-page-login.service";
7
- import * as i2 from "@angular/router";
8
- import * as i3 from "@po-ui/ng-components";
9
- const poPageLoginContentMaxLength = 40;
10
- export const poPageLoginLiteralsDefault = {
11
- en: {
12
- title: 'Welcome',
13
- loginErrorPattern: 'Invalid Login',
14
- loginHint: `Your login user was given to you at your first day.
15
- If you don't have this information contact support`,
16
- loginPlaceholder: 'Insert your e-mail',
17
- passwordErrorPattern: 'Invalid Password',
18
- passwordPlaceholder: 'Insert your password',
19
- customFieldErrorPattern: 'Invalid value',
20
- customFieldPlaceholder: 'Please enter a value',
21
- rememberUser: 'Automatic login',
22
- rememberUserHint: 'You can disable this option in system configuration',
23
- submitLabel: 'Enter',
24
- submittedLabel: 'Loading...',
25
- forgotPassword: 'Forgot your Password?',
26
- highlightInfo: '',
27
- registerUrl: 'New register',
28
- titlePopover: 'Oops!',
29
- forgotYourPassword: 'Forgot your password?',
30
- ifYouTryHarder: 'If you try ',
31
- attempts: '{0} more time(s) ',
32
- yourUserWillBeBlocked: 'without success your user will be blocked and you will be left 24 hours without being able to access :(',
33
- createANewPasswordNow: 'Better create a new password now! You will be able to log into the system right away.',
34
- iForgotMyPassword: 'I forgot my password',
35
- welcome: 'Welcome',
36
- support: 'Support'
37
- },
38
- es: {
39
- title: 'Bienvenido',
40
- loginErrorPattern: 'Login inválido',
41
- loginHint: `Su usuario ha sido entregado para usted en su primer día.
42
- Si no tiene esta información, póngase en contacto con el soporte técnico`,
43
- loginPlaceholder: 'Inserte su e-mail',
44
- passwordErrorPattern: 'Contraseña inválida',
45
- passwordPlaceholder: 'Inserte su contraseña',
46
- customFieldErrorPattern: 'Valor no válido.',
47
- customFieldPlaceholder: 'Por favor introduzca un valor',
48
- rememberUser: 'Inicio de sesión automáticamente',
49
- rememberUserHint: 'Puede deshabilitar esta opción en el menú del sistema.',
50
- submitLabel: 'Entrar',
51
- submittedLabel: 'Cargando...',
52
- forgotPassword: 'Olvidaste tu contraseña?',
53
- highlightInfo: '',
54
- registerUrl: 'Nuevo registro',
55
- titlePopover: 'Opa!',
56
- forgotYourPassword: 'Olvidaste tu contraseña?',
57
- ifYouTryHarder: 'Si intenta más ',
58
- attempts: '{0} vez/veces ',
59
- yourUserWillBeBlocked: 'sin éxito su usuario sera bloqueado y usted vás permanecer 24 horas sin poder acceder a :(',
60
- createANewPasswordNow: '¡Mejor crear una nueva contraseña ahora! Usted podrá entrar en el sistema inmediatamente después.',
61
- iForgotMyPassword: 'Olvide mi contraseña',
62
- welcome: 'Bienvenido',
63
- support: 'Soporte'
64
- },
65
- pt: {
66
- title: 'Bem-vindo',
67
- loginErrorPattern: 'Login inválido',
68
- loginHint: `Seu usuário foi entregue a você no seu primeiro dia.
69
- Caso não tenha mais essa informação contacte o suporte`,
70
- loginPlaceholder: 'Insira seu e-mail',
71
- passwordErrorPattern: 'Senha inválida',
72
- passwordPlaceholder: 'Insira sua senha',
73
- customFieldErrorPattern: 'Valor inválido.',
74
- customFieldPlaceholder: 'Por favor insira um valor',
75
- rememberUser: 'Logar automaticamente',
76
- rememberUserHint: 'Você pode desabilitar essa opção no menu do sistema',
77
- submitLabel: 'Entrar',
78
- submittedLabel: 'Carregando...',
79
- forgotPassword: 'Esqueceu sua senha?',
80
- highlightInfo: '',
81
- registerUrl: 'Novo registro',
82
- titlePopover: 'Opa!',
83
- forgotYourPassword: 'Esqueceu sua senha?',
84
- ifYouTryHarder: 'Se tentar mais ',
85
- attempts: '{0} vez(es) ',
86
- yourUserWillBeBlocked: 'sem sucesso seu usuário será bloqueado e você fica 24 horas sem poder acessar :(',
87
- createANewPasswordNow: 'Melhor criar uma senha nova agora! Você vai poder entrar no sistema logo em seguida.',
88
- iForgotMyPassword: 'Esqueci minha senha',
89
- welcome: 'Boas-vindas',
90
- support: 'Suporte'
91
- },
92
- ru: {
93
- title: 'Добро пожаловать!',
94
- loginErrorPattern: 'Неверный логин',
95
- loginHint: `Ваш логин был предоставлен вам в первый день.
96
- Если у вас нет этой информации, обратитесь в службу поддержки`,
97
- loginPlaceholder: 'Вставьте свой адрес электронной почты',
98
- passwordErrorPattern: 'Неверный пароль',
99
- passwordPlaceholder: 'Введите свой пароль',
100
- customFieldErrorPattern: 'Неверное значение.',
101
- customFieldPlaceholder: 'Пожалуйста, введите значение',
102
- rememberUser: 'Автоматический вход',
103
- rememberUserHint: 'Вы можете отключить эту опцию в конфигурации системы',
104
- submitLabel: 'Войти',
105
- submittedLabel: '3агрузка...',
106
- forgotPassword: 'Забыли пароль?',
107
- highlightInfo: '',
108
- registerUrl: 'Новый регистр',
109
- titlePopover: 'Ой!',
110
- forgotYourPassword: 'Забыли пароль?',
111
- ifYouTryHarder: 'Если вы безуспешно попытаетесь войти еще ',
112
- attempts: '{0} раз(а) ',
113
- yourUserWillBeBlocked: 'Ваш пользователь будет заблокирован, и Вы останетесь на 24 часа без возможности доступа :(',
114
- createANewPasswordNow: 'Лучше создайте новый пароль сейчас! Вы сможете сразу войти в систему.',
115
- iForgotMyPassword: 'Я забыл свой пароль',
116
- welcome: 'добро пожаловать',
117
- support: 'Поддержка'
118
- }
119
- };
120
- export const poPageLoginLiteralIn = {
121
- en: 'in',
122
- es: 'en',
123
- pt: 'em',
124
- ru: 'в'
125
- };
126
- /**
127
- * @description
128
- *
129
- * O componente `po-page-login` é utilizado como template para tela de login.
130
- * Com ele é possível definirmos valores para usuário, senha e definir ações para recuperação de senha e gravação de dados do usuário.
131
- * Também é possível inserir uma imagem em conjunto com um texto de destaque.
132
- *
133
- *
134
- * A propriedade `p-authentication-url` automatiza a rotina do componente e simplifica o processo para autenticação do usuário, bastando
135
- * definir uma url para requisição da autenticação. A flexibilidade e praticidade podem chegar a um nível em que o desenvolvimento
136
- * da aplicação no *client side* é desprovida de qualquer código-fonte relacionado à rotina de login de usuário.
137
- * Seu detalhamento para uso pode ser visto logo abaixo em *propriedades*.
138
- * Caso julgue necessário, pode-se também definir manualmente a rotina do componente.
139
- *
140
- *
141
- * Para que as imagens sejam exibidas corretamente, é necessário incluir o caminho delas ao projeto. Para isso, edite
142
- * o *assets* no arquivo **angular.json** da aplicação na seguinte ordem:
143
- * ```
144
- * "assets": [
145
- * "src/assets",
146
- * "src/favicon.ico",
147
- * {
148
- * "glob": "**\/*",
149
- * "input": "node_modules/@po-ui/style/images",
150
- * "output": "assets/images"
151
- * }
152
- * ]
153
- * ```
154
- */
155
- export class PoPageLoginBaseComponent {
156
- loginService;
157
- router;
158
- poLanguageService;
159
- /**
160
- * O `p-background` permite inserir uma imagem de destaque ao lado direito do formulário de login, caso a propriedade
161
- * não seja preenchida o formulário será centralizado no espaço disponível.
162
- *
163
- * A fonte da imagem pode ser de um caminho local ou uma url de um servidor externo.
164
- *
165
- * Além da imagem, é possível adicionar um texto informativo por cima da imagem da imagem de destaque, para isso informe
166
- * um valor para a literal `highlightInfo`.
167
- *
168
- * > Veja mais sobre as literais na propriedade `p-literals`.
169
- *
170
- * Exemplos de valores válidos:
171
- * - **local**: `./assets/images/login-background.png`
172
- * - **url externa**: `https://po-ui.io/assets/images/login-background.png`
173
- *
174
- * > Essa propriedade é ignorada para aplicações mobile.
175
- */
176
- background;
177
- /**
178
- * @optional
179
- *
180
- * @description
181
- *
182
- * Caminho para a logomarca localizada na parte superior.
183
- *
184
- * > Caso seja indefinida o espaço se mantém preservado porém vazio.
185
- */
186
- logo;
187
- /**
188
- * @optional
189
- *
190
- * @description
191
- *
192
- * Expressão regular para validar o campo de login, caso a expressão não seja atentida, a literal `loginErrorPattern`
193
- * será exibida.
194
- *
195
- * Exemplos de valores válidos:
196
- * - email: `[expressao-regular-email]`
197
- * - cpf: `[expressao-regular-cpf]`
198
- *
199
- * > Veja a propriedade `p-literals` para customizar a literal `loginErrorPattern`.
200
- */
201
- loginPattern;
202
- /**
203
- * @optional
204
- *
205
- * @description
206
- *
207
- * Expressão regular para validar o campo de password, caso a expressão não seja atentida, a literal `passwordErrorPattern`
208
- * será exibida.
209
- *
210
- * Exemplos de valores válidos:
211
- * - Apenas números: `\d?`
212
- * - Letras mínusculas: `\z?`
213
- *
214
- * > Veja a propriedade `p-literals` para customizar a literal `passwordErrorPattern`.
215
- */
216
- passwordPattern;
217
- /**
218
- * @optional
219
- *
220
- * @description
221
- *
222
- * Caminho para a logomarca localizada no rodapé.
223
- */
224
- secondaryLogo;
225
- /**
226
- * @optional
227
- *
228
- * @description
229
- *
230
- * Evento disparado quando o usuário alterar o input do campo login.
231
- *
232
- * Esse evento receberá como parâmetro uma variável do tipo `string` com o texto informado no campo.
233
- *
234
- * > Esta propriedade será ignorada se for definido valor para a propriedade `p-authentication-url`.
235
- */
236
- loginChange = new EventEmitter();
237
- /**
238
- * Evento disparado ao submeter o formulário de login (apertando `Enter` dentro dos campos ou pressionando o botão de confirmação).
239
- *
240
- * Esse evento receberá como parâmetro um objeto do tipo `PoPageLogin` com os dados informados no formulário.
241
- *
242
- * > Esta propriedade será ignorada se for definido valor para a propriedade `p-url-recovery`.
243
- *
244
- * > Para mais detalhes consulte a documentação sobre a interface `PoPageLogin` mais abaixo.
245
- */
246
- loginSubmit = new EventEmitter();
247
- /**
248
- * @optional
249
- *
250
- * @description
251
- *
252
- * Evento disparado quando o usuário alterar o input do campo password.
253
- *
254
- * Esse evento receberá como parâmetro uma variável do tipo `string` com o texto informado no campo.
255
- *
256
- * > Esta propriedade será ignorada se for definido valor para a propriedade `p-authentication-url`.
257
- */
258
- passwordChange = new EventEmitter();
259
- /**
260
- * @optional
261
- *
262
- * @description
263
- *
264
- * Evento disparado quando o usuário alterar o idioma da página.
265
- *
266
- * Esse evento receberá como parâmetro um objeto do tipo `PoLanguage` com a linguagem selecionada.
267
- *
268
- */
269
- languageChange = new EventEmitter();
270
- /**
271
- * @optional
272
- *
273
- * @description
274
- *
275
- * Define a propriedade nativa `autocomplete` do campo como `off`.
276
- *
277
- * @default `true`
278
- */
279
- noAutocompleteLogin = true;
280
- /**
281
- * @optional
282
- *
283
- * @description
284
- *
285
- * Define a propriedade nativa `autocomplete` do campo como `off`.
286
- *
287
- * > No componente `po-password` será definido como `new-password`.
288
- *
289
- * @default `true`
290
- */
291
- noAutocompletePassword = true;
292
- /**
293
- * @optional
294
- *
295
- * @description
296
- *
297
- * Indica se o status do `model` do switch de lembrar o usuário será escondido visualmente.
298
- *
299
- * > Por padrão será atribuído `false`.
300
- * @default `false`
301
- */
302
- hideLabelStatus = false;
303
- /**
304
- * @optional
305
- *
306
- * @description
307
- *
308
- * Permite esconder a função de espiar a senha digitada.
309
- *
310
- * @default `false`
311
- */
312
- hidePasswordPeek;
313
- allLoginErrors = [];
314
- allPasswordErrors = [];
315
- customFieldObject;
316
- customFieldType;
317
- loginSubscription;
318
- password;
319
- rememberUser = false;
320
- selectedLanguage;
321
- showExceededAttemptsWarning = false;
322
- _authenticationType = PoPageLoginAuthenticationType.Basic;
323
- _authenticationUrl;
324
- _blockedUrl;
325
- _contactEmail;
326
- _customField;
327
- _environment;
328
- _exceededAttemptsWarning;
329
- _hideRememberUser = false;
330
- _literals;
331
- _loading = false;
332
- _login;
333
- _loginErrors = [];
334
- _passwordErrors = [];
335
- _productName;
336
- _recovery;
337
- _registerUrl;
338
- _support;
339
- _languagesList;
340
- /**
341
- * @optional
342
- *
343
- * @description
344
- *
345
- * Ao informar um valor do tipo `string`, o mesmo será aplicado como a chave do campo customizado e utilizará
346
- * os valores padrões contidos na propriedade `literals` como `customFieldErrorPattern` e `customFieldPlaceholder`.
347
- *
348
- * Existe a possibilidade de informar um objeto que segue a definição da interface `PoPageLoginCustomField`, onde
349
- * através dos parâmetros enviados pode gerar um `po-input`, `po-combo` especificamente para serviços
350
- * ou `po-select` para valores fixos.
351
- *
352
- * Abaixo seguem os exemplos de cada tipo de campo.
353
- *
354
- * `po-input`:
355
- *
356
- * ```
357
- * {
358
- * property: 'domain',
359
- * value: 'jv01',
360
- * placeholder: 'Enter your domain',
361
- * pattern: '[a-z]',
362
- * errorPattern: 'Invalid value'
363
- * }
364
- * ```
365
- *
366
- * `po-combo`:
367
- *
368
- * ```
369
- * {
370
- * property: 'domain',
371
- * value: 'jv01',
372
- * placeholder: 'Enter your domain',
373
- * url: 'https://po-ui.io/sample/api/comboOption/domains',
374
- * fieldValue: 'nickname'
375
- * }
376
- * ```
377
- *
378
- * `po-select`:
379
- *
380
- * ```
381
- * {
382
- * property: 'domain',
383
- * value: 'jv01',
384
- * placeholder: 'Enter your domain',
385
- * options: [{label: 'Domain 1', value: '1'}, {label: 'Domain 2', value: '2'}]
386
- * }
387
- * ```
388
- *
389
- * Caso o customField possua options, url e fieldValue preenchidos, será priorizado o po-select
390
- * utilizando o options.
391
- *
392
- */
393
- set customField(value) {
394
- if (value) {
395
- if (isTypeof(value, 'string')) {
396
- this.customFieldType = 'input';
397
- this._customField = value;
398
- this.customFieldObject = this.getDefaultCustomFieldObject(value);
399
- return;
400
- }
401
- if (isTypeof(value, 'object') && !Array.isArray(value) && value['property']) {
402
- this._customField = value;
403
- this.customFieldObject = value;
404
- if (!this.customFieldObject.options && !this.customFieldObject.url) {
405
- this.customFieldType = 'input';
406
- }
407
- else {
408
- this.customFieldType = this.customFieldObject.options ? 'select' : 'combo';
409
- }
410
- return;
411
- }
412
- }
413
- this._customField = undefined;
414
- this.customFieldObject = undefined;
415
- }
416
- get customField() {
417
- return this._customField;
418
- }
419
- /**
420
- * @optional
421
- *
422
- * @description
423
- *
424
- * Personaliza o e-mail que é exibido na mensagem de dica de login padrão para contato de suporte.
425
- */
426
- set contactEmail(value) {
427
- this._contactEmail = value;
428
- }
429
- get contactEmail() {
430
- return this._contactEmail;
431
- }
432
- /**
433
- * @optional
434
- *
435
- * @description
436
- *
437
- * Texto customizado que fica entre a logo e a mensagem de boas-vindas.
438
- */
439
- set productName(value) {
440
- this._productName = value;
441
- }
442
- get productName() {
443
- return this._productName;
444
- }
445
- /**
446
- * @optional
447
- *
448
- * @description
449
- * Adiciona uma `tag` abaixo do título que especifica o ambiente que o usuário está fazendo o login.
450
- *
451
- * > Essa propriedade limita o texto em 40 caracteres.
452
- */
453
- set environment(environment) {
454
- if (environment && environment.length > poPageLoginContentMaxLength) {
455
- this._environment = environment.substring(0, poPageLoginContentMaxLength);
456
- }
457
- else {
458
- this._environment = environment;
459
- }
460
- }
461
- get environment() {
462
- return this._environment;
463
- }
464
- /**
465
- * @optional
466
- *
467
- * @description
468
- * Exibe um aviso de bloqueio de acordo com a quantidade restante de tentativas.
469
- * O aviso será exibido somente se a quantidade for maior que zero.
470
- *
471
- * > Caso tenha algum valor atribuído para o atributo `p-authentication-url` e o retorno da requisição estiver atribuindo valor
472
- * para o `p-exceeded-attempts-warning`, o valor considerado será o do retorno da requisição.
473
- *
474
- * @default `0`
475
- */
476
- set exceededAttemptsWarning(value) {
477
- this._exceededAttemptsWarning = convertToInt(value);
478
- this.showExceededAttemptsWarning = this.exceededAttemptsWarning > 0;
479
- }
480
- get exceededAttemptsWarning() {
481
- return this._exceededAttemptsWarning;
482
- }
483
- /**
484
- * @optional
485
- *
486
- * @description
487
- *
488
- * Esconde a função "Lembrar usuário" do formulário de login.
489
- *
490
- * Quando essa propriedade é setada com `true` a propriedade `rememberUser` enviada no evento `p-login-submit` será sempre
491
- * `false`.
492
- *
493
- * > Veja a propriedade `p-literals` para customizar a literal `rememberUser`.
494
- *
495
- * @default `false`
496
- */
497
- set hideRememberUser(value) {
498
- this._hideRememberUser = value === '' ? true : convertToBoolean(value);
499
- if (this._hideRememberUser) {
500
- this.rememberUser = false;
501
- }
502
- }
503
- get hideRememberUser() {
504
- return this._hideRememberUser;
505
- }
506
- /**
507
- * @optional
508
- *
509
- * @description
510
- *
511
- * Objeto com as literais usadas no `po-page-login`.
512
- *
513
- * Existem duas maneiras de customizar o componente, passando um objeto com todas as literais disponíveis:
514
- *
515
- * ```
516
- * const customLiterals: PoPageLoginLiterals = {
517
- * attempts: '{0} vez(es) ',
518
- * createANewPasswordNow: 'Melhor criar uma senha nova agora! Você vai poder entrar no sistema logo em seguida.',
519
- * forgotPassword: 'Esqueceu sua senha?',
520
- * forgotYourPassword: 'Esqueceu sua senha?',
521
- * highlightInfo: '',
522
- * iForgotMyPassword: 'Esqueci minha senha',
523
- * ifYouTryHarder: 'Se tentar mais ',
524
- * welcome: 'Boas-vindas',
525
- * loginErrorPattern: 'Login obrigatório',
526
- * loginHint: 'Caso não possua usuário entre em contato com o suporte',
527
- * loginLabel: 'Insira seu usuário',
528
- * loginPlaceholder: 'Insira seu usuário de acesso',
529
- * passwordErrorPattern: 'Senha obrigatória',
530
- * passwordLabel: 'Insira sua senha',
531
- * passwordPlaceholder: 'Insira sua senha de acesso',
532
- * customFieldErrorPattern: 'Campo customizado inválido',
533
- * customFieldPlaceholder: 'Por favor insira um valor',
534
- * registerUrl: 'Novo registro',
535
- * rememberUser: 'Lembrar usuário',
536
- * rememberUserHint: 'Esta opção pode ser desabilitada nas configurações do sistema',
537
- * submitLabel: 'Acessar sistema',
538
- * submittedLabel: 'Carregando...',
539
- * titlePopover: 'Opa!',
540
- * yourUserWillBeBlocked: 'sem sucesso seu usuário será bloqueado e você fica 24 horas sem poder acessar :('
541
- * };
542
- * ```
543
- *
544
- * Ou passando apenas as literais que deseja customizar:
545
- *
546
- * ```
547
- * const customLiterals: PoPageLoginLiterals = {
548
- * loginPlaceholder: 'Insira seu usuário de acesso',
549
- * passwordPlaceholder: 'Insira sua senha de acesso',
550
- * submitLabel: 'Acessar sistema'
551
- * };
552
- * ```
553
- *
554
- * E para carregar as literais customizadas, basta apenas passar o objeto para o componente.
555
- *
556
- * ```
557
- * <po-page-login
558
- * [p-literals]="customLiterals">
559
- * </po-page-login>
560
- * ```
561
- *
562
- * > O objeto padrão de literais será traduzido de acordo com o idioma do browser (pt, en, es).
563
- * > É também possível alternar o objeto padrão de literais através do seletor de idiomas localizado na parte inferior do template,
564
- * nesse caso, há também a opção do idioma russo.
565
- */
566
- set literals(value) {
567
- this._literals = value;
568
- }
569
- get literals() {
570
- return this._literals;
571
- }
572
- /**
573
- * @optional
574
- *
575
- * @description
576
- *
577
- * Habilita um estado de carregamento ao botão de *login*.
578
- *
579
- * > É necessário atribuir `true` à esta propriedade na função definida em `p-login-submit`.
580
- *
581
- * @default `false`
582
- */
583
- set loading(value) {
584
- this._loading = convertToBoolean(value);
585
- }
586
- get loading() {
587
- return this._loading;
588
- }
589
- /**
590
- * @optional
591
- *
592
- * @description
593
- *
594
- * Valor do modelo do campo de login.
595
- */
596
- set login(value) {
597
- this._login = value;
598
- if (!this.authenticationUrl) {
599
- this.loginChange.emit(this._login);
600
- }
601
- }
602
- get login() {
603
- return this._login;
604
- }
605
- /**
606
- * @optional
607
- *
608
- * @description
609
- *
610
- * Atributo que recebe uma lista de erros e exibe abaixo do campo de login.
611
- */
612
- set loginErrors(value) {
613
- this._loginErrors = value || [];
614
- this.setLoginErrors(this._loginErrors);
615
- }
616
- get loginErrors() {
617
- return this._loginErrors;
618
- }
619
- /**
620
- * @optional
621
- *
622
- * @description
623
- *
624
- * Atributo que recebe uma lista de erros e exibe abaixo do campo de password.
625
- */
626
- set passwordErrors(value) {
627
- this._passwordErrors = value || [];
628
- this.setPasswordErrors(this._passwordErrors);
629
- }
630
- get passwordErrors() {
631
- return this._passwordErrors;
632
- }
633
- /**
634
- * @optional
635
- *
636
- * @description
637
- *
638
- * Exibe um link abaixo do formulário de login para que os usuários da aplicação façam a recuperação dos dados de autenticação.
639
- *
640
- * A propriedade aceita os seguintes tipos:
641
- *
642
- * - **String**: informe uma url externa ou uma rota válida;
643
- * - **Function**: pode-se customizar a ação. Para esta possilidade basta atribuir:
644
- * ```
645
- * <po-page-login>
646
- * [recovery]="this.myRecovery.bind(this)">
647
- * </po-page-login>
648
- * ```
649
- *
650
- * - **PoPageLoginRecovery**: cria-se vínculo automático com o template **po-modal-password-recovery**.
651
- * O objeto deve conter a **url** para requisição dos recursos e pode-se definir o **tipo** de modal para recuperação de senha,
652
- * **email** para contato e **máscara** do campo de telefone.
653
- */
654
- set recovery(value) {
655
- this._recovery = value;
656
- }
657
- get recovery() {
658
- return this._recovery;
659
- }
660
- /**
661
- * @optional
662
- *
663
- * @description
664
- *
665
- * Caso a aplicação tenha um link para novos cadastros, informe uma url externa ou uma rota válida, dessa
666
- * forma será exibido um link abaixo do formulário de login para os usuários da aplicação.
667
- *
668
- * Exemplos de valores válidos:
669
- * - **local**: `/home`
670
- * - **url externa**: `https://po-ui.io`
671
- *
672
- * > Veja a propriedade `p-literals` para customizar a literal `registerUrl`.
673
- */
674
- set registerUrl(value) {
675
- this._registerUrl = isTypeof(value, 'string') ? value : undefined;
676
- }
677
- get registerUrl() {
678
- return this._registerUrl;
679
- }
680
- /**
681
- * @optional
682
- *
683
- * @description
684
- *
685
- * Atributo que recebe o tipo de esquema da autenticação, sendo suportados apenas os valores `Basic` e `Bearer`.
686
- *
687
- * > Caso o tipo definido seja `Basic`, o componente fará uma requisição `POST` contendo:
688
- *
689
- * ```
690
- * headers {
691
- * Authorization: Basic base64(login:password)
692
- * }
693
- *
694
- * body {
695
- * rememberUser: rememberUser
696
- * }
697
- * ```
698
- *
699
- * > Caso o tipo definido seja `Bearer`, o componente fará uma requisição `POST` contendo:
700
- *
701
- * ```
702
- * body {
703
- * login: login,
704
- * password: base64(password),
705
- * rememberUser: rememberUser
706
- * }
707
- * ```
708
- *
709
- * @default `PoPageLoginAuthenticationType.Basic`
710
- */
711
- set authenticationType(value) {
712
- this._authenticationType = Object.values(PoPageLoginAuthenticationType).includes(value)
713
- ? value
714
- : PoPageLoginAuthenticationType.Basic;
715
- }
716
- get authenticationType() {
717
- return this._authenticationType;
718
- }
719
- /**
720
- * @optional
721
- *
722
- * @description
723
- *
724
- * Endpoint usado pelo template para requisição do recurso. Quando preenchido, o método `p-login-submit` será ignorado e o
725
- * componente adquirirá automatização para o processo de autenticação.
726
- *
727
- * ### Processos
728
- * Ao digitar um valor válido no campo de login/password e pressionar **Enter**, o componente fará uma requisição `POST`
729
- * na url especificada nesta propriedade passando o objeto contendo o valor definido pelo usuário:
730
- *
731
- * ```
732
- * headers {
733
- * Authorization: Basic base64(login:password)
734
- * }
735
- *
736
- * body {
737
- * rememberUser: rememberUser
738
- * }
739
- * ```
740
- *
741
- * Em caso de **sucesso**, o objeto de retorno é armazenado no `sessionStorage` e o usuário é redirecionado para a página inicial da
742
- * aplicação `/`.
743
- *
744
- * ```
745
- * 200:
746
- * {
747
- * user: user
748
- * }
749
- * ```
750
- *
751
- * Em caso de **erro** na autenticação, espera-se o seguinte retorno:
752
- *
753
- * ```
754
- * 400/401
755
- * {
756
- * code: 400/401,
757
- * message: message,
758
- * detailedMessage: detailedMessage,
759
- * helpUrl?: helpUrl
760
- * }
761
- * ```
762
- *
763
- * > Pode-se atribuir uma quantidade máxima de tentativas restantes (maxAttemptsRemaining) para o atributo `p-exceeded-attempts-warning`,
764
- * assim como os avisos relacionados aos campos login e password (loginWarnings, passwordWarnings) para os atributos `p-login-errors` e
765
- * `p-password-errors` conforme retorno abaixo:
766
- *
767
- * ```
768
- * 400
769
- * {
770
- * code: 400/401,
771
- * message: message,
772
- * detailedMessage: detailedMessage,
773
- * helpUrl?: helpUrl,
774
- * maxAttemptsRemaining?: maxAttemptsRemaining,
775
- * loginWarnings?: [loginWarnings],
776
- * passwordWarnings?: [passwordWarnings]
777
- * }
778
- * ```
779
- *
780
- * > Caso o valor atribuído para `p-exceeded-attempts-warning` seja igual a 0(zero), poderá ser passado um valor para o
781
- * atributo `p-blocked-url` e o usuário será redirecionado para uma tela de bloqueio.
782
- *
783
- * *Processo finalizado.*
784
- *
785
- * _______________
786
- *
787
- * #### Praticidade
788
- * As informações do serviço de autenticação também podem ser transmitidas diretamente pelas configuraçãos de rota e, desta maneira,
789
- * dispensa-se qualquer menção e/ou importação do componente `po-page-login` no restante da aplicação. O exemplo abaixo exemplifica
790
- * a forma dinâmica com a qual o template de tela de login pode ser gerado ao navegar para rota `/login`, e também como ele se comunica
791
- * com o serviço para efetuação do processo de autenticação do usuário e solicitação de nova senha.
792
- * Basta definir nas configurações de rota:
793
- *
794
- *
795
- * ```
796
- * import { PoPageLoginComponent, PoPageLoginAthenticationType } from '@po-ui/ng-templates';
797
- *
798
- * ...
799
- * const routes: Routes = [
800
- * {
801
- * path: 'login', component: PoPageLoginComponent, data: {
802
- * serviceApi: 'https://po-ui.io/sample/api/users/authentication',
803
- * environment: 'development',
804
- * recovery: {
805
- * url: 'https://po-ui.io/sample/api/users',
806
- * type: PoModalPasswordRecoveryType.All,
807
- * contactMail: 'dev.po@po-ui.com',
808
- * phoneMask: '9-999-999-9999'
809
- * },
810
- * registerUrl: '/new-password',
811
- * authenticationType: PoPageLoginAthenticationType.Basic
812
- * }
813
- * }
814
- * ...
815
- * ];
816
- *
817
- * @NgModule({
818
- * imports: [RouterModule.forRoot(routes)],
819
- * exports: [RouterModule]
820
- * })
821
- * export class AppRoutingModule { }
822
- * ```
823
- *
824
- *
825
- * O metadado `serviceApi` deve ser a **url** para requisição dos recursos de autenticação, o `environment` alimenta a propriedade
826
- * `p-environment`, `recovery` é a interface `PoPageLoginRecovery` responsável pelas especificações contidas na modal de recuperação de
827
- * senha, `registerUrl` alimenta a propriedade `p-register-url` e `authenticationType` que define a propriedade `p-authentication-type`.
828
- *
829
- * > É essencial que siga a nomenclatura dos atributos exemplificados acima para sua efetiva funcionalidade.
830
- *
831
- */
832
- set authenticationUrl(value) {
833
- this._authenticationUrl = isTypeof(value, 'string') ? value : undefined;
834
- }
835
- get authenticationUrl() {
836
- return this._authenticationUrl;
837
- }
838
- /**
839
- * @optional
840
- *
841
- * @description
842
- *
843
- * Caso o valor atribuído para `p-exceeded-attempts-warning` seja igual a 0(zero) e a aplicação tenha um link de bloqueio de usuário,
844
- * informe uma url externa ou uma rota válida, dessa forma em caso de bloqueio o usuário será redirecionado.
845
- */
846
- set blockedUrl(value) {
847
- this._blockedUrl = isTypeof(value, 'string') ? value : undefined;
848
- }
849
- get blockedUrl() {
850
- return this._blockedUrl;
851
- }
852
- /**
853
- * @optional
854
- *
855
- * @description
856
- *
857
- * Exibe um botão para suporte.
858
- *
859
- * A propriedade aceita os seguintes tipos:
860
- *
861
- * - **String**: URL externa ou uma rota válida;
862
- * - **Function**: Função a ser disparada ao clicar no botão de suporte;
863
- * ```
864
- * <po-page-login>
865
- * [p-support]="this.mySupport.bind(this)">
866
- * </po-page-login>
867
- * ```
868
- *
869
- */
870
- set support(value) {
871
- this._support = value;
872
- }
873
- get support() {
874
- return this._support;
875
- }
876
- /**
877
- * @optional
878
- *
879
- * @description
880
- *
881
- * Coleção de idiomas que o componente irá tratar e disponibilizará para o usuário escolher.
882
- *
883
- * Caso essa propriedade não seja utilizada o componente mostrará no combo os idiomas que ele suporta por padrão.
884
- *
885
- * Caso a coleção tenha um idioma, a página estará nesse idioma e não mostrará o combo.
886
- *
887
- * Caso seja passado um array vazio, a página terá o idioma configurado no `i18n` e não mostrará o combo de seleção.
888
- *
889
- * > Se for passado um idioma não suportado, será preciso passar as literais pela propriedade `p-literals`.
890
- *
891
- *
892
- */
893
- set languagesList(languagesList) {
894
- if (languagesList) {
895
- if (languagesList.length) {
896
- this._languagesList = languagesList;
897
- }
898
- else {
899
- this._languagesList = poLanguageDefault.filter(language => language.language === this.language);
900
- }
901
- }
902
- }
903
- get languagesList() {
904
- if (this._languagesList) {
905
- return this._languagesList;
906
- }
907
- return poLanguageDefault;
908
- }
909
- get showLanguage() {
910
- return this.languagesList.length > 1;
911
- }
912
- get language() {
913
- return this.selectedLanguage || getShortBrowserLanguage();
914
- }
915
- get pageLoginLiterals() {
916
- const loginHintWithContactEmail = this.contactEmail
917
- ? this.concatenateLoginHintWithContactEmail(this.contactEmail)
918
- : undefined;
919
- return {
920
- ...poPageLoginLiteralsDefault[poLocaleDefault],
921
- ...poPageLoginLiteralsDefault[this.language],
922
- ...loginHintWithContactEmail,
923
- ...this.literals
924
- };
925
- }
926
- constructor(loginService, router, poLanguageService) {
927
- this.loginService = loginService;
928
- this.router = router;
929
- this.poLanguageService = poLanguageService;
930
- this.selectedLanguage = this.poLanguageService.getShortLanguage();
931
- }
932
- ngOnDestroy() {
933
- if (this.loginSubscription) {
934
- this.loginSubscription.unsubscribe();
935
- }
936
- }
937
- closePopover() {
938
- this.showExceededAttemptsWarning = false;
939
- }
940
- onLoginSubmit() {
941
- const loginForm = {
942
- login: this.login,
943
- password: this.password,
944
- rememberUser: this.rememberUser
945
- };
946
- if (this.customField) {
947
- loginForm[this.customFieldObject.property] = this.customFieldObject.value;
948
- }
949
- if (this.authenticationUrl) {
950
- this.loading = true;
951
- this.loginSubscription = this.loginService
952
- .onLogin(this.authenticationUrl, this.authenticationType, loginForm)
953
- .subscribe(data => {
954
- this.setValuesToProperties();
955
- sessionStorage.setItem('PO_USER_LOGIN', JSON.stringify(data));
956
- this.openInternalLink('/');
957
- this.loading = false;
958
- }, error => {
959
- if (error.error.code === '400' || error.error.code === '401') {
960
- this.setValuesToProperties(error);
961
- this.redirectBlockedUrl(this.exceededAttemptsWarning, this.blockedUrl);
962
- }
963
- this.loading = false;
964
- });
965
- }
966
- else {
967
- this.loginSubmit.emit(loginForm);
968
- this.showExceededAttemptsWarning = this.exceededAttemptsWarning > 0;
969
- }
970
- }
971
- getDefaultCustomFieldObject(property) {
972
- return { property };
973
- }
974
- openExternalLink(url) {
975
- window.open(url, '_blank');
976
- }
977
- openInternalLink(url) {
978
- this.router.navigate([url]);
979
- }
980
- redirectBlockedUrl(attempts, blockedUrl) {
981
- if (attempts === 0 && blockedUrl) {
982
- this.showExceededAttemptsWarning = false;
983
- isExternalLink(blockedUrl) ? this.openExternalLink(blockedUrl) : this.openInternalLink(blockedUrl);
984
- }
985
- }
986
- setValuesToProperties(result) {
987
- if (result) {
988
- this.exceededAttemptsWarning = result.error.maxAttemptsRemaining;
989
- this.loginErrors = result.error.loginWarnings;
990
- this.passwordErrors = result.error.passwordWarnings;
991
- this.blockedUrl = result.error.blockedUrl;
992
- }
993
- else {
994
- this.exceededAttemptsWarning = 0;
995
- this.loginErrors = [];
996
- this.passwordErrors = [];
997
- this.blockedUrl = '';
998
- }
999
- }
1000
- static ɵfac = function PoPageLoginBaseComponent_Factory(t) { return new (t || PoPageLoginBaseComponent)(i0.ɵɵdirectiveInject(i1.PoPageLoginService), i0.ɵɵdirectiveInject(i2.Router), i0.ɵɵdirectiveInject(i3.PoLanguageService)); };
1001
- static ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: PoPageLoginBaseComponent, inputs: { background: [0, "p-background", "background"], logo: [0, "p-logo", "logo"], loginPattern: [0, "p-login-pattern", "loginPattern"], passwordPattern: [0, "p-password-pattern", "passwordPattern"], secondaryLogo: [0, "p-secondary-logo", "secondaryLogo"], noAutocompleteLogin: [0, "p-no-autocomplete-login", "noAutocompleteLogin"], noAutocompletePassword: [0, "p-no-autocomplete-password", "noAutocompletePassword"], hideLabelStatus: [2, "p-hide-label-status", "hideLabelStatus", convertToBoolean], hidePasswordPeek: [0, "p-hide-password-peek", "hidePasswordPeek"], customField: [0, "p-custom-field", "customField"], contactEmail: [0, "p-contact-email", "contactEmail"], productName: [0, "p-product-name", "productName"], environment: [0, "p-environment", "environment"], exceededAttemptsWarning: [0, "p-exceeded-attempts-warning", "exceededAttemptsWarning"], hideRememberUser: [0, "p-hide-remember-user", "hideRememberUser"], literals: [0, "p-literals", "literals"], loading: [0, "p-loading", "loading"], login: [0, "p-login", "login"], loginErrors: [0, "p-login-errors", "loginErrors"], passwordErrors: [0, "p-password-errors", "passwordErrors"], recovery: [0, "p-recovery", "recovery"], registerUrl: [0, "p-register-url", "registerUrl"], authenticationType: [0, "p-authentication-type", "authenticationType"], authenticationUrl: [0, "p-authentication-url", "authenticationUrl"], blockedUrl: [0, "p-blocked-url", "blockedUrl"], support: [0, "p-support", "support"], languagesList: [0, "p-languages", "languagesList"] }, outputs: { loginChange: "p-login-change", loginSubmit: "p-login-submit", passwordChange: "p-password-change", languageChange: "p-language-change" }, features: [i0.ɵɵInputTransformsFeature] });
1002
- }
1003
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PoPageLoginBaseComponent, [{
1004
- type: Directive
1005
- }], () => [{ type: i1.PoPageLoginService }, { type: i2.Router }, { type: i3.PoLanguageService }], { background: [{
1006
- type: Input,
1007
- args: ['p-background']
1008
- }], logo: [{
1009
- type: Input,
1010
- args: ['p-logo']
1011
- }], loginPattern: [{
1012
- type: Input,
1013
- args: ['p-login-pattern']
1014
- }], passwordPattern: [{
1015
- type: Input,
1016
- args: ['p-password-pattern']
1017
- }], secondaryLogo: [{
1018
- type: Input,
1019
- args: ['p-secondary-logo']
1020
- }], loginChange: [{
1021
- type: Output,
1022
- args: ['p-login-change']
1023
- }], loginSubmit: [{
1024
- type: Output,
1025
- args: ['p-login-submit']
1026
- }], passwordChange: [{
1027
- type: Output,
1028
- args: ['p-password-change']
1029
- }], languageChange: [{
1030
- type: Output,
1031
- args: ['p-language-change']
1032
- }], noAutocompleteLogin: [{
1033
- type: Input,
1034
- args: ['p-no-autocomplete-login']
1035
- }], noAutocompletePassword: [{
1036
- type: Input,
1037
- args: ['p-no-autocomplete-password']
1038
- }], hideLabelStatus: [{
1039
- type: Input,
1040
- args: [{ alias: 'p-hide-label-status', transform: convertToBoolean }]
1041
- }], hidePasswordPeek: [{
1042
- type: Input,
1043
- args: ['p-hide-password-peek']
1044
- }], customField: [{
1045
- type: Input,
1046
- args: ['p-custom-field']
1047
- }], contactEmail: [{
1048
- type: Input,
1049
- args: ['p-contact-email']
1050
- }], productName: [{
1051
- type: Input,
1052
- args: ['p-product-name']
1053
- }], environment: [{
1054
- type: Input,
1055
- args: ['p-environment']
1056
- }], exceededAttemptsWarning: [{
1057
- type: Input,
1058
- args: ['p-exceeded-attempts-warning']
1059
- }], hideRememberUser: [{
1060
- type: Input,
1061
- args: ['p-hide-remember-user']
1062
- }], literals: [{
1063
- type: Input,
1064
- args: ['p-literals']
1065
- }], loading: [{
1066
- type: Input,
1067
- args: ['p-loading']
1068
- }], login: [{
1069
- type: Input,
1070
- args: ['p-login']
1071
- }], loginErrors: [{
1072
- type: Input,
1073
- args: ['p-login-errors']
1074
- }], passwordErrors: [{
1075
- type: Input,
1076
- args: ['p-password-errors']
1077
- }], recovery: [{
1078
- type: Input,
1079
- args: ['p-recovery']
1080
- }], registerUrl: [{
1081
- type: Input,
1082
- args: ['p-register-url']
1083
- }], authenticationType: [{
1084
- type: Input,
1085
- args: ['p-authentication-type']
1086
- }], authenticationUrl: [{
1087
- type: Input,
1088
- args: ['p-authentication-url']
1089
- }], blockedUrl: [{
1090
- type: Input,
1091
- args: ['p-blocked-url']
1092
- }], support: [{
1093
- type: Input,
1094
- args: ['p-support']
1095
- }], languagesList: [{
1096
- type: Input,
1097
- args: ['p-languages']
1098
- }] }); })();
1099
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tcGFnZS1sb2dpbi1iYXNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RlbXBsYXRlcy9zcmMvbGliL2NvbXBvbmVudHMvcG8tcGFnZS1sb2dpbi9wby1wYWdlLWxvZ2luLWJhc2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHbEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSx1QkFBdUIsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFdkgsT0FBTyxFQUFxQixlQUFlLEVBQWMsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUd6RyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQzs7Ozs7QUFNL0YsTUFBTSwyQkFBMkIsR0FBRyxFQUFFLENBQUM7QUFFdkMsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUc7SUFDeEMsRUFBRSxFQUF1QjtRQUN2QixLQUFLLEVBQUUsU0FBUztRQUNoQixpQkFBaUIsRUFBRSxlQUFlO1FBQ2xDLFNBQVMsRUFBRTt1REFDd0M7UUFDbkQsZ0JBQWdCLEVBQUUsb0JBQW9CO1FBQ3RDLG9CQUFvQixFQUFFLGtCQUFrQjtRQUN4QyxtQkFBbUIsRUFBRSxzQkFBc0I7UUFDM0MsdUJBQXVCLEVBQUUsZUFBZTtRQUN4QyxzQkFBc0IsRUFBRSxzQkFBc0I7UUFDOUMsWUFBWSxFQUFFLGlCQUFpQjtRQUMvQixnQkFBZ0IsRUFBRSxxREFBcUQ7UUFDdkUsV0FBVyxFQUFFLE9BQU87UUFDcEIsY0FBYyxFQUFFLFlBQVk7UUFDNUIsY0FBYyxFQUFFLHVCQUF1QjtRQUN2QyxhQUFhLEVBQUUsRUFBRTtRQUNqQixXQUFXLEVBQUUsY0FBYztR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O1lBV3JDLGdCQUFnQjtrQkFBOUMsS0FBSzttQkFBQyxzQkFBc0I7WUFvRkEsV0FBVztrQkFBdkMsS0FBSzttQkFBQyxnQkFBZ0I7WUFzQ08sWUFBWTtrQkFBekMsS0FBSzttQkFBQyxpQkFBaUI7WUFjSyxXQUFXO2tCQUF2QyxLQUFLO21CQUFDLGdCQUFnQjtZQWVLLFdBQVc7a0JBQXRDLEtBQUs7bUJBQUMsZUFBZTtZQXVCb0IsdUJBQXVCO2tCQUFoRSxLQUFLO21CQUFDLDZCQUE2QjtZQXVCRCxnQkFBZ0I7a0JBQWxELEtBQUs7bUJBQUMsc0JBQXNCO1lBdUVKLFFBQVE7a0JBQWhDLEtBQUs7bUJBQUMsWUFBWTtZQW1CSyxPQUFPO2tCQUE5QixLQUFLO21CQUFDLFdBQVc7WUFlSSxLQUFLO2tCQUExQixLQUFLO21CQUFDLFNBQVM7WUFtQmEsV0FBVztrQkFBdkMsS0FBSzttQkFBQyxnQkFBZ0I7WUFlUyxjQUFjO2tCQUE3QyxLQUFLO21CQUFDLG1CQUFtQjtZQTZCRCxRQUFRO2tCQUFoQyxLQUFLO21CQUFDLFlBQVk7WUFzQlUsV0FBVztrQkFBdkMsS0FBSzttQkFBQyxnQkFBZ0I7WUF1Q2Esa0JBQWtCO2tCQUFyRCxLQUFLO21CQUFDLHVCQUF1QjtZQTJISyxpQkFBaUI7a0JBQW5ELEtBQUs7bUJBQUMsc0JBQXNCO1lBZ0JELFVBQVU7a0JBQXJDLEtBQUs7bUJBQUMsZUFBZTtZQTBCRSxPQUFPO2tCQUE5QixLQUFLO21CQUFDLFdBQVc7WUF5QlEsYUFBYTtrQkFBdEMsS0FBSzttQkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE91dHB1dCwgRGlyZWN0aXZlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBjb252ZXJ0VG9Cb29sZWFuLCBjb252ZXJ0VG9JbnQsIGdldFNob3J0QnJvd3Nlckxhbmd1YWdlLCBpc0V4dGVybmFsTGluaywgaXNUeXBlb2YgfSBmcm9tICcuLy4uLy4uL3V0aWxzL3V0aWwnO1xuXG5pbXBvcnQgeyBQb0xhbmd1YWdlU2VydmljZSwgcG9Mb2NhbGVEZWZhdWx0LCBQb0xhbmd1YWdlLCBwb0xhbmd1YWdlRGVmYXVsdCB9IGZyb20gJ0Bwby11aS9uZy1jb21wb25lbnRzJztcblxuaW1wb3J0IHsgUG9QYWdlTG9naW4gfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tcGFnZS1sb2dpbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUG9QYWdlTG9naW5BdXRoZW50aWNhdGlvblR5cGUgfSBmcm9tICcuL2VudW1zL3BvLXBhZ2UtbG9naW4tYXV0aGVudGljYXRpb24tdHlwZS5lbnVtJztcbmltcG9ydCB7IFBvUGFnZUxvZ2luQ3VzdG9tRmllbGQgfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tcGFnZS1sb2dpbi1jdXN0b20tZmllbGQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBvUGFnZUxvZ2luTGl0ZXJhbHMgfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tcGFnZS1sb2dpbi1saXRlcmFscy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUG9QYWdlTG9naW5SZWNvdmVyeSB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1wYWdlLWxvZ2luLXJlY292ZXJ5LmludGVyZmFjZSc7XG5pbXBvcnQgeyBQb1BhZ2VMb2dpblNlcnZpY2UgfSBmcm9tICcuL3BvLXBhZ2UtbG9naW4uc2VydmljZSc7XG5cbmNvbnN0IHBvUGFnZUxvZ2luQ29udGVudE1heExlbmd0aCA9IDQwO1xuXG5leHBvcnQgY29uc3QgcG9QYWdlTG9naW5MaXRlcmFsc0RlZmF1bHQgPSB7XG4gIGVuOiA8UG9QYWdlTG9naW5MaXRlcmFscz57XG4gICAgdGl0bGU6ICdXZWxjb21lJyxcbiAgICBsb2dpbkVycm9yUGF0dGVybjogJ0ludmFsaWQgTG9naW4nLFxuICAgIGxvZ2luSGludDogYFlvdXIgbG9naW4gdXNlciB3YXMgZ2l2ZW4gdG8geW91IGF0IHlvdXIgZmlyc3QgZGF5LlxuICAgIElmIHlvdSBkb24ndCBoYXZlIHRoaXMgaW5mb3JtYXRpb24gY29udGFjdCBzdXBwb3J0YCxcbiAgICBsb2dpblBsYWNlaG9sZGVyOiAnSW5zZXJ0IHlvdXIgZS1tYWlsJyxcbiAgICBwYXNzd29yZEVycm9yUGF0dGVybjogJ0ludmFsaWQgUGFzc3dvcmQnLFxuICAgIHBhc3N3b3JkUGxhY2Vob2xkZXI6ICdJbnNlcnQgeW91ciBwYXNzd29yZCcsXG4gICAgY3VzdG9tRmllbGRFcnJvclBhdHRlcm46ICdJbnZhbGlkIHZhbHVlJyxcbiAgICBjdXN0b21GaWVsZFBsYWNlaG9sZGVyOiAnUGxlYXNlIGVudGVyIGEgdmFsdWUnLFxuICAgIHJlbWVtYmVyVXNlcjogJ0F1dG9tYXRpYyBsb2dpbicsXG4gICAgcmVtZW1iZXJVc2VySGludDogJ1lvdSBjYW4gZGlzYWJsZSB0aGlzIG9wdGlvbiBpbiBzeXN0ZW0gY29uZmlndXJhdGlvbicsXG4gICAgc3VibWl0TGFiZWw6ICdFbnRlcicsXG4gICAgc3VibWl0dGVkTGFiZWw6ICdMb2FkaW5nLi4uJyxcbiAgICBmb3Jnb3RQYXNzd29yZDogJ0ZvcmdvdCB5b3VyIFBhc3N3b3JkPycsXG4gICAgaGlnaGxpZ2h0SW5mbzogJycsXG4gICAgcmVnaXN0ZXJVcmw6ICdOZXcgcmVnaXN0ZXInLFxuICAgIHRpdGxlUG9wb3ZlcjogJ09vcHMhJyxcbiAgICBmb3Jnb3RZb3VyUGFzc3dvcmQ6ICdGb3Jnb3QgeW91ciBwYXNzd29yZD8nLFxuICAgIGlmWW91VHJ5SGFyZGVyOiAnSWYgeW91IHRyeSAnLFxuICAgIGF0dGVtcHRzOiAnezB9IG1vcmUgdGltZShzKSAnLFxuICAgIHlvdXJVc2VyV2lsbEJlQmxvY2tlZDpcbiAgICAgICd3aXRob3V0IHN1Y2Nlc3MgeW91ciB1c2VyIHdpbGwgYmUgYmxvY2tlZCBhbmQgeW91IHdpbGwgYmUgbGVmdCAyNCBob3VycyB3aXRob3V0IGJlaW5nIGFibGUgdG8gYWNjZXNzIDooJyxcbiAgICBjcmVhdGVBTmV3UGFzc3dvcmROb3c6ICdCZXR0ZXIgY3JlYXRlIGEgbmV3IHBhc3N3b3JkIG5vdyEgWW91IHdpbGwgYmUgYWJsZSB0byBsb2cgaW50byB0aGUgc3lzdGVtIHJpZ2h0IGF3YXkuJyxcbiAgICBpRm9yZ290TXlQYXNzd29yZDogJ0kgZm9yZ290IG15IHBhc3N3b3JkJyxcbiAgICB3ZWxjb21lOiAnV2VsY29tZScsXG4gICAgc3VwcG9ydDogJ1N1cHBvcnQnXG4gIH0sXG4gIGVzOiA8UG9QYWdlTG9naW5MaXRlcmFscz57XG4gICAgdGl0bGU6ICdCaWVudmVuaWRvJyxcbiAgICBsb2dpbkVycm9yUGF0dGVybjogJ0xvZ2luIGludsOhbGlkbycsXG4gICAgbG9naW5IaW50OiBgU3UgdXN1YXJpbyBoYSBzaWRvIGVudHJlZ2FkbyBwYXJhIHVzdGVkIGVuIHN1IHByaW1lciBkw61hLlxuICAgIFNpIG5vIHRpZW5lIGVzdGEgaW5mb3JtYWNpw7NuLCBww7NuZ2FzZSBlbiBjb250YWN0byBjb24gZWwgc29wb3J0ZSB0w6ljbmljb2AsXG4gICAgbG9naW5QbGFjZWhvbGRlcjogJ0luc2VydGUgc3UgZS1tYWlsJyxcbiAgICBwYXNzd29yZEVycm9yUGF0dGVybjogJ0NvbnRyYXNlw7FhIGludsOhbGlkYScsXG4gICAgcGFzc3dvcmRQbGFjZWhvbGRlcjogJ0luc2VydGUgc3UgY29udHJhc2XDsWEnLFxuICAgIGN1c3RvbUZpZWxkRXJyb3JQYXR0ZXJuOiAnVmFsb3Igbm8gdsOhbGlkby4nLFxuICAgIGN1c3RvbUZpZWxkUGxhY2Vob2xkZXI6ICdQb3IgZmF2b3IgaW50cm9kdXpjYSB1biB2YWxvcicsXG4gICAgcmVtZW1iZXJVc2VyOiAnSW5pY2lvIGRlIHNlc2nDs24gYXV0b23DoXRpY2FtZW50ZScsXG4gICAgcmVtZW1iZXJVc2VySGludDogJ1B1ZWRlIGRlc2hhYmlsaXRhciBlc3RhIG9wY2nDs24gZW4gZWwgbWVuw7ogZGVsIHNpc3RlbWEuJyxcbiAgICBzdWJtaXRMYWJlbDogJ0VudHJhcicsXG4gICAgc3VibWl0dGVkTGFiZWw6ICdDYXJnYW5kby4uLicsXG4gICAgZm9yZ290UGFzc3dvcmQ6ICdPbHZpZGFzdGUgdHUgY29udHJhc2XDsWE/JyxcbiAgICBoaWdobGlnaHRJbmZvOiAnJyxcbiAgICByZWdpc3RlclVybDogJ051ZXZvIHJlZ2lzdHJvJyxcbiAgICB0aXRsZVBvcG92ZXI6ICdPcGEhJyxcbiAgICBmb3Jnb3RZb3VyUGFzc3dvcmQ6ICdPbHZpZGFzdGUgdHUgY29udHJhc2XDsWE/JyxcbiAgICBpZllvdVRyeUhhcmRlcjogJ1NpIGludGVudGEgbcOhcyAnLFxuICAgIGF0dGVtcHRzOiAnezB9IHZlei92ZWNlcyAnLFxuICAgIHlvdXJVc2VyV2lsbEJlQmxvY2tlZDogJ3NpbiDDqXhpdG8gc3UgdXN1YXJpbyBzZXJhIGJsb3F1ZWFkbyB5IHVzdGVkIHbDoXMgcGVybWFuZWNlciAyNCBob3JhcyBzaW4gcG9kZXIgYWNjZWRlciBhIDooJyxcbiAgICBjcmVhdGVBTmV3UGFzc3dvcmROb3c6XG4gICAgICAnwqFNZWpvciBjcmVhciB1bmEgbnVldmEgY29udHJhc2XDsWEgYWhvcmEhIFVzdGVkIHBvZHLDoSBlbnRyYXIgZW4gZWwgc2lzdGVtYSBpbm1lZGlhdGFtZW50ZSBkZXNwdcOpcy4nLFxuICAgIGlGb3Jnb3RNeVBhc3N3b3JkOiAnT2x2aWRlIG1pIGNvbnRyYXNlw7FhJyxcbiAgICB3ZWxjb21lOiAnQmllbnZlbmlkbycsXG4gICAgc3VwcG9ydDogJ1NvcG9ydGUnXG4gIH0sXG4gIHB0OiA8UG9QYWdlTG9naW5MaXRlcmFscz57XG4gICAgdGl0bGU6ICdCZW0tdmluZG8nLFxuICAgIGxvZ2luRXJyb3JQYXR0ZXJuOiAnTG9naW4gaW52w6FsaWRvJyxcbiAgICBsb2dpbkhpbnQ6IGBTZXUgdXN1w6FyaW8gZm9pIGVudHJlZ3VlIGEgdm9jw6ogbm8gc2V1IHByaW1laXJvIGRpYS5cbiAgICBDYXNvIG7Do28gdGVuaGEgbWFpcyBlc3NhIGluZm9ybWHDp8OjbyBjb250YWN0ZSBvIHN1cG9ydGVgLFxuICAgIGxvZ2luUGxhY2Vob2xkZXI6ICdJbnNpcmEgc2V1IGUtbWFpbCcsXG4gICAgcGFzc3dvcmRFcnJvclBhdHRlcm46ICdTZW5oYSBpbnbDoWxpZGEnLFxuICAgIHBhc3N3b3JkUGxhY2Vob2xkZXI6ICdJbnNpcmEgc3VhIHNlbmhhJyxcbiAgICBjdXN0b21GaWVsZEVycm9yUGF0dGVybjogJ1ZhbG9yIGludsOhbGlkby4nLFxuICAgIGN1c3RvbUZpZWxkUGxhY2Vob2xkZXI6ICdQb3IgZmF2b3IgaW5zaXJhIHVtIHZhbG9yJyxcbiAgICByZW1lbWJlclVzZXI6ICdMb2dhciBhdXRvbWF0aWNhbWVudGUnLFxuICAgIHJlbWVtYmVyVXNlckhpbnQ6ICdWb2PDqiBwb2RlIGRlc2FiaWxpdGFyIGVzc2Egb3DDp8OjbyBubyBtZW51IGRvIHNpc3RlbWEnLFxuICAgIHN1Ym1pdExhYmVsOiAnRW50cmFyJyxcbiAgICBzdWJtaXR0ZWRMYWJlbDogJ0NhcnJlZ2FuZG8uLi4nLFxuICAgIGZvcmdvdFBhc3N3b3JkOiAnRXNxdWVjZXUgc3VhIHNlbmhhPycsXG4gICAgaGlnaGxpZ2h0SW5mbzogJycsXG4gICAgcmVnaXN0ZXJVcmw6ICdOb3ZvIHJlZ2lzdHJvJyxcbiAgICB0aXRsZVBvcG92ZXI6ICdPcGEhJyxcbiAgICBmb3Jnb3RZb3VyUGFzc3dvcmQ6ICdFc3F1ZWNldSBzdWEgc2VuaGE/JyxcbiAgICBpZllvdVRyeUhhcmRlcjogJ1NlIHRlbnRhciBtYWlzICcsXG4gICAgYXR0ZW1wdHM6ICd7MH0gdmV6KGVzKSAnLFxuICAgIHlvdXJVc2VyV2lsbEJlQmxvY2tlZDogJ3NlbSBzdWNlc3NvIHNldSB1c3XDoXJpbyBzZXLDoSBibG9xdWVhZG8gZSB2b2PDqiBmaWNhIDI0IGhvcmFzIHNlbSBwb2RlciBhY2Vzc2FyIDooJyxcbiAgICBjcmVhdGVBTmV3UGFzc3dvcmROb3c6ICdNZWxob3IgY3JpYXIgdW1hIHNlbmhhIG5vdmEgYWdvcmEhIFZvY8OqIHZhaSBwb2RlciBlbnRyYXIgbm8gc2lzdGVtYSBsb2dvIGVtIHNlZ3VpZGEuJyxcbiAgICBpRm9yZ290TXlQYXNzd29yZDogJ0VzcXVlY2kgbWluaGEgc2VuaGEnLFxuICAgIHdlbGNvbWU6ICdCb2FzLXZpbmRhcycsXG4gICAgc3VwcG9ydDogJ1N1cG9ydGUnXG4gIH0sXG4gIHJ1OiA8UG9QYWdlTG9naW5MaXRlcmFscz57XG4gICAgdGl0bGU6ICfQlNC+0LHRgNC+INC/0L7QttCw0LvQvtCy0LDRgtGMIScsXG4gICAgbG9naW5FcnJvclBhdHRlcm46ICfQndC10LLQtdGA0L3Ri9C5INC70L7Qs9C40L0nLFxuICAgIGxvZ2luSGludDogYNCS0LDRiCDQu9C+0LPQuNC9INCx0YvQuyDQv9GA0LXQtNC+0YHRgtCw0LLQu9C10L0g0LLQsNC8INCyINC/0LXRgNCy0YvQuSDQtNC10L3RjC5cbiAgICDQldGB0LvQuCDRgyDQstCw0YEg0L3QtdGCINGN0YLQvtC5INC40L3RhNC+0YDQvNCw0YbQuNC4LCDQvtCx0YDQsNGC0LjRgtC10YHRjCDQsiDRgdC70YPQttCx0YMg0L/QvtC00LTQtdGA0LbQutC4YCxcbiAgICBsb2dpblBsYWNlaG9sZGVyOiAn0JLRgdGC0LDQstGM0YLQtSDRgdCy0L7QuSDQsNC00YDQtdGBINGN0LvQtdC60YLRgNC+0L3QvdC+0Lkg0L/QvtGH0YLRiycsXG4gICAgcGFzc3dvcmRFcnJvclBhdHRlcm46ICfQndC10LLQtdGA0L3Ri9C5INC/0LDRgNC+0LvRjCcsXG4gICAgcGFzc3dvcmRQbGFjZWhvbGRlcjogJ9CS0LLQtdC00LjRgtC1INGB0LLQvtC5INC/0LDRgNC+0LvRjCcsXG4gICAgY3VzdG9tRmllbGRFcnJvclBhdHRlcm46ICfQndC10LLQtdGA0L3QvtC1INC30L3QsNGH0LXQvdC40LUuJyxcbiAgICBjdXN0b21GaWVsZFBsYWNlaG9sZGVyOiAn0J/QvtC20LDQu9GD0LnRgdGC0LAsINCy0LLQtdC00LjRgtC1INC30L3QsNGH0LXQvdC40LUnLFxuICAgIHJlbWVtYmVyVXNlcjogJ9CQ0LLRgtC+0LzQsNGC0LjRh9C10YHQutC40Lkg0LLRhdC+0LQnLFxuICAgIHJlbWVtYmVyVXNlckhpbnQ6ICfQktGLINC80L7QttC10YLQtSDQvtGC0LrQu9GO0YfQuNGC0Ywg0Y3RgtGDINC+0L/RhtC40Y4g0LIg0LrQvtC90YTQuNCz0YPRgNCw0YbQuNC4INGB0LjRgdGC0LXQvNGLJyxcbiAgICBzdWJtaXRMYWJlbDogJ9CS0L7QudGC0LgnLFxuICAgIHN1Ym1pdHRlZExhYmVsOiAnM9Cw0LPRgNGD0LfQutCwLi4uJyxcbiAgICBmb3Jnb3RQYXNzd29yZDogJ9CX0LDQsdGL0LvQuCDQv9Cw0YDQvtC70Yw/JyxcbiAgICBoaWdobGlnaHRJbmZvOiAnJyxcbiAgICByZWdpc3RlclVybDogJ9Cd0L7QstGL0Lkg0YDQtdCz0LjRgdGC0YAnLFxuICAgIHRpdGxlUG9wb3ZlcjogJ9Ce0LkhJyxcbiAgICBmb3Jnb3RZb3VyUGFzc3dvcmQ6ICfQl9Cw0LHRi9C70Lgg0L/QsNGA0L7Qu9GMPycsXG4gICAgaWZZb3VUcnlIYXJkZXI6ICfQldGB0LvQuCDQstGLINCx0LXQt9GD0YHQv9C10YjQvdC+INC/0L7Qv9GL0YLQsNC10YLQtdGB0Ywg0LLQvtC50YLQuCDQtdGJ0LUgJyxcbiAgICBhdHRlbXB0czogJ3swfSDRgNCw0Lco0LApICcsXG4gICAgeW91clVzZXJXaWxsQmVCbG9ja2VkOiAn0JLQsNGIINC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjCDQsdGD0LTQtdGCINC30LDQsdC70L7QutC40YDQvtCy0LDQvSwg0Lgg0JLRiyDQvtGB0YLQsNC90LXRgtC10YHRjCDQvdCwIDI0INGH0LDRgdCwINCx0LXQtyDQstC+0LfQvNC+0LbQvdC+0YHRgtC4INC00L7RgdGC0YPQv9CwIDooJyxcbiAgICBjcmVhdGVBTmV3UGFzc3dvcmROb3c6ICfQm9GD0YfRiNC1INGB0L7Qt9C00LDQudGC0LUg0L3QvtCy0YvQuSDQv9Cw0YDQvtC70Ywg0YHQtdC50YfQsNGBIcKg0JLRiyDRgdC80L7QttC10YLQtSDRgdGA0LDQt9GDINCy0L7QudGC0Lgg0LIg0YHQuNGB0YLQtdC80YMuJyxcbiAgICBpRm9yZ290TXlQYXNzd29yZDogJ9CvINC30LDQsdGL0Lsg0YHQstC+0Lkg0L/QsNGA0L7Qu9GMJyxcbiAgICB3ZWxjb21lOiAn0LTQvtCx0YDQviDQv9C+0LbQsNC70L7QstCw0YLRjCcsXG4gICAgc3VwcG9ydDogJ9Cf0L7QtNC00LXRgNC20LrQsCdcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHBvUGFnZUxvZ2luTGl0ZXJhbEluID0ge1xuICBlbjogJ2luJyxcbiAgZXM6ICdlbicsXG4gIHB0OiAnZW0nLFxuICBydTogJ9CyJ1xufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBPIGNvbXBvbmVudGUgYHBvLXBhZ2UtbG9naW5gIMOpIHV0aWxpemFkbyBjb21vIHRlbXBsYXRlIHBhcmEgdGVsYSBkZSBsb2dpbi5cbiAqIENvbSBlbGUgw6kgcG9zc8OtdmVsIGRlZmluaXJtb3MgdmFsb3JlcyBwYXJhIHVzdcOhcmlvLCBzZW5oYSBlIGRlZmluaXIgYcOnw7VlcyBwYXJhIHJlY3VwZXJhw6fDo28gZGUgc2VuaGEgZSBncmF2YcOnw6NvIGRlIGRhZG9zIGRvIHVzdcOhcmlvLlxuICogVGFtYsOpbSDDqSBwb3Nzw612ZWwgaW5zZXJpciB1bWEgaW1hZ2VtIGVtIGNvbmp1bnRvIGNvbSB1bSB0ZXh0byBkZSBkZXN0YXF1ZS5cbiAqXG4gKlxuICogQSBwcm9wcmllZGFkZSBgcC1hdXRoZW50aWNhdGlvbi11cmxgIGF1dG9tYXRpemEgYSByb3RpbmEgZG8gY29tcG9uZW50ZSBlIHNpbXBsaWZpY2EgbyBwcm9jZXNzbyBwYXJhIGF1dGVudGljYcOnw6NvIGRvIHVzdcOhcmlvLCBiYXN0YW5kb1xuICogZGVmaW5pciB1bWEgdXJsIHBhcmEgcmVxdWlzacOnw6NvIGRhIGF1dGVudGljYcOnw6NvLiBBIGZsZXhpYmlsaWRhZGUgZSBwcmF0aWNpZGFkZSBwb2RlbSBjaGVnYXIgYSB1bSBuw612ZWwgZW0gcXVlIG8gZGVzZW52b2x2aW1lbnRvXG4gKiBkYSBhcGxpY2HDp8OjbyBubyAqY2xpZW50IHNpZGUqIMOpIGRlc3Byb3ZpZGEgZGUgcXVhbHF1ZXIgY8OzZGlnby1mb250ZSByZWxhY2lvbmFkbyDDoCByb3RpbmEgZGUgbG9naW4gZGUgdXN1w6FyaW8uXG4gKiBTZXUgZGV0YWxoYW1lbnRvIHBhcmEgdXNvIHBvZGUgc2VyIHZpc3RvIGxvZ28gYWJhaXhvIGVtICpwcm9wcmllZGFkZXMqLlxuICogQ2FzbyBqdWxndWUgbmVjZXNzw6FyaW8sIHBvZGUtc2UgdGFtYsOpbSBkZWZpbmlyIG1hbnVhbG1lbnRlIGEgcm90aW5hIGRvIGNvbXBvbmVudGUuXG4gKlxuICpcbiAqIFBhcmEgcXVlIGFzIGltYWdlbnMgc2VqYW0gZXhpYmlkYXMgY29ycmV0YW1lbnRlLCDDqSBuZWNlc3PDoXJpbyBpbmNsdWlyIG8gY2FtaW5obyBkZWxhcyBhbyBwcm9qZXRvLiBQYXJhIGlzc28sIGVkaXRlXG4gKiBvICphc3NldHMqIG5vIGFycXVpdm8gKiphbmd1bGFyLmpzb24qKiBkYSBhcGxpY2HDp8OjbyBuYSBzZWd1aW50ZSBvcmRlbTpcbiAqIGBgYFxuICogICBcImFzc2V0c1wiOiBbXG4gKiAgICAgXCJzcmMvYXNzZXRzXCIsXG4gKiAgICAgXCJzcmMvZmF2aWNvbi5pY29cIixcbiAqICAgICB7XG4gKiAgICAgICBcImdsb2JcIjogXCIqKlxcLypcIixcbiAqICAgICAgIFwiaW5wdXRcIjogXCJub2RlX21vZHVsZXMvQHBvLXVpL3N0eWxlL2ltYWdlc1wiLFxuICogICAgICAgXCJvdXRwdXRcIjogXCJhc3NldHMvaW1hZ2VzXCJcbiAqICAgICB9XG4gKiAgIF1cbiAqIGBgYFxuICovXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQb1BhZ2VMb2dpbkJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogTyBgcC1iYWNrZ3JvdW5kYCBwZXJtaXRlIGluc2VyaXIgdW1hIGltYWdlbSBkZSBkZXN0YXF1ZSBhbyBsYWRvIGRpcmVpdG8gZG8gZm9ybXVsw6FyaW8gZGUgbG9naW4sIGNhc28gYSBwcm9wcmllZGFkZVxuICAgKiBuw6NvIHNlamEgcHJlZW5jaGlkYSBvIGZvcm11bMOhcmlvIHNlcsOhIGNlbnRyYWxpemFkbyBubyBlc3Bhw6dvIGRpc3BvbsOtdmVsLlxuICAgKlxuICAgKiBBIGZvbnRlIGRhIGltYWdlbSBwb2RlIHNlciBkZSB1bSBjYW1pbmhvIGxvY2FsIG91IHVtYSB1cmwgZGUgdW0gc2Vydmlkb3IgZXh0ZXJuby5cbiAgICpcbiAgICogQWzDqW0gZGEgaW1hZ2VtLCDDqSBwb3Nzw612ZWwgYWRpY2lvbmFyIHVtIHRleHRvIGluZm9ybWF0aXZvIHBvciBjaW1hIGRhIGltYWdlbSBkYSBpbWFnZW0gZGUgZGVzdGFxdWUsIHBhcmEgaXNzbyBpbmZvcm1lXG4gICAqIHVtIHZhbG9yIHBhcmEgYSBsaXRlcmFsIGBoaWdobGlnaHRJbmZvYC5cbiAgICpcbiAgICogPiBWZWphIG1haXMgc29icmUgYXMgbGl0ZXJhaXMgbmEgcHJvcHJpZWRhZGUgYHAtbGl0ZXJhbHNgLlxuICAgKlxuICAgKiBFeGVtcGxvcyBkZSB2YWxvcmVzIHbDoWxpZG9zOlxuICAgKiAtICoqbG9jYWwqKjogYC4vYXNzZXRzL2ltYWdlcy9sb2dpbi1iYWNrZ3JvdW5kLnBuZ2BcbiAgICogLSAqKnVybCBleHRlcm5hKio6IGBodHRwczovL3BvLXVpLmlvL2Fzc2V0cy9pbWFnZXMvbG9naW4tYmFja2dyb3VuZC5wbmdgXG4gICAqXG4gICAqID4gRXNzYSBwcm9wcmllZGFkZSDDqSBpZ25vcmFkYSBwYXJhIGFwbGljYcOnw7VlcyBtb2JpbGUuXG4gICAqL1xuICBASW5wdXQoJ3AtYmFja2dyb3VuZCcpIGJhY2tncm91bmQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogQ2FtaW5obyBwYXJhIGEgbG9nb21hcmNhIGxvY2FsaXphZGEgbmEgcGFydGUgc3VwZXJpb3IuXG4gICAqXG4gICAqID4gQ2FzbyBzZWphIGluZGVmaW5pZGEgbyBlc3Bhw6dvIHNlIG1hbnTDqW0gcHJlc2VydmFkbyBwb3LDqW0gdmF6aW8uXG4gICAqL1xuICBASW5wdXQoJ3AtbG9nbycpIGxvZ28/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogRXhwcmVzc8OjbyByZWd1bGFyIHBhcmEgdmFsaWRhciBvIGNhbXBvIGRlIGxvZ2luLCBjYXNvIGEgZXhwcmVzc8OjbyBuw6NvIHNlamEgYXRlbnRpZGEsIGEgbGl0ZXJhbCBgbG9naW5FcnJvclBhdHRlcm5gXG4gICAqIHNlcsOhIGV4aWJpZGEuXG4gICAqXG4gICAqIEV4ZW1wbG9zIGRlIHZhbG9yZXMgdsOhbGlkb3M6XG4gICAqIC0gZW1haWw6IGBbZXhwcmVzc2FvLXJlZ3VsYXItZW1haWxdYFxuICAgKiAtIGNwZjogYFtleHByZXNzYW8tcmVndWxhci1jcGZdYFxuICAgKlxuICAgKiA+IFZlamEgYSBwcm9wcmllZGFkZSBgcC1saXRlcmFsc2AgcGFyYSBjdXN0b21pemFyIGEgbGl0ZXJhbCBgbG9naW5FcnJvclBhdHRlcm5gLlxuICAgKi9cbiAgQElucHV0KCdwLWxvZ2luLXBhdHRlcm4nKSBsb2dpblBhdHRlcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogRXhwcmVzc8OjbyByZWd1bGFyIHBhcmEgdmFsaWRhciBvIGNhbXBvIGRlIHBhc3N3b3JkLCBjYXNvIGEgZXhwcmVzc8OjbyBuw6NvIHNlamEgYXRlbnRpZGEsIGEgbGl0ZXJhbCBgcGFzc3dvcmRFcnJvclBhdHRlcm5gXG4gICAqIHNlcsOhIGV4aWJpZGEuXG4gICAqXG4gICAqIEV4ZW1wbG9zIGRlIHZhbG9yZXMgdsOhbGlkb3M6XG4gICAqIC0gQXBlbmFzIG7Dum1lcm9zOiBgXFxkP2BcbiAgICogLSBMZXRyYXMgbcOtbnVzY3VsYXM6IGBcXHo/YFxuICAgKlxuICAgKiA+IFZlamEgYSBwcm9wcmllZGFkZSBgcC1saXRlcmFsc2AgcGFyYSBjdXN0b21pemFyIGEgbGl0ZXJhbCBgcGFzc3dvcmRFcnJvclBhdHRlcm5gLlxuICAgKi9cbiAgQElucHV0KCdwLXBhc3N3b3JkLXBhdHRlcm4nKSBwYXNzd29yZFBhdHRlcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogQ2FtaW5obyBwYXJhIGEgbG9nb21hcmNhIGxvY2FsaXphZGEgbm8gcm9kYXDDqS5cbiAgICovXG4gIEBJbnB1dCgncC1zZWNvbmRhcnktbG9nbycpIHNlY29uZGFyeUxvZ28/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogRXZlbnRvIGRpc3BhcmFkbyBxdWFuZG8gbyB1c3XDoXJpbyBhbHRlcmFyIG8gaW5wdXQgZG8gY2FtcG8gbG9naW4uXG4gICAqXG4gICAqIEVzc2UgZXZlbnRvIHJlY2ViZXLDoSBjb21vIHBhcsOibWV0cm8gdW1hIHZhcmnDoXZlbCBkbyB0aXBvIGBzdHJpbmdgIGNvbSBvIHRleHRvIGluZm9ybWFkbyBubyBjYW1wby5cbiAgICpcbiAgICogPiBFc3RhIHByb3ByaWVkYWRlIHNlcsOhIGlnbm9yYWRhIHNlIGZvciBkZWZpbmlkbyB2YWxvciBwYXJhIGEgcHJvcHJpZWRhZGUgYHAtYXV0aGVudGljYXRpb24tdXJsYC5cbiAgICovXG4gIEBPdXRwdXQoJ3AtbG9naW4tY2hhbmdlJykgbG9naW5DaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIEV2ZW50byBkaXNwYXJhZG8gYW8gc3VibWV0ZXIgbyBmb3JtdWzDoXJpbyBkZSBsb2dpbiAoYXBlcnRhbmRvIGBFbnRlcmAgZGVudHJvIGRvcyBjYW1wb3Mgb3UgcHJlc3Npb25hbmRvIG8gYm90w6NvIGRlIGNvbmZpcm1hw6fDo28pLlxuICAgKlxuICAgKiBFc3NlIGV2ZW50byByZWNlYmVyw6EgY29tbyBwYXLDom1ldHJvIHVtIG9iamV0byBkbyB0aXBvIGBQb1BhZ2VMb2dpbmAgY29tIG9zIGRhZG9zIGluZm9ybWFkb3Mgbm8gZm9ybXVsw6FyaW8uXG4gICAqXG4gICAqID4gRXN0YSBwcm9wcmllZGFkZSBzZXLDoSBpZ25vcmFkYSBzZSBmb3IgZGVmaW5pZG8gdmFsb3IgcGFyYSBhIHByb3ByaWVkYWRlIGBwLXVybC1yZWNvdmVyeWAuXG4gICAqXG4gICAqID4gUGFyYSBtYWlzIGRldGFsaGVzIGNvbnN1bHRlIGEgZG9jdW1lbnRhw6fDo28gc29icmUgYSBpbnRlcmZhY2UgYFBvUGFnZUxvZ2luYCBtYWlzIGFiYWl4by5cbiAgICovXG4gIEBPdXRwdXQoJ3AtbG9naW4tc3VibWl0JykgbG9naW5TdWJtaXQgPSBuZXcgRXZlbnRFbWl0dGVyPFBvUGFnZUxvZ2luPigpO1xuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEV2ZW50byBkaXNwYXJhZG8gcXVhbmRvIG8gdXN1w6FyaW8gYWx0ZXJhciBvIGlucHV0IGRvIGNhbXBvIHBhc3N3b3JkLlxuICAgKlxuICAgKiBFc3NlIGV2ZW50byByZWNlYmVyw6EgY29tbyBwYXLDom1ldHJvIHVtYSB2YXJpw6F2ZWwgZG8gdGlwbyBgc3RyaW5nYCBjb20gbyB0ZXh0byBpbmZvcm1hZG8gbm8gY2FtcG8uXG4gICAqXG4gICAqID4gRXN0YSBwcm9wcmllZGFkZSBzZXLDoSBpZ25vcmFkYSBzZSBmb3IgZGVmaW5pZG8gdmFsb3IgcGFyYSBhIHByb3ByaWVkYWRlIGBwLWF1dGhlbnRpY2F0aW9uLXVybGAuXG4gICAqL1xuICBAT3V0cHV0KCdwLXBhc3N3b3JkLWNoYW5nZScpIHBhc3N3b3JkQ2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEV2ZW50byBkaXNwYXJhZG8gcXVhbmRvIG8gdXN1w6FyaW8gYWx0ZXJhciBvIGlkaW9tYSBkYSBww6FnaW5hLlxuICAgKlxuICAgKiBFc3NlIGV2ZW50byByZWNlYmVyw6EgY29tbyBwYXLDom1ldHJvIHVtIG9iamV0byBkbyB0aXBvIGBQb0xhbmd1YWdlYCBjb20gYSBsaW5ndWFnZW0gc2VsZWNpb25hZGEuXG4gICAqXG4gICAqL1xuICBAT3V0cHV0KCdwLWxhbmd1YWdlLWNoYW5nZScpIGxhbmd1YWdlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8UG9MYW5ndWFnZT4gPSBuZXcgRXZlbnRFbWl0dGVyPFBvTGFuZ3VhZ2U+KCk7XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogRGVmaW5lIGEgcHJvcHJpZWRhZGUgbmF0aXZhIGBhdXRvY29tcGxldGVgIGRvIGNhbXBvIGNvbW8gYG9mZmAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgQElucHV0KCdwLW5vLWF1dG9jb21wbGV0ZS1sb2dpbicpIG5vQXV0b2NvbXBsZXRlTG9naW46IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIERlZmluZSBhIHByb3ByaWVkYWRlIG5hdGl2YSBgYXV0b2NvbXBsZXRlYCBkbyBjYW1wbyBjb21vIGBvZmZgLlxuICAgKlxuICAgKiA+IE5vIGNvbXBvbmVudGUgYHBvLXBhc3N3b3JkYCBzZXLDoSBkZWZpbmlkbyBjb21vIGBuZXctcGFzc3dvcmRgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIEBJbnB1dCgncC1uby1hdXRvY29tcGxldGUtcGFzc3dvcmQnKSBub0F1dG9jb21wbGV0ZVBhc3N3b3JkOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBJbmRpY2Egc2UgbyBzdGF0dXMgZG8gYG1vZGVsYCBkbyBzd2l0Y2ggZGUgbGVtYnJhciBvIHVzdcOhcmlvIHNlcsOhIGVzY29uZGlkbyB2aXN1YWxtZW50ZS5cbiAgICpcbiAgICogPiBQb3IgcGFkcsOjbyBzZXLDoSBhdHJpYnXDrWRvIGBmYWxzZWAuXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIEBJbnB1dCh7IGFsaWFzOiAncC1oaWRlLWxhYmVsLXN0YXR1cycsIHRyYW5zZm9ybTogY29udmVydFRvQm9vbGVhbiB9KSBoaWRlTGFiZWxTdGF0dXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBQZXJtaXRlIGVzY29uZGVyIGEgZnVuw6fDo28gZGUgZXNwaWFyIGEgc2VuaGEgZGlnaXRhZGEuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIEBJbnB1dCgncC1oaWRlLXBhc3N3b3JkLXBlZWsnKSBoaWRlUGFzc3dvcmRQZWVrOiBib29sZWFuO1xuXG4gIGFsbExvZ2luRXJyb3JzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gIGFsbFBhc3N3b3JkRXJyb3JzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gIGN1c3RvbUZpZWxkT2JqZWN0OiBQb1BhZ2VMb2dpbkN1c3RvbUZpZWxkO1xuICBjdXN0b21GaWVsZFR5cGU6IHN0cmluZztcbiAgbG9naW5TdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcGFzc3dvcmQ6IHN0cmluZztcbiAgcmVtZW1iZXJVc2VyOiBib29sZWFuID0gZmFsc2U7XG4gIHNlbGVjdGVkTGFuZ3VhZ2U6IHN0cmluZztcbiAgc2hvd0V4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfYXV0aGVudGljYXRpb25UeXBlOiBQb1BhZ2VMb2dpbkF1dGhlbnRpY2F0aW9uVHlwZSA9IFBvUGFnZUxvZ2luQXV0aGVudGljYXRpb25UeXBlLkJhc2ljO1xuICBwcml2YXRlIF9hdXRoZW50aWNhdGlvblVybDogc3RyaW5nO1xuICBwcml2YXRlIF9ibG9ja2VkVXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgX2NvbnRhY3RFbWFpbDogc3RyaW5nO1xuICBwcml2YXRlIF9jdXN0b21GaWVsZDogc3RyaW5nIHwgUG9QYWdlTG9naW5DdXN0b21GaWVsZDtcbiAgcHJpdmF0ZSBfZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2V4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nPzogbnVtYmVyO1xuICBwcml2YXRlIF9oaWRlUmVtZW1iZXJVc2VyOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2xpdGVyYWxzOiBQb1BhZ2VMb2dpbkxpdGVyYWxzO1xuICBwcml2YXRlIF9sb2FkaW5nPzogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9sb2dpbjogc3RyaW5nO1xuICBwcml2YXRlIF9sb2dpbkVycm9yczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICBwcml2YXRlIF9wYXNzd29yZEVycm9yczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICBwcml2YXRlIF9wcm9kdWN0TmFtZTogc3RyaW5nO1xuICBwcml2YXRlIF9yZWNvdmVyeTogc3RyaW5nIHwgUG9QYWdlTG9naW5SZWNvdmVyeSB8IEZ1bmN0aW9uO1xuICBwcml2YXRlIF9yZWdpc3RlclVybDogc3RyaW5nO1xuICBwcml2YXRlIF9zdXBwb3J0OiBzdHJpbmcgfCBGdW5jdGlvbjtcbiAgcHJpdmF0ZSBfbGFuZ3VhZ2VzTGlzdDogQXJyYXk8UG9MYW5ndWFnZT47XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogQW8gaW5mb3JtYXIgdW0gdmFsb3IgZG8gdGlwbyBgc3RyaW5nYCwgbyBtZXNtbyBzZXLDoSBhcGxpY2FkbyBjb21vIGEgY2hhdmUgZG8gY2FtcG8gY3VzdG9taXphZG8gZSB1dGlsaXphcsOhXG4gICAqIG9zIHZhbG9yZXMgcGFkcsO1ZXMgY29udGlkb3MgbmEgcHJvcHJpZWRhZGUgYGxpdGVyYWxzYCBjb21vIGBjdXN0b21GaWVsZEVycm9yUGF0dGVybmAgZSBgY3VzdG9tRmllbGRQbGFjZWhvbGRlcmAuXG4gICAqXG4gICAqIEV4aXN0ZSBhIHBvc3NpYmlsaWRhZGUgZGUgaW5mb3JtYXIgdW0gb2JqZXRvIHF1ZSBzZWd1ZSBhIGRlZmluacOnw6NvIGRhIGludGVyZmFjZSBgUG9QYWdlTG9naW5DdXN0b21GaWVsZGAsIG9uZGVcbiAgICogYXRyYXbDqXMgZG9zIHBhcsOibWV0cm9zIGVudmlhZG9zIHBvZGUgZ2VyYXIgdW0gYHBvLWlucHV0YCwgYHBvLWNvbWJvYCBlc3BlY2lmaWNhbWVudGUgcGFyYSBzZXJ2acOnb3NcbiAgICogb3UgYHBvLXNlbGVjdGAgcGFyYSB2YWxvcmVzIGZpeG9zLlxuICAgKlxuICAgKiBBYmFpeG8gc2VndWVtIG9zIGV4ZW1wbG9zIGRlIGNhZGEgdGlwbyBkZSBjYW1wby5cbiAgICpcbiAgICogYHBvLWlucHV0YDpcbiAgICpcbiAgICogYGBgXG4gICAqIHtcbiAgICogICBwcm9wZXJ0eTogJ2RvbWFpbicsXG4gICAqICAgdmFsdWU6ICdqdjAxJyxcbiAgICogICBwbGFjZWhvbGRlcjogJ0VudGVyIHlvdXIgZG9tYWluJyxcbiAgICogICBwYXR0ZXJuOiAnW2Etel0nLFxuICAgKiAgIGVycm9yUGF0dGVybjogJ0ludmFsaWQgdmFsdWUnXG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIGBwby1jb21ib2A6XG4gICAqXG4gICAqIGBgYFxuICAgKiB7XG4gICAqICAgcHJvcGVydHk6ICdkb21haW4nLFxuICAgKiAgIHZhbHVlOiAnanYwMScsXG4gICAqICAgcGxhY2Vob2xkZXI6ICdFbnRlciB5b3VyIGRvbWFpbicsXG4gICAqICAgdXJsOiAnaHR0cHM6Ly9wby11aS5pby9zYW1wbGUvYXBpL2NvbWJvT3B0aW9uL2RvbWFpbnMnLFxuICAgKiAgIGZpZWxkVmFsdWU6ICduaWNrbmFtZSdcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogYHBvLXNlbGVjdGA6XG4gICAqXG4gICAqIGBgYFxuICAgKiB7XG4gICAqICAgcHJvcGVydHk6ICdkb21haW4nLFxuICAgKiAgIHZhbHVlOiAnanYwMScsXG4gICAqICAgcGxhY2Vob2xkZXI6ICdFbnRlciB5b3VyIGRvbWFpbicsXG4gICAqICAgb3B0aW9uczogW3tsYWJlbDogJ0RvbWFpbiAxJywgdmFsdWU6ICcxJ30sIHtsYWJlbDogJ0RvbWFpbiAyJywgdmFsdWU6ICcyJ31dXG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIENhc28gbyBjdXN0b21GaWVsZCBwb3NzdWEgb3B0aW9ucywgdXJsIGUgZmllbGRWYWx1ZSBwcmVlbmNoaWRvcywgc2Vyw6EgcHJpb3JpemFkbyBvIHBvLXNlbGVjdFxuICAgKiB1dGlsaXphbmRvIG8gb3B0aW9ucy5cbiAgICpcbiAgICovXG4gIEBJbnB1dCgncC1jdXN0b20tZmllbGQnKSBzZXQgY3VzdG9tRmllbGQodmFsdWU6IHN0cmluZyB8IFBvUGFnZUxvZ2luQ3VzdG9tRmllbGQpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGlmIChpc1R5cGVvZih2YWx1ZSwgJ3N0cmluZycpKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRmllbGRUeXBlID0gJ2lucHV0JztcbiAgICAgICAgdGhpcy5fY3VzdG9tRmllbGQgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5jdXN0b21GaWVsZE9iamVjdCA9IHRoaXMuZ2V0RGVmYXVsdEN1c3RvbUZpZWxkT2JqZWN0KHZhbHVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNUeXBlb2YodmFsdWUsICdvYmplY3QnKSAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWVbJ3Byb3BlcnR5J10pIHtcbiAgICAgICAgdGhpcy5fY3VzdG9tRmllbGQgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5jdXN0b21GaWVsZE9iamVjdCA9IDxQb1BhZ2VMb2dpbkN1c3RvbUZpZWxkPnZhbHVlO1xuXG4gICAgICAgIGlmICghdGhpcy5jdXN0b21GaWVsZE9iamVjdC5vcHRpb25zICYmICF0aGlzLmN1c3RvbUZpZWxkT2JqZWN0LnVybCkge1xuICAgICAgICAgIHRoaXMuY3VzdG9tRmllbGRUeXBlID0gJ2lucHV0JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmN1c3RvbUZpZWxkVHlwZSA9IHRoaXMuY3VzdG9tRmllbGRPYmplY3Qub3B0aW9ucyA/ICdzZWxlY3QnIDogJ2NvbWJvJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9jdXN0b21GaWVsZCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmN1c3RvbUZpZWxkT2JqZWN0ID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0IGN1c3RvbUZpZWxkKCk6IHN0cmluZyB8IFBvUGFnZUxvZ2luQ3VzdG9tRmllbGQge1xuICAgIHJldHVybiB0aGlzLl9jdXN0b21GaWVsZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIFBlcnNvbmFsaXphIG8gZS1tYWlsIHF1ZSDDqSBleGliaWRvIG5hIG1lbnNhZ2VtIGRlIGRpY2EgZGUgbG9naW4gcGFkcsOjbyBwYXJhIGNvbnRhdG8gZGUgc3Vwb3J0ZS5cbiAgICovXG4gIEBJbnB1dCgncC1jb250YWN0LWVtYWlsJykgc2V0IGNvbnRhY3RFbWFpbCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY29udGFjdEVtYWlsID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGNvbnRhY3RFbWFpbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29udGFjdEVtYWlsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogVGV4dG8gY3VzdG9taXphZG8gcXVlIGZpY2EgZW50cmUgYSBsb2dvIGUgYSBtZW5zYWdlbSBkZSBib2FzLXZpbmRhcy5cbiAgICovXG4gIEBJbnB1dCgncC1wcm9kdWN0LW5hbWUnKSBzZXQgcHJvZHVjdE5hbWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3Byb2R1Y3ROYW1lID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHByb2R1Y3ROYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9wcm9kdWN0TmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFkaWNpb25hIHVtYSBgdGFnYCBhYmFpeG8gZG8gdMOtdHVsbyBxdWUgZXNwZWNpZmljYSBvIGFtYmllbnRlIHF1ZSBvIHVzdcOhcmlvIGVzdMOhIGZhemVuZG8gbyBsb2dpbi5cbiAgICpcbiAgICogPiBFc3NhIHByb3ByaWVkYWRlIGxpbWl0YSBvIHRleHRvIGVtIDQwIGNhcmFjdGVyZXMuXG4gICAqL1xuICBASW5wdXQoJ3AtZW52aXJvbm1lbnQnKSBzZXQgZW52aXJvbm1lbnQoZW52aXJvbm1lbnQ6IHN0cmluZykge1xuICAgIGlmIChlbnZpcm9ubWVudCAmJiBlbnZpcm9ubWVudC5sZW5ndGggPiBwb1BhZ2VMb2dpbkNvbnRlbnRNYXhMZW5ndGgpIHtcbiAgICAgIHRoaXMuX2Vudmlyb25tZW50ID0gZW52aXJvbm1lbnQuc3Vic3RyaW5nKDAsIHBvUGFnZUxvZ2luQ29udGVudE1heExlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2Vudmlyb25tZW50ID0gZW52aXJvbm1lbnQ7XG4gICAgfVxuICB9XG4gIGdldCBlbnZpcm9ubWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZW52aXJvbm1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBFeGliZSB1bSBhdmlzbyBkZSBibG9xdWVpbyBkZSBhY29yZG8gY29tIGEgcXVhbnRpZGFkZSByZXN0YW50ZSBkZSB0ZW50YXRpdmFzLlxuICAgKiBPIGF2aXNvIHNlcsOhIGV4aWJpZG8gc29tZW50ZSBzZSBhIHF1YW50aWRhZGUgZm9yIG1haW9yIHF1ZSB6ZXJvLlxuICAgKlxuICAgKiA+IENhc28gdGVuaGEgYWxndW0gdmFsb3IgYXRyaWJ1w61kbyBwYXJhIG8gYXRyaWJ1dG8gYHAtYXV0aGVudGljYXRpb24tdXJsYCBlIG8gcmV0b3JubyBkYSByZXF1aXNpw6fDo28gZXN0aXZlciBhdHJpYnVpbmRvIHZhbG9yXG4gICAqIHBhcmEgbyBgcC1leGNlZWRlZC1hdHRlbXB0cy13YXJuaW5nYCwgbyB2YWxvciBjb25zaWRlcmFkbyBzZXLDoSBvIGRvIHJldG9ybm8gZGEgcmVxdWlzacOnw6NvLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMGBcbiAgICovXG4gIEBJbnB1dCgncC1leGNlZWRlZC1hdHRlbXB0cy13YXJuaW5nJykgc2V0IGV4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9leGNlZWRlZEF0dGVtcHRzV2FybmluZyA9IGNvbnZlcnRUb0ludCh2YWx1ZSk7XG4gICAgdGhpcy5zaG93RXhjZWVkZWRBdHRlbXB0c1dhcm5pbmcgPSB0aGlzLmV4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nID4gMDtcbiAgfVxuXG4gIGdldCBleGNlZWRlZEF0dGVtcHRzV2FybmluZygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9leGNlZWRlZEF0dGVtcHRzV2FybmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEVzY29uZGUgYSBmdW7Dp8OjbyBcIkxlbWJyYXIgdXN1w6FyaW9cIiBkbyBmb3JtdWzDoXJpbyBkZSBsb2dpbi5cbiAgICpcbiAgICogUXVhbmRvIGVzc2EgcHJvcHJpZWRhZGUgw6kgc2V0YWRhIGNvbSBgdHJ1ZWAgYSBwcm9wcmllZGFkZSBgcmVtZW1iZXJVc2VyYCBlbnZpYWRhIG5vIGV2ZW50byBgcC1sb2dpbi1zdWJtaXRgIHNlcsOhIHNlbXByZVxuICAgKiBgZmFsc2VgLlxuICAgKlxuICAgKiA+IFZlamEgYSBwcm9wcmllZGFkZSBgcC1saXRlcmFsc2AgcGFyYSBjdXN0b21pemFyIGEgbGl0ZXJhbCBgcmVtZW1iZXJVc2VyYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgQElucHV0KCdwLWhpZGUtcmVtZW1iZXItdXNlcicpIHNldCBoaWRlUmVtZW1iZXJVc2VyKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faGlkZVJlbWVtYmVyVXNlciA9IDxhbnk+dmFsdWUgPT09ICcnID8gdHJ1ZSA6IGNvbnZlcnRUb0Jvb2xlYW4odmFsdWUpO1xuXG4gICAgaWYgKHRoaXMuX2hpZGVSZW1lbWJlclVzZXIpIHtcbiAgICAgIHRoaXMucmVtZW1iZXJVc2VyID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIGdldCBoaWRlUmVtZW1iZXJVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9oaWRlUmVtZW1iZXJVc2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogT2JqZXRvIGNvbSBhcyBsaXRlcmFpcyB1c2FkYXMgbm8gYHBvLXBhZ2UtbG9naW5gLlxuICAgKlxuICAgKiBFeGlzdGVtIGR1YXMgbWFuZWlyYXMgZGUgY3VzdG9taXphciBvIGNvbXBvbmVudGUsIHBhc3NhbmRvIHVtIG9iamV0byBjb20gdG9kYXMgYXMgbGl0ZXJhaXMgZGlzcG9uw612ZWlzOlxuICAgKlxuICAgKiBgYGBcbiAgICogIGNvbnN0IGN1c3RvbUxpdGVyYWxzOiBQb1BhZ2VMb2dpbkxpdGVyYWxzID0ge1xuICAgKiAgICBhdHRlbXB0czogJ3swfSB2ZXooZXMpICcsXG4gICAqICAgIGNyZWF0ZUFOZXdQYXNzd29yZE5vdzogJ01lbGhvciBjcmlhciB1bWEgc2VuaGEgbm92YSBhZ29yYSEgVm9jw6ogdmFpIHBvZGVyIGVudHJhciBubyBzaXN0ZW1hIGxvZ28gZW0gc2VndWlkYS4nLFxuICAgKiAgICBmb3Jnb3RQYXNzd29yZDogJ0VzcXVlY2V1IHN1YSBzZW5oYT8nLFxuICAgKiAgICBmb3Jnb3RZb3VyUGFzc3dvcmQ6ICdFc3F1ZWNldSBzdWEgc2VuaGE/JyxcbiAgICogICAgaGlnaGxpZ2h0SW5mbzogJycsXG4gICAqICAgIGlGb3Jnb3RNeVBhc3N3b3JkOiAnRXNxdWVjaSBtaW5oYSBzZW5oYScsXG4gICAqICAgIGlmWW91VHJ5SGFyZGVyOiAnU2UgdGVudGFyIG1haXMgJyxcbiAgICogICAgd2VsY29tZTogJ0JvYXMtdmluZGFzJyxcbiAgICogICAgbG9naW5FcnJvclBhdHRlcm46ICdMb2dpbiBvYnJpZ2F0w7NyaW8nLFxuICAgKiAgICBsb2dpbkhpbnQ6ICdDYXNvIG7Do28gcG9zc3VhIHVzdcOhcmlvIGVudHJlIGVtIGNvbnRhdG8gY29tIG8gc3Vwb3J0ZScsXG4gICAqICAgIGxvZ2luTGFiZWw6ICdJbnNpcmEgc2V1IHVzdcOhcmlvJyxcbiAgICogICAgbG9naW5QbGFjZWhvbGRlcjogJ0luc2lyYSBzZXUgdXN1w6FyaW8gZGUgYWNlc3NvJyxcbiAgICogICAgcGFzc3dvcmRFcnJvclBhdHRlcm46ICdTZW5oYSBvYnJpZ2F0w7NyaWEnLFxuICAgKiAgICBwYXNzd29yZExhYmVsOiAnSW5zaXJhIHN1YSBzZW5oYScsXG4gICAqICAgIHBhc3N3b3JkUGxhY2Vob2xkZXI6ICdJbnNpcmEgc3VhIHNlbmhhIGRlIGFjZXNzbycsXG4gICAqICAgIGN1c3RvbUZpZWxkRXJyb3JQYXR0ZXJuOiAnQ2FtcG8gY3VzdG9taXphZG8gaW52w6FsaWRvJyxcbiAgICogICAgY3VzdG9tRmllbGRQbGFjZWhvbGRlcjogJ1BvciBmYXZvciBpbnNpcmEgdW0gdmFsb3InLFxuICAgKiAgICByZWdpc3RlclVybDogJ05vdm8gcmVnaXN0cm8nLFxuICAgKiAgICByZW1lbWJlclVzZXI6ICdMZW1icmFyIHVzdcOhcmlvJyxcbiAgICogICAgcmVtZW1iZXJVc2VySGludDogJ0VzdGEgb3DDp8OjbyBwb2RlIHNlciBkZXNhYmlsaXRhZGEgbmFzIGNvbmZpZ3VyYcOnw7VlcyBkbyBzaXN0ZW1hJyxcbiAgICogICAgc3VibWl0TGFiZWw6ICdBY2Vzc2FyIHNpc3RlbWEnLFxuICAgKiAgICBzdWJtaXR0ZWRMYWJlbDogJ0NhcnJlZ2FuZG8uLi4nLFxuICAgKiAgICB0aXRsZVBvcG92ZXI6ICdPcGEhJyxcbiAgICogICAgeW91clVzZXJXaWxsQmVCbG9ja2VkOiAnc2VtIHN1Y2Vzc28gc2V1IHVzdcOhcmlvIHNlcsOhIGJsb3F1ZWFkbyBlIHZvY8OqIGZpY2EgMjQgaG9yYXMgc2VtIHBvZGVyIGFjZXNzYXIgOignXG4gICAqICB9O1xuICAgKiBgYGBcbiAgICpcbiAgICogT3UgcGFzc2FuZG8gYXBlbmFzIGFzIGxpdGVyYWlzIHF1ZSBkZXNlamEgY3VzdG9taXphcjpcbiAgICpcbiAgICogYGBgXG4gICAqICBjb25zdCBjdXN0b21MaXRlcmFsczogUG9QYWdlTG9naW5MaXRlcmFscyA9IHtcbiAgICogICAgbG9naW5QbGFjZWhvbGRlcjogJ0luc2lyYSBzZXUgdXN1w6FyaW8gZGUgYWNlc3NvJyxcbiAgICogICAgcGFzc3dvcmRQbGFjZWhvbGRlcjogJ0luc2lyYSBzdWEgc2VuaGEgZGUgYWNlc3NvJyxcbiAgICogICAgc3VibWl0TGFiZWw6ICdBY2Vzc2FyIHNpc3RlbWEnXG4gICAqICB9O1xuICAgKiBgYGBcbiAgICpcbiAgICogRSBwYXJhIGNhcnJlZ2FyIGFzIGxpdGVyYWlzIGN1c3RvbWl6YWRhcywgYmFzdGEgYXBlbmFzIHBhc3NhciBvIG9iamV0byBwYXJhIG8gY29tcG9uZW50ZS5cbiAgICpcbiAgICogYGBgXG4gICAqIDxwby1wYWdlLWxvZ2luXG4gICAqICAgW3AtbGl0ZXJhbHNdPVwiY3VzdG9tTGl0ZXJhbHNcIj5cbiAgICogPC9wby1wYWdlLWxvZ2luPlxuICAgKiBgYGBcbiAgICpcbiAgICogID4gTyBvYmpldG8gcGFkcsOjbyBkZSBsaXRlcmFpcyBzZXLDoSB0cmFkdXppZG8gZGUgYWNvcmRvIGNvbSBvIGlkaW9tYSBkbyBicm93c2VyIChwdCwgZW4sIGVzKS5cbiAgICogID4gw4kgdGFtYsOpbSBwb3Nzw612ZWwgYWx0ZXJuYXIgbyBvYmpldG8gcGFkcsOjbyBkZSBsaXRlcmFpcyBhdHJhdsOpcyBkbyBzZWxldG9yIGRlIGlkaW9tYXMgbG9jYWxpemFkbyBuYSBwYXJ0ZSBpbmZlcmlvciBkbyB0ZW1wbGF0ZSxcbiAgICogbmVzc2UgY2FzbywgaMOhIHRhbWLDqW0gYSBvcMOnw6NvIGRvIGlkaW9tYSBydXNzby5cbiAgICovXG4gIEBJbnB1dCgncC1saXRlcmFscycpIHNldCBsaXRlcmFscyh2YWx1ZTogUG9QYWdlTG9naW5MaXRlcmFscykge1xuICAgIHRoaXMuX2xpdGVyYWxzID0gdmFsdWU7XG4gIH1cblxuICBnZXQgbGl0ZXJhbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xpdGVyYWxzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogSGFiaWxpdGEgdW0gZXN0YWRvIGRlIGNhcnJlZ2FtZW50byBhbyBib3TDo28gZGUgKmxvZ2luKi5cbiAgICpcbiAgICogPiDDiSBuZWNlc3PDoXJpbyBhdHJpYnVpciBgdHJ1ZWAgw6AgZXN0YSBwcm9wcmllZGFkZSBuYSBmdW7Dp8OjbyBkZWZpbmlkYSBlbSBgcC1sb2dpbi1zdWJtaXRgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICBASW5wdXQoJ3AtbG9hZGluZycpIHNldCBsb2FkaW5nKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fbG9hZGluZyA9IGNvbnZlcnRUb0Jvb2xlYW4odmFsdWUpO1xuICB9XG5cbiAgZ2V0IGxvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2xvYWRpbmc7XG4gIH1cblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBWYWxvciBkbyBtb2RlbG8gZG8gY2FtcG8gZGUgbG9naW4uXG4gICAqL1xuICBASW5wdXQoJ3AtbG9naW4nKSBzZXQgbG9naW4odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2luID0gdmFsdWU7XG5cbiAgICBpZiAoIXRoaXMuYXV0aGVudGljYXRpb25VcmwpIHtcbiAgICAgIHRoaXMubG9naW5DaGFuZ2UuZW1pdCh0aGlzLl9sb2dpbik7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGxvZ2luKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xvZ2luO1xuICB9XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogQXRyaWJ1dG8gcXVlIHJlY2ViZSB1bWEgbGlzdGEgZGUgZXJyb3MgZSBleGliZSBhYmFpeG8gZG8gY2FtcG8gZGUgbG9naW4uXG4gICAqL1xuICBASW5wdXQoJ3AtbG9naW4tZXJyb3JzJykgc2V0IGxvZ2luRXJyb3JzKHZhbHVlOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgdGhpcy5fbG9naW5FcnJvcnMgPSB2YWx1ZSB8fCBbXTtcbiAgICB0aGlzLnNldExvZ2luRXJyb3JzKHRoaXMuX2xvZ2luRXJyb3JzKTtcbiAgfVxuICBnZXQgbG9naW5FcnJvcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xvZ2luRXJyb3JzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogQXRyaWJ1dG8gcXVlIHJlY2ViZSB1bWEgbGlzdGEgZGUgZXJyb3MgZSBleGliZSBhYmFpeG8gZG8gY2FtcG8gZGUgcGFzc3dvcmQuXG4gICAqL1xuICBASW5wdXQoJ3AtcGFzc3dvcmQtZXJyb3JzJykgc2V0IHBhc3N3b3JkRXJyb3JzKHZhbHVlOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgdGhpcy5fcGFzc3dvcmRFcnJvcnMgPSB2YWx1ZSB8fCBbXTtcbiAgICB0aGlzLnNldFBhc3N3b3JkRXJyb3JzKHRoaXMuX3Bhc3N3b3JkRXJyb3JzKTtcbiAgfVxuICBnZXQgcGFzc3dvcmRFcnJvcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Bhc3N3b3JkRXJyb3JzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogRXhpYmUgdW0gbGluayBhYmFpeG8gZG8gZm9ybXVsw6FyaW8gZGUgbG9naW4gcGFyYSBxdWUgb3MgdXN1w6FyaW9zIGRhIGFwbGljYcOnw6NvIGZhw6dhbSBhIHJlY3VwZXJhw6fDo28gZG9zIGRhZG9zIGRlIGF1dGVudGljYcOnw6NvLlxuICAgKlxuICAgKiBBIHByb3ByaWVkYWRlIGFjZWl0YSBvcyBzZWd1aW50ZXMgdGlwb3M6XG4gICAqXG4gICAqIC0gKipTdHJpbmcqKjogaW5mb3JtZSB1bWEgdXJsIGV4dGVybmEgb3UgdW1hIHJvdGEgdsOhbGlkYTtcbiAgICogLSAqKkZ1bmN0aW9uKio6IHBvZGUtc2UgY3VzdG9taXphciBhIGHDp8Ojby4gUGFyYSBlc3RhIHBvc3NpbGlkYWRlIGJhc3RhIGF0cmlidWlyOlxuICAgKiBgYGBcbiAgICogPHBvLXBhZ2UtbG9naW4+XG4gICAqICAgW3JlY292ZXJ5XT1cInRoaXMubXlSZWNvdmVyeS5iaW5kKHRoaXMpXCI+XG4gICAqIDwvcG8tcGFnZS1sb2dpbj5cbiAgICogYGBgXG4gICAqXG4gICAqIC0gKipQb1BhZ2VMb2dpblJlY292ZXJ5Kio6IGNyaWEtc2UgdsOtbmN1bG8gYXV0b23DoXRpY28gY29tIG8gdGVtcGxhdGUgKipwby1tb2RhbC1wYXNzd29yZC1yZWNvdmVyeSoqLlxuICAgKiAgIE8gb2JqZXRvIGRldmUgY29udGVyIGEgKip1cmwqKiBwYXJhIHJlcXVpc2nDp8OjbyBkb3MgcmVjdXJzb3MgZSBwb2RlLXNlIGRlZmluaXIgbyAqKnRpcG8qKiBkZSBtb2RhbCBwYXJhIHJlY3VwZXJhw6fDo28gZGUgc2VuaGEsXG4gICAqICAgKiplbWFpbCoqIHBhcmEgY29udGF0byBlICoqbcOhc2NhcmEqKiBkbyBjYW1wbyBkZSB0ZWxlZm9uZS5cbiAgICovXG4gIEBJbnB1dCgncC1yZWNvdmVyeScpIHNldCByZWNvdmVyeSh2YWx1ZTogc3RyaW5nIHwgRnVuY3Rpb24gfCBQb1BhZ2VMb2dpblJlY292ZXJ5KSB7XG4gICAgdGhpcy5fcmVjb3ZlcnkgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCByZWNvdmVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVjb3Zlcnk7XG4gIH1cblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBDYXNvIGEgYXBsaWNhw6fDo28gdGVuaGEgdW0gbGluayBwYXJhIG5vdm9zIGNhZGFzdHJvcywgaW5mb3JtZSB1bWEgdXJsIGV4dGVybmEgb3UgdW1hIHJvdGEgdsOhbGlkYSwgZGVzc2FcbiAgICogZm9ybWEgc2Vyw6EgZXhpYmlkbyB1bSBsaW5rIGFiYWl4byBkbyBmb3JtdWzDoXJpbyBkZSBsb2dpbiBwYXJhIG9zIHVzdcOhcmlvcyBkYSBhcGxpY2HDp8Ojby5cbiAgICpcbiAgICogRXhlbXBsb3MgZGUgdmFsb3JlcyB2w6FsaWRvczpcbiAgICogLSAqKmxvY2FsKio6IGAvaG9tZWBcbiAgICogLSAqKnVybCBleHRlcm5hKio6IGBodHRwczovL3BvLXVpLmlvYFxuICAgKlxuICAgKiA+IFZlamEgYSBwcm9wcmllZGFkZSBgcC1saXRlcmFsc2AgcGFyYSBjdXN0b21pemFyIGEgbGl0ZXJhbCBgcmVnaXN0ZXJVcmxgLlxuICAgKi9cbiAgQElucHV0KCdwLXJlZ2lzdGVyLXVybCcpIHNldCByZWdpc3RlclVybCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcmVnaXN0ZXJVcmwgPSBpc1R5cGVvZih2YWx1ZSwgJ3N0cmluZycpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXQgcmVnaXN0ZXJVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcmVnaXN0ZXJVcmw7XG4gIH1cblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBBdHJpYnV0byBxdWUgcmVjZWJlIG8gdGlwbyBkZSBlc3F1ZW1hIGRhIGF1dGVudGljYcOnw6NvLCBzZW5kbyBzdXBvcnRhZG9zIGFwZW5hcyBvcyB2YWxvcmVzIGBCYXNpY2AgZSBgQmVhcmVyYC5cbiAgICpcbiAgICogPiBDYXNvIG8gdGlwbyBkZWZpbmlkbyBzZWphIGBCYXNpY2AsIG8gY29tcG9uZW50ZSBmYXLDoSB1bWEgcmVxdWlzacOnw6NvIGBQT1NUYCBjb250ZW5kbzpcbiAgICpcbiAgICogYGBgXG4gICAqIGhlYWRlcnMge1xuICAgKiAgQXV0aG9yaXphdGlvbjogQmFzaWMgYmFzZTY0KGxvZ2luOnBhc3N3b3JkKVxuICAgKiB9XG4gICAqXG4gICAqIGJvZHkge1xuICAgKiAgcmVtZW1iZXJVc2VyOiByZW1lbWJlclVzZXJcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogPiBDYXNvIG8gdGlwbyBkZWZpbmlkbyBzZWphIGBCZWFyZXJgLCBvIGNvbXBvbmVudGUgZmFyw6EgdW1hIHJlcXVpc2nDp8OjbyBgUE9TVGAgY29udGVuZG86XG4gICAqXG4gICAqIGBgYFxuICAgKiBib2R5IHtcbiAgICogIGxvZ2luOiBsb2dpbixcbiAgICogIHBhc3N3b3JkOiBiYXNlNjQocGFzc3dvcmQpLFxuICAgKiAgcmVtZW1iZXJVc2VyOiByZW1lbWJlclVzZXJcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQGRlZmF1bHQgYFBvUGFnZUxvZ2luQXV0aGVudGljYXRpb25UeXBlLkJhc2ljYFxuICAgKi9cbiAgQElucHV0KCdwLWF1dGhlbnRpY2F0aW9uLXR5cGUnKSBzZXQgYXV0aGVudGljYXRpb25UeXBlKHZhbHVlOiBQb1BhZ2VMb2dpbkF1dGhlbnRpY2F0aW9uVHlwZSkge1xuICAgIHRoaXMuX2F1dGhlbnRpY2F0aW9uVHlwZSA9ICg8YW55Pk9iamVjdCkudmFsdWVzKFBvUGFnZUxvZ2luQXV0aGVudGljYXRpb25UeXBlKS5pbmNsdWRlcyh2YWx1ZSlcbiAgICAgID8gdmFsdWVcbiAgICAgIDogUG9QYWdlTG9naW5BdXRoZW50aWNhdGlvblR5cGUuQmFzaWM7XG4gIH1cblxuICBnZXQgYXV0aGVudGljYXRpb25UeXBlKCk6IFBvUGFnZUxvZ2luQXV0aGVudGljYXRpb25UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25UeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogRW5kcG9pbnQgdXNhZG8gcGVsbyB0ZW1wbGF0ZSBwYXJhIHJlcXVpc2nDp8OjbyBkbyByZWN1cnNvLiBRdWFuZG8gcHJlZW5jaGlkbywgbyBtw6l0b2RvIGBwLWxvZ2luLXN1Ym1pdGAgc2Vyw6EgaWdub3JhZG8gZSBvXG4gICAqIGNvbXBvbmVudGUgYWRxdWlyaXLDoSBhdXRvbWF0aXphw6fDo28gcGFyYSBvIHByb2Nlc3NvIGRlIGF1dGVudGljYcOnw6NvLlxuICAgKlxuICAgKiAjIyMgUHJvY2Vzc29zXG4gICAqIEFvIGRpZ2l0YXIgdW0gdmFsb3IgdsOhbGlkbyBubyBjYW1wbyBkZSBsb2dpbi9wYXNzd29yZCBlIHByZXNzaW9uYXIgKipFbnRlcioqLCBvIGNvbXBvbmVudGUgZmFyw6EgdW1hIHJlcXVpc2nDp8OjbyBgUE9TVGBcbiAgICogbmEgdXJsIGVzcGVjaWZpY2FkYSBuZXN0YSBwcm9wcmllZGFkZSBwYXNzYW5kbyBvIG9iamV0byBjb250ZW5kbyBvIHZhbG9yIGRlZmluaWRvIHBlbG8gdXN1w6FyaW86XG4gICAqXG4gICAqIGBgYFxuICAgKiBoZWFkZXJzIHtcbiAgICogIEF1dGhvcml6YXRpb246IEJhc2ljIGJhc2U2NChsb2dpbjpwYXNzd29yZClcbiAgICogfVxuICAgKlxuICAgKiBib2R5IHtcbiAgICogIHJlbWVtYmVyVXNlcjogcmVtZW1iZXJVc2VyXG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIEVtIGNhc28gZGUgKipzdWNlc3NvKiosIG8gb2JqZXRvIGRlIHJldG9ybm8gw6kgYXJtYXplbmFkbyBubyBgc2Vzc2lvblN0b3JhZ2VgIGUgbyB1c3XDoXJpbyDDqSByZWRpcmVjaW9uYWRvIHBhcmEgYSBww6FnaW5hIGluaWNpYWwgZGFcbiAgICogYXBsaWNhw6fDo28gYC9gLlxuICAgKlxuICAgKiBgYGBcbiAgICogMjAwOlxuICAgKiAge1xuICAgKiAgICB1c2VyOiB1c2VyXG4gICAqICB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBFbSBjYXNvIGRlICoqZXJybyoqIG5hIGF1dGVudGljYcOnw6NvLCBlc3BlcmEtc2UgbyBzZWd1aW50ZSByZXRvcm5vOlxuICAgKlxuICAgKiBgYGBcbiAgICogNDAwLzQwMVxuICAgKiAge1xuICAgKiAgICBjb2RlOiA0MDAvNDAxLFxuICAgKiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgKiAgICBkZXRhaWxlZE1lc3NhZ2U6IGRldGFpbGVkTWVzc2FnZSxcbiAgICogICAgaGVscFVybD86IGhlbHBVcmxcbiAgICogIH1cbiAgICogYGBgXG4gICAqXG4gICAqID4gUG9kZS1zZSBhdHJpYnVpciB1bWEgcXVhbnRpZGFkZSBtw6F4aW1hIGRlIHRlbnRhdGl2YXMgcmVzdGFudGVzIChtYXhBdHRlbXB0c1JlbWFpbmluZykgcGFyYSBvIGF0cmlidXRvIGBwLWV4Y2VlZGVkLWF0dGVtcHRzLXdhcm5pbmdgLFxuICAgKiBhc3NpbSBjb21vIG9zIGF2aXNvcyByZWxhY2lvbmFkb3MgYW9zIGNhbXBvcyBsb2dpbiBlIHBhc3N3b3JkIChsb2dpbldhcm5pbmdzLCBwYXNzd29yZFdhcm5pbmdzKSBwYXJhIG9zIGF0cmlidXRvcyBgcC1sb2dpbi1lcnJvcnNgIGVcbiAgICogYHAtcGFzc3dvcmQtZXJyb3JzYCBjb25mb3JtZSByZXRvcm5vIGFiYWl4bzpcbiAgICpcbiAgICogYGBgXG4gICAqIDQwMFxuICAgKiAge1xuICAgKiAgICBjb2RlOiA0MDAvNDAxLFxuICAgKiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgKiAgICBkZXRhaWxlZE1lc3NhZ2U6IGRldGFpbGVkTWVzc2FnZSxcbiAgICogICAgaGVscFVybD86IGhlbHBVcmwsXG4gICAqICAgIG1heEF0dGVtcHRzUmVtYWluaW5nPzogbWF4QXR0ZW1wdHNSZW1haW5pbmcsXG4gICAqICAgIGxvZ2luV2FybmluZ3M/OiBbbG9naW5XYXJuaW5nc10sXG4gICAqICAgIHBhc3N3b3JkV2FybmluZ3M/OiBbcGFzc3dvcmRXYXJuaW5nc11cbiAgICogIH1cbiAgICogYGBgXG4gICAqXG4gICAqID4gQ2FzbyBvIHZhbG9yIGF0cmlidcOtZG8gcGFyYSBgcC1leGNlZWRlZC1hdHRlbXB0cy13YXJuaW5nYCBzZWphIGlndWFsIGEgMCh6ZXJvKSwgcG9kZXLDoSBzZXIgcGFzc2FkbyB1bSB2YWxvciBwYXJhIG9cbiAgICogYXRyaWJ1dG8gYHAtYmxvY2tlZC11cmxgIGUgbyB1c3XDoXJpbyBzZXLDoSByZWRpcmVjaW9uYWRvIHBhcmEgdW1hIHRlbGEgZGUgYmxvcXVlaW8uXG4gICAqXG4gICAqICpQcm9jZXNzbyBmaW5hbGl6YWRvLipcbiAgICpcbiAgICogX19fX19fX19fX19fX19fXG4gICAqXG4gICAqICMjIyMgUHJhdGljaWRhZGVcbiAgICogQXMgaW5mb3JtYcOnw7VlcyBkbyBzZXJ2acOnbyBkZSBhdXRlbnRpY2HDp8OjbyB0YW1iw6ltIHBvZGVtIHNlciB0cmFuc21pdGlkYXMgZGlyZXRhbWVudGUgcGVsYXMgY29uZmlndXJhw6fDo29zIGRlIHJvdGEgZSwgZGVzdGEgbWFuZWlyYSxcbiAgICogZGlzcGVuc2Etc2UgcXVhbHF1ZXIgbWVuw6fDo28gZS9vdSBpbXBvcnRhw6fDo28gZG8gY29tcG9uZW50ZSBgcG8tcGFnZS1sb2dpbmAgbm8gcmVzdGFudGUgZGEgYXBsaWNhw6fDo28uIE8gZXhlbXBsbyBhYmFpeG8gZXhlbXBsaWZpY2FcbiAgICogYSBmb3JtYSBkaW7Dom1pY2EgY29tIGEgcXVhbCBvIHRlbXBsYXRlIGRlIHRlbGEgZGUgbG9naW4gcG9kZSBzZXIgZ2VyYWRvIGFvIG5hdmVnYXIgcGFyYSByb3RhIGAvbG9naW5gLCBlIHRhbWLDqW0gY29tbyBlbGUgc2UgY29tdW5pY2FcbiAgICogY29tIG8gc2VydmnDp28gcGFyYSBlZmV0dWHDp8OjbyBkbyBwcm9jZXNzbyBkZSBhdXRlbnRpY2HDp8OjbyBkbyB1c3XDoXJpbyBlIHNvbGljaXRhw6fDo28gZGUgbm92YSBzZW5oYS5cbiAgICogQmFzdGEgZGVmaW5pciBuYXMgY29uZmlndXJhw6fDtWVzIGRlIHJvdGE6XG4gICAqXG4gICAqXG4gICAqIGBgYFxuICAgKiAgIGltcG9ydCB7IFBvUGFnZUxvZ2luQ29tcG9uZW50LCBQb1BhZ2VMb2dpbkF0aGVudGljYXRpb25UeXBlIH0gZnJvbSAnQHBvLXVpL25nLXRlbXBsYXRlcyc7XG4gICAqXG4gICAqICAgLi4uXG4gICAqICAgY29uc3Qgcm91dGVzOiBSb3V0ZXMgPSBbXG4gICAqICAgICB7XG4gICAqICAgICAgIHBhdGg6ICdsb2dpbicsIGNvbXBvbmVudDogUG9QYWdlTG9naW5Db21wb25lbnQsIGRhdGE6IHtcbiAgICogICAgICAgICBzZXJ2aWNlQXBpOiAnaHR0cHM6Ly9wby11aS5pby9zYW1wbGUvYXBpL3VzZXJzL2F1dGhlbnRpY2F0aW9uJyxcbiAgICogICAgICAgICBlbnZpcm9ubWVudDogJ2RldmVsb3BtZW50JyxcbiAgICogICAgICAgICByZWNvdmVyeToge1xuICAgKiAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9wby11aS5pby9zYW1wbGUvYXBpL3VzZXJzJyxcbiAgICogICAgICAgICAgIHR5cGU6IFBvTW9kYWxQYXNzd29yZFJlY292ZXJ5VHlwZS5BbGwsXG4gICAqICAgICAgICAgICBjb250YWN0TWFpbDogJ2Rldi5wb0Bwby11aS5jb20nLFxuICAgKiAgICAgICAgICAgcGhvbmVNYXNrOiAnOS05OTktOTk5LTk5OTknXG4gICAqICAgICAgICAgfSxcbiAgICogICAgICAgICByZWdpc3RlclVybDogJy9uZXctcGFzc3dvcmQnLFxuICAgKiAgICAgICAgIGF1dGhlbnRpY2F0aW9uVHlwZTogUG9QYWdlTG9naW5BdGhlbnRpY2F0aW9uVHlwZS5CYXNpY1xuICAgKiAgICAgICB9XG4gICAqICAgICB9XG4gICAqICAgICAuLi5cbiAgICogICBdO1xuICAgKlxuICAgKiAgIEBOZ01vZHVsZSh7XG4gICAqICAgICBpbXBvcnRzOiBbUm91dGVyTW9kdWxlLmZvclJvb3Qocm91dGVzKV0sXG4gICAqICAgICBleHBvcnRzOiBbUm91dGVyTW9kdWxlXVxuICAgKiAgIH0pXG4gICAqICAgZXhwb3J0IGNsYXNzIEFwcFJvdXRpbmdNb2R1bGUgeyB9XG4gICAqIGBgYFxuICAgKlxuICAgKlxuICAgKiBPIG1ldGFkYWRvIGBzZXJ2aWNlQXBpYCBkZXZlIHNlciBhICoqdXJsKiogcGFyYSByZXF1aXNpw6fDo28gZG9zIHJlY3Vyc29zIGRlIGF1dGVudGljYcOnw6NvLCBvIGBlbnZpcm9ubWVudGAgYWxpbWVudGEgYSBwcm9wcmllZGFkZVxuICAgKiBgcC1lbnZpcm9ubWVudGAsIGByZWNvdmVyeWAgw6kgYSBpbnRlcmZhY2UgYFBvUGFnZUxvZ2luUmVjb3ZlcnlgIHJlc3BvbnPDoXZlbCBwZWxhcyBlc3BlY2lmaWNhw6fDtWVzIGNvbnRpZGFzIG5hIG1vZGFsIGRlIHJlY3VwZXJhw6fDo28gZGVcbiAgICogc2VuaGEsIGByZWdpc3RlclVybGAgYWxpbWVudGEgYSBwcm9wcmllZGFkZSBgcC1yZWdpc3Rlci11cmxgIGUgYGF1dGhlbnRpY2F0aW9uVHlwZWAgcXVlIGRlZmluZSBhIHByb3ByaWVkYWRlIGBwLWF1dGhlbnRpY2F0aW9uLXR5cGVgLlxuICAgKlxuICAgKiA+IMOJIGVzc2VuY2lhbCBxdWUgc2lnYSBhIG5vbWVuY2xhdHVyYSBkb3MgYXRyaWJ1dG9zIGV4ZW1wbGlmaWNhZG9zIGFjaW1hIHBhcmEgc3VhIGVmZXRpdmEgZnVuY2lvbmFsaWRhZGUuXG4gICAqXG4gICAqL1xuICBASW5wdXQoJ3AtYXV0aGVudGljYXRpb24tdXJsJykgc2V0IGF1dGhlbnRpY2F0aW9uVXJsKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9hdXRoZW50aWNhdGlvblVybCA9IGlzVHlwZW9mKHZhbHVlLCAnc3RyaW5nJykgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldCBhdXRoZW50aWNhdGlvblVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvblVybDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIENhc28gbyB2YWxvciBhdHJpYnXDrWRvIHBhcmEgYHAtZXhjZWVkZWQtYXR0ZW1wdHMtd2FybmluZ2Agc2VqYSBpZ3VhbCBhIDAoemVybykgZSBhIGFwbGljYcOnw6NvIHRlbmhhIHVtIGxpbmsgZGUgYmxvcXVlaW8gZGUgdXN1w6FyaW8sXG4gICAqIGluZm9ybWUgdW1hIHVybCBleHRlcm5hIG91IHVtYSByb3RhIHbDoWxpZGEsIGRlc3NhIGZvcm1hIGVtIGNhc28gZGUgYmxvcXVlaW8gbyB1c3XDoXJpbyBzZXLDoSByZWRpcmVjaW9uYWRvLlxuICAgKi9cbiAgQElucHV0KCdwLWJsb2NrZWQtdXJsJykgc2V0IGJsb2NrZWRVcmwodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2Jsb2NrZWRVcmwgPSBpc1R5cGVvZih2YWx1ZSwgJ3N0cmluZycpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXQgYmxvY2tlZFVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9ibG9ja2VkVXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogRXhpYmUgdW0gYm90w6NvIHBhcmEgc3Vwb3J0ZS5cbiAgICpcbiAgICogQSBwcm9wcmllZGFkZSBhY2VpdGEgb3Mgc2VndWludGVzIHRpcG9zOlxuICAgKlxuICAgKiAtICoqU3RyaW5nKio6IFVSTCBleHRlcm5hIG91IHVtYSByb3RhIHbDoWxpZGE7XG4gICAqIC0gKipGdW5jdGlvbioqOiBGdW7Dp8OjbyBhIHNlciBkaXNwYXJhZGEgYW8gY2xpY2FyIG5vIGJvdMOjbyBkZSBzdXBvcnRlO1xuICAgKiBgYGBcbiAgICogPHBvLXBhZ2UtbG9naW4+XG4gICAqICAgW3Atc3VwcG9ydF09XCJ0aGlzLm15U3VwcG9ydC5iaW5kKHRoaXMpXCI+XG4gICAqIDwvcG8tcGFnZS1sb2dpbj5cbiAgICogYGBgXG4gICAqXG4gICAqL1xuICBASW5wdXQoJ3Atc3VwcG9ydCcpIHNldCBzdXBwb3J0KHZhbHVlOiBzdHJpbmcgfCBGdW5jdGlvbikge1xuICAgIHRoaXMuX3N1cHBvcnQgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBzdXBwb3J0KCkge1xuICAgIHJldHVybiB0aGlzLl9zdXBwb3J0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogQ29sZcOnw6NvIGRlIGlkaW9tYXMgcXVlIG8gY29tcG9uZW50ZSBpcsOhIHRyYXRhciBlIGRpc3BvbmliaWxpemFyw6EgcGFyYSBvIHVzdcOhcmlvIGVzY29saGVyLlxuICAgKlxuICAgKiBDYXNvIGVzc2EgcHJvcHJpZWRhZGUgbsOjbyBzZWphIHV0aWxpemFkYSBvIGNvbXBvbmVudGUgbW9zdHJhcsOhIG5vIGNvbWJvIG9zIGlkaW9tYXMgcXVlIGVsZSBzdXBvcnRhIHBvciBwYWRyw6NvLlxuICAgKlxuICAgKiBDYXNvIGEgY29sZcOnw6NvIHRlbmhhIHVtIGlkaW9tYSwgYSBww6FnaW5hIGVzdGFyw6EgbmVzc2UgaWRpb21hIGUgbsOjbyBtb3N0cmFyw6EgbyBjb21iby5cbiAgICpcbiAgICogQ2FzbyBzZWphIHBhc3NhZG8gdW0gYXJyYXkgdmF6aW8sIGEgcMOhZ2luYSB0ZXLDoSBvIGlkaW9tYSBjb25maWd1cmFkbyBubyBgaTE4bmAgZSBuw6NvIG1vc3RyYXLDoSBvIGNvbWJvIGRlIHNlbGXDp8Ojby5cbiAgICpcbiAgICogPiBTZSBmb3IgcGFzc2FkbyB1bSBpZGlvbWEgbsOjbyBzdXBvcnRhZG8sIHNlcsOhIHByZWNpc28gcGFzc2FyIGFzIGxpdGVyYWlzIHBlbGEgcHJvcHJpZWRhZGUgYHAtbGl0ZXJhbHNgLlxuICAgKlxuICAgKlxuICAgKi9cbiAgQElucHV0KCdwLWxhbmd1YWdlcycpIHNldCBsYW5ndWFnZXNMaXN0KGxhbmd1YWdlc0xpc3Q6IEFycmF5PFBvTGFuZ3VhZ2U+KSB7XG4gICAgaWYgKGxhbmd1YWdlc0xpc3QpIHtcbiAgICAgIGlmIChsYW5ndWFnZXNMaXN0Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLl9sYW5ndWFnZXNMaXN0ID0gbGFuZ3VhZ2VzTGlzdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2xhbmd1YWdlc0xpc3QgPSBwb0xhbmd1YWdlRGVmYXVsdC5maWx0ZXIobGFuZ3VhZ2UgPT4gbGFuZ3VhZ2UubGFuZ3VhZ2UgPT09IHRoaXMubGFuZ3VhZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCBsYW5ndWFnZXNMaXN0KCk6IEFycmF5PFBvTGFuZ3VhZ2U+IHtcbiAgICBpZiAodGhpcy5fbGFuZ3VhZ2VzTGlzdCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2xhbmd1YWdlc0xpc3Q7XG4gICAgfVxuICAgIHJldHVybiBwb0xhbmd1YWdlRGVmYXVsdDtcbiAgfVxuXG4gIGdldCBzaG93TGFuZ3VhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMubGFuZ3VhZ2VzTGlzdC5sZW5ndGggPiAxO1xuICB9XG5cbiAgZ2V0IGxhbmd1YWdlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRMYW5ndWFnZSB8fCBnZXRTaG9ydEJyb3dzZXJMYW5ndWFnZSgpO1xuICB9XG5cbiAgZ2V0IHBhZ2VMb2dpbkxpdGVyYWxzKCk6IFBvUGFnZUxvZ2luTGl0ZXJhbHMge1xuICAgIGNvbnN0IGxvZ2luSGludFdpdGhDb250YWN0RW1haWwgPSB0aGlzLmNvbnRhY3RFbWFpbFxuICAgICAgPyB0aGlzLmNvbmNhdGVuYXRlTG9naW5IaW50V2l0aENvbnRhY3RFbWFpbCh0aGlzLmNvbnRhY3RFbWFpbClcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnBvUGFnZUxvZ2luTGl0ZXJhbHNEZWZhdWx0W3BvTG9jYWxlRGVmYXVsdF0sXG4gICAgICAuLi5wb1BhZ2VMb2dpbkxpdGVyYWxzRGVmYXVsdFt0aGlzLmxhbmd1YWdlXSxcbiAgICAgIC4uLmxvZ2luSGludFdpdGhDb250YWN0RW1haWwsXG4gICAgICAuLi50aGlzLmxpdGVyYWxzXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbG9naW5TZXJ2aWNlOiBQb1BhZ2VMb2dpblNlcnZpY2UsXG4gICAgcHVibGljIHJvdXRlcjogUm91dGVyLFxuICAgIHB1YmxpYyBwb0xhbmd1YWdlU2VydmljZTogUG9MYW5ndWFnZVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5zZWxlY3RlZExhbmd1YWdlID0gdGhpcy5wb0xhbmd1YWdlU2VydmljZS5nZXRTaG9ydExhbmd1YWdlKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5sb2dpblN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5sb2dpblN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNsb3NlUG9wb3ZlcigpIHtcbiAgICB0aGlzLnNob3dFeGNlZWRlZEF0dGVtcHRzV2FybmluZyA9IGZhbHNlO1xuICB9XG5cbiAgb25Mb2dpblN1Ym1pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBsb2dpbkZvcm06IFBvUGFnZUxvZ2luID0ge1xuICAgICAgbG9naW46IHRoaXMubG9naW4sXG4gICAgICBwYXNzd29yZDogdGhpcy5wYXNzd29yZCxcbiAgICAgIHJlbWVtYmVyVXNlcjogdGhpcy5yZW1lbWJlclVzZXJcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuY3VzdG9tRmllbGQpIHtcbiAgICAgIGxvZ2luRm9ybVt0aGlzLmN1c3RvbUZpZWxkT2JqZWN0LnByb3BlcnR5XSA9IHRoaXMuY3VzdG9tRmllbGRPYmplY3QudmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYXV0aGVudGljYXRpb25VcmwpIHtcbiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICB0aGlzLmxvZ2luU3Vic2NyaXB0aW9uID0gdGhpcy5sb2dpblNlcnZpY2VcbiAgICAgICAgLm9uTG9naW4odGhpcy5hdXRoZW50aWNhdGlvblVybCwgdGhpcy5hdXRoZW50aWNhdGlvblR5cGUsIGxvZ2luRm9ybSlcbiAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICBkYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWVzVG9Qcm9wZXJ0aWVzKCk7XG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdQT19VU0VSX0xPR0lOJywgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuICAgICAgICAgICAgdGhpcy5vcGVuSW50ZXJuYWxMaW5rKCcvJyk7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvci5lcnJvci5jb2RlID09PSAnNDAwJyB8fCBlcnJvci5lcnJvci5jb2RlID09PSAnNDAxJykge1xuICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlc1RvUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RCbG9ja2VkVXJsKHRoaXMuZXhjZWVkZWRBdHRlbXB0c1dhcm5pbmcsIHRoaXMuYmxvY2tlZFVybCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9naW5TdWJtaXQuZW1pdChsb2dpbkZvcm0pO1xuICAgICAgdGhpcy5zaG93RXhjZWVkZWRBdHRlbXB0c1dhcm5pbmcgPSB0aGlzLmV4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nID4gMDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldERlZmF1bHRDdXN0b21GaWVsZE9iamVjdChwcm9wZXJ0eSk6IFBvUGFnZUxvZ2luQ3VzdG9tRmllbGQge1xuICAgIHJldHVybiB7IHByb3BlcnR5IH07XG4gIH1cblxuICBwcml2YXRlIG9wZW5FeHRlcm5hbExpbmsodXJsOiBzdHJpbmcpIHtcbiAgICB3aW5kb3cub3Blbih1cmwsICdfYmxhbmsnKTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlbkludGVybmFsTGluayh1cmw6IHN0cmluZykge1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt1cmxdKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVkaXJlY3RCbG9ja2VkVXJsKGF0dGVtcHRzOiBudW1iZXIsIGJsb2NrZWRVcmw6IHN0cmluZykge1xuICAgIGlmIChhdHRlbXB0cyA9PT0gMCAmJiBibG9ja2VkVXJsKSB7XG4gICAgICB0aGlzLnNob3dFeGNlZWRlZEF0dGVtcHRzV2FybmluZyA9IGZhbHNlO1xuICAgICAgaXNFeHRlcm5hbExpbmsoYmxvY2tlZFVybCkgPyB0aGlzLm9wZW5FeHRlcm5hbExpbmsoYmxvY2tlZFVybCkgOiB0aGlzLm9wZW5JbnRlcm5hbExpbmsoYmxvY2tlZFVybCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRWYWx1ZXNUb1Byb3BlcnRpZXMocmVzdWx0Pykge1xuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIHRoaXMuZXhjZWVkZWRBdHRlbXB0c1dhcm5pbmcgPSByZXN1bHQuZXJyb3IubWF4QXR0ZW1wdHNSZW1haW5pbmc7XG4gICAgICB0aGlzLmxvZ2luRXJyb3JzID0gcmVzdWx0LmVycm9yLmxvZ2luV2FybmluZ3M7XG4gICAgICB0aGlzLnBhc3N3b3JkRXJyb3JzID0gcmVzdWx0LmVycm9yLnBhc3N3b3JkV2FybmluZ3M7XG4gICAgICB0aGlzLmJsb2NrZWRVcmwgPSByZXN1bHQuZXJyb3IuYmxvY2tlZFVybDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5leGNlZWRlZEF0dGVtcHRzV2FybmluZyA9IDA7XG4gICAgICB0aGlzLmxvZ2luRXJyb3JzID0gW107XG4gICAgICB0aGlzLnBhc3N3b3JkRXJyb3JzID0gW107XG4gICAgICB0aGlzLmJsb2NrZWRVcmwgPSAnJztcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgY29uY2F0ZW5hdGVMb2dpbkhpbnRXaXRoQ29udGFjdEVtYWlsKGNvbnRhY3RFbWFpbDogc3RyaW5nKTtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc2V0TG9naW5FcnJvcnModmFsdWU6IEFycmF5PHN0cmluZz4pOiB2b2lkO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzZXRQYXNzd29yZEVycm9ycyh2YWx1ZTogQXJyYXk8c3RyaW5nPik6IHZvaWQ7XG59XG4iXX0=