@posiwise/smart-crm 0.0.20 → 0.0.21

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 (279) hide show
  1. package/.eslintrc.json +22 -0
  2. package/ng-package.json +15 -0
  3. package/package.json +10 -23
  4. package/project.json +72 -0
  5. package/{index.d.ts → src/index.ts} +3 -0
  6. package/src/lib/private/components/smart-crm-accounts/smart-crm-account-details/smart-crm-account-details.component.html +200 -0
  7. package/src/lib/private/components/smart-crm-accounts/smart-crm-account-details/smart-crm-account-details.component.spec.ts +185 -0
  8. package/src/lib/private/components/smart-crm-accounts/smart-crm-account-details/smart-crm-account-details.component.ts +238 -0
  9. package/src/lib/private/components/smart-crm-accounts/smart-crm-account-files/smart-crm-account-files.component.html +200 -0
  10. package/src/lib/private/components/smart-crm-accounts/smart-crm-account-files/smart-crm-account-files.component.spec.ts +109 -0
  11. package/src/lib/private/components/smart-crm-accounts/smart-crm-account-files/smart-crm-account-files.component.ts +249 -0
  12. package/src/lib/private/components/smart-crm-accounts/smart-crm-account-info/smart-crm-account-info.component.html +785 -0
  13. package/src/lib/private/components/smart-crm-accounts/smart-crm-account-info/smart-crm-account-info.component.scss +123 -0
  14. package/src/lib/private/components/smart-crm-accounts/smart-crm-account-info/smart-crm-account-info.component.spec.ts +388 -0
  15. package/src/lib/private/components/smart-crm-accounts/smart-crm-account-info/smart-crm-account-info.component.ts +792 -0
  16. package/src/lib/private/components/smart-crm-accounts/smart-crm-accounts.component.html +292 -0
  17. package/src/lib/private/components/smart-crm-accounts/smart-crm-accounts.component.scss +63 -0
  18. package/src/lib/private/components/smart-crm-accounts/smart-crm-accounts.component.spec.ts +145 -0
  19. package/src/lib/private/components/smart-crm-accounts/smart-crm-accounts.component.ts +417 -0
  20. package/src/lib/private/components/smart-crm-competition/smart-crm-competition/smart-crm-competition.component.html +1 -0
  21. package/src/lib/private/components/smart-crm-competition/smart-crm-competition/smart-crm-competition.component.spec.ts +17 -0
  22. package/src/lib/private/components/smart-crm-competition/smart-crm-competition/smart-crm-competition.component.ts +7 -0
  23. package/src/lib/private/components/smart-crm-configuration/smart-crm-actions/smart-crm-actions-details/smart-crm-actions-details.component.html +75 -0
  24. package/src/lib/private/components/smart-crm-configuration/smart-crm-actions/smart-crm-actions-details/smart-crm-actions-details.component.scss +3 -0
  25. package/src/lib/private/components/smart-crm-configuration/smart-crm-actions/smart-crm-actions-details/smart-crm-actions-details.component.spec.ts +123 -0
  26. package/src/lib/private/components/smart-crm-configuration/smart-crm-actions/smart-crm-actions-details/smart-crm-actions-details.component.ts +117 -0
  27. package/src/lib/private/components/smart-crm-configuration/smart-crm-actions/smart-crm-actions.component.html +125 -0
  28. package/src/lib/private/components/smart-crm-configuration/smart-crm-actions/smart-crm-actions.component.scss +5 -0
  29. package/src/lib/private/components/smart-crm-configuration/smart-crm-actions/smart-crm-actions.component.spec.ts +136 -0
  30. package/src/lib/private/components/smart-crm-configuration/smart-crm-actions/smart-crm-actions.component.ts +143 -0
  31. package/src/lib/private/components/smart-crm-configuration/smart-crm-configuration.component.html +60 -0
  32. package/src/lib/private/components/smart-crm-configuration/smart-crm-configuration.component.scss +1 -0
  33. package/src/lib/private/components/smart-crm-configuration/smart-crm-configuration.component.spec.ts +55 -0
  34. package/src/lib/private/components/smart-crm-configuration/smart-crm-configuration.component.ts +29 -0
  35. package/src/lib/private/components/smart-crm-configuration/smart-crm-opportunity-categories/smart-crm-opportunity-categories-details/smart-crm-opportunity-categories-details.component.html +95 -0
  36. package/src/lib/private/components/smart-crm-configuration/smart-crm-opportunity-categories/smart-crm-opportunity-categories-details/smart-crm-opportunity-categories-details.component.spec.ts +105 -0
  37. package/src/lib/private/components/smart-crm-configuration/smart-crm-opportunity-categories/smart-crm-opportunity-categories-details/smart-crm-opportunity-categories-details.component.ts +95 -0
  38. package/src/lib/private/components/smart-crm-configuration/smart-crm-opportunity-categories/smart-crm-opportunity-categories.component.html +125 -0
  39. package/src/lib/private/components/smart-crm-configuration/smart-crm-opportunity-categories/smart-crm-opportunity-categories.component.scss +3 -0
  40. package/src/lib/private/components/smart-crm-configuration/smart-crm-opportunity-categories/smart-crm-opportunity-categories.component.spec.ts +132 -0
  41. package/src/lib/private/components/smart-crm-configuration/smart-crm-opportunity-categories/smart-crm-opportunity-categories.component.ts +145 -0
  42. package/src/lib/private/components/smart-crm-configuration/smart-crm-source/smart-crm-source-details/smart-crm-source-details.component.html +61 -0
  43. package/src/lib/private/components/smart-crm-configuration/smart-crm-source/smart-crm-source-details/smart-crm-source-details.component.spec.ts +81 -0
  44. package/src/lib/private/components/smart-crm-configuration/smart-crm-source/smart-crm-source-details/smart-crm-source-details.component.ts +88 -0
  45. package/src/lib/private/components/smart-crm-configuration/smart-crm-source/smart-crm-source.component.html +96 -0
  46. package/src/lib/private/components/smart-crm-configuration/smart-crm-source/smart-crm-source.component.scss +3 -0
  47. package/src/lib/private/components/smart-crm-configuration/smart-crm-source/smart-crm-source.component.spec.ts +109 -0
  48. package/src/lib/private/components/smart-crm-configuration/smart-crm-source/smart-crm-source.component.ts +129 -0
  49. package/src/lib/private/components/smart-crm-configuration/smart-crm-stages/smart-crm-stage-details/smart-crm-stage-details.component.html +108 -0
  50. package/src/lib/private/components/smart-crm-configuration/smart-crm-stages/smart-crm-stage-details/smart-crm-stage-details.component.scss +3 -0
  51. package/src/lib/private/components/smart-crm-configuration/smart-crm-stages/smart-crm-stage-details/smart-crm-stage-details.component.spec.ts +124 -0
  52. package/src/lib/private/components/smart-crm-configuration/smart-crm-stages/smart-crm-stage-details/smart-crm-stage-details.component.ts +111 -0
  53. package/src/lib/private/components/smart-crm-configuration/smart-crm-stages/smart-crm-stages.component.html +134 -0
  54. package/src/lib/private/components/smart-crm-configuration/smart-crm-stages/smart-crm-stages.component.scss +3 -0
  55. package/src/lib/private/components/smart-crm-configuration/smart-crm-stages/smart-crm-stages.component.spec.ts +103 -0
  56. package/src/lib/private/components/smart-crm-configuration/smart-crm-stages/smart-crm-stages.component.ts +166 -0
  57. package/src/lib/private/components/smart-crm-configuration/smart-crm-widgets/smart-crm-widgets-details/smart-crm-widgets-details.component.html +90 -0
  58. package/src/lib/private/components/smart-crm-configuration/smart-crm-widgets/smart-crm-widgets-details/smart-crm-widgets-details.component.scss +6 -0
  59. package/src/lib/private/components/smart-crm-configuration/smart-crm-widgets/smart-crm-widgets-details/smart-crm-widgets-details.component.spec.ts +105 -0
  60. package/src/lib/private/components/smart-crm-configuration/smart-crm-widgets/smart-crm-widgets-details/smart-crm-widgets-details.component.ts +118 -0
  61. package/src/lib/private/components/smart-crm-configuration/smart-crm-widgets/smart-crm-widgets.component.html +115 -0
  62. package/src/lib/private/components/smart-crm-configuration/smart-crm-widgets/smart-crm-widgets.component.spec.ts +93 -0
  63. package/src/lib/private/components/smart-crm-configuration/smart-crm-widgets/smart-crm-widgets.component.ts +150 -0
  64. package/src/lib/private/components/smart-crm-contacts/smart-crm-contact-details/smart-crm-contact-details.component.html +205 -0
  65. package/src/lib/private/components/smart-crm-contacts/smart-crm-contact-details/smart-crm-contact-details.component.spec.ts +149 -0
  66. package/src/lib/private/components/smart-crm-contacts/smart-crm-contact-details/smart-crm-contact-details.component.ts +184 -0
  67. package/src/lib/private/components/smart-crm-contacts/smart-crm-contact-info/smart-crm-contact-info.component.html +530 -0
  68. package/src/lib/private/components/smart-crm-contacts/smart-crm-contact-info/smart-crm-contact-info.component.scss +112 -0
  69. package/src/lib/private/components/smart-crm-contacts/smart-crm-contact-info/smart-crm-contact-info.component.spec.ts +284 -0
  70. package/src/lib/private/components/smart-crm-contacts/smart-crm-contact-info/smart-crm-contact-info.component.ts +553 -0
  71. package/src/lib/private/components/smart-crm-contacts/smart-crm-contacts.component.html +281 -0
  72. package/src/lib/private/components/smart-crm-contacts/smart-crm-contacts.component.scss +19 -0
  73. package/src/lib/private/components/smart-crm-contacts/smart-crm-contacts.component.spec.ts +138 -0
  74. package/src/lib/private/components/smart-crm-contacts/smart-crm-contacts.component.ts +344 -0
  75. package/src/lib/private/components/smart-crm-customer/smart-crm-customer-success/smart-crm-customer-success.component.html +1 -0
  76. package/src/lib/private/components/smart-crm-customer/smart-crm-customer-success/smart-crm-customer-success.component.spec.ts +18 -0
  77. package/src/lib/private/components/smart-crm-customer/smart-crm-customer-success/smart-crm-customer-success.component.ts +7 -0
  78. package/src/lib/private/components/smart-crm-insight/smart-crm-insight.component.html +27 -0
  79. package/src/lib/private/components/smart-crm-insight/smart-crm-insight.component.spec.ts +19 -0
  80. package/src/lib/private/components/smart-crm-insight/smart-crm-insight.component.ts +7 -0
  81. package/src/lib/private/components/smart-crm-insight/smart-crm-overview/smart-crm-overview.component.html +46 -0
  82. package/src/lib/private/components/smart-crm-insight/smart-crm-overview/smart-crm-overview.component.spec.ts +50 -0
  83. package/src/lib/private/components/smart-crm-insight/smart-crm-overview/smart-crm-overview.component.ts +60 -0
  84. package/src/lib/private/components/smart-crm-leads/smart-crm-leads-details/smart-crm-leads-details.component.html +142 -0
  85. package/src/lib/private/components/smart-crm-leads/smart-crm-leads-details/smart-crm-leads-details.component.spec.ts +125 -0
  86. package/src/lib/private/components/smart-crm-leads/smart-crm-leads-details/smart-crm-leads-details.component.ts +192 -0
  87. package/src/lib/private/components/smart-crm-leads/smart-crm-leads.component.html +176 -0
  88. package/src/lib/private/components/smart-crm-leads/smart-crm-leads.component.spec.ts +98 -0
  89. package/src/lib/private/components/smart-crm-leads/smart-crm-leads.component.ts +160 -0
  90. package/src/lib/private/components/smart-crm-marketing/smart-crm-marketing-list/smart-crm-marketing-contacts/smart-crm-marketing-contacts.component.html +90 -0
  91. package/src/lib/private/components/smart-crm-marketing/smart-crm-marketing-list/smart-crm-marketing-contacts/smart-crm-marketing-contacts.component.spec.ts +68 -0
  92. package/src/lib/private/components/smart-crm-marketing/smart-crm-marketing-list/smart-crm-marketing-contacts/smart-crm-marketing-contacts.component.ts +98 -0
  93. package/src/lib/private/components/smart-crm-marketing/smart-crm-marketing-list/smart-crm-marketing-details/smart-crm-marketing-details.component.html +322 -0
  94. package/src/lib/private/components/smart-crm-marketing/smart-crm-marketing-list/smart-crm-marketing-details/smart-crm-marketing-details.component.spec.ts +156 -0
  95. package/src/lib/private/components/smart-crm-marketing/smart-crm-marketing-list/smart-crm-marketing-details/smart-crm-marketing-details.component.ts +296 -0
  96. package/src/lib/private/components/smart-crm-marketing/smart-crm-marketing-list/smart-crm-marketing-list.component.html +215 -0
  97. package/src/lib/private/components/smart-crm-marketing/smart-crm-marketing-list/smart-crm-marketing-list.component.scss +3 -0
  98. package/src/lib/private/components/smart-crm-marketing/smart-crm-marketing-list/smart-crm-marketing-list.component.spec.ts +117 -0
  99. package/src/lib/private/components/smart-crm-marketing/smart-crm-marketing-list/smart-crm-marketing-list.component.ts +187 -0
  100. package/src/lib/private/components/smart-crm-marketing/smart-crm-marketing-list/smart-crm-marketing-view-details/smart-crm-marketing-view-details.component.html +33 -0
  101. package/src/lib/private/components/smart-crm-marketing/smart-crm-marketing-list/smart-crm-marketing-view-details/smart-crm-marketing-view-details.component.scss +82 -0
  102. package/src/lib/private/components/smart-crm-marketing/smart-crm-marketing-list/smart-crm-marketing-view-details/smart-crm-marketing-view-details.component.spec.ts +63 -0
  103. package/src/lib/private/components/smart-crm-marketing/smart-crm-marketing-list/smart-crm-marketing-view-details/smart-crm-marketing-view-details.component.ts +62 -0
  104. package/src/lib/private/components/smart-crm-marketing/smart-crm-marketing.component.html +27 -0
  105. package/src/lib/private/components/smart-crm-marketing/smart-crm-marketing.component.scss +3 -0
  106. package/src/lib/private/components/smart-crm-marketing/smart-crm-marketing.component.spec.ts +28 -0
  107. package/src/lib/private/components/smart-crm-marketing/smart-crm-marketing.component.ts +13 -0
  108. package/src/lib/private/components/smart-crm-opportunities/smart-crm-board/smart-crm-board.component.html +75 -0
  109. package/src/lib/private/components/smart-crm-opportunities/smart-crm-board/smart-crm-board.component.scss +223 -0
  110. package/src/lib/private/components/smart-crm-opportunities/smart-crm-board/smart-crm-board.component.spec.ts +184 -0
  111. package/src/lib/private/components/smart-crm-opportunities/smart-crm-board/smart-crm-board.component.ts +268 -0
  112. package/src/lib/private/components/smart-crm-opportunities/smart-crm-opportunities-list/smart-crm-opportunities-details/smart-crm-opportunities-details.component.html +273 -0
  113. package/src/lib/private/components/smart-crm-opportunities/smart-crm-opportunities-list/smart-crm-opportunities-details/smart-crm-opportunities-details.component.scss +11 -0
  114. package/src/lib/private/components/smart-crm-opportunities/smart-crm-opportunities-list/smart-crm-opportunities-details/smart-crm-opportunities-details.component.spec.ts +196 -0
  115. package/src/lib/private/components/smart-crm-opportunities/smart-crm-opportunities-list/smart-crm-opportunities-details/smart-crm-opportunities-details.component.ts +391 -0
  116. package/src/lib/private/components/smart-crm-opportunities/smart-crm-opportunities-list/smart-crm-opportunities-info/smart-crm-opportunities-info.component.html +489 -0
  117. package/src/lib/private/components/smart-crm-opportunities/smart-crm-opportunities-list/smart-crm-opportunities-info/smart-crm-opportunities-info.component.scss +104 -0
  118. package/src/lib/private/components/smart-crm-opportunities/smart-crm-opportunities-list/smart-crm-opportunities-info/smart-crm-opportunities-info.component.spec.ts +319 -0
  119. package/src/lib/private/components/smart-crm-opportunities/smart-crm-opportunities-list/smart-crm-opportunities-info/smart-crm-opportunities-info.component.ts +568 -0
  120. package/src/lib/private/components/smart-crm-opportunities/smart-crm-opportunities-list/smart-crm-opportunities-list.component.html +204 -0
  121. package/src/lib/private/components/smart-crm-opportunities/smart-crm-opportunities-list/smart-crm-opportunities-list.component.scss +11 -0
  122. package/src/lib/private/components/smart-crm-opportunities/smart-crm-opportunities-list/smart-crm-opportunities-list.component.spec.ts +123 -0
  123. package/src/lib/private/components/smart-crm-opportunities/smart-crm-opportunities-list/smart-crm-opportunities-list.component.ts +260 -0
  124. package/src/lib/private/components/smart-crm-opportunities/smart-crm-opportunities.component.html +25 -0
  125. package/src/lib/private/components/smart-crm-opportunities/smart-crm-opportunities.component.scss +7 -0
  126. package/src/lib/private/components/smart-crm-opportunities/smart-crm-opportunities.component.spec.ts +38 -0
  127. package/src/lib/private/components/smart-crm-opportunities/smart-crm-opportunities.component.ts +8 -0
  128. package/src/lib/private/components/smart-crm-summary/smart-crm-summary-actions/smart-crm-summary-actions.component.html +213 -0
  129. package/src/lib/private/components/smart-crm-summary/smart-crm-summary-actions/smart-crm-summary-actions.component.scss +73 -0
  130. package/src/lib/private/components/smart-crm-summary/smart-crm-summary-actions/smart-crm-summary-actions.component.spec.ts +147 -0
  131. package/src/lib/private/components/smart-crm-summary/smart-crm-summary-actions/smart-crm-summary-actions.component.ts +292 -0
  132. package/src/lib/private/components/smart-crm-summary/smart-crm-summary-others/smart-crm-summary-others.component.html +309 -0
  133. package/src/lib/private/components/smart-crm-summary/smart-crm-summary-others/smart-crm-summary-others.component.spec.ts +75 -0
  134. package/src/lib/private/components/smart-crm-summary/smart-crm-summary-others/smart-crm-summary-others.component.ts +161 -0
  135. package/src/lib/private/components/smart-crm-summary/smart-crm-summary.component.html +25 -0
  136. package/src/lib/private/components/smart-crm-summary/smart-crm-summary.component.scss +68 -0
  137. package/src/lib/private/components/smart-crm-summary/smart-crm-summary.component.spec.ts +32 -0
  138. package/src/lib/private/components/smart-crm-summary/smart-crm-summary.component.ts +8 -0
  139. package/src/lib/private/components/smart-crm-tabs/smart-crm-tabs.component.spec.ts +43 -0
  140. package/src/lib/private/components/smart-crm-tabs/smart-crm-tabs.component.ts +97 -0
  141. package/src/lib/private/smart-crm-private.module.ts +188 -0
  142. package/src/lib/private/smart-crm-private.routing.module.ts +303 -0
  143. package/src/lib/public/components/smart-crm-newsletter-confirmation/smart-crm-newsletter-confirmation.component.html +27 -0
  144. package/src/lib/public/components/smart-crm-newsletter-confirmation/smart-crm-newsletter-confirmation.component.scss +4 -0
  145. package/src/lib/public/components/smart-crm-newsletter-confirmation/smart-crm-newsletter-confirmation.component.spec.ts +40 -0
  146. package/src/lib/public/components/smart-crm-newsletter-confirmation/smart-crm-newsletter-confirmation.component.ts +57 -0
  147. package/src/lib/public/components/smart-crm-newsletter-unsubscribe/smart-crm-newsletter-unsubscribe.component.html +36 -0
  148. package/src/lib/public/components/smart-crm-newsletter-unsubscribe/smart-crm-newsletter-unsubscribe.component.spec.ts +42 -0
  149. package/src/lib/public/components/smart-crm-newsletter-unsubscribe/smart-crm-newsletter-unsubscribe.component.ts +57 -0
  150. package/src/lib/public/components/smart-crm-signup/smart-crm-signup.component.html +133 -0
  151. package/src/lib/public/components/smart-crm-signup/smart-crm-signup.component.scss +1 -0
  152. package/src/lib/public/components/smart-crm-signup/smart-crm-signup.component.spec.ts +37 -0
  153. package/src/lib/public/components/smart-crm-signup/smart-crm-signup.component.ts +41 -0
  154. package/src/lib/public/smart-crm-public.module.ts +30 -0
  155. package/src/lib/public/smart-crm-public.routing.module.ts +36 -0
  156. package/{lib/shared/interface/crm-account.interface.d.ts → src/lib/shared/interface/crm-account.interface.ts} +10 -3
  157. package/{lib/shared/interface/crm-action.interface.d.ts → src/lib/shared/interface/crm-action.interface.ts} +1 -0
  158. package/{lib/shared/interface/crm-contact.interface.d.ts → src/lib/shared/interface/crm-contact.interface.ts} +2 -0
  159. package/{lib/shared/interface/crm-lead.interface.d.ts → src/lib/shared/interface/crm-lead.interface.ts} +1 -0
  160. package/{lib/shared/interface/crm-newsletter.interface.d.ts → src/lib/shared/interface/crm-newsletter.interface.ts} +3 -1
  161. package/{lib/shared/interface/crm-opportunity.interface.d.ts → src/lib/shared/interface/crm-opportunity.interface.ts} +5 -0
  162. package/{lib/shared/interface/crm-source.interface.d.ts → src/lib/shared/interface/crm-source.interface.ts} +1 -0
  163. package/{lib/shared/interface/crm-stages.interface.d.ts → src/lib/shared/interface/crm-stages.interface.ts} +1 -0
  164. package/{lib/shared/interface/crm-widget.interface.d.ts → src/lib/shared/interface/crm-widget.interface.ts} +1 -0
  165. package/{lib/shared/interface/smart-crm-module.interface.d.ts → src/lib/shared/interface/smart-crm-module.interface.ts} +42 -1
  166. package/src/lib/shared/models/smart-crm.model.ts +199 -0
  167. package/src/lib/shared/routers/routers.ts +23 -0
  168. package/tsconfig.json +29 -0
  169. package/tsconfig.lib.json +25 -0
  170. package/tsconfig.lib.prod.json +9 -0
  171. package/tsconfig.spec.json +11 -0
  172. package/esm2022/index.mjs +0 -48
  173. package/esm2022/lib/private/components/smart-crm-accounts/smart-crm-account-details/smart-crm-account-details.component.mjs +0 -194
  174. package/esm2022/lib/private/components/smart-crm-accounts/smart-crm-account-files/smart-crm-account-files.component.mjs +0 -192
  175. package/esm2022/lib/private/components/smart-crm-accounts/smart-crm-account-info/smart-crm-account-info.component.mjs +0 -599
  176. package/esm2022/lib/private/components/smart-crm-accounts/smart-crm-accounts.component.mjs +0 -348
  177. package/esm2022/lib/private/components/smart-crm-competition/smart-crm-competition/smart-crm-competition.component.mjs +0 -12
  178. package/esm2022/lib/private/components/smart-crm-configuration/smart-crm-actions/smart-crm-actions-details/smart-crm-actions-details.component.mjs +0 -97
  179. package/esm2022/lib/private/components/smart-crm-configuration/smart-crm-actions/smart-crm-actions.component.mjs +0 -118
  180. package/esm2022/lib/private/components/smart-crm-configuration/smart-crm-configuration.component.mjs +0 -35
  181. package/esm2022/lib/private/components/smart-crm-configuration/smart-crm-opportunity-categories/smart-crm-opportunity-categories-details/smart-crm-opportunity-categories-details.component.mjs +0 -87
  182. package/esm2022/lib/private/components/smart-crm-configuration/smart-crm-opportunity-categories/smart-crm-opportunity-categories.component.mjs +0 -119
  183. package/esm2022/lib/private/components/smart-crm-configuration/smart-crm-source/smart-crm-source-details/smart-crm-source-details.component.mjs +0 -79
  184. package/esm2022/lib/private/components/smart-crm-configuration/smart-crm-source/smart-crm-source.component.mjs +0 -107
  185. package/esm2022/lib/private/components/smart-crm-configuration/smart-crm-stages/smart-crm-stage-details/smart-crm-stage-details.component.mjs +0 -96
  186. package/esm2022/lib/private/components/smart-crm-configuration/smart-crm-stages/smart-crm-stages.component.mjs +0 -139
  187. package/esm2022/lib/private/components/smart-crm-configuration/smart-crm-widgets/smart-crm-widgets-details/smart-crm-widgets-details.component.mjs +0 -98
  188. package/esm2022/lib/private/components/smart-crm-configuration/smart-crm-widgets/smart-crm-widgets.component.mjs +0 -125
  189. package/esm2022/lib/private/components/smart-crm-contacts/smart-crm-contact-details/smart-crm-contact-details.component.mjs +0 -159
  190. package/esm2022/lib/private/components/smart-crm-contacts/smart-crm-contact-info/smart-crm-contact-info.component.mjs +0 -470
  191. package/esm2022/lib/private/components/smart-crm-contacts/smart-crm-contacts.component.mjs +0 -281
  192. package/esm2022/lib/private/components/smart-crm-customer/smart-crm-customer-success/smart-crm-customer-success.component.mjs +0 -12
  193. package/esm2022/lib/private/components/smart-crm-insight/smart-crm-insight.component.mjs +0 -14
  194. package/esm2022/lib/private/components/smart-crm-insight/smart-crm-overview/smart-crm-overview.component.mjs +0 -55
  195. package/esm2022/lib/private/components/smart-crm-leads/smart-crm-leads-details/smart-crm-leads-details.component.mjs +0 -173
  196. package/esm2022/lib/private/components/smart-crm-leads/smart-crm-leads.component.mjs +0 -136
  197. package/esm2022/lib/private/components/smart-crm-marketing/smart-crm-marketing-list/smart-crm-marketing-contacts/smart-crm-marketing-contacts.component.mjs +0 -79
  198. package/esm2022/lib/private/components/smart-crm-marketing/smart-crm-marketing-list/smart-crm-marketing-details/smart-crm-marketing-details.component.mjs +0 -266
  199. package/esm2022/lib/private/components/smart-crm-marketing/smart-crm-marketing-list/smart-crm-marketing-list.component.mjs +0 -151
  200. package/esm2022/lib/private/components/smart-crm-marketing/smart-crm-marketing-list/smart-crm-marketing-view-details/smart-crm-marketing-view-details.component.mjs +0 -51
  201. package/esm2022/lib/private/components/smart-crm-marketing/smart-crm-marketing.component.mjs +0 -18
  202. package/esm2022/lib/private/components/smart-crm-opportunities/smart-crm-board/smart-crm-board.component.mjs +0 -230
  203. package/esm2022/lib/private/components/smart-crm-opportunities/smart-crm-opportunities-list/smart-crm-opportunities-details/smart-crm-opportunities-details.component.mjs +0 -335
  204. package/esm2022/lib/private/components/smart-crm-opportunities/smart-crm-opportunities-list/smart-crm-opportunities-info/smart-crm-opportunities-info.component.mjs +0 -477
  205. package/esm2022/lib/private/components/smart-crm-opportunities/smart-crm-opportunities-list/smart-crm-opportunities-list.component.mjs +0 -218
  206. package/esm2022/lib/private/components/smart-crm-opportunities/smart-crm-opportunities.component.mjs +0 -14
  207. package/esm2022/lib/private/components/smart-crm-summary/smart-crm-summary-actions/smart-crm-summary-actions.component.mjs +0 -255
  208. package/esm2022/lib/private/components/smart-crm-summary/smart-crm-summary-others/smart-crm-summary-others.component.mjs +0 -148
  209. package/esm2022/lib/private/components/smart-crm-summary/smart-crm-summary.component.mjs +0 -16
  210. package/esm2022/lib/private/components/smart-crm-tabs/smart-crm-tabs.component.mjs +0 -92
  211. package/esm2022/lib/private/smart-crm-private.module.mjs +0 -327
  212. package/esm2022/lib/private/smart-crm-private.routing.module.mjs +0 -310
  213. package/esm2022/lib/public/components/smart-crm-newsletter-confirmation/smart-crm-newsletter-confirmation.component.mjs +0 -56
  214. package/esm2022/lib/public/components/smart-crm-newsletter-unsubscribe/smart-crm-newsletter-unsubscribe.component.mjs +0 -57
  215. package/esm2022/lib/public/components/smart-crm-signup/smart-crm-signup.component.mjs +0 -35
  216. package/esm2022/lib/public/smart-crm-public.module.mjs +0 -46
  217. package/esm2022/lib/public/smart-crm-public.routing.module.mjs +0 -44
  218. package/esm2022/lib/shared/interface/crm-account.interface.mjs +0 -2
  219. package/esm2022/lib/shared/interface/crm-action.interface.mjs +0 -2
  220. package/esm2022/lib/shared/interface/crm-contact.interface.mjs +0 -2
  221. package/esm2022/lib/shared/interface/crm-lead.interface.mjs +0 -2
  222. package/esm2022/lib/shared/interface/crm-newsletter.interface.mjs +0 -2
  223. package/esm2022/lib/shared/interface/crm-opportunity.interface.mjs +0 -2
  224. package/esm2022/lib/shared/interface/crm-source.interface.mjs +0 -2
  225. package/esm2022/lib/shared/interface/crm-stages.interface.mjs +0 -2
  226. package/esm2022/lib/shared/interface/crm-widget.interface.mjs +0 -2
  227. package/esm2022/lib/shared/interface/smart-crm-module.interface.mjs +0 -2
  228. package/esm2022/lib/shared/models/smart-crm.model.mjs +0 -186
  229. package/esm2022/lib/shared/routers/routers.mjs +0 -23
  230. package/esm2022/posiwise-smart-crm.mjs +0 -5
  231. package/fesm2022/posiwise-smart-crm.mjs +0 -6482
  232. package/fesm2022/posiwise-smart-crm.mjs.map +0 -1
  233. package/lib/private/components/smart-crm-accounts/smart-crm-account-details/smart-crm-account-details.component.d.ts +0 -61
  234. package/lib/private/components/smart-crm-accounts/smart-crm-account-files/smart-crm-account-files.component.d.ts +0 -72
  235. package/lib/private/components/smart-crm-accounts/smart-crm-account-info/smart-crm-account-info.component.d.ts +0 -173
  236. package/lib/private/components/smart-crm-accounts/smart-crm-accounts.component.d.ts +0 -105
  237. package/lib/private/components/smart-crm-competition/smart-crm-competition/smart-crm-competition.component.d.ts +0 -5
  238. package/lib/private/components/smart-crm-configuration/smart-crm-actions/smart-crm-actions-details/smart-crm-actions-details.component.d.ts +0 -37
  239. package/lib/private/components/smart-crm-configuration/smart-crm-actions/smart-crm-actions.component.d.ts +0 -55
  240. package/lib/private/components/smart-crm-configuration/smart-crm-configuration.component.d.ts +0 -11
  241. package/lib/private/components/smart-crm-configuration/smart-crm-opportunity-categories/smart-crm-opportunity-categories-details/smart-crm-opportunity-categories-details.component.d.ts +0 -31
  242. package/lib/private/components/smart-crm-configuration/smart-crm-opportunity-categories/smart-crm-opportunity-categories.component.d.ts +0 -56
  243. package/lib/private/components/smart-crm-configuration/smart-crm-source/smart-crm-source-details/smart-crm-source-details.component.d.ts +0 -28
  244. package/lib/private/components/smart-crm-configuration/smart-crm-source/smart-crm-source.component.d.ts +0 -52
  245. package/lib/private/components/smart-crm-configuration/smart-crm-stages/smart-crm-stage-details/smart-crm-stage-details.component.d.ts +0 -34
  246. package/lib/private/components/smart-crm-configuration/smart-crm-stages/smart-crm-stages.component.d.ts +0 -58
  247. package/lib/private/components/smart-crm-configuration/smart-crm-widgets/smart-crm-widgets-details/smart-crm-widgets-details.component.d.ts +0 -36
  248. package/lib/private/components/smart-crm-configuration/smart-crm-widgets/smart-crm-widgets.component.d.ts +0 -58
  249. package/lib/private/components/smart-crm-contacts/smart-crm-contact-details/smart-crm-contact-details.component.d.ts +0 -48
  250. package/lib/private/components/smart-crm-contacts/smart-crm-contact-info/smart-crm-contact-info.component.d.ts +0 -122
  251. package/lib/private/components/smart-crm-contacts/smart-crm-contacts.component.d.ts +0 -89
  252. package/lib/private/components/smart-crm-customer/smart-crm-customer-success/smart-crm-customer-success.component.d.ts +0 -5
  253. package/lib/private/components/smart-crm-insight/smart-crm-insight.component.d.ts +0 -5
  254. package/lib/private/components/smart-crm-insight/smart-crm-overview/smart-crm-overview.component.d.ts +0 -20
  255. package/lib/private/components/smart-crm-leads/smart-crm-leads-details/smart-crm-leads-details.component.d.ts +0 -45
  256. package/lib/private/components/smart-crm-leads/smart-crm-leads.component.d.ts +0 -58
  257. package/lib/private/components/smart-crm-marketing/smart-crm-marketing-list/smart-crm-marketing-contacts/smart-crm-marketing-contacts.component.d.ts +0 -49
  258. package/lib/private/components/smart-crm-marketing/smart-crm-marketing-list/smart-crm-marketing-details/smart-crm-marketing-details.component.d.ts +0 -63
  259. package/lib/private/components/smart-crm-marketing/smart-crm-marketing-list/smart-crm-marketing-list.component.d.ts +0 -62
  260. package/lib/private/components/smart-crm-marketing/smart-crm-marketing-list/smart-crm-marketing-view-details/smart-crm-marketing-view-details.component.d.ts +0 -21
  261. package/lib/private/components/smart-crm-marketing/smart-crm-marketing.component.d.ts +0 -8
  262. package/lib/private/components/smart-crm-opportunities/smart-crm-board/smart-crm-board.component.d.ts +0 -63
  263. package/lib/private/components/smart-crm-opportunities/smart-crm-opportunities-list/smart-crm-opportunities-details/smart-crm-opportunities-details.component.d.ts +0 -67
  264. package/lib/private/components/smart-crm-opportunities/smart-crm-opportunities-list/smart-crm-opportunities-info/smart-crm-opportunities-info.component.d.ts +0 -122
  265. package/lib/private/components/smart-crm-opportunities/smart-crm-opportunities-list/smart-crm-opportunities-list.component.d.ts +0 -77
  266. package/lib/private/components/smart-crm-opportunities/smart-crm-opportunities.component.d.ts +0 -5
  267. package/lib/private/components/smart-crm-summary/smart-crm-summary-actions/smart-crm-summary-actions.component.d.ts +0 -72
  268. package/lib/private/components/smart-crm-summary/smart-crm-summary-others/smart-crm-summary-others.component.d.ts +0 -40
  269. package/lib/private/components/smart-crm-summary/smart-crm-summary.component.d.ts +0 -5
  270. package/lib/private/components/smart-crm-tabs/smart-crm-tabs.component.d.ts +0 -10
  271. package/lib/private/smart-crm-private.module.d.ts +0 -62
  272. package/lib/private/smart-crm-private.routing.module.d.ts +0 -7
  273. package/lib/public/components/smart-crm-newsletter-confirmation/smart-crm-newsletter-confirmation.component.d.ts +0 -18
  274. package/lib/public/components/smart-crm-newsletter-unsubscribe/smart-crm-newsletter-unsubscribe.component.d.ts +0 -17
  275. package/lib/public/components/smart-crm-signup/smart-crm-signup.component.d.ts +0 -15
  276. package/lib/public/smart-crm-public.module.d.ts +0 -14
  277. package/lib/public/smart-crm-public.routing.module.d.ts +0 -7
  278. package/lib/shared/models/smart-crm.model.d.ts +0 -16
  279. package/lib/shared/routers/routers.d.ts +0 -21
@@ -1,599 +0,0 @@
1
- import { DOCUMENT } from '@angular/common';
2
- import { ChangeDetectorRef, Component, EventEmitter, Inject, Injector } from '@angular/core';
3
- import { Validators } from '@angular/forms';
4
- import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
5
- import { CRM_ACCOUNT_FILES_PATH } from '@posiwise/smart-crm-shared';
6
- import { AppSmartCrm } from '../../../../shared/models/smart-crm.model';
7
- import { ROUTERS } from '../../../../shared/routers/routers';
8
- import { CrmService } from '@posiwise/smart-crm-shared';
9
- import { LogoCacheService } from '@posiwise/common-services';
10
- import { UploadStatus } from 'ngx-uploader';
11
- import swal from 'sweetalert2';
12
- import { DOCUMENT_TYPE_EXT, PAGE_SIZE, TOKEN_HEADER_KEY } from '@posiwise/common-utilities';
13
- import { AppBaseComponent } from '@posiwise/app-base-component';
14
- import { AuthService, CommonService, FormHelperService, GeoService, SubscriptionService } from '@posiwise/common-services';
15
- import { HelperService } from '@posiwise/helper-service';
16
- import moment from 'moment';
17
- import * as i0 from "@angular/core";
18
- import * as i1 from "@posiwise/smart-crm-shared";
19
- import * as i2 from "@posiwise/common-services";
20
- import * as i3 from "@ng-bootstrap/ng-bootstrap";
21
- import * as i4 from "@angular/common";
22
- import * as i5 from "@angular/forms";
23
- import * as i6 from "primeng/inputtext";
24
- import * as i7 from "ngx-ui-switch";
25
- import * as i8 from "@posiwise/directives";
26
- import * as i9 from "@angular-magic/ngx-gp-autocomplete";
27
- import * as i10 from "@angular/router";
28
- import * as i11 from "primeng/api";
29
- import * as i12 from "primeng/progressspinner";
30
- import * as i13 from "primeng/table";
31
- import * as i14 from "primeng/autocomplete";
32
- import * as i15 from "@posiwise/shared-components";
33
- import * as i16 from "ngx-uploader";
34
- import * as i17 from "ngx-infinite-scroll";
35
- import * as i18 from "../smart-crm-account-files/smart-crm-account-files.component";
36
- import * as i19 from "@posiwise/pipes";
37
- import * as i20 from "@jsverse/transloco";
38
- export class SmartCrmCompanyInfoComponent extends AppBaseComponent {
39
- constructor(injector, crmService, subscriptionService, geoService, commonService, modalService, authService, cdr, logoCacheService, document) {
40
- super(injector);
41
- this.crmService = crmService;
42
- this.subscriptionService = subscriptionService;
43
- this.geoService = geoService;
44
- this.commonService = commonService;
45
- this.modalService = modalService;
46
- this.authService = authService;
47
- this.cdr = cdr;
48
- this.logoCacheService = logoCacheService;
49
- this.document = document;
50
- this.isFormEdit = true;
51
- this.isDataLoaded = false;
52
- this.submitted = false;
53
- this.accountComments = [];
54
- this.hasAccess = false;
55
- this.editComment = false;
56
- this.isContactValid = true;
57
- this.isLoaded = false;
58
- this.totalRecordsUnFiltered = 0;
59
- this.loading = true;
60
- this.searchText = '';
61
- this.potential = ['low', 'medium', 'high'];
62
- this.showFullComment = false;
63
- this.isDisabled = false;
64
- this.updating = false;
65
- this.direction = '';
66
- this.page = 1;
67
- this.currentPage = 1;
68
- this.totalContacts = 0;
69
- this.selector = '.timeline-container';
70
- this.submitAction = false;
71
- this.routers = ROUTERS;
72
- this.buttonBusy = false;
73
- this.options = { concurrency: 1, maxUploads: 3 };
74
- this.uploadInput = new EventEmitter();
75
- this.token = btoa(this.authService.getToken());
76
- this.files = [];
77
- this.actionControls = AppSmartCrm.getAccountActionsForm(this.isDisabled);
78
- this.aboutControls = AppSmartCrm.getAccountsForm();
79
- }
80
- ngOnInit() {
81
- this.countries$ = this.geoService.getCountries();
82
- this.organizationIndustries$ = this.commonService.getOrganizationIndustries();
83
- this.organizationTypes$ = this.commonService.getOrganizationTypes();
84
- this.organizationSizes$ = this.commonService.getOrganizationSizes();
85
- this.userStore().subscribe(res => {
86
- if (res) {
87
- this.userId = res.id;
88
- this.actionControls.get('owner_id').setValue(res.id);
89
- }
90
- });
91
- this.getUserSubscription().subscribe(response => {
92
- this.subscription = response;
93
- if (this.subscription?.id) {
94
- this.hasAccess = this.hasAdminAccess(this.subscription.id);
95
- this.getActions();
96
- this.accountDefaultValues(this.subscription.id);
97
- this.aboutControls.get('subscription_id').setValue(this.subscription?.id);
98
- }
99
- this.route.params.subscribe(data => {
100
- this.accountId = Number(data['id']);
101
- if (this.accountId) {
102
- this.getAccountDetails();
103
- this.getContactVersion();
104
- }
105
- });
106
- });
107
- this.getAllComments();
108
- }
109
- ngAfterViewChecked() {
110
- this.cdr.detectChanges();
111
- }
112
- onLazyLoad(event) {
113
- const pageDetails = HelperService.onTableLazyLoad(event);
114
- this.page = pageDetails.page;
115
- this.getAccountContacts({
116
- page: this.page,
117
- page_size: PAGE_SIZE,
118
- order_by: pageDetails.sortField,
119
- order_direction: pageDetails.sortOrder,
120
- search: this.searchText
121
- });
122
- }
123
- /** Function to call account default values */
124
- accountDefaultValues(id) {
125
- this.crmService.getCrmAccountDefaultValues(id).subscribe(response => {
126
- this.status = response.status;
127
- this.priority = response.priority;
128
- this.source = response.source;
129
- });
130
- }
131
- /** Function to call account by ID */
132
- getAccountDetails() {
133
- this.isDataLoaded = false;
134
- this.crmService
135
- .getAccountDetail(this.subscription?.id, this.accountId)
136
- .subscribe(response => {
137
- this.data = response;
138
- this.aboutControls.patchValue(response);
139
- this.aboutControls.get('owner_id').setValue(response.owner);
140
- })
141
- .add(() => {
142
- this.isDataLoaded = true;
143
- });
144
- }
145
- get f() {
146
- return this.aboutControls.controls;
147
- }
148
- updateAccountInfo() {
149
- this.buttonBusy = true;
150
- if (!this.aboutControls.valid) {
151
- this.buttonBusy = false;
152
- this.submitted = true;
153
- }
154
- else {
155
- this.aboutControls
156
- .get('owner_id')
157
- .setValue(this.aboutControls.get('owner_id').value.id);
158
- this.crmService
159
- .updateAccount(this.subscription?.id, this.accountId, this.aboutControls.value)
160
- .subscribe(() => {
161
- this.toast.success(this.translation.translate('Crm.AccountMessage.UpdatedMessage'));
162
- this.isFormEdit = true;
163
- this.getAccountDetails();
164
- })
165
- .add(() => {
166
- this.buttonBusy = false;
167
- this.submitted = false;
168
- });
169
- }
170
- }
171
- onScrollTimeline() {
172
- this.currentPage++;
173
- const totalPages = Math.ceil(this.totalContacts / 5);
174
- // Prevent API call if all messages have been fetched
175
- if (this.currentPage <= totalPages) {
176
- this.getAllComments();
177
- }
178
- }
179
- /** Function to save comment */
180
- onSave() {
181
- this.submitAction = true;
182
- const form = this.actionControls.value;
183
- form.owner_id = this.data?.owner_id;
184
- form.crm_account_id = this.accountId;
185
- form.crm_contact_id = form?.crm_contact_id?.id;
186
- form.when = HelperService.dateFormat(form.when);
187
- if (this.actionControls.invalid) {
188
- FormHelperService.validateAllFormFields(this.actionControls);
189
- }
190
- else {
191
- this.buttonBusy = true;
192
- this.crmService
193
- .postAccountComment(this.subscription?.id, form)
194
- .subscribe(() => {
195
- this.actionControls.get('comment').reset();
196
- this.getAllComments();
197
- this.toast.success(this.translation.translate('Crm.AccountMessage.CommentSubmittedMessage'));
198
- })
199
- .add(() => {
200
- this.submitAction = false;
201
- this.buttonBusy = false;
202
- });
203
- }
204
- }
205
- showDatePicker(event, id) {
206
- this.actionControls.get('when').setValidators([Validators.required]);
207
- const actionButtons = this.document.getElementsByClassName('action-btn');
208
- for (let i = 0; i < actionButtons.length; i++) {
209
- actionButtons[i].classList.remove('active');
210
- }
211
- event.target.classList.add('active');
212
- this.actionControls.get('crm_action_id').setValue(id);
213
- }
214
- /** Function to get comments */
215
- getAllComments() {
216
- this.getUserSubscriptionId().subscribe(response => {
217
- this.subscriptionId = response;
218
- if (this.subscriptionId) {
219
- this.crmService
220
- .getAccountComments(this.accountId, this.subscriptionId, {
221
- page: this.currentPage,
222
- page_size: 5
223
- })
224
- .subscribe(resp => {
225
- this.totalContacts = resp.object_count;
226
- if (resp?.crm_account_actions?.length) {
227
- const existingIds = new Set(this.accountComments.map(comment => comment.id));
228
- this.accountComments = [
229
- ...this.accountComments,
230
- ...resp.crm_account_actions.filter(comment => !existingIds.has(comment.id))
231
- ];
232
- this.accountComments.forEach(data => {
233
- data.when_short_date = moment(data.when).format('DD-MMM-YYYY');
234
- const diff = moment(new Date(data.when)).diff(moment(new Date()), 'days');
235
- if (moment(new Date(data.when)) < moment(new Date())) {
236
- data['due'] = `Overdue by ${Math.abs(diff)} days`;
237
- data['color'] = this.dangerColor;
238
- }
239
- else {
240
- data['due'] = `In ${diff} days`;
241
- data['color'] = !this.dangerColor;
242
- }
243
- });
244
- this.accountComments.sort((a, b) => {
245
- return new Date(a.when).getTime() - new Date(b.when).getTime();
246
- });
247
- this.accountComments.forEach(item => {
248
- item['when'] = moment(item['when']).format('DD-MMM-YYYY');
249
- item['year'] = moment(item['when']).format('YYYY');
250
- item['month'] = moment(item['when']).format('MM');
251
- });
252
- const completedCancelledActions = this.accountComments.filter(action => action.completed === true || action.cancelled === true);
253
- completedCancelledActions.reverse();
254
- const notCompletedCancelledActions = this.accountComments.filter(action => action.completed === false && action.cancelled === false);
255
- this.accountComments =
256
- notCompletedCancelledActions.concat(completedCancelledActions);
257
- this.isLoaded = true;
258
- }
259
- else {
260
- this.isLoaded = true;
261
- }
262
- });
263
- }
264
- });
265
- }
266
- /** Function to update comment */
267
- updateComment(item) {
268
- const commentObj = {
269
- comment: item.comment,
270
- completed: item.completed,
271
- cancelled: item.cancelled,
272
- crm_account_id: item.crm_account_id,
273
- crm_contact_id: this.contactId
274
- };
275
- this.crmService
276
- .updateAccountComment(this.subscription?.id, item.id, commentObj)
277
- .subscribe(() => {
278
- this.toast.success('comment updated successfully');
279
- this.showEditControls(undefined, '');
280
- this.getAllComments();
281
- });
282
- }
283
- /** Function to execute on location select */
284
- handleAddressChange(event) {
285
- this.aboutControls.get('location').setValue(event.formatted_address);
286
- }
287
- /** Function to get subscription members */
288
- getAllSubscriptionMembers() {
289
- this.subscriptionService
290
- .getEnrolledSubscription(this.subscription?.id)
291
- .subscribe(member => {
292
- this.allSubscriptionMembers = member.members;
293
- });
294
- }
295
- /** Function to show edit comment section */
296
- showEditControls(event, action) {
297
- if (action && action.crm_contact) {
298
- this.contactId = action.crm_contact.id;
299
- }
300
- const comments = this.document.getElementsByClassName('card-header');
301
- for (let i = 0; i < comments.length; i++) {
302
- comments[i].classList.remove('show-controls');
303
- }
304
- if (event && event !== undefined) {
305
- event.target.closest('.card-header').classList.add('show-controls');
306
- }
307
- }
308
- /** Function to get and show all the actions */
309
- getActions() {
310
- this.crmService.getActionsBySubscriptionId(this.subscription?.id).subscribe(resp => {
311
- if (resp?.crm_actions?.length) {
312
- this.actions = resp.crm_actions;
313
- this.buttonDisable = this.actions.every(x => x.visible === false || x.visible === null);
314
- }
315
- else {
316
- this.buttonDisable = true;
317
- }
318
- });
319
- this.hasAccess = this.hasAdminAccess(this.subscription?.id);
320
- }
321
- /** Function to set the action as completed */
322
- setAsCompletedOrUncompleted(id, action, completedOrUncompleted) {
323
- const alertTitle = completedOrUncompleted ? 'InCompleted' : 'Completed';
324
- return swal
325
- .fire({
326
- title: alertTitle,
327
- html: `Are you sure you want to set as ${alertTitle}?`,
328
- showCancelButton: true,
329
- reverseButtons: true,
330
- icon: 'warning'
331
- })
332
- .then(res => {
333
- if (res.value) {
334
- const actionObj = {
335
- comment: action.comment,
336
- completed: !completedOrUncompleted,
337
- cancelled: action.cancelled,
338
- crm_account_id: action.crm_account_id
339
- };
340
- this.crmService
341
- .updateAccountComment(this.subscription?.id, id, actionObj)
342
- .subscribe(() => {
343
- this.toast.success(this.translation.translate('Crm.Settings.UpdatedMessage'));
344
- this.actions.splice(action, 1);
345
- this.getActions();
346
- this.getAllComments();
347
- });
348
- }
349
- });
350
- }
351
- /** Function to set the action as cancelled */
352
- setAsCancelled(id, action) {
353
- return swal
354
- .fire({
355
- title: 'Cancel',
356
- html: `Are you sure you want to set as cancelled?`,
357
- showCancelButton: true,
358
- reverseButtons: true,
359
- icon: 'warning'
360
- })
361
- .then(res => {
362
- if (res.value) {
363
- const actionObj = {
364
- comment: action.comment,
365
- completed: action.completed,
366
- cancelled: true,
367
- crm_account_id: action.crm_account_id
368
- };
369
- this.crmService
370
- .updateAccountComment(this.subscription?.id, id, actionObj)
371
- .subscribe(() => {
372
- this.toast.success(this.translation.translate('Crm.Settings.UpdatedMessage'));
373
- this.actions.splice(action, 1);
374
- this.getActions();
375
- this.getAllComments();
376
- });
377
- }
378
- });
379
- }
380
- /** Function to update the date */
381
- onDateSelect(event, action) {
382
- const commentObj = {
383
- when: HelperService.dateFormat(event),
384
- comment: action.comment,
385
- completed: action.completed,
386
- cancelled: action.cancelled,
387
- crm_account_id: action.crm_account_id
388
- };
389
- this.crmService
390
- .updateAccountComment(this.subscription?.id, action.id, commentObj)
391
- .subscribe(() => {
392
- this.toast.success('date updated successfully');
393
- this.getAllComments();
394
- this.updating = false;
395
- });
396
- }
397
- /** Function to show DatePicker */
398
- showDatePickerUpdate(actionId) {
399
- this.updating = !this.updating;
400
- this.actionId = actionId;
401
- }
402
- /** Function to get the contacts related to account */
403
- getAccountContacts(paging) {
404
- this.getUserSubscriptionId().subscribe(id => {
405
- this.subscriptionId = id;
406
- if (this.subscriptionId) {
407
- this.crmService
408
- .getAccountContacts(this.accountId, this.subscriptionId, this.filterByPotentials || '', paging)
409
- .subscribe(response => {
410
- if (response.contacts) {
411
- this.contacts = response.contacts;
412
- this.totalRecords = response.object_count;
413
- this.totalRecordsUnFiltered = response.unfiltered_count;
414
- this.contacts.forEach(member => {
415
- member.displayName = `${member.first_name || ''} ${member.last_name || ''} - ${member.email}`.trim();
416
- });
417
- }
418
- })
419
- .add(() => {
420
- this.loading = false;
421
- });
422
- }
423
- });
424
- }
425
- /** Function when auto-complete dropdown selected */
426
- onDropdownClick() {
427
- if (this.contacts.length === 0) {
428
- this.filteredContact = [{ displayName: 'No contact to choose' }];
429
- this.filteredContactComment = [{ first_name: 'No contact to choose' }];
430
- }
431
- }
432
- /** search owner */
433
- search(event) {
434
- const values = [];
435
- if (event.query) {
436
- this.filteredOwner = this.allSubscriptionMembers.filter((x) => {
437
- return x.first_name.toLowerCase().includes(event.query.toLowerCase());
438
- });
439
- }
440
- else {
441
- this.allSubscriptionMembers.forEach(element => {
442
- values.push(element);
443
- });
444
- }
445
- this.filteredOwner = values;
446
- }
447
- searchContact(event) {
448
- this.isContactValid = false;
449
- let values = [];
450
- if (event.query) {
451
- values = this.contacts.filter((x) => {
452
- return x.displayName.toLowerCase().includes(event.query.toLowerCase());
453
- });
454
- }
455
- else {
456
- this.contacts.forEach(element => {
457
- values.push(element);
458
- });
459
- }
460
- this.filteredContact = values;
461
- }
462
- selectContact(event) {
463
- this.isContactValid = this.contacts.some(x => x.id === event.id);
464
- }
465
- OnContactBlur() {
466
- if (!this.isContactValid) {
467
- this.actionControls.get('crm_contact_id').setValue('');
468
- }
469
- }
470
- searchContactInComment(event) {
471
- let values = [];
472
- if (event.query) {
473
- values = this.contacts.filter((x) => {
474
- return x.displayName.toLowerCase().includes(event.query.toLowerCase());
475
- });
476
- }
477
- else {
478
- this.contacts.forEach(element => {
479
- values.push(element);
480
- });
481
- }
482
- this.filteredContactComment = values;
483
- }
484
- selectCommentContact(event) {
485
- this.contactId = event.id;
486
- }
487
- /** Function to delete contact */
488
- onDeleteContact(id) {
489
- HelperService.raiseDeletePopup().then(resp => {
490
- if (resp.value) {
491
- this.crmService.deleteContact(this.subscription?.id, id).subscribe(() => {
492
- this.toast.success(this.translation.translate('Crm.ContactMessage.DeletedMessage'));
493
- this.getAccountContacts({
494
- page: this.page,
495
- page_size: PAGE_SIZE
496
- });
497
- });
498
- }
499
- });
500
- }
501
- /** Function to get contact versions */
502
- getContactVersion() {
503
- this.crmService
504
- .getContactVersion(this.subscription?.id, this.accountId, 'CrmAccount')
505
- .subscribe(response => {
506
- this.accountVersioning = response.versions;
507
- });
508
- }
509
- openModal(content) {
510
- this.modalService.open(content, { centered: true, windowClass: 'modal-holder' });
511
- }
512
- onClose() {
513
- this.modalService.dismissAll();
514
- }
515
- onUploadOutput(output) {
516
- switch (output.type) {
517
- case 'allAddedToQueue':
518
- if (this.files.length > 0) {
519
- const event = {
520
- type: 'uploadAll',
521
- url: CRM_ACCOUNT_FILES_PATH,
522
- method: 'POST',
523
- data: {
524
- owner_id: `${this.userId}`,
525
- crm_account_id: `${this.accountId}`
526
- },
527
- headers: {
528
- [TOKEN_HEADER_KEY]: this.token
529
- }
530
- };
531
- this.uploadInput.emit(event);
532
- }
533
- break;
534
- case 'addedToQueue':
535
- if (typeof output.file !== 'undefined') {
536
- const ext = output.file.name.split('.').pop();
537
- if (DOCUMENT_TYPE_EXT.includes(ext)) {
538
- this.files.push(output.file);
539
- }
540
- else {
541
- this.toast.error('file formats is not supported.');
542
- }
543
- }
544
- break;
545
- case 'uploading':
546
- if (typeof output.file !== 'undefined') {
547
- const index = this.files.findIndex(file => typeof output.file !== 'undefined' && file.id === output.file.id);
548
- this.files[index] = output.file;
549
- }
550
- break;
551
- case 'removed':
552
- this.files = this.files.filter((file) => file !== output.file);
553
- break;
554
- case 'dragOver':
555
- this.dragOver = true;
556
- break;
557
- case 'dragOut':
558
- case 'drop':
559
- this.dragOver = false;
560
- break;
561
- case 'done':
562
- break;
563
- default:
564
- }
565
- this.files.forEach(file => {
566
- if (file.progress.status === UploadStatus.Done) {
567
- file['uploaded'] = true;
568
- }
569
- });
570
- // wait for 500ms before filter files
571
- setTimeout(() => {
572
- this.files = this.files.filter(file => file.progress.status !== UploadStatus.Done);
573
- }, 500);
574
- }
575
- getAccountLogo(url) {
576
- if (url) {
577
- return this.logoCacheService.getLogo(`https://logo.clearbit.com/${url?.split('.')[1]}.${url?.split('.')[2]?.split('/')[0]}`);
578
- }
579
- return '';
580
- }
581
- navigateToAddOpportunities() {
582
- this.router.navigate([`/${this.subscription?.slug}${this.routers.opportunityAdd}`], {
583
- queryParams: { account_id: this.accountId }
584
- });
585
- }
586
- ngOnDestroy() {
587
- super.ngOnDestroy();
588
- }
589
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartCrmCompanyInfoComponent, deps: [{ token: i0.Injector }, { token: i1.CrmService }, { token: i2.SubscriptionService }, { token: i2.GeoService }, { token: i2.CommonService }, { token: i3.NgbModal }, { token: i2.AuthService }, { token: i0.ChangeDetectorRef }, { token: i2.LogoCacheService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
590
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: SmartCrmCompanyInfoComponent, selector: "pw-smart-crm-company-info", usesInheritance: true, ngImport: i0, template: "<div class=\"row\">\n <div class=\"col-12 mb-0\">\n <div class=\"me-auto mb-0\">\n <h2 class=\"mb-0\">\n <a href=\"javascript:void(0)\"\n (click)=\"back()\"\n class=\"previous\"><i class=\"fa fa-arrow-alt-circle-left\" aria-hidden=\"true\"></i></a>\n Account Info\n </h2>\n </div>\n <a class=\"btn btn-sm btn-outline-primary float-end mb-3\"\n data-cy=\"add-opportunities\"\n (click)=\"navigateToAddOpportunities()\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i>\n {{ 'Crm.OpportunitiesMessage.AddOpportunity' | transloco }}\n </a>\n </div>\n <div class=\"w-100 text-center mt-3\"\n *ngIf=\"!isDataLoaded\">\n <p-progressSpinner> </p-progressSpinner>\n </div>\n <div *ngIf=\"isDataLoaded\">\n <div class=\"row\">\n <div class=\"col-12 col-md-4\">\n <div class=\"user-info p-3 card pb-0 h-auto\">\n <div class=\"mb-2 text-center\">\n <a class=\"profile-image\">\n <img alt=\"Profile Image\"\n width=\"100\"\n height=\"100\"\n [src]=\"getAccountLogo(data?.company_url)\"\n class=\"img-fluid company-logo\"\n onerror=\"this.onerror=null;this.src='assets/img/icons/company.png';\" />\n </a>\n </div>\n <div class=\"mb-4 d-flex justify-content-between align-items-center\">\n <h4 class=\"d-inline-block\">\n About <span *ngIf=\"data?.id\">{{ data.name }}</span>\n </h4>\n <a href=\"javascript:void(0);\"\n *ngIf=\"isFormEdit\"\n class=\"btn btn-sm btn-outline-primary float-end\"\n (click)=\"isFormEdit = !isFormEdit; this.getAllSubscriptionMembers()\">{{ 'Button.Edit' | transloco }}</a>\n </div>\n <form [formGroup]=\"aboutControls\"\n [class.isDisabled]=\"isFormEdit\">\n <div class=\"mb-3\">\n <label class=\"label mb-0\">{{ 'Crm.AccountMessage.Name' | transloco }}</label>\n <input type=\"text\"\n class=\"form-control rounded-0 ps-1 user-value\"\n formControlName=\"name\"\n [ngClass]=\"{ 'is-invalid': submitted && f['name'].errors }\" />\n </div>\n <div class=\"mb-3\">\n <label class=\"label mb-0\">{{\n 'Crm.AccountMessage.Location' | transloco\n }}</label>\n <input ngx-gp-autocomplete\n class=\"form-control rounded-0 ps-1 user-value\"\n #places=\"ngx-places\"\n formControlName=\"location\"\n (onAddressChange)=\"handleAddressChange($event)\"\n [ngClass]=\"{ 'is-invalid': submitted && f['location'].errors }\" />\n </div>\n <div class=\"mb-3\"\n *ngIf=\"countries$ | async as countries\">\n <label>{{ 'Crm.AccountMessage.Country' | transloco\n }}<span class=\"text-danger required-icon\">*</span>\n </label>\n <select class=\"form-select\"\n formControlName=\"country\"\n [ngClass]=\"{ 'is-invalid': submitted && f['country'].errors }\">\n <option *ngFor=\"let country of countries\"\n [value]=\"country.code\">\n {{ country.name }}\n </option>\n </select>\n </div>\n <div class=\"mb-3 ui-fluid skills-modal\">\n <label class=\"label mb-2\">{{ 'Crm.AccountMessage.Owner' | transloco }}</label>\n <p class=\"form-control d-block pb-2 ps-1 user-value\"\n *ngIf=\"isFormEdit && data?.owner_id\">\n {{ data?.owner?.first_name }} {{ data?.owner?.last_name }}\n </p>\n <p-autoComplete *ngIf=\"!isFormEdit || !data?.owner_id\"\n [suggestions]=\"filteredOwner\"\n formControlName=\"owner_id\"\n dataKey=\"id\"\n field=\"first_name\"\n [dropdown]=\"true\"\n (completeMethod)=\"search($event)\"\n styleClass=\"w-100\"\n placeholder=\"Search owner\"\n [multiple]=\"false\">\n </p-autoComplete>\n </div>\n <div class=\"mb-3\">\n <label class=\"label mb-0\">{{\n 'Crm.AccountMessage.CompanyUrl' | transloco\n }}</label>\n <a [href]=\"data?.company_url\"\n target=\"blank\"\n class=\"form-control d-block pb-2 ps-1 user-value\"\n *ngIf=\"isFormEdit && data?.company_url\">{{ data?.company_url }}</a>\n <input *ngIf=\"!isFormEdit || !data?.company_url\"\n type=\"text\"\n class=\"form-control rounded-0 ps-1 user-value\"\n formControlName=\"company_url\"\n [ngClass]=\"{ 'is-invalid': submitted && f['company_url'].errors }\" />\n </div>\n <div class=\"mb-3\"\n *ngIf=\"data?.tel\">\n <label class=\"label mb-0\">{{ 'Crm.AccountMessage.Tel' | transloco }}</label>\n <input type=\"text\"\n class=\"form-control rounded-0 ps-1 user-value\"\n formControlName=\"tel\" />\n </div>\n <div class=\"mb-3\"\n *ngIf=\"organizationTypes$ | async as types\">\n <label>{{ 'Organization.OrganizationType' | transloco }}</label>\n <div class=\"mb-3\">\n <select formControlName=\"organization_type_id\"\n class=\"form-control form-select\"\n [ngClass]=\"{ 'is-invalid': submitted && f['organization_type_id'].errors }\">\n <option *ngFor=\"let option of types['organization_types']\"\n [value]=\"option.id\">\n {{ option.name }}\n </option>\n </select>\n </div>\n </div>\n <div class=\"mb-3\"\n *ngIf=\"organizationIndustries$ | async as industries\">\n <label>{{ 'Organization.OrganizationIndustry' | transloco }}</label>\n <select formControlName=\"organization_industry_id\"\n class=\"form-control form-select\"\n [ngClass]=\"{ 'is-invalid': submitted && f['organization_industry_id'].errors }\">\n <option *ngFor=\"let option of industries['organization_industries']\"\n [value]=\"option.id\">\n {{ option.name }}\n </option>\n </select>\n </div>\n <div class=\"mb-3\"\n *ngIf=\"organizationSizes$ | async as sizes\">\n <label>{{ 'Crm.AccountMessage.Size' | transloco }}</label>\n <select formControlName=\"organization_size_id\"\n class=\"form-control form-select\"\n [ngClass]=\"{ 'is-invalid': submitted && f['organization_size_id'].errors }\">\n <option *ngFor=\"let option of sizes['organization_sizes']\"\n [value]=\"option.id\">\n {{ option.name }}\n </option>\n </select>\n </div>\n <div class=\"mb-3\">\n <label>{{ 'Crm.AccountMessage.Status' | transloco }}</label>\n <select formControlName=\"status\"\n class=\"form-control form-select\"\n [ngClass]=\"{ 'is-invalid': submitted && f['status'].errors }\">\n <option *ngFor=\"let option of status\"\n [value]=\"option\">{{ option }}</option>\n </select>\n </div>\n <div class=\"mb-3\">\n <label>{{ 'Crm.AccountMessage.Priority' | transloco }}</label>\n <select formControlName=\"priority\"\n class=\"form-control form-select\"\n [ngClass]=\"{ 'is-invalid': submitted && f['priority'].errors }\">\n <option *ngFor=\"let option of priority\"\n [value]=\"option\">\n {{ option }}\n </option>\n </select>\n </div>\n <div class=\"mb-3\">\n <label>{{ 'Crm.AccountMessage.Source' | transloco }}</label>\n <select formControlName=\"crm_source_id\"\n class=\"form-control form-select\"\n [ngClass]=\"{ 'is-invalid': submitted && f['crm_source_id'].errors }\">\n <option *ngFor=\"let option of source\"\n [value]=\"option.id\">\n {{ option.name }}\n </option>\n </select>\n </div>\n <div class=\"mb-3\">\n <pw-input-container [label]=\"'Crm.AccountMessage.Description' | transloco\"\n name=\"description\">\n <textarea rows=\"5\"\n type=\"text\"\n class=\"form-control\"\n formControlName=\"description\"\n id=\"description\"\n [ngClass]=\"{ 'is-invalid': submitted && f['description'].errors }\"></textarea>\n </pw-input-container>\n </div>\n <div *ngIf=\"!isFormEdit\"\n class=\"text-end form-action-buttons\">\n <input type=\"button\"\n class=\"btn btn-outline-primary\"\n (click)=\"isFormEdit = !isFormEdit; getAccountDetails()\"\n value=\"Cancel\" />\n <button type=\"submit\"\n [buttonBusy]=\"buttonBusy\"\n class=\"btn btn-primary ms-3\"\n (click)=\"updateAccountInfo()\">\n {{ 'Button.Submit' | transloco }}\n </button>\n </div>\n </form>\n </div>\n </div>\n <div class=\"col-12 col-md-8\">\n <ul ngbNav\n #nav=\"ngbNav\"\n class=\"nav-tabs\">\n <li [ngbNavItem]=\"1\">\n <a ngbNavLink>Notes</a>\n <ng-template ngbNavContent>\n <form [formGroup]=\"actionControls\"\n (ngSubmit)=\"onSave()\">\n <textarea class=\"form-control\"\n formControlName=\"comment\"\n rows=\"6\"></textarea>\n <p class=\"text-danger\"\n *ngIf=\"\n actionControls.get('comment').touched &&\n actionControls.get('comment').invalid\n \">\n Note Required\n </p>\n <div *ngIf=\"actions?.length\"\n class=\"d-block clear-both pt-3\">\n <ng-container *ngFor=\"let action of actions; index as i\">\n <button *ngIf=\"action.visible\"\n type=\"button\"\n [class.active]=\"\"\n class=\"btn btn-sm me-2 btn-outline-primary mb-2 action-btn\"\n (click)=\"showDatePicker($event, action.id); d.toggle()\">\n {{ action.name }}\n </button>\n </ng-container>\n <div class=\"text-danger\"\n *ngIf=\"submitAction && actionControls.get('crm_action_id').invalid\">\n Please select an action\n </div>\n <div class=\"row mt-3\">\n <div class=\"col-12 col-sm-4\">\n <div class=\"input-group\">\n <input class=\"form-control\"\n placeholder=\"dd-mm-yyyy\"\n formControlName=\"when\"\n ngbDatepicker\n #d=\"ngbDatepicker\"\n (click)=\"d.toggle()\" />\n </div>\n </div>\n <div class=\"ui-fluid skills-modal col-sm-4 ps-0\">\n <p-autoComplete [suggestions]=\"filteredContact\"\n formControlName=\"crm_contact_id\"\n dataKey=\"id\"\n field=\"displayName\"\n [dropdown]=\"true\"\n (completeMethod)=\"searchContact($event)\"\n (onSelect)=\"selectContact($event)\"\n (onBlur)=\"OnContactBlur()\"\n styleClass=\"w-100\"\n placeholder=\"Search contact\"\n [multiple]=\"false\"\n (onDropdownClick)=\"onDropdownClick()\">\n </p-autoComplete>\n </div>\n <div class=\"col-sm-4 pe-0 completed-toggle\">\n <div class=\"mb-3\">\n <ui-switch checkedLabel=\"completed\"\n uncheckedLabel=\"open\"\n formControlName=\"completed\"\n name=\"completed\">\n </ui-switch>\n </div>\n </div>\n </div>\n </div>\n <div class=\"float-end\">\n <a class=\"btn btn-outline-primary me-0 me-sm-2\"\n (click)=\"openModal(content)\">{{ 'Upload file' | transloco }}</a>\n <button type=\"submit\"\n [buttonBusy]=\"buttonBusy\"\n [disabled]=\"buttonDisable\"\n class=\"btn btn-primary mt-2 mb-2\">Submit Note</button>\n </div>\n <div *ngIf=\"buttonDisable\"\n class=\"no-actions pt-4\">\n <pw-no-data [withImage]=\"true\" [message]=\"\n 'Crm.AccountMessage.NoActionsInAccountInfoMessage' | transloco\n \">\n </pw-no-data>\n </div>\n </form>\n <div class=\"w-100 text-center mt-3\"\n *ngIf=\"!isLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </div>\n <div *ngIf=\"!accountComments?.length && isLoaded\"\n class=\"no-actions pt-2\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.AccountMessage.NoActionsMessage' | transloco\">\n </pw-no-data>\n </div>\n <div *ngIf=\"accountComments?.length\">\n <div id=\"timeline\"\n class=\"pt-3 clear-both timeline-center timeline-wrapper timeline-container\"\n infiniteScroll\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\"\n [infiniteScrollContainer]=\"selector\"\n [fromRoot]=\"true\"\n (scrolled)=\"onScrollTimeline()\">\n <ul class=\"timeline\">\n <li class=\"timeline-line\"></li>\n </ul>\n <ul class=\"timeline\">\n <li class=\"timeline-line\"></li>\n <li class=\"timeline-item\"\n [ngClass]=\"{ 'mt-5': odd || last }\"\n *ngFor=\"\n let item of accountComments;\n index as i;\n let odd = odd;\n let even = even;\n let last = last;\n let first = first\n \">\n <div class=\"timeline-badge\">\n <span class=\"bg-red bg-lighten-1\">\n <span class=\"timeline-year\">\n <span class=\"d-block date-year\">{{\n item.when | date: 'medium' | slice: 0:3\n }}</span>\n <span>{{ item.year }}</span></span>\n </span>\n </div>\n <div class=\"timeline-card shadow card pb-0 rounded border-grey border-lighten-2 position-static\">\n <div class=\"card-header py-4\">\n <div class=\"mb-0 clearfix\">\n <textarea type=\"text\"\n name=\"comment\"\n class=\"comment-field form-control p-0\"\n [(ngModel)]=\"item.comment\">{{ item.comment }}</textarea>\n <div class=\"auto-complete mb-3 ui-fluid skills-modal\">\n <p-autoComplete [(ngModel)]=\"item.crm_contact\"\n [suggestions]=\"filteredContactComment\"\n dataKey=\" id \"\n field=\"first_name\"\n dropdown=\" true \"\n (completeMethod)=\"\n searchContactInComment($event)\n \"\n (onSelect)=\"selectCommentContact($event)\"\n (onBlur)=\"OnContactBlur()\"\n styleClass=\" w-100 \"\n placeholder=\" Search contact \"\n [multiple]=\"false\"\n (onDropdownClick)=\"onDropdownClick()\">\n </p-autoComplete>\n </div>\n <p class=\"float-start mb-0\"\n *ngIf=\"\n !showFullComment || item.id !== commentId\n \">\n {{ item.comment | slice: 0:170\n }}<a *ngIf=\"item.comment.length > 170\"\n class=\"text-secondary\"\n (click)=\"\n showFullComment = true;\n commentId = item.id\n \">...show more\n </a>\n </p>\n <p class=\"float-start mb-0\"\n *ngIf=\"showFullComment && item.id === commentId\">\n {{ item.comment }}\n <a *ngIf=\"\n item.comment.length > 170 &&\n showFullComment\n \"\n (click)=\"showFullComment = false\"\n class=\"text-secondary\">...show less</a>\n </p>\n <button class=\"btn btn-md edit-btn float-end py-0\"\n (click)=\"showEditControls($event, item)\"\n *ngIf=\"userId === item.owner_id || hasAccess\">\n <i\n class=\"fa fa-edit edit-icon\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n <div class=\"card-subtitle text-muted my-0 clearfix\">\n <div class=\"float-start\">\n <span *ngIf=\"!updating || actionId !== item.id\"\n class=\"font-small-3\">\n {{ item.when }}</span>\n <input *ngIf=\"updating && actionId === item.id\"\n placeholder=\"dd-mm-yyyy\"\n value=\"{{ item.when }}\"\n ngbDatepicker\n #d=\"ngbDatepicker\"\n (focus)=\"d.toggle()\"\n (dateSelect)=\"onDateSelect($event, item)\" />\n </div>\n <button type=\" button\"\n class=\"btn btn-sm float-end when-btn py-0\"\n *ngIf=\"userId === item.owner_id || hasAccess\"\n (click)=\"showDatePickerUpdate(item.id)\">\n <i\n class=\"fa fa-edit edit-icon\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n <p [class.text-danger]=\"!item.color\"\n *ngIf=\"!item.cancelled && !item.completed\"\n class=\"mb-0\">\n {{ item.due }}\n </p>\n <a class=\"text-secondary action-owner\"\n *ngIf=\"item.crm_contact\"\n [routerLink]=\"[\n '/' + subscription?.slug + routers.contactInfo,\n item.crm_contact.id\n ]\">{{ item.crm_contact.first_name }}\n {{ item.crm_contact.last_name || '' }}</a>\n <p>\n By\n {{\n item.owner.first_name +\n ' ' +\n item.owner.last_name\n }}\n </p>\n <span class=\"badge bg-primary\">{{\n item?.crm_action?.name\n }}</span>\n <span *ngIf=\"\n !item.completed &&\n (userId === item.owner_id || hasAccess)\n \"\n class=\"badge bg-success ms-2\">Open</span>\n <a *ngIf=\"\n !item.completed &&\n (userId === item.owner_id || hasAccess)\n \"\n ngbTooltip=\"Set as completed\"\n class=\"me-3 ms-3\"\n href=\"javascript:void(0);\"\n (click)=\"\n setAsCompletedOrUncompleted(\n item.id,\n item,\n item.completed\n )\n \">\n <i\n class=\"fa fa-tasks completed\"\n aria-hidden=\"true\"\n ></i>\n </a>\n <a *ngIf=\"\n !item.cancelled &&\n !item.completed &&\n (userId === item.owner_id || hasAccess)\n \"\n ngbTooltip=\"Set as cancelled\"\n href=\"javascript:void(0);\"\n (click)=\"setAsCancelled(item.id, item)\">\n <i\n class=\"fa fa-times delete-icon\"\n aria-hidden=\"true\"\n ></i>\n </a>\n <a *ngIf=\"\n item.completed &&\n (userId === item.owner_id || hasAccess)\n \"\n ngbTooltip=\"Set as UnCompleted\"\n href=\"javascript:void(0);\"\n (click)=\"\n setAsCompletedOrUncompleted(\n item.id,\n item,\n item.completed\n )\n \"\n class=\"ms-2\">\n <i\n class=\"far fa-window-close\"\n aria-hidden=\"true\"\n ></i>\n </a>\n <div class=\"control-btns mt-3 text-end form-action-buttons\">\n <button type=\"button\"\n class=\"btn btn-sm btn-outline-default me-2\"\n (click)=\"showEditControls(undefined, '')\">\n {{ 'Button.Cancel' | transloco }}\n </button>\n <button class=\"btn btn-sm btn-primary\"\n type=\"button\"\n (click)=\"updateComment(item)\">\n {{ 'Button.Submit' | transloco }}\n </button>\n </div>\n </div>\n </div>\n </li>\n </ul>\n </div>\n </div>\n </ng-template>\n </li>\n <li [ngbNavItem]=\"2\">\n <a ngbNavLink>Contacts</a>\n <ng-template ngbNavContent>\n <div class=\"row\">\n <div class=\"col-12 mb-3\">\n <a class=\"btn btn-sm btn-outline-primary float-end\"\n data-cy=\"add-contact\"\n [routerLink]=\"[\n '/' + subscription?.slug + routers.contactAdd,\n accountId\n ]\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i>\n {{ 'Crm.ContactMessage.AddContact' | transloco }}\n </a>\n </div>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n [class.hideTable]=\"totalRecordsUnFiltered === 0\">\n <p-table class=\"table\"\n #dt\n [value]=\"contacts\"\n [paginator]=\"totalRecords !== 0\"\n [rows]=\"PAGE_SIZE\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"loading\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n [customSort]=\"true\">\n <ng-template pTemplate=\"caption\">\n <div class=\"text-end\">\n <i class=\"fa fa-search mt-2 me-2\" aria-hidden=\"true\"></i>\n <input type=\"text\"\n [(ngModel)]=\"searchText\"\n pInputText\n size=\"50\"\n placeholder=\"Search cosntact...\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\"\n class=\"mw-90\" />\n </div>\n </ng-template>\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\"\n pSortableColumn=\"first_name\">\n {{ 'Label.Name' | transloco }}\n <p-sortIcon field=\"first_name\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"owner_id\">\n {{ 'Crm.ContactMessage.ContactOwner' | transloco }}\n <p-sortIcon field=\"owner_id\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"headline\">\n {{ 'Crm.ContactMessage.Headline' | transloco }}\n <p-sortIcon field=\"headline\"></p-sortIcon>\n </th>\n <th scope=\"true\">{{ 'Label.Actions' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-contact>\n <tr>\n <td data-head=\"Name\"\n class=\"contactname\">\n <a [routerLink]=\"[\n '/' + subscription?.slug + routers.contactInfo,\n contact.id\n ]\">{{\n contact.first_name + ' ' + contact.last_name\n | textTruncate: 20\n }}</a>\n </td>\n <td data-head=\"OwnerName\">\n {{ contact.owner | ifNameNullShowEmail }}\n </td>\n <td data-head=\"Headline\"\n class=\"headline-content\">\n {{ contact?.headline | textTruncate: 20 }}\n </td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline\">\n <li ngbTooltip=\"Show\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"[\n '/' + subscription?.slug + routers.contactInfo,\n contact.id\n ]\">\n <i\n class=\"fa fa-eye see-icon\"\n aria-hidden=\"true\"\n ></i>\n </li>\n <li *ngIf=\"\n hasAccess ||\n contact.owner_id === userId ||\n contact.crm_account.owner_id === userId\n \"\n ngbTooltip=\"Add opportunity\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"[\n '/' +\n subscription?.slug +\n routers.opportunityAdd\n ]\"\n [queryParams]=\"{ contact_id: contact.id }\">\n <i\n class=\"fa fa-plus-circle add-icon\"\n aria-hidden=\"true\"\n ></i>\n </li>\n <li *ngIf=\"\n hasAccess ||\n contact.owner_id === userId ||\n contact.crm_account.owner_id === userId\n \"\n ngbTooltip=\"Edit\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"[\n '/' +\n subscription?.slug +\n routers.contactDetails,\n contact.id\n ]\">\n <i\n class=\"fa fa-edit edit-icon\"\n aria-hidden=\"true\"\n ></i>\n </li>\n <li *ngIf=\"\n hasAccess ||\n contact.owner_id === userId ||\n contact.crm_account.owner_id === userId\n \"\n ngbTooltip=\"Delete\"\n class=\"me-2 me-sm-3\">\n <i\n class=\"fa fa-trash delete-icon\"\n (click)=\"onDeleteContact(contact.id)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n <div *ngIf=\"totalRecords === 0 && totalRecordsUnFiltered !== 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage'| transloco\" [description]=\"'Search.NoDataDescription' | transloco\" >\n </pw-no-data>\n </div>\n <span class=\"total-records-count\" *ngIf=\"totalRecords !== 0\">{{ 'Label.Total' | transloco }}: {{ totalRecords }}</span>\n </div>\n <div *ngIf=\"totalRecordsUnFiltered === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.ContactMessage.ContactsAdminMessage' | transloco\">\n </pw-no-data>\n </div>\n </ng-template>\n </li>\n <li [ngbNavItem]=\"3\">\n <a ngbNavLink>Versioning</a>\n <ng-template ngbNavContent>\n <div *ngFor=\"let versioning of accountVersioning\">\n <p>\n <strong>Event: </strong>{{ versioning.event }} |\n <strong>Author: </strong><a *ngIf=\"versioning?.author\"\n [routerLink]=\"['/members', versioning?.author?.slug]\">{{ versioning?.author | ifNameNullShowEmail }}</a>\n | <strong>Created at: </strong>{{ versioning.created_at | dateFormat: 'datetime' }}<br />\n <strong>Object: </strong>{{ versioning.object | json }}\n </p>\n <hr />\n </div>\n <div *ngIf=\"accountVersioning?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.AccountMessage.NoVersionsMessage' | transloco\">\n </pw-no-data>\n </div>\n </ng-template>\n </li>\n <li [ngbNavItem]=\"4\">\n <a ngbNavLink>Files</a>\n <ng-template ngbNavContent>\n <pw-smart-crm-company-files [accountId]=\"accountId\"></pw-smart-crm-company-files>\n </ng-template>\n </li>\n </ul>\n <div [ngbNavOutlet]=\"nav\"></div>\n </div>\n </div>\n </div>\n</div>\n<ng-template #content\n let-modal>\n <div class=\"modal-header\">\n <h3 class=\"modal-title mb-0 p-0\">{{ 'Upload File' | transloco }}</h3>\n <button type=\"button\"\n class=\"btn-close float-end\"\n aria-label=\"Close\"\n (click)=\"modal.dismiss()\">\n\n </button>\n </div>\n <div class=\"modal-body\">\n <small> {{ 'User.Profile.PictureMessage' | transloco }}</small>\n <div class=\"row p-2\">\n <div class=\"col-12\">\n <div class=\"upload-box\">\n <div class=\"upload-box-content\">\n <div class=\"drop-container\"\n ngFileDrop\n [options]=\"options\"\n (uploadOutput)=\"onUploadOutput($event)\"\n [uploadInput]=\"uploadInput\">\n <p>\n Drag files here or\n <label class=\"upload-button\">\n <input type=\"file\"\n ngFileSelect\n [options]=\"options\"\n (uploadOutput)=\"onUploadOutput($event)\"\n [uploadInput]=\"uploadInput\"\n multiple />\n browse\n </label>\n to upload.\n </p>\n </div>\n <div class=\"upload-item\"\n *ngFor=\"let f of files; let i = index\">\n <div class=\"upload-item-content\">\n <div class=\"filename\">\n <div class=\"filename-left\">\n <i class=\"ionicon ion-ios-copy\" aria-hidden=\"true\"></i>\n <span>{{ f.name }}</span>\n </div>\n </div>\n <div class=\"progress-content\">\n <div class=\"progress\">\n <span class=\"bar\"\n [style.width]=\"f?.progress?.data?.percentage + '%'\"\n [class.is-done]=\"f['uploaded']\"></span>\n </div>\n </div>\n <div class=\"progress-text-content\">\n <span class=\"progress-text\"\n [class.is-done]=\"f['uploaded']\">\n <span *ngIf=\"!f['uploaded']\">{{ f.progress?.data?.percentage - 1 }}%\n </span>\n <span *ngIf=\"f['uploaded']\">100 %</span>\n <span *ngIf=\"!f['uploaded']\">Uploading...</span>\n <span *ngIf=\"f['uploaded']\">Done</span>\n </span>\n <span class=\"speed-and-eta-text\"\n *ngIf=\"f.progress?.data?.percentage !== 0 && !f['uploaded']\">\n <span>{{ f.progress?.data?.speedHuman }} </span>\n <span>ETA {{ f.progress?.data?.etaHuman }}</span>\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [":root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255)}.user-info .label{color:#777;font-size:14px;text-transform:capitalize}.user-info .user-value{border:0;border-bottom:1px solid rgb(119,119,119)}.user-info .user-value:focus{box-shadow:none}.user-info .user-value.is-invalid{border-color:#ff586b}.control-btns{display:none}.comment-field{border:0;border-bottom:1px solid rgb(242,242,242);color:#1769e1;display:none;font-size:15px;min-height:100px;padding:2px 5px!important}.comment-field:focus{border:1px solid rgb(23,105,225)!important;border-bottom:0;box-shadow:none}p{max-width:85%;white-space:pre-wrap}.auto-complete{display:none;margin-top:10px}.show-controls .comment-field,.show-controls .auto-complete,.show-controls .control-btns{display:block}.show-controls p,.show-controls .edit-btn,.show-controls .action-owner{display:none}select{appearance:none}textarea{resize:none}.clear-both{clear:both}.isDisabled input[type=text],.isDisabled select{pointer-events:none}.timeline-card.card{min-height:auto}@media (max-width: 768px){.completed-toggle{padding-top:10px}}.when-btn:focus{border:0;box-shadow:none}.no-actions{clear:both}.timeline-container{height:700px;overflow-y:scroll}.action-btn.active{color:#fff!important;background-color:var(--first)}.form-action-buttons{margin-bottom:14px;margin-top:15px}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "component", type: i7.UiSwitchComponent, selector: "ui-switch", inputs: ["size", "color", "switchOffColor", "switchColor", "defaultBgColor", "defaultBoColor", "checkedLabel", "uncheckedLabel", "checkedTextColor", "uncheckedTextColor", "beforeChange", "ariaLabel", "checked", "disabled", "reverse", "loading"], outputs: ["change", "changeEvent", "valueChange"] }, { kind: "directive", type: i8.ButtonBusyDirective, selector: "[buttonBusy]", inputs: ["buttonBusy", "busyText"] }, { kind: "directive", type: i8.LazyImgDirective, selector: "img" }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "contentTemplate", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "popperOptions", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { kind: "directive", type: i3.NgbNavContent, selector: "ng-template[ngbNavContent]" }, { kind: "directive", type: i3.NgbNav, selector: "[ngbNav]", inputs: ["activeId", "animation", "destroyOnHide", "orientation", "roles", "keyboard"], outputs: ["activeIdChange", "shown", "hidden", "navChange"], exportAs: ["ngbNav"] }, { kind: "directive", type: i3.NgbNavItem, selector: "[ngbNavItem]", inputs: ["destroyOnHide", "disabled", "domId", "ngbNavItem"], outputs: ["shown", "hidden"], exportAs: ["ngbNavItem"] }, { kind: "directive", type: i3.NgbNavItemRole, selector: "[ngbNavItem]:not(ng-container)" }, { kind: "directive", type: i3.NgbNavLink, selector: "a[ngbNavLink]" }, { kind: "directive", type: i3.NgbNavLinkBase, selector: "[ngbNavLink]" }, { kind: "component", type: i3.NgbNavOutlet, selector: "[ngbNavOutlet]", inputs: ["paneRole", "ngbNavOutlet"] }, { kind: "directive", type: i3.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i9.NgxGpAutocompleteDirective, selector: "[ngx-gp-autocomplete]", inputs: ["options"], outputs: ["onAddressChange"], exportAs: ["ngx-places"] }, { kind: "directive", type: i10.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i11.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i12.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: i13.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i13.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "component", type: i13.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i14.AutoComplete, selector: "p-autoComplete", inputs: ["minLength", "delay", "style", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "disabled", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "maxlength", "name", "required", "size", "appendTo", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "dropdownAriaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "showClear", "field", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "overlayOptions", "suggestions", "itemSize", "optionLabel", "optionValue", "id", "searchMessage", "emptySelectionMessage", "selectionMessage", "autoOptionFocus", "selectOnFocus", "searchLocale", "optionDisabled", "focusOnHover", "variant"], outputs: ["completeMethod", "onSelect", "onUnselect", "onFocus", "onBlur", "onDropdownClick", "onClear", "onKeyUp", "onShow", "onHide", "onLazyLoad"] }, { kind: "component", type: i15.InputContainerComponent, selector: "pw-input-container", inputs: ["name", "label", "labelClass", "tooltipPosition", "required", "errorMsg", "isReadOnly", "showTooltip", "tooltipText", "showTriangle", "afterLabel", "showAfterLabel", "showTriangleText"] }, { kind: "component", type: i15.NoDataComponent, selector: "pw-no-data", inputs: ["message", "description", "withImage"] }, { kind: "directive", type: i16.NgFileDropDirective, selector: "[ngFileDrop]", inputs: ["options", "uploadInput"], outputs: ["uploadOutput"] }, { kind: "directive", type: i16.NgFileSelectDirective, selector: "[ngFileSelect]", inputs: ["options", "uploadInput"], outputs: ["uploadOutput"] }, { kind: "directive", type: i17.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { kind: "component", type: i18.SmartCrmCompanyFilesComponent, selector: "pw-smart-crm-company-files", inputs: ["accountId", "contactId", "opportunityId"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.JsonPipe, name: "json" }, { kind: "pipe", type: i4.SlicePipe, name: "slice" }, { kind: "pipe", type: i4.DatePipe, name: "date" }, { kind: "pipe", type: i19.DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: i19.TextTruncatePipe, name: "textTruncate" }, { kind: "pipe", type: i19.IfNameNullShowEmailPipe, name: "ifNameNullShowEmail" }, { kind: "pipe", type: i20.TranslocoPipe, name: "transloco" }] }); }
591
- }
592
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartCrmCompanyInfoComponent, decorators: [{
593
- type: Component,
594
- args: [{ selector: 'pw-smart-crm-company-info', template: "<div class=\"row\">\n <div class=\"col-12 mb-0\">\n <div class=\"me-auto mb-0\">\n <h2 class=\"mb-0\">\n <a href=\"javascript:void(0)\"\n (click)=\"back()\"\n class=\"previous\"><i class=\"fa fa-arrow-alt-circle-left\" aria-hidden=\"true\"></i></a>\n Account Info\n </h2>\n </div>\n <a class=\"btn btn-sm btn-outline-primary float-end mb-3\"\n data-cy=\"add-opportunities\"\n (click)=\"navigateToAddOpportunities()\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i>\n {{ 'Crm.OpportunitiesMessage.AddOpportunity' | transloco }}\n </a>\n </div>\n <div class=\"w-100 text-center mt-3\"\n *ngIf=\"!isDataLoaded\">\n <p-progressSpinner> </p-progressSpinner>\n </div>\n <div *ngIf=\"isDataLoaded\">\n <div class=\"row\">\n <div class=\"col-12 col-md-4\">\n <div class=\"user-info p-3 card pb-0 h-auto\">\n <div class=\"mb-2 text-center\">\n <a class=\"profile-image\">\n <img alt=\"Profile Image\"\n width=\"100\"\n height=\"100\"\n [src]=\"getAccountLogo(data?.company_url)\"\n class=\"img-fluid company-logo\"\n onerror=\"this.onerror=null;this.src='assets/img/icons/company.png';\" />\n </a>\n </div>\n <div class=\"mb-4 d-flex justify-content-between align-items-center\">\n <h4 class=\"d-inline-block\">\n About <span *ngIf=\"data?.id\">{{ data.name }}</span>\n </h4>\n <a href=\"javascript:void(0);\"\n *ngIf=\"isFormEdit\"\n class=\"btn btn-sm btn-outline-primary float-end\"\n (click)=\"isFormEdit = !isFormEdit; this.getAllSubscriptionMembers()\">{{ 'Button.Edit' | transloco }}</a>\n </div>\n <form [formGroup]=\"aboutControls\"\n [class.isDisabled]=\"isFormEdit\">\n <div class=\"mb-3\">\n <label class=\"label mb-0\">{{ 'Crm.AccountMessage.Name' | transloco }}</label>\n <input type=\"text\"\n class=\"form-control rounded-0 ps-1 user-value\"\n formControlName=\"name\"\n [ngClass]=\"{ 'is-invalid': submitted && f['name'].errors }\" />\n </div>\n <div class=\"mb-3\">\n <label class=\"label mb-0\">{{\n 'Crm.AccountMessage.Location' | transloco\n }}</label>\n <input ngx-gp-autocomplete\n class=\"form-control rounded-0 ps-1 user-value\"\n #places=\"ngx-places\"\n formControlName=\"location\"\n (onAddressChange)=\"handleAddressChange($event)\"\n [ngClass]=\"{ 'is-invalid': submitted && f['location'].errors }\" />\n </div>\n <div class=\"mb-3\"\n *ngIf=\"countries$ | async as countries\">\n <label>{{ 'Crm.AccountMessage.Country' | transloco\n }}<span class=\"text-danger required-icon\">*</span>\n </label>\n <select class=\"form-select\"\n formControlName=\"country\"\n [ngClass]=\"{ 'is-invalid': submitted && f['country'].errors }\">\n <option *ngFor=\"let country of countries\"\n [value]=\"country.code\">\n {{ country.name }}\n </option>\n </select>\n </div>\n <div class=\"mb-3 ui-fluid skills-modal\">\n <label class=\"label mb-2\">{{ 'Crm.AccountMessage.Owner' | transloco }}</label>\n <p class=\"form-control d-block pb-2 ps-1 user-value\"\n *ngIf=\"isFormEdit && data?.owner_id\">\n {{ data?.owner?.first_name }} {{ data?.owner?.last_name }}\n </p>\n <p-autoComplete *ngIf=\"!isFormEdit || !data?.owner_id\"\n [suggestions]=\"filteredOwner\"\n formControlName=\"owner_id\"\n dataKey=\"id\"\n field=\"first_name\"\n [dropdown]=\"true\"\n (completeMethod)=\"search($event)\"\n styleClass=\"w-100\"\n placeholder=\"Search owner\"\n [multiple]=\"false\">\n </p-autoComplete>\n </div>\n <div class=\"mb-3\">\n <label class=\"label mb-0\">{{\n 'Crm.AccountMessage.CompanyUrl' | transloco\n }}</label>\n <a [href]=\"data?.company_url\"\n target=\"blank\"\n class=\"form-control d-block pb-2 ps-1 user-value\"\n *ngIf=\"isFormEdit && data?.company_url\">{{ data?.company_url }}</a>\n <input *ngIf=\"!isFormEdit || !data?.company_url\"\n type=\"text\"\n class=\"form-control rounded-0 ps-1 user-value\"\n formControlName=\"company_url\"\n [ngClass]=\"{ 'is-invalid': submitted && f['company_url'].errors }\" />\n </div>\n <div class=\"mb-3\"\n *ngIf=\"data?.tel\">\n <label class=\"label mb-0\">{{ 'Crm.AccountMessage.Tel' | transloco }}</label>\n <input type=\"text\"\n class=\"form-control rounded-0 ps-1 user-value\"\n formControlName=\"tel\" />\n </div>\n <div class=\"mb-3\"\n *ngIf=\"organizationTypes$ | async as types\">\n <label>{{ 'Organization.OrganizationType' | transloco }}</label>\n <div class=\"mb-3\">\n <select formControlName=\"organization_type_id\"\n class=\"form-control form-select\"\n [ngClass]=\"{ 'is-invalid': submitted && f['organization_type_id'].errors }\">\n <option *ngFor=\"let option of types['organization_types']\"\n [value]=\"option.id\">\n {{ option.name }}\n </option>\n </select>\n </div>\n </div>\n <div class=\"mb-3\"\n *ngIf=\"organizationIndustries$ | async as industries\">\n <label>{{ 'Organization.OrganizationIndustry' | transloco }}</label>\n <select formControlName=\"organization_industry_id\"\n class=\"form-control form-select\"\n [ngClass]=\"{ 'is-invalid': submitted && f['organization_industry_id'].errors }\">\n <option *ngFor=\"let option of industries['organization_industries']\"\n [value]=\"option.id\">\n {{ option.name }}\n </option>\n </select>\n </div>\n <div class=\"mb-3\"\n *ngIf=\"organizationSizes$ | async as sizes\">\n <label>{{ 'Crm.AccountMessage.Size' | transloco }}</label>\n <select formControlName=\"organization_size_id\"\n class=\"form-control form-select\"\n [ngClass]=\"{ 'is-invalid': submitted && f['organization_size_id'].errors }\">\n <option *ngFor=\"let option of sizes['organization_sizes']\"\n [value]=\"option.id\">\n {{ option.name }}\n </option>\n </select>\n </div>\n <div class=\"mb-3\">\n <label>{{ 'Crm.AccountMessage.Status' | transloco }}</label>\n <select formControlName=\"status\"\n class=\"form-control form-select\"\n [ngClass]=\"{ 'is-invalid': submitted && f['status'].errors }\">\n <option *ngFor=\"let option of status\"\n [value]=\"option\">{{ option }}</option>\n </select>\n </div>\n <div class=\"mb-3\">\n <label>{{ 'Crm.AccountMessage.Priority' | transloco }}</label>\n <select formControlName=\"priority\"\n class=\"form-control form-select\"\n [ngClass]=\"{ 'is-invalid': submitted && f['priority'].errors }\">\n <option *ngFor=\"let option of priority\"\n [value]=\"option\">\n {{ option }}\n </option>\n </select>\n </div>\n <div class=\"mb-3\">\n <label>{{ 'Crm.AccountMessage.Source' | transloco }}</label>\n <select formControlName=\"crm_source_id\"\n class=\"form-control form-select\"\n [ngClass]=\"{ 'is-invalid': submitted && f['crm_source_id'].errors }\">\n <option *ngFor=\"let option of source\"\n [value]=\"option.id\">\n {{ option.name }}\n </option>\n </select>\n </div>\n <div class=\"mb-3\">\n <pw-input-container [label]=\"'Crm.AccountMessage.Description' | transloco\"\n name=\"description\">\n <textarea rows=\"5\"\n type=\"text\"\n class=\"form-control\"\n formControlName=\"description\"\n id=\"description\"\n [ngClass]=\"{ 'is-invalid': submitted && f['description'].errors }\"></textarea>\n </pw-input-container>\n </div>\n <div *ngIf=\"!isFormEdit\"\n class=\"text-end form-action-buttons\">\n <input type=\"button\"\n class=\"btn btn-outline-primary\"\n (click)=\"isFormEdit = !isFormEdit; getAccountDetails()\"\n value=\"Cancel\" />\n <button type=\"submit\"\n [buttonBusy]=\"buttonBusy\"\n class=\"btn btn-primary ms-3\"\n (click)=\"updateAccountInfo()\">\n {{ 'Button.Submit' | transloco }}\n </button>\n </div>\n </form>\n </div>\n </div>\n <div class=\"col-12 col-md-8\">\n <ul ngbNav\n #nav=\"ngbNav\"\n class=\"nav-tabs\">\n <li [ngbNavItem]=\"1\">\n <a ngbNavLink>Notes</a>\n <ng-template ngbNavContent>\n <form [formGroup]=\"actionControls\"\n (ngSubmit)=\"onSave()\">\n <textarea class=\"form-control\"\n formControlName=\"comment\"\n rows=\"6\"></textarea>\n <p class=\"text-danger\"\n *ngIf=\"\n actionControls.get('comment').touched &&\n actionControls.get('comment').invalid\n \">\n Note Required\n </p>\n <div *ngIf=\"actions?.length\"\n class=\"d-block clear-both pt-3\">\n <ng-container *ngFor=\"let action of actions; index as i\">\n <button *ngIf=\"action.visible\"\n type=\"button\"\n [class.active]=\"\"\n class=\"btn btn-sm me-2 btn-outline-primary mb-2 action-btn\"\n (click)=\"showDatePicker($event, action.id); d.toggle()\">\n {{ action.name }}\n </button>\n </ng-container>\n <div class=\"text-danger\"\n *ngIf=\"submitAction && actionControls.get('crm_action_id').invalid\">\n Please select an action\n </div>\n <div class=\"row mt-3\">\n <div class=\"col-12 col-sm-4\">\n <div class=\"input-group\">\n <input class=\"form-control\"\n placeholder=\"dd-mm-yyyy\"\n formControlName=\"when\"\n ngbDatepicker\n #d=\"ngbDatepicker\"\n (click)=\"d.toggle()\" />\n </div>\n </div>\n <div class=\"ui-fluid skills-modal col-sm-4 ps-0\">\n <p-autoComplete [suggestions]=\"filteredContact\"\n formControlName=\"crm_contact_id\"\n dataKey=\"id\"\n field=\"displayName\"\n [dropdown]=\"true\"\n (completeMethod)=\"searchContact($event)\"\n (onSelect)=\"selectContact($event)\"\n (onBlur)=\"OnContactBlur()\"\n styleClass=\"w-100\"\n placeholder=\"Search contact\"\n [multiple]=\"false\"\n (onDropdownClick)=\"onDropdownClick()\">\n </p-autoComplete>\n </div>\n <div class=\"col-sm-4 pe-0 completed-toggle\">\n <div class=\"mb-3\">\n <ui-switch checkedLabel=\"completed\"\n uncheckedLabel=\"open\"\n formControlName=\"completed\"\n name=\"completed\">\n </ui-switch>\n </div>\n </div>\n </div>\n </div>\n <div class=\"float-end\">\n <a class=\"btn btn-outline-primary me-0 me-sm-2\"\n (click)=\"openModal(content)\">{{ 'Upload file' | transloco }}</a>\n <button type=\"submit\"\n [buttonBusy]=\"buttonBusy\"\n [disabled]=\"buttonDisable\"\n class=\"btn btn-primary mt-2 mb-2\">Submit Note</button>\n </div>\n <div *ngIf=\"buttonDisable\"\n class=\"no-actions pt-4\">\n <pw-no-data [withImage]=\"true\" [message]=\"\n 'Crm.AccountMessage.NoActionsInAccountInfoMessage' | transloco\n \">\n </pw-no-data>\n </div>\n </form>\n <div class=\"w-100 text-center mt-3\"\n *ngIf=\"!isLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </div>\n <div *ngIf=\"!accountComments?.length && isLoaded\"\n class=\"no-actions pt-2\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.AccountMessage.NoActionsMessage' | transloco\">\n </pw-no-data>\n </div>\n <div *ngIf=\"accountComments?.length\">\n <div id=\"timeline\"\n class=\"pt-3 clear-both timeline-center timeline-wrapper timeline-container\"\n infiniteScroll\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\"\n [infiniteScrollContainer]=\"selector\"\n [fromRoot]=\"true\"\n (scrolled)=\"onScrollTimeline()\">\n <ul class=\"timeline\">\n <li class=\"timeline-line\"></li>\n </ul>\n <ul class=\"timeline\">\n <li class=\"timeline-line\"></li>\n <li class=\"timeline-item\"\n [ngClass]=\"{ 'mt-5': odd || last }\"\n *ngFor=\"\n let item of accountComments;\n index as i;\n let odd = odd;\n let even = even;\n let last = last;\n let first = first\n \">\n <div class=\"timeline-badge\">\n <span class=\"bg-red bg-lighten-1\">\n <span class=\"timeline-year\">\n <span class=\"d-block date-year\">{{\n item.when | date: 'medium' | slice: 0:3\n }}</span>\n <span>{{ item.year }}</span></span>\n </span>\n </div>\n <div class=\"timeline-card shadow card pb-0 rounded border-grey border-lighten-2 position-static\">\n <div class=\"card-header py-4\">\n <div class=\"mb-0 clearfix\">\n <textarea type=\"text\"\n name=\"comment\"\n class=\"comment-field form-control p-0\"\n [(ngModel)]=\"item.comment\">{{ item.comment }}</textarea>\n <div class=\"auto-complete mb-3 ui-fluid skills-modal\">\n <p-autoComplete [(ngModel)]=\"item.crm_contact\"\n [suggestions]=\"filteredContactComment\"\n dataKey=\" id \"\n field=\"first_name\"\n dropdown=\" true \"\n (completeMethod)=\"\n searchContactInComment($event)\n \"\n (onSelect)=\"selectCommentContact($event)\"\n (onBlur)=\"OnContactBlur()\"\n styleClass=\" w-100 \"\n placeholder=\" Search contact \"\n [multiple]=\"false\"\n (onDropdownClick)=\"onDropdownClick()\">\n </p-autoComplete>\n </div>\n <p class=\"float-start mb-0\"\n *ngIf=\"\n !showFullComment || item.id !== commentId\n \">\n {{ item.comment | slice: 0:170\n }}<a *ngIf=\"item.comment.length > 170\"\n class=\"text-secondary\"\n (click)=\"\n showFullComment = true;\n commentId = item.id\n \">...show more\n </a>\n </p>\n <p class=\"float-start mb-0\"\n *ngIf=\"showFullComment && item.id === commentId\">\n {{ item.comment }}\n <a *ngIf=\"\n item.comment.length > 170 &&\n showFullComment\n \"\n (click)=\"showFullComment = false\"\n class=\"text-secondary\">...show less</a>\n </p>\n <button class=\"btn btn-md edit-btn float-end py-0\"\n (click)=\"showEditControls($event, item)\"\n *ngIf=\"userId === item.owner_id || hasAccess\">\n <i\n class=\"fa fa-edit edit-icon\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n <div class=\"card-subtitle text-muted my-0 clearfix\">\n <div class=\"float-start\">\n <span *ngIf=\"!updating || actionId !== item.id\"\n class=\"font-small-3\">\n {{ item.when }}</span>\n <input *ngIf=\"updating && actionId === item.id\"\n placeholder=\"dd-mm-yyyy\"\n value=\"{{ item.when }}\"\n ngbDatepicker\n #d=\"ngbDatepicker\"\n (focus)=\"d.toggle()\"\n (dateSelect)=\"onDateSelect($event, item)\" />\n </div>\n <button type=\" button\"\n class=\"btn btn-sm float-end when-btn py-0\"\n *ngIf=\"userId === item.owner_id || hasAccess\"\n (click)=\"showDatePickerUpdate(item.id)\">\n <i\n class=\"fa fa-edit edit-icon\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n <p [class.text-danger]=\"!item.color\"\n *ngIf=\"!item.cancelled && !item.completed\"\n class=\"mb-0\">\n {{ item.due }}\n </p>\n <a class=\"text-secondary action-owner\"\n *ngIf=\"item.crm_contact\"\n [routerLink]=\"[\n '/' + subscription?.slug + routers.contactInfo,\n item.crm_contact.id\n ]\">{{ item.crm_contact.first_name }}\n {{ item.crm_contact.last_name || '' }}</a>\n <p>\n By\n {{\n item.owner.first_name +\n ' ' +\n item.owner.last_name\n }}\n </p>\n <span class=\"badge bg-primary\">{{\n item?.crm_action?.name\n }}</span>\n <span *ngIf=\"\n !item.completed &&\n (userId === item.owner_id || hasAccess)\n \"\n class=\"badge bg-success ms-2\">Open</span>\n <a *ngIf=\"\n !item.completed &&\n (userId === item.owner_id || hasAccess)\n \"\n ngbTooltip=\"Set as completed\"\n class=\"me-3 ms-3\"\n href=\"javascript:void(0);\"\n (click)=\"\n setAsCompletedOrUncompleted(\n item.id,\n item,\n item.completed\n )\n \">\n <i\n class=\"fa fa-tasks completed\"\n aria-hidden=\"true\"\n ></i>\n </a>\n <a *ngIf=\"\n !item.cancelled &&\n !item.completed &&\n (userId === item.owner_id || hasAccess)\n \"\n ngbTooltip=\"Set as cancelled\"\n href=\"javascript:void(0);\"\n (click)=\"setAsCancelled(item.id, item)\">\n <i\n class=\"fa fa-times delete-icon\"\n aria-hidden=\"true\"\n ></i>\n </a>\n <a *ngIf=\"\n item.completed &&\n (userId === item.owner_id || hasAccess)\n \"\n ngbTooltip=\"Set as UnCompleted\"\n href=\"javascript:void(0);\"\n (click)=\"\n setAsCompletedOrUncompleted(\n item.id,\n item,\n item.completed\n )\n \"\n class=\"ms-2\">\n <i\n class=\"far fa-window-close\"\n aria-hidden=\"true\"\n ></i>\n </a>\n <div class=\"control-btns mt-3 text-end form-action-buttons\">\n <button type=\"button\"\n class=\"btn btn-sm btn-outline-default me-2\"\n (click)=\"showEditControls(undefined, '')\">\n {{ 'Button.Cancel' | transloco }}\n </button>\n <button class=\"btn btn-sm btn-primary\"\n type=\"button\"\n (click)=\"updateComment(item)\">\n {{ 'Button.Submit' | transloco }}\n </button>\n </div>\n </div>\n </div>\n </li>\n </ul>\n </div>\n </div>\n </ng-template>\n </li>\n <li [ngbNavItem]=\"2\">\n <a ngbNavLink>Contacts</a>\n <ng-template ngbNavContent>\n <div class=\"row\">\n <div class=\"col-12 mb-3\">\n <a class=\"btn btn-sm btn-outline-primary float-end\"\n data-cy=\"add-contact\"\n [routerLink]=\"[\n '/' + subscription?.slug + routers.contactAdd,\n accountId\n ]\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i>\n {{ 'Crm.ContactMessage.AddContact' | transloco }}\n </a>\n </div>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n [class.hideTable]=\"totalRecordsUnFiltered === 0\">\n <p-table class=\"table\"\n #dt\n [value]=\"contacts\"\n [paginator]=\"totalRecords !== 0\"\n [rows]=\"PAGE_SIZE\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"loading\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n [customSort]=\"true\">\n <ng-template pTemplate=\"caption\">\n <div class=\"text-end\">\n <i class=\"fa fa-search mt-2 me-2\" aria-hidden=\"true\"></i>\n <input type=\"text\"\n [(ngModel)]=\"searchText\"\n pInputText\n size=\"50\"\n placeholder=\"Search cosntact...\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\"\n class=\"mw-90\" />\n </div>\n </ng-template>\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\"\n pSortableColumn=\"first_name\">\n {{ 'Label.Name' | transloco }}\n <p-sortIcon field=\"first_name\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"owner_id\">\n {{ 'Crm.ContactMessage.ContactOwner' | transloco }}\n <p-sortIcon field=\"owner_id\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"headline\">\n {{ 'Crm.ContactMessage.Headline' | transloco }}\n <p-sortIcon field=\"headline\"></p-sortIcon>\n </th>\n <th scope=\"true\">{{ 'Label.Actions' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-contact>\n <tr>\n <td data-head=\"Name\"\n class=\"contactname\">\n <a [routerLink]=\"[\n '/' + subscription?.slug + routers.contactInfo,\n contact.id\n ]\">{{\n contact.first_name + ' ' + contact.last_name\n | textTruncate: 20\n }}</a>\n </td>\n <td data-head=\"OwnerName\">\n {{ contact.owner | ifNameNullShowEmail }}\n </td>\n <td data-head=\"Headline\"\n class=\"headline-content\">\n {{ contact?.headline | textTruncate: 20 }}\n </td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline\">\n <li ngbTooltip=\"Show\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"[\n '/' + subscription?.slug + routers.contactInfo,\n contact.id\n ]\">\n <i\n class=\"fa fa-eye see-icon\"\n aria-hidden=\"true\"\n ></i>\n </li>\n <li *ngIf=\"\n hasAccess ||\n contact.owner_id === userId ||\n contact.crm_account.owner_id === userId\n \"\n ngbTooltip=\"Add opportunity\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"[\n '/' +\n subscription?.slug +\n routers.opportunityAdd\n ]\"\n [queryParams]=\"{ contact_id: contact.id }\">\n <i\n class=\"fa fa-plus-circle add-icon\"\n aria-hidden=\"true\"\n ></i>\n </li>\n <li *ngIf=\"\n hasAccess ||\n contact.owner_id === userId ||\n contact.crm_account.owner_id === userId\n \"\n ngbTooltip=\"Edit\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"[\n '/' +\n subscription?.slug +\n routers.contactDetails,\n contact.id\n ]\">\n <i\n class=\"fa fa-edit edit-icon\"\n aria-hidden=\"true\"\n ></i>\n </li>\n <li *ngIf=\"\n hasAccess ||\n contact.owner_id === userId ||\n contact.crm_account.owner_id === userId\n \"\n ngbTooltip=\"Delete\"\n class=\"me-2 me-sm-3\">\n <i\n class=\"fa fa-trash delete-icon\"\n (click)=\"onDeleteContact(contact.id)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n <div *ngIf=\"totalRecords === 0 && totalRecordsUnFiltered !== 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage'| transloco\" [description]=\"'Search.NoDataDescription' | transloco\" >\n </pw-no-data>\n </div>\n <span class=\"total-records-count\" *ngIf=\"totalRecords !== 0\">{{ 'Label.Total' | transloco }}: {{ totalRecords }}</span>\n </div>\n <div *ngIf=\"totalRecordsUnFiltered === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.ContactMessage.ContactsAdminMessage' | transloco\">\n </pw-no-data>\n </div>\n </ng-template>\n </li>\n <li [ngbNavItem]=\"3\">\n <a ngbNavLink>Versioning</a>\n <ng-template ngbNavContent>\n <div *ngFor=\"let versioning of accountVersioning\">\n <p>\n <strong>Event: </strong>{{ versioning.event }} |\n <strong>Author: </strong><a *ngIf=\"versioning?.author\"\n [routerLink]=\"['/members', versioning?.author?.slug]\">{{ versioning?.author | ifNameNullShowEmail }}</a>\n | <strong>Created at: </strong>{{ versioning.created_at | dateFormat: 'datetime' }}<br />\n <strong>Object: </strong>{{ versioning.object | json }}\n </p>\n <hr />\n </div>\n <div *ngIf=\"accountVersioning?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.AccountMessage.NoVersionsMessage' | transloco\">\n </pw-no-data>\n </div>\n </ng-template>\n </li>\n <li [ngbNavItem]=\"4\">\n <a ngbNavLink>Files</a>\n <ng-template ngbNavContent>\n <pw-smart-crm-company-files [accountId]=\"accountId\"></pw-smart-crm-company-files>\n </ng-template>\n </li>\n </ul>\n <div [ngbNavOutlet]=\"nav\"></div>\n </div>\n </div>\n </div>\n</div>\n<ng-template #content\n let-modal>\n <div class=\"modal-header\">\n <h3 class=\"modal-title mb-0 p-0\">{{ 'Upload File' | transloco }}</h3>\n <button type=\"button\"\n class=\"btn-close float-end\"\n aria-label=\"Close\"\n (click)=\"modal.dismiss()\">\n\n </button>\n </div>\n <div class=\"modal-body\">\n <small> {{ 'User.Profile.PictureMessage' | transloco }}</small>\n <div class=\"row p-2\">\n <div class=\"col-12\">\n <div class=\"upload-box\">\n <div class=\"upload-box-content\">\n <div class=\"drop-container\"\n ngFileDrop\n [options]=\"options\"\n (uploadOutput)=\"onUploadOutput($event)\"\n [uploadInput]=\"uploadInput\">\n <p>\n Drag files here or\n <label class=\"upload-button\">\n <input type=\"file\"\n ngFileSelect\n [options]=\"options\"\n (uploadOutput)=\"onUploadOutput($event)\"\n [uploadInput]=\"uploadInput\"\n multiple />\n browse\n </label>\n to upload.\n </p>\n </div>\n <div class=\"upload-item\"\n *ngFor=\"let f of files; let i = index\">\n <div class=\"upload-item-content\">\n <div class=\"filename\">\n <div class=\"filename-left\">\n <i class=\"ionicon ion-ios-copy\" aria-hidden=\"true\"></i>\n <span>{{ f.name }}</span>\n </div>\n </div>\n <div class=\"progress-content\">\n <div class=\"progress\">\n <span class=\"bar\"\n [style.width]=\"f?.progress?.data?.percentage + '%'\"\n [class.is-done]=\"f['uploaded']\"></span>\n </div>\n </div>\n <div class=\"progress-text-content\">\n <span class=\"progress-text\"\n [class.is-done]=\"f['uploaded']\">\n <span *ngIf=\"!f['uploaded']\">{{ f.progress?.data?.percentage - 1 }}%\n </span>\n <span *ngIf=\"f['uploaded']\">100 %</span>\n <span *ngIf=\"!f['uploaded']\">Uploading...</span>\n <span *ngIf=\"f['uploaded']\">Done</span>\n </span>\n <span class=\"speed-and-eta-text\"\n *ngIf=\"f.progress?.data?.percentage !== 0 && !f['uploaded']\">\n <span>{{ f.progress?.data?.speedHuman }} </span>\n <span>ETA {{ f.progress?.data?.etaHuman }}</span>\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [":root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255)}.user-info .label{color:#777;font-size:14px;text-transform:capitalize}.user-info .user-value{border:0;border-bottom:1px solid rgb(119,119,119)}.user-info .user-value:focus{box-shadow:none}.user-info .user-value.is-invalid{border-color:#ff586b}.control-btns{display:none}.comment-field{border:0;border-bottom:1px solid rgb(242,242,242);color:#1769e1;display:none;font-size:15px;min-height:100px;padding:2px 5px!important}.comment-field:focus{border:1px solid rgb(23,105,225)!important;border-bottom:0;box-shadow:none}p{max-width:85%;white-space:pre-wrap}.auto-complete{display:none;margin-top:10px}.show-controls .comment-field,.show-controls .auto-complete,.show-controls .control-btns{display:block}.show-controls p,.show-controls .edit-btn,.show-controls .action-owner{display:none}select{appearance:none}textarea{resize:none}.clear-both{clear:both}.isDisabled input[type=text],.isDisabled select{pointer-events:none}.timeline-card.card{min-height:auto}@media (max-width: 768px){.completed-toggle{padding-top:10px}}.when-btn:focus{border:0;box-shadow:none}.no-actions{clear:both}.timeline-container{height:700px;overflow-y:scroll}.action-btn.active{color:#fff!important;background-color:var(--first)}.form-action-buttons{margin-bottom:14px;margin-top:15px}\n"] }]
595
- }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.CrmService }, { type: i2.SubscriptionService }, { type: i2.GeoService }, { type: i2.CommonService }, { type: i3.NgbModal }, { type: i2.AuthService }, { type: i0.ChangeDetectorRef }, { type: i2.LogoCacheService }, { type: Document, decorators: [{
596
- type: Inject,
597
- args: [DOCUMENT]
598
- }] }] });
599
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtY3JtLWFjY291bnQtaW5mby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NtYXJ0LWNybS9zcmMvbGliL3ByaXZhdGUvY29tcG9uZW50cy9zbWFydC1jcm0tYWNjb3VudHMvc21hcnQtY3JtLWFjY291bnQtaW5mby9zbWFydC1jcm0tYWNjb3VudC1pbmZvLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc21hcnQtY3JtL3NyYy9saWIvcHJpdmF0ZS9jb21wb25lbnRzL3NtYXJ0LWNybS1hY2NvdW50cy9zbWFydC1jcm0tYWNjb3VudC1pbmZvL3NtYXJ0LWNybS1hY2NvdW50LWluZm8uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFFSCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sUUFBUSxFQUdYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBb0IsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sRUFBeUMsWUFBWSxFQUFtQixNQUFNLGNBQWMsQ0FBQztBQUdwRyxPQUFPLElBQUks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Q25FekMsd292Q0FpeEJBOzs0RkQ5c0JhLDRCQUE0QjtrQkFMeEMsU0FBUzsrQkFDSSwyQkFBMkI7OzBCQXlJaEMsTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdDaGVja2VkLFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5qZWN0LFxuICAgIEluamVjdG9yLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVbnR5cGVkRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTmdiTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBDUk1fQUNDT1VOVF9GSUxFU19QQVRIIH0gZnJvbSAnQHBvc2l3aXNlL3NtYXJ0LWNybS1zaGFyZWQnO1xuaW1wb3J0IHsgQXBwU21hcnRDcm0gfSBmcm9tICcuLi8uLi8uLi8uLi9zaGFyZWQvbW9kZWxzL3NtYXJ0LWNybS5tb2RlbCc7XG5pbXBvcnQgeyBST1VURVJTIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkL3JvdXRlcnMvcm91dGVycyc7XG5pbXBvcnQgeyBDcm1TZXJ2aWNlIH0gZnJvbSAnQHBvc2l3aXNlL3NtYXJ0LWNybS1zaGFyZWQnO1xuaW1wb3J0IHsgTG9nb0NhY2hlU2VydmljZSB9IGZyb20gJ0Bwb3Npd2lzZS9jb21tb24tc2VydmljZXMnO1xuaW1wb3J0IHsgVXBsb2FkRmlsZSwgVXBsb2FkSW5wdXQsIFVwbG9hZE91dHB1dCwgVXBsb2FkU3RhdHVzLCBVcGxvYWRlck9wdGlvbnMgfSBmcm9tICduZ3gtdXBsb2FkZXInO1xuaW1wb3J0IHsgTGF6eUxvYWRFdmVudCB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCBzd2FsIGZyb20gJ3N3ZWV0YWxlcnQyJztcblxuaW1wb3J0IHtcbiAgICBET0NVTUVOVF9UWVBFX0VYVCxcbiAgICBQQUdFX1NJWkUsXG4gICAgVE9LRU5fSEVBREVSX0tFWSxcbiAgICBQYWdpbmcsXG4gICAgU3Vic2NyaXB0aW9uLFxuICAgIFVzZXIsXG4gICAgQ291bnRyeVxufSBmcm9tICdAcG9zaXdpc2UvY29tbW9uLXV0aWxpdGllcyc7XG5pbXBvcnQgeyBBcHBCYXNlQ29tcG9uZW50IH0gZnJvbSAnQHBvc2l3aXNlL2FwcC1iYXNlLWNvbXBvbmVudCc7XG5pbXBvcnQge1xuICAgIEF1dGhTZXJ2aWNlLFxuICAgIENvbW1vblNlcnZpY2UsXG4gICAgRm9ybUhlbHBlclNlcnZpY2UsXG4gICAgR2VvU2VydmljZSxcbiAgICBTdWJzY3JpcHRpb25TZXJ2aWNlXG59IGZyb20gJ0Bwb3Npd2lzZS9jb21tb24tc2VydmljZXMnO1xuaW1wb3J0IHsgSGVscGVyU2VydmljZSB9IGZyb20gJ0Bwb3Npd2lzZS9oZWxwZXItc2VydmljZSc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQge1xuICAgIENybU93bmVyLFxuICAgIENybW9wcG9ydHVuaXR5Q29udGFjdCxcbiAgICBGaWx0ZXJlZENybUNvbW1lbnQsXG4gICAgRmlsdGVyZWREYXRhLFxuICAgIE9yZ2FuaXphdGlvbkluZHVzdHJ5LFxuICAgIE9yZ2FuaXphdGlvblNpemUsXG4gICAgT3JnYW5pemF0aW9uVHlwZSxcbiAgICBTbWFydENybUFjdGlvblxufSBmcm9tICdsaWJzL3NtYXJ0LWNybS9zcmMvbGliL3NoYXJlZC9pbnRlcmZhY2Uvc21hcnQtY3JtLW1vZHVsZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ3JtQWNjb3VudCB9IGZyb20gJ2xpYnMvc21hcnQtY3JtL3NyYy9saWIvc2hhcmVkL2ludGVyZmFjZS9jcm0tYWNjb3VudC5pbnRlcmZhY2UnO1xuXG5pbnRlcmZhY2UgU3Vic2NyaXB0aW9uTWVtYmVyIHtcbiAgICBpZDogbnVtYmVyO1xuICAgIGZpcnN0X25hbWU6IHN0cmluZztcbiAgICBsYXN0X25hbWU6IHN0cmluZztcbiAgICBlbWFpbDogc3RyaW5nO1xuICAgIC8vIE90aGVyIHByb3BlcnRpZXMgb2YgU3Vic2NyaXB0aW9uTWVtYmVyXG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncHctc21hcnQtY3JtLWNvbXBhbnktaW5mbycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NtYXJ0LWNybS1hY2NvdW50LWluZm8uY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3NtYXJ0LWNybS1hY2NvdW50LWluZm8uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBTbWFydENybUNvbXBhbnlJbmZvQ29tcG9uZW50XG4gICAgZXh0ZW5kcyBBcHBCYXNlQ29tcG9uZW50XG4gICAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3Q2hlY2tlZFxue1xuICAgIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gICAgYWN0aW9uQ29udHJvbHM6IFVudHlwZWRGb3JtR3JvdXA7XG5cbiAgICBhYm91dENvbnRyb2xzOiBVbnR5cGVkRm9ybUdyb3VwO1xuXG4gICAgYWNjb3VudElkOiBudW1iZXI7XG5cbiAgICB1c2VySWQ6IG51bWJlcjtcblxuICAgIGlzRm9ybUVkaXQgPSB0cnVlO1xuXG4gICAgdXNlcjogVXNlcjtcblxuICAgIGFsbFN1YnNjcmlwdGlvbk1lbWJlcnM6IFN1YnNjcmlwdGlvbk1lbWJlcltdO1xuXG4gICAgZmlsdGVyZWRPd25lcjogU3Vic2NyaXB0aW9uTWVtYmVyW107XG5cbiAgICBkYXRhOiBDcm1BY2NvdW50O1xuXG4gICAgaXNEYXRhTG9hZGVkID0gZmFsc2U7XG5cbiAgICBzdWJtaXR0ZWQgPSBmYWxzZTtcblxuICAgIGFjY291bnRDb21tZW50cyA9IFtdO1xuXG4gICAgaGFzQWNjZXNzID0gZmFsc2U7XG5cbiAgICBib2R5OiBzdHJpbmc7XG5cbiAgICBlZGl0Q29tbWVudCA9IGZhbHNlO1xuXG4gICAgZmlsdGVyZWRDb250YWN0OiB7IGRpc3BsYXlOYW1lOiBzdHJpbmcgfVtdO1xuXG4gICAgcHJpdmF0ZSBpc0NvbnRhY3RWYWxpZCA9IHRydWU7XG5cbiAgICBmaWx0ZXJlZENvbnRhY3RDb21tZW50OiBGaWx0ZXJlZENybUNvbW1lbnRbXTtcblxuICAgIGNvbnRhY3RJZDogbnVtYmVyO1xuXG4gICAgaXNMb2FkZWQgPSBmYWxzZTtcblxuICAgIHRvdGFsUmVjb3JkczogbnVtYmVyO1xuXG4gICAgdG90YWxSZWNvcmRzVW5GaWx0ZXJlZCA9IDA7XG5cbiAgICBsb2FkaW5nID0gdHJ1ZTtcblxuICAgIHNlYXJjaFRleHQgPSAnJztcblxuICAgIHBvdGVudGlhbCA9IFsnbG93JywgJ21lZGl1bScsICdoaWdoJ107XG5cbiAgICBmaWx0ZXJCeVBvdGVudGlhbHM6IHN0cmluZztcblxuICAgIHNob3dGdWxsQ29tbWVudCA9IGZhbHNlO1xuXG4gICAgY29tbWVudElkOiBudW1iZXI7XG5cbiAgICBzdGF0dXM6IHN0cmluZ1tdO1xuXG4gICAgcHJpb3JpdHk6IEZpbHRlcmVkRGF0YVtdO1xuXG4gICAgc291cmNlOiBGaWx0ZXJlZERhdGFbXTtcblxuICAgIG9yZ2FuaXphdGlvblNpemVzJDogT2JzZXJ2YWJsZTxPcmdhbml6YXRpb25TaXplW10+O1xuXG4gICAgb3JnYW5pemF0aW9uSW5kdXN0cmllcyQ6IE9ic2VydmFibGU8T3JnYW5pemF0aW9uSW5kdXN0cnlbXT47XG5cbiAgICBjb3VudHJpZXMkOiBPYnNlcnZhYmxlPENvdW50cnlbXT47XG5cbiAgICBvcmdhbml6YXRpb25UeXBlcyQ6IE9ic2VydmFibGU8T3JnYW5pemF0aW9uVHlwZVtdPjtcblxuICAgIG93bmVyOiBDcm1Pd25lcjtcblxuICAgIGFjdGlvbnM6IFNtYXJ0Q3JtQWN0aW9uW107XG5cbiAgICBidXR0b25EaXNhYmxlOiBib29sZWFuO1xuXG4gICAgaXNEaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgZGFuZ2VyQ29sb3I6IGJvb2xlYW47XG5cbiAgICB1cGRhdGluZyA9IGZhbHNlO1xuXG4gICAgYWN0aW9uSWQ6IG51bWJlcjtcblxuICAgIGFjY291bnRWZXJzaW9uaW5nOiBzdHJpbmdbXTtcblxuICAgIGNvbnRhY3RzOiBDcm1vcHBvcnR1bml0eUNvbnRhY3RbXTtcblxuICAgIG9wdGlvbnM6IFVwbG9hZGVyT3B0aW9ucztcblxuICAgIHVwbG9hZElucHV0OiBFdmVudEVtaXR0ZXI8VXBsb2FkSW5wdXQ+O1xuXG4gICAgZmlsZXM6IFVwbG9hZEZpbGVbXTtcblxuICAgIHRva2VuOiBzdHJpbmc7XG5cbiAgICBkcmFnT3ZlcjogYm9vbGVhbjtcblxuICAgIERvbmU6IGJvb2xlYW47XG5cbiAgICBkaXJlY3Rpb24gPSAnJztcblxuICAgIHByaXZhdGUgcGFnZSA9IDE7XG5cbiAgICBjdXJyZW50UGFnZSA9IDE7XG5cbiAgICBwcml2YXRlIHRvdGFsQ29udGFjdHMgPSAwO1xuXG4gICAgc2VsZWN0b3IgPSAnLnRpbWVsaW5lLWNvbnRhaW5lcic7XG5cbiAgICBzdWJtaXRBY3Rpb24gPSBmYWxzZTtcblxuICAgIHN1YnNjcmlwdGlvbklkOiBudW1iZXI7XG5cbiAgICByb3V0ZXJzID0gUk9VVEVSUztcbiAgICBidXR0b25CdXN5ID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBwcml2YXRlIGNybVNlcnZpY2U6IENybVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgc3Vic2NyaXB0aW9uU2VydmljZTogU3Vic2NyaXB0aW9uU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBnZW9TZXJ2aWNlOiBHZW9TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNvbW1vblNlcnZpY2U6IENvbW1vblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCxcbiAgICAgICAgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSBsb2dvQ2FjaGVTZXJ2aWNlOiBMb2dvQ2FjaGVTZXJ2aWNlLFxuICAgICAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudFxuICAgICkge1xuICAgICAgICBzdXBlcihpbmplY3Rvcik7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHsgY29uY3VycmVuY3k6IDEsIG1heFVwbG9hZHM6IDMgfTtcbiAgICAgICAgdGhpcy51cGxvYWRJbnB1dCA9IG5ldyBFdmVudEVtaXR0ZXI8VXBsb2FkSW5wdXQ+KCk7XG4gICAgICAgIHRoaXMudG9rZW4gPSBidG9hKHRoaXMuYXV0aFNlcnZpY2UuZ2V0VG9rZW4oKSk7XG4gICAgICAgIHRoaXMuZmlsZXMgPSBbXTtcbiAgICAgICAgdGhpcy5hY3Rpb25Db250cm9scyA9IEFwcFNtYXJ0Q3JtLmdldEFjY291bnRBY3Rpb25zRm9ybSh0aGlzLmlzRGlzYWJsZWQpO1xuICAgICAgICB0aGlzLmFib3V0Q29udHJvbHMgPSBBcHBTbWFydENybS5nZXRBY2NvdW50c0Zvcm0oKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5jb3VudHJpZXMkID0gdGhpcy5nZW9TZXJ2aWNlLmdldENvdW50cmllcygpO1xuICAgICAgICB0aGlzLm9yZ2FuaXphdGlvbkluZHVzdHJpZXMkID0gdGhpcy5jb21tb25TZXJ2aWNlLmdldE9yZ2FuaXphdGlvbkluZHVzdHJpZXMoKTtcbiAgICAgICAgdGhpcy5vcmdhbml6YXRpb25UeXBlcyQgPSB0aGlzLmNvbW1vblNlcnZpY2UuZ2V0T3JnYW5pemF0aW9uVHlwZXMoKTtcbiAgICAgICAgdGhpcy5vcmdhbml6YXRpb25TaXplcyQgPSB0aGlzLmNvbW1vblNlcnZpY2UuZ2V0T3JnYW5pemF0aW9uU2l6ZXMoKTtcbiAgICAgICAgdGhpcy51c2VyU3RvcmUoKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXJJZCA9IHJlcy5pZDtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbkNvbnRyb2xzLmdldCgnb3duZXJfaWQnKS5zZXRWYWx1ZShyZXMuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5nZXRVc2VyU3Vic2NyaXB0aW9uKCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gcmVzcG9uc2U7XG4gICAgICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24/LmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYXNBY2Nlc3MgPSB0aGlzLmhhc0FkbWluQWNjZXNzKHRoaXMuc3Vic2NyaXB0aW9uLmlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmdldEFjdGlvbnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFjY291bnREZWZhdWx0VmFsdWVzKHRoaXMuc3Vic2NyaXB0aW9uLmlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFib3V0Q29udHJvbHMuZ2V0KCdzdWJzY3JpcHRpb25faWQnKS5zZXRWYWx1ZSh0aGlzLnN1YnNjcmlwdGlvbj8uaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yb3V0ZS5wYXJhbXMuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjb3VudElkID0gTnVtYmVyKGRhdGFbJ2lkJ10pO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFjY291bnRJZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEFjY291bnREZXRhaWxzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q29udGFjdFZlcnNpb24oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZ2V0QWxsQ29tbWVudHMoKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBvbkxhenlMb2FkKGV2ZW50OiBMYXp5TG9hZEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHBhZ2VEZXRhaWxzID0gSGVscGVyU2VydmljZS5vblRhYmxlTGF6eUxvYWQoZXZlbnQpO1xuICAgICAgICB0aGlzLnBhZ2UgPSBwYWdlRGV0YWlscy5wYWdlO1xuICAgICAgICB0aGlzLmdldEFjY291bnRDb250YWN0cyh7XG4gICAgICAgICAgICBwYWdlOiB0aGlzLnBhZ2UsXG4gICAgICAgICAgICBwYWdlX3NpemU6IFBBR0VfU0laRSxcbiAgICAgICAgICAgIG9yZGVyX2J5OiBwYWdlRGV0YWlscy5zb3J0RmllbGQsXG4gICAgICAgICAgICBvcmRlcl9kaXJlY3Rpb246IHBhZ2VEZXRhaWxzLnNvcnRPcmRlcixcbiAgICAgICAgICAgIHNlYXJjaDogdGhpcy5zZWFyY2hUZXh0XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byBjYWxsIGFjY291bnQgZGVmYXVsdCB2YWx1ZXMgKi9cbiAgICBwcml2YXRlIGFjY291bnREZWZhdWx0VmFsdWVzKGlkKSB7XG4gICAgICAgIHRoaXMuY3JtU2VydmljZS5nZXRDcm1BY2NvdW50RGVmYXVsdFZhbHVlcyhpZCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICAgICAgdGhpcy5wcmlvcml0eSA9IHJlc3BvbnNlLnByaW9yaXR5O1xuICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSByZXNwb25zZS5zb3VyY2U7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byBjYWxsIGFjY291bnQgYnkgSUQgKi9cbiAgICBnZXRBY2NvdW50RGV0YWlscygpIHtcbiAgICAgICAgdGhpcy5pc0RhdGFMb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jcm1TZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0QWNjb3VudERldGFpbCh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsIHRoaXMuYWNjb3VudElkKVxuICAgICAgICAgICAgLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5hYm91dENvbnRyb2xzLnBhdGNoVmFsdWUocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWJvdXRDb250cm9scy5nZXQoJ293bmVyX2lkJykuc2V0VmFsdWUocmVzcG9uc2Uub3duZXIpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5hZGQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNEYXRhTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldCBmKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hYm91dENvbnRyb2xzLmNvbnRyb2xzO1xuICAgIH1cblxuICAgIHVwZGF0ZUFjY291bnRJbmZvKCkge1xuICAgICAgICB0aGlzLmJ1dHRvbkJ1c3kgPSB0cnVlO1xuICAgICAgICBpZiAoIXRoaXMuYWJvdXRDb250cm9scy52YWxpZCkge1xuICAgICAgICAgICAgdGhpcy5idXR0b25CdXN5ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdHRlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFib3V0Q29udHJvbHNcbiAgICAgICAgICAgICAgICAuZ2V0KCdvd25lcl9pZCcpXG4gICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMuYWJvdXRDb250cm9scy5nZXQoJ293bmVyX2lkJykudmFsdWUuaWQpO1xuICAgICAgICAgICAgdGhpcy5jcm1TZXJ2aWNlXG4gICAgICAgICAgICAgICAgLnVwZGF0ZUFjY291bnQodGhpcy5zdWJzY3JpcHRpb24/LmlkLCB0aGlzLmFjY291bnRJZCwgdGhpcy5hYm91dENvbnRyb2xzLnZhbHVlKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0LnN1Y2Nlc3MoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zbGF0aW9uLnRyYW5zbGF0ZSgnQ3JtLkFjY291bnRNZXNzYWdlLlVwZGF0ZWRNZXNzYWdlJylcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0Zvcm1FZGl0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBY2NvdW50RGV0YWlscygpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmFkZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnV0dG9uQnVzeSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdHRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25TY3JvbGxUaW1lbGluZSgpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZSsrO1xuICAgICAgICBjb25zdCB0b3RhbFBhZ2VzID0gTWF0aC5jZWlsKHRoaXMudG90YWxDb250YWN0cyAvIDUpO1xuICAgICAgICAvLyBQcmV2ZW50IEFQSSBjYWxsIGlmIGFsbCBtZXNzYWdlcyBoYXZlIGJlZW4gZmV0Y2hlZFxuICAgICAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA8PSB0b3RhbFBhZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLmdldEFsbENvbW1lbnRzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gc2F2ZSBjb21tZW50ICovXG4gICAgb25TYXZlKCkge1xuICAgICAgICB0aGlzLnN1Ym1pdEFjdGlvbiA9IHRydWU7XG4gICAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLmFjdGlvbkNvbnRyb2xzLnZhbHVlO1xuICAgICAgICBmb3JtLm93bmVyX2lkID0gdGhpcy5kYXRhPy5vd25lcl9pZDtcbiAgICAgICAgZm9ybS5jcm1fYWNjb3VudF9pZCA9IHRoaXMuYWNjb3VudElkO1xuICAgICAgICBmb3JtLmNybV9jb250YWN0X2lkID0gZm9ybT8uY3JtX2NvbnRhY3RfaWQ/LmlkO1xuICAgICAgICBmb3JtLndoZW4gPSBIZWxwZXJTZXJ2aWNlLmRhdGVGb3JtYXQoZm9ybS53aGVuKTtcbiAgICAgICAgaWYgKHRoaXMuYWN0aW9uQ29udHJvbHMuaW52YWxpZCkge1xuICAgICAgICAgICAgRm9ybUhlbHBlclNlcnZpY2UudmFsaWRhdGVBbGxGb3JtRmllbGRzKHRoaXMuYWN0aW9uQ29udHJvbHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5idXR0b25CdXN5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgICAgIC5wb3N0QWNjb3VudENvbW1lbnQodGhpcy5zdWJzY3JpcHRpb24/LmlkLCBmb3JtKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbkNvbnRyb2xzLmdldCgnY29tbWVudCcpLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0QWxsQ29tbWVudHMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdC5zdWNjZXNzKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGlvbi50cmFuc2xhdGUoJ0NybS5BY2NvdW50TWVzc2FnZS5Db21tZW50U3VibWl0dGVkTWVzc2FnZScpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuYWRkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRBY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idXR0b25CdXN5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzaG93RGF0ZVBpY2tlcihldmVudCwgaWQpIHtcbiAgICAgICAgdGhpcy5hY3Rpb25Db250cm9scy5nZXQoJ3doZW4nKS5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSk7XG4gICAgICAgIGNvbnN0IGFjdGlvbkJ1dHRvbnMgPSB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2FjdGlvbi1idG4nKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhY3Rpb25CdXR0b25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhY3Rpb25CdXR0b25zW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgICAgICB9XG4gICAgICAgIGV2ZW50LnRhcmdldC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgICAgdGhpcy5hY3Rpb25Db250cm9scy5nZXQoJ2NybV9hY3Rpb25faWQnKS5zZXRWYWx1ZShpZCk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGdldCBjb21tZW50cyAqL1xuICAgIHByaXZhdGUgZ2V0QWxsQ29tbWVudHMoKSB7XG4gICAgICAgIHRoaXMuZ2V0VXNlclN1YnNjcmlwdGlvbklkKCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSWQgPSByZXNwb25zZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbklkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcm1TZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgIC5nZXRBY2NvdW50Q29tbWVudHModGhpcy5hY2NvdW50SWQsIHRoaXMuc3Vic2NyaXB0aW9uSWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IHRoaXMuY3VycmVudFBhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlX3NpemU6IDVcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZShyZXNwID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG90YWxDb250YWN0cyA9IHJlc3Aub2JqZWN0X2NvdW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3A/LmNybV9hY2NvdW50X2FjdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY2NvdW50Q29tbWVudHMubWFwKGNvbW1lbnQgPT4gY29tbWVudC5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY2NvdW50Q29tbWVudHMgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuYWNjb3VudENvbW1lbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yZXNwLmNybV9hY2NvdW50X2FjdGlvbnMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9PiAhZXhpc3RpbmdJZHMuaGFzKGNvbW1lbnQuaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY2NvdW50Q29tbWVudHMuZm9yRWFjaChkYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS53aGVuX3Nob3J0X2RhdGUgPSBtb21lbnQoZGF0YS53aGVuKS5mb3JtYXQoJ0RELU1NTS1ZWVlZJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpZmYgPSBtb21lbnQobmV3IERhdGUoZGF0YS53aGVuKSkuZGlmZihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbWVudChuZXcgRGF0ZSgpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkYXlzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9tZW50KG5ldyBEYXRlKGRhdGEud2hlbikpIDwgbW9tZW50KG5ldyBEYXRlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWydkdWUnXSA9IGBPdmVyZHVlIGJ5ICR7TWF0aC5hYnMoZGlmZil9IGRheXNgO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVsnY29sb3InXSA9IHRoaXMuZGFuZ2VyQ29sb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWydkdWUnXSA9IGBJbiAke2RpZmZ9IGRheXNgO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVsnY29sb3InXSA9ICF0aGlzLmRhbmdlckNvbG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjY291bnRDb21tZW50cy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShhLndoZW4pLmdldFRpbWUoKSAtIG5ldyBEYXRlKGIud2hlbikuZ2V0VGltZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWNjb3VudENvbW1lbnRzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1bJ3doZW4nXSA9IG1vbWVudChpdGVtWyd3aGVuJ10pLmZvcm1hdCgnREQtTU1NLVlZWVknKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVsneWVhciddID0gbW9tZW50KGl0ZW1bJ3doZW4nXSkuZm9ybWF0KCdZWVlZJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1bJ21vbnRoJ10gPSBtb21lbnQoaXRlbVsnd2hlbiddKS5mb3JtYXQoJ01NJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcGxldGVkQ2FuY2VsbGVkQWN0aW9uczogc3RyaW5nW10gPSB0aGlzLmFjY291bnRDb21tZW50cy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9PiBhY3Rpb24uY29tcGxldGVkID09PSB0cnVlIHx8IGFjdGlvbi5jYW5jZWxsZWQgPT09IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZENhbmNlbGxlZEFjdGlvbnMucmV2ZXJzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vdENvbXBsZXRlZENhbmNlbGxlZEFjdGlvbnM6IHN0cmluZ1tdID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY2NvdW50Q29tbWVudHMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLmNvbXBsZXRlZCA9PT0gZmFsc2UgJiYgYWN0aW9uLmNhbmNlbGxlZCA9PT0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjY291bnRDb21tZW50cyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdENvbXBsZXRlZENhbmNlbGxlZEFjdGlvbnMuY29uY2F0KGNvbXBsZXRlZENhbmNlbGxlZEFjdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byB1cGRhdGUgY29tbWVudCAqL1xuICAgIHVwZGF0ZUNvbW1lbnQoaXRlbSkge1xuICAgICAgICBjb25zdCBjb21tZW50T2JqID0ge1xuICAgICAgICAgICAgY29tbWVudDogaXRlbS5jb21tZW50LFxuICAgICAgICAgICAgY29tcGxldGVkOiBpdGVtLmNvbXBsZXRlZCxcbiAgICAgICAgICAgIGNhbmNlbGxlZDogaXRlbS5jYW5jZWxsZWQsXG4gICAgICAgICAgICBjcm1fYWNjb3VudF9pZDogaXRlbS5jcm1fYWNjb3VudF9pZCxcbiAgICAgICAgICAgIGNybV9jb250YWN0X2lkOiB0aGlzLmNvbnRhY3RJZFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNybVNlcnZpY2VcbiAgICAgICAgICAgIC51cGRhdGVBY2NvdW50Q29tbWVudCh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsIGl0ZW0uaWQsIGNvbW1lbnRPYmopXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0LnN1Y2Nlc3MoJ2NvbW1lbnQgdXBkYXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dFZGl0Q29udHJvbHModW5kZWZpbmVkLCAnJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRBbGxDb21tZW50cygpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGV4ZWN1dGUgb24gbG9jYXRpb24gc2VsZWN0ICovXG4gICAgaGFuZGxlQWRkcmVzc0NoYW5nZShldmVudCkge1xuICAgICAgICB0aGlzLmFib3V0Q29udHJvbHMuZ2V0KCdsb2NhdGlvbicpLnNldFZhbHVlKGV2ZW50LmZvcm1hdHRlZF9hZGRyZXNzKTtcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gZ2V0IHN1YnNjcmlwdGlvbiBtZW1iZXJzICovXG4gICAgZ2V0QWxsU3Vic2NyaXB0aW9uTWVtYmVycygpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25TZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0RW5yb2xsZWRTdWJzY3JpcHRpb24odGhpcy5zdWJzY3JpcHRpb24/LmlkKVxuICAgICAgICAgICAgLnN1YnNjcmliZShtZW1iZXIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWxsU3Vic2NyaXB0aW9uTWVtYmVycyA9IG1lbWJlci5tZW1iZXJzO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIHNob3cgZWRpdCBjb21tZW50IHNlY3Rpb24gKi9cbiAgICBzaG93RWRpdENvbnRyb2xzKGV2ZW50LCBhY3Rpb24pIHtcbiAgICAgICAgaWYgKGFjdGlvbiAmJiBhY3Rpb24uY3JtX2NvbnRhY3QpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGFjdElkID0gYWN0aW9uLmNybV9jb250YWN0LmlkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbW1lbnRzID0gdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjYXJkLWhlYWRlcicpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb21tZW50c1tpXS5jbGFzc0xpc3QucmVtb3ZlKCdzaG93LWNvbnRyb2xzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGV2ZW50LnRhcmdldC5jbG9zZXN0KCcuY2FyZC1oZWFkZXInKS5jbGFzc0xpc3QuYWRkKCdzaG93LWNvbnRyb2xzJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gZ2V0IGFuZCBzaG93IGFsbCB0aGUgYWN0aW9ucyAqL1xuICAgIGdldEFjdGlvbnMoKSB7XG4gICAgICAgIHRoaXMuY3JtU2VydmljZS5nZXRBY3Rpb25zQnlTdWJzY3JpcHRpb25JZCh0aGlzLnN1YnNjcmlwdGlvbj8uaWQpLnN1YnNjcmliZShyZXNwID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwPy5jcm1fYWN0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25zID0gcmVzcC5jcm1fYWN0aW9ucztcbiAgICAgICAgICAgICAgICB0aGlzLmJ1dHRvbkRpc2FibGUgPSB0aGlzLmFjdGlvbnMuZXZlcnkoXG4gICAgICAgICAgICAgICAgICAgIHggPT4geC52aXNpYmxlID09PSBmYWxzZSB8fCB4LnZpc2libGUgPT09IG51bGxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1dHRvbkRpc2FibGUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5oYXNBY2Nlc3MgPSB0aGlzLmhhc0FkbWluQWNjZXNzKHRoaXMuc3Vic2NyaXB0aW9uPy5pZCk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIHNldCB0aGUgYWN0aW9uIGFzIGNvbXBsZXRlZCAqL1xuICAgIHNldEFzQ29tcGxldGVkT3JVbmNvbXBsZXRlZChpZDogbnVtYmVyLCBhY3Rpb24sIGNvbXBsZXRlZE9yVW5jb21wbGV0ZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgYWxlcnRUaXRsZSA9IGNvbXBsZXRlZE9yVW5jb21wbGV0ZWQgPyAnSW5Db21wbGV0ZWQnIDogJ0NvbXBsZXRlZCc7XG5cbiAgICAgICAgcmV0dXJuIHN3YWxcbiAgICAgICAgICAgIC5maXJlKHtcbiAgICAgICAgICAgICAgICB0aXRsZTogYWxlcnRUaXRsZSxcbiAgICAgICAgICAgICAgICBodG1sOiBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHNldCBhcyAke2FsZXJ0VGl0bGV9P2AsXG4gICAgICAgICAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICByZXZlcnNlQnV0dG9uczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpY29uOiAnd2FybmluZydcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0aW9uT2JqID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudDogYWN0aW9uLmNvbW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQ6ICFjb21wbGV0ZWRPclVuY29tcGxldGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGVkOiBhY3Rpb24uY2FuY2VsbGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3JtX2FjY291bnRfaWQ6IGFjdGlvbi5jcm1fYWNjb3VudF9pZFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNybVNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC51cGRhdGVBY2NvdW50Q29tbWVudCh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsIGlkLCBhY3Rpb25PYmopXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0LnN1Y2Nlc3MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNsYXRpb24udHJhbnNsYXRlKCdDcm0uU2V0dGluZ3MuVXBkYXRlZE1lc3NhZ2UnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25zLnNwbGljZShhY3Rpb24sIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0QWN0aW9ucygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0QWxsQ29tbWVudHMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byBzZXQgdGhlIGFjdGlvbiBhcyBjYW5jZWxsZWQgKi9cbiAgICBzZXRBc0NhbmNlbGxlZChpZDogbnVtYmVyLCBhY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHN3YWxcbiAgICAgICAgICAgIC5maXJlKHtcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0NhbmNlbCcsXG4gICAgICAgICAgICAgICAgaHRtbDogYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBzZXQgYXMgY2FuY2VsbGVkP2AsXG4gICAgICAgICAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICByZXZlcnNlQnV0dG9uczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpY29uOiAnd2FybmluZydcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0aW9uT2JqID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudDogYWN0aW9uLmNvbW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQ6IGFjdGlvbi5jb21wbGV0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjcm1fYWNjb3VudF9pZDogYWN0aW9uLmNybV9hY2NvdW50X2lkXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAgICAgLnVwZGF0ZUFjY291bnRDb21tZW50KHRoaXMuc3Vic2NyaXB0aW9uPy5pZCwgaWQsIGFjdGlvbk9iailcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGlvbi50cmFuc2xhdGUoJ0NybS5TZXR0aW5ncy5VcGRhdGVkTWVzc2FnZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMuc3BsaWNlKGFjdGlvbiwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBY3Rpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBbGxDb21tZW50cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgZGF0ZSAqL1xuICAgIG9uRGF0ZVNlbGVjdChldmVudCwgYWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGNvbW1lbnRPYmogPSB7XG4gICAgICAgICAgICB3aGVuOiBIZWxwZXJTZXJ2aWNlLmRhdGVGb3JtYXQoZXZlbnQpLFxuICAgICAgICAgICAgY29tbWVudDogYWN0aW9uLmNvbW1lbnQsXG4gICAgICAgICAgICBjb21wbGV0ZWQ6IGFjdGlvbi5jb21wbGV0ZWQsXG4gICAgICAgICAgICBjYW5jZWxsZWQ6IGFjdGlvbi5jYW5jZWxsZWQsXG4gICAgICAgICAgICBjcm1fYWNjb3VudF9pZDogYWN0aW9uLmNybV9hY2NvdW50X2lkXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgLnVwZGF0ZUFjY291bnRDb21tZW50KHRoaXMuc3Vic2NyaXB0aW9uPy5pZCwgYWN0aW9uLmlkLCBjb21tZW50T2JqKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdC5zdWNjZXNzKCdkYXRlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRBbGxDb21tZW50cygpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byBzaG93IERhdGVQaWNrZXIgKi9cbiAgICBzaG93RGF0ZVBpY2tlclVwZGF0ZShhY3Rpb25JZCkge1xuICAgICAgICB0aGlzLnVwZGF0aW5nID0gIXRoaXMudXBkYXRpbmc7XG4gICAgICAgIHRoaXMuYWN0aW9uSWQgPSBhY3Rpb25JZDtcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gZ2V0IHRoZSBjb250YWN0cyByZWxhdGVkIHRvIGFjY291bnQgKi9cbiAgICBwcml2YXRlIGdldEFjY291bnRDb250YWN0cyhwYWdpbmc6IFBhZ2luZykge1xuICAgICAgICB0aGlzLmdldFVzZXJTdWJzY3JpcHRpb25JZCgpLnN1YnNjcmliZShpZCA9PiB7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbklkID0gaWQ7XG4gICAgICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25JZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAuZ2V0QWNjb3VudENvbnRhY3RzKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY2NvdW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJCeVBvdGVudGlhbHMgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdpbmdcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5jb250YWN0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFjdHMgPSByZXNwb25zZS5jb250YWN0cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvdGFsUmVjb3JkcyA9IHJlc3BvbnNlLm9iamVjdF9jb3VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvdGFsUmVjb3Jkc1VuRmlsdGVyZWQgPSByZXNwb25zZS51bmZpbHRlcmVkX2NvdW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFjdHMuZm9yRWFjaChtZW1iZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXIuZGlzcGxheU5hbWUgPSBgJHttZW1iZXIuZmlyc3RfbmFtZSB8fCAnJ30gJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlci5sYXN0X25hbWUgfHwgJydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAtICR7bWVtYmVyLmVtYWlsfWAudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuYWRkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHdoZW4gYXV0by1jb21wbGV0ZSBkcm9wZG93biBzZWxlY3RlZCAqL1xuICAgIG9uRHJvcGRvd25DbGljaygpIHtcbiAgICAgICAgaWYgKHRoaXMuY29udGFjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkQ29udGFjdCA9IFt7IGRpc3BsYXlOYW1lOiAnTm8gY29udGFjdCB0byBjaG9vc2UnIH1dO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZENvbnRhY3RDb21tZW50ID0gW3sgZmlyc3RfbmFtZTogJ05vIGNvbnRhY3QgdG8gY2hvb3NlJyB9XTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBzZWFyY2ggb3duZXIgKi9cbiAgICBzZWFyY2goZXZlbnQpIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gW107XG4gICAgICAgIGlmIChldmVudC5xdWVyeSkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZE93bmVyID0gdGhpcy5hbGxTdWJzY3JpcHRpb25NZW1iZXJzLmZpbHRlcigoeDogU3Vic2NyaXB0aW9uTWVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHguZmlyc3RfbmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGV2ZW50LnF1ZXJ5LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFsbFN1YnNjcmlwdGlvbk1lbWJlcnMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlsdGVyZWRPd25lciA9IHZhbHVlcztcbiAgICB9XG5cbiAgICBzZWFyY2hDb250YWN0KGV2ZW50KSB7XG4gICAgICAgIHRoaXMuaXNDb250YWN0VmFsaWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IHZhbHVlcyA9IFtdO1xuICAgICAgICBpZiAoZXZlbnQucXVlcnkpIHtcbiAgICAgICAgICAgIHZhbHVlcyA9IHRoaXMuY29udGFjdHMuZmlsdGVyKCh4OiBDcm1vcHBvcnR1bml0eUNvbnRhY3QpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4geC5kaXNwbGF5TmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGV2ZW50LnF1ZXJ5LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRhY3RzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgdmFsdWVzLnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbHRlcmVkQ29udGFjdCA9IHZhbHVlcztcbiAgICB9XG5cbiAgICBzZWxlY3RDb250YWN0KGV2ZW50KSB7XG4gICAgICAgIHRoaXMuaXNDb250YWN0VmFsaWQgPSB0aGlzLmNvbnRhY3RzLnNvbWUoeCA9PiB4LmlkID09PSBldmVudC5pZCk7XG4gICAgfVxuXG4gICAgT25Db250YWN0Qmx1cigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzQ29udGFjdFZhbGlkKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGlvbkNvbnRyb2xzLmdldCgnY3JtX2NvbnRhY3RfaWQnKS5zZXRWYWx1ZSgnJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZWFyY2hDb250YWN0SW5Db21tZW50KGV2ZW50KSB7XG4gICAgICAgIGxldCB2YWx1ZXMgPSBbXTtcbiAgICAgICAgaWYgKGV2ZW50LnF1ZXJ5KSB7XG4gICAgICAgICAgICB2YWx1ZXMgPSB0aGlzLmNvbnRhY3RzLmZpbHRlcigoeDogQ3Jtb3Bwb3J0dW5pdHlDb250YWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHguZGlzcGxheU5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhldmVudC5xdWVyeS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb250YWN0cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maWx0ZXJlZENvbnRhY3RDb21tZW50ID0gdmFsdWVzO1xuICAgIH1cblxuICAgIHNlbGVjdENvbW1lbnRDb250YWN0KGV2ZW50KSB7XG4gICAgICAgIHRoaXMuY29udGFjdElkID0gZXZlbnQuaWQ7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGRlbGV0ZSBjb250YWN0ICovXG4gICAgb25EZWxldGVDb250YWN0KGlkOiBudW1iZXIpIHtcbiAgICAgICAgSGVscGVyU2VydmljZS5yYWlzZURlbGV0ZVBvcHVwKCkudGhlbihyZXNwID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcm1TZXJ2aWNlLmRlbGV0ZUNvbnRhY3QodGhpcy5zdWJzY3JpcHRpb24/LmlkLCBpZCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdC5zdWNjZXNzKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGlvbi50cmFuc2xhdGUoJ0NybS5Db250YWN0TWVzc2FnZS5EZWxldGVkTWVzc2FnZScpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0QWNjb3VudENvbnRhY3RzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IHRoaXMucGFnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2Vfc2l6ZTogUEFHRV9TSVpFXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gZ2V0IGNvbnRhY3QgdmVyc2lvbnMgKi9cbiAgICBwcml2YXRlIGdldENvbnRhY3RWZXJzaW9uKCkge1xuICAgICAgICB0aGlzLmNybVNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRDb250YWN0VmVyc2lvbih0aGlzLnN1YnNjcmlwdGlvbj8uaWQsIHRoaXMuYWNjb3VudElkLCAnQ3JtQWNjb3VudCcpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjY291bnRWZXJzaW9uaW5nID0gcmVzcG9uc2UudmVyc2lvbnM7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvcGVuTW9kYWwoY29udGVudCkge1xuICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKGNvbnRlbnQsIHsgY2VudGVyZWQ6IHRydWUsIHdpbmRvd0NsYXNzOiAnbW9kYWwtaG9sZGVyJyB9KTtcbiAgICB9XG5cbiAgICBvbkNsb3NlKCkge1xuICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5kaXNtaXNzQWxsKCk7XG4gICAgfVxuXG4gICAgb25VcGxvYWRPdXRwdXQob3V0cHV0OiBVcGxvYWRPdXRwdXQpOiB2b2lkIHtcbiAgICAgICAgc3dpdGNoIChvdXRwdXQudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnYWxsQWRkZWRUb1F1ZXVlJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50OiBVcGxvYWRJbnB1dCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd1cGxvYWRBbGwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBDUk1fQUNDT1VOVF9GSUxFU19QQVRILFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJfaWQ6IGAke3RoaXMudXNlcklkfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JtX2FjY291bnRfaWQ6IGAke3RoaXMuYWNjb3VudElkfWBcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW1RPS0VOX0hFQURFUl9LRVldOiB0aGlzLnRva2VuXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkSW5wdXQuZW1pdChldmVudCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdhZGRlZFRvUXVldWUnOlxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3V0cHV0LmZpbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dCA9IG91dHB1dC5maWxlLm5hbWUuc3BsaXQoJy4nKS5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKERPQ1VNRU5UX1RZUEVfRVhULmluY2x1ZGVzKGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZXMucHVzaChvdXRwdXQuZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0LmVycm9yKCdmaWxlIGZvcm1hdHMgaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3VwbG9hZGluZyc6XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvdXRwdXQuZmlsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmZpbGVzLmZpbmRJbmRleChcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPT4gdHlwZW9mIG91dHB1dC5maWxlICE9PSAndW5kZWZpbmVkJyAmJiBmaWxlLmlkID09PSBvdXRwdXQuZmlsZS5pZFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVzW2luZGV4XSA9IG91dHB1dC5maWxlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3JlbW92ZWQnOlxuICAgICAgICAgICAgICAgIHRoaXMuZmlsZXMgPSB0aGlzLmZpbGVzLmZpbHRlcigoZmlsZTogVXBsb2FkRmlsZSkgPT4gZmlsZSAhPT0gb3V0cHV0LmZpbGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZHJhZ092ZXInOlxuICAgICAgICAgICAgICAgIHRoaXMuZHJhZ092ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZHJhZ091dCc6XG4gICAgICAgICAgICBjYXNlICdkcm9wJzpcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdPdmVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkb25lJzpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICAgICAgICBpZiAoZmlsZS5wcm9ncmVzcy5zdGF0dXMgPT09IFVwbG9hZFN0YXR1cy5Eb25lKSB7XG4gICAgICAgICAgICAgICAgZmlsZVsndXBsb2FkZWQnXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyB3YWl0IGZvciA1MDBtcyBiZWZvcmUgZmlsdGVyIGZpbGVzXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5maWxlcyA9IHRoaXMuZmlsZXMuZmlsdGVyKGZpbGUgPT4gZmlsZS5wcm9ncmVzcy5zdGF0dXMgIT09IFVwbG9hZFN0YXR1cy5Eb25lKTtcbiAgICAgICAgfSwgNTAwKTtcbiAgICB9XG5cbiAgICBnZXRBY2NvdW50TG9nbyh1cmw6IHN0cmluZykge1xuICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2dvQ2FjaGVTZXJ2aWNlLmdldExvZ28oXG4gICAgICAgICAgICAgICAgYGh0dHBzOi8vbG9nby5jbGVhcmJpdC5jb20vJHt1cmw/LnNwbGl0KCcuJylbMV19LiR7XG4gICAgICAgICAgICAgICAgICAgIHVybD8uc3BsaXQoJy4nKVsyXT8uc3BsaXQoJy8nKVswXVxuICAgICAgICAgICAgICAgIH1gXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIG5hdmlnYXRlVG9BZGRPcHBvcnR1bml0aWVzKCkge1xuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYC8ke3RoaXMuc3Vic2NyaXB0aW9uPy5zbHVnfSR7dGhpcy5yb3V0ZXJzLm9wcG9ydHVuaXR5QWRkfWBdLCB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtczogeyBhY2NvdW50X2lkOiB0aGlzLmFjY291bnRJZCB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIG5nT25EZXN0cm95KCkge1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi0wXCI+XG4gICAgPGRpdiBjbGFzcz1cIm1lLWF1dG8gbWItMFwiPlxuICAgICAgPGgyIGNsYXNzPVwibWItMFwiPlxuICAgICAgICA8YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCJcbiAgICAgICAgICAoY2xpY2spPVwiYmFjaygpXCJcbiAgICAgICAgICBjbGFzcz1cInByZXZpb3VzXCI+PGkgY2xhc3M9XCJmYSBmYS1hcnJvdy1hbHQtY2lyY2xlLWxlZnRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9hPlxuICAgICAgICBBY2NvdW50IEluZm9cbiAgICAgIDwvaDI+XG4gICAgPC9kaXY+XG4gICAgPGEgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXByaW1hcnkgZmxvYXQtZW5kIG1iLTNcIlxuICAgICAgZGF0YS1jeT1cImFkZC1vcHBvcnR1bml0aWVzXCJcbiAgICAgIChjbGljayk9XCJuYXZpZ2F0ZVRvQWRkT3Bwb3J0dW5pdGllcygpXCI+XG4gICAgICA8aSBjbGFzcz1cImZhIGZhLXBsdXMtY2lyY2xlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAge3sgJ0NybS5PcHBvcnR1bml0aWVzTWVzc2FnZS5BZGRPcHBvcnR1bml0eScgfCB0cmFuc2xvY28gfX1cbiAgICA8L2E+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwidy0xMDAgdGV4dC1jZW50ZXIgbXQtM1wiXG4gICpuZ0lmPVwiIWlzRGF0YUxvYWRlZFwiPlxuICA8cC1wcm9ncmVzc1NwaW5uZXI+IDwvcC1wcm9ncmVzc1NwaW5uZXI+XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwiaXNEYXRhTG9hZGVkXCI+XG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidXNlci1pbmZvIHAtMyBjYXJkIHBiLTAgaC1hdXRvXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTIgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxhIGNsYXNzPVwicHJvZmlsZS1pbWFnZVwiPlxuICAgICAgICAgICAgICA8aW1nIGFsdD1cIlByb2ZpbGUgSW1hZ2VcIlxuICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwXCJcbiAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxMDBcIlxuICAgICAgICAgICAgICAgIFtzcmNdPVwiZ2V0QWNjb3VudExvZ28oZGF0YT8uY29tcGFueV91cmwpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImltZy1mbHVpZCBjb21wYW55LWxvZ29cIlxuICAgICAgICAgICAgICAgIG9uZXJyb3I9XCJ0aGlzLm9uZXJyb3I9bnVsbDt0aGlzLnNyYz0nYXNzZXRzL2ltZy9pY29ucy9jb21wYW55LnBuZyc7XCIgLz5cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNCBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8aDQgY2xhc3M9XCJkLWlubGluZS1ibG9ja1wiPlxuICAgICAgICAgICAgICBBYm91dCA8c3BhbiAqbmdJZj1cImRhdGE/LmlkXCI+e3sgZGF0YS5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9oND5cbiAgICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMCk7XCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc0Zvcm1FZGl0XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXByaW1hcnkgZmxvYXQtZW5kXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImlzRm9ybUVkaXQgPSAhaXNGb3JtRWRpdDsgdGhpcy5nZXRBbGxTdWJzY3JpcHRpb25NZW1iZXJzKClcIj57eyAnQnV0dG9uLkVkaXQnIHwgdHJhbnNsb2NvIH19PC9hPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiYWJvdXRDb250cm9sc1wiXG4gICAgICAgICAgICBbY2xhc3MuaXNEaXNhYmxlZF09XCJpc0Zvcm1FZGl0XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbCBtYi0wXCI+e3sgJ0NybS5BY2NvdW50TWVzc2FnZS5OYW1lJyB8IHRyYW5zbG9jbyB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgcm91bmRlZC0wIHBzLTEgdXNlci12YWx1ZVwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmWyduYW1lJ10uZXJyb3JzIH1cIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbCBtYi0wXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ3JtLkFjY291bnRNZXNzYWdlLkxvY2F0aW9uJyB8IHRyYW5zbG9jb1xuICAgICAgICAgICAgICAgICAgICAgICAgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgbmd4LWdwLWF1dG9jb21wbGV0ZVxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIHJvdW5kZWQtMCBwcy0xIHVzZXItdmFsdWVcIlxuICAgICAgICAgICAgICAgICNwbGFjZXM9XCJuZ3gtcGxhY2VzXCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJsb2NhdGlvblwiXG4gICAgICAgICAgICAgICAgKG9uQWRkcmVzc0NoYW5nZSk9XCJoYW5kbGVBZGRyZXNzQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZlsnbG9jYXRpb24nXS5lcnJvcnMgfVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJjb3VudHJpZXMkIHwgYXN5bmMgYXMgY291bnRyaWVzXCI+XG4gICAgICAgICAgICAgIDxsYWJlbD57eyAnQ3JtLkFjY291bnRNZXNzYWdlLkNvdW50cnknIHwgdHJhbnNsb2NvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyIHJlcXVpcmVkLWljb25cIj4qPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvdW50cnlcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZlsnY291bnRyeSddLmVycm9ycyB9XCI+XG4gICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgY291bnRyeSBvZiBjb3VudHJpZXNcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImNvdW50cnkuY29kZVwiPlxuICAgICAgICAgICAgICAgICAge3sgY291bnRyeS5uYW1lIH19XG4gICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMyB1aS1mbHVpZCBza2lsbHMtbW9kYWxcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwgbWItMlwiPnt7ICdDcm0uQWNjb3VudE1lc3NhZ2UuT3duZXInIHwgdHJhbnNsb2NvIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZC1ibG9jayBwYi0yIHBzLTEgdXNlci12YWx1ZVwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpc0Zvcm1FZGl0ICYmIGRhdGE/Lm93bmVyX2lkXCI+XG4gICAgICAgICAgICAgICAge3sgZGF0YT8ub3duZXI/LmZpcnN0X25hbWUgfX0ge3sgZGF0YT8ub3duZXI/Lmxhc3RfbmFtZSB9fVxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDxwLWF1dG9Db21wbGV0ZSAqbmdJZj1cIiFpc0Zvcm1FZGl0IHx8ICFkYXRhPy5vd25lcl9pZFwiXG4gICAgICAgICAgICAgICAgW3N1Z2dlc3Rpb25zXT1cImZpbHRlcmVkT3duZXJcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm93bmVyX2lkXCJcbiAgICAgICAgICAgICAgICBkYXRhS2V5PVwiaWRcIlxuICAgICAgICAgICAgICAgIGZpZWxkPVwiZmlyc3RfbmFtZVwiXG4gICAgICAgICAgICAgICAgW2Ryb3Bkb3duXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIChjb21wbGV0ZU1ldGhvZCk9XCJzZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgc3R5bGVDbGFzcz1cInctMTAwXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBvd25lclwiXG4gICAgICAgICAgICAgICAgW211bHRpcGxlXT1cImZhbHNlXCI+XG4gICAgICAgICAgICAgIDwvcC1hdXRvQ29tcGxldGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsIG1iLTBcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDcm0uQWNjb3VudE1lc3NhZ2UuQ29tcGFueVVybCcgfCB0cmFuc2xvY29cbiAgICAgICAgICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGEgW2hyZWZdPVwiZGF0YT8uY29tcGFueV91cmxcIlxuICAgICAgICAgICAgICAgIHRhcmdldD1cImJsYW5rXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBkLWJsb2NrIHBiLTIgcHMtMSB1c2VyLXZhbHVlXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImlzRm9ybUVkaXQgJiYgZGF0YT8uY29tcGFueV91cmxcIj57eyBkYXRhPy5jb21wYW55X3VybCB9fTwvYT5cbiAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwiIWlzRm9ybUVkaXQgfHwgIWRhdGE/LmNvbXBhbnlfdXJsXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgcm91bmRlZC0wIHBzLTEgdXNlci12YWx1ZVwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY29tcGFueV91cmxcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZlsnY29tcGFueV91cmwnXS5lcnJvcnMgfVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJkYXRhPy50ZWxcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwgbWItMFwiPnt7ICdDcm0uQWNjb3VudE1lc3NhZ2UuVGVsJyB8IHRyYW5zbG9jbyB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgcm91bmRlZC0wIHBzLTEgdXNlci12YWx1ZVwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGVsXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIlxuICAgICAgICAgICAgICAqbmdJZj1cIm9yZ2FuaXphdGlvblR5cGVzJCB8IGFzeW5jIGFzIHR5cGVzXCI+XG4gICAgICAgICAgICAgIDxsYWJlbD57eyAnT3JnYW5pemF0aW9uLk9yZ2FuaXphdGlvblR5cGUnIHwgdHJhbnNsb2NvIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgICAgICA8c2VsZWN0IGZvcm1Db250cm9sTmFtZT1cIm9yZ2FuaXphdGlvbl90eXBlX2lkXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tc2VsZWN0XCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZlsnb3JnYW5pemF0aW9uX3R5cGVfaWQnXS5lcnJvcnMgfVwiPlxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHR5cGVzWydvcmdhbml6YXRpb25fdHlwZXMnXVwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb24uaWRcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgb3B0aW9uLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIlxuICAgICAgICAgICAgICAqbmdJZj1cIm9yZ2FuaXphdGlvbkluZHVzdHJpZXMkIHwgYXN5bmMgYXMgaW5kdXN0cmllc1wiPlxuICAgICAgICAgICAgICA8bGFiZWw+e3sgJ09yZ2FuaXphdGlvbi5Pcmdhbml6YXRpb25JbmR1c3RyeScgfCB0cmFuc2xvY28gfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8c2VsZWN0IGZvcm1Db250cm9sTmFtZT1cIm9yZ2FuaXphdGlvbl9pbmR1c3RyeV9pZFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1zZWxlY3RcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZlsnb3JnYW5pemF0aW9uX2luZHVzdHJ5X2lkJ10uZXJyb3JzIH1cIj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgaW5kdXN0cmllc1snb3JnYW5pemF0aW9uX2luZHVzdHJpZXMnXVwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0aW9uLmlkXCI+XG4gICAgICAgICAgICAgICAgICB7eyBvcHRpb24ubmFtZSB9fVxuICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIlxuICAgICAgICAgICAgICAqbmdJZj1cIm9yZ2FuaXphdGlvblNpemVzJCB8IGFzeW5jIGFzIHNpemVzXCI+XG4gICAgICAgICAgICAgIDxsYWJlbD57eyAnQ3JtLkFjY291bnRNZXNzYWdlLlNpemUnIHwgdHJhbnNsb2NvIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPHNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJvcmdhbml6YXRpb25fc2l6ZV9pZFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1zZWxlY3RcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZlsnb3JnYW5pemF0aW9uX3NpemVfaWQnXS5lcnJvcnMgfVwiPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBzaXplc1snb3JnYW5pemF0aW9uX3NpemVzJ11cIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvbi5pZFwiPlxuICAgICAgICAgICAgICAgICAge3sgb3B0aW9uLm5hbWUgfX1cbiAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XG4gICAgICAgICAgICAgIDxsYWJlbD57eyAnQ3JtLkFjY291bnRNZXNzYWdlLlN0YXR1cycgfCB0cmFuc2xvY28gfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8c2VsZWN0IGZvcm1Db250cm9sTmFtZT1cInN0YXR1c1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1zZWxlY3RcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZlsnc3RhdHVzJ10uZXJyb3JzIH1cIj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygc3RhdHVzXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb25cIj57eyBvcHRpb24gfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XG4gICAgICAgICAgICAgIDxsYWJlbD57eyAnQ3JtLkFjY291bnRNZXNzYWdlLlByaW9yaXR5JyB8IHRyYW5zbG9jbyB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxzZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwicHJpb3JpdHlcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tc2VsZWN0XCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ3ByaW9yaXR5J10uZXJyb3JzIH1cIj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgcHJpb3JpdHlcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvblwiPlxuICAgICAgICAgICAgICAgICAge3sgb3B0aW9uIH19XG4gICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgICA8bGFiZWw+e3sgJ0NybS5BY2NvdW50TWVzc2FnZS5Tb3VyY2UnIHwgdHJhbnNsb2NvIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPHNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJjcm1fc291cmNlX2lkXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmWydjcm1fc291cmNlX2lkJ10uZXJyb3JzIH1cIj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygc291cmNlXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb24uaWRcIj5cbiAgICAgICAgICAgICAgICAgIHt7IG9wdGlvbi5uYW1lIH19XG4gICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIFtsYWJlbF09XCInQ3JtLkFjY291bnRNZXNzYWdlLkRlc2NyaXB0aW9uJyB8IHRyYW5zbG9jb1wiXG4gICAgICAgICAgICAgICAgbmFtZT1cImRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgPHRleHRhcmVhIHJvd3M9XCI1XCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgIGlkPVwiZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmWydkZXNjcmlwdGlvbiddLmVycm9ycyB9XCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNGb3JtRWRpdFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1lbmQgZm9ybS1hY3Rpb24tYnV0dG9uc1wiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImlzRm9ybUVkaXQgPSAhaXNGb3JtRWRpdDsgZ2V0QWNjb3VudERldGFpbHMoKVwiXG4gICAgICAgICAgICAgICAgdmFsdWU9XCJDYW5jZWxcIiAvPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICAgICAgW2J1dHRvbkJ1c3ldPVwiYnV0dG9uQnVzeVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbXMtM1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZUFjY291bnRJbmZvKClcIj5cbiAgICAgICAgICAgICAgICB7eyAnQnV0dG9uLlN1Ym1pdCcgfCB0cmFuc2xvY28gfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC04XCI+XG4gICAgICAgIDx1bCBuZ2JOYXZcbiAgICAgICAgICAjbmF2PVwibmdiTmF2XCJcbiAgICAgICAgICBjbGFzcz1cIm5hdi10YWJzXCI+XG4gICAgICAgICAgPGxpIFtuZ2JOYXZJdGVtXT1cIjFcIj5cbiAgICAgICAgICAgIDxhIG5nYk5hdkxpbms+Tm90ZXM8L2E+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgbmdiTmF2Q29udGVudD5cbiAgICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJhY3Rpb25Db250cm9sc1wiXG4gICAgICAgICAgICAgICAgKG5nU3VibWl0KT1cIm9uU2F2ZSgpXCI+XG4gICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvbW1lbnRcIlxuICAgICAgICAgICAgICAgICAgcm93cz1cIjZcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkNvbnRyb2xzLmdldCgnY29tbWVudCcpLnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkNvbnRyb2xzLmdldCgnY29tbWVudCcpLmludmFsaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgICBOb3RlIFJlcXVpcmVkXG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3Rpb25zPy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkLWJsb2NrIGNsZWFyLWJvdGggcHQtM1wiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIGFjdGlvbnM7IGluZGV4IGFzIGlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImFjdGlvbi52aXNpYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cIlwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNtIG1lLTIgYnRuLW91dGxpbmUtcHJpbWFyeSBtYi0yIGFjdGlvbi1idG5cIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzaG93RGF0ZVBpY2tlcigkZXZlbnQsIGFjdGlvbi5pZCk7IGQudG9nZ2xlKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBhY3Rpb24ubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzdWJtaXRBY3Rpb24gJiYgYWN0aW9uQ29udHJvbHMuZ2V0KCdjcm1fYWN0aW9uX2lkJykuaW52YWxpZFwiPlxuICAgICAgICAgICAgICAgICAgICBQbGVhc2Ugc2VsZWN0IGFuIGFjdGlvblxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG10LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtc20tNFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJkZC1tbS15eXl5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwid2hlblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5nYkRhdGVwaWNrZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgI2Q9XCJuZ2JEYXRlcGlja2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImQudG9nZ2xlKClcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZsdWlkIHNraWxscy1tb2RhbCBjb2wtc20tNCBwcy0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHAtYXV0b0NvbXBsZXRlIFtzdWdnZXN0aW9uc109XCJmaWx0ZXJlZENvbnRhY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY3JtX2NvbnRhY3RfaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUtleT1cImlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkPVwiZGlzcGxheU5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Ryb3Bkb3duXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBsZXRlTWV0aG9kKT1cInNlYXJjaENvbnRhY3QoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25TZWxlY3QpPVwic2VsZWN0Q29udGFjdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvbkJsdXIpPVwiT25Db250YWN0Qmx1cigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJ3LTEwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBjb250YWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Ecm9wZG93bkNsaWNrKT1cIm9uRHJvcGRvd25DbGljaygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9wLWF1dG9Db21wbGV0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNCBwZS0wIGNvbXBsZXRlZC10b2dnbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHVpLXN3aXRjaCBjaGVja2VkTGFiZWw9XCJjb21wbGV0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB1bmNoZWNrZWRMYWJlbD1cIm9wZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjb21wbGV0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiY29tcGxldGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3VpLXN3aXRjaD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxvYXQtZW5kXCI+XG4gICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IG1lLTAgbWUtc20tMlwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuTW9kYWwoY29udGVudClcIj57eyAnVXBsb2FkIGZpbGUnIHwgdHJhbnNsb2NvIH19PC9hPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICAgICAgICAgICAgW2J1dHRvbkJ1c3ldPVwiYnV0dG9uQnVzeVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidXR0b25EaXNhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbXQtMiBtYi0yXCI+U3VibWl0IE5vdGU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYnV0dG9uRGlzYWJsZVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIm5vLWFjdGlvbnMgcHQtNFwiPlxuICAgICAgICAgICAgICAgICAgPHB3LW5vLWRhdGEgW3dpdGhJbWFnZV09XCJ0cnVlXCIgW21lc3NhZ2VdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NybS5BY2NvdW50TWVzc2FnZS5Ob0FjdGlvbnNJbkFjY291bnRJbmZvTWVzc2FnZScgfCB0cmFuc2xvY29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICAgICAgPC9wdy1uby1kYXRhPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCB0ZXh0LWNlbnRlciBtdC0zXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIiFpc0xvYWRlZFwiPlxuICAgICAgICAgICAgICAgIDxwLXByb2dyZXNzU3Bpbm5lciBzdHJva2VXaWR0aD1cIjJcIj4gPC9wLXByb2dyZXNzU3Bpbm5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhYWNjb3VudENvbW1lbnRzPy5sZW5ndGggJiYgaXNMb2FkZWRcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibm8tYWN0aW9ucyBwdC0yXCI+XG4gICAgICAgICAgICAgICAgPHB3LW5vLWRhdGEgW3dpdGhJbWFnZV09XCJ0cnVlXCIgW21lc3NhZ2VdPVwiJ0NybS5BY2NvdW50TWVzc2FnZS5Ob0FjdGlvbnNNZXNzYWdlJyB8IHRyYW5zbG9jb1wiPlxuICAgICAgICAgICAgICAgIDwvcHctbm8tZGF0YT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY2NvdW50Q29tbWVudHM/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJ0aW1lbGluZVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInB0LTMgY2xlYXItYm90aCB0aW1lbGluZS1jZW50ZXIgdGltZWxpbmUtd3JhcHBlciB0aW1lbGluZS1jb250YWluZXJcIlxuICAgICAgICAgICAgICAgICAgaW5maW5pdGVTY3JvbGxcbiAgICAgICAgICAgICAgICAgIFtpbmZpbml0ZVNjcm9sbERpc3RhbmNlXT1cIjJcIlxuICAgICAgICAgICAgICAgICAgW2luZmluaXRlU2Nyb2xsVGhyb3R0bGVdPVwiNTBcIlxuICAgICAgICAgICAgICAgICAgW2luZmluaXRlU2Nyb2xsQ29udGFpbmVyXT1cInNlbGVjdG9yXCJcbiAgICAgICAgICAgICAgICAgIFtmcm9tUm9vdF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIChzY3JvbGxlZCk9XCJvblNjcm9sbFRpbWVsaW5lKClcIj5cbiAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cInRpbWVsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInRpbWVsaW5lLWxpbmVcIj48L2xpPlxuICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cInRpbWVsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInRpbWVsaW5lLWxpbmVcIj48L2xpPlxuICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJ0aW1lbGluZS1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdtdC01Jzogb2RkIHx8IGxhc3QgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpdGVtIG9mIGFjY291bnRDb21tZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggYXMgaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9kZCA9IG9kZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGV2ZW4gPSBldmVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdCA9IGxhc3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaXJzdCA9IGZpcnN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWVsaW5lLWJhZGdlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJnLXJlZCBiZy1saWdodGVuLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aW1lbGluZS15ZWFyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkLWJsb2NrIGRhdGUteWVhclwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ud2hlbiB8IGRhdGU6ICdtZWRpdW0nIHwgc2xpY2U6IDA6M1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGl0ZW0ueWVhciB9fTwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWVsaW5lLWNhcmQgc2hhZG93IGNhcmQgcGItMCByb3VuZGVkIGJvcmRlci1ncmV5IGJvcmRlci1saWdodGVuLTIgcG9zaXRpb24tc3RhdGljXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgcHktNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMCBjbGVhcmZpeFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiY29tbWVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbW1lbnQtZmllbGQgZm9ybS1jb250cm9sIHAtMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0uY29tbWVudFwiPnt7IGl0ZW0uY29tbWVudCB9fTwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF1dG8tY29tcGxldGUgbWItMyB1aS1mbHVpZCBza2lsbHMtbW9kYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWF1dG9Db21wbGV0ZSBbKG5nTW9kZWwpXT1cIml0ZW0uY3JtX2NvbnRhY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3VnZ2VzdGlvbnNdPVwiZmlsdGVyZWRDb250YWN0Q29tbWVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFLZXk9XCIgaWQgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ9XCJmaXJzdF9uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcGRvd249XCIgdHJ1ZSBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tcGxldGVNZXRob2QpPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoQ29udGFjdEluQ29tbWVudCgkZXZlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25TZWxlY3QpPVwic2VsZWN0Q29tbWVudENvbnRhY3QoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkJsdXIpPVwiT25Db250YWN0Qmx1cigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVDbGFzcz1cIiB3LTEwMCBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIiBTZWFyY2ggY29udGFjdCBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Ecm9wZG93bkNsaWNrKT1cIm9uRHJvcGRvd25DbGljaygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtYXV0b0NvbXBsZXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZmxvYXQtc3RhcnQgbWItMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXNob3dGdWxsQ29tbWVudCB8fCBpdGVtLmlkICE9PSBjb21tZW50SWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmNvbW1lbnQgfCBzbGljZTogMDoxNzBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08YSAqbmdJZj1cIml0ZW0uY29tbWVudC5sZW5ndGggPiAxNzBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtc2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dGdWxsQ29tbWVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudElkID0gaXRlbS5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+Li4uc2hvdyBtb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZmxvYXQtc3RhcnQgbWItMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dGdWxsQ29tbWVudCAmJiBpdGVtLmlkID09PSBjb21tZW50SWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uY29tbWVudCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmNvbW1lbnQubGVuZ3RoID4gMTcwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Z1bGxDb21tZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd0Z1bGxDb21tZW50ID0gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtc2Vjb25kYXJ5XCI+Li4uc2hvdyBsZXNzPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1tZCBlZGl0LWJ0biBmbG9hdC1lbmQgcHktMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd0VkaXRDb250cm9scygkZXZlbnQsIGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidXNlcklkID09PSBpdGVtLm93bmVyX2lkIHx8IGhhc0FjY2Vzc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtZWRpdCBlZGl0LWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXN1YnRpdGxlIHRleHQtbXV0ZWQgbXktMCBjbGVhcmZpeFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbG9hdC1zdGFydFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhdXBkYXRpbmcgfHwgYWN0aW9uSWQgIT09IGl0ZW0uaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvbnQtc21hbGwtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLndoZW4gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJ1cGRhdGluZyAmJiBhY3Rpb25JZCA9PT0gaXRlbS5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZGQtbW0teXl5eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwie3sgaXRlbS53aGVuIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdiRGF0ZXBpY2tlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZD1cIm5nYkRhdGVwaWNrZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXMpPVwiZC50b2dnbGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRlU2VsZWN0KT1cIm9uRGF0ZVNlbGVjdCgkZXZlbnQsIGl0ZW0pXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCIgYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zbSBmbG9hdC1lbmQgd2hlbi1idG4gcHktMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInVzZXJJZCA9PT0gaXRlbS5vd25lcl9pZCB8fCBoYXNBY2Nlc3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dEYXRlUGlja2VyVXBkYXRlKGl0ZW0uaWQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS1lZGl0IGVkaXQtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgW2NsYXNzLnRleHQtZGFuZ2VyXT1cIiFpdGVtLmNvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFpdGVtLmNhbmNlbGxlZCAmJiAhaXRlbS5jb21wbGV0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWItMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uZHVlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeSBhY3Rpb24tb3duZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS5jcm1fY29udGFjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLycgKyBzdWJzY3JpcHRpb24/LnNsdWcgKyByb3V0ZXJzLmNvbnRhY3RJbmZvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmNybV9jb250YWN0LmlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVwiPnt7IGl0ZW0uY3JtX2NvbnRhY3QuZmlyc3RfbmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uY3JtX2NvbnRhY3QubGFzdF9uYW1lIHx8ICcnIH19PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ub3duZXIuZmlyc3RfbmFtZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5vd25lci5sYXN0X25hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctcHJpbWFyeVwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbT8uY3JtX2FjdGlvbj8ubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpdGVtLmNvbXBsZXRlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNlcklkID09PSBpdGVtLm93bmVyX2lkIHx8IGhhc0FjY2VzcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYmFkZ2UgYmctc3VjY2VzcyBtcy0yXCI+T3Blbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWl0ZW0uY29tcGxldGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2VySWQgPT09IGl0ZW0ub3duZXJfaWQgfHwgaGFzQWNjZXNzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIlNldCBhcyBjb21wbGV0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWUtMyBtcy0zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApO1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBc0NvbXBsZXRlZE9yVW5jb21wbGV0ZWQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY29tcGxldGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLXRhc2tzIGNvbXBsZXRlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YSAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXRlbS5jYW5jZWxsZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWl0ZW0uY29tcGxldGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2VySWQgPT09IGl0ZW0ub3duZXJfaWQgfHwgaGFzQWNjZXNzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIlNldCBhcyBjYW5jZWxsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMCk7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2V0QXNDYW5jZWxsZWQoaXRlbS5pZCwgaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLXRpbWVzIGRlbGV0ZS1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxhICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY29tcGxldGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2VySWQgPT09IGl0ZW0ub3duZXJfaWQgfHwgaGFzQWNjZXNzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIlNldCBhcyBVbkNvbXBsZXRlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXNDb21wbGV0ZWRPclVuY29tcGxldGVkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmNvbXBsZXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1zLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhciBmYS13aW5kb3ctY2xvc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2wtYnRucyBtdC0zIHRleHQtZW5kIGZvcm0tYWN0aW9uLWJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLWRlZmF1bHQgbWUtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd0VkaXRDb250cm9scyh1bmRlZmluZWQsICcnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0J1dHRvbi5DYW5jZWwnIHwgdHJhbnNsb2NvIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlQ29tbWVudChpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0J1dHRvbi5TdWJtaXQnIHwgdHJhbnNsb2NvIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgICA8bGkgW25nYk5hdkl0ZW1dPVwiMlwiPlxuICAgICAgICAgICAgPGEgbmdiTmF2TGluaz5Db250YWN0czwvYT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZ2JOYXZDb250ZW50PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtcHJpbWFyeSBmbG9hdC1lbmRcIlxuICAgICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiYWRkLWNvbnRhY3RcIlxuICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5jb250YWN0QWRkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnRJZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBsdXMtY2lyY2xlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICB7eyAnQ3JtLkNvbnRhY3RNZXNzYWdlLkFkZENvbnRhY3QnIHwgdHJhbnNsb2NvIH19XG4gICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJpbWVuZy1kYXRhdGFibGUtY29udGFpbmVyIHRhYmxlLXJlc3BvbnNpdmVcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5oaWRlVGFibGVdPVwidG90YWxSZWNvcmRzVW5GaWx0ZXJlZCA9PT0gMFwiPlxuICAgICAgICAgICAgICAgIDxwLXRhYmxlIGNsYXNzPVwidGFibGVcIlxuICAgICAgICAgICAgICAgICAgI2R0XG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY29udGFjdHNcIlxuICAgICAgICAgICAgICAgICAgW3BhZ2luYXRvcl09XCJ0b3RhbFJlY29yZHMgIT09IDBcIlxuICAgICAgICAgICAgICAgICAgW3Jvd3NdPVwiUEFHRV9TSVpFXCJcbiAgICAgICAgICAgICAgICAgIFt0b3RhbFJlY29yZHNdPVwidG90YWxSZWNvcmRzXCJcbiAgICAgICAgICAgICAgICAgIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxuICAgICAgICAgICAgICAgICAgW2xhenldPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAob25MYXp5TG9hZCk9XCJvbkxhenlMb2FkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgW2N1c3RvbVNvcnRdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImNhcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zZWFyY2ggbXQtMiBtZS0yXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaFRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcElucHV0VGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cIjUwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGNvc250YWN0Li4uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJkdC5maWx0ZXJHbG9iYWwoJGV2ZW50LnRhcmdldC52YWx1ZSwgJ2NvbnRhaW5zJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtdy05MFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcFNvcnRhYmxlQ29sdW1uPVwiZmlyc3RfbmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0xhYmVsLk5hbWUnIHwgdHJhbnNsb2NvIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1zb3J0SWNvbiBmaWVsZD1cImZpcnN0X25hbWVcIj48L3Atc29ydEljb24+XG4gICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBTb3J0YWJsZUNvbHVtbj1cIm93bmVyX2lkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAnQ3JtLkNvbnRhY3RNZXNzYWdlLkNvbnRhY3RPd25lcicgfCB0cmFuc2xvY28gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLXNvcnRJY29uIGZpZWxkPVwib3duZXJfaWRcIj48L3Atc29ydEljb24+XG4gICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBTb3J0YWJsZUNvbHVtbj1cImhlYWRsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAnQ3JtLkNvbnRhY3RNZXNzYWdlLkhlYWRsaW5lJyB8IHRyYW5zbG9jbyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtc29ydEljb24gZmllbGQ9XCJoZWFkbGluZVwiPjwvcC1zb3J0SWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnTGFiZWwuQWN0aW9ucycgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgbGV0LWNvbnRhY3Q+XG4gICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbnRhY3RuYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBbcm91dGVyTGlua109XCJbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5jb250YWN0SW5mbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWN0LmlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWN0LmZpcnN0X25hbWUgKyAnICcgKyBjb250YWN0Lmxhc3RfbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRleHRUcnVuY2F0ZTogMjBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9hPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIk93bmVyTmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgY29udGFjdC5vd25lciB8IGlmTmFtZU51bGxTaG93RW1haWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJIZWFkbGluZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImhlYWRsaW5lLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNvbnRhY3Q/LmhlYWRsaW5lIHwgdGV4dFRydW5jYXRlOiAyMCB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIkFjdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC11bnN0eWxlZCBsaXN0LWlubGluZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgbmdiVG9vbHRpcD1cIlNob3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWUtMiBtZS1zbS0zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvJyArIHN1YnNjcmlwdGlvbj8uc2x1ZyArIHJvdXRlcnMuY29udGFjdEluZm8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhY3QuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS1leWUgc2VlLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNBY2Nlc3MgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFjdC5vd25lcl9pZCA9PT0gdXNlcklkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhY3QuY3JtX2FjY291bnQub3duZXJfaWQgPT09IHVzZXJJZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIkFkZCBvcHBvcnR1bml0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZS0yIG1lLXNtLTNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIltcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbj8uc2x1ZyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZXJzLm9wcG9ydHVuaXR5QWRkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cInsgY29udGFjdF9pZDogY29udGFjdC5pZCB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS1wbHVzLWNpcmNsZSBhZGQtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0FjY2VzcyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWN0Lm93bmVyX2lkID09PSB1c2VySWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFjdC5jcm1fYWNjb3VudC5vd25lcl9pZCA9PT0gdXNlcklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwiRWRpdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZS0yIG1lLXNtLTNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIltcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbj8uc2x1ZyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZXJzLmNvbnRhY3REZXRhaWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWN0LmlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtZWRpdCBlZGl0LWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNBY2Nlc3MgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFjdC5vd25lcl9pZCA9PT0gdXNlcklkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhY3QuY3JtX2FjY291bnQub3duZXJfaWQgPT09IHVzZXJJZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIkRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZS0yIG1lLXNtLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLXRyYXNoIGRlbGV0ZS1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGVsZXRlQ29udGFjdChjb250YWN0LmlkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9wLXRhYmxlPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0b3RhbFJlY29yZHMgPT09IDAgJiYgdG90YWxSZWNvcmRzVW5GaWx0ZXJlZCAhPT0gMFwiPlxuICAgICAgICAgICAgICAgICAgPHB3LW5vLWRhdGEgW3dpdGhJbWFnZV09XCJ0cnVlXCIgW21lc3NhZ2VdPVwiJ1NlYXJjaC5Ob0RhdGFNZXNzYWdlJ3wgdHJhbnNsb2NvXCIgW2Rlc2NyaXB0aW9uXT1cIidTZWFyY2guTm9EYXRhRGVzY3JpcHRpb24nIHwgdHJhbnNsb2NvXCIgPlxuICAgICAgICA8L3B3LW5vLWRhdGE+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b3RhbC1yZWNvcmRzLWNvdW50XCIgKm5nSWY9XCJ0b3RhbFJlY29yZHMgIT09IDBcIj57eyAnTGFiZWwuVG90YWwnIHwgdHJhbnNsb2NvIH19OiB7eyB0b3RhbFJlY29yZHMgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidG90YWxSZWNvcmRzVW5GaWx0ZXJlZCA9PT0gMFwiPlxuICAgICAgICAgICAgICAgIDxwdy1uby1kYXRhIFt3aXRoSW1hZ2VdPVwidHJ1ZVwiIFttZXNzYWdlXT1cIidDcm0uQ29udGFjdE1lc3NhZ2UuQ29udGFjdHNBZG1pbk1lc3NhZ2UnIHwgdHJhbnNsb2NvXCI+XG4gICAgICAgICAgICAgICAgPC9wdy1uby1kYXRhPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgICA8bGkgW25nYk5hdkl0ZW1dPVwiM1wiPlxuICAgICAgICAgICAgPGEgbmdiTmF2TGluaz5WZXJzaW9uaW5nPC9hPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG5nYk5hdkNvbnRlbnQ+XG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHZlcnNpb25pbmcgb2YgYWNjb3VudFZlcnNpb25pbmdcIj5cbiAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgIDxzdHJvbmc+RXZlbnQ6IDwvc3Ryb25nPnt7IHZlcnNpb25pbmcuZXZlbnQgfX0gfFxuICAgICAgICAgICAgICAgICAgPHN0cm9uZz5BdXRob3I6IDwvc3Ryb25nPjxhICpuZ0lmPVwidmVyc2lvbmluZz8uYXV0aG9yXCJcbiAgICAgICAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiWycvbWVtYmVycycsIHZlcnNpb25pbmc/LmF1dGhvcj8uc2x1Z11cIj57eyB2ZXJzaW9uaW5nPy5hdXRob3IgfCBpZk5hbWVOdWxsU2hvd0VtYWlsIH19PC9hPlxuICAgICAgICAgICAgICAgICAgfCA8c3Ryb25nPkNyZWF0ZWQgYXQ6IDwvc3Ryb25nPnt7IHZlcnNpb25pbmcuY3JlYXRlZF9hdCB8IGRhdGVGb3JtYXQ6ICdkYXRldGltZScgfX08YnIgLz5cbiAgICAgICAgICAgICAgICAgIDxzdHJvbmc+T2JqZWN0OiA8L3N0cm9uZz57eyB2ZXJzaW9uaW5nLm9iamVjdCB8IGpzb24gfX1cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPGhyIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWNjb3VudFZlcnNpb25pbmc/Lmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICAgICAgICAgIDxwdy1uby1kYXRhIFt3aXRoSW1hZ2VdPVwidHJ1ZVwiIFttZXNzYWdlXT1cIidDcm0uQWNjb3VudE1lc3NhZ2UuTm9WZXJzaW9uc01lc3NhZ2UnIHwgdHJhbnNsb2NvXCI+XG4gICAgICAgICAgICAgICAgPC9wdy1uby1kYXRhPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgICA8bGkgW25nYk5hdkl0ZW1dPVwiNFwiPlxuICAgICAgICAgICAgPGEgbmdiTmF2TGluaz5GaWxlczwvYT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZ2JOYXZDb250ZW50PlxuICAgICAgICAgICAgICA8cHctc21hcnQtY3JtLWNvbXBhbnktZmlsZXMgW2FjY291bnRJZF09XCJhY2NvdW50SWRcIj48L3B3LXNtYXJ0LWNybS1jb21wYW55LWZpbGVzPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgICA8ZGl2IFtuZ2JOYXZPdXRsZXRdPVwibmF2XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbjxuZy10ZW1wbGF0ZSAjY29udGVudFxuICBsZXQtbW9kYWw+XG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICA8aDMgY2xhc3M9XCJtb2RhbC10aXRsZSBtYi0wIHAtMFwiPnt7ICdVcGxvYWQgRmlsZScgfCB0cmFuc2xvY28gfX08L2gzPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cImJ0bi1jbG9zZSBmbG9hdC1lbmRcIlxuICAgICAgYXJpYS1sYWJlbD1cIkNsb3NlXCJcbiAgICAgIChjbGljayk9XCJtb2RhbC5kaXNtaXNzKClcIj5cblxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICA8c21hbGw+IHt7ICdVc2VyLlByb2ZpbGUuUGljdHVyZU1lc3NhZ2UnIHwgdHJhbnNsb2NvIH19PC9zbWFsbD5cbiAgICA8ZGl2IGNsYXNzPVwicm93IHAtMlwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidXBsb2FkLWJveFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1cGxvYWQtYm94LWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wLWNvbnRhaW5lclwiXG4gICAgICAgICAgICAgIG5nRmlsZURyb3BcbiAgICAgICAgICAgICAgW29wdGlvbnNdPVwib3B0aW9uc1wiXG4gICAgICAgICAgICAgICh1cGxvYWRPdXRwdXQpPVwib25VcGxvYWRPdXRwdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIFt1cGxvYWRJbnB1dF09XCJ1cGxvYWRJbnB1dFwiPlxuICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICBEcmFnIGZpbGVzIGhlcmUgb3JcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ1cGxvYWQtYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIlxuICAgICAgICAgICAgICAgICAgICBuZ0ZpbGVTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwib3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICh1cGxvYWRPdXRwdXQpPVwib25VcGxvYWRPdXRwdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFt1cGxvYWRJbnB1dF09XCJ1cGxvYWRJbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgIG11bHRpcGxlIC8+XG4gICAgICAgICAgICAgICAgICBicm93c2VcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIHRvIHVwbG9hZC5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidXBsb2FkLWl0ZW1cIlxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZiBvZiBmaWxlczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidXBsb2FkLWl0ZW0tY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlbmFtZVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGVuYW1lLWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJpb25pY29uIGlvbi1pb3MtY29weVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZi5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzc1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhclwiXG4gICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImY/LnByb2dyZXNzPy5kYXRhPy5wZXJjZW50YWdlICsgJyUnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaXMtZG9uZV09XCJmWyd1cGxvYWRlZCddXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLXRleHQtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwcm9ncmVzcy10ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWRvbmVdPVwiZlsndXBsb2FkZWQnXVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmWyd1cGxvYWRlZCddXCI+e3sgZi5wcm9ncmVzcz8uZGF0YT8ucGVyY2VudGFnZSAtIDEgfX0lXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmWyd1cGxvYWRlZCddXCI+MTAwICU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZbJ3VwbG9hZGVkJ11cIj5VcGxvYWRpbmcuLi48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZlsndXBsb2FkZWQnXVwiPkRvbmU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNwZWVkLWFuZC1ldGEtdGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZi5wcm9ncmVzcz8uZGF0YT8ucGVyY2VudGFnZSAhPT0gMCAmJiAhZlsndXBsb2FkZWQnXVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBmLnByb2dyZXNzPy5kYXRhPy5zcGVlZEh1bWFuIH19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+RVRBIHt7IGYucHJvZ3Jlc3M/LmRhdGE/LmV0YUh1bWFuIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=