@annalib/anna-core 1.2.0 → 1.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/annalib-anna-core.d.ts +5 -0
  2. package/esm2020/annalib-anna-core.mjs +5 -0
  3. package/esm2020/lib/anna-core-shared-lib/anna-core-shared-lib.module.mjs +59 -0
  4. package/esm2020/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.mjs +15 -0
  5. package/esm2020/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.mjs +15 -0
  6. package/esm2020/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.mjs +22 -0
  7. package/esm2020/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.mjs +15 -0
  8. package/esm2020/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.mjs +21 -0
  9. package/esm2020/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.mjs +15 -0
  10. package/esm2020/lib/anna-core-shared-lib/constants/shared.constant.mjs +34 -0
  11. package/esm2020/lib/anna-core-shared-lib/index.mjs +2 -0
  12. package/esm2020/lib/anna-core-shared-lib/models/anna-generic-data-type.model.mjs +2 -0
  13. package/esm2020/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.mjs +2 -0
  14. package/esm2020/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.mjs +3 -0
  15. package/esm2020/lib/anna-core-shared-lib/models/anna-sort.model.mjs +2 -0
  16. package/esm2020/lib/anna-core-shared-lib/models/anna-tooltip.model.mjs +28 -0
  17. package/esm2020/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.mjs +31 -0
  18. package/esm2020/lib/anna-core-shared-lib/public-api.mjs +26 -0
  19. package/esm2020/lib/anna-core-shared-lib/services/anna-date-time-format.service.mjs +180 -0
  20. package/esm2020/lib/anna-core-shared-lib/services/anna-filter.service.mjs +596 -0
  21. package/esm2020/lib/anna-core-shared-lib/services/anna-generic-table.service.mjs +48 -0
  22. package/esm2020/lib/anna-core-shared-lib/services/anna-global-config.service.mjs +133 -0
  23. package/esm2020/lib/anna-core-shared-lib/services/anna-sort.service.mjs +147 -0
  24. package/esm2020/lib/anna-dropdown-lib/anna-dropdown-lib.module.mjs +43 -0
  25. package/esm2020/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.mjs +99 -0
  26. package/esm2020/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +360 -0
  27. package/esm2020/lib/anna-dropdown-lib/index.mjs +2 -0
  28. package/esm2020/lib/anna-dropdown-lib/public-api.mjs +6 -0
  29. package/esm2020/lib/anna-generic-table-lib/anna-generic-table-lib.module.mjs +86 -0
  30. package/esm2020/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +1546 -0
  31. package/esm2020/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.mjs +69 -0
  32. package/esm2020/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +357 -0
  33. package/esm2020/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.mjs +189 -0
  34. package/esm2020/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.mjs +2 -0
  35. package/esm2020/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +178 -0
  36. package/esm2020/lib/anna-generic-table-lib/directives/anna-virtual-table/index.mjs +2 -0
  37. package/esm2020/lib/anna-generic-table-lib/index.mjs +2 -0
  38. package/esm2020/lib/anna-generic-table-lib/public-api.mjs +10 -0
  39. package/esm2020/public-api.mjs +7 -0
  40. package/esm2020/src/lib/anna-core-shared-lib/anna-core-shared-lib.module.mjs +59 -0
  41. package/esm2020/src/lib/anna-core-shared-lib/annalib-anna-core-src-lib-anna-core-shared-lib.mjs +5 -0
  42. package/esm2020/src/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.mjs +15 -0
  43. package/esm2020/src/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.mjs +15 -0
  44. package/esm2020/src/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.mjs +22 -0
  45. package/esm2020/src/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.mjs +15 -0
  46. package/esm2020/src/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.mjs +21 -0
  47. package/esm2020/src/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.mjs +15 -0
  48. package/esm2020/src/lib/anna-core-shared-lib/constants/shared.constant.mjs +34 -0
  49. package/esm2020/src/lib/anna-core-shared-lib/models/anna-generic-data-type.model.mjs +2 -0
  50. package/esm2020/src/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.mjs +2 -0
  51. package/esm2020/src/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.mjs +3 -0
  52. package/esm2020/src/lib/anna-core-shared-lib/models/anna-sort.model.mjs +2 -0
  53. package/esm2020/src/lib/anna-core-shared-lib/models/anna-tooltip.model.mjs +28 -0
  54. package/esm2020/src/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.mjs +31 -0
  55. package/esm2020/src/lib/anna-core-shared-lib/public-api.mjs +26 -0
  56. package/esm2020/src/lib/anna-core-shared-lib/services/anna-date-time-format.service.mjs +180 -0
  57. package/esm2020/src/lib/anna-core-shared-lib/services/anna-filter.service.mjs +596 -0
  58. package/esm2020/src/lib/anna-core-shared-lib/services/anna-generic-table.service.mjs +48 -0
  59. package/esm2020/src/lib/anna-core-shared-lib/services/anna-global-config.service.mjs +133 -0
  60. package/esm2020/src/lib/anna-core-shared-lib/services/anna-sort.service.mjs +147 -0
  61. package/esm2020/src/lib/anna-dropdown-lib/anna-dropdown-lib.module.mjs +43 -0
  62. package/esm2020/src/lib/anna-dropdown-lib/annalib-anna-core-src-lib-anna-dropdown-lib.mjs +5 -0
  63. package/esm2020/src/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.mjs +99 -0
  64. package/esm2020/src/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +360 -0
  65. package/esm2020/src/lib/anna-dropdown-lib/public-api.mjs +6 -0
  66. package/esm2020/src/lib/anna-generic-table-lib/anna-generic-table-lib.module.mjs +86 -0
  67. package/esm2020/src/lib/anna-generic-table-lib/annalib-anna-core-src-lib-anna-generic-table-lib.mjs +5 -0
  68. package/esm2020/src/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +1546 -0
  69. package/esm2020/src/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.mjs +69 -0
  70. package/esm2020/src/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +357 -0
  71. package/esm2020/src/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.mjs +189 -0
  72. package/esm2020/src/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.mjs +2 -0
  73. package/esm2020/src/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +178 -0
  74. package/esm2020/src/lib/anna-generic-table-lib/directives/anna-virtual-table/index.mjs +2 -0
  75. package/esm2020/src/lib/anna-generic-table-lib/public-api.mjs +10 -0
  76. package/fesm2015/annalib-anna-core-src-lib-anna-core-shared-lib.mjs +1314 -0
  77. package/fesm2015/annalib-anna-core-src-lib-anna-core-shared-lib.mjs.map +1 -0
  78. package/fesm2015/annalib-anna-core-src-lib-anna-dropdown-lib.mjs +493 -0
  79. package/fesm2015/annalib-anna-core-src-lib-anna-dropdown-lib.mjs.map +1 -0
  80. package/fesm2015/annalib-anna-core-src-lib-anna-generic-table-lib.mjs +2390 -0
  81. package/fesm2015/annalib-anna-core-src-lib-anna-generic-table-lib.mjs.map +1 -0
  82. package/fesm2015/annalib-anna-core.mjs +4171 -0
  83. package/fesm2015/annalib-anna-core.mjs.map +1 -0
  84. package/fesm2020/annalib-anna-core-src-lib-anna-core-shared-lib.mjs +1314 -0
  85. package/fesm2020/annalib-anna-core-src-lib-anna-core-shared-lib.mjs.map +1 -0
  86. package/fesm2020/annalib-anna-core-src-lib-anna-dropdown-lib.mjs +491 -0
  87. package/fesm2020/annalib-anna-core-src-lib-anna-dropdown-lib.mjs.map +1 -0
  88. package/fesm2020/annalib-anna-core-src-lib-anna-generic-table-lib.mjs +2389 -0
  89. package/fesm2020/annalib-anna-core-src-lib-anna-generic-table-lib.mjs.map +1 -0
  90. package/fesm2020/annalib-anna-core.mjs +4168 -0
  91. package/fesm2020/annalib-anna-core.mjs.map +1 -0
  92. package/lib/anna-core-shared-lib/anna-core-shared-lib.module.d.ts +14 -0
  93. package/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.d.ts +8 -0
  94. package/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.d.ts +8 -0
  95. package/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.d.ts +11 -0
  96. package/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.d.ts +8 -0
  97. package/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.d.ts +11 -0
  98. package/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.d.ts +8 -0
  99. package/lib/anna-core-shared-lib/constants/shared.constant.d.ts +32 -0
  100. package/lib/anna-core-shared-lib/index.d.ts +1 -0
  101. package/lib/anna-core-shared-lib/models/anna-generic-data-type.model.d.ts +8 -0
  102. package/{src/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.ts → lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.d.ts} +9 -21
  103. package/{src/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.ts → lib/anna-core-shared-lib/models/anna-non-editable-gt-models.d.ts} +17 -27
  104. package/lib/anna-core-shared-lib/models/anna-sort.model.d.ts +6 -0
  105. package/lib/anna-core-shared-lib/models/anna-tooltip.model.d.ts +23 -0
  106. package/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.d.ts +9 -0
  107. package/{src/lib/anna-core-shared-lib/public-api.ts → lib/anna-core-shared-lib/public-api.d.ts} +0 -11
  108. package/lib/anna-core-shared-lib/services/anna-date-time-format.service.d.ts +25 -0
  109. package/lib/anna-core-shared-lib/services/anna-filter.service.d.ts +82 -0
  110. package/lib/anna-core-shared-lib/services/anna-generic-table.service.d.ts +14 -0
  111. package/lib/anna-core-shared-lib/services/anna-global-config.service.d.ts +21 -0
  112. package/lib/anna-core-shared-lib/services/anna-sort.service.d.ts +16 -0
  113. package/lib/anna-dropdown-lib/anna-dropdown-lib.module.d.ts +11 -0
  114. package/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.d.ts +34 -0
  115. package/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.d.ts +67 -0
  116. package/lib/anna-dropdown-lib/index.d.ts +1 -0
  117. package/{src/lib/anna-dropdown-lib/public-api.ts → lib/anna-dropdown-lib/public-api.d.ts} +1 -4
  118. package/lib/anna-generic-table-lib/anna-generic-table-lib.module.d.ts +21 -0
  119. package/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.d.ts +207 -0
  120. package/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.d.ts +16 -0
  121. package/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.d.ts +141 -0
  122. package/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.d.ts +89 -0
  123. package/{src/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.ts → lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.d.ts} +0 -0
  124. package/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.d.ts +45 -0
  125. package/{src/lib/anna-generic-table-lib/directives/anna-virtual-table/index.ts → lib/anna-generic-table-lib/directives/anna-virtual-table/index.d.ts} +0 -0
  126. package/lib/anna-generic-table-lib/index.d.ts +1 -0
  127. package/{src/lib/anna-generic-table-lib/public-api.ts → lib/anna-generic-table-lib/public-api.d.ts} +0 -5
  128. package/package.json +61 -17
  129. package/{src/public-api.ts → public-api.d.ts} +0 -5
  130. package/src/lib/anna-core-shared-lib/anna-core-shared-lib.module.d.ts +14 -0
  131. package/src/lib/anna-core-shared-lib/annalib-anna-core-src-lib-anna-core-shared-lib.d.ts +5 -0
  132. package/src/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.d.ts +8 -0
  133. package/src/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.d.ts +8 -0
  134. package/src/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.d.ts +11 -0
  135. package/src/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.d.ts +8 -0
  136. package/src/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.d.ts +11 -0
  137. package/src/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.d.ts +8 -0
  138. package/src/lib/anna-core-shared-lib/constants/shared.constant.d.ts +32 -0
  139. package/src/lib/anna-core-shared-lib/models/anna-generic-data-type.model.d.ts +8 -0
  140. package/src/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.d.ts +95 -0
  141. package/src/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.d.ts +70 -0
  142. package/src/lib/anna-core-shared-lib/models/anna-sort.model.d.ts +6 -0
  143. package/src/lib/anna-core-shared-lib/models/anna-tooltip.model.d.ts +23 -0
  144. package/src/lib/anna-core-shared-lib/package.json +10 -0
  145. package/src/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.d.ts +9 -0
  146. package/src/lib/anna-core-shared-lib/public-api.d.ts +19 -0
  147. package/src/lib/anna-core-shared-lib/services/anna-date-time-format.service.d.ts +25 -0
  148. package/src/lib/anna-core-shared-lib/services/anna-filter.service.d.ts +82 -0
  149. package/src/lib/anna-core-shared-lib/services/anna-generic-table.service.d.ts +14 -0
  150. package/src/lib/anna-core-shared-lib/services/anna-global-config.service.d.ts +21 -0
  151. package/src/lib/anna-core-shared-lib/services/anna-sort.service.d.ts +16 -0
  152. package/src/lib/anna-dropdown-lib/anna-dropdown-lib.module.d.ts +11 -0
  153. package/src/lib/anna-dropdown-lib/annalib-anna-core-src-lib-anna-dropdown-lib.d.ts +5 -0
  154. package/src/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.d.ts +34 -0
  155. package/src/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.d.ts +67 -0
  156. package/src/lib/anna-dropdown-lib/package.json +10 -0
  157. package/src/lib/anna-dropdown-lib/public-api.d.ts +3 -0
  158. package/src/lib/anna-generic-table-lib/anna-generic-table-lib.module.d.ts +21 -0
  159. package/src/lib/anna-generic-table-lib/annalib-anna-core-src-lib-anna-generic-table-lib.d.ts +5 -0
  160. package/src/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.d.ts +207 -0
  161. package/src/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.d.ts +16 -0
  162. package/src/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.d.ts +141 -0
  163. package/src/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.d.ts +89 -0
  164. package/src/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.d.ts +1 -0
  165. package/src/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.d.ts +45 -0
  166. package/src/lib/anna-generic-table-lib/directives/anna-virtual-table/index.d.ts +1 -0
  167. package/src/lib/anna-generic-table-lib/package.json +10 -0
  168. package/src/lib/anna-generic-table-lib/public-api.d.ts +6 -0
  169. package/.browserslistrc +0 -16
  170. package/karma.conf.js +0 -44
  171. package/ng-package.json +0 -10
  172. package/src/lib/anna-core-shared-lib/anna-core-shared-lib.module.ts +0 -42
  173. package/src/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.html +0 -22
  174. package/src/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.scss +0 -0
  175. package/src/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.spec.ts +0 -25
  176. package/src/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.ts +0 -15
  177. package/src/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.html +0 -20
  178. package/src/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.scss +0 -0
  179. package/src/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.spec.ts +0 -25
  180. package/src/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.ts +0 -15
  181. package/src/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.html +0 -3
  182. package/src/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.scss +0 -16
  183. package/src/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.spec.ts +0 -24
  184. package/src/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.ts +0 -20
  185. package/src/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.html +0 -23
  186. package/src/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.scss +0 -0
  187. package/src/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.spec.ts +0 -25
  188. package/src/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.ts +0 -15
  189. package/src/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.html +0 -15
  190. package/src/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.scss +0 -0
  191. package/src/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.spec.ts +0 -25
  192. package/src/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.ts +0 -19
  193. package/src/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.html +0 -14
  194. package/src/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.scss +0 -0
  195. package/src/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.spec.ts +0 -25
  196. package/src/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.ts +0 -15
  197. package/src/lib/anna-core-shared-lib/constants/shared.constant.ts +0 -34
  198. package/src/lib/anna-core-shared-lib/index.ts +0 -1
  199. package/src/lib/anna-core-shared-lib/models/anna-generic-data-type.model.ts +0 -10
  200. package/src/lib/anna-core-shared-lib/models/anna-sort.model.ts +0 -7
  201. package/src/lib/anna-core-shared-lib/models/anna-tooltip.model.ts +0 -40
  202. package/src/lib/anna-core-shared-lib/ng-package.json +0 -5
  203. package/src/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.ts +0 -26
  204. package/src/lib/anna-core-shared-lib/scss/_colors.scss +0 -107
  205. package/src/lib/anna-core-shared-lib/scss/_filters.scss +0 -577
  206. package/src/lib/anna-core-shared-lib/scss/_fonts.scss +0 -86
  207. package/src/lib/anna-core-shared-lib/scss/_sort.scss +0 -30
  208. package/src/lib/anna-core-shared-lib/services/anna-date-time-format.service.ts +0 -197
  209. package/src/lib/anna-core-shared-lib/services/anna-filter.service.ts +0 -689
  210. package/src/lib/anna-core-shared-lib/services/anna-generic-table.service.ts +0 -44
  211. package/src/lib/anna-core-shared-lib/services/anna-global-config.service.ts +0 -170
  212. package/src/lib/anna-core-shared-lib/services/anna-sort.service.ts +0 -179
  213. package/src/lib/anna-dropdown-lib/anna-dropdown-lib.module.ts +0 -31
  214. package/src/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.html +0 -46
  215. package/src/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.scss +0 -153
  216. package/src/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.spec.ts +0 -24
  217. package/src/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.ts +0 -103
  218. package/src/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.html +0 -129
  219. package/src/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.scss +0 -275
  220. package/src/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.spec.ts +0 -24
  221. package/src/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.ts +0 -410
  222. package/src/lib/anna-dropdown-lib/index.ts +0 -1
  223. package/src/lib/anna-dropdown-lib/ng-package.json +0 -5
  224. package/src/lib/anna-generic-table-lib/anna-generic-table-lib.module.ts +0 -56
  225. package/src/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.html +0 -855
  226. package/src/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.scss +0 -488
  227. package/src/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.spec.ts +0 -25
  228. package/src/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.ts +0 -1748
  229. package/src/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.html +0 -10
  230. package/src/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.scss +0 -1
  231. package/src/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.spec.ts +0 -24
  232. package/src/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.ts +0 -74
  233. package/src/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.html +0 -13
  234. package/src/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.scss +0 -88
  235. package/src/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.spec.ts +0 -25
  236. package/src/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.ts +0 -460
  237. package/src/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.ts +0 -237
  238. package/src/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.ts +0 -204
  239. package/src/lib/anna-generic-table-lib/index.ts +0 -1
  240. package/src/lib/anna-generic-table-lib/ng-package.json +0 -5
  241. package/src/test.ts +0 -27
  242. package/tsconfig.lib.json +0 -16
  243. package/tsconfig.lib.prod.json +0 -10
  244. package/tsconfig.spec.json +0 -17
@@ -0,0 +1,1546 @@
1
+ // Angular import statements
2
+ import { Component, Input, ViewChildren, QueryList, Output, EventEmitter, ChangeDetectorRef } from '@angular/core';
3
+ // Third party import statements
4
+ import moment from "moment";
5
+ import { cloneDeep, isEqual, map, uniq, sortBy } from "lodash-es";
6
+ // User defined import statements
7
+ import { AnnaSortComponent } from '../anna-sort/anna-sort.component';
8
+ //sub-entries of anna lib import statement
9
+ import { TooltipModel, AnnaSortService, AnnaDateTimeFormatService, AnnaFilterService, AnnaGenericTableService, radioButtonModel } from "@annalib/anna-core/src/lib/anna-core-shared-lib";
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "@annalib/anna-core/src/lib/anna-core-shared-lib";
12
+ import * as i2 from "../anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component";
13
+ import * as i3 from "@angular/material/table";
14
+ import * as i4 from "ngx-skeleton-loader";
15
+ import * as i5 from "@angular/material/radio";
16
+ import * as i6 from "../anna-sort/anna-sort.component";
17
+ import * as i7 from "@angular-slider/ngx-slider";
18
+ import * as i8 from "@annalib/anna-core/src/lib/anna-dropdown-lib";
19
+ import * as i9 from "@angular/material/button-toggle";
20
+ import * as i10 from "@angular/common";
21
+ import * as i11 from "../../directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive";
22
+ import * as i12 from "../../directives/anna-virtual-table/anna-virtual-table.directive";
23
+ import * as i13 from "@ng-bootstrap/ng-bootstrap";
24
+ import * as i14 from "@angular/forms";
25
+ export class AnnaNonEditableGenericTableComponent {
26
+ constructor(cdRef, annaSortService, annaDateTimeFormatService, annaFilterService, annaGenericTableService) {
27
+ this.cdRef = cdRef;
28
+ this.annaSortService = annaSortService;
29
+ this.annaDateTimeFormatService = annaDateTimeFormatService;
30
+ this.annaFilterService = annaFilterService;
31
+ this.annaGenericTableService = annaGenericTableService;
32
+ this.maximumRowsWhichCanBeRenderedWithoutScroll = 5;
33
+ this.toggleCheckbox = new EventEmitter();
34
+ this.toggleRowCheckbox = new EventEmitter();
35
+ this.toggleHeaderCheckbox = new EventEmitter();
36
+ this.undoIconClicked = new EventEmitter();
37
+ this.filterAppliedToTable = new EventEmitter();
38
+ this.sortingAppliedToTable = new EventEmitter();
39
+ this.rowClicked = new EventEmitter();
40
+ this.radioButtonSelected = new EventEmitter();
41
+ this.columnFilterOpened = new EventEmitter();
42
+ this.columnFilterClosed = new EventEmitter();
43
+ this.gtIconClicked = new EventEmitter();
44
+ this.gtSVGIconClicked = new EventEmitter();
45
+ this.gtTextActionClicked = new EventEmitter();
46
+ this.gtViewDetailClicked = new EventEmitter();
47
+ this.noDataWidth = "55%";
48
+ this.disableClearAllBtn = true;
49
+ this.disableColumnClearAllBtn = true;
50
+ this.allSelected = 0;
51
+ this.options = {
52
+ floor: 0,
53
+ ceil: 0,
54
+ step: 0.1
55
+ };
56
+ this.tableColumns = [];
57
+ this.totalRowColumns = null;
58
+ this.isScrolledLeft = false;
59
+ this.rowBorderWidth = 2;
60
+ this.PfpIconActiveColor = "#9B1B93";
61
+ this.PfpIconDisableColor = "rgba(189,189,189,0.5)";
62
+ this.showSortComponent = false;
63
+ this.showFilterComponent = false;
64
+ this.tempSortOrder = null;
65
+ this.calendarSelection = { fromDate: null, toDate: null };
66
+ this.showNoDataToDisplay = false;
67
+ this.marginTop = "";
68
+ this.setTooltipRadioNames();
69
+ }
70
+ ngAfterViewChecked() {
71
+ if (this.gtGeneralConfig.component.includes("ORDER_LISTING") || this.gtGeneralConfig.component == "DRRLISTING") {
72
+ this.setMarginLeftForFilterIcon();
73
+ }
74
+ }
75
+ ngOnInit() {
76
+ // this.tableData = this.numberOfSkeletonColumns;
77
+ }
78
+ ngOnChanges(changes) {
79
+ // console.log("generic");
80
+ // console.log(this.tableHeaders);
81
+ // console.log(JSON.stringify(this.tableData));
82
+ if (this.showSkeletonLoading) {
83
+ this.tableData = this.numberOfSkeletonColumns;
84
+ console.log("initalValueMap set");
85
+ this.annaFilterService.initialValueMap = new Map();
86
+ }
87
+ else {
88
+ console.log("ng on change else condition");
89
+ // this.setInitialValueMapData();
90
+ this.disableEnableEachColumnTooltipIcon();
91
+ this.tableColumns = this.tableHeaders.filter(x => x.visible).map(x => x.headerInfo[0].objectKey);
92
+ if (this.tableData && this.tableData.length == 0) {
93
+ this.tableData = Array(2).fill(0);
94
+ this.marginTop = (-this.gtDimension.rowHeight - (this.gtDimension.rowHeight / 2)) + 'px';
95
+ // if(this.gtGeneralConfig.component.includes("ORDER_LISTING")){
96
+ // this.marginTop = "-124px";
97
+ // }
98
+ this.showNoDataToDisplay = true;
99
+ }
100
+ else {
101
+ this.showNoDataToDisplay = false;
102
+ }
103
+ this.showSkeletonLoading = false;
104
+ }
105
+ //setting table column here as well because while showing skeleton loader, we should show table headers.
106
+ if (changes['tableHeaders'] && changes['tableHeaders'].currentValue) {
107
+ this.tableColumns = this.tableHeaders.filter(x => x.visible).map(x => x.headerInfo[0].objectKey);
108
+ this.annaSortService.columnSortState = new Map();
109
+ this.setColumnSortStateMap();
110
+ }
111
+ if (changes['totalRowInfo'] && changes['totalRowInfo'].currentValue) {
112
+ this.totalRowColumns = this.totalRowInfo.map(x => x.colName);
113
+ }
114
+ this.cdRef.detectChanges();
115
+ }
116
+ trackByFn(index) {
117
+ return index;
118
+ }
119
+ setTooltipRadioNames() {
120
+ this.tooltipRadioTextMap = new Map();
121
+ this.tooltipRadioTextMap.set("StartTimeForFilter", "Start Time");
122
+ this.tooltipRadioTextMap.set("EndTimeForFilter", "End Time");
123
+ this.tooltipRadioTextMap.set("start_time_for_filter", "Start Time");
124
+ this.tooltipRadioTextMap.set("end_time_for_filter", "End Time");
125
+ this.tooltipRadioTextMap.set("primaryAEName", "Primary AE");
126
+ this.tooltipRadioTextMap.set("region", "Region");
127
+ this.tooltipRadioTextMap.set("agencyName", "Agency");
128
+ this.tooltipRadioTextMap.set("location", "Location");
129
+ this.tooltipRadioTextMap.set("advertiserName", "Advertiser");
130
+ this.tooltipRadioTextMap.set("productCode", "Product Code");
131
+ this.tooltipRadioTextMap.set("flightStartDate", "Start Date");
132
+ this.tooltipRadioTextMap.set("flightEndDate", "End Date");
133
+ this.tooltipRadioTextMap.set("orderIdAndRevNumber", "STN Order#-Rev#");
134
+ this.tooltipRadioTextMap.set("alternateOrderId", "Buyer Order#");
135
+ this.tooltipRadioTextMap.set("grp", "GRP");
136
+ this.tooltipRadioTextMap.set("cpp", "CPP");
137
+ this.tooltipRadioTextMap.set("imps", "IMPS");
138
+ this.tooltipRadioTextMap.set("cpm", "CPM");
139
+ this.tooltipRadioTextMap.set("offeredMGs", "Offered MG");
140
+ this.tooltipRadioTextMap.set("outstandingPE", "O/S PE");
141
+ this.tooltipRadioTextMap.set("offeredADUs", "Offered ADUs");
142
+ this.tooltipRadioTextMap.set("udDeficitValue", "Pending Audience Delta");
143
+ this.tooltipRadioTextMap.set("startEndTimeMulti", "Time");
144
+ this.tooltipRadioTextMap.set("bookedValue", "Booked");
145
+ this.tooltipRadioTextMap.set("bookedSpots", "Spots");
146
+ this.tooltipRadioTextMap.set("userChanges", "Other changes");
147
+ this.tooltipRadioTextMap.set("inventoryCode", "Inventory Code");
148
+ this.tooltipRadioTextMap.set("program", "Program");
149
+ this.tooltipRadioTextMap.set("agency", "Agency");
150
+ this.tooltipRadioTextMap.set("advertiser", "Advertiser");
151
+ this.tooltipRadioTextMap.set("startDate", "Start Date");
152
+ this.tooltipRadioTextMap.set("endDate", "End Date");
153
+ this.tooltipRadioTextMap.set("rcvPreempt", "Madegood PE");
154
+ this.tooltipRadioTextMap.set("osPreempt", "O/S PE");
155
+ this.tooltipRadioTextMap.set("rcvUnderDly", "Recovered UD");
156
+ this.tooltipRadioTextMap.set("osUnderDly", "O/s Under Dly");
157
+ this.tooltipRadioTextMap.set("primaryAe", "Primary AE");
158
+ this.tooltipRadioTextMap.set("region", "Region");
159
+ this.tooltipRadioTextMap.set("revCode1", "Rev code 1");
160
+ this.tooltipRadioTextMap.set("orderNoRevNo", "STN Order#-Rev#");
161
+ this.tooltipRadioTextMap.set("revCode2", "Rev code 2");
162
+ this.tooltipRadioTextMap.set("revCode3", "Rev code 3");
163
+ this.tooltipRadioTextMap.set("booked", "Booked");
164
+ this.tooltipRadioTextMap.set("spots", "Spots");
165
+ this.tooltipRadioTextMap.set("postedAudPercent", "Posted %");
166
+ this.tooltipRadioTextMap.set("revision", "Revision");
167
+ this.tooltipRadioTextMap.set("productCode", "Product Code");
168
+ this.tooltipRadioTextMap.set("buyerOrderId", "ALT Order#");
169
+ this.tooltipRadioTextMap.set("demo", "Demo");
170
+ this.tooltipRadioTextMap.set("postedAdu", "Posted ADUs");
171
+ this.tooltipRadioTextMap.set("scheduledAdu", "Scheduled ADUs");
172
+ this.tooltipRadioTextMap.set("audienceDeficit", "Audience Deficit");
173
+ this.tooltipRadioTextMap.set("postedAudPercent", "Posted Audience %");
174
+ this.tooltipRadioTextMap.set("potentialUnitsValue", "POT Units");
175
+ this.tooltipRadioTextMap.set("bookedUnitsValue", "Booked Units");
176
+ this.tooltipRadioTextMap.set("bookedAmountWithZeroRatingValue", "Total $ Booked");
177
+ this.tooltipRadioTextMap.set("bookedAmountPercentageWithZeroRatingValue", "% of $ Booked");
178
+ this.tooltipRadioTextMap.set("bookedAmountWithoutZeroRatingValue", "$Booked With Imps(’000)");
179
+ this.tooltipRadioTextMap.set("bookedAmountPercentageWithoutZeroRatingValue", "% OF $ Booked");
180
+ }
181
+ generateTableDataWrapper() {
182
+ this.showSkeletonLoading = true;
183
+ this.tableDataWrapper = [];
184
+ let rowObject;
185
+ let columnName;
186
+ let columnObject;
187
+ let columnObjectKey;
188
+ let keysUsedForTableDisplay;
189
+ let keysUsedForColumn;
190
+ let additionalInfoObject;
191
+ let additionalKeys;
192
+ this.tableData.forEach((obj) => {
193
+ rowObject = {};
194
+ keysUsedForTableDisplay = [];
195
+ for (var colNum in this.tableHeaders) {
196
+ columnObject = {};
197
+ if (!this.tableHeaders[colNum].visible) {
198
+ continue;
199
+ }
200
+ columnName = "";
201
+ keysUsedForColumn = [];
202
+ this.tableHeaders[colNum].headerInfo.forEach((header) => {
203
+ if (header.typeOfBodyData === "STRING") {
204
+ columnObjectKey = header.objectKey;
205
+ columnObject[columnObjectKey] = obj[columnObjectKey];
206
+ keysUsedForTableDisplay.push(columnObjectKey);
207
+ keysUsedForColumn.push(columnObjectKey);
208
+ }
209
+ else if (header.typeOfBodyData === "ICON") {
210
+ columnObjectKey = header.typeOfBodyData;
211
+ columnObject[columnObjectKey] = obj[header.objectKey];
212
+ keysUsedForColumn.push(header.objectKey);
213
+ }
214
+ else if (header.typeOfBodyData === "CHECKBOX") {
215
+ columnObjectKey = header.typeOfBodyData;
216
+ columnObject[columnObjectKey] = obj[header.objectKey];
217
+ keysUsedForColumn.push(header.objectKey);
218
+ }
219
+ });
220
+ for (var i = 0; i < keysUsedForColumn.length; i++) {
221
+ columnName += keysUsedForColumn[i];
222
+ if (i !== keysUsedForColumn.length - 1) {
223
+ columnName += ',';
224
+ }
225
+ }
226
+ rowObject[columnName] = columnObject;
227
+ }
228
+ additionalInfoObject = {};
229
+ additionalKeys = Object.keys(obj).filter(key => !keysUsedForTableDisplay.includes(key));
230
+ additionalKeys.forEach(key => {
231
+ additionalInfoObject[key] = obj[key];
232
+ });
233
+ rowObject.AdditionalInfo = additionalInfoObject;
234
+ this.tableDataWrapper.push(rowObject);
235
+ });
236
+ this.tableData = this.tableDataWrapper;
237
+ this.showSkeletonLoading = false;
238
+ // console.log(JSON.stringify(this.tableDataWrapper));
239
+ }
240
+ selectOrUnselectCheckbox(rowData, columnKeys, isCheckboxSelected) {
241
+ this.toggleCheckbox.emit({ rowData, columnKeys, isCheckboxSelected });
242
+ }
243
+ selectUnselectAllRows() {
244
+ this.toggleHeaderCheckbox.emit();
245
+ }
246
+ selectUnselectRow(rowData) {
247
+ this.toggleRowCheckbox.emit(rowData);
248
+ }
249
+ undoCreditedSpot(data) {
250
+ this.undoIconClicked.emit({ data, mgOrCredit: "Credit" });
251
+ }
252
+ undoMgSpot(data) {
253
+ this.undoIconClicked.emit({ data, mgOrCredit: "MakeGood" });
254
+ }
255
+ //Sort and Filter Logic begins!
256
+ closeTooltip() {
257
+ if (this.tooltip && this.tooltip.isOpen()) {
258
+ this.tooltip.close();
259
+ }
260
+ this.tooltip = null;
261
+ this.disableCheckboxApply = false;
262
+ if (!this.bindValueFuncCalled) {
263
+ this.columnFilterClosed.emit();
264
+ }
265
+ }
266
+ // closeSortTooltip() {
267
+ // if (this.annaSortService.tooltip && this.annaSortService.tooltip.isOpen()) {
268
+ // this.annaSortService.tooltip.close();
269
+ // }
270
+ // }
271
+ // initFilters() {
272
+ // this.annaFilterService.tooltipMap = new Map();
273
+ // this.annaFilterService.tooltipSelectedMap = new Map();
274
+ // // this.annaSortService.sortByAsc = new Map();
275
+ // // this.annaSortService.sortByDesc = new Map();
276
+ // this.annaFilterService.selectedRadio = null;
277
+ // this.annaFilterService.appliedFiltersArray = [];
278
+ // //closing the sort tooltip if we route on the same route or if we click dropdown filters
279
+ // // this.closeSortTooltip();
280
+ // // this.annaSortService.tooltip = null;
281
+ // this.disableClearAllBtn = true;
282
+ // this.disableTimeFilterApplyBtn = false;
283
+ // }
284
+ // setInitialValueMapData() {
285
+ // this.annaFilterService.initialValueMap = new Map();
286
+ // this.tableHeaders.forEach((column) => {
287
+ // column.headerInfo.forEach((header) => {
288
+ // if (header.filter === "SLIDER") {
289
+ // header.filterObjectKeys.forEach((key) => {
290
+ // let min = this.annaFilterService.returnMaxAndMinValue(this.clonedTableData, key, true);
291
+ // let max = this.annaFilterService.returnMaxAndMinValue(this.clonedTableData, key, false);
292
+ // let obj = { min, max };
293
+ // this.annaFilterService.initialValueMap.set(key, obj);
294
+ // })
295
+ // }
296
+ // else if (header.filter === "DATE") {
297
+ // header.filterObjectKeys.forEach((key) => {
298
+ // if(key == "period"){
299
+ // const minMaxStartDate = this.annaFilterService.returnMinAndMaxDate(this.clonedTableData, "startDate");
300
+ // const minMaxEndDate = this.annaFilterService.returnMinAndMaxDate(this.clonedTableData, "endDate");
301
+ // let dateObj = { minSelectedDate: minMaxStartDate[0], maxSelectedDate: minMaxEndDate[1] };
302
+ // this.annaFilterService.initialValueMap.set(key, dateObj);
303
+ // }
304
+ // else{
305
+ // const minMaxDate = this.annaFilterService.returnMinAndMaxDate(this.clonedTableData, key);
306
+ // let obj = { minSelectedDate: minMaxDate[0], maxSelectedDate: minMaxDate[1] };
307
+ // this.annaFilterService.initialValueMap.set(key, obj);
308
+ // }
309
+ // })
310
+ // }
311
+ // else if (header.filter === "TIME") {
312
+ // header.filterObjectKeys.forEach((key) => {
313
+ // let data = this.clonedTableData.filter((obj: { [x: string]: string; }) => !["", "-", null, "0", "<multi>"].includes(obj[key]));
314
+ // let timeArr = map(data, key);
315
+ // timeArr.sort((a, b) => {
316
+ // return this.annaDateTimeFormatService.sortByTimeAscending(a, b);
317
+ // });
318
+ // let obj = {
319
+ // fromTime: timeArr[0],
320
+ // toTime: timeArr[timeArr.length - 1],
321
+ // };
322
+ // if (this.gtGeneralConfig.component === "SPOTDETAILS" || this.gtGeneralConfig.component === "EXCLUDEINVENTORYPOPUP") {
323
+ // let includeMulti = this.clonedTableData.findIndex((obj: { [x: string]: string; }) => obj[key] == "<multi>") != -1;
324
+ // let includeZero = this.clonedTableData.findIndex((obj: { [x: string]: string; }) => obj[key] == "0") != -1;
325
+ // let includeTimeRange = this.clonedTableData.findIndex((obj: { [x: string]: string; }) => obj[key] != "0" && obj[key] != "<multi>") != -1;
326
+ // let obj = {
327
+ // fromTime: timeArr[0],
328
+ // toTime: timeArr[timeArr.length - 1],
329
+ // includeMulti: includeMulti,
330
+ // includeZero: includeZero,
331
+ // includeTimeRange: includeTimeRange
332
+ // };
333
+ // this.annaFilterService.initialValueMap.set(key, obj);
334
+ // }
335
+ // else if (this.gtGeneralConfig.component === "RATING") {
336
+ // let includeMulti = this.clonedTableData.findIndex((obj: any) => obj[key][0] == "<multi>") != -1;
337
+ // let includeZero = this.clonedTableData.findIndex((obj: { [x: string]: string[]; }) => obj[key][0] == "0") != -1;
338
+ // let includeTimeRange = this.clonedTableData.findIndex((obj: { [x: string]: string[]; }) => obj[key][0] != "0" && obj[key][0] != "<multi>") != -1;
339
+ // let startTimeArr = map(this.clonedTableData, "startTime");
340
+ // let endTimeArr = map(this.clonedTableData, "endTime");
341
+ // startTimeArr.sort((a, b) => {
342
+ // return this.annaDateTimeFormatService.sortByTimeAscending(a, b);
343
+ // });
344
+ // endTimeArr.sort((a, b) => {
345
+ // return this.annaDateTimeFormatService.sortByTimeDescending(a, b);
346
+ // });
347
+ // let obj = {
348
+ // fromTime: startTimeArr[0],
349
+ // toTime: endTimeArr[0],
350
+ // includeMulti: includeMulti,
351
+ // includeZero: includeZero,
352
+ // includeTimeRange: includeTimeRange
353
+ // };
354
+ // this.annaFilterService.initialValueMap.set(key, obj);
355
+ // }
356
+ // else {
357
+ // this.annaFilterService.initialValueMap.set(key, obj);
358
+ // }
359
+ // })
360
+ // }
361
+ // })
362
+ // })
363
+ // }
364
+ isTooltipActive(header) {
365
+ return this.annaFilterService.isTooltipActive(header, this.annaSortService.columnSortState);
366
+ }
367
+ bindTheValueToToolTip(tooltip, header) {
368
+ this.bindValueFuncCalled = true;
369
+ let containerToScroll;
370
+ if (this.gtGeneralConfig.component === "SPOTDETAILS" || this.gtGeneralConfig.component === "DRRLISTING") {
371
+ containerToScroll = document.getElementsByClassName("scrollable-container")[0];
372
+ var mediaQuery = window.matchMedia("(max-width: 1366px)");
373
+ if (mediaQuery.matches) {
374
+ containerToScroll.scroll(0, this.gtGeneralConfig.verticalScrollOffsetForFilterTooltip);
375
+ }
376
+ }
377
+ if (!this.annaFilterService.tooltipSelectedMap) {
378
+ console.log("tooltip selected map not initialized");
379
+ this.annaFilterService.tooltipSelectedMap = new Map();
380
+ }
381
+ // if same tooltip opened close it
382
+ //need to change this
383
+ //THe tooltip should not close
384
+ // if (tooltip == this.tooltip) {
385
+ // this.bindValueFuncCalled = false;
386
+ // this.closeTooltip();
387
+ // }
388
+ // else {
389
+ if (tooltip == this.tooltip) {
390
+ console.log("inside if");
391
+ this.bindValueFuncCalled = false;
392
+ this.sameTooltipClicked = true;
393
+ }
394
+ this.searchItem = this.sameTooltipClicked ? this.searchItem : "";
395
+ let enabledHeaders = [];
396
+ header.filterSortObjectKeys.forEach((item) => {
397
+ if (item == "period") {
398
+ let uniqStartDate = uniq(this.tableData.map((u) => u["startDate"]));
399
+ let uniqEndDate = uniq(this.tableData.map((u) => u["endDate"]));
400
+ if (uniqStartDate.length > 1 || uniqEndDate.length > 1 || this.isTooltipActive([item])) {
401
+ enabledHeaders.push(item);
402
+ }
403
+ }
404
+ else if (uniq(this.tableData.map((u) => u[item])).length > 1 || this.isTooltipActive([item])) {
405
+ enabledHeaders.push(item);
406
+ }
407
+ });
408
+ this.openTooltip(tooltip, enabledHeaders, header);
409
+ if (window.innerWidth < 1500 && window.innerHeight < 768 && !this.annaFilterService.sliderSet.has(header.filterSortObjectKeys[0])) {
410
+ this.columnFilterOpened.emit();
411
+ }
412
+ this.showCheckboxFilterRadioButtons = header.filterSortObjectKeys.length > 1;
413
+ let radioButtonData = this.sameTooltipClicked ? this.radioButtons.filter(item => item.key == this.annaFilterService.selectedRadio)[0] : this.radioButtons[0];
414
+ this.populateTooltipDataBasedOnSelectedRadio(radioButtonData);
415
+ this.bindValueFuncCalled = false;
416
+ // }
417
+ }
418
+ openTooltip(tooltip, header, columnHeader) {
419
+ this.closeTooltip();
420
+ this.tooltip = tooltip;
421
+ this.tooltip.open();
422
+ //convert key into the header
423
+ this.radioButtons = header.map((key, index) => {
424
+ let value = this.tooltipRadioTextMap.has(key)
425
+ ? this.tooltipRadioTextMap.get(key)
426
+ : key; //change to display name
427
+ return new radioButtonModel(key, value, columnHeader.isSortRequired[index], columnHeader.isFilterRequired[index]);
428
+ });
429
+ }
430
+ clearColumnFilter() {
431
+ this.annaFilterService.clearColumnFilter();
432
+ this.closeTooltip();
433
+ this.tableData = cloneDeep(this.annaFilterService.filterData(this.clonedTableData, ""));
434
+ this.annaSortService.noSortingAppliedData = this.tableData;
435
+ this.checkIfSortingIsApplied();
436
+ this.filterAppliedToTable.emit(this.tableData);
437
+ this.disableEnableEachColumnTooltipIcon();
438
+ }
439
+ populateTooltipDataBasedOnSelectedRadio(radioButtonData) {
440
+ let header = radioButtonData.key;
441
+ this.selectedLabel = radioButtonData.label;
442
+ this.showSortComponent = false;
443
+ this.showFilterComponent = false;
444
+ this.searchItem = this.sameTooltipClicked ? this.searchItem : null;
445
+ // setTimeout(() => {
446
+ this.showSortComponent = radioButtonData.isSortRequired;
447
+ this.showFilterComponent = radioButtonData.isFilterRequired;
448
+ // }, 0);
449
+ this.tempSortOrder = this.sameTooltipClicked ? this.tempSortOrder : null;
450
+ if (this.sameTooltipClicked && this.tempSortOrder) {
451
+ setTimeout(() => {
452
+ this.annaSortService.updateSortTypeSubject.next(this.tempSortOrder);
453
+ }, 0);
454
+ }
455
+ if (this.toolTipdata) {
456
+ this.revert();
457
+ }
458
+ this.annaFilterService.selectedRadio = header;
459
+ let selectedFilterSet = new Set(this.annaFilterService.appliedFiltersArray);
460
+ let isSortPresent = (this.annaSortService.columnSortState.size > 0 && this.annaSortService.columnSortState.get(this.annaFilterService.selectedRadio) != "DEFAULT");
461
+ this.disableColumnClearAllBtn = selectedFilterSet.has(this.annaFilterService.selectedRadio) || isSortPresent ? false : true;
462
+ if (this.sameTooltipClicked && this.annaFilterService.calendarSet.has(this.annaFilterService.selectedRadio)) {
463
+ if (this.calendarSelection.fromDate && this.calendarSelection.toDate) {
464
+ this.selectedMinDate = this.calendarSelection.fromDate;
465
+ this.selectedMaxDate = this.calendarSelection.toDate;
466
+ }
467
+ else {
468
+ this.selectedMinDate = cloneDeep(this.selectedMinDate);
469
+ this.selectedMaxDate = cloneDeep(this.selectedMaxDate);
470
+ console.log("inside else");
471
+ console.log(this.selectedMinDate);
472
+ console.log(this.selectedMaxDate);
473
+ }
474
+ }
475
+ if (radioButtonData.isFilterRequired && !this.sameTooltipClicked) {
476
+ this.disableSliderApplyButton = false;
477
+ this.disableCheckboxApply = false;
478
+ if (this.annaFilterService.calendarSet.has(header)) {
479
+ this.getCalendarData();
480
+ }
481
+ else if (this.annaFilterService.sliderSet.has(header)) {
482
+ this.getSliderData(header);
483
+ }
484
+ else if (this.annaFilterService.timeSet.has(header)) {
485
+ this.getTimeFilterData(header);
486
+ }
487
+ else {
488
+ this.getCheckboxData(header);
489
+ }
490
+ }
491
+ this.sameTooltipClicked = false;
492
+ }
493
+ getSliderData(header) {
494
+ let translateFunc;
495
+ if (this.annaFilterService.sliderCurrencySet.has(header)) {
496
+ translateFunc = "currency";
497
+ }
498
+ else if (header == "postedAudPercent") {
499
+ translateFunc = "percent";
500
+ }
501
+ else {
502
+ translateFunc = "normal";
503
+ }
504
+ let optionsData = this.annaFilterService.getFilterOptionsData(this.tableData, this.clonedTableData);
505
+ let minValue = this.annaFilterService.returnMaxAndMinValue(optionsData, header, true);
506
+ let maxValue = this.annaFilterService.returnMaxAndMinValue(optionsData, header, false);
507
+ let obj = this.annaFilterService.setOptionValues(minValue, maxValue);
508
+ if (translateFunc === "normal") {
509
+ obj.translate = this.annaFilterService.normalTranslateFunction;
510
+ }
511
+ else if (translateFunc === "percent") {
512
+ obj.translate = this.annaFilterService.percentTranslateFunction;
513
+ }
514
+ else if (translateFunc === "currency") {
515
+ obj.translate = this.annaFilterService.currencyTranslateFunction;
516
+ }
517
+ this.options = obj;
518
+ if (this.annaFilterService.tooltipSelectedMap.has(header)) {
519
+ let selectedObj = this.annaFilterService.tooltipSelectedMap.get(header);
520
+ this.sliderMinValue = selectedObj.min < this.options.floor ? this.options.floor : selectedObj.min;
521
+ this.sliderMaxValue = selectedObj.max < this.options.ceil ? selectedObj.max : this.options.ceil;
522
+ }
523
+ else {
524
+ this.sliderMinValue = this.options.floor;
525
+ this.sliderMaxValue = this.options.ceil;
526
+ }
527
+ //default step values
528
+ this.options.step = 1;
529
+ this.sliderFilterTextBoxStep = "1";
530
+ if (header !== "WeekNumber") {
531
+ this.options.step = 0.1;
532
+ this.sliderFilterTextBoxStep = "0.1";
533
+ }
534
+ }
535
+ getCheckboxData(header) {
536
+ let optionData = this.annaFilterService.getFilterOptionsData(this.tableData, this.clonedTableData);
537
+ let uniqOptionData = uniq(optionData.map(item => item[header]));
538
+ let tooltipOptions = uniqOptionData.map(item => new TooltipModel(item));
539
+ if (this.annaFilterService.tooltipSelectedMap.has(header)) {
540
+ let selectedValueSet = new Set(this.annaFilterService.tooltipSelectedMap.get(header));
541
+ tooltipOptions.forEach(item => item.isSelected = selectedValueSet.has(item.data) ? true : false);
542
+ }
543
+ else {
544
+ tooltipOptions.forEach(item => item.isSelected = true);
545
+ }
546
+ let index = tooltipOptions.findIndex(item => item.data == null);
547
+ if (index != -1) {
548
+ tooltipOptions[index].data = "(Blank)";
549
+ }
550
+ let selectedItems = sortBy(tooltipOptions.filter(item => item.isSelected), "data");
551
+ let unselectedItems = sortBy(tooltipOptions.filter(item => !item.isSelected), "data");
552
+ this.clonedTooltipOptions = [...selectedItems, ...unselectedItems];
553
+ this.tooltipOptions = cloneDeep(this.clonedTooltipOptions);
554
+ this.disableSelectAll = unselectedItems.length == 0;
555
+ this.disableClearAll = selectedItems.length == 0;
556
+ }
557
+ getCalendarData() {
558
+ const parsingFormat = "MM/DD/YYYY";
559
+ let optionData = this.annaFilterService.getFilterOptionsData(this.tableData, this.clonedTableData);
560
+ let minMaxDate;
561
+ if (this.annaFilterService.selectedRadio == "period") {
562
+ let minStartDate = this.annaFilterService.returnMinAndMaxDate(optionData, "startDate");
563
+ let maxEndDate = this.annaFilterService.returnMinAndMaxDate(optionData, "endDate");
564
+ minMaxDate = [minStartDate[0], maxEndDate[1]];
565
+ }
566
+ else {
567
+ minMaxDate = this.annaFilterService.returnMinAndMaxDate(optionData, this.annaFilterService.selectedRadio);
568
+ }
569
+ console.log(minMaxDate);
570
+ this.calendarMinEnabledDate = this.annaDateTimeFormatService.convertToNgbDate(minMaxDate[0], parsingFormat);
571
+ this.calendarMaxEnabledDate = this.annaDateTimeFormatService.convertToNgbDate(minMaxDate[1], parsingFormat);
572
+ console.log(this.calendarMinEnabledDate);
573
+ console.log(this.calendarMaxEnabledDate);
574
+ if (this.annaFilterService.tooltipSelectedMap.has(this.annaFilterService.selectedRadio)) {
575
+ let selectedDateObj = this.annaFilterService.tooltipSelectedMap.get(this.annaFilterService.selectedRadio);
576
+ if (selectedDateObj.fromDate.isAfter(minMaxDate[0])) {
577
+ this.selectedMinDate = this.annaDateTimeFormatService.convertToNgbDate(selectedDateObj.fromDate, parsingFormat);
578
+ }
579
+ else {
580
+ this.selectedMinDate = this.annaDateTimeFormatService.convertToNgbDate(minMaxDate[0], parsingFormat);
581
+ }
582
+ if (selectedDateObj.toDate.isAfter(minMaxDate[1])) {
583
+ this.selectedMaxDate = this.annaDateTimeFormatService.convertToNgbDate(minMaxDate[1], parsingFormat);
584
+ }
585
+ else {
586
+ this.selectedMaxDate = this.annaDateTimeFormatService.convertToNgbDate(selectedDateObj.toDate, parsingFormat);
587
+ }
588
+ }
589
+ else {
590
+ this.selectedMinDate = cloneDeep(this.calendarMinEnabledDate);
591
+ this.selectedMaxDate = cloneDeep(this.calendarMaxEnabledDate);
592
+ }
593
+ console.log(this.selectedMinDate);
594
+ console.log(this.selectedMaxDate);
595
+ }
596
+ getTimeFilterData(header) {
597
+ this.startTimeHourErr = this.startTimeMinErr = this.endTimeHourErr = this.endTimeMinErr = false;
598
+ if (this.annaFilterService.tooltipSelectedMap.has(header)) {
599
+ this.selectedFromTime = this.annaFilterService.tooltipSelectedMap.get(header).fromTime;
600
+ this.selectedToTime = this.annaFilterService.tooltipSelectedMap.get(header).toTime;
601
+ }
602
+ else {
603
+ this.setInitialValueMapForTimeFilter(header);
604
+ this.selectedFromTime = this.annaFilterService.initialValueMap.get(header).fromTime;
605
+ this.selectedToTime = this.annaFilterService.initialValueMap.get(header).toTime;
606
+ }
607
+ if (this.selectedFromTime != undefined || this.selectedToTime != undefined) {
608
+ this.selectedFromTime = this.annaDateTimeFormatService.formatToTwelveHrs(this.selectedFromTime, true);
609
+ this.selectedToTime = this.annaDateTimeFormatService.formatToTwelveHrs(this.selectedToTime, true);
610
+ this.clonedSelectedFromTime = cloneDeep(this.selectedFromTime);
611
+ this.clonedSelectedToTime = cloneDeep(this.selectedToTime);
612
+ }
613
+ else {
614
+ this.selectedFromTime = ["-", "-", "-"];
615
+ this.selectedToTime = ["-", "-", "-"];
616
+ this.disableTimeFilterApplyBtn = true;
617
+ }
618
+ if (this.gtGeneralConfig.component === "SPOTDETAILS" || this.gtGeneralConfig.component === "EXCLUDEINVENTORYPOPUP") {
619
+ this.setTimeFilterDataForComponentsOtherThanRatingsPage(header);
620
+ }
621
+ else if (this.gtGeneralConfig.component === "RATING") {
622
+ this.setTimeFilterDataForRatingPageComponent(header);
623
+ }
624
+ }
625
+ //Need to change this method
626
+ setTimeFilterDataForComponentsOtherThanRatingsPage(header) {
627
+ this.showMultiTimeCheckbox = false;
628
+ this.showZeroTimeCheckbox = false;
629
+ this.showEnterTimeCheckbox = false;
630
+ this.multiTimeCheckboxChecked = false;
631
+ this.zeroTimeCheckboxChecked = false;
632
+ this.enterTimeCheckboxChecked = false;
633
+ let optionsData = this.annaFilterService.getFilterOptionsData(this.tableData, this.clonedTableData);
634
+ let selectedObj;
635
+ if (this.annaFilterService.tooltipSelectedMap.has(header)) {
636
+ selectedObj = this.annaFilterService.tooltipSelectedMap.get(header);
637
+ }
638
+ else {
639
+ selectedObj = this.annaFilterService.initialValueMap.get(header);
640
+ }
641
+ if (optionsData.findIndex(obj => obj[header] == "0") != -1) {
642
+ this.showZeroTimeCheckbox = true;
643
+ this.zeroTimeCheckboxChecked = selectedObj.includeZeroTime;
644
+ }
645
+ if (optionsData.findIndex(obj => obj[header] == "<multi>") != -1) {
646
+ this.showMultiTimeCheckbox = true;
647
+ this.multiTimeCheckboxChecked = selectedObj.includeMulti;
648
+ }
649
+ if (this.showZeroTimeCheckbox || this.showMultiTimeCheckbox) {
650
+ this.showEnterTimeCheckbox = true;
651
+ }
652
+ if (optionsData.findIndex(obj => obj[header] != "<multi>" && obj[header] != "0") != -1) {
653
+ this.enterTimeCheckboxChecked = selectedObj.includeTimeRange;
654
+ }
655
+ }
656
+ setTimeFilterDataForRatingPageComponent(header) {
657
+ this.showMultiTimeCheckbox = false;
658
+ this.showZeroTimeCheckbox = false;
659
+ this.showEnterTimeCheckbox = false;
660
+ this.multiTimeCheckboxChecked = false;
661
+ this.zeroTimeCheckboxChecked = false;
662
+ this.enterTimeCheckboxChecked = false;
663
+ let optionsData = this.annaFilterService.getFilterOptionsData(this.tableData, this.clonedTableData);
664
+ let selectedObj;
665
+ if (this.annaFilterService.tooltipSelectedMap.has(header)) {
666
+ selectedObj = this.annaFilterService.tooltipSelectedMap.get(header);
667
+ }
668
+ else {
669
+ selectedObj = this.annaFilterService.initialValueMap.get(header);
670
+ }
671
+ if (optionsData.findIndex(obj => obj[header][0] == "0") != -1) {
672
+ this.showZeroTimeCheckbox = true;
673
+ this.zeroTimeCheckboxChecked = selectedObj.includeZeroTime;
674
+ }
675
+ if (optionsData.findIndex(obj => obj[header][0] == "<multi>") != -1) {
676
+ this.showMultiTimeCheckbox = true;
677
+ this.multiTimeCheckboxChecked = selectedObj.includeMulti;
678
+ }
679
+ if (this.showZeroTimeCheckbox || this.showMultiTimeCheckbox) {
680
+ this.showEnterTimeCheckbox = true;
681
+ }
682
+ if (optionsData.findIndex(obj => obj[header][0] != "<multi>" && obj[header][0] != "0") != -1) {
683
+ this.enterTimeCheckboxChecked = selectedObj.includeTimeRange;
684
+ }
685
+ }
686
+ selectOrUnselectMultiTimeCheckbox() {
687
+ this.multiTimeCheckboxChecked = !this.multiTimeCheckboxChecked;
688
+ // this.annaFilterService.includeMultiTime = !this.annaFilterService.includeMultiTime;
689
+ this.disableTimeFilterApplyButton();
690
+ }
691
+ selectOrUnselectZeroTimeCheckbox() {
692
+ this.zeroTimeCheckboxChecked = !this.zeroTimeCheckboxChecked;
693
+ // this.annaFilterService.includeZeroTime = !this.annaFilterService.includeZeroTime;
694
+ this.disableTimeFilterApplyButton();
695
+ }
696
+ selectOrUnselectEnterTimeCheckbox() {
697
+ this.enterTimeCheckboxChecked = !this.enterTimeCheckboxChecked;
698
+ // this.annaFilterService.includeTimeRange = !this.annaFilterService.includeTimeRange;
699
+ this.disableTimeFilterApplyButton();
700
+ }
701
+ disableSliderApplyBtn() {
702
+ return this.options.floor === this.options.ceil;
703
+ }
704
+ selectUnselectCheckbox(data) {
705
+ data.isSelected = !data.isSelected;
706
+ let selectedItems = this.tooltipOptions.filter(item => item.isSelected);
707
+ let unselectedItems = this.tooltipOptions.filter(item => !item.isSelected);
708
+ this.disableCheckboxApply = this.disableClearAll = selectedItems.length == 0;
709
+ this.disableSelectAll = unselectedItems.length == 0;
710
+ }
711
+ minValueChanged(value) {
712
+ console.log("min Value Changed");
713
+ if (value == null) {
714
+ this.isMinTextBoxEmpty = true;
715
+ this.showSliderMinValueError = false;
716
+ this.showSliderMaxValueError = false;
717
+ this.disableSliderApplyButton = false;
718
+ }
719
+ else {
720
+ this.isMinTextBoxEmpty = false;
721
+ if (+value > this.sliderMaxValue) {
722
+ if (!this.isMaxTextBoxEmpty) {
723
+ this.showSliderMinValueError = true;
724
+ this.disableSliderApplyButton = true;
725
+ }
726
+ }
727
+ else if (+value < this.options.floor) {
728
+ this.showSliderMinValueError = true;
729
+ this.disableSliderApplyButton = true;
730
+ }
731
+ else {
732
+ this.sliderMinValue = +value;
733
+ this.showSliderMinValueError = false;
734
+ this.showSliderMaxValueError = false;
735
+ this.disableSliderApplyButton = false;
736
+ }
737
+ }
738
+ this.showErrorForMinAndMaxValue();
739
+ }
740
+ maxValueChanged(value) {
741
+ console.log("max Value Changed");
742
+ if (value == null) {
743
+ this.isMaxTextBoxEmpty = true;
744
+ this.showSliderMaxValueError = false;
745
+ this.showSliderMinValueError = false;
746
+ this.disableSliderApplyButton = false;
747
+ }
748
+ else {
749
+ this.isMaxTextBoxEmpty = false;
750
+ if (+value < this.sliderMinValue) {
751
+ if (!this.isMinTextBoxEmpty) {
752
+ this.showSliderMaxValueError = true;
753
+ this.disableSliderApplyButton = true;
754
+ }
755
+ }
756
+ else if (+value > this.options.ceil) {
757
+ this.showSliderMaxValueError = true;
758
+ this.disableSliderApplyButton = true;
759
+ }
760
+ else {
761
+ this.sliderMaxValue = +value;
762
+ this.showSliderMaxValueError = false;
763
+ this.showSliderMinValueError = false;
764
+ this.disableSliderApplyButton = false;
765
+ }
766
+ }
767
+ this.showErrorForMinAndMaxValue();
768
+ }
769
+ showErrorForMinAndMaxValue() {
770
+ if (this.isMinTextBoxEmpty && this.isMaxTextBoxEmpty) {
771
+ this.showSliderMinValueError = true;
772
+ this.showSliderMaxValueError = true;
773
+ this.disableSliderApplyButton = true;
774
+ }
775
+ }
776
+ sliderValueChange() {
777
+ this.sliderValue = { min: this.sliderMinValue, max: this.sliderMaxValue };
778
+ }
779
+ cancelSliderFilter() {
780
+ this.sliderValue = null;
781
+ this.closeTooltip();
782
+ }
783
+ allOptionClicked() {
784
+ if (this.allSelected == 0 || this.allSelected == 2) {
785
+ this.allSelected = 1;
786
+ this.disableCheckboxApply = false;
787
+ }
788
+ else {
789
+ this.allSelected = 0;
790
+ this.disableCheckboxApply = true;
791
+ }
792
+ this.annaFilterService.allOptionsClicked(this.allSelected);
793
+ }
794
+ applyFilters() {
795
+ let isFilterChanged = false;
796
+ let isSortChanged = false;
797
+ if (this.showFilterComponent) {
798
+ let currentSelectedValue = [];
799
+ let previousSelectedValue = [];
800
+ if (this.annaFilterService.tooltipSelectedMap.has(this.annaFilterService.selectedRadio)) {
801
+ previousSelectedValue = this.annaFilterService.tooltipSelectedMap.get(this.annaFilterService.selectedRadio);
802
+ }
803
+ else if (this.annaFilterService.initialValueMap.has(this.annaFilterService.selectedRadio)) {
804
+ previousSelectedValue = this.annaFilterService.initialValueMap.get(this.annaFilterService.selectedRadio);
805
+ }
806
+ else {
807
+ previousSelectedValue = sortBy(uniq(this.clonedTableData.map(item => item[this.annaFilterService.selectedRadio])));
808
+ this.annaFilterService.initialValueMap.set(this.annaFilterService.selectedRadio, previousSelectedValue);
809
+ }
810
+ if (this.tooltipOptions) {
811
+ currentSelectedValue = sortBy(this.tooltipOptions.filter(item => item.isSelected).map(item => item.data));
812
+ if (!this.searchItem && currentSelectedValue.length == this.tooltipOptions.length && this.annaFilterService.initialValueMap.has(this.annaFilterService.selectedRadio)) {
813
+ console.log("inside searchItem else condition");
814
+ currentSelectedValue = this.annaFilterService.initialValueMap.get(this.annaFilterService.selectedRadio);
815
+ }
816
+ }
817
+ if (this.searchItem) {
818
+ currentSelectedValue = currentSelectedValue.map((item) => this.removeBoldElementFromString(item));
819
+ }
820
+ let blankIndex = currentSelectedValue.findIndex((item) => item == "(Blank)");
821
+ if (blankIndex != -1) {
822
+ currentSelectedValue[blankIndex] = null;
823
+ currentSelectedValue = sortBy(currentSelectedValue);
824
+ }
825
+ console.log(currentSelectedValue);
826
+ console.log(previousSelectedValue);
827
+ isFilterChanged = !isEqual(currentSelectedValue, previousSelectedValue);
828
+ if (isFilterChanged) {
829
+ this.annaFilterService.reOrderAppliedFiltersState(this.clonedTableData, currentSelectedValue);
830
+ this.annaFilterService.tooltipSelectedMap.set(this.annaFilterService.selectedRadio, currentSelectedValue);
831
+ this.tableData = this.annaFilterService.filterData(this.clonedTableData, "");
832
+ this.annaSortService.noSortingAppliedData = cloneDeep(this.tableData);
833
+ }
834
+ }
835
+ if (this.showSortComponent) {
836
+ isSortChanged = (this.tempSortOrder != null && this.tempSortOrder != this.annaSortService.columnSortState.get(this.annaFilterService.selectedRadio));
837
+ if (isSortChanged) {
838
+ for (let [key, value] of this.annaSortService.columnSortState.entries()) {
839
+ this.annaSortService.columnSortState.set(key, "DEFAULT");
840
+ }
841
+ this.annaSortService.columnSortState.set(this.annaFilterService.selectedRadio, this.tempSortOrder);
842
+ this.applySorting(this.annaFilterService.selectedRadio);
843
+ }
844
+ else if (isFilterChanged) {
845
+ this.checkIfSortingIsApplied();
846
+ }
847
+ }
848
+ else if (isFilterChanged) {
849
+ this.checkIfSortingIsApplied();
850
+ }
851
+ if (isFilterChanged && isSortChanged) {
852
+ this.filterAppliedToTable.emit(this.tableData);
853
+ }
854
+ else if (isFilterChanged) {
855
+ this.filterAppliedToTable.emit(this.tableData);
856
+ }
857
+ else if (isSortChanged) {
858
+ this.sortingAppliedToTable.emit(this.tableData);
859
+ }
860
+ this.disableEnableEachColumnTooltipIcon();
861
+ this.closeTooltip();
862
+ }
863
+ applySorting(key) {
864
+ if (this.tempSortOrder == "ASC") {
865
+ this.tableData = cloneDeep(this.annaSortService.sortDataForComponentOtherThanLurAndCsrPage(true, this.tableData, key));
866
+ }
867
+ else if (this.tempSortOrder == "DESC") {
868
+ this.tableData = cloneDeep(this.annaSortService.sortDataForComponentOtherThanLurAndCsrPage(false, this.tableData, key));
869
+ }
870
+ else if (this.tempSortOrder == "DEFAULT") {
871
+ this.tableData = cloneDeep(this.annaSortService.noSortingAppliedData);
872
+ }
873
+ }
874
+ revert() {
875
+ this.tempTooltipData = cloneDeep(this.toolTipdata);
876
+ this.annaFilterService.tooltipMap.set(this.annaFilterService.selectedRadio, this.tempTooltipData);
877
+ this.toolTipdata = null;
878
+ }
879
+ closeCheckboxFilter() {
880
+ if (this.toolTipdata) {
881
+ this.revert();
882
+ }
883
+ this.closeTooltip();
884
+ }
885
+ applySliderFilter() {
886
+ let isFilterChanged = false;
887
+ let isSortChanged = false;
888
+ if (this.showFilterComponent) {
889
+ let currentSliderData = { min: null, max: null };
890
+ let previousSliderData = { min: "", max: "" };
891
+ if (this.isMinTextBoxEmpty) {
892
+ currentSliderData.min = this.options.floor;
893
+ currentSliderData.max = this.sliderMaxValue;
894
+ }
895
+ else if (this.isMaxTextBoxEmpty) {
896
+ currentSliderData.max = this.options.ceil;
897
+ currentSliderData.min = this.sliderMinValue;
898
+ }
899
+ else {
900
+ currentSliderData.max = this.sliderMaxValue;
901
+ currentSliderData.min = this.sliderMinValue;
902
+ }
903
+ if (this.annaFilterService.tooltipSelectedMap.has(this.annaFilterService.selectedRadio)) {
904
+ previousSliderData = this.annaFilterService.tooltipSelectedMap.get(this.annaFilterService.selectedRadio);
905
+ }
906
+ else if (this.annaFilterService.initialValueMap.has(this.annaFilterService.selectedRadio)) {
907
+ previousSliderData = this.annaFilterService.initialValueMap.get(this.annaFilterService.selectedRadio);
908
+ }
909
+ else {
910
+ let minValue = this.annaFilterService.returnMaxAndMinValue(this.clonedTableData, this.annaFilterService.selectedRadio, true);
911
+ let maxValue = this.annaFilterService.returnMaxAndMinValue(this.clonedTableData, this.annaFilterService.selectedRadio, false);
912
+ previousSliderData = { min: minValue, max: maxValue };
913
+ this.annaFilterService.initialValueMap.set(this.annaFilterService.selectedRadio, previousSliderData);
914
+ }
915
+ if (currentSliderData.min == this.options.floor && currentSliderData.max == this.options.ceil && this.annaFilterService.initialValueMap.has(this.annaFilterService.selectedRadio)) {
916
+ currentSliderData = this.annaFilterService.initialValueMap.get(this.annaFilterService.selectedRadio);
917
+ }
918
+ isFilterChanged = !isEqual(previousSliderData, currentSliderData);
919
+ if (isFilterChanged) {
920
+ this.annaFilterService.reOrderAppliedFiltersState(this.clonedTableData, currentSliderData);
921
+ this.annaFilterService.tooltipSelectedMap.set(this.annaFilterService.selectedRadio, currentSliderData);
922
+ this.tableData = this.annaFilterService.filterData(this.clonedTableData, "");
923
+ this.annaSortService.noSortingAppliedData = cloneDeep(this.tableData);
924
+ this.disableEnableEachColumnTooltipIcon();
925
+ }
926
+ }
927
+ if (this.showSortComponent) {
928
+ isSortChanged = (this.tempSortOrder != null && this.tempSortOrder != this.annaSortService.columnSortState.get(this.annaFilterService.selectedRadio));
929
+ if (isSortChanged) {
930
+ for (let [key, value] of this.annaSortService.columnSortState.entries()) {
931
+ this.annaSortService.columnSortState.set(key, "DEFAULT");
932
+ }
933
+ this.annaSortService.columnSortState.set(this.annaFilterService.selectedRadio, this.tempSortOrder);
934
+ this.applySorting(this.annaFilterService.selectedRadio);
935
+ }
936
+ }
937
+ else if (isFilterChanged) {
938
+ this.checkIfSortingIsApplied();
939
+ }
940
+ if (isFilterChanged && isSortChanged) {
941
+ this.filterAppliedToTable.emit(this.tableData);
942
+ }
943
+ else if (isFilterChanged) {
944
+ this.filterAppliedToTable.emit(this.tableData);
945
+ }
946
+ else if (isSortChanged) {
947
+ this.sortingAppliedToTable.emit(this.tableData);
948
+ }
949
+ this.closeTooltip();
950
+ }
951
+ cancelInDateFilter() {
952
+ this.closeTooltip();
953
+ }
954
+ applyDateFilter() {
955
+ let isFilterChanged = false;
956
+ let isSortChanged = false;
957
+ if (this.showFilterComponent) {
958
+ let currentSelectedDate = this.calendarSelection;
959
+ let previousSelectedDate = { fromDate: null, toDate: null };
960
+ if (this.annaFilterService.tooltipSelectedMap.has(this.annaFilterService.selectedRadio)) {
961
+ previousSelectedDate = this.annaFilterService.tooltipSelectedMap.get(this.annaFilterService.selectedRadio);
962
+ }
963
+ else if (this.annaFilterService.initialValueMap.has(this.annaFilterService.selectedRadio)) {
964
+ previousSelectedDate = this.annaFilterService.initialValueMap.get(this.annaFilterService.selectedRadio);
965
+ }
966
+ else {
967
+ let minMaxDate;
968
+ if (this.annaFilterService.selectedRadio == "period") {
969
+ let minStartDate = this.annaFilterService.returnMinAndMaxDate(this.clonedTableData, "startDate");
970
+ let maxEndDate = this.annaFilterService.returnMinAndMaxDate(this.clonedTableData, "endDate");
971
+ minMaxDate = [minStartDate[0], maxEndDate[1]];
972
+ }
973
+ else {
974
+ minMaxDate = this.annaFilterService.returnMinAndMaxDate(this.clonedTableData, this.annaFilterService.selectedRadio);
975
+ }
976
+ previousSelectedDate = { fromDate: minMaxDate[0], toDate: minMaxDate[1] };
977
+ this.annaFilterService.initialValueMap.set(this.annaFilterService.selectedRadio, previousSelectedDate);
978
+ }
979
+ if (currentSelectedDate.fromDate && currentSelectedDate.toDate) {
980
+ let fromDate = { year: currentSelectedDate.fromDate.year, month: currentSelectedDate.fromDate.month, day: currentSelectedDate.fromDate.day };
981
+ let toDate = { year: currentSelectedDate.toDate.year, month: currentSelectedDate.toDate.month, day: currentSelectedDate.toDate.day };
982
+ if (isEqual(this.calendarMinEnabledDate, fromDate) && isEqual(this.calendarMaxEnabledDate, toDate) && this.annaFilterService.initialValueMap.has(this.annaFilterService.selectedRadio)) {
983
+ currentSelectedDate = this.annaFilterService.initialValueMap.get(this.annaFilterService.selectedRadio);
984
+ }
985
+ else {
986
+ currentSelectedDate.fromDate = moment(this.annaDateTimeFormatService.convertNgbDateToMoment(currentSelectedDate.fromDate));
987
+ currentSelectedDate.toDate = moment(this.annaDateTimeFormatService.convertNgbDateToMoment(currentSelectedDate.toDate));
988
+ }
989
+ isFilterChanged = !isEqual(previousSelectedDate, currentSelectedDate);
990
+ if (isFilterChanged) {
991
+ this.annaFilterService.reOrderAppliedFiltersState(this.clonedTableData, currentSelectedDate);
992
+ this.annaFilterService.tooltipSelectedMap.set(this.annaFilterService.selectedRadio, currentSelectedDate);
993
+ this.tableData = this.annaFilterService.filterData(this.clonedTableData, "");
994
+ this.annaSortService.noSortingAppliedData = cloneDeep(this.tableData);
995
+ this.disableEnableEachColumnTooltipIcon();
996
+ }
997
+ }
998
+ }
999
+ if (this.showSortComponent) {
1000
+ isSortChanged = (this.tempSortOrder != null && this.tempSortOrder != this.annaSortService.columnSortState.get(this.annaFilterService.selectedRadio));
1001
+ if (isSortChanged) {
1002
+ for (let [key, value] of this.annaSortService.columnSortState.entries()) {
1003
+ this.annaSortService.columnSortState.set(key, "DEFAULT");
1004
+ }
1005
+ this.annaSortService.columnSortState.set(this.annaFilterService.selectedRadio, this.tempSortOrder);
1006
+ this.applySorting(this.annaFilterService.selectedRadio);
1007
+ }
1008
+ else if (isFilterChanged) {
1009
+ this.checkIfSortingIsApplied();
1010
+ }
1011
+ }
1012
+ else if (isFilterChanged) {
1013
+ this.checkIfSortingIsApplied();
1014
+ }
1015
+ if (isFilterChanged && isSortChanged) {
1016
+ this.filterAppliedToTable.emit(this.tableData);
1017
+ }
1018
+ else if (isFilterChanged) {
1019
+ this.filterAppliedToTable.emit(this.tableData);
1020
+ }
1021
+ else if (isSortChanged) {
1022
+ this.sortingAppliedToTable.emit(this.tableData);
1023
+ }
1024
+ this.closeTooltip();
1025
+ }
1026
+ applyWeekFilter(event) {
1027
+ }
1028
+ incrementHour(arr) {
1029
+ if (arr[0] == "") {
1030
+ arr[0] = 1;
1031
+ }
1032
+ else if (parseInt(arr[0]) < 12) {
1033
+ arr[0] = parseInt(arr[0]) + 1;
1034
+ }
1035
+ else {
1036
+ arr[0] = 1;
1037
+ }
1038
+ }
1039
+ decrementHour(arr) {
1040
+ if (arr[0] == "") {
1041
+ arr[0] = 12;
1042
+ }
1043
+ else if (parseInt(arr[0]) > 1) {
1044
+ arr[0] = parseInt(arr[0]) - 1;
1045
+ }
1046
+ else {
1047
+ arr[0] = 12;
1048
+ }
1049
+ }
1050
+ incrementMinute(arr) {
1051
+ arr[1] = parseInt(arr[1]) + 15;
1052
+ if (parseInt(arr[1]) == 60) {
1053
+ arr[1] = "00";
1054
+ }
1055
+ else if (parseInt(arr[1]) == 0) {
1056
+ arr[1] = "00";
1057
+ }
1058
+ else if (parseInt(arr[1]) > 60) {
1059
+ let res = parseInt(arr[1]) - 60;
1060
+ arr[1] = res < 10 ? `0${res}` : res.toString();
1061
+ }
1062
+ }
1063
+ decrementMinute(arr) {
1064
+ arr[1] = parseInt(arr[1]) - 15;
1065
+ if (parseInt(arr[1]) < 0) {
1066
+ let res = 60 + parseInt(arr[1]);
1067
+ arr[1] = res;
1068
+ }
1069
+ else if (parseInt(arr[1]) == 0) {
1070
+ arr[1] = "00";
1071
+ }
1072
+ else if (arr[1] < 10) {
1073
+ arr[1] = `0${arr[1]}`;
1074
+ }
1075
+ }
1076
+ changeStartTimeHour(increment) {
1077
+ if (increment) {
1078
+ this.incrementHour(this.selectedFromTime);
1079
+ }
1080
+ else {
1081
+ this.decrementHour(this.selectedFromTime);
1082
+ }
1083
+ this.startTimeHourChange(this.selectedFromTime[0].toString());
1084
+ // this.disableTimeFilterApplyButton();
1085
+ }
1086
+ changeEndTimeHour(increment) {
1087
+ if (increment) {
1088
+ this.incrementHour(this.selectedToTime);
1089
+ }
1090
+ else {
1091
+ this.decrementHour(this.selectedToTime);
1092
+ }
1093
+ this.endTimeHourChange(this.selectedToTime[0].toString());
1094
+ // this.disableTimeFilterApplyButton();
1095
+ }
1096
+ changeEndTimeMinute(increment) {
1097
+ if (increment) {
1098
+ this.incrementMinute(this.selectedToTime);
1099
+ }
1100
+ else {
1101
+ this.decrementMinute(this.selectedToTime);
1102
+ }
1103
+ this.endTimeMinChange(this.selectedToTime[1].toString());
1104
+ // this.disableTimeFilterApplyButton();
1105
+ }
1106
+ changeStartTimeMinute(increment) {
1107
+ if (increment) {
1108
+ this.incrementMinute(this.selectedFromTime);
1109
+ }
1110
+ else {
1111
+ this.decrementMinute(this.selectedFromTime);
1112
+ }
1113
+ this.startTimeMinChange(this.selectedFromTime[1].toString());
1114
+ // this.disableTimeFilterApplyButton();
1115
+ }
1116
+ applyTimeFilters() {
1117
+ let isFilterChanged = false;
1118
+ let isSortChanged = false;
1119
+ if (this.showFilterComponent) {
1120
+ let currentSelectedTimeFilter = {
1121
+ fromTime: null,
1122
+ toTime: null,
1123
+ includeMulti: false,
1124
+ includeZero: false,
1125
+ includeTimeRange: false,
1126
+ };
1127
+ let previousSelectedTimeFilter;
1128
+ if (this.annaFilterService.tooltipSelectedMap.has(this.annaFilterService.selectedRadio)) {
1129
+ previousSelectedTimeFilter = this.annaFilterService.tooltipSelectedMap.get(this.annaFilterService.selectedRadio);
1130
+ }
1131
+ else if (this.annaFilterService.initialValueMap.has(this.annaFilterService.selectedRadio)) {
1132
+ previousSelectedTimeFilter = this.annaFilterService.initialValueMap.get(this.annaFilterService.selectedRadio);
1133
+ }
1134
+ let fromTime24HrFormatArr = this.annaDateTimeFormatService.convertTotwentyFourHrsFormat(this.selectedFromTime[0] + ":" + this.selectedFromTime[1] + " " + this.selectedFromTime[2], true);
1135
+ let fromTime24HrFormat = fromTime24HrFormatArr[0] + ":" + fromTime24HrFormatArr[1] + ":00";
1136
+ let toTime24HrFormatArr = this.annaDateTimeFormatService.convertTotwentyFourHrsFormat(this.selectedToTime[0] + ":" + this.selectedToTime[1] + " " + this.selectedToTime[2], true);
1137
+ let toTime24HrFormat = toTime24HrFormatArr[0] + ":" + toTime24HrFormatArr[1] + ":00";
1138
+ currentSelectedTimeFilter = { fromTime: fromTime24HrFormat, toTime: toTime24HrFormat, includeMulti: this.multiTimeCheckboxChecked,
1139
+ includeZero: this.zeroTimeCheckboxChecked, includeTimeRange: this.enterTimeCheckboxChecked };
1140
+ isFilterChanged = !isEqual(previousSelectedTimeFilter, currentSelectedTimeFilter);
1141
+ if (isFilterChanged) {
1142
+ let isFiltered = this.annaFilterService.reOrderAppliedFiltersState(this.clonedTableData, currentSelectedTimeFilter);
1143
+ this.annaFilterService.tooltipSelectedMap.set(this.annaFilterService.selectedRadio, currentSelectedTimeFilter);
1144
+ this.tableData = this.annaFilterService.filterData(this.clonedTableData, "");
1145
+ if (!isFiltered) {
1146
+ this.annaFilterService.tooltipSelectedMap.delete(this.annaFilterService.selectedRadio);
1147
+ }
1148
+ this.annaSortService.noSortingAppliedData = cloneDeep(this.tableData);
1149
+ this.disableEnableEachColumnTooltipIcon();
1150
+ }
1151
+ }
1152
+ if (this.showSortComponent) {
1153
+ isSortChanged = (this.tempSortOrder != null && this.tempSortOrder != this.annaSortService.columnSortState.get(this.annaFilterService.selectedRadio));
1154
+ if (isSortChanged) {
1155
+ for (let [key, value] of this.annaSortService.columnSortState.entries()) {
1156
+ this.annaSortService.columnSortState.set(key, "DEFAULT");
1157
+ }
1158
+ this.annaSortService.columnSortState.set(this.annaFilterService.selectedRadio, this.tempSortOrder);
1159
+ this.applySorting(this.annaFilterService.selectedRadio);
1160
+ }
1161
+ else if (isFilterChanged) {
1162
+ this.checkIfSortingIsApplied();
1163
+ }
1164
+ }
1165
+ else if (isFilterChanged) {
1166
+ this.checkIfSortingIsApplied();
1167
+ }
1168
+ if (isFilterChanged && isSortChanged) {
1169
+ this.filterAppliedToTable.emit(this.tableData);
1170
+ }
1171
+ else if (isFilterChanged) {
1172
+ this.filterAppliedToTable.emit(this.tableData);
1173
+ }
1174
+ else if (isSortChanged) {
1175
+ this.sortingAppliedToTable.emit(this.tableData);
1176
+ }
1177
+ this.closeTooltip();
1178
+ }
1179
+ closeTimeFilter() {
1180
+ this.selectedFromTime = cloneDeep(this.clonedSelectedFromTime);
1181
+ this.selectedToTime = cloneDeep(this.clonedSelectedToTime);
1182
+ this.closeTooltip();
1183
+ }
1184
+ disableTimeFilterApplyButton() {
1185
+ let timeFormat = "HH:mm:ss";
1186
+ let startTime24HrFormatArr = this.annaDateTimeFormatService.convertTotwentyFourHrsFormat(this.selectedFromTime[0] + ":" + this.selectedFromTime[1] + " " + this.selectedFromTime[2], true);
1187
+ let startTime24HrFormat = startTime24HrFormatArr[0] + ":" + startTime24HrFormatArr[1] + ":00";
1188
+ let endTime24HrFormatArr = this.annaDateTimeFormatService.convertTotwentyFourHrsFormat(this.selectedToTime[0] + ":" + this.selectedToTime[1] + " " + this.selectedToTime[2], true);
1189
+ let endTime24HrFormat = endTime24HrFormatArr[0] + ":" + endTime24HrFormatArr[1] + ":00";
1190
+ this.disableTimeFilterApplyBtn = moment(startTime24HrFormat, timeFormat).isAfter(moment(endTime24HrFormat, timeFormat));
1191
+ if (!this.multiTimeCheckboxChecked && !this.zeroTimeCheckboxChecked && !this.enterTimeCheckboxChecked) {
1192
+ this.disableTimeFilterApplyBtn = true;
1193
+ }
1194
+ }
1195
+ sortedData(event) {
1196
+ if (event.type == "none") {
1197
+ this.tableData = this.annaFilterService.filterData(this.clonedTableData, "");
1198
+ }
1199
+ else {
1200
+ this.tableData = event.data;
1201
+ }
1202
+ this.sortingAppliedToTable.emit(this.tableData);
1203
+ // this.generateTableDataWrapper();
1204
+ }
1205
+ checkIfSortingIsApplied() {
1206
+ for (let [key, value] of this.annaSortService.columnSortState.entries()) {
1207
+ if (value == "ASC") {
1208
+ this.tableData = cloneDeep(this.annaSortService.sortDataForComponentOtherThanLurAndCsrPage(true, this.tableData, key));
1209
+ }
1210
+ else if (value == "DESC") {
1211
+ this.tableData = cloneDeep(this.annaSortService.sortDataForComponentOtherThanLurAndCsrPage(false, this.tableData, key));
1212
+ }
1213
+ }
1214
+ }
1215
+ // applySorting(sortComponentArr: AnnaSortComponent[], appliedKey: string, isAsc: boolean) {
1216
+ // sortComponentArr.forEach((component) => {
1217
+ // if (component.sortBy === appliedKey) {
1218
+ // this.setSortComponentDataProperty(component);
1219
+ // isAsc ? component.sortByAscending() : component.sortByDescending();
1220
+ // }
1221
+ // });
1222
+ // }
1223
+ // setSortComponentDataProperty(sortComponent: AnnaSortComponent) {
1224
+ // sortComponent.data = this.tableData;
1225
+ // sortComponent.clonedData = cloneDeep(this.tableData);
1226
+ // }
1227
+ disableEnableEachColumnTooltipIcon() {
1228
+ this.tableHeaders.forEach(header => {
1229
+ header.headerInfo.forEach(item => {
1230
+ if (item.showTooltipIcon) {
1231
+ let values = [];
1232
+ item.disableTooltipIcon = true;
1233
+ item.filterSortObjectKeys.forEach(key => {
1234
+ if (key == "period") {
1235
+ let uniqStartDate = uniq(this.tableData.map((u) => u["startDate"]));
1236
+ let uniqEndDate = uniq(this.tableData.map((u) => u["endDate"]));
1237
+ item.disableTooltipIcon = (uniqStartDate.length > 1 || uniqEndDate.length > 1) ? false : true;
1238
+ }
1239
+ else {
1240
+ values = this.tableData.map((u) => u[key]);
1241
+ if (uniq(values).filter(n => n != null).length > 1) {
1242
+ item.disableTooltipIcon = false;
1243
+ }
1244
+ }
1245
+ });
1246
+ }
1247
+ });
1248
+ });
1249
+ }
1250
+ ngAfterViewInit() {
1251
+ this.annaGenericTableService.virtualScrollSubject.subscribe((val) => {
1252
+ this.isScrolledLeft = document.getElementsByClassName("anna-table-virtual-scroll-viewport")[0].scrollLeft > 0;
1253
+ this.cdRef.detectChanges();
1254
+ });
1255
+ }
1256
+ setMarginLeftForFilterIcon() {
1257
+ let elementArr = this.viewChildTableHeaders.toArray();
1258
+ elementArr.forEach((item) => {
1259
+ let childDivElements = item.nativeElement.children;
1260
+ if (childDivElements.length == 2) {
1261
+ let firstParagraphWidth = childDivElements[0].children[0];
1262
+ let secondParagraphWidth = childDivElements[1].children[0];
1263
+ if (firstParagraphWidth.offsetWidth > secondParagraphWidth.offsetWidth) {
1264
+ let diff = firstParagraphWidth.offsetWidth - secondParagraphWidth.offsetWidth;
1265
+ if (childDivElements[0].children.length == 2) {
1266
+ childDivElements[0].children[1].style.marginLeft = 4 + 'px';
1267
+ }
1268
+ if (childDivElements[1].children.length == 2) {
1269
+ childDivElements[1].children[1].style.marginLeft = diff + 4 + 'px';
1270
+ }
1271
+ }
1272
+ else {
1273
+ let diff = secondParagraphWidth.offsetWidth - firstParagraphWidth.offsetWidth;
1274
+ if (childDivElements[0].children.length == 2) {
1275
+ childDivElements[0].children[1].style.marginLeft = diff + 4 + 'px';
1276
+ }
1277
+ if (childDivElements[1].children.length == 2) {
1278
+ childDivElements[1].children[1].style.marginLeft = 4 + 'px';
1279
+ }
1280
+ }
1281
+ }
1282
+ });
1283
+ }
1284
+ dataRowClicked(rowData) {
1285
+ this.rowClicked.emit(rowData);
1286
+ }
1287
+ radioButtonClicked(data, action, isDisabled) {
1288
+ if (!isDisabled) {
1289
+ this.radioButtonSelected.emit({ data, action });
1290
+ }
1291
+ }
1292
+ bindTheValueToSellerGroupTooltip(sellerGroupHierarchy, tooltip) {
1293
+ if (this.hierarchyTooltip && this.hierarchyTooltip.open) {
1294
+ this.hierarchyTooltip.close();
1295
+ }
1296
+ this.sellerGroupHierarchy = sellerGroupHierarchy;
1297
+ this.hierarchyTooltip = tooltip;
1298
+ this.hierarchyTooltip.open();
1299
+ }
1300
+ iconClicked(rowData, iconClass) {
1301
+ this.gtIconClicked.emit({ data: rowData, iconClass: iconClass });
1302
+ }
1303
+ svgIconClicked(rowData, key) {
1304
+ this.gtSVGIconClicked.emit({ data: rowData, key: key });
1305
+ }
1306
+ textActionClicked(rowData, id) {
1307
+ this.gtTextActionClicked.emit({ data: rowData, id });
1308
+ }
1309
+ viewDetailsClicked(rowData) {
1310
+ this.gtViewDetailClicked.emit({ data: rowData });
1311
+ }
1312
+ setColumnSortStateMap() {
1313
+ console.log("set column sort state map");
1314
+ this.tableHeaders.forEach(column => {
1315
+ column.headerInfo.forEach((header) => {
1316
+ if (header.showTooltipIcon && header.isSortRequired) {
1317
+ header.isSortRequired.forEach((item, index) => {
1318
+ if (item) {
1319
+ this.annaSortService.columnSortState.set(header.filterSortObjectKeys[index], "DEFAULT");
1320
+ }
1321
+ });
1322
+ }
1323
+ });
1324
+ });
1325
+ }
1326
+ storeSortTypeInTempVariable(event) {
1327
+ this.tempSortOrder = event;
1328
+ }
1329
+ unCheckAllCheckbox() {
1330
+ this.tooltipOptions.forEach(item => item.isSelected = false);
1331
+ this.disableSelectAll = false;
1332
+ this.disableClearAll = true;
1333
+ this.disableCheckboxApply = true;
1334
+ }
1335
+ selectAllCheckbox() {
1336
+ this.tooltipOptions.forEach(item => item.isSelected = true);
1337
+ this.disableSelectAll = true;
1338
+ this.disableClearAll = false;
1339
+ this.disableCheckboxApply = false;
1340
+ }
1341
+ searchForTheItem(str) {
1342
+ if (str) {
1343
+ this.tooltipOptions = cloneDeep(this.clonedTooltipOptions.filter(item => item.data.toLowerCase().includes(str.toLowerCase())));
1344
+ this.tooltipOptions.forEach(element => {
1345
+ element.data = this.boldString(element.data, str);
1346
+ });
1347
+ if (this.tooltipOptions.length > 0) {
1348
+ this.tooltipOptions.forEach(item => item.isSelected = true);
1349
+ this.disableSelectAll = true;
1350
+ this.disableClearAll = false;
1351
+ this.disableCheckboxApply = false;
1352
+ }
1353
+ else {
1354
+ this.disableCheckboxApply = true;
1355
+ this.disableClearAll = true;
1356
+ this.disableSelectAll = true;
1357
+ }
1358
+ }
1359
+ else {
1360
+ this.tooltipOptions = cloneDeep(this.clonedTooltipOptions);
1361
+ let unselectedItems = this.tooltipOptions.filter(item => !item.isSelected);
1362
+ let selectedItems = this.tooltipOptions.filter(item => item.isSelected);
1363
+ this.disableSelectAll = unselectedItems.length == 0;
1364
+ this.disableClearAll = selectedItems.length == 0;
1365
+ }
1366
+ }
1367
+ boldString(str, find) {
1368
+ var re = new RegExp(find, 'g');
1369
+ return str.replace(re, '<b>' + find + '</b>');
1370
+ }
1371
+ removeBoldElementFromString(originalString) {
1372
+ let firstRegExp = new RegExp('<b>', 'g');
1373
+ let secondRegExp = new RegExp('</b>', 'g');
1374
+ let ret = originalString.replace(firstRegExp, '');
1375
+ console.log(ret);
1376
+ console.log(ret.replace(secondRegExp, ''));
1377
+ return ret.replace(secondRegExp, '');
1378
+ }
1379
+ clearSearchedItem() {
1380
+ this.searchItem = "";
1381
+ this.searchForTheItem("");
1382
+ }
1383
+ calendarDateChanged(event) {
1384
+ this.calendarSelection = event;
1385
+ this.enableDisableCalendarApplyBtn();
1386
+ }
1387
+ enableDisableCalendarApplyBtn() {
1388
+ this.disableCalendarApplyBtn = !(this.calendarSelection.fromDate && this.calendarSelection.toDate);
1389
+ }
1390
+ setInitialValueMapForTimeFilter(key) {
1391
+ let data = this.clonedTableData.filter((obj) => !["", "-", null, "0", "<multi>"].includes(obj[key]));
1392
+ let timeArr = map(data, key);
1393
+ timeArr.sort((a, b) => {
1394
+ return this.annaDateTimeFormatService.sortByTimeAscending(a, b);
1395
+ });
1396
+ let obj = {
1397
+ fromTime: timeArr[0],
1398
+ toTime: timeArr[timeArr.length - 1],
1399
+ includeMulti: false,
1400
+ includeZero: false,
1401
+ includeTimeRange: false
1402
+ };
1403
+ if (this.gtGeneralConfig.component === "SPOTDETAILS" ||
1404
+ this.gtGeneralConfig.component === "EXCLUDEINVENTORYPOPUP") {
1405
+ let includeMulti = this.clonedTableData.findIndex((obj) => obj[key] == "<multi>") !=
1406
+ -1;
1407
+ let includeZero = this.clonedTableData.findIndex((obj) => obj[key] == "0") != -1;
1408
+ let includeTimeRange = this.clonedTableData.findIndex((obj) => obj[key] != "0" && obj[key] != "<multi>") != -1;
1409
+ let obj = {
1410
+ fromTime: timeArr[0],
1411
+ toTime: timeArr[timeArr.length - 1],
1412
+ includeMulti: includeMulti,
1413
+ includeZero: includeZero,
1414
+ includeTimeRange: includeTimeRange,
1415
+ };
1416
+ this.annaFilterService.initialValueMap.set(key, obj);
1417
+ }
1418
+ else if (this.gtGeneralConfig.component === "RATING") {
1419
+ this.setInitialValueMapForRatingPageTimeFilter(key);
1420
+ }
1421
+ else {
1422
+ this.annaFilterService.initialValueMap.set(key, obj);
1423
+ }
1424
+ }
1425
+ setInitialValueMapForRatingPageTimeFilter(key) {
1426
+ let includeMulti = this.clonedTableData.findIndex((obj) => obj[key][0] == "<multi>") !=
1427
+ -1;
1428
+ let includeZero = this.clonedTableData.findIndex((obj) => obj[key][0] == "0") != -1;
1429
+ let includeTimeRange = this.clonedTableData.findIndex((obj) => obj[key][0] != "0" && obj[key][0] != "<multi>") != -1;
1430
+ let startTimeArr = map(this.clonedTableData, "startTime");
1431
+ let endTimeArr = map(this.clonedTableData, "endTime");
1432
+ startTimeArr.sort((a, b) => {
1433
+ return this.annaDateTimeFormatService.sortByTimeAscending(a, b);
1434
+ });
1435
+ endTimeArr.sort((a, b) => {
1436
+ return this.annaDateTimeFormatService.sortByTimeDescending(a, b);
1437
+ });
1438
+ let obj = {
1439
+ fromTime: startTimeArr[0],
1440
+ toTime: endTimeArr[0],
1441
+ includeMulti: includeMulti,
1442
+ includeZero: includeZero,
1443
+ includeTimeRange: includeTimeRange,
1444
+ };
1445
+ this.annaFilterService.initialValueMap.set(key, obj);
1446
+ }
1447
+ startTimeHourChange(val) {
1448
+ if (val.length == 0 || 1 > parseInt(val) || parseInt(val) > 12) {
1449
+ this.startTimeHourErr = true;
1450
+ }
1451
+ else {
1452
+ this.startTimeHourErr = false;
1453
+ }
1454
+ this.disableTimeFilterApplyButton();
1455
+ }
1456
+ startTimeMinChange(val) {
1457
+ if (val.length != 2 || 0 > parseInt(val) || parseInt(val) > 59) {
1458
+ this.startTimeMinErr = true;
1459
+ }
1460
+ else {
1461
+ this.startTimeMinErr = false;
1462
+ }
1463
+ this.disableTimeFilterApplyButton();
1464
+ }
1465
+ endTimeHourChange(val) {
1466
+ if (val.length == 0 || 1 > parseInt(val) || parseInt(val) > 12) {
1467
+ this.endTimeHourErr = true;
1468
+ }
1469
+ else {
1470
+ this.endTimeHourErr = false;
1471
+ }
1472
+ this.disableTimeFilterApplyButton();
1473
+ }
1474
+ endTimeMinChange(val) {
1475
+ if (val.length != 2 || 0 > parseInt(val) || parseInt(val) > 59) {
1476
+ this.endTimeMinErr = true;
1477
+ }
1478
+ else {
1479
+ this.endTimeMinErr = false;
1480
+ }
1481
+ this.disableTimeFilterApplyButton();
1482
+ }
1483
+ }
1484
+ AnnaNonEditableGenericTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AnnaNonEditableGenericTableComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.AnnaSortService }, { token: i1.AnnaDateTimeFormatService }, { token: i1.AnnaFilterService }, { token: i1.AnnaGenericTableService }], target: i0.ɵɵFactoryTarget.Component });
1485
+ AnnaNonEditableGenericTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: AnnaNonEditableGenericTableComponent, selector: "anna-core-non-editable-generic-table-lib", inputs: { showSkeletonLoading: "showSkeletonLoading", tableHeaders: "tableHeaders", tableData: "tableData", clonedTableData: "clonedTableData", numberOfSkeletonRows: "numberOfSkeletonRows", numberOfSkeletonColumns: "numberOfSkeletonColumns", gtGeneralConfig: "gtGeneralConfig", totalRowInfo: "totalRowInfo", gtDimension: "gtDimension", tableClass: "tableClass", maximumRowsWhichCanBeRenderedWithoutScroll: "maximumRowsWhichCanBeRenderedWithoutScroll" }, outputs: { toggleCheckbox: "toggleCheckbox", toggleRowCheckbox: "toggleRowCheckbox", toggleHeaderCheckbox: "toggleHeaderCheckbox", undoIconClicked: "undoIconClicked", filterAppliedToTable: "filterAppliedToTable", sortingAppliedToTable: "sortingAppliedToTable", rowClicked: "rowClicked", radioButtonSelected: "radioButtonSelected", columnFilterOpened: "columnFilterOpened", columnFilterClosed: "columnFilterClosed", gtIconClicked: "gtIconClicked", gtSVGIconClicked: "gtSVGIconClicked", gtTextActionClicked: "gtTextActionClicked", gtViewDetailClicked: "gtViewDetailClicked" }, viewQueries: [{ propertyName: "sortComponent", predicate: AnnaSortComponent, descendants: true }, { propertyName: "viewChildTableHeaders", predicate: ["tableHeader"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"table-container\" [ngClass]=\"{ 'scroll-left-shadow-effect': isScrolledLeft }\">\r\n <anna-table-virtual-scroll-viewport\r\n [buffer]=\"gtGeneralConfig.bufferSize\"\r\n [rowHeight]=\"gtDimension.rowHeight\"\r\n [class]=\"gtGeneralConfig.tableContainerName\"\r\n [ngStyle]=\"{\r\n height:\r\n tableData.length < maximumRowsWhichCanBeRenderedWithoutScroll\r\n ? 'calc(' +\r\n ((gtDimension.rowHeight + rowBorderWidth) * tableData.length +\r\n (!tableData.length || !gtGeneralConfig.totalRow\r\n ? gtDimension.headerHeight\r\n : gtDimension.headerHeight + gtDimension.rowHeight + (2 * rowBorderWidth))) +\r\n 'px)'\r\n : gtDimension.tableHeight\r\n }\"\r\n >\r\n <table class=\"gt\" [ngClass]=\"tableClass\" mat-table [appVirtualDataSource]=\"tableData\">\r\n <tr\r\n class=\"header-row\"\r\n mat-header-row\r\n *matHeaderRowDef=\"tableColumns; sticky: true\"\r\n [style.height.px]=\"gtDimension.headerHeight\"\r\n ></tr>\r\n <tr\r\n class=\"total-row\"\r\n mat-header-row\r\n [style.height.px]=\"gtDimension.rowHeight\"\r\n *matHeaderRowDef=\"totalRowColumns; sticky: true\"\r\n [class.hidden]=\"\r\n showSkeletonLoading ||\r\n (!showSkeletonLoading && !tableData.length ) ||\r\n (showNoDataToDisplay) || \r\n (!showSkeletonLoading && !gtGeneralConfig.totalRow)\r\n \"\r\n ></tr>\r\n <tr\r\n [class]=\"rowData.gtClass\"\r\n [ngClass]=\"{'no-border-tr': showNoDataToDisplay}\"\r\n mat-row\r\n *matRowDef=\"let rowData; columns: tableColumns\"\r\n [style.height.px]=\"gtDimension.rowHeight\"\r\n [style.background-color]=\"rowData.backgroundColor\"\r\n [style.border]=\"rowData.border\" (click)=\"dataRowClicked(rowData)\"\r\n ></tr>\r\n\r\n <!-- TOTAL ROW -->\r\n <ng-container [matColumnDef]=\"column.colName\" *ngFor=\"let column of totalRowInfo; trackBy: trackByFn\">\r\n <td mat-header-cell *matHeaderCellDef [attr.colspan]=\"column.colspan\" class=\"{{column.class}}\">\r\n <strong>{{ column.data }}</strong>\r\n <ng-container *ngIf=\"column.lowerData\">\r\n <br>\r\n <span>{{column.lowerData}}</span>\r\n </ng-container>\r\n <ng-container *ngIf=\"column.tooltipMessage\">\r\n <i class=\"mi mdi-info-outline info-label\" container=\"body\"\r\n [ngbTooltip]=\"column.tooltipMessage\"\r\n tooltipClass=\"gt-total-row-tooltip\" placement=\"bottom\"></i>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- MAIN ROW -->\r\n <ng-container [matColumnDef]=\"columnDef.headerInfo[0].objectKey\" *ngFor=\"let columnDef of tableHeaders; trackBy: trackByFn\">\r\n <th #tableHeader nowrap mat-header-cell *matHeaderCellDef [style.width]=\"columnDef.width\">\r\n <div class=\"row mx-0\" *ngFor=\"let header of columnDef.headerInfo; let j = index;\"> \r\n <p\r\n *ngIf=\"header.typeOfHeaderData === 'STRING'\"\r\n [ngClass]=\"{ 'upper-label': j === 0, 'lower-label': j === 1 }\"\r\n >\r\n {{ header.name }}\r\n <i *ngIf=\"header.tooltip && header.tooltip.name == 'impsInfoTooltip'\" class=\"{{header['tooltip'].iconClass}}\"\r\n [ngStyle]=\"{'float': header['tooltip'].iconPosition}\"\r\n #t=\"ngbTooltip\"\r\n [ngbTooltip]=\"impsInfoTooltip\"\r\n placement=\"{{ header['tooltip'].tooltipPosition }}\"\r\n tooltipClass=\"{{ header['tooltip'].tooltipClass }}\"\r\n >\r\n </i>\r\n <i *ngIf=\"header.tooltip && header.tooltip.name == 'ratingInfoTooltip'\" class=\"{{header['tooltip'].iconClass}}\"\r\n [ngStyle]=\"{'float': header['tooltip'].iconPosition}\"\r\n #t=\"ngbTooltip\"\r\n [ngbTooltip]=\"ratingInfoTooltip\"\r\n placement=\"{{ header['tooltip'].tooltipPosition }}\"\r\n tooltipClass=\"{{ header['tooltip'].tooltipClass }}\"\r\n >\r\n </i>\r\n <i *ngIf=\"header.tooltip && header.tooltip.name == 'rateInfoTooltip'\" class=\"{{header['tooltip'].iconClass}}\"\r\n [ngStyle]=\"{'float': header['tooltip'].iconPosition}\"\r\n #t=\"ngbTooltip\"\r\n [ngbTooltip]=\"rateInfoTooltip\"\r\n placement=\"{{ header['tooltip'].tooltipPosition }}\"\r\n tooltipClass=\"{{ header['tooltip'].tooltipClass }}\"\r\n >\r\n </i>\r\n </p>\r\n\r\n <ng-container *ngIf=\"header.typeOfHeaderData === 'CHECKBOX'\">\r\n <span\r\n *ngIf=\"gtGeneralConfig.isHeaderChecked\"\r\n class=\"material-icons custom-column-checkbox-checked\"\r\n (click)=\"selectUnselectAllRows()\"\r\n >\r\n check_box\r\n </span>\r\n <span\r\n *ngIf=\"!gtGeneralConfig.isHeaderChecked\"\r\n class=\"material-icons custom-column-checkbox-unchecked\"\r\n [ngClass]=\"{ 'disable-checkbox': gtGeneralConfig.disableHeaderCheckbox }\"\r\n (click)=\"selectUnselectAllRows()\"\r\n >\r\n check_box_outline_blank\r\n </span>\r\n </ng-container>\r\n\r\n <div *ngIf=\"gtGeneralConfig.showAllColumnFilter\" class=\"sort-filter-container\">\r\n <ng-container *ngIf=\"header.showTooltipIcon\">\r\n <ng-container *ngIf=\"header.filter === 'CHECKBOX'\">\r\n <span\r\n class=\"mdi mdi-filter-variant\"\r\n [ngClass]=\"{\r\n active: isTooltipActive(header.filterSortObjectKeys), \r\n disabled: header.disableTooltipIcon && !isTooltipActive(header.filterSortObjectKeys)\r\n }\"\r\n [ngbTooltip]=\"filterTooltip\"\r\n placement=\"bottom left-top auto\"\r\n container=\"body\"\r\n tooltipClass=\"non-edit-checkbox-tooltip\"\r\n [autoClose]=\"'outside'\"\r\n triggers=\"manual\"\r\n #t=\"ngbTooltip\"\r\n (click)=\"bindTheValueToToolTip(t, header)\"\r\n (hidden)=\"closeTooltip()\"\r\n >\r\n </span\r\n ><br />\r\n </ng-container>\r\n <ng-container *ngIf=\"header.filter === 'SLIDER'\">\r\n <span\r\n class=\"mdi mdi-filter-variant\"\r\n [ngClass]=\"{\r\n active: isTooltipActive(header.filterSortObjectKeys),\r\n disabled: header.disableTooltipIcon && !isTooltipActive(header.filterSortObjectKeys)\r\n }\"\r\n [ngbTooltip]=\"sliderToolTip\"\r\n placement=\"bottom left-top\"\r\n container=\"body\"\r\n tooltipClass=\"non-edit-slider-tooltip\"\r\n [autoClose]=\"'outside'\"\r\n triggers=\"manual\"\r\n #t1=\"ngbTooltip\"\r\n (click)=\"bindTheValueToToolTip(t1, header)\"\r\n (hidden)=\"closeTooltip()\"\r\n >\r\n </span\r\n ><br />\r\n </ng-container>\r\n <ng-container *ngIf=\"header.filter === 'DATE'\">\r\n <span\r\n class=\"mdi mdi-filter-variant\"\r\n [ngClass]=\"{\r\n active: isTooltipActive(header.filterSortObjectKeys),\r\n disabled: header.disableTooltipIcon && !isTooltipActive(header.filterSortObjectKeys)\r\n }\"\r\n [ngbTooltip]=\"datePickerTooltip\"\r\n placement=\"bottom auto\"\r\n container=\"body\"\r\n tooltipClass=\"non-edit-datepicker-tooltip\"\r\n [autoClose]=\"'outside'\"\r\n triggers=\"manual\"\r\n #t2=\"ngbTooltip\"\r\n (click)=\"bindTheValueToToolTip(t2, header)\"\r\n (hidden)=\"closeTooltip()\"\r\n >\r\n </span\r\n ><br />\r\n </ng-container>\r\n <ng-container *ngIf=\"header.filter === 'WEEK'\">\r\n <span\r\n class=\"mdi mdi-filter-variant\"\r\n [ngClass]=\"{\r\n active: isTooltipActive(header.filterSortObjectKeys),\r\n disabled: header.disableTooltipIcon && !isTooltipActive(header.filterSortObjectKeys)\r\n }\"\r\n [ngbTooltip]=\"weekPickerToolTip\"\r\n placement=\"bottom left-top\"\r\n container=\"body\"\r\n [autoClose]=\"'outside'\"\r\n triggers=\"manual\"\r\n #t3=\"ngbTooltip\"\r\n (click)=\"bindTheValueToToolTip(t3, header)\"\r\n (hidden)=\"closeTooltip()\"\r\n >\r\n </span\r\n ><br />\r\n </ng-container>\r\n <ng-container *ngIf=\"header.filter === 'TIME'\">\r\n <span\r\n class=\"mdi mdi-filter-variant\"\r\n [ngClass]=\"{\r\n active: isTooltipActive(header.filterSortObjectKeys),\r\n disabled: header.disableTooltipIcon && !isTooltipActive(header.filterSortObjectKeys)\r\n }\"\r\n [ngbTooltip]=\"timeFilterToolTip\"\r\n placement=\"bottom left-top\"\r\n container=\"body\"\r\n tooltipClass=\"non-edit-time-tooltip\"\r\n [autoClose]=\"'outside'\"\r\n triggers=\"manual\"\r\n #t4=\"ngbTooltip\"\r\n (click)=\"bindTheValueToToolTip(t4, header)\"\r\n (hidden)=\"closeTooltip()\"\r\n >\r\n </span\r\n ><br />\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!header.showTooltipIcon\">\r\n <span id=\"no-filter-space\"></span><br />\r\n </ng-container>\r\n <i *ngIf=\"header.tooltip && header.tooltip.name == 'lurViolationInfoTooltip'\" class=\"{{header['tooltip'].iconClass}}\"\r\n [ngStyle]=\"{'float': header['tooltip'].iconPosition}\"\r\n #t=\"ngbTooltip\"\r\n [ngbTooltip]=\"lurViolationInfoTooltip\"\r\n placement=\"{{ header['tooltip'].tooltipPosition }}\"\r\n tooltipClass=\"{{ header['tooltip'].tooltipClass }}\"\r\n >\r\n </i>\r\n\r\n </div>\r\n </div>\r\n </th>\r\n\r\n <ng-container *ngIf=\"gtGeneralConfig.component == 'DRR'\">\r\n <ng-container *matCellDef=\"let ROW_DATA\">\r\n <ng-container *ngIf=\"showSkeletonLoading\">\r\n <td mat-cell>\r\n <ngx-skeleton-loader count=\"1\" [theme]=\"{ height: '10px', display: 'block' }\">\r\n </ngx-skeleton-loader>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!showSkeletonLoading\">\r\n <ng-container\r\n *ngFor=\"let subline of columnDef.headerInfo; let sublineIndex = index; trackBy: trackByFn\"\r\n >\r\n <td\r\n mat-cell\r\n *ngIf=\"!ROW_DATA['hide' + subline.objectKey + 'Td']\"\r\n [attr.rowspan]=\"ROW_DATA[subline.objectKey + 'Rowspan']\"\r\n >\r\n <ng-container [ngSwitch]=\"subline.typeOfBodyData\">\r\n <ng-container *ngSwitchCase=\"'ICON'\">\r\n <i [class]=\"ROW_DATA.iconClass\"></i>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'CHECKBOX'\">\r\n <span\r\n *ngIf=\"ROW_DATA[subline.objectKey]\"\r\n [ngClass]=\"{ 'disable-checkbox': ROW_DATA[subline.isDisabledKey] }\"\r\n class=\"material-icons custom-column-checkbox-checked\"\r\n (click)=\"selectUnselectRow(ROW_DATA)\"\r\n >\r\n check_box\r\n </span>\r\n <span\r\n *ngIf=\"!ROW_DATA[subline.objectKey]\"\r\n class=\"material-icons custom-column-checkbox-unchecked\"\r\n [ngClass]=\"{ 'disable-checkbox': ROW_DATA[subline.isDisabledKey] }\"\r\n (click)=\"selectUnselectRow(ROW_DATA)\"\r\n >\r\n check_box_outline_blank\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'RADIO'\">\r\n <mat-radio-group\r\n *ngIf=\"ROW_DATA['RadioButtonConfig']\"\r\n [ngModel]=\"ROW_DATA[subline.objectKey]\"\r\n [disabled]=\"ROW_DATA['RadioButtonConfig'][0].isDisabled\"\r\n >\r\n <ng-container\r\n *ngFor=\"let radioButton of ROW_DATA['RadioButtonConfig']; let last = last\"\r\n >\r\n <mat-radio-button\r\n value=\"{{ radioButton.value }}\"\r\n class=\"{{ radioButton.class }}\"\r\n (click)=\"\r\n radioButtonClicked(\r\n ROW_DATA,\r\n radioButton.value,\r\n ROW_DATA['RadioButtonConfig'][0].isDisabled\r\n )\r\n \"\r\n >{{ radioButton.label }}</mat-radio-button\r\n ><br *ngIf=\"!last\" />\r\n </ng-container>\r\n </mat-radio-group>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n {{ ROW_DATA[subline.objectKey] }}\r\n\r\n <ng-container\r\n *ngIf=\"\r\n subline.objectKey == 'Status' && (ROW_DATA['Remarks'] !== null)\r\n \"\r\n >\r\n <i\r\n class=\"mi mdi-info-outline remarks-tooltip\"\r\n [ngbTooltip]=\"columnInfoTooltip\"\r\n placement=\"bottom\"\r\n container=\"body\"\r\n tooltipClass=\"remarks-info-tooltip\"\r\n #t=\"ngbTooltip\"\r\n ></i>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"gtGeneralConfig.component != 'DRR'\">\r\n <td mat-cell *matCellDef=\"let ROW_DATA\" [style.background]=\"ROW_DATA.backgroundColor\">\r\n <ngx-skeleton-loader *ngIf=\"showSkeletonLoading\" count=\"1\" [theme]=\"{ height: '10px', display: 'block' }\">\r\n </ngx-skeleton-loader>\r\n\r\n <ng-container *ngIf=\"!showSkeletonLoading\">\r\n <ng-container *ngIf=\"tableData.length > 0 && !showNoDataToDisplay\">\r\n <div *ngFor=\"let subline of columnDef.headerInfo; let subLineIndex = index; trackBy: trackByFn\">\r\n <ng-container [ngSwitch]=\"columnDef.headerInfo[subLineIndex].typeOfBodyData\">\r\n <ng-container *ngSwitchCase=\"'ICON'\">\r\n <i [class]=\"ROW_DATA.iconClass\" (click)=\"iconClicked(ROW_DATA,ROW_DATA.iconClass)\"></i>\r\n </ng-container>\r\n \r\n <ng-container *ngSwitchCase=\"'SVG_ICON'\">\r\n <ng-container *ngIf=\"gtGeneralConfig.component == 'ORDER_LISTING_INFLIGHT'\">\r\n <span\r\n *ngIf=\"ROW_DATA.payForPerformance && subline.objectKey == 'payForPerformance'\"\r\n class=\"cursor-not-allowed\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <anna-pay-for-performance-icon-template\r\n [color]=\"PfpIconActiveColor\"\r\n [width]=\"'15px'\"\r\n [height]=\"'15px'\"\r\n >\r\n </anna-pay-for-performance-icon-template>\r\n </span>\r\n <span\r\n *ngIf=\"ROW_DATA.orderStatus != 'LIVE' && !ROW_DATA.payForPerformance && subline.objectKey == 'payForPerformance'\"\r\n (click)=\"svgIconClicked(ROW_DATA,'payForPerformance')\"\r\n >\r\n <anna-pay-for-performance-icon-template\r\n [color]=\"PfpIconDisableColor\"\r\n [width]=\"'15px'\"\r\n [height]=\"'15px'\"\r\n >\r\n </anna-pay-for-performance-icon-template>\r\n </span>\r\n \r\n <anna-live-icon-template *ngIf=\"ROW_DATA.orderStatus == 'LIVE' && subline.objectKey == 'orderStatus' \"></anna-live-icon-template>\r\n </ng-container>\r\n <ng-container *ngIf=\"gtGeneralConfig.component == 'ORDER_LISTING_COMPLETED'\">\r\n <span *ngIf=\"ROW_DATA.payForPerformance && subline.objectKey == 'payForPerformance'\" (click)=\"$event.stopPropagation()\">\r\n <anna-pay-for-performance-icon-template\r\n [color]=\"PfpIconActiveColor\"\r\n [width]=\"'20px'\"\r\n [height]=\"'20px'\"\r\n >\r\n </anna-pay-for-performance-icon-template>\r\n </span>\r\n </ng-container>\r\n <ng-container *ngIf=\"subline.objectKey == 'bizRuleStatus'\">\r\n <anna-rejected-icon-template *ngIf=\"ROW_DATA.bizRuleStatus == 'REJECTED'\"></anna-rejected-icon-template>\r\n <anna-notify-icon-template *ngIf=\"ROW_DATA.bizRuleStatus == 'NOTIFY'\"></anna-notify-icon-template>\r\n <anna-buyer-approval-icon-template *ngIf=\"ROW_DATA.bizRuleStatus == 'AWAITING_APPROVAL'\"></anna-buyer-approval-icon-template>\r\n </ng-container>\r\n </ng-container>\r\n \r\n <ng-container *ngSwitchCase=\"'TEXT_ACTIONS'\">\r\n <button *ngFor=\"let text of ROW_DATA.textActions\" (click)=\"textActionClicked(ROW_DATA,text.id)\" [disabled]=\"text.isDisabled\" class=\"{{text.class}}\">{{text.name}}</button>\r\n </ng-container>\r\n \r\n <ng-container *ngSwitchCase=\"'CHECKBOX'\">\r\n <span\r\n *ngIf=\"ROW_DATA[columnDef.headerInfo[subLineIndex].objectKey]\"\r\n [ngClass]=\"{\r\n 'disable-checkbox': ROW_DATA[columnDef.headerInfo[subLineIndex].isDisabledKey]\r\n }\"\r\n class=\"material-icons custom-column-checkbox-checked\"\r\n (click)=\"\r\n selectOrUnselectCheckbox(\r\n ROW_DATA,\r\n columnDef.headerInfo[subLineIndex].objectKey,\r\n false\r\n )\r\n \"\r\n >\r\n check_box\r\n </span>\r\n <span\r\n *ngIf=\"!ROW_DATA[columnDef.headerInfo[subLineIndex].objectKey]\"\r\n class=\"material-icons custom-column-checkbox-unchecked\"\r\n [ngClass]=\"{\r\n 'disable-checkbox': ROW_DATA[columnDef.headerInfo[subLineIndex].isDisabledKey]\r\n }\"\r\n (click)=\"\r\n selectOrUnselectCheckbox(\r\n ROW_DATA,\r\n columnDef.headerInfo[subLineIndex].objectKey,\r\n true\r\n )\r\n \"\r\n >\r\n check_box_outline_blank\r\n </span>\r\n </ng-container>\r\n \r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngIf=\"subline.objectKey != 'description'\">\r\n <span>{{ ROW_DATA[columnDef.headerInfo[subLineIndex].objectKey] }}</span>\r\n <i\r\n *ngIf=\"subline.objectKey == 'inventoryCode' && ROW_DATA['isSellerGroup'] && gtGeneralConfig.component == 'RATING' \"\r\n class=\"mdi mdi-alert-circle-outline seller-tooltip\"\r\n [ngbTooltip]=\"sellerHierarchyTooltip\"\r\n placement=\"bottom auto\"\r\n container=\"body\"\r\n [autoClose]=\"true\"\r\n triggers=\"manual\"\r\n (hidden)=\"closeTooltip()\"\r\n #info=\"ngbTooltip\"\r\n tooltipClass=\"hierarchy-tooltip\"\r\n (mouseenter)=\"bindTheValueToSellerGroupTooltip(ROW_DATA.sellerGroupHierarchy, info)\">\r\n </i>\r\n </ng-container>\r\n <ng-container *ngIf=\"subline.objectKey == 'description'\">\r\n <p *ngIf=\"ROW_DATA.descriptionMessage || ROW_DATA.descriptionEmailReferenceNum\">\r\n <ng-container *ngIf=\"ROW_DATA.descriptionMessage\">\r\n {{ ROW_DATA.descriptionMessage }}\r\n <br />\r\n </ng-container>\r\n <ng-container *ngIf=\"ROW_DATA.descriptionEmailReferenceNum\">\r\n Email Ref: {{ ROW_DATA.descriptionEmailReferenceNum }}\r\n <br />\r\n </ng-container>\r\n </p>\r\n <a\r\n href=\"{{ ROW_DATA.descriptionDetailsUrl }}\"\r\n target=\"_blank\"\r\n *ngIf=\"ROW_DATA.descriptionDetailsUrlType === 'PDF' || ROW_DATA.descriptionDetailsUrlType === 'EXCEL'\"\r\n >\r\n <button class=\"btn viewDetailsAndEmailBtn\">Download</button>\r\n </a>\r\n <ng-container *ngIf=\"ROW_DATA.activityname.toLowerCase() == 'order onboarded'\">\r\n <a *ngIf=\"ROW_DATA.descriptionDetailsUrlType === 'LINK'\" (click)=\"viewDetailsClicked(ROW_DATA)\">\r\n <button class=\"btn viewDetailsAndEmailBtn\">View details</button>\r\n </a>\r\n </ng-container>\r\n \r\n <a href=\"{{ ROW_DATA.descriptionEmailUrl }}\" target=\"_blank\" *ngIf=\"ROW_DATA.descriptionEmailUrl\">\r\n <button class=\"btn viewDetailsAndEmailBtn\">View email</button>\r\n </a>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n \r\n <ng-container\r\n *ngIf=\"\r\n gtGeneralConfig.page === 'SpotDetails' &&\r\n columnDef.headerInfo[subLineIndex].objectKey === 'Status'\r\n \"\r\n >\r\n <img\r\n src=\"assets/images/Undo-Credit-Icon.svg\"\r\n style=\"cursor: pointer\"\r\n class=\"img-circle\"\r\n alt=\"User Image\"\r\n height=\"15px\"\r\n width=\"15px\"\r\n *ngIf=\"ROW_DATA.AllowUserToUndoMarkForCredit\"\r\n (click)=\"undoCreditedSpot(ROW_DATA)\"\r\n />\r\n <img\r\n src=\"assets/images/Undo-MG-Icon.svg\"\r\n style=\"cursor: pointer\"\r\n class=\"img-circle\"\r\n alt=\"User Image\"\r\n height=\"15px\"\r\n width=\"15px\"\r\n *ngIf=\"ROW_DATA.AllowUserToUndoMarkForMakeGood\"\r\n (click)=\"undoMgSpot(ROW_DATA)\"\r\n />\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"showNoDataToDisplay\">\r\n <div>\r\n {{null}}\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n </table>\r\n </anna-table-virtual-scroll-viewport>\r\n <anna-core-no-data-lib [width]=\"noDataWidth\" [marginTop]=\"marginTop\" *ngIf=\"!showSkeletonLoading && showNoDataToDisplay\"> </anna-core-no-data-lib>\r\n</div>\r\n\r\n<!-- Checkbox template -->\r\n<ng-template #filterTooltip>\r\n \r\n <div class=\"radio-container\" *ngIf=\"showCheckboxFilterRadioButtons\">\r\n <div *ngFor=\"let data of radioButtons\">\r\n <p class=\"filter-tab\" (click)=\"populateTooltipDataBasedOnSelectedRadio(data)\" [ngClass]=\"{'active': annaFilterService.selectedRadio == data.key}\" *ngIf=\"radioButtons.length > 0\">{{ data.label }}</p>\r\n </div>\r\n </div>\r\n \r\n <div class=\"checkbox-sort\" *ngIf=\"showSortComponent\">\r\n <anna-core-sort-lib (sortOptionClicked)=\"storeSortTypeInTempVariable($event)\" [sortObjectKey]=\"annaFilterService.selectedRadio\"></anna-core-sort-lib>\r\n </div>\r\n \r\n <ng-container *ngIf=\"showFilterComponent\">\r\n <p class=\"d-flex justify-content-between\">\r\n <button class=\"filter-text-btn\" [disabled]=\"disableClearAll\" (click)=\"unCheckAllCheckbox()\">Clear All</button>\r\n <button class=\"filter-text-btn\" [disabled]=\"disableSelectAll\" (click)=\"selectAllCheckbox()\">Select All</button>\r\n </p>\r\n <p class=\"search-box\">\r\n <i class=\"mi mdi-search search-icon search-icon-position\"></i>\r\n <input\r\n type=\"text\"\r\n placeholder=\"Search\"\r\n class=\"search-input\"\r\n style=\"margin-left: 2px; border: none; padding: 0px\"\r\n [(ngModel)]=\"searchItem\"\r\n (ngModelChange)=\"searchForTheItem($event)\"\r\n />\r\n <i class=\"mdi mdi-close search-bar-close\" [ngClass]=\"{'disable-close-icon': (!searchItem || searchItem.length == 0) }\"\r\n (click)=\"clearSearchedItem()\"></i>\r\n\r\n </p>\r\n <div class=\"dropdown-data-container\">\r\n <ng-container *ngFor=\"let option of tooltipOptions\">\r\n <p class=\"input\" (click)=\"selectUnselectCheckbox(option)\">\r\n <span *ngIf=\"option.isSelected\" role=\"button\" class=\"mi mdi-check-box check-box\"></span>\r\n <span *ngIf=\"!option.isSelected\" role=\"button\" class=\"mi mdi-check-box-outline-blank check-box unchecked\"></span>\r\n <span class=\"data\" title=\"{{ option.data }}\" [innerHTML]=\"option.data\"></span>\r\n </p>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"buttons-container\">\r\n <button class=\"button\" (click)=\"closeCheckboxFilter()\">Cancel</button>\r\n <button\r\n class=\"button\"\r\n [ngClass]=\"{ disabled: disableCheckboxApply }\"\r\n (click)=\"applyFilters()\"\r\n [disabled]=\"disableCheckboxApply\"\r\n >\r\n Apply\r\n </button>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Slider template -->\r\n<ng-template #sliderToolTip>\r\n \r\n <div class=\"radio-container\" *ngIf=\"showCheckboxFilterRadioButtons\">\r\n <div *ngFor=\"let data of radioButtons\">\r\n <p class=\"filter-tab\" (click)=\"populateTooltipDataBasedOnSelectedRadio(data)\" [ngClass]=\"{'active': annaFilterService.selectedRadio == data.key}\" *ngIf=\"radioButtons.length > 0\">{{ data.label }}</p> \r\n </div>\r\n </div>\r\n <!-- <button class=\"column-clear-all align-center\" [disabled]=\"disableColumnClearAllBtn\" (click)=\"clearColumnFilter()\">\r\n Clear filter\r\n </button> -->\r\n \r\n <anna-core-sort-lib *ngIf=\"showSortComponent\" (sortOptionClicked)=\"storeSortTypeInTempVariable($event)\" [sortObjectKey]=\"annaFilterService.selectedRadio\"></anna-core-sort-lib>\r\n \r\n <ng-container *ngIf=\"showFilterComponent\">\r\n <button class=\"column-clear-all\" [disabled]=\"disableColumnClearAllBtn\" (click)=\"clearColumnFilter()\">Clear filter</button>\r\n <section class=\"min-maxContainer\">\r\n <input\r\n type=\"number\"\r\n class=\"slider-text\"\r\n step=\"{{ sliderFilterTextBoxStep }}\"\r\n [ngModel]=\"sliderMinValue\"\r\n (ngModelChange)=\"minValueChanged($event)\"\r\n [ngClass]=\"{'red-border': showSliderMinValueError}\"\r\n placeholder=\"Min\"\r\n />\r\n <span>To</span>\r\n <input\r\n type=\"number\"\r\n class=\"slider-text\"\r\n step=\"{{ sliderFilterTextBoxStep }}\"\r\n [ngModel]=\"sliderMaxValue\"\r\n (ngModelChange)=\"maxValueChanged($event)\"\r\n [ngClass]=\"{'red-border': showSliderMaxValueError}\"\r\n placeholder=\"Max\"\r\n />\r\n </section>\r\n <div class=\"sidebar-slider\">\r\n <ngx-slider\r\n class=\"filter-slider\"\r\n [value]=\"sliderMinValue\"\r\n [highValue]=\"sliderMaxValue\"\r\n [options]=\"options\"\r\n ></ngx-slider>\r\n </div>\r\n </ng-container>\r\n \r\n <div class=\"buttons-container\">\r\n <button class=\"button\" (click)=\"cancelSliderFilter()\">Cancel</button>\r\n <button\r\n class=\"button\"\r\n [ngClass]=\"{ disabled: disableSliderApplyButton }\"\r\n (click)=\"applySliderFilter()\"\r\n [disabled]=\"disableSliderApplyButton\"\r\n >\r\n Apply\r\n </button>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Date Picker Template -->\r\n<ng-template #datePickerTooltip>\r\n <div class=\"radio-container\" *ngIf=\"showCheckboxFilterRadioButtons\">\r\n <div *ngFor=\"let data of radioButtons\">\r\n <p class=\"filter-tab\" (click)=\"populateTooltipDataBasedOnSelectedRadio(data)\" [ngClass]=\"{'active': annaFilterService.selectedRadio == data.key}\" *ngIf=\"radioButtons.length > 0\">{{ data.label }}</p>\r\n </div>\r\n </div>\r\n\r\n <anna-core-sort-lib *ngIf=\"showSortComponent\" (sortOptionClicked)=\"storeSortTypeInTempVariable($event)\" [sortObjectKey]=\"annaFilterService.selectedRadio\"></anna-core-sort-lib>\r\n \r\n <ng-container *ngIf=\"showFilterComponent\">\r\n <div class=\"datepicker-container\">\r\n <button class=\"column-clear-all\" [disabled]=\"disableColumnClearAllBtn\" (click)=\"clearColumnFilter()\">\r\n Clear filter\r\n </button>\r\n <anna-core-calendar-filter-lib\r\n [minDate]=\"calendarMinEnabledDate\"\r\n [maxDate]=\"calendarMaxEnabledDate\"\r\n [selectedFromDate]=\"selectedMinDate\"\r\n [selectedToDate]=\"selectedMaxDate\"\r\n (selectedDate) = \"calendarDateChanged($event)\"\r\n [label]=\"selectedLabel\"\r\n >\r\n </anna-core-calendar-filter-lib>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"buttons-container\">\r\n <button class=\"button\" (click)=\"cancelInDateFilter()\">Cancel</button>\r\n <button class=\"button\" (click)=\"applyDateFilter()\" [disabled]=\"disableCalendarApplyBtn\">Apply</button>\r\n </div>\r\n \r\n</ng-template>\r\n\r\n<!-- Week Picker Template -->\r\n<ng-template #weekPickerToolTip>\r\n <div class=\"weekpicker-container\">\r\n <anna-core-week-calendar-filter-lib\r\n [week-calendar-config]=\"gtGeneralConfig.multiWeekPickerConfig\"\r\n (apply)=\"applyWeekFilter($event)\"\r\n [from-date]=\"calendarMinEnabledDate\"\r\n [to-date]=\"calendarMaxEnabledDate\"\r\n >\r\n </anna-core-week-calendar-filter-lib>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Time Filter Template -->\r\n<ng-template #timeFilterToolTip>\r\n \r\n <div class=\"radio-container\" *ngIf=\"showCheckboxFilterRadioButtons\">\r\n <div *ngFor=\"let data of radioButtons\">\r\n <p class=\"filter-tab\" (click)=\"populateTooltipDataBasedOnSelectedRadio(data)\" [ngClass]=\"{'active': annaFilterService.selectedRadio == data.key}\" *ngIf=\"radioButtons.length > 0\">{{ data.label }}</p>\r\n </div>\r\n </div>\r\n\r\n <anna-core-sort-lib *ngIf=\"showSortComponent\" (sortOptionClicked)=\"storeSortTypeInTempVariable($event)\" [sortObjectKey]=\"annaFilterService.selectedRadio\"></anna-core-sort-lib>\r\n \r\n <ng-container *ngIf=\"showFilterComponent\">\r\n <button class=\"column-clear-all\" [disabled]=\"disableColumnClearAllBtn\" (click)=\"clearColumnFilter()\">Clear filter</button>\r\n <div\r\n class=\"time-filter-checkboxes\"\r\n *ngIf=\"gtGeneralConfig.component == 'SPOTDETAILS' || gtGeneralConfig.component == 'EXCLUDEINVENTORYPOPUP' || gtGeneralConfig.component == 'RATING'\"\r\n >\r\n <!-- Multi time option checkbox -->\r\n <div class=\"d-flex align-items-center\" style=\"padding: 0.5rem 0 0.5rem 0.5rem\" *ngIf=\"showMultiTimeCheckbox\">\r\n <span\r\n *ngIf=\"multiTimeCheckboxChecked\"\r\n class=\"material-icons custom-column-checkbox-checked\"\r\n (click)=\"selectOrUnselectMultiTimeCheckbox()\"\r\n >\r\n check_box\r\n </span>\r\n <span\r\n *ngIf=\"!multiTimeCheckboxChecked\"\r\n class=\"material-icons custom-column-checkbox-unchecked\"\r\n (click)=\"selectOrUnselectMultiTimeCheckbox()\"\r\n >\r\n check_box_outline_blank\r\n </span>\r\n <p style=\"margin-left: 2px\">Include Multi</p>\r\n </div>\r\n <!-- Zero time option checkbox -->\r\n <div class=\"d-flex align-items-center\" style=\"padding: 0.5rem 0 0.5rem 0.5rem\" *ngIf=\"showZeroTimeCheckbox\">\r\n <span\r\n *ngIf=\"zeroTimeCheckboxChecked\"\r\n class=\"material-icons custom-column-checkbox-checked\"\r\n (click)=\"selectOrUnselectZeroTimeCheckbox()\"\r\n >\r\n check_box\r\n </span>\r\n <span\r\n *ngIf=\"!zeroTimeCheckboxChecked\"\r\n class=\"material-icons custom-column-checkbox-unchecked\"\r\n (click)=\"selectOrUnselectZeroTimeCheckbox()\"\r\n >\r\n check_box_outline_blank\r\n </span>\r\n <p style=\"margin-left: 2px\">Include Zero</p>\r\n </div>\r\n <!-- Enter time range option checkbox -->\r\n <div class=\"d-flex align-items-center\" style=\"padding: 0.5rem 0 0.5rem 0.5rem\" *ngIf=\"showEnterTimeCheckbox\">\r\n <span\r\n *ngIf=\"enterTimeCheckboxChecked\"\r\n class=\"material-icons custom-column-checkbox-checked\"\r\n (click)=\"selectOrUnselectEnterTimeCheckbox()\"\r\n >\r\n check_box\r\n </span>\r\n <span\r\n *ngIf=\"!enterTimeCheckboxChecked\"\r\n class=\"material-icons custom-column-checkbox-unchecked\"\r\n (click)=\"selectOrUnselectEnterTimeCheckbox()\"\r\n >\r\n check_box_outline_blank\r\n </span>\r\n <p style=\"margin-left: 2px\">Enter time range</p>\r\n </div>\r\n </div>\r\n <div class=\"time-label-container\">\r\n <label>From</label>\r\n </div>\r\n <div class=\"time-container\">\r\n <input class=\"form-control numberInput\" [ngClass]=\"{'error-border': startTimeHourErr}\" [(ngModel)]=\"selectedFromTime[0]\" type=\"text\" (ngModelChange)=\"startTimeHourChange($event)\" />\r\n <div class=\"arrow-container\">\r\n <i class=\"mdi mdi-triangle upward\" (click)=\"changeStartTimeHour(true)\"></i>\r\n <i class=\"mdi mdi-triangle downward\" (click)=\"changeStartTimeHour(false)\"></i>\r\n </div>\r\n <span class=\"dot\">:</span>\r\n <input class=\"form-control numberInput\" [ngClass]=\"{'error-border': startTimeMinErr}\" [(ngModel)]=\"selectedFromTime[1]\" type=\"text\" (ngModelChange)=\"startTimeMinChange($event)\"/>\r\n <div class=\"arrow-container\">\r\n <i class=\"mdi mdi-triangle upward\" (click)=\"changeStartTimeMinute(true)\"></i>\r\n <i class=\"mdi mdi-triangle downward\" (click)=\"changeStartTimeMinute(false)\"></i>\r\n </div>\r\n <div>\r\n <mat-button-toggle-group [(ngModel)]=\"selectedFromTime[2]\" (ngModelChange)=\"disableTimeFilterApplyButton()\">\r\n <mat-button-toggle value=\"AM\">\r\n <span>AM</span>\r\n </mat-button-toggle>\r\n <mat-button-toggle value=\"PM\">\r\n <span>PM</span>\r\n </mat-button-toggle>\r\n </mat-button-toggle-group>\r\n </div>\r\n </div>\r\n\r\n <div class=\"time-label-container\">\r\n <label>To</label>\r\n </div>\r\n <div class=\"time-container\">\r\n <input class=\"form-control numberInput\" [(ngModel)]=\"selectedToTime[0]\" [ngClass]=\"{'error-border': endTimeHourErr}\" (ngModelChange)=\"endTimeHourChange($event)\" type=\"text\" />\r\n <div class=\"arrow-container\">\r\n <i class=\"mdi mdi-triangle upward\" (click)=\"changeEndTimeHour(true)\"></i>\r\n <i class=\"mdi mdi-triangle downward\" (click)=\"changeEndTimeHour(false)\"></i>\r\n </div>\r\n <span class=\"dot\">:</span>\r\n <input class=\"form-control numberInput\" [ngClass]=\"{'error-border': endTimeMinErr}\" [(ngModel)]=\"selectedToTime[1]\" (ngModelChange)=\"endTimeMinChange($event)\" type=\"text\" />\r\n <div class=\"arrow-container\">\r\n <i class=\"mdi mdi-triangle upward\" (click)=\"changeEndTimeMinute(true)\"></i>\r\n <i class=\"mdi mdi-triangle downward\" (click)=\"changeEndTimeMinute(false)\"></i>\r\n </div>\r\n <div>\r\n <mat-button-toggle-group [(ngModel)]=\"selectedToTime[2]\" (ngModelChange)=\"disableTimeFilterApplyButton()\">\r\n <mat-button-toggle value=\"AM\">\r\n <span>AM</span>\r\n </mat-button-toggle>\r\n <mat-button-toggle value=\"PM\">\r\n <span>PM</span>\r\n </mat-button-toggle>\r\n </mat-button-toggle-group>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"buttons-container\">\r\n <button class=\"button\" (click)=\"closeTimeFilter()\">Cancel</button>\r\n <button\r\n class=\"button\"\r\n [ngClass]=\"{ disabled: disableTimeFilterApplyBtn }\"\r\n (click)=\"applyTimeFilters()\"\r\n [disabled]=\"disableTimeFilterApplyBtn\"\r\n >\r\n Apply\r\n </button>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #columnInfoTooltip>\r\n <p style=\"padding: 0.5rem; color: black;white-space: nowrap;\">This preemption is rejected and not marked for credit.</p>\r\n</ng-template>\r\n\r\n<ng-template #ratingInfoTooltip>\r\n <p class=\"first-row\">Shows 'Booked Rating' for Preemptions & MakeGood Offered spot(s).</p>\r\n <p class=\"second-row\">Shows 'Projected Rating' for ADU Offered spot(s).</p>\r\n</ng-template>\r\n\r\n<ng-template #impsInfoTooltip>\r\n <p class =\"first-row\" >Shows 'Booked IMPS' for Preemptions & MakeGood Offered spot(s).</p>\r\n <p class=\"second-row\" >Shows 'Projected IMPS' for ADU Offered spot(s).</p>\r\n</ng-template>\r\n\r\n<ng-template #rateInfoTooltip>\r\n <p class =\"first-row\" >Shows 'Booked Rate' for Preemptions & MakeGood Offered spot(s).</p>\r\n <p class=\"second-row\" >Shows 'Projected $ Value' for ADU Offered spot(s).</p>\r\n</ng-template>\r\n\r\n<ng-template #sellerHierarchyTooltip>\r\n <ng-container *ngIf=\"sellerGroupHierarchy.length > 0\">\r\n <table class=\"seller-hierarchy-table\">\r\n <thead>\r\n <tr>\r\n <th>#</th>\r\n <th>Inventory Codes</th>\r\n <th>Program/Description</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of sellerGroupHierarchy; let tooltipIndex = index\">\r\n <td>{{ tooltipIndex + 1 }}</td>\r\n <td>\r\n <span>{{ data.inventoryCode }}</span>\r\n </td>\r\n <td>\r\n <span>{{ data.program }}</span>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </ng-container>\r\n <ng-container *ngIf=\"sellerGroupHierarchy.length == 0\">\r\n <span style=\"color: #000\">Seller group not available for this inventory code</span>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #lurViolationInfoTooltip>\r\n <p class =\"first-row\" >The values are for the entire week.</p>\r\n</ng-template>", styles: [".sort-btn{background:white;border:none;border-right:1px solid #1b88ff;text-decoration:underline;font-family:Roboto;font-size:14px;font-weight:400;font-stretch:normal;font-style:normal;line-height:1.07;letter-spacing:normal;color:#1b88ff;cursor:pointer;flex:1;text-align:center}.sort-btn:last-of-type{border-right:none}.sort-btn.active{color:#202b47;text-decoration:none}p.sort-container{margin-top:8px;padding-bottom:8px;border-bottom:1px solid #e6e6e6;margin-bottom:0;display:flex}::ng-deep .tooltip-inner{max-height:22rem;background-color:#fff;border:1px solid white;border-radius:5px;box-shadow:0 2px 2px #0000003d,0 0 2px #0000001f;max-width:251px;width:100%;padding:0!important}::ng-deep .tooltip-inner div.radio-container{flex-wrap:wrap}::ng-deep .md-drppicker{box-shadow:unset!important}::ng-deep .available{color:#999}::ng-deep .bs-tooltip-bottom .arrow:before{border-bottom-color:#fff!important}::ng-deep .bs-tooltip-left .arrow:before{border-left-color:#fff!important}::ng-deep .tooltip.show{opacity:1}.input{text-align:left;margin:5px 10px 5px 5px;display:flex;align-items:center;width:98%;white-space:nowrap}.data{color:#000;font-weight:700;margin-left:5px;margin-right:5px}span.data{display:inline-block;text-overflow:ellipsis;white-space:nowrap;width:85%;overflow:hidden}.check-box{font-size:14px;cursor:pointer;position:relative;top:-1px}span.mdi-filter.active{color:#000;opacity:1!important;pointer-events:all!important}p{margin-bottom:0;line-height:initial}span.mdi-filter{color:#cbcbcb}::ng-deep .ngx-slider{margin:5px 0 2px!important;width:100%!important}::ng-deep span.ngx-slider-bubble.ngx-slider-model-value{display:block!important;padding:2px!important;box-shadow:#00000059 0 3px 8px!important;height:20px!important}::ng-deep .ngx-slider-pointer{top:-5px!important;width:12px!important;height:12px!important;background:#bdbdbd!important;border:1px solid #ffffff!important;box-shadow:0 1px 3px #0000004d!important;border-radius:16px!important}::ng-deep .ngx-slider-pointer:after{display:none!important}::ng-deep .ngx-slider-pointer:focus{outline:none!important}::ng-deep span.ngx-slider-bar{background:#ededed!important;height:3px!important}::ng-deep .filter-slider span.ngx-slider-bar.ngx-slider-selection{background:#bdbdbd!important;height:3px!important}::ng-deep .sidebar-slider{margin-bottom:35px!important;margin-left:.3125rem;margin-right:.3125rem}::ng-deep .ngx-slider-span.ngx-slider-bubble.ngx-slider-model-high{right:0!important}::ng-deep .ngx-slider-span.ngx-slider-bubble.ngx-slider-model-ceil{right:0!important}::ng-deep .ngx-slider.animate{top:10px!important;bottom:0!important;padding:1px 0!important;font-size:12px!important}::ng-deep .ngx-slider-bubble{top:10px!important;bottom:0!important;padding:1px 0!important;font-size:12px!important}::ng-deep .ngx-slider-bar{background:rgba(0,0,0,.26)!important;height:3px!important}::ng-deep .ngx-slider-bar.ngx-slider-selection{background:#42a5f5!important;height:3px!important}input:focus{outline:none}input::placeholder{color:#c8c8c8}.cancel-btn{background:#c7e1ff;color:#268bff}.apply-btn{background:#268bff;color:#fff;margin-left:.3125rem}div.radio-container{display:flex;white-space:nowrap;justify-content:space-between;background-color:#f4f4f4;border-radius:.125rem;margin:.4375rem .4375rem .25rem}div.radio-container div{flex:1}div.radio-container input{position:relative;top:.125rem;margin-right:.25rem}div.radio-container label{font-family:Roboto;font-size:.875rem;font-weight:400;font-stretch:normal;font-style:normal;line-height:1.29;letter-spacing:0;color:#4a4a4a;margin:0;padding-left:.125rem}div.radio-container label:first-of-type{margin-right:.188rem}div.radio-container input[type=radio]{-webkit-appearance:none;appearance:none;display:inline-block;width:.9375rem;height:.9375rem;padding:.125rem;background-clip:content-box;border:.125rem solid #268bff;background-color:transparent;border-radius:50%}div.radio-container input[type=radio]:checked{background-color:#268bff}.buttons-container{display:flex;margin:0px auto .4375rem;justify-content:center}.buttons-container button:last-of-type{background-color:#268bff;color:#fff}.buttons-container button.disabled{background:#bdbdbd;opacity:.5;color:#4a4a4a}.button{display:inline-block;margin:8px 4px 0 8px;padding:0 16px;border-radius:4px;text-align:center;outline:none;font-family:Roboto;font-size:.75rem;font-weight:400;font-stretch:normal;font-style:normal;line-height:1.67;letter-spacing:normal;border:none;color:#268bff;background-color:#e5f1ff}.search-box{display:flex;align-items:center;color:#c8c8c8;border:1px solid #e6e6e6;border-radius:.125rem;margin:.25rem .4375rem .188rem;height:1.5rem;padding:.188rem 0 .188rem .5rem}.search-icon{margin:0 4px 0 0;font-size:1.125rem;color:#9b9b9b}.filter-icon{justify-content:right;margin-left:auto;color:#d4d4d4;color:#a1a1a1;font-size:16px;cursor:pointer}.data{margin:0 13px 0 8px;font-family:Roboto;font-size:.875rem;font-weight:400;font-stretch:normal;font-style:normal;line-height:1.86;letter-spacing:\"\";color:#4a4a4a}.search-input{margin:1px 0 1px 4px;font-family:Roboto;font-size:.875rem;font-weight:400;font-stretch:normal;font-style:normal;line-height:normal;letter-spacing:normal;color:#c8c8c8}.check-box{color:#268bff}.tooltip-data-container{overflow-y:scroll;max-height:8rem}.searchbar{width:100%;display:flex;justify-content:flex-end;align-items:flex-end}.clear-button{opacity:.5;font-family:Roboto;font-size:.9375rem;font-weight:500;font-stretch:normal;font-style:normal;line-height:normal;letter-spacing:normal;text-decoration:underline;border:none;background-color:#fff;color:#4a4a4a;margin-left:.625rem;padding:0}.clear-button:focus{outline:none;box-shadow:none}.unchecked{color:#268bff}div.dropdown-data-container{max-height:12.3rem;width:100%;overflow-y:auto;overflow-x:hidden}div.dropdown-data-container p.input{margin-left:0}div.dropdown-data-container p.input span.mi{padding-left:.4375rem}div.dropdown-data-container p.input:hover{background-color:#ebebeb;cursor:pointer}div.dropdown-data-container::-webkit-scrollbar{width:.188rem}div.dropdown-data-container::-webkit-scrollbar-thumb{color:#d3d3d3}section.min-maxContainer{display:flex;justify-content:center;margin-bottom:-.125rem;margin-top:.5rem;width:100%}section.min-maxContainer input{width:30%;height:1.875rem;border:1px solid lightgray;color:gray}section.min-maxContainer span{display:inline-block;padding-left:.5rem;padding-right:.5rem;position:relative;top:.3125rem;color:#666}.time-container{width:100%;display:flex;padding:.125rem .625rem 0}.time-container input.form-control:disabled{background-color:#fff;width:2.813rem}.time-container .dot{color:#cbcbcb;position:relative;left:-7px;font-size:17px}.time-container div.arrow-container{flex-direction:column;display:flex;padding-top:.375rem;padding-left:1px;margin-right:1.1875rem}.time-container div.arrow-container i{color:#cbcbcb;cursor:pointer;font-size:.5625rem}.time-container div.arrow-container i.downward{transform:rotate(180deg)}.mdi-filter{cursor:pointer}.time-label-container{display:flex;justify-content:flex-start}.time-label-container label{margin-bottom:0;color:#4a4a4a;margin-top:.625rem;margin-left:.625rem;font-weight:700}.time-heading{color:#000;font-size:.8125rem;text-align:left;padding-left:.625rem;margin-top:.625rem;font-weight:700}.column-clear-all{width:94%;text-align:center;border:none;font-size:14px;background:none;text-decoration:underline;color:#268bff}.checkbox-container{display:flex;padding-inline:.625rem}.checkbox-container .data{text-align:left}.checkbox-container:first-of-type{margin-top:.625rem;font-weight:500}.column-clear-all{width:94%;text-align:center;border:none;background:none;text-decoration:underline;color:#268bff}.column-clear-all:disabled{opacity:.5;color:#4a4a4a}.column-clear-all.align-center{text-align:center}span.mdi-filter-variant.disabled{pointer-events:none;opacity:.5}.datepicker-container{width:100%}span.mdi-filter-variant{color:#cbcbcb;cursor:pointer;font-size:.875rem}span.mdi-filter-variant.active{color:#000}p.filter-tab{font-family:Roboto;font-size:14px;font-weight:400;font-stretch:normal;font-style:normal;line-height:1.29;letter-spacing:normal;color:#1b88ff;border-radius:5px;background-color:#f4f4f4;padding-inline:8px;cursor:pointer}p.filter-tab.active{color:#fff;background-color:#1b88ff}button.filter-text-btn{background:white;text-decoration:underline;font-family:Roboto;font-size:14px;font-weight:400;font-stretch:normal;font-style:normal;line-height:normal;letter-spacing:normal;border:none;color:#268bff;margin-inline:4px;margin-top:2px}button.filter-text-btn:disabled{color:#b1b1b1;cursor:not-allowed}::ng-deep .non-edit-datepicker-tooltip .tooltip-inner{max-width:310px!important;width:263px!important;overflow-y:initial!important}input.slider-text::-webkit-outer-spin-button,input.slider-text::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input.slider-text{-moz-appearance:textfield}input.slider-text.red-border{border:1px solid #f44336!important}::ng-deep .checkbox-sort p.sort-container{margin-top:8px!important;padding-bottom:8px!important}i.mdi-close{cursor:pointer}i.mdi-close.disable-close-icon{pointer-events:none;cursor:not-allowed}input.error-border{border:1px solid #f44336!important}::ng-deep .non-edit-checkbox-tooltip .tooltip-inner{width:238px!important}::ng-deep .non-edit-slider-tooltip .tooltip-inner{width:238px!important}::ng-deep .non-edit-time-tooltip .tooltip-inner{width:219px!important}.upper-label{font-family:Roboto;font-size:.6875rem;font-weight:500;font-stretch:normal;font-style:normal;line-height:normal;letter-spacing:.3px;color:#4a4a4a!important;margin-bottom:0!important}:host ::ng-deep .gt{table-layout:fixed;margin-bottom:0;width:100%}:host ::ng-deep .gt th,:host ::ng-deep .gt td{padding:2px 8px;line-height:normal}:host ::ng-deep .gt thead tr th .upper-label{font-family:Roboto;font-size:.6875rem;font-weight:500;font-stretch:normal;font-style:normal;line-height:normal;letter-spacing:.3px;color:#4a4a4a;margin-bottom:0}:host ::ng-deep .gt thead tr th .lower-label{font-family:Roboto;font-size:.6875rem;font-weight:500;font-stretch:normal;font-style:normal;line-height:normal;letter-spacing:.3px;color:#a7a7a7;margin-bottom:0}:host ::ng-deep .gt thead tr th{background-color:#ededed;position:sticky;top:0;border-top:none!important;border-bottom:none!important;outline:none!important;box-shadow:inset 0 1px #d4d4d4,inset 0 -1px #d4d4d4,inset -1px 0 #d4d4d4}:host ::ng-deep .gt thead tr th br{display:block;content:\"\";margin-top:-8px}:host ::ng-deep .gt thead tr th div.row{display:flex;flex-wrap:nowrap;justify-content:space-between;align-items:center}:host ::ng-deep .gt thead tr th div.sort-filter-container{display:flex;flex-wrap:nowrap;align-items:center}:host ::ng-deep .gt thead tr th:first-of-type{box-shadow:inset 0 1px #d4d4d4,inset 0 -1px #d4d4d4,inset -1px 0 #d4d4d4,inset 1px 0 #d4d4d4}:host ::ng-deep .gt tbody tr td:first-of-type{box-shadow:inset 1px 0 #d4d4d4,inset -1px 0 #d4d4d4,inset 0 -1px #d4d4d4;border:none}:host ::ng-deep .gt tbody tr td:nth-of-type(n + 2){box-shadow:inset -1px 0 #d4d4d4,inset 0 -1px #d4d4d4;border:none}:host ::ng-deep .gt tbody tr td .upper-label{font-family:Roboto;font-size:.75rem;font-weight:400;font-stretch:normal;font-style:normal;line-height:normal;letter-spacing:0px;color:#000;display:inline-block;width:90%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}:host ::ng-deep .gt tbody tr td .lower-label{font-family:Roboto;font-size:.75rem;font-weight:400;font-stretch:normal;font-style:normal;line-height:normal;letter-spacing:0px;color:#a7a7a7;display:inline-block;width:90%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}:host ::ng-deep .gt tbody tr br{display:block;content:\"\";margin-top:-8px}:host ::ng-deep .gt tbody tr:nth-of-type(1) td{border-top:none!important}:host ::ng-deep .gt .custom-column-checkbox-checked,:host ::ng-deep .gt .custom-column-checkbox-unchecked{font-size:.875rem;cursor:pointer}:host ::ng-deep .gt .custom-column-checkbox-checked{color:#268bff}:host ::ng-deep .gt .custom-column-checkbox-unchecked{color:#4a4a4a}anna-table-virtual-scroll-viewport::-webkit-scrollbar-track{border:1px solid rgba(0,0,0,.1)!important}anna-table-virtual-scroll-viewport::-webkit-scrollbar{width:5px;height:5px}anna-table-virtual-scroll-viewport::-webkit-scrollbar-thumb{border-radius:4px;background-color:#0006!important;border:1px solid rgba(0,0,0,.2)}.table-container{overflow-x:auto;overflow-y:auto}.rowSelectCheckbox,#selectAllRowsCheckbox{cursor:pointer}.disable-checkbox{color:#dedede!important;pointer-events:none!important}.mdi-warning{color:#f3c639;font-size:16px;line-height:28px}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{opacity:1}.redcolor-status{color:#c62a2a}.redcolor-cell-border{outline:1px solid #ff5353!important;outline-offset:-1px!important}#no-filter-space{width:.875rem}::ng-deep .mat-button-toggle-appearance-standard .mat-button-toggle-label-content{line-height:1.875rem!important;width:2.625rem;padding:0 .625rem}input.numberInput{margin-right:-.8125rem;padding:0 0 0 .625rem;height:1.875rem}::ng-deep .mat-button-toggle-checked{background-color:#268bff!important;color:#fff!important}::ng-deep .mat-button-toggle-group-appearance-standard{border-radius:0}.hidden{display:none}.no-data-div{margin-top:2.5px}.no-data-div label{margin:0;width:auto;font-weight:500;background-color:#d3d3d3;padding:.3125rem 1.125rem;border-radius:.25rem}.column-values:nth-of-type(2){color:#a7a7a7!important}.custom-column-checkbox-checked,.custom-column-checkbox-unchecked{font-size:.875rem;cursor:pointer}.custom-column-checkbox-checked{color:#268bff}.custom-column-checkbox-unchecked{color:#4a4a4a}.time-filter-checkboxes>div>p{color:#151b1e}.radio-button-dimension,::ng-deep .markForCredit .mat-radio-inner-circle,::ng-deep .markForCredit .mat-radio-outer-circle,::ng-deep .mark-for-credit .mat-radio-inner-circle,::ng-deep .mark-for-credit .mat-radio-outer-circle,::ng-deep .markForMakeGood .mat-radio-inner-circle,::ng-deep .markForMakeGood .mat-radio-outer-circle,::ng-deep .noAction .mat-radio-inner-circle,::ng-deep .noAction .mat-radio-outer-circle,::ng-deep .credit .mat-radio-inner-circle,::ng-deep .credit .mat-radio-outer-circle,::ng-deep .approve .mat-radio-inner-circle,::ng-deep .approve .mat-radio-outer-circle,::ng-deep .reject .mat-radio-inner-circle,::ng-deep .reject .mat-radio-outer-circle,::ng-deep .resubmit .mat-radio-inner-circle,::ng-deep .resubmit .mat-radio-outer-circle,::ng-deep .rejectCreditRequest .mat-radio-inner-circle,::ng-deep .rejectCreditRequest .mat-radio-outer-circle{height:18px!important;width:18px!important}::ng-deep .margin-bottom-zero .mat-radio-label{margin-bottom:0}::ng-deep .reject.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:#ff0}::ng-deep .reject.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-inner-circle{background-color:#ff0}::ng-deep .resubmit.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:#ff0}::ng-deep .resubmit.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-inner-circle{background-color:#ff0}::ng-deep .noAction.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:green}::ng-deep .noAction.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-inner-circle{background-color:green}::ng-deep .approve.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:green}::ng-deep .approve.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-inner-circle{background-color:green}::ng-deep .credit.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:red}::ng-deep .credit.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-inner-circle{background-color:red}::ng-deep .mat-radio-button.mat-radio-disabled .mat-radio-outer-circle{border-color:#00000061!important}::ng-deep .mat-radio-button.mat-radio-disabled.mat-radio-checked .mat-radio-inner-circle{background-color:#00000061!important}::ng-deep tr.white-background-row{background:white}::ng-deep tr.gray-background-row{background:rgba(233,233,233,.5)}.remarks-tooltip,.seller-tooltip{font-size:.875rem;color:#268bff;position:relative;top:.1875rem;cursor:pointer}.seller-tooltip{float:right}::ng-deep .remarks-info-tooltip .tooltip-inner{max-width:19.25rem!important}.rating-icon,.lur-violation-icon{color:#268bff;cursor:pointer;margin-left:2px;position:relative;left:-2px}::ng-deep .rating-info-tooltip .tooltip-inner{max-width:800px!important}p.first-row{padding:.5rem .5rem 0;color:#000;white-space:nowrap;text-align:left}p.second-row{padding:2px .5rem .5rem;color:#000;white-space:nowrap;text-align:left}::ng-deep .gt-total-row-tooltip{opacity:1!important}::ng-deep .gt-total-row-tooltip .tooltip-inner{color:#000;box-shadow:0 6px 10px #0000004d,0 2px 2px #0003;background-color:#fff;padding:4px!important;width:100%;border-radius:2px!important}::ng-deep .gt-total-row-tooltip .arrow:before{border-top-color:#fff!important}.info-label{margin-left:4px;color:#268bff;vertical-align:text-top}::ng-deep .hierarchy-tooltip .tooltip-inner{padding:4px!important}table.seller-hierarchy-table{table-layout:fixed;margin:.625rem .625rem .625rem .8125rem}table.seller-hierarchy-table tr th{font-family:Roboto;font-size:.75rem;font-weight:500;font-stretch:normal;font-style:normal;line-height:1.67;letter-spacing:normal;color:#5e5e5e;white-space:nowrap;background:#ededed;box-shadow:none!important;border-top:1px solid #d4d4d4}table.seller-hierarchy-table tr th:first-of-type,table.seller-hierarchy-table tr td:first-of-type{border-left:1px solid #d4d4d4}table.seller-hierarchy-table tr th:last-of-type,table.seller-hierarchy-table tr td:last-of-type{border-right:1px solid #d4d4d4;width:7.875rem!important}table.seller-hierarchy-table tr th:nth-of-type(2){width:7.75rem!important}table.seller-hierarchy-table tr td{font-family:Roboto;font-size:.75rem;font-weight:400;font-stretch:normal;font-style:normal;line-height:normal;letter-spacing:normal;color:#4a4a4a;box-shadow:none!important;border-top:1px solid #d4d4d4;border-bottom:1px solid #d4d4d4}table.seller-hierarchy-table tr td:nth-of-type(2),table.seller-hierarchy-table tr td:nth-of-type(3){padding-top:.25rem}table.seller-hierarchy-table tr td span{display:inline-block;width:90%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;position:relative}\n"], components: [{ type: i2.AnnaTableVirtualScrollViewportComponent, selector: "anna-table-virtual-scroll-viewport", inputs: ["orientation"], outputs: ["scrolledIndexChange"] }, { type: i3.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { type: i3.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { type: i3.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { type: i4.NgxSkeletonLoaderComponent, selector: "ngx-skeleton-loader", inputs: ["appearance", "animation", "theme", "loadingText", "count", "ariaLabel"] }, { type: i5.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { type: i1.AnnaPayForPerformanceIconTemplateComponent, selector: "anna-pay-for-performance-icon-template", inputs: ["color", "width", "height"] }, { type: i1.AnnaLiveIconTemplateComponent, selector: "anna-live-icon-template" }, { type: i1.AnnaRejectedIconTemplateComponent, selector: "anna-rejected-icon-template" }, { type: i1.AnnaNotifyIconTemplateComponent, selector: "anna-notify-icon-template" }, { type: i1.AnnaBuyerApprovalIconTemplateComponent, selector: "anna-buyer-approval-icon-template" }, { type: i1.AnnaNoDataComponent, selector: "anna-core-no-data-lib", inputs: ["width", "marginTop"] }, { type: i6.AnnaSortComponent, selector: "anna-core-sort-lib", inputs: ["sortObjectKey"], outputs: ["sortOptionClicked"] }, { type: i7.ɵa, selector: "ngx-slider", inputs: ["value", "highValue", "options", "manualRefresh", "triggerFocus"], outputs: ["valueChange", "highValueChange", "userChangeStart", "userChange", "userChangeEnd"] }, { type: i8.AnnaCalendarFilterComponent, selector: "anna-core-calendar-filter-lib", inputs: ["maxDate", "label", "minDate", "selectedFromDate", "selectedToDate"], outputs: ["selectedDate", "apply", "cancel"] }, { type: i8.AnnaWeekCalendarComponent, selector: "anna-core-week-calendar-filter-lib", inputs: ["from-date", "to-date", "disabled-dates", "maxDate", "minDate", "week-calendar-config"], outputs: ["apply", "toggle-calendar"] }, { type: i9.MatButtonToggle, selector: "mat-button-toggle", inputs: ["disableRipple", "aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "appearance", "checked", "disabled"], outputs: ["change"], exportAs: ["matButtonToggle"] }], directives: [{ type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i11.AnnaFixedRowSizeTableVirtualScrollStrategyDirective, selector: "cdk-virtual-scroll-viewport[rowHeight], anna-table-virtual-scroll-viewport[rowHeight]", inputs: ["rowHeight", "headerRowHeight", "buffer", "headerRows"] }, { type: i10.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i12.AnnaVirtualTableDirective, selector: "[mat-table][appVirtualDataSource], mat-table[appVirtualDataSource]", inputs: ["appVirtualDataSource"] }, { type: i3.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { type: i3.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { type: i3.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i13.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { type: i3.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { type: i3.MatCellDef, selector: "[matCellDef]" }, { type: i3.MatCell, selector: "mat-cell, td[mat-cell]" }, { type: i10.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i10.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i5.MatRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { type: i14.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i14.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i10.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i14.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i14.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i9.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }] });
1486
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AnnaNonEditableGenericTableComponent, decorators: [{
1487
+ type: Component,
1488
+ args: [{ selector: 'anna-core-non-editable-generic-table-lib', template: "<div class=\"table-container\" [ngClass]=\"{ 'scroll-left-shadow-effect': isScrolledLeft }\">\r\n <anna-table-virtual-scroll-viewport\r\n [buffer]=\"gtGeneralConfig.bufferSize\"\r\n [rowHeight]=\"gtDimension.rowHeight\"\r\n [class]=\"gtGeneralConfig.tableContainerName\"\r\n [ngStyle]=\"{\r\n height:\r\n tableData.length < maximumRowsWhichCanBeRenderedWithoutScroll\r\n ? 'calc(' +\r\n ((gtDimension.rowHeight + rowBorderWidth) * tableData.length +\r\n (!tableData.length || !gtGeneralConfig.totalRow\r\n ? gtDimension.headerHeight\r\n : gtDimension.headerHeight + gtDimension.rowHeight + (2 * rowBorderWidth))) +\r\n 'px)'\r\n : gtDimension.tableHeight\r\n }\"\r\n >\r\n <table class=\"gt\" [ngClass]=\"tableClass\" mat-table [appVirtualDataSource]=\"tableData\">\r\n <tr\r\n class=\"header-row\"\r\n mat-header-row\r\n *matHeaderRowDef=\"tableColumns; sticky: true\"\r\n [style.height.px]=\"gtDimension.headerHeight\"\r\n ></tr>\r\n <tr\r\n class=\"total-row\"\r\n mat-header-row\r\n [style.height.px]=\"gtDimension.rowHeight\"\r\n *matHeaderRowDef=\"totalRowColumns; sticky: true\"\r\n [class.hidden]=\"\r\n showSkeletonLoading ||\r\n (!showSkeletonLoading && !tableData.length ) ||\r\n (showNoDataToDisplay) || \r\n (!showSkeletonLoading && !gtGeneralConfig.totalRow)\r\n \"\r\n ></tr>\r\n <tr\r\n [class]=\"rowData.gtClass\"\r\n [ngClass]=\"{'no-border-tr': showNoDataToDisplay}\"\r\n mat-row\r\n *matRowDef=\"let rowData; columns: tableColumns\"\r\n [style.height.px]=\"gtDimension.rowHeight\"\r\n [style.background-color]=\"rowData.backgroundColor\"\r\n [style.border]=\"rowData.border\" (click)=\"dataRowClicked(rowData)\"\r\n ></tr>\r\n\r\n <!-- TOTAL ROW -->\r\n <ng-container [matColumnDef]=\"column.colName\" *ngFor=\"let column of totalRowInfo; trackBy: trackByFn\">\r\n <td mat-header-cell *matHeaderCellDef [attr.colspan]=\"column.colspan\" class=\"{{column.class}}\">\r\n <strong>{{ column.data }}</strong>\r\n <ng-container *ngIf=\"column.lowerData\">\r\n <br>\r\n <span>{{column.lowerData}}</span>\r\n </ng-container>\r\n <ng-container *ngIf=\"column.tooltipMessage\">\r\n <i class=\"mi mdi-info-outline info-label\" container=\"body\"\r\n [ngbTooltip]=\"column.tooltipMessage\"\r\n tooltipClass=\"gt-total-row-tooltip\" placement=\"bottom\"></i>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- MAIN ROW -->\r\n <ng-container [matColumnDef]=\"columnDef.headerInfo[0].objectKey\" *ngFor=\"let columnDef of tableHeaders; trackBy: trackByFn\">\r\n <th #tableHeader nowrap mat-header-cell *matHeaderCellDef [style.width]=\"columnDef.width\">\r\n <div class=\"row mx-0\" *ngFor=\"let header of columnDef.headerInfo; let j = index;\"> \r\n <p\r\n *ngIf=\"header.typeOfHeaderData === 'STRING'\"\r\n [ngClass]=\"{ 'upper-label': j === 0, 'lower-label': j === 1 }\"\r\n >\r\n {{ header.name }}\r\n <i *ngIf=\"header.tooltip && header.tooltip.name == 'impsInfoTooltip'\" class=\"{{header['tooltip'].iconClass}}\"\r\n [ngStyle]=\"{'float': header['tooltip'].iconPosition}\"\r\n #t=\"ngbTooltip\"\r\n [ngbTooltip]=\"impsInfoTooltip\"\r\n placement=\"{{ header['tooltip'].tooltipPosition }}\"\r\n tooltipClass=\"{{ header['tooltip'].tooltipClass }}\"\r\n >\r\n </i>\r\n <i *ngIf=\"header.tooltip && header.tooltip.name == 'ratingInfoTooltip'\" class=\"{{header['tooltip'].iconClass}}\"\r\n [ngStyle]=\"{'float': header['tooltip'].iconPosition}\"\r\n #t=\"ngbTooltip\"\r\n [ngbTooltip]=\"ratingInfoTooltip\"\r\n placement=\"{{ header['tooltip'].tooltipPosition }}\"\r\n tooltipClass=\"{{ header['tooltip'].tooltipClass }}\"\r\n >\r\n </i>\r\n <i *ngIf=\"header.tooltip && header.tooltip.name == 'rateInfoTooltip'\" class=\"{{header['tooltip'].iconClass}}\"\r\n [ngStyle]=\"{'float': header['tooltip'].iconPosition}\"\r\n #t=\"ngbTooltip\"\r\n [ngbTooltip]=\"rateInfoTooltip\"\r\n placement=\"{{ header['tooltip'].tooltipPosition }}\"\r\n tooltipClass=\"{{ header['tooltip'].tooltipClass }}\"\r\n >\r\n </i>\r\n </p>\r\n\r\n <ng-container *ngIf=\"header.typeOfHeaderData === 'CHECKBOX'\">\r\n <span\r\n *ngIf=\"gtGeneralConfig.isHeaderChecked\"\r\n class=\"material-icons custom-column-checkbox-checked\"\r\n (click)=\"selectUnselectAllRows()\"\r\n >\r\n check_box\r\n </span>\r\n <span\r\n *ngIf=\"!gtGeneralConfig.isHeaderChecked\"\r\n class=\"material-icons custom-column-checkbox-unchecked\"\r\n [ngClass]=\"{ 'disable-checkbox': gtGeneralConfig.disableHeaderCheckbox }\"\r\n (click)=\"selectUnselectAllRows()\"\r\n >\r\n check_box_outline_blank\r\n </span>\r\n </ng-container>\r\n\r\n <div *ngIf=\"gtGeneralConfig.showAllColumnFilter\" class=\"sort-filter-container\">\r\n <ng-container *ngIf=\"header.showTooltipIcon\">\r\n <ng-container *ngIf=\"header.filter === 'CHECKBOX'\">\r\n <span\r\n class=\"mdi mdi-filter-variant\"\r\n [ngClass]=\"{\r\n active: isTooltipActive(header.filterSortObjectKeys), \r\n disabled: header.disableTooltipIcon && !isTooltipActive(header.filterSortObjectKeys)\r\n }\"\r\n [ngbTooltip]=\"filterTooltip\"\r\n placement=\"bottom left-top auto\"\r\n container=\"body\"\r\n tooltipClass=\"non-edit-checkbox-tooltip\"\r\n [autoClose]=\"'outside'\"\r\n triggers=\"manual\"\r\n #t=\"ngbTooltip\"\r\n (click)=\"bindTheValueToToolTip(t, header)\"\r\n (hidden)=\"closeTooltip()\"\r\n >\r\n </span\r\n ><br />\r\n </ng-container>\r\n <ng-container *ngIf=\"header.filter === 'SLIDER'\">\r\n <span\r\n class=\"mdi mdi-filter-variant\"\r\n [ngClass]=\"{\r\n active: isTooltipActive(header.filterSortObjectKeys),\r\n disabled: header.disableTooltipIcon && !isTooltipActive(header.filterSortObjectKeys)\r\n }\"\r\n [ngbTooltip]=\"sliderToolTip\"\r\n placement=\"bottom left-top\"\r\n container=\"body\"\r\n tooltipClass=\"non-edit-slider-tooltip\"\r\n [autoClose]=\"'outside'\"\r\n triggers=\"manual\"\r\n #t1=\"ngbTooltip\"\r\n (click)=\"bindTheValueToToolTip(t1, header)\"\r\n (hidden)=\"closeTooltip()\"\r\n >\r\n </span\r\n ><br />\r\n </ng-container>\r\n <ng-container *ngIf=\"header.filter === 'DATE'\">\r\n <span\r\n class=\"mdi mdi-filter-variant\"\r\n [ngClass]=\"{\r\n active: isTooltipActive(header.filterSortObjectKeys),\r\n disabled: header.disableTooltipIcon && !isTooltipActive(header.filterSortObjectKeys)\r\n }\"\r\n [ngbTooltip]=\"datePickerTooltip\"\r\n placement=\"bottom auto\"\r\n container=\"body\"\r\n tooltipClass=\"non-edit-datepicker-tooltip\"\r\n [autoClose]=\"'outside'\"\r\n triggers=\"manual\"\r\n #t2=\"ngbTooltip\"\r\n (click)=\"bindTheValueToToolTip(t2, header)\"\r\n (hidden)=\"closeTooltip()\"\r\n >\r\n </span\r\n ><br />\r\n </ng-container>\r\n <ng-container *ngIf=\"header.filter === 'WEEK'\">\r\n <span\r\n class=\"mdi mdi-filter-variant\"\r\n [ngClass]=\"{\r\n active: isTooltipActive(header.filterSortObjectKeys),\r\n disabled: header.disableTooltipIcon && !isTooltipActive(header.filterSortObjectKeys)\r\n }\"\r\n [ngbTooltip]=\"weekPickerToolTip\"\r\n placement=\"bottom left-top\"\r\n container=\"body\"\r\n [autoClose]=\"'outside'\"\r\n triggers=\"manual\"\r\n #t3=\"ngbTooltip\"\r\n (click)=\"bindTheValueToToolTip(t3, header)\"\r\n (hidden)=\"closeTooltip()\"\r\n >\r\n </span\r\n ><br />\r\n </ng-container>\r\n <ng-container *ngIf=\"header.filter === 'TIME'\">\r\n <span\r\n class=\"mdi mdi-filter-variant\"\r\n [ngClass]=\"{\r\n active: isTooltipActive(header.filterSortObjectKeys),\r\n disabled: header.disableTooltipIcon && !isTooltipActive(header.filterSortObjectKeys)\r\n }\"\r\n [ngbTooltip]=\"timeFilterToolTip\"\r\n placement=\"bottom left-top\"\r\n container=\"body\"\r\n tooltipClass=\"non-edit-time-tooltip\"\r\n [autoClose]=\"'outside'\"\r\n triggers=\"manual\"\r\n #t4=\"ngbTooltip\"\r\n (click)=\"bindTheValueToToolTip(t4, header)\"\r\n (hidden)=\"closeTooltip()\"\r\n >\r\n </span\r\n ><br />\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!header.showTooltipIcon\">\r\n <span id=\"no-filter-space\"></span><br />\r\n </ng-container>\r\n <i *ngIf=\"header.tooltip && header.tooltip.name == 'lurViolationInfoTooltip'\" class=\"{{header['tooltip'].iconClass}}\"\r\n [ngStyle]=\"{'float': header['tooltip'].iconPosition}\"\r\n #t=\"ngbTooltip\"\r\n [ngbTooltip]=\"lurViolationInfoTooltip\"\r\n placement=\"{{ header['tooltip'].tooltipPosition }}\"\r\n tooltipClass=\"{{ header['tooltip'].tooltipClass }}\"\r\n >\r\n </i>\r\n\r\n </div>\r\n </div>\r\n </th>\r\n\r\n <ng-container *ngIf=\"gtGeneralConfig.component == 'DRR'\">\r\n <ng-container *matCellDef=\"let ROW_DATA\">\r\n <ng-container *ngIf=\"showSkeletonLoading\">\r\n <td mat-cell>\r\n <ngx-skeleton-loader count=\"1\" [theme]=\"{ height: '10px', display: 'block' }\">\r\n </ngx-skeleton-loader>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!showSkeletonLoading\">\r\n <ng-container\r\n *ngFor=\"let subline of columnDef.headerInfo; let sublineIndex = index; trackBy: trackByFn\"\r\n >\r\n <td\r\n mat-cell\r\n *ngIf=\"!ROW_DATA['hide' + subline.objectKey + 'Td']\"\r\n [attr.rowspan]=\"ROW_DATA[subline.objectKey + 'Rowspan']\"\r\n >\r\n <ng-container [ngSwitch]=\"subline.typeOfBodyData\">\r\n <ng-container *ngSwitchCase=\"'ICON'\">\r\n <i [class]=\"ROW_DATA.iconClass\"></i>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'CHECKBOX'\">\r\n <span\r\n *ngIf=\"ROW_DATA[subline.objectKey]\"\r\n [ngClass]=\"{ 'disable-checkbox': ROW_DATA[subline.isDisabledKey] }\"\r\n class=\"material-icons custom-column-checkbox-checked\"\r\n (click)=\"selectUnselectRow(ROW_DATA)\"\r\n >\r\n check_box\r\n </span>\r\n <span\r\n *ngIf=\"!ROW_DATA[subline.objectKey]\"\r\n class=\"material-icons custom-column-checkbox-unchecked\"\r\n [ngClass]=\"{ 'disable-checkbox': ROW_DATA[subline.isDisabledKey] }\"\r\n (click)=\"selectUnselectRow(ROW_DATA)\"\r\n >\r\n check_box_outline_blank\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'RADIO'\">\r\n <mat-radio-group\r\n *ngIf=\"ROW_DATA['RadioButtonConfig']\"\r\n [ngModel]=\"ROW_DATA[subline.objectKey]\"\r\n [disabled]=\"ROW_DATA['RadioButtonConfig'][0].isDisabled\"\r\n >\r\n <ng-container\r\n *ngFor=\"let radioButton of ROW_DATA['RadioButtonConfig']; let last = last\"\r\n >\r\n <mat-radio-button\r\n value=\"{{ radioButton.value }}\"\r\n class=\"{{ radioButton.class }}\"\r\n (click)=\"\r\n radioButtonClicked(\r\n ROW_DATA,\r\n radioButton.value,\r\n ROW_DATA['RadioButtonConfig'][0].isDisabled\r\n )\r\n \"\r\n >{{ radioButton.label }}</mat-radio-button\r\n ><br *ngIf=\"!last\" />\r\n </ng-container>\r\n </mat-radio-group>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n {{ ROW_DATA[subline.objectKey] }}\r\n\r\n <ng-container\r\n *ngIf=\"\r\n subline.objectKey == 'Status' && (ROW_DATA['Remarks'] !== null)\r\n \"\r\n >\r\n <i\r\n class=\"mi mdi-info-outline remarks-tooltip\"\r\n [ngbTooltip]=\"columnInfoTooltip\"\r\n placement=\"bottom\"\r\n container=\"body\"\r\n tooltipClass=\"remarks-info-tooltip\"\r\n #t=\"ngbTooltip\"\r\n ></i>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"gtGeneralConfig.component != 'DRR'\">\r\n <td mat-cell *matCellDef=\"let ROW_DATA\" [style.background]=\"ROW_DATA.backgroundColor\">\r\n <ngx-skeleton-loader *ngIf=\"showSkeletonLoading\" count=\"1\" [theme]=\"{ height: '10px', display: 'block' }\">\r\n </ngx-skeleton-loader>\r\n\r\n <ng-container *ngIf=\"!showSkeletonLoading\">\r\n <ng-container *ngIf=\"tableData.length > 0 && !showNoDataToDisplay\">\r\n <div *ngFor=\"let subline of columnDef.headerInfo; let subLineIndex = index; trackBy: trackByFn\">\r\n <ng-container [ngSwitch]=\"columnDef.headerInfo[subLineIndex].typeOfBodyData\">\r\n <ng-container *ngSwitchCase=\"'ICON'\">\r\n <i [class]=\"ROW_DATA.iconClass\" (click)=\"iconClicked(ROW_DATA,ROW_DATA.iconClass)\"></i>\r\n </ng-container>\r\n \r\n <ng-container *ngSwitchCase=\"'SVG_ICON'\">\r\n <ng-container *ngIf=\"gtGeneralConfig.component == 'ORDER_LISTING_INFLIGHT'\">\r\n <span\r\n *ngIf=\"ROW_DATA.payForPerformance && subline.objectKey == 'payForPerformance'\"\r\n class=\"cursor-not-allowed\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <anna-pay-for-performance-icon-template\r\n [color]=\"PfpIconActiveColor\"\r\n [width]=\"'15px'\"\r\n [height]=\"'15px'\"\r\n >\r\n </anna-pay-for-performance-icon-template>\r\n </span>\r\n <span\r\n *ngIf=\"ROW_DATA.orderStatus != 'LIVE' && !ROW_DATA.payForPerformance && subline.objectKey == 'payForPerformance'\"\r\n (click)=\"svgIconClicked(ROW_DATA,'payForPerformance')\"\r\n >\r\n <anna-pay-for-performance-icon-template\r\n [color]=\"PfpIconDisableColor\"\r\n [width]=\"'15px'\"\r\n [height]=\"'15px'\"\r\n >\r\n </anna-pay-for-performance-icon-template>\r\n </span>\r\n \r\n <anna-live-icon-template *ngIf=\"ROW_DATA.orderStatus == 'LIVE' && subline.objectKey == 'orderStatus' \"></anna-live-icon-template>\r\n </ng-container>\r\n <ng-container *ngIf=\"gtGeneralConfig.component == 'ORDER_LISTING_COMPLETED'\">\r\n <span *ngIf=\"ROW_DATA.payForPerformance && subline.objectKey == 'payForPerformance'\" (click)=\"$event.stopPropagation()\">\r\n <anna-pay-for-performance-icon-template\r\n [color]=\"PfpIconActiveColor\"\r\n [width]=\"'20px'\"\r\n [height]=\"'20px'\"\r\n >\r\n </anna-pay-for-performance-icon-template>\r\n </span>\r\n </ng-container>\r\n <ng-container *ngIf=\"subline.objectKey == 'bizRuleStatus'\">\r\n <anna-rejected-icon-template *ngIf=\"ROW_DATA.bizRuleStatus == 'REJECTED'\"></anna-rejected-icon-template>\r\n <anna-notify-icon-template *ngIf=\"ROW_DATA.bizRuleStatus == 'NOTIFY'\"></anna-notify-icon-template>\r\n <anna-buyer-approval-icon-template *ngIf=\"ROW_DATA.bizRuleStatus == 'AWAITING_APPROVAL'\"></anna-buyer-approval-icon-template>\r\n </ng-container>\r\n </ng-container>\r\n \r\n <ng-container *ngSwitchCase=\"'TEXT_ACTIONS'\">\r\n <button *ngFor=\"let text of ROW_DATA.textActions\" (click)=\"textActionClicked(ROW_DATA,text.id)\" [disabled]=\"text.isDisabled\" class=\"{{text.class}}\">{{text.name}}</button>\r\n </ng-container>\r\n \r\n <ng-container *ngSwitchCase=\"'CHECKBOX'\">\r\n <span\r\n *ngIf=\"ROW_DATA[columnDef.headerInfo[subLineIndex].objectKey]\"\r\n [ngClass]=\"{\r\n 'disable-checkbox': ROW_DATA[columnDef.headerInfo[subLineIndex].isDisabledKey]\r\n }\"\r\n class=\"material-icons custom-column-checkbox-checked\"\r\n (click)=\"\r\n selectOrUnselectCheckbox(\r\n ROW_DATA,\r\n columnDef.headerInfo[subLineIndex].objectKey,\r\n false\r\n )\r\n \"\r\n >\r\n check_box\r\n </span>\r\n <span\r\n *ngIf=\"!ROW_DATA[columnDef.headerInfo[subLineIndex].objectKey]\"\r\n class=\"material-icons custom-column-checkbox-unchecked\"\r\n [ngClass]=\"{\r\n 'disable-checkbox': ROW_DATA[columnDef.headerInfo[subLineIndex].isDisabledKey]\r\n }\"\r\n (click)=\"\r\n selectOrUnselectCheckbox(\r\n ROW_DATA,\r\n columnDef.headerInfo[subLineIndex].objectKey,\r\n true\r\n )\r\n \"\r\n >\r\n check_box_outline_blank\r\n </span>\r\n </ng-container>\r\n \r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngIf=\"subline.objectKey != 'description'\">\r\n <span>{{ ROW_DATA[columnDef.headerInfo[subLineIndex].objectKey] }}</span>\r\n <i\r\n *ngIf=\"subline.objectKey == 'inventoryCode' && ROW_DATA['isSellerGroup'] && gtGeneralConfig.component == 'RATING' \"\r\n class=\"mdi mdi-alert-circle-outline seller-tooltip\"\r\n [ngbTooltip]=\"sellerHierarchyTooltip\"\r\n placement=\"bottom auto\"\r\n container=\"body\"\r\n [autoClose]=\"true\"\r\n triggers=\"manual\"\r\n (hidden)=\"closeTooltip()\"\r\n #info=\"ngbTooltip\"\r\n tooltipClass=\"hierarchy-tooltip\"\r\n (mouseenter)=\"bindTheValueToSellerGroupTooltip(ROW_DATA.sellerGroupHierarchy, info)\">\r\n </i>\r\n </ng-container>\r\n <ng-container *ngIf=\"subline.objectKey == 'description'\">\r\n <p *ngIf=\"ROW_DATA.descriptionMessage || ROW_DATA.descriptionEmailReferenceNum\">\r\n <ng-container *ngIf=\"ROW_DATA.descriptionMessage\">\r\n {{ ROW_DATA.descriptionMessage }}\r\n <br />\r\n </ng-container>\r\n <ng-container *ngIf=\"ROW_DATA.descriptionEmailReferenceNum\">\r\n Email Ref: {{ ROW_DATA.descriptionEmailReferenceNum }}\r\n <br />\r\n </ng-container>\r\n </p>\r\n <a\r\n href=\"{{ ROW_DATA.descriptionDetailsUrl }}\"\r\n target=\"_blank\"\r\n *ngIf=\"ROW_DATA.descriptionDetailsUrlType === 'PDF' || ROW_DATA.descriptionDetailsUrlType === 'EXCEL'\"\r\n >\r\n <button class=\"btn viewDetailsAndEmailBtn\">Download</button>\r\n </a>\r\n <ng-container *ngIf=\"ROW_DATA.activityname.toLowerCase() == 'order onboarded'\">\r\n <a *ngIf=\"ROW_DATA.descriptionDetailsUrlType === 'LINK'\" (click)=\"viewDetailsClicked(ROW_DATA)\">\r\n <button class=\"btn viewDetailsAndEmailBtn\">View details</button>\r\n </a>\r\n </ng-container>\r\n \r\n <a href=\"{{ ROW_DATA.descriptionEmailUrl }}\" target=\"_blank\" *ngIf=\"ROW_DATA.descriptionEmailUrl\">\r\n <button class=\"btn viewDetailsAndEmailBtn\">View email</button>\r\n </a>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n \r\n <ng-container\r\n *ngIf=\"\r\n gtGeneralConfig.page === 'SpotDetails' &&\r\n columnDef.headerInfo[subLineIndex].objectKey === 'Status'\r\n \"\r\n >\r\n <img\r\n src=\"assets/images/Undo-Credit-Icon.svg\"\r\n style=\"cursor: pointer\"\r\n class=\"img-circle\"\r\n alt=\"User Image\"\r\n height=\"15px\"\r\n width=\"15px\"\r\n *ngIf=\"ROW_DATA.AllowUserToUndoMarkForCredit\"\r\n (click)=\"undoCreditedSpot(ROW_DATA)\"\r\n />\r\n <img\r\n src=\"assets/images/Undo-MG-Icon.svg\"\r\n style=\"cursor: pointer\"\r\n class=\"img-circle\"\r\n alt=\"User Image\"\r\n height=\"15px\"\r\n width=\"15px\"\r\n *ngIf=\"ROW_DATA.AllowUserToUndoMarkForMakeGood\"\r\n (click)=\"undoMgSpot(ROW_DATA)\"\r\n />\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"showNoDataToDisplay\">\r\n <div>\r\n {{null}}\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n </table>\r\n </anna-table-virtual-scroll-viewport>\r\n <anna-core-no-data-lib [width]=\"noDataWidth\" [marginTop]=\"marginTop\" *ngIf=\"!showSkeletonLoading && showNoDataToDisplay\"> </anna-core-no-data-lib>\r\n</div>\r\n\r\n<!-- Checkbox template -->\r\n<ng-template #filterTooltip>\r\n \r\n <div class=\"radio-container\" *ngIf=\"showCheckboxFilterRadioButtons\">\r\n <div *ngFor=\"let data of radioButtons\">\r\n <p class=\"filter-tab\" (click)=\"populateTooltipDataBasedOnSelectedRadio(data)\" [ngClass]=\"{'active': annaFilterService.selectedRadio == data.key}\" *ngIf=\"radioButtons.length > 0\">{{ data.label }}</p>\r\n </div>\r\n </div>\r\n \r\n <div class=\"checkbox-sort\" *ngIf=\"showSortComponent\">\r\n <anna-core-sort-lib (sortOptionClicked)=\"storeSortTypeInTempVariable($event)\" [sortObjectKey]=\"annaFilterService.selectedRadio\"></anna-core-sort-lib>\r\n </div>\r\n \r\n <ng-container *ngIf=\"showFilterComponent\">\r\n <p class=\"d-flex justify-content-between\">\r\n <button class=\"filter-text-btn\" [disabled]=\"disableClearAll\" (click)=\"unCheckAllCheckbox()\">Clear All</button>\r\n <button class=\"filter-text-btn\" [disabled]=\"disableSelectAll\" (click)=\"selectAllCheckbox()\">Select All</button>\r\n </p>\r\n <p class=\"search-box\">\r\n <i class=\"mi mdi-search search-icon search-icon-position\"></i>\r\n <input\r\n type=\"text\"\r\n placeholder=\"Search\"\r\n class=\"search-input\"\r\n style=\"margin-left: 2px; border: none; padding: 0px\"\r\n [(ngModel)]=\"searchItem\"\r\n (ngModelChange)=\"searchForTheItem($event)\"\r\n />\r\n <i class=\"mdi mdi-close search-bar-close\" [ngClass]=\"{'disable-close-icon': (!searchItem || searchItem.length == 0) }\"\r\n (click)=\"clearSearchedItem()\"></i>\r\n\r\n </p>\r\n <div class=\"dropdown-data-container\">\r\n <ng-container *ngFor=\"let option of tooltipOptions\">\r\n <p class=\"input\" (click)=\"selectUnselectCheckbox(option)\">\r\n <span *ngIf=\"option.isSelected\" role=\"button\" class=\"mi mdi-check-box check-box\"></span>\r\n <span *ngIf=\"!option.isSelected\" role=\"button\" class=\"mi mdi-check-box-outline-blank check-box unchecked\"></span>\r\n <span class=\"data\" title=\"{{ option.data }}\" [innerHTML]=\"option.data\"></span>\r\n </p>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"buttons-container\">\r\n <button class=\"button\" (click)=\"closeCheckboxFilter()\">Cancel</button>\r\n <button\r\n class=\"button\"\r\n [ngClass]=\"{ disabled: disableCheckboxApply }\"\r\n (click)=\"applyFilters()\"\r\n [disabled]=\"disableCheckboxApply\"\r\n >\r\n Apply\r\n </button>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Slider template -->\r\n<ng-template #sliderToolTip>\r\n \r\n <div class=\"radio-container\" *ngIf=\"showCheckboxFilterRadioButtons\">\r\n <div *ngFor=\"let data of radioButtons\">\r\n <p class=\"filter-tab\" (click)=\"populateTooltipDataBasedOnSelectedRadio(data)\" [ngClass]=\"{'active': annaFilterService.selectedRadio == data.key}\" *ngIf=\"radioButtons.length > 0\">{{ data.label }}</p> \r\n </div>\r\n </div>\r\n <!-- <button class=\"column-clear-all align-center\" [disabled]=\"disableColumnClearAllBtn\" (click)=\"clearColumnFilter()\">\r\n Clear filter\r\n </button> -->\r\n \r\n <anna-core-sort-lib *ngIf=\"showSortComponent\" (sortOptionClicked)=\"storeSortTypeInTempVariable($event)\" [sortObjectKey]=\"annaFilterService.selectedRadio\"></anna-core-sort-lib>\r\n \r\n <ng-container *ngIf=\"showFilterComponent\">\r\n <button class=\"column-clear-all\" [disabled]=\"disableColumnClearAllBtn\" (click)=\"clearColumnFilter()\">Clear filter</button>\r\n <section class=\"min-maxContainer\">\r\n <input\r\n type=\"number\"\r\n class=\"slider-text\"\r\n step=\"{{ sliderFilterTextBoxStep }}\"\r\n [ngModel]=\"sliderMinValue\"\r\n (ngModelChange)=\"minValueChanged($event)\"\r\n [ngClass]=\"{'red-border': showSliderMinValueError}\"\r\n placeholder=\"Min\"\r\n />\r\n <span>To</span>\r\n <input\r\n type=\"number\"\r\n class=\"slider-text\"\r\n step=\"{{ sliderFilterTextBoxStep }}\"\r\n [ngModel]=\"sliderMaxValue\"\r\n (ngModelChange)=\"maxValueChanged($event)\"\r\n [ngClass]=\"{'red-border': showSliderMaxValueError}\"\r\n placeholder=\"Max\"\r\n />\r\n </section>\r\n <div class=\"sidebar-slider\">\r\n <ngx-slider\r\n class=\"filter-slider\"\r\n [value]=\"sliderMinValue\"\r\n [highValue]=\"sliderMaxValue\"\r\n [options]=\"options\"\r\n ></ngx-slider>\r\n </div>\r\n </ng-container>\r\n \r\n <div class=\"buttons-container\">\r\n <button class=\"button\" (click)=\"cancelSliderFilter()\">Cancel</button>\r\n <button\r\n class=\"button\"\r\n [ngClass]=\"{ disabled: disableSliderApplyButton }\"\r\n (click)=\"applySliderFilter()\"\r\n [disabled]=\"disableSliderApplyButton\"\r\n >\r\n Apply\r\n </button>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Date Picker Template -->\r\n<ng-template #datePickerTooltip>\r\n <div class=\"radio-container\" *ngIf=\"showCheckboxFilterRadioButtons\">\r\n <div *ngFor=\"let data of radioButtons\">\r\n <p class=\"filter-tab\" (click)=\"populateTooltipDataBasedOnSelectedRadio(data)\" [ngClass]=\"{'active': annaFilterService.selectedRadio == data.key}\" *ngIf=\"radioButtons.length > 0\">{{ data.label }}</p>\r\n </div>\r\n </div>\r\n\r\n <anna-core-sort-lib *ngIf=\"showSortComponent\" (sortOptionClicked)=\"storeSortTypeInTempVariable($event)\" [sortObjectKey]=\"annaFilterService.selectedRadio\"></anna-core-sort-lib>\r\n \r\n <ng-container *ngIf=\"showFilterComponent\">\r\n <div class=\"datepicker-container\">\r\n <button class=\"column-clear-all\" [disabled]=\"disableColumnClearAllBtn\" (click)=\"clearColumnFilter()\">\r\n Clear filter\r\n </button>\r\n <anna-core-calendar-filter-lib\r\n [minDate]=\"calendarMinEnabledDate\"\r\n [maxDate]=\"calendarMaxEnabledDate\"\r\n [selectedFromDate]=\"selectedMinDate\"\r\n [selectedToDate]=\"selectedMaxDate\"\r\n (selectedDate) = \"calendarDateChanged($event)\"\r\n [label]=\"selectedLabel\"\r\n >\r\n </anna-core-calendar-filter-lib>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"buttons-container\">\r\n <button class=\"button\" (click)=\"cancelInDateFilter()\">Cancel</button>\r\n <button class=\"button\" (click)=\"applyDateFilter()\" [disabled]=\"disableCalendarApplyBtn\">Apply</button>\r\n </div>\r\n \r\n</ng-template>\r\n\r\n<!-- Week Picker Template -->\r\n<ng-template #weekPickerToolTip>\r\n <div class=\"weekpicker-container\">\r\n <anna-core-week-calendar-filter-lib\r\n [week-calendar-config]=\"gtGeneralConfig.multiWeekPickerConfig\"\r\n (apply)=\"applyWeekFilter($event)\"\r\n [from-date]=\"calendarMinEnabledDate\"\r\n [to-date]=\"calendarMaxEnabledDate\"\r\n >\r\n </anna-core-week-calendar-filter-lib>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Time Filter Template -->\r\n<ng-template #timeFilterToolTip>\r\n \r\n <div class=\"radio-container\" *ngIf=\"showCheckboxFilterRadioButtons\">\r\n <div *ngFor=\"let data of radioButtons\">\r\n <p class=\"filter-tab\" (click)=\"populateTooltipDataBasedOnSelectedRadio(data)\" [ngClass]=\"{'active': annaFilterService.selectedRadio == data.key}\" *ngIf=\"radioButtons.length > 0\">{{ data.label }}</p>\r\n </div>\r\n </div>\r\n\r\n <anna-core-sort-lib *ngIf=\"showSortComponent\" (sortOptionClicked)=\"storeSortTypeInTempVariable($event)\" [sortObjectKey]=\"annaFilterService.selectedRadio\"></anna-core-sort-lib>\r\n \r\n <ng-container *ngIf=\"showFilterComponent\">\r\n <button class=\"column-clear-all\" [disabled]=\"disableColumnClearAllBtn\" (click)=\"clearColumnFilter()\">Clear filter</button>\r\n <div\r\n class=\"time-filter-checkboxes\"\r\n *ngIf=\"gtGeneralConfig.component == 'SPOTDETAILS' || gtGeneralConfig.component == 'EXCLUDEINVENTORYPOPUP' || gtGeneralConfig.component == 'RATING'\"\r\n >\r\n <!-- Multi time option checkbox -->\r\n <div class=\"d-flex align-items-center\" style=\"padding: 0.5rem 0 0.5rem 0.5rem\" *ngIf=\"showMultiTimeCheckbox\">\r\n <span\r\n *ngIf=\"multiTimeCheckboxChecked\"\r\n class=\"material-icons custom-column-checkbox-checked\"\r\n (click)=\"selectOrUnselectMultiTimeCheckbox()\"\r\n >\r\n check_box\r\n </span>\r\n <span\r\n *ngIf=\"!multiTimeCheckboxChecked\"\r\n class=\"material-icons custom-column-checkbox-unchecked\"\r\n (click)=\"selectOrUnselectMultiTimeCheckbox()\"\r\n >\r\n check_box_outline_blank\r\n </span>\r\n <p style=\"margin-left: 2px\">Include Multi</p>\r\n </div>\r\n <!-- Zero time option checkbox -->\r\n <div class=\"d-flex align-items-center\" style=\"padding: 0.5rem 0 0.5rem 0.5rem\" *ngIf=\"showZeroTimeCheckbox\">\r\n <span\r\n *ngIf=\"zeroTimeCheckboxChecked\"\r\n class=\"material-icons custom-column-checkbox-checked\"\r\n (click)=\"selectOrUnselectZeroTimeCheckbox()\"\r\n >\r\n check_box\r\n </span>\r\n <span\r\n *ngIf=\"!zeroTimeCheckboxChecked\"\r\n class=\"material-icons custom-column-checkbox-unchecked\"\r\n (click)=\"selectOrUnselectZeroTimeCheckbox()\"\r\n >\r\n check_box_outline_blank\r\n </span>\r\n <p style=\"margin-left: 2px\">Include Zero</p>\r\n </div>\r\n <!-- Enter time range option checkbox -->\r\n <div class=\"d-flex align-items-center\" style=\"padding: 0.5rem 0 0.5rem 0.5rem\" *ngIf=\"showEnterTimeCheckbox\">\r\n <span\r\n *ngIf=\"enterTimeCheckboxChecked\"\r\n class=\"material-icons custom-column-checkbox-checked\"\r\n (click)=\"selectOrUnselectEnterTimeCheckbox()\"\r\n >\r\n check_box\r\n </span>\r\n <span\r\n *ngIf=\"!enterTimeCheckboxChecked\"\r\n class=\"material-icons custom-column-checkbox-unchecked\"\r\n (click)=\"selectOrUnselectEnterTimeCheckbox()\"\r\n >\r\n check_box_outline_blank\r\n </span>\r\n <p style=\"margin-left: 2px\">Enter time range</p>\r\n </div>\r\n </div>\r\n <div class=\"time-label-container\">\r\n <label>From</label>\r\n </div>\r\n <div class=\"time-container\">\r\n <input class=\"form-control numberInput\" [ngClass]=\"{'error-border': startTimeHourErr}\" [(ngModel)]=\"selectedFromTime[0]\" type=\"text\" (ngModelChange)=\"startTimeHourChange($event)\" />\r\n <div class=\"arrow-container\">\r\n <i class=\"mdi mdi-triangle upward\" (click)=\"changeStartTimeHour(true)\"></i>\r\n <i class=\"mdi mdi-triangle downward\" (click)=\"changeStartTimeHour(false)\"></i>\r\n </div>\r\n <span class=\"dot\">:</span>\r\n <input class=\"form-control numberInput\" [ngClass]=\"{'error-border': startTimeMinErr}\" [(ngModel)]=\"selectedFromTime[1]\" type=\"text\" (ngModelChange)=\"startTimeMinChange($event)\"/>\r\n <div class=\"arrow-container\">\r\n <i class=\"mdi mdi-triangle upward\" (click)=\"changeStartTimeMinute(true)\"></i>\r\n <i class=\"mdi mdi-triangle downward\" (click)=\"changeStartTimeMinute(false)\"></i>\r\n </div>\r\n <div>\r\n <mat-button-toggle-group [(ngModel)]=\"selectedFromTime[2]\" (ngModelChange)=\"disableTimeFilterApplyButton()\">\r\n <mat-button-toggle value=\"AM\">\r\n <span>AM</span>\r\n </mat-button-toggle>\r\n <mat-button-toggle value=\"PM\">\r\n <span>PM</span>\r\n </mat-button-toggle>\r\n </mat-button-toggle-group>\r\n </div>\r\n </div>\r\n\r\n <div class=\"time-label-container\">\r\n <label>To</label>\r\n </div>\r\n <div class=\"time-container\">\r\n <input class=\"form-control numberInput\" [(ngModel)]=\"selectedToTime[0]\" [ngClass]=\"{'error-border': endTimeHourErr}\" (ngModelChange)=\"endTimeHourChange($event)\" type=\"text\" />\r\n <div class=\"arrow-container\">\r\n <i class=\"mdi mdi-triangle upward\" (click)=\"changeEndTimeHour(true)\"></i>\r\n <i class=\"mdi mdi-triangle downward\" (click)=\"changeEndTimeHour(false)\"></i>\r\n </div>\r\n <span class=\"dot\">:</span>\r\n <input class=\"form-control numberInput\" [ngClass]=\"{'error-border': endTimeMinErr}\" [(ngModel)]=\"selectedToTime[1]\" (ngModelChange)=\"endTimeMinChange($event)\" type=\"text\" />\r\n <div class=\"arrow-container\">\r\n <i class=\"mdi mdi-triangle upward\" (click)=\"changeEndTimeMinute(true)\"></i>\r\n <i class=\"mdi mdi-triangle downward\" (click)=\"changeEndTimeMinute(false)\"></i>\r\n </div>\r\n <div>\r\n <mat-button-toggle-group [(ngModel)]=\"selectedToTime[2]\" (ngModelChange)=\"disableTimeFilterApplyButton()\">\r\n <mat-button-toggle value=\"AM\">\r\n <span>AM</span>\r\n </mat-button-toggle>\r\n <mat-button-toggle value=\"PM\">\r\n <span>PM</span>\r\n </mat-button-toggle>\r\n </mat-button-toggle-group>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"buttons-container\">\r\n <button class=\"button\" (click)=\"closeTimeFilter()\">Cancel</button>\r\n <button\r\n class=\"button\"\r\n [ngClass]=\"{ disabled: disableTimeFilterApplyBtn }\"\r\n (click)=\"applyTimeFilters()\"\r\n [disabled]=\"disableTimeFilterApplyBtn\"\r\n >\r\n Apply\r\n </button>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #columnInfoTooltip>\r\n <p style=\"padding: 0.5rem; color: black;white-space: nowrap;\">This preemption is rejected and not marked for credit.</p>\r\n</ng-template>\r\n\r\n<ng-template #ratingInfoTooltip>\r\n <p class=\"first-row\">Shows 'Booked Rating' for Preemptions & MakeGood Offered spot(s).</p>\r\n <p class=\"second-row\">Shows 'Projected Rating' for ADU Offered spot(s).</p>\r\n</ng-template>\r\n\r\n<ng-template #impsInfoTooltip>\r\n <p class =\"first-row\" >Shows 'Booked IMPS' for Preemptions & MakeGood Offered spot(s).</p>\r\n <p class=\"second-row\" >Shows 'Projected IMPS' for ADU Offered spot(s).</p>\r\n</ng-template>\r\n\r\n<ng-template #rateInfoTooltip>\r\n <p class =\"first-row\" >Shows 'Booked Rate' for Preemptions & MakeGood Offered spot(s).</p>\r\n <p class=\"second-row\" >Shows 'Projected $ Value' for ADU Offered spot(s).</p>\r\n</ng-template>\r\n\r\n<ng-template #sellerHierarchyTooltip>\r\n <ng-container *ngIf=\"sellerGroupHierarchy.length > 0\">\r\n <table class=\"seller-hierarchy-table\">\r\n <thead>\r\n <tr>\r\n <th>#</th>\r\n <th>Inventory Codes</th>\r\n <th>Program/Description</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of sellerGroupHierarchy; let tooltipIndex = index\">\r\n <td>{{ tooltipIndex + 1 }}</td>\r\n <td>\r\n <span>{{ data.inventoryCode }}</span>\r\n </td>\r\n <td>\r\n <span>{{ data.program }}</span>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </ng-container>\r\n <ng-container *ngIf=\"sellerGroupHierarchy.length == 0\">\r\n <span style=\"color: #000\">Seller group not available for this inventory code</span>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #lurViolationInfoTooltip>\r\n <p class =\"first-row\" >The values are for the entire week.</p>\r\n</ng-template>", styles: [".sort-btn{background:white;border:none;border-right:1px solid #1b88ff;text-decoration:underline;font-family:Roboto;font-size:14px;font-weight:400;font-stretch:normal;font-style:normal;line-height:1.07;letter-spacing:normal;color:#1b88ff;cursor:pointer;flex:1;text-align:center}.sort-btn:last-of-type{border-right:none}.sort-btn.active{color:#202b47;text-decoration:none}p.sort-container{margin-top:8px;padding-bottom:8px;border-bottom:1px solid #e6e6e6;margin-bottom:0;display:flex}::ng-deep .tooltip-inner{max-height:22rem;background-color:#fff;border:1px solid white;border-radius:5px;box-shadow:0 2px 2px #0000003d,0 0 2px #0000001f;max-width:251px;width:100%;padding:0!important}::ng-deep .tooltip-inner div.radio-container{flex-wrap:wrap}::ng-deep .md-drppicker{box-shadow:unset!important}::ng-deep .available{color:#999}::ng-deep .bs-tooltip-bottom .arrow:before{border-bottom-color:#fff!important}::ng-deep .bs-tooltip-left .arrow:before{border-left-color:#fff!important}::ng-deep .tooltip.show{opacity:1}.input{text-align:left;margin:5px 10px 5px 5px;display:flex;align-items:center;width:98%;white-space:nowrap}.data{color:#000;font-weight:700;margin-left:5px;margin-right:5px}span.data{display:inline-block;text-overflow:ellipsis;white-space:nowrap;width:85%;overflow:hidden}.check-box{font-size:14px;cursor:pointer;position:relative;top:-1px}span.mdi-filter.active{color:#000;opacity:1!important;pointer-events:all!important}p{margin-bottom:0;line-height:initial}span.mdi-filter{color:#cbcbcb}::ng-deep .ngx-slider{margin:5px 0 2px!important;width:100%!important}::ng-deep span.ngx-slider-bubble.ngx-slider-model-value{display:block!important;padding:2px!important;box-shadow:#00000059 0 3px 8px!important;height:20px!important}::ng-deep .ngx-slider-pointer{top:-5px!important;width:12px!important;height:12px!important;background:#bdbdbd!important;border:1px solid #ffffff!important;box-shadow:0 1px 3px #0000004d!important;border-radius:16px!important}::ng-deep .ngx-slider-pointer:after{display:none!important}::ng-deep .ngx-slider-pointer:focus{outline:none!important}::ng-deep span.ngx-slider-bar{background:#ededed!important;height:3px!important}::ng-deep .filter-slider span.ngx-slider-bar.ngx-slider-selection{background:#bdbdbd!important;height:3px!important}::ng-deep .sidebar-slider{margin-bottom:35px!important;margin-left:.3125rem;margin-right:.3125rem}::ng-deep .ngx-slider-span.ngx-slider-bubble.ngx-slider-model-high{right:0!important}::ng-deep .ngx-slider-span.ngx-slider-bubble.ngx-slider-model-ceil{right:0!important}::ng-deep .ngx-slider.animate{top:10px!important;bottom:0!important;padding:1px 0!important;font-size:12px!important}::ng-deep .ngx-slider-bubble{top:10px!important;bottom:0!important;padding:1px 0!important;font-size:12px!important}::ng-deep .ngx-slider-bar{background:rgba(0,0,0,.26)!important;height:3px!important}::ng-deep .ngx-slider-bar.ngx-slider-selection{background:#42a5f5!important;height:3px!important}input:focus{outline:none}input::placeholder{color:#c8c8c8}.cancel-btn{background:#c7e1ff;color:#268bff}.apply-btn{background:#268bff;color:#fff;margin-left:.3125rem}div.radio-container{display:flex;white-space:nowrap;justify-content:space-between;background-color:#f4f4f4;border-radius:.125rem;margin:.4375rem .4375rem .25rem}div.radio-container div{flex:1}div.radio-container input{position:relative;top:.125rem;margin-right:.25rem}div.radio-container label{font-family:Roboto;font-size:.875rem;font-weight:400;font-stretch:normal;font-style:normal;line-height:1.29;letter-spacing:0;color:#4a4a4a;margin:0;padding-left:.125rem}div.radio-container label:first-of-type{margin-right:.188rem}div.radio-container input[type=radio]{-webkit-appearance:none;appearance:none;display:inline-block;width:.9375rem;height:.9375rem;padding:.125rem;background-clip:content-box;border:.125rem solid #268bff;background-color:transparent;border-radius:50%}div.radio-container input[type=radio]:checked{background-color:#268bff}.buttons-container{display:flex;margin:0px auto .4375rem;justify-content:center}.buttons-container button:last-of-type{background-color:#268bff;color:#fff}.buttons-container button.disabled{background:#bdbdbd;opacity:.5;color:#4a4a4a}.button{display:inline-block;margin:8px 4px 0 8px;padding:0 16px;border-radius:4px;text-align:center;outline:none;font-family:Roboto;font-size:.75rem;font-weight:400;font-stretch:normal;font-style:normal;line-height:1.67;letter-spacing:normal;border:none;color:#268bff;background-color:#e5f1ff}.search-box{display:flex;align-items:center;color:#c8c8c8;border:1px solid #e6e6e6;border-radius:.125rem;margin:.25rem .4375rem .188rem;height:1.5rem;padding:.188rem 0 .188rem .5rem}.search-icon{margin:0 4px 0 0;font-size:1.125rem;color:#9b9b9b}.filter-icon{justify-content:right;margin-left:auto;color:#d4d4d4;color:#a1a1a1;font-size:16px;cursor:pointer}.data{margin:0 13px 0 8px;font-family:Roboto;font-size:.875rem;font-weight:400;font-stretch:normal;font-style:normal;line-height:1.86;letter-spacing:\"\";color:#4a4a4a}.search-input{margin:1px 0 1px 4px;font-family:Roboto;font-size:.875rem;font-weight:400;font-stretch:normal;font-style:normal;line-height:normal;letter-spacing:normal;color:#c8c8c8}.check-box{color:#268bff}.tooltip-data-container{overflow-y:scroll;max-height:8rem}.searchbar{width:100%;display:flex;justify-content:flex-end;align-items:flex-end}.clear-button{opacity:.5;font-family:Roboto;font-size:.9375rem;font-weight:500;font-stretch:normal;font-style:normal;line-height:normal;letter-spacing:normal;text-decoration:underline;border:none;background-color:#fff;color:#4a4a4a;margin-left:.625rem;padding:0}.clear-button:focus{outline:none;box-shadow:none}.unchecked{color:#268bff}div.dropdown-data-container{max-height:12.3rem;width:100%;overflow-y:auto;overflow-x:hidden}div.dropdown-data-container p.input{margin-left:0}div.dropdown-data-container p.input span.mi{padding-left:.4375rem}div.dropdown-data-container p.input:hover{background-color:#ebebeb;cursor:pointer}div.dropdown-data-container::-webkit-scrollbar{width:.188rem}div.dropdown-data-container::-webkit-scrollbar-thumb{color:#d3d3d3}section.min-maxContainer{display:flex;justify-content:center;margin-bottom:-.125rem;margin-top:.5rem;width:100%}section.min-maxContainer input{width:30%;height:1.875rem;border:1px solid lightgray;color:gray}section.min-maxContainer span{display:inline-block;padding-left:.5rem;padding-right:.5rem;position:relative;top:.3125rem;color:#666}.time-container{width:100%;display:flex;padding:.125rem .625rem 0}.time-container input.form-control:disabled{background-color:#fff;width:2.813rem}.time-container .dot{color:#cbcbcb;position:relative;left:-7px;font-size:17px}.time-container div.arrow-container{flex-direction:column;display:flex;padding-top:.375rem;padding-left:1px;margin-right:1.1875rem}.time-container div.arrow-container i{color:#cbcbcb;cursor:pointer;font-size:.5625rem}.time-container div.arrow-container i.downward{transform:rotate(180deg)}.mdi-filter{cursor:pointer}.time-label-container{display:flex;justify-content:flex-start}.time-label-container label{margin-bottom:0;color:#4a4a4a;margin-top:.625rem;margin-left:.625rem;font-weight:700}.time-heading{color:#000;font-size:.8125rem;text-align:left;padding-left:.625rem;margin-top:.625rem;font-weight:700}.column-clear-all{width:94%;text-align:center;border:none;font-size:14px;background:none;text-decoration:underline;color:#268bff}.checkbox-container{display:flex;padding-inline:.625rem}.checkbox-container .data{text-align:left}.checkbox-container:first-of-type{margin-top:.625rem;font-weight:500}.column-clear-all{width:94%;text-align:center;border:none;background:none;text-decoration:underline;color:#268bff}.column-clear-all:disabled{opacity:.5;color:#4a4a4a}.column-clear-all.align-center{text-align:center}span.mdi-filter-variant.disabled{pointer-events:none;opacity:.5}.datepicker-container{width:100%}span.mdi-filter-variant{color:#cbcbcb;cursor:pointer;font-size:.875rem}span.mdi-filter-variant.active{color:#000}p.filter-tab{font-family:Roboto;font-size:14px;font-weight:400;font-stretch:normal;font-style:normal;line-height:1.29;letter-spacing:normal;color:#1b88ff;border-radius:5px;background-color:#f4f4f4;padding-inline:8px;cursor:pointer}p.filter-tab.active{color:#fff;background-color:#1b88ff}button.filter-text-btn{background:white;text-decoration:underline;font-family:Roboto;font-size:14px;font-weight:400;font-stretch:normal;font-style:normal;line-height:normal;letter-spacing:normal;border:none;color:#268bff;margin-inline:4px;margin-top:2px}button.filter-text-btn:disabled{color:#b1b1b1;cursor:not-allowed}::ng-deep .non-edit-datepicker-tooltip .tooltip-inner{max-width:310px!important;width:263px!important;overflow-y:initial!important}input.slider-text::-webkit-outer-spin-button,input.slider-text::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input.slider-text{-moz-appearance:textfield}input.slider-text.red-border{border:1px solid #f44336!important}::ng-deep .checkbox-sort p.sort-container{margin-top:8px!important;padding-bottom:8px!important}i.mdi-close{cursor:pointer}i.mdi-close.disable-close-icon{pointer-events:none;cursor:not-allowed}input.error-border{border:1px solid #f44336!important}::ng-deep .non-edit-checkbox-tooltip .tooltip-inner{width:238px!important}::ng-deep .non-edit-slider-tooltip .tooltip-inner{width:238px!important}::ng-deep .non-edit-time-tooltip .tooltip-inner{width:219px!important}.upper-label{font-family:Roboto;font-size:.6875rem;font-weight:500;font-stretch:normal;font-style:normal;line-height:normal;letter-spacing:.3px;color:#4a4a4a!important;margin-bottom:0!important}:host ::ng-deep .gt{table-layout:fixed;margin-bottom:0;width:100%}:host ::ng-deep .gt th,:host ::ng-deep .gt td{padding:2px 8px;line-height:normal}:host ::ng-deep .gt thead tr th .upper-label{font-family:Roboto;font-size:.6875rem;font-weight:500;font-stretch:normal;font-style:normal;line-height:normal;letter-spacing:.3px;color:#4a4a4a;margin-bottom:0}:host ::ng-deep .gt thead tr th .lower-label{font-family:Roboto;font-size:.6875rem;font-weight:500;font-stretch:normal;font-style:normal;line-height:normal;letter-spacing:.3px;color:#a7a7a7;margin-bottom:0}:host ::ng-deep .gt thead tr th{background-color:#ededed;position:sticky;top:0;border-top:none!important;border-bottom:none!important;outline:none!important;box-shadow:inset 0 1px #d4d4d4,inset 0 -1px #d4d4d4,inset -1px 0 #d4d4d4}:host ::ng-deep .gt thead tr th br{display:block;content:\"\";margin-top:-8px}:host ::ng-deep .gt thead tr th div.row{display:flex;flex-wrap:nowrap;justify-content:space-between;align-items:center}:host ::ng-deep .gt thead tr th div.sort-filter-container{display:flex;flex-wrap:nowrap;align-items:center}:host ::ng-deep .gt thead tr th:first-of-type{box-shadow:inset 0 1px #d4d4d4,inset 0 -1px #d4d4d4,inset -1px 0 #d4d4d4,inset 1px 0 #d4d4d4}:host ::ng-deep .gt tbody tr td:first-of-type{box-shadow:inset 1px 0 #d4d4d4,inset -1px 0 #d4d4d4,inset 0 -1px #d4d4d4;border:none}:host ::ng-deep .gt tbody tr td:nth-of-type(n + 2){box-shadow:inset -1px 0 #d4d4d4,inset 0 -1px #d4d4d4;border:none}:host ::ng-deep .gt tbody tr td .upper-label{font-family:Roboto;font-size:.75rem;font-weight:400;font-stretch:normal;font-style:normal;line-height:normal;letter-spacing:0px;color:#000;display:inline-block;width:90%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}:host ::ng-deep .gt tbody tr td .lower-label{font-family:Roboto;font-size:.75rem;font-weight:400;font-stretch:normal;font-style:normal;line-height:normal;letter-spacing:0px;color:#a7a7a7;display:inline-block;width:90%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}:host ::ng-deep .gt tbody tr br{display:block;content:\"\";margin-top:-8px}:host ::ng-deep .gt tbody tr:nth-of-type(1) td{border-top:none!important}:host ::ng-deep .gt .custom-column-checkbox-checked,:host ::ng-deep .gt .custom-column-checkbox-unchecked{font-size:.875rem;cursor:pointer}:host ::ng-deep .gt .custom-column-checkbox-checked{color:#268bff}:host ::ng-deep .gt .custom-column-checkbox-unchecked{color:#4a4a4a}anna-table-virtual-scroll-viewport::-webkit-scrollbar-track{border:1px solid rgba(0,0,0,.1)!important}anna-table-virtual-scroll-viewport::-webkit-scrollbar{width:5px;height:5px}anna-table-virtual-scroll-viewport::-webkit-scrollbar-thumb{border-radius:4px;background-color:#0006!important;border:1px solid rgba(0,0,0,.2)}.table-container{overflow-x:auto;overflow-y:auto}.rowSelectCheckbox,#selectAllRowsCheckbox{cursor:pointer}.disable-checkbox{color:#dedede!important;pointer-events:none!important}.mdi-warning{color:#f3c639;font-size:16px;line-height:28px}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{opacity:1}.redcolor-status{color:#c62a2a}.redcolor-cell-border{outline:1px solid #ff5353!important;outline-offset:-1px!important}#no-filter-space{width:.875rem}::ng-deep .mat-button-toggle-appearance-standard .mat-button-toggle-label-content{line-height:1.875rem!important;width:2.625rem;padding:0 .625rem}input.numberInput{margin-right:-.8125rem;padding:0 0 0 .625rem;height:1.875rem}::ng-deep .mat-button-toggle-checked{background-color:#268bff!important;color:#fff!important}::ng-deep .mat-button-toggle-group-appearance-standard{border-radius:0}.hidden{display:none}.no-data-div{margin-top:2.5px}.no-data-div label{margin:0;width:auto;font-weight:500;background-color:#d3d3d3;padding:.3125rem 1.125rem;border-radius:.25rem}.column-values:nth-of-type(2){color:#a7a7a7!important}.custom-column-checkbox-checked,.custom-column-checkbox-unchecked{font-size:.875rem;cursor:pointer}.custom-column-checkbox-checked{color:#268bff}.custom-column-checkbox-unchecked{color:#4a4a4a}.time-filter-checkboxes>div>p{color:#151b1e}.radio-button-dimension,::ng-deep .markForCredit .mat-radio-inner-circle,::ng-deep .markForCredit .mat-radio-outer-circle,::ng-deep .mark-for-credit .mat-radio-inner-circle,::ng-deep .mark-for-credit .mat-radio-outer-circle,::ng-deep .markForMakeGood .mat-radio-inner-circle,::ng-deep .markForMakeGood .mat-radio-outer-circle,::ng-deep .noAction .mat-radio-inner-circle,::ng-deep .noAction .mat-radio-outer-circle,::ng-deep .credit .mat-radio-inner-circle,::ng-deep .credit .mat-radio-outer-circle,::ng-deep .approve .mat-radio-inner-circle,::ng-deep .approve .mat-radio-outer-circle,::ng-deep .reject .mat-radio-inner-circle,::ng-deep .reject .mat-radio-outer-circle,::ng-deep .resubmit .mat-radio-inner-circle,::ng-deep .resubmit .mat-radio-outer-circle,::ng-deep .rejectCreditRequest .mat-radio-inner-circle,::ng-deep .rejectCreditRequest .mat-radio-outer-circle{height:18px!important;width:18px!important}::ng-deep .margin-bottom-zero .mat-radio-label{margin-bottom:0}::ng-deep .reject.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:#ff0}::ng-deep .reject.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-inner-circle{background-color:#ff0}::ng-deep .resubmit.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:#ff0}::ng-deep .resubmit.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-inner-circle{background-color:#ff0}::ng-deep .noAction.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:green}::ng-deep .noAction.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-inner-circle{background-color:green}::ng-deep .approve.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:green}::ng-deep .approve.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-inner-circle{background-color:green}::ng-deep .credit.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:red}::ng-deep .credit.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-inner-circle{background-color:red}::ng-deep .mat-radio-button.mat-radio-disabled .mat-radio-outer-circle{border-color:#00000061!important}::ng-deep .mat-radio-button.mat-radio-disabled.mat-radio-checked .mat-radio-inner-circle{background-color:#00000061!important}::ng-deep tr.white-background-row{background:white}::ng-deep tr.gray-background-row{background:rgba(233,233,233,.5)}.remarks-tooltip,.seller-tooltip{font-size:.875rem;color:#268bff;position:relative;top:.1875rem;cursor:pointer}.seller-tooltip{float:right}::ng-deep .remarks-info-tooltip .tooltip-inner{max-width:19.25rem!important}.rating-icon,.lur-violation-icon{color:#268bff;cursor:pointer;margin-left:2px;position:relative;left:-2px}::ng-deep .rating-info-tooltip .tooltip-inner{max-width:800px!important}p.first-row{padding:.5rem .5rem 0;color:#000;white-space:nowrap;text-align:left}p.second-row{padding:2px .5rem .5rem;color:#000;white-space:nowrap;text-align:left}::ng-deep .gt-total-row-tooltip{opacity:1!important}::ng-deep .gt-total-row-tooltip .tooltip-inner{color:#000;box-shadow:0 6px 10px #0000004d,0 2px 2px #0003;background-color:#fff;padding:4px!important;width:100%;border-radius:2px!important}::ng-deep .gt-total-row-tooltip .arrow:before{border-top-color:#fff!important}.info-label{margin-left:4px;color:#268bff;vertical-align:text-top}::ng-deep .hierarchy-tooltip .tooltip-inner{padding:4px!important}table.seller-hierarchy-table{table-layout:fixed;margin:.625rem .625rem .625rem .8125rem}table.seller-hierarchy-table tr th{font-family:Roboto;font-size:.75rem;font-weight:500;font-stretch:normal;font-style:normal;line-height:1.67;letter-spacing:normal;color:#5e5e5e;white-space:nowrap;background:#ededed;box-shadow:none!important;border-top:1px solid #d4d4d4}table.seller-hierarchy-table tr th:first-of-type,table.seller-hierarchy-table tr td:first-of-type{border-left:1px solid #d4d4d4}table.seller-hierarchy-table tr th:last-of-type,table.seller-hierarchy-table tr td:last-of-type{border-right:1px solid #d4d4d4;width:7.875rem!important}table.seller-hierarchy-table tr th:nth-of-type(2){width:7.75rem!important}table.seller-hierarchy-table tr td{font-family:Roboto;font-size:.75rem;font-weight:400;font-stretch:normal;font-style:normal;line-height:normal;letter-spacing:normal;color:#4a4a4a;box-shadow:none!important;border-top:1px solid #d4d4d4;border-bottom:1px solid #d4d4d4}table.seller-hierarchy-table tr td:nth-of-type(2),table.seller-hierarchy-table tr td:nth-of-type(3){padding-top:.25rem}table.seller-hierarchy-table tr td span{display:inline-block;width:90%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;position:relative}\n"] }]
1489
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.AnnaSortService }, { type: i1.AnnaDateTimeFormatService }, { type: i1.AnnaFilterService }, { type: i1.AnnaGenericTableService }]; }, propDecorators: { showSkeletonLoading: [{
1490
+ type: Input
1491
+ }], tableHeaders: [{
1492
+ type: Input
1493
+ }], tableData: [{
1494
+ type: Input
1495
+ }], clonedTableData: [{
1496
+ type: Input
1497
+ }], numberOfSkeletonRows: [{
1498
+ type: Input
1499
+ }], numberOfSkeletonColumns: [{
1500
+ type: Input
1501
+ }], gtGeneralConfig: [{
1502
+ type: Input
1503
+ }], totalRowInfo: [{
1504
+ type: Input
1505
+ }], gtDimension: [{
1506
+ type: Input
1507
+ }], tableClass: [{
1508
+ type: Input
1509
+ }], maximumRowsWhichCanBeRenderedWithoutScroll: [{
1510
+ type: Input
1511
+ }], toggleCheckbox: [{
1512
+ type: Output
1513
+ }], toggleRowCheckbox: [{
1514
+ type: Output
1515
+ }], toggleHeaderCheckbox: [{
1516
+ type: Output
1517
+ }], undoIconClicked: [{
1518
+ type: Output
1519
+ }], filterAppliedToTable: [{
1520
+ type: Output
1521
+ }], sortingAppliedToTable: [{
1522
+ type: Output
1523
+ }], rowClicked: [{
1524
+ type: Output
1525
+ }], radioButtonSelected: [{
1526
+ type: Output
1527
+ }], columnFilterOpened: [{
1528
+ type: Output
1529
+ }], columnFilterClosed: [{
1530
+ type: Output
1531
+ }], gtIconClicked: [{
1532
+ type: Output
1533
+ }], gtSVGIconClicked: [{
1534
+ type: Output
1535
+ }], gtTextActionClicked: [{
1536
+ type: Output
1537
+ }], gtViewDetailClicked: [{
1538
+ type: Output
1539
+ }], sortComponent: [{
1540
+ type: ViewChildren,
1541
+ args: [AnnaSortComponent]
1542
+ }], viewChildTableHeaders: [{
1543
+ type: ViewChildren,
1544
+ args: ['tableHeader']
1545
+ }] } });
1546
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5uYS1ub24tZWRpdGFibGUtZ2VuZXJpYy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbm5hLWNvcmUvc3JjL2xpYi9hbm5hLWdlbmVyaWMtdGFibGUtbGliL2NvbXBvbmVudHMvYW5uYS1ub24tZWRpdGFibGUtZ2VuZXJpYy10YWJsZS9hbm5hLW5vbi1lZGl0YWJsZS1nZW5lcmljLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FubmEtY29yZS9zcmMvbGliL2FubmEtZ2VuZXJpYy10YWJsZS1saWIvY29tcG9uZW50cy9hbm5hLW5vbi1lZGl0YWJsZS1nZW5lcmljLXRhYmxlL2FubmEtbm9uLWVkaXRhYmxlLWdlbmVyaWMtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsNEJBQTRCO0FBQzVCLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBNEIsaUJBQWlCLEVBQStDLE1BQU0sZUFBZSxDQUFDO0FBRWxNLGdDQUFnQztBQUNoQyxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFHNUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFbEUsaUNBQWlDO0FBQ2pDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRXJFLDBDQUEwQztBQUMxQyxPQUFPLEVBQXFDLFlBQVksRUFBQyxlQUFlLEVBQUMseUJBQXlCLEVBQWUsaUJBQWlCLEVBQW1ELHVCQUF1QixFQUF5QixnQkFBZ0IsRUFBRSxNQUFPLGlEQUFpRCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FBUWhULE1BQU0sT0FBTyxvQ0FBb0M7SUFr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c0JBQXRCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBbUUwQixhQUFhO3NCQUE3QyxZQUFZO3VCQUFDLGlCQUFpQjtnQkFpQ0YscUJBQXFCO3NCQUFqRCxZQUFZO3VCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuLy8gQW5ndWxhciBpbXBvcnQgc3RhdGVtZW50c1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIFZpZXdDaGlsZHJlbiwgUXVlcnlMaXN0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgU2ltcGxlQ2hhbmdlcywgT25DaGFuZ2VzLCBDaGFuZ2VEZXRlY3RvclJlZiwgQWZ0ZXJWaWV3SW5pdCwgRWxlbWVudFJlZiwgQWZ0ZXJWaWV3Q2hlY2tlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuLy8gVGhpcmQgcGFydHkgaW1wb3J0IHN0YXRlbWVudHNcclxuaW1wb3J0IG1vbWVudCBmcm9tIFwibW9tZW50XCI7XHJcbmltcG9ydCB7IE5nYkRhdGUgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XHJcbmltcG9ydCB7IE9wdGlvbnMgfSBmcm9tICdAYW5ndWxhci1zbGlkZXIvbmd4LXNsaWRlcic7XHJcbmltcG9ydCB7IGNsb25lRGVlcCwgaXNFcXVhbCwgbWFwLCB1bmlxLCBzb3J0QnkgfSBmcm9tIFwibG9kYXNoLWVzXCI7XHJcblxyXG4vLyBVc2VyIGRlZmluZWQgaW1wb3J0IHN0YXRlbWVudHNcclxuaW1wb3J0IHsgQW5uYVNvcnRDb21wb25lbnQgfSBmcm9tICcuLi9hbm5hLXNvcnQvYW5uYS1zb3J0LmNvbXBvbmVudCc7XHJcblxyXG4vL3N1Yi1lbnRyaWVzIG9mIGFubmEgbGliIGltcG9ydCBzdGF0ZW1lbnRcclxuaW1wb3J0IHsgU2VsbGVyR3JvdXBIaWVyYXJjaHksSVdlZWtDYWxlbmRhcixUb29sdGlwTW9kZWwsQW5uYVNvcnRTZXJ2aWNlLEFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2UsIE5nYkRhdGVUeXBlLCBBbm5hRmlsdGVyU2VydmljZSwgSUd0R2VuZXJhbENvbmZpZywgSUd0VGFibGVIZWFkZXIsIElUb3RhbFJvd0luZm8sIEFubmFHZW5lcmljVGFibGVTZXJ2aWNlLCBTb3J0VHlwZSwgSUhlYWRlckluZm8sIHJhZGlvQnV0dG9uTW9kZWwgfSBmcm9tICBcIkBhbm5hbGliL2FubmEtY29yZS9zcmMvbGliL2FubmEtY29yZS1zaGFyZWQtbGliXCI7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhbm5hLWNvcmUtbm9uLWVkaXRhYmxlLWdlbmVyaWMtdGFibGUtbGliJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYW5uYS1ub24tZWRpdGFibGUtZ2VuZXJpYy10YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vYW5uYS1ub24tZWRpdGFibGUtZ2VuZXJpYy10YWJsZS5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5uYU5vbkVkaXRhYmxlR2VuZXJpY1RhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0NoZWNrZWQge1xyXG5cclxuICBASW5wdXQoKSBzaG93U2tlbGV0b25Mb2FkaW5nOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIHRhYmxlSGVhZGVyczogSUd0VGFibGVIZWFkZXJbXTtcclxuICBASW5wdXQoKSB0YWJsZURhdGE6IGFueVtdO1xyXG4gIEBJbnB1dCgpIGNsb25lZFRhYmxlRGF0YTogYW55W107XHJcbiAgQElucHV0KCkgbnVtYmVyT2ZTa2VsZXRvblJvd3M6IG51bWJlcltdOyAvL3RoaXMgaXMgbm90IGJlaW5nIHVzZWQuXHJcbiAgQElucHV0KCkgbnVtYmVyT2ZTa2VsZXRvbkNvbHVtbnM6IG51bWJlcltdW107XHJcbiAgQElucHV0KCkgZ3RHZW5lcmFsQ29uZmlnOiBJR3RHZW5lcmFsQ29uZmlnO1xyXG4gIEBJbnB1dCgpIHRvdGFsUm93SW5mbz86IElUb3RhbFJvd0luZm9bXTtcclxuICBASW5wdXQoKSBndERpbWVuc2lvbjogeyByb3dIZWlnaHQ6IG51bWJlciwgdGFibGVIZWlnaHQ6IHN0cmluZywgaGVhZGVySGVpZ2h0OiBudW1iZXIgfTtcclxuICBASW5wdXQoKSB0YWJsZUNsYXNzOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgbWF4aW11bVJvd3NXaGljaENhbkJlUmVuZGVyZWRXaXRob3V0U2Nyb2xsOiBudW1iZXIgPSA1O1xyXG5cclxuICBAT3V0cHV0KCkgdG9nZ2xlQ2hlY2tib3ggPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIHRvZ2dsZVJvd0NoZWNrYm94ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSB0b2dnbGVIZWFkZXJDaGVja2JveCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgdW5kb0ljb25DbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBmaWx0ZXJBcHBsaWVkVG9UYWJsZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgc29ydGluZ0FwcGxpZWRUb1RhYmxlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSByb3dDbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSByYWRpb0J1dHRvblNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBjb2x1bW5GaWx0ZXJPcGVuZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIGNvbHVtbkZpbHRlckNsb3NlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgZ3RJY29uQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgZ3RTVkdJY29uQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgZ3RUZXh0QWN0aW9uQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgZ3RWaWV3RGV0YWlsQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcblxyXG4gIHRhYmxlRGF0YVdyYXBwZXI6IGFueVtdO1xyXG4gIHJvd0NoZWNrZWQ6IGJvb2xlYW47XHJcbiAgaXNBbGxSb3dzQ2hlY2tlZDogYm9vbGVhbjtcclxuICBub0RhdGFXaWR0aDogc3RyaW5nID0gXCI1NSVcIjtcclxuICBtYXJrZWRGb3JDcmVkaXRTdGF0dXM6IHN0cmluZztcclxuICBtYXJrZWRGb3JNR1N0YXR1czogc3RyaW5nO1xyXG5cclxuICAvL1NvcnQgYW5kIEZpbHRlclxyXG4gIHRvb2xUaXBkYXRhOiBhbnk7XHJcbiAgdGVtcFRvb2x0aXBEYXRhOiBhbnk7XHJcbiAgdG9vbHRpcFJhZGlvVGV4dE1hcDogTWFwPGFueSwgYW55PjtcclxuICByYWRpb0J1dHRvbnM6IGFueVtdO1xyXG4gIHRvb2x0aXA6IGFueTtcclxuICBjbG9uZWRUb29sdGlwRGF0YTogYW55O1xyXG4gIGNsb25lZFRvb2x0aXBTZWxlY3RlZE1hcERhdGE6IGFueTtcclxuICBzZWFyY2hCYXI6IHN0cmluZztcclxuICBkaXNhYmxlQ2xlYXJBbGxCdG46IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGRpc2FibGVDb2x1bW5DbGVhckFsbEJ0bjogYm9vbGVhbiA9IHRydWU7XHJcbiAgYWxsU2VsZWN0ZWQgPSAwO1xyXG4gIHNob3dBbGw6IGJvb2xlYW47XHJcbiAgZGlzYWJsZUNoZWNrYm94QXBwbHk6IGJvb2xlYW47XHJcbiAgZGlzYWJsZVNsaWRlckFwcGx5QnV0dG9uOiBib29sZWFuO1xyXG4gIGRpc2FibGVUaW1lQXBwbHlCdXR0b246IGJvb2xlYW47XHJcblxyXG4gIC8vIFNsaWRlciBGaWx0ZXJcclxuICBzbGlkZXJNaW5WYWx1ZTogbnVtYmVyO1xyXG4gIHNsaWRlck1heFZhbHVlOiBudW1iZXI7XHJcbiAgb3B0aW9uczogT3B0aW9ucyA9IHtcclxuICAgIGZsb29yOiAwLFxyXG4gICAgY2VpbDogMCxcclxuICAgIHN0ZXA6IDAuMVxyXG4gIH07XHJcbiAgc2xpZGVyVmFsdWU6IHsgbWluOiBudW1iZXIsIG1heDogbnVtYmVyIH07XHJcbiAgc2xpZGVyRmlsdGVyVGV4dEJveFN0ZXA6IHN0cmluZztcclxuXHJcbiAgLy8gQ2FsZW5kYXIgRmlsdGVyXHJcbiAgY2FsZW5kYXJNaW5FbmFibGVkRGF0ZTogTmdiRGF0ZVR5cGU7XHJcbiAgY2FsZW5kYXJNYXhFbmFibGVkRGF0ZTogTmdiRGF0ZVR5cGU7XHJcbiAgc2VsZWN0ZWRNaW5EYXRlOiBOZ2JEYXRlVHlwZTtcclxuICBzZWxlY3RlZE1heERhdGU6IE5nYkRhdGVUeXBlO1xyXG5cclxuICAvL1dlZWsgRmlsdGVyXHJcbiAgbXVsdGlXZWVrUGlja2VyQ29uZmlnOiBJV2Vla0NhbGVuZGFyO1xyXG5cclxuICAvL1RpbWUgRmlsdGVyXHJcbiAgc2VsZWN0ZWRGcm9tVGltZTogYW55W107XHJcbiAgc2VsZWN0ZWRUb1RpbWU6IGFueVtdO1xyXG4gIGNsb25lZFNlbGVjdGVkRnJvbVRpbWU6IGFueTtcclxuICBjbG9uZWRTZWxlY3RlZFRvVGltZTogYW55O1xyXG4gIGRpc2FibGVUaW1lRmlsdGVyQXBwbHlCdG46IGJvb2xlYW47XHJcbiAgdGFibGVDb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xyXG4gIHRvdGFsUm93Q29sdW1uczogc3RyaW5nW10gPSBudWxsO1xyXG4gIHNob3dNdWx0aVRpbWVDaGVja2JveDogYm9vbGVhbjtcclxuICBzaG93WmVyb1RpbWVDaGVja2JveDogYm9vbGVhbjtcclxuICBzaG93RW50ZXJUaW1lQ2hlY2tib3g6IGJvb2xlYW47XHJcbiAgbXVsdGlUaW1lQ2hlY2tib3hDaGVja2VkOiBib29sZWFuO1xyXG4gIHplcm9UaW1lQ2hlY2tib3hDaGVja2VkOiBib29sZWFuO1xyXG4gIGVudGVyVGltZUNoZWNrYm94Q2hlY2tlZDogYm9vbGVhbjtcclxuICBiaW5kVmFsdWVGdW5jQ2FsbGVkOiBib29sZWFuO1xyXG5cclxuICBoaWVyYXJjaHlUb29sdGlwOiB7IG9wZW46ICgpID0+IHZvaWQ7IGNsb3NlOiAoKSA9PiB2b2lkOyB9O1xyXG4gIHNlbGxlckdyb3VwSGllcmFyY2h5OiBTZWxsZXJHcm91cEhpZXJhcmNoeVtdO1xyXG4gIHNob3dDaGVja2JveEZpbHRlclJhZGlvQnV0dG9uczogYm9vbGVhbjtcclxuXHJcbiAgQFZpZXdDaGlsZHJlbihBbm5hU29ydENvbXBvbmVudCkgc29ydENvbXBvbmVudDogUXVlcnlMaXN0PEFubmFTb3J0Q29tcG9uZW50PjtcclxuICBpc1Njcm9sbGVkTGVmdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHJvd0JvcmRlcldpZHRoOiBudW1iZXIgPSAyO1xyXG4gIFBmcEljb25BY3RpdmVDb2xvciA9IFwiIzlCMUI5M1wiXHJcbiAgUGZwSWNvbkRpc2FibGVDb2xvciA9IFwicmdiYSgxODksMTg5LDE4OSwwLjUpXCI7XHJcblxyXG4gIHNob3dTb3J0Q29tcG9uZW50OiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2hvd0ZpbHRlckNvbXBvbmVudDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHRlbXBTb3J0T3JkZXI6IFNvcnRUeXBlID0gbnVsbDtcclxuICAgIFxyXG4gIHRvb2x0aXBPcHRpb25zOiBUb29sdGlwTW9kZWxbXTtcclxuICBjbG9uZWRUb29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW107XHJcbiAgZGlzYWJsZVNlbGVjdEFsbDogYm9vbGVhbjtcclxuICBkaXNhYmxlQ2xlYXJBbGw6IGJvb2xlYW47XHJcbiAgc2VhcmNoSXRlbTogc3RyaW5nO1xyXG5cclxuICBkaXNhYmxlQ2FsZW5kYXJBcHBseUJ0bjogYm9vbGVhbjtcclxuICBjYWxlbmRhclNlbGVjdGlvbjogYW55ID0ge2Zyb21EYXRlOiBudWxsICwgdG9EYXRlOiBudWxsfTtcclxuXHJcbiAgc2hvd1NsaWRlck1pblZhbHVlRXJyb3I6IGJvb2xlYW47XHJcbiAgc2hvd1NsaWRlck1heFZhbHVlRXJyb3I6IGJvb2xlYW47XHJcbiAgaXNNaW5UZXh0Qm94RW1wdHk6IGJvb2xlYW47XHJcbiAgaXNNYXhUZXh0Qm94RW1wdHk6IGJvb2xlYW47XHJcbiAgc2VsZWN0ZWRMYWJlbDogc3RyaW5nO1xyXG5cclxuICBzdGFydFRpbWVIb3VyRXJyOiBib29sZWFuO1xyXG4gIHN0YXJ0VGltZU1pbkVycjogYm9vbGVhbjtcclxuICBlbmRUaW1lSG91ckVycjogYm9vbGVhbjtcclxuICBlbmRUaW1lTWluRXJyOiBib29sZWFuO1xyXG5cclxuICBzYW1lVG9vbHRpcENsaWNrZWQ6IGJvb2xlYW47XHJcbiAgc2hvd05vRGF0YVRvRGlzcGxheTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG1hcmdpblRvcDogc3RyaW5nID0gXCJcIjtcclxuICBAVmlld0NoaWxkcmVuKCd0YWJsZUhlYWRlcicpIHZpZXdDaGlsZFRhYmxlSGVhZGVyczogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xyXG5cclxuICAgIFxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIGFubmFTb3J0U2VydmljZTogQW5uYVNvcnRTZXJ2aWNlLFxyXG4gICAgcHVibGljIGFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2U6IEFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2UsXHJcbiAgICBwdWJsaWMgYW5uYUZpbHRlclNlcnZpY2U6IEFubmFGaWx0ZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhbm5hR2VuZXJpY1RhYmxlU2VydmljZTogQW5uYUdlbmVyaWNUYWJsZVNlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMuc2V0VG9vbHRpcFJhZGlvTmFtZXMoKTtcclxuICB9XHJcbiAgXHJcbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xyXG4gICAgaWYodGhpcy5ndEdlbmVyYWxDb25maWcuY29tcG9uZW50LmluY2x1ZGVzKFwiT1JERVJfTElTVElOR1wiKSB8fCB0aGlzLmd0R2VuZXJhbENvbmZpZy5jb21wb25lbnQgPT0gXCJEUlJMSVNUSU5HXCIpe1xyXG4gICAgICB0aGlzLnNldE1hcmdpbkxlZnRGb3JGaWx0ZXJJY29uKCk7XHJcbiAgICB9ICAgIFxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICAvLyB0aGlzLnRhYmxlRGF0YSA9IHRoaXMubnVtYmVyT2ZTa2VsZXRvbkNvbHVtbnM7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhcImdlbmVyaWNcIik7XHJcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnRhYmxlSGVhZGVycyk7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh0aGlzLnRhYmxlRGF0YSkpO1xyXG4gICAgaWYgKHRoaXMuc2hvd1NrZWxldG9uTG9hZGluZykge1xyXG4gICAgICB0aGlzLnRhYmxlRGF0YSA9IHRoaXMubnVtYmVyT2ZTa2VsZXRvbkNvbHVtbnM7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiaW5pdGFsVmFsdWVNYXAgc2V0XCIpO1xyXG4gICAgICB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLmluaXRpYWxWYWx1ZU1hcCA9IG5ldyBNYXAoKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIm5nIG9uIGNoYW5nZSBlbHNlIGNvbmRpdGlvblwiKTtcclxuICAgICAgLy8gdGhpcy5zZXRJbml0aWFsVmFsdWVNYXBEYXRhKCk7XHJcbiAgICAgIHRoaXMuZGlzYWJsZUVuYWJsZUVhY2hDb2x1bW5Ub29sdGlwSWNvbigpO1xyXG4gICAgICB0aGlzLnRhYmxlQ29sdW1ucyA9IHRoaXMudGFibGVIZWFkZXJzLmZpbHRlcih4ID0+IHgudmlzaWJsZSkubWFwKHggPT4geC5oZWFkZXJJbmZvWzBdLm9iamVjdEtleSk7XHJcbiAgICAgIGlmKHRoaXMudGFibGVEYXRhICYmIHRoaXMudGFibGVEYXRhLmxlbmd0aCA9PSAwKXtcclxuICAgICAgICB0aGlzLnRhYmxlRGF0YSA9IEFycmF5KDIpLmZpbGwoMCk7XHJcbiAgICAgICAgdGhpcy5tYXJnaW5Ub3AgPSAoLSB0aGlzLmd0RGltZW5zaW9uLnJvd0hlaWdodCAtICh0aGlzLmd0RGltZW5zaW9uLnJvd0hlaWdodC8yKSkgKyAncHgnO1xyXG4gICAgICAgIC8vIGlmKHRoaXMuZ3RHZW5lcmFsQ29uZmlnLmNvbXBvbmVudC5pbmNsdWRlcyhcIk9SREVSX0xJU1RJTkdcIikpe1xyXG4gICAgICAgIC8vICAgdGhpcy5tYXJnaW5Ub3AgPSBcIi0xMjRweFwiO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICB0aGlzLnNob3dOb0RhdGFUb0Rpc3BsYXkgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2V7XHJcbiAgICAgICAgdGhpcy5zaG93Tm9EYXRhVG9EaXNwbGF5ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuc2hvd1NrZWxldG9uTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vc2V0dGluZyB0YWJsZSBjb2x1bW4gaGVyZSBhcyB3ZWxsIGJlY2F1c2Ugd2hpbGUgc2hvd2luZyBza2VsZXRvbiBsb2FkZXIsIHdlIHNob3VsZCBzaG93IHRhYmxlIGhlYWRlcnMuXHJcbiAgICBpZiAoY2hhbmdlc1sndGFibGVIZWFkZXJzJ10gJiYgY2hhbmdlc1sndGFibGVIZWFkZXJzJ10uY3VycmVudFZhbHVlKSB7XHJcbiAgICAgIHRoaXMudGFibGVDb2x1bW5zID0gdGhpcy50YWJsZUhlYWRlcnMuZmlsdGVyKHggPT4geC52aXNpYmxlKS5tYXAoeCA9PiB4LmhlYWRlckluZm9bMF0ub2JqZWN0S2V5KTtcclxuICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlID0gbmV3IE1hcCgpO1xyXG4gICAgICB0aGlzLnNldENvbHVtblNvcnRTdGF0ZU1hcCgpOyAgIFxyXG4gICAgfVxyXG5cclxuICAgIGlmIChjaGFuZ2VzWyd0b3RhbFJvd0luZm8nXSAmJiBjaGFuZ2VzWyd0b3RhbFJvd0luZm8nXS5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgdGhpcy50b3RhbFJvd0NvbHVtbnMgPSB0aGlzLnRvdGFsUm93SW5mby5tYXAoeCA9PiB4LmNvbE5hbWUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgdHJhY2tCeUZuKGluZGV4OiBudW1iZXIpIHtcclxuICAgIHJldHVybiBpbmRleDtcclxuICB9XHJcblxyXG4gIHNldFRvb2x0aXBSYWRpb05hbWVzKCkge1xyXG4gICAgdGhpcy50b29sdGlwUmFkaW9UZXh0TWFwID0gbmV3IE1hcCgpO1xyXG4gICAgdGhpcy50b29sdGlwUmFkaW9UZXh0TWFwLnNldChcIlN0YXJ0VGltZUZvckZpbHRlclwiLCBcIlN0YXJ0IFRpbWVcIik7XHJcbiAgICB0aGlzLnRvb2x0aXBSYWRpb1RleHRNYXAuc2V0KFwiRW5kVGltZUZvckZpbHRlclwiLCBcIkVuZCBUaW1lXCIpO1xyXG4gICAgdGhpcy50b29sdGlwUmFkaW9UZXh0TWFwLnNldChcInN0YXJ0X3RpbWVfZm9yX2ZpbHRlclwiLCBcIlN0YXJ0IFRpbWVcIik7XHJcbiAgICB0aGlzLnRvb2x0aXBSYWRpb1RleHRNYXAuc2V0KFwiZW5kX3RpbWVfZm9yX2ZpbHRlclwiLCBcIkVuZCBUaW1lXCIpO1xyXG4gICAgdGhpcy50b29sdGlwUmFkaW9UZXh0TWFwLnNldChcInByaW1hcnlBRU5hbWVcIiwgXCJQcmltYXJ5IEFFXCIpO1xyXG4gICAgdGhpcy50b29sdGlwUmFkaW9UZXh0TWFwLnNldChcInJlZ2lvblwiLCBcIlJlZ2lvblwiKTtcclxuICAgIHRoaXMudG9vbHRpcFJhZGlvVGV4dE1hcC5zZXQoXCJhZ2VuY3lOYW1lXCIsIFwiQWdlbmN5XCIpO1xyXG4gICAgdGhpcy50b29sdGlwUmFkaW9UZXh0TWFwLnNldChcImxvY2F0aW9uXCIsIFwiTG9jYXRpb25cIik7XHJcbiAgICB0aGlzLnRvb2x0aXBSYWRpb1RleHRNYXAuc2V0KFwiYWR2ZXJ0aXNlck5hbWVcIiwgXCJBZHZlcnRpc2VyXCIpO1xyXG4gICAgdGhpcy50b29sdGlwUmFkaW9UZXh0TWFwLnNldChcInByb2R1Y3RDb2RlXCIsIFwiUHJvZHVjdCBDb2RlXCIpO1xyXG4gICAgdGhpcy50b29sdGlwUmFkaW9UZXh0TWFwLnNldChcImZsaWdodFN0YXJ0RGF0ZVwiLCBcIlN0YXJ0IERhdGVcIik7XHJcbiAgICB0aGlzLnRvb2x0aXBSYWRpb1RleHRNYXAuc2V0KFwiZmxpZ2h0RW5kRGF0ZVwiLCBcIkVuZCBEYXRlXCIpO1xyXG4gICAgdGhpcy50b29sdGlwUmFkaW9UZXh0TWFwLnNldChcIm9yZGVySWRBbmRSZXZOdW1iZXJcIiwgXCJTVE4gT3JkZXIjLVJldiNcIik7XHJcbiAgICB0aGlzLnRvb2x0aXBSYWRpb1RleHRNYXAuc2V0KFwiYWx0ZXJuYXRlT3JkZXJJZFwiLCBcIkJ1eWVyIE9yZGVyI1wiKTtcclxuICAgIHRoaXMudG9vbHRpcFJhZGlvVGV4dE1hcC5zZXQoXCJncnBcIiwgXCJHUlBcIik7XHJcbiAgICB0aGlzLnRvb2x0aXBSYWRpb1RleHRNYXAuc2V0KFwiY3BwXCIsIFwiQ1BQXCIpO1xyXG4gICAgdGhpcy50b29sdGlwUmFkaW9UZXh0TWFwLnNldChcImltcHNcIiwgXCJJTVBTXCIpO1xyXG4gICAgdGhpcy50b29sdGlwUmFkaW9UZXh0TWFwLnNldChcImNwbVwiLCBcIkNQTVwiKTtcclxuICAgIHRoaXMudG9vbHRpcFJhZGlvVGV4dE1hcC5zZXQoXCJvZmZlcmVkTUdzXCIsIFwiT2ZmZXJlZCBNR1wiKTtcclxuICAgIHRoaXMudG9vbHRpcFJhZGlvVGV4dE1hcC5zZXQoXCJvdXRzdGFuZGluZ1BFXCIsIFwiTy9TIFBFXCIpO1xyXG4gICAgdGhpcy50b29sdGlwUmFkaW9UZXh0TWFwLnNldChcIm9mZmVyZWRBRFVzXCIsIFwiT2ZmZXJlZCBBRFVzXCIpO1xyXG4gICAgdGhpcy50b29sdGlwUmFkaW9UZXh0TWFwLnNldChcInVkRGVmaWNpdFZhbHVlXCIsIFwiUGVuZGluZyBBdWRpZW5jZSBEZWx0YVwiKTtcclxuICAgIHRoaXMudG9vbHRpcFJhZGlvVGV4dE1hcC5zZXQoXCJzdGFydEVuZFRpbWVNdWx0aVwiLCBcIlRpbWVcIik7XHJcbiAgICB0aGlzLnRvb2x0aXBSYWRpb1RleHRNYXAuc2V0KFwiYm9va2VkVmFsdWVcIiwgXCJCb29rZWRcIik7XHJcbiAgICB0aGlzLnRvb2x0aXBSYWRpb1RleHRNYXAuc2V0KFwiYm9va2VkU3BvdHNcIiwgXCJTcG90c1wiKTtcclxuICAgIHRoaXMudG9vbHRpcFJhZGlvVGV4dE1hcC5zZXQoXCJ1c2VyQ2hhbmdlc1wiLCBcIk90aGVyIGNoYW5nZXNcIik7XHJcbiAgICB0aGlzLnRvb2x0aXBSYWRpb1RleHRNYXAuc2V0KFwiaW52ZW50b3J5Q29kZVwiLCBcIkludmVudG9yeSBDb2RlXCIpO1xyXG4gICAgdGhpcy50b29sdGlwUmFkaW9UZXh0TWFwLnNldChcInByb2dyYW1cIiwgXCJQcm9ncmFtXCIpO1xyXG4gICAgdGhpcy50b29sdGlwUmFkaW9UZXh0TWFwLnNldChcImFnZW5jeVwiLCBcIkFnZW5jeVwiKTtcclxuICAgIHRoaXMudG9vbHRpcFJhZGlvVGV4dE1hcC5zZXQoXCJhZHZlcnRpc2VyXCIsIFwiQWR2ZXJ0aXNlclwiKTtcclxuICAgIHRoaXMudG9vbHRpcFJhZGlvVGV4dE1hcC5zZXQoXCJzdGFydERhdGVcIiwgXCJTdGFydCBEYXRlXCIpO1xyXG4gICAgdGhpcy50b29sdGlwUmFkaW9UZXh0TWFwLnNldChcImVuZERhdGVcIiwgXCJFbmQgRGF0ZVwiKTtcclxuICAgIHRoaXMudG9vbHRpcFJhZGlvVGV4dE1hcC5zZXQoXCJyY3ZQcmVlbXB0XCIsIFwiTWFkZWdvb2QgUEVcIik7XHJcbiAgICB0aGlzLnRvb2x0aXBSYWRpb1RleHRNYXAuc2V0KFwib3NQcmVlbXB0XCIsIFwiTy9TIFBFXCIpO1xyXG4gICAgdGhpcy50b29sdGlwUmFkaW9UZXh0TWFwLnNldChcInJjdlVuZGVyRGx5XCIsIFwiUmVjb3ZlcmVkIFVEXCIpO1xyXG4gICAgdGhpcy50b29sdGlwUmFkaW9UZXh0TWFwLnNldChcIm9zVW5kZXJEbHlcIiwgXCJPL3MgVW5kZXIgRGx5XCIpO1xyXG4gICAgdGhpcy50b29sdGlwUmFkaW9UZXh0TWFwLnNldChcInByaW1hcnlBZVwiLCBcIlByaW1hcnkgQUVcIik7XHJcbiAgICB0aGlzLnRvb2x0aXBSYWRpb1RleHRNYXAuc2V0KFwicmVnaW9uXCIsIFwiUmVnaW9uXCIpO1xyXG4gICAgdGhpcy50b29sdGlwUmFkaW9UZXh0TWFwLnNldChcInJldkNvZGUxXCIsIFwiUmV2IGNvZGUgMVwiKTtcclxuICAgIHRoaXMudG9vbHRpcFJhZGlvVGV4dE1hcC5zZXQoXCJvcmRlck5vUmV2Tm9cIiwgXCJTVE4gT3JkZXIjLVJldiNcIik7XHJcbiAgICB0aGlzLnRvb2x0aXBSYWRpb1RleHRNYXAuc2V0KFwicmV2Q29kZTJcIiwgXCJSZXYgY29kZSAyXCIpO1xyXG4gICAgdGhpcy50b29sdGlwUmFkaW9UZXh0TWFwLnNldChcInJldkNvZGUzXCIsIFwiUmV2IGNvZGUgM1wiKTtcclxuICAgIHRoaXMudG9vbHRpcFJhZGlvVGV4dE1hcC5zZXQoXCJib29rZWRcIiwgXCJCb29rZWRcIik7XHJcbiAgICB0aGlzLnRvb2x0aXBSYWRpb1RleHRNYXAuc2V0KFwic3BvdHNcIiwgXCJTcG90c1wiKTtcclxuICAgIHRoaXMudG9vbHRpcFJhZGlvVGV4dE1hcC5zZXQoXCJwb3N0ZWRBdWRQZXJjZW50XCIsIFwiUG9zdGVkICVcIik7XHJcbiAgICB0aGlzLnRvb2x0aXBSYWRpb1RleHRNYXAuc2V0KFwicmV2aXNpb25cIiwgXCJSZXZpc2lvblwiKTtcclxuICAgIHRoaXMudG9vbHRpcFJhZGlvVGV4dE1hcC5zZXQoXCJwcm9kdWN0Q29kZVwiLCBcIlByb2R1Y3QgQ29kZVwiKTtcclxuICAgIHRoaXMudG9vbHRpcFJhZGlvVGV4dE1hcC5zZXQoXCJidXllck9yZGVySWRcIiwgXCJBTFQgT3JkZXIjXCIpO1xyXG4gICAgdGhpcy50b29sdGlwUmFkaW9UZXh0TWFwLnNldChcImRlbW9cIixcIkRlbW9cIik7XHJcbiAgICB0aGlzLnRvb2x0aXBSYWRpb1RleHRNYXAuc2V0KFwicG9zdGVkQWR1XCIsXCJQb3N0ZWQgQURVc1wiKTtcclxuICAgIHRoaXMudG9vbHRpcFJhZGlvVGV4dE1hcC5zZXQoXCJzY2hlZHVsZWRBZHVcIixcIlNjaGVkdWxlZCBBRFVzXCIpO1xyXG4gICAgdGhpcy50b29sdGlwUmFkaW9UZXh0TWFwLnNldChcImF1ZGllbmNlRGVmaWNpdFwiLFwiQXVkaWVuY2UgRGVmaWNpdFwiKTtcclxuICAgIHRoaXMudG9vbHRpcFJhZGlvVGV4dE1hcC5zZXQoXCJwb3N0ZWRBdWRQZXJjZW50XCIsXCJQb3N0ZWQgQXVkaWVuY2UgJVwiKTtcclxuICAgIHRoaXMudG9vbHRpcFJhZGlvVGV4dE1hcC5zZXQoXCJwb3RlbnRpYWxVbml0c1ZhbHVlXCIsXCJQT1QgVW5pdHNcIik7XHJcbiAgICB0aGlzLnRvb2x0aXBSYWRpb1RleHRNYXAuc2V0KFwiYm9va2VkVW5pdHNWYWx1ZVwiLFwiQm9va2VkIFVuaXRzXCIpO1xyXG4gICAgdGhpcy50b29sdGlwUmFkaW9UZXh0TWFwLnNldChcImJvb2tlZEFtb3VudFdpdGhaZXJvUmF0aW5nVmFsdWVcIixcIlRvdGFsICQgQm9va2VkXCIpO1xyXG4gICAgdGhpcy50b29sdGlwUmFkaW9UZXh0TWFwLnNldChcImJvb2tlZEFtb3VudFBlcmNlbnRhZ2VXaXRoWmVyb1JhdGluZ1ZhbHVlXCIsXCIlIG9mICQgQm9va2VkXCIpO1xyXG4gICAgdGhpcy50b29sdGlwUmFkaW9UZXh0TWFwLnNldChcImJvb2tlZEFtb3VudFdpdGhvdXRaZXJvUmF0aW5nVmFsdWVcIixcIiRCb29rZWQgV2l0aCBJbXBzKOKAmTAwMClcIik7XHJcbiAgICB0aGlzLnRvb2x0aXBSYWRpb1RleHRNYXAuc2V0KFwiYm9va2VkQW1vdW50UGVyY2VudGFnZVdpdGhvdXRaZXJvUmF0aW5nVmFsdWVcIiwgXCIlIE9GICQgQm9va2VkXCIpO1xyXG4gIH1cclxuXHJcbiAgZ2VuZXJhdGVUYWJsZURhdGFXcmFwcGVyKCkge1xyXG4gICAgdGhpcy5zaG93U2tlbGV0b25Mb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMudGFibGVEYXRhV3JhcHBlciA9IFtdO1xyXG4gICAgbGV0IHJvd09iamVjdDogYW55O1xyXG4gICAgbGV0IGNvbHVtbk5hbWU6IHN0cmluZztcclxuICAgIGxldCBjb2x1bW5PYmplY3Q6IHsgW3g6IHN0cmluZ106IGFueTsgfTtcclxuICAgIGxldCBjb2x1bW5PYmplY3RLZXk7XHJcbiAgICBsZXQga2V5c1VzZWRGb3JUYWJsZURpc3BsYXk6IHN0cmluZ1tdO1xyXG4gICAgbGV0IGtleXNVc2VkRm9yQ29sdW1uOiBzdHJpbmdbXTtcclxuICAgIGxldCBhZGRpdGlvbmFsSW5mb09iamVjdDogeyBbeDogc3RyaW5nXTogYW55OyB9O1xyXG4gICAgbGV0IGFkZGl0aW9uYWxLZXlzO1xyXG4gICAgdGhpcy50YWJsZURhdGEuZm9yRWFjaCgob2JqOiB7IFt4OiBzdHJpbmddOiBhbnk7IH0pID0+IHtcclxuICAgICAgcm93T2JqZWN0ID0ge307XHJcbiAgICAgIGtleXNVc2VkRm9yVGFibGVEaXNwbGF5ID0gW107XHJcbiAgICAgIGZvciAodmFyIGNvbE51bSBpbiB0aGlzLnRhYmxlSGVhZGVycykge1xyXG4gICAgICAgIGNvbHVtbk9iamVjdCA9IHt9O1xyXG4gICAgICAgIGlmICghdGhpcy50YWJsZUhlYWRlcnNbY29sTnVtXS52aXNpYmxlKSB7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29sdW1uTmFtZSA9IFwiXCI7XHJcbiAgICAgICAga2V5c1VzZWRGb3JDb2x1bW4gPSBbXTtcclxuICAgICAgICB0aGlzLnRhYmxlSGVhZGVyc1tjb2xOdW1dLmhlYWRlckluZm8uZm9yRWFjaCgoaGVhZGVyKSA9PiB7XHJcbiAgICAgICAgICBpZiAoaGVhZGVyLnR5cGVPZkJvZHlEYXRhID09PSBcIlNUUklOR1wiKSB7XHJcbiAgICAgICAgICAgIGNvbHVtbk9iamVjdEtleSA9IGhlYWRlci5vYmplY3RLZXk7XHJcbiAgICAgICAgICAgIGNvbHVtbk9iamVjdFtjb2x1bW5PYmplY3RLZXldID0gb2JqW2NvbHVtbk9iamVjdEtleV07XHJcbiAgICAgICAgICAgIGtleXNVc2VkRm9yVGFibGVEaXNwbGF5LnB1c2goY29sdW1uT2JqZWN0S2V5KTtcclxuICAgICAgICAgICAga2V5c1VzZWRGb3JDb2x1bW4ucHVzaChjb2x1bW5PYmplY3RLZXkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSBpZiAoaGVhZGVyLnR5cGVPZkJvZHlEYXRhID09PSBcIklDT05cIikge1xyXG4gICAgICAgICAgICBjb2x1bW5PYmplY3RLZXkgPSBoZWFkZXIudHlwZU9mQm9keURhdGE7XHJcbiAgICAgICAgICAgIGNvbHVtbk9iamVjdFtjb2x1bW5PYmplY3RLZXldID0gb2JqW2hlYWRlci5vYmplY3RLZXldO1xyXG4gICAgICAgICAgICBrZXlzVXNlZEZvckNvbHVtbi5wdXNoKGhlYWRlci5vYmplY3RLZXkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSBpZiAoaGVhZGVyLnR5cGVPZkJvZHlEYXRhID09PSBcIkNIRUNLQk9YXCIpIHtcclxuICAgICAgICAgICAgY29sdW1uT2JqZWN0S2V5ID0gaGVhZGVyLnR5cGVPZkJvZHlEYXRhO1xyXG4gICAgICAgICAgICBjb2x1bW5PYmplY3RbY29sdW1uT2JqZWN0S2V5XSA9IG9ialtoZWFkZXIub2JqZWN0S2V5XTtcclxuICAgICAgICAgICAga2V5c1VzZWRGb3JDb2x1bW4ucHVzaChoZWFkZXIub2JqZWN0S2V5KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5c1VzZWRGb3JDb2x1bW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGNvbHVtbk5hbWUgKz0ga2V5c1VzZWRGb3JDb2x1bW5baV07XHJcbiAgICAgICAgICBpZiAoaSAhPT0ga2V5c1VzZWRGb3JDb2x1bW4ubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgICBjb2x1bW5OYW1lICs9ICcsJztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcm93T2JqZWN0W2NvbHVtbk5hbWVdID0gY29sdW1uT2JqZWN0O1xyXG4gICAgICB9XHJcbiAgICAgIGFkZGl0aW9uYWxJbmZvT2JqZWN0ID0ge307XHJcbiAgICAgIGFkZGl0aW9uYWxLZXlzID0gT2JqZWN0LmtleXMob2JqKS5maWx0ZXIoa2V5ID0+ICFrZXlzVXNlZEZvclRhYmxlRGlzcGxheS5pbmNsdWRlcyhrZXkpKTtcclxuICAgICAgYWRkaXRpb25hbEtleXMuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgIGFkZGl0aW9uYWxJbmZvT2JqZWN0W2tleV0gPSBvYmpba2V5XTtcclxuICAgICAgfSlcclxuICAgICAgcm93T2JqZWN0LkFkZGl0aW9uYWxJbmZvID0gYWRkaXRpb25hbEluZm9PYmplY3Q7XHJcbiAgICAgIHRoaXMudGFibGVEYXRhV3JhcHBlci5wdXNoKHJvd09iamVjdCk7XHJcbiAgICB9KVxyXG4gICAgdGhpcy50YWJsZURhdGEgPSB0aGlzLnRhYmxlRGF0YVdyYXBwZXI7XHJcbiAgICB0aGlzLnNob3dTa2VsZXRvbkxvYWRpbmcgPSBmYWxzZTtcclxuICAgIC8vIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHRoaXMudGFibGVEYXRhV3JhcHBlcikpO1xyXG4gIH1cclxuXHJcblxyXG4gIHNlbGVjdE9yVW5zZWxlY3RDaGVja2JveChyb3dEYXRhOiBhbnksIGNvbHVtbktleXM6IGFueSwgaXNDaGVja2JveFNlbGVjdGVkOiBhbnkpIHtcclxuICAgIHRoaXMudG9nZ2xlQ2hlY2tib3guZW1pdCh7IHJvd0RhdGEsIGNvbHVtbktleXMsIGlzQ2hlY2tib3hTZWxlY3RlZCB9KTtcclxuICB9XHJcblxyXG4gIHNlbGVjdFVuc2VsZWN0QWxsUm93cygpIHtcclxuICAgIHRoaXMudG9nZ2xlSGVhZGVyQ2hlY2tib3guZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0VW5zZWxlY3RSb3cocm93RGF0YTogYW55KSB7XHJcbiAgICB0aGlzLnRvZ2dsZVJvd0NoZWNrYm94LmVtaXQocm93RGF0YSk7XHJcbiAgfVxyXG5cclxuICB1bmRvQ3JlZGl0ZWRTcG90KGRhdGE6IGFueSkge1xyXG4gICAgdGhpcy51bmRvSWNvbkNsaWNrZWQuZW1pdCh7IGRhdGEsIG1nT3JDcmVkaXQ6IFwiQ3JlZGl0XCIgfSk7XHJcbiAgfVxyXG5cclxuICB1bmRvTWdTcG90KGRhdGE6IGFueSkge1xyXG4gICAgdGhpcy51bmRvSWNvbkNsaWNrZWQuZW1pdCh7IGRhdGEsIG1nT3JDcmVkaXQ6IFwiTWFrZUdvb2RcIiB9KTtcclxuICB9XHJcblxyXG4gIC8vU29ydCBhbmQgRmlsdGVyIExvZ2ljIGJlZ2lucyFcclxuICBjbG9zZVRvb2x0aXAoKSB7XHJcbiAgICBpZiAodGhpcy50b29sdGlwICYmIHRoaXMudG9vbHRpcC5pc09wZW4oKSkge1xyXG4gICAgICB0aGlzLnRvb2x0aXAuY2xvc2UoKTtcclxuICAgIH1cclxuICAgIHRoaXMudG9vbHRpcCA9IG51bGw7XHJcbiAgICB0aGlzLmRpc2FibGVDaGVja2JveEFwcGx5ID0gZmFsc2U7XHJcbiAgICBpZiAoIXRoaXMuYmluZFZhbHVlRnVuY0NhbGxlZCkge1xyXG4gICAgICB0aGlzLmNvbHVtbkZpbHRlckNsb3NlZC5lbWl0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBjbG9zZVNvcnRUb29sdGlwKCkge1xyXG4gIC8vICAgaWYgKHRoaXMuYW5uYVNvcnRTZXJ2aWNlLnRvb2x0aXAgJiYgdGhpcy5hbm5hU29ydFNlcnZpY2UudG9vbHRpcC5pc09wZW4oKSkge1xyXG4gIC8vICAgICB0aGlzLmFubmFTb3J0U2VydmljZS50b29sdGlwLmNsb3NlKCk7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvLyBpbml0RmlsdGVycygpIHtcclxuICAvLyAgIHRoaXMuYW5uYUZpbHRlclNlcnZpY2UudG9vbHRpcE1hcCA9IG5ldyBNYXAoKTtcclxuICAvLyAgIHRoaXMuYW5uYUZpbHRlclNlcnZpY2UudG9vbHRpcFNlbGVjdGVkTWFwID0gbmV3IE1hcCgpO1xyXG4gIC8vICAgLy8gdGhpcy5hbm5hU29ydFNlcnZpY2Uuc29ydEJ5QXNjID0gbmV3IE1hcCgpO1xyXG4gIC8vICAgLy8gdGhpcy5hbm5hU29ydFNlcnZpY2Uuc29ydEJ5RGVzYyA9IG5ldyBNYXAoKTtcclxuICAvLyAgIHRoaXMuYW5uYUZpbHRlclNlcnZpY2Uuc2VsZWN0ZWRSYWRpbyA9IG51bGw7XHJcbiAgLy8gICB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLmFwcGxpZWRGaWx0ZXJzQXJyYXkgPSBbXTtcclxuICAvLyAgIC8vY2xvc2luZyB0aGUgc29ydCB0b29sdGlwIGlmIHdlIHJvdXRlIG9uIHRoZSBzYW1lIHJvdXRlIG9yIGlmIHdlIGNsaWNrIGRyb3Bkb3duIGZpbHRlcnNcclxuICAvLyAgIC8vIHRoaXMuY2xvc2VTb3J0VG9vbHRpcCgpO1xyXG4gIC8vICAgLy8gdGhpcy5hbm5hU29ydFNlcnZpY2UudG9vbHRpcCA9IG51bGw7XHJcbiAgLy8gICB0aGlzLmRpc2FibGVDbGVhckFsbEJ0biA9IHRydWU7XHJcbiAgLy8gICB0aGlzLmRpc2FibGVUaW1lRmlsdGVyQXBwbHlCdG4gPSBmYWxzZTtcclxuICAvLyB9XHJcblxyXG4gIC8vIHNldEluaXRpYWxWYWx1ZU1hcERhdGEoKSB7XHJcbiAgLy8gICB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLmluaXRpYWxWYWx1ZU1hcCA9IG5ldyBNYXAoKTtcclxuICAvLyAgIHRoaXMudGFibGVIZWFkZXJzLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gIC8vICAgICBjb2x1bW4uaGVhZGVySW5mby5mb3JFYWNoKChoZWFkZXIpID0+IHtcclxuICAvLyAgICAgICBpZiAoaGVhZGVyLmZpbHRlciA9PT0gXCJTTElERVJcIikge1xyXG4gIC8vICAgICAgICAgaGVhZGVyLmZpbHRlck9iamVjdEtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgLy8gICAgICAgICAgIGxldCBtaW4gPSB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnJldHVybk1heEFuZE1pblZhbHVlKHRoaXMuY2xvbmVkVGFibGVEYXRhLCBrZXksIHRydWUpO1xyXG4gIC8vICAgICAgICAgICBsZXQgbWF4ID0gdGhpcy5hbm5hRmlsdGVyU2VydmljZS5yZXR1cm5NYXhBbmRNaW5WYWx1ZSh0aGlzLmNsb25lZFRhYmxlRGF0YSwga2V5LCBmYWxzZSk7XHJcbiAgLy8gICAgICAgICAgIGxldCBvYmogPSB7IG1pbiwgbWF4IH07XHJcblxyXG4gIC8vICAgICAgICAgICB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLmluaXRpYWxWYWx1ZU1hcC5zZXQoa2V5LCBvYmopO1xyXG4gIC8vICAgICAgICAgfSlcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgZWxzZSBpZiAoaGVhZGVyLmZpbHRlciA9PT0gXCJEQVRFXCIpIHtcclxuICAvLyAgICAgICAgIGhlYWRlci5maWx0ZXJPYmplY3RLZXlzLmZvckVhY2goKGtleSkgPT4ge1xyXG4gIC8vICAgICAgICAgICBpZihrZXkgPT0gXCJwZXJpb2RcIil7XHJcbiAgLy8gICAgICAgICAgIGNvbnN0IG1pbk1heFN0YXJ0RGF0ZSA9IHRoaXMuYW5uYUZpbHRlclNlcnZpY2UucmV0dXJuTWluQW5kTWF4RGF0ZSh0aGlzLmNsb25lZFRhYmxlRGF0YSwgXCJzdGFydERhdGVcIik7XHJcbiAgLy8gICAgICAgICAgIGNvbnN0IG1pbk1heEVuZERhdGUgPSB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnJldHVybk1pbkFuZE1heERhdGUodGhpcy5jbG9uZWRUYWJsZURhdGEsIFwiZW5kRGF0ZVwiKTtcclxuICAvLyAgICAgICAgICAgbGV0IGRhdGVPYmogPSB7IG1pblNlbGVjdGVkRGF0ZTogbWluTWF4U3RhcnREYXRlWzBdLCBtYXhTZWxlY3RlZERhdGU6IG1pbk1heEVuZERhdGVbMV0gfTtcclxuICAvLyAgICAgICAgICAgdGhpcy5hbm5hRmlsdGVyU2VydmljZS5pbml0aWFsVmFsdWVNYXAuc2V0KGtleSwgZGF0ZU9iaik7ICAgICAgXHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgICBlbHNle1xyXG4gIC8vICAgICAgICAgICBjb25zdCBtaW5NYXhEYXRlID0gdGhpcy5hbm5hRmlsdGVyU2VydmljZS5yZXR1cm5NaW5BbmRNYXhEYXRlKHRoaXMuY2xvbmVkVGFibGVEYXRhLCBrZXkpO1xyXG4gIC8vICAgICAgICAgICBsZXQgb2JqID0geyBtaW5TZWxlY3RlZERhdGU6IG1pbk1heERhdGVbMF0sIG1heFNlbGVjdGVkRGF0ZTogbWluTWF4RGF0ZVsxXSB9O1xyXG4gIC8vICAgICAgICAgICB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLmluaXRpYWxWYWx1ZU1hcC5zZXQoa2V5LCBvYmopO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfSlcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgZWxzZSBpZiAoaGVhZGVyLmZpbHRlciA9PT0gXCJUSU1FXCIpIHtcclxuICAvLyAgICAgICAgIGhlYWRlci5maWx0ZXJPYmplY3RLZXlzLmZvckVhY2goKGtleSkgPT4ge1xyXG4gIC8vICAgICAgICAgICBsZXQgZGF0YSA9IHRoaXMuY2xvbmVkVGFibGVEYXRhLmZpbHRlcigob2JqOiB7IFt4OiBzdHJpbmddOiBzdHJpbmc7IH0pID0+ICFbXCJcIiwgXCItXCIsIG51bGwsIFwiMFwiLCBcIjxtdWx0aT5cIl0uaW5jbHVkZXMob2JqW2tleV0pKTtcclxuICAvLyAgICAgICAgICAgbGV0IHRpbWVBcnIgPSBtYXAoZGF0YSwga2V5KTtcclxuICAvLyAgICAgICAgICAgdGltZUFyci5zb3J0KChhLCBiKSA9PiB7XHJcbiAgLy8gICAgICAgICAgICAgcmV0dXJuIHRoaXMuYW5uYURhdGVUaW1lRm9ybWF0U2VydmljZS5zb3J0QnlUaW1lQXNjZW5kaW5nKGEsIGIpO1xyXG4gIC8vICAgICAgICAgICB9KTtcclxuICAvLyAgICAgICAgICAgbGV0IG9iaiA9IHtcclxuICAvLyAgICAgICAgICAgICBmcm9tVGltZTogdGltZUFyclswXSxcclxuICAvLyAgICAgICAgICAgICB0b1RpbWU6IHRpbWVBcnJbdGltZUFyci5sZW5ndGggLSAxXSxcclxuICAvLyAgICAgICAgICAgfTtcclxuICAvLyAgICAgICAgICAgaWYgKHRoaXMuZ3RHZW5lcmFsQ29uZmlnLmNvbXBvbmVudCA9PT0gXCJTUE9UREVUQUlMU1wiIHx8IHRoaXMuZ3RHZW5lcmFsQ29uZmlnLmNvbXBvbmVudCA9PT0gXCJFWENMVURFSU5WRU5UT1JZUE9QVVBcIikge1xyXG4gIC8vICAgICAgICAgICAgIGxldCBpbmNsdWRlTXVsdGkgPSB0aGlzLmNsb25lZFRhYmxlRGF0YS5maW5kSW5kZXgoKG9iajogeyBbeDogc3RyaW5nXTogc3RyaW5nOyB9KSA9PiBvYmpba2V5XSA9PSBcIjxtdWx0aT5cIikgIT0gLTE7XHJcbiAgLy8gICAgICAgICAgICAgbGV0IGluY2x1ZGVaZXJvID0gdGhpcy5jbG9uZWRUYWJsZURhdGEuZmluZEluZGV4KChvYmo6IHsgW3g6IHN0cmluZ106IHN0cmluZzsgfSkgPT4gb2JqW2tleV0gPT0gXCIwXCIpICE9IC0xO1xyXG4gIC8vICAgICAgICAgICAgIGxldCBpbmNsdWRlVGltZVJhbmdlID0gdGhpcy5jbG9uZWRUYWJsZURhdGEuZmluZEluZGV4KChvYmo6IHsgW3g6IHN0cmluZ106IHN0cmluZzsgfSkgPT4gb2JqW2tleV0gIT0gXCIwXCIgJiYgb2JqW2tleV0gIT0gXCI8bXVsdGk+XCIpICE9IC0xO1xyXG4gIC8vICAgICAgICAgICAgIGxldCBvYmogPSB7XHJcbiAgLy8gICAgICAgICAgICAgICBmcm9tVGltZTogdGltZUFyclswXSxcclxuICAvLyAgICAgICAgICAgICAgIHRvVGltZTogdGltZUFyclt0aW1lQXJyLmxlbmd0aCAtIDFdLFxyXG4gIC8vICAgICAgICAgICAgICAgaW5jbHVkZU11bHRpOiBpbmNsdWRlTXVsdGksXHJcbiAgLy8gICAgICAgICAgICAgICBpbmNsdWRlWmVybzogaW5jbHVkZVplcm8sXHJcbiAgLy8gICAgICAgICAgICAgICBpbmNsdWRlVGltZVJhbmdlOiBpbmNsdWRlVGltZVJhbmdlXHJcbiAgLy8gICAgICAgICAgICAgfTtcclxuICAvLyAgICAgICAgICAgICB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLmluaXRpYWxWYWx1ZU1hcC5zZXQoa2V5LCBvYmopO1xyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIGVsc2UgaWYgKHRoaXMuZ3RHZW5lcmFsQ29uZmlnLmNvbXBvbmVudCA9PT0gXCJSQVRJTkdcIikge1xyXG4gIC8vICAgICAgICAgICAgIGxldCBpbmNsdWRlTXVsdGkgPSB0aGlzLmNsb25lZFRhYmxlRGF0YS5maW5kSW5kZXgoKG9iajogYW55KSA9PiBvYmpba2V5XVswXSA9PSBcIjxtdWx0aT5cIikgIT0gLTE7XHJcbiAgLy8gICAgICAgICAgICAgbGV0IGluY2x1ZGVaZXJvID0gdGhpcy5jbG9uZWRUYWJsZURhdGEuZmluZEluZGV4KChvYmo6IHsgW3g6IHN0cmluZ106IHN0cmluZ1tdOyB9KSA9PiBvYmpba2V5XVswXSA9PSBcIjBcIikgIT0gLTE7XHJcbiAgLy8gICAgICAgICAgICAgbGV0IGluY2x1ZGVUaW1lUmFuZ2UgPSB0aGlzLmNsb25lZFRhYmxlRGF0YS5maW5kSW5kZXgoKG9iajogeyBbeDogc3RyaW5nXTogc3RyaW5nW107IH0pID0+IG9ialtrZXldWzBdICE9IFwiMFwiICYmIG9ialtrZXldWzBdICE9IFwiPG11bHRpPlwiKSAhPSAtMTtcclxuXHJcbiAgLy8gICAgICAgICAgICAgbGV0IHN0YXJ0VGltZUFyciA9IG1hcCh0aGlzLmNsb25lZFRhYmxlRGF0YSwgXCJzdGFydFRpbWVcIik7XHJcbiAgLy8gICAgICAgICAgICAgbGV0IGVuZFRpbWVBcnIgPSBtYXAodGhpcy5jbG9uZWRUYWJsZURhdGEsIFwiZW5kVGltZVwiKTtcclxuXHJcbiAgLy8gICAgICAgICAgICAgc3RhcnRUaW1lQXJyLnNvcnQoKGEsIGIpID0+IHtcclxuICAvLyAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2Uuc29ydEJ5VGltZUFzY2VuZGluZyhhLCBiKTtcclxuICAvLyAgICAgICAgICAgICB9KTtcclxuXHJcbiAgLy8gICAgICAgICAgICAgZW5kVGltZUFyci5zb3J0KChhLCBiKSA9PiB7XHJcbiAgLy8gICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hbm5hRGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLnNvcnRCeVRpbWVEZXNjZW5kaW5nKGEsIGIpO1xyXG4gIC8vICAgICAgICAgICAgIH0pO1xyXG5cclxuICAvLyAgICAgICAgICAgICBsZXQgb2JqID0ge1xyXG4gIC8vICAgICAgICAgICAgICAgZnJvbVRpbWU6IHN0YXJ0VGltZUFyclswXSxcclxuICAvLyAgICAgICAgICAgICAgIHRvVGltZTogZW5kVGltZUFyclswXSxcclxuICAvLyAgICAgICAgICAgICAgIGluY2x1ZGVNdWx0aTogaW5jbHVkZU11bHRpLFxyXG4gIC8vICAgICAgICAgICAgICAgaW5jbHVkZVplcm86IGluY2x1ZGVaZXJvLFxyXG4gIC8vICAgICAgICAgICAgICAgaW5jbHVkZVRpbWVSYW5nZTogaW5jbHVkZVRpbWVSYW5nZVxyXG4gIC8vICAgICAgICAgICAgIH07XHJcbiAgLy8gICAgICAgICAgICAgdGhpcy5hbm5hRmlsdGVyU2VydmljZS5pbml0aWFsVmFsdWVNYXAuc2V0KGtleSwgb2JqKTtcclxuXHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgZWxzZSB7XHJcbiAgLy8gICAgICAgICAgICAgdGhpcy5hbm5hRmlsdGVyU2VydmljZS5pbml0aWFsVmFsdWVNYXAuc2V0KGtleSwgb2JqKTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfSlcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH0pXHJcbiAgLy8gICB9KVxyXG4gIC8vIH1cclxuXHJcbiAgaXNUb29sdGlwQWN0aXZlKGhlYWRlcjogYW55W10pIHtcclxuICAgIHJldHVybiB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLmlzVG9vbHRpcEFjdGl2ZShoZWFkZXIsdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlKTtcclxuICB9XHJcblxyXG4gIGJpbmRUaGVWYWx1ZVRvVG9vbFRpcCh0b29sdGlwOiBhbnksIGhlYWRlcjogSUhlYWRlckluZm8pIHtcclxuXHJcbiAgICB0aGlzLmJpbmRWYWx1ZUZ1bmNDYWxsZWQgPSB0cnVlO1xyXG4gICAgbGV0IGNvbnRhaW5lclRvU2Nyb2xsO1xyXG4gICAgaWYgKHRoaXMuZ3RHZW5lcmFsQ29uZmlnLmNvbXBvbmVudCA9PT0gXCJTUE9UREVUQUlMU1wiIHx8IHRoaXMuZ3RHZW5lcmFsQ29uZmlnLmNvbXBvbmVudCA9PT0gXCJEUlJMSVNUSU5HXCIpIHtcclxuICAgICAgY29udGFpbmVyVG9TY3JvbGwgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwic2Nyb2xsYWJsZS1jb250YWluZXJcIilbMF07XHJcbiAgICAgIHZhciBtZWRpYVF1ZXJ5ID0gd2luZG93Lm1hdGNoTWVkaWEoXCIobWF4LXdpZHRoOiAxMzY2cHgpXCIpO1xyXG4gICAgICBpZiAobWVkaWFRdWVyeS5tYXRjaGVzKSB7XHJcbiAgICAgICAgY29udGFpbmVyVG9TY3JvbGwuc2Nyb2xsKDAsIHRoaXMuZ3RHZW5lcmFsQ29uZmlnLnZlcnRpY2FsU2Nyb2xsT2Zmc2V0Rm9yRmlsdGVyVG9vbHRpcCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgaWYoIXRoaXMuYW5uYUZpbHRlclNlcnZpY2UudG9vbHRpcFNlbGVjdGVkTWFwKXtcclxuICAgICAgY29uc29sZS5sb2coXCJ0b29sdGlwIHNlbGVjdGVkIG1hcCBub3QgaW5pdGlhbGl6ZWRcIik7XHJcbiAgICAgIHRoaXMuYW5uYUZpbHRlclNlcnZpY2UudG9vbHRpcFNlbGVjdGVkTWFwID0gbmV3IE1hcCgpO1xyXG4gICAgfVxyXG4gICAgLy8gaWYgc2FtZSB0b29sdGlwIG9wZW5lZCBjbG9zZSBpdFxyXG4gICAgLy9uZWVkIHRvIGNoYW5nZSB0aGlzXHJcbiAgICAvL1RIZSB0b29sdGlwIHNob3VsZCBub3QgY2xvc2VcclxuICAgIC8vIGlmICh0b29sdGlwID09IHRoaXMudG9vbHRpcCkge1xyXG4gICAgLy8gICB0aGlzLmJpbmRWYWx1ZUZ1bmNDYWxsZWQgPSBmYWxzZTtcclxuICAgIC8vICAgdGhpcy5jbG9zZVRvb2x0aXAoKTtcclxuICAgIC8vIH1cclxuICAgIC8vIGVsc2Uge1xyXG4gICAgICBpZih0b29sdGlwID09IHRoaXMudG9vbHRpcCl7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJpbnNpZGUgaWZcIik7XHJcbiAgICAgICAgdGhpcy5iaW5kVmFsdWVGdW5jQ2FsbGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zYW1lVG9vbHRpcENsaWNrZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNlYXJjaEl0ZW0gPSB0aGlzLnNhbWVUb29sdGlwQ2xpY2tlZCA/IHRoaXMuc2VhcmNoSXRlbSA6IFwiXCI7XHJcbiAgICAgIGxldCBlbmFibGVkSGVhZGVyczogYW55W10gPSBbXTtcclxuICAgICAgaGVhZGVyLmZpbHRlclNvcnRPYmplY3RLZXlzLmZvckVhY2goKGl0ZW06IHN0cmluZyB8IG51bWJlcikgPT4ge1xyXG4gICAgICAgIGlmKGl0ZW0gPT0gXCJwZXJpb2RcIil7XHJcbiAgICAgICAgICAgIGxldCB1bmlxU3RhcnREYXRlID0gdW5pcSh0aGlzLnRhYmxlRGF0YS5tYXAoKHU6IHsgW3g6IHN0cmluZ106IGFueTsgfSkgPT4gdVtcInN0YXJ0RGF0ZVwiXSkpO1xyXG4gICAgICAgICAgICBsZXQgdW5pcUVuZERhdGUgPSB1bmlxKHRoaXMudGFibGVEYXRhLm1hcCgodTp7IFt4OiBzdHJpbmddOiBhbnk7IH0pID0+IHVbXCJlbmREYXRlXCJdKSk7XHJcbiAgICAgICAgICAgIGlmKHVuaXFTdGFydERhdGUubGVuZ3RoID4gMSB8fCB1bmlxRW5kRGF0ZS5sZW5ndGggPiAxIHx8IHRoaXMuaXNUb29sdGlwQWN0aXZlKFtpdGVtXSkpe1xyXG4gICAgICAgICAgICAgIGVuYWJsZWRIZWFkZXJzLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZih1bmlxKHRoaXMudGFibGVEYXRhLm1hcCgodTp7IFt4OiBzdHJpbmddOiBhbnk7IH0pID0+IHVbaXRlbV0pKS5sZW5ndGggPiAxIHx8IHRoaXMuaXNUb29sdGlwQWN0aXZlKFtpdGVtXSkpe1xyXG4gICAgICAgICAgICBlbmFibGVkSGVhZGVycy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMub3BlblRvb2x0aXAodG9vbHRpcCwgZW5hYmxlZEhlYWRlcnMsaGVhZGVyKTtcclxuICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDwgMTUwMCAmJiB3aW5kb3cuaW5uZXJIZWlnaHQgPCA3NjggJiYgIXRoaXMuYW5uYUZpbHRlclNlcnZpY2Uuc2xpZGVyU2V0LmhhcyhoZWFkZXIuZmlsdGVyU29ydE9iamVjdEtleXNbMF0pKSB7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5GaWx0ZXJPcGVuZWQuZW1pdCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNob3dDaGVja2JveEZpbHRlclJhZGlvQnV0dG9ucyA9IGhlYWRlci5maWx0ZXJTb3J0T2JqZWN0S2V5cy5sZW5ndGggPiAxO1xyXG4gICAgICBsZXQgcmFkaW9CdXR0b25EYXRhID0gdGhpcy5zYW1lVG9vbHRpcENsaWNrZWQgPyB0aGlzLnJhZGlvQnV0dG9ucy5maWx0ZXIoaXRlbSA9PiBpdGVtLmtleSA9PSB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnNlbGVjdGVkUmFkaW8pWzBdIDogdGhpcy5yYWRpb0J1dHRvbnNbMF07XHJcbiAgICAgIHRoaXMucG9wdWxhdGVUb29sdGlwRGF0YUJhc2VkT25TZWxlY3RlZFJhZGlvKHJhZGlvQnV0dG9uRGF0YSk7XHJcbiAgICAgIHRoaXMuYmluZFZhbHVlRnVuY0NhbGxlZCA9IGZhbHNlO1xyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgb3BlblRvb2x0aXAodG9vbHRpcDogYW55LGhlYWRlcjogYW55LCBjb2x1bW5IZWFkZXI6IElIZWFkZXJJbmZvKSB7XHJcbiAgICB0aGlzLmNsb3NlVG9vbHRpcCgpO1xyXG4gICAgdGhpcy50b29sdGlwID0gdG9vbHRpcDtcclxuICAgIHRoaXMudG9vbHRpcC5vcGVuKCk7XHJcbiAgICAvL2NvbnZlcnQga2V5IGludG8gdGhlIGhlYWRlclxyXG4gICAgdGhpcy5yYWRpb0J1dHRvbnMgPSBoZWFkZXIubWFwKChrZXk6IHN0cmluZyxpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIGxldCB2YWx1ZSA9IHRoaXMudG9vbHRpcFJhZGlvVGV4dE1hcC5oYXMoa2V5KVxyXG4gICAgICAgID8gdGhpcy50b29sdGlwUmFkaW9UZXh0TWFwLmdldChrZXkpXHJcbiAgICAgICAgOiBrZXk7IC8vY2hhbmdlIHRvIGRpc3BsYXkgbmFtZVxyXG4gICAgICByZXR1cm4gbmV3IHJhZGlvQnV0dG9uTW9kZWwoa2V5LCB2YWx1ZSwgY29sdW1uSGVhZGVyLmlzU29ydFJlcXVpcmVkW2luZGV4XSwgY29sdW1uSGVhZGVyLmlzRmlsdGVyUmVxdWlyZWRbaW5kZXhdKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJDb2x1bW5GaWx0ZXIoKSB7XHJcbiAgICB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLmNsZWFyQ29sdW1uRmlsdGVyKCk7XHJcbiAgICB0aGlzLmNsb3NlVG9vbHRpcCgpO1xyXG4gICAgdGhpcy50YWJsZURhdGEgPSBjbG9uZURlZXAodGhpcy5hbm5hRmlsdGVyU2VydmljZS5maWx0ZXJEYXRhKHRoaXMuY2xvbmVkVGFibGVEYXRhLCBcIlwiKSk7XHJcbiAgICB0aGlzLmFubmFTb3J0U2VydmljZS5ub1NvcnRpbmdBcHBsaWVkRGF0YSA9IHRoaXMudGFibGVEYXRhO1xyXG4gICAgdGhpcy5jaGVja0lmU29ydGluZ0lzQXBwbGllZCgpO1xyXG4gICAgdGhpcy5maWx0ZXJBcHBsaWVkVG9UYWJsZS5lbWl0KHRoaXMudGFibGVEYXRhKTtcclxuICAgIHRoaXMuZGlzYWJsZUVuYWJsZUVhY2hDb2x1bW5Ub29sdGlwSWNvbigpO1xyXG4gIH1cclxuXHJcbiAgcG9wdWxhdGVUb29sdGlwRGF0YUJhc2VkT25TZWxlY3RlZFJhZGlvKHJhZGlvQnV0dG9uRGF0YTogcmFkaW9CdXR0b25Nb2RlbCkge1xyXG5cclxuICAgIGxldCBoZWFkZXIgPSByYWRpb0J1dHRvbkRhdGEua2V5O1xyXG4gICAgdGhpcy5zZWxlY3RlZExhYmVsID0gcmFkaW9CdXR0b25EYXRhLmxhYmVsO1xyXG4gICAgdGhpcy5zaG93U29ydENvbXBvbmVudCA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93RmlsdGVyQ29tcG9uZW50ID0gZmFsc2U7XHJcbiAgICB0aGlzLnNlYXJjaEl0ZW0gPSB0aGlzLnNhbWVUb29sdGlwQ2xpY2tlZCA/IHRoaXMuc2VhcmNoSXRlbSA6IG51bGw7XHJcbiAgICBcclxuICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnNob3dTb3J0Q29tcG9uZW50ID0gcmFkaW9CdXR0b25EYXRhLmlzU29ydFJlcXVpcmVkO1xyXG4gICAgICB0aGlzLnNob3dGaWx0ZXJDb21wb25lbnQgPSByYWRpb0J1dHRvbkRhdGEuaXNGaWx0ZXJSZXF1aXJlZDtcclxuICAgIC8vIH0sIDApO1xyXG4gICAgdGhpcy50ZW1wU29ydE9yZGVyID0gdGhpcy5zYW1lVG9vbHRpcENsaWNrZWQgPyB0aGlzLnRlbXBTb3J0T3JkZXIgOiBudWxsO1xyXG4gICAgXHJcbiAgICBpZih0aGlzLnNhbWVUb29sdGlwQ2xpY2tlZCAmJiB0aGlzLnRlbXBTb3J0T3JkZXIpe1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLnVwZGF0ZVNvcnRUeXBlU3ViamVjdC5uZXh0KHRoaXMudGVtcFNvcnRPcmRlcik7ICAgICAgICBcclxuICAgICAgfSwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMudG9vbFRpcGRhdGEpIHtcclxuICAgICAgdGhpcy5yZXZlcnQoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnNlbGVjdGVkUmFkaW8gPSBoZWFkZXI7XHJcbiAgICBsZXQgc2VsZWN0ZWRGaWx0ZXJTZXQgPSBuZXcgU2V0KHRoaXMuYW5uYUZpbHRlclNlcnZpY2UuYXBwbGllZEZpbHRlcnNBcnJheSk7XHJcbiAgICBsZXQgaXNTb3J0UHJlc2VudCA9ICh0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUuc2l6ZSA+IDAgJiYgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlLmdldCh0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnNlbGVjdGVkUmFkaW8pICE9IFwiREVGQVVMVFwiKTtcclxuICAgIHRoaXMuZGlzYWJsZUNvbHVtbkNsZWFyQWxsQnRuID0gc2VsZWN0ZWRGaWx0ZXJTZXQuaGFzKHRoaXMuYW5uYUZpbHRlclNlcnZpY2Uuc2VsZWN0ZWRSYWRpbykgfHwgaXNTb3J0UHJlc2VudCA/IGZhbHNlIDogdHJ1ZTtcclxuICAgIFxyXG4gICAgaWYodGhpcy5zYW1lVG9vbHRpcENsaWNrZWQgJiYgdGhpcy5hbm5hRmlsdGVyU2VydmljZS5jYWxlbmRhclNldC5oYXModGhpcy5hbm5hRmlsdGVyU2VydmljZS5zZWxlY3RlZFJhZGlvKSApe1xyXG4gICAgICBpZih0aGlzLmNhbGVuZGFyU2VsZWN0aW9uLmZyb21EYXRlICYmIHRoaXMuY2FsZW5kYXJTZWxlY3Rpb24udG9EYXRlKXtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkTWluRGF0ZSA9IHRoaXMuY2FsZW5kYXJTZWxlY3Rpb24uZnJvbURhdGU7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZE1heERhdGUgPSB0aGlzLmNhbGVuZGFyU2VsZWN0aW9uLnRvRGF0ZTsgIFxyXG4gICAgICB9XHJcbiAgICAgIGVsc2V7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZE1pbkRhdGUgPSBjbG9uZURlZXAodGhpcy5zZWxlY3RlZE1pbkRhdGUpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRNYXhEYXRlID0gY2xvbmVEZWVwKHRoaXMuc2VsZWN0ZWRNYXhEYXRlKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImluc2lkZSBlbHNlXCIpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMuc2VsZWN0ZWRNaW5EYXRlKTtcclxuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLnNlbGVjdGVkTWF4RGF0ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZihyYWRpb0J1dHRvbkRhdGEuaXNGaWx0ZXJSZXF1aXJlZCAmJiAhdGhpcy5zYW1lVG9vbHRpcENsaWNrZWQpe1xyXG4gICAgICB0aGlzLmRpc2FibGVTbGlkZXJBcHBseUJ1dHRvbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmRpc2FibGVDaGVja2JveEFwcGx5ID0gZmFsc2U7XHJcbiAgICBcclxuICAgICAgaWYgKHRoaXMuYW5uYUZpbHRlclNlcnZpY2UuY2FsZW5kYXJTZXQuaGFzKGhlYWRlcikpIHtcclxuICAgICAgICB0aGlzLmdldENhbGVuZGFyRGF0YSgpO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYW5uYUZpbHRlclNlcnZpY2Uuc2xpZGVyU2V0LmhhcyhoZWFkZXIpKSB7XHJcbiAgICAgICAgdGhpcy5nZXRTbGlkZXJEYXRhKGhlYWRlcik7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5hbm5hRmlsdGVyU2VydmljZS50aW1lU2V0LmhhcyhoZWFkZXIpKSB7XHJcbiAgICAgICAgdGhpcy5nZXRUaW1lRmlsdGVyRGF0YShoZWFkZXIpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZ2V0Q2hlY2tib3hEYXRhKGhlYWRlcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgdGhpcy5zYW1lVG9vbHRpcENsaWNrZWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGdldFNsaWRlckRhdGEoaGVhZGVyOiBzdHJpbmcpIHtcclxuXHJcbiAgICBsZXQgdHJhbnNsYXRlRnVuYztcclxuXHJcbiAgICBpZiAodGhpcy5hbm5hRmlsdGVyU2VydmljZS5zbGlkZXJDdXJyZW5jeVNldC5oYXMoaGVhZGVyKSkge1xyXG4gICAgICB0cmFuc2xhdGVGdW5jID0gXCJjdXJyZW5jeVwiO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZihoZWFkZXIgPT0gXCJwb3N0ZWRBdWRQZXJjZW50XCIpe1xyXG4gICAgICB0cmFuc2xhdGVGdW5jID0gXCJwZXJjZW50XCI7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdHJhbnNsYXRlRnVuYyA9IFwibm9ybWFsXCI7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG9wdGlvbnNEYXRhID0gdGhpcy5hbm5hRmlsdGVyU2VydmljZS5nZXRGaWx0ZXJPcHRpb25zRGF0YSh0aGlzLnRhYmxlRGF0YSwgdGhpcy5jbG9uZWRUYWJsZURhdGEpO1xyXG4gICAgbGV0IG1pblZhbHVlID0gdGhpcy5hbm5hRmlsdGVyU2VydmljZS5yZXR1cm5NYXhBbmRNaW5WYWx1ZShvcHRpb25zRGF0YSwgaGVhZGVyLCB0cnVlKTtcclxuICAgIGxldCBtYXhWYWx1ZSA9IHRoaXMuYW5uYUZpbHRlclNlcnZpY2UucmV0dXJuTWF4QW5kTWluVmFsdWUob3B0aW9uc0RhdGEsIGhlYWRlciwgZmFsc2UpO1xyXG5cclxuICAgIGxldCBvYmogPSB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnNldE9wdGlvblZhbHVlcyhtaW5WYWx1ZSxtYXhWYWx1ZSk7XHJcblxyXG4gICAgaWYgKHRyYW5zbGF0ZUZ1bmMgPT09IFwibm9ybWFsXCIpIHtcclxuICAgICAgICBvYmoudHJhbnNsYXRlID0gdGhpcy5hbm5hRmlsdGVyU2VydmljZS5ub3JtYWxUcmFuc2xhdGVGdW5jdGlvbjtcclxuICAgIH0gZWxzZSBpZiAodHJhbnNsYXRlRnVuYyA9PT0gXCJwZXJjZW50XCIpIHtcclxuICAgICAgICBvYmoudHJhbnNsYXRlID0gdGhpcy5hbm5hRmlsdGVyU2VydmljZS5wZXJjZW50VHJhbnNsYXRlRnVuY3Rpb247XHJcbiAgICB9IGVsc2UgaWYgKHRyYW5zbGF0ZUZ1bmMgPT09IFwiY3VycmVuY3lcIikge1xyXG4gICAgICAgIG9iai50cmFuc2xhdGUgPSB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLmN1cnJlbmN5VHJhbnNsYXRlRnVuY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5vcHRpb25zID0gb2JqO1xyXG4gICAgICAgXHJcbiAgICBpZih0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXMoaGVhZGVyKSl7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkT2JqID0gdGhpcy5hbm5hRmlsdGVyU2VydmljZS50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KGhlYWRlcik7XHJcbiAgICAgICAgdGhpcy5zbGlkZXJNaW5WYWx1ZSA9IHNlbGVjdGVkT2JqLm1pbiA8IHRoaXMub3B0aW9ucy5mbG9vciA/IHRoaXMub3B0aW9ucy5mbG9vciA6IHNlbGVjdGVkT2JqLm1pbjtcclxuICAgICAgICB0aGlzLnNsaWRlck1heFZhbHVlID0gc2VsZWN0ZWRPYmoubWF4IDwgdGhpcy5vcHRpb25zLmNlaWwgPyBzZWxlY3RlZE9iai5tYXggOiB0aGlzLm9wdGlvbnMuY2VpbDsgICBcclxuICAgIH1cclxuICAgIGVsc2V7XHJcbiAgICAgICAgdGhpcy5zbGlkZXJNaW5WYWx1ZSA9IHRoaXMub3B0aW9ucy5mbG9vcjtcclxuICAgICAgICB0aGlzLnNsaWRlck1heFZhbHVlID0gdGhpcy5vcHRpb25zLmNlaWw7XHJcbiAgICB9XHJcblxyXG4gICAgLy9kZWZhdWx0IHN0ZXAgdmFsdWVzXHJcbiAgICB0aGlzLm9wdGlvbnMuc3RlcCA9IDE7XHJcbiAgICB0aGlzLnNsaWRlckZpbHRlclRleHRCb3hTdGVwID0gXCIxXCI7XHJcbiAgICBpZiAoaGVhZGVyICE9PSBcIldlZWtOdW1iZXJcIikge1xyXG4gICAgICB0aGlzLm9wdGlvbnMuc3RlcCA9IDAuMTtcclxuICAgICAgdGhpcy5zbGlkZXJGaWx0ZXJUZXh0Qm94U3RlcCA9IFwiMC4xXCI7XHJcbiAgICB9XHJcbiAgXHJcbiAgfVxyXG5cclxuICBnZXRDaGVja2JveERhdGEoaGVhZGVyOiBzdHJpbmcpIHtcclxuXHJcbiAgICBsZXQgb3B0aW9uRGF0YSA9IHRoaXMuYW5uYUZpbHRlclNlcnZpY2UuZ2V0RmlsdGVyT3B0aW9uc0RhdGEodGhpcy50YWJsZURhdGEsIHRoaXMuY2xvbmVkVGFibGVEYXRhKTtcclxuICAgIGxldCB1bmlxT3B0aW9uRGF0YSA9IHVuaXEob3B0aW9uRGF0YS5tYXAoaXRlbSA9PiBpdGVtW2hlYWRlcl0pKTtcclxuICAgIGxldCB0b29sdGlwT3B0aW9ucyA9IHVuaXFPcHRpb25EYXRhLm1hcChpdGVtID0+IG5ldyBUb29sdGlwTW9kZWwoaXRlbSkpO1xyXG5cclxuICAgIGlmKHRoaXMuYW5uYUZpbHRlclNlcnZpY2UudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyhoZWFkZXIpKXtcclxuICAgICAgbGV0IHNlbGVjdGVkVmFsdWVTZXQgPSBuZXcgU2V0KHRoaXMuYW5uYUZpbHRlclNlcnZpY2UudG9vbHRpcFNlbGVjdGVkTWFwLmdldChoZWFkZXIpKTtcclxuICAgICAgdG9vbHRpcE9wdGlvbnMuZm9yRWFjaChpdGVtID0+IGl0ZW0uaXNTZWxlY3RlZCA9IHNlbGVjdGVkVmFsdWVTZXQuaGFzKGl0ZW0uZGF0YSkgPyB0cnVlIDogZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgZWxzZXtcclxuICAgICAgdG9vbHRpcE9wdGlvbnMuZm9yRWFjaChpdGVtID0+IGl0ZW0uaXNTZWxlY3RlZCA9IHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBpbmRleCA9IHRvb2x0aXBPcHRpb25zLmZpbmRJbmRleChpdGVtID0+IGl0ZW0uZGF0YSA9PSBudWxsKTtcclxuICAgIFxyXG4gICAgaWYoaW5kZXggIT0gLTEpe1xyXG4gICAgICB0b29sdGlwT3B0aW9uc1tpbmRleF0uZGF0YSA9IFwiKEJsYW5rKVwiO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBzZWxlY3RlZEl0ZW1zID0gc29ydEJ5KHRvb2x0aXBPcHRpb25zLmZpbHRlcihpdGVtID0+IGl0ZW0uaXNTZWxlY3RlZCksXCJkYXRhXCIpO1xyXG4gICAgbGV0IHVuc2VsZWN0ZWRJdGVtcyA9IHNvcnRCeSh0b29sdGlwT3B0aW9ucy5maWx0ZXIoaXRlbSA9PiAhaXRlbS5pc1NlbGVjdGVkKSxcImRhdGFcIik7XHJcbiAgICAgICAgXHJcbiAgICB0aGlzLmNsb25lZFRvb2x0aXBPcHRpb25zID0gWy4uLnNlbGVjdGVkSXRlbXMsIC4uLnVuc2VsZWN0ZWRJdGVtc107XHJcblxyXG4gICAgdGhpcy50b29sdGlwT3B0aW9ucyA9IGNsb25lRGVlcCh0aGlzLmNsb25lZFRvb2x0aXBPcHRpb25zKTtcclxuICAgICAgICBcclxuICAgIHRoaXMuZGlzYWJsZVNlbGVjdEFsbCA9IHVuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPT0gMDtcclxuICAgIHRoaXMuZGlzYWJsZUNsZWFyQWxsID0gc2VsZWN0ZWRJdGVtcy5sZW5ndGggPT0gMDtcclxuICAgICAgICBcclxuICB9XHJcblxyXG4gIGdldENhbGVuZGFyRGF0YSgpIHtcclxuICAgIFxyXG4gICAgY29uc3QgcGFyc2luZ0Zvcm1hdCA9IFwiTU0vREQvWVlZWVwiO1xyXG5cclxuICAgIGxldCBvcHRpb25EYXRhID0gdGhpcy5hbm5hRmlsdGVyU2VydmljZS5nZXRGaWx0ZXJPcHRpb25zRGF0YSh0aGlzLnRhYmxlRGF0YSwgdGhpcy5jbG9uZWRUYWJsZURhdGEpO1xyXG4gICAgXHJcbiAgICBsZXQgbWluTWF4RGF0ZTtcclxuICAgIGlmKHRoaXMuYW5uYUZpbHRlclNlcnZpY2Uuc2VsZWN0ZWRSYWRpbyA9PSBcInBlcmlvZFwiKXtcclxuICAgICAgbGV0IG1pblN0YXJ0RGF0ZSA9IHRoaXMuYW5uYUZpbHRlclNlcnZpY2UucmV0dXJuTWluQW5kTWF4RGF0ZShvcHRpb25EYXRhLCBcInN0YXJ0RGF0ZVwiKTtcclxuICAgICAgbGV0IG1heEVuZERhdGUgPSB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnJldHVybk1pbkFuZE1heERhdGUob3B0aW9uRGF0YSxcImVuZERhdGVcIik7XHJcbiAgICAgIG1pbk1heERhdGUgPSBbbWluU3RhcnREYXRlWzBdLG1heEVuZERhdGVbMV1dO1xyXG4gICAgfVxyXG4gICAgZWxzZXtcclxuICAgICAgbWluTWF4RGF0ZSA9IHRoaXMuYW5uYUZpbHRlclNlcnZpY2UucmV0dXJuTWluQW5kTWF4RGF0ZShvcHRpb25EYXRhLCB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnNlbGVjdGVkUmFkaW8pOyAgXHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyhtaW5NYXhEYXRlKTtcclxuICAgIFxyXG4gICAgICAgIFxyXG4gICAgdGhpcy5jYWxlbmRhck1pbkVuYWJsZWREYXRlID0gdGhpcy5hbm5hRGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb05nYkRhdGUobWluTWF4RGF0ZVswXSxwYXJzaW5nRm9ybWF0KTtcclxuICAgIHRoaXMuY2FsZW5kYXJNYXhFbmFibGVkRGF0ZSA9IHRoaXMuYW5uYURhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKG1pbk1heERhdGVbMV0scGFyc2luZ0Zvcm1hdCk7XHJcbiAgICBcclxuICAgIGNvbnNvbGUubG9nKHRoaXMuY2FsZW5kYXJNaW5FbmFibGVkRGF0ZSk7XHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLmNhbGVuZGFyTWF4RW5hYmxlZERhdGUpO1xyXG4gICAgXHJcbiAgICBpZih0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXModGhpcy5hbm5hRmlsdGVyU2VydmljZS5zZWxlY3RlZFJhZGlvKSl7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkRGF0ZU9iaiA9IHRoaXMuYW5uYUZpbHRlclNlcnZpY2UudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmKHNlbGVjdGVkRGF0ZU9iai5mcm9tRGF0ZS5pc0FmdGVyKG1pbk1heERhdGVbMF0pKXtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1pbkRhdGUgPSB0aGlzLmFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvTmdiRGF0ZShzZWxlY3RlZERhdGVPYmouZnJvbURhdGUscGFyc2luZ0Zvcm1hdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNaW5EYXRlID0gdGhpcy5hbm5hRGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb05nYkRhdGUobWluTWF4RGF0ZVswXSxwYXJzaW5nRm9ybWF0KTtcclxuICAgICAgICB9IFxyXG5cclxuICAgICAgICBpZihzZWxlY3RlZERhdGVPYmoudG9EYXRlLmlzQWZ0ZXIobWluTWF4RGF0ZVsxXSkpe1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkTWF4RGF0ZSA9IHRoaXMuYW5uYURhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKG1pbk1heERhdGVbMV0scGFyc2luZ0Zvcm1hdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNYXhEYXRlID0gdGhpcy5hbm5hRGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb05nYkRhdGUoc2VsZWN0ZWREYXRlT2JqLnRvRGF0ZSxwYXJzaW5nRm9ybWF0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG4gICAgZWxzZXtcclxuICAgICAgIHRoaXMuc2VsZWN0ZWRNaW5EYXRlID0gY2xvbmVEZWVwKHRoaXMuY2FsZW5kYXJNaW5FbmFibGVkRGF0ZSk7XHJcbiAgICAgICB0aGlzLnNlbGVjdGVkTWF4RGF0ZSA9IGNsb25lRGVlcCh0aGlzLmNhbGVuZGFyTWF4RW5hYmxlZERhdGUpO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2codGhpcy5zZWxlY3RlZE1pbkRhdGUpO1xyXG4gICAgY29uc29sZS5sb2codGhpcy5zZWxlY3RlZE1heERhdGUpO1xyXG4gICAgICAgIFxyXG4gIH1cclxuXHJcbiAgZ2V0VGltZUZpbHRlckRhdGEoaGVhZGVyOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIFxyXG4gICAgdGhpcy5zdGFydFRpbWVIb3VyRXJyID0gdGhpcy5zdGFydFRpbWVNaW5FcnIgPSB0aGlzLmVuZFRpbWVIb3VyRXJyID0gdGhpcy5lbmRUaW1lTWluRXJyID0gZmFsc2U7ICAgIFxyXG5cclxuICAgIGlmICh0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXMoaGVhZGVyKSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRnJvbVRpbWUgPSB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQoaGVhZGVyKS5mcm9tVGltZTtcclxuICAgICAgdGhpcy5zZWxlY3RlZFRvVGltZSA9IHRoaXMuYW5uYUZpbHRlclNlcnZpY2UudG9vbHRpcFNlbGVjdGVkTWFwLmdldChoZWFkZXIpLnRvVGltZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2V0SW5pdGlhbFZhbHVlTWFwRm9yVGltZUZpbHRlcihoZWFkZXIpO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRnJvbVRpbWUgPSB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLmluaXRpYWxWYWx1ZU1hcC5nZXQoaGVhZGVyKS5mcm9tVGltZTtcclxuICAgICAgdGhpcy5zZWxlY3RlZFRvVGltZSA9IHRoaXMuYW5uYUZpbHRlclNlcnZpY2UuaW5pdGlhbFZhbHVlTWFwLmdldChoZWFkZXIpLnRvVGltZTtcclxuICAgIH1cclxuXHJcbiAgICBpZih0aGlzLnNlbGVjdGVkRnJvbVRpbWUgIT0gdW5kZWZpbmVkIHx8IHRoaXMuc2VsZWN0ZWRUb1RpbWUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGcm9tVGltZSA9IHRoaXMuYW5uYURhdGVUaW1lRm9ybWF0U2VydmljZS5mb3JtYXRUb1R3ZWx2ZUhycyh0aGlzLnNlbGVjdGVkRnJvbVRpbWUsIHRydWUpO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVG9UaW1lID0gdGhpcy5hbm5hRGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmZvcm1hdFRvVHdlbHZlSHJzKHRoaXMuc2VsZWN0ZWRUb1RpbWUsIHRydWUpO1xyXG5cclxuICAgICAgdGhpcy5jbG9uZWRTZWxlY3RlZEZyb21UaW1lID0gY2xvbmVEZWVwKHRoaXMuc2VsZWN0ZWRGcm9tVGltZSk7XHJcbiAgICAgIHRoaXMuY2xvbmVkU2VsZWN0ZWRUb1RpbWUgPSBjbG9uZURlZXAodGhpcy5zZWxlY3RlZFRvVGltZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZyb21UaW1lID0gW1wiLVwiLCBcIi1cIiwgXCItXCJdO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVG9UaW1lID0gW1wiLVwiLCBcIi1cIiwgXCItXCJdO1xyXG4gICAgICB0aGlzLmRpc2FibGVUaW1lRmlsdGVyQXBwbHlCdG4gPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKHRoaXMuZ3RHZW5lcmFsQ29uZmlnLmNvbXBvbmVudCA9PT0gXCJTUE9UREVUQUlMU1wiIHx8IHRoaXMuZ3RHZW5lcmFsQ29uZmlnLmNvbXBvbmVudCA9PT0gXCJFWENMVURFSU5WRU5UT1JZUE9QVVBcIikge1xyXG4gICAgICB0aGlzLnNldFRpbWVGaWx0ZXJEYXRhRm9yQ29tcG9uZW50c090aGVyVGhhblJhdGluZ3NQYWdlKGhlYWRlcik7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmKHRoaXMuZ3RHZW5lcmFsQ29uZmlnLmNvbXBvbmVudCA9PT0gXCJSQVRJTkdcIil7XHJcbiAgICAgIHRoaXMuc2V0VGltZUZpbHRlckRhdGFGb3JSYXRpbmdQYWdlQ29tcG9uZW50KGhlYWRlcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL05lZWQgdG8gY2hhbmdlIHRoaXMgbWV0aG9kXHJcbiAgc2V0VGltZUZpbHRlckRhdGFGb3JDb21wb25lbnRzT3RoZXJUaGFuUmF0aW5nc1BhZ2UoaGVhZGVyOiBzdHJpbmcpe1xyXG4gICAgdGhpcy5zaG93TXVsdGlUaW1lQ2hlY2tib3ggPSBmYWxzZTtcclxuICAgIHRoaXMuc2hvd1plcm9UaW1lQ2hlY2tib3ggPSBmYWxzZTtcclxuICAgIHRoaXMuc2hvd0VudGVyVGltZUNoZWNrYm94ID0gZmFsc2U7XHJcbiAgICB0aGlzLm11bHRpVGltZUNoZWNrYm94Q2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy56ZXJvVGltZUNoZWNrYm94Q2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5lbnRlclRpbWVDaGVja2JveENoZWNrZWQgPSBmYWxzZTtcclxuXHJcblxyXG4gICAgbGV0IG9wdGlvbnNEYXRhID0gdGhpcy5hbm5hRmlsdGVyU2VydmljZS5nZXRGaWx0ZXJPcHRpb25zRGF0YSh0aGlzLnRhYmxlRGF0YSwgdGhpcy5jbG9uZWRUYWJsZURhdGEpO1xyXG4gICAgbGV0IHNlbGVjdGVkT2JqO1xyXG5cclxuICAgIGlmKHRoaXMuYW5uYUZpbHRlclNlcnZpY2UudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyhoZWFkZXIpKXtcclxuICAgICAgc2VsZWN0ZWRPYmogPSB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQoaGVhZGVyKTtcclxuICAgIH1cclxuICAgIGVsc2V7XHJcbiAgICAgIHNlbGVjdGVkT2JqID0gdGhpcy5hbm5hRmlsdGVyU2VydmljZS5pbml0aWFsVmFsdWVNYXAuZ2V0KGhlYWRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYob3B0aW9uc0RhdGEuZmluZEluZGV4KG9iaiA9PiBvYmpbaGVhZGVyXSA9PSBcIjBcIikgIT0gLTEpIHtcclxuICAgICAgdGhpcy5zaG93WmVyb1RpbWVDaGVja2JveCA9IHRydWU7XHJcbiAgICAgIHRoaXMuemVyb1RpbWVDaGVja2JveENoZWNrZWQgPSBzZWxlY3RlZE9iai5pbmNsdWRlWmVyb1RpbWU7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgaWYob3B0aW9uc0RhdGEuZmluZEluZGV4KG9iaiA9PiBvYmpbaGVhZGVyXSA9PSBcIjxtdWx0aT5cIikgIT0gLTEpIHtcclxuICAgICAgdGhpcy5zaG93TXVsdGlUaW1lQ2hlY2tib3ggPSB0cnVlO1xyXG4gICAgICB0aGlzLm11bHRpVGltZUNoZWNrYm94Q2hlY2tlZCA9IHNlbGVjdGVkT2JqLmluY2x1ZGVNdWx0aTtcclxuICAgIH1cclxuICAgIFxyXG5cclxuICAgIGlmKHRoaXMuc2hvd1plcm9UaW1lQ2hlY2tib3ggfHwgdGhpcy5zaG93TXVsdGlUaW1lQ2hlY2tib3gpIHtcclxuICAgICAgdGhpcy5zaG93RW50ZXJUaW1lQ2hlY2tib3ggPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBpZihvcHRpb25zRGF0YS5maW5kSW5kZXgob2JqID0+IG9ialtoZWFkZXJdICE9IFwiPG11bHRpPlwiICYmIG9ialtoZWFkZXJdICE9IFwiMFwiKSAhPSAtMSkge1xyXG4gICAgICB0aGlzLmVudGVyVGltZUNoZWNrYm94Q2hlY2tlZCA9IHNlbGVjdGVkT2JqLmluY2x1ZGVUaW1lUmFuZ2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRUaW1lRmlsdGVyRGF0YUZvclJhdGluZ1BhZ2VDb21wb25lbnQoaGVhZGVyOiBzdHJpbmcpe1xyXG4gICAgICB0aGlzLnNob3dNdWx0aVRpbWVDaGVja2JveCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnNob3daZXJvVGltZUNoZWNrYm94ID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc2hvd0VudGVyVGltZUNoZWNrYm94ID0gZmFsc2U7XHJcbiAgICAgIHRoaXMubXVsdGlUaW1lQ2hlY2tib3hDaGVja2VkID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuemVyb1RpbWVDaGVja2JveENoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5lbnRlclRpbWVDaGVja2JveENoZWNrZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgIGxldCBvcHRpb25zRGF0YSA9IHRoaXMuYW5uYUZpbHRlclNlcnZpY2UuZ2V0RmlsdGVyT3B0aW9uc0RhdGEodGhpcy50YWJsZURhdGEsIHRoaXMuY2xvbmVkVGFibGVEYXRhKTtcclxuICAgICAgbGV0IHNlbGVjdGVkT2JqO1xyXG5cclxuICAgICAgaWYodGhpcy5hbm5hRmlsdGVyU2VydmljZS50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKGhlYWRlcikpe1xyXG4gICAgICAgIHNlbGVjdGVkT2JqID0gdGhpcy5hbm5hRmlsdGVyU2VydmljZS50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KGhlYWRlcik7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZXtcclxuICAgICAgICBzZWxlY3RlZE9iaiA9IHRoaXMuYW5uYUZpbHRlclNlcnZpY2UuaW5pdGlhbFZhbHVlTWFwLmdldChoZWFkZXIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZihvcHRpb25zRGF0YS5maW5kSW5kZXgob2JqID0+IG9ialtoZWFkZXJdWzBdID09IFwiMFwiKSAhPSAtMSkge1xyXG4gICAgICAgIHRoaXMuc2hvd1plcm9UaW1lQ2hlY2tib3ggPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuemVyb1RpbWVDaGVja2JveENoZWNrZWQgPSBzZWxlY3RlZE9iai5pbmNsdWRlWmVyb1RpbWU7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIFxyXG4gICAgICBpZihvcHRpb25zRGF0YS5maW5kSW5kZXgob2JqID0+IG9ialtoZWFkZXJdWzBdID09IFwiPG11bHRpPlwiKSAhPSAtMSkge1xyXG4gICAgICAgIHRoaXMuc2hvd011bHRpVGltZUNoZWNrYm94ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLm11bHRpVGltZUNoZWNrYm94Q2hlY2tlZCA9IHNlbGVjdGVkT2JqLmluY2x1ZGVNdWx0aTtcclxuICAgICAgfVxyXG4gICAgICBcclxuXHJcbiAgICAgIGlmKHRoaXMuc2hvd1plcm9UaW1lQ2hlY2tib3ggfHwgdGhpcy5zaG93TXVsdGlUaW1lQ2hlY2tib3gpIHtcclxuICAgICAgICB0aGlzLnNob3dFbnRlclRpbWVDaGVja2JveCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIGlmKG9wdGlvbnNEYXRhLmZpbmRJbmRleChvYmogPT4gb2JqW2hlYWRlcl1bMF0gIT0gXCI8bXVsdGk+XCIgJiYgb2JqW2hlYWRlcl1bMF0gIT0gXCIwXCIpICE9IC0xKSB7XHJcbiAgICAgICAgdGhpcy5lbnRlclRpbWVDaGVja2JveENoZWNrZWQgPSBzZWxlY3RlZE9iai5pbmNsdWRlVGltZVJhbmdlO1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuICBzZWxlY3RPclVuc2VsZWN0TXVsdGlUaW1lQ2hlY2tib3goKSB7XHJcbiAgICB0aGlzLm11bHRpVGltZUNoZWNrYm94Q2hlY2tlZCA9ICF0aGlzLm11bHRpVGltZUNoZWNrYm94Q2hlY2tlZDtcclxuICAgIC8vIHRoaXMuYW5uYUZpbHRlclNlcnZpY2UuaW5jbHVkZU11bHRpVGltZSA9ICF0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLmluY2x1ZGVNdWx0aVRpbWU7XHJcbiAgICB0aGlzLmRpc2FibGVUaW1lRmlsdGVyQXBwbHlCdXR0b24oKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdE9yVW5zZWxlY3RaZXJvVGltZUNoZWNrYm94KCkge1xyXG4gICAgdGhpcy56ZXJvVGltZUNoZWNrYm94Q2hlY2tlZCA9ICF0aGlzLnplcm9UaW1lQ2hlY2tib3hDaGVja2VkO1xyXG4gICAgLy8gdGhpcy5hbm5hRmlsdGVyU2VydmljZS5pbmNsdWRlWmVyb1RpbWUgPSAhdGhpcy5hbm5hRmlsdGVyU2VydmljZS5pbmNsdWRlWmVyb1RpbWU7XHJcbiAgICB0aGlzLmRpc2FibGVUaW1lRmlsdGVyQXBwbHlCdXR0b24oKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdE9yVW5zZWxlY3RFbnRlclRpbWVDaGVja2JveCgpIHtcclxuICAgIHRoaXMuZW50ZXJUaW1lQ2hlY2tib3hDaGVja2VkID0gIXRoaXMuZW50ZXJUaW1lQ2hlY2tib3hDaGVja2VkO1xyXG4gICAgLy8gdGhpcy5hbm5hRmlsdGVyU2VydmljZS5pbmNsdWRlVGltZVJhbmdlID0gIXRoaXMuYW5uYUZpbHRlclNlcnZpY2UuaW5jbHVkZVRpbWVSYW5nZTtcclxuICAgIHRoaXMuZGlzYWJsZVRpbWVGaWx0ZXJBcHBseUJ1dHRvbigpO1xyXG4gIH1cclxuXHJcbiAgZGlzYWJsZVNsaWRlckFwcGx5QnRuKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5mbG9vciA9PT0gdGhpcy5vcHRpb25zLmNlaWw7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RVbnNlbGVjdENoZWNrYm94KGRhdGE6IFRvb2x0aXBNb2RlbCkge1xyXG4gICAgZGF0YS5pc1NlbGVjdGVkID0gIWRhdGEuaXNTZWxlY3RlZDtcclxuICAgIGxldCBzZWxlY3RlZEl0ZW1zID0gdGhpcy50b29sdGlwT3B0aW9ucy5maWx0ZXIoaXRlbSA9PiBpdGVtLmlzU2VsZWN0ZWQpO1xyXG4gICAgbGV0IHVuc2VsZWN0ZWRJdGVtcyA9IHRoaXMudG9vbHRpcE9wdGlvbnMuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uaXNTZWxlY3RlZCk7XHJcblxyXG4gICAgdGhpcy5kaXNhYmxlQ2hlY2tib3hBcHBseSA9IHRoaXMuZGlzYWJsZUNsZWFyQWxsID0gIHNlbGVjdGVkSXRlbXMubGVuZ3RoID09IDA7XHJcbiAgICB0aGlzLmRpc2FibGVTZWxlY3RBbGwgPSB1bnNlbGVjdGVkSXRlbXMubGVuZ3RoID09IDA7XHJcbiAgICAgICAgXHJcbiAgfVxyXG5cclxuICBtaW5WYWx1ZUNoYW5nZWQodmFsdWU6IHN0cmluZykge1xyXG4gICAgY29uc29sZS5sb2coXCJtaW4gVmFsdWUgQ2hhbmdlZFwiKTtcclxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuaXNNaW5UZXh0Qm94RW1wdHkgPSB0cnVlO1xyXG4gICAgICB0aGlzLnNob3dTbGlkZXJNaW5WYWx1ZUVycm9yID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc2hvd1NsaWRlck1heFZhbHVlRXJyb3IgPSBmYWxzZTtcclxuICAgICAgdGhpcy5kaXNhYmxlU2xpZGVyQXBwbHlCdXR0b24gPSBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaXNNaW5UZXh0Qm94RW1wdHkgPSBmYWxzZTtcclxuICAgICAgaWYgKCt2YWx1ZSA+IHRoaXMuc2xpZGVyTWF4VmFsdWUpIHtcclxuICAgICAgICAgIGlmKCF0aGlzLmlzTWF4VGV4dEJveEVtcHR5KXtcclxuICAgICAgICAgICAgICB0aGlzLnNob3dTbGlkZXJNaW5WYWx1ZUVycm9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB0aGlzLmRpc2FibGVTbGlkZXJBcHBseUJ1dHRvbiA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoK3ZhbHVlIDwgdGhpcy5vcHRpb25zLmZsb29yKSB7XHJcbiAgICAgICAgICB0aGlzLnNob3dTbGlkZXJNaW5WYWx1ZUVycm9yID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuZGlzYWJsZVNsaWRlckFwcGx5QnV0dG9uID0gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc2xpZGVyTWluVmFsdWUgPSArdmFsdWU7XHJcbiAgICAgICAgICB0aGlzLnNob3dTbGlkZXJNaW5WYWx1ZUVycm9yID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLnNob3dTbGlkZXJNYXhWYWx1ZUVycm9yID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmRpc2FibGVTbGlkZXJBcHBseUJ1dHRvbiA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnNob3dFcnJvckZvck1pbkFuZE1heFZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICBtYXhWYWx1ZUNoYW5nZWQodmFsdWU6IHN0cmluZykge1xyXG4gICAgY29uc29sZS5sb2coXCJtYXggVmFsdWUgQ2hhbmdlZFwiKTtcclxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuaXNNYXhUZXh0Qm94RW1wdHkgPSB0cnVlO1xyXG4gICAgICB0aGlzLnNob3dTbGlkZXJNYXhWYWx1ZUVycm9yID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc2hvd1NsaWRlck1pblZhbHVlRXJyb3IgPSBmYWxzZTtcclxuICAgICAgdGhpcy5kaXNhYmxlU2xpZGVyQXBwbHlCdXR0b24gPSBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaXNNYXhUZXh0Qm94RW1wdHkgPSBmYWxzZTtcclxuICAgICAgaWYgKCt2YWx1ZSA8IHRoaXMuc2xpZGVyTWluVmFsdWUpIHtcclxuICAgICAgICAgIGlmKCF0aGlzLmlzTWluVGV4dEJveEVtcHR5KXtcclxuICAgICAgICAgICAgICB0aGlzLnNob3dTbGlkZXJNYXhWYWx1ZUVycm9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB0aGlzLmRpc2FibGVTbGlkZXJBcHBseUJ1dHRvbiA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoK3ZhbHVlID4gdGhpcy5vcHRpb25zLmNlaWwpIHtcclxuICAgICAgICAgIHRoaXMuc2hvd1NsaWRlck1heFZhbHVlRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5kaXNhYmxlU2xpZGVyQXBwbHlCdXR0b24gPSB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5zbGlkZXJNYXhWYWx1ZSA9ICt2YWx1ZTtcclxuICAgICAgICAgIHRoaXMuc2hvd1NsaWRlck1heFZhbHVlRXJyb3IgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuc2hvd1NsaWRlck1pblZhbHVlRXJyb3IgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuZGlzYWJsZVNsaWRlckFwcGx5QnV0dG9uID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuc2hvd0Vycm9yRm9yTWluQW5kTWF4VmFsdWUoKTtcclxuICB9XHJcblxyXG4gIHNob3dFcnJvckZvck1pbkFuZE1heFZhbHVlKCl7XHJcbiAgICAgIGlmKHRoaXMuaXNNaW5UZXh0Qm94RW1wdHkgJiYgdGhpcy5pc01heFRleHRCb3hFbXB0eSl7XHJcbiAgICAgICAgdGhpcy5zaG93U2xpZGVyTWluVmFsdWVFcnJvciA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zaG93U2xpZGVyTWF4VmFsdWVFcnJvciA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5kaXNhYmxlU2xpZGVyQXBwbHlCdXR0b24gPSB0cnVlO1xyXG4gICAgIH1cclxuICB9XHJcblxyXG4gIHNsaWRlclZhbHVlQ2hhbmdlKCkge1xyXG4gICAgdGhpcy5zbGlkZXJWYWx1ZSA9IHsgbWluOiB0aGlzLnNsaWRlck1pblZhbHVlLCBtYXg6IHRoaXMuc2xpZGVyTWF4VmFsdWUgfTtcclxuICB9XHJcblxyXG4gIGNhbmNlbFNsaWRlckZpbHRlcigpIHtcclxuICAgIHRoaXMuc2xpZGVyVmFsdWUgPSBudWxsO1xyXG4gICAgdGhpcy5jbG9zZVRvb2x0aXAoKTtcclxuICB9XHJcblxyXG4gIGFsbE9wdGlvbkNsaWNrZWQoKSB7XHJcbiAgICBpZiAodGhpcy5hbGxTZWxlY3RlZCA9PSAwIHx8IHRoaXMuYWxsU2VsZWN0ZWQgPT0gMikge1xyXG4gICAgICB0aGlzLmFsbFNlbGVjdGVkID0gMTtcclxuICAgICAgdGhpcy5kaXNhYmxlQ2hlY2tib3hBcHBseSA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hbGxTZWxlY3RlZCA9IDA7XHJcbiAgICAgIHRoaXMuZGlzYWJsZUNoZWNrYm94QXBwbHkgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hbm5hRmlsdGVyU2VydmljZS5hbGxPcHRpb25zQ2xpY2tlZCh0aGlzLmFsbFNlbGVjdGVkKTtcclxuICB9XHJcblxyXG4gIGFwcGx5RmlsdGVycygpIHtcclxuICAgIFxyXG4gICAgbGV0IGlzRmlsdGVyQ2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgbGV0IGlzU29ydENoYW5nZWQgPSBmYWxzZTtcclxuICAgIGlmKHRoaXMuc2hvd0ZpbHRlckNvbXBvbmVudCl7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRTZWxlY3RlZFZhbHVlID0gW107XHJcbiAgICAgICAgbGV0IHByZXZpb3VzU2VsZWN0ZWRWYWx1ZSA9IFtdO1xyXG5cclxuICAgICAgICBpZih0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXModGhpcy5hbm5hRmlsdGVyU2VydmljZS5zZWxlY3RlZFJhZGlvKSl7XHJcbiAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkVmFsdWUgPSB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5hbm5hRmlsdGVyU2VydmljZS5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZih0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLmluaXRpYWxWYWx1ZU1hcC5oYXModGhpcy5hbm5hRmlsdGVyU2VydmljZS5zZWxlY3RlZFJhZGlvKSl7XHJcbiAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkVmFsdWUgPSB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5hbm5hRmlsdGVyU2VydmljZS5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZXtcclxuICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWRWYWx1ZSA9IHNvcnRCeSh1bmlxKHRoaXMuY2xvbmVkVGFibGVEYXRhLm1hcChpdGVtID0+IGl0ZW1bdGhpcy5hbm5hRmlsdGVyU2VydmljZS5zZWxlY3RlZFJhZGlvXSkpKTtcclxuICAgICAgICAgIHRoaXMuYW5uYUZpbHRlclNlcnZpY2UuaW5pdGlhbFZhbHVlTWFwLnNldCh0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnNlbGVjdGVkUmFkaW8scHJldmlvdXNTZWxlY3RlZFZhbHVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKHRoaXMudG9vbHRpcE9wdGlvbnMpe1xyXG5cclxuICAgICAgICAgICAgY3VycmVudFNlbGVjdGVkVmFsdWUgPSBzb3J0QnkodGhpcy50b29sdGlwT3B0aW9ucy5maWx0ZXIoaXRlbSA9PiBpdGVtLmlzU2VsZWN0ZWQpLm1hcChpdGVtID0+IGl0ZW0uZGF0YSkpO1xyXG5cclxuICAgICAgICAgICAgaWYoIXRoaXMuc2VhcmNoSXRlbSAmJiBjdXJyZW50U2VsZWN0ZWRWYWx1ZS5sZW5ndGggPT0gdGhpcy50b29sdGlwT3B0aW9ucy5sZW5ndGggJiYgdGhpcy5hbm5hRmlsdGVyU2VydmljZS5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuYW5uYUZpbHRlclNlcnZpY2Uuc2VsZWN0ZWRSYWRpbykpe1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiaW5zaWRlIHNlYXJjaEl0ZW0gZWxzZSBjb25kaXRpb25cIik7XHJcbiAgICAgICAgICAgICAgY3VycmVudFNlbGVjdGVkVmFsdWUgPSB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5hbm5hRmlsdGVyU2VydmljZS5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKHRoaXMuc2VhcmNoSXRlbSl7XHJcbiAgICAgICAgICBjdXJyZW50U2VsZWN0ZWRWYWx1ZSA9IGN1cnJlbnRTZWxlY3RlZFZhbHVlLm1hcCggKGl0ZW06c3RyaW5nKSA9PiB0aGlzLnJlbW92ZUJvbGRFbGVtZW50RnJvbVN0cmluZyhpdGVtKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgYmxhbmtJbmRleCA9IGN1cnJlbnRTZWxlY3RlZFZhbHVlLmZpbmRJbmRleCgoaXRlbTogc3RyaW5nKSA9PiBpdGVtID09IFwiKEJsYW5rKVwiKTtcclxuICAgICAgICBpZihibGFua0luZGV4ICE9IC0xKXtcclxuICAgICAgICAgIGN1cnJlbnRTZWxlY3RlZFZhbHVlW2JsYW5rSW5kZXhdID0gbnVsbDtcclxuICAgICAgICAgIGN1cnJlbnRTZWxlY3RlZFZhbHVlID0gc29ydEJ5KGN1cnJlbnRTZWxlY3RlZFZhbHVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKGN1cnJlbnRTZWxlY3RlZFZhbHVlKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhwcmV2aW91c1NlbGVjdGVkVmFsdWUpO1xyXG4gICAgICAgIGlzRmlsdGVyQ2hhbmdlZCA9ICFpc0VxdWFsKGN1cnJlbnRTZWxlY3RlZFZhbHVlLHByZXZpb3VzU2VsZWN0ZWRWYWx1ZSk7XHJcblxyXG4gICAgICAgIGlmKGlzRmlsdGVyQ2hhbmdlZCl7XHJcbiAgICAgICAgICB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnJlT3JkZXJBcHBsaWVkRmlsdGVyc1N0YXRlKHRoaXMuY2xvbmVkVGFibGVEYXRhLGN1cnJlbnRTZWxlY3RlZFZhbHVlKTtcclxuICAgICAgICAgIHRoaXMuYW5uYUZpbHRlclNlcnZpY2UudG9vbHRpcFNlbGVjdGVkTWFwLnNldCh0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnNlbGVjdGVkUmFkaW8sIGN1cnJlbnRTZWxlY3RlZFZhbHVlKTtcclxuICAgICAgICAgIHRoaXMudGFibGVEYXRhID0gdGhpcy5hbm5hRmlsdGVyU2VydmljZS5maWx0ZXJEYXRhKHRoaXMuY2xvbmVkVGFibGVEYXRhLCBcIlwiKTtcclxuICAgICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLm5vU29ydGluZ0FwcGxpZWREYXRhID0gY2xvbmVEZWVwKHRoaXMudGFibGVEYXRhKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBpZih0aGlzLnNob3dTb3J0Q29tcG9uZW50KXtcclxuICAgICAgaXNTb3J0Q2hhbmdlZCA9ICh0aGlzLnRlbXBTb3J0T3JkZXIgIT0gbnVsbCAmJiB0aGlzLnRlbXBTb3J0T3JkZXIgIT0gdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlLmdldCh0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnNlbGVjdGVkUmFkaW8pKTsgIFxyXG4gICAgICBpZihpc1NvcnRDaGFuZ2VkKXtcclxuICAgICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlLmVudHJpZXMoKSkge1xyXG4gICAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlLnNldChrZXksIFwiREVGQVVMVFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlLnNldCh0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnNlbGVjdGVkUmFkaW8sIHRoaXMudGVtcFNvcnRPcmRlcik7XHJcbiAgICAgICAgdGhpcy5hcHBseVNvcnRpbmcodGhpcy5hbm5hRmlsdGVyU2VydmljZS5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmKGlzRmlsdGVyQ2hhbmdlZCl7XHJcbiAgICAgICAgdGhpcy5jaGVja0lmU29ydGluZ0lzQXBwbGllZCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmKGlzRmlsdGVyQ2hhbmdlZCl7XHJcbiAgICAgIHRoaXMuY2hlY2tJZlNvcnRpbmdJc0FwcGxpZWQoKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgaWYoaXNGaWx0ZXJDaGFuZ2VkICYmIGlzU29ydENoYW5nZWQpe1xyXG4gICAgICB0aGlzLmZpbHRlckFwcGxpZWRUb1RhYmxlLmVtaXQodGhpcy50YWJsZURhdGEpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZihpc0ZpbHRlckNoYW5nZWQpe1xyXG4gICAgICB0aGlzLmZpbHRlckFwcGxpZWRUb1RhYmxlLmVtaXQodGhpcy50YWJsZURhdGEpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZihpc1NvcnRDaGFuZ2VkKXtcclxuICAgICAgdGhpcy5zb3J0aW5nQXBwbGllZFRvVGFibGUuZW1pdCh0aGlzLnRhYmxlRGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kaXNhYmxlRW5hYmxlRWFjaENvbHVtblRvb2x0aXBJY29uKCk7XHJcbiAgICB0aGlzLmNsb3NlVG9vbHRpcCgpO1xyXG4gIH1cclxuXHJcbiAgYXBwbHlTb3J0aW5nKGtleTogc3RyaW5nKXtcclxuICAgIGlmKHRoaXMudGVtcFNvcnRPcmRlciA9PSBcIkFTQ1wiKXtcclxuICAgICAgdGhpcy50YWJsZURhdGEgPSBjbG9uZURlZXAodGhpcy5hbm5hU29ydFNlcnZpY2Uuc29ydERhdGFGb3JDb21wb25lbnRPdGhlclRoYW5MdXJBbmRDc3JQYWdlKHRydWUsdGhpcy50YWJsZURhdGEsa2V5KSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmKHRoaXMudGVtcFNvcnRPcmRlciA9PSBcIkRFU0NcIil7XHJcbiAgICAgICAgdGhpcy50YWJsZURhdGEgPSBjbG9uZURlZXAodGhpcy5hbm5hU29ydFNlcnZpY2Uuc29ydERhdGFGb3JDb21wb25lbnRPdGhlclRoYW5MdXJBbmRDc3JQYWdlKGZhbHNlLHRoaXMudGFibGVEYXRhLGtleSkpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZih0aGlzLnRlbXBTb3J0T3JkZXIgPT0gXCJERUZBVUxUXCIpe1xyXG4gICAgICAgIHRoaXMudGFibGVEYXRhID0gY2xvbmVEZWVwKHRoaXMuYW5uYVNvcnRTZXJ2aWNlLm5vU29ydGluZ0FwcGxpZWREYXRhKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldmVydCgpIHtcclxuICAgIHRoaXMudGVtcFRvb2x0aXBEYXRhID0gY2xvbmVEZWVwKHRoaXMudG9vbFRpcGRhdGEpO1xyXG4gICAgdGhpcy5hbm5hRmlsdGVyU2VydmljZS50b29sdGlwTWFwLnNldCh0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnNlbGVjdGVkUmFkaW8sIHRoaXMudGVtcFRvb2x0aXBEYXRhKTtcclxuICAgIHRoaXMudG9vbFRpcGRhdGEgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VDaGVja2JveEZpbHRlcigpIHtcclxuICAgIGlmICh0aGlzLnRvb2xUaXBkYXRhKSB7XHJcbiAgICAgIHRoaXMucmV2ZXJ0KCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNsb3NlVG9vbHRpcCgpO1xyXG4gIH1cclxuXHJcbiAgYXBwbHlTbGlkZXJGaWx0ZXIoKSB7XHJcblxyXG4gICAgbGV0IGlzRmlsdGVyQ2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgbGV0IGlzU29ydENoYW5nZWQgPSBmYWxzZTtcclxuXHJcbiAgICBpZih0aGlzLnNob3dGaWx0ZXJDb21wb25lbnQpe1xyXG4gICAgICAgIGxldCBjdXJyZW50U2xpZGVyRGF0YToge21pbjphbnksIG1heDogYW55fSA9IHttaW46IG51bGwgLCBtYXg6IG51bGx9O1xyXG4gICAgICAgIGxldCBwcmV2aW91c1NsaWRlckRhdGE6IHttaW46YW55LCBtYXg6IGFueX0gPSB7bWluOiBcIlwiLCBtYXg6IFwiXCJ9O1xyXG5cclxuICAgICAgICBpZih0aGlzLmlzTWluVGV4dEJveEVtcHR5KXtcclxuICAgICAgICAgICAgY3VycmVudFNsaWRlckRhdGEubWluID0gdGhpcy5vcHRpb25zLmZsb29yO1xyXG4gICAgICAgICAgICBjdXJyZW50U2xpZGVyRGF0YS5tYXggPSB0aGlzLnNsaWRlck1heFZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKHRoaXMuaXNNYXhUZXh0Qm94RW1wdHkpe1xyXG4gICAgICAgICAgICBjdXJyZW50U2xpZGVyRGF0YS5tYXggPSB0aGlzLm9wdGlvbnMuY2VpbDtcclxuICAgICAgICAgICAgY3VycmVudFNsaWRlckRhdGEubWluID0gdGhpcy5zbGlkZXJNaW5WYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgY3VycmVudFNsaWRlckRhdGEubWF4ID0gdGhpcy5zbGlkZXJNYXhWYWx1ZTtcclxuICAgICAgICAgICAgY3VycmVudFNsaWRlckRhdGEubWluID0gdGhpcy5zbGlkZXJNaW5WYWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKHRoaXMuYW5uYUZpbHRlclNlcnZpY2UudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyh0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnNlbGVjdGVkUmFkaW8pKXtcclxuICAgICAgICAgIHByZXZpb3VzU2xpZGVyRGF0YSA9IHRoaXMuYW5uYUZpbHRlclNlcnZpY2UudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKHRoaXMuYW5uYUZpbHRlclNlcnZpY2UuaW5pdGlhbFZhbHVlTWFwLmhhcyh0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnNlbGVjdGVkUmFkaW8pKXtcclxuICAgICAgICAgIHByZXZpb3VzU2xpZGVyRGF0YSA9IHRoaXMuYW5uYUZpbHRlclNlcnZpY2UuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNle1xyXG4gICAgICAgICAgbGV0IG1pblZhbHVlID0gdGhpcy5hbm5hRmlsdGVyU2VydmljZS5yZXR1cm5NYXhBbmRNaW5WYWx1ZSh0aGlzLmNsb25lZFRhYmxlRGF0YSwgdGhpcy5hbm5hRmlsdGVyU2VydmljZS5zZWxlY3RlZFJhZGlvLCB0cnVlKTtcclxuICAgICAgICAgIGxldCBtYXhWYWx1ZSA9IHRoaXMuYW5uYUZpbHRlclNlcnZpY2UucmV0dXJuTWF4QW5kTWluVmFsdWUodGhpcy5jbG9uZWRUYWJsZURhdGEsIHRoaXMuYW5uYUZpbHRlclNlcnZpY2Uuc2VsZWN0ZWRSYWRpbywgZmFsc2UpO1xyXG4gICAgICAgICAgcHJldmlvdXNTbGlkZXJEYXRhID0geyBtaW46IG1pblZhbHVlLCBtYXg6IG1heFZhbHVlIH07XHJcbiAgICAgICAgICB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLmluaXRpYWxWYWx1ZU1hcC5zZXQodGhpcy5hbm5hRmlsdGVyU2VydmljZS5zZWxlY3RlZFJhZGlvLCBwcmV2aW91c1NsaWRlckRhdGEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYoY3VycmVudFNsaWRlckRhdGEubWluID09IHRoaXMub3B0aW9ucy5mbG9vciAmJiBjdXJyZW50U2xpZGVyRGF0YS5tYXggPT0gdGhpcy5vcHRpb25zLmNlaWwgJiYgdGhpcy5hbm5hRmlsdGVyU2VydmljZS5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuYW5uYUZpbHRlclNlcnZpY2Uuc2VsZWN0ZWRSYWRpbykgKXtcclxuICAgICAgICAgICAgY3VycmVudFNsaWRlckRhdGEgPSB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5hbm5hRmlsdGVyU2VydmljZS5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcblxyXG4gICAgICAgIGlzRmlsdGVyQ2hhbmdlZCA9ICFpc0VxdWFsKHByZXZpb3VzU2xpZGVyRGF0YSxjdXJyZW50U2xpZGVyRGF0YSk7XHJcblxyXG4gICAgICAgIGlmKGlzRmlsdGVyQ2hhbmdlZCl7XHJcbiAgICAgICAgICAgIHRoaXMuYW5uYUZpbHRlclNlcnZpY2UucmVPcmRlckFwcGxpZWRGaWx0ZXJzU3RhdGUodGhpcy5jbG9uZWRUYWJsZURhdGEsY3VycmVudFNsaWRlckRhdGEpO1xyXG4gICAgICAgICAgICB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnRvb2x0aXBTZWxlY3RlZE1hcC5zZXQodGhpcy5hbm5hRmlsdGVyU2VydmljZS5zZWxlY3RlZFJhZGlvLGN1cnJlbnRTbGlkZXJEYXRhKTtcclxuICAgICAgICAgICAgdGhpcy50YWJsZURhdGEgPSB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLmZpbHRlckRhdGEodGhpcy5jbG9uZWRUYWJsZURhdGEsIFwiXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5ub1NvcnRpbmdBcHBsaWVkRGF0YSA9IGNsb25lRGVlcCh0aGlzLnRhYmxlRGF0YSk7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZUVuYWJsZUVhY2hDb2x1bW5Ub29sdGlwSWNvbigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZih0aGlzLnNob3dTb3J0Q29tcG9uZW50KXtcclxuICAgICAgaXNTb3J0Q2hhbmdlZCA9ICh0aGlzLnRlbXBTb3J0T3JkZXIgIT0gbnVsbCAmJiB0aGlzLnRlbXBTb3J0T3JkZXIgIT0gdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlLmdldCh0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnNlbGVjdGVkUmFkaW8pKTsgIFxyXG4gICAgICBpZihpc1NvcnRDaGFuZ2VkKXtcclxuICAgICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlLmVudHJpZXMoKSkge1xyXG4gICAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlLnNldChrZXksIFwiREVGQVVMVFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlLnNldCh0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnNlbGVjdGVkUmFkaW8sIHRoaXMudGVtcFNvcnRPcmRlcik7XHJcbiAgICAgICAgdGhpcy5hcHBseVNvcnRpbmcodGhpcy5hbm5hRmlsdGVyU2VydmljZS5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZihpc0ZpbHRlckNoYW5nZWQpe1xyXG4gICAgICB0aGlzLmNoZWNrSWZTb3J0aW5nSXNBcHBsaWVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYoaXNGaWx0ZXJDaGFuZ2VkICYmIGlzU29ydENoYW5nZWQpe1xyXG4gICAgICB0aGlzLmZpbHRlckFwcGxpZWRUb1RhYmxlLmVtaXQodGhpcy50YWJsZURhdGEpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZihpc0ZpbHRlckNoYW5nZWQpe1xyXG4gICAgICB0aGlzLmZpbHRlckFwcGxpZWRUb1RhYmxlLmVtaXQodGhpcy50YWJsZURhdGEpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZihpc1NvcnRDaGFuZ2VkKXtcclxuICAgICAgdGhpcy5zb3J0aW5nQXBwbGllZFRvVGFibGUuZW1pdCh0aGlzLnRhYmxlRGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jbG9zZVRvb2x0aXAoKTtcclxuICB9XHJcblxyXG4gIGNhbmNlbEluRGF0ZUZpbHRlcigpIHtcclxuICAgIHRoaXMuY2xvc2VUb29sdGlwKCk7XHJcbiAgfVxyXG5cclxuICBhcHBseURhdGVGaWx0ZXIoKSB7XHJcblxyXG4gICAgbGV0IGlzRmlsdGVyQ2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgbGV0IGlzU29ydENoYW5nZWQgPSBmYWxzZTtcclxuXHJcbiAgICBpZih0aGlzLnNob3dGaWx0ZXJDb21wb25lbnQpe1xyXG4gICAgICAgIGxldCBjdXJyZW50U2VsZWN0ZWREYXRlID0gdGhpcy5jYWxlbmRhclNlbGVjdGlvbjtcclxuICAgICAgICBsZXQgcHJldmlvdXNTZWxlY3RlZERhdGU6IHtmcm9tRGF0ZTogYW55LCB0b0RhdGU6IGFueX0gPSB7ZnJvbURhdGU6IG51bGwsIHRvRGF0ZTogbnVsbH07XHJcblxyXG4gICAgICAgIGlmKHRoaXMuYW5uYUZpbHRlclNlcnZpY2UudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyh0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnNlbGVjdGVkUmFkaW8pKXtcclxuICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWREYXRlID0gdGhpcy5hbm5hRmlsdGVyU2VydmljZS50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuYW5uYUZpbHRlclNlcnZpY2Uuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYodGhpcy5hbm5hRmlsdGVyU2VydmljZS5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuYW5uYUZpbHRlclNlcnZpY2Uuc2VsZWN0ZWRSYWRpbykpe1xyXG4gICAgICAgICAgcHJldmlvdXNTZWxlY3RlZERhdGUgPSB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5hbm5hRmlsdGVyU2VydmljZS5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZXtcclxuICAgICAgICAgIGxldCBtaW5NYXhEYXRlO1xyXG4gICAgICAgICAgaWYodGhpcy5hbm5hRmlsdGVyU2VydmljZS5zZWxlY3RlZFJhZGlvID09IFwicGVyaW9kXCIpe1xyXG4gICAgICAgICAgICBsZXQgbWluU3RhcnREYXRlID0gdGhpcy5hbm5hRmlsdGVyU2VydmljZS5yZXR1cm5NaW5BbmRNYXhEYXRlKHRoaXMuY2xvbmVkVGFibGVEYXRhLCBcInN0YXJ0RGF0ZVwiKTtcclxuICAgICAgICAgICAgbGV0IG1heEVuZERhdGUgPSB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnJldHVybk1pbkFuZE1heERhdGUodGhpcy5jbG9uZWRUYWJsZURhdGEsXCJlbmREYXRlXCIpO1xyXG4gICAgICAgICAgICBtaW5NYXhEYXRlID0gW21pblN0YXJ0RGF0ZVswXSxtYXhFbmREYXRlWzFdXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIG1pbk1heERhdGUgPSB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnJldHVybk1pbkFuZE1heERhdGUodGhpcy5jbG9uZWRUYWJsZURhdGEsdGhpcy5hbm5hRmlsdGVyU2VydmljZS5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWREYXRlID0ge2Zyb21EYXRlOiBtaW5NYXhEYXRlWzBdLCB0b0RhdGU6IG1pbk1heERhdGVbMV19O1xyXG4gICAgICAgICAgdGhpcy5hbm5hRmlsdGVyU2VydmljZS5pbml0aWFsVmFsdWVNYXAuc2V0KHRoaXMuYW5uYUZpbHRlclNlcnZpY2Uuc2VsZWN0ZWRSYWRpbywgcHJldmlvdXNTZWxlY3RlZERhdGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYoY3VycmVudFNlbGVjdGVkRGF0ZS5mcm9tRGF0ZSAmJiBjdXJyZW50U2VsZWN0ZWREYXRlLnRvRGF0ZSl7XHJcbiAgICAgICAgICAgIGxldCBmcm9tRGF0ZSA9IHt5ZWFyOiBjdXJyZW50U2VsZWN0ZWREYXRlLmZyb21EYXRlLnllYXIsbW9udGg6IGN1cnJlbnRTZWxlY3RlZERhdGUuZnJvbURhdGUubW9udGgsZGF5OiBjdXJyZW50U2VsZWN0ZWREYXRlLmZyb21EYXRlLmRheX07XHJcbiAgICAgICAgICAgIGxldCB0b0RhdGUgPSB7eWVhcjogY3VycmVudFNlbGVjdGVkRGF0ZS50b0RhdGUueWVhcixtb250aDogY3VycmVudFNlbGVjdGVkRGF0ZS50b0RhdGUubW9udGgsZGF5OiBjdXJyZW50U2VsZWN0ZWREYXRlLnRvRGF0ZS5kYXl9O1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYoaXNFcXVhbCh0aGlzLmNhbGVuZGFyTWluRW5hYmxlZERhdGUsZnJvbURhdGUpICYmIGlzRXF1YWwodGhpcy5jYWxlbmRhck1heEVuYWJsZWREYXRlLHRvRGF0ZSkgJiYgdGhpcy5hbm5hRmlsdGVyU2VydmljZS5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuYW5uYUZpbHRlclNlcnZpY2Uuc2VsZWN0ZWRSYWRpbykpe1xyXG4gICAgICAgICAgICAgICAgY3VycmVudFNlbGVjdGVkRGF0ZSA9IHRoaXMuYW5uYUZpbHRlclNlcnZpY2UuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50U2VsZWN0ZWREYXRlLmZyb21EYXRlID0gbW9tZW50KHRoaXMuYW5uYURhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0TmdiRGF0ZVRvTW9tZW50KGN1cnJlbnRTZWxlY3RlZERhdGUuZnJvbURhdGUpKTtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRTZWxlY3RlZERhdGUudG9EYXRlID0gbW9tZW50KHRoaXMuYW5uYURhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0TmdiRGF0ZVRvTW9tZW50KGN1cnJlbnRTZWxlY3RlZERhdGUudG9EYXRlKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaXNGaWx0ZXJDaGFuZ2VkID0gIWlzRXF1YWwocHJldmlvdXNTZWxlY3RlZERhdGUsY3VycmVudFNlbGVjdGVkRGF0ZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIGlmKGlzRmlsdGVyQ2hhbmdlZCl7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgdGhpcy5hbm5hRmlsdGVyU2VydmljZS5yZU9yZGVyQXBwbGllZEZpbHRlcnNTdGF0ZSh0aGlzLmNsb25lZFRhYmxlRGF0YSxjdXJyZW50U2VsZWN0ZWREYXRlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYW5uYUZpbHRlclNlcnZpY2UudG9vbHRpcFNlbGVjdGVkTWFwLnNldCh0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnNlbGVjdGVkUmFkaW8sY3VycmVudFNlbGVjdGVkRGF0ZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlRGF0YSA9IHRoaXMuYW5uYUZpbHRlclNlcnZpY2UuZmlsdGVyRGF0YSh0aGlzLmNsb25lZFRhYmxlRGF0YSwgXCJcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5ub1NvcnRpbmdBcHBsaWVkRGF0YSA9IGNsb25lRGVlcCh0aGlzLnRhYmxlRGF0YSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVFbmFibGVFYWNoQ29sdW1uVG9vbHRpcEljb24oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgaWYodGhpcy5zaG93U29ydENvbXBvbmVudCl7XHJcbiAgICAgIGlzU29ydENoYW5nZWQgPSAodGhpcy50ZW1wU29ydE9yZGVyICE9IG51bGwgJiYgdGhpcy50ZW1wU29ydE9yZGVyICE9IHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5nZXQodGhpcy5hbm5hRmlsdGVyU2VydmljZS5zZWxlY3RlZFJhZGlvKSk7ICBcclxuICAgICAgaWYoaXNTb3J0Q2hhbmdlZCl7XHJcbiAgICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5lbnRyaWVzKCkpIHtcclxuICAgICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5zZXQoa2V5LCBcIkRFRkFVTFRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5zZXQodGhpcy5hbm5hRmlsdGVyU2VydmljZS5zZWxlY3RlZFJhZGlvLCB0aGlzLnRlbXBTb3J0T3JkZXIpO1xyXG4gICAgICAgIHRoaXMuYXBwbHlTb3J0aW5nKHRoaXMuYW5uYUZpbHRlclNlcnZpY2Uuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZihpc0ZpbHRlckNoYW5nZWQpe1xyXG4gICAgICAgIHRoaXMuY2hlY2tJZlNvcnRpbmdJc0FwcGxpZWQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZihpc0ZpbHRlckNoYW5nZWQpe1xyXG4gICAgICB0aGlzLmNoZWNrSWZTb3J0aW5nSXNBcHBsaWVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYoaXNGaWx0ZXJDaGFuZ2VkICYmIGlzU29ydENoYW5nZWQpe1xyXG4gICAgICB0aGlzLmZpbHRlckFwcGxpZWRUb1RhYmxlLmVtaXQodGhpcy50YWJsZURhdGEpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZihpc0ZpbHRlckNoYW5nZWQpe1xyXG4gICAgICB0aGlzLmZpbHRlckFwcGxpZWRUb1RhYmxlLmVtaXQodGhpcy50YWJsZURhdGEpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZihpc1NvcnRDaGFuZ2VkKXtcclxuICAgICAgdGhpcy5zb3J0aW5nQXBwbGllZFRvVGFibGUuZW1pdCh0aGlzLnRhYmxlRGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jbG9zZVRvb2x0aXAoKTtcclxuICAgIFxyXG4gIH1cclxuXHJcbiAgYXBwbHlXZWVrRmlsdGVyKGV2ZW50OiBhbnkpIHtcclxuXHJcbiAgfVxyXG5cclxuICBpbmNyZW1lbnRIb3VyKGFycjogYW55W10pIHtcclxuICAgIGlmIChhcnJbMF0gPT0gXCJcIikge1xyXG4gICAgICBhcnJbMF0gPSAxO1xyXG4gICAgfSBlbHNlIGlmIChwYXJzZUludChhcnJbMF0pIDwgMTIpIHtcclxuICAgICAgYXJyWzBdID0gcGFyc2VJbnQoYXJyWzBdKSArIDE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhcnJbMF0gPSAxO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGVjcmVtZW50SG91cihhcnI6IGFueVtdKSB7XHJcbiAgICBpZiAoYXJyWzBdID09IFwiXCIpIHtcclxuICAgICAgYXJyWzBdID0gMTI7XHJcbiAgICB9IGVsc2UgaWYgKHBhcnNlSW50KGFyclswXSkgPiAxKSB7XHJcbiAgICAgIGFyclswXSA9IHBhcnNlSW50KGFyclswXSkgLSAxO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYXJyWzBdID0gMTI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbmNyZW1lbnRNaW51dGUoYXJyOiBhbnlbXSkge1xyXG4gICAgYXJyWzFdID0gcGFyc2VJbnQoYXJyWzFdKSArIDE1O1xyXG4gICAgaWYgKHBhcnNlSW50KGFyclsxXSkgPT0gNjApIHtcclxuICAgICAgICBhcnJbMV0gPSBcIjAwXCI7XHJcbiAgICB9IGVsc2UgaWYgKHBhcnNlSW50KGFyclsxXSkgPT0gMCkge1xyXG4gICAgICAgIGFyclsxXSA9IFwiMDBcIjtcclxuICAgIH1cclxuICAgIGVsc2UgaWYocGFyc2VJbnQoYXJyWzFdKSA+IDYwKXtcclxuICAgICAgICBsZXQgcmVzID0gcGFyc2VJbnQoYXJyWzFdKSAtIDYwO1xyXG4gICAgICAgIGFyclsxXSA9IHJlcyA8IDEwID8gYDAke3Jlc31gIDogcmVzLnRvU3RyaW5nKCk7ICAgIFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGVjcmVtZW50TWludXRlKGFycjogYW55KSB7XHJcbiAgICBhcnJbMV0gPSBwYXJzZUludChhcnJbMV0pIC0gMTU7XHJcbiAgICBpZiAocGFyc2VJbnQoYXJyWzFdKSA8IDApIHtcclxuICAgICAgICBsZXQgcmVzID0gNjAgKyBwYXJzZUludChhcnJbMV0pO1xyXG4gICAgICAgIGFyclsxXSA9IHJlcztcclxuICAgIH0gZWxzZSBpZiAocGFyc2VJbnQoYXJyWzFdKSA9PSAwKSB7XHJcbiAgICAgICAgYXJyWzFdID0gXCIwMFwiO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZihhcnJbMV0gPCAxMCl7XHJcbiAgICAgICAgYXJyWzFdPSBgMCR7YXJyWzFdfWA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VTdGFydFRpbWVIb3VyKGluY3JlbWVudDogYm9vbGVhbikge1xyXG4gICAgaWYgKGluY3JlbWVudCkge1xyXG4gICAgICB0aGlzLmluY3JlbWVudEhvdXIodGhpcy5zZWxlY3RlZEZyb21UaW1lKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGVjcmVtZW50SG91cih0aGlzLnNlbGVjdGVkRnJvbVRpbWUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdGFydFRpbWVIb3VyQ2hhbmdlKHRoaXMuc2VsZWN0ZWRGcm9tVGltZVswXS50b1N0cmluZygpKTtcclxuICAgIC8vIHRoaXMuZGlzYWJsZVRpbWVGaWx0ZXJBcHBseUJ1dHRvbigpO1xyXG4gIH1cclxuXHJcbiAgY2hhbmdlRW5kVGltZUhvdXIoaW5jcmVtZW50OiBib29sZWFuKSB7XHJcbiAgICBpZiAoaW5jcmVtZW50KSB7XHJcbiAgICAgIHRoaXMuaW5jcmVtZW50SG91cih0aGlzLnNlbGVjdGVkVG9UaW1lKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGVjcmVtZW50SG91cih0aGlzLnNlbGVjdGVkVG9UaW1lKTtcclxuICAgIH1cclxuICAgIHRoaXMuZW5kVGltZUhvdXJDaGFuZ2UodGhpcy5zZWxlY3RlZFRvVGltZVswXS50b1N0cmluZygpKTtcclxuICAgIC8vIHRoaXMuZGlzYWJsZVRpbWVGaWx0ZXJBcHBseUJ1dHRvbigpO1xyXG4gIH1cclxuXHJcbiAgY2hhbmdlRW5kVGltZU1pbnV0ZShpbmNyZW1lbnQ6IGJvb2xlYW4pIHtcclxuICAgIGlmIChpbmNyZW1lbnQpIHtcclxuICAgICAgdGhpcy5pbmNyZW1lbnRNaW51dGUodGhpcy5zZWxlY3RlZFRvVGltZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRlY3JlbWVudE1pbnV0ZSh0aGlzLnNlbGVjdGVkVG9UaW1lKTtcclxuICAgIH1cclxuICAgIHRoaXMuZW5kVGltZU1pbkNoYW5nZSh0aGlzLnNlbGVjdGVkVG9UaW1lWzFdLnRvU3RyaW5nKCkpO1xyXG4gICAgLy8gdGhpcy5kaXNhYmxlVGltZUZpbHRlckFwcGx5QnV0dG9uKCk7XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VTdGFydFRpbWVNaW51dGUoaW5jcmVtZW50OiBib29sZWFuKSB7XHJcbiAgICBpZiAoaW5jcmVtZW50KSB7XHJcbiAgICAgIHRoaXMuaW5jcmVtZW50TWludXRlKHRoaXMuc2VsZWN0ZWRGcm9tVGltZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRlY3JlbWVudE1pbnV0ZSh0aGlzLnNlbGVjdGVkRnJvbVRpbWUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdGFydFRpbWVNaW5DaGFuZ2UodGhpcy5zZWxlY3RlZEZyb21UaW1lWzFdLnRvU3RyaW5nKCkpO1xyXG4gICAgLy8gdGhpcy5kaXNhYmxlVGltZUZpbHRlckFwcGx5QnV0dG9uKCk7XHJcbiAgfVxyXG5cclxuICBhcHBseVRpbWVGaWx0ZXJzKCkge1xyXG5cclxuICAgIGxldCBpc0ZpbHRlckNoYW5nZWQgPSBmYWxzZTtcclxuICAgIGxldCBpc1NvcnRDaGFuZ2VkID0gZmFsc2U7XHJcblxyXG4gICAgaWYodGhpcy5zaG93RmlsdGVyQ29tcG9uZW50KXtcclxuICAgICAgbGV0IGN1cnJlbnRTZWxlY3RlZFRpbWVGaWx0ZXI6IHtmcm9tVGltZTogc3RyaW5nLCB0b1RpbWU6c3RyaW5nLCBpbmNsdWRlTXVsdGk6IGJvb2xlYW4sIGluY2x1ZGVaZXJvOiBib29sZWFuLCBpbmNsdWRlVGltZVJhbmdlOiBib29sZWFufSA9IHtcclxuICAgICAgICBmcm9tVGltZTogbnVsbCxcclxuICAgICAgICB0b1RpbWU6IG51bGwsXHJcbiAgICAgICAgaW5jbHVkZU11bHRpOiBmYWxzZSxcclxuICAgICAgICBpbmNsdWRlWmVybzogZmFsc2UsXHJcbiAgICAgICAgaW5jbHVkZVRpbWVSYW5nZTogZmFsc2UsXHJcbiAgICAgIH07XHJcbiAgXHJcbiAgICAgIGxldCBwcmV2aW91c1NlbGVjdGVkVGltZUZpbHRlcjtcclxuICBcclxuICAgICAgaWYodGhpcy5hbm5hRmlsdGVyU2VydmljZS50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuYW5uYUZpbHRlclNlcnZpY2Uuc2VsZWN0ZWRSYWRpbykpe1xyXG4gICAgICAgIHByZXZpb3VzU2VsZWN0ZWRUaW1lRmlsdGVyID0gdGhpcy5hbm5hRmlsdGVyU2VydmljZS50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuYW5uYUZpbHRlclNlcnZpY2Uuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZih0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLmluaXRpYWxWYWx1ZU1hcC5oYXModGhpcy5hbm5hRmlsdGVyU2VydmljZS5zZWxlY3RlZFJhZGlvKSl7XHJcbiAgICAgICAgcHJldmlvdXNTZWxlY3RlZFRpbWVGaWx0ZXIgPSB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5hbm5hRmlsdGVyU2VydmljZS5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgfVxyXG4gIFxyXG4gICAgICBsZXQgZnJvbVRpbWUyNEhyRm9ybWF0QXJyID0gdGhpcy5hbm5hRGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb3R3ZW50eUZvdXJIcnNGb3JtYXQoXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZyb21UaW1lWzBdICsgXCI6XCIgKyB0aGlzLnNlbGVjdGVkRnJvbVRpbWVbMV0gKyBcIiBcIiArIHRoaXMuc2VsZWN0ZWRGcm9tVGltZVsyXSxcclxuICAgICAgICB0cnVlXHJcbiAgICAgICk7XHJcbiAgICAgIGxldCBmcm9tVGltZTI0SHJGb3JtYXQgPSBmcm9tVGltZTI0SHJGb3JtYXRBcnJbMF0gKyBcIjpcIiArIGZyb21UaW1lMjRIckZvcm1hdEFyclsxXSArIFwiOjAwXCI7XHJcbiAgICAgIGxldCB0b1RpbWUyNEhyRm9ybWF0QXJyID0gdGhpcy5hbm5hRGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb3R3ZW50eUZvdXJIcnNGb3JtYXQoXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRvVGltZVswXSArIFwiOlwiICsgdGhpcy5zZWxlY3RlZFRvVGltZVsxXSArIFwiIFwiICsgdGhpcy5zZWxlY3RlZFRvVGltZVsyXSxcclxuICAgICAgICB0cnVlXHJcbiAgICAgICk7XHJcbiAgICAgIGxldCB0b1RpbWUyNEhyRm9ybWF0ID0gdG9UaW1lMjRIckZvcm1hdEFyclswXSArIFwiOlwiICsgdG9UaW1lMjRIckZvcm1hdEFyclsxXSArIFwiOjAwXCI7XHJcbiAgXHJcbiAgICAgIGN1cnJlbnRTZWxlY3RlZFRpbWVGaWx0ZXIgPSB7IGZyb21UaW1lOiBmcm9tVGltZTI0SHJGb3JtYXQsIHRvVGltZTogdG9UaW1lMjRIckZvcm1hdCwgaW5jbHVkZU11bHRpOiB0aGlzLm11bHRpVGltZUNoZWNrYm94Q2hlY2tlZCwgXHJcbiAgICAgIGluY2x1ZGVaZXJvOiB0aGlzLnplcm9UaW1lQ2hlY2tib3hDaGVja2VkLCBpbmNsdWRlVGltZVJhbmdlOiB0aGlzLmVudGVyVGltZUNoZWNrYm94Q2hlY2tlZH07XHJcbiAgICAgIFxyXG4gICAgICBpc0ZpbHRlckNoYW5nZWQgPSAhaXNFcXVhbChwcmV2aW91c1NlbGVjdGVkVGltZUZpbHRlciwgY3VycmVudFNlbGVjdGVkVGltZUZpbHRlcik7XHJcblxyXG4gIFxyXG4gICAgICBpZihpc0ZpbHRlckNoYW5nZWQpe1xyXG4gICAgICAgIGxldCBpc0ZpbHRlcmVkID0gdGhpcy5hbm5hRmlsdGVyU2VydmljZS5yZU9yZGVyQXBwbGllZEZpbHRlcnNTdGF0ZSh0aGlzLmNsb25lZFRhYmxlRGF0YSxjdXJyZW50U2VsZWN0ZWRUaW1lRmlsdGVyKTtcclxuICAgICAgICB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnRvb2x0aXBTZWxlY3RlZE1hcC5zZXQodGhpcy5hbm5hRmlsdGVyU2VydmljZS5zZWxlY3RlZFJhZGlvLGN1cnJlbnRTZWxlY3RlZFRpbWVGaWx0ZXIpO1xyXG4gICAgICAgIHRoaXMudGFibGVEYXRhID0gdGhpcy5hbm5hRmlsdGVyU2VydmljZS5maWx0ZXJEYXRhKHRoaXMuY2xvbmVkVGFibGVEYXRhLCBcIlwiKTtcclxuICAgICAgICBcclxuICAgICAgICBpZighaXNGaWx0ZXJlZCl7XHJcbiAgICAgICAgICB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLnRvb2x0aXBTZWxlY3RlZE1hcC5kZWxldGUodGhpcy5hbm5hRmlsdGVyU2VydmljZS5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2Uubm9Tb3J0aW5nQXBwbGllZERhdGEgPSBjbG9uZURlZXAodGhpcy50YWJsZURhdGEpO1xyXG4gICAgICAgIHRoaXMuZGlzYWJsZUVuYWJsZUVhY2hDb2x1bW5Ub29sdGlwSWNvbigpOyAgICAgICAgICAgIFxyXG4gICAgICB9XHJcblxyXG4gICAgICBcclxuICBcclxuICAgIH1cclxuXHJcblxyXG4gICAgaWYodGhpcy5zaG93U29ydENvbXBvbmVudCl7XHJcbiAgICAgIGlzU29ydENoYW5nZWQgPSAodGhpcy50ZW1wU29ydE9yZGVyICE9IG51bGwgJiYgdGhpcy50ZW1wU29ydE9yZGVyICE9IHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5nZXQodGhpcy5hbm5hRmlsdGVyU2VydmljZS5zZWxlY3RlZFJhZGlvKSk7ICBcclxuICAgICAgaWYoaXNTb3J0Q2hhbmdlZCl7XHJcbiAgICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5lbnRyaWVzKCkpIHtcclxuICAgICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5zZXQoa2V5LCBcIkRFRkFVTFRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5zZXQodGhpcy5hbm5hRmlsdGVyU2VydmljZS5zZWxlY3RlZFJhZGlvLCB0aGlzLnRlbXBTb3J0T3JkZXIpO1xyXG4gICAgICAgIHRoaXMuYXBwbHlTb3J0aW5nKHRoaXMuYW5uYUZpbHRlclNlcnZpY2Uuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZihpc0ZpbHRlckNoYW5nZWQpe1xyXG4gICAgICAgIHRoaXMuY2hlY2tJZlNvcnRpbmdJc0FwcGxpZWQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZihpc0ZpbHRlckNoYW5nZWQpe1xyXG4gICAgICB0aGlzLmNoZWNrSWZTb3J0aW5nSXNBcHBsaWVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYoaXNGaWx0ZXJDaGFuZ2VkICYmIGlzU29ydENoYW5nZWQpe1xyXG4gICAgICB0aGlzLmZpbHRlckFwcGxpZWRUb1RhYmxlLmVtaXQodGhpcy50YWJsZURhdGEpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZihpc0ZpbHRlckNoYW5nZWQpe1xyXG4gICAgICB0aGlzLmZpbHRlckFwcGxpZWRUb1RhYmxlLmVtaXQodGhpcy50YWJsZURhdGEpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZihpc1NvcnRDaGFuZ2VkKXtcclxuICAgICAgdGhpcy5zb3J0aW5nQXBwbGllZFRvVGFibGUuZW1pdCh0aGlzLnRhYmxlRGF0YSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHRoaXMuY2xvc2VUb29sdGlwKCk7XHJcblxyXG4gIH1cclxuXHJcbiAgY2xvc2VUaW1lRmlsdGVyKCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZEZyb21UaW1lID0gY2xvbmVEZWVwKHRoaXMuY2xvbmVkU2VsZWN0ZWRGcm9tVGltZSk7XHJcbiAgICB0aGlzLnNlbGVjdGVkVG9UaW1lID0gY2xvbmVEZWVwKHRoaXMuY2xvbmVkU2VsZWN0ZWRUb1RpbWUpO1xyXG4gICAgdGhpcy5jbG9zZVRvb2x0aXAoKTtcclxuICB9XHJcblxyXG4gIGRpc2FibGVUaW1lRmlsdGVyQXBwbHlCdXR0b24oKSB7XHJcbiAgICBsZXQgdGltZUZvcm1hdCA9IFwiSEg6bW06c3NcIjtcclxuXHJcbiAgICBsZXQgc3RhcnRUaW1lMjRIckZvcm1hdEFyciA9IHRoaXMuYW5uYURhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG90d2VudHlGb3VySHJzRm9ybWF0KFxyXG4gICAgICB0aGlzLnNlbGVjdGVkRnJvbVRpbWVbMF0gKyBcIjpcIiArIHRoaXMuc2VsZWN0ZWRGcm9tVGltZVsxXSArIFwiIFwiICsgdGhpcy5zZWxlY3RlZEZyb21UaW1lWzJdLFxyXG4gICAgICB0cnVlXHJcbiAgICApO1xyXG4gICAgbGV0IHN0YXJ0VGltZTI0SHJGb3JtYXQgPSBzdGFydFRpbWUyNEhyRm9ybWF0QXJyWzBdICsgXCI6XCIgKyBzdGFydFRpbWUyNEhyRm9ybWF0QXJyWzFdICsgXCI6MDBcIjtcclxuICAgIGxldCBlbmRUaW1lMjRIckZvcm1hdEFyciA9IHRoaXMuYW5uYURhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG90d2VudHlGb3VySHJzRm9ybWF0KFxyXG4gICAgICB0aGlzLnNlbGVjdGVkVG9UaW1lWzBdICsgXCI6XCIgKyB0aGlzLnNlbGVjdGVkVG9UaW1lWzFdICsgXCIgXCIgKyB0aGlzLnNlbGVjdGVkVG9UaW1lWzJdLFxyXG4gICAgICB0cnVlXHJcbiAgICApO1xyXG4gICAgbGV0IGVuZFRpbWUyNEhyRm9ybWF0ID0gZW5kVGltZTI0SHJGb3JtYXRBcnJbMF0gKyBcIjpcIiArIGVuZFRpbWUyNEhyRm9ybWF0QXJyWzFdICsgXCI6MDBcIjtcclxuXHJcbiAgICB0aGlzLmRpc2FibGVUaW1lRmlsdGVyQXBwbHlCdG4gPSBtb21lbnQoc3RhcnRUaW1lMjRIckZvcm1hdCwgdGltZUZvcm1hdCkuaXNBZnRlcihtb21lbnQoZW5kVGltZTI0SHJGb3JtYXQsIHRpbWVGb3JtYXQpKTtcclxuXHJcbiAgICBpZiAoIXRoaXMubXVsdGlUaW1lQ2hlY2tib3hDaGVja2VkICYmICF0aGlzLnplcm9UaW1lQ2hlY2tib3hDaGVja2VkICYmICF0aGlzLmVudGVyVGltZUNoZWNrYm94Q2hlY2tlZCkge1xyXG4gICAgICB0aGlzLmRpc2FibGVUaW1lRmlsdGVyQXBwbHlCdG4gPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc29ydGVkRGF0YShldmVudDogYW55KSB7XHJcbiAgICBpZiAoZXZlbnQudHlwZSA9PSBcIm5vbmVcIikge1xyXG4gICAgICB0aGlzLnRhYmxlRGF0YSA9IHRoaXMuYW5uYUZpbHRlclNlcnZpY2UuZmlsdGVyRGF0YSh0aGlzLmNsb25lZFRhYmxlRGF0YSwgXCJcIik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnRhYmxlRGF0YSA9IGV2ZW50LmRhdGE7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNvcnRpbmdBcHBsaWVkVG9UYWJsZS5lbWl0KHRoaXMudGFibGVEYXRhKTtcclxuICAgIC8vIHRoaXMuZ2VuZXJhdGVUYWJsZURhdGFXcmFwcGVyKCk7XHJcbiAgfVxyXG5cclxuICBjaGVja0lmU29ydGluZ0lzQXBwbGllZCgpIHtcclxuICAgIGZvcihsZXQgW2tleSx2YWx1ZV0gb2YgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlLmVudHJpZXMoKSl7XHJcbiAgICAgIGlmKHZhbHVlID09IFwiQVNDXCIpe1xyXG4gICAgICAgICAgdGhpcy50YWJsZURhdGEgPSBjbG9uZURlZXAodGhpcy5hbm5hU29ydFNlcnZpY2Uuc29ydERhdGFGb3JDb21wb25lbnRPdGhlclRoYW5MdXJBbmRDc3JQYWdlKHRydWUsdGhpcy50YWJsZURhdGEsa2V5KSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZih2YWx1ZSA9PSBcIkRFU0NcIil7XHJcbiAgICAgICAgICB0aGlzLnRhYmxlRGF0YSA9IGNsb25lRGVlcCh0aGlzLmFubmFTb3J0U2VydmljZS5zb3J0RGF0YUZvckNvbXBvbmVudE90aGVyVGhhbkx1ckFuZENzclBhZ2UoZmFsc2UsdGhpcy50YWJsZURhdGEsa2V5KSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGFwcGx5U29ydGluZyhzb3J0Q29tcG9uZW50QXJyOiBBbm5hU29ydENvbXBvbmVudFtdLCBhcHBsaWVkS2V5OiBzdHJpbmcsIGlzQXNjOiBib29sZWFuKSB7XHJcbiAgLy8gICBzb3J0Q29tcG9uZW50QXJyLmZvckVhY2goKGNvbXBvbmVudCkgPT4ge1xyXG4gIC8vICAgICBpZiAoY29tcG9uZW50LnNvcnRCeSA9PT0gYXBwbGllZEtleSkge1xyXG4gIC8vICAgICAgIHRoaXMuc2V0U29ydENvbXBvbmVudERhdGFQcm9wZXJ0eShjb21wb25lbnQpO1xyXG4gIC8vICAgICAgIGlzQXNjID8gY29tcG9uZW50LnNvcnRCeUFzY2VuZGluZygpIDogY29tcG9uZW50LnNvcnRCeURlc2NlbmRpbmcoKTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfSk7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBzZXRTb3J0Q29tcG9uZW50RGF0YVByb3BlcnR5KHNvcnRDb21wb25lbnQ6IEFubmFTb3J0Q29tcG9uZW50KSB7XHJcbiAgLy8gICBzb3J0Q29tcG9uZW50LmRhdGEgPSB0aGlzLnRhYmxlRGF0YTtcclxuICAvLyAgIHNvcnRDb21wb25lbnQuY2xvbmVkRGF0YSA9IGNsb25lRGVlcCh0aGlzLnRhYmxlRGF0YSk7XHJcbiAgLy8gfVxyXG5cclxuICBkaXNhYmxlRW5hYmxlRWFjaENvbHVtblRvb2x0aXBJY29uKCkge1xyXG4gICAgdGhpcy50YWJsZUhlYWRlcnMuZm9yRWFjaChoZWFkZXIgPT4ge1xyXG4gICAgICBcclxuICAgICAgaGVhZGVyLmhlYWRlckluZm8uZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpZiAoaXRlbS5zaG93VG9vbHRpcEljb24pIHtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgbGV0IHZhbHVlcyA9IFtdO1xyXG4gICAgICAgICAgaXRlbS5kaXNhYmxlVG9vbHRpcEljb24gPSB0cnVlO1xyXG5cclxuICAgICAgICAgIGl0ZW0uZmlsdGVyU29ydE9iamVjdEtleXMuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYoa2V5ID09IFwicGVyaW9kXCIpe1xyXG4gICAgICAgICAgICAgIGxldCB1bmlxU3RhcnREYXRlID0gdW5pcSh0aGlzLnRhYmxlRGF0YS5tYXAoKHU6IHsgW3g6IHN0cmluZ106IGFueTsgfSkgPT4gdVtcInN0YXJ0RGF0ZVwiXSkpO1xyXG4gICAgICAgICAgICAgIGxldCB1bmlxRW5kRGF0ZSA9IHVuaXEodGhpcy50YWJsZURhdGEubWFwKCh1OiB7IFt4OiBzdHJpbmddOiBhbnk7IH0pID0+IHVbXCJlbmREYXRlXCJdKSk7XHJcblxyXG4gICAgICAgICAgICAgIGl0ZW0uZGlzYWJsZVRvb2x0aXBJY29uID0gKHVuaXFTdGFydERhdGUubGVuZ3RoID4gMSB8fCB1bmlxRW5kRGF0ZS5sZW5ndGggPiAxKSA/IGZhbHNlIDogdHJ1ZTsgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICB2YWx1ZXMgPSB0aGlzLnRhYmxlRGF0YS5tYXAoKHU6IHsgW3g6IHN0cmluZ106IGFueTsgfSkgPT4gdVtrZXldKTtcclxuICAgICAgICAgICAgICBpZih1bmlxKHZhbHVlcykuZmlsdGVyKG4gPT4gbiE9bnVsbCkubGVuZ3RoID4gMSl7XHJcbiAgICAgICAgICAgICAgICBpdGVtLmRpc2FibGVUb29sdGlwSWNvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5hbm5hR2VuZXJpY1RhYmxlU2VydmljZS52aXJ0dWFsU2Nyb2xsU3ViamVjdC5zdWJzY3JpYmUoKHZhbCkgPT57XHJcbiAgICAgIHRoaXMuaXNTY3JvbGxlZExlZnQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiYW5uYS10YWJsZS12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydFwiKVswXS5zY3JvbGxMZWZ0ID4gMDtcclxuICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBzZXRNYXJnaW5MZWZ0Rm9yRmlsdGVySWNvbigpe1xyXG4gICAgbGV0IGVsZW1lbnRBcnIgPSB0aGlzLnZpZXdDaGlsZFRhYmxlSGVhZGVycy50b0FycmF5KCk7XHJcbiAgICBlbGVtZW50QXJyLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgbGV0IGNoaWxkRGl2RWxlbWVudHMgPSBpdGVtLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW47XHJcbiAgICAgIFxyXG4gICAgICBpZiAoY2hpbGREaXZFbGVtZW50cy5sZW5ndGggPT0gMikge1xyXG4gICAgICAgIGxldCBmaXJzdFBhcmFncmFwaFdpZHRoID0gY2hpbGREaXZFbGVtZW50c1swXS5jaGlsZHJlblswXTtcclxuICAgICAgICBsZXQgc2Vjb25kUGFyYWdyYXBoV2lkdGggPSBjaGlsZERpdkVsZW1lbnRzWzFdLmNoaWxkcmVuWzBdO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmKGZpcnN0UGFyYWdyYXBoV2lkdGgub2Zmc2V0V2lkdGggPiBzZWNvbmRQYXJhZ3JhcGhXaWR0aC5vZmZzZXRXaWR0aCl7XHJcbiAgICAgICAgICBsZXQgZGlmZiA9IGZpcnN0UGFyYWdyYXBoV2lkdGgub2Zmc2V0V2lkdGggLSBzZWNvbmRQYXJhZ3JhcGhXaWR0aC5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgIGlmKGNoaWxkRGl2RWxlbWVudHNbMF0uY2hpbGRyZW4ubGVuZ3RoID09IDIpe1xyXG4gICAgICAgICAgICBjaGlsZERpdkVsZW1lbnRzWzBdLmNoaWxkcmVuWzFdLnN0eWxlLm1hcmdpbkxlZnQgPSA0ICsgJ3B4JztcclxuICAgICAgICAgIH1cclxuICBcclxuICAgICAgICAgIGlmKGNoaWxkRGl2RWxlbWVudHNbMV0uY2hpbGRyZW4ubGVuZ3RoID09IDIpe1xyXG5cclxuICAgICAgICAgICAgY2hpbGREaXZFbGVtZW50c1sxXS5jaGlsZHJlblsxXS5zdHlsZS5tYXJnaW5MZWZ0ID0gZGlmZiArIDQgKyAncHgnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNle1xyXG4gICAgICAgICAgbGV0IGRpZmYgPSBzZWNvbmRQYXJhZ3JhcGhXaWR0aC5vZmZzZXRXaWR0aCAtIGZpcnN0UGFyYWdyYXBoV2lkdGgub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICBpZihjaGlsZERpdkVsZW1lbnRzWzBdLmNoaWxkcmVuLmxlbmd0aCA9PSAyKXtcclxuICAgICAgICAgICAgY2hpbGREaXZFbGVtZW50c1swXS5jaGlsZHJlblsxXS5zdHlsZS5tYXJnaW5MZWZ0ID0gZGlmZiArIDQgKyAncHgnO1xyXG4gICAgICAgICAgfVxyXG4gIFxyXG4gICAgICAgICAgaWYoY2hpbGREaXZFbGVtZW50c1sxXS5jaGlsZHJlbi5sZW5ndGggPT0gMil7XHJcblxyXG4gICAgICAgICAgICBjaGlsZERpdkVsZW1lbnRzWzFdLmNoaWxkcmVuWzFdLnN0eWxlLm1hcmdpbkxlZnQgPSA0ICsgJ3B4JztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZGF0YVJvd0NsaWNrZWQocm93RGF0YTogYW55KSB7XHJcbiAgICB0aGlzLnJvd0NsaWNrZWQuZW1pdChyb3dEYXRhKTtcclxuICB9XHJcblxyXG4gIHJhZGlvQnV0dG9uQ2xpY2tlZChkYXRhOiBhbnksIGFjdGlvbjogc3RyaW5nLCBpc0Rpc2FibGVkOiBib29sZWFuKSB7XHJcbiAgICBpZiAoIWlzRGlzYWJsZWQpIHtcclxuICAgICAgdGhpcy5yYWRpb0J1dHRvblNlbGVjdGVkLmVtaXQoeyBkYXRhLCBhY3Rpb24gfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBiaW5kVGhlVmFsdWVUb1NlbGxlckdyb3VwVG9vbHRpcChzZWxsZXJHcm91cEhpZXJhcmNoeTogU2VsbGVyR3JvdXBIaWVyYXJjaHlbXSwgdG9vbHRpcDogYW55KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5oaWVyYXJjaHlUb29sdGlwICYmIHRoaXMuaGllcmFyY2h5VG9vbHRpcC5vcGVuKSB7XHJcbiAgICAgIHRoaXMuaGllcmFyY2h5VG9vbHRpcC5jbG9zZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZWxsZXJHcm91cEhpZXJhcmNoeSA9IHNlbGxlckdyb3VwSGllcmFyY2h5O1xyXG4gICAgdGhpcy5oaWVyYXJjaHlUb29sdGlwID0gdG9vbHRpcDtcclxuICAgIHRoaXMuaGllcmFyY2h5VG9vbHRpcC5vcGVuKCk7XHJcbiAgfVxyXG5cclxuICBpY29uQ2xpY2tlZChyb3dEYXRhOiBhbnksaWNvbkNsYXNzOiBzdHJpbmcpe1xyXG4gICAgdGhpcy5ndEljb25DbGlja2VkLmVtaXQoe2RhdGE6IHJvd0RhdGEsaWNvbkNsYXNzOiBpY29uQ2xhc3N9KTtcclxuICB9XHJcblxyXG4gIHN2Z0ljb25DbGlja2VkKHJvd0RhdGE6IGFueSxrZXk6IHN0cmluZyl7XHJcbiAgICB0aGlzLmd0U1ZHSWNvbkNsaWNrZWQuZW1pdCh7ZGF0YTogcm93RGF0YSxrZXk6IGtleX0pO1xyXG4gIH1cclxuXHJcbiAgdGV4dEFjdGlvbkNsaWNrZWQocm93RGF0YTogYW55LGlkOiBudW1iZXIpe1xyXG4gICAgdGhpcy5ndFRleHRBY3Rpb25DbGlja2VkLmVtaXQoe2RhdGE6cm93RGF0YSxpZH0pO1xyXG4gIH1cclxuXHJcbiAgdmlld0RldGFpbHNDbGlja2VkKHJvd0RhdGE6IGFueSl7XHJcbiAgICB0aGlzLmd0Vmlld0RldGFpbENsaWNrZWQuZW1pdCh7ZGF0YTpyb3dEYXRhfSk7XHJcbiAgfVxyXG5cclxuICBzZXRDb2x1bW5Tb3J0U3RhdGVNYXAoKXtcclxuICAgIGNvbnNvbGUubG9nKFwic2V0IGNvbHVtbiBzb3J0IHN0YXRlIG1hcFwiKTtcclxuICAgIHRoaXMudGFibGVIZWFkZXJzLmZvckVhY2goY29sdW1uID0+IHtcclxuICAgICAgICBjb2x1bW4uaGVhZGVySW5mby5mb3JFYWNoKCAoaGVhZGVyKSA9PiB7XHJcbiAgICAgICAgICAgIGlmKGhlYWRlci5zaG93VG9vbHRpcEljb24gJiYgaGVhZGVyLmlzU29ydFJlcXVpcmVkKXtcclxuICAgICAgICAgICAgICAgIGhlYWRlci5pc1NvcnRSZXF1aXJlZC5mb3JFYWNoKCAoaXRlbSxpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZihpdGVtKXtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUuc2V0KGhlYWRlci5maWx0ZXJTb3J0T2JqZWN0S2V5c1tpbmRleF0sIFwiREVGQVVMVFwiKTsgIFxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc3RvcmVTb3J0VHlwZUluVGVtcFZhcmlhYmxlKGV2ZW50OiBTb3J0VHlwZSl7XHJcbiAgICB0aGlzLnRlbXBTb3J0T3JkZXIgPSBldmVudDtcclxuICB9XHJcblxyXG4gIHVuQ2hlY2tBbGxDaGVja2JveCgpe1xyXG4gICAgICB0aGlzLnRvb2x0aXBPcHRpb25zLmZvckVhY2goaXRlbSA9PiBpdGVtLmlzU2VsZWN0ZWQgPSBmYWxzZSk7XHJcbiAgICAgIHRoaXMuZGlzYWJsZVNlbGVjdEFsbCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmRpc2FibGVDbGVhckFsbCA9IHRydWU7XHJcbiAgICAgIHRoaXMuZGlzYWJsZUNoZWNrYm94QXBwbHkgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0QWxsQ2hlY2tib3goKXtcclxuICAgICAgdGhpcy50b29sdGlwT3B0aW9ucy5mb3JFYWNoKGl0ZW0gPT4gaXRlbS5pc1NlbGVjdGVkID0gdHJ1ZSk7XHJcbiAgICAgIHRoaXMuZGlzYWJsZVNlbGVjdEFsbCA9IHRydWU7XHJcbiAgICAgIHRoaXMuZGlzYWJsZUNsZWFyQWxsID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuZGlzYWJsZUNoZWNrYm94QXBwbHkgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHNlYXJjaEZvclRoZUl0ZW0oc3RyOiBzdHJpbmcpe1xyXG4gICAgICBpZihzdHIpe1xyXG4gICAgICAgICAgdGhpcy50b29sdGlwT3B0aW9ucyA9IGNsb25lRGVlcCh0aGlzLmNsb25lZFRvb2x0aXBPcHRpb25zLmZpbHRlcihpdGVtID0+IGl0ZW0uZGF0YS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHN0ci50b0xvd2VyQ2FzZSgpKSkpO1xyXG4gICAgICAgICAgdGhpcy50b29sdGlwT3B0aW9ucy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICBlbGVtZW50LmRhdGEgPSB0aGlzLmJvbGRTdHJpbmcoZWxlbWVudC5kYXRhLHN0cik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgaWYodGhpcy50b29sdGlwT3B0aW9ucy5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICB0aGlzLnRvb2x0aXBPcHRpb25zLmZvckVhY2goaXRlbSA9PiBpdGVtLmlzU2VsZWN0ZWQgPSB0cnVlKTtcclxuICAgICAgICAgICAgICB0aGlzLmRpc2FibGVTZWxlY3RBbGwgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHRoaXMuZGlzYWJsZUNsZWFyQWxsID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlQ2hlY2tib3hBcHBseSA9IGZhbHNlO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICAgIHRoaXMuZGlzYWJsZUNoZWNrYm94QXBwbHkgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHRoaXMuZGlzYWJsZUNsZWFyQWxsID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB0aGlzLmRpc2FibGVTZWxlY3RBbGwgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2V7XHJcbiAgICAgICAgICB0aGlzLnRvb2x0aXBPcHRpb25zID0gY2xvbmVEZWVwKHRoaXMuY2xvbmVkVG9vbHRpcE9wdGlvbnMpO1xyXG4gICAgICAgICAgbGV0IHVuc2VsZWN0ZWRJdGVtcyA9IHRoaXMudG9vbHRpcE9wdGlvbnMuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uaXNTZWxlY3RlZCk7XHJcbiAgICAgICAgICBsZXQgc2VsZWN0ZWRJdGVtcyA9IHRoaXMudG9vbHRpcE9wdGlvbnMuZmlsdGVyKGl0ZW0gPT4gaXRlbS5pc1NlbGVjdGVkKTtcclxuICAgICAgICAgIHRoaXMuZGlzYWJsZVNlbGVjdEFsbCA9IHVuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPT0gMDtcclxuICAgICAgICAgIHRoaXMuZGlzYWJsZUNsZWFyQWxsID0gc2VsZWN0ZWRJdGVtcy5sZW5ndGggPT0gMDtcclxuICAgICAgfVxyXG4gIH1cclxuXHJcbiAgYm9sZFN0cmluZyhzdHI6IHN0cmluZywgZmluZDogc3RyaW5nKXtcclxuICAgIHZhciByZSA9IG5ldyBSZWdFeHAoZmluZCwgJ2cnKTtcclxuICAgIHJldHVybiBzdHIucmVwbGFjZShyZSwgJzxiPicrZmluZCsnPC9iPicpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlQm9sZEVsZW1lbnRGcm9tU3RyaW5nKG9yaWdpbmFsU3RyaW5nOiBzdHJpbmcpe1xyXG4gICAgICBsZXQgZmlyc3RSZWdFeHAgPSBuZXcgUmVnRXhwKCc8Yj4nLCdnJyk7XHJcbiAgICAgIGxldCBzZWNvbmRSZWdFeHAgPSBuZXcgUmVnRXhwKCc8L2I+JywnZycpO1xyXG5cclxuICAgICAgbGV0IHJldCA9IG9yaWdpbmFsU3RyaW5nLnJlcGxhY2UoZmlyc3RSZWdFeHAsJycpO1xyXG4gICAgICBjb25zb2xlLmxvZyhyZXQpO1xyXG4gICAgICBjb25zb2xlLmxvZyhyZXQucmVwbGFjZShzZWNvbmRSZWdFeHAsJycpKTtcclxuICAgICAgcmV0dXJuIHJldC5yZXBsYWNlKHNlY29uZFJlZ0V4cCwnJyk7XHJcbiAgfVxyXG5cclxuICBjbGVhclNlYXJjaGVkSXRlbSgpe1xyXG4gICAgICB0aGlzLnNlYXJjaEl0ZW0gPSBcIlwiO1xyXG4gICAgICB0aGlzLnNlYXJjaEZvclRoZUl0ZW0oXCJcIik7XHJcbiAgfVxyXG5cclxuICBjYWxlbmRhckRhdGVDaGFuZ2VkKGV2ZW50OiBhbnkpe1xyXG4gICAgdGhpcy5jYWxlbmRhclNlbGVjdGlvbiA9IGV2ZW50O1xyXG4gICAgdGhpcy5lbmFibGVEaXNhYmxlQ2FsZW5kYXJBcHBseUJ0bigpO1xyXG4gIH1cclxuXHJcbiAgZW5hYmxlRGlzYWJsZUNhbGVuZGFyQXBwbHlCdG4oKSB7XHJcbiAgICAgIHRoaXMuZGlzYWJsZUNhbGVuZGFyQXBwbHlCdG4gPSAhKHRoaXMuY2FsZW5kYXJTZWxlY3Rpb24uZnJvbURhdGUgJiYgdGhpcy5jYWxlbmRhclNlbGVjdGlvbi50b0RhdGUpO1xyXG4gIH1cclxuXHJcbiAgc2V0SW5pdGlhbFZhbHVlTWFwRm9yVGltZUZpbHRlcihrZXk6IHN0cmluZykge1xyXG4gICAgbGV0IGRhdGEgPSB0aGlzLmNsb25lZFRhYmxlRGF0YS5maWx0ZXIoXHJcbiAgICAgICAgKG9iaikgPT4gIVtcIlwiLCBcIi1cIiwgbnVsbCwgXCIwXCIsIFwiPG11bHRpPlwiXS5pbmNsdWRlcyhvYmpba2V5XSkpO1xyXG5cclxuICAgIGxldCB0aW1lQXJyID0gbWFwKGRhdGEsIGtleSk7XHJcbiAgICB0aW1lQXJyLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hbm5hRGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLnNvcnRCeVRpbWVBc2NlbmRpbmcoYSwgYik7XHJcbiAgICB9KTtcclxuICAgIFxyXG4gICAgbGV0IG9iaiA9IHtcclxuICAgICAgICBmcm9tVGltZTogdGltZUFyclswXSxcclxuICAgICAgICB0b1RpbWU6IHRpbWVBcnJbdGltZUFyci5sZW5ndGggLSAxXSxcclxuICAgICAgICBpbmNsdWRlTXVsdGk6IGZhbHNlLFxyXG4gICAgICAgIGluY2x1ZGVaZXJvOiBmYWxzZSxcclxuICAgICAgICBpbmNsdWRlVGltZVJhbmdlOiBmYWxzZVxyXG4gICAgfTtcclxuICAgIFxyXG4gICAgaWYgKFxyXG4gICAgICAgIHRoaXMuZ3RHZW5lcmFsQ29uZmlnLmNvbXBvbmVudCA9PT0gXCJTUE9UREVUQUlMU1wiIHx8XHJcbiAgICAgICAgdGhpcy5ndEdlbmVyYWxDb25maWcuY29tcG9uZW50ID09PSBcIkVYQ0xVREVJTlZFTlRPUllQT1BVUFwiXHJcbiAgICApIHtcclxuICAgICAgICBsZXQgaW5jbHVkZU11bHRpID1cclxuICAgICAgICAgICAgdGhpcy5jbG9uZWRUYWJsZURhdGEuZmluZEluZGV4KChvYmopID0+IG9ialtrZXldID09IFwiPG11bHRpPlwiKSAhPVxyXG4gICAgICAgICAgICAtMTtcclxuICAgICAgICBsZXQgaW5jbHVkZVplcm8gPVxyXG4gICAgICAgICAgICB0aGlzLmNsb25lZFRhYmxlRGF0YS5maW5kSW5kZXgoKG9iaikgPT4gb2JqW2tleV0gPT0gXCIwXCIpICE9IC0xO1xyXG4gICAgICAgIGxldCBpbmNsdWRlVGltZVJhbmdlID1cclxuICAgICAgICAgICAgdGhpcy5jbG9uZWRUYWJsZURhdGEuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAgICAgKG9iaikgPT4gb2JqW2tleV0gIT0gXCIwXCIgJiYgb2JqW2tleV0gIT0gXCI8bXVsdGk+XCJcclxuICAgICAgICAgICAgKSAhPSAtMTtcclxuICAgICAgICBcclxuICAgICAgICBsZXQgb2JqID0ge1xyXG4gICAgICAgICAgICBmcm9tVGltZTogdGltZUFyclswXSxcclxuICAgICAgICAgICAgdG9UaW1lOiB0aW1lQXJyW3RpbWVBcnIubGVuZ3RoIC0gMV0sXHJcbiAgICAgICAgICAgIGluY2x1ZGVNdWx0aTogaW5jbHVkZU11bHRpLFxyXG4gICAgICAgICAgICBpbmNsdWRlWmVybzogaW5jbHVkZVplcm8sXHJcbiAgICAgICAgICAgIGluY2x1ZGVUaW1lUmFuZ2U6IGluY2x1ZGVUaW1lUmFuZ2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLmluaXRpYWxWYWx1ZU1hcC5zZXQoa2V5LCBvYmopO1xyXG4gICAgfSBcclxuICAgIGVsc2UgaWYgKHRoaXMuZ3RHZW5lcmFsQ29uZmlnLmNvbXBvbmVudCA9PT0gXCJSQVRJTkdcIikge1xyXG4gICAgICAgIHRoaXMuc2V0SW5pdGlhbFZhbHVlTWFwRm9yUmF0aW5nUGFnZVRpbWVGaWx0ZXIoa2V5KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5hbm5hRmlsdGVyU2VydmljZS5pbml0aWFsVmFsdWVNYXAuc2V0KGtleSwgb2JqKTtcclxuICAgIH1cclxufVxyXG5cclxuc2V0SW5pdGlhbFZhbHVlTWFwRm9yUmF0aW5nUGFnZVRpbWVGaWx0ZXIoa2V5OiBzdHJpbmcpe1xyXG4gIGxldCBpbmNsdWRlTXVsdGkgPVxyXG4gICAgICAgICAgICB0aGlzLmNsb25lZFRhYmxlRGF0YS5maW5kSW5kZXgoKG9iaikgPT4gb2JqW2tleV1bMF0gPT0gXCI8bXVsdGk+XCIpICE9XHJcbiAgICAgICAgICAgIC0xO1xyXG4gICAgICAgIGxldCBpbmNsdWRlWmVybyA9XHJcbiAgICAgICAgICAgIHRoaXMuY2xvbmVkVGFibGVEYXRhLmZpbmRJbmRleCgob2JqKSA9PiBvYmpba2V5XVswXSA9PSBcIjBcIikgIT0gLTE7XHJcbiAgICAgICAgbGV0IGluY2x1ZGVUaW1lUmFuZ2UgPVxyXG4gICAgICAgICAgICB0aGlzLmNsb25lZFRhYmxlRGF0YS5maW5kSW5kZXgoXHJcbiAgICAgICAgICAgICAgICAob2JqKSA9PiBvYmpba2V5XVswXSAhPSBcIjBcIiAmJiBvYmpba2V5XVswXSAhPSBcIjxtdWx0aT5cIlxyXG4gICAgICAgICAgICApICE9IC0xO1xyXG5cclxuICAgICAgICBsZXQgc3RhcnRUaW1lQXJyID0gbWFwKHRoaXMuY2xvbmVkVGFibGVEYXRhLCBcInN0YXJ0VGltZVwiKTtcclxuICAgICAgICBsZXQgZW5kVGltZUFyciA9IG1hcCh0aGlzLmNsb25lZFRhYmxlRGF0YSwgXCJlbmRUaW1lXCIpO1xyXG5cclxuICAgICAgICBzdGFydFRpbWVBcnIuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hbm5hRGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLnNvcnRCeVRpbWVBc2NlbmRpbmcoYSwgYik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGVuZFRpbWVBcnIuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hbm5hRGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLnNvcnRCeVRpbWVEZXNjZW5kaW5nKGEsIGIpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsZXQgb2JqID0ge1xyXG4gICAgICAgICAgICBmcm9tVGltZTogc3RhcnRUaW1lQXJyWzBdLFxyXG4gICAgICAgICAgICB0b1RpbWU6IGVuZFRpbWVBcnJbMF0sXHJcbiAgICAgICAgICAgIGluY2x1ZGVNdWx0aTogaW5jbHVkZU11bHRpLFxyXG4gICAgICAgICAgICBpbmNsdWRlWmVybzogaW5jbHVkZVplcm8sXHJcbiAgICAgICAgICAgIGluY2x1ZGVUaW1lUmFuZ2U6IGluY2x1ZGVUaW1lUmFuZ2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmFubmFGaWx0ZXJTZXJ2aWNlLmluaXRpYWxWYWx1ZU1hcC5zZXQoa2V5LCBvYmopOyBcclxuICAgIH1cclxuXHJcbiAgICBzdGFydFRpbWVIb3VyQ2hhbmdlKHZhbDogc3RyaW5nKXtcclxuICAgICAgICBpZih2YWwubGVuZ3RoID09IDAgfHwgMSA+IHBhcnNlSW50KHZhbCkgfHwgcGFyc2VJbnQodmFsKSA+IDEyKXtcclxuICAgICAgICAgICAgdGhpcy5zdGFydFRpbWVIb3VyRXJyID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgdGhpcy5zdGFydFRpbWVIb3VyRXJyID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZGlzYWJsZVRpbWVGaWx0ZXJBcHBseUJ1dHRvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0VGltZU1pbkNoYW5nZSh2YWw6IHN0cmluZyl7XHJcbiAgICAgICAgaWYodmFsLmxlbmd0aCAhPSAyICB8fCAwID4gcGFyc2VJbnQodmFsKSB8fCBwYXJzZUludCh2YWwpID4gNTkpe1xyXG4gICAgICAgICAgICB0aGlzLnN0YXJ0VGltZU1pbkVyciA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhcnRUaW1lTWluRXJyID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZGlzYWJsZVRpbWVGaWx0ZXJBcHBseUJ1dHRvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGVuZFRpbWVIb3VyQ2hhbmdlKHZhbDogc3RyaW5nKXtcclxuICAgICAgICBpZih2YWwubGVuZ3RoID09IDAgfHwgMSA+IHBhcnNlSW50KHZhbCkgfHwgcGFyc2VJbnQodmFsKSA+IDEyKXtcclxuICAgICAgICAgICAgdGhpcy5lbmRUaW1lSG91ckVyciA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kVGltZUhvdXJFcnIgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5kaXNhYmxlVGltZUZpbHRlckFwcGx5QnV0dG9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZW5kVGltZU1pbkNoYW5nZSh2YWw6IHN0cmluZyl7XHJcbiAgICAgICAgaWYodmFsLmxlbmd0aCAhPSAyICB8fCAwID4gcGFyc2VJbnQodmFsKSB8fCBwYXJzZUludCh2YWwpID4gNTkpe1xyXG4gICAgICAgICAgICB0aGlzLmVuZFRpbWVNaW5FcnIgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICB0aGlzLmVuZFRpbWVNaW5FcnIgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5kaXNhYmxlVGltZUZpbHRlckFwcGx5QnV0dG9uKCk7XHJcbiAgICB9XHJcblxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJ0YWJsZS1jb250YWluZXJcIiBbbmdDbGFzc109XCJ7ICdzY3JvbGwtbGVmdC1zaGFkb3ctZWZmZWN0JzogaXNTY3JvbGxlZExlZnQgfVwiPlxyXG4gICAgPGFubmEtdGFibGUtdmlydHVhbC1zY3JvbGwtdmlld3BvcnRcclxuICAgICAgICBbYnVmZmVyXT1cImd0R2VuZXJhbENvbmZpZy5idWZmZXJTaXplXCJcclxuICAgICAgICBbcm93SGVpZ2h0XT1cImd0RGltZW5zaW9uLnJvd0hlaWdodFwiXHJcbiAgICAgICAgW2NsYXNzXT1cImd0R2VuZXJhbENvbmZpZy50YWJsZUNvbnRhaW5lck5hbWVcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgaGVpZ2h0OlxyXG4gICAgICAgICAgICAgICAgdGFibGVEYXRhLmxlbmd0aCA8IG1heGltdW1Sb3dzV2hpY2hDYW5CZVJlbmRlcmVkV2l0aG91dFNjcm9sbFxyXG4gICAgICAgICAgICAgICAgICAgID8gJ2NhbGMoJyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAoKGd0RGltZW5zaW9uLnJvd0hlaWdodCArIHJvd0JvcmRlcldpZHRoKSAqIHRhYmxlRGF0YS5sZW5ndGggK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICghdGFibGVEYXRhLmxlbmd0aCB8fCAhZ3RHZW5lcmFsQ29uZmlnLnRvdGFsUm93XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZ3REaW1lbnNpb24uaGVhZGVySGVpZ2h0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ3REaW1lbnNpb24uaGVhZGVySGVpZ2h0ICsgZ3REaW1lbnNpb24ucm93SGVpZ2h0ICsgKDIgKiByb3dCb3JkZXJXaWR0aCkpKSArXHJcbiAgICAgICAgICAgICAgICAgICAgICAncHgpJ1xyXG4gICAgICAgICAgICAgICAgICAgIDogZ3REaW1lbnNpb24udGFibGVIZWlnaHRcclxuICAgICAgICB9XCJcclxuICAgID5cclxuICAgICAgICA8dGFibGUgY2xhc3M9XCJndFwiICBbbmdDbGFzc109XCJ0YWJsZUNsYXNzXCIgbWF0LXRhYmxlIFthcHBWaXJ0dWFsRGF0YVNvdXJjZV09XCJ0YWJsZURhdGFcIj5cclxuICAgICAgICAgICAgPHRyXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImhlYWRlci1yb3dcIlxyXG4gICAgICAgICAgICAgICAgbWF0LWhlYWRlci1yb3dcclxuICAgICAgICAgICAgICAgICptYXRIZWFkZXJSb3dEZWY9XCJ0YWJsZUNvbHVtbnM7IHN0aWNreTogdHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImd0RGltZW5zaW9uLmhlYWRlckhlaWdodFwiXHJcbiAgICAgICAgICAgID48L3RyPlxyXG4gICAgICAgICAgICA8dHJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidG90YWwtcm93XCJcclxuICAgICAgICAgICAgICAgIG1hdC1oZWFkZXItcm93XHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImd0RGltZW5zaW9uLnJvd0hlaWdodFwiXHJcbiAgICAgICAgICAgICAgICAqbWF0SGVhZGVyUm93RGVmPVwidG90YWxSb3dDb2x1bW5zOyBzdGlja3k6IHRydWVcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmhpZGRlbl09XCJcclxuICAgICAgICAgICAgICAgICAgICBzaG93U2tlbGV0b25Mb2FkaW5nIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgKCFzaG93U2tlbGV0b25Mb2FkaW5nICYmICF0YWJsZURhdGEubGVuZ3RoICkgfHxcclxuICAgICAgICAgICAgICAgICAgICAoc2hvd05vRGF0YVRvRGlzcGxheSkgfHwgXHJcbiAgICAgICAgICAgICAgICAgICAgKCFzaG93U2tlbGV0b25Mb2FkaW5nICYmICFndEdlbmVyYWxDb25maWcudG90YWxSb3cpXHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICA+PC90cj5cclxuICAgICAgICAgICAgPHRyXHJcbiAgICAgICAgICAgICAgICBbY2xhc3NdPVwicm93RGF0YS5ndENsYXNzXCJcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnbm8tYm9yZGVyLXRyJzogc2hvd05vRGF0YVRvRGlzcGxheX1cIlxyXG4gICAgICAgICAgICAgICAgbWF0LXJvd1xyXG4gICAgICAgICAgICAgICAgKm1hdFJvd0RlZj1cImxldCByb3dEYXRhOyBjb2x1bW5zOiB0YWJsZUNvbHVtbnNcIlxyXG4gICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJndERpbWVuc2lvbi5yb3dIZWlnaHRcIlxyXG4gICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwicm93RGF0YS5iYWNrZ3JvdW5kQ29sb3JcIlxyXG4gICAgICAgICAgICAgICAgW3N0eWxlLmJvcmRlcl09XCJyb3dEYXRhLmJvcmRlclwiIChjbGljayk9XCJkYXRhUm93Q2xpY2tlZChyb3dEYXRhKVwiXHJcbiAgICAgICAgICAgID48L3RyPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBUT1RBTCBST1cgLS0+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW21hdENvbHVtbkRlZl09XCJjb2x1bW4uY29sTmFtZVwiICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgdG90YWxSb3dJbmZvOyB0cmFja0J5OiB0cmFja0J5Rm5cIj5cclxuICAgICAgICAgICAgICAgIDx0ZCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW2F0dHIuY29sc3Bhbl09XCJjb2x1bW4uY29sc3BhblwiIGNsYXNzPVwie3tjb2x1bW4uY2xhc3N9fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3sgY29sdW1uLmRhdGEgfX08L3N0cm9uZz5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLmxvd2VyRGF0YVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7Y29sdW1uLmxvd2VyRGF0YX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi50b29sdGlwTWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtaSBtZGktaW5mby1vdXRsaW5lIGluZm8tbGFiZWxcIiBjb250YWluZXI9XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtuZ2JUb29sdGlwXT1cImNvbHVtbi50b29sdGlwTWVzc2FnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwQ2xhc3M9XCJndC10b3RhbC1yb3ctdG9vbHRpcFwiIHBsYWNlbWVudD1cImJvdHRvbVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBNQUlOIFJPVyAtLT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbWF0Q29sdW1uRGVmXT1cImNvbHVtbkRlZi5oZWFkZXJJbmZvWzBdLm9iamVjdEtleVwiICpuZ0Zvcj1cImxldCBjb2x1bW5EZWYgb2YgdGFibGVIZWFkZXJzOyAgdHJhY2tCeTogdHJhY2tCeUZuXCI+XHJcbiAgICAgICAgICAgICAgICA8dGggI3RhYmxlSGVhZGVyIG5vd3JhcCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW3N0eWxlLndpZHRoXT1cImNvbHVtbkRlZi53aWR0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXgtMFwiICpuZ0Zvcj1cImxldCBoZWFkZXIgb2YgY29sdW1uRGVmLmhlYWRlckluZm87IGxldCBqID0gaW5kZXg7XCI+ICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJoZWFkZXIudHlwZU9mSGVhZGVyRGF0YSA9PT0gJ1NUUklORydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAndXBwZXItbGFiZWwnOiBqID09PSAwLCAnbG93ZXItbGFiZWwnOiBqID09PSAxIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBoZWFkZXIubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJoZWFkZXIudG9vbHRpcCAmJiBoZWFkZXIudG9vbHRpcC5uYW1lID09ICdpbXBzSW5mb1Rvb2x0aXAnXCIgY2xhc3M9XCJ7e2hlYWRlclsndG9vbHRpcCddLmljb25DbGFzc319XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2Zsb2F0JzogaGVhZGVyWyd0b29sdGlwJ10uaWNvblBvc2l0aW9ufVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3Q9XCJuZ2JUb29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdiVG9vbHRpcF09XCJpbXBzSW5mb1Rvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cInt7IGhlYWRlclsndG9vbHRpcCddLnRvb2x0aXBQb3NpdGlvbiB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcENsYXNzPVwie3sgaGVhZGVyWyd0b29sdGlwJ10udG9vbHRpcENsYXNzIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiaGVhZGVyLnRvb2x0aXAgJiYgaGVhZGVyLnRvb2x0aXAubmFtZSA9PSAncmF0aW5nSW5mb1Rvb2x0aXAnXCIgY2xhc3M9XCJ7e2hlYWRlclsndG9vbHRpcCddLmljb25DbGFzc319XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2Zsb2F0JzogaGVhZGVyWyd0b29sdGlwJ10uaWNvblBvc2l0aW9ufVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3Q9XCJuZ2JUb29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdiVG9vbHRpcF09XCJyYXRpbmdJbmZvVG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwie3sgaGVhZGVyWyd0b29sdGlwJ10udG9vbHRpcFBvc2l0aW9uIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwQ2xhc3M9XCJ7eyBoZWFkZXJbJ3Rvb2x0aXAnXS50b29sdGlwQ2xhc3MgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJoZWFkZXIudG9vbHRpcCAmJiBoZWFkZXIudG9vbHRpcC5uYW1lID09ICdyYXRlSW5mb1Rvb2x0aXAnXCIgY2xhc3M9XCJ7e2hlYWRlclsndG9vbHRpcCddLmljb25DbGFzc319XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2Zsb2F0JzogaGVhZGVyWyd0b29sdGlwJ10uaWNvblBvc2l0aW9ufVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3Q9XCJuZ2JUb29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdiVG9vbHRpcF09XCJyYXRlSW5mb1Rvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cInt7IGhlYWRlclsndG9vbHRpcCddLnRvb2x0aXBQb3NpdGlvbiB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcENsYXNzPVwie3sgaGVhZGVyWyd0b29sdGlwJ10udG9vbHRpcENsYXNzIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhlYWRlci50eXBlT2ZIZWFkZXJEYXRhID09PSAnQ0hFQ0tCT1gnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ3RHZW5lcmFsQ29uZmlnLmlzSGVhZGVyQ2hlY2tlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBjdXN0b20tY29sdW1uLWNoZWNrYm94LWNoZWNrZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RVbnNlbGVjdEFsbFJvd3MoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfYm94XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWd0R2VuZXJhbENvbmZpZy5pc0hlYWRlckNoZWNrZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgY3VzdG9tLWNvbHVtbi1jaGVja2JveC11bmNoZWNrZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2Rpc2FibGUtY2hlY2tib3gnOiBndEdlbmVyYWxDb25maWcuZGlzYWJsZUhlYWRlckNoZWNrYm94IH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RVbnNlbGVjdEFsbFJvd3MoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfYm94X291dGxpbmVfYmxhbmtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZ3RHZW5lcmFsQ29uZmlnLnNob3dBbGxDb2x1bW5GaWx0ZXJcIiBjbGFzcz1cInNvcnQtZmlsdGVyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhlYWRlci5zaG93VG9vbHRpcEljb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGVhZGVyLmZpbHRlciA9PT0gJ0NIRUNLQk9YJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWZpbHRlci12YXJpYW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmU6IGlzVG9vbHRpcEFjdGl2ZShoZWFkZXIuZmlsdGVyU29ydE9iamVjdEtleXMpLCAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogaGVhZGVyLmRpc2FibGVUb29sdGlwSWNvbiAmJiAhaXNUb29sdGlwQWN0aXZlKGhlYWRlci5maWx0ZXJTb3J0T2JqZWN0S2V5cylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nYlRvb2x0aXBdPVwiZmlsdGVyVG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b20gbGVmdC10b3AgYXV0b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBDbGFzcz1cIm5vbi1lZGl0LWNoZWNrYm94LXRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9DbG9zZV09XCInb3V0c2lkZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcnM9XCJtYW51YWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3Q9XCJuZ2JUb29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJiaW5kVGhlVmFsdWVUb1Rvb2xUaXAodCwgaGVhZGVyKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGlkZGVuKT1cImNsb3NlVG9vbHRpcCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoZWFkZXIuZmlsdGVyID09PSAnU0xJREVSJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWZpbHRlci12YXJpYW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmU6IGlzVG9vbHRpcEFjdGl2ZShoZWFkZXIuZmlsdGVyU29ydE9iamVjdEtleXMpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBoZWFkZXIuZGlzYWJsZVRvb2x0aXBJY29uICYmICFpc1Rvb2x0aXBBY3RpdmUoaGVhZGVyLmZpbHRlclNvcnRPYmplY3RLZXlzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdiVG9vbHRpcF09XCJzbGlkZXJUb29sVGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbSBsZWZ0LXRvcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBDbGFzcz1cIm5vbi1lZGl0LXNsaWRlci10b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvQ2xvc2VdPVwiJ291dHNpZGUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJzPVwibWFudWFsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN0MT1cIm5nYlRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImJpbmRUaGVWYWx1ZVRvVG9vbFRpcCh0MSwgaGVhZGVyKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGlkZGVuKT1cImNsb3NlVG9vbHRpcCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoZWFkZXIuZmlsdGVyID09PSAnREFURSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1maWx0ZXItdmFyaWFudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlOiBpc1Rvb2x0aXBBY3RpdmUoaGVhZGVyLmZpbHRlclNvcnRPYmplY3RLZXlzKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogaGVhZGVyLmRpc2FibGVUb29sdGlwSWNvbiAmJiAhaXNUb29sdGlwQWN0aXZlKGhlYWRlci5maWx0ZXJTb3J0T2JqZWN0S2V5cylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nYlRvb2x0aXBdPVwiZGF0ZVBpY2tlclRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tIGF1dG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwQ2xhc3M9XCJub24tZWRpdC1kYXRlcGlja2VyLXRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9DbG9zZV09XCInb3V0c2lkZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcnM9XCJtYW51YWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3QyPVwibmdiVG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYmluZFRoZVZhbHVlVG9Ub29sVGlwKHQyLCBoZWFkZXIpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoaWRkZW4pPVwiY2xvc2VUb29sdGlwKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhlYWRlci5maWx0ZXIgPT09ICdXRUVLJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWZpbHRlci12YXJpYW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmU6IGlzVG9vbHRpcEFjdGl2ZShoZWFkZXIuZmlsdGVyU29ydE9iamVjdEtleXMpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBoZWFkZXIuZGlzYWJsZVRvb2x0aXBJY29uICYmICFpc1Rvb2x0aXBBY3RpdmUoaGVhZGVyLmZpbHRlclNvcnRPYmplY3RLZXlzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdiVG9vbHRpcF09XCJ3ZWVrUGlja2VyVG9vbFRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b20gbGVmdC10b3BcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXV0b0Nsb3NlXT1cIidvdXRzaWRlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2Vycz1cIm1hbnVhbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdDM9XCJuZ2JUb29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJiaW5kVGhlVmFsdWVUb1Rvb2xUaXAodDMsIGhlYWRlcilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhpZGRlbik9XCJjbG9zZVRvb2x0aXAoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGVhZGVyLmZpbHRlciA9PT0gJ1RJTUUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1kaSBtZGktZmlsdGVyLXZhcmlhbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogaXNUb29sdGlwQWN0aXZlKGhlYWRlci5maWx0ZXJTb3J0T2JqZWN0S2V5cyksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGhlYWRlci5kaXNhYmxlVG9vbHRpcEljb24gJiYgIWlzVG9vbHRpcEFjdGl2ZShoZWFkZXIuZmlsdGVyU29ydE9iamVjdEtleXMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ2JUb29sdGlwXT1cInRpbWVGaWx0ZXJUb29sVGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbSBsZWZ0LXRvcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBDbGFzcz1cIm5vbi1lZGl0LXRpbWUtdG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXV0b0Nsb3NlXT1cIidvdXRzaWRlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2Vycz1cIm1hbnVhbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdDQ9XCJuZ2JUb29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJiaW5kVGhlVmFsdWVUb1Rvb2xUaXAodDQsIGhlYWRlcilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhpZGRlbik9XCJjbG9zZVRvb2x0aXAoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFoZWFkZXIuc2hvd1Rvb2x0aXBJY29uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9XCJuby1maWx0ZXItc3BhY2VcIj48L3NwYW4+PGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiaGVhZGVyLnRvb2x0aXAgJiYgaGVhZGVyLnRvb2x0aXAubmFtZSA9PSAnbHVyVmlvbGF0aW9uSW5mb1Rvb2x0aXAnXCIgY2xhc3M9XCJ7e2hlYWRlclsndG9vbHRpcCddLmljb25DbGFzc319XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2Zsb2F0JzogaGVhZGVyWyd0b29sdGlwJ10uaWNvblBvc2l0aW9ufVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3Q9XCJuZ2JUb29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdiVG9vbHRpcF09XCJsdXJWaW9sYXRpb25JbmZvVG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwie3sgaGVhZGVyWyd0b29sdGlwJ10udG9vbHRpcFBvc2l0aW9uIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwQ2xhc3M9XCJ7eyBoZWFkZXJbJ3Rvb2x0aXAnXS50b29sdGlwQ2xhc3MgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L3RoPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJndEdlbmVyYWxDb25maWcuY29tcG9uZW50ID09ICdEUlInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbWF0Q2VsbERlZj1cImxldCBST1dfREFUQVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd1NrZWxldG9uTG9hZGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtc2tlbGV0b24tbG9hZGVyIGNvdW50PVwiMVwiIFt0aGVtZV09XCJ7IGhlaWdodDogJzEwcHgnLCBkaXNwbGF5OiAnYmxvY2snIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25neC1za2VsZXRvbi1sb2FkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2hvd1NrZWxldG9uTG9hZGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzdWJsaW5lIG9mIGNvbHVtbkRlZi5oZWFkZXJJbmZvOyBsZXQgc3VibGluZUluZGV4ID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlGblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1jZWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIVJPV19EQVRBWydoaWRlJyArIHN1YmxpbmUub2JqZWN0S2V5ICsgJ1RkJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5yb3dzcGFuXT1cIlJPV19EQVRBW3N1YmxpbmUub2JqZWN0S2V5ICsgJ1Jvd3NwYW4nXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJzdWJsaW5lLnR5cGVPZkJvZHlEYXRhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInSUNPTidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBbY2xhc3NdPVwiUk9XX0RBVEEuaWNvbkNsYXNzXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ0NIRUNLQk9YJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiUk9XX0RBVEFbc3VibGluZS5vYmplY3RLZXldXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnZGlzYWJsZS1jaGVja2JveCc6IFJPV19EQVRBW3N1YmxpbmUuaXNEaXNhYmxlZEtleV0gfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgY3VzdG9tLWNvbHVtbi1jaGVja2JveC1jaGVja2VkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFVuc2VsZWN0Um93KFJPV19EQVRBKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19ib3hcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhUk9XX0RBVEFbc3VibGluZS5vYmplY3RLZXldXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBjdXN0b20tY29sdW1uLWNoZWNrYm94LXVuY2hlY2tlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2Rpc2FibGUtY2hlY2tib3gnOiBST1dfREFUQVtzdWJsaW5lLmlzRGlzYWJsZWRLZXldIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VW5zZWxlY3RSb3coUk9XX0RBVEEpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2JveF9vdXRsaW5lX2JsYW5rXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ1JBRElPJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tZ3JvdXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJST1dfREFUQVsnUmFkaW9CdXR0b25Db25maWcnXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIlJPV19EQVRBW3N1YmxpbmUub2JqZWN0S2V5XVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJST1dfREFUQVsnUmFkaW9CdXR0b25Db25maWcnXVswXS5pc0Rpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCByYWRpb0J1dHRvbiBvZiBST1dfREFUQVsnUmFkaW9CdXR0b25Db25maWcnXTsgbGV0IGxhc3QgPSBsYXN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cInt7IHJhZGlvQnV0dG9uLnZhbHVlIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInt7IHJhZGlvQnV0dG9uLmNsYXNzIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGlvQnV0dG9uQ2xpY2tlZChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJPV19EQVRBLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaW9CdXR0b24udmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBST1dfREFUQVsnUmFkaW9CdXR0b25Db25maWcnXVswXS5pc0Rpc2FibGVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID57eyByYWRpb0J1dHRvbi5sYWJlbCB9fTwvbWF0LXJhZGlvLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjxiciAqbmdJZj1cIiFsYXN0XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtcmFkaW8tZ3JvdXA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgUk9XX0RBVEFbc3VibGluZS5vYmplY3RLZXldIH19XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmxpbmUub2JqZWN0S2V5ID09ICdTdGF0dXMnICYmIChST1dfREFUQVsnUmVtYXJrcyddICE9PSBudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWkgbWRpLWluZm8tb3V0bGluZSByZW1hcmtzLXRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nYlRvb2x0aXBdPVwiY29sdW1uSW5mb1Rvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcENsYXNzPVwicmVtYXJrcy1pbmZvLXRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3Q9XCJuZ2JUb29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImd0R2VuZXJhbENvbmZpZy5jb21wb25lbnQgIT0gJ0RSUidcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgUk9XX0RBVEFcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJST1dfREFUQS5iYWNrZ3JvdW5kQ29sb3JcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1za2VsZXRvbi1sb2FkZXIgKm5nSWY9XCJzaG93U2tlbGV0b25Mb2FkaW5nXCIgY291bnQ9XCIxXCIgW3RoZW1lXT1cInsgaGVpZ2h0OiAnMTBweCcsIGRpc3BsYXk6ICdibG9jaycgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25neC1za2VsZXRvbi1sb2FkZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNob3dTa2VsZXRvbkxvYWRpbmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0YWJsZURhdGEubGVuZ3RoID4gMCAmJiAhc2hvd05vRGF0YVRvRGlzcGxheVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHN1YmxpbmUgb2YgY29sdW1uRGVmLmhlYWRlckluZm87IGxldCBzdWJMaW5lSW5kZXggPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUZuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbHVtbkRlZi5oZWFkZXJJbmZvW3N1YkxpbmVJbmRleF0udHlwZU9mQm9keURhdGFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidJQ09OJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIFtjbGFzc109XCJST1dfREFUQS5pY29uQ2xhc3NcIiAoY2xpY2spPVwiaWNvbkNsaWNrZWQoUk9XX0RBVEEsUk9XX0RBVEEuaWNvbkNsYXNzKVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInU1ZHX0lDT04nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImd0R2VuZXJhbENvbmZpZy5jb21wb25lbnQgPT0gJ09SREVSX0xJU1RJTkdfSU5GTElHSFQnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlJPV19EQVRBLnBheUZvclBlcmZvcm1hbmNlICYmIHN1YmxpbmUub2JqZWN0S2V5ID09ICdwYXlGb3JQZXJmb3JtYW5jZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3Itbm90LWFsbG93ZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhbm5hLXBheS1mb3ItcGVyZm9ybWFuY2UtaWNvbi10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJQZnBJY29uQWN0aXZlQ29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt3aWR0aF09XCInMTVweCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwiJzE1cHgnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYW5uYS1wYXktZm9yLXBlcmZvcm1hbmNlLWljb24tdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiUk9XX0RBVEEub3JkZXJTdGF0dXMgIT0gJ0xJVkUnICYmICFST1dfREFUQS5wYXlGb3JQZXJmb3JtYW5jZSAmJiBzdWJsaW5lLm9iamVjdEtleSA9PSAncGF5Rm9yUGVyZm9ybWFuY2UnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzdmdJY29uQ2xpY2tlZChST1dfREFUQSwncGF5Rm9yUGVyZm9ybWFuY2UnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhbm5hLXBheS1mb3ItcGVyZm9ybWFuY2UtaWNvbi10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJQZnBJY29uRGlzYWJsZUNvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbd2lkdGhdPVwiJzE1cHgnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGVpZ2h0XT1cIicxNXB4J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FubmEtcGF5LWZvci1wZXJmb3JtYW5jZS1pY29uLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFubmEtbGl2ZS1pY29uLXRlbXBsYXRlICpuZ0lmPVwiUk9XX0RBVEEub3JkZXJTdGF0dXMgPT0gJ0xJVkUnICYmIHN1YmxpbmUub2JqZWN0S2V5ID09ICdvcmRlclN0YXR1cycgXCI+PC9hbm5hLWxpdmUtaWNvbi10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3RHZW5lcmFsQ29uZmlnLmNvbXBvbmVudCA9PSAnT1JERVJfTElTVElOR19DT01QTEVURUQnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiUk9XX0RBVEEucGF5Rm9yUGVyZm9ybWFuY2UgJiYgc3VibGluZS5vYmplY3RLZXkgPT0gJ3BheUZvclBlcmZvcm1hbmNlJ1wiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhbm5hLXBheS1mb3ItcGVyZm9ybWFuY2UtaWNvbi10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJQZnBJY29uQWN0aXZlQ29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt3aWR0aF09XCInMjBweCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwiJzIwcHgnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYW5uYS1wYXktZm9yLXBlcmZvcm1hbmNlLWljb24tdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3VibGluZS5vYmplY3RLZXkgPT0gJ2JpelJ1bGVTdGF0dXMnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhbm5hLXJlamVjdGVkLWljb24tdGVtcGxhdGUgKm5nSWY9XCJST1dfREFUQS5iaXpSdWxlU3RhdHVzID09ICdSRUpFQ1RFRCdcIj48L2FubmEtcmVqZWN0ZWQtaWNvbi10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFubmEtbm90aWZ5LWljb24tdGVtcGxhdGUgKm5nSWY9XCJST1dfREFUQS5iaXpSdWxlU3RhdHVzID09ICdOT1RJRlknXCI+PC9hbm5hLW5vdGlmeS1pY29uLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YW5uYS1idXllci1hcHByb3ZhbC1pY29uLXRlbXBsYXRlICpuZ0lmPVwiUk9XX0RBVEEuYml6UnVsZVN0YXR1cyA9PSAnQVdBSVRJTkdfQVBQUk9WQUwnXCI+PC9hbm5hLWJ1eWVyLWFwcHJvdmFsLWljb24tdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ1RFWFRfQUNUSU9OUydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0Zvcj1cImxldCB0ZXh0IG9mIFJPV19EQVRBLnRleHRBY3Rpb25zXCIgKGNsaWNrKT1cInRleHRBY3Rpb25DbGlja2VkKFJPV19EQVRBLHRleHQuaWQpXCIgW2Rpc2FibGVkXT1cInRleHQuaXNEaXNhYmxlZFwiIGNsYXNzPVwie3t0ZXh0LmNsYXNzfX1cIj57e3RleHQubmFtZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ0NIRUNLQk9YJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiUk9XX0RBVEFbY29sdW1uRGVmLmhlYWRlckluZm9bc3ViTGluZUluZGV4XS5vYmplY3RLZXldXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpc2FibGUtY2hlY2tib3gnOiBST1dfREFUQVtjb2x1bW5EZWYuaGVhZGVySW5mb1tzdWJMaW5lSW5kZXhdLmlzRGlzYWJsZWRLZXldXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLWljb25zIGN1c3RvbS1jb2x1bW4tY2hlY2tib3gtY2hlY2tlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdE9yVW5zZWxlY3RDaGVja2JveChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBST1dfREFUQSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5EZWYuaGVhZGVySW5mb1tzdWJMaW5lSW5kZXhdLm9iamVjdEtleSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfYm94XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIVJPV19EQVRBW2NvbHVtbkRlZi5oZWFkZXJJbmZvW3N1YkxpbmVJbmRleF0ub2JqZWN0S2V5XVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgY3VzdG9tLWNvbHVtbi1jaGVja2JveC11bmNoZWNrZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlzYWJsZS1jaGVja2JveCc6IFJPV19EQVRBW2NvbHVtbkRlZi5oZWFkZXJJbmZvW3N1YkxpbmVJbmRleF0uaXNEaXNhYmxlZEtleV1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdE9yVW5zZWxlY3RDaGVja2JveChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBST1dfREFUQSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5EZWYuaGVhZGVySW5mb1tzdWJMaW5lSW5kZXhdLm9iamVjdEtleSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19ib3hfb3V0bGluZV9ibGFua1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN1YmxpbmUub2JqZWN0S2V5ICE9ICdkZXNjcmlwdGlvbidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgUk9XX0RBVEFbY29sdW1uRGVmLmhlYWRlckluZm9bc3ViTGluZUluZGV4XS5vYmplY3RLZXldIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzdWJsaW5lLm9iamVjdEtleSA9PSAnaW52ZW50b3J5Q29kZScgJiYgUk9XX0RBVEFbJ2lzU2VsbGVyR3JvdXAnXSAmJiBndEdlbmVyYWxDb25maWcuY29tcG9uZW50ID09ICdSQVRJTkcnIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1kaSBtZGktYWxlcnQtY2lyY2xlLW91dGxpbmUgc2VsbGVyLXRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nYlRvb2x0aXBdPVwic2VsbGVySGllcmFyY2h5VG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b20gYXV0b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvQ2xvc2VdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2Vycz1cIm1hbnVhbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGlkZGVuKT1cImNsb3NlVG9vbHRpcCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpbmZvPVwibmdiVG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwQ2xhc3M9XCJoaWVyYXJjaHktdG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJiaW5kVGhlVmFsdWVUb1NlbGxlckdyb3VwVG9vbHRpcChST1dfREFUQS5zZWxsZXJHcm91cEhpZXJhcmNoeSwgaW5mbylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdWJsaW5lLm9iamVjdEtleSA9PSAnZGVzY3JpcHRpb24nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiUk9XX0RBVEEuZGVzY3JpcHRpb25NZXNzYWdlIHx8IFJPV19EQVRBLmRlc2NyaXB0aW9uRW1haWxSZWZlcmVuY2VOdW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJST1dfREFUQS5kZXNjcmlwdGlvbk1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBST1dfREFUQS5kZXNjcmlwdGlvbk1lc3NhZ2UgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlJPV19EQVRBLmRlc2NyaXB0aW9uRW1haWxSZWZlcmVuY2VOdW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbWFpbCBSZWY6IHt7IFJPV19EQVRBLmRlc2NyaXB0aW9uRW1haWxSZWZlcmVuY2VOdW0gfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmPVwie3sgUk9XX0RBVEEuZGVzY3JpcHRpb25EZXRhaWxzVXJsIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlJPV19EQVRBLmRlc2NyaXB0aW9uRGV0YWlsc1VybFR5cGUgPT09ICdQREYnIHx8IFJPV19EQVRBLmRlc2NyaXB0aW9uRGV0YWlsc1VybFR5cGUgPT09ICdFWENFTCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIHZpZXdEZXRhaWxzQW5kRW1haWxCdG5cIj5Eb3dubG9hZDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJST1dfREFUQS5hY3Rpdml0eW5hbWUudG9Mb3dlckNhc2UoKSA9PSAnb3JkZXIgb25ib2FyZGVkJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhICpuZ0lmPVwiUk9XX0RBVEEuZGVzY3JpcHRpb25EZXRhaWxzVXJsVHlwZSA9PT0gJ0xJTksnXCIgKGNsaWNrKT1cInZpZXdEZXRhaWxzQ2xpY2tlZChST1dfREFUQSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gdmlld0RldGFpbHNBbmRFbWFpbEJ0blwiPlZpZXcgZGV0YWlsczwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJ7eyBST1dfREFUQS5kZXNjcmlwdGlvbkVtYWlsVXJsIH19XCIgdGFyZ2V0PVwiX2JsYW5rXCIgKm5nSWY9XCJST1dfREFUQS5kZXNjcmlwdGlvbkVtYWlsVXJsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIHZpZXdEZXRhaWxzQW5kRW1haWxCdG5cIj5WaWV3IGVtYWlsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0R2VuZXJhbENvbmZpZy5wYWdlID09PSAnU3BvdERldGFpbHMnICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uRGVmLmhlYWRlckluZm9bc3ViTGluZUluZGV4XS5vYmplY3RLZXkgPT09ICdTdGF0dXMnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ltYWdlcy9VbmRvLUNyZWRpdC1JY29uLnN2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW1nLWNpcmNsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwiVXNlciBJbWFnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMTVweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxNXB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlJPV19EQVRBLkFsbG93VXNlclRvVW5kb01hcmtGb3JDcmVkaXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ1bmRvQ3JlZGl0ZWRTcG90KFJPV19EQVRBKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9pbWFnZXMvVW5kby1NRy1JY29uLnN2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW1nLWNpcmNsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwiVXNlciBJbWFnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMTVweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxNXB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlJPV19EQVRBLkFsbG93VXNlclRvVW5kb01hcmtGb3JNYWtlR29vZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInVuZG9NZ1Nwb3QoUk9XX0RBVEEpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd05vRGF0YVRvRGlzcGxheVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7bnVsbH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L3RhYmxlPlxyXG4gICAgPC9hbm5hLXRhYmxlLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxyXG4gICAgPGFubmEtY29yZS1uby1kYXRhLWxpYiBbd2lkdGhdPVwibm9EYXRhV2lkdGhcIiBbbWFyZ2luVG9wXT1cIm1hcmdpblRvcFwiICpuZ0lmPVwiIXNob3dTa2VsZXRvbkxvYWRpbmcgJiYgc2hvd05vRGF0YVRvRGlzcGxheVwiPiA8L2FubmEtY29yZS1uby1kYXRhLWxpYj5cclxuPC9kaXY+XHJcblxyXG48IS0tIENoZWNrYm94IHRlbXBsYXRlIC0tPlxyXG48bmctdGVtcGxhdGUgI2ZpbHRlclRvb2x0aXA+XHJcbiAgICBcclxuICAgIDxkaXYgY2xhc3M9XCJyYWRpby1jb250YWluZXJcIiAqbmdJZj1cInNob3dDaGVja2JveEZpbHRlclJhZGlvQnV0dG9uc1wiPlxyXG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGRhdGEgb2YgcmFkaW9CdXR0b25zXCI+XHJcbiAgICAgICAgICAgIDxwIGNsYXNzPVwiZmlsdGVyLXRhYlwiIChjbGljayk9XCJwb3B1bGF0ZVRvb2x0aXBEYXRhQmFzZWRPblNlbGVjdGVkUmFkaW8oZGF0YSlcIiBbbmdDbGFzc109XCJ7J2FjdGl2ZSc6IGFubmFGaWx0ZXJTZXJ2aWNlLnNlbGVjdGVkUmFkaW8gPT0gZGF0YS5rZXl9XCIgKm5nSWY9XCJyYWRpb0J1dHRvbnMubGVuZ3RoID4gMFwiPnt7IGRhdGEubGFiZWwgfX08L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIFxyXG4gICAgPGRpdiBjbGFzcz1cImNoZWNrYm94LXNvcnRcIiAqbmdJZj1cInNob3dTb3J0Q29tcG9uZW50XCI+XHJcbiAgICAgICAgPGFubmEtY29yZS1zb3J0LWxpYiAgKHNvcnRPcHRpb25DbGlja2VkKT1cInN0b3JlU29ydFR5cGVJblRlbXBWYXJpYWJsZSgkZXZlbnQpXCIgW3NvcnRPYmplY3RLZXldPVwiYW5uYUZpbHRlclNlcnZpY2Uuc2VsZWN0ZWRSYWRpb1wiPjwvYW5uYS1jb3JlLXNvcnQtbGliPlxyXG4gICAgPC9kaXY+XHJcbiAgICBcclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93RmlsdGVyQ29tcG9uZW50XCI+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImZpbHRlci10ZXh0LWJ0blwiIFtkaXNhYmxlZF09XCJkaXNhYmxlQ2xlYXJBbGxcIiAoY2xpY2spPVwidW5DaGVja0FsbENoZWNrYm94KClcIj5DbGVhciBBbGw8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImZpbHRlci10ZXh0LWJ0blwiIFtkaXNhYmxlZF09XCJkaXNhYmxlU2VsZWN0QWxsXCIgKGNsaWNrKT1cInNlbGVjdEFsbENoZWNrYm94KClcIj5TZWxlY3QgQWxsPC9idXR0b24+XHJcbiAgICAgICAgPC9wPlxyXG4gICAgICAgIDxwIGNsYXNzPVwic2VhcmNoLWJveFwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cIm1pIG1kaS1zZWFyY2ggc2VhcmNoLWljb24gc2VhcmNoLWljb24tcG9zaXRpb25cIj48L2k+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2hcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzZWFyY2gtaW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tbGVmdDogMnB4OyBib3JkZXI6IG5vbmU7IHBhZGRpbmc6IDBweFwiXHJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaEl0ZW1cIlxyXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2VhcmNoRm9yVGhlSXRlbSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWNsb3NlIHNlYXJjaC1iYXItY2xvc2VcIiBbbmdDbGFzc109XCJ7J2Rpc2FibGUtY2xvc2UtaWNvbic6ICghc2VhcmNoSXRlbSB8fCBzZWFyY2hJdGVtLmxlbmd0aCA9PSAwKSB9XCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyU2VhcmNoZWRJdGVtKClcIj48L2k+XHJcblxyXG4gICAgICAgIDwvcD5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tZGF0YS1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHRvb2x0aXBPcHRpb25zXCI+XHJcbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImlucHV0XCIgKGNsaWNrKT1cInNlbGVjdFVuc2VsZWN0Q2hlY2tib3gob3B0aW9uKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwib3B0aW9uLmlzU2VsZWN0ZWRcIiByb2xlPVwiYnV0dG9uXCIgY2xhc3M9XCJtaSBtZGktY2hlY2stYm94IGNoZWNrLWJveFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFvcHRpb24uaXNTZWxlY3RlZFwiIHJvbGU9XCJidXR0b25cIiBjbGFzcz1cIm1pIG1kaS1jaGVjay1ib3gtb3V0bGluZS1ibGFuayBjaGVjay1ib3ggdW5jaGVja2VkXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGF0YVwiIHRpdGxlPVwie3sgb3B0aW9uLmRhdGEgfX1cIiBbaW5uZXJIVE1MXT1cIm9wdGlvbi5kYXRhXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJidXR0b25zLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidXR0b25cIiAoY2xpY2spPVwiY2xvc2VDaGVja2JveEZpbHRlcigpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBjbGFzcz1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgZGlzYWJsZWQ6IGRpc2FibGVDaGVja2JveEFwcGx5IH1cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlGaWx0ZXJzKClcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZUNoZWNrYm94QXBwbHlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAgQXBwbHlcclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPCEtLSBTbGlkZXIgdGVtcGxhdGUgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjc2xpZGVyVG9vbFRpcD5cclxuICAgIFxyXG4gICAgPGRpdiBjbGFzcz1cInJhZGlvLWNvbnRhaW5lclwiICpuZ0lmPVwic2hvd0NoZWNrYm94RmlsdGVyUmFkaW9CdXR0b25zXCI+XHJcbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZGF0YSBvZiByYWRpb0J1dHRvbnNcIj5cclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJmaWx0ZXItdGFiXCIgKGNsaWNrKT1cInBvcHVsYXRlVG9vbHRpcERhdGFCYXNlZE9uU2VsZWN0ZWRSYWRpbyhkYXRhKVwiIFtuZ0NsYXNzXT1cInsnYWN0aXZlJzogYW5uYUZpbHRlclNlcnZpY2Uuc2VsZWN0ZWRSYWRpbyA9PSBkYXRhLmtleX1cIiAqbmdJZj1cInJhZGlvQnV0dG9ucy5sZW5ndGggPiAwXCI+e3sgZGF0YS5sYWJlbCB9fTwvcD4gICBcclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPCEtLSA8YnV0dG9uIGNsYXNzPVwiY29sdW1uLWNsZWFyLWFsbCBhbGlnbi1jZW50ZXJcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZUNvbHVtbkNsZWFyQWxsQnRuXCIgKGNsaWNrKT1cImNsZWFyQ29sdW1uRmlsdGVyKClcIj5cclxuICAgICAgICBDbGVhciBmaWx0ZXJcclxuICAgIDwvYnV0dG9uPiAtLT5cclxuICAgICAgICBcclxuICAgIDxhbm5hLWNvcmUtc29ydC1saWIgKm5nSWY9XCJzaG93U29ydENvbXBvbmVudFwiIChzb3J0T3B0aW9uQ2xpY2tlZCk9XCJzdG9yZVNvcnRUeXBlSW5UZW1wVmFyaWFibGUoJGV2ZW50KVwiIFtzb3J0T2JqZWN0S2V5XT1cImFubmFGaWx0ZXJTZXJ2aWNlLnNlbGVjdGVkUmFkaW9cIj48L2FubmEtY29yZS1zb3J0LWxpYj5cclxuICAgIFxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dGaWx0ZXJDb21wb25lbnRcIj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29sdW1uLWNsZWFyLWFsbFwiIFtkaXNhYmxlZF09XCJkaXNhYmxlQ29sdW1uQ2xlYXJBbGxCdG5cIiAoY2xpY2spPVwiY2xlYXJDb2x1bW5GaWx0ZXIoKVwiPkNsZWFyIGZpbHRlcjwvYnV0dG9uPlxyXG4gICAgICAgIDxzZWN0aW9uIGNsYXNzPVwibWluLW1heENvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzbGlkZXItdGV4dFwiXHJcbiAgICAgICAgICAgICAgICBzdGVwPVwie3sgc2xpZGVyRmlsdGVyVGV4dEJveFN0ZXAgfX1cIlxyXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2xpZGVyTWluVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwibWluVmFsdWVDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydyZWQtYm9yZGVyJzogc2hvd1NsaWRlck1pblZhbHVlRXJyb3J9XCJcclxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiTWluXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPHNwYW4+VG88L3NwYW4+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNsaWRlci10ZXh0XCJcclxuICAgICAgICAgICAgICAgIHN0ZXA9XCJ7eyBzbGlkZXJGaWx0ZXJUZXh0Qm94U3RlcCB9fVwiXHJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJzbGlkZXJNYXhWYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJtYXhWYWx1ZUNoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3JlZC1ib3JkZXInOiBzaG93U2xpZGVyTWF4VmFsdWVFcnJvcn1cIlxyXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJNYXhcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2lkZWJhci1zbGlkZXJcIj5cclxuICAgICAgICAgICAgPG5neC1zbGlkZXJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmlsdGVyLXNsaWRlclwiXHJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwic2xpZGVyTWluVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgW2hpZ2hWYWx1ZV09XCJzbGlkZXJNYXhWYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJvcHRpb25zXCJcclxuICAgICAgICAgICAgPjwvbmd4LXNsaWRlcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgXHJcbiAgICA8ZGl2IGNsYXNzPVwiYnV0dG9ucy1jb250YWluZXJcIj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNhbmNlbFNsaWRlckZpbHRlcigpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBjbGFzcz1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgZGlzYWJsZWQ6IGRpc2FibGVTbGlkZXJBcHBseUJ1dHRvbiB9XCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5U2xpZGVyRmlsdGVyKClcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZVNsaWRlckFwcGx5QnV0dG9uXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICAgIEFwcGx5XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjwhLS0gRGF0ZSBQaWNrZXIgVGVtcGxhdGUgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjZGF0ZVBpY2tlclRvb2x0aXA+XHJcbiAgICA8ZGl2IGNsYXNzPVwicmFkaW8tY29udGFpbmVyXCIgKm5nSWY9XCJzaG93Q2hlY2tib3hGaWx0ZXJSYWRpb0J1dHRvbnNcIj5cclxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBkYXRhIG9mIHJhZGlvQnV0dG9uc1wiPlxyXG4gICAgICAgICAgICA8cCBjbGFzcz1cImZpbHRlci10YWJcIiAoY2xpY2spPVwicG9wdWxhdGVUb29sdGlwRGF0YUJhc2VkT25TZWxlY3RlZFJhZGlvKGRhdGEpXCIgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBhbm5hRmlsdGVyU2VydmljZS5zZWxlY3RlZFJhZGlvID09IGRhdGEua2V5fVwiICpuZ0lmPVwicmFkaW9CdXR0b25zLmxlbmd0aCA+IDBcIj57eyBkYXRhLmxhYmVsIH19PC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGFubmEtY29yZS1zb3J0LWxpYiAqbmdJZj1cInNob3dTb3J0Q29tcG9uZW50XCIgKHNvcnRPcHRpb25DbGlja2VkKT1cInN0b3JlU29ydFR5cGVJblRlbXBWYXJpYWJsZSgkZXZlbnQpXCIgW3NvcnRPYmplY3RLZXldPVwiYW5uYUZpbHRlclNlcnZpY2Uuc2VsZWN0ZWRSYWRpb1wiPjwvYW5uYS1jb3JlLXNvcnQtbGliPlxyXG4gICAgXHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0ZpbHRlckNvbXBvbmVudFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlcGlja2VyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29sdW1uLWNsZWFyLWFsbFwiIFtkaXNhYmxlZF09XCJkaXNhYmxlQ29sdW1uQ2xlYXJBbGxCdG5cIiAoY2xpY2spPVwiY2xlYXJDb2x1bW5GaWx0ZXIoKVwiPlxyXG4gICAgICAgICAgICAgICAgQ2xlYXIgZmlsdGVyXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YW5uYS1jb3JlLWNhbGVuZGFyLWZpbHRlci1saWJcclxuICAgICAgICAgICAgICAgIFttaW5EYXRlXT1cImNhbGVuZGFyTWluRW5hYmxlZERhdGVcIlxyXG4gICAgICAgICAgICAgICAgW21heERhdGVdPVwiY2FsZW5kYXJNYXhFbmFibGVkRGF0ZVwiXHJcbiAgICAgICAgICAgICAgICBbc2VsZWN0ZWRGcm9tRGF0ZV09XCJzZWxlY3RlZE1pbkRhdGVcIlxyXG4gICAgICAgICAgICAgICAgW3NlbGVjdGVkVG9EYXRlXT1cInNlbGVjdGVkTWF4RGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAoc2VsZWN0ZWREYXRlKSA9IFwiY2FsZW5kYXJEYXRlQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJzZWxlY3RlZExhYmVsXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICA8L2FubmEtY29yZS1jYWxlbmRhci1maWx0ZXItbGliPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImJ1dHRvbnMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvblwiIChjbGljayk9XCJjYW5jZWxJbkRhdGVGaWx0ZXIoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidXR0b25cIiAoY2xpY2spPVwiYXBwbHlEYXRlRmlsdGVyKClcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZUNhbGVuZGFyQXBwbHlCdG5cIj5BcHBseTwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICBcclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjwhLS0gV2VlayBQaWNrZXIgVGVtcGxhdGUgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjd2Vla1BpY2tlclRvb2xUaXA+XHJcbiAgICA8ZGl2IGNsYXNzPVwid2Vla3BpY2tlci1jb250YWluZXJcIj5cclxuICAgICAgICA8YW5uYS1jb3JlLXdlZWstY2FsZW5kYXItZmlsdGVyLWxpYlxyXG4gICAgICAgICAgICBbd2Vlay1jYWxlbmRhci1jb25maWddPVwiZ3RHZW5lcmFsQ29uZmlnLm11bHRpV2Vla1BpY2tlckNvbmZpZ1wiXHJcbiAgICAgICAgICAgIChhcHBseSk9XCJhcHBseVdlZWtGaWx0ZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIFtmcm9tLWRhdGVdPVwiY2FsZW5kYXJNaW5FbmFibGVkRGF0ZVwiXHJcbiAgICAgICAgICAgIFt0by1kYXRlXT1cImNhbGVuZGFyTWF4RW5hYmxlZERhdGVcIlxyXG4gICAgICAgID5cclxuICAgICAgICA8L2FubmEtY29yZS13ZWVrLWNhbGVuZGFyLWZpbHRlci1saWI+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjwhLS0gVGltZSBGaWx0ZXIgVGVtcGxhdGUgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjdGltZUZpbHRlclRvb2xUaXA+XHJcbiAgICBcclxuICAgIDxkaXYgY2xhc3M9XCJyYWRpby1jb250YWluZXJcIiAqbmdJZj1cInNob3dDaGVja2JveEZpbHRlclJhZGlvQnV0dG9uc1wiPlxyXG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGRhdGEgb2YgcmFkaW9CdXR0b25zXCI+XHJcbiAgICAgICAgICAgIDxwIGNsYXNzPVwiZmlsdGVyLXRhYlwiIChjbGljayk9XCJwb3B1bGF0ZVRvb2x0aXBEYXRhQmFzZWRPblNlbGVjdGVkUmFkaW8oZGF0YSlcIiBbbmdDbGFzc109XCJ7J2FjdGl2ZSc6IGFubmFGaWx0ZXJTZXJ2aWNlLnNlbGVjdGVkUmFkaW8gPT0gZGF0YS5rZXl9XCIgKm5nSWY9XCJyYWRpb0J1dHRvbnMubGVuZ3RoID4gMFwiPnt7IGRhdGEubGFiZWwgfX08L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8YW5uYS1jb3JlLXNvcnQtbGliICpuZ0lmPVwic2hvd1NvcnRDb21wb25lbnRcIiAoc29ydE9wdGlvbkNsaWNrZWQpPVwic3RvcmVTb3J0VHlwZUluVGVtcFZhcmlhYmxlKCRldmVudClcIiBbc29ydE9iamVjdEtleV09XCJhbm5hRmlsdGVyU2VydmljZS5zZWxlY3RlZFJhZGlvXCI+PC9hbm5hLWNvcmUtc29ydC1saWI+XHJcbiAgICBcclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93RmlsdGVyQ29tcG9uZW50XCI+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbHVtbi1jbGVhci1hbGxcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZUNvbHVtbkNsZWFyQWxsQnRuXCIgKGNsaWNrKT1cImNsZWFyQ29sdW1uRmlsdGVyKClcIj5DbGVhciBmaWx0ZXI8L2J1dHRvbj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzPVwidGltZS1maWx0ZXItY2hlY2tib3hlc1wiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiZ3RHZW5lcmFsQ29uZmlnLmNvbXBvbmVudCA9PSAnU1BPVERFVEFJTFMnIHx8IGd0R2VuZXJhbENvbmZpZy5jb21wb25lbnQgPT0gJ0VYQ0xVREVJTlZFTlRPUllQT1BVUCcgfHwgZ3RHZW5lcmFsQ29uZmlnLmNvbXBvbmVudCA9PSAnUkFUSU5HJ1wiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICA8IS0tIE11bHRpIHRpbWUgb3B0aW9uIGNoZWNrYm94IC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiIHN0eWxlPVwicGFkZGluZzogMC41cmVtIDAgMC41cmVtIDAuNXJlbVwiICpuZ0lmPVwic2hvd011bHRpVGltZUNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwibXVsdGlUaW1lQ2hlY2tib3hDaGVja2VkXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLWljb25zIGN1c3RvbS1jb2x1bW4tY2hlY2tib3gtY2hlY2tlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdE9yVW5zZWxlY3RNdWx0aVRpbWVDaGVja2JveCgpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICBjaGVja19ib3hcclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhbXVsdGlUaW1lQ2hlY2tib3hDaGVja2VkXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLWljb25zIGN1c3RvbS1jb2x1bW4tY2hlY2tib3gtdW5jaGVja2VkXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0T3JVbnNlbGVjdE11bHRpVGltZUNoZWNrYm94KClcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIGNoZWNrX2JveF9vdXRsaW5lX2JsYW5rXHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8cCBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAycHhcIj5JbmNsdWRlIE11bHRpPC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPCEtLSBaZXJvIHRpbWUgb3B0aW9uIGNoZWNrYm94IC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiIHN0eWxlPVwicGFkZGluZzogMC41cmVtIDAgMC41cmVtIDAuNXJlbVwiICpuZ0lmPVwic2hvd1plcm9UaW1lQ2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ6ZXJvVGltZUNoZWNrYm94Q2hlY2tlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBjdXN0b20tY29sdW1uLWNoZWNrYm94LWNoZWNrZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RPclVuc2VsZWN0WmVyb1RpbWVDaGVja2JveCgpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICBjaGVja19ib3hcclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhemVyb1RpbWVDaGVja2JveENoZWNrZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgY3VzdG9tLWNvbHVtbi1jaGVja2JveC11bmNoZWNrZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RPclVuc2VsZWN0WmVyb1RpbWVDaGVja2JveCgpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICBjaGVja19ib3hfb3V0bGluZV9ibGFua1xyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW4tbGVmdDogMnB4XCI+SW5jbHVkZSBaZXJvPC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPCEtLSBFbnRlciB0aW1lIHJhbmdlIG9wdGlvbiBjaGVja2JveCAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIiBzdHlsZT1cInBhZGRpbmc6IDAuNXJlbSAwIDAuNXJlbSAwLjVyZW1cIiAqbmdJZj1cInNob3dFbnRlclRpbWVDaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImVudGVyVGltZUNoZWNrYm94Q2hlY2tlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBjdXN0b20tY29sdW1uLWNoZWNrYm94LWNoZWNrZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RPclVuc2VsZWN0RW50ZXJUaW1lQ2hlY2tib3goKVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tfYm94XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWVudGVyVGltZUNoZWNrYm94Q2hlY2tlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBjdXN0b20tY29sdW1uLWNoZWNrYm94LXVuY2hlY2tlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdE9yVW5zZWxlY3RFbnRlclRpbWVDaGVja2JveCgpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICBjaGVja19ib3hfb3V0bGluZV9ibGFua1xyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW4tbGVmdDogMnB4XCI+RW50ZXIgdGltZSByYW5nZTwvcD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtbGFiZWwtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxsYWJlbD5Gcm9tPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sIG51bWJlcklucHV0XCIgW25nQ2xhc3NdPVwieydlcnJvci1ib3JkZXInOiBzdGFydFRpbWVIb3VyRXJyfVwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRGcm9tVGltZVswXVwiIHR5cGU9XCJ0ZXh0XCIgKG5nTW9kZWxDaGFuZ2UpPVwic3RhcnRUaW1lSG91ckNoYW5nZSgkZXZlbnQpXCIgLz5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93LWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLXRyaWFuZ2xlIHVwd2FyZFwiIChjbGljayk9XCJjaGFuZ2VTdGFydFRpbWVIb3VyKHRydWUpXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLXRyaWFuZ2xlIGRvd253YXJkXCIgKGNsaWNrKT1cImNoYW5nZVN0YXJ0VGltZUhvdXIoZmFsc2UpXCI+PC9pPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb3RcIj46PC9zcGFuPlxyXG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbnVtYmVySW5wdXRcIiBbbmdDbGFzc109XCJ7J2Vycm9yLWJvcmRlcic6IHN0YXJ0VGltZU1pbkVycn1cIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRnJvbVRpbWVbMV1cIiB0eXBlPVwidGV4dFwiIChuZ01vZGVsQ2hhbmdlKT1cInN0YXJ0VGltZU1pbkNoYW5nZSgkZXZlbnQpXCIvPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyb3ctY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktdHJpYW5nbGUgdXB3YXJkXCIgKGNsaWNrKT1cImNoYW5nZVN0YXJ0VGltZU1pbnV0ZSh0cnVlKVwiPjwvaT5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS10cmlhbmdsZSBkb3dud2FyZFwiIChjbGljayk9XCJjaGFuZ2VTdGFydFRpbWVNaW51dGUoZmFsc2UpXCI+PC9pPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZS1ncm91cCBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRnJvbVRpbWVbMl1cIiAobmdNb2RlbENoYW5nZSk9XCJkaXNhYmxlVGltZUZpbHRlckFwcGx5QnV0dG9uKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgdmFsdWU9XCJBTVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5BTTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSB2YWx1ZT1cIlBNXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlBNPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlLWdyb3VwPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtbGFiZWwtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxsYWJlbD5UbzwvbGFiZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbCBudW1iZXJJbnB1dFwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRUb1RpbWVbMF1cIiBbbmdDbGFzc109XCJ7J2Vycm9yLWJvcmRlcic6IGVuZFRpbWVIb3VyRXJyfVwiIChuZ01vZGVsQ2hhbmdlKT1cImVuZFRpbWVIb3VyQ2hhbmdlKCRldmVudClcIiB0eXBlPVwidGV4dFwiIC8+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnJvdy1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS10cmlhbmdsZSB1cHdhcmRcIiAoY2xpY2spPVwiY2hhbmdlRW5kVGltZUhvdXIodHJ1ZSlcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktdHJpYW5nbGUgZG93bndhcmRcIiAoY2xpY2spPVwiY2hhbmdlRW5kVGltZUhvdXIoZmFsc2UpXCI+PC9pPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb3RcIj46PC9zcGFuPlxyXG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbnVtYmVySW5wdXRcIiBbbmdDbGFzc109XCJ7J2Vycm9yLWJvcmRlcic6IGVuZFRpbWVNaW5FcnJ9XCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFRvVGltZVsxXVwiIChuZ01vZGVsQ2hhbmdlKT1cImVuZFRpbWVNaW5DaGFuZ2UoJGV2ZW50KVwiIHR5cGU9XCJ0ZXh0XCIgLz5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93LWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLXRyaWFuZ2xlIHVwd2FyZFwiIChjbGljayk9XCJjaGFuZ2VFbmRUaW1lTWludXRlKHRydWUpXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLXRyaWFuZ2xlIGRvd253YXJkXCIgKGNsaWNrKT1cImNoYW5nZUVuZFRpbWVNaW51dGUoZmFsc2UpXCI+PC9pPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZS1ncm91cCBbKG5nTW9kZWwpXT1cInNlbGVjdGVkVG9UaW1lWzJdXCIgKG5nTW9kZWxDaGFuZ2UpPVwiZGlzYWJsZVRpbWVGaWx0ZXJBcHBseUJ1dHRvbigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVwiQU1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+QU08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgdmFsdWU9XCJQTVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5QTTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiYnV0dG9ucy1jb250YWluZXJcIj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNsb3NlVGltZUZpbHRlcigpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBjbGFzcz1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgZGlzYWJsZWQ6IGRpc2FibGVUaW1lRmlsdGVyQXBwbHlCdG4gfVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJhcHBseVRpbWVGaWx0ZXJzKClcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZVRpbWVGaWx0ZXJBcHBseUJ0blwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICBBcHBseVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2NvbHVtbkluZm9Ub29sdGlwPlxyXG4gIDxwIHN0eWxlPVwicGFkZGluZzogMC41cmVtOyBjb2xvcjogYmxhY2s7d2hpdGUtc3BhY2U6IG5vd3JhcDtcIj5UaGlzIHByZWVtcHRpb24gaXMgcmVqZWN0ZWQgYW5kIG5vdCBtYXJrZWQgZm9yIGNyZWRpdC48L3A+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI3JhdGluZ0luZm9Ub29sdGlwPlxyXG4gICAgPHAgY2xhc3M9XCJmaXJzdC1yb3dcIj5TaG93cyAnQm9va2VkIFJhdGluZycgZm9yIFByZWVtcHRpb25zICYgTWFrZUdvb2QgT2ZmZXJlZCBzcG90KHMpLjwvcD5cclxuICAgIDxwIGNsYXNzPVwic2Vjb25kLXJvd1wiPlNob3dzICdQcm9qZWN0ZWQgUmF0aW5nJyBmb3IgQURVIE9mZmVyZWQgc3BvdChzKS48L3A+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2ltcHNJbmZvVG9vbHRpcD5cclxuICAgIDxwIGNsYXNzID1cImZpcnN0LXJvd1wiID5TaG93cyAnQm9va2VkIElNUFMnIGZvciBQcmVlbXB0aW9ucyAmIE1ha2VHb29kIE9mZmVyZWQgc3BvdChzKS48L3A+XHJcbiAgICA8cCBjbGFzcz1cInNlY29uZC1yb3dcIiA+U2hvd3MgJ1Byb2plY3RlZCBJTVBTJyBmb3IgQURVIE9mZmVyZWQgc3BvdChzKS48L3A+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI3JhdGVJbmZvVG9vbHRpcD5cclxuICAgIDxwIGNsYXNzID1cImZpcnN0LXJvd1wiID5TaG93cyAnQm9va2VkIFJhdGUnIGZvciBQcmVlbXB0aW9ucyAmIE1ha2VHb29kIE9mZmVyZWQgc3BvdChzKS48L3A+XHJcbiAgICA8cCBjbGFzcz1cInNlY29uZC1yb3dcIiA+U2hvd3MgJ1Byb2plY3RlZCAkIFZhbHVlJyBmb3IgQURVIE9mZmVyZWQgc3BvdChzKS48L3A+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI3NlbGxlckhpZXJhcmNoeVRvb2x0aXA+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsbGVyR3JvdXBIaWVyYXJjaHkubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgIDx0YWJsZSBjbGFzcz1cInNlbGxlci1oaWVyYXJjaHktdGFibGVcIj5cclxuICAgICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD4jPC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGg+SW52ZW50b3J5IENvZGVzPC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGg+UHJvZ3JhbS9EZXNjcmlwdGlvbjwvdGg+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGRhdGEgb2Ygc2VsbGVyR3JvdXBIaWVyYXJjaHk7IGxldCB0b29sdGlwSW5kZXggPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD57eyB0b29sdGlwSW5kZXggKyAxIH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGRhdGEuaW52ZW50b3J5Q29kZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZGF0YS5wcm9ncmFtIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgIDwvdGFibGU+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxsZXJHcm91cEhpZXJhcmNoeS5sZW5ndGggPT0gMFwiPlxyXG4gICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6ICMwMDBcIj5TZWxsZXIgZ3JvdXAgbm90IGF2YWlsYWJsZSBmb3IgdGhpcyBpbnZlbnRvcnkgY29kZTwvc3Bhbj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNsdXJWaW9sYXRpb25JbmZvVG9vbHRpcD5cclxuICAgIDxwIGNsYXNzID1cImZpcnN0LXJvd1wiID5UaGUgdmFsdWVzIGFyZSBmb3IgdGhlIGVudGlyZSB3ZWVrLjwvcD5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=