simpo-component-library 3.6.930 → 3.6.932

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 (267) hide show
  1. package/README.md +24 -24
  2. package/esm2022/lib/components/delete-hover-element/delete-hover-element.component.mjs +3 -3
  3. package/esm2022/lib/components/document/document.component.mjs +3 -3
  4. package/esm2022/lib/components/image-loading/image-loading.component.mjs +3 -3
  5. package/esm2022/lib/components/payment-details/payment-details.component.mjs +3 -3
  6. package/esm2022/lib/constants/business.constant.mjs +1 -1
  7. package/esm2022/lib/directive/alignment.directive.mjs +1 -1
  8. package/esm2022/lib/directive/blur-content.directive.mjs +1 -1
  9. package/esm2022/lib/directive/borderlessImage.directive.mjs +1 -1
  10. package/esm2022/lib/directive/button-directive.directive.mjs +1 -1
  11. package/esm2022/lib/directive/button-editor.directive.mjs +1 -1
  12. package/esm2022/lib/directive/color.directive.mjs +1 -1
  13. package/esm2022/lib/directive/column-directive.directive.mjs +1 -1
  14. package/esm2022/lib/directive/container-alignment.directive.mjs +1 -1
  15. package/esm2022/lib/directive/container-fir.directive.mjs +1 -1
  16. package/esm2022/lib/directive/content-title-spacing.directive.mjs +1 -1
  17. package/esm2022/lib/directive/contenteditable.directive.mjs +1 -1
  18. package/esm2022/lib/directive/corner-directive.mjs +1 -1
  19. package/esm2022/lib/directive/height.directive.mjs +1 -1
  20. package/esm2022/lib/directive/hover-animation.directive.mjs +1 -1
  21. package/esm2022/lib/directive/hoverborder.directive.mjs +1 -1
  22. package/esm2022/lib/directive/icon-directive.directive.mjs +1 -1
  23. package/esm2022/lib/directive/image-container.directive.mjs +1 -1
  24. package/esm2022/lib/directive/image-directive.directive.mjs +1 -1
  25. package/esm2022/lib/directive/image-editor.directive.mjs +1 -1
  26. package/esm2022/lib/directive/image-position.directive.mjs +1 -1
  27. package/esm2022/lib/directive/letters-only.directive.mjs +1 -1
  28. package/esm2022/lib/directive/merge-header.directive.mjs +1 -1
  29. package/esm2022/lib/directive/numbers-only.directive.mjs +1 -1
  30. package/esm2022/lib/directive/position-layout-directive.directive.mjs +1 -1
  31. package/esm2022/lib/directive/set-dynamic-background.directive.mjs +1 -1
  32. package/esm2022/lib/directive/spacing-around.directive.mjs +1 -1
  33. package/esm2022/lib/directive/spacing-horizontal.directive.mjs +1 -1
  34. package/esm2022/lib/directive/spacing.directive.mjs +1 -1
  35. package/esm2022/lib/directive/text-background-directive.directive.mjs +1 -1
  36. package/esm2022/lib/directive/text-size.directive.mjs +1 -1
  37. package/esm2022/lib/directive/translate-onhover.directive.mjs +1 -1
  38. package/esm2022/lib/directive/video-directive.directive.mjs +1 -1
  39. package/esm2022/lib/directive/wrap-containers.directive.mjs +1 -1
  40. package/esm2022/lib/ecommerce/sections/address/address.component.mjs +3 -3
  41. package/esm2022/lib/ecommerce/sections/authenticate-user/authenticate-user.component.mjs +18 -14
  42. package/esm2022/lib/ecommerce/sections/authentication-required/authentication-required.component.mjs +22 -14
  43. package/esm2022/lib/ecommerce/sections/authentication-required/authentication-required.model.mjs +1 -1
  44. package/esm2022/lib/ecommerce/sections/book-appointment/book-appointment.component.mjs +3 -3
  45. package/esm2022/lib/ecommerce/sections/book-appointment/book-appointment.model.mjs +1 -1
  46. package/esm2022/lib/ecommerce/sections/cart/cart.component.mjs +3 -3
  47. package/esm2022/lib/ecommerce/sections/cart/cart.modal.mjs +1 -1
  48. package/esm2022/lib/ecommerce/sections/categories-with-image-background-columns/categories-with-image-background-columns.component.mjs +3 -3
  49. package/esm2022/lib/ecommerce/sections/category-product/category-product.component.mjs +3 -3
  50. package/esm2022/lib/ecommerce/sections/category-product/category-product.model.mjs +1 -1
  51. package/esm2022/lib/ecommerce/sections/checkout/checkout.component.mjs +3 -3
  52. package/esm2022/lib/ecommerce/sections/checkout/checkout.modal.mjs +1 -1
  53. package/esm2022/lib/ecommerce/sections/customer-review/customer-review.component.mjs +3 -3
  54. package/esm2022/lib/ecommerce/sections/customer-review/customer-review.model.mjs +1 -1
  55. package/esm2022/lib/ecommerce/sections/enrollment-form/enrollment-form.component.mjs +3 -3
  56. package/esm2022/lib/ecommerce/sections/enrollment-form/enrollment-form.model.mjs +1 -1
  57. package/esm2022/lib/ecommerce/sections/featured-category/featured-category.component.mjs +3 -3
  58. package/esm2022/lib/ecommerce/sections/featured-category/featured-category.modal.mjs +1 -1
  59. package/esm2022/lib/ecommerce/sections/featured-category/featured-collection.component.mjs +3 -3
  60. package/esm2022/lib/ecommerce/sections/featured-products/featured-products.component.mjs +4 -4
  61. package/esm2022/lib/ecommerce/sections/featured-products/featured-products.modal.mjs +1 -1
  62. package/esm2022/lib/ecommerce/sections/item-varient/item-varient.component.mjs +3 -3
  63. package/esm2022/lib/ecommerce/sections/new-collection/new-collection.component.mjs +3 -3
  64. package/esm2022/lib/ecommerce/sections/new-collection/new-collection.modal.mjs +1 -1
  65. package/esm2022/lib/ecommerce/sections/order-details/order-details.component.mjs +3 -3
  66. package/esm2022/lib/ecommerce/sections/pagnination/pagnination.component.mjs +3 -3
  67. package/esm2022/lib/ecommerce/sections/passbook-transactions/passbook-transactions.component.mjs +3 -3
  68. package/esm2022/lib/ecommerce/sections/product-category-list/product-category-list.component.mjs +3 -3
  69. package/esm2022/lib/ecommerce/sections/product-category-list/product-category-list.model.mjs +1 -1
  70. package/esm2022/lib/ecommerce/sections/product-desc/product-desc.component.mjs +12 -9
  71. package/esm2022/lib/ecommerce/sections/product-desc/product-desc.modal.mjs +1 -1
  72. package/esm2022/lib/ecommerce/sections/product-list/product-list.component.mjs +17 -16
  73. package/esm2022/lib/ecommerce/sections/product-list/product-list.modal.mjs +1 -1
  74. package/esm2022/lib/ecommerce/sections/refer-earn/refer-earn.component.mjs +3 -3
  75. package/esm2022/lib/ecommerce/sections/refer-earn/refer-earn.modal.mjs +1 -1
  76. package/esm2022/lib/ecommerce/sections/returns-calculator/returns-calculator.component.mjs +1 -1
  77. package/esm2022/lib/ecommerce/sections/returns-calculator/returns-calculator.model.mjs +1 -1
  78. package/esm2022/lib/ecommerce/sections/scheme-details/scheme-details.component.mjs +3 -3
  79. package/esm2022/lib/ecommerce/sections/scheme-selection/scheme-selection.component.mjs +3 -3
  80. package/esm2022/lib/ecommerce/sections/schemes/schemes.component.mjs +3 -3
  81. package/esm2022/lib/ecommerce/sections/schemes/schemes.component.model.mjs +1 -1
  82. package/esm2022/lib/ecommerce/sections/small-product-listing/small-product-listing.component.mjs +3 -3
  83. package/esm2022/lib/ecommerce/sections/store-list/store-list.component.mjs +3 -3
  84. package/esm2022/lib/ecommerce/sections/store-list/store-list.modal.mjs +1 -1
  85. package/esm2022/lib/ecommerce/sections/store-page/store-page.component.mjs +3 -3
  86. package/esm2022/lib/ecommerce/sections/store-page/store-page.model.mjs +1 -1
  87. package/esm2022/lib/ecommerce/sections/user-basic-info/user-basic-info.component.mjs +3 -3
  88. package/esm2022/lib/ecommerce/sections/user-profile/user-profile.modal.mjs +1 -1
  89. package/esm2022/lib/ecommerce/sections/verify-payment/verify-payment.component.mjs +3 -3
  90. package/esm2022/lib/ecommerce/sections/verify-payment/verify-payment.model.mjs +1 -1
  91. package/esm2022/lib/ecommerce/sections/whislist/whislist.component.mjs +3 -3
  92. package/esm2022/lib/ecommerce/styles/BaseCollection.modal.mjs +1 -1
  93. package/esm2022/lib/ecommerce/styles/Collection.modal.mjs +1 -1
  94. package/esm2022/lib/ecommerce/styles/OrderedItems.modal.mjs +1 -1
  95. package/esm2022/lib/ecommerce/styles/PincodeLocation.model.mjs +1 -1
  96. package/esm2022/lib/ecommerce/styles/PincodeLocationInter.model.mjs +1 -1
  97. package/esm2022/lib/ecommerce/styles/cart.modal.mjs +1 -1
  98. package/esm2022/lib/ecommerce/styles/category.modal.mjs +1 -1
  99. package/esm2022/lib/ecommerce/styles/order.modal.mjs +1 -1
  100. package/esm2022/lib/ecommerce/styles/product.modal.mjs +1 -1
  101. package/esm2022/lib/ecommerce/styles/review.modal.mjs +1 -1
  102. package/esm2022/lib/ecommerce/styles/user.modal.mjs +1 -1
  103. package/esm2022/lib/elements/add-section/add-section.component.mjs +3 -3
  104. package/esm2022/lib/elements/address-list/address-list.component.mjs +3 -3
  105. package/esm2022/lib/elements/below-image-card/below-image-card.component.mjs +3 -3
  106. package/esm2022/lib/elements/button/button.component.mjs +3 -3
  107. package/esm2022/lib/elements/button/button.model.mjs +1 -1
  108. package/esm2022/lib/elements/card-skeleton-loader/card-skeleton-loader.component.mjs +3 -3
  109. package/esm2022/lib/elements/covering-image-card/covering-image-card.component.mjs +3 -3
  110. package/esm2022/lib/elements/editor-service.service.mjs +1 -1
  111. package/esm2022/lib/elements/heading-element/heading-element.component.mjs +3 -3
  112. package/esm2022/lib/elements/index.mjs +1 -1
  113. package/esm2022/lib/elements/link-editor/link-editor.component.mjs +3 -3
  114. package/esm2022/lib/elements/list-home-appointment/list-home-appointment.component.mjs +3 -3
  115. package/esm2022/lib/elements/media-selector/media-selector.component.mjs +3 -3
  116. package/esm2022/lib/elements/portfolio/portfolio.component.mjs +3 -3
  117. package/esm2022/lib/elements/pricing-s1/pricing-s1.component.mjs +3 -3
  118. package/esm2022/lib/elements/property/property.component.mjs +3 -3
  119. package/esm2022/lib/elements/schedule-video-call/schedule-video-call.component.mjs +3 -3
  120. package/esm2022/lib/elements/simpo-button/simpo-button.component.mjs +3 -3
  121. package/esm2022/lib/elements/svg-divider/svg-divider.component.mjs +3 -3
  122. package/esm2022/lib/elements/text/text.component.mjs +3 -3
  123. package/esm2022/lib/elements/text-editor/text-editor.component.mjs +7 -7
  124. package/esm2022/lib/elements/top-of-image-card/top-of-image-card.component.mjs +3 -3
  125. package/esm2022/lib/pipes/amount.pipe.mjs +1 -1
  126. package/esm2022/lib/pipes/gender.pipe.mjs +1 -1
  127. package/esm2022/lib/sections/BaseSection.mjs +1 -1
  128. package/esm2022/lib/sections/add-new-section/add-new-section.component.mjs +3 -3
  129. package/esm2022/lib/sections/appointment-form/appointment-booking/appointment-booking/appointment-booking.component.mjs +3 -3
  130. package/esm2022/lib/sections/appointment-form/appointment-form.component.mjs +3 -3
  131. package/esm2022/lib/sections/appointment-form/appointment-form.model.mjs +1 -1
  132. package/esm2022/lib/sections/banner-carousel/banner-carousel.component.mjs +3 -3
  133. package/esm2022/lib/sections/banner-carousel/banner-carousel.model.mjs +1 -1
  134. package/esm2022/lib/sections/banner-grid-section/banner-grid-section.component.mjs +3 -3
  135. package/esm2022/lib/sections/blog-list/blog-list.component.mjs +3 -3
  136. package/esm2022/lib/sections/blog-list/blog-list.model.mjs +1 -1
  137. package/esm2022/lib/sections/brand-story-section/brand-story-section.component.mjs +3 -3
  138. package/esm2022/lib/sections/brand-story-section/brand-story-section.modal.mjs +1 -1
  139. package/esm2022/lib/sections/button-grid-section/button-grid-section.component.mjs +3 -3
  140. package/esm2022/lib/sections/choose-us-section/choose-us-section.component.mjs +3 -3
  141. package/esm2022/lib/sections/choose-us-section/choose-us-section.model.mjs +1 -1
  142. package/esm2022/lib/sections/condensed-and-gradient/condensed-and-gradient.component.mjs +3 -3
  143. package/esm2022/lib/sections/countdown-banner/countdown-banner.component.mjs +3 -3
  144. package/esm2022/lib/sections/countdown-banner/countdown-banner.component.model.mjs +1 -1
  145. package/esm2022/lib/sections/faq-columns-cards/faq-columns-cards.component.mjs +3 -3
  146. package/esm2022/lib/sections/faq-columns-cards/faq-columns-cards.modal.mjs +1 -1
  147. package/esm2022/lib/sections/faq-section/faq-section.component.mjs +3 -3
  148. package/esm2022/lib/sections/faq-section/faq-section.modal.mjs +1 -1
  149. package/esm2022/lib/sections/feature-experience-section/feature-experience-section.component.mjs +3 -3
  150. package/esm2022/lib/sections/feature-experience-section/feature-experience-section.modal.mjs +1 -1
  151. package/esm2022/lib/sections/features-section/features-section.component.mjs +3 -3
  152. package/esm2022/lib/sections/features-section/features-section.model.mjs +1 -1
  153. package/esm2022/lib/sections/footer/footer.component.mjs +3 -3
  154. package/esm2022/lib/sections/footer/footer.modal.mjs +1 -1
  155. package/esm2022/lib/sections/four-features-centered-image/four-features-centered-image.component.mjs +3 -3
  156. package/esm2022/lib/sections/four-features-centered-image/four-features-centered-image.modal.mjs +1 -1
  157. package/esm2022/lib/sections/header-section/header-section.component.mjs +3 -3
  158. package/esm2022/lib/sections/header-section/header-section.model.mjs +1 -1
  159. package/esm2022/lib/sections/header-text/header-text.component.mjs +3 -3
  160. package/esm2022/lib/sections/header-text/header-text.model.mjs +1 -1
  161. package/esm2022/lib/sections/image-background/image-background/image-background.component.mjs +3 -3
  162. package/esm2022/lib/sections/image-background/image-background/image-background.component.model.mjs +1 -1
  163. package/esm2022/lib/sections/image-carousel-section/image-carousel-section.component.mjs +3 -3
  164. package/esm2022/lib/sections/image-carousel-section/image-carousel.model.mjs +1 -1
  165. package/esm2022/lib/sections/image-grid-hotspot/image-grid-hotspot.component.mjs +3 -3
  166. package/esm2022/lib/sections/image-grid-hotspot/image-grid-hotspot.model.mjs +1 -1
  167. package/esm2022/lib/sections/image-grid-section/image-grid-section.component.mjs +3 -3
  168. package/esm2022/lib/sections/image-grid-section/image-grid-section.model.mjs +1 -1
  169. package/esm2022/lib/sections/image-section/image-section.component.mjs +3 -3
  170. package/esm2022/lib/sections/image-section/image-section.model.mjs +1 -1
  171. package/esm2022/lib/sections/location-section/location-section.component.mjs +3 -3
  172. package/esm2022/lib/sections/location-section/location-section.modal.mjs +1 -1
  173. package/esm2022/lib/sections/logo-showcase/logo-showcase.component.mjs +3 -3
  174. package/esm2022/lib/sections/logo-showcase/logo-showcase.modal.mjs +1 -1
  175. package/esm2022/lib/sections/moving-text/moving-text.component.mjs +3 -3
  176. package/esm2022/lib/sections/moving-text/moving-text.modal.mjs +1 -1
  177. package/esm2022/lib/sections/new-services/new-services.component.mjs +3 -3
  178. package/esm2022/lib/sections/new-services/new-services.model.mjs +1 -1
  179. package/esm2022/lib/sections/new-testimonials/new-testimonials.component.mjs +3 -3
  180. package/esm2022/lib/sections/new-testimonials/new-testimonials.model.mjs +1 -1
  181. package/esm2022/lib/sections/news-letter-component/news-letter-component.component.mjs +3 -3
  182. package/esm2022/lib/sections/news-letter-component/news-letter.modal.mjs +1 -1
  183. package/esm2022/lib/sections/overlapping-image/overlapping-image.component.mjs +3 -3
  184. package/esm2022/lib/sections/overlapping-image/overlapping-image.component.modal.mjs +1 -1
  185. package/esm2022/lib/sections/pricing-section/pricing-section.component.mjs +3 -3
  186. package/esm2022/lib/sections/pricing-section/pricing-section.modal.mjs +1 -1
  187. package/esm2022/lib/sections/process-modern/process-modern.component.mjs +3 -3
  188. package/esm2022/lib/sections/process-modern/process-modern.model.mjs +1 -1
  189. package/esm2022/lib/sections/process-section/process-section.component.mjs +3 -3
  190. package/esm2022/lib/sections/process-section/process-section.modal.mjs +1 -1
  191. package/esm2022/lib/sections/product-info-section/product-info-section.component.mjs +3 -3
  192. package/esm2022/lib/sections/product-info-section/product-info-section.component.modal.mjs +1 -1
  193. package/esm2022/lib/sections/property-component/property-component.component.mjs +3 -3
  194. package/esm2022/lib/sections/property-component/property-component.modal.mjs +1 -1
  195. package/esm2022/lib/sections/property-list/property-list.component.mjs +3 -3
  196. package/esm2022/lib/sections/property-list/property-list.modal.mjs +1 -1
  197. package/esm2022/lib/sections/recent-blog-post-section/recent-blog-post-section.component.mjs +3 -3
  198. package/esm2022/lib/sections/recent-blog-post-section/recent-blog-post-section.model.mjs +1 -1
  199. package/esm2022/lib/sections/registration-form/registration-form.component.mjs +3 -3
  200. package/esm2022/lib/sections/registration-form/registrationForm.model.mjs +1 -1
  201. package/esm2022/lib/sections/scheme-detail/scheme-detail.component.mjs +3 -3
  202. package/esm2022/lib/sections/scheme-detail/scheme-detail.modal.mjs +1 -1
  203. package/esm2022/lib/sections/service-section/service-section.component.mjs +3 -3
  204. package/esm2022/lib/sections/service-section/service-section.model.mjs +1 -1
  205. package/esm2022/lib/sections/skeleton-loader-section/skeleton-loader-section.component.mjs +3 -3
  206. package/esm2022/lib/sections/team-member-section/team-member-section.component.mjs +3 -3
  207. package/esm2022/lib/sections/team-member-section/team-member-section.model.mjs +1 -1
  208. package/esm2022/lib/sections/testimonial-fullwidth/testimonial-fullwidth.component.mjs +3 -3
  209. package/esm2022/lib/sections/testimonial-fullwidth/testimonial-fullwidth.model.mjs +1 -1
  210. package/esm2022/lib/sections/testimonial-masonry/testimonial-masonry.component.mjs +3 -3
  211. package/esm2022/lib/sections/testimonial-masonry/testimonial-masonry.model.mjs +1 -1
  212. package/esm2022/lib/sections/testimonial-section/testimonial-section.component.mjs +3 -3
  213. package/esm2022/lib/sections/testimonial-section/testimonial-section.model.mjs +1 -1
  214. package/esm2022/lib/sections/testimonial-slider/testimonial-slider.component.mjs +3 -3
  215. package/esm2022/lib/sections/testimonial-slider/testimonial-slider.model.mjs +1 -1
  216. package/esm2022/lib/sections/testimonial-video/testimonial-video.component.mjs +3 -3
  217. package/esm2022/lib/sections/testimonial-video/testimonial-video.model.mjs +1 -1
  218. package/esm2022/lib/sections/text-section/text-section.model.mjs +1 -1
  219. package/esm2022/lib/sections/usp-video-section/usp-video-section.component.mjs +3 -3
  220. package/esm2022/lib/sections/usp-video-section/usp-video-section.model.mjs +1 -1
  221. package/esm2022/lib/sections/video-carousel-section/video-carousel-section.component.mjs +3 -3
  222. package/esm2022/lib/sections/video-carousel-section/video-carousel.model.mjs +1 -1
  223. package/esm2022/lib/sections/video-grid-section/video-grid-section.component.mjs +4 -4
  224. package/esm2022/lib/sections/video-grid-section/video-grid-section.model.mjs +1 -1
  225. package/esm2022/lib/sections/video-section/video-section.component.mjs +3 -3
  226. package/esm2022/lib/sections/video-section/video-section.model.mjs +1 -1
  227. package/esm2022/lib/sections/video-showcase/video-showcase.component.mjs +4 -4
  228. package/esm2022/lib/sections/view-blog/view-blog.component.mjs +3 -3
  229. package/esm2022/lib/services/analytics.service.mjs +59 -9
  230. package/esm2022/lib/services/cart.service.mjs +28 -35
  231. package/esm2022/lib/services/endUser.service.mjs +1 -1
  232. package/esm2022/lib/services/image-upload-service.service.mjs +1 -1
  233. package/esm2022/lib/services/rest.service.mjs +2 -2
  234. package/esm2022/lib/services/sanitizeHtml.mjs +1 -1
  235. package/esm2022/lib/services/storage.service.mjs +15 -1
  236. package/esm2022/lib/styles/gradient-extension.mjs +1 -1
  237. package/esm2022/lib/styles/index.mjs +1 -1
  238. package/esm2022/lib/styles/style.model.mjs +1 -1
  239. package/esm2022/lib/styles/text-size.extension.mjs +1 -1
  240. package/esm2022/lib/styles/types.mjs +1 -1
  241. package/esm2022/lib/tokens/api-token.mjs +1 -1
  242. package/esm2022/public-api.mjs +1 -1
  243. package/fesm2022/simpo-component-library.mjs +522 -450
  244. package/fesm2022/simpo-component-library.mjs.map +1 -1
  245. package/lib/components/input-fields/input-fields.component.d.ts +1 -1
  246. package/lib/ecommerce/sections/authenticate-user/authenticate-user.component.d.ts +4 -2
  247. package/lib/ecommerce/sections/authentication-required/authentication-required.component.d.ts +5 -3
  248. package/lib/ecommerce/sections/featured-category/featured-category.component.d.ts +1 -1
  249. package/lib/ecommerce/sections/featured-category/featured-collection.component.d.ts +1 -1
  250. package/lib/ecommerce/sections/new-collection/new-collection.component.d.ts +1 -1
  251. package/lib/ecommerce/sections/product-desc/product-desc.component.d.ts +1 -1
  252. package/lib/ecommerce/sections/product-list/product-list.component.d.ts +3 -1
  253. package/lib/ecommerce/sections/schemes/schemes.component.d.ts +1 -1
  254. package/lib/sections/banner-carousel/banner-carousel.component.d.ts +2 -2
  255. package/lib/sections/carousel-banner/carousel-banner.component.d.ts +1 -1
  256. package/lib/sections/image-grid-hotspot/image-grid-hotspot.component.d.ts +1 -1
  257. package/lib/sections/image-grid-section/image-grid-section.component.d.ts +1 -1
  258. package/lib/sections/image-section/image-section.component.d.ts +2 -2
  259. package/lib/sections/logo-showcase/logo-showcase.component.d.ts +2 -2
  260. package/lib/sections/new-testimonials/new-testimonials.component.d.ts +1 -1
  261. package/lib/sections/pricing-section/pricing-section.component.d.ts +1 -1
  262. package/lib/services/analytics.service.d.ts +13 -0
  263. package/lib/services/cart.service.d.ts +5 -7
  264. package/lib/services/storage.service.d.ts +6 -0
  265. package/package.json +1 -1
  266. package/simpo-component-library-3.6.932.tgz +0 -0
  267. package/simpo-component-library-3.6.930.tgz +0 -0
@@ -26,7 +26,6 @@ import { ColorDirective } from '../../../directive/color.directive';
26
26
  import { MatChipsModule } from '@angular/material/chips';
27
27
  import { ButtonEditorDirective } from '../../../directive/button-editor.directive';
28
28
  import { SpacingHorizontalDirective } from '../../../directive/spacing-horizontal.directive';
29
- // import { AnalyticsService } from '../../../services/analytics.service';
30
29
  import { catchError, forkJoin, of } from 'rxjs';
31
30
  import * as i0 from "@angular/core";
32
31
  import * as i1 from "../../../services/events.service";
@@ -37,13 +36,14 @@ import * as i5 from "@angular/material/bottom-sheet";
37
36
  import * as i6 from "@angular/material/dialog";
38
37
  import * as i7 from "../../../services/cart.service";
39
38
  import * as i8 from "primeng/api";
40
- import * as i9 from "@angular/common";
41
- import * as i10 from "@angular/forms";
42
- import * as i11 from "../../../components/hover-elements/hover-elements.component";
43
- import * as i12 from "../../../components/delete-hover-element/delete-hover-element.component";
44
- import * as i13 from "ngx-skeleton-loader";
45
- import * as i14 from "@angular/material/radio";
46
- import * as i15 from "primeng/toast";
39
+ import * as i9 from "../../../services/analytics.service";
40
+ import * as i10 from "@angular/common";
41
+ import * as i11 from "@angular/forms";
42
+ import * as i12 from "../../../components/hover-elements/hover-elements.component";
43
+ import * as i13 from "../../../components/delete-hover-element/delete-hover-element.component";
44
+ import * as i14 from "ngx-skeleton-loader";
45
+ import * as i15 from "@angular/material/radio";
46
+ import * as i16 from "primeng/toast";
47
47
  export class ProductListComponent extends BaseSection {
48
48
  getScreenSize() {
49
49
  this.screenWidth = window.innerWidth;
@@ -51,7 +51,7 @@ export class ProductListComponent extends BaseSection {
51
51
  onWindowScroll(event) {
52
52
  this.scrollingValue = window.pageYOffset || document.documentElement.scrollTop;
53
53
  }
54
- constructor(platformId, _eventService, restService, router, activatedRoute, storageService, matBottomSheet, matDialog, cartService, messageService, renderer) {
54
+ constructor(platformId, _eventService, restService, router, activatedRoute, storageService, matBottomSheet, matDialog, cartService, messageService, renderer, analyticsService) {
55
55
  super();
56
56
  this.platformId = platformId;
57
57
  this._eventService = _eventService;
@@ -64,6 +64,7 @@ export class ProductListComponent extends BaseSection {
64
64
  this.cartService = cartService;
65
65
  this.messageService = messageService;
66
66
  this.renderer = renderer;
67
+ this.analyticsService = analyticsService;
67
68
  this.responseData = [];
68
69
  this.tagIndexMap = {};
69
70
  this.isLoading = false;
@@ -459,7 +460,7 @@ export class ProductListComponent extends BaseSection {
459
460
  }
460
461
  analyticsEvent['CATEGORIES'] = this.categories.filter(x => x.status).map(x => x.id);
461
462
  analyticsEvent['COLLECTIONS'] = this.collections.filter(x => x.status).map(x => x.id);
462
- // this.analyticsService.startNewContext(analyticsEvent, this.latestAnalyicsEvent);
463
+ this.analyticsService.startNewContext(analyticsEvent, this.latestAnalyicsEvent);
463
464
  }
464
465
  getCategoriesAndCollection() {
465
466
  forkJoin([
@@ -765,7 +766,7 @@ export class ProductListComponent extends BaseSection {
765
766
  else {
766
767
  product.whislist = false;
767
768
  this.messageService.add({ severity: 'info', summary: 'Wishlist', detail: 'Item removed from your wishlist' });
768
- this.cartService.removeItemFromFavourite(product.varientId);
769
+ this.cartService.removeItemFromFavourite(product.varientId, product.itemId);
769
770
  }
770
771
  if (product.whislist) {
771
772
  this.USER_WISHLIST?.push(new OrderedItems(product, product.varientId));
@@ -1106,8 +1107,8 @@ export class ProductListComponent extends BaseSection {
1106
1107
  const brightness = (r * 299 + g * 587 + b * 114) / 1000;
1107
1108
  return brightness > threshold ? '#000000' : '#ffffff';
1108
1109
  }
1109
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProductListComponent, deps: [{ token: PLATFORM_ID }, { token: i1.EventsService }, { token: i2.RestService }, { token: i3.Router }, { token: i3.ActivatedRoute }, { token: i4.StorageServiceService }, { token: i5.MatBottomSheet }, { token: i6.MatDialog }, { token: i7.CartService }, { token: i8.MessageService }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
1110
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ProductListComponent, isStandalone: true, selector: "simpo-product-list", inputs: { responseData: "responseData", data: "data", index: "index", edit: "edit", delete: "delete", customClass: "customClass", nextComponentColor: "nextComponentColor" }, host: { listeners: { "window:resize": "getScreenSize()", "window:scroll": "onWindowScroll($event)" } }, providers: [MessageService], viewQueries: [{ propertyName: "listScrollContainer", first: true, predicate: ["listScrollContainer"], descendants: true }, { propertyName: "filterScroll", first: true, predicate: ["filterScroll"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Call Schedule\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Scheduling\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n\r\n<!-- <div class=\"input-group\" *ngIf=\"isMobile\" [ngClass]=\"{'input-group-sticky': scrollingValue > 20}\">\r\n <mat-icon class=\"f-20 d-flex align-item-center justify-content-center\">search</mat-icon>\r\n <input type=\"text\" class=\"form-control\" placeholder=\"Search Product..\" aria-label=\"Search Product\"\r\n [(ngModel)]=\"searchText\" (ngModelChange)=\"searchProduct()\">\r\n</div> -->\r\n\r\n<ng-container *ngIf=\"!isLoading\">\r\n <section [id]=\"data?.id\" class=\"container-fluid total-container\" [simpoLayout]=\"styles?.layout\" simpoHover\r\n (hovering)=\"showEditTabs($event)\" [simpoBackground]=\"styles?.background\"\r\n [style.paddingTop.px]=\"isMobile ? '0 !important' : ''\" [attr.style]=\"customClass\"\r\n [spacingHorizontal]=\"stylesLayout\">\r\n\r\n <!-- <div style=\"position: relative;\" class=\"speeddial-linear\" *ngIf=\"isMobile\">\r\n <p-speedDial [model]=\"items\" direction=\"up\"\r\n [buttonStyle]=\"{'border-radius': '50%', 'height': '30px'}\"></p-speedDial>\r\n </div> -->\r\n\r\n <div class=\"d-flex justify-content-between align-items-center w-100 onlyDesktop\">\r\n <div class=\"filter-top-section d-flex justify-content-between align-items-baseline\">\r\n <div class=\"filter body-large\">\r\n Filters\r\n </div>\r\n <div class=\"clear\" (click)=\"clearFilter()\" [style.color]=\"styles?.background?.accentColor\">\r\n CLEAR ALL\r\n </div>\r\n </div>\r\n <div itemid=\"top-section\" class=\"d-flex align-items-center justify-content-between\"\r\n style=\"width: 77.5%; margin-right: 1%;\">\r\n <div class=\"d-flex gap-15\" style=\"width: 75%; display:flex; flex-wrap:wrap\">\r\n <ng-container *ngFor=\"let filter of filteredChips\">\r\n <div class=\"d-flex justify-content-between align-item-center w-90 chip\">\r\n <span>{{filter.name}}</span>\r\n <span style=\"cursor: pointer; width:20px; height: 20px;\">\r\n <mat-icon style=\"font-size: 20px;\" (click)=\"removeFilter(filter)\">close</mat-icon>\r\n </span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <!-- <div class=\"d-flex align-items-center\" style=\"gap: 10px;\">\r\n <div class=\"fs-6 fw-normal mr-3\">Sort by</div>\r\n <select [(ngModel)]=\"sortBy\" (change)=\"applyFilter($event, 'SORT')\" style=\"color: black;\">\r\n <option [value]=\"filter.value\" *ngFor=\"let filter of filteringArray\">{{ filter.name }}</option>\r\n </select>\r\n </div> -->\r\n <div class=\"custom-sort-dropdown\" tabindex=\"0\" (blur)=\"closeDropdown()\" (click)=\"toggleDropdown()\">\r\n <span class=\"sort-label\">Sort By:</span>\r\n <span class=\"selected-value\">{{ getSelectedName() || 'Featured' }}</span>\r\n <span class=\"toggle-icon\" [class.open]=\"isOpen\">&#9662;</span> <!-- Down arrow, rotates open -->\r\n\r\n <div class=\"options\" *ngIf=\"isOpen\">\r\n <div *ngFor=\"let filter of filteringArray\" class=\"option\" [class.selected]=\"filter.value === sortBy\"\r\n (click)=\"selectOption(filter, $event)\">\r\n {{ filter.name }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"isMobile\" class=\"d-flex w-100 onlyMobile gap-15 flex-wrap\">\r\n <ng-container *ngFor=\"let filter of filteredChips\">\r\n <div class=\"d-flex justify-content-between align-item-center w-90 chip\">\r\n <span>{{filter.name}}</span>\r\n <span style=\"cursor: pointer; width:20px; height: 20px;\">\r\n <mat-icon style=\"font-size: 20px;\" (click)=\"removeFilter(filter)\">close</mat-icon>\r\n </span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"main-product-section\">\r\n <div class=\"filter-side\">\r\n <ng-container *ngTemplateOutlet=\"FilterSection\"></ng-container>\r\n </div>\r\n <div [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\" class=\"right-side\" (scroll)=\"handleProductListScroll()\"\r\n #listScrollContainer>\r\n <ng-container *ngIf=\"!apiLoading\">\r\n <div class=\"product-parent\" *ngIf=\"responseData && responseData.length > 0\">\r\n <div *ngFor=\"let product of responseData; let i = index\" class=\"product\"\r\n [style.width]=\"applyProductWidth() ? getProductWidth() : ''\" style=\"cursor:pointer; position: relative;\">\r\n <ng-container *ngIf=\"styles?.theme == theme.Theme1\">\r\n <ng-container *ngTemplateOutlet=\"ProductDesc; context: {data: product, index: i}\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"styles?.theme != theme.Theme1\">\r\n <simpo-small-product-listing [product]=\"product\" [data]=\"data\" [isScrollable]=\"screenWidth > 475\"\r\n [index]=\"i\"></simpo-small-product-listing>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <simpo-card-skeleton-loader *ngIf=\"isListLoading\" [count]=\"getElementRow()\"></simpo-card-skeleton-loader>\r\n <section class=\"empty-cart\" *ngIf=\"!isListLoading && responseData?.length == 0\">\r\n <div>\r\n <div class=\"cart-image\">\r\n <img loading=\"lazy\" style=\"height: 150px; width: 150px;\"\r\n src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/107213c1716543334040empty-cart.png\"\r\n alt=\"\">\r\n </div>\r\n <div class=\"cart-text\">\r\n <div class=\"heading-medium d-flex justify-content-center\">\r\n Product list is empty\r\n </div>\r\n <div class=\"description d-flex justify-content-center mt-4\">\r\n Looks like no item is present with filter. Go ahead & explore top categories.\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n </ng-container>\r\n <simpo-card-skeleton-loader *ngIf=\"apiLoading\" [count]=\"getElementRow()\"></simpo-card-skeleton-loader>\r\n </div>\r\n\r\n <div class=\"bottom-filter\">\r\n <div class=\"d-flex filter-text\" style=\"gap: 10px\" (click)=\"openSorting(SortingSection)\">\r\n <mat-icon>sort</mat-icon>\r\n <span>Sort by</span>\r\n </div>\r\n <div class=\"divider\"></div>\r\n <div class=\"d-flex filter-text\" style=\"gap: 10px\" (click)=\"openFilter(FilterSection)\">\r\n <mat-icon>filter_list</mat-icon>\r\n <span>Filter</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\r\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"\r\n [isEcommerce]=\"true\"></simpo-hover-elements>\r\n </div>\r\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\r\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\r\n </div>\r\n </section>\r\n</ng-container>\r\n\r\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\"\r\n [theme]=\"{ width: '100%', height: '40vh', 'border-radius': '10px', 'position': 'relative', 'right': '5px' }\"></ngx-skeleton-loader>\r\n\r\n<ng-template #FavouriteTags let-product=\"data\">\r\n <div class=\"fav-icon-wrapper\">\r\n <mat-icon class=\"fav-icon\" [style.color]=\"data?.styles?.background?.accentColor\"\r\n (click)=\"toggleItemToFav($event, product, 'ADD')\" *ngIf=\"!product.whislist\">favorite_border\r\n </mat-icon>\r\n <mat-icon class=\"fav-icon\" [style.color]=\"data?.styles?.background?.accentColor\"\r\n (click)=\"toggleItemToFav($event, product, 'REMOVE')\" *ngIf=\"product.whislist\">favorite\r\n </mat-icon>\r\n <span class=\"fav-tooltip\">\r\n {{ product.whislist ? 'Remove from wishlist' : 'Add to wishlist' }}\r\n </span>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n\r\n<ng-template #Tags let-product=\"data\">\r\n <div class=\"product-tag-badge\" *ngIf=\"product?.tags?.length\">\r\n <span *ngFor=\"let tag of product.tags; let i = index\" class=\"product-tag-label\"\r\n [class.tag-active]=\"i === (tagIndexMap[product.itemId] ?? 0)\" [style.background]=\"styles?.background?.accentColor\"\r\n [style.color]=\"getTextColor(styles?.background?.accentColor)\">\r\n {{ tag }}\r\n </span>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<ng-template #FilterSection>\r\n <section>\r\n <div class=\"categories-section\" *ngIf=\"categories?.length\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"categoriesCollapsed = !categoriesCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Shop by Categories</b></h6>\r\n <mat-icon>{{ categoriesCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!categoriesCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let category of displayedCategories\"\r\n (click)=\"applyFilter(category, 'FILTER')\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"category.status\" />\r\n <div class=\"trim-text\">{{category.option | titlecase}}</div>\r\n </div>\r\n <div *ngIf=\"categories.length > 4\" class=\"toggle-categories\" (click)=\"toggleCategories()\"\r\n [style.color]=\"styles?.background?.accentColor\">\r\n <span class=\"toggle-text\">\r\n {{ showAllCategories ? 'Show Less' : 'Show More' }}\r\n <span class=\"dropdown-icon\">\r\n <ng-container *ngIf=\"!showAllCategories\">\r\n <mat-icon>expand_more</mat-icon>\r\n </ng-container>\r\n <ng-container *ngIf=\"showAllCategories\">\r\n <mat-icon>expand_less</mat-icon>\r\n </ng-container>\r\n </span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\" *ngIf=\"collections?.length\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"collectionsCollapsed = !collectionsCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Shop by Collections</b></h6>\r\n <mat-icon>{{ collectionsCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!collectionsCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let collection of displayedCollections\"\r\n (click)=\"applyFilter(collection, 'FILTER')\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"collection.status\" />\r\n <div class=\"trim-text\">{{collection.option | titlecase}}</div>\r\n </div>\r\n <div *ngIf=\"collections.length > 4\" class=\"toggle-categories\" (click)=\"toggleCollections()\"\r\n [style.color]=\"styles?.background?.accentColor\">\r\n <span class=\"toggle-text\">\r\n {{ showAllCollections ? 'Show Less' : 'Show More' }}\r\n <span class=\"dropdown-icon\">\r\n <ng-container *ngIf=\"!showAllCollections\"><mat-icon>expand_more</mat-icon></ng-container>\r\n <ng-container *ngIf=\"showAllCollections\"><mat-icon>expand_less</mat-icon></ng-container>\r\n </span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"ratingsCollapsed = !ratingsCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Ratings</b></h6>\r\n <mat-icon>{{ ratingsCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!ratingsCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let rating of ratingOptions\" (click)=\"onRatingChange(rating)\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"rating.selected\" />\r\n <div class=\"trim-text\">{{ rating.label }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"priceCollapsed = !priceCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Shop by price</b></h6>\r\n <mat-icon>{{ priceCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!priceCollapsed\">\r\n <label class=\"category-options\" *ngFor=\"let range of priceRanges;let i = index\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [(ngModel)]=\"range.selected\" (change)=\"onPriceRangeChange(i)\" />\r\n <div class=\"trim-text\">{{ range.label }}</div>\r\n </label>\r\n </ng-container>\r\n </div>\r\n\r\n\r\n\r\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"productTypeCollapsed = !productTypeCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Product Type</b></h6>\r\n <mat-icon>{{ productTypeCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!productTypeCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let size of productTypesData\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"size.status\" (change)=\"toggleProductSize(size)\" />\r\n <div class=\"trim-text\">{{ size.size }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"shopForCollapsed = !shopForCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Shop for</b></h6>\r\n <mat-icon>{{ shopForCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!shopForCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let size of shopForData\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"size.status\" (change)=\"toggleShopSize(size)\" />\r\n <div class=\"trim-text\">{{ size.size }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"materialCollapsed = !materialCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Material</b></h6>\r\n <mat-icon>{{ materialCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!materialCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let size of materialSizeData\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"size.status\" (change)=\"toggleMaterialSize(size)\" />\r\n <div class=\"trim-text\">{{ size.size }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"metalCollapsed = !metalCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Metal</b></h6>\r\n <mat-icon>{{ metalCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!metalCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let size of metalSizeData\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"size.status\" (change)=\"toggleMetalSize(size)\" />\r\n <div class=\"trim-text\">{{ size.size }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"ringStyleCollapsed = !ringStyleCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Ring Style</b></h6>\r\n <mat-icon>{{ ringStyleCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!ringStyleCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let size of ringSizes\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"size.status\" (change)=\"toggleSize(size)\" />\r\n <div class=\"trim-text\">{{ size.size }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </section>\r\n</ng-template>\r\n\r\n<ng-template #SortingSection>\r\n <section style=\"padding: 10px\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-item-center \" style=\"padding: 0px;\">\r\n <span>Sort by</span>\r\n <mat-icon (click)=\"closeDialog()\">close</mat-icon>\r\n </div>\r\n <mat-radio-group class=\"d-flex flex-column\" [(ngModel)]=\"sortBy\">\r\n <mat-radio-button *ngFor=\"let sortingType of filteringArray\" (click)=\"selectOption(sortingType, $event)\"\r\n [value]=\"sortingType.value\">{{sortingType.name}}</mat-radio-button>\r\n </mat-radio-group>\r\n </section>\r\n</ng-template>\r\n\r\n<ng-template #ProductDesc let-product=\"data\" let-index=\"index\">\r\n <ng-template #theme1style1>\r\n <div class=\"product-card position-relative h-100\" [ngClass]=\"{'hover-effect': styles?.theme == theme.Theme1}\">\r\n <div *ngIf=\"!(product.itemImages?.length && product.itemImages?.[0]?.imgUrl)\"\r\n class=\"default-image position-relative\">\r\n <img loading=\"lazy\" src=\"https://i.postimg.cc/hPS2JpV0/no-image-available.jpg\" alt=\"\"\r\n (click)=\"proceedToProductDesc(product)\" [simpoBackground]=\"styles?.background\">\r\n <ng-container *ngTemplateOutlet=\"FavouriteTags; context: {data: product}\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"Tags; context: {data: product}\"></ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"product.itemImages?.length && product.itemImages?.[0]?.imgUrl\"\r\n class=\"default-image position-relative\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\r\n [src]=\"getProductImages(product)\" alt=\"\" class=\"product-img\" [class.fade-out]=\"imageIndex == index\"\r\n (click)=\"proceedToProductDesc(product)\" [simpoBackground]=\"styles?.background\">\r\n <div class=\"carousel-buttons\" *ngIf=\"product.itemImages?.length > 1\">\r\n <div><mat-icon (click)=\"changeImage(product, 'PREV', index)\">keyboard_arrow_left</mat-icon></div>\r\n <div><mat-icon (click)=\"changeImage(product, 'NEXT', index)\">keyboard_arrow_right</mat-icon></div>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"FavouriteTags; context: {data: product}\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"Tags; context: {data: product}\"></ng-container>\r\n </div>\r\n\r\n <div class=\"mt-2 w-100\">\r\n <div class=\"varient-list\" *ngIf=\"product?.itemVariant?.length\">\r\n <ng-container *ngFor=\"let varient of product?.itemVariant; let idx = index\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\r\n [src]=\"varient.variantImages?.[0]?.imgUrl\" alt=\"\" class=\"varient\"\r\n [ngClass]=\"{'selected-varient': varient.variantId == product.varientId}\"\r\n [style.borderColor]=\"varient.variantId == product.varientId ? 'blue' : 'transparent'\"\r\n (click)=\"selectVarient(product, varient)\">\r\n </ng-container>\r\n </div>\r\n <div class=\"d-flex align-item-center justify-content-between\" [style.display]=\"true ? 'block!important' : ''\">\r\n <div class=\"price body-large text-left d-flex align-items-center g-10\">\r\n <div class=\"fs-16\">\r\n <span [innerHTML]='currency'></span>\r\n {{product?.price?.sellingPrice | number:'1.2-2'}}\r\n </div>\r\n\r\n <div class=\"fs-16 text-start\">\r\n <span *ngIf=\"product?.price?.value - product?.price?.discountedPrice > 2\" class=\"discount-price\">\r\n {{product?.price?.value | number:'1.2-2'}}\r\n </span>\r\n </div>\r\n <!-- <div class=\"price discount-price\" *ngIf=\"product?.price?.discountedPrice < product?.price?.sellingPrice\">\r\n <span [innerHTML]='currency'></span>\r\n {{product.price.sellingPrice | number:'1.2-2'}}\r\n </div> -->\r\n </div>\r\n\r\n <div class=\"product-name heading-large w-100 text-left trim-text\"\r\n [style.color]=\"styles?.background?.accentColor\">{{ product.name }}</div>\r\n\r\n <div class=\"material-info\"\r\n *ngIf=\"isMaterialBasedPricing && (product?.materials?.length || product?.baseWeight)\">\r\n <span *ngIf=\"product?.materials?.[0]?.purity\">{{ product.materials[0].purity }}</span>\r\n <span *ngIf=\"product?.materials?.[0]?.purity && product?.baseWeight\"> \u00B7 </span>\r\n <span *ngIf=\"product?.baseWeight\">{{ product.baseWeight }}g</span>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"content?.display?.showButton && !ecomConfigs?.appointmentBookingEnabled && product.itemInventory?.openingStock > 0\"\r\n class=\"add-to-cart-btn\">\r\n <button class=\"send-btn d-flex align-items-center justify-content-center p-2\" [buttonData]=\"button?.content\"\r\n simpoButtonDirective [sectionId]=\"data?.id\" [color]=\"data?.styles?.background?.accentColor\"\r\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\r\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\"\r\n *ngIf=\"(!product.quantity && !isItemOutOfStock(product)) && IsEcommerce\"\r\n (click)=\"addItemToCart($event, product, 'ADD')\">Add to Cart</button>\r\n <button *ngIf=\"!IsEcommerce\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\r\n [color]=\"data?.styles?.background?.accentColor\" [backgroundInfo]=\"data?.styles?.background\"\r\n [appButtonEditor]=\"edit ?? false\" [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\"\r\n [id]=\"data?.id+getButtonId(1)\" (click)=\"raiseLead()\">Notify Me</button>\r\n <div class=\"quantity full-width-quantity\" [style.borderColor]=\"getButtonStyle(1)?.background\"\r\n [style.width]=\"true ? '100%' : ''\" *ngIf=\"product.quantity && !isItemOutOfStock(product)\">\r\n <span class=\"change-quantity\" [style.background]=\"getButtonStyle(1)?.background\"\r\n [style.color]=\"getButtonStyle(1)?.textColor\"\r\n (click)=\"addItemToCart($event, product, 'SUBSTRACT')\">-</span>\r\n <span style=\"width: 70%;\">{{product.quantity}}</span>\r\n <span class=\"change-quantity\" [style.background]=\"getButtonStyle(1)?.background\"\r\n [style.color]=\"getButtonStyle(1)?.textColor\" (click)=\"addItemToCart($event, product, 'ADD')\">+</span>\r\n </div>\r\n </div>\r\n <div>\r\n <button disabled class=\"out-of-stock\" *ngIf=\"isItemOutOfStock(product)\">Out Of Stock</button>\r\n </div>\r\n <div class=\"try-button-section\"\r\n *ngIf=\"content?.display?.showButton && ecomConfigs?.appointmentBookingEnabled && product?.itemInventory?.openingStock > 0\">\r\n <div class=\"try-at-home\">\r\n <button class=\"send-btn p-2\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\r\n (click)=\"addToTrialCart(product)\" [color]=\"data?.styles?.background?.accentColor\"\r\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\r\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\">TRY AT\r\n HOME</button>\r\n </div>\r\n <div class=\"video-call-image\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/578606c1753450810262video_Call.svg\"\r\n alt=\"video\" (click)=\"openDialogBox(dialogBox, product.name)\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-container *ngIf=\"screenWidth < 475 && styles?.mobileColumn === 1; else theme1style1\">\r\n <div class=\"row w-100\">\r\n <div class=\"col-8 d-flex flex-column gap-3\">\r\n <div class=\"text-left\" [style.color]=\"styles?.background?.accentColor\">{{ product.name }}</div>\r\n <div class=\"fs-16 text-start\">\r\n <span [innerHTML]='currency'></span>\r\n {{product?.price?.sellingPrice | number:'1.2-2'}}\r\n </div>\r\n <div class=\"d-flex w-45\">\r\n <div\r\n *ngIf=\"content?.display?.showButton && !ecomConfigs?.appointmentBookingEnabled && product.itemInventory?.openingStock > 0\"\r\n class=\"add-to-cart-btn w-100\">\r\n <button class=\"send-btn d-flex align-items-center justify-content-center p-2\" [buttonData]=\"button?.content\"\r\n simpoButtonDirective [sectionId]=\"data?.id\" [color]=\"data?.styles?.background?.accentColor\"\r\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\r\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\"\r\n *ngIf=\"(!product.quantity && !isItemOutOfStock(product)) && IsEcommerce\"\r\n (click)=\"addItemToCart($event, product, 'ADD')\">Add to Cart</button>\r\n <button *ngIf=\"!IsEcommerce\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\r\n [color]=\"data?.styles?.background?.accentColor\" [backgroundInfo]=\"data?.styles?.background\"\r\n [appButtonEditor]=\"edit ?? false\" [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\"\r\n [id]=\"data?.id+getButtonId(1)\" (click)=\"raiseLead()\">Notify Me</button>\r\n <div class=\"quantity full-width-quantity br-8\" [style.borderColor]=\"getButtonStyle(1)?.background\"\r\n [style.width]=\"true ? '100%' : ''\" *ngIf=\"product.quantity && !isItemOutOfStock(product)\">\r\n <span class=\"change-quantity w-35 br-8\" [style.background]=\"getButtonStyle(1)?.background\"\r\n [style.color]=\"getButtonStyle(1)?.textColor\"\r\n (click)=\"addItemToCart($event, product, 'SUBSTRACT')\">-</span>\r\n <span style=\"width: 70%;\">{{product.quantity}}</span>\r\n <span class=\"change-quantity w-35 br-8\" [style.background]=\"getButtonStyle(1)?.background\"\r\n [style.color]=\"getButtonStyle(1)?.textColor\" (click)=\"addItemToCart($event, product, 'ADD')\">+</span>\r\n </div>\r\n </div>\r\n <div>\r\n <button disabled class=\"out-of-stock w-100\" *ngIf=\"isItemOutOfStock(product)\">Out Of Stock</button>\r\n </div>\r\n <div class=\"try-button-section w-100\"\r\n *ngIf=\"content?.display?.showButton && ecomConfigs?.appointmentBookingEnabled && product?.itemInventory?.openingStock > 0\">\r\n <div class=\"try-at-home\">\r\n <button class=\"send-btn p-2\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\r\n (click)=\"addToTrialCart(product)\" [color]=\"data?.styles?.background?.accentColor\"\r\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\r\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\">TRY AT\r\n HOME</button>\r\n </div>\r\n <div class=\"video-call-image\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/578606c1753450810262video_Call.svg\"\r\n alt=\"video\" (click)=\"openDialogBox(dialogBox, product.name)\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-4 h-100 position-relative\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\r\n [src]=\"getProductImages(product)\" alt=\"\" class=\"w-h-110\" [class.fade-out]=\"imageIndex == index\"\r\n (click)=\"proceedToProductDesc(product)\">\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n </ng-container>\r\n\r\n\r\n\r\n\r\n\r\n</ng-template>\r\n\r\n\r\n\r\n<ng-template #dialogBox>\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header d-flex align-item-center\">\r\n <div class=\"heading-video w-100 py-2 text-center\">Live Video call at your convenience!</div>\r\n <div class=\"schedule-header d-flex align-items-center justify-content-end p-2\">\r\n <mat-icon (click)=\"matCloseDialog()\"\r\n class=\"cursor-pointer d-flex align-items-center justify-content-center f-18\">close</mat-icon>\r\n </div>\r\n </div>\r\n <div class=\"modal-body h-100\">\r\n <div class=\"row h-100 w-100 video-call-container\">\r\n <div class=\"col-6 h-100\" *ngIf=\"!isMobile\">\r\n <img\r\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/557699c1753779503913freepik-overhead-shot-a-person-holding-a-smartphone-with-a-1029_vmg8GqHj (online-video-cutter.com).gif\"\r\n alt=\"\" class=\"w-100 h-100\" style=\"object-fit: cover;\">\r\n </div>\r\n <div class=\"col-6 position-relative h-100 call-details\">\r\n <!-- Name Input with Validation -->\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.username\">\r\n <input type=\"text\" placeholder=\"Enter Name*\" [(ngModel)]=\"videoCallPayload.username\"\r\n (input)=\"onInputChange('username')\">\r\n </div>\r\n\r\n <!-- <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.email\">\r\n <input type=\"email\" placeholder=\"Enter Email*\" [(ngModel)]=\"videoCallPayload.email\"\r\n (input)=\"onInputChange('email')\">\r\n </div> -->\r\n\r\n <!-- Mobile Number Input with Validation -->\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.mobileNumber\">\r\n <div class=\"sub-text-call\">IN +91</div>\r\n <input type=\"number\" placeholder=\"Enter Mobile*\" [(ngModel)]=\"videoCallPayload.mobileNumber\"\r\n (input)=\"onInputChange('mobileNumber')\">\r\n </div>\r\n\r\n\r\n <!-- Pincode Input with Validation\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.pincode\">\r\n <div class=\"sub-text-call d-flex justify-content-center w-12 border-unset\">\r\n <mat-icon class=\"f-18 d-flex align-items-center justify-content-center\">gps_fixed</mat-icon>\r\n </div>\r\n <input type=\"number\" placeholder=\"Enter Pin Code*\" class=\"w-88\" [(ngModel)]=\"videoCallPayload.pincode\"\r\n (input)=\"onInputChange('pincode')\">\r\n </div> -->\r\n <div class=\"language my-3\">\r\n <div class=\"mini-text mb-2\">Language Preference</div>\r\n <div class=\"language-container d-flex gap-2 flex-wrap mt-1\">\r\n <ng-container *ngFor=\"let lang of languages\">\r\n <div class=\"lang px-2 py-1 rounded cursor-pointer\"\r\n [style.background]=\"lang == selectedLang ? data?.styles?.background?.accentColor : ''\"\r\n (click)=\"selectedLang = lang\"\r\n [style.color]=\"lang == selectedLang ? getTextColor(data?.styles?.background?.accentColor) : '#000000'\">\r\n {{lang}}\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"selectedLang == 'Others'\">\r\n <div class=\"input-field my-3\">\r\n <input type=\"text\" placeholder=\"Enter Other Language\" [(ngModel)]=\"otherLanguage\">\r\n </div>\r\n </ng-container>\r\n <button class=\"video-btn mt-2 d-flex align-items-center justify-content-center\" (click)=\"scheduleVideoCall()\"\r\n [disabled]=\"isSubmitting\" [style.background]=\"data?.styles?.background?.accentColor\" [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">\r\n <ng-container *ngIf=\"isSubmitting\">\r\n <div class=\"spinner-border spinner-border-sm me-2\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n SCHEDULING...\r\n </ng-container>\r\n <ng-container *ngIf=\"!isSubmitting && !scheduled\">\r\n <mat-icon>video_call</mat-icon>&nbsp;\r\n SCHEDULE A VIDEO CALL\r\n </ng-container>\r\n <ng-container *ngIf=\"scheduled\">\r\n <mat-icon>check_circle</mat-icon>&nbsp;\r\n SCHEDULED SUCCESSFULLY\r\n </ng-container>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>", styles: ["*{font-family:var(--website-font-family)}mat-icon{font-family:Material Icons!important}input[type=checkbox]{accent-color:var(--color)}.total-container{position:relative}.discount-price{color:#d3d3d3;text-decoration:line-through}.custom-sort-dropdown{display:inline-flex;justify-content:flex-end;flex-grow:1;align-items:center;gap:6px;padding:6px 12px;font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;font-weight:600;color:#000;cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;position:relative;background-color:#fff;width:fit-content;min-width:fit-content;max-width:fit-content;outline:none;border:none}.sort-label{color:#555;white-space:nowrap}.selected-value{flex-shrink:0;white-space:nowrap;color:#000}.toggle-icon{font-size:20px;transition:transform .3s ease;-webkit-user-select:none;user-select:none}.toggle-icon.open{transform:rotate(180deg)}.options{position:absolute;top:100%;left:0;right:0;margin-top:4px;background-color:#fff;border:none;border-radius:0 0 6px 6px;box-shadow:0 4px 6px #0000001a;max-height:180px;overflow-y:auto;z-index:100;font-weight:400;text-align:left!important}.option{padding:8px 12px;cursor:pointer;white-space:nowrap;transition:background-color .2s ease}.option:hover{background-color:#fff;color:#000}.option.selected{background-color:#fff;color:#000;font-weight:600}.video-call-container{align-items:center}@media screen and (min-width: 1024px){.add-to-cart-btn{display:none}.add-to-cart-btn button{height:35px;font-size:16px!important}.product-card .add-to-cart-btn,.product-card{display:none}.product-card:hover .add-to-cart-btn,.product-card:hover{display:flex;z-index:100!important;padding:10px;left:0;position:absolute;width:100%;background:#fff;border:none;border-radius:0 0 10px 10px/0px 0px 10px 10px!important}.product-card .try-button-section{display:none}.product-card:hover .try-button-section{display:flex;z-index:100!important;padding:10px;left:0;position:absolute;width:100%;background:#fff;border:none;border-radius:0 0 10px 10px/0px 0px 10px 10px!important;box-shadow:0 16px 32px #b6b2b233}.product-card .fav-icon{display:none}.product-card:hover .fav-icon{display:flex;align-items:center;justify-content:center;cursor:pointer;z-index:100!important}}::ng-deep .mdc-text-field--filled:not(.mdc-text-field--disabled){background-color:#fff!important}.fav-icon{position:absolute;z-index:100;padding:5px;right:10px;top:10px;height:fit-content;width:fit-content;background-color:#ffffff78;border-radius:50%}.out-of-stock{background-color:#d3d3d333;color:#000;border-radius:5px;border:none}.f-20{font-size:20px}.selling-price{text-decoration:line-through;font-size:14px!important;margin-right:8px;color:#d3d3d3}.fav-tooltip{visibility:hidden;opacity:0;background:#222;color:#fff;font-size:10px;padding:4px 10px;border-radius:5px;position:absolute;top:40px;right:30px;white-space:nowrap;z-index:200;transition:opacity .2s;pointer-events:none;box-shadow:0 2px 8px #00000026}.fav-icon-wrapper:hover .fav-tooltip{visibility:visible;opacity:1}.discounted-price{margin-top:-3px;font-size:14px!important}.filter-side{width:20%;position:sticky;top:0;overflow-y:auto;height:100%;border-right:1px solid lightgrey}.filter{font-size:22px;font-weight:600;line-height:26px;color:#000}.price-ranges{display:flex;flex-direction:column;gap:8px;padding-left:8px;max-width:250px}.send-btn:hover{transform:translateY(-1px);box-shadow:0 4px 8px #8b5cf64d}.price-range-item{font-size:14px;color:#333;cursor:pointer;-webkit-user-select:none;user-select:none;display:flex;align-items:center;gap:8px}.price-range-item input[type=checkbox]{width:16px;height:16px}.categories-section{padding:.8rem 0rem;border-bottom:1px solid #D8D8D8}.categories-section:last-child{padding:.8rem 0rem;border-bottom:none}.clear{color:#e60101;font-size:14px;cursor:pointer;font-weight:600}.toggle-categories{margin-top:8px;cursor:pointer;font-weight:500;display:inline-flex;align-items:center;-webkit-user-select:none;user-select:none;width:100%}.empty-cart{display:flex;align-items:center;justify-content:center;text-align:center;height:75vh}.toggle-text .dropdown-icon{margin-left:6px;font-size:1em;margin-top:5px}.toggle-text{display:flex;align-items:center}.categories{display:flex;padding:1rem 0rem;padding-bottom:0;color:#000;font-size:18px!important;font-weight:500}.category-options{display:flex;align-items:center;cursor:pointer;padding:.75rem 0rem;gap:11px;font-weight:400!important}.category-options div{font-size:14px}.button-section{width:26%;margin:2rem 1.5rem}.button-section button{position:relative;border:none;padding:5px;width:100px!important;font-weight:600;left:-10px;border-radius:4px;white-space:nowrap;overflow:hidden}.chip{padding:5px 15px;border-radius:20px;gap:5px;width:max-content;margin:3px 0;transition:.3s opacity ease;border:1px solid}.chip:hover{opacity:.8}.price-button-section{display:flex;align-items:center;flex-direction:column-reverse}.price-range{color:#93959e;font-size:15px;white-space:nowrap}.right-side{width:80%;padding-bottom:50px;height:100vh;overflow-y:auto;flex:1 1 0;min-width:0}.bottom-filter{display:none}.onlyMobile{display:none!important}.quantity{display:flex;justify-content:space-between;align-items:center;border:1.5px solid lightgray;border-radius:3px;padding:5px;font-weight:600;width:95px}.varient-list{display:flex;gap:5px;margin-bottom:5px;width:100%;overflow-x:auto}.varient-list .varient{height:60px;width:45px;border-radius:5px;border:1px solid lightgray;cursor:pointer}.varient-list .selected-varient{border:1px solid transparent}:is() .speeddial-linear .p-speeddial-direction-up{position:relative;bottom:0%;right:0}select{width:200px;font-size:16px;padding:10px;border:1px solid lightgray;border-radius:3px;cursor:pointer}input[type=checkbox]{height:16px;width:16px}.input-group-sticky{width:100%;height:57px}.input-group{position:sticky;top:0;width:95%;z-index:100;padding:5px;outline:none;border:none;border-radius:5px;height:7vh;display:flex;align-items:center;background-color:#fff;border:1.5px solid #8080801c;box-shadow:0 0 0 1px #edececd6;margin:15px auto}.input-group .fa-search{color:gray;background-color:transparent;width:10%;display:flex;align-items:center;justify-content:center;font-size:14px;position:relative;top:1px}.input-group input{height:100%;width:80%;background-color:transparent;border:none;outline:none;font-size:16px;padding-bottom:6px;box-shadow:none}.back-to-home{background-color:#9b9a9a1c;padding:5px;border-radius:50%;display:flex;align-items:center;justify-content:center;position:fixed;right:3px;top:50%;cursor:pointer}.back-to-home .mat-icon{font-size:16px;height:16px;width:16px}.try-button-section{display:flex;justify-content:space-between;align-items:center}.try-button-section .try-at-home{width:78%}.try-button-section .try-at-home button{border:1px solid #DE57E5;border-radius:5px;font-size:14px!important;padding:5px 0!important}.try-button-section .video-call-image{width:20%;height:32px}.try-button-section .video-call-image img{width:100%;height:100%}.box-shadow{box-shadow:#0000003d 0 3px 4px;border-radius:10px!important}.discount-price{color:#d3d3d3;text-decoration:line-through;font-size:16px}.g-10{gap:10px}.mtb-5{margin-top:5px;margin-bottom:5px}.full-width-quantity{text-align:center;padding:unset;font-weight:600;height:35px}.change-quantity{width:15%;height:inherit;display:flex;align-items:center;justify-content:center;font-size:21px;font-weight:600;position:relative}.gap-15{gap:15px}.flex-wrap{flex-wrap:wrap}.carousel-buttons{display:flex;position:absolute;bottom:0;left:10px;gap:5px;transform:translateY(-50%);pointer-events:none}.carousel-buttons div{background:#fff;display:flex;align-items:center;border-radius:100%;justify-content:center;pointer-events:auto}.main-product-section{height:100vh;display:flex;position:relative}.filter-side{max-width:20%;width:100%;flex:0 0 20%}.modal-content{height:100%;border:none;border-radius:0!important}.modal-content{border-radius:18px!important}.heading-video{font-size:17px;font-weight:600}.heading-video,.schedule-header{background:#f6f3f9;border-radius:0!important}.input-field{display:flex;border-radius:12px;padding:12px;font-size:13px;background:#f6f3f9}.input-field .sub-text-call{width:20%;text-align:center;align-content:center;border-right:1px solid #bfbfbf;color:#0000008a;font-weight:700}.input-field input{width:80%;border:none;outline:none;appearance:none;margin-left:5px;background:#f6f3f9}.video-btn{border:unset;padding:8px;border-radius:12px;font-weight:600;position:absolute;bottom:20px;left:10px;width:95%!important}.video-btn:disabled{opacity:.7;cursor:not-allowed}.video-btn:disabled:hover{cursor:not-allowed}.tag-icon{position:absolute!important;top:10px;left:10px;background:#e9bb18;text-transform:uppercase;padding:5px 10px;border:none;border-radius:8px;font-size:10px;color:#000}.filter-top-section{border-right:1px solid lightgrey;width:20%;padding:1rem .5em 1rem 0rem;border-bottom:1px solid lightgrey}.product-parent{width:100%;display:flex;flex-wrap:wrap;padding:10px;z-index:1}.product-parent .product{height:auto;transform:none;z-index:1;background-color:#fff}.product-parent .product .product-card{height:100%;padding:10px;display:flex;flex-direction:column;justify-content:flex-start;transition:all .3s ease-in-out}.product-parent .product .product-name{color:#222;font-size:14px!important;line-height:26px;margin-bottom:5px;text-align:left!important;width:220px;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;transition:all .3s ease-in-out}.product-parent .product .product-img{border-radius:10px;width:100%;height:180px;z-index:1;border:.5px solid #eee}.product-parent .product .default-image img{width:100%;height:180px;border-radius:10px}.product-parent .product:hover{height:auto!important;transform:scale(1.05);border-radius:10px!important;box-shadow:0 16px 32px #b6b2b299;z-index:100!important}@media screen and (max-width: 475px){.container-fluid{padding-left:5px!important;padding-right:5px!important;padding-top:0!important}.product-name{font-size:14px}.product-parent{gap:10px}.product{padding:10px!important;margin-top:0!important;height:auto!important;transform:none!important;z-index:1!important;box-shadow:0 8px 16px #0003!important}.product .product-card{padding:0!important}.out-of-stock{font-size:12px!important}.discounted-price{font-size:14px!important}.add-to-cart-btn button{font-size:14px!important;padding:5px!important}.call-details{width:100%}.filter-text{gap:10px;font-size:16px;align-items:center;font-weight:500;cursor:pointer}.mat-slider{width:304px!important}.price-range{font-size:16px}.chip{min-width:fit-content!important}.onlyMobile{display:flex!important;row-gap:0px}.onlyMobile mat-icon{pointer-events:auto!important;z-index:1000}.category-options{padding-left:8px;padding-right:0}.categories{padding-left:0}.button-section{margin-left:15px}.button-section button{width:120px!important;padding:10px!important}.bottom-filter{position:fixed!important;display:block;z-index:100000001;width:100%;margin-left:-5px;position:absolute;bottom:-5px;display:flex;border-top:1px solid #80808045;justify-content:space-evenly;align-items:center;height:64px;background:#fff;box-shadow:#0000001a 0 4px 12px}.divider{height:60%;width:.5px;border:1px solid #d3d3d378}.onlyDesktop{display:none!important}.product-img{height:100%}.default-image img{width:100%;height:100%;box-shadow:#0000003d 0 3px 8px}.filter-side{display:none}.right-side{width:100%;margin-left:0!important;height:95%!important;padding-bottom:0!important}.main-product-section{height:auto;display:flex;position:relative;padding-bottom:7rem}}.fs-16{font-size:16px!important}.mobile-filter-chip{display:flex;align-items:center;gap:15px;border:1px solid;border-radius:30px;padding:5px 15px;height:35px}.mobile-filter-chip mat-icon{font-size:20px;display:flex;align-items:center;justify-content:center}.w-h-110{width:110px;height:110px}.w-45{width:45%}.br-8{border-radius:8px}.w-35{width:35%!important}.product-tag-badge{position:absolute;top:8px;left:8px;z-index:2;pointer-events:none}.product-tag-label{position:absolute;top:0;left:0;font-size:11px;font-weight:700;letter-spacing:.8px;text-transform:uppercase;padding:5px 10px;border-radius:4px;white-space:nowrap;opacity:0;transform:translateY(6px);transition:opacity .4s ease,transform .4s ease;pointer-events:none}.product-tag-label.tag-active{opacity:1;transform:translateY(0)}.material-info{font-size:11px;color:#888;margin-top:2px;letter-spacing:.3px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i9.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i9.DecimalPipe, name: "number" }, { kind: "pipe", type: i9.TitleCasePipe, name: "titlecase" }, { kind: "ngmodule", type: MatSelectModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i10.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i10.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SimpoComponentModule }, { kind: "component", type: i11.HoverElementsComponent, selector: "simpo-hover-elements", inputs: ["data", "index", "editOptions", "isMerged", "isEcommerce"], outputs: ["edit"] }, { kind: "component", type: i12.DeleteHoverElementComponent, selector: "simpo-delete-hover-element", inputs: ["index", "data"], outputs: ["edit"] }, { kind: "component", type: i13.NgxSkeletonLoaderComponent, selector: "ngx-skeleton-loader", inputs: ["count", "loadingText", "appearance", "animation", "ariaLabel", "theme"] }, { kind: "ngmodule", type: MatSliderModule }, { kind: "directive", type: AnimationDirective, selector: "[simpoAnimation]", inputs: ["simpoAnimation"] }, { kind: "ngmodule", type: SpeedDialModule }, { kind: "directive", type: BackgroundDirective, selector: "[simpoBackground]", inputs: ["simpoBackground", "scrollValue"] }, { kind: "directive", type: ContentFitDirective, selector: "[simpoLayout]", inputs: ["simpoLayout"] }, { kind: "directive", type: HoverDirective, selector: "[simpoHover]", outputs: ["hovering"] }, { kind: "directive", type: ButtonDirectiveDirective, selector: "[simpoButtonDirective]", inputs: ["buttonStyle", "color", "scrollValue", "backgroundInfo"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatBottomSheetModule }, { kind: "ngmodule", type: MatRadioModule }, { kind: "directive", type: i14.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i14.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: ToastModule }, { kind: "component", type: i15.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { kind: "component", type: CardSkeletonLoaderComponent, selector: "simpo-card-skeleton-loader", inputs: ["count", "showTitles"] }, { kind: "component", type: SmallProductListingComponent, selector: "simpo-small-product-listing", inputs: ["product", "data", "isScrollable", "isCategoryProductList", "customClass", "index"] }, { kind: "ngmodule", type: MatChipsModule }, { kind: "directive", type: ButtonEditorDirective, selector: "button[appButtonEditor]", inputs: ["appButtonEditor", "buttonData", "buttonStyle", "backgroundInfo", "sectionId", "buttonId", "itemIndex"] }, { kind: "directive", type: SpacingHorizontalDirective, selector: "[spacingHorizontal]", inputs: ["spacingHorizontal", "isHeader"] }] }); }
1110
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProductListComponent, deps: [{ token: PLATFORM_ID }, { token: i1.EventsService }, { token: i2.RestService }, { token: i3.Router }, { token: i3.ActivatedRoute }, { token: i4.StorageServiceService }, { token: i5.MatBottomSheet }, { token: i6.MatDialog }, { token: i7.CartService }, { token: i8.MessageService }, { token: i0.Renderer2 }, { token: i9.AnalyticsService }], target: i0.ɵɵFactoryTarget.Component }); }
1111
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ProductListComponent, isStandalone: true, selector: "simpo-product-list", inputs: { responseData: "responseData", data: "data", index: "index", edit: "edit", delete: "delete", customClass: "customClass", nextComponentColor: "nextComponentColor" }, host: { listeners: { "window:resize": "getScreenSize()", "window:scroll": "onWindowScroll($event)" } }, providers: [MessageService], viewQueries: [{ propertyName: "listScrollContainer", first: true, predicate: ["listScrollContainer"], descendants: true }, { propertyName: "filterScroll", first: true, predicate: ["filterScroll"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\"\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\n<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Call Schedule\"\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\n<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Scheduling\"\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\n\n<!-- <div class=\"input-group\" *ngIf=\"isMobile\" [ngClass]=\"{'input-group-sticky': scrollingValue > 20}\">\n <mat-icon class=\"f-20 d-flex align-item-center justify-content-center\">search</mat-icon>\n <input type=\"text\" class=\"form-control\" placeholder=\"Search Product..\" aria-label=\"Search Product\"\n [(ngModel)]=\"searchText\" (ngModelChange)=\"searchProduct()\">\n</div> -->\n\n<ng-container *ngIf=\"!isLoading\">\n <section [id]=\"data?.id\" class=\"container-fluid total-container\" [simpoLayout]=\"styles?.layout\" simpoHover\n (hovering)=\"showEditTabs($event)\" [simpoBackground]=\"styles?.background\"\n [style.paddingTop.px]=\"isMobile ? '0 !important' : ''\" [attr.style]=\"customClass\"\n [spacingHorizontal]=\"stylesLayout\">\n\n <!-- <div style=\"position: relative;\" class=\"speeddial-linear\" *ngIf=\"isMobile\">\n <p-speedDial [model]=\"items\" direction=\"up\"\n [buttonStyle]=\"{'border-radius': '50%', 'height': '30px'}\"></p-speedDial>\n </div> -->\n\n <div class=\"d-flex justify-content-between align-items-center w-100 onlyDesktop\">\n <div class=\"filter-top-section d-flex justify-content-between align-items-baseline\">\n <div class=\"filter body-large\">\n Filters\n </div>\n <div class=\"clear\" (click)=\"clearFilter()\" [style.color]=\"styles?.background?.accentColor\">\n CLEAR ALL\n </div>\n </div>\n <div itemid=\"top-section\" class=\"d-flex align-items-center justify-content-between\"\n style=\"width: 77.5%; margin-right: 1%;\">\n <div class=\"d-flex gap-15\" style=\"width: 75%; display:flex; flex-wrap:wrap\">\n <ng-container *ngFor=\"let filter of filteredChips\">\n <div class=\"d-flex justify-content-between align-item-center w-90 chip\">\n <span>{{filter.name}}</span>\n <span style=\"cursor: pointer; width:20px; height: 20px;\">\n <mat-icon style=\"font-size: 20px;\" (click)=\"removeFilter(filter)\">close</mat-icon>\n </span>\n </div>\n </ng-container>\n </div>\n <!-- <div class=\"d-flex align-items-center\" style=\"gap: 10px;\">\n <div class=\"fs-6 fw-normal mr-3\">Sort by</div>\n <select [(ngModel)]=\"sortBy\" (change)=\"applyFilter($event, 'SORT')\" style=\"color: black;\">\n <option [value]=\"filter.value\" *ngFor=\"let filter of filteringArray\">{{ filter.name }}</option>\n </select>\n </div> -->\n <div class=\"custom-sort-dropdown\" tabindex=\"0\" (blur)=\"closeDropdown()\" (click)=\"toggleDropdown()\">\n <span class=\"sort-label\">Sort By:</span>\n <span class=\"selected-value\">{{ getSelectedName() || 'Featured' }}</span>\n <span class=\"toggle-icon\" [class.open]=\"isOpen\">&#9662;</span> <!-- Down arrow, rotates open -->\n\n <div class=\"options\" *ngIf=\"isOpen\">\n <div *ngFor=\"let filter of filteringArray\" class=\"option\" [class.selected]=\"filter.value === sortBy\"\n (click)=\"selectOption(filter, $event)\">\n {{ filter.name }}\n </div>\n </div>\n </div>\n\n </div>\n </div>\n\n <div *ngIf=\"isMobile\" class=\"d-flex w-100 onlyMobile gap-15 flex-wrap\">\n <ng-container *ngFor=\"let filter of filteredChips\">\n <div class=\"d-flex justify-content-between align-item-center w-90 chip\">\n <span>{{filter.name}}</span>\n <span style=\"cursor: pointer; width:20px; height: 20px;\">\n <mat-icon style=\"font-size: 20px;\" (click)=\"removeFilter(filter)\">close</mat-icon>\n </span>\n </div>\n </ng-container>\n </div>\n\n <div class=\"main-product-section\">\n <div class=\"filter-side\">\n <ng-container *ngTemplateOutlet=\"FilterSection\"></ng-container>\n </div>\n <div [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\" class=\"right-side\" (scroll)=\"handleProductListScroll()\"\n #listScrollContainer>\n <ng-container *ngIf=\"!apiLoading\">\n <div class=\"product-parent\" *ngIf=\"responseData && responseData.length > 0\">\n <div *ngFor=\"let product of responseData; let i = index\" class=\"product\"\n [style.width]=\"applyProductWidth() ? getProductWidth() : ''\" style=\"cursor:pointer; position: relative;\">\n <ng-container *ngIf=\"styles?.theme == theme.Theme1\">\n <ng-container *ngTemplateOutlet=\"ProductDesc; context: {data: product, index: i}\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"styles?.theme != theme.Theme1\">\n <simpo-small-product-listing [product]=\"product\" [data]=\"data\" [isScrollable]=\"screenWidth > 475\"\n [index]=\"i\"></simpo-small-product-listing>\n </ng-container>\n </div>\n </div>\n <simpo-card-skeleton-loader *ngIf=\"isListLoading\" [count]=\"getElementRow()\"></simpo-card-skeleton-loader>\n <section class=\"empty-cart\" *ngIf=\"!isListLoading && responseData?.length == 0\">\n <div>\n <div class=\"cart-image\">\n <img loading=\"lazy\" style=\"height: 150px; width: 150px;\"\n src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/107213c1716543334040empty-cart.png\"\n alt=\"\">\n </div>\n <div class=\"cart-text\">\n <div class=\"heading-medium d-flex justify-content-center\">\n Product list is empty\n </div>\n <div class=\"description d-flex justify-content-center mt-4\">\n Looks like no item is present with filter. Go ahead & explore top categories.\n </div>\n </div>\n </div>\n </section>\n </ng-container>\n <simpo-card-skeleton-loader *ngIf=\"apiLoading\" [count]=\"getElementRow()\"></simpo-card-skeleton-loader>\n </div>\n\n <div class=\"bottom-filter\">\n <div class=\"d-flex filter-text\" style=\"gap: 10px\" (click)=\"openSorting(SortingSection)\">\n <mat-icon>sort</mat-icon>\n <span>Sort by</span>\n </div>\n <div class=\"divider\"></div>\n <div class=\"d-flex filter-text\" style=\"gap: 10px\" (click)=\"openFilter(FilterSection)\">\n <mat-icon>filter_list</mat-icon>\n <span>Filter</span>\n </div>\n </div>\n </div>\n\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"\n [isEcommerce]=\"true\"></simpo-hover-elements>\n </div>\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\n </div>\n </section>\n</ng-container>\n\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\"\n [theme]=\"{ width: '100%', height: '40vh', 'border-radius': '10px', 'position': 'relative', 'right': '5px' }\"></ngx-skeleton-loader>\n\n<ng-template #FavouriteTags let-product=\"data\">\n <div class=\"fav-icon-wrapper\">\n <mat-icon class=\"fav-icon\" [style.color]=\"data?.styles?.background?.accentColor\"\n (click)=\"toggleItemToFav($event, product, 'ADD')\" *ngIf=\"!product.whislist\">favorite_border\n </mat-icon>\n <mat-icon class=\"fav-icon\" [style.color]=\"data?.styles?.background?.accentColor\"\n (click)=\"toggleItemToFav($event, product, 'REMOVE')\" *ngIf=\"product.whislist\">favorite\n </mat-icon>\n <span class=\"fav-tooltip\">\n {{ product.whislist ? 'Remove from wishlist' : 'Add to wishlist' }}\n </span>\n </div>\n</ng-template>\n\n\n\n<ng-template #Tags let-product=\"data\">\n <div class=\"product-tag-badge\" *ngIf=\"product?.tags?.length\">\n <span *ngFor=\"let tag of product.tags; let i = index\" class=\"product-tag-label\"\n [class.tag-active]=\"i === (tagIndexMap[product.itemId] ?? 0)\" [style.background]=\"styles?.background?.accentColor\"\n [style.color]=\"getTextColor(styles?.background?.accentColor)\">\n {{ tag }}\n </span>\n </div>\n</ng-template>\n\n\n<ng-template #FilterSection>\n <section>\n <div class=\"categories-section\" *ngIf=\"categories?.length\">\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\n (click)=\"categoriesCollapsed = !categoriesCollapsed\" style=\"cursor:pointer\">\n <h6><b>Shop by Categories</b></h6>\n <mat-icon>{{ categoriesCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\n </div>\n <ng-container *ngIf=\"!categoriesCollapsed\">\n <div class=\"category-options\" *ngFor=\"let category of displayedCategories\"\n (click)=\"applyFilter(category, 'FILTER')\">\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\n [checked]=\"category.status\" />\n <div class=\"trim-text\">{{category.option | titlecase}}</div>\n </div>\n <div *ngIf=\"categories.length > 4\" class=\"toggle-categories\" (click)=\"toggleCategories()\"\n [style.color]=\"styles?.background?.accentColor\">\n <span class=\"toggle-text\">\n {{ showAllCategories ? 'Show Less' : 'Show More' }}\n <span class=\"dropdown-icon\">\n <ng-container *ngIf=\"!showAllCategories\">\n <mat-icon>expand_more</mat-icon>\n </ng-container>\n <ng-container *ngIf=\"showAllCategories\">\n <mat-icon>expand_less</mat-icon>\n </ng-container>\n </span>\n </span>\n </div>\n </ng-container>\n </div>\n\n <div class=\"categories-section\" *ngIf=\"collections?.length\">\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\n (click)=\"collectionsCollapsed = !collectionsCollapsed\" style=\"cursor:pointer\">\n <h6><b>Shop by Collections</b></h6>\n <mat-icon>{{ collectionsCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\n </div>\n <ng-container *ngIf=\"!collectionsCollapsed\">\n <div class=\"category-options\" *ngFor=\"let collection of displayedCollections\"\n (click)=\"applyFilter(collection, 'FILTER')\">\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\n [checked]=\"collection.status\" />\n <div class=\"trim-text\">{{collection.option | titlecase}}</div>\n </div>\n <div *ngIf=\"collections.length > 4\" class=\"toggle-categories\" (click)=\"toggleCollections()\"\n [style.color]=\"styles?.background?.accentColor\">\n <span class=\"toggle-text\">\n {{ showAllCollections ? 'Show Less' : 'Show More' }}\n <span class=\"dropdown-icon\">\n <ng-container *ngIf=\"!showAllCollections\"><mat-icon>expand_more</mat-icon></ng-container>\n <ng-container *ngIf=\"showAllCollections\"><mat-icon>expand_less</mat-icon></ng-container>\n </span>\n </span>\n </div>\n </ng-container>\n </div>\n\n <div class=\"categories-section\">\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\n (click)=\"ratingsCollapsed = !ratingsCollapsed\" style=\"cursor:pointer\">\n <h6><b>Ratings</b></h6>\n <mat-icon>{{ ratingsCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\n </div>\n <ng-container *ngIf=\"!ratingsCollapsed\">\n <div class=\"category-options\" *ngFor=\"let rating of ratingOptions\" (click)=\"onRatingChange(rating)\">\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\n [checked]=\"rating.selected\" />\n <div class=\"trim-text\">{{ rating.label }}</div>\n </div>\n </ng-container>\n </div>\n\n <div class=\"categories-section\">\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\n (click)=\"priceCollapsed = !priceCollapsed\" style=\"cursor:pointer\">\n <h6><b>Shop by price</b></h6>\n <mat-icon>{{ priceCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\n </div>\n <ng-container *ngIf=\"!priceCollapsed\">\n <label class=\"category-options\" *ngFor=\"let range of priceRanges;let i = index\">\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\n [(ngModel)]=\"range.selected\" (change)=\"onPriceRangeChange(i)\" />\n <div class=\"trim-text\">{{ range.label }}</div>\n </label>\n </ng-container>\n </div>\n\n\n\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\n (click)=\"productTypeCollapsed = !productTypeCollapsed\" style=\"cursor:pointer\">\n <h6><b>Product Type</b></h6>\n <mat-icon>{{ productTypeCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\n </div>\n <ng-container *ngIf=\"!productTypeCollapsed\">\n <div class=\"category-options\" *ngFor=\"let size of productTypesData\">\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\n [checked]=\"size.status\" (change)=\"toggleProductSize(size)\" />\n <div class=\"trim-text\">{{ size.size }}</div>\n </div>\n </ng-container>\n </div>\n\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\n (click)=\"shopForCollapsed = !shopForCollapsed\" style=\"cursor:pointer\">\n <h6><b>Shop for</b></h6>\n <mat-icon>{{ shopForCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\n </div>\n <ng-container *ngIf=\"!shopForCollapsed\">\n <div class=\"category-options\" *ngFor=\"let size of shopForData\">\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\n [checked]=\"size.status\" (change)=\"toggleShopSize(size)\" />\n <div class=\"trim-text\">{{ size.size }}</div>\n </div>\n </ng-container>\n </div>\n\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\n (click)=\"materialCollapsed = !materialCollapsed\" style=\"cursor:pointer\">\n <h6><b>Material</b></h6>\n <mat-icon>{{ materialCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\n </div>\n <ng-container *ngIf=\"!materialCollapsed\">\n <div class=\"category-options\" *ngFor=\"let size of materialSizeData\">\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\n [checked]=\"size.status\" (change)=\"toggleMaterialSize(size)\" />\n <div class=\"trim-text\">{{ size.size }}</div>\n </div>\n </ng-container>\n </div>\n\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\n (click)=\"metalCollapsed = !metalCollapsed\" style=\"cursor:pointer\">\n <h6><b>Metal</b></h6>\n <mat-icon>{{ metalCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\n </div>\n <ng-container *ngIf=\"!metalCollapsed\">\n <div class=\"category-options\" *ngFor=\"let size of metalSizeData\">\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\n [checked]=\"size.status\" (change)=\"toggleMetalSize(size)\" />\n <div class=\"trim-text\">{{ size.size }}</div>\n </div>\n </ng-container>\n </div>\n\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\n (click)=\"ringStyleCollapsed = !ringStyleCollapsed\" style=\"cursor:pointer\">\n <h6><b>Ring Style</b></h6>\n <mat-icon>{{ ringStyleCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\n </div>\n <ng-container *ngIf=\"!ringStyleCollapsed\">\n <div class=\"category-options\" *ngFor=\"let size of ringSizes\">\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\n [checked]=\"size.status\" (change)=\"toggleSize(size)\" />\n <div class=\"trim-text\">{{ size.size }}</div>\n </div>\n </ng-container>\n </div>\n </section>\n</ng-template>\n\n<ng-template #SortingSection>\n <section style=\"padding: 10px\">\n <div class=\"categories heading-small d-flex justify-content-between align-item-center \" style=\"padding: 0px;\">\n <span>Sort by</span>\n <mat-icon (click)=\"closeDialog()\">close</mat-icon>\n </div>\n <mat-radio-group class=\"d-flex flex-column\" [(ngModel)]=\"sortBy\">\n <mat-radio-button *ngFor=\"let sortingType of filteringArray\" (click)=\"selectOption(sortingType, $event)\"\n [value]=\"sortingType.value\">{{sortingType.name}}</mat-radio-button>\n </mat-radio-group>\n </section>\n</ng-template>\n\n<ng-template #ProductDesc let-product=\"data\" let-index=\"index\">\n <ng-template #theme1style1>\n <div class=\"product-card position-relative h-100\" [ngClass]=\"{'hover-effect': styles?.theme == theme.Theme1}\">\n <div *ngIf=\"!(product.itemImages?.length && product.itemImages?.[0]?.imgUrl)\"\n class=\"default-image position-relative\">\n <img loading=\"lazy\" src=\"https://i.postimg.cc/hPS2JpV0/no-image-available.jpg\" alt=\"\"\n (click)=\"proceedToProductDesc(product)\" [simpoBackground]=\"styles?.background\">\n <ng-container *ngTemplateOutlet=\"FavouriteTags; context: {data: product}\"></ng-container>\n <ng-container *ngTemplateOutlet=\"Tags; context: {data: product}\"></ng-container>\n </div>\n\n <div *ngIf=\"product.itemImages?.length && product.itemImages?.[0]?.imgUrl\"\n class=\"default-image position-relative\">\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\n [src]=\"getProductImages(product)\" alt=\"\" class=\"product-img\" [class.fade-out]=\"imageIndex == index\"\n (click)=\"proceedToProductDesc(product)\" [simpoBackground]=\"styles?.background\">\n <div class=\"carousel-buttons\" *ngIf=\"product.itemImages?.length > 1\">\n <div><mat-icon (click)=\"changeImage(product, 'PREV', index)\">keyboard_arrow_left</mat-icon></div>\n <div><mat-icon (click)=\"changeImage(product, 'NEXT', index)\">keyboard_arrow_right</mat-icon></div>\n </div>\n <ng-container *ngTemplateOutlet=\"FavouriteTags; context: {data: product}\"></ng-container>\n <ng-container *ngTemplateOutlet=\"Tags; context: {data: product}\"></ng-container>\n </div>\n\n <div class=\"mt-2 w-100\">\n <div class=\"varient-list\" *ngIf=\"product?.itemVariant?.length\">\n <ng-container *ngFor=\"let varient of product?.itemVariant; let idx = index\">\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\n [src]=\"varient.variantImages?.[0]?.imgUrl\" alt=\"\" class=\"varient\"\n [ngClass]=\"{'selected-varient': varient.variantId == product.varientId}\"\n [style.borderColor]=\"varient.variantId == product.varientId ? 'blue' : 'transparent'\"\n (click)=\"selectVarient(product, varient)\">\n </ng-container>\n </div>\n <div class=\"d-flex align-item-center justify-content-between\" [style.display]=\"true ? 'block!important' : ''\">\n <div class=\"price body-large text-left d-flex align-items-center g-10\">\n <div class=\"fs-16\">\n <span [innerHTML]='currency'></span>\n {{product?.price?.sellingPrice | number:'1.2-2'}}\n </div>\n\n <div class=\"fs-16 text-start\">\n <span *ngIf=\"product?.price?.value - product?.price?.discountedPrice > 2\" class=\"discount-price\">\n {{product?.price?.value | number:'1.2-2'}}\n </span>\n </div>\n <!-- <div class=\"price discount-price\" *ngIf=\"product?.price?.discountedPrice < product?.price?.sellingPrice\">\n <span [innerHTML]='currency'></span>\n {{product.price.sellingPrice | number:'1.2-2'}}\n </div> -->\n </div>\n\n <div class=\"product-name heading-large w-100 text-left trim-text\"\n [style.color]=\"styles?.background?.accentColor\">{{ product.name }}</div>\n\n <div class=\"material-info\"\n *ngIf=\"isMaterialBasedPricing && (product?.materials?.length || product?.baseWeight)\">\n <span *ngIf=\"product?.materials?.[0]?.purity\">{{ product.materials[0].purity }}</span>\n <span *ngIf=\"product?.materials?.[0]?.purity && product?.baseWeight\"> \u00B7 </span>\n <span *ngIf=\"product?.baseWeight\">{{ product.baseWeight }}g</span>\n </div>\n\n <div\n *ngIf=\"content?.display?.showButton && !ecomConfigs?.appointmentBookingEnabled && product.itemInventory?.openingStock > 0\"\n class=\"add-to-cart-btn\">\n <button class=\"send-btn d-flex align-items-center justify-content-center p-2\" [buttonData]=\"button?.content\"\n simpoButtonDirective [sectionId]=\"data?.id\" [color]=\"data?.styles?.background?.accentColor\"\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\"\n *ngIf=\"(!product.quantity && !isItemOutOfStock(product)) && IsEcommerce\"\n (click)=\"addItemToCart($event, product, 'ADD')\">Add to Cart</button>\n <button *ngIf=\"!IsEcommerce\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\n [color]=\"data?.styles?.background?.accentColor\" [backgroundInfo]=\"data?.styles?.background\"\n [appButtonEditor]=\"edit ?? false\" [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\"\n [id]=\"data?.id+getButtonId(1)\" (click)=\"raiseLead()\">Notify Me</button>\n <div class=\"quantity full-width-quantity\" [style.borderColor]=\"getButtonStyle(1)?.background\"\n [style.width]=\"true ? '100%' : ''\" *ngIf=\"product.quantity && !isItemOutOfStock(product)\">\n <span class=\"change-quantity\" [style.background]=\"getButtonStyle(1)?.background\"\n [style.color]=\"getButtonStyle(1)?.textColor\"\n (click)=\"addItemToCart($event, product, 'SUBSTRACT')\">-</span>\n <span style=\"width: 70%;\">{{product.quantity}}</span>\n <span class=\"change-quantity\" [style.background]=\"getButtonStyle(1)?.background\"\n [style.color]=\"getButtonStyle(1)?.textColor\" (click)=\"addItemToCart($event, product, 'ADD')\">+</span>\n </div>\n </div>\n <div>\n <button disabled class=\"out-of-stock\" *ngIf=\"isItemOutOfStock(product)\">Out Of Stock</button>\n </div>\n <div class=\"try-button-section\"\n *ngIf=\"content?.display?.showButton && ecomConfigs?.appointmentBookingEnabled && product?.itemInventory?.openingStock > 0\">\n <div class=\"try-at-home\">\n <button class=\"send-btn p-2\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\n (click)=\"addToTrialCart(product)\" [color]=\"data?.styles?.background?.accentColor\"\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\">TRY AT\n HOME</button>\n </div>\n <div class=\"video-call-image\">\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/578606c1753450810262video_Call.svg\"\n alt=\"video\" (click)=\"openDialogBox(dialogBox, product.name)\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n\n <ng-container *ngIf=\"screenWidth < 475 && styles?.mobileColumn === 1; else theme1style1\">\n <div class=\"row w-100\">\n <div class=\"col-8 d-flex flex-column gap-3\">\n <div class=\"text-left\" [style.color]=\"styles?.background?.accentColor\">{{ product.name }}</div>\n <div class=\"fs-16 text-start\">\n <span [innerHTML]='currency'></span>\n {{product?.price?.sellingPrice | number:'1.2-2'}}\n </div>\n <div class=\"d-flex w-45\">\n <div\n *ngIf=\"content?.display?.showButton && !ecomConfigs?.appointmentBookingEnabled && product.itemInventory?.openingStock > 0\"\n class=\"add-to-cart-btn w-100\">\n <button class=\"send-btn d-flex align-items-center justify-content-center p-2\" [buttonData]=\"button?.content\"\n simpoButtonDirective [sectionId]=\"data?.id\" [color]=\"data?.styles?.background?.accentColor\"\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\"\n *ngIf=\"(!product.quantity && !isItemOutOfStock(product)) && IsEcommerce\"\n (click)=\"addItemToCart($event, product, 'ADD')\">Add to Cart</button>\n <button *ngIf=\"!IsEcommerce\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\n [color]=\"data?.styles?.background?.accentColor\" [backgroundInfo]=\"data?.styles?.background\"\n [appButtonEditor]=\"edit ?? false\" [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\"\n [id]=\"data?.id+getButtonId(1)\" (click)=\"raiseLead()\">Notify Me</button>\n <div class=\"quantity full-width-quantity br-8\" [style.borderColor]=\"getButtonStyle(1)?.background\"\n [style.width]=\"true ? '100%' : ''\" *ngIf=\"product.quantity && !isItemOutOfStock(product)\">\n <span class=\"change-quantity w-35 br-8\" [style.background]=\"getButtonStyle(1)?.background\"\n [style.color]=\"getButtonStyle(1)?.textColor\"\n (click)=\"addItemToCart($event, product, 'SUBSTRACT')\">-</span>\n <span style=\"width: 70%;\">{{product.quantity}}</span>\n <span class=\"change-quantity w-35 br-8\" [style.background]=\"getButtonStyle(1)?.background\"\n [style.color]=\"getButtonStyle(1)?.textColor\" (click)=\"addItemToCart($event, product, 'ADD')\">+</span>\n </div>\n </div>\n <div>\n <button disabled class=\"out-of-stock w-100\" *ngIf=\"isItemOutOfStock(product)\">Out Of Stock</button>\n </div>\n <div class=\"try-button-section w-100\"\n *ngIf=\"content?.display?.showButton && ecomConfigs?.appointmentBookingEnabled && product?.itemInventory?.openingStock > 0\">\n <div class=\"try-at-home\">\n <button class=\"send-btn p-2\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\n (click)=\"addToTrialCart(product)\" [color]=\"data?.styles?.background?.accentColor\"\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\">TRY AT\n HOME</button>\n </div>\n <div class=\"video-call-image\">\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/578606c1753450810262video_Call.svg\"\n alt=\"video\" (click)=\"openDialogBox(dialogBox, product.name)\" />\n </div>\n </div>\n </div>\n </div>\n <div class=\"col-4 h-100 position-relative\">\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\n [src]=\"getProductImages(product)\" alt=\"\" class=\"w-h-110\" [class.fade-out]=\"imageIndex == index\"\n (click)=\"proceedToProductDesc(product)\">\n </div>\n </div>\n\n\n\n </ng-container>\n\n\n\n\n\n</ng-template>\n\n\n\n<ng-template #dialogBox>\n <div class=\"modal-content\">\n <div class=\"modal-header d-flex align-item-center\">\n <div class=\"heading-video w-100 py-2 text-center\">Live Video call at your convenience!</div>\n <div class=\"schedule-header d-flex align-items-center justify-content-end p-2\">\n <mat-icon (click)=\"matCloseDialog()\"\n class=\"cursor-pointer d-flex align-items-center justify-content-center f-18\">close</mat-icon>\n </div>\n </div>\n <div class=\"modal-body h-100\">\n <div class=\"row h-100 w-100 video-call-container\">\n <div class=\"col-6 h-100\" *ngIf=\"!isMobile\">\n <img\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/557699c1753779503913freepik-overhead-shot-a-person-holding-a-smartphone-with-a-1029_vmg8GqHj (online-video-cutter.com).gif\"\n alt=\"\" class=\"w-100 h-100\" style=\"object-fit: cover;\">\n </div>\n <div class=\"col-6 position-relative h-100 call-details\">\n <!-- Name Input with Validation -->\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.username\">\n <input type=\"text\" placeholder=\"Enter Name*\" [(ngModel)]=\"videoCallPayload.username\"\n (input)=\"onInputChange('username')\">\n </div>\n\n <!-- <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.email\">\n <input type=\"email\" placeholder=\"Enter Email*\" [(ngModel)]=\"videoCallPayload.email\"\n (input)=\"onInputChange('email')\">\n </div> -->\n\n <!-- Mobile Number Input with Validation -->\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.mobileNumber\">\n <div class=\"sub-text-call\">IN +91</div>\n <input type=\"number\" placeholder=\"Enter Mobile*\" [(ngModel)]=\"videoCallPayload.mobileNumber\"\n (input)=\"onInputChange('mobileNumber')\">\n </div>\n\n\n <!-- Pincode Input with Validation\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.pincode\">\n <div class=\"sub-text-call d-flex justify-content-center w-12 border-unset\">\n <mat-icon class=\"f-18 d-flex align-items-center justify-content-center\">gps_fixed</mat-icon>\n </div>\n <input type=\"number\" placeholder=\"Enter Pin Code*\" class=\"w-88\" [(ngModel)]=\"videoCallPayload.pincode\"\n (input)=\"onInputChange('pincode')\">\n </div> -->\n <div class=\"language my-3\">\n <div class=\"mini-text mb-2\">Language Preference</div>\n <div class=\"language-container d-flex gap-2 flex-wrap mt-1\">\n <ng-container *ngFor=\"let lang of languages\">\n <div class=\"lang px-2 py-1 rounded cursor-pointer\"\n [style.background]=\"lang == selectedLang ? data?.styles?.background?.accentColor : ''\"\n (click)=\"selectedLang = lang\"\n [style.color]=\"lang == selectedLang ? getTextColor(data?.styles?.background?.accentColor) : '#000000'\">\n {{lang}}\n </div>\n </ng-container>\n </div>\n </div>\n <ng-container *ngIf=\"selectedLang == 'Others'\">\n <div class=\"input-field my-3\">\n <input type=\"text\" placeholder=\"Enter Other Language\" [(ngModel)]=\"otherLanguage\">\n </div>\n </ng-container>\n <button class=\"video-btn mt-2 d-flex align-items-center justify-content-center\" (click)=\"scheduleVideoCall()\"\n [disabled]=\"isSubmitting\" [style.background]=\"data?.styles?.background?.accentColor\" [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">\n <ng-container *ngIf=\"isSubmitting\">\n <div class=\"spinner-border spinner-border-sm me-2\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n SCHEDULING...\n </ng-container>\n <ng-container *ngIf=\"!isSubmitting && !scheduled\">\n <mat-icon>video_call</mat-icon>&nbsp;\n SCHEDULE A VIDEO CALL\n </ng-container>\n <ng-container *ngIf=\"scheduled\">\n <mat-icon>check_circle</mat-icon>&nbsp;\n SCHEDULED SUCCESSFULLY\n </ng-container>\n </button>\n </div>\n </div>\n </div>\n </div>\n</ng-template>", styles: ["*{font-family:var(--website-font-family)}mat-icon{font-family:Material Icons!important}input[type=checkbox]{accent-color:var(--color)}.total-container{position:relative}.discount-price{color:#d3d3d3;text-decoration:line-through}.custom-sort-dropdown{display:inline-flex;justify-content:flex-end;flex-grow:1;align-items:center;gap:6px;padding:6px 12px;font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;font-weight:600;color:#000;cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;position:relative;background-color:#fff;width:fit-content;min-width:fit-content;max-width:fit-content;outline:none;border:none}.sort-label{color:#555;white-space:nowrap}.selected-value{flex-shrink:0;white-space:nowrap;color:#000}.toggle-icon{font-size:20px;transition:transform .3s ease;-webkit-user-select:none;user-select:none}.toggle-icon.open{transform:rotate(180deg)}.options{position:absolute;top:100%;left:0;right:0;margin-top:4px;background-color:#fff;border:none;border-radius:0 0 6px 6px;box-shadow:0 4px 6px #0000001a;max-height:180px;overflow-y:auto;z-index:100;font-weight:400;text-align:left!important}.option{padding:8px 12px;cursor:pointer;white-space:nowrap;transition:background-color .2s ease}.option:hover{background-color:#fff;color:#000}.option.selected{background-color:#fff;color:#000;font-weight:600}.video-call-container{align-items:center}@media screen and (min-width: 1024px){.add-to-cart-btn{display:none}.add-to-cart-btn button{height:35px;font-size:16px!important}.product-card .add-to-cart-btn,.product-card{display:none}.product-card:hover .add-to-cart-btn,.product-card:hover{display:flex;z-index:100!important;padding:10px;left:0;position:absolute;width:100%;background:#fff;border:none;border-radius:0 0 10px 10px/0px 0px 10px 10px!important}.product-card .try-button-section{display:none}.product-card:hover .try-button-section{display:flex;z-index:100!important;padding:10px;left:0;position:absolute;width:100%;background:#fff;border:none;border-radius:0 0 10px 10px/0px 0px 10px 10px!important;box-shadow:0 16px 32px #b6b2b233}.product-card .fav-icon{display:none}.product-card:hover .fav-icon{display:flex;align-items:center;justify-content:center;cursor:pointer;z-index:100!important}}::ng-deep .mdc-text-field--filled:not(.mdc-text-field--disabled){background-color:#fff!important}.fav-icon{position:absolute;z-index:100;padding:5px;right:10px;top:10px;height:fit-content;width:fit-content;background-color:#ffffff78;border-radius:50%}.out-of-stock{background-color:#d3d3d333;color:#000;border-radius:5px;border:none}.f-20{font-size:20px}.selling-price{text-decoration:line-through;font-size:14px!important;margin-right:8px;color:#d3d3d3}.fav-tooltip{visibility:hidden;opacity:0;background:#222;color:#fff;font-size:10px;padding:4px 10px;border-radius:5px;position:absolute;top:40px;right:30px;white-space:nowrap;z-index:200;transition:opacity .2s;pointer-events:none;box-shadow:0 2px 8px #00000026}.fav-icon-wrapper:hover .fav-tooltip{visibility:visible;opacity:1}.discounted-price{margin-top:-3px;font-size:14px!important}.filter-side{width:20%;position:sticky;top:0;overflow-y:auto;height:100%;border-right:1px solid lightgrey}.filter{font-size:22px;font-weight:600;line-height:26px;color:#000}.price-ranges{display:flex;flex-direction:column;gap:8px;padding-left:8px;max-width:250px}.send-btn:hover{transform:translateY(-1px);box-shadow:0 4px 8px #8b5cf64d}.price-range-item{font-size:14px;color:#333;cursor:pointer;-webkit-user-select:none;user-select:none;display:flex;align-items:center;gap:8px}.price-range-item input[type=checkbox]{width:16px;height:16px}.categories-section{padding:.8rem 0rem;border-bottom:1px solid #D8D8D8}.categories-section:last-child{padding:.8rem 0rem;border-bottom:none}.clear{color:#e60101;font-size:14px;cursor:pointer;font-weight:600}.toggle-categories{margin-top:8px;cursor:pointer;font-weight:500;display:inline-flex;align-items:center;-webkit-user-select:none;user-select:none;width:100%}.empty-cart{display:flex;align-items:center;justify-content:center;text-align:center;height:75vh}.toggle-text .dropdown-icon{margin-left:6px;font-size:1em;margin-top:5px}.toggle-text{display:flex;align-items:center}.categories{display:flex;padding:1rem 0rem;padding-bottom:0;color:#000;font-size:18px!important;font-weight:500}.category-options{display:flex;align-items:center;cursor:pointer;padding:.75rem 0rem;gap:11px;font-weight:400!important}.category-options div{font-size:14px}.button-section{width:26%;margin:2rem 1.5rem}.button-section button{position:relative;border:none;padding:5px;width:100px!important;font-weight:600;left:-10px;border-radius:4px;white-space:nowrap;overflow:hidden}.chip{padding:5px 15px;border-radius:20px;gap:5px;width:max-content;margin:3px 0;transition:.3s opacity ease;border:1px solid}.chip:hover{opacity:.8}.price-button-section{display:flex;align-items:center;flex-direction:column-reverse}.price-range{color:#93959e;font-size:15px;white-space:nowrap}.right-side{width:80%;padding-bottom:50px;height:100vh;overflow-y:auto;flex:1 1 0;min-width:0}.bottom-filter{display:none}.onlyMobile{display:none!important}.quantity{display:flex;justify-content:space-between;align-items:center;border:1.5px solid lightgray;border-radius:3px;padding:5px;font-weight:600;width:95px}.varient-list{display:flex;gap:5px;margin-bottom:5px;width:100%;overflow-x:auto}.varient-list .varient{height:60px;width:45px;border-radius:5px;border:1px solid lightgray;cursor:pointer}.varient-list .selected-varient{border:1px solid transparent}:is() .speeddial-linear .p-speeddial-direction-up{position:relative;bottom:0%;right:0}select{width:200px;font-size:16px;padding:10px;border:1px solid lightgray;border-radius:3px;cursor:pointer}input[type=checkbox]{height:16px;width:16px}.input-group-sticky{width:100%;height:57px}.input-group{position:sticky;top:0;width:95%;z-index:100;padding:5px;outline:none;border:none;border-radius:5px;height:7vh;display:flex;align-items:center;background-color:#fff;border:1.5px solid #8080801c;box-shadow:0 0 0 1px #edececd6;margin:15px auto}.input-group .fa-search{color:gray;background-color:transparent;width:10%;display:flex;align-items:center;justify-content:center;font-size:14px;position:relative;top:1px}.input-group input{height:100%;width:80%;background-color:transparent;border:none;outline:none;font-size:16px;padding-bottom:6px;box-shadow:none}.back-to-home{background-color:#9b9a9a1c;padding:5px;border-radius:50%;display:flex;align-items:center;justify-content:center;position:fixed;right:3px;top:50%;cursor:pointer}.back-to-home .mat-icon{font-size:16px;height:16px;width:16px}.try-button-section{display:flex;justify-content:space-between;align-items:center}.try-button-section .try-at-home{width:78%}.try-button-section .try-at-home button{border:1px solid #DE57E5;border-radius:5px;font-size:14px!important;padding:5px 0!important}.try-button-section .video-call-image{width:20%;height:32px}.try-button-section .video-call-image img{width:100%;height:100%}.box-shadow{box-shadow:#0000003d 0 3px 4px;border-radius:10px!important}.discount-price{color:#d3d3d3;text-decoration:line-through;font-size:16px}.g-10{gap:10px}.mtb-5{margin-top:5px;margin-bottom:5px}.full-width-quantity{text-align:center;padding:unset;font-weight:600;height:35px}.change-quantity{width:15%;height:inherit;display:flex;align-items:center;justify-content:center;font-size:21px;font-weight:600;position:relative}.gap-15{gap:15px}.flex-wrap{flex-wrap:wrap}.carousel-buttons{display:flex;position:absolute;bottom:0;left:10px;gap:5px;transform:translateY(-50%);pointer-events:none}.carousel-buttons div{background:#fff;display:flex;align-items:center;border-radius:100%;justify-content:center;pointer-events:auto}.main-product-section{height:100vh;display:flex;position:relative}.filter-side{max-width:20%;width:100%;flex:0 0 20%}.modal-content{height:100%;border:none;border-radius:0!important}.modal-content{border-radius:18px!important}.heading-video{font-size:17px;font-weight:600}.heading-video,.schedule-header{background:#f6f3f9;border-radius:0!important}.input-field{display:flex;border-radius:12px;padding:12px;font-size:13px;background:#f6f3f9}.input-field .sub-text-call{width:20%;text-align:center;align-content:center;border-right:1px solid #bfbfbf;color:#0000008a;font-weight:700}.input-field input{width:80%;border:none;outline:none;appearance:none;margin-left:5px;background:#f6f3f9}.video-btn{border:unset;padding:8px;border-radius:12px;font-weight:600;position:absolute;bottom:20px;left:10px;width:95%!important}.video-btn:disabled{opacity:.7;cursor:not-allowed}.video-btn:disabled:hover{cursor:not-allowed}.tag-icon{position:absolute!important;top:10px;left:10px;background:#e9bb18;text-transform:uppercase;padding:5px 10px;border:none;border-radius:8px;font-size:10px;color:#000}.filter-top-section{border-right:1px solid lightgrey;width:20%;padding:1rem .5em 1rem 0rem;border-bottom:1px solid lightgrey}.product-parent{width:100%;display:flex;flex-wrap:wrap;padding:10px;z-index:1}.product-parent .product{height:auto;transform:none;z-index:1;background-color:#fff}.product-parent .product .product-card{height:100%;padding:10px;display:flex;flex-direction:column;justify-content:flex-start;transition:all .3s ease-in-out}.product-parent .product .product-name{color:#222;font-size:14px!important;line-height:26px;margin-bottom:5px;text-align:left!important;width:220px;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;transition:all .3s ease-in-out}.product-parent .product .product-img{border-radius:10px;width:100%;height:180px;z-index:1;border:.5px solid #eee}.product-parent .product .default-image img{width:100%;height:180px;border-radius:10px}.product-parent .product:hover{height:auto!important;transform:scale(1.05);border-radius:10px!important;box-shadow:0 16px 32px #b6b2b299;z-index:100!important}@media screen and (max-width: 475px){.container-fluid{padding-left:5px!important;padding-right:5px!important;padding-top:0!important}.product-name{font-size:14px}.product-parent{gap:10px}.product{padding:10px!important;margin-top:0!important;height:auto!important;transform:none!important;z-index:1!important;box-shadow:0 8px 16px #0003!important}.product .product-card{padding:0!important}.out-of-stock{font-size:12px!important}.discounted-price{font-size:14px!important}.add-to-cart-btn button{font-size:14px!important;padding:5px!important}.call-details{width:100%}.filter-text{gap:10px;font-size:16px;align-items:center;font-weight:500;cursor:pointer}.mat-slider{width:304px!important}.price-range{font-size:16px}.chip{min-width:fit-content!important}.onlyMobile{display:flex!important;row-gap:0px}.onlyMobile mat-icon{pointer-events:auto!important;z-index:1000}.category-options{padding-left:8px;padding-right:0}.categories{padding-left:0}.button-section{margin-left:15px}.button-section button{width:120px!important;padding:10px!important}.bottom-filter{position:fixed!important;display:block;z-index:100000001;width:100%;margin-left:-5px;position:absolute;bottom:-5px;display:flex;border-top:1px solid #80808045;justify-content:space-evenly;align-items:center;height:64px;background:#fff;box-shadow:#0000001a 0 4px 12px}.divider{height:60%;width:.5px;border:1px solid #d3d3d378}.onlyDesktop{display:none!important}.product-img{height:100%}.default-image img{width:100%;height:100%;box-shadow:#0000003d 0 3px 8px}.filter-side{display:none}.right-side{width:100%;margin-left:0!important;height:95%!important;padding-bottom:0!important}.main-product-section{height:auto;display:flex;position:relative;padding-bottom:7rem}}.fs-16{font-size:16px!important}.mobile-filter-chip{display:flex;align-items:center;gap:15px;border:1px solid;border-radius:30px;padding:5px 15px;height:35px}.mobile-filter-chip mat-icon{font-size:20px;display:flex;align-items:center;justify-content:center}.w-h-110{width:110px;height:110px}.w-45{width:45%}.br-8{border-radius:8px}.w-35{width:35%!important}.product-tag-badge{position:absolute;top:8px;left:8px;z-index:2;pointer-events:none}.product-tag-label{position:absolute;top:0;left:0;font-size:11px;font-weight:700;letter-spacing:.8px;text-transform:uppercase;padding:5px 10px;border-radius:4px;white-space:nowrap;opacity:0;transform:translateY(6px);transition:opacity .4s ease,transform .4s ease;pointer-events:none}.product-tag-label.tag-active{opacity:1;transform:translateY(0)}.material-info{font-size:11px;color:#888;margin-top:2px;letter-spacing:.3px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i10.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i10.DecimalPipe, name: "number" }, { kind: "pipe", type: i10.TitleCasePipe, name: "titlecase" }, { kind: "ngmodule", type: MatSelectModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i11.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i11.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i11.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i11.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SimpoComponentModule }, { kind: "component", type: i12.HoverElementsComponent, selector: "simpo-hover-elements", inputs: ["data", "index", "editOptions", "isMerged", "isEcommerce"], outputs: ["edit"] }, { kind: "component", type: i13.DeleteHoverElementComponent, selector: "simpo-delete-hover-element", inputs: ["index", "data"], outputs: ["edit"] }, { kind: "component", type: i14.NgxSkeletonLoaderComponent, selector: "ngx-skeleton-loader", inputs: ["count", "loadingText", "appearance", "animation", "ariaLabel", "theme"] }, { kind: "ngmodule", type: MatSliderModule }, { kind: "directive", type: AnimationDirective, selector: "[simpoAnimation]", inputs: ["simpoAnimation"] }, { kind: "ngmodule", type: SpeedDialModule }, { kind: "directive", type: BackgroundDirective, selector: "[simpoBackground]", inputs: ["simpoBackground", "scrollValue"] }, { kind: "directive", type: ContentFitDirective, selector: "[simpoLayout]", inputs: ["simpoLayout"] }, { kind: "directive", type: HoverDirective, selector: "[simpoHover]", outputs: ["hovering"] }, { kind: "directive", type: ButtonDirectiveDirective, selector: "[simpoButtonDirective]", inputs: ["buttonStyle", "color", "scrollValue", "backgroundInfo"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatBottomSheetModule }, { kind: "ngmodule", type: MatRadioModule }, { kind: "directive", type: i15.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i15.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: ToastModule }, { kind: "component", type: i16.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { kind: "component", type: CardSkeletonLoaderComponent, selector: "simpo-card-skeleton-loader", inputs: ["count", "showTitles"] }, { kind: "component", type: SmallProductListingComponent, selector: "simpo-small-product-listing", inputs: ["product", "data", "isScrollable", "isCategoryProductList", "customClass", "index"] }, { kind: "ngmodule", type: MatChipsModule }, { kind: "directive", type: ButtonEditorDirective, selector: "button[appButtonEditor]", inputs: ["appButtonEditor", "buttonData", "buttonStyle", "backgroundInfo", "sectionId", "buttonId", "itemIndex"] }, { kind: "directive", type: SpacingHorizontalDirective, selector: "[spacingHorizontal]", inputs: ["spacingHorizontal", "isHeader"] }] }); }
1111
1112
  }
1112
1113
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProductListComponent, decorators: [{
1113
1114
  type: Component,
@@ -1134,11 +1135,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
1134
1135
  MatChipsModule,
1135
1136
  ButtonEditorDirective,
1136
1137
  SpacingHorizontalDirective,
1137
- ], providers: [MessageService], template: "<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Call Schedule\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Scheduling\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n\r\n<!-- <div class=\"input-group\" *ngIf=\"isMobile\" [ngClass]=\"{'input-group-sticky': scrollingValue > 20}\">\r\n <mat-icon class=\"f-20 d-flex align-item-center justify-content-center\">search</mat-icon>\r\n <input type=\"text\" class=\"form-control\" placeholder=\"Search Product..\" aria-label=\"Search Product\"\r\n [(ngModel)]=\"searchText\" (ngModelChange)=\"searchProduct()\">\r\n</div> -->\r\n\r\n<ng-container *ngIf=\"!isLoading\">\r\n <section [id]=\"data?.id\" class=\"container-fluid total-container\" [simpoLayout]=\"styles?.layout\" simpoHover\r\n (hovering)=\"showEditTabs($event)\" [simpoBackground]=\"styles?.background\"\r\n [style.paddingTop.px]=\"isMobile ? '0 !important' : ''\" [attr.style]=\"customClass\"\r\n [spacingHorizontal]=\"stylesLayout\">\r\n\r\n <!-- <div style=\"position: relative;\" class=\"speeddial-linear\" *ngIf=\"isMobile\">\r\n <p-speedDial [model]=\"items\" direction=\"up\"\r\n [buttonStyle]=\"{'border-radius': '50%', 'height': '30px'}\"></p-speedDial>\r\n </div> -->\r\n\r\n <div class=\"d-flex justify-content-between align-items-center w-100 onlyDesktop\">\r\n <div class=\"filter-top-section d-flex justify-content-between align-items-baseline\">\r\n <div class=\"filter body-large\">\r\n Filters\r\n </div>\r\n <div class=\"clear\" (click)=\"clearFilter()\" [style.color]=\"styles?.background?.accentColor\">\r\n CLEAR ALL\r\n </div>\r\n </div>\r\n <div itemid=\"top-section\" class=\"d-flex align-items-center justify-content-between\"\r\n style=\"width: 77.5%; margin-right: 1%;\">\r\n <div class=\"d-flex gap-15\" style=\"width: 75%; display:flex; flex-wrap:wrap\">\r\n <ng-container *ngFor=\"let filter of filteredChips\">\r\n <div class=\"d-flex justify-content-between align-item-center w-90 chip\">\r\n <span>{{filter.name}}</span>\r\n <span style=\"cursor: pointer; width:20px; height: 20px;\">\r\n <mat-icon style=\"font-size: 20px;\" (click)=\"removeFilter(filter)\">close</mat-icon>\r\n </span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <!-- <div class=\"d-flex align-items-center\" style=\"gap: 10px;\">\r\n <div class=\"fs-6 fw-normal mr-3\">Sort by</div>\r\n <select [(ngModel)]=\"sortBy\" (change)=\"applyFilter($event, 'SORT')\" style=\"color: black;\">\r\n <option [value]=\"filter.value\" *ngFor=\"let filter of filteringArray\">{{ filter.name }}</option>\r\n </select>\r\n </div> -->\r\n <div class=\"custom-sort-dropdown\" tabindex=\"0\" (blur)=\"closeDropdown()\" (click)=\"toggleDropdown()\">\r\n <span class=\"sort-label\">Sort By:</span>\r\n <span class=\"selected-value\">{{ getSelectedName() || 'Featured' }}</span>\r\n <span class=\"toggle-icon\" [class.open]=\"isOpen\">&#9662;</span> <!-- Down arrow, rotates open -->\r\n\r\n <div class=\"options\" *ngIf=\"isOpen\">\r\n <div *ngFor=\"let filter of filteringArray\" class=\"option\" [class.selected]=\"filter.value === sortBy\"\r\n (click)=\"selectOption(filter, $event)\">\r\n {{ filter.name }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"isMobile\" class=\"d-flex w-100 onlyMobile gap-15 flex-wrap\">\r\n <ng-container *ngFor=\"let filter of filteredChips\">\r\n <div class=\"d-flex justify-content-between align-item-center w-90 chip\">\r\n <span>{{filter.name}}</span>\r\n <span style=\"cursor: pointer; width:20px; height: 20px;\">\r\n <mat-icon style=\"font-size: 20px;\" (click)=\"removeFilter(filter)\">close</mat-icon>\r\n </span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"main-product-section\">\r\n <div class=\"filter-side\">\r\n <ng-container *ngTemplateOutlet=\"FilterSection\"></ng-container>\r\n </div>\r\n <div [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\" class=\"right-side\" (scroll)=\"handleProductListScroll()\"\r\n #listScrollContainer>\r\n <ng-container *ngIf=\"!apiLoading\">\r\n <div class=\"product-parent\" *ngIf=\"responseData && responseData.length > 0\">\r\n <div *ngFor=\"let product of responseData; let i = index\" class=\"product\"\r\n [style.width]=\"applyProductWidth() ? getProductWidth() : ''\" style=\"cursor:pointer; position: relative;\">\r\n <ng-container *ngIf=\"styles?.theme == theme.Theme1\">\r\n <ng-container *ngTemplateOutlet=\"ProductDesc; context: {data: product, index: i}\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"styles?.theme != theme.Theme1\">\r\n <simpo-small-product-listing [product]=\"product\" [data]=\"data\" [isScrollable]=\"screenWidth > 475\"\r\n [index]=\"i\"></simpo-small-product-listing>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <simpo-card-skeleton-loader *ngIf=\"isListLoading\" [count]=\"getElementRow()\"></simpo-card-skeleton-loader>\r\n <section class=\"empty-cart\" *ngIf=\"!isListLoading && responseData?.length == 0\">\r\n <div>\r\n <div class=\"cart-image\">\r\n <img loading=\"lazy\" style=\"height: 150px; width: 150px;\"\r\n src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/107213c1716543334040empty-cart.png\"\r\n alt=\"\">\r\n </div>\r\n <div class=\"cart-text\">\r\n <div class=\"heading-medium d-flex justify-content-center\">\r\n Product list is empty\r\n </div>\r\n <div class=\"description d-flex justify-content-center mt-4\">\r\n Looks like no item is present with filter. Go ahead & explore top categories.\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n </ng-container>\r\n <simpo-card-skeleton-loader *ngIf=\"apiLoading\" [count]=\"getElementRow()\"></simpo-card-skeleton-loader>\r\n </div>\r\n\r\n <div class=\"bottom-filter\">\r\n <div class=\"d-flex filter-text\" style=\"gap: 10px\" (click)=\"openSorting(SortingSection)\">\r\n <mat-icon>sort</mat-icon>\r\n <span>Sort by</span>\r\n </div>\r\n <div class=\"divider\"></div>\r\n <div class=\"d-flex filter-text\" style=\"gap: 10px\" (click)=\"openFilter(FilterSection)\">\r\n <mat-icon>filter_list</mat-icon>\r\n <span>Filter</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\r\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"\r\n [isEcommerce]=\"true\"></simpo-hover-elements>\r\n </div>\r\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\r\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\r\n </div>\r\n </section>\r\n</ng-container>\r\n\r\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\"\r\n [theme]=\"{ width: '100%', height: '40vh', 'border-radius': '10px', 'position': 'relative', 'right': '5px' }\"></ngx-skeleton-loader>\r\n\r\n<ng-template #FavouriteTags let-product=\"data\">\r\n <div class=\"fav-icon-wrapper\">\r\n <mat-icon class=\"fav-icon\" [style.color]=\"data?.styles?.background?.accentColor\"\r\n (click)=\"toggleItemToFav($event, product, 'ADD')\" *ngIf=\"!product.whislist\">favorite_border\r\n </mat-icon>\r\n <mat-icon class=\"fav-icon\" [style.color]=\"data?.styles?.background?.accentColor\"\r\n (click)=\"toggleItemToFav($event, product, 'REMOVE')\" *ngIf=\"product.whislist\">favorite\r\n </mat-icon>\r\n <span class=\"fav-tooltip\">\r\n {{ product.whislist ? 'Remove from wishlist' : 'Add to wishlist' }}\r\n </span>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n\r\n<ng-template #Tags let-product=\"data\">\r\n <div class=\"product-tag-badge\" *ngIf=\"product?.tags?.length\">\r\n <span *ngFor=\"let tag of product.tags; let i = index\" class=\"product-tag-label\"\r\n [class.tag-active]=\"i === (tagIndexMap[product.itemId] ?? 0)\" [style.background]=\"styles?.background?.accentColor\"\r\n [style.color]=\"getTextColor(styles?.background?.accentColor)\">\r\n {{ tag }}\r\n </span>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<ng-template #FilterSection>\r\n <section>\r\n <div class=\"categories-section\" *ngIf=\"categories?.length\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"categoriesCollapsed = !categoriesCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Shop by Categories</b></h6>\r\n <mat-icon>{{ categoriesCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!categoriesCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let category of displayedCategories\"\r\n (click)=\"applyFilter(category, 'FILTER')\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"category.status\" />\r\n <div class=\"trim-text\">{{category.option | titlecase}}</div>\r\n </div>\r\n <div *ngIf=\"categories.length > 4\" class=\"toggle-categories\" (click)=\"toggleCategories()\"\r\n [style.color]=\"styles?.background?.accentColor\">\r\n <span class=\"toggle-text\">\r\n {{ showAllCategories ? 'Show Less' : 'Show More' }}\r\n <span class=\"dropdown-icon\">\r\n <ng-container *ngIf=\"!showAllCategories\">\r\n <mat-icon>expand_more</mat-icon>\r\n </ng-container>\r\n <ng-container *ngIf=\"showAllCategories\">\r\n <mat-icon>expand_less</mat-icon>\r\n </ng-container>\r\n </span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\" *ngIf=\"collections?.length\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"collectionsCollapsed = !collectionsCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Shop by Collections</b></h6>\r\n <mat-icon>{{ collectionsCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!collectionsCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let collection of displayedCollections\"\r\n (click)=\"applyFilter(collection, 'FILTER')\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"collection.status\" />\r\n <div class=\"trim-text\">{{collection.option | titlecase}}</div>\r\n </div>\r\n <div *ngIf=\"collections.length > 4\" class=\"toggle-categories\" (click)=\"toggleCollections()\"\r\n [style.color]=\"styles?.background?.accentColor\">\r\n <span class=\"toggle-text\">\r\n {{ showAllCollections ? 'Show Less' : 'Show More' }}\r\n <span class=\"dropdown-icon\">\r\n <ng-container *ngIf=\"!showAllCollections\"><mat-icon>expand_more</mat-icon></ng-container>\r\n <ng-container *ngIf=\"showAllCollections\"><mat-icon>expand_less</mat-icon></ng-container>\r\n </span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"ratingsCollapsed = !ratingsCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Ratings</b></h6>\r\n <mat-icon>{{ ratingsCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!ratingsCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let rating of ratingOptions\" (click)=\"onRatingChange(rating)\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"rating.selected\" />\r\n <div class=\"trim-text\">{{ rating.label }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"priceCollapsed = !priceCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Shop by price</b></h6>\r\n <mat-icon>{{ priceCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!priceCollapsed\">\r\n <label class=\"category-options\" *ngFor=\"let range of priceRanges;let i = index\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [(ngModel)]=\"range.selected\" (change)=\"onPriceRangeChange(i)\" />\r\n <div class=\"trim-text\">{{ range.label }}</div>\r\n </label>\r\n </ng-container>\r\n </div>\r\n\r\n\r\n\r\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"productTypeCollapsed = !productTypeCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Product Type</b></h6>\r\n <mat-icon>{{ productTypeCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!productTypeCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let size of productTypesData\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"size.status\" (change)=\"toggleProductSize(size)\" />\r\n <div class=\"trim-text\">{{ size.size }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"shopForCollapsed = !shopForCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Shop for</b></h6>\r\n <mat-icon>{{ shopForCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!shopForCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let size of shopForData\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"size.status\" (change)=\"toggleShopSize(size)\" />\r\n <div class=\"trim-text\">{{ size.size }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"materialCollapsed = !materialCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Material</b></h6>\r\n <mat-icon>{{ materialCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!materialCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let size of materialSizeData\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"size.status\" (change)=\"toggleMaterialSize(size)\" />\r\n <div class=\"trim-text\">{{ size.size }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"metalCollapsed = !metalCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Metal</b></h6>\r\n <mat-icon>{{ metalCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!metalCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let size of metalSizeData\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"size.status\" (change)=\"toggleMetalSize(size)\" />\r\n <div class=\"trim-text\">{{ size.size }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\r\n (click)=\"ringStyleCollapsed = !ringStyleCollapsed\" style=\"cursor:pointer\">\r\n <h6><b>Ring Style</b></h6>\r\n <mat-icon>{{ ringStyleCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </div>\r\n <ng-container *ngIf=\"!ringStyleCollapsed\">\r\n <div class=\"category-options\" *ngFor=\"let size of ringSizes\">\r\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\r\n [checked]=\"size.status\" (change)=\"toggleSize(size)\" />\r\n <div class=\"trim-text\">{{ size.size }}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </section>\r\n</ng-template>\r\n\r\n<ng-template #SortingSection>\r\n <section style=\"padding: 10px\">\r\n <div class=\"categories heading-small d-flex justify-content-between align-item-center \" style=\"padding: 0px;\">\r\n <span>Sort by</span>\r\n <mat-icon (click)=\"closeDialog()\">close</mat-icon>\r\n </div>\r\n <mat-radio-group class=\"d-flex flex-column\" [(ngModel)]=\"sortBy\">\r\n <mat-radio-button *ngFor=\"let sortingType of filteringArray\" (click)=\"selectOption(sortingType, $event)\"\r\n [value]=\"sortingType.value\">{{sortingType.name}}</mat-radio-button>\r\n </mat-radio-group>\r\n </section>\r\n</ng-template>\r\n\r\n<ng-template #ProductDesc let-product=\"data\" let-index=\"index\">\r\n <ng-template #theme1style1>\r\n <div class=\"product-card position-relative h-100\" [ngClass]=\"{'hover-effect': styles?.theme == theme.Theme1}\">\r\n <div *ngIf=\"!(product.itemImages?.length && product.itemImages?.[0]?.imgUrl)\"\r\n class=\"default-image position-relative\">\r\n <img loading=\"lazy\" src=\"https://i.postimg.cc/hPS2JpV0/no-image-available.jpg\" alt=\"\"\r\n (click)=\"proceedToProductDesc(product)\" [simpoBackground]=\"styles?.background\">\r\n <ng-container *ngTemplateOutlet=\"FavouriteTags; context: {data: product}\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"Tags; context: {data: product}\"></ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"product.itemImages?.length && product.itemImages?.[0]?.imgUrl\"\r\n class=\"default-image position-relative\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\r\n [src]=\"getProductImages(product)\" alt=\"\" class=\"product-img\" [class.fade-out]=\"imageIndex == index\"\r\n (click)=\"proceedToProductDesc(product)\" [simpoBackground]=\"styles?.background\">\r\n <div class=\"carousel-buttons\" *ngIf=\"product.itemImages?.length > 1\">\r\n <div><mat-icon (click)=\"changeImage(product, 'PREV', index)\">keyboard_arrow_left</mat-icon></div>\r\n <div><mat-icon (click)=\"changeImage(product, 'NEXT', index)\">keyboard_arrow_right</mat-icon></div>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"FavouriteTags; context: {data: product}\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"Tags; context: {data: product}\"></ng-container>\r\n </div>\r\n\r\n <div class=\"mt-2 w-100\">\r\n <div class=\"varient-list\" *ngIf=\"product?.itemVariant?.length\">\r\n <ng-container *ngFor=\"let varient of product?.itemVariant; let idx = index\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\r\n [src]=\"varient.variantImages?.[0]?.imgUrl\" alt=\"\" class=\"varient\"\r\n [ngClass]=\"{'selected-varient': varient.variantId == product.varientId}\"\r\n [style.borderColor]=\"varient.variantId == product.varientId ? 'blue' : 'transparent'\"\r\n (click)=\"selectVarient(product, varient)\">\r\n </ng-container>\r\n </div>\r\n <div class=\"d-flex align-item-center justify-content-between\" [style.display]=\"true ? 'block!important' : ''\">\r\n <div class=\"price body-large text-left d-flex align-items-center g-10\">\r\n <div class=\"fs-16\">\r\n <span [innerHTML]='currency'></span>\r\n {{product?.price?.sellingPrice | number:'1.2-2'}}\r\n </div>\r\n\r\n <div class=\"fs-16 text-start\">\r\n <span *ngIf=\"product?.price?.value - product?.price?.discountedPrice > 2\" class=\"discount-price\">\r\n {{product?.price?.value | number:'1.2-2'}}\r\n </span>\r\n </div>\r\n <!-- <div class=\"price discount-price\" *ngIf=\"product?.price?.discountedPrice < product?.price?.sellingPrice\">\r\n <span [innerHTML]='currency'></span>\r\n {{product.price.sellingPrice | number:'1.2-2'}}\r\n </div> -->\r\n </div>\r\n\r\n <div class=\"product-name heading-large w-100 text-left trim-text\"\r\n [style.color]=\"styles?.background?.accentColor\">{{ product.name }}</div>\r\n\r\n <div class=\"material-info\"\r\n *ngIf=\"isMaterialBasedPricing && (product?.materials?.length || product?.baseWeight)\">\r\n <span *ngIf=\"product?.materials?.[0]?.purity\">{{ product.materials[0].purity }}</span>\r\n <span *ngIf=\"product?.materials?.[0]?.purity && product?.baseWeight\"> \u00B7 </span>\r\n <span *ngIf=\"product?.baseWeight\">{{ product.baseWeight }}g</span>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"content?.display?.showButton && !ecomConfigs?.appointmentBookingEnabled && product.itemInventory?.openingStock > 0\"\r\n class=\"add-to-cart-btn\">\r\n <button class=\"send-btn d-flex align-items-center justify-content-center p-2\" [buttonData]=\"button?.content\"\r\n simpoButtonDirective [sectionId]=\"data?.id\" [color]=\"data?.styles?.background?.accentColor\"\r\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\r\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\"\r\n *ngIf=\"(!product.quantity && !isItemOutOfStock(product)) && IsEcommerce\"\r\n (click)=\"addItemToCart($event, product, 'ADD')\">Add to Cart</button>\r\n <button *ngIf=\"!IsEcommerce\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\r\n [color]=\"data?.styles?.background?.accentColor\" [backgroundInfo]=\"data?.styles?.background\"\r\n [appButtonEditor]=\"edit ?? false\" [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\"\r\n [id]=\"data?.id+getButtonId(1)\" (click)=\"raiseLead()\">Notify Me</button>\r\n <div class=\"quantity full-width-quantity\" [style.borderColor]=\"getButtonStyle(1)?.background\"\r\n [style.width]=\"true ? '100%' : ''\" *ngIf=\"product.quantity && !isItemOutOfStock(product)\">\r\n <span class=\"change-quantity\" [style.background]=\"getButtonStyle(1)?.background\"\r\n [style.color]=\"getButtonStyle(1)?.textColor\"\r\n (click)=\"addItemToCart($event, product, 'SUBSTRACT')\">-</span>\r\n <span style=\"width: 70%;\">{{product.quantity}}</span>\r\n <span class=\"change-quantity\" [style.background]=\"getButtonStyle(1)?.background\"\r\n [style.color]=\"getButtonStyle(1)?.textColor\" (click)=\"addItemToCart($event, product, 'ADD')\">+</span>\r\n </div>\r\n </div>\r\n <div>\r\n <button disabled class=\"out-of-stock\" *ngIf=\"isItemOutOfStock(product)\">Out Of Stock</button>\r\n </div>\r\n <div class=\"try-button-section\"\r\n *ngIf=\"content?.display?.showButton && ecomConfigs?.appointmentBookingEnabled && product?.itemInventory?.openingStock > 0\">\r\n <div class=\"try-at-home\">\r\n <button class=\"send-btn p-2\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\r\n (click)=\"addToTrialCart(product)\" [color]=\"data?.styles?.background?.accentColor\"\r\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\r\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\">TRY AT\r\n HOME</button>\r\n </div>\r\n <div class=\"video-call-image\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/578606c1753450810262video_Call.svg\"\r\n alt=\"video\" (click)=\"openDialogBox(dialogBox, product.name)\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-container *ngIf=\"screenWidth < 475 && styles?.mobileColumn === 1; else theme1style1\">\r\n <div class=\"row w-100\">\r\n <div class=\"col-8 d-flex flex-column gap-3\">\r\n <div class=\"text-left\" [style.color]=\"styles?.background?.accentColor\">{{ product.name }}</div>\r\n <div class=\"fs-16 text-start\">\r\n <span [innerHTML]='currency'></span>\r\n {{product?.price?.sellingPrice | number:'1.2-2'}}\r\n </div>\r\n <div class=\"d-flex w-45\">\r\n <div\r\n *ngIf=\"content?.display?.showButton && !ecomConfigs?.appointmentBookingEnabled && product.itemInventory?.openingStock > 0\"\r\n class=\"add-to-cart-btn w-100\">\r\n <button class=\"send-btn d-flex align-items-center justify-content-center p-2\" [buttonData]=\"button?.content\"\r\n simpoButtonDirective [sectionId]=\"data?.id\" [color]=\"data?.styles?.background?.accentColor\"\r\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\r\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\"\r\n *ngIf=\"(!product.quantity && !isItemOutOfStock(product)) && IsEcommerce\"\r\n (click)=\"addItemToCart($event, product, 'ADD')\">Add to Cart</button>\r\n <button *ngIf=\"!IsEcommerce\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\r\n [color]=\"data?.styles?.background?.accentColor\" [backgroundInfo]=\"data?.styles?.background\"\r\n [appButtonEditor]=\"edit ?? false\" [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\"\r\n [id]=\"data?.id+getButtonId(1)\" (click)=\"raiseLead()\">Notify Me</button>\r\n <div class=\"quantity full-width-quantity br-8\" [style.borderColor]=\"getButtonStyle(1)?.background\"\r\n [style.width]=\"true ? '100%' : ''\" *ngIf=\"product.quantity && !isItemOutOfStock(product)\">\r\n <span class=\"change-quantity w-35 br-8\" [style.background]=\"getButtonStyle(1)?.background\"\r\n [style.color]=\"getButtonStyle(1)?.textColor\"\r\n (click)=\"addItemToCart($event, product, 'SUBSTRACT')\">-</span>\r\n <span style=\"width: 70%;\">{{product.quantity}}</span>\r\n <span class=\"change-quantity w-35 br-8\" [style.background]=\"getButtonStyle(1)?.background\"\r\n [style.color]=\"getButtonStyle(1)?.textColor\" (click)=\"addItemToCart($event, product, 'ADD')\">+</span>\r\n </div>\r\n </div>\r\n <div>\r\n <button disabled class=\"out-of-stock w-100\" *ngIf=\"isItemOutOfStock(product)\">Out Of Stock</button>\r\n </div>\r\n <div class=\"try-button-section w-100\"\r\n *ngIf=\"content?.display?.showButton && ecomConfigs?.appointmentBookingEnabled && product?.itemInventory?.openingStock > 0\">\r\n <div class=\"try-at-home\">\r\n <button class=\"send-btn p-2\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\r\n (click)=\"addToTrialCart(product)\" [color]=\"data?.styles?.background?.accentColor\"\r\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\r\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\">TRY AT\r\n HOME</button>\r\n </div>\r\n <div class=\"video-call-image\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/578606c1753450810262video_Call.svg\"\r\n alt=\"video\" (click)=\"openDialogBox(dialogBox, product.name)\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-4 h-100 position-relative\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\r\n [src]=\"getProductImages(product)\" alt=\"\" class=\"w-h-110\" [class.fade-out]=\"imageIndex == index\"\r\n (click)=\"proceedToProductDesc(product)\">\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n </ng-container>\r\n\r\n\r\n\r\n\r\n\r\n</ng-template>\r\n\r\n\r\n\r\n<ng-template #dialogBox>\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header d-flex align-item-center\">\r\n <div class=\"heading-video w-100 py-2 text-center\">Live Video call at your convenience!</div>\r\n <div class=\"schedule-header d-flex align-items-center justify-content-end p-2\">\r\n <mat-icon (click)=\"matCloseDialog()\"\r\n class=\"cursor-pointer d-flex align-items-center justify-content-center f-18\">close</mat-icon>\r\n </div>\r\n </div>\r\n <div class=\"modal-body h-100\">\r\n <div class=\"row h-100 w-100 video-call-container\">\r\n <div class=\"col-6 h-100\" *ngIf=\"!isMobile\">\r\n <img\r\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/557699c1753779503913freepik-overhead-shot-a-person-holding-a-smartphone-with-a-1029_vmg8GqHj (online-video-cutter.com).gif\"\r\n alt=\"\" class=\"w-100 h-100\" style=\"object-fit: cover;\">\r\n </div>\r\n <div class=\"col-6 position-relative h-100 call-details\">\r\n <!-- Name Input with Validation -->\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.username\">\r\n <input type=\"text\" placeholder=\"Enter Name*\" [(ngModel)]=\"videoCallPayload.username\"\r\n (input)=\"onInputChange('username')\">\r\n </div>\r\n\r\n <!-- <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.email\">\r\n <input type=\"email\" placeholder=\"Enter Email*\" [(ngModel)]=\"videoCallPayload.email\"\r\n (input)=\"onInputChange('email')\">\r\n </div> -->\r\n\r\n <!-- Mobile Number Input with Validation -->\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.mobileNumber\">\r\n <div class=\"sub-text-call\">IN +91</div>\r\n <input type=\"number\" placeholder=\"Enter Mobile*\" [(ngModel)]=\"videoCallPayload.mobileNumber\"\r\n (input)=\"onInputChange('mobileNumber')\">\r\n </div>\r\n\r\n\r\n <!-- Pincode Input with Validation\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.pincode\">\r\n <div class=\"sub-text-call d-flex justify-content-center w-12 border-unset\">\r\n <mat-icon class=\"f-18 d-flex align-items-center justify-content-center\">gps_fixed</mat-icon>\r\n </div>\r\n <input type=\"number\" placeholder=\"Enter Pin Code*\" class=\"w-88\" [(ngModel)]=\"videoCallPayload.pincode\"\r\n (input)=\"onInputChange('pincode')\">\r\n </div> -->\r\n <div class=\"language my-3\">\r\n <div class=\"mini-text mb-2\">Language Preference</div>\r\n <div class=\"language-container d-flex gap-2 flex-wrap mt-1\">\r\n <ng-container *ngFor=\"let lang of languages\">\r\n <div class=\"lang px-2 py-1 rounded cursor-pointer\"\r\n [style.background]=\"lang == selectedLang ? data?.styles?.background?.accentColor : ''\"\r\n (click)=\"selectedLang = lang\"\r\n [style.color]=\"lang == selectedLang ? getTextColor(data?.styles?.background?.accentColor) : '#000000'\">\r\n {{lang}}\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"selectedLang == 'Others'\">\r\n <div class=\"input-field my-3\">\r\n <input type=\"text\" placeholder=\"Enter Other Language\" [(ngModel)]=\"otherLanguage\">\r\n </div>\r\n </ng-container>\r\n <button class=\"video-btn mt-2 d-flex align-items-center justify-content-center\" (click)=\"scheduleVideoCall()\"\r\n [disabled]=\"isSubmitting\" [style.background]=\"data?.styles?.background?.accentColor\" [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">\r\n <ng-container *ngIf=\"isSubmitting\">\r\n <div class=\"spinner-border spinner-border-sm me-2\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n SCHEDULING...\r\n </ng-container>\r\n <ng-container *ngIf=\"!isSubmitting && !scheduled\">\r\n <mat-icon>video_call</mat-icon>&nbsp;\r\n SCHEDULE A VIDEO CALL\r\n </ng-container>\r\n <ng-container *ngIf=\"scheduled\">\r\n <mat-icon>check_circle</mat-icon>&nbsp;\r\n SCHEDULED SUCCESSFULLY\r\n </ng-container>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>", styles: ["*{font-family:var(--website-font-family)}mat-icon{font-family:Material Icons!important}input[type=checkbox]{accent-color:var(--color)}.total-container{position:relative}.discount-price{color:#d3d3d3;text-decoration:line-through}.custom-sort-dropdown{display:inline-flex;justify-content:flex-end;flex-grow:1;align-items:center;gap:6px;padding:6px 12px;font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;font-weight:600;color:#000;cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;position:relative;background-color:#fff;width:fit-content;min-width:fit-content;max-width:fit-content;outline:none;border:none}.sort-label{color:#555;white-space:nowrap}.selected-value{flex-shrink:0;white-space:nowrap;color:#000}.toggle-icon{font-size:20px;transition:transform .3s ease;-webkit-user-select:none;user-select:none}.toggle-icon.open{transform:rotate(180deg)}.options{position:absolute;top:100%;left:0;right:0;margin-top:4px;background-color:#fff;border:none;border-radius:0 0 6px 6px;box-shadow:0 4px 6px #0000001a;max-height:180px;overflow-y:auto;z-index:100;font-weight:400;text-align:left!important}.option{padding:8px 12px;cursor:pointer;white-space:nowrap;transition:background-color .2s ease}.option:hover{background-color:#fff;color:#000}.option.selected{background-color:#fff;color:#000;font-weight:600}.video-call-container{align-items:center}@media screen and (min-width: 1024px){.add-to-cart-btn{display:none}.add-to-cart-btn button{height:35px;font-size:16px!important}.product-card .add-to-cart-btn,.product-card{display:none}.product-card:hover .add-to-cart-btn,.product-card:hover{display:flex;z-index:100!important;padding:10px;left:0;position:absolute;width:100%;background:#fff;border:none;border-radius:0 0 10px 10px/0px 0px 10px 10px!important}.product-card .try-button-section{display:none}.product-card:hover .try-button-section{display:flex;z-index:100!important;padding:10px;left:0;position:absolute;width:100%;background:#fff;border:none;border-radius:0 0 10px 10px/0px 0px 10px 10px!important;box-shadow:0 16px 32px #b6b2b233}.product-card .fav-icon{display:none}.product-card:hover .fav-icon{display:flex;align-items:center;justify-content:center;cursor:pointer;z-index:100!important}}::ng-deep .mdc-text-field--filled:not(.mdc-text-field--disabled){background-color:#fff!important}.fav-icon{position:absolute;z-index:100;padding:5px;right:10px;top:10px;height:fit-content;width:fit-content;background-color:#ffffff78;border-radius:50%}.out-of-stock{background-color:#d3d3d333;color:#000;border-radius:5px;border:none}.f-20{font-size:20px}.selling-price{text-decoration:line-through;font-size:14px!important;margin-right:8px;color:#d3d3d3}.fav-tooltip{visibility:hidden;opacity:0;background:#222;color:#fff;font-size:10px;padding:4px 10px;border-radius:5px;position:absolute;top:40px;right:30px;white-space:nowrap;z-index:200;transition:opacity .2s;pointer-events:none;box-shadow:0 2px 8px #00000026}.fav-icon-wrapper:hover .fav-tooltip{visibility:visible;opacity:1}.discounted-price{margin-top:-3px;font-size:14px!important}.filter-side{width:20%;position:sticky;top:0;overflow-y:auto;height:100%;border-right:1px solid lightgrey}.filter{font-size:22px;font-weight:600;line-height:26px;color:#000}.price-ranges{display:flex;flex-direction:column;gap:8px;padding-left:8px;max-width:250px}.send-btn:hover{transform:translateY(-1px);box-shadow:0 4px 8px #8b5cf64d}.price-range-item{font-size:14px;color:#333;cursor:pointer;-webkit-user-select:none;user-select:none;display:flex;align-items:center;gap:8px}.price-range-item input[type=checkbox]{width:16px;height:16px}.categories-section{padding:.8rem 0rem;border-bottom:1px solid #D8D8D8}.categories-section:last-child{padding:.8rem 0rem;border-bottom:none}.clear{color:#e60101;font-size:14px;cursor:pointer;font-weight:600}.toggle-categories{margin-top:8px;cursor:pointer;font-weight:500;display:inline-flex;align-items:center;-webkit-user-select:none;user-select:none;width:100%}.empty-cart{display:flex;align-items:center;justify-content:center;text-align:center;height:75vh}.toggle-text .dropdown-icon{margin-left:6px;font-size:1em;margin-top:5px}.toggle-text{display:flex;align-items:center}.categories{display:flex;padding:1rem 0rem;padding-bottom:0;color:#000;font-size:18px!important;font-weight:500}.category-options{display:flex;align-items:center;cursor:pointer;padding:.75rem 0rem;gap:11px;font-weight:400!important}.category-options div{font-size:14px}.button-section{width:26%;margin:2rem 1.5rem}.button-section button{position:relative;border:none;padding:5px;width:100px!important;font-weight:600;left:-10px;border-radius:4px;white-space:nowrap;overflow:hidden}.chip{padding:5px 15px;border-radius:20px;gap:5px;width:max-content;margin:3px 0;transition:.3s opacity ease;border:1px solid}.chip:hover{opacity:.8}.price-button-section{display:flex;align-items:center;flex-direction:column-reverse}.price-range{color:#93959e;font-size:15px;white-space:nowrap}.right-side{width:80%;padding-bottom:50px;height:100vh;overflow-y:auto;flex:1 1 0;min-width:0}.bottom-filter{display:none}.onlyMobile{display:none!important}.quantity{display:flex;justify-content:space-between;align-items:center;border:1.5px solid lightgray;border-radius:3px;padding:5px;font-weight:600;width:95px}.varient-list{display:flex;gap:5px;margin-bottom:5px;width:100%;overflow-x:auto}.varient-list .varient{height:60px;width:45px;border-radius:5px;border:1px solid lightgray;cursor:pointer}.varient-list .selected-varient{border:1px solid transparent}:is() .speeddial-linear .p-speeddial-direction-up{position:relative;bottom:0%;right:0}select{width:200px;font-size:16px;padding:10px;border:1px solid lightgray;border-radius:3px;cursor:pointer}input[type=checkbox]{height:16px;width:16px}.input-group-sticky{width:100%;height:57px}.input-group{position:sticky;top:0;width:95%;z-index:100;padding:5px;outline:none;border:none;border-radius:5px;height:7vh;display:flex;align-items:center;background-color:#fff;border:1.5px solid #8080801c;box-shadow:0 0 0 1px #edececd6;margin:15px auto}.input-group .fa-search{color:gray;background-color:transparent;width:10%;display:flex;align-items:center;justify-content:center;font-size:14px;position:relative;top:1px}.input-group input{height:100%;width:80%;background-color:transparent;border:none;outline:none;font-size:16px;padding-bottom:6px;box-shadow:none}.back-to-home{background-color:#9b9a9a1c;padding:5px;border-radius:50%;display:flex;align-items:center;justify-content:center;position:fixed;right:3px;top:50%;cursor:pointer}.back-to-home .mat-icon{font-size:16px;height:16px;width:16px}.try-button-section{display:flex;justify-content:space-between;align-items:center}.try-button-section .try-at-home{width:78%}.try-button-section .try-at-home button{border:1px solid #DE57E5;border-radius:5px;font-size:14px!important;padding:5px 0!important}.try-button-section .video-call-image{width:20%;height:32px}.try-button-section .video-call-image img{width:100%;height:100%}.box-shadow{box-shadow:#0000003d 0 3px 4px;border-radius:10px!important}.discount-price{color:#d3d3d3;text-decoration:line-through;font-size:16px}.g-10{gap:10px}.mtb-5{margin-top:5px;margin-bottom:5px}.full-width-quantity{text-align:center;padding:unset;font-weight:600;height:35px}.change-quantity{width:15%;height:inherit;display:flex;align-items:center;justify-content:center;font-size:21px;font-weight:600;position:relative}.gap-15{gap:15px}.flex-wrap{flex-wrap:wrap}.carousel-buttons{display:flex;position:absolute;bottom:0;left:10px;gap:5px;transform:translateY(-50%);pointer-events:none}.carousel-buttons div{background:#fff;display:flex;align-items:center;border-radius:100%;justify-content:center;pointer-events:auto}.main-product-section{height:100vh;display:flex;position:relative}.filter-side{max-width:20%;width:100%;flex:0 0 20%}.modal-content{height:100%;border:none;border-radius:0!important}.modal-content{border-radius:18px!important}.heading-video{font-size:17px;font-weight:600}.heading-video,.schedule-header{background:#f6f3f9;border-radius:0!important}.input-field{display:flex;border-radius:12px;padding:12px;font-size:13px;background:#f6f3f9}.input-field .sub-text-call{width:20%;text-align:center;align-content:center;border-right:1px solid #bfbfbf;color:#0000008a;font-weight:700}.input-field input{width:80%;border:none;outline:none;appearance:none;margin-left:5px;background:#f6f3f9}.video-btn{border:unset;padding:8px;border-radius:12px;font-weight:600;position:absolute;bottom:20px;left:10px;width:95%!important}.video-btn:disabled{opacity:.7;cursor:not-allowed}.video-btn:disabled:hover{cursor:not-allowed}.tag-icon{position:absolute!important;top:10px;left:10px;background:#e9bb18;text-transform:uppercase;padding:5px 10px;border:none;border-radius:8px;font-size:10px;color:#000}.filter-top-section{border-right:1px solid lightgrey;width:20%;padding:1rem .5em 1rem 0rem;border-bottom:1px solid lightgrey}.product-parent{width:100%;display:flex;flex-wrap:wrap;padding:10px;z-index:1}.product-parent .product{height:auto;transform:none;z-index:1;background-color:#fff}.product-parent .product .product-card{height:100%;padding:10px;display:flex;flex-direction:column;justify-content:flex-start;transition:all .3s ease-in-out}.product-parent .product .product-name{color:#222;font-size:14px!important;line-height:26px;margin-bottom:5px;text-align:left!important;width:220px;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;transition:all .3s ease-in-out}.product-parent .product .product-img{border-radius:10px;width:100%;height:180px;z-index:1;border:.5px solid #eee}.product-parent .product .default-image img{width:100%;height:180px;border-radius:10px}.product-parent .product:hover{height:auto!important;transform:scale(1.05);border-radius:10px!important;box-shadow:0 16px 32px #b6b2b299;z-index:100!important}@media screen and (max-width: 475px){.container-fluid{padding-left:5px!important;padding-right:5px!important;padding-top:0!important}.product-name{font-size:14px}.product-parent{gap:10px}.product{padding:10px!important;margin-top:0!important;height:auto!important;transform:none!important;z-index:1!important;box-shadow:0 8px 16px #0003!important}.product .product-card{padding:0!important}.out-of-stock{font-size:12px!important}.discounted-price{font-size:14px!important}.add-to-cart-btn button{font-size:14px!important;padding:5px!important}.call-details{width:100%}.filter-text{gap:10px;font-size:16px;align-items:center;font-weight:500;cursor:pointer}.mat-slider{width:304px!important}.price-range{font-size:16px}.chip{min-width:fit-content!important}.onlyMobile{display:flex!important;row-gap:0px}.onlyMobile mat-icon{pointer-events:auto!important;z-index:1000}.category-options{padding-left:8px;padding-right:0}.categories{padding-left:0}.button-section{margin-left:15px}.button-section button{width:120px!important;padding:10px!important}.bottom-filter{position:fixed!important;display:block;z-index:100000001;width:100%;margin-left:-5px;position:absolute;bottom:-5px;display:flex;border-top:1px solid #80808045;justify-content:space-evenly;align-items:center;height:64px;background:#fff;box-shadow:#0000001a 0 4px 12px}.divider{height:60%;width:.5px;border:1px solid #d3d3d378}.onlyDesktop{display:none!important}.product-img{height:100%}.default-image img{width:100%;height:100%;box-shadow:#0000003d 0 3px 8px}.filter-side{display:none}.right-side{width:100%;margin-left:0!important;height:95%!important;padding-bottom:0!important}.main-product-section{height:auto;display:flex;position:relative;padding-bottom:7rem}}.fs-16{font-size:16px!important}.mobile-filter-chip{display:flex;align-items:center;gap:15px;border:1px solid;border-radius:30px;padding:5px 15px;height:35px}.mobile-filter-chip mat-icon{font-size:20px;display:flex;align-items:center;justify-content:center}.w-h-110{width:110px;height:110px}.w-45{width:45%}.br-8{border-radius:8px}.w-35{width:35%!important}.product-tag-badge{position:absolute;top:8px;left:8px;z-index:2;pointer-events:none}.product-tag-label{position:absolute;top:0;left:0;font-size:11px;font-weight:700;letter-spacing:.8px;text-transform:uppercase;padding:5px 10px;border-radius:4px;white-space:nowrap;opacity:0;transform:translateY(6px);transition:opacity .4s ease,transform .4s ease;pointer-events:none}.product-tag-label.tag-active{opacity:1;transform:translateY(0)}.material-info{font-size:11px;color:#888;margin-top:2px;letter-spacing:.3px}\n"] }]
1138
+ ], providers: [MessageService], template: "<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\"\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\n<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Call Schedule\"\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\n<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Scheduling\"\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\n\n<!-- <div class=\"input-group\" *ngIf=\"isMobile\" [ngClass]=\"{'input-group-sticky': scrollingValue > 20}\">\n <mat-icon class=\"f-20 d-flex align-item-center justify-content-center\">search</mat-icon>\n <input type=\"text\" class=\"form-control\" placeholder=\"Search Product..\" aria-label=\"Search Product\"\n [(ngModel)]=\"searchText\" (ngModelChange)=\"searchProduct()\">\n</div> -->\n\n<ng-container *ngIf=\"!isLoading\">\n <section [id]=\"data?.id\" class=\"container-fluid total-container\" [simpoLayout]=\"styles?.layout\" simpoHover\n (hovering)=\"showEditTabs($event)\" [simpoBackground]=\"styles?.background\"\n [style.paddingTop.px]=\"isMobile ? '0 !important' : ''\" [attr.style]=\"customClass\"\n [spacingHorizontal]=\"stylesLayout\">\n\n <!-- <div style=\"position: relative;\" class=\"speeddial-linear\" *ngIf=\"isMobile\">\n <p-speedDial [model]=\"items\" direction=\"up\"\n [buttonStyle]=\"{'border-radius': '50%', 'height': '30px'}\"></p-speedDial>\n </div> -->\n\n <div class=\"d-flex justify-content-between align-items-center w-100 onlyDesktop\">\n <div class=\"filter-top-section d-flex justify-content-between align-items-baseline\">\n <div class=\"filter body-large\">\n Filters\n </div>\n <div class=\"clear\" (click)=\"clearFilter()\" [style.color]=\"styles?.background?.accentColor\">\n CLEAR ALL\n </div>\n </div>\n <div itemid=\"top-section\" class=\"d-flex align-items-center justify-content-between\"\n style=\"width: 77.5%; margin-right: 1%;\">\n <div class=\"d-flex gap-15\" style=\"width: 75%; display:flex; flex-wrap:wrap\">\n <ng-container *ngFor=\"let filter of filteredChips\">\n <div class=\"d-flex justify-content-between align-item-center w-90 chip\">\n <span>{{filter.name}}</span>\n <span style=\"cursor: pointer; width:20px; height: 20px;\">\n <mat-icon style=\"font-size: 20px;\" (click)=\"removeFilter(filter)\">close</mat-icon>\n </span>\n </div>\n </ng-container>\n </div>\n <!-- <div class=\"d-flex align-items-center\" style=\"gap: 10px;\">\n <div class=\"fs-6 fw-normal mr-3\">Sort by</div>\n <select [(ngModel)]=\"sortBy\" (change)=\"applyFilter($event, 'SORT')\" style=\"color: black;\">\n <option [value]=\"filter.value\" *ngFor=\"let filter of filteringArray\">{{ filter.name }}</option>\n </select>\n </div> -->\n <div class=\"custom-sort-dropdown\" tabindex=\"0\" (blur)=\"closeDropdown()\" (click)=\"toggleDropdown()\">\n <span class=\"sort-label\">Sort By:</span>\n <span class=\"selected-value\">{{ getSelectedName() || 'Featured' }}</span>\n <span class=\"toggle-icon\" [class.open]=\"isOpen\">&#9662;</span> <!-- Down arrow, rotates open -->\n\n <div class=\"options\" *ngIf=\"isOpen\">\n <div *ngFor=\"let filter of filteringArray\" class=\"option\" [class.selected]=\"filter.value === sortBy\"\n (click)=\"selectOption(filter, $event)\">\n {{ filter.name }}\n </div>\n </div>\n </div>\n\n </div>\n </div>\n\n <div *ngIf=\"isMobile\" class=\"d-flex w-100 onlyMobile gap-15 flex-wrap\">\n <ng-container *ngFor=\"let filter of filteredChips\">\n <div class=\"d-flex justify-content-between align-item-center w-90 chip\">\n <span>{{filter.name}}</span>\n <span style=\"cursor: pointer; width:20px; height: 20px;\">\n <mat-icon style=\"font-size: 20px;\" (click)=\"removeFilter(filter)\">close</mat-icon>\n </span>\n </div>\n </ng-container>\n </div>\n\n <div class=\"main-product-section\">\n <div class=\"filter-side\">\n <ng-container *ngTemplateOutlet=\"FilterSection\"></ng-container>\n </div>\n <div [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\" class=\"right-side\" (scroll)=\"handleProductListScroll()\"\n #listScrollContainer>\n <ng-container *ngIf=\"!apiLoading\">\n <div class=\"product-parent\" *ngIf=\"responseData && responseData.length > 0\">\n <div *ngFor=\"let product of responseData; let i = index\" class=\"product\"\n [style.width]=\"applyProductWidth() ? getProductWidth() : ''\" style=\"cursor:pointer; position: relative;\">\n <ng-container *ngIf=\"styles?.theme == theme.Theme1\">\n <ng-container *ngTemplateOutlet=\"ProductDesc; context: {data: product, index: i}\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"styles?.theme != theme.Theme1\">\n <simpo-small-product-listing [product]=\"product\" [data]=\"data\" [isScrollable]=\"screenWidth > 475\"\n [index]=\"i\"></simpo-small-product-listing>\n </ng-container>\n </div>\n </div>\n <simpo-card-skeleton-loader *ngIf=\"isListLoading\" [count]=\"getElementRow()\"></simpo-card-skeleton-loader>\n <section class=\"empty-cart\" *ngIf=\"!isListLoading && responseData?.length == 0\">\n <div>\n <div class=\"cart-image\">\n <img loading=\"lazy\" style=\"height: 150px; width: 150px;\"\n src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/107213c1716543334040empty-cart.png\"\n alt=\"\">\n </div>\n <div class=\"cart-text\">\n <div class=\"heading-medium d-flex justify-content-center\">\n Product list is empty\n </div>\n <div class=\"description d-flex justify-content-center mt-4\">\n Looks like no item is present with filter. Go ahead & explore top categories.\n </div>\n </div>\n </div>\n </section>\n </ng-container>\n <simpo-card-skeleton-loader *ngIf=\"apiLoading\" [count]=\"getElementRow()\"></simpo-card-skeleton-loader>\n </div>\n\n <div class=\"bottom-filter\">\n <div class=\"d-flex filter-text\" style=\"gap: 10px\" (click)=\"openSorting(SortingSection)\">\n <mat-icon>sort</mat-icon>\n <span>Sort by</span>\n </div>\n <div class=\"divider\"></div>\n <div class=\"d-flex filter-text\" style=\"gap: 10px\" (click)=\"openFilter(FilterSection)\">\n <mat-icon>filter_list</mat-icon>\n <span>Filter</span>\n </div>\n </div>\n </div>\n\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"\n [isEcommerce]=\"true\"></simpo-hover-elements>\n </div>\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\n </div>\n </section>\n</ng-container>\n\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\"\n [theme]=\"{ width: '100%', height: '40vh', 'border-radius': '10px', 'position': 'relative', 'right': '5px' }\"></ngx-skeleton-loader>\n\n<ng-template #FavouriteTags let-product=\"data\">\n <div class=\"fav-icon-wrapper\">\n <mat-icon class=\"fav-icon\" [style.color]=\"data?.styles?.background?.accentColor\"\n (click)=\"toggleItemToFav($event, product, 'ADD')\" *ngIf=\"!product.whislist\">favorite_border\n </mat-icon>\n <mat-icon class=\"fav-icon\" [style.color]=\"data?.styles?.background?.accentColor\"\n (click)=\"toggleItemToFav($event, product, 'REMOVE')\" *ngIf=\"product.whislist\">favorite\n </mat-icon>\n <span class=\"fav-tooltip\">\n {{ product.whislist ? 'Remove from wishlist' : 'Add to wishlist' }}\n </span>\n </div>\n</ng-template>\n\n\n\n<ng-template #Tags let-product=\"data\">\n <div class=\"product-tag-badge\" *ngIf=\"product?.tags?.length\">\n <span *ngFor=\"let tag of product.tags; let i = index\" class=\"product-tag-label\"\n [class.tag-active]=\"i === (tagIndexMap[product.itemId] ?? 0)\" [style.background]=\"styles?.background?.accentColor\"\n [style.color]=\"getTextColor(styles?.background?.accentColor)\">\n {{ tag }}\n </span>\n </div>\n</ng-template>\n\n\n<ng-template #FilterSection>\n <section>\n <div class=\"categories-section\" *ngIf=\"categories?.length\">\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\n (click)=\"categoriesCollapsed = !categoriesCollapsed\" style=\"cursor:pointer\">\n <h6><b>Shop by Categories</b></h6>\n <mat-icon>{{ categoriesCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\n </div>\n <ng-container *ngIf=\"!categoriesCollapsed\">\n <div class=\"category-options\" *ngFor=\"let category of displayedCategories\"\n (click)=\"applyFilter(category, 'FILTER')\">\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\n [checked]=\"category.status\" />\n <div class=\"trim-text\">{{category.option | titlecase}}</div>\n </div>\n <div *ngIf=\"categories.length > 4\" class=\"toggle-categories\" (click)=\"toggleCategories()\"\n [style.color]=\"styles?.background?.accentColor\">\n <span class=\"toggle-text\">\n {{ showAllCategories ? 'Show Less' : 'Show More' }}\n <span class=\"dropdown-icon\">\n <ng-container *ngIf=\"!showAllCategories\">\n <mat-icon>expand_more</mat-icon>\n </ng-container>\n <ng-container *ngIf=\"showAllCategories\">\n <mat-icon>expand_less</mat-icon>\n </ng-container>\n </span>\n </span>\n </div>\n </ng-container>\n </div>\n\n <div class=\"categories-section\" *ngIf=\"collections?.length\">\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\n (click)=\"collectionsCollapsed = !collectionsCollapsed\" style=\"cursor:pointer\">\n <h6><b>Shop by Collections</b></h6>\n <mat-icon>{{ collectionsCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\n </div>\n <ng-container *ngIf=\"!collectionsCollapsed\">\n <div class=\"category-options\" *ngFor=\"let collection of displayedCollections\"\n (click)=\"applyFilter(collection, 'FILTER')\">\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\n [checked]=\"collection.status\" />\n <div class=\"trim-text\">{{collection.option | titlecase}}</div>\n </div>\n <div *ngIf=\"collections.length > 4\" class=\"toggle-categories\" (click)=\"toggleCollections()\"\n [style.color]=\"styles?.background?.accentColor\">\n <span class=\"toggle-text\">\n {{ showAllCollections ? 'Show Less' : 'Show More' }}\n <span class=\"dropdown-icon\">\n <ng-container *ngIf=\"!showAllCollections\"><mat-icon>expand_more</mat-icon></ng-container>\n <ng-container *ngIf=\"showAllCollections\"><mat-icon>expand_less</mat-icon></ng-container>\n </span>\n </span>\n </div>\n </ng-container>\n </div>\n\n <div class=\"categories-section\">\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\n (click)=\"ratingsCollapsed = !ratingsCollapsed\" style=\"cursor:pointer\">\n <h6><b>Ratings</b></h6>\n <mat-icon>{{ ratingsCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\n </div>\n <ng-container *ngIf=\"!ratingsCollapsed\">\n <div class=\"category-options\" *ngFor=\"let rating of ratingOptions\" (click)=\"onRatingChange(rating)\">\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\n [checked]=\"rating.selected\" />\n <div class=\"trim-text\">{{ rating.label }}</div>\n </div>\n </ng-container>\n </div>\n\n <div class=\"categories-section\">\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\n (click)=\"priceCollapsed = !priceCollapsed\" style=\"cursor:pointer\">\n <h6><b>Shop by price</b></h6>\n <mat-icon>{{ priceCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\n </div>\n <ng-container *ngIf=\"!priceCollapsed\">\n <label class=\"category-options\" *ngFor=\"let range of priceRanges;let i = index\">\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\n [(ngModel)]=\"range.selected\" (change)=\"onPriceRangeChange(i)\" />\n <div class=\"trim-text\">{{ range.label }}</div>\n </label>\n </ng-container>\n </div>\n\n\n\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\n (click)=\"productTypeCollapsed = !productTypeCollapsed\" style=\"cursor:pointer\">\n <h6><b>Product Type</b></h6>\n <mat-icon>{{ productTypeCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\n </div>\n <ng-container *ngIf=\"!productTypeCollapsed\">\n <div class=\"category-options\" *ngFor=\"let size of productTypesData\">\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\n [checked]=\"size.status\" (change)=\"toggleProductSize(size)\" />\n <div class=\"trim-text\">{{ size.size }}</div>\n </div>\n </ng-container>\n </div>\n\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\n (click)=\"shopForCollapsed = !shopForCollapsed\" style=\"cursor:pointer\">\n <h6><b>Shop for</b></h6>\n <mat-icon>{{ shopForCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\n </div>\n <ng-container *ngIf=\"!shopForCollapsed\">\n <div class=\"category-options\" *ngFor=\"let size of shopForData\">\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\n [checked]=\"size.status\" (change)=\"toggleShopSize(size)\" />\n <div class=\"trim-text\">{{ size.size }}</div>\n </div>\n </ng-container>\n </div>\n\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\n (click)=\"materialCollapsed = !materialCollapsed\" style=\"cursor:pointer\">\n <h6><b>Material</b></h6>\n <mat-icon>{{ materialCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\n </div>\n <ng-container *ngIf=\"!materialCollapsed\">\n <div class=\"category-options\" *ngFor=\"let size of materialSizeData\">\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\n [checked]=\"size.status\" (change)=\"toggleMaterialSize(size)\" />\n <div class=\"trim-text\">{{ size.size }}</div>\n </div>\n </ng-container>\n </div>\n\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\n (click)=\"metalCollapsed = !metalCollapsed\" style=\"cursor:pointer\">\n <h6><b>Metal</b></h6>\n <mat-icon>{{ metalCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\n </div>\n <ng-container *ngIf=\"!metalCollapsed\">\n <div class=\"category-options\" *ngFor=\"let size of metalSizeData\">\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\n [checked]=\"size.status\" (change)=\"toggleMetalSize(size)\" />\n <div class=\"trim-text\">{{ size.size }}</div>\n </div>\n </ng-container>\n </div>\n\n <div class=\"categories-section\" *ngIf=\"toShowInJewellery\">\n <div class=\"categories heading-small d-flex justify-content-between align-items-center\"\n (click)=\"ringStyleCollapsed = !ringStyleCollapsed\" style=\"cursor:pointer\">\n <h6><b>Ring Style</b></h6>\n <mat-icon>{{ ringStyleCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\n </div>\n <ng-container *ngIf=\"!ringStyleCollapsed\">\n <div class=\"category-options\" *ngFor=\"let size of ringSizes\">\n <input type=\"checkbox\" class=\"check-color\" [style.--color]=\"styles?.background?.accentColor\"\n [checked]=\"size.status\" (change)=\"toggleSize(size)\" />\n <div class=\"trim-text\">{{ size.size }}</div>\n </div>\n </ng-container>\n </div>\n </section>\n</ng-template>\n\n<ng-template #SortingSection>\n <section style=\"padding: 10px\">\n <div class=\"categories heading-small d-flex justify-content-between align-item-center \" style=\"padding: 0px;\">\n <span>Sort by</span>\n <mat-icon (click)=\"closeDialog()\">close</mat-icon>\n </div>\n <mat-radio-group class=\"d-flex flex-column\" [(ngModel)]=\"sortBy\">\n <mat-radio-button *ngFor=\"let sortingType of filteringArray\" (click)=\"selectOption(sortingType, $event)\"\n [value]=\"sortingType.value\">{{sortingType.name}}</mat-radio-button>\n </mat-radio-group>\n </section>\n</ng-template>\n\n<ng-template #ProductDesc let-product=\"data\" let-index=\"index\">\n <ng-template #theme1style1>\n <div class=\"product-card position-relative h-100\" [ngClass]=\"{'hover-effect': styles?.theme == theme.Theme1}\">\n <div *ngIf=\"!(product.itemImages?.length && product.itemImages?.[0]?.imgUrl)\"\n class=\"default-image position-relative\">\n <img loading=\"lazy\" src=\"https://i.postimg.cc/hPS2JpV0/no-image-available.jpg\" alt=\"\"\n (click)=\"proceedToProductDesc(product)\" [simpoBackground]=\"styles?.background\">\n <ng-container *ngTemplateOutlet=\"FavouriteTags; context: {data: product}\"></ng-container>\n <ng-container *ngTemplateOutlet=\"Tags; context: {data: product}\"></ng-container>\n </div>\n\n <div *ngIf=\"product.itemImages?.length && product.itemImages?.[0]?.imgUrl\"\n class=\"default-image position-relative\">\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\n [src]=\"getProductImages(product)\" alt=\"\" class=\"product-img\" [class.fade-out]=\"imageIndex == index\"\n (click)=\"proceedToProductDesc(product)\" [simpoBackground]=\"styles?.background\">\n <div class=\"carousel-buttons\" *ngIf=\"product.itemImages?.length > 1\">\n <div><mat-icon (click)=\"changeImage(product, 'PREV', index)\">keyboard_arrow_left</mat-icon></div>\n <div><mat-icon (click)=\"changeImage(product, 'NEXT', index)\">keyboard_arrow_right</mat-icon></div>\n </div>\n <ng-container *ngTemplateOutlet=\"FavouriteTags; context: {data: product}\"></ng-container>\n <ng-container *ngTemplateOutlet=\"Tags; context: {data: product}\"></ng-container>\n </div>\n\n <div class=\"mt-2 w-100\">\n <div class=\"varient-list\" *ngIf=\"product?.itemVariant?.length\">\n <ng-container *ngFor=\"let varient of product?.itemVariant; let idx = index\">\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\n [src]=\"varient.variantImages?.[0]?.imgUrl\" alt=\"\" class=\"varient\"\n [ngClass]=\"{'selected-varient': varient.variantId == product.varientId}\"\n [style.borderColor]=\"varient.variantId == product.varientId ? 'blue' : 'transparent'\"\n (click)=\"selectVarient(product, varient)\">\n </ng-container>\n </div>\n <div class=\"d-flex align-item-center justify-content-between\" [style.display]=\"true ? 'block!important' : ''\">\n <div class=\"price body-large text-left d-flex align-items-center g-10\">\n <div class=\"fs-16\">\n <span [innerHTML]='currency'></span>\n {{product?.price?.sellingPrice | number:'1.2-2'}}\n </div>\n\n <div class=\"fs-16 text-start\">\n <span *ngIf=\"product?.price?.value - product?.price?.discountedPrice > 2\" class=\"discount-price\">\n {{product?.price?.value | number:'1.2-2'}}\n </span>\n </div>\n <!-- <div class=\"price discount-price\" *ngIf=\"product?.price?.discountedPrice < product?.price?.sellingPrice\">\n <span [innerHTML]='currency'></span>\n {{product.price.sellingPrice | number:'1.2-2'}}\n </div> -->\n </div>\n\n <div class=\"product-name heading-large w-100 text-left trim-text\"\n [style.color]=\"styles?.background?.accentColor\">{{ product.name }}</div>\n\n <div class=\"material-info\"\n *ngIf=\"isMaterialBasedPricing && (product?.materials?.length || product?.baseWeight)\">\n <span *ngIf=\"product?.materials?.[0]?.purity\">{{ product.materials[0].purity }}</span>\n <span *ngIf=\"product?.materials?.[0]?.purity && product?.baseWeight\"> \u00B7 </span>\n <span *ngIf=\"product?.baseWeight\">{{ product.baseWeight }}g</span>\n </div>\n\n <div\n *ngIf=\"content?.display?.showButton && !ecomConfigs?.appointmentBookingEnabled && product.itemInventory?.openingStock > 0\"\n class=\"add-to-cart-btn\">\n <button class=\"send-btn d-flex align-items-center justify-content-center p-2\" [buttonData]=\"button?.content\"\n simpoButtonDirective [sectionId]=\"data?.id\" [color]=\"data?.styles?.background?.accentColor\"\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\"\n *ngIf=\"(!product.quantity && !isItemOutOfStock(product)) && IsEcommerce\"\n (click)=\"addItemToCart($event, product, 'ADD')\">Add to Cart</button>\n <button *ngIf=\"!IsEcommerce\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\n [color]=\"data?.styles?.background?.accentColor\" [backgroundInfo]=\"data?.styles?.background\"\n [appButtonEditor]=\"edit ?? false\" [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\"\n [id]=\"data?.id+getButtonId(1)\" (click)=\"raiseLead()\">Notify Me</button>\n <div class=\"quantity full-width-quantity\" [style.borderColor]=\"getButtonStyle(1)?.background\"\n [style.width]=\"true ? '100%' : ''\" *ngIf=\"product.quantity && !isItemOutOfStock(product)\">\n <span class=\"change-quantity\" [style.background]=\"getButtonStyle(1)?.background\"\n [style.color]=\"getButtonStyle(1)?.textColor\"\n (click)=\"addItemToCart($event, product, 'SUBSTRACT')\">-</span>\n <span style=\"width: 70%;\">{{product.quantity}}</span>\n <span class=\"change-quantity\" [style.background]=\"getButtonStyle(1)?.background\"\n [style.color]=\"getButtonStyle(1)?.textColor\" (click)=\"addItemToCart($event, product, 'ADD')\">+</span>\n </div>\n </div>\n <div>\n <button disabled class=\"out-of-stock\" *ngIf=\"isItemOutOfStock(product)\">Out Of Stock</button>\n </div>\n <div class=\"try-button-section\"\n *ngIf=\"content?.display?.showButton && ecomConfigs?.appointmentBookingEnabled && product?.itemInventory?.openingStock > 0\">\n <div class=\"try-at-home\">\n <button class=\"send-btn p-2\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\n (click)=\"addToTrialCart(product)\" [color]=\"data?.styles?.background?.accentColor\"\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\">TRY AT\n HOME</button>\n </div>\n <div class=\"video-call-image\">\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/578606c1753450810262video_Call.svg\"\n alt=\"video\" (click)=\"openDialogBox(dialogBox, product.name)\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n\n <ng-container *ngIf=\"screenWidth < 475 && styles?.mobileColumn === 1; else theme1style1\">\n <div class=\"row w-100\">\n <div class=\"col-8 d-flex flex-column gap-3\">\n <div class=\"text-left\" [style.color]=\"styles?.background?.accentColor\">{{ product.name }}</div>\n <div class=\"fs-16 text-start\">\n <span [innerHTML]='currency'></span>\n {{product?.price?.sellingPrice | number:'1.2-2'}}\n </div>\n <div class=\"d-flex w-45\">\n <div\n *ngIf=\"content?.display?.showButton && !ecomConfigs?.appointmentBookingEnabled && product.itemInventory?.openingStock > 0\"\n class=\"add-to-cart-btn w-100\">\n <button class=\"send-btn d-flex align-items-center justify-content-center p-2\" [buttonData]=\"button?.content\"\n simpoButtonDirective [sectionId]=\"data?.id\" [color]=\"data?.styles?.background?.accentColor\"\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\"\n *ngIf=\"(!product.quantity && !isItemOutOfStock(product)) && IsEcommerce\"\n (click)=\"addItemToCart($event, product, 'ADD')\">Add to Cart</button>\n <button *ngIf=\"!IsEcommerce\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\n [color]=\"data?.styles?.background?.accentColor\" [backgroundInfo]=\"data?.styles?.background\"\n [appButtonEditor]=\"edit ?? false\" [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\"\n [id]=\"data?.id+getButtonId(1)\" (click)=\"raiseLead()\">Notify Me</button>\n <div class=\"quantity full-width-quantity br-8\" [style.borderColor]=\"getButtonStyle(1)?.background\"\n [style.width]=\"true ? '100%' : ''\" *ngIf=\"product.quantity && !isItemOutOfStock(product)\">\n <span class=\"change-quantity w-35 br-8\" [style.background]=\"getButtonStyle(1)?.background\"\n [style.color]=\"getButtonStyle(1)?.textColor\"\n (click)=\"addItemToCart($event, product, 'SUBSTRACT')\">-</span>\n <span style=\"width: 70%;\">{{product.quantity}}</span>\n <span class=\"change-quantity w-35 br-8\" [style.background]=\"getButtonStyle(1)?.background\"\n [style.color]=\"getButtonStyle(1)?.textColor\" (click)=\"addItemToCart($event, product, 'ADD')\">+</span>\n </div>\n </div>\n <div>\n <button disabled class=\"out-of-stock w-100\" *ngIf=\"isItemOutOfStock(product)\">Out Of Stock</button>\n </div>\n <div class=\"try-button-section w-100\"\n *ngIf=\"content?.display?.showButton && ecomConfigs?.appointmentBookingEnabled && product?.itemInventory?.openingStock > 0\">\n <div class=\"try-at-home\">\n <button class=\"send-btn p-2\" [buttonData]=\"button?.content\" simpoButtonDirective [sectionId]=\"data?.id\"\n (click)=\"addToTrialCart(product)\" [color]=\"data?.styles?.background?.accentColor\"\n [backgroundInfo]=\"data?.styles?.background\" [appButtonEditor]=\"edit ?? false\"\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [id]=\"data?.id+getButtonId(1)\">TRY AT\n HOME</button>\n </div>\n <div class=\"video-call-image\">\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/578606c1753450810262video_Call.svg\"\n alt=\"video\" (click)=\"openDialogBox(dialogBox, product.name)\" />\n </div>\n </div>\n </div>\n </div>\n <div class=\"col-4 h-100 position-relative\">\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\n [src]=\"getProductImages(product)\" alt=\"\" class=\"w-h-110\" [class.fade-out]=\"imageIndex == index\"\n (click)=\"proceedToProductDesc(product)\">\n </div>\n </div>\n\n\n\n </ng-container>\n\n\n\n\n\n</ng-template>\n\n\n\n<ng-template #dialogBox>\n <div class=\"modal-content\">\n <div class=\"modal-header d-flex align-item-center\">\n <div class=\"heading-video w-100 py-2 text-center\">Live Video call at your convenience!</div>\n <div class=\"schedule-header d-flex align-items-center justify-content-end p-2\">\n <mat-icon (click)=\"matCloseDialog()\"\n class=\"cursor-pointer d-flex align-items-center justify-content-center f-18\">close</mat-icon>\n </div>\n </div>\n <div class=\"modal-body h-100\">\n <div class=\"row h-100 w-100 video-call-container\">\n <div class=\"col-6 h-100\" *ngIf=\"!isMobile\">\n <img\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/557699c1753779503913freepik-overhead-shot-a-person-holding-a-smartphone-with-a-1029_vmg8GqHj (online-video-cutter.com).gif\"\n alt=\"\" class=\"w-100 h-100\" style=\"object-fit: cover;\">\n </div>\n <div class=\"col-6 position-relative h-100 call-details\">\n <!-- Name Input with Validation -->\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.username\">\n <input type=\"text\" placeholder=\"Enter Name*\" [(ngModel)]=\"videoCallPayload.username\"\n (input)=\"onInputChange('username')\">\n </div>\n\n <!-- <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.email\">\n <input type=\"email\" placeholder=\"Enter Email*\" [(ngModel)]=\"videoCallPayload.email\"\n (input)=\"onInputChange('email')\">\n </div> -->\n\n <!-- Mobile Number Input with Validation -->\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.mobileNumber\">\n <div class=\"sub-text-call\">IN +91</div>\n <input type=\"number\" placeholder=\"Enter Mobile*\" [(ngModel)]=\"videoCallPayload.mobileNumber\"\n (input)=\"onInputChange('mobileNumber')\">\n </div>\n\n\n <!-- Pincode Input with Validation\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.pincode\">\n <div class=\"sub-text-call d-flex justify-content-center w-12 border-unset\">\n <mat-icon class=\"f-18 d-flex align-items-center justify-content-center\">gps_fixed</mat-icon>\n </div>\n <input type=\"number\" placeholder=\"Enter Pin Code*\" class=\"w-88\" [(ngModel)]=\"videoCallPayload.pincode\"\n (input)=\"onInputChange('pincode')\">\n </div> -->\n <div class=\"language my-3\">\n <div class=\"mini-text mb-2\">Language Preference</div>\n <div class=\"language-container d-flex gap-2 flex-wrap mt-1\">\n <ng-container *ngFor=\"let lang of languages\">\n <div class=\"lang px-2 py-1 rounded cursor-pointer\"\n [style.background]=\"lang == selectedLang ? data?.styles?.background?.accentColor : ''\"\n (click)=\"selectedLang = lang\"\n [style.color]=\"lang == selectedLang ? getTextColor(data?.styles?.background?.accentColor) : '#000000'\">\n {{lang}}\n </div>\n </ng-container>\n </div>\n </div>\n <ng-container *ngIf=\"selectedLang == 'Others'\">\n <div class=\"input-field my-3\">\n <input type=\"text\" placeholder=\"Enter Other Language\" [(ngModel)]=\"otherLanguage\">\n </div>\n </ng-container>\n <button class=\"video-btn mt-2 d-flex align-items-center justify-content-center\" (click)=\"scheduleVideoCall()\"\n [disabled]=\"isSubmitting\" [style.background]=\"data?.styles?.background?.accentColor\" [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">\n <ng-container *ngIf=\"isSubmitting\">\n <div class=\"spinner-border spinner-border-sm me-2\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n SCHEDULING...\n </ng-container>\n <ng-container *ngIf=\"!isSubmitting && !scheduled\">\n <mat-icon>video_call</mat-icon>&nbsp;\n SCHEDULE A VIDEO CALL\n </ng-container>\n <ng-container *ngIf=\"scheduled\">\n <mat-icon>check_circle</mat-icon>&nbsp;\n SCHEDULED SUCCESSFULLY\n </ng-container>\n </button>\n </div>\n </div>\n </div>\n </div>\n</ng-template>", styles: ["*{font-family:var(--website-font-family)}mat-icon{font-family:Material Icons!important}input[type=checkbox]{accent-color:var(--color)}.total-container{position:relative}.discount-price{color:#d3d3d3;text-decoration:line-through}.custom-sort-dropdown{display:inline-flex;justify-content:flex-end;flex-grow:1;align-items:center;gap:6px;padding:6px 12px;font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;font-weight:600;color:#000;cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;position:relative;background-color:#fff;width:fit-content;min-width:fit-content;max-width:fit-content;outline:none;border:none}.sort-label{color:#555;white-space:nowrap}.selected-value{flex-shrink:0;white-space:nowrap;color:#000}.toggle-icon{font-size:20px;transition:transform .3s ease;-webkit-user-select:none;user-select:none}.toggle-icon.open{transform:rotate(180deg)}.options{position:absolute;top:100%;left:0;right:0;margin-top:4px;background-color:#fff;border:none;border-radius:0 0 6px 6px;box-shadow:0 4px 6px #0000001a;max-height:180px;overflow-y:auto;z-index:100;font-weight:400;text-align:left!important}.option{padding:8px 12px;cursor:pointer;white-space:nowrap;transition:background-color .2s ease}.option:hover{background-color:#fff;color:#000}.option.selected{background-color:#fff;color:#000;font-weight:600}.video-call-container{align-items:center}@media screen and (min-width: 1024px){.add-to-cart-btn{display:none}.add-to-cart-btn button{height:35px;font-size:16px!important}.product-card .add-to-cart-btn,.product-card{display:none}.product-card:hover .add-to-cart-btn,.product-card:hover{display:flex;z-index:100!important;padding:10px;left:0;position:absolute;width:100%;background:#fff;border:none;border-radius:0 0 10px 10px/0px 0px 10px 10px!important}.product-card .try-button-section{display:none}.product-card:hover .try-button-section{display:flex;z-index:100!important;padding:10px;left:0;position:absolute;width:100%;background:#fff;border:none;border-radius:0 0 10px 10px/0px 0px 10px 10px!important;box-shadow:0 16px 32px #b6b2b233}.product-card .fav-icon{display:none}.product-card:hover .fav-icon{display:flex;align-items:center;justify-content:center;cursor:pointer;z-index:100!important}}::ng-deep .mdc-text-field--filled:not(.mdc-text-field--disabled){background-color:#fff!important}.fav-icon{position:absolute;z-index:100;padding:5px;right:10px;top:10px;height:fit-content;width:fit-content;background-color:#ffffff78;border-radius:50%}.out-of-stock{background-color:#d3d3d333;color:#000;border-radius:5px;border:none}.f-20{font-size:20px}.selling-price{text-decoration:line-through;font-size:14px!important;margin-right:8px;color:#d3d3d3}.fav-tooltip{visibility:hidden;opacity:0;background:#222;color:#fff;font-size:10px;padding:4px 10px;border-radius:5px;position:absolute;top:40px;right:30px;white-space:nowrap;z-index:200;transition:opacity .2s;pointer-events:none;box-shadow:0 2px 8px #00000026}.fav-icon-wrapper:hover .fav-tooltip{visibility:visible;opacity:1}.discounted-price{margin-top:-3px;font-size:14px!important}.filter-side{width:20%;position:sticky;top:0;overflow-y:auto;height:100%;border-right:1px solid lightgrey}.filter{font-size:22px;font-weight:600;line-height:26px;color:#000}.price-ranges{display:flex;flex-direction:column;gap:8px;padding-left:8px;max-width:250px}.send-btn:hover{transform:translateY(-1px);box-shadow:0 4px 8px #8b5cf64d}.price-range-item{font-size:14px;color:#333;cursor:pointer;-webkit-user-select:none;user-select:none;display:flex;align-items:center;gap:8px}.price-range-item input[type=checkbox]{width:16px;height:16px}.categories-section{padding:.8rem 0rem;border-bottom:1px solid #D8D8D8}.categories-section:last-child{padding:.8rem 0rem;border-bottom:none}.clear{color:#e60101;font-size:14px;cursor:pointer;font-weight:600}.toggle-categories{margin-top:8px;cursor:pointer;font-weight:500;display:inline-flex;align-items:center;-webkit-user-select:none;user-select:none;width:100%}.empty-cart{display:flex;align-items:center;justify-content:center;text-align:center;height:75vh}.toggle-text .dropdown-icon{margin-left:6px;font-size:1em;margin-top:5px}.toggle-text{display:flex;align-items:center}.categories{display:flex;padding:1rem 0rem;padding-bottom:0;color:#000;font-size:18px!important;font-weight:500}.category-options{display:flex;align-items:center;cursor:pointer;padding:.75rem 0rem;gap:11px;font-weight:400!important}.category-options div{font-size:14px}.button-section{width:26%;margin:2rem 1.5rem}.button-section button{position:relative;border:none;padding:5px;width:100px!important;font-weight:600;left:-10px;border-radius:4px;white-space:nowrap;overflow:hidden}.chip{padding:5px 15px;border-radius:20px;gap:5px;width:max-content;margin:3px 0;transition:.3s opacity ease;border:1px solid}.chip:hover{opacity:.8}.price-button-section{display:flex;align-items:center;flex-direction:column-reverse}.price-range{color:#93959e;font-size:15px;white-space:nowrap}.right-side{width:80%;padding-bottom:50px;height:100vh;overflow-y:auto;flex:1 1 0;min-width:0}.bottom-filter{display:none}.onlyMobile{display:none!important}.quantity{display:flex;justify-content:space-between;align-items:center;border:1.5px solid lightgray;border-radius:3px;padding:5px;font-weight:600;width:95px}.varient-list{display:flex;gap:5px;margin-bottom:5px;width:100%;overflow-x:auto}.varient-list .varient{height:60px;width:45px;border-radius:5px;border:1px solid lightgray;cursor:pointer}.varient-list .selected-varient{border:1px solid transparent}:is() .speeddial-linear .p-speeddial-direction-up{position:relative;bottom:0%;right:0}select{width:200px;font-size:16px;padding:10px;border:1px solid lightgray;border-radius:3px;cursor:pointer}input[type=checkbox]{height:16px;width:16px}.input-group-sticky{width:100%;height:57px}.input-group{position:sticky;top:0;width:95%;z-index:100;padding:5px;outline:none;border:none;border-radius:5px;height:7vh;display:flex;align-items:center;background-color:#fff;border:1.5px solid #8080801c;box-shadow:0 0 0 1px #edececd6;margin:15px auto}.input-group .fa-search{color:gray;background-color:transparent;width:10%;display:flex;align-items:center;justify-content:center;font-size:14px;position:relative;top:1px}.input-group input{height:100%;width:80%;background-color:transparent;border:none;outline:none;font-size:16px;padding-bottom:6px;box-shadow:none}.back-to-home{background-color:#9b9a9a1c;padding:5px;border-radius:50%;display:flex;align-items:center;justify-content:center;position:fixed;right:3px;top:50%;cursor:pointer}.back-to-home .mat-icon{font-size:16px;height:16px;width:16px}.try-button-section{display:flex;justify-content:space-between;align-items:center}.try-button-section .try-at-home{width:78%}.try-button-section .try-at-home button{border:1px solid #DE57E5;border-radius:5px;font-size:14px!important;padding:5px 0!important}.try-button-section .video-call-image{width:20%;height:32px}.try-button-section .video-call-image img{width:100%;height:100%}.box-shadow{box-shadow:#0000003d 0 3px 4px;border-radius:10px!important}.discount-price{color:#d3d3d3;text-decoration:line-through;font-size:16px}.g-10{gap:10px}.mtb-5{margin-top:5px;margin-bottom:5px}.full-width-quantity{text-align:center;padding:unset;font-weight:600;height:35px}.change-quantity{width:15%;height:inherit;display:flex;align-items:center;justify-content:center;font-size:21px;font-weight:600;position:relative}.gap-15{gap:15px}.flex-wrap{flex-wrap:wrap}.carousel-buttons{display:flex;position:absolute;bottom:0;left:10px;gap:5px;transform:translateY(-50%);pointer-events:none}.carousel-buttons div{background:#fff;display:flex;align-items:center;border-radius:100%;justify-content:center;pointer-events:auto}.main-product-section{height:100vh;display:flex;position:relative}.filter-side{max-width:20%;width:100%;flex:0 0 20%}.modal-content{height:100%;border:none;border-radius:0!important}.modal-content{border-radius:18px!important}.heading-video{font-size:17px;font-weight:600}.heading-video,.schedule-header{background:#f6f3f9;border-radius:0!important}.input-field{display:flex;border-radius:12px;padding:12px;font-size:13px;background:#f6f3f9}.input-field .sub-text-call{width:20%;text-align:center;align-content:center;border-right:1px solid #bfbfbf;color:#0000008a;font-weight:700}.input-field input{width:80%;border:none;outline:none;appearance:none;margin-left:5px;background:#f6f3f9}.video-btn{border:unset;padding:8px;border-radius:12px;font-weight:600;position:absolute;bottom:20px;left:10px;width:95%!important}.video-btn:disabled{opacity:.7;cursor:not-allowed}.video-btn:disabled:hover{cursor:not-allowed}.tag-icon{position:absolute!important;top:10px;left:10px;background:#e9bb18;text-transform:uppercase;padding:5px 10px;border:none;border-radius:8px;font-size:10px;color:#000}.filter-top-section{border-right:1px solid lightgrey;width:20%;padding:1rem .5em 1rem 0rem;border-bottom:1px solid lightgrey}.product-parent{width:100%;display:flex;flex-wrap:wrap;padding:10px;z-index:1}.product-parent .product{height:auto;transform:none;z-index:1;background-color:#fff}.product-parent .product .product-card{height:100%;padding:10px;display:flex;flex-direction:column;justify-content:flex-start;transition:all .3s ease-in-out}.product-parent .product .product-name{color:#222;font-size:14px!important;line-height:26px;margin-bottom:5px;text-align:left!important;width:220px;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;transition:all .3s ease-in-out}.product-parent .product .product-img{border-radius:10px;width:100%;height:180px;z-index:1;border:.5px solid #eee}.product-parent .product .default-image img{width:100%;height:180px;border-radius:10px}.product-parent .product:hover{height:auto!important;transform:scale(1.05);border-radius:10px!important;box-shadow:0 16px 32px #b6b2b299;z-index:100!important}@media screen and (max-width: 475px){.container-fluid{padding-left:5px!important;padding-right:5px!important;padding-top:0!important}.product-name{font-size:14px}.product-parent{gap:10px}.product{padding:10px!important;margin-top:0!important;height:auto!important;transform:none!important;z-index:1!important;box-shadow:0 8px 16px #0003!important}.product .product-card{padding:0!important}.out-of-stock{font-size:12px!important}.discounted-price{font-size:14px!important}.add-to-cart-btn button{font-size:14px!important;padding:5px!important}.call-details{width:100%}.filter-text{gap:10px;font-size:16px;align-items:center;font-weight:500;cursor:pointer}.mat-slider{width:304px!important}.price-range{font-size:16px}.chip{min-width:fit-content!important}.onlyMobile{display:flex!important;row-gap:0px}.onlyMobile mat-icon{pointer-events:auto!important;z-index:1000}.category-options{padding-left:8px;padding-right:0}.categories{padding-left:0}.button-section{margin-left:15px}.button-section button{width:120px!important;padding:10px!important}.bottom-filter{position:fixed!important;display:block;z-index:100000001;width:100%;margin-left:-5px;position:absolute;bottom:-5px;display:flex;border-top:1px solid #80808045;justify-content:space-evenly;align-items:center;height:64px;background:#fff;box-shadow:#0000001a 0 4px 12px}.divider{height:60%;width:.5px;border:1px solid #d3d3d378}.onlyDesktop{display:none!important}.product-img{height:100%}.default-image img{width:100%;height:100%;box-shadow:#0000003d 0 3px 8px}.filter-side{display:none}.right-side{width:100%;margin-left:0!important;height:95%!important;padding-bottom:0!important}.main-product-section{height:auto;display:flex;position:relative;padding-bottom:7rem}}.fs-16{font-size:16px!important}.mobile-filter-chip{display:flex;align-items:center;gap:15px;border:1px solid;border-radius:30px;padding:5px 15px;height:35px}.mobile-filter-chip mat-icon{font-size:20px;display:flex;align-items:center;justify-content:center}.w-h-110{width:110px;height:110px}.w-45{width:45%}.br-8{border-radius:8px}.w-35{width:35%!important}.product-tag-badge{position:absolute;top:8px;left:8px;z-index:2;pointer-events:none}.product-tag-label{position:absolute;top:0;left:0;font-size:11px;font-weight:700;letter-spacing:.8px;text-transform:uppercase;padding:5px 10px;border-radius:4px;white-space:nowrap;opacity:0;transform:translateY(6px);transition:opacity .4s ease,transform .4s ease;pointer-events:none}.product-tag-label.tag-active{opacity:1;transform:translateY(0)}.material-info{font-size:11px;color:#888;margin-top:2px;letter-spacing:.3px}\n"] }]
1138
1139
  }], ctorParameters: () => [{ type: Object, decorators: [{
1139
1140
  type: Inject,
1140
1141
  args: [PLATFORM_ID]
1141
- }] }, { type: i1.EventsService }, { type: i2.RestService }, { type: i3.Router }, { type: i3.ActivatedRoute }, { type: i4.StorageServiceService }, { type: i5.MatBottomSheet }, { type: i6.MatDialog }, { type: i7.CartService }, { type: i8.MessageService }, { type: i0.Renderer2 }], propDecorators: { responseData: [{
1142
+ }] }, { type: i1.EventsService }, { type: i2.RestService }, { type: i3.Router }, { type: i3.ActivatedRoute }, { type: i4.StorageServiceService }, { type: i5.MatBottomSheet }, { type: i6.MatDialog }, { type: i7.CartService }, { type: i8.MessageService }, { type: i0.Renderer2 }, { type: i9.AnalyticsService }], propDecorators: { responseData: [{
1142
1143
  type: Input
1143
1144
  }], data: [{
1144
1145
  type: Input
@@ -1165,4 +1166,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
1165
1166
  type: ViewChild,
1166
1167
  args: ['filterScroll', { static: true }]
1167
1168
  }] } });
1168
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpbXBvLXVpL3NyYy9saWIvZWNvbW1lcmNlL3NlY3Rpb25zL3Byb2R1Y3QtbGlzdC9wcm9kdWN0LWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lY29tbWVyY2Uvc2VjdGlvbnMvcHJvZHVjdC1saXN0L3Byb2R1Y3QtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWEsV0FBVyxFQUFFLFNBQVMsRUFBNkIsWUFBWSxFQUEwQixNQUFNLGVBQWUsQ0FBQztBQUU3SixPQUFPLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLFdBQVcsTUFBTSwrQkFBK0IsQ0FBQztBQUt4RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUN6RixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUUzRCxPQUFP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RSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQ25FLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQ3JFLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQ3ZFLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQ3ZFLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQ3ZFLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQ3ZFLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQzFFLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQzdFLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQzdFLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQzdFLEVBQUUs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QkEvQmhDLFNBQVM7K0JBQ0Usb0JBQW9CLGNBQ2xCLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLGVBQWU7d0JBQ2YsV0FBVzt3QkFDWCxvQkFBb0I7d0JBQ3BCLGVBQWU7d0JBQ2Ysa0JBQWtCO3dCQUNsQixlQUFlO3dCQUNmLG1CQUFtQjt3QkFDbkIsbUJBQW1CO3dCQUNuQixjQUFjO3dCQUNkLHdCQUF3Qjt3QkFDeEIsT0FBTzt3QkFDUCxvQkFBb0I7d0JBQ3BCLGNBQWM7d0JBQ2QsYUFBYTt3QkFDYixXQUFXO3dCQUNYLDJCQUEyQjt3QkFDM0IsNEJBQTRCO3dCQUM1QixjQUFjO3dCQUNkLGNBQWM7d0JBQ2QscUJBQXFCO3dCQUNyQiwwQkFBMEI7cUJBQzNCLGFBQ1UsQ0FBQyxjQUFjLENBQUM7OzBCQWlGeEIsTUFBTTsyQkFBQyxXQUFXO3lUQTVFWixZQUFZO3NCQUFwQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkF5RDRCLG1CQUFtQjtzQkFBcEQsU0FBUzt1QkFBQyxxQkFBcUI7Z0JBR2hDLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxlQUFlO2dCQU03QixjQUFjO3NCQURiLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQThyQkksWUFBWTtzQkFBeEQsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIFBMQVRGT1JNX0lELCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIEFmdGVyVmlld0luaXQsIEhvc3RMaXN0ZW5lciwgVGVtcGxhdGVSZWYsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBJdGVtVmFyaWFudCwgUHJvZHVjdCB9IGZyb20gJy4uLy4uL3N0eWxlcy9wcm9kdWN0Lm1vZGFsJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBBbmltYXRpb25EaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvYW5pbWF0aW9uLWRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IEhvdmVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2hvdmVyLWVsZW1lbnQtZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgQ29udGVudEZpdERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9jb250ZW50LWZpdC1kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBTaW1wb0NvbXBvbmVudE1vZHVsZSB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvaW5kZXgnO1xyXG5pbXBvcnQgQmFzZVNlY3Rpb24gZnJvbSAnLi4vLi4vLi4vc2VjdGlvbnMvQmFzZVNlY3Rpb24nO1xyXG5pbXBvcnQgeyBQcm9kdWN0TGlzdENvbnRlbnRNb2RhbCwgUHJvZHVjdExpc3RNb2RhbCwgUHJvZHVjdExpc3RTdHlsZXNNb2RhbCB9IGZyb20gJy4vcHJvZHVjdC1saXN0Lm1vZGFsJztcclxuaW1wb3J0IHsgRXZlbnRzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2V2ZW50cy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUmVzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9yZXN0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYWNrZ3JvdW5kTW9kZWwsIEJ1dHRvbk1vZGVsLCBMYXlPdXRNb2RlbCB9IGZyb20gJy4uLy4uLy4uL3N0eWxlcy9zdHlsZS5tb2RlbCc7XHJcbmltcG9ydCB7IEJ1dHRvbkRpcmVjdGl2ZURpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9idXR0b24tZGlyZWN0aXZlLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IE1hdEljb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTWF0U2xpZGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2xpZGVyJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XHJcbmltcG9ydCB7IFBhZ25pbmF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vcGFnbmluYXRpb24vcGFnbmluYXRpb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgT3JkZXJlZEl0ZW1zIH0gZnJvbSAnLi4vLi4vc3R5bGVzL09yZGVyZWRJdGVtcy5tb2RhbCc7XHJcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3N0b3JhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hdEJvdHRvbVNoZWV0LCBNYXRCb3R0b21TaGVldE1vZHVsZSwgTWF0Qm90dG9tU2hlZXRSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9ib3R0b20tc2hlZXQnO1xyXG5pbXBvcnQgeyBNYXRSYWRpb01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3JhZGlvJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dDb25maWcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBCVVNJTkVTU19DT05TVEFOVFMgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvYnVzaW5lc3MuY29uc3RhbnQnO1xyXG5pbXBvcnQgeyBGb3JtYXRlQW1vdW50IH0gZnJvbSAnLi4vLi4vLi4vcGlwZXMvYW1vdW50LnBpcGUnO1xyXG5pbXBvcnQgeyBDYXJ0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NhcnQuc2VydmljZSc7XHJcbmltcG9ydCB7IFRvYXN0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy90b2FzdCc7XHJcbmltcG9ydCB7IE1lbnVJdGVtLCBNZXNzYWdlU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgQmFja2dyb3VuZERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9iYWNrZ3JvdW5kLWRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFNwZWVkRGlhbE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvc3BlZWRkaWFsJztcclxuaW1wb3J0IHsgU21hbGxQcm9kdWN0TGlzdGluZ0NvbXBvbmVudCB9IGZyb20gXCIuLi9zbWFsbC1wcm9kdWN0LWxpc3Rpbmcvc21hbGwtcHJvZHVjdC1saXN0aW5nLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBQcm9kdWN0Q2FyZFRoZW1lIH0gZnJvbSAnLi4vLi4vLi4vc3R5bGVzL2luZGV4JztcclxuaW1wb3J0IHsgQ2FyZFNrZWxldG9uTG9hZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vZWxlbWVudHMvY2FyZC1za2VsZXRvbi1sb2FkZXIvY2FyZC1za2VsZXRvbi1sb2FkZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ29sb3JEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvY29sb3IuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgTWF0Q2hpcHNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGlwcyc7XHJcbmltcG9ydCB7IEJ1dHRvbkVkaXRvckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9idXR0b24tZWRpdG9yLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFNwYWNpbmdIb3Jpem9udGFsRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL3NwYWNpbmctaG9yaXpvbnRhbC5kaXJlY3RpdmUnO1xyXG4vLyBpbXBvcnQgeyBBbmFseXRpY3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYW5hbHl0aWNzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBmb3JrSm9pbiwgb2YgfSBmcm9tICdyeGpzJztcclxuXHJcbmludGVyZmFjZSBCYXNlTW9kZWwge1xyXG4gIG9wdGlvbjogc3RyaW5nLFxyXG4gIGlkOiBzdHJpbmcsXHJcbiAgaW1nVXJsOiBzdHJpbmcsXHJcbiAgc3RhdHVzOiBib29sZWFuXHJcbn1cclxuXHJcbmludGVyZmFjZSBSYXRpbmdGaWx0ZXJPcHRpb24ge1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgbWluOiBudW1iZXI7XHJcbiAgbWF4OiBudW1iZXI7XHJcbiAgc2VsZWN0ZWQ6IGJvb2xlYW47XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc2ltcG8tcHJvZHVjdC1saXN0JyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIENvbW1vbk1vZHVsZSxcclxuICAgIE1hdFNlbGVjdE1vZHVsZSxcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgU2ltcG9Db21wb25lbnRNb2R1bGUsXHJcbiAgICBNYXRTbGlkZXJNb2R1bGUsXHJcbiAgICBBbmltYXRpb25EaXJlY3RpdmUsXHJcbiAgICBTcGVlZERpYWxNb2R1bGUsXHJcbiAgICBCYWNrZ3JvdW5kRGlyZWN0aXZlLFxyXG4gICAgQ29udGVudEZpdERpcmVjdGl2ZSxcclxuICAgIEhvdmVyRGlyZWN0aXZlLFxyXG4gICAgQnV0dG9uRGlyZWN0aXZlRGlyZWN0aXZlLFxyXG4gICAgTWF0SWNvbixcclxuICAgIE1hdEJvdHRvbVNoZWV0TW9kdWxlLFxyXG4gICAgTWF0UmFkaW9Nb2R1bGUsXHJcbiAgICBGb3JtYXRlQW1vdW50LFxyXG4gICAgVG9hc3RNb2R1bGUsXHJcbiAgICBDYXJkU2tlbGV0b25Mb2FkZXJDb21wb25lbnQsXHJcbiAgICBTbWFsbFByb2R1Y3RMaXN0aW5nQ29tcG9uZW50LFxyXG4gICAgQ29sb3JEaXJlY3RpdmUsXHJcbiAgICBNYXRDaGlwc01vZHVsZSxcclxuICAgIEJ1dHRvbkVkaXRvckRpcmVjdGl2ZSxcclxuICAgIFNwYWNpbmdIb3Jpem9udGFsRGlyZWN0aXZlLFxyXG4gIF0sXHJcbiAgcHJvdmlkZXJzOiBbTWVzc2FnZVNlcnZpY2VdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9kdWN0LWxpc3QuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9wcm9kdWN0LWxpc3QuY29tcG9uZW50LmNzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIFByb2R1Y3RMaXN0Q29tcG9uZW50IGV4dGVuZHMgQmFzZVNlY3Rpb24gaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpIHJlc3BvbnNlRGF0YT86IFByb2R1Y3RbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIGRhdGE/OiBQcm9kdWN0TGlzdE1vZGFsO1xyXG4gIEBJbnB1dCgpIGluZGV4PzogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIGVkaXQ/OiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGRlbGV0ZT86IGJvb2xlYW47XHJcbiAgQElucHV0KCkgY3VzdG9tQ2xhc3M/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgbmV4dENvbXBvbmVudENvbG9yPzogQmFja2dyb3VuZE1vZGVsO1xyXG5cclxuICB0YWdJbmRleE1hcDogeyBbaXRlbUlkOiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xyXG4gIHByaXZhdGUgdGFnSW50ZXJ2YWw6IGFueTtcclxuXHJcbiAgaXNMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgYXBpTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzTGlzdExvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0FsbExpc3RMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY29udGVudD86IFByb2R1Y3RMaXN0Q29udGVudE1vZGFsO1xyXG4gIGJ1dHRvbj86IEJ1dHRvbk1vZGVsO1xyXG4gIHRvdGFsUGFnZXM6IG51bWJlciA9IDA7XHJcbiAgc2Nyb2xsaW5nVmFsdWU6IG51bWJlciA9IDA7XHJcbiAgcHJpY2luZ01pbjogbnVtYmVyID0gMDtcclxuICBwcmljaW5nTWF4OiBudW1iZXIgPSAwO1xyXG4gIG1pblJhdGluZzogbnVtYmVyID0gMDtcclxuICBtYXhSYXRpbmc6IG51bWJlciA9IDA7XHJcbiAgc29ydEJ5OiBzdHJpbmcgPSAnJztcclxuICBzZWFyY2hUZXh0OiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICBwcml2YXRlIFVTRVJfQ0FSVDogT3JkZXJlZEl0ZW1zW10gPSBbXTtcclxuICBwcml2YXRlIFVTRVJfV0lTSExJU1Q6IE9yZGVyZWRJdGVtc1tdID0gW107XHJcbiAgbWluUHJvZHVjdFByaWNlOiBudW1iZXIgPSAwO1xyXG4gIG1heFByb2R1Y3RQcmljZTogbnVtYmVyID0gMDtcclxuICBmaWx0ZXJlZENoaXBzOiBhbnlbXSA9IFtdXHJcbiAgZmlsdGVyZWRQcmljZUNoaXA6IGFueVtdID0gW11cclxuICBmaWx0ZXJpbmdBcnJheSA9IFtcclxuICAgIHtcclxuICAgICAgbmFtZTogXCJMYXRlc3RcIiwgdmFsdWU6ICcnLFxyXG4gICAgfSxcclxuICAgIHsgbmFtZTogXCJQcmljZTogTG93IHRvIEhpZ2hcIiwgdmFsdWU6IFwibG93ZXN0UHJpY2VcIiB9LFxyXG4gICAgeyBuYW1lOiBcIlByaWNlOiBIaWdoIHRvIExvd1wiLCB2YWx1ZTogXCJoaWdoZXN0UHJpY2VcIiB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnQ3VzdG9tZXIgcmF0aW5nJywgdmFsdWU6ICdjdXN0b21lclJhdGluZydcclxuICAgIH1cclxuICBdO1xyXG5cclxuICBzY3JlZW5XaWR0aDogbnVtYmVyID0gMDtcclxuICBmaWx0ZXJMaXN0OiBhbnlbXSA9IFtdO1xyXG4gIHN0eWxlcz86IFByb2R1Y3RMaXN0U3R5bGVzTW9kYWw7XHJcbiAgdG90YWxDb3VudDogbnVtYmVyID0gMDtcclxuICBwYWdlTm86IG51bWJlciA9IDE7XHJcbiAgc2l6ZTogbnVtYmVyID0gMjA7XHJcbiAgc2VhcmNoVHh0OiBzdHJpbmcgPSBcIlwiO1xyXG4gIHRoZW1lID0gUHJvZHVjdENhcmRUaGVtZTtcclxuICBpdGVtczogTWVudUl0ZW1bXSB8IG51bGwgPSBudWxsO1xyXG5cclxuICBsYXRlc3RBbmFseWljc0V2ZW50OiBzdHJpbmcgPSAnUFJPRFVDVF9MSVNUX1ZJRVcnO1xyXG5cclxuICBwcml2YXRlIGZpbHRlckJvdHRvbVNoZWV0UmVmOiBNYXRCb3R0b21TaGVldFJlZjx1bmtub3duPiB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgc29ydGluZ0RpYWxvZ1JlZjogTWF0Qm90dG9tU2hlZXRSZWY8dW5rbm93bj4gfCBudWxsID0gbnVsbDtcclxuICBjYXRlZ29yaWVzOiBCYXNlTW9kZWxbXSA9IFtdO1xyXG4gIGNvbGxlY3Rpb25zOiBCYXNlTW9kZWxbXSA9IFtdO1xyXG5cclxuICBpbWFnZUluZGV4OiBudW1iZXIgPSAtMTtcclxuXHJcbiAgQFZpZXdDaGlsZCgnbGlzdFNjcm9sbENvbnRhaW5lcicpIGxpc3RTY3JvbGxDb250YWluZXIhOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcclxuXHJcbiAgQEhvc3RMaXN0ZW5lcihcIndpbmRvdzpyZXNpemVcIilcclxuICBnZXRTY3JlZW5TaXplKCkge1xyXG4gICAgdGhpcy5zY3JlZW5XaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnNjcm9sbCcsIFsnJGV2ZW50J10pXHJcbiAgb25XaW5kb3dTY3JvbGwoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLnNjcm9sbGluZ1ZhbHVlID0gd2luZG93LnBhZ2VZT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogT2JqZWN0LFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZXZlbnRTZXJ2aWNlOiBFdmVudHNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXN0U2VydmljZTogUmVzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1hdEJvdHRvbVNoZWV0OiBNYXRCb3R0b21TaGVldCxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWF0RGlhbG9nOiBNYXREaWFsb2csXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhcnRTZXJ2aWNlOiBDYXJ0U2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxyXG4gICAgLy8gcHJpdmF0ZSByZWFkb25seSBhbmFseXRpY3NTZXJ2aWNlOiBBbmFseXRpY3NTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcclxuICAgICAgdGhpcy5nZXRTY3JlZW5TaXplKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgc3R5bGVzTGF5b3V0KCkge1xyXG4gICAgcmV0dXJuIHsgLi4udGhpcy5zdHlsZXM/LmxheW91dCB9IGFzIExheU91dE1vZGVsO1xyXG4gIH1cclxuXHJcbiAgaXNPcGVuID0gZmFsc2U7XHJcblxyXG4gIHRvZ2dsZURyb3Bkb3duKCkge1xyXG4gICAgdGhpcy5pc09wZW4gPSAhdGhpcy5pc09wZW47XHJcbiAgfVxyXG5cclxuICBjbG9zZURyb3Bkb3duKCkge1xyXG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vIEFkZCB0aGVzZSBjbGFzcy1sZXZlbCBwcm9wZXJ0aWVzIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQ6XHJcbiAgcHJpY2VSYW5nZXMgPSBbXHJcbiAgICB7IGxhYmVsOiAn4oK5MSwwMDAgLSDigrk1LDAwMCcsIG1pbjogMTAwMCwgbWF4OiA1MDAwLCBzZWxlY3RlZDogZmFsc2UgfSxcclxuICAgIHsgbGFiZWw6ICfigrk1LDAwMCAtIOKCuTE1LDAwMCcsIG1pbjogNTAwMCwgbWF4OiAxNTAwMCwgc2VsZWN0ZWQ6IGZhbHNlIH0sXHJcbiAgICB7IGxhYmVsOiAn4oK5MTUsMDAwIC0g4oK5MjUsMDAwJywgbWluOiAxNTAwMCwgbWF4OiAyNTAwMCwgc2VsZWN0ZWQ6IGZhbHNlIH0sXHJcbiAgICB7IGxhYmVsOiAn4oK5MjUsMDAwIC0g4oK5MzAsMDAwJywgbWluOiAyNTAwMCwgbWF4OiAzMDAwMCwgc2VsZWN0ZWQ6IGZhbHNlIH0sXHJcbiAgICB7IGxhYmVsOiAn4oK5MzAsMDAwIC0g4oK5NTAsMDAwJywgbWluOiAzMDAwMCwgbWF4OiA1MDAwMCwgc2VsZWN0ZWQ6IGZhbHNlIH0sXHJcbiAgICB7IGxhYmVsOiAn4oK5NTAsMDAwIC0g4oK5NzUsMDAwJywgbWluOiA1MDAwMCwgbWF4OiA3NTAwMCwgc2VsZWN0ZWQ6IGZhbHNlIH0sXHJcbiAgICB7IGxhYmVsOiAn4oK5NzUsMDAwIC0g4oK5MSwwMCwwMDAnLCBtaW46IDc1MDAwLCBtYXg6IDEwMDAwMCwgc2VsZWN0ZWQ6IGZhbHNlIH0sXHJcbiAgICB7IGxhYmVsOiAn4oK5MSwwMCwwMDAgLSDigrkyLDAwLDAwMCcsIG1pbjogMTAwMDAwLCBtYXg6IDIwMDAwMCwgc2VsZWN0ZWQ6IGZhbHNlIH0sXHJcbiAgICB7IGxhYmVsOiAn4oK5MiwwMCwwMDAgLSDigrkzLDAwLDAwMCcsIG1pbjogMjAwMDAwLCBtYXg6IDMwMDAwMCwgc2VsZWN0ZWQ6IGZhbHNlIH0sXHJcbiAgICB7IGxhYmVsOiAn4oK5MywwMCwwMDAgLSDigrk0LDAwLDAwMCcsIG1pbjogMzAwMDAwLCBtYXg6IDQwMDAwMCwgc2VsZWN0ZWQ6IGZhbHNlIH0sXHJcbiAgICB7IGxhYmVsOiAn4oK5NCwwMCwwMDAgLSDigrk1LDAwLDAwMCcsIG1pbjogNDAwMDAwLCBtYXg6IDUwMDAwMCwgc2VsZWN0ZWQ6IGZhbHNlIH0sXHJcbiAgICB7IGxhYmVsOiAn4oK5NSwwMCwwMDAgLSDigrk2LDAwLDAwMCcsIG1pbjogNTAwMDAwLCBtYXg6IDYwMDAwMCwgc2VsZWN0ZWQ6IGZhbHNlIH1cclxuICBdO1xyXG5cclxuICByYXRpbmdPcHRpb25zOiBSYXRpbmdGaWx0ZXJPcHRpb25bXSA9IFtcclxuICAgIHsgbGFiZWw6ICc1IFN0YXJzJywgbWluOiA1LCBtYXg6IDUsIHNlbGVjdGVkOiBmYWxzZSB9LFxyXG4gICAgeyBsYWJlbDogJzQgU3RhcnMgYWJvdmUnLCBtaW46IDQsIG1heDogNSwgc2VsZWN0ZWQ6IGZhbHNlIH0sXHJcbiAgICB7IGxhYmVsOiAnMyBTdGFycyBhYm92ZScsIG1pbjogMywgbWF4OiA1LCBzZWxlY3RlZDogZmFsc2UgfSxcclxuICAgIHsgbGFiZWw6ICcyIFN0YXJzIGFib3ZlJywgbWluOiAyLCBtYXg6IDUsIHNlbGVjdGVkOiBmYWxzZSB9LFxyXG4gICAgeyBsYWJlbDogJzEgU3RhciBhYm92ZScsIG1pbjogMSwgbWF4OiA1LCBzZWxlY3RlZDogZmFsc2UgfVxyXG4gIF07XHJcblxyXG4gIC8vIENhbGxlZCB3aGVuIHVzZXIgY2hhbmdlcyBwcmljZSByYW5nZSBzZWxlY3Rpb25cclxuICBvblByaWNlUmFuZ2VDaGFuZ2UoaW5kZXg/OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkUmFuZ2VzID0gdGhpcy5wcmljZVJhbmdlc1xyXG4gICAgICAuZmlsdGVyKHJhbmdlID0+IHJhbmdlLnNlbGVjdGVkKVxyXG4gICAgICAubWFwKHJhbmdlID0+ICh7IG1pbjogcmFuZ2UubWluLCBtYXg6IHJhbmdlLm1heCB9KSk7XHJcblxyXG4gICAgaWYgKHNlbGVjdGVkUmFuZ2VzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAvLyBObyBwcmljZSBmaWx0ZXIgYWN0aXZlLCByZXNldCBtaW4vbWF4IHRvIHRoZSBmdWxsIHJhbmdlXHJcbiAgICAgIHRoaXMucHJpY2luZ01pbiA9IHRoaXMubWluUHJvZHVjdFByaWNlO1xyXG4gICAgICB0aGlzLnByaWNpbmdNYXggPSB0aGlzLm1heFByb2R1Y3RQcmljZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIENhbGN1bGF0ZSBjb21iaW5lZCBtaW4gYW5kIG1heCBmcm9tIHNlbGVjdGVkIHJhbmdlcyDigJRcclxuICAgICAgLy8gc2V0IHByaWNpbmdNaW4gYXMgc21hbGxlc3QgbWluIGZyb20gY2hlY2tlZCByYW5nZXMsXHJcbiAgICAgIC8vIHByaWNpbmdNYXggYXMgbGFyZ2VzdCBtYXggZnJvbSBjaGVja2VkIHJhbmdlc1xyXG4gICAgICB0aGlzLnByaWNpbmdNaW4gPSBNYXRoLm1pbiguLi5zZWxlY3RlZFJhbmdlcy5tYXAociA9PiByLm1pbikpO1xyXG4gICAgICB0aGlzLnByaWNpbmdNYXggPSBNYXRoLm1heCguLi5zZWxlY3RlZFJhbmdlcy5tYXAociA9PiByLm1heCkpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucHJpY2VSYW5nZXMubGVuZ3RoOyBpKyspIHtcclxuICAgIC8vICAgaWYgKGkgIT09IGluZGV4KSB7XHJcbiAgICAvLyAgICAgdGhpcy5wcmljZVJhbmdlc1tpXS5zZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyAgIHRoaXMucHJpY2luZ01pbiA9IE1hdGgubWluKC4uLnRoaXMucHJpY2VSYW5nZXMuZmlsdGVyKHIgPT4gci5zZWxlY3RlZCkubWFwKHIgPT4gci5taW4pKTtcclxuICAgIC8vICAgdGhpcy5wcmljaW5nTWF4ID0gTWF0aC5tYXgoLi4udGhpcy5wcmljZVJhbmdlcy5maWx0ZXIociA9PiByLnNlbGVjdGVkKS5tYXAociA9PiByLm1heCkpO1xyXG4gICAgLy8gfVxyXG5cclxuXHJcblxyXG5cclxuICAgIHRoaXMuZmlsdGVyZWRDaGlwcyA9IFtcclxuICAgICAgLi4udGhpcy5zZWxlY3RlZENhdGVnb3J5Q29sbGVjdGlvbkNoaXBzLm1hcCh4ID0+ICh7IC4uLngsIHR5cGU6ICdjYXRlZ29yeU9yQ29sbGVjdGlvbicgfSkpLFxyXG4gICAgICAuLi50aGlzLnNlbGVjdGVkUHJpY2VSYW5nZUNoaXBzLFxyXG4gICAgXTtcclxuICAgIC8vIFlvdSBjYW4gYXV0by10cmlnZ2VyIGZpbHRlciBvciBvbmx5IG9uIGJ1dHRvbiBjbGljayAoeW91ciBjaG9pY2UpXHJcbiAgICAvLyBGb3IgYXV0byBmaWx0ZXIgdW5jb21tZW50IG5leHQgbGluZTpcclxuICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcclxuXHJcbiAgICAvLyBFbHNlLCBmaWx0ZXJpbmcgaGFwcGVucyB3aGVuIHVzZXIgY2xpY2tzIFwiRmlsdGVyXCIgYnV0dG9uXHJcbiAgfVxyXG5cclxuICBvblJhdGluZ0NoYW5nZShzZWxlY3RlZFJhdGluZzogUmF0aW5nRmlsdGVyT3B0aW9uKSB7XHJcbiAgICBzZWxlY3RlZFJhdGluZy5zZWxlY3RlZCA9ICFzZWxlY3RlZFJhdGluZy5zZWxlY3RlZDtcclxuICAgIGNvbnN0IHNlbGVjdGVkUmF0aW5ncyA9IHRoaXMucmF0aW5nT3B0aW9ucy5maWx0ZXIoKHJhdGluZykgPT4gcmF0aW5nLnNlbGVjdGVkKTtcclxuXHJcbiAgICBpZiAoc2VsZWN0ZWRSYXRpbmdzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLm1pblJhdGluZyA9IDA7XHJcbiAgICAgIHRoaXMubWF4UmF0aW5nID0gMDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubWluUmF0aW5nID0gTWF0aC5taW4oLi4uc2VsZWN0ZWRSYXRpbmdzLm1hcCgocmF0aW5nKSA9PiByYXRpbmcubWluKSk7XHJcbiAgICAgIHRoaXMubWF4UmF0aW5nID0gTWF0aC5tYXgoLi4uc2VsZWN0ZWRSYXRpbmdzLm1hcCgocmF0aW5nKSA9PiByYXRpbmcubWF4KSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5maWx0ZXJlZENoaXBzID0gW1xyXG4gICAgICAuLi50aGlzLnNlbGVjdGVkQ2F0ZWdvcnlDb2xsZWN0aW9uQ2hpcHMubWFwKHggPT4gKHsgLi4ueCwgdHlwZTogJ2NhdGVnb3J5T3JDb2xsZWN0aW9uJyB9KSksXHJcbiAgICAgIC4uLnRoaXMuc2VsZWN0ZWRQcmljZVJhbmdlQ2hpcHMsXHJcbiAgICAgIC4uLnRoaXMuc2VsZWN0ZWRSYXRpbmdDaGlwcyxcclxuICAgIF07XHJcbiAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XHJcbiAgfVxyXG5cclxuICAvLyBNb2RpZnkgeW91ciBleGlzdGluZyBhcHBseUZpbHRlcigpIG1ldGhvZCwgYWRkaW5nIHByaWNlIHJhbmdlIGxvZ2ljXHJcbiAgYXBwbHlGaWx0ZXIoY2F0ZWdvcnk/OiBhbnksIHR5cGU/OiAnU09SVCcgfCAnRklMVEVSJykge1xyXG4gICAgdGhpcy5wYWdlTm8gPSAxO1xyXG5cclxuICAgIGlmICh0eXBlID09PSAnU09SVCcpIHtcclxuICAgICAgdGhpcy5sYXRlc3RBbmFseWljc0V2ZW50ID0gJ1NPUlRfQVBQTElFRCdcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubGF0ZXN0QW5hbHlpY3NFdmVudCA9ICdGSUxURVJfQVBQTElFRCdcclxuICAgIH1cclxuXHJcbiAgICAvLyBZb3VyIGV4aXN0aW5nIGNhdGVnb3J5L2ZpbHRlciB0b2dnbGluZ1xyXG4gICAgaWYgKHR5cGUgPT09IFwiRklMVEVSXCIgJiYgY2F0ZWdvcnkpIHtcclxuICAgICAgY2F0ZWdvcnkuc3RhdHVzID0gIWNhdGVnb3J5LnN0YXR1cztcclxuICAgICAgLy8gdGhpcy5maWx0ZXJlZENoaXBzLnB1c2goe25hbWU6IGNhdGVnb3J5Lm9wdGlvbiwgdHlwZTogJ2NhdGVnb3J5T3JDb2xsZWN0aW9uJywgaWQ6IGNhdGVnb3J5LmlkfSlcclxuICAgICAgdGhpcy5maWx0ZXJlZENoaXBzID0gW1xyXG4gICAgICAgIC4uLnRoaXMuc2VsZWN0ZWRDYXRlZ29yeUNvbGxlY3Rpb25DaGlwcy5tYXAoeCA9PiAoeyAuLi54LCB0eXBlOiAnY2F0ZWdvcnlPckNvbGxlY3Rpb24nIH0pKSxcclxuICAgICAgICAuLi50aGlzLnNlbGVjdGVkUHJpY2VSYW5nZUNoaXBzLFxyXG4gICAgICAgIC4uLnRoaXMuc2VsZWN0ZWRSYXRpbmdDaGlwcyxcclxuICAgICAgXTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy8gRGlzbWlzcyBib3R0b20gc2hlZXRzIGlmIG9wZW5cclxuICAgIHRoaXMuZmlsdGVyQm90dG9tU2hlZXRSZWY/LmRpc21pc3MoKTtcclxuICAgIHRoaXMuc29ydGluZ0RpYWxvZ1JlZj8uZGlzbWlzcygpO1xyXG5cclxuICAgIC8vIE5vdyB0cmlnZ2VyIGZpbHRlcmluZyB3aXRoIGN1cnJlbnQgc3RhdGUgaW5jbHVkaW5nIHByaWNlIGZpbHRlcnNcclxuICAgIHRoaXMuZmlsdGVySXRlbUxpc3QoKTtcclxuICB9XHJcblxyXG4gIC8vIE1vZGlmeSBmaWx0ZXJJdGVtTGlzdCB0byBzZW5kIHRoZSBjb3JyZWN0IHByaWNlIG1pbiBhbmQgbWF4OlxyXG4gIHJhaXNlTGVhZCgpIHtcclxuICAgIGNvbnN0IHVzZXJEZXRhaWxzID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyKCk7XHJcbiAgICBsZXQgcGF5bG9hZCA9IHtcclxuICAgICAgYnVzaW5lc3NJZDogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2J1c2luZXNzSWQnKSxcclxuICAgICAgZW1haWw6IHVzZXJEZXRhaWxzPy5jb250YWN0Py5lbWFpbCxcclxuICAgICAgbWVzc2FnZTogXCJcIixcclxuICAgICAgbW9iaWxlTm86IFwiXCIsXHJcbiAgICAgIG1vcmVJbmZvOiB7XHJcbiAgICAgICAgTmFtZTogdXNlckRldGFpbHM/LmNvbnRhY3Q/Lm5hbWUsXHJcbiAgICAgICAgXCJNb2JpbGUgTnVtYmVyXCI6IHVzZXJEZXRhaWxzPy5jb250YWN0Py5tb2JpbGUsXHJcbiAgICAgICAgRW1haWw6IHVzZXJEZXRhaWxzPy5jb250YWN0Py5lbWFpbCxcclxuICAgICAgICBcIkxlYWQgU291cmNlXCI6IFwiV2Vic2l0ZVwiLFxyXG4gICAgICAgIFwiTGVhZCBTdGF0dXNcIjogXCJORVdcIlxyXG4gICAgICB9LFxyXG4gICAgICBuYW1lOiB1c2VyRGV0YWlscz8uY29udGFjdD8ubmFtZVxyXG4gICAgfVxyXG4gICAgdGhpcy5yZXN0U2VydmljZS5jcmVhdGVMZWFkKHBheWxvYWQpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXM/LmRhdGEpIHtcclxuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdzdWNjZXNzJywgc3VtbWFyeTogJ1RoYW5rIHlvdScsIGRldGFpbDogJ091ciB0ZWFtIHdpbGwgY29udGFjdCB5b3Ugc29vbicgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ0Vycm9yJywgZGV0YWlsOiAnRXJyb3Igb2NjdXJlZCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyJyB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG4gIHByaWNlUmFuZ2VGbGFnOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZmlsdGVySXRlbUxpc3QoKSB7XHJcbiAgICB0aGlzLmFwaUxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5wYWdlTm8gPSAxO1xyXG4gICAgdGhpcy5pc0FsbExpc3RMb2FkZWQgPSBmYWxzZTtcclxuICAgIHRoaXMucmVzcG9uc2VEYXRhID0gW107XHJcblxyXG4gICAgdGhpcy5mZXRjaEFuYWx5dGljcygpO1xyXG5cclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0RmlsdGVyZWRQcm9kdWN0KFxyXG4gICAgICB0aGlzLmNvbGxlY3Rpb25zLmZpbHRlcih4ID0+IHguc3RhdHVzKS5tYXAoeCA9PiB4LmlkKSxcclxuICAgICAgdGhpcy5jYXRlZ29yaWVzLmZpbHRlcih4ID0+IHguc3RhdHVzKS5tYXAoeCA9PiB4LmlkKSxcclxuICAgICAgdGhpcy5zZWFyY2hUZXh0LFxyXG4gICAgICB0aGlzLnByaWNpbmdNaW4sXHJcbiAgICAgIHRoaXMucHJpY2luZ01heCxcclxuICAgICAgdGhpcy5taW5SYXRpbmcsXHJcbiAgICAgIHRoaXMubWF4UmF0aW5nLFxyXG4gICAgICB0aGlzLnNvcnRCeSA/PyBcIlwiLFxyXG4gICAgICB0aGlzLnBhZ2VObyAtIDEsXHJcbiAgICAgIHRoaXMuc2l6ZVxyXG4gICAgKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5yZXNwb25zZURhdGEgPSByZXNwb25zZS5kYXRhID8/IFtdO1xyXG4gICAgICB0aGlzLnRvdGFsQ291bnQgPSByZXNwb25zZS5jb3VudCA/PyAwO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLnByaWNlUmFuZ2VGbGFnKSB7XHJcbiAgICAgICAgdGhpcy5keW5hbWljUHJpY2VSYW5nZShyZXNwb25zZS5taW5QcmljZSwgcmVzcG9uc2UubWF4UHJpY2UpO1xyXG4gICAgICAgIHRoaXMucHJpY2VSYW5nZUZsYWcgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuaXNBbGxMaXN0TG9hZGVkID0gKHRoaXMucmVzcG9uc2VEYXRhPy5sZW5ndGggPz8gMCkgPj0gdGhpcy50b3RhbENvdW50O1xyXG4gICAgICB0aGlzLmFwaUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy51cGRhdGVQcm9kdWN0Q2FydFdpc2hsaXN0UHJvcGVydGllcygpO1xyXG4gICAgfSwgX2VyciA9PiB7XHJcbiAgICAgIHRoaXMuYXBpTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgZHluYW1pY1ByaWNlUmFuZ2UobWluUHJpY2U6IG51bWJlciwgbWF4UHJpY2U6IG51bWJlcikge1xyXG4gICAgdGhpcy5wcmljZVJhbmdlcyA9IFtdO1xyXG4gICAgY29uc3QgcmFuZ2UgPSBtYXhQcmljZSAtIG1pblByaWNlO1xyXG4gICAgY29uc3Qgc3RlcCA9IHJhbmdlIC8gNTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5yb3VuZCgobWluUHJpY2UgKyBpICogc3RlcCkgLyAxMDApICogMTAwO1xyXG4gICAgICBjb25zdCBlbmQgPSBpID09PSA0XHJcbiAgICAgICAgPyBNYXRoLnJvdW5kKG1heFByaWNlIC8gMTAwKSAqIDEwMFxyXG4gICAgICAgIDogTWF0aC5yb3VuZCgobWluUHJpY2UgKyAoaSArIDEpICogc3RlcCkgLyAxMDApICogMTAwO1xyXG4gICAgICB0aGlzLnByaWNlUmFuZ2VzLnB1c2goeyBsYWJlbDogYOKCuSR7c3RhcnR9IC0g4oK5JHtlbmR9YCwgbWluOiBzdGFydCwgbWF4OiBlbmQsIHNlbGVjdGVkOiBmYWxzZSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBzZWxlY3RPcHRpb24oZmlsdGVyOiBhbnksIGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgIC8vIFByZXZlbnQgY2xvc2luZyB0d2ljZVxyXG4gICAgdGhpcy5zb3J0QnkgPSBmaWx0ZXIudmFsdWU7XHJcbiAgICB0aGlzLmFwcGx5RmlsdGVyKHsgdmFsdWU6IGZpbHRlci52YWx1ZSB9LCAnU09SVCcpO1xyXG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGdldFNlbGVjdGVkTmFtZSgpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLmZpbHRlcmluZ0FycmF5LmZpbmQoZiA9PiBmLnZhbHVlID09PSB0aGlzLnNvcnRCeSk7XHJcbiAgICByZXR1cm4gc2VsZWN0ZWQgPyBzZWxlY3RlZC5uYW1lIDogJyc7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVQcm9kdWN0TGlzdFNjcm9sbCgpIHtcclxuICAgIGNvbnN0IGVsID0gdGhpcy5saXN0U2Nyb2xsQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50O1xyXG4gICAgaWYgKCFlbCB8fCB0aGlzLmlzTGlzdExvYWRpbmcgfHwgdGhpcy5pc0FsbExpc3RMb2FkZWQpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCB0aHJlc2hvbGQgPSAxNTA7IC8vIEluY3JlYXNlZCB0aHJlc2hvbGQgZm9yIHNtb290aGVyIGxvYWRpbmdcclxuICAgIGlmIChlbC5zY3JvbGxIZWlnaHQgLSBlbC5zY3JvbGxUb3AgLSBlbC5jbGllbnRIZWlnaHQgPCB0aHJlc2hvbGQpIHtcclxuICAgICAgdGhpcy5sb2FkTW9yZVByb2R1Y3RzVG9MaXN0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsb2FkTW9yZVByb2R1Y3RzVG9MaXN0KCkge1xyXG4gICAgaWYgKHRoaXMuaXNMaXN0TG9hZGluZyB8fCB0aGlzLmlzQWxsTGlzdExvYWRlZCkgcmV0dXJuO1xyXG4gICAgdGhpcy5pc0xpc3RMb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMucGFnZU5vKys7XHJcbiAgICBpZiAodGhpcy5yZXNwb25zZURhdGEgJiYgdGhpcy5yZXNwb25zZURhdGEubGVuZ3RoID49IHRoaXMudG90YWxDb3VudCkge1xyXG4gICAgICB0aGlzLmlzQWxsTGlzdExvYWRlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuaXNMaXN0TG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEZpbHRlcmVkUHJvZHVjdChcclxuICAgICAgdGhpcy5jb2xsZWN0aW9ucy5maWx0ZXIoKHgpID0+IHguc3RhdHVzKS5tYXAoKHgpID0+IHguaWQpLFxyXG4gICAgICB0aGlzLmNhdGVnb3JpZXMuZmlsdGVyKCh4KSA9PiB4LnN0YXR1cykubWFwKCh4KSA9PiB4LmlkKSxcclxuICAgICAgdGhpcy5zZWFyY2hUZXh0LFxyXG4gICAgICB0aGlzLnByaWNpbmdNaW4sXHJcbiAgICAgIHRoaXMucHJpY2luZ01heCxcclxuICAgICAgdGhpcy5taW5SYXRpbmcsXHJcbiAgICAgIHRoaXMubWF4UmF0aW5nLFxyXG4gICAgICB0aGlzLnNvcnRCeSA/PyBcIlwiLFxyXG4gICAgICB0aGlzLnBhZ2VObyAtIDEsXHJcbiAgICAgIHRoaXMuc2l6ZVxyXG4gICAgKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5yZXNwb25zZURhdGEgPSBbLi4uKHRoaXMucmVzcG9uc2VEYXRhID8/IFtdKSwgLi4uKHJlc3BvbnNlLmRhdGEgPz8gW10pXTtcclxuICAgICAgdGhpcy50b3RhbENvdW50ID0gcmVzcG9uc2UuY291bnQ7XHJcbiAgICAgIHRoaXMuaXNBbGxMaXN0TG9hZGVkID0gKHRoaXMucmVzcG9uc2VEYXRhPy5sZW5ndGggPz8gMCkgPj0gdGhpcy50b3RhbENvdW50O1xyXG4gICAgICB0aGlzLmlzTGlzdExvYWRpbmcgPSBmYWxzZTtcclxuICAgIH0sIF9lcnIgPT4ge1xyXG4gICAgICB0aGlzLmlzTGlzdExvYWRpbmcgPSBmYWxzZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIGVjb21Db25maWdzOiBhbnk7XHJcbiAgZ2V0RWNvbW1lcmNlQ29uZmlncygpIHtcclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0RWNvbW1lcmNlQ29uZmlncygpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5lY29tQ29uZmlncyA9IHJlcz8uZGF0YVxyXG4gICAgfSlcclxuICB9XHJcbiAgdG9TaG93SW5KZXdlbGxlcnk6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBJc0Vjb21tZXJjZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzTWF0ZXJpYWxCYXNlZFByaWNpbmcgOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmdldEVjb21tZXJjZUNvbmZpZ3MoKTtcclxuICAgIGlmICh3aW5kb3c/LmxvY2F0aW9uPy5vcmlnaW4/LmluY2x1ZGVzKCdjYXJhdGxhbmUnKSB8fCB3aW5kb3c/LmxvY2F0aW9uPy5vcmlnaW4/LmluY2x1ZGVzKCdvcnJhJykpIHtcclxuICAgICAgdGhpcy50b1Nob3dJbkpld2VsbGVyeSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzTWF0ZXJpYWxCYXNlZFByaWNpbmcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaXNNYXRlcmlhbEJhc2VkUHJpY2luZycpID09PSAndHJ1ZSc7XHJcblxyXG4gICAgdGhpcy5pdGVtcyA9IFtcclxuICAgICAge1xyXG4gICAgICAgIGljb246IFwicGkgcGktc2hvcHBpbmctY2FydFwiLFxyXG4gICAgICAgIGNvbW1hbmQ6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2NhcnQnXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgaWNvbjogXCJwaSBwaS1ob21lXCIsXHJcbiAgICAgICAgY29tbWFuZDogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvJ10pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgXTtcclxuICAgIHRoaXMuY29udGVudCA9IHRoaXMuZGF0YT8uY29udGVudDtcclxuICAgIHRoaXMuc3R5bGVzID0gdGhpcy5kYXRhPy5zdHlsZXM7XHJcbiAgICB0aGlzLmJ1dHRvbiA9IHRoaXMuZGF0YT8uYWN0aW9uPy5idXR0b25zPy5bMF07XHJcbiAgICB0aGlzLl9ldmVudFNlcnZpY2Uuc2hvd0xvYWRpbmdTY3JlZW4uc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IHJlc3BvbnNlO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLklzRWNvbW1lcmNlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJ3ZWJzaXRlVHlwZVwiKSAhPSAnU1RBVElDJyA/IHRydWUgOiBmYWxzZTtcclxuICAgIC8vIHRoaXMuZ2V0QWxsQ2F0ZWdvcmllcygpO1xyXG4gICAgLy8gdGhpcy5nZXRBbGxDb2xsZWN0aW9ucygpO1xyXG4gICAgdGhpcy5taW5Qcm9kdWN0UHJpY2UgPSB0aGlzLnByaWNpbmdNaW4gPSB0aGlzLmRhdGE/LnN0eWxlcy5taW5QcmljZSA/PyAwO1xyXG4gICAgdGhpcy5tYXhQcm9kdWN0UHJpY2UgPSB0aGlzLnByaWNpbmdNYXggPSB0aGlzLmRhdGE/LnN0eWxlcy5tYXhQcmljZSA/PyAzMDAwMDtcclxuICAgIHRoaXMuc2VhcmNoVGV4dCA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbXCJzZWFyY2hUeHRcIl07XHJcbiAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZSgocVBhcmFtOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gcVBhcmFtW1wic2VhcmNoVHh0XCJdO1xyXG5cclxuICAgICAgaWYgKHRoaXMuc2VhcmNoVGV4dClcclxuICAgICAgICB0aGlzLmxhdGVzdEFuYWx5aWNzRXZlbnQgPSAnU0VBUkNIJztcclxuXHJcbiAgICAgIHRoaXMucGFnZU5vID0gcVBhcmFtW1wicGFnZU5vXCJdID8gTnVtYmVyKHFQYXJhbVtcInBhZ2VOb1wiXSkgOiAxO1xyXG4gICAgICB0aGlzLnNvcnRCeSA9IHFQYXJhbVtcInNvcnRpbmdcIl0gPz8gXCJcIjtcclxuICAgICAgdGhpcy5wcmljaW5nTWluID0gaXNOYU4oTnVtYmVyKHFQYXJhbVtcIm1pblByaWNlXCJdKSkgPyAwIDogTnVtYmVyKHFQYXJhbVtcIm1pblByaWNlXCJdKTtcclxuICAgICAgdGhpcy5wcmljaW5nTWF4ID0gaXNOYU4oTnVtYmVyKHFQYXJhbVtcIm1heFByaWNlXCJdKSkgPyAwIDogTnVtYmVyKHFQYXJhbVtcIm1heFByaWNlXCJdKTtcclxuICAgICAgLy8gdGhpcy5maWx0ZXJCeUNhdGVnb3J5Q29sbGVjdGlvblBhcmFtKHFQYXJhbVtcImNhdGVnb3J5XCJdLCBxUGFyYW1bXCJjb2xsZWN0aW9uc1wiXSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuYnV0dG9uID0gdGhpcy5kYXRhPy5hY3Rpb24/LmJ1dHRvbnM/LlswXTtcclxuICAgIHRoaXMuZ2V0Q2F0ZWdvcmllc0FuZENvbGxlY3Rpb24oKTtcclxuXHJcbiAgICAvLyB0aGlzLmZpbHRlckl0ZW1MaXN0KCk7XHJcbiAgfVxyXG5cclxuICBmZXRjaEFuYWx5dGljcygpIHtcclxuICAgIGxldCBhbmFseXRpY3NFdmVudDogYW55ID0ge31cclxuICAgIGlmICh0aGlzLnNlYXJjaFRleHQpIHtcclxuICAgICAgYW5hbHl0aWNzRXZlbnRbJ1NFQVJDSCddID0gdGhpcy5zZWFyY2hUZXh0XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5wcmljaW5nTWluKSB7XHJcbiAgICAgIGFuYWx5dGljc0V2ZW50WydNSU5fUFJJQ0UnXSA9IHRoaXMucHJpY2luZ01pbjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnByaWNpbmdNYXgpIHtcclxuICAgICAgYW5hbHl0aWNzRXZlbnRbJ01BWF9QUklDRSddID0gdGhpcy5wcmljaW5nTWF4O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNvcnRCeSkge1xyXG4gICAgICBhbmFseXRpY3NFdmVudFsnU09SVF9CWSddID0gdGhpcy5zb3J0Qnk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMubWluUmF0aW5nKSB7XHJcbiAgICAgIGFuYWx5dGljc0V2ZW50WydNSU5fUkFUSU5HJ10gPSB0aGlzLm1pblJhdGluZztcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5tYXhSYXRpbmcpIHtcclxuICAgICAgYW5hbHl0aWNzRXZlbnRbJ01BWF9SQVRJTkcnXSA9IHRoaXMubWF4UmF0aW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGFuYWx5dGljc0V2ZW50WydDQVRFR09SSUVTJ10gPSB0aGlzLmNhdGVnb3JpZXMuZmlsdGVyKHggPT4geC5zdGF0dXMpLm1hcCh4ID0+IHguaWQpXHJcblxyXG4gICAgYW5hbHl0aWNzRXZlbnRbJ0NPTExFQ1RJT05TJ10gPSB0aGlzLmNvbGxlY3Rpb25zLmZpbHRlcih4ID0+IHguc3RhdHVzKS5tYXAoeCA9PiB4LmlkKTtcclxuXHJcbiAgICAvLyAgdGhpcy5hbmFseXRpY3NTZXJ2aWNlLnN0YXJ0TmV3Q29udGV4dChhbmFseXRpY3NFdmVudCwgdGhpcy5sYXRlc3RBbmFseWljc0V2ZW50KTtcclxuICB9XHJcblxyXG4gIGdldENhdGVnb3JpZXNBbmRDb2xsZWN0aW9uKCkge1xyXG4gICAgZm9ya0pvaW4oW1xyXG4gICAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEFsbENvbGxlY3Rpb25zKCkucGlwZShcclxuICAgICAgICBjYXRjaEVycm9yKGVyciA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQ29sbGVjdGlvbnMgZmFpbGVkXCIsIGVycik7XHJcbiAgICAgICAgICByZXR1cm4gb2YoW10pOyAgIC8vIGZhbGxiYWNrIGVtcHR5IGFycmF5XHJcbiAgICAgICAgfSlcclxuICAgICAgKSxcclxuICAgICAgdGhpcy5yZXN0U2VydmljZS5nZXRBbGxDYXRlZ29yaWVzKCkucGlwZShcclxuICAgICAgICBjYXRjaEVycm9yKGVyciA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQ2F0ZWdvcmllcyBmYWlsZWRcIiwgZXJyKTtcclxuICAgICAgICAgIHJldHVybiBvZihbXSk7ICAgLy8gZmFsbGJhY2sgZW1wdHkgYXJyYXlcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICBdKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmNhdGVnb3JpZXMgPSByZXNbMV0uZmlsdGVyKChjYXRlZ29yeTogYW55KSA9PiBjYXRlZ29yeS5mZWF0dXJlZENvbGxlY3Rpb24gfHwgdHJ1ZSkubWFwKChjYXRlZ29yeTogYW55KSA9PiB7IHJldHVybiB7IG9wdGlvbjogY2F0ZWdvcnkuY2F0ZWdvcnlOYW1lLCBpZDogY2F0ZWdvcnkuY2F0ZWdvcnlJZCwgaW1nVXJsOiBjYXRlZ29yeS5pbWdVcmw/LlswXSwgc3RhdHVzOiBmYWxzZSB9IH0pO1xyXG4gICAgICAgIHRoaXMuY29sbGVjdGlvbnMgPSByZXNbMF0uZmlsdGVyKChjb2xsZWN0aW9uOiBhbnkpID0+IGNvbGxlY3Rpb24uZmVhdHVyZWRDYXRlZ29yeSB8fCB0cnVlKS5tYXAoKGNvbGxlY3Rpb246IGFueSkgPT4geyByZXR1cm4geyBvcHRpb246IGNvbGxlY3Rpb24uY29sbGVjdGlvbk5hbWUsIGlkOiBjb2xsZWN0aW9uLmNvbGxlY3Rpb25JZCwgc3RhdHVzOiBmYWxzZSB9IH0pO1xyXG5cclxuICAgICAgICBjb25zdCBxUGFyYW1Db2xsZWN0aW9ucyA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbXCJjb2xsZWN0aW9uc1wiXTtcclxuICAgICAgICBjb25zdCBxUGFyYW1DYXRlZ29yeSA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbXCJjYXRlZ29yeVwiXTtcclxuICAgICAgICB0aGlzLmZpbHRlckJ5Q2F0ZWdvcnlDb2xsZWN0aW9uUGFyYW0ocVBhcmFtQ2F0ZWdvcnksIHFQYXJhbUNvbGxlY3Rpb25zKTtcclxuXHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmZpbHRlckl0ZW1MaXN0KCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNlbGVjdGVkQ2F0ZWdvcnlDb2xsZWN0aW9uQ2hpcHMoKSB7XHJcbiAgICBjb25zdCBjaGlwczogeyBpZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcgfVtdID0gW107XHJcbiAgICBpZiAodGhpcy5jYXRlZ29yaWVzKSB7XHJcbiAgICAgIGNoaXBzLnB1c2goXHJcbiAgICAgICAgLi4udGhpcy5jYXRlZ29yaWVzLmZpbHRlcih4ID0+IHguc3RhdHVzKS5tYXAoeCA9PiAoe1xyXG4gICAgICAgICAgaWQ6IHguaWQsXHJcbiAgICAgICAgICBuYW1lOiB4Lm9wdGlvblxyXG4gICAgICAgIH0pKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY29sbGVjdGlvbnMpIHtcclxuICAgICAgY2hpcHMucHVzaChcclxuICAgICAgICAuLi50aGlzLmNvbGxlY3Rpb25zLmZpbHRlcih4ID0+IHguc3RhdHVzKS5tYXAoeCA9PiAoe1xyXG4gICAgICAgICAgaWQ6IHguaWQsXHJcbiAgICAgICAgICBuYW1lOiB4Lm9wdGlvblxyXG4gICAgICAgIH0pKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNoaXBzO1xyXG4gIH1cclxuXHJcbiAgLy8gQ29tcHV0ZWQgZ2V0dGVyIGZvciBzZWxlY3RlZCBwcmljZSByYW5nZSBjaGlwc1xyXG4gIGdldCBzZWxlY3RlZFByaWNlUmFuZ2VDaGlwcygpIHtcclxuICAgIHJldHVybiB0aGlzLnByaWNlUmFuZ2VzXHJcbiAgICAgIC5maWx0ZXIocHIgPT4gcHIuc2VsZWN0ZWQpXHJcbiAgICAgIC5tYXAocHIgPT4gKHtcclxuICAgICAgICBpZDogJ3ByaWNlLScgKyBwci5taW4gKyAnLScgKyBwci5tYXgsXHJcbiAgICAgICAgbmFtZTogcHIubGFiZWwsXHJcbiAgICAgICAgdHlwZTogJ3ByaWNlJ1xyXG4gICAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBnZXQgc2VsZWN0ZWRSYXRpbmdDaGlwcygpIHtcclxuICAgIHJldHVybiB0aGlzLnJhdGluZ09wdGlvbnNcclxuICAgICAgLmZpbHRlcihyYXRpbmcgPT4gcmF0aW5nLnNlbGVjdGVkKVxyXG4gICAgICAubWFwKHJhdGluZyA9PiAoe1xyXG4gICAgICAgIGlkOiAncmF0aW5nLScgKyByYXRpbmcubWluICsgJy0nICsgcmF0aW5nLm1heCxcclxuICAgICAgICBuYW1lOiByYXRpbmcubGFiZWwsXHJcbiAgICAgICAgdHlwZTogJ3JhdGluZydcclxuICAgICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGFsbEFjdGl2ZUNoaXBzKCkge1xyXG4gICAgbGV0IGRhdGEgPSBbXHJcbiAgICAgIC4uLnRoaXMuc2VsZWN0ZWRDYXRlZ29yeUNvbGxlY3Rpb25DaGlwcy5tYXAoeCA9PiAoeyAuLi54LCB0eXBlOiAnY2F0ZWdvcnlPckNvbGxlY3Rpb24nIH0pKSxcclxuICAgICAgLi4udGhpcy5zZWxlY3RlZFByaWNlUmFuZ2VDaGlwcyxcclxuICAgICAgLi4udGhpcy5zZWxlY3RlZFJhdGluZ0NoaXBzLFxyXG4gICAgXTtcclxuICAgIHJldHVybiBkYXRhXHJcbiAgfVxyXG5cclxuICBnZXRBbGxDYXRlZ29yaWVzKCkge1xyXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRBbGxDYXRlZ29yaWVzKCkuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICB0aGlzLmNhdGVnb3JpZXMgPSByZXNwb25zZS5maWx0ZXIoKGNhdGVnb3J5OiBhbnkpID0+IGNhdGVnb3J5LmZlYXR1cmVkQ29sbGVjdGlvbiB8fCB0cnVlKS5tYXAoKGNhdGVnb3J5OiBhbnkpID0+IHsgcmV0dXJuIHsgb3B0aW9uOiBjYXRlZ29yeS5jYXRlZ29yeU5hbWUsIGlkOiBjYXRlZ29yeS5jYXRlZ29yeUlkLCBpbWdVcmw6IGNhdGVnb3J5LmltZ1VybD8uWzBdLCBzdGF0dXM6IGZhbHNlIH0gfSk7XHJcbiAgICAgIGNvbnN0IHFQYXJhbUNvbGxlY3Rpb25zID0gdGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1tcImNvbGxlY3Rpb25zXCJdO1xyXG4gICAgICBjb25zdCBxUGFyYW1DYXRlZ29yeSA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbXCJjYXRlZ29yeVwiXTtcclxuICAgICAgdGhpcy5maWx0ZXJCeUNhdGVnb3J5Q29sbGVjdGlvblBhcmFtKHFQYXJhbUNhdGVnb3J5LCBxUGFyYW1Db2xsZWN0aW9ucyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldEFsbENvbGxlY3Rpb25zKCkge1xyXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRBbGxDb2xsZWN0aW9ucygpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcclxuICAgICAgdGhpcy5jb2xsZWN0aW9ucyA9IHJlc3BvbnNlLmZpbHRlcigoY29sbGVjdGlvbjogYW55KSA9PiBjb2xsZWN0aW9uLmZlYXR1cmVkQ2F0ZWdvcnkgfHwgdHJ1ZSkubWFwKChjb2xsZWN0aW9uOiBhbnkpID0+IHsgcmV0dXJuIHsgb3B0aW9uOiBjb2xsZWN0aW9uLmNvbGxlY3Rpb25OYW1lLCBpZDogY29sbGVjdGlvbi5jb2xsZWN0aW9uSWQsIHN0YXR1czogZmFsc2UgfSB9KTtcclxuICAgICAgY29uc3QgcVBhcmFtQ29sbGVjdGlvbnMgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zW1wiY29sbGVjdGlvbnNcIl07XHJcbiAgICAgIGNvbnN0IHFQYXJhbUNhdGVnb3J5ID0gdGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1tcImNhdGVnb3J5XCJdO1xyXG4gICAgICB0aGlzLmZpbHRlckJ5Q2F0ZWdvcnlDb2xsZWN0aW9uUGFyYW0ocVBhcmFtQ2F0ZWdvcnksIHFQYXJhbUNvbGxlY3Rpb25zKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlUHJvZHVjdENhcnRXaXNobGlzdFByb3BlcnRpZXMoKSB7XHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXJDYXJ0KCkudGhlbigoY2FydFJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIGNhcnRSZXNwb25zZS5vbnN1Y2Nlc3MgPSAoY2FydERhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuVVNFUl9DQVJUID0gY2FydERhdGEudGFyZ2V0LnJlc3VsdCBhcyB1bmtub3duIGFzIE9yZGVyZWRJdGVtc1tdIHx8IFtdO1xyXG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhPy5mb3JFYWNoKChwcm9kdWN0OiBQcm9kdWN0KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLlVTRVJfQ0FSVD8uZm9yRWFjaCgoaXRlbTogT3JkZXJlZEl0ZW1zKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLml0ZW1JZCA9PSBwcm9kdWN0Lml0ZW1JZCkge1xyXG4gICAgICAgICAgICAgIGlmIChwcm9kdWN0Py5pdGVtVmFyaWFudD8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbVZhcmllbnQ6IEl0ZW1WYXJpYW50ID0gcHJvZHVjdD8uaXRlbVZhcmlhbnQ/LlswXTtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtVmFyaWVudC52YXJpYW50SWQgPT0gaXRlbS52YXJpZW50SWQpIHtcclxuICAgICAgICAgICAgICAgICAgcHJvZHVjdC5pdGVtSW1hZ2VzID0gaXRlbVZhcmllbnQudmFyaWFudEltYWdlcyA/PyBbXTtcclxuICAgICAgICAgICAgICAgICAgcHJvZHVjdC5wcmljZSA9IGl0ZW1WYXJpZW50Lml0ZW1WYXJpYW50UHJpY2U7XHJcbiAgICAgICAgICAgICAgICAgIHByb2R1Y3QucXVhbnRpdHkgPSBpdGVtLnF1YW50aXR5O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0LnF1YW50aXR5ID0gaXRlbS5xdWFudGl0eTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXJXaGlzaGxpc3QoKS50aGVuKCh3aXNobGlzdFJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIHdpc2hsaXN0UmVzcG9uc2Uub25zdWNjZXNzID0gKHdoaXNsaXN0RGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5VU0VSX1dJU0hMSVNUID0gd2hpc2xpc3REYXRhLnRhcmdldC5yZXN1bHQgYXMgdW5rbm93biBhcyBPcmRlcmVkSXRlbXNbXSB8fCBbXTtcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YT8uZm9yRWFjaCgocHJvZHVjdDogUHJvZHVjdCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5VU0VSX1dJU0hMSVNUPy5mb3JFYWNoKChpdGVtOiBPcmRlcmVkSXRlbXMpID0+IHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0uaXRlbUlkID09IHByb2R1Y3QuaXRlbUlkKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHByb2R1Y3Q/Lml0ZW1WYXJpYW50Py5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtVmFyaWVudDogSXRlbVZhcmlhbnQgPSBwcm9kdWN0Py5pdGVtVmFyaWFudD8uWzBdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1WYXJpZW50LnZhcmlhbnRJZCA9PSBpdGVtLnZhcmllbnRJZCkge1xyXG4gICAgICAgICAgICAgICAgICBwcm9kdWN0Lml0ZW1JbWFnZXMgPSBpdGVtVmFyaWVudD8udmFyaWFudEltYWdlcyA/PyBbXTtcclxuICAgICAgICAgICAgICAgICAgcHJvZHVjdC5wcmljZSA9IGl0ZW1WYXJpZW50Lml0ZW1WYXJpYW50UHJpY2U7XHJcbiAgICAgICAgICAgICAgICAgIHByb2R1Y3Qud2hpc2xpc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0LndoaXNsaXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJCeUNhdGVnb3J5Q29sbGVjdGlvblBhcmFtKHFDYXRlZ29yaWVzOiBhbnksIHFDb2xsZWN0aW9uczogYW55KSB7XHJcbiAgICBjb25zdCBjYXRlZ29yaWVzID0gcUNhdGVnb3JpZXM/LnNwbGl0KFwiK1wiKT8ubWFwKChjYXRlZ29yeTogc3RyaW5nKSA9PiBjYXRlZ29yeS5yZXBsYWNlQWxsKFwiX1wiLCBcIiBcIikudG9Mb3dlckNhc2UoKSkuZmlsdGVyKChjYXRlZ29yeTogc3RyaW5nKSA9PiBjYXRlZ29yeS5sZW5ndGggPiAwKTtcclxuICAgIGNvbnN0IGNvbGxlY3Rpb25zID0gcUNvbGxlY3Rpb25zPy5zcGxpdChcIitcIik/Lm1hcCgoY29sbGVjdGlvbjogc3RyaW5nKSA9PiBjb2xsZWN0aW9uLnJlcGxhY2VBbGwoXCJfXCIsIFwiIFwiKS50b0xvd2VyQ2FzZSgpKS5maWx0ZXIoKGNvbGxlY3Rpb246IHN0cmluZykgPT4gY29sbGVjdGlvbi5sZW5ndGggPiAwKTtcclxuXHJcbiAgICBpZiAoKGNhdGVnb3JpZXM/Lmxlbmd0aCA/PyAwKSA+IDAgfHwgKGNvbGxlY3Rpb25zPy5sZW5ndGggPz8gMCkgPiAwKVxyXG4gICAgICB0aGlzLmxhdGVzdEFuYWx5aWNzRXZlbnQgPSAnRklMVEVSX0FQUExJRUQnO1xyXG5cclxuICAgIHRoaXMuY2F0ZWdvcmllcz8uZm9yRWFjaCgoY2F0ZWdvcnkpID0+IHtcclxuICAgICAgY2F0ZWdvcnkuc3RhdHVzID0gY2F0ZWdvcmllcz8uaW5jbHVkZXMoY2F0ZWdvcnk/Lm9wdGlvbj8udG9Mb3dlckNhc2UoKSkgPz8gZmFsc2U7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuY29sbGVjdGlvbnM/LmZvckVhY2goKGNvbGxlY3Rpb24pID0+IHtcclxuICAgICAgY29sbGVjdGlvbi5zdGF0dXMgPSBjb2xsZWN0aW9ucz8uaW5jbHVkZXMoY29sbGVjdGlvbj8ub3B0aW9uPy50b0xvd2VyQ2FzZSgpKSA/PyBmYWxzZTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5maWx0ZXJlZENoaXBzID0gW1xyXG4gICAgICAuLi50aGlzLnNlbGVjdGVkQ2F0ZWdvcnlDb2xsZWN0aW9uQ2hpcHMubWFwKHggPT4gKHsgLi4ueCwgdHlwZTogJ2NhdGVnb3J5T3JDb2xsZWN0aW9uJyB9KSksXHJcbiAgICAgIC4uLnRoaXMuc2VsZWN0ZWRQcmljZVJhbmdlQ2hpcHMsXHJcbiAgICAgIC4uLnRoaXMuc2VsZWN0ZWRSYXRpbmdDaGlwcyxcclxuICAgIF07XHJcbiAgICAvLyBETyBOT1QgcmVidWlsZCBmaWx0ZXJMaXN0IGhlcmUhIChDaGlwcyB3aWxsIGF1dG8tdXBkYXRlIGZyb20gc3RhdHVzIGFycmF5cyB2aWEgdGhlIGdldHRlci4pXHJcbiAgICB0aGlzLmZpbHRlckl0ZW1MaXN0KCk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVGaWx0ZXIoZmlsdGVyOiBhbnkpIHtcclxuICAgIGlmIChmaWx0ZXIudHlwZSA9PT0gJ3ByaWNlJykge1xyXG4gICAgICAvLyBEZXNlbGVjdCB0aGlzIHByaWNlIHJhbmdlIGFuZCB0cmlnZ2VyIGZpbHRlclxyXG4gICAgICBjb25zdCBpZHggPSB0aGlzLnByaWNlUmFuZ2VzLmZpbmRJbmRleChcclxuICAgICAgICBwciA9PiBmaWx0ZXIuaWQgPT09ICdwcmljZS0nICsgcHIubWluICsgJy0nICsgcHIubWF4XHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChpZHggPiAtMSkge1xyXG4gICAgICAgIHRoaXMucHJpY2VSYW5nZXNbaWR4XS5zZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMub25QcmljZVJhbmdlQ2hhbmdlKCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmaWx0ZXIudHlwZSA9PT0gJ3JhdGluZycpIHtcclxuICAgICAgY29uc3QgcmF0aW5nID0gdGhpcy5yYXRpbmdPcHRpb25zLmZpbmQociA9PiBmaWx0ZXIuaWQgPT09ICdyYXRpbmctJyArIHIubWluICsgJy0nICsgci5tYXgpO1xyXG4gICAgICBpZiAocmF0aW5nKSB7XHJcbiAgICAgICAgcmF0aW5nLnNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkUmF0aW5ncyA9IHRoaXMucmF0aW5nT3B0aW9ucy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uc2VsZWN0ZWQpO1xyXG4gICAgICB0aGlzLm1pblJhdGluZyA9IHNlbGVjdGVkUmF0aW5ncy5sZW5ndGggPyBNYXRoLm1pbiguLi5zZWxlY3RlZFJhdGluZ3MubWFwKChpdGVtKSA9PiBpdGVtLm1pbikpIDogMDtcclxuICAgICAgdGhpcy5tYXhSYXRpbmcgPSBzZWxlY3RlZFJhdGluZ3MubGVuZ3RoID8gTWF0aC5tYXgoLi4uc2VsZWN0ZWRSYXRpbmdzLm1hcCgoaXRlbSkgPT4gaXRlbS5tYXgpKSA6IDA7XHJcblxyXG4gICAgICB0aGlzLmZpbHRlcmVkQ2hpcHMgPSBbXHJcbiAgICAgICAgLi4udGhpcy5zZWxlY3RlZENhdGVnb3J5Q29sbGVjdGlvbkNoaXBzLm1hcCh4ID0+ICh7IC4uLngsIHR5cGU6ICdjYXRlZ29yeU9yQ29sbGVjdGlvbicgfSkpLFxyXG4gICAgICAgIC4uLnRoaXMuc2VsZWN0ZWRQcmljZVJhbmdlQ2hpcHMsXHJcbiAgICAgICAgLi4udGhpcy5zZWxlY3RlZFJhdGluZ0NoaXBzLFxyXG4gICAgICBdO1xyXG4gICAgICB0aGlzLnBhZ2VObyA9IDE7XHJcbiAgICAgIHRoaXMubmF2aWdhdGVGaWx0ZXIodGhpcy5zb3J0QnkgPz8gXCJcIik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBc3N1bWUgcmVtYWluaW5nIGNoaXBzIGFyZSBjYXRlZ29yaWVzIG9yIGNvbGxlY3Rpb25zXHJcbiAgICAvLyBSZW1vdmUgc2VsZWN0aW9uIGJ5IGlkXHJcbiAgICBpZiAodGhpcy5jYXRlZ29yaWVzKSB7XHJcbiAgICAgIGNvbnN0IGNhdCA9IHRoaXMuY2F0ZWdvcmllcy5maW5kKGNhdCA9PiBjYXQuaWQgPT09IGZpbHRlci5pZCk7XHJcbiAgICAgIGlmIChjYXQpIGNhdC5zdGF0dXMgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNvbGxlY3Rpb25zKSB7XHJcbiAgICAgIGNvbnN0IGNvbGwgPSB0aGlzLmNvbGxlY3Rpb25zLmZpbmQoY29sbCA9PiBjb2xsLmlkID09PSBmaWx0ZXIuaWQpO1xyXG4gICAgICBpZiAoY29sbCkgY29sbC5zdGF0dXMgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMuZmlsdGVyZWRDaGlwcyA9IFtcclxuICAgICAgLi4udGhpcy5zZWxlY3RlZENhdGVnb3J5Q29sbGVjdGlvbkNoaXBzLm1hcCh4ID0+ICh7IC4uLngsIHR5cGU6ICdjYXRlZ29yeU9yQ29sbGVjdGlvbicgfSkpLFxyXG4gICAgICAuLi50aGlzLnNlbGVjdGVkUHJpY2VSYW5nZUNoaXBzLFxyXG4gICAgICAuLi50aGlzLnNlbGVjdGVkUmF0aW5nQ2hpcHMsXHJcbiAgICBdO1xyXG4gICAgdGhpcy5wYWdlTm8gPSAxO1xyXG4gICAgdGhpcy5uYXZpZ2F0ZUZpbHRlcih0aGlzLnNvcnRCeSA/PyBcIlwiKTtcclxuICB9XHJcblxyXG4gIGFwcGx5UHJvZHVjdFdpZHRoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc3R5bGVzPy50aGVtZSA9PT0gdGhpcy50aGVtZS5UaGVtZTEgfHxcclxuICAgICAgKHRoaXMuc2NyZWVuV2lkdGggPCA0NzUgJiYgdGhpcy5zdHlsZXM/LnRoZW1lID09IHRoaXMudGhlbWUuVGhlbWUyKVxyXG4gIH1cclxuXHJcbiAgZ2V0UHJvZHVjdFdpZHRoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2NyZWVuV2lkdGggPiA0NzUgPyAodGhpcy5zY3JlZW5XaWR0aCA8IDEwMjUgPyAnMjUlJyA6ICdjYWxjKCcgKyAoKDEwMCAvICh0aGlzLnN0eWxlcz8uZWxlbWVudEluUm93IHx8IDQpKSkgKyAnJSknKSA6ICh0aGlzLnN0eWxlcz8ubW9iaWxlQ29sdW1uID09PSAxID8gJzk4JScgOiAnNDglJylcclxuICB9XHJcblxyXG4gIHByb2NlZWRUb1Byb2R1Y3REZXNjKHByb2R1Y3Q6IFByb2R1Y3QpIHtcclxuICAgIGNvbnN0IHNsdWcgPSBwcm9kdWN0LnNsdWdpZmllZE5hbWUgfHwgdGhpcy50b1NsdWcocHJvZHVjdC5uYW1lKTtcclxuICAgIGlmICghc2x1ZylcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnZGV0YWlscycsIHNsdWddKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdG9TbHVnKGlucHV0OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBpZiAoIWlucHV0KVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBjb25zdCBub1doaXRlc3BhY2UgPSBpbnB1dC5yZXBsYWNlKC9cXHMrL2csICctJyk7XHJcbiAgICBjb25zdCBub3JtYWxpemVkID0gbm9XaGl0ZXNwYWNlLm5vcm1hbGl6ZSgnTkZEJyk7XHJcbiAgICBjb25zdCBzbHVnID0gbm9ybWFsaXplZC5yZXBsYWNlKC9bXlxcdy1dL2csICcnKTtcclxuXHJcbiAgICByZXR1cm4gc2x1Z1xyXG4gICAgICAudG9Mb3dlckNhc2UoKVxyXG4gICAgICAucmVwbGFjZSgvLSsvZywgJy0nKVxyXG4gICAgICAucmVwbGFjZSgvXi18LSQvZywgJycpO1xyXG4gIH1cclxuXHJcbiAgcmluZ1NpemVzID0gW1xyXG4gICAgeyBzaXplOiAnQmFuZHMnLCBzdGF0dXM6IGZhbHNlIH0sXHJcbiAgICB7IHNpemU6ICdDb2NrdGFpbCcsIHN0YXR1czogZmFsc2UgfSxcclxuICAgIHsgc2l6ZTogJ0Nhc3VhbCBSaW5ncycsIHN0YXR1czogZmFsc2UgfSxcclxuICAgIHsgc2l6ZTogJ0hhbG8nLCBzdGF0dXM6IGZhbHNlIH1cclxuICBdO1xyXG5cclxuICBwcm9kdWN0VHlwZXNEYXRhID0gW1xyXG4gICAgeyBzaXplOiAnRWFycmluZ3MnLCBzdGF0dXM6IGZhbHNlIH0sXHJcbiAgICB7IHNpemU6ICdQZW5kYW50cycsIHN0YXR1czogZmFsc2UgfSxcclxuICAgIHsgc2l6ZTogJ1JpbmdzJywgc3RhdHVzOiBmYWxzZSB9LFxyXG4gICAgeyBzaXplOiAnTmVja2xhY2VzJywgc3RhdHVzOiBmYWxzZSB9XHJcbiAgXVxyXG5cclxuICBzaG9wRm9yRGF0YSA9IFtcclxuICAgIHsgc2l6ZTogJ1dvbWVuJywgc3RhdHVzOiBmYWxzZSB9LFxyXG4gICAgeyBzaXplOiAnTWVuJywgc3RhdHVzOiBmYWxzZSB9LFxyXG4gICAgeyBzaXplOiAnQmFieScsIHN0YXR1czogZmFsc2UgfSxcclxuICAgIHsgc2l6ZTogJ0tpZHMnLCBzdGF0dXM6IGZhbHNlIH1cclxuICBdXHJcblxyXG4gIG1hdGVyaWFsU2l6ZURhdGEgPSBbXHJcbiAgICB7IHNpemU6ICdQbGF0aW51bScsIHN0YXR1czogZmFsc2UgfSxcclxuICAgIHsgc2l6ZTogJ0dvbGQnLCBzdGF0dXM6IGZhbHNlIH0sXHJcbiAgICB7IHNpemU6ICdEaWFtb25kJywgc3RhdHVzOiBmYWxzZSB9LFxyXG4gICAgeyBzaXplOiAnR2Vtc3RvbmUnLCBzdGF0dXM6IGZhbHNlIH1cclxuICBdXHJcblxyXG4gIG1ldGFsU2l6ZURhdGEgPSBbXHJcbiAgICB7IHNpemU6ICcyMiBLVCBZZWxsb3cnLCBzdGF0dXM6IGZhbHNlIH0sXHJcbiAgICB7IHNpemU6ICcxOCBLVCBZZWxsb3cnLCBzdGF0dXM6IGZhbHNlIH0sXHJcbiAgICB7IHNpemU6ICc5IEtUIFllbGxvdycsIHN0YXR1czogZmFsc2UgfSxcclxuICAgIHsgc2l6ZTogJzE4IEtUIFdoaXRlJywgc3RhdHVzOiBmYWxzZSB9XHJcbiAgXVxyXG5cclxuICB0b2dnbGVNZXRhbFNpemUoc2l6ZTogYW55KSB7XHJcbiAgICBzaXplLnN0YXR1cyA9ICFzaXplLnN0YXR1cztcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNob3BTaXplKHNpemU6IGFueSkge1xyXG4gICAgc2l6ZS5zdGF0dXMgPSAhc2l6ZS5zdGF0dXM7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVTaXplKHNpemU6IGFueSkge1xyXG4gICAgc2l6ZS5zdGF0dXMgPSAhc2l6ZS5zdGF0dXM7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVQcm9kdWN0U2l6ZShzaXplOiBhbnkpIHtcclxuICAgIHNpemUuc3RhdHVzID0gIXNpemUuc3RhdHVzO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlTWF0ZXJpYWxTaXplKHNpemU6IGFueSkge1xyXG4gICAgc2l6ZS5zdGF0dXMgPSAhc2l6ZS5zdGF0dXM7XHJcbiAgfVxyXG5cclxuICBjbGVhckZpbHRlcigpIHtcclxuICAgIHRoaXMuY2F0ZWdvcmllcy5mb3JFYWNoKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkuc3RhdHVzID0gZmFsc2UpO1xyXG4gICAgdGhpcy5jb2xsZWN0aW9ucy5mb3JFYWNoKChjb2xsZWN0aW9uKSA9PiBjb2xsZWN0aW9uLnN0YXR1cyA9IGZhbHNlKTtcclxuICAgIHRoaXMucHJpY2VSYW5nZXMuZm9yRWFjaChwciA9PiBwci5zZWxlY3RlZCA9IGZhbHNlKTtcclxuICAgIHRoaXMucHJpY2luZ01pbiA9IHRoaXMubWluUHJvZHVjdFByaWNlO1xyXG4gICAgdGhpcy5wcmljaW5nTWF4ID0gdGhpcy5tYXhQcm9kdWN0UHJpY2U7XHJcbiAgICB0aGlzLnJhdGluZ09wdGlvbnMuZm9yRWFjaCgocmF0aW5nKSA9PiByYXRpbmcuc2VsZWN0ZWQgPSBmYWxzZSk7XHJcbiAgICB0aGlzLm1pblJhdGluZyA9IDA7XHJcbiAgICB0aGlzLm1heFJhdGluZyA9IDA7XHJcbiAgICB0aGlzLnJpbmdTaXplcy5mb3JFYWNoKChzaXplKSA9PiBzaXplLnN0YXR1cyA9IGZhbHNlKTtcclxuICAgIHRoaXMucHJvZHVjdFR5cGVzRGF0YS5mb3JFYWNoKChzaXplKSA9PiBzaXplLnN0YXR1cyA9IGZhbHNlKTtcclxuICAgIHRoaXMuc2hvcEZvckRhdGEuZm9yRWFjaCgoc2l6ZSkgPT4gc2l6ZS5zdGF0dXMgPSBmYWxzZSk7XHJcbiAgICB0aGlzLm1hdGVyaWFsU2l6ZURhdGEuZm9yRWFjaCgoc2l6ZSkgPT4gc2l6ZS5zdGF0dXMgPSBmYWxzZSk7XHJcbiAgICB0aGlzLm1ldGFsU2l6ZURhdGEuZm9yRWFjaCgoc2l6ZSkgPT4gc2l6ZS5zdGF0dXMgPSBmYWxzZSk7XHJcbiAgICB0aGlzLmZpbHRlcmVkQ2hpcHMgPSBbXTtcclxuICAgIC8vIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnbGlzdCddKTtcclxuICAgIHRoaXMubmF2aWdhdGVGaWx0ZXIodGhpcy5zb3J0QnkpXHJcbiAgfVxyXG5cclxuICBAVmlld0NoaWxkKCdmaWx0ZXJTY3JvbGwnLCB7IHN0YXRpYzogdHJ1ZSB9KSBmaWx0ZXJTY3JvbGwhOiBFbGVtZW50UmVmO1xyXG5cclxuICBpc1N5bmNpbmcgPSBmYWxzZTtcclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5maWx0ZXJTY3JvbGw/Lm5hdGl2ZUVsZW1lbnQ/LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsICgpID0+IHRoaXMuaGFuZGxlU3luY1Njcm9sbCgpKTtcclxuICAgIHRoaXMuc3RhcnRUYWdDeWNsZSgpO1xyXG4gIH1cclxuXHJcbiAgc3RhcnRUYWdDeWNsZSgpOiB2b2lkIHtcclxuICAgIHRoaXMudGFnSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICh0aGlzLnJlc3BvbnNlRGF0YSB8fCBbXSkuZm9yRWFjaChwID0+IHtcclxuICAgICAgICBpZiAoKHA/LnRhZ3M/Lmxlbmd0aCA/PyAwKSA+IDEpIHtcclxuICAgICAgICAgIGNvbnN0IGN1ciA9IHRoaXMudGFnSW5kZXhNYXBbcC5pdGVtSWRdID8/IDA7XHJcbiAgICAgICAgICB0aGlzLnRhZ0luZGV4TWFwW3AuaXRlbUlkXSA9IChjdXIgKyAxKSAlIHAudGFncy5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0sIDMwMDApO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBjbGVhckludGVydmFsKHRoaXMudGFnSW50ZXJ2YWwpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlU3luY1Njcm9sbCgpIHtcclxuICAgIC8vIERvbid0IHJlY3Vyc2l2ZWx5IHRyaWdnZXIgc2Nyb2xsc1xyXG4gICAgaWYgKHRoaXMuaXNTeW5jaW5nKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgZmlsdGVyRWwgPSB0aGlzLmZpbHRlclNjcm9sbC5uYXRpdmVFbGVtZW50O1xyXG4gICAgY29uc3QgbGlzdEVsID0gdGhpcy5saXN0U2Nyb2xsQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50O1xyXG4gICAgaWYgKCFsaXN0RWwpIHJldHVybjtcclxuXHJcbiAgICAvLyBDYWxjdWxhdGUgd2hlbiBmaWx0ZXIgaGFzIFwic2Nyb2xsZWQgcGFzdFwiIHRoZSBoZWlnaHQgb2YgdGhlIHJpZ2h0IHNpZGVcclxuICAgIGNvbnN0IGZpbHRlclNjcm9sbGFibGVFeGNlc3MgPSBmaWx0ZXJFbC5zY3JvbGxIZWlnaHQgLSBmaWx0ZXJFbC5jbGllbnRIZWlnaHQ7XHJcbiAgICBjb25zdCBsaXN0U2Nyb2xsYWJsZSA9IGxpc3RFbC5zY3JvbGxIZWlnaHQgLSBsaXN0RWwuY2xpZW50SGVpZ2h0O1xyXG5cclxuICAgIGlmIChmaWx0ZXJFbC5zY3JvbGxUb3AgPiBsaXN0U2Nyb2xsYWJsZSkge1xyXG4gICAgICB0aGlzLmlzU3luY2luZyA9IHRydWU7XHJcbiAgICAgIC8vIFNjcm9sbCByaWdodCBzaWRlIGluIHN5bmMgYXMgd2VsbFxyXG4gICAgICBsaXN0RWwuc2Nyb2xsVG9wID0gZmlsdGVyRWwuc2Nyb2xsVG9wIC0gKGZpbHRlclNjcm9sbGFibGVFeGNlc3MgLSBsaXN0U2Nyb2xsYWJsZSk7XHJcbiAgICAgIHRoaXMuaXNTeW5jaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgdG9nZ2xlSXRlbVRvRmF2KGV2ZW50OiBQb2ludGVyRXZlbnQgfCBNb3VzZUV2ZW50LCBwcm9kdWN0OiBQcm9kdWN0LCB0eXBlOiAnQUREJyB8ICdSRU1PVkUnKSB7XHJcbiAgICBpZiAodHlwZSA9PSAnQUREJykge1xyXG4gICAgICBwcm9kdWN0LndoaXNsaXN0ID0gdHJ1ZTtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnV2lzaGxpc3QnLCBkZXRhaWw6ICdJdGVtIGFkZGVkIHRvIHlvdXIgd2lzaGxpc3QnIH0pO1xyXG4gICAgICBpZiAocHJvZHVjdD8uaXRlbVZhcmlhbnQ/Lmxlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1WYXJpZW50OiBJdGVtVmFyaWFudCB8IG51bGwgPSB0aGlzLmdldEl0ZW1WYXJpZW50KHByb2R1Y3QsIHByb2R1Y3QudmFyaWVudElkKTtcclxuICAgICAgICBpZiAoaXRlbVZhcmllbnQpIHtcclxuICAgICAgICAgIGl0ZW1WYXJpZW50Lndpc2hsaXN0ID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkSXRlbVRvRmF2b3VyaXRlKHByb2R1Y3QgYXMgUHJvZHVjdCwgaXRlbVZhcmllbnQudmFyaWFudElkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRJdGVtVG9GYXZvdXJpdGUocHJvZHVjdCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBwcm9kdWN0LndoaXNsaXN0ID0gZmFsc2U7XHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdpbmZvJywgc3VtbWFyeTogJ1dpc2hsaXN0JywgZGV0YWlsOiAnSXRlbSByZW1vdmVkIGZyb20geW91ciB3aXNobGlzdCcgfSk7XHJcbiAgICAgIHRoaXMuY2FydFNlcnZpY2UucmVtb3ZlSXRlbUZyb21GYXZvdXJpdGUocHJvZHVjdC52YXJpZW50SWQpO1xyXG4gICAgfVxyXG4gICAgaWYgKHByb2R1Y3Qud2hpc2xpc3QpIHtcclxuICAgICAgdGhpcy5VU0VSX1dJU0hMSVNUPy5wdXNoKG5ldyBPcmRlcmVkSXRlbXMocHJvZHVjdCwgcHJvZHVjdC52YXJpZW50SWQpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuVVNFUl9XSVNITElTVCA9IHRoaXMuVVNFUl9XSVNITElTVD8uZmlsdGVyKChpdGVtOiBPcmRlcmVkSXRlbXMpID0+IGl0ZW0udmFyaWVudElkICE9IHByb2R1Y3QudmFyaWVudElkKSA/PyBbXTtcclxuICAgIH1cclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgYWRkSXRlbVRvQ2FydChldmVudDogUG9pbnRlckV2ZW50IHwgTW91c2VFdmVudCwgcHJvZHVjdDogUHJvZHVjdCwgdHlwZTogJ0FERCcgfCAnU1VCU1RSQUNUJykge1xyXG4gICAgaWYgKHRoaXMuaXNJdGVtT3V0T2ZTdG9jayhwcm9kdWN0KSkge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnd2FybicsIHN1bW1hcnk6ICdDYXJ0JywgZGV0YWlsOiAnSXRlbSBpcyBub3QgYXZhaWxhYmxlIGFzIG9mIG5vdy4gV2Ugd2lsbCBub3RpZnkgeW91IG9uY2UgYXZhaWxhYmxlJyB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgcHJvZHVjdC5xdWFudGl0eSArPSAodHlwZSA9PSAnQUREJyA/IDEgOiAtMSk7XHJcbiAgICBpZiAocHJvZHVjdD8uaXRlbVZhcmlhbnQ/Lmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBpdGVtVmFyaWVudDogSXRlbVZhcmlhbnQgfCBudWxsID0gdGhpcy5nZXRJdGVtVmFyaWVudChwcm9kdWN0LCBwcm9kdWN0LnZhcmllbnRJZCk7XHJcbiAgICAgIGlmIChpdGVtVmFyaWVudCkge1xyXG4gICAgICAgIGl0ZW1WYXJpZW50LnF1YW50aXR5ID0gcHJvZHVjdC5xdWFudGl0eTtcclxuICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZEl0ZW1Ub0NhcnQocHJvZHVjdCwgaXRlbVZhcmllbnQudmFyaWFudElkKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRJdGVtVG9DYXJ0KHByb2R1Y3QpO1xyXG4gICAgfVxyXG4gICAgaWYgKHByb2R1Y3QucXVhbnRpdHkpIHtcclxuICAgICAgbGV0IGlzUHJlc2VudDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLlVTRVJfQ0FSVD8uZm9yRWFjaCgoaXRlbTogT3JkZXJlZEl0ZW1zKSA9PiB7XHJcbiAgICAgICAgaWYgKGl0ZW0udmFyaWVudElkID09IHByb2R1Y3QudmFyaWVudElkKSB7XHJcbiAgICAgICAgICBpdGVtLnF1YW50aXR5ID0gcHJvZHVjdC5xdWFudGl0eTtcclxuICAgICAgICAgIGlzUHJlc2VudCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICBpZiAoIWlzUHJlc2VudClcclxuICAgICAgICB0aGlzLlVTRVJfQ0FSVD8ucHVzaChuZXcgT3JkZXJlZEl0ZW1zKHByb2R1Y3QsIHByb2R1Y3QudmFyaWVudElkKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLlVTRVJfQ0FSVCA9IHRoaXMuVVNFUl9DQVJUPy5maWx0ZXIoKGl0ZW06IE9yZGVyZWRJdGVtcykgPT4gaXRlbS52YXJpZW50SWQgIT0gcHJvZHVjdC52YXJpZW50SWQpID8/IFtdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VhcmNoUHJvZHVjdCgpIHtcclxuICAgIHRoaXMubmF2aWdhdGVGaWx0ZXIodGhpcy5zb3J0QnkgPz8gXCJcIik7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RWYXJpZW50KHByb2R1Y3Q6IFByb2R1Y3QsIHZhcmllbnQ6IEl0ZW1WYXJpYW50KSB7XHJcbiAgICBwcm9kdWN0LnZhcmllbnRJZCA9IHZhcmllbnQudmFyaWFudElkO1xyXG4gICAgcHJvZHVjdC5pdGVtSW1hZ2VzID0gdmFyaWVudC52YXJpYW50SW1hZ2VzO1xyXG4gICAgcHJvZHVjdC5wcmljZSA9IHZhcmllbnQuaXRlbVZhcmlhbnRQcmljZTtcclxuICAgIHByb2R1Y3QuaXRlbUludmVudG9yeSA9IHZhcmllbnQuaXRlbUludmVudG9yeTtcclxuICAgIHByb2R1Y3QucXVhbnRpdHkgPSB0aGlzLmdldFZhcmllbnRRdWFudGl0eSh2YXJpZW50KTtcclxuICAgIHByb2R1Y3Qud2hpc2xpc3QgPSB0aGlzLmlzVmFyaWVudFByZXNlbnRJbldpc2h0bGlzdCh2YXJpZW50KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0VmFyaWVudFF1YW50aXR5KHByb2R1Y3RWYXJpZW50OiBJdGVtVmFyaWFudCk6IG51bWJlciB7XHJcbiAgICBsZXQgaXRlbVF1YW50aXR5OiBudW1iZXIgPSAwO1xyXG4gICAgdGhpcy5VU0VSX0NBUlQ/LmZvckVhY2goKGl0ZW06IE9yZGVyZWRJdGVtcykgPT4ge1xyXG4gICAgICBpZiAocHJvZHVjdFZhcmllbnQudmFyaWFudElkID09IGl0ZW0udmFyaWVudElkKVxyXG4gICAgICAgIGl0ZW1RdWFudGl0eSA9IGl0ZW0ucXVhbnRpdHk7XHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIGl0ZW1RdWFudGl0eTtcclxuICB9XHJcbiAgcHJpdmF0ZSBpc1ZhcmllbnRQcmVzZW50SW5XaXNodGxpc3QocHJvZHVjdFZhcmllbnQ6IEl0ZW1WYXJpYW50KTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcHJlc2VudDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5VU0VSX1dJU0hMSVNUPy5mb3JFYWNoKChpdGVtOiBPcmRlcmVkSXRlbXMpID0+IHtcclxuICAgICAgaWYgKHByb2R1Y3RWYXJpZW50LnZhcmlhbnRJZCA9PSBpdGVtLnZhcmllbnRJZClcclxuICAgICAgICBwcmVzZW50ID0gdHJ1ZTtcclxuICAgIH0pXHJcbiAgICByZXR1cm4gcHJlc2VudDtcclxuICB9XHJcblxyXG5cclxuICAvLyBhcHBseUZpbHRlcihjYXRlZ29yeT86IGFueSwgdHlwZT86ICdTT1JUJyB8ICdGSUxURVInKSB7XHJcbiAgLy8gICB0aGlzLnBhZ2VObyA9IDE7XHJcbiAgLy8gICBpZiAodHlwZSA9PT0gXCJGSUxURVJcIikge1xyXG4gIC8vICAgICBjYXRlZ29yeS5zdGF0dXMgPSAhY2F0ZWdvcnkuc3RhdHVzO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgLy8gRm9yIFNPUlQsIHNvcnRCeSBpcyBhbHJlYWR5IHNldCBmcm9tIG5nTW9kZWxcclxuICAvLyAgIHRoaXMuZmlsdGVyQm90dG9tU2hlZXRSZWY/LmRpc21pc3MoKTtcclxuICAvLyAgIHRoaXMubmF2aWdhdGVGaWx0ZXIodGhpcy5zb3J0QnkpO1xyXG4gIC8vIH1cclxuXHJcbiAgbmF2aWdhdGVGaWx0ZXIoc29ydGluZzogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNvcnRCeSA9IHNvcnRpbmc7XHJcbiAgICBsZXQgc2VsZWN0ZWRDYXRlZ29yeSA9IFwiXCI7XHJcbiAgICBsZXQgc2VsZWN0ZWRDb2xsZWN0aW9uID0gXCJcIjtcclxuICAgIHRoaXMuY2F0ZWdvcmllcy5maWx0ZXIoKGNhdGVnb3J5KSA9PiBjYXRlZ29yeS5zdGF0dXMpLm1hcCgoY2F0ZWdvcnkpID0+IHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICAuLi5jYXRlZ29yeSxcclxuICAgICAgICBzbHVnOiBjYXRlZ29yeS5vcHRpb24ucmVwbGFjZUFsbChcIiBcIiwgXCJfXCIpXHJcbiAgICAgIH1cclxuICAgIH0pLmZvckVhY2goKGNhdGVnb3J5KSA9PiBzZWxlY3RlZENhdGVnb3J5ICs9IChjYXRlZ29yeS5zbHVnICsgXCIrXCIpKTtcclxuICAgIHRoaXMuY29sbGVjdGlvbnMuZmlsdGVyKChjb2xsZWN0aW9uKSA9PiBjb2xsZWN0aW9uLnN0YXR1cykubWFwKChjb2xsZWN0aW9uKSA9PiB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4uY29sbGVjdGlvbixcclxuICAgICAgICBzbHVnOiBjb2xsZWN0aW9uLm9wdGlvbi5yZXBsYWNlQWxsKFwiIFwiLCBcIl9cIilcclxuICAgICAgfVxyXG4gICAgfSkuZm9yRWFjaCgoY29sbGVjdGlvbikgPT4gc2VsZWN0ZWRDb2xsZWN0aW9uICs9IChjb2xsZWN0aW9uLnNsdWcgKyBcIitcIikpO1xyXG4gICAgdGhpcy5zb3J0aW5nRGlhbG9nUmVmPy5kaXNtaXNzKCk7XHJcbiAgICB0aGlzLmZpbHRlckl0ZW1MaXN0KCk7XHJcbiAgfVxyXG4gIGNsb3NlRmlsdGVyKCkge1xyXG4gICAgdGhpcy5maWx0ZXJCb3R0b21TaGVldFJlZj8uZGlzbWlzcygpO1xyXG4gIH1cclxuICBvcGVuRmlsdGVyKEZpbHRlclNlY3Rpb246IGFueSkge1xyXG4gICAgdGhpcy5maWx0ZXJCb3R0b21TaGVldFJlZiA9IHRoaXMubWF0Qm90dG9tU2hlZXQub3BlbihGaWx0ZXJTZWN0aW9uKTtcclxuICB9XHJcbiAgb3BlblNvcnRpbmcoU29ydGluZ1NlY3Rpb246IGFueSkge1xyXG4gICAgdGhpcy5zb3J0aW5nRGlhbG9nUmVmID0gdGhpcy5tYXRCb3R0b21TaGVldC5vcGVuKFNvcnRpbmdTZWN0aW9uLCB7fSk7XHJcbiAgfVxyXG4gIHBhZ2luYXRpb25DaGFuZ2UocGFnZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnBhZ2VObyA9IHBhZ2U7XHJcbiAgICB0aGlzLm5hdmlnYXRlRmlsdGVyKHRoaXMuc29ydEJ5ID8/IFwiXCIpO1xyXG4gICAgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgPSAwO1xyXG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA9IDA7XHJcbiAgfVxyXG4gIGNsb3NlRGlhbG9nKCkge1xyXG4gICAgdGhpcy5zb3J0aW5nRGlhbG9nUmVmPy5kaXNtaXNzKCk7XHJcbiAgfVxyXG4gIGlzSXRlbU91dE9mU3RvY2socHJvZHVjdDogUHJvZHVjdCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHByb2R1Y3QuaXRlbUludmVudG9yeT8ub3BlbmluZ1N0b2NrID09IDA7XHJcbiAgfVxyXG4gIGdldEl0ZW1WYXJpZW50KHByb2R1Y3Q6IFByb2R1Y3QsIHZhcmllbnRJZDogc3RyaW5nKTogSXRlbVZhcmlhbnQgfCBudWxsIHtcclxuICAgIGxldCBzZWxlY3RlZFZhcmllbnQ6IEl0ZW1WYXJpYW50IHwgbnVsbCA9IG51bGw7XHJcbiAgICBwcm9kdWN0Py5pdGVtVmFyaWFudD8uZm9yRWFjaCgodmFyaWVudDogSXRlbVZhcmlhbnQpID0+IHtcclxuICAgICAgaWYgKHZhcmllbnQudmFyaWFudElkID09PSB2YXJpZW50SWQpXHJcbiAgICAgICAgc2VsZWN0ZWRWYXJpZW50ID0gdmFyaWVudDtcclxuICAgIH0pXHJcbiAgICByZXR1cm4gc2VsZWN0ZWRWYXJpZW50O1xyXG4gIH1cclxuICBnZXQgaXNNb2JpbGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gd2luZG93LmlubmVyV2lkdGggPCA0NzU7XHJcbiAgfVxyXG4gIGdldCBjdXJyZW5jeSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIEJVU0lORVNTX0NPTlNUQU5UUy5DVVJSRU5DWTtcclxuICB9XHJcbiAgZ2V0IG1pblNpemUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBNYXRoLm1pbih0aGlzLnRvdGFsQ291bnQsICgoKHRoaXMucGFnZU5vIC0gMSkgKiB0aGlzLnNpemUgKyAxKSArIHRoaXMuc2l6ZSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0UHJvZHVjdEltYWdlcyhwcm9kdWN0OiBhbnkpIHtcclxuICAgIGlmICghcHJvZHVjdFsnY3VycmVudEltYWdlSW5kZXgnXSkgcHJvZHVjdFsnY3VycmVudEltYWdlSW5kZXgnXSA9IDA7XHJcbiAgICBsZXQgaW1hZ2VJbmRleDogbnVtYmVyID0gcHJvZHVjdFsnY3VycmVudEltYWdlSW5kZXgnXSAlIHByb2R1Y3Q/LlsnaXRlbUltYWdlcyddPy5sZW5ndGg7XHJcbiAgICByZXR1cm4gcHJvZHVjdD8uWydpdGVtSW1hZ2VzJ10/LltpbWFnZUluZGV4XT8uaW1nVXJsXHJcbiAgfVxyXG5cclxuICBhc3luYyBjaGFuZ2VJbWFnZShwcm9kdWN0OiBhbnksIGFjdGlvbjogJ1BSRVYnIHwgJ05FWFQnLCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmltYWdlSW5kZXggPSBpbmRleDtcclxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAzMDApKTtcclxuICAgIGlmIChhY3Rpb24gPT09ICdORVhUJykge1xyXG4gICAgICBwcm9kdWN0WydjdXJyZW50SW1hZ2VJbmRleCddKys7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwcm9kdWN0WydjdXJyZW50SW1hZ2VJbmRleCddLS07XHJcbiAgICAgIGlmIChwcm9kdWN0WydjdXJyZW50SW1hZ2VJbmRleCddIDwgMClcclxuICAgICAgICBwcm9kdWN0WydjdXJyZW50SW1hZ2VJbmRleCddID0gcHJvZHVjdD8uWydpdGVtSW1hZ2VzJ10/Lmxlbmd0aCAtIDE7XHJcbiAgICB9XHJcbiAgICB0aGlzLmltYWdlSW5kZXggPSAtMTtcclxuICB9XHJcblxyXG4gIGdldEJ1dHRvbklkKGluZGV4OiBudW1iZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGE/LmFjdGlvbj8uYnV0dG9uc1tpbmRleF0/LmlkID8/IFwiXCI7XHJcbiAgfVxyXG4gIGdldEJ1dHRvblN0eWxlKGluZGV4OiBudW1iZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGE/LmFjdGlvbj8uYnV0dG9uc1tpbmRleF0/LnN0eWxlcztcclxuICB9XHJcbiAgZ2V0RWxlbWVudFJvdygpIHtcclxuICAgIHJldHVybiB0aGlzLnN0eWxlcz8uZWxlbWVudEluUm93ID8/IDVcclxuICB9XHJcblxyXG4gIHNob3dBbGxDYXRlZ29yaWVzID0gZmFsc2U7XHJcblxyXG4gIGdldCBkaXNwbGF5ZWRDYXRlZ29yaWVzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2hvd0FsbENhdGVnb3JpZXMgPyB0aGlzLmNhdGVnb3JpZXMgOiB0aGlzLmNhdGVnb3JpZXMuc2xpY2UoMCwgNCk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVDYXRlZ29yaWVzKCkge1xyXG4gICAgdGhpcy5zaG93QWxsQ2F0ZWdvcmllcyA9ICF0aGlzLnNob3dBbGxDYXRlZ29yaWVzO1xyXG4gIH1cclxuXHJcbiAgc2hvd0FsbENvbGxlY3Rpb25zID0gZmFsc2U7XHJcblxyXG4gIGdldCBkaXNwbGF5ZWRDb2xsZWN0aW9ucygpIHtcclxuICAgIHJldHVybiB0aGlzLnNob3dBbGxDb2xsZWN0aW9ucyA/IHRoaXMuY29sbGVjdGlvbnMgOiB0aGlzLmNvbGxlY3Rpb25zLnNsaWNlKDAsIDQpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlQ29sbGVjdGlvbnMoKSB7XHJcbiAgICB0aGlzLnNob3dBbGxDb2xsZWN0aW9ucyA9ICF0aGlzLnNob3dBbGxDb2xsZWN0aW9ucztcclxuICB9XHJcblxyXG4gIGNhdGVnb3JpZXNDb2xsYXBzZWQgPSBmYWxzZTtcclxuICBjb2xsZWN0aW9uc0NvbGxhcHNlZCA9IGZhbHNlO1xyXG4gIHJhdGluZ3NDb2xsYXBzZWQgPSBmYWxzZTtcclxuICBwcmljZUNvbGxhcHNlZCA9IGZhbHNlO1xyXG4gIHByb2R1Y3RUeXBlQ29sbGFwc2VkID0gZmFsc2U7XHJcbiAgc2hvcEZvckNvbGxhcHNlZCA9IGZhbHNlO1xyXG4gIG1hdGVyaWFsQ29sbGFwc2VkID0gZmFsc2U7XHJcbiAgbWV0YWxDb2xsYXBzZWQgPSBmYWxzZTtcclxuICByaW5nU3R5bGVDb2xsYXBzZWQgPSBmYWxzZTtcclxuXHJcbiAgYXN5bmMgYWRkVG9UcmlhbENhcnQocHJvZHVjdDogUHJvZHVjdCkge1xyXG4gICAgbGV0IGlzSXRlbUFkZGVkOiBib29sZWFuID0gdHJ1ZVxyXG4gICAgaWYgKHByb2R1Y3Q/Lml0ZW1WYXJpYW50Py5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgaXRlbVZhcmllbnQ6IEl0ZW1WYXJpYW50IHwgbnVsbCA9IHRoaXMuZ2V0SXRlbVZhcmllbnQocHJvZHVjdCwgcHJvZHVjdC52YXJpZW50SWQpO1xyXG4gICAgICBpZiAoaXRlbVZhcmllbnQpIHtcclxuICAgICAgICBpdGVtVmFyaWVudC53aXNobGlzdCA9IHRydWU7XHJcbiAgICAgICAgaXNJdGVtQWRkZWQgPSBhd2FpdCB0aGlzLmNhcnRTZXJ2aWNlLmFkZEl0ZW1Ub1RyaWFsKHByb2R1Y3QgYXMgUHJvZHVjdCwgaXRlbVZhcmllbnQudmFyaWFudElkKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaXNJdGVtQWRkZWQgPSBhd2FpdCB0aGlzLmNhcnRTZXJ2aWNlLmFkZEl0ZW1Ub1RyaWFsKHByb2R1Y3QpO1xyXG4gICAgfVxyXG4gICAgaWYgKGlzSXRlbUFkZGVkKVxyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnc3VjY2VzcycsIHN1bW1hcnk6ICdUcnkgYXQgaG9tZScsIGRldGFpbDogJ0l0ZW0gYWRkZWQgdG8geW91ciB0cmlhbCBjYXJ0JyB9KTtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ1RyeSBhdCBob21lJywgZGV0YWlsOiAnSXRlbSBhbHJlYWR5IGFkZGVkIHRvIHlvdXIgdHJpYWwgY2FydCcgfSk7XHJcbiAgfVxyXG5cclxuICBwcm9kdWN0TmFtZTogc3RyaW5nID0gXCJcIlxyXG4gIG9wZW5EaWFsb2dCb3godGVtcGxhdGU6IFRlbXBsYXRlUmVmPEhUTUxEaXZFbGVtZW50PiwgcHJvZHVjdE5hbWU6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5wcm9kdWN0TmFtZSA9IHByb2R1Y3ROYW1lO1xyXG4gICAgY29uc3QgY29uZmlnOiBNYXREaWFsb2dDb25maWcgPSB7XHJcbiAgICAgIHBhbmVsQ2xhc3M6ICcnLFxyXG4gICAgICBkaXNhYmxlQ2xvc2U6IGZhbHNlLFxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAodGhpcy5zY3JlZW5XaWR0aCA+IDQ3NSkge1xyXG4gICAgICBjb25maWcucGFuZWxDbGFzcyA9ICd2aWRlby1jYWxsLWRpYWxvZyc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25maWcud2lkdGggPSAnMTAwdncnO1xyXG4gICAgICBjb25maWcuaGVpZ2h0ID0gJzEwMHZoJztcclxuICAgICAgY29uZmlnLm1heFdpZHRoID0gJzEwMHZ3JztcclxuICAgICAgY29uZmlnLnBhbmVsQ2xhc3MgPSAnYXBwb2ludG1lbnQtZm9ybSc7XHJcbiAgICB9XHJcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLm1hdERpYWxvZy5vcGVuKHRlbXBsYXRlLCBjb25maWcpO1xyXG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xyXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICcnO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgbWF0Q2xvc2VEaWFsb2coKSB7XHJcbiAgICB0aGlzLm1hdERpYWxvZy5jbG9zZUFsbCgpO1xyXG4gIH1cclxuXHJcbiAgb3RoZXJMYW5ndWFnZTogc3RyaW5nID0gJyc7XHJcblxyXG4gIHZpZGVvQ2FsbFBheWxvYWQ6IGFueSA9IHtcclxuICAgIGJ1c2luZXNzSWQ6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdidXNpbmVzc0lkJykgPz8gXCJcIixcclxuICAgIG1vYmlsZU51bWJlcjogXCJcIixcclxuICAgIHBpbmNvZGU6IFwiXCIsXHJcbiAgICB1c2VybmFtZTogXCJcIixcclxuICAgIGVtYWlsOiBcIlwiLFxyXG4gICAgbWVzc2FnZTogYGAsXHJcbiAgfVxyXG5cclxuICB2YWxpZGF0aW9uRXJyb3JzOiBhbnkgPSB7XHJcbiAgICB1c2VybmFtZTogZmFsc2UsXHJcbiAgICBtb2JpbGVOdW1iZXI6IGZhbHNlLFxyXG4gICAgLy8gcGluY29kZTogZmFsc2UsXHJcbiAgICAvLyBlbWFpbDogZmFsc2VcclxuICB9O1xyXG4gIGlzU3VibWl0dGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNjaGVkdWxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNjaGVkdWxlVmlkZW9DYWxsKCkge1xyXG4gICAgaWYgKHRoaXMuaXNTdWJtaXR0aW5nKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMucmVzZXRWYWxpZGF0aW9uRXJyb3JzKCk7XHJcbiAgICBsZXQgaGFzRXJyb3JzID0gZmFsc2U7XHJcbiAgICBpZiAoIXRoaXMudmlkZW9DYWxsUGF5bG9hZC51c2VybmFtZT8udHJpbSgpKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9ycy51c2VybmFtZSA9IHRydWU7XHJcbiAgICAgIGhhc0Vycm9ycyA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMudmlkZW9DYWxsUGF5bG9hZC5tb2JpbGVOdW1iZXIpIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzLm1vYmlsZU51bWJlciA9IHRydWU7XHJcbiAgICAgIGhhc0Vycm9ycyA9IHRydWU7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMudmlkZW9DYWxsUGF5bG9hZC5tb2JpbGVOdW1iZXIudG9TdHJpbmcoKS5sZW5ndGggIT09IDEwKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9ycy5tb2JpbGVOdW1iZXIgPSB0cnVlO1xyXG4gICAgICBoYXNFcnJvcnMgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgLy8gaWYgKCF0aGlzLnZpZGVvQ2FsbFBheWxvYWQucGluY29kZSkge1xyXG4gICAgLy8gICB0aGlzLnZhbGlkYXRpb25FcnJvcnMucGluY29kZSA9IHRydWU7XHJcbiAgICAvLyAgIGhhc0Vycm9ycyA9IHRydWU7XHJcbiAgICAvLyB9IGVsc2UgaWYgKHRoaXMudmlkZW9DYWxsUGF5bG9hZC5waW5jb2RlLnRvU3RyaW5nKCkubGVuZ3RoICE9PSA2KSB7XHJcbiAgICAvLyAgIHRoaXMudmFsaWRhdGlvbkVycm9ycy5waW5jb2RlID0gdHJ1ZTtcclxuICAgIC8vICAgaGFzRXJyb3JzID0gdHJ1ZTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBpZiAoIXRoaXMudmlkZW9DYWxsUGF5bG9hZC5lbWFpbD8udHJpbSgpKSB7XHJcbiAgICAvLyAgIHRoaXMudmFsaWRhdGlvbkVycm9ycy5lbWFpbCA9IHRydWU7XHJcbiAgICAvLyAgIGhhc0Vycm9ycyA9IHRydWU7XHJcbiAgICAvLyB9IGVsc2UgaWYgKCEvXlthLXpBLVowLTkuXyUrLV0rQFthLXpBLVowLTkuLV0rXFwuW2EtekEtWl17Mix9JC8udGVzdCh0aGlzLnZpZGVvQ2FsbFBheWxvYWQuZW1haWwpKSB7XHJcbiAgICAvLyAgIHRoaXMudmFsaWRhdGlvbkVycm9ycy5lbWFpbCA9IHRydWU7XHJcbiAgICAvLyAgIGhhc0Vycm9ycyA9IHRydWU7XHJcbiAgICAvLyB9XHJcbiAgICAvLyB8fCAhdGhpcy52aWRlb0NhbGxQYXlsb2FkLnBpbmNvZGVcclxuICAgIGlmIChoYXNFcnJvcnMpIHtcclxuICAgICAgaWYgKCF0aGlzLnZpZGVvQ2FsbFBheWxvYWQudXNlcm5hbWU/LnRyaW0oKSB8fCAhdGhpcy52aWRlb0NhbGxQYXlsb2FkLm1vYmlsZU51bWJlcikge1xyXG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcclxuICAgICAgICAgIHNldmVyaXR5OiAnd2FybicsXHJcbiAgICAgICAgICBzdW1tYXJ5OiAnVmlkZW8gQ2FsbCBTY2hlZHVsZScsXHJcbiAgICAgICAgICBkZXRhaWw6ICdQbGVhc2UgZmlsbCBhbGwgdGhlIHJlcXVpcmVkIGRldGFpbHMnLFxyXG4gICAgICAgICAga2V5OiAnVmlkZW8gQ2FsbCBTY2hlZHVsZSdcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnZpZGVvQ2FsbFBheWxvYWQubW9iaWxlTnVtYmVyLnRvU3RyaW5nKCkubGVuZ3RoICE9PSAxMCkge1xyXG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcclxuICAgICAgICAgIHNldmVyaXR5OiAnd2FybicsXHJcbiAgICAgICAgICBzdW1tYXJ5OiAnVmlkZW8gQ2FsbCBTY2hlZHVsZScsXHJcbiAgICAgICAgICBkZXRhaWw6ICdQbGVhc2UgZW50ZXIgYSB2YWxpZCAxMC1kaWdpdCBtb2JpbGUgbnVtYmVyJyxcclxuICAgICAgICAgIGtleTogJ1ZpZGVvIENhbGwgU2NoZWR1bGUnXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gfSBlbHNlIGlmICh0aGlzLnZpZGVvQ2FsbFBheWxvYWQucGluY29kZS50b1N0cmluZygpLmxlbmd0aCAhPT0gNikge1xyXG4gICAgICAvLyAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcclxuICAgICAgLy8gICAgIHNldmVyaXR5OiAnd2FybicsXHJcbiAgICAgIC8vICAgICBzdW1tYXJ5OiAnVmlkZW8gQ2FsbCBTY2hlZHVsZScsXHJcbiAgICAgIC8vICAgICBkZXRhaWw6ICdQbGVhc2UgZW50ZXIgYSB2YWxpZCA2LWRpZ2l0IHBpbmNvZGUnLFxyXG4gICAgICAvLyAgICAga2V5OiAnVmlkZW8gQ2FsbCBTY2hlZHVsZSdcclxuICAgICAgLy8gICB9KTtcclxuICAgICAgLy8gfVxyXG4gICAgICAvLyBlbHNlIGlmICghdGhpcy52aWRlb0NhbGxQYXlsb2FkLmVtYWlsPy50cmltKCkgfHwgIS9eW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcXC5bYS16QS1aXXsyLH0kLy50ZXN0KHRoaXMudmlkZW9DYWxsUGF5bG9hZC5lbWFpbCkpIHtcclxuICAgICAgLy8gICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XHJcbiAgICAgIC8vICAgICBzZXZlcml0eTogJ3dhcm4nLFxyXG4gICAgICAvLyAgICAgc3VtbWFyeTogJ1ZpZGVvIENhbGwgU2NoZWR1bGUnLFxyXG4gICAgICAvLyAgICAgZGV0YWlsOiAnUGxlYXNlIGVudGVyIGEgdmFsaWQgZW1haWwgYWRkcmVzcycsXHJcbiAgICAgIC8vICAgICBrZXk6ICdWaWRlbyBDYWxsIFNjaGVkdWxlJ1xyXG4gICAgICAvLyAgIH0pO1xyXG4gICAgICAvLyB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmlzU3VibWl0dGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnZpZGVvQ2FsbFBheWxvYWQubWVzc2FnZSA9IHRoaXMudmlkZW9DYWxsUGF5bG9hZC5tZXNzYWdlICsgYEhpLCBJJ3ZlIGp1c3Qgc2NoZWR1bGVkIGEgdmlkZW8gY2FsbCB3aXRoIHlvdSBmb3IgdGhpcyBwcm9kdWN0ICR7dGhpcy5wcm9kdWN0TmFtZX0uIEl0J3MgaW1wb3J0YW50IGFuZCBJJ2QgYXBwcmVjaWF0ZSB5b3VyIHRpbWUg4oCUIGxvb2tpbmcgZm9yd2FyZCB0byBjb25uZWN0aW5nIGFzIHNvb24gYXMgcG9zc2libGUgIGluICR7dGhpcy5zZWxlY3RlZExhbmcgPT0gJ090aGVycycgPyB0aGlzLm90aGVyTGFuZ3VhZ2UgOiB0aGlzLnNlbGVjdGVkTGFuZ30gbGFuZ3VhZ2VgO1xyXG4gICAgdGhpcy5yZXN0U2VydmljZS5wb3N0VmlkZW9DYWxsRGV0YWlscyh0aGlzLnZpZGVvQ2FsbFBheWxvYWQpLnN1YnNjcmliZShcclxuICAgICAgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xyXG4gICAgICAgICAgc2V2ZXJpdHk6ICdzdWNjZXNzJyxcclxuICAgICAgICAgIHN1bW1hcnk6ICdWaWRlbyBDYWxsIFNjaGVkdWxlJyxcclxuICAgICAgICAgIGRldGFpbDogJ1lvdXIgVmlkZW8gQ2FsbCBpcyBTY2hlZHVsZWQgU3VjY2Vzc2Z1bGx5JyxcclxuICAgICAgICAgIGtleTogJ1ZpZGVvIFNjaGVkdWxpbmcnXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5pc1N1Ym1pdHRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNjaGVkdWxlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5tYXRDbG9zZURpYWxvZygpO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmlzU3VibWl0dGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcclxuICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxyXG4gICAgICAgICAgc3VtbWFyeTogJ0Vycm9yJyxcclxuICAgICAgICAgIGRldGFpbDogZXJyPy5lcnJvcj8ubWVzc2FnZSxcclxuICAgICAgICAgIGtleTogJ1ZpZGVvIENhbGwgU2NoZWR1bGUnXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG4gIHJlc2V0VmFsaWRhdGlvbkVycm9ycygpIHtcclxuICAgIHRoaXMudmFsaWRhdGlvbkVycm9ycyA9IHtcclxuICAgICAgdXNlcm5hbWU6IGZhbHNlLFxyXG4gICAgICBtb2JpbGVOdW1iZXI6IGZhbHNlLFxyXG4gICAgICBwaW5jb2RlOiBmYWxzZVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHJlc2V0Rm9ybSgpIHtcclxuICAgIHRoaXMudmlkZW9DYWxsUGF5bG9hZCA9IHtcclxuICAgICAgdXNlcm5hbWU6ICcnLFxyXG4gICAgICBtb2JpbGVOdW1iZXI6ICcnLFxyXG4gICAgICBwaW5jb2RlOiAnJyxcclxuICAgICAgbWVzc2FnZTogJydcclxuICAgIH07XHJcbiAgICB0aGlzLnJlc2V0VmFsaWRhdGlvbkVycm9ycygpO1xyXG4gIH1cclxuICBvbklucHV0Q2hhbmdlKGZpZWxkOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLnZhbGlkYXRpb25FcnJvcnNbZmllbGRdKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9yc1tmaWVsZF0gPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcbiAgY2xvc2VNb2RhbCgpIHtcclxuICAgIGNvbnN0IG1vZGFsRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGFtcGxlTW9kYWxDZW50ZXInKTtcclxuICAgIGlmIChtb2RhbEVsZW1lbnQpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUobW9kYWxFbGVtZW50LCAnZGF0YS1icy1kaXNtaXNzJywgJ21vZGFsJyk7XHJcbiAgICAgIG1vZGFsRWxlbWVudC5jbGljaygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbGFuZ3VhZ2VzOiBzdHJpbmdbXSA9IFtcIkVuZ2xpc2hcIiwgXCJUZWx1Z3VcIiwgXCJIaW5kaVwiLCBcIlRhbWlsXCIsIFwiS2FubmFkYVwiLCBcIk1hbGF5YWxhbVwiLCBcIk90aGVyc1wiXVxyXG4gIHNlbGVjdGVkTGFuZzogc3RyaW5nID0gdGhpcy5sYW5ndWFnZXNbMF1cclxuXHJcbiAgZ2V0VGV4dENvbG9yKGNvbG9yOiBhbnkpIHtcclxuICAgIGNvbnN0IHRocmVzaG9sZCA9IDEzMDtcclxuICAgIGNvbnN0IHIgPSBwYXJzZUludChjb2xvci5zbGljZSgxLCAzKSwgMTYpO1xyXG4gICAgY29uc3QgZyA9IHBhcnNlSW50KGNvbG9yLnNsaWNlKDMsIDUpLCAxNik7XHJcbiAgICBjb25zdCBiID0gcGFyc2VJbnQoY29sb3Iuc2xpY2UoNSwgNyksIDE2KTtcclxuICAgIGNvbnN0IGJyaWdodG5lc3MgPSAociAqIDI5OSArIGcgKiA1ODcgKyBiICogMTE0KSAvIDEwMDA7XHJcblxyXG4gICAgcmV0dXJuIGJyaWdodG5lc3MgPiB0aHJlc2hvbGQgPyAnIzAwMDAwMCcgOiAnI2ZmZmZmZic7XHJcbiAgfVxyXG59XHJcbiIsIjxwLXRvYXN0IHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCIgW2Jhc2VaSW5kZXhdPVwiMTAwMDAwMDAwMDBcIiBbYXV0b1pJbmRleF09XCJ0cnVlXCJcclxuICBbc2hvd1RyYW5zZm9ybU9wdGlvbnNdPVwiaXNNb2JpbGUgPyAndHJhbnNsYXRlWSgtMTAwJSknIDogJydcIj48L3AtdG9hc3Q+XHJcbjxwLXRvYXN0IHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCIgW2Jhc2VaSW5kZXhdPVwiMTAwMDAwMDAwMDBcIiBbYXV0b1pJbmRleF09XCJ0cnVlXCIga2V5PVwiVmlkZW8gQ2FsbCBTY2hlZHVsZVwiXHJcbiAgW3Nob3dUcmFuc2Zvcm1PcHRpb25zXT1cImlzTW9iaWxlID8gJ3RyYW5zbGF0ZVkoLTEwMCUpJyA6ICcnXCI+PC9wLXRvYXN0PlxyXG48cC10b2FzdCBwb3NpdGlvbj1cImJvdHRvbS1yaWdodFwiIFtiYXNlWkluZGV4XT1cIjEwMDAwMDAwMDAwXCIgW2F1dG9aSW5kZXhdPVwidHJ1ZVwiIGtleT1cIlZpZGVvIFNjaGVkdWxpbmdcIlxyXG4gIFtzaG93VHJhbnNmb3JtT3B0aW9uc109XCJpc01vYmlsZSA/ICd0cmFuc2xhdGVZKC0xMDAlKScgOiAnJ1wiPjwvcC10b2FzdD5cclxuXHJcbjwhLS0gPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCIgKm5nSWY9XCJpc01vYmlsZVwiIFtuZ0NsYXNzXT1cInsnaW5wdXQtZ3JvdXAtc3RpY2t5Jzogc2Nyb2xsaW5nVmFsdWUgPiAyMH1cIj5cclxuICA8bWF0LWljb24gY2xhc3M9XCJmLTIwIGQtZmxleCBhbGlnbi1pdGVtLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+c2VhcmNoPC9tYXQtaWNvbj5cclxuICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoIFByb2R1Y3QuLlwiIGFyaWEtbGFiZWw9XCJTZWFyY2ggUHJvZHVjdFwiXHJcbiAgICBbKG5nTW9kZWwpXT1cInNlYXJjaFRleHRcIiAobmdNb2RlbENoYW5nZSk9XCJzZWFyY2hQcm9kdWN0KClcIj5cclxuPC9kaXY+IC0tPlxyXG5cclxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0xvYWRpbmdcIj5cclxuICA8c2VjdGlvbiBbaWRdPVwiZGF0YT8uaWRcIiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZCB0b3RhbC1jb250YWluZXJcIiBbc2ltcG9MYXlvdXRdPVwic3R5bGVzPy5sYXlvdXRcIiBzaW1wb0hvdmVyXHJcbiAgICAoaG92ZXJpbmcpPVwic2hvd0VkaXRUYWJzKCRldmVudClcIiBbc2ltcG9CYWNrZ3JvdW5kXT1cInN0eWxlcz8uYmFja2dyb3VuZFwiXHJcbiAgICBbc3R5bGUucGFkZGluZ1RvcC5weF09XCJpc01vYmlsZSA/ICcwICFpbXBvcnRhbnQnIDogJydcIiBbYXR0ci5zdHlsZV09XCJjdXN0b21DbGFzc1wiXHJcbiAgICBbc3BhY2luZ0hvcml6b250YWxdPVwic3R5bGVzTGF5b3V0XCI+XHJcblxyXG4gICAgPCEtLSA8ZGl2IHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlO1wiIGNsYXNzPVwic3BlZWRkaWFsLWxpbmVhclwiICpuZ0lmPVwiaXNNb2JpbGVcIj5cclxuICAgICAgPHAtc3BlZWREaWFsIFttb2RlbF09XCJpdGVtc1wiIGRpcmVjdGlvbj1cInVwXCJcclxuICAgICAgICBbYnV0dG9uU3R5bGVdPVwieydib3JkZXItcmFkaXVzJzogJzUwJScsICdoZWlnaHQnOiAnMzBweCd9XCI+PC9wLXNwZWVkRGlhbD5cclxuICAgIDwvZGl2PiAtLT5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciB3LTEwMCBvbmx5RGVza3RvcFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLXRvcC1zZWN0aW9uIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1iYXNlbGluZVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXIgYm9keS1sYXJnZVwiPlxyXG4gICAgICAgICAgRmlsdGVyc1xyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjbGVhclwiIChjbGljayk9XCJjbGVhckZpbHRlcigpXCIgW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj5cclxuICAgICAgICAgIENMRUFSIEFMTFxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBpdGVtaWQ9XCJ0b3Atc2VjdGlvblwiIGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiXHJcbiAgICAgICAgc3R5bGU9XCJ3aWR0aDogNzcuNSU7IG1hcmdpbi1yaWdodDogMSU7XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMTVcIiBzdHlsZT1cIndpZHRoOiA3NSU7IGRpc3BsYXk6ZmxleDsgZmxleC13cmFwOndyYXBcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpbHRlciBvZiBmaWx0ZXJlZENoaXBzXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbS1jZW50ZXIgdy05MCBjaGlwXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4+e3tmaWx0ZXIubmFtZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyOyB3aWR0aDoyMHB4OyBoZWlnaHQ6IDIwcHg7XCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJmb250LXNpemU6IDIwcHg7XCIgKGNsaWNrKT1cInJlbW92ZUZpbHRlcihmaWx0ZXIpXCI+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCIgc3R5bGU9XCJnYXA6IDEwcHg7XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtNiBmdy1ub3JtYWwgbXItM1wiPlNvcnQgYnk8L2Rpdj5cclxuICAgICAgICAgIDxzZWxlY3QgWyhuZ01vZGVsKV09XCJzb3J0QnlcIiAoY2hhbmdlKT1cImFwcGx5RmlsdGVyKCRldmVudCwgJ1NPUlQnKVwiIHN0eWxlPVwiY29sb3I6IGJsYWNrO1wiPlxyXG4gICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJmaWx0ZXIudmFsdWVcIiAqbmdGb3I9XCJsZXQgZmlsdGVyIG9mIGZpbHRlcmluZ0FycmF5XCI+e3sgZmlsdGVyLm5hbWUgfX08L29wdGlvbj5cclxuICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXNvcnQtZHJvcGRvd25cIiB0YWJpbmRleD1cIjBcIiAoYmx1cik9XCJjbG9zZURyb3Bkb3duKClcIiAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oKVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzb3J0LWxhYmVsXCI+U29ydCBCeTo8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlbGVjdGVkLXZhbHVlXCI+e3sgZ2V0U2VsZWN0ZWROYW1lKCkgfHwgJ0ZlYXR1cmVkJyB9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9nZ2xlLWljb25cIiBbY2xhc3Mub3Blbl09XCJpc09wZW5cIj4mIzk2NjI7PC9zcGFuPiA8IS0tIERvd24gYXJyb3csIHJvdGF0ZXMgb3BlbiAtLT5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwib3B0aW9uc1wiICpuZ0lmPVwiaXNPcGVuXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGZpbHRlciBvZiBmaWx0ZXJpbmdBcnJheVwiIGNsYXNzPVwib3B0aW9uXCIgW2NsYXNzLnNlbGVjdGVkXT1cImZpbHRlci52YWx1ZSA9PT0gc29ydEJ5XCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0T3B0aW9uKGZpbHRlciwgJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgIHt7IGZpbHRlci5uYW1lIH19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgKm5nSWY9XCJpc01vYmlsZVwiIGNsYXNzPVwiZC1mbGV4IHctMTAwIG9ubHlNb2JpbGUgZ2FwLTE1IGZsZXgtd3JhcFwiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWx0ZXIgb2YgZmlsdGVyZWRDaGlwc1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbS1jZW50ZXIgdy05MCBjaGlwXCI+XHJcbiAgICAgICAgICA8c3Bhbj57e2ZpbHRlci5uYW1lfX08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjsgd2lkdGg6MjBweDsgaGVpZ2h0OiAyMHB4O1wiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJmb250LXNpemU6IDIwcHg7XCIgKGNsaWNrKT1cInJlbW92ZUZpbHRlcihmaWx0ZXIpXCI+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJtYWluLXByb2R1Y3Qtc2VjdGlvblwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLXNpZGVcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiRmlsdGVyU2VjdGlvblwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBbaWRdPVwiZGF0YT8uaWRcIiBbc2ltcG9BbmltYXRpb25dPVwic3R5bGVzPy5hbmltYXRpb25cIiBjbGFzcz1cInJpZ2h0LXNpZGVcIiAoc2Nyb2xsKT1cImhhbmRsZVByb2R1Y3RMaXN0U2Nyb2xsKClcIlxyXG4gICAgICAgICNsaXN0U2Nyb2xsQ29udGFpbmVyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhYXBpTG9hZGluZ1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtcGFyZW50XCIgKm5nSWY9XCJyZXNwb25zZURhdGEgJiYgcmVzcG9uc2VEYXRhLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiByZXNwb25zZURhdGE7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cInByb2R1Y3RcIlxyXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJhcHBseVByb2R1Y3RXaWR0aCgpID8gZ2V0UHJvZHVjdFdpZHRoKCkgOiAnJ1wiIHN0eWxlPVwiY3Vyc29yOnBvaW50ZXI7IHBvc2l0aW9uOiByZWxhdGl2ZTtcIj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3R5bGVzPy50aGVtZSA9PSB0aGVtZS5UaGVtZTFcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJQcm9kdWN0RGVzYzsgY29udGV4dDoge2RhdGE6IHByb2R1Y3QsIGluZGV4OiBpfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdHlsZXM/LnRoZW1lICE9IHRoZW1lLlRoZW1lMVwiPlxyXG4gICAgICAgICAgICAgICAgPHNpbXBvLXNtYWxsLXByb2R1Y3QtbGlzdGluZyBbcHJvZHVjdF09XCJwcm9kdWN0XCIgW2RhdGFdPVwiZGF0YVwiIFtpc1Njcm9sbGFibGVdPVwic2NyZWVuV2lkdGggPiA0NzVcIlxyXG4gICAgICAgICAgICAgICAgICBbaW5kZXhdPVwiaVwiPjwvc2ltcG8tc21hbGwtcHJvZHVjdC1saXN0aW5nPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPHNpbXBvLWNhcmQtc2tlbGV0b24tbG9hZGVyICpuZ0lmPVwiaXNMaXN0TG9hZGluZ1wiIFtjb3VudF09XCJnZXRFbGVtZW50Um93KClcIj48L3NpbXBvLWNhcmQtc2tlbGV0b24tbG9hZGVyPlxyXG4gICAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJlbXB0eS1jYXJ0XCIgKm5nSWY9XCIhaXNMaXN0TG9hZGluZyAmJiByZXNwb25zZURhdGE/Lmxlbmd0aCA9PSAwXCI+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcnQtaW1hZ2VcIj5cclxuICAgICAgICAgICAgICAgIDxpbWcgbG9hZGluZz1cImxhenlcIiBzdHlsZT1cImhlaWdodDogMTUwcHg7IHdpZHRoOiAxNTBweDtcIlxyXG4gICAgICAgICAgICAgICAgICBzcmM9XCJodHRwczovL3Byb2Qtc2ltcG8uczMuYXAtc291dGgtMS5hbWF6b25hd3MuY29tL3Byb2QtaW1hZ2VzLzEwNzIxM2MxNzE2NTQzMzM0MDQwZW1wdHktY2FydC5wbmdcIlxyXG4gICAgICAgICAgICAgICAgICBhbHQ9XCJcIj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FydC10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGluZy1tZWRpdW0gZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgUHJvZHVjdCBsaXN0IGlzIGVtcHR5XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvbiBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBtdC00XCI+XHJcbiAgICAgICAgICAgICAgICAgIExvb2tzIGxpa2Ugbm8gaXRlbSBpcyBwcmVzZW50IHdpdGggZmlsdGVyLiBHbyBhaGVhZCAmIGV4cGxvcmUgdG9wIGNhdGVnb3JpZXMuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L3NlY3Rpb24+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPHNpbXBvLWNhcmQtc2tlbGV0b24tbG9hZGVyICpuZ0lmPVwiYXBpTG9hZGluZ1wiIFtjb3VudF09XCJnZXRFbGVtZW50Um93KClcIj48L3NpbXBvLWNhcmQtc2tlbGV0b24tbG9hZGVyPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJib3R0b20tZmlsdGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmaWx0ZXItdGV4dFwiIHN0eWxlPVwiZ2FwOiAxMHB4XCIgKGNsaWNrKT1cIm9wZW5Tb3J0aW5nKFNvcnRpbmdTZWN0aW9uKVwiPlxyXG4gICAgICAgICAgPG1hdC1pY29uPnNvcnQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgPHNwYW4+U29ydCBieTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2aWRlclwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmlsdGVyLXRleHRcIiBzdHlsZT1cImdhcDogMTBweFwiIChjbGljayk9XCJvcGVuRmlsdGVyKEZpbHRlclNlY3Rpb24pXCI+XHJcbiAgICAgICAgICA8bWF0LWljb24+ZmlsdGVyX2xpc3Q8L21hdC1pY29uPlxyXG4gICAgICAgICAgPHNwYW4+RmlsdGVyPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgW25nQ2xhc3NdPVwieydob3Zlcl9lZmZlY3QnOiBlZGl0fVwiICpuZ0lmPVwic2hvd0VkaXRvcnNcIj5cclxuICAgICAgPHNpbXBvLWhvdmVyLWVsZW1lbnRzIFtkYXRhXT1cImRhdGFcIiBbaW5kZXhdPVwiaW5kZXhcIiBbZWRpdE9wdGlvbnNdPVwiZWRpdFwiXHJcbiAgICAgICAgW2lzRWNvbW1lcmNlXT1cInRydWVcIj48L3NpbXBvLWhvdmVyLWVsZW1lbnRzPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwic2hvd0RlbGV0ZVwiIFtuZ0NsYXNzXT1cInsnaG92ZXJfZWZmZWN0JzogZGVsZXRlfVwiPlxyXG4gICAgICA8c2ltcG8tZGVsZXRlLWhvdmVyLWVsZW1lbnQgW2RhdGFdPVwiZGF0YVwiIFtpbmRleF09XCJpbmRleFwiPjwvc2ltcG8tZGVsZXRlLWhvdmVyLWVsZW1lbnQ+XHJcbiAgICA8L2Rpdj5cclxuICA8L3NlY3Rpb24+XHJcbjwvbmctY29udGFpbmVyPlxyXG5cclxuPG5neC1za2VsZXRvbi1sb2FkZXIgKm5nSWY9XCJpc0xvYWRpbmdcIiBjb3VudD1cIjFcIiBhcHBlYXJhbmNlPVwiY2lyY2xlXCJcclxuICBbdGhlbWVdPVwieyB3aWR0aDogJzEwMCUnLCBoZWlnaHQ6ICc0MHZoJywgJ2JvcmRlci1yYWRpdXMnOiAnMTBweCcsICdwb3NpdGlvbic6ICdyZWxhdGl2ZScsICdyaWdodCc6ICc1cHgnIH1cIj48L25neC1za2VsZXRvbi1sb2FkZXI+XHJcblxyXG48bmctdGVtcGxhdGUgI0Zhdm91cml0ZVRhZ3MgbGV0LXByb2R1Y3Q9XCJkYXRhXCI+XHJcbiAgPGRpdiBjbGFzcz1cImZhdi1pY29uLXdyYXBwZXJcIj5cclxuICAgIDxtYXQtaWNvbiBjbGFzcz1cImZhdi1pY29uXCIgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAoY2xpY2spPVwidG9nZ2xlSXRlbVRvRmF2KCRldmVudCwgcHJvZHVjdCwgJ0FERCcpXCIgKm5nSWY9XCIhcHJvZHVjdC53aGlzbGlzdFwiPmZhdm9yaXRlX2JvcmRlclxyXG4gICAgPC9tYXQtaWNvbj5cclxuICAgIDxtYXQtaWNvbiBjbGFzcz1cImZhdi1pY29uXCIgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAoY2xpY2spPVwidG9nZ2xlSXRlbVRvRmF2KCRldmVudCwgcHJvZHVjdCwgJ1JFTU9WRScpXCIgKm5nSWY9XCJwcm9kdWN0LndoaXNsaXN0XCI+ZmF2b3JpdGVcclxuICAgIDwvbWF0LWljb24+XHJcbiAgICA8c3BhbiBjbGFzcz1cImZhdi10b29sdGlwXCI+XHJcbiAgICAgIHt7IHByb2R1Y3Qud2hpc2xpc3QgPyAnUmVtb3ZlIGZyb20gd2lzaGxpc3QnIDogJ0FkZCB0byB3aXNobGlzdCcgfX1cclxuICAgIDwvc3Bhbj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcblxyXG5cclxuPG5nLXRlbXBsYXRlICNUYWdzIGxldC1wcm9kdWN0PVwiZGF0YVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJwcm9kdWN0LXRhZy1iYWRnZVwiICpuZ0lmPVwicHJvZHVjdD8udGFncz8ubGVuZ3RoXCI+XHJcbiAgICA8c3BhbiAqbmdGb3I9XCJsZXQgdGFnIG9mIHByb2R1Y3QudGFnczsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwicHJvZHVjdC10YWctbGFiZWxcIlxyXG4gICAgICBbY2xhc3MudGFnLWFjdGl2ZV09XCJpID09PSAodGFnSW5kZXhNYXBbcHJvZHVjdC5pdGVtSWRdID8/IDApXCIgW3N0eWxlLmJhY2tncm91bmRdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgIFtzdHlsZS5jb2xvcl09XCJnZXRUZXh0Q29sb3Ioc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvcilcIj5cclxuICAgICAge3sgdGFnIH19XHJcbiAgICA8L3NwYW4+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuPG5nLXRlbXBsYXRlICNGaWx0ZXJTZWN0aW9uPlxyXG4gIDxzZWN0aW9uPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMtc2VjdGlvblwiICpuZ0lmPVwiY2F0ZWdvcmllcz8ubGVuZ3RoXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzIGhlYWRpbmctc21hbGwgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAgICAgKGNsaWNrKT1cImNhdGVnb3JpZXNDb2xsYXBzZWQgPSAhY2F0ZWdvcmllc0NvbGxhcHNlZFwiIHN0eWxlPVwiY3Vyc29yOnBvaW50ZXJcIj5cclxuICAgICAgICA8aDY+PGI+U2hvcCBieSBDYXRlZ29yaWVzPC9iPjwvaDY+XHJcbiAgICAgICAgPG1hdC1pY29uPnt7IGNhdGVnb3JpZXNDb2xsYXBzZWQgPyAnZXhwYW5kX21vcmUnIDogJ2V4cGFuZF9sZXNzJyB9fTwvbWF0LWljb24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNhdGVnb3JpZXNDb2xsYXBzZWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktb3B0aW9uc1wiICpuZ0Zvcj1cImxldCBjYXRlZ29yeSBvZiBkaXNwbGF5ZWRDYXRlZ29yaWVzXCJcclxuICAgICAgICAgIChjbGljayk9XCJhcHBseUZpbHRlcihjYXRlZ29yeSwgJ0ZJTFRFUicpXCI+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJjaGVjay1jb2xvclwiIFtzdHlsZS4tLWNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJjYXRlZ29yeS5zdGF0dXNcIiAvPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRyaW0tdGV4dFwiPnt7Y2F0ZWdvcnkub3B0aW9uIHwgdGl0bGVjYXNlfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiY2F0ZWdvcmllcy5sZW5ndGggPiA0XCIgY2xhc3M9XCJ0b2dnbGUtY2F0ZWdvcmllc1wiIChjbGljayk9XCJ0b2dnbGVDYXRlZ29yaWVzKClcIlxyXG4gICAgICAgICAgW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9nZ2xlLXRleHRcIj5cclxuICAgICAgICAgICAge3sgc2hvd0FsbENhdGVnb3JpZXMgPyAnU2hvdyBMZXNzJyA6ICdTaG93IE1vcmUnIH19XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHJvcGRvd24taWNvblwiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2hvd0FsbENhdGVnb3JpZXNcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5leHBhbmRfbW9yZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dBbGxDYXRlZ29yaWVzXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+ZXhwYW5kX2xlc3M8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMtc2VjdGlvblwiICpuZ0lmPVwiY29sbGVjdGlvbnM/Lmxlbmd0aFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllcyBoZWFkaW5nLXNtYWxsIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgICAgIChjbGljayk9XCJjb2xsZWN0aW9uc0NvbGxhcHNlZCA9ICFjb2xsZWN0aW9uc0NvbGxhcHNlZFwiIHN0eWxlPVwiY3Vyc29yOnBvaW50ZXJcIj5cclxuICAgICAgICA8aDY+PGI+U2hvcCBieSBDb2xsZWN0aW9uczwvYj48L2g2PlxyXG4gICAgICAgIDxtYXQtaWNvbj57eyBjb2xsZWN0aW9uc0NvbGxhcHNlZCA/ICdleHBhbmRfbW9yZScgOiAnZXhwYW5kX2xlc3MnIH19PC9tYXQtaWNvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29sbGVjdGlvbnNDb2xsYXBzZWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktb3B0aW9uc1wiICpuZ0Zvcj1cImxldCBjb2xsZWN0aW9uIG9mIGRpc3BsYXllZENvbGxlY3Rpb25zXCJcclxuICAgICAgICAgIChjbGljayk9XCJhcHBseUZpbHRlcihjb2xsZWN0aW9uLCAnRklMVEVSJylcIj5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImNoZWNrLWNvbG9yXCIgW3N0eWxlLi0tY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgICAgICAgIFtjaGVja2VkXT1cImNvbGxlY3Rpb24uc3RhdHVzXCIgLz5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0cmltLXRleHRcIj57e2NvbGxlY3Rpb24ub3B0aW9uIHwgdGl0bGVjYXNlfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sbGVjdGlvbnMubGVuZ3RoID4gNFwiIGNsYXNzPVwidG9nZ2xlLWNhdGVnb3JpZXNcIiAoY2xpY2spPVwidG9nZ2xlQ29sbGVjdGlvbnMoKVwiXHJcbiAgICAgICAgICBbc3R5bGUuY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b2dnbGUtdGV4dFwiPlxyXG4gICAgICAgICAgICB7eyBzaG93QWxsQ29sbGVjdGlvbnMgPyAnU2hvdyBMZXNzJyA6ICdTaG93IE1vcmUnIH19XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHJvcGRvd24taWNvblwiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2hvd0FsbENvbGxlY3Rpb25zXCI+PG1hdC1pY29uPmV4cGFuZF9tb3JlPC9tYXQtaWNvbj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0FsbENvbGxlY3Rpb25zXCI+PG1hdC1pY29uPmV4cGFuZF9sZXNzPC9tYXQtaWNvbj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzLXNlY3Rpb25cIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMgaGVhZGluZy1zbWFsbCBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgICAoY2xpY2spPVwicmF0aW5nc0NvbGxhcHNlZCA9ICFyYXRpbmdzQ29sbGFwc2VkXCIgc3R5bGU9XCJjdXJzb3I6cG9pbnRlclwiPlxyXG4gICAgICAgIDxoNj48Yj5SYXRpbmdzPC9iPjwvaDY+XHJcbiAgICAgICAgPG1hdC1pY29uPnt7IHJhdGluZ3NDb2xsYXBzZWQgPyAnZXhwYW5kX21vcmUnIDogJ2V4cGFuZF9sZXNzJyB9fTwvbWF0LWljb24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXJhdGluZ3NDb2xsYXBzZWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktb3B0aW9uc1wiICpuZ0Zvcj1cImxldCByYXRpbmcgb2YgcmF0aW5nT3B0aW9uc1wiIChjbGljayk9XCJvblJhdGluZ0NoYW5nZShyYXRpbmcpXCI+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJjaGVjay1jb2xvclwiIFtzdHlsZS4tLWNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJyYXRpbmcuc2VsZWN0ZWRcIiAvPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRyaW0tdGV4dFwiPnt7IHJhdGluZy5sYWJlbCB9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzLXNlY3Rpb25cIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMgaGVhZGluZy1zbWFsbCBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgICAoY2xpY2spPVwicHJpY2VDb2xsYXBzZWQgPSAhcHJpY2VDb2xsYXBzZWRcIiBzdHlsZT1cImN1cnNvcjpwb2ludGVyXCI+XHJcbiAgICAgICAgPGg2PjxiPlNob3AgYnkgcHJpY2U8L2I+PC9oNj5cclxuICAgICAgICA8bWF0LWljb24+e3sgcHJpY2VDb2xsYXBzZWQgPyAnZXhwYW5kX21vcmUnIDogJ2V4cGFuZF9sZXNzJyB9fTwvbWF0LWljb24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXByaWNlQ29sbGFwc2VkXCI+XHJcbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2F0ZWdvcnktb3B0aW9uc1wiICpuZ0Zvcj1cImxldCByYW5nZSBvZiBwcmljZVJhbmdlcztsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJjaGVjay1jb2xvclwiIFtzdHlsZS4tLWNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJhbmdlLnNlbGVjdGVkXCIgKGNoYW5nZSk9XCJvblByaWNlUmFuZ2VDaGFuZ2UoaSlcIiAvPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRyaW0tdGV4dFwiPnt7IHJhbmdlLmxhYmVsIH19PC9kaXY+XHJcbiAgICAgICAgPC9sYWJlbD5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuXHJcblxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzLXNlY3Rpb25cIiAqbmdJZj1cInRvU2hvd0luSmV3ZWxsZXJ5XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzIGhlYWRpbmctc21hbGwgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAgICAgKGNsaWNrKT1cInByb2R1Y3RUeXBlQ29sbGFwc2VkID0gIXByb2R1Y3RUeXBlQ29sbGFwc2VkXCIgc3R5bGU9XCJjdXJzb3I6cG9pbnRlclwiPlxyXG4gICAgICAgIDxoNj48Yj5Qcm9kdWN0IFR5cGU8L2I+PC9oNj5cclxuICAgICAgICA8bWF0LWljb24+e3sgcHJvZHVjdFR5cGVDb2xsYXBzZWQgPyAnZXhwYW5kX21vcmUnIDogJ2V4cGFuZF9sZXNzJyB9fTwvbWF0LWljb24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXByb2R1Y3RUeXBlQ29sbGFwc2VkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LW9wdGlvbnNcIiAqbmdGb3I9XCJsZXQgc2l6ZSBvZiBwcm9kdWN0VHlwZXNEYXRhXCI+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJjaGVjay1jb2xvclwiIFtzdHlsZS4tLWNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJzaXplLnN0YXR1c1wiIChjaGFuZ2UpPVwidG9nZ2xlUHJvZHVjdFNpemUoc2l6ZSlcIiAvPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRyaW0tdGV4dFwiPnt7IHNpemUuc2l6ZSB9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzLXNlY3Rpb25cIiAqbmdJZj1cInRvU2hvd0luSmV3ZWxsZXJ5XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzIGhlYWRpbmctc21hbGwgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAgICAgKGNsaWNrKT1cInNob3BGb3JDb2xsYXBzZWQgPSAhc2hvcEZvckNvbGxhcHNlZFwiIHN0eWxlPVwiY3Vyc29yOnBvaW50ZXJcIj5cclxuICAgICAgICA8aDY+PGI+U2hvcCBmb3I8L2I+PC9oNj5cclxuICAgICAgICA8bWF0LWljb24+e3sgc2hvcEZvckNvbGxhcHNlZCA/ICdleHBhbmRfbW9yZScgOiAnZXhwYW5kX2xlc3MnIH19PC9tYXQtaWNvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2hvcEZvckNvbGxhcHNlZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1vcHRpb25zXCIgKm5nRm9yPVwibGV0IHNpemUgb2Ygc2hvcEZvckRhdGFcIj5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImNoZWNrLWNvbG9yXCIgW3N0eWxlLi0tY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgICAgICAgIFtjaGVja2VkXT1cInNpemUuc3RhdHVzXCIgKGNoYW5nZSk9XCJ0b2dnbGVTaG9wU2l6ZShzaXplKVwiIC8+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJpbS10ZXh0XCI+e3sgc2l6ZS5zaXplIH19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMtc2VjdGlvblwiICpuZ0lmPVwidG9TaG93SW5KZXdlbGxlcnlcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMgaGVhZGluZy1zbWFsbCBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgICAoY2xpY2spPVwibWF0ZXJpYWxDb2xsYXBzZWQgPSAhbWF0ZXJpYWxDb2xsYXBzZWRcIiBzdHlsZT1cImN1cnNvcjpwb2ludGVyXCI+XHJcbiAgICAgICAgPGg2PjxiPk1hdGVyaWFsPC9iPjwvaDY+XHJcbiAgICAgICAgPG1hdC1pY29uPnt7IG1hdGVyaWFsQ29sbGFwc2VkID8gJ2V4cGFuZF9tb3JlJyA6ICdleHBhbmRfbGVzcycgfX08L21hdC1pY29uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtYXRlcmlhbENvbGxhcHNlZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1vcHRpb25zXCIgKm5nRm9yPVwibGV0IHNpemUgb2YgbWF0ZXJpYWxTaXplRGF0YVwiPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiY2hlY2stY29sb3JcIiBbc3R5bGUuLS1jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgICAgICAgW2NoZWNrZWRdPVwic2l6ZS5zdGF0dXNcIiAoY2hhbmdlKT1cInRvZ2dsZU1hdGVyaWFsU2l6ZShzaXplKVwiIC8+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJpbS10ZXh0XCI+e3sgc2l6ZS5zaXplIH19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMtc2VjdGlvblwiICpuZ0lmPVwidG9TaG93SW5KZXdlbGxlcnlcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMgaGVhZGluZy1zbWFsbCBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgICAoY2xpY2spPVwibWV0YWxDb2xsYXBzZWQgPSAhbWV0YWxDb2xsYXBzZWRcIiBzdHlsZT1cImN1cnNvcjpwb2ludGVyXCI+XHJcbiAgICAgICAgPGg2PjxiPk1ldGFsPC9iPjwvaDY+XHJcbiAgICAgICAgPG1hdC1pY29uPnt7IG1ldGFsQ29sbGFwc2VkID8gJ2V4cGFuZF9tb3JlJyA6ICdleHBhbmRfbGVzcycgfX08L21hdC1pY29uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtZXRhbENvbGxhcHNlZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1vcHRpb25zXCIgKm5nRm9yPVwibGV0IHNpemUgb2YgbWV0YWxTaXplRGF0YVwiPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiY2hlY2stY29sb3JcIiBbc3R5bGUuLS1jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgICAgICAgW2NoZWNrZWRdPVwic2l6ZS5zdGF0dXNcIiAoY2hhbmdlKT1cInRvZ2dsZU1ldGFsU2l6ZShzaXplKVwiIC8+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJpbS10ZXh0XCI+e3sgc2l6ZS5zaXplIH19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMtc2VjdGlvblwiICpuZ0lmPVwidG9TaG93SW5KZXdlbGxlcnlcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMgaGVhZGluZy1zbWFsbCBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgICAoY2xpY2spPVwicmluZ1N0eWxlQ29sbGFwc2VkID0gIXJpbmdTdHlsZUNvbGxhcHNlZFwiIHN0eWxlPVwiY3Vyc29yOnBvaW50ZXJcIj5cclxuICAgICAgICA8aDY+PGI+UmluZyBTdHlsZTwvYj48L2g2PlxyXG4gICAgICAgIDxtYXQtaWNvbj57eyByaW5nU3R5bGVDb2xsYXBzZWQgPyAnZXhwYW5kX21vcmUnIDogJ2V4cGFuZF9sZXNzJyB9fTwvbWF0LWljb24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXJpbmdTdHlsZUNvbGxhcHNlZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1vcHRpb25zXCIgKm5nRm9yPVwibGV0IHNpemUgb2YgcmluZ1NpemVzXCI+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJjaGVjay1jb2xvclwiIFtzdHlsZS4tLWNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJzaXplLnN0YXR1c1wiIChjaGFuZ2UpPVwidG9nZ2xlU2l6ZShzaXplKVwiIC8+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJpbS10ZXh0XCI+e3sgc2l6ZS5zaXplIH19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9zZWN0aW9uPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNTb3J0aW5nU2VjdGlvbj5cclxuICA8c2VjdGlvbiBzdHlsZT1cInBhZGRpbmc6IDEwcHhcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzIGhlYWRpbmctc21hbGwgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW0tY2VudGVyIFwiIHN0eWxlPVwicGFkZGluZzogMHB4O1wiPlxyXG4gICAgICA8c3Bhbj5Tb3J0IGJ5PC9zcGFuPlxyXG4gICAgICA8bWF0LWljb24gKGNsaWNrKT1cImNsb3NlRGlhbG9nKClcIj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxtYXQtcmFkaW8tZ3JvdXAgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW5cIiBbKG5nTW9kZWwpXT1cInNvcnRCeVwiPlxyXG4gICAgICA8bWF0LXJhZGlvLWJ1dHRvbiAqbmdGb3I9XCJsZXQgc29ydGluZ1R5cGUgb2YgZmlsdGVyaW5nQXJyYXlcIiAoY2xpY2spPVwic2VsZWN0T3B0aW9uKHNvcnRpbmdUeXBlLCAkZXZlbnQpXCJcclxuICAgICAgICBbdmFsdWVdPVwic29ydGluZ1R5cGUudmFsdWVcIj57e3NvcnRpbmdUeXBlLm5hbWV9fTwvbWF0LXJhZGlvLWJ1dHRvbj5cclxuICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxyXG4gIDwvc2VjdGlvbj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjUHJvZHVjdERlc2MgbGV0LXByb2R1Y3Q9XCJkYXRhXCIgbGV0LWluZGV4PVwiaW5kZXhcIj5cclxuICA8bmctdGVtcGxhdGUgI3RoZW1lMXN0eWxlMT5cclxuICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWNhcmQgcG9zaXRpb24tcmVsYXRpdmUgaC0xMDBcIiBbbmdDbGFzc109XCJ7J2hvdmVyLWVmZmVjdCc6IHN0eWxlcz8udGhlbWUgPT0gdGhlbWUuVGhlbWUxfVwiPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiIShwcm9kdWN0Lml0ZW1JbWFnZXM/Lmxlbmd0aCAmJiBwcm9kdWN0Lml0ZW1JbWFnZXM/LlswXT8uaW1nVXJsKVwiXHJcbiAgICAgICAgY2xhc3M9XCJkZWZhdWx0LWltYWdlIHBvc2l0aW9uLXJlbGF0aXZlXCI+XHJcbiAgICAgICAgPGltZyBsb2FkaW5nPVwibGF6eVwiIHNyYz1cImh0dHBzOi8vaS5wb3N0aW1nLmNjL2hQUzJKcFYwL25vLWltYWdlLWF2YWlsYWJsZS5qcGdcIiBhbHQ9XCJcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cInByb2NlZWRUb1Byb2R1Y3REZXNjKHByb2R1Y3QpXCIgW3NpbXBvQmFja2dyb3VuZF09XCJzdHlsZXM/LmJhY2tncm91bmRcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiRmF2b3VyaXRlVGFnczsgY29udGV4dDoge2RhdGE6IHByb2R1Y3R9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlRhZ3M7IGNvbnRleHQ6IHtkYXRhOiBwcm9kdWN0fVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJwcm9kdWN0Lml0ZW1JbWFnZXM/Lmxlbmd0aCAmJiBwcm9kdWN0Lml0ZW1JbWFnZXM/LlswXT8uaW1nVXJsXCJcclxuICAgICAgICBjbGFzcz1cImRlZmF1bHQtaW1hZ2UgcG9zaXRpb24tcmVsYXRpdmVcIj5cclxuICAgICAgICA8aW1nIGxvYWRpbmc9XCJsYXp5XCIgb25lcnJvcj1cInRoaXMuc3JjPSdodHRwczovL2kucG9zdGltZy5jYy9oUFMySnBWMC9uby1pbWFnZS1hdmFpbGFibGUuanBnJ1wiXHJcbiAgICAgICAgICBbc3JjXT1cImdldFByb2R1Y3RJbWFnZXMocHJvZHVjdClcIiBhbHQ9XCJcIiBjbGFzcz1cInByb2R1Y3QtaW1nXCIgW2NsYXNzLmZhZGUtb3V0XT1cImltYWdlSW5kZXggPT0gaW5kZXhcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cInByb2NlZWRUb1Byb2R1Y3REZXNjKHByb2R1Y3QpXCIgW3NpbXBvQmFja2dyb3VuZF09XCJzdHlsZXM/LmJhY2tncm91bmRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2Fyb3VzZWwtYnV0dG9uc1wiICpuZ0lmPVwicHJvZHVjdC5pdGVtSW1hZ2VzPy5sZW5ndGggPiAxXCI+XHJcbiAgICAgICAgICA8ZGl2PjxtYXQtaWNvbiAoY2xpY2spPVwiY2hhbmdlSW1hZ2UocHJvZHVjdCwgJ1BSRVYnLCBpbmRleClcIj5rZXlib2FyZF9hcnJvd19sZWZ0PC9tYXQtaWNvbj48L2Rpdj5cclxuICAgICAgICAgIDxkaXY+PG1hdC1pY29uIChjbGljayk9XCJjaGFuZ2VJbWFnZShwcm9kdWN0LCAnTkVYVCcsIGluZGV4KVwiPmtleWJvYXJkX2Fycm93X3JpZ2h0PC9tYXQtaWNvbj48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiRmF2b3VyaXRlVGFnczsgY29udGV4dDoge2RhdGE6IHByb2R1Y3R9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlRhZ3M7IGNvbnRleHQ6IHtkYXRhOiBwcm9kdWN0fVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtdC0yIHctMTAwXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInZhcmllbnQtbGlzdFwiICpuZ0lmPVwicHJvZHVjdD8uaXRlbVZhcmlhbnQ/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdmFyaWVudCBvZiBwcm9kdWN0Py5pdGVtVmFyaWFudDsgbGV0IGlkeCA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgIDxpbWcgbG9hZGluZz1cImxhenlcIiBvbmVycm9yPVwidGhpcy5zcmM9J2h0dHBzOi8vaS5wb3N0aW1nLmNjL2hQUzJKcFYwL25vLWltYWdlLWF2YWlsYWJsZS5qcGcnXCJcclxuICAgICAgICAgICAgICBbc3JjXT1cInZhcmllbnQudmFyaWFudEltYWdlcz8uWzBdPy5pbWdVcmxcIiBhbHQ9XCJcIiBjbGFzcz1cInZhcmllbnRcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc2VsZWN0ZWQtdmFyaWVudCc6IHZhcmllbnQudmFyaWFudElkID09IHByb2R1Y3QudmFyaWVudElkfVwiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLmJvcmRlckNvbG9yXT1cInZhcmllbnQudmFyaWFudElkID09IHByb2R1Y3QudmFyaWVudElkID8gJ2JsdWUnIDogJ3RyYW5zcGFyZW50J1wiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFZhcmllbnQocHJvZHVjdCwgdmFyaWVudClcIj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbS1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIiBbc3R5bGUuZGlzcGxheV09XCJ0cnVlID8gJ2Jsb2NrIWltcG9ydGFudCcgOiAnJ1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByaWNlIGJvZHktbGFyZ2UgdGV4dC1sZWZ0IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZy0xMFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtMTZcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJIVE1MXT0nY3VycmVuY3knPjwvc3Bhbj5cclxuICAgICAgICAgICAgICB7e3Byb2R1Y3Q/LnByaWNlPy5zZWxsaW5nUHJpY2UgfCBudW1iZXI6JzEuMi0yJ319XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZzLTE2IHRleHQtc3RhcnRcIj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInByb2R1Y3Q/LnByaWNlPy52YWx1ZSAtIHByb2R1Y3Q/LnByaWNlPy5kaXNjb3VudGVkUHJpY2UgPiAyXCIgY2xhc3M9XCJkaXNjb3VudC1wcmljZVwiPlxyXG4gICAgICAgICAgICAgICAge3twcm9kdWN0Py5wcmljZT8udmFsdWUgfCBudW1iZXI6JzEuMi0yJ319XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwicHJpY2UgZGlzY291bnQtcHJpY2VcIiAqbmdJZj1cInByb2R1Y3Q/LnByaWNlPy5kaXNjb3VudGVkUHJpY2UgPCBwcm9kdWN0Py5wcmljZT8uc2VsbGluZ1ByaWNlXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09J2N1cnJlbmN5Jz48L3NwYW4+XHJcbiAgICAgICAgICAgICAge3twcm9kdWN0LnByaWNlLnNlbGxpbmdQcmljZSB8IG51bWJlcjonMS4yLTInfX1cclxuICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtbmFtZSBoZWFkaW5nLWxhcmdlIHctMTAwIHRleHQtbGVmdCB0cmltLXRleHRcIlxyXG4gICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPnt7IHByb2R1Y3QubmFtZSB9fTwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXRlcmlhbC1pbmZvXCJcclxuICAgICAgICAgICAgKm5nSWY9XCJpc01hdGVyaWFsQmFzZWRQcmljaW5nICYmIChwcm9kdWN0Py5tYXRlcmlhbHM/Lmxlbmd0aCB8fCBwcm9kdWN0Py5iYXNlV2VpZ2h0KVwiPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cInByb2R1Y3Q/Lm1hdGVyaWFscz8uWzBdPy5wdXJpdHlcIj57eyBwcm9kdWN0Lm1hdGVyaWFsc1swXS5wdXJpdHkgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicHJvZHVjdD8ubWF0ZXJpYWxzPy5bMF0/LnB1cml0eSAmJiBwcm9kdWN0Py5iYXNlV2VpZ2h0XCI+IMK3IDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJwcm9kdWN0Py5iYXNlV2VpZ2h0XCI+e3sgcHJvZHVjdC5iYXNlV2VpZ2h0IH19Zzwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgKm5nSWY9XCJjb250ZW50Py5kaXNwbGF5Py5zaG93QnV0dG9uICYmICFlY29tQ29uZmlncz8uYXBwb2ludG1lbnRCb29raW5nRW5hYmxlZCAmJiBwcm9kdWN0Lml0ZW1JbnZlbnRvcnk/Lm9wZW5pbmdTdG9jayA+IDBcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImFkZC10by1jYXJ0LWJ0blwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2VuZC1idG4gZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHAtMlwiIFtidXR0b25EYXRhXT1cImJ1dHRvbj8uY29udGVudFwiXHJcbiAgICAgICAgICAgICAgc2ltcG9CdXR0b25EaXJlY3RpdmUgW3NlY3Rpb25JZF09XCJkYXRhPy5pZFwiIFtjb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgICAgICAgICBbYmFja2dyb3VuZEluZm9dPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kXCIgW2FwcEJ1dHRvbkVkaXRvcl09XCJlZGl0ID8/IGZhbHNlXCJcclxuICAgICAgICAgICAgICBbYnV0dG9uU3R5bGVdPVwiZ2V0QnV0dG9uU3R5bGUoMSlcIiBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMSlcIiBbaWRdPVwiZGF0YT8uaWQrZ2V0QnV0dG9uSWQoMSlcIlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiKCFwcm9kdWN0LnF1YW50aXR5ICYmICFpc0l0ZW1PdXRPZlN0b2NrKHByb2R1Y3QpKSAmJiBJc0Vjb21tZXJjZVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZEl0ZW1Ub0NhcnQoJGV2ZW50LCBwcm9kdWN0LCAnQUREJylcIj5BZGQgdG8gQ2FydDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIUlzRWNvbW1lcmNlXCIgW2J1dHRvbkRhdGFdPVwiYnV0dG9uPy5jb250ZW50XCIgc2ltcG9CdXR0b25EaXJlY3RpdmUgW3NlY3Rpb25JZF09XCJkYXRhPy5pZFwiXHJcbiAgICAgICAgICAgICAgW2NvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiBbYmFja2dyb3VuZEluZm9dPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kXCJcclxuICAgICAgICAgICAgICBbYXBwQnV0dG9uRWRpdG9yXT1cImVkaXQgPz8gZmFsc2VcIiBbYnV0dG9uU3R5bGVdPVwiZ2V0QnV0dG9uU3R5bGUoMSlcIiBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMSlcIlxyXG4gICAgICAgICAgICAgIFtpZF09XCJkYXRhPy5pZCtnZXRCdXR0b25JZCgxKVwiIChjbGljayk9XCJyYWlzZUxlYWQoKVwiPk5vdGlmeSBNZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVhbnRpdHkgZnVsbC13aWR0aC1xdWFudGl0eVwiIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJnZXRCdXR0b25TdHlsZSgxKT8uYmFja2dyb3VuZFwiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cInRydWUgPyAnMTAwJScgOiAnJ1wiICpuZ0lmPVwicHJvZHVjdC5xdWFudGl0eSAmJiAhaXNJdGVtT3V0T2ZTdG9jayhwcm9kdWN0KVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hhbmdlLXF1YW50aXR5XCIgW3N0eWxlLmJhY2tncm91bmRdPVwiZ2V0QnV0dG9uU3R5bGUoMSk/LmJhY2tncm91bmRcIlxyXG4gICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImdldEJ1dHRvblN0eWxlKDEpPy50ZXh0Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZEl0ZW1Ub0NhcnQoJGV2ZW50LCBwcm9kdWN0LCAnU1VCU1RSQUNUJylcIj4tPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwid2lkdGg6IDcwJTtcIj57e3Byb2R1Y3QucXVhbnRpdHl9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoYW5nZS1xdWFudGl0eVwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImdldEJ1dHRvblN0eWxlKDEpPy5iYWNrZ3JvdW5kXCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJnZXRCdXR0b25TdHlsZSgxKT8udGV4dENvbG9yXCIgKGNsaWNrKT1cImFkZEl0ZW1Ub0NhcnQoJGV2ZW50LCBwcm9kdWN0LCAnQUREJylcIj4rPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBkaXNhYmxlZCBjbGFzcz1cIm91dC1vZi1zdG9ja1wiICpuZ0lmPVwiaXNJdGVtT3V0T2ZTdG9jayhwcm9kdWN0KVwiPk91dCBPZiBTdG9jazwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJ5LWJ1dHRvbi1zZWN0aW9uXCJcclxuICAgICAgICAgICAgKm5nSWY9XCJjb250ZW50Py5kaXNwbGF5Py5zaG93QnV0dG9uICYmIGVjb21Db25maWdzPy5hcHBvaW50bWVudEJvb2tpbmdFbmFibGVkICYmIHByb2R1Y3Q/Lml0ZW1JbnZlbnRvcnk/Lm9wZW5pbmdTdG9jayA+IDBcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRyeS1hdC1ob21lXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNlbmQtYnRuIHAtMlwiIFtidXR0b25EYXRhXT1cImJ1dHRvbj8uY29udGVudFwiIHNpbXBvQnV0dG9uRGlyZWN0aXZlIFtzZWN0aW9uSWRdPVwiZGF0YT8uaWRcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFRvVHJpYWxDYXJ0KHByb2R1Y3QpXCIgW2NvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgW2JhY2tncm91bmRJbmZvXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZFwiIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICBbYnV0dG9uU3R5bGVdPVwiZ2V0QnV0dG9uU3R5bGUoMSlcIiBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMSlcIiBbaWRdPVwiZGF0YT8uaWQrZ2V0QnV0dG9uSWQoMSlcIj5UUlkgQVRcclxuICAgICAgICAgICAgICAgIEhPTUU8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2aWRlby1jYWxsLWltYWdlXCI+XHJcbiAgICAgICAgICAgICAgPGltZyBzcmM9XCJodHRwczovL2Qyejk0OTd4cDh4YjEyLmNsb3VkZnJvbnQubmV0L3Byb2QtaW1hZ2VzLzU3ODYwNmMxNzUzNDUwODEwMjYydmlkZW9fQ2FsbC5zdmdcIlxyXG4gICAgICAgICAgICAgICAgYWx0PVwidmlkZW9cIiAoY2xpY2spPVwib3BlbkRpYWxvZ0JveChkaWFsb2dCb3gsIHByb2R1Y3QubmFtZSlcIiAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzY3JlZW5XaWR0aCA8IDQ3NSAmJiBzdHlsZXM/Lm1vYmlsZUNvbHVtbiA9PT0gMTsgZWxzZSB0aGVtZTFzdHlsZTFcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3cgdy0xMDBcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC04IGQtZmxleCBmbGV4LWNvbHVtbiBnYXAtM1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWxlZnRcIiBbc3R5bGUuY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPnt7IHByb2R1Y3QubmFtZSB9fTwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy0xNiB0ZXh0LXN0YXJ0XCI+XHJcbiAgICAgICAgICA8c3BhbiBbaW5uZXJIVE1MXT0nY3VycmVuY3knPjwvc3Bhbj5cclxuICAgICAgICAgIHt7cHJvZHVjdD8ucHJpY2U/LnNlbGxpbmdQcmljZSB8IG51bWJlcjonMS4yLTInfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctNDVcIj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgKm5nSWY9XCJjb250ZW50Py5kaXNwbGF5Py5zaG93QnV0dG9uICYmICFlY29tQ29uZmlncz8uYXBwb2ludG1lbnRCb29raW5nRW5hYmxlZCAmJiBwcm9kdWN0Lml0ZW1JbnZlbnRvcnk/Lm9wZW5pbmdTdG9jayA+IDBcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImFkZC10by1jYXJ0LWJ0biB3LTEwMFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2VuZC1idG4gZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHAtMlwiIFtidXR0b25EYXRhXT1cImJ1dHRvbj8uY29udGVudFwiXHJcbiAgICAgICAgICAgICAgc2ltcG9CdXR0b25EaXJlY3RpdmUgW3NlY3Rpb25JZF09XCJkYXRhPy5pZFwiIFtjb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgICAgICAgICBbYmFja2dyb3VuZEluZm9dPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kXCIgW2FwcEJ1dHRvbkVkaXRvcl09XCJlZGl0ID8/IGZhbHNlXCJcclxuICAgICAgICAgICAgICBbYnV0dG9uU3R5bGVdPVwiZ2V0QnV0dG9uU3R5bGUoMSlcIiBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMSlcIiBbaWRdPVwiZGF0YT8uaWQrZ2V0QnV0dG9uSWQoMSlcIlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiKCFwcm9kdWN0LnF1YW50aXR5ICYmICFpc0l0ZW1PdXRPZlN0b2NrKHByb2R1Y3QpKSAmJiBJc0Vjb21tZXJjZVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZEl0ZW1Ub0NhcnQoJGV2ZW50LCBwcm9kdWN0LCAnQUREJylcIj5BZGQgdG8gQ2FydDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIUlzRWNvbW1lcmNlXCIgW2J1dHRvbkRhdGFdPVwiYnV0dG9uPy5jb250ZW50XCIgc2ltcG9CdXR0b25EaXJlY3RpdmUgW3NlY3Rpb25JZF09XCJkYXRhPy5pZFwiXHJcbiAgICAgICAgICAgICAgW2NvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiBbYmFja2dyb3VuZEluZm9dPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kXCJcclxuICAgICAgICAgICAgICBbYXBwQnV0dG9uRWRpdG9yXT1cImVkaXQgPz8gZmFsc2VcIiBbYnV0dG9uU3R5bGVdPVwiZ2V0QnV0dG9uU3R5bGUoMSlcIiBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMSlcIlxyXG4gICAgICAgICAgICAgIFtpZF09XCJkYXRhPy5pZCtnZXRCdXR0b25JZCgxKVwiIChjbGljayk9XCJyYWlzZUxlYWQoKVwiPk5vdGlmeSBNZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVhbnRpdHkgZnVsbC13aWR0aC1xdWFudGl0eSBici04XCIgW3N0eWxlLmJvcmRlckNvbG9yXT1cImdldEJ1dHRvblN0eWxlKDEpPy5iYWNrZ3JvdW5kXCJcclxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwidHJ1ZSA/ICcxMDAlJyA6ICcnXCIgKm5nSWY9XCJwcm9kdWN0LnF1YW50aXR5ICYmICFpc0l0ZW1PdXRPZlN0b2NrKHByb2R1Y3QpXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGFuZ2UtcXVhbnRpdHkgdy0zNSBici04XCIgW3N0eWxlLmJhY2tncm91bmRdPVwiZ2V0QnV0dG9uU3R5bGUoMSk/LmJhY2tncm91bmRcIlxyXG4gICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImdldEJ1dHRvblN0eWxlKDEpPy50ZXh0Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZEl0ZW1Ub0NhcnQoJGV2ZW50LCBwcm9kdWN0LCAnU1VCU1RSQUNUJylcIj4tPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwid2lkdGg6IDcwJTtcIj57e3Byb2R1Y3QucXVhbnRpdHl9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoYW5nZS1xdWFudGl0eSB3LTM1IGJyLThcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJnZXRCdXR0b25TdHlsZSgxKT8uYmFja2dyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiZ2V0QnV0dG9uU3R5bGUoMSk/LnRleHRDb2xvclwiIChjbGljayk9XCJhZGRJdGVtVG9DYXJ0KCRldmVudCwgcHJvZHVjdCwgJ0FERCcpXCI+Kzwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDxidXR0b24gZGlzYWJsZWQgY2xhc3M9XCJvdXQtb2Ytc3RvY2sgdy0xMDBcIiAqbmdJZj1cImlzSXRlbU91dE9mU3RvY2socHJvZHVjdClcIj5PdXQgT2YgU3RvY2s8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRyeS1idXR0b24tc2VjdGlvbiB3LTEwMFwiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiY29udGVudD8uZGlzcGxheT8uc2hvd0J1dHRvbiAmJiBlY29tQ29uZmlncz8uYXBwb2ludG1lbnRCb29raW5nRW5hYmxlZCAmJiBwcm9kdWN0Py5pdGVtSW52ZW50b3J5Py5vcGVuaW5nU3RvY2sgPiAwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0cnktYXQtaG9tZVwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzZW5kLWJ0biBwLTJcIiBbYnV0dG9uRGF0YV09XCJidXR0b24/LmNvbnRlbnRcIiBzaW1wb0J1dHRvbkRpcmVjdGl2ZSBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRUb1RyaWFsQ2FydChwcm9kdWN0KVwiIFtjb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgICAgICAgICAgIFtiYWNrZ3JvdW5kSW5mb109XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmRcIiBbYXBwQnV0dG9uRWRpdG9yXT1cImVkaXQgPz8gZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgW2J1dHRvblN0eWxlXT1cImdldEJ1dHRvblN0eWxlKDEpXCIgW2J1dHRvbklkXT1cImdldEJ1dHRvbklkKDEpXCIgW2lkXT1cImRhdGE/LmlkK2dldEJ1dHRvbklkKDEpXCI+VFJZIEFUXHJcbiAgICAgICAgICAgICAgICBIT01FPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmlkZW8tY2FsbC1pbWFnZVwiPlxyXG4gICAgICAgICAgICAgIDxpbWcgc3JjPVwiaHR0cHM6Ly9kMno5NDk3eHA4eGIxMi5jbG91ZGZyb250Lm5ldC9wcm9kLWltYWdlcy81Nzg2MDZjMTc1MzQ1MDgxMDI2MnZpZGVvX0NhbGwuc3ZnXCJcclxuICAgICAgICAgICAgICAgIGFsdD1cInZpZGVvXCIgKGNsaWNrKT1cIm9wZW5EaWFsb2dCb3goZGlhbG9nQm94LCBwcm9kdWN0Lm5hbWUpXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNCBoLTEwMCBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICAgIDxpbWcgbG9hZGluZz1cImxhenlcIiBvbmVycm9yPVwidGhpcy5zcmM9J2h0dHBzOi8vaS5wb3N0aW1nLmNjL2hQUzJKcFYwL25vLWltYWdlLWF2YWlsYWJsZS5qcGcnXCJcclxuICAgICAgICAgIFtzcmNdPVwiZ2V0UHJvZHVjdEltYWdlcyhwcm9kdWN0KVwiIGFsdD1cIlwiIGNsYXNzPVwidy1oLTExMFwiIFtjbGFzcy5mYWRlLW91dF09XCJpbWFnZUluZGV4ID09IGluZGV4XCJcclxuICAgICAgICAgIChjbGljayk9XCJwcm9jZWVkVG9Qcm9kdWN0RGVzYyhwcm9kdWN0KVwiPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuXHJcblxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcblxyXG5cclxuXHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjZGlhbG9nQm94PlxyXG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIGQtZmxleCBhbGlnbi1pdGVtLWNlbnRlclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaGVhZGluZy12aWRlbyB3LTEwMCBweS0yIHRleHQtY2VudGVyXCI+TGl2ZSBWaWRlbyBjYWxsIGF0IHlvdXIgY29udmVuaWVuY2UhPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzY2hlZHVsZS1oZWFkZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtZW5kIHAtMlwiPlxyXG4gICAgICAgIDxtYXQtaWNvbiAoY2xpY2spPVwibWF0Q2xvc2VEaWFsb2coKVwiXHJcbiAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBmLTE4XCI+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHkgaC0xMDBcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBoLTEwMCB3LTEwMCB2aWRlby1jYWxsLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBoLTEwMFwiICpuZ0lmPVwiIWlzTW9iaWxlXCI+XHJcbiAgICAgICAgICA8aW1nXHJcbiAgICAgICAgICAgIHNyYz1cImh0dHBzOi8vZDJ6OTQ5N3hwOHhiMTIuY2xvdWRmcm9udC5uZXQvcHJvZC1pbWFnZXMvNTU3Njk5YzE3NTM3Nzk1MDM5MTNmcmVlcGlrLW92ZXJoZWFkLXNob3QtYS1wZXJzb24taG9sZGluZy1hLXNtYXJ0cGhvbmUtd2l0aC1hLTEwMjlfdm1nOEdxSGogKG9ubGluZS12aWRlby1jdXR0ZXIuY29tKS5naWZcIlxyXG4gICAgICAgICAgICBhbHQ9XCJcIiBjbGFzcz1cInctMTAwIGgtMTAwXCIgc3R5bGU9XCJvYmplY3QtZml0OiBjb3ZlcjtcIj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgcG9zaXRpb24tcmVsYXRpdmUgaC0xMDAgY2FsbC1kZXRhaWxzXCI+XHJcbiAgICAgICAgICA8IS0tIE5hbWUgSW5wdXQgd2l0aCBWYWxpZGF0aW9uIC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWZpZWxkIG15LTNcIiBbY2xhc3MuZXJyb3ItYm9yZGVyXT1cInZhbGlkYXRpb25FcnJvcnMudXNlcm5hbWVcIj5cclxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBOYW1lKlwiIFsobmdNb2RlbCldPVwidmlkZW9DYWxsUGF5bG9hZC51c2VybmFtZVwiXHJcbiAgICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJ3VzZXJuYW1lJylcIj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImlucHV0LWZpZWxkIG15LTNcIiBbY2xhc3MuZXJyb3ItYm9yZGVyXT1cInZhbGlkYXRpb25FcnJvcnMuZW1haWxcIj5cclxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJlbWFpbFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgRW1haWwqXCIgWyhuZ01vZGVsKV09XCJ2aWRlb0NhbGxQYXlsb2FkLmVtYWlsXCJcclxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25JbnB1dENoYW5nZSgnZW1haWwnKVwiPlxyXG4gICAgICAgICAgPC9kaXY+IC0tPlxyXG5cclxuICAgICAgICAgIDwhLS0gTW9iaWxlIE51bWJlciBJbnB1dCB3aXRoIFZhbGlkYXRpb24gLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZmllbGQgbXktM1wiIFtjbGFzcy5lcnJvci1ib3JkZXJdPVwidmFsaWRhdGlvbkVycm9ycy5tb2JpbGVOdW1iZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi10ZXh0LWNhbGxcIj5JTiArOTE8L2Rpdj5cclxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBwbGFjZWhvbGRlcj1cIkVudGVyIE1vYmlsZSpcIiBbKG5nTW9kZWwpXT1cInZpZGVvQ2FsbFBheWxvYWQubW9iaWxlTnVtYmVyXCJcclxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25JbnB1dENoYW5nZSgnbW9iaWxlTnVtYmVyJylcIj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgICA8IS0tIFBpbmNvZGUgSW5wdXQgd2l0aCBWYWxpZGF0aW9uXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZmllbGQgbXktM1wiIFtjbGFzcy5lcnJvci1ib3JkZXJdPVwidmFsaWRhdGlvbkVycm9ycy5waW5jb2RlXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItdGV4dC1jYWxsIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHctMTIgYm9yZGVyLXVuc2V0XCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiZi0xOCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5ncHNfZml4ZWQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBwbGFjZWhvbGRlcj1cIkVudGVyIFBpbiBDb2RlKlwiIGNsYXNzPVwidy04OFwiIFsobmdNb2RlbCldPVwidmlkZW9DYWxsUGF5bG9hZC5waW5jb2RlXCJcclxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25JbnB1dENoYW5nZSgncGluY29kZScpXCI+XHJcbiAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFuZ3VhZ2UgbXktM1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWluaS10ZXh0IG1iLTJcIj5MYW5ndWFnZSBQcmVmZXJlbmNlPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYW5ndWFnZS1jb250YWluZXIgZC1mbGV4IGdhcC0yIGZsZXgtd3JhcCBtdC0xXCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgbGFuZyBvZiBsYW5ndWFnZXNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYW5nIHB4LTIgcHktMSByb3VuZGVkIGN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwibGFuZyA9PSBzZWxlY3RlZExhbmcgPyBkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0ZWRMYW5nID0gbGFuZ1wiXHJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJsYW5nID09IHNlbGVjdGVkTGFuZyA/IGdldFRleHRDb2xvcihkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yKSA6ICcjMDAwMDAwJ1wiPlxyXG4gICAgICAgICAgICAgICAgICB7e2xhbmd9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRMYW5nID09ICdPdGhlcnMnXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1maWVsZCBteS0zXCI+XHJcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBPdGhlciBMYW5ndWFnZVwiIFsobmdNb2RlbCldPVwib3RoZXJMYW5ndWFnZVwiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInZpZGVvLWJ0biBtdC0yIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiIChjbGljayk9XCJzY2hlZHVsZVZpZGVvQ2FsbCgpXCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzU3VibWl0dGluZ1wiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiBbc3R5bGUuY29sb3JdPVwiZ2V0VGV4dENvbG9yKGRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IpXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1N1Ym1pdHRpbmdcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgc3Bpbm5lci1ib3JkZXItc20gbWUtMlwiIHJvbGU9XCJzdGF0dXNcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+TG9hZGluZy4uLjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICBTQ0hFRFVMSU5HLi4uXHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzU3VibWl0dGluZyAmJiAhc2NoZWR1bGVkXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1pY29uPnZpZGVvX2NhbGw8L21hdC1pY29uPiZuYnNwO1xyXG4gICAgICAgICAgICAgIFNDSEVEVUxFIEEgVklERU8gQ0FMTFxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNjaGVkdWxlZFwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5jaGVja19jaXJjbGU8L21hdC1pY29uPiZuYnNwO1xyXG4gICAgICAgICAgICAgIFNDSEVEVUxFRCBTVUNDRVNTRlVMTFlcclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=
1169
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpbXBvLXVpL3NyYy9saWIvZWNvbW1lcmNlL3NlY3Rpb25zL3Byb2R1Y3QtbGlzdC9wcm9kdWN0LWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lY29tbWVyY2Uvc2VjdGlvbnMvcHJvZHVjdC1saXN0L3Byb2R1Y3QtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWEsV0FBVyxFQUFFLFNBQVMsRUFBNkIsWUFBWSxFQUEwQixNQUFNLGVBQWUsQ0FBQztBQUU3SixPQUFPLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLFdBQVcsTUFBTSwrQkFBK0IsQ0FBQztBQUt4RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUN6RixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUUzRCxPQUFP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LEtBQUssRUFBRSxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRTtZQUNuRSxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRTtZQUNyRSxFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRTtZQUN2RSxFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRTtZQUN2RSxFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRTtZQUN2RSxFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRTtZQUN2RSxFQUFFLEtBQUssRUFBRSxxQkFBcUIsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRTtZQUMxRSxFQUFFLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRTtZQUM3RSxFQUFFLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRTtZQUM3RSxFQUFFLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUs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VEZPUk1fSUQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgQWZ0ZXJWaWV3SW5pdCwgSG9zdExpc3RlbmVyLCBUZW1wbGF0ZVJlZiwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJdGVtVmFyaWFudCwgUHJvZHVjdCB9IGZyb20gJy4uLy4uL3N0eWxlcy9wcm9kdWN0Lm1vZGFsJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSwgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBBbmltYXRpb25EaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvYW5pbWF0aW9uLWRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBIb3ZlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9ob3Zlci1lbGVtZW50LWRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDb250ZW50Rml0RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2NvbnRlbnQtZml0LWRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTaW1wb0NvbXBvbmVudE1vZHVsZSB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvaW5kZXgnO1xuaW1wb3J0IEJhc2VTZWN0aW9uIGZyb20gJy4uLy4uLy4uL3NlY3Rpb25zL0Jhc2VTZWN0aW9uJztcbmltcG9ydCB7IFByb2R1Y3RMaXN0Q29udGVudE1vZGFsLCBQcm9kdWN0TGlzdE1vZGFsLCBQcm9kdWN0TGlzdFN0eWxlc01vZGFsIH0gZnJvbSAnLi9wcm9kdWN0LWxpc3QubW9kYWwnO1xuaW1wb3J0IHsgRXZlbnRzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2V2ZW50cy5zZXJ2aWNlJztcbmltcG9ydCB7IFJlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcmVzdC5zZXJ2aWNlJztcbmltcG9ydCB7IEJhY2tncm91bmRNb2RlbCwgQnV0dG9uTW9kZWwsIExheU91dE1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vc3R5bGVzL3N0eWxlLm1vZGVsJztcbmltcG9ydCB7IEJ1dHRvbkRpcmVjdGl2ZURpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9idXR0b24tZGlyZWN0aXZlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBNYXRJY29uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRTbGlkZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbGlkZXInO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xuaW1wb3J0IHsgUGFnbmluYXRpb25Db21wb25lbnQgfSBmcm9tICcuLi9wYWduaW5hdGlvbi9wYWduaW5hdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgT3JkZXJlZEl0ZW1zIH0gZnJvbSAnLi4vLi4vc3R5bGVzL09yZGVyZWRJdGVtcy5tb2RhbCc7XG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9zdG9yYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWF0Qm90dG9tU2hlZXQsIE1hdEJvdHRvbVNoZWV0TW9kdWxlLCBNYXRCb3R0b21TaGVldFJlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2JvdHRvbS1zaGVldCc7XG5pbXBvcnQgeyBNYXRSYWRpb01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3JhZGlvJztcbmltcG9ydCB7IE1hdERpYWxvZywgTWF0RGlhbG9nQ29uZmlnIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IEJVU0lORVNTX0NPTlNUQU5UUyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9idXNpbmVzcy5jb25zdGFudCc7XG5pbXBvcnQgeyBGb3JtYXRlQW1vdW50IH0gZnJvbSAnLi4vLi4vLi4vcGlwZXMvYW1vdW50LnBpcGUnO1xuaW1wb3J0IHsgQ2FydFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jYXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVG9hc3RNb2R1bGUgfSBmcm9tICdwcmltZW5nL3RvYXN0JztcbmltcG9ydCB7IE1lbnVJdGVtLCBNZXNzYWdlU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IEJhY2tncm91bmREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvYmFja2dyb3VuZC1kaXJlY3RpdmUnO1xuaW1wb3J0IHsgU3BlZWREaWFsTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9zcGVlZGRpYWwnO1xuaW1wb3J0IHsgU21hbGxQcm9kdWN0TGlzdGluZ0NvbXBvbmVudCB9IGZyb20gXCIuLi9zbWFsbC1wcm9kdWN0LWxpc3Rpbmcvc21hbGwtcHJvZHVjdC1saXN0aW5nLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgUHJvZHVjdENhcmRUaGVtZSB9IGZyb20gJy4uLy4uLy4uL3N0eWxlcy9pbmRleCc7XG5pbXBvcnQgeyBDYXJkU2tlbGV0b25Mb2FkZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9lbGVtZW50cy9jYXJkLXNrZWxldG9uLWxvYWRlci9jYXJkLXNrZWxldG9uLWxvYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29sb3JEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvY29sb3IuZGlyZWN0aXZlJztcbmltcG9ydCB7IE1hdENoaXBzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hpcHMnO1xuaW1wb3J0IHsgQnV0dG9uRWRpdG9yRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2J1dHRvbi1lZGl0b3IuZGlyZWN0aXZlJztcbmltcG9ydCB7IFNwYWNpbmdIb3Jpem9udGFsRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL3NwYWNpbmctaG9yaXpvbnRhbC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQW5hbHl0aWNzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2FuYWx5dGljcy5zZXJ2aWNlJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGZvcmtKb2luLCBvZiB9IGZyb20gJ3J4anMnO1xuXG5pbnRlcmZhY2UgQmFzZU1vZGVsIHtcbiAgb3B0aW9uOiBzdHJpbmcsXG4gIGlkOiBzdHJpbmcsXG4gIGltZ1VybDogc3RyaW5nLFxuICBzdGF0dXM6IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIFJhdGluZ0ZpbHRlck9wdGlvbiB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIG1pbjogbnVtYmVyO1xuICBtYXg6IG51bWJlcjtcbiAgc2VsZWN0ZWQ6IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NpbXBvLXByb2R1Y3QtbGlzdCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIFNpbXBvQ29tcG9uZW50TW9kdWxlLFxuICAgIE1hdFNsaWRlck1vZHVsZSxcbiAgICBBbmltYXRpb25EaXJlY3RpdmUsXG4gICAgU3BlZWREaWFsTW9kdWxlLFxuICAgIEJhY2tncm91bmREaXJlY3RpdmUsXG4gICAgQ29udGVudEZpdERpcmVjdGl2ZSxcbiAgICBIb3ZlckRpcmVjdGl2ZSxcbiAgICBCdXR0b25EaXJlY3RpdmVEaXJlY3RpdmUsXG4gICAgTWF0SWNvbixcbiAgICBNYXRCb3R0b21TaGVldE1vZHVsZSxcbiAgICBNYXRSYWRpb01vZHVsZSxcbiAgICBGb3JtYXRlQW1vdW50LFxuICAgIFRvYXN0TW9kdWxlLFxuICAgIENhcmRTa2VsZXRvbkxvYWRlckNvbXBvbmVudCxcbiAgICBTbWFsbFByb2R1Y3RMaXN0aW5nQ29tcG9uZW50LFxuICAgIENvbG9yRGlyZWN0aXZlLFxuICAgIE1hdENoaXBzTW9kdWxlLFxuICAgIEJ1dHRvbkVkaXRvckRpcmVjdGl2ZSxcbiAgICBTcGFjaW5nSG9yaXpvbnRhbERpcmVjdGl2ZSxcbiAgXSxcbiAgcHJvdmlkZXJzOiBbTWVzc2FnZVNlcnZpY2VdLFxuICB0ZW1wbGF0ZVVybDogJy4vcHJvZHVjdC1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3Byb2R1Y3QtbGlzdC5jb21wb25lbnQuY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBQcm9kdWN0TGlzdENvbXBvbmVudCBleHRlbmRzIEJhc2VTZWN0aW9uIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgQElucHV0KCkgcmVzcG9uc2VEYXRhPzogUHJvZHVjdFtdID0gW107XG4gIEBJbnB1dCgpIGRhdGE/OiBQcm9kdWN0TGlzdE1vZGFsO1xuICBASW5wdXQoKSBpbmRleD86IG51bWJlcjtcbiAgQElucHV0KCkgZWRpdD86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGRlbGV0ZT86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGN1c3RvbUNsYXNzPzogc3RyaW5nO1xuICBASW5wdXQoKSBuZXh0Q29tcG9uZW50Q29sb3I/OiBCYWNrZ3JvdW5kTW9kZWw7XG5cbiAgdGFnSW5kZXhNYXA6IHsgW2l0ZW1JZDogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgcHJpdmF0ZSB0YWdJbnRlcnZhbDogYW55O1xuXG4gIGlzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBhcGlMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIGlzTGlzdExvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNBbGxMaXN0TG9hZGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29udGVudD86IFByb2R1Y3RMaXN0Q29udGVudE1vZGFsO1xuICBidXR0b24/OiBCdXR0b25Nb2RlbDtcbiAgdG90YWxQYWdlczogbnVtYmVyID0gMDtcbiAgc2Nyb2xsaW5nVmFsdWU6IG51bWJlciA9IDA7XG4gIHByaWNpbmdNaW46IG51bWJlciA9IDA7XG4gIHByaWNpbmdNYXg6IG51bWJlciA9IDA7XG4gIG1pblJhdGluZzogbnVtYmVyID0gMDtcbiAgbWF4UmF0aW5nOiBudW1iZXIgPSAwO1xuICBzb3J0Qnk6IHN0cmluZyA9ICcnO1xuICBzZWFyY2hUZXh0OiBzdHJpbmcgPSBcIlwiO1xuXG4gIHByaXZhdGUgVVNFUl9DQVJUOiBPcmRlcmVkSXRlbXNbXSA9IFtdO1xuICBwcml2YXRlIFVTRVJfV0lTSExJU1Q6IE9yZGVyZWRJdGVtc1tdID0gW107XG4gIG1pblByb2R1Y3RQcmljZTogbnVtYmVyID0gMDtcbiAgbWF4UHJvZHVjdFByaWNlOiBudW1iZXIgPSAwO1xuICBmaWx0ZXJlZENoaXBzOiBhbnlbXSA9IFtdXG4gIGZpbHRlcmVkUHJpY2VDaGlwOiBhbnlbXSA9IFtdXG4gIGZpbHRlcmluZ0FycmF5ID0gW1xuICAgIHtcbiAgICAgIG5hbWU6IFwiTGF0ZXN0XCIsIHZhbHVlOiAnJyxcbiAgICB9LFxuICAgIHsgbmFtZTogXCJQcmljZTogTG93IHRvIEhpZ2hcIiwgdmFsdWU6IFwibG93ZXN0UHJpY2VcIiB9LFxuICAgIHsgbmFtZTogXCJQcmljZTogSGlnaCB0byBMb3dcIiwgdmFsdWU6IFwiaGlnaGVzdFByaWNlXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnQ3VzdG9tZXIgcmF0aW5nJywgdmFsdWU6ICdjdXN0b21lclJhdGluZydcbiAgICB9XG4gIF07XG5cbiAgc2NyZWVuV2lkdGg6IG51bWJlciA9IDA7XG4gIGZpbHRlckxpc3Q6IGFueVtdID0gW107XG4gIHN0eWxlcz86IFByb2R1Y3RMaXN0U3R5bGVzTW9kYWw7XG4gIHRvdGFsQ291bnQ6IG51bWJlciA9IDA7XG4gIHBhZ2VObzogbnVtYmVyID0gMTtcbiAgc2l6ZTogbnVtYmVyID0gMjA7XG4gIHNlYXJjaFR4dDogc3RyaW5nID0gXCJcIjtcbiAgdGhlbWUgPSBQcm9kdWN0Q2FyZFRoZW1lO1xuICBpdGVtczogTWVudUl0ZW1bXSB8IG51bGwgPSBudWxsO1xuXG4gIGxhdGVzdEFuYWx5aWNzRXZlbnQ6IHN0cmluZyA9ICdQUk9EVUNUX0xJU1RfVklFVyc7XG5cbiAgcHJpdmF0ZSBmaWx0ZXJCb3R0b21TaGVldFJlZjogTWF0Qm90dG9tU2hlZXRSZWY8dW5rbm93bj4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzb3J0aW5nRGlhbG9nUmVmOiBNYXRCb3R0b21TaGVldFJlZjx1bmtub3duPiB8IG51bGwgPSBudWxsO1xuICBjYXRlZ29yaWVzOiBCYXNlTW9kZWxbXSA9IFtdO1xuICBjb2xsZWN0aW9uczogQmFzZU1vZGVsW10gPSBbXTtcblxuICBpbWFnZUluZGV4OiBudW1iZXIgPSAtMTtcblxuICBAVmlld0NoaWxkKCdsaXN0U2Nyb2xsQ29udGFpbmVyJykgbGlzdFNjcm9sbENvbnRhaW5lciE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIEBIb3N0TGlzdGVuZXIoXCJ3aW5kb3c6cmVzaXplXCIpXG4gIGdldFNjcmVlblNpemUoKSB7XG4gICAgdGhpcy5zY3JlZW5XaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnNjcm9sbCcsIFsnJGV2ZW50J10pXG4gIG9uV2luZG93U2Nyb2xsKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuc2Nyb2xsaW5nVmFsdWUgPSB3aW5kb3cucGFnZVlPZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogT2JqZWN0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2V2ZW50U2VydmljZTogRXZlbnRzU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlc3RTZXJ2aWNlOiBSZXN0U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1hdEJvdHRvbVNoZWV0OiBNYXRCb3R0b21TaGVldCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1hdERpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FydFNlcnZpY2U6IENhcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFuYWx5dGljc1NlcnZpY2U6IEFuYWx5dGljc1NlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgdGhpcy5nZXRTY3JlZW5TaXplKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHN0eWxlc0xheW91dCgpIHtcbiAgICByZXR1cm4geyAuLi50aGlzLnN0eWxlcz8ubGF5b3V0IH0gYXMgTGF5T3V0TW9kZWw7XG4gIH1cblxuICBpc09wZW4gPSBmYWxzZTtcblxuICB0b2dnbGVEcm9wZG93bigpIHtcbiAgICB0aGlzLmlzT3BlbiA9ICF0aGlzLmlzT3BlbjtcbiAgfVxuXG4gIGNsb3NlRHJvcGRvd24oKSB7XG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIC8vIEFkZCB0aGVzZSBjbGFzcy1sZXZlbCBwcm9wZXJ0aWVzIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQ6XG4gIHByaWNlUmFuZ2VzID0gW1xuICAgIHsgbGFiZWw6ICfigrkxLDAwMCAtIOKCuTUsMDAwJywgbWluOiAxMDAwLCBtYXg6IDUwMDAsIHNlbGVjdGVkOiBmYWxzZSB9LFxuICAgIHsgbGFiZWw6ICfigrk1LDAwMCAtIOKCuTE1LDAwMCcsIG1pbjogNTAwMCwgbWF4OiAxNTAwMCwgc2VsZWN0ZWQ6IGZhbHNlIH0sXG4gICAgeyBsYWJlbDogJ+KCuTE1LDAwMCAtIOKCuTI1LDAwMCcsIG1pbjogMTUwMDAsIG1heDogMjUwMDAsIHNlbGVjdGVkOiBmYWxzZSB9LFxuICAgIHsgbGFiZWw6ICfigrkyNSwwMDAgLSDigrkzMCwwMDAnLCBtaW46IDI1MDAwLCBtYXg6IDMwMDAwLCBzZWxlY3RlZDogZmFsc2UgfSxcbiAgICB7IGxhYmVsOiAn4oK5MzAsMDAwIC0g4oK5NTAsMDAwJywgbWluOiAzMDAwMCwgbWF4OiA1MDAwMCwgc2VsZWN0ZWQ6IGZhbHNlIH0sXG4gICAgeyBsYWJlbDogJ+KCuTUwLDAwMCAtIOKCuTc1LDAwMCcsIG1pbjogNTAwMDAsIG1heDogNzUwMDAsIHNlbGVjdGVkOiBmYWxzZSB9LFxuICAgIHsgbGFiZWw6ICfigrk3NSwwMDAgLSDigrkxLDAwLDAwMCcsIG1pbjogNzUwMDAsIG1heDogMTAwMDAwLCBzZWxlY3RlZDogZmFsc2UgfSxcbiAgICB7IGxhYmVsOiAn4oK5MSwwMCwwMDAgLSDigrkyLDAwLDAwMCcsIG1pbjogMTAwMDAwLCBtYXg6IDIwMDAwMCwgc2VsZWN0ZWQ6IGZhbHNlIH0sXG4gICAgeyBsYWJlbDogJ+KCuTIsMDAsMDAwIC0g4oK5MywwMCwwMDAnLCBtaW46IDIwMDAwMCwgbWF4OiAzMDAwMDAsIHNlbGVjdGVkOiBmYWxzZSB9LFxuICAgIHsgbGFiZWw6ICfigrkzLDAwLDAwMCAtIOKCuTQsMDAsMDAwJywgbWluOiAzMDAwMDAsIG1heDogNDAwMDAwLCBzZWxlY3RlZDogZmFsc2UgfSxcbiAgICB7IGxhYmVsOiAn4oK5NCwwMCwwMDAgLSDigrk1LDAwLDAwMCcsIG1pbjogNDAwMDAwLCBtYXg6IDUwMDAwMCwgc2VsZWN0ZWQ6IGZhbHNlIH0sXG4gICAgeyBsYWJlbDogJ+KCuTUsMDAsMDAwIC0g4oK5NiwwMCwwMDAnLCBtaW46IDUwMDAwMCwgbWF4OiA2MDAwMDAsIHNlbGVjdGVkOiBmYWxzZSB9XG4gIF07XG5cbiAgcmF0aW5nT3B0aW9uczogUmF0aW5nRmlsdGVyT3B0aW9uW10gPSBbXG4gICAgeyBsYWJlbDogJzUgU3RhcnMnLCBtaW46IDUsIG1heDogNSwgc2VsZWN0ZWQ6IGZhbHNlIH0sXG4gICAgeyBsYWJlbDogJzQgU3RhcnMgYWJvdmUnLCBtaW46IDQsIG1heDogNSwgc2VsZWN0ZWQ6IGZhbHNlIH0sXG4gICAgeyBsYWJlbDogJzMgU3RhcnMgYWJvdmUnLCBtaW46IDMsIG1heDogNSwgc2VsZWN0ZWQ6IGZhbHNlIH0sXG4gICAgeyBsYWJlbDogJzIgU3RhcnMgYWJvdmUnLCBtaW46IDIsIG1heDogNSwgc2VsZWN0ZWQ6IGZhbHNlIH0sXG4gICAgeyBsYWJlbDogJzEgU3RhciBhYm92ZScsIG1pbjogMSwgbWF4OiA1LCBzZWxlY3RlZDogZmFsc2UgfVxuICBdO1xuXG4gIC8vIENhbGxlZCB3aGVuIHVzZXIgY2hhbmdlcyBwcmljZSByYW5nZSBzZWxlY3Rpb25cbiAgb25QcmljZVJhbmdlQ2hhbmdlKGluZGV4PzogbnVtYmVyKSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRSYW5nZXMgPSB0aGlzLnByaWNlUmFuZ2VzXG4gICAgICAuZmlsdGVyKHJhbmdlID0+IHJhbmdlLnNlbGVjdGVkKVxuICAgICAgLm1hcChyYW5nZSA9PiAoeyBtaW46IHJhbmdlLm1pbiwgbWF4OiByYW5nZS5tYXggfSkpO1xuXG4gICAgaWYgKHNlbGVjdGVkUmFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gTm8gcHJpY2UgZmlsdGVyIGFjdGl2ZSwgcmVzZXQgbWluL21heCB0byB0aGUgZnVsbCByYW5nZVxuICAgICAgdGhpcy5wcmljaW5nTWluID0gdGhpcy5taW5Qcm9kdWN0UHJpY2U7XG4gICAgICB0aGlzLnByaWNpbmdNYXggPSB0aGlzLm1heFByb2R1Y3RQcmljZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2FsY3VsYXRlIGNvbWJpbmVkIG1pbiBhbmQgbWF4IGZyb20gc2VsZWN0ZWQgcmFuZ2VzIOKAlFxuICAgICAgLy8gc2V0IHByaWNpbmdNaW4gYXMgc21hbGxlc3QgbWluIGZyb20gY2hlY2tlZCByYW5nZXMsXG4gICAgICAvLyBwcmljaW5nTWF4IGFzIGxhcmdlc3QgbWF4IGZyb20gY2hlY2tlZCByYW5nZXNcbiAgICAgIHRoaXMucHJpY2luZ01pbiA9IE1hdGgubWluKC4uLnNlbGVjdGVkUmFuZ2VzLm1hcChyID0+IHIubWluKSk7XG4gICAgICB0aGlzLnByaWNpbmdNYXggPSBNYXRoLm1heCguLi5zZWxlY3RlZFJhbmdlcy5tYXAociA9PiByLm1heCkpO1xuICAgIH1cblxuXG4gICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnByaWNlUmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gICBpZiAoaSAhPT0gaW5kZXgpIHtcbiAgICAvLyAgICAgdGhpcy5wcmljZVJhbmdlc1tpXS5zZWxlY3RlZCA9IGZhbHNlO1xuICAgIC8vICAgfVxuICAgIC8vICAgdGhpcy5wcmljaW5nTWluID0gTWF0aC5taW4oLi4udGhpcy5wcmljZVJhbmdlcy5maWx0ZXIociA9PiByLnNlbGVjdGVkKS5tYXAociA9PiByLm1pbikpO1xuICAgIC8vICAgdGhpcy5wcmljaW5nTWF4ID0gTWF0aC5tYXgoLi4udGhpcy5wcmljZVJhbmdlcy5maWx0ZXIociA9PiByLnNlbGVjdGVkKS5tYXAociA9PiByLm1heCkpO1xuICAgIC8vIH1cblxuXG5cblxuICAgIHRoaXMuZmlsdGVyZWRDaGlwcyA9IFtcbiAgICAgIC4uLnRoaXMuc2VsZWN0ZWRDYXRlZ29yeUNvbGxlY3Rpb25DaGlwcy5tYXAoeCA9PiAoeyAuLi54LCB0eXBlOiAnY2F0ZWdvcnlPckNvbGxlY3Rpb24nIH0pKSxcbiAgICAgIC4uLnRoaXMuc2VsZWN0ZWRQcmljZVJhbmdlQ2hpcHMsXG4gICAgXTtcbiAgICAvLyBZb3UgY2FuIGF1dG8tdHJpZ2dlciBmaWx0ZXIgb3Igb25seSBvbiBidXR0b24gY2xpY2sgKHlvdXIgY2hvaWNlKVxuICAgIC8vIEZvciBhdXRvIGZpbHRlciB1bmNvbW1lbnQgbmV4dCBsaW5lOlxuICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcblxuICAgIC8vIEVsc2UsIGZpbHRlcmluZyBoYXBwZW5zIHdoZW4gdXNlciBjbGlja3MgXCJGaWx0ZXJcIiBidXR0b25cbiAgfVxuXG4gIG9uUmF0aW5nQ2hhbmdlKHNlbGVjdGVkUmF0aW5nOiBSYXRpbmdGaWx0ZXJPcHRpb24pIHtcbiAgICBzZWxlY3RlZFJhdGluZy5zZWxlY3RlZCA9ICFzZWxlY3RlZFJhdGluZy5zZWxlY3RlZDtcbiAgICBjb25zdCBzZWxlY3RlZFJhdGluZ3MgPSB0aGlzLnJhdGluZ09wdGlvbnMuZmlsdGVyKChyYXRpbmcpID0+IHJhdGluZy5zZWxlY3RlZCk7XG5cbiAgICBpZiAoc2VsZWN0ZWRSYXRpbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5taW5SYXRpbmcgPSAwO1xuICAgICAgdGhpcy5tYXhSYXRpbmcgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1pblJhdGluZyA9IE1hdGgubWluKC4uLnNlbGVjdGVkUmF0aW5ncy5tYXAoKHJhdGluZykgPT4gcmF0aW5nLm1pbikpO1xuICAgICAgdGhpcy5tYXhSYXRpbmcgPSBNYXRoLm1heCguLi5zZWxlY3RlZFJhdGluZ3MubWFwKChyYXRpbmcpID0+IHJhdGluZy5tYXgpKTtcbiAgICB9XG5cbiAgICB0aGlzLmZpbHRlcmVkQ2hpcHMgPSBbXG4gICAgICAuLi50aGlzLnNlbGVjdGVkQ2F0ZWdvcnlDb2xsZWN0aW9uQ2hpcHMubWFwKHggPT4gKHsgLi4ueCwgdHlwZTogJ2NhdGVnb3J5T3JDb2xsZWN0aW9uJyB9KSksXG4gICAgICAuLi50aGlzLnNlbGVjdGVkUHJpY2VSYW5nZUNoaXBzLFxuICAgICAgLi4udGhpcy5zZWxlY3RlZFJhdGluZ0NoaXBzLFxuICAgIF07XG4gICAgdGhpcy5hcHBseUZpbHRlcigpO1xuICB9XG5cbiAgLy8gTW9kaWZ5IHlvdXIgZXhpc3RpbmcgYXBwbHlGaWx0ZXIoKSBtZXRob2QsIGFkZGluZyBwcmljZSByYW5nZSBsb2dpY1xuICBhcHBseUZpbHRlcihjYXRlZ29yeT86IGFueSwgdHlwZT86ICdTT1JUJyB8ICdGSUxURVInKSB7XG4gICAgdGhpcy5wYWdlTm8gPSAxO1xuXG4gICAgaWYgKHR5cGUgPT09ICdTT1JUJykge1xuICAgICAgdGhpcy5sYXRlc3RBbmFseWljc0V2ZW50ID0gJ1NPUlRfQVBQTElFRCdcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sYXRlc3RBbmFseWljc0V2ZW50ID0gJ0ZJTFRFUl9BUFBMSUVEJ1xuICAgIH1cblxuICAgIC8vIFlvdXIgZXhpc3RpbmcgY2F0ZWdvcnkvZmlsdGVyIHRvZ2dsaW5nXG4gICAgaWYgKHR5cGUgPT09IFwiRklMVEVSXCIgJiYgY2F0ZWdvcnkpIHtcbiAgICAgIGNhdGVnb3J5LnN0YXR1cyA9ICFjYXRlZ29yeS5zdGF0dXM7XG4gICAgICAvLyB0aGlzLmZpbHRlcmVkQ2hpcHMucHVzaCh7bmFtZTogY2F0ZWdvcnkub3B0aW9uLCB0eXBlOiAnY2F0ZWdvcnlPckNvbGxlY3Rpb24nLCBpZDogY2F0ZWdvcnkuaWR9KVxuICAgICAgdGhpcy5maWx0ZXJlZENoaXBzID0gW1xuICAgICAgICAuLi50aGlzLnNlbGVjdGVkQ2F0ZWdvcnlDb2xsZWN0aW9uQ2hpcHMubWFwKHggPT4gKHsgLi4ueCwgdHlwZTogJ2NhdGVnb3J5T3JDb2xsZWN0aW9uJyB9KSksXG4gICAgICAgIC4uLnRoaXMuc2VsZWN0ZWRQcmljZVJhbmdlQ2hpcHMsXG4gICAgICAgIC4uLnRoaXMuc2VsZWN0ZWRSYXRpbmdDaGlwcyxcbiAgICAgIF07XG5cbiAgICB9XG5cbiAgICAvLyBEaXNtaXNzIGJvdHRvbSBzaGVldHMgaWYgb3BlblxuICAgIHRoaXMuZmlsdGVyQm90dG9tU2hlZXRSZWY/LmRpc21pc3MoKTtcbiAgICB0aGlzLnNvcnRpbmdEaWFsb2dSZWY/LmRpc21pc3MoKTtcblxuICAgIC8vIE5vdyB0cmlnZ2VyIGZpbHRlcmluZyB3aXRoIGN1cnJlbnQgc3RhdGUgaW5jbHVkaW5nIHByaWNlIGZpbHRlcnNcbiAgICB0aGlzLmZpbHRlckl0ZW1MaXN0KCk7XG4gIH1cblxuICAvLyBNb2RpZnkgZmlsdGVySXRlbUxpc3QgdG8gc2VuZCB0aGUgY29ycmVjdCBwcmljZSBtaW4gYW5kIG1heDpcbiAgcmFpc2VMZWFkKCkge1xuICAgIGNvbnN0IHVzZXJEZXRhaWxzID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyKCk7XG4gICAgbGV0IHBheWxvYWQgPSB7XG4gICAgICBidXNpbmVzc0lkOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYnVzaW5lc3NJZCcpLFxuICAgICAgZW1haWw6IHVzZXJEZXRhaWxzPy5jb250YWN0Py5lbWFpbCxcbiAgICAgIG1lc3NhZ2U6IFwiXCIsXG4gICAgICBtb2JpbGVObzogXCJcIixcbiAgICAgIG1vcmVJbmZvOiB7XG4gICAgICAgIE5hbWU6IHVzZXJEZXRhaWxzPy5jb250YWN0Py5uYW1lLFxuICAgICAgICBcIk1vYmlsZSBOdW1iZXJcIjogdXNlckRldGFpbHM/LmNvbnRhY3Q/Lm1vYmlsZSxcbiAgICAgICAgRW1haWw6IHVzZXJEZXRhaWxzPy5jb250YWN0Py5lbWFpbCxcbiAgICAgICAgXCJMZWFkIFNvdXJjZVwiOiBcIldlYnNpdGVcIixcbiAgICAgICAgXCJMZWFkIFN0YXR1c1wiOiBcIk5FV1wiXG4gICAgICB9LFxuICAgICAgbmFtZTogdXNlckRldGFpbHM/LmNvbnRhY3Q/Lm5hbWVcbiAgICB9XG4gICAgdGhpcy5yZXN0U2VydmljZS5jcmVhdGVMZWFkKHBheWxvYWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHJlcz8uZGF0YSkge1xuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdzdWNjZXNzJywgc3VtbWFyeTogJ1RoYW5rIHlvdScsIGRldGFpbDogJ091ciB0ZWFtIHdpbGwgY29udGFjdCB5b3Ugc29vbicgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnRXJyb3InLCBkZXRhaWw6ICdFcnJvciBvY2N1cmVkIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXInIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuICBwcmljZVJhbmdlRmxhZzogYm9vbGVhbiA9IGZhbHNlO1xuICBmaWx0ZXJJdGVtTGlzdCgpIHtcbiAgICB0aGlzLmFwaUxvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMucGFnZU5vID0gMTtcbiAgICB0aGlzLmlzQWxsTGlzdExvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMucmVzcG9uc2VEYXRhID0gW107XG5cbiAgICB0aGlzLmZldGNoQW5hbHl0aWNzKCk7XG5cbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEZpbHRlcmVkUHJvZHVjdChcbiAgICAgIHRoaXMuY29sbGVjdGlvbnMuZmlsdGVyKHggPT4geC5zdGF0dXMpLm1hcCh4ID0+IHguaWQpLFxuICAgICAgdGhpcy5jYXRlZ29yaWVzLmZpbHRlcih4ID0+IHguc3RhdHVzKS5tYXAoeCA9PiB4LmlkKSxcbiAgICAgIHRoaXMuc2VhcmNoVGV4dCxcbiAgICAgIHRoaXMucHJpY2luZ01pbixcbiAgICAgIHRoaXMucHJpY2luZ01heCxcbiAgICAgIHRoaXMubWluUmF0aW5nLFxuICAgICAgdGhpcy5tYXhSYXRpbmcsXG4gICAgICB0aGlzLnNvcnRCeSA/PyBcIlwiLFxuICAgICAgdGhpcy5wYWdlTm8gLSAxLFxuICAgICAgdGhpcy5zaXplXG4gICAgKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgIHRoaXMucmVzcG9uc2VEYXRhID0gcmVzcG9uc2UuZGF0YSA/PyBbXTtcbiAgICAgIHRoaXMudG90YWxDb3VudCA9IHJlc3BvbnNlLmNvdW50ID8/IDA7XG5cbiAgICAgIGlmICghdGhpcy5wcmljZVJhbmdlRmxhZykge1xuICAgICAgICB0aGlzLmR5bmFtaWNQcmljZVJhbmdlKHJlc3BvbnNlLm1pblByaWNlLCByZXNwb25zZS5tYXhQcmljZSk7XG4gICAgICAgIHRoaXMucHJpY2VSYW5nZUZsYWcgPSB0cnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5pc0FsbExpc3RMb2FkZWQgPSAodGhpcy5yZXNwb25zZURhdGE/Lmxlbmd0aCA/PyAwKSA+PSB0aGlzLnRvdGFsQ291bnQ7XG4gICAgICB0aGlzLmFwaUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMudXBkYXRlUHJvZHVjdENhcnRXaXNobGlzdFByb3BlcnRpZXMoKTtcbiAgICB9LCBfZXJyID0+IHtcbiAgICAgIHRoaXMuYXBpTG9hZGluZyA9IGZhbHNlO1xuICAgIH0pO1xuICB9XG5cblxuICBkeW5hbWljUHJpY2VSYW5nZShtaW5QcmljZTogbnVtYmVyLCBtYXhQcmljZTogbnVtYmVyKSB7XG4gICAgdGhpcy5wcmljZVJhbmdlcyA9IFtdO1xuICAgIGNvbnN0IHJhbmdlID0gbWF4UHJpY2UgLSBtaW5QcmljZTtcbiAgICBjb25zdCBzdGVwID0gcmFuZ2UgLyA1O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7XG4gICAgICBjb25zdCBzdGFydCA9IE1hdGgucm91bmQoKG1pblByaWNlICsgaSAqIHN0ZXApIC8gMTAwKSAqIDEwMDtcbiAgICAgIGNvbnN0IGVuZCA9IGkgPT09IDRcbiAgICAgICAgPyBNYXRoLnJvdW5kKG1heFByaWNlIC8gMTAwKSAqIDEwMFxuICAgICAgICA6IE1hdGgucm91bmQoKG1pblByaWNlICsgKGkgKyAxKSAqIHN0ZXApIC8gMTAwKSAqIDEwMDtcbiAgICAgIHRoaXMucHJpY2VSYW5nZXMucHVzaCh7IGxhYmVsOiBg4oK5JHtzdGFydH0gLSDigrkke2VuZH1gLCBtaW46IHN0YXJ0LCBtYXg6IGVuZCwgc2VsZWN0ZWQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgfVxuXG5cbiAgc2VsZWN0T3B0aW9uKGZpbHRlcjogYW55LCBldmVudDogTW91c2VFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyAgLy8gUHJldmVudCBjbG9zaW5nIHR3aWNlXG4gICAgdGhpcy5zb3J0QnkgPSBmaWx0ZXIudmFsdWU7XG4gICAgdGhpcy5hcHBseUZpbHRlcih7IHZhbHVlOiBmaWx0ZXIudmFsdWUgfSwgJ1NPUlQnKTtcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgZ2V0U2VsZWN0ZWROYW1lKCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLmZpbHRlcmluZ0FycmF5LmZpbmQoZiA9PiBmLnZhbHVlID09PSB0aGlzLnNvcnRCeSk7XG4gICAgcmV0dXJuIHNlbGVjdGVkID8gc2VsZWN0ZWQubmFtZSA6ICcnO1xuICB9XG5cbiAgaGFuZGxlUHJvZHVjdExpc3RTY3JvbGwoKSB7XG4gICAgY29uc3QgZWwgPSB0aGlzLmxpc3RTY3JvbGxDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFlbCB8fCB0aGlzLmlzTGlzdExvYWRpbmcgfHwgdGhpcy5pc0FsbExpc3RMb2FkZWQpIHJldHVybjtcblxuICAgIGNvbnN0IHRocmVzaG9sZCA9IDE1MDsgLy8gSW5jcmVhc2VkIHRocmVzaG9sZCBmb3Igc21vb3RoZXIgbG9hZGluZ1xuICAgIGlmIChlbC5zY3JvbGxIZWlnaHQgLSBlbC5zY3JvbGxUb3AgLSBlbC5jbGllbnRIZWlnaHQgPCB0aHJlc2hvbGQpIHtcbiAgICAgIHRoaXMubG9hZE1vcmVQcm9kdWN0c1RvTGlzdCgpO1xuICAgIH1cbiAgfVxuXG4gIGxvYWRNb3JlUHJvZHVjdHNUb0xpc3QoKSB7XG4gICAgaWYgKHRoaXMuaXNMaXN0TG9hZGluZyB8fCB0aGlzLmlzQWxsTGlzdExvYWRlZCkgcmV0dXJuO1xuICAgIHRoaXMuaXNMaXN0TG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5wYWdlTm8rKztcbiAgICBpZiAodGhpcy5yZXNwb25zZURhdGEgJiYgdGhpcy5yZXNwb25zZURhdGEubGVuZ3RoID49IHRoaXMudG90YWxDb3VudCkge1xuICAgICAgdGhpcy5pc0FsbExpc3RMb2FkZWQgPSB0cnVlO1xuICAgICAgdGhpcy5pc0xpc3RMb2FkaW5nID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0RmlsdGVyZWRQcm9kdWN0KFxuICAgICAgdGhpcy5jb2xsZWN0aW9ucy5maWx0ZXIoKHgpID0+IHguc3RhdHVzKS5tYXAoKHgpID0+IHguaWQpLFxuICAgICAgdGhpcy5jYXRlZ29yaWVzLmZpbHRlcigoeCkgPT4geC5zdGF0dXMpLm1hcCgoeCkgPT4geC5pZCksXG4gICAgICB0aGlzLnNlYXJjaFRleHQsXG4gICAgICB0aGlzLnByaWNpbmdNaW4sXG4gICAgICB0aGlzLnByaWNpbmdNYXgsXG4gICAgICB0aGlzLm1pblJhdGluZyxcbiAgICAgIHRoaXMubWF4UmF0aW5nLFxuICAgICAgdGhpcy5zb3J0QnkgPz8gXCJcIixcbiAgICAgIHRoaXMucGFnZU5vIC0gMSxcbiAgICAgIHRoaXMuc2l6ZVxuICAgICkuc3Vic2NyaWJlKChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICB0aGlzLnJlc3BvbnNlRGF0YSA9IFsuLi4odGhpcy5yZXNwb25zZURhdGEgPz8gW10pLCAuLi4ocmVzcG9uc2UuZGF0YSA/PyBbXSldO1xuICAgICAgdGhpcy50b3RhbENvdW50ID0gcmVzcG9uc2UuY291bnQ7XG4gICAgICB0aGlzLmlzQWxsTGlzdExvYWRlZCA9ICh0aGlzLnJlc3BvbnNlRGF0YT8ubGVuZ3RoID8/IDApID49IHRoaXMudG90YWxDb3VudDtcbiAgICAgIHRoaXMuaXNMaXN0TG9hZGluZyA9IGZhbHNlO1xuICAgIH0sIF9lcnIgPT4ge1xuICAgICAgdGhpcy5pc0xpc3RMb2FkaW5nID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuXG4gIGVjb21Db25maWdzOiBhbnk7XG4gIGdldEVjb21tZXJjZUNvbmZpZ3MoKSB7XG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRFY29tbWVyY2VDb25maWdzKCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgdGhpcy5lY29tQ29uZmlncyA9IHJlcz8uZGF0YVxuICAgIH0pXG4gIH1cbiAgdG9TaG93SW5KZXdlbGxlcnk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgSXNFY29tbWVyY2U6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNNYXRlcmlhbEJhc2VkUHJpY2luZyA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5nZXRFY29tbWVyY2VDb25maWdzKCk7XG4gICAgaWYgKHdpbmRvdz8ubG9jYXRpb24/Lm9yaWdpbj8uaW5jbHVkZXMoJ2NhcmF0bGFuZScpIHx8IHdpbmRvdz8ubG9jYXRpb24/Lm9yaWdpbj8uaW5jbHVkZXMoJ29ycmEnKSkge1xuICAgICAgdGhpcy50b1Nob3dJbkpld2VsbGVyeSA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuaXNNYXRlcmlhbEJhc2VkUHJpY2luZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdpc01hdGVyaWFsQmFzZWRQcmljaW5nJykgPT09ICd0cnVlJztcblxuICAgIHRoaXMuaXRlbXMgPSBbXG4gICAgICB7XG4gICAgICAgIGljb246IFwicGkgcGktc2hvcHBpbmctY2FydFwiLFxuICAgICAgICBjb21tYW5kOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvY2FydCddKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaWNvbjogXCJwaSBwaS1ob21lXCIsXG4gICAgICAgIGNvbW1hbmQ6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy8nXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBdO1xuICAgIHRoaXMuY29udGVudCA9IHRoaXMuZGF0YT8uY29udGVudDtcbiAgICB0aGlzLnN0eWxlcyA9IHRoaXMuZGF0YT8uc3R5bGVzO1xuICAgIHRoaXMuYnV0dG9uID0gdGhpcy5kYXRhPy5hY3Rpb24/LmJ1dHRvbnM/LlswXTtcbiAgICB0aGlzLl9ldmVudFNlcnZpY2Uuc2hvd0xvYWRpbmdTY3JlZW4uc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xuICAgICAgdGhpcy5pc0xvYWRpbmcgPSByZXNwb25zZTtcbiAgICB9KTtcbiAgICB0aGlzLklzRWNvbW1lcmNlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJ3ZWJzaXRlVHlwZVwiKSAhPSAnU1RBVElDJyA/IHRydWUgOiBmYWxzZTtcbiAgICAvLyB0aGlzLmdldEFsbENhdGVnb3JpZXMoKTtcbiAgICAvLyB0aGlzLmdldEFsbENvbGxlY3Rpb25zKCk7XG4gICAgdGhpcy5taW5Qcm9kdWN0UHJpY2UgPSB0aGlzLnByaWNpbmdNaW4gPSB0aGlzLmRhdGE/LnN0eWxlcy5taW5QcmljZSA/PyAwO1xuICAgIHRoaXMubWF4UHJvZHVjdFByaWNlID0gdGhpcy5wcmljaW5nTWF4ID0gdGhpcy5kYXRhPy5zdHlsZXMubWF4UHJpY2UgPz8gMzAwMDA7XG4gICAgdGhpcy5zZWFyY2hUZXh0ID0gdGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1tcInNlYXJjaFR4dFwiXTtcbiAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZSgocVBhcmFtOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuc2VhcmNoVGV4dCA9IHFQYXJhbVtcInNlYXJjaFR4dFwiXTtcblxuICAgICAgaWYgKHRoaXMuc2VhcmNoVGV4dClcbiAgICAgICAgdGhpcy5sYXRlc3RBbmFseWljc0V2ZW50ID0gJ1NFQVJDSCc7XG5cbiAgICAgIHRoaXMucGFnZU5vID0gcVBhcmFtW1wicGFnZU5vXCJdID8gTnVtYmVyKHFQYXJhbVtcInBhZ2VOb1wiXSkgOiAxO1xuICAgICAgdGhpcy5zb3J0QnkgPSBxUGFyYW1bXCJzb3J0aW5nXCJdID8/IFwiXCI7XG4gICAgICB0aGlzLnByaWNpbmdNaW4gPSBpc05hTihOdW1iZXIocVBhcmFtW1wibWluUHJpY2VcIl0pKSA/IDAgOiBOdW1iZXIocVBhcmFtW1wibWluUHJpY2VcIl0pO1xuICAgICAgdGhpcy5wcmljaW5nTWF4ID0gaXNOYU4oTnVtYmVyKHFQYXJhbVtcIm1heFByaWNlXCJdKSkgPyAwIDogTnVtYmVyKHFQYXJhbVtcIm1heFByaWNlXCJdKTtcbiAgICAgIC8vIHRoaXMuZmlsdGVyQnlDYXRlZ29yeUNvbGxlY3Rpb25QYXJhbShxUGFyYW1bXCJjYXRlZ29yeVwiXSwgcVBhcmFtW1wiY29sbGVjdGlvbnNcIl0pO1xuICAgIH0pO1xuICAgIHRoaXMuYnV0dG9uID0gdGhpcy5kYXRhPy5hY3Rpb24/LmJ1dHRvbnM/LlswXTtcbiAgICB0aGlzLmdldENhdGVnb3JpZXNBbmRDb2xsZWN0aW9uKCk7XG5cbiAgICAvLyB0aGlzLmZpbHRlckl0ZW1MaXN0KCk7XG4gIH1cblxuICBmZXRjaEFuYWx5dGljcygpIHtcbiAgICBsZXQgYW5hbHl0aWNzRXZlbnQ6IGFueSA9IHt9XG4gICAgaWYgKHRoaXMuc2VhcmNoVGV4dCkge1xuICAgICAgYW5hbHl0aWNzRXZlbnRbJ1NFQVJDSCddID0gdGhpcy5zZWFyY2hUZXh0XG4gICAgfVxuICAgIGlmICh0aGlzLnByaWNpbmdNaW4pIHtcbiAgICAgIGFuYWx5dGljc0V2ZW50WydNSU5fUFJJQ0UnXSA9IHRoaXMucHJpY2luZ01pbjtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJpY2luZ01heCkge1xuICAgICAgYW5hbHl0aWNzRXZlbnRbJ01BWF9QUklDRSddID0gdGhpcy5wcmljaW5nTWF4O1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNvcnRCeSkge1xuICAgICAgYW5hbHl0aWNzRXZlbnRbJ1NPUlRfQlknXSA9IHRoaXMuc29ydEJ5O1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1pblJhdGluZykge1xuICAgICAgYW5hbHl0aWNzRXZlbnRbJ01JTl9SQVRJTkcnXSA9IHRoaXMubWluUmF0aW5nO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1heFJhdGluZykge1xuICAgICAgYW5hbHl0aWNzRXZlbnRbJ01BWF9SQVRJTkcnXSA9IHRoaXMubWF4UmF0aW5nO1xuICAgIH1cblxuICAgIGFuYWx5dGljc0V2ZW50WydDQVRFR09SSUVTJ10gPSB0aGlzLmNhdGVnb3JpZXMuZmlsdGVyKHggPT4geC5zdGF0dXMpLm1hcCh4ID0+IHguaWQpXG5cbiAgICBhbmFseXRpY3NFdmVudFsnQ09MTEVDVElPTlMnXSA9IHRoaXMuY29sbGVjdGlvbnMuZmlsdGVyKHggPT4geC5zdGF0dXMpLm1hcCh4ID0+IHguaWQpO1xuXG4gICAgdGhpcy5hbmFseXRpY3NTZXJ2aWNlLnN0YXJ0TmV3Q29udGV4dChhbmFseXRpY3NFdmVudCwgdGhpcy5sYXRlc3RBbmFseWljc0V2ZW50KTtcbiAgfVxuXG4gIGdldENhdGVnb3JpZXNBbmRDb2xsZWN0aW9uKCkge1xuICAgIGZvcmtKb2luKFtcbiAgICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0QWxsQ29sbGVjdGlvbnMoKS5waXBlKFxuICAgICAgICBjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkNvbGxlY3Rpb25zIGZhaWxlZFwiLCBlcnIpO1xuICAgICAgICAgIHJldHVybiBvZihbXSk7ICAgLy8gZmFsbGJhY2sgZW1wdHkgYXJyYXlcbiAgICAgICAgfSlcbiAgICAgICksXG4gICAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEFsbENhdGVnb3JpZXMoKS5waXBlKFxuICAgICAgICBjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkNhdGVnb3JpZXMgZmFpbGVkXCIsIGVycik7XG4gICAgICAgICAgcmV0dXJuIG9mKFtdKTsgICAvLyBmYWxsYmFjayBlbXB0eSBhcnJheVxuICAgICAgICB9KVxuICAgICAgKVxuICAgIF0pLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5jYXRlZ29yaWVzID0gcmVzWzFdLmZpbHRlcigoY2F0ZWdvcnk6IGFueSkgPT4gY2F0ZWdvcnkuZmVhdHVyZWRDb2xsZWN0aW9uIHx8IHRydWUpLm1hcCgoY2F0ZWdvcnk6IGFueSkgPT4geyByZXR1cm4geyBvcHRpb246IGNhdGVnb3J5LmNhdGVnb3J5TmFtZSwgaWQ6IGNhdGVnb3J5LmNhdGVnb3J5SWQsIGltZ1VybDogY2F0ZWdvcnkuaW1nVXJsPy5bMF0sIHN0YXR1czogZmFsc2UgfSB9KTtcbiAgICAgICAgdGhpcy5jb2xsZWN0aW9ucyA9IHJlc1swXS5maWx0ZXIoKGNvbGxlY3Rpb246IGFueSkgPT4gY29sbGVjdGlvbi5mZWF0dXJlZENhdGVnb3J5IHx8IHRydWUpLm1hcCgoY29sbGVjdGlvbjogYW55KSA9PiB7IHJldHVybiB7IG9wdGlvbjogY29sbGVjdGlvbi5jb2xsZWN0aW9uTmFtZSwgaWQ6IGNvbGxlY3Rpb24uY29sbGVjdGlvbklkLCBzdGF0dXM6IGZhbHNlIH0gfSk7XG5cbiAgICAgICAgY29uc3QgcVBhcmFtQ29sbGVjdGlvbnMgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zW1wiY29sbGVjdGlvbnNcIl07XG4gICAgICAgIGNvbnN0IHFQYXJhbUNhdGVnb3J5ID0gdGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1tcImNhdGVnb3J5XCJdO1xuICAgICAgICB0aGlzLmZpbHRlckJ5Q2F0ZWdvcnlDb2xsZWN0aW9uUGFyYW0ocVBhcmFtQ2F0ZWdvcnksIHFQYXJhbUNvbGxlY3Rpb25zKTtcblxuICAgICAgfSxcbiAgICAgIGVycm9yOiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5maWx0ZXJJdGVtTGlzdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0IHNlbGVjdGVkQ2F0ZWdvcnlDb2xsZWN0aW9uQ2hpcHMoKSB7XG4gICAgY29uc3QgY2hpcHM6IHsgaWQ6IHN0cmluZywgbmFtZTogc3RyaW5nIH1bXSA9IFtdO1xuICAgIGlmICh0aGlzLmNhdGVnb3JpZXMpIHtcbiAgICAgIGNoaXBzLnB1c2goXG4gICAgICAgIC4uLnRoaXMuY2F0ZWdvcmllcy5maWx0ZXIoeCA9PiB4LnN0YXR1cykubWFwKHggPT4gKHtcbiAgICAgICAgICBpZDogeC5pZCxcbiAgICAgICAgICBuYW1lOiB4Lm9wdGlvblxuICAgICAgICB9KSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbGxlY3Rpb25zKSB7XG4gICAgICBjaGlwcy5wdXNoKFxuICAgICAgICAuLi50aGlzLmNvbGxlY3Rpb25zLmZpbHRlcih4ID0+IHguc3RhdHVzKS5tYXAoeCA9PiAoe1xuICAgICAgICAgIGlkOiB4LmlkLFxuICAgICAgICAgIG5hbWU6IHgub3B0aW9uXG4gICAgICAgIH0pKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNoaXBzO1xuICB9XG5cbiAgLy8gQ29tcHV0ZWQgZ2V0dGVyIGZvciBzZWxlY3RlZCBwcmljZSByYW5nZSBjaGlwc1xuICBnZXQgc2VsZWN0ZWRQcmljZVJhbmdlQ2hpcHMoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJpY2VSYW5nZXNcbiAgICAgIC5maWx0ZXIocHIgPT4gcHIuc2VsZWN0ZWQpXG4gICAgICAubWFwKHByID0+ICh7XG4gICAgICAgIGlkOiAncHJpY2UtJyArIHByLm1pbiArICctJyArIHByLm1heCxcbiAgICAgICAgbmFtZTogcHIubGFiZWwsXG4gICAgICAgIHR5cGU6ICdwcmljZSdcbiAgICAgIH0pKTtcbiAgfVxuXG4gIGdldCBzZWxlY3RlZFJhdGluZ0NoaXBzKCkge1xuICAgIHJldHVybiB0aGlzLnJhdGluZ09wdGlvbnNcbiAgICAgIC5maWx0ZXIocmF0aW5nID0+IHJhdGluZy5zZWxlY3RlZClcbiAgICAgIC5tYXAocmF0aW5nID0+ICh7XG4gICAgICAgIGlkOiAncmF0aW5nLScgKyByYXRpbmcubWluICsgJy0nICsgcmF0aW5nLm1heCxcbiAgICAgICAgbmFtZTogcmF0aW5nLmxhYmVsLFxuICAgICAgICB0eXBlOiAncmF0aW5nJ1xuICAgICAgfSkpO1xuICB9XG5cbiAgZ2V0IGFsbEFjdGl2ZUNoaXBzKCkge1xuICAgIGxldCBkYXRhID0gW1xuICAgICAgLi4udGhpcy5zZWxlY3RlZENhdGVnb3J5Q29sbGVjdGlvbkNoaXBzLm1hcCh4ID0+ICh7IC4uLngsIHR5cGU6ICdjYXRlZ29yeU9yQ29sbGVjdGlvbicgfSkpLFxuICAgICAgLi4udGhpcy5zZWxlY3RlZFByaWNlUmFuZ2VDaGlwcyxcbiAgICAgIC4uLnRoaXMuc2VsZWN0ZWRSYXRpbmdDaGlwcyxcbiAgICBdO1xuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICBnZXRBbGxDYXRlZ29yaWVzKCkge1xuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0QWxsQ2F0ZWdvcmllcygpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgIHRoaXMuY2F0ZWdvcmllcyA9IHJlc3BvbnNlLmZpbHRlcigoY2F0ZWdvcnk6IGFueSkgPT4gY2F0ZWdvcnkuZmVhdHVyZWRDb2xsZWN0aW9uIHx8IHRydWUpLm1hcCgoY2F0ZWdvcnk6IGFueSkgPT4geyByZXR1cm4geyBvcHRpb246IGNhdGVnb3J5LmNhdGVnb3J5TmFtZSwgaWQ6IGNhdGVnb3J5LmNhdGVnb3J5SWQsIGltZ1VybDogY2F0ZWdvcnkuaW1nVXJsPy5bMF0sIHN0YXR1czogZmFsc2UgfSB9KTtcbiAgICAgIGNvbnN0IHFQYXJhbUNvbGxlY3Rpb25zID0gdGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1tcImNvbGxlY3Rpb25zXCJdO1xuICAgICAgY29uc3QgcVBhcmFtQ2F0ZWdvcnkgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zW1wiY2F0ZWdvcnlcIl07XG4gICAgICB0aGlzLmZpbHRlckJ5Q2F0ZWdvcnlDb2xsZWN0aW9uUGFyYW0ocVBhcmFtQ2F0ZWdvcnksIHFQYXJhbUNvbGxlY3Rpb25zKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldEFsbENvbGxlY3Rpb25zKCkge1xuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0QWxsQ29sbGVjdGlvbnMoKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICB0aGlzLmNvbGxlY3Rpb25zID0gcmVzcG9uc2UuZmlsdGVyKChjb2xsZWN0aW9uOiBhbnkpID0+IGNvbGxlY3Rpb24uZmVhdHVyZWRDYXRlZ29yeSB8fCB0cnVlKS5tYXAoKGNvbGxlY3Rpb246IGFueSkgPT4geyByZXR1cm4geyBvcHRpb246IGNvbGxlY3Rpb24uY29sbGVjdGlvbk5hbWUsIGlkOiBjb2xsZWN0aW9uLmNvbGxlY3Rpb25JZCwgc3RhdHVzOiBmYWxzZSB9IH0pO1xuICAgICAgY29uc3QgcVBhcmFtQ29sbGVjdGlvbnMgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zW1wiY29sbGVjdGlvbnNcIl07XG4gICAgICBjb25zdCBxUGFyYW1DYXRlZ29yeSA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbXCJjYXRlZ29yeVwiXTtcbiAgICAgIHRoaXMuZmlsdGVyQnlDYXRlZ29yeUNvbGxlY3Rpb25QYXJhbShxUGFyYW1DYXRlZ29yeSwgcVBhcmFtQ29sbGVjdGlvbnMpO1xuICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlUHJvZHVjdENhcnRXaXNobGlzdFByb3BlcnRpZXMoKSB7XG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyQ2FydCgpLnRoZW4oKGNhcnRSZXNwb25zZSkgPT4ge1xuICAgICAgY2FydFJlc3BvbnNlLm9uc3VjY2VzcyA9IChjYXJ0RGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuVVNFUl9DQVJUID0gY2FydERhdGEudGFyZ2V0LnJlc3VsdCBhcyB1bmtub3duIGFzIE9yZGVyZWRJdGVtc1tdIHx8IFtdO1xuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YT8uZm9yRWFjaCgocHJvZHVjdDogUHJvZHVjdCkgPT4ge1xuICAgICAgICAgIHRoaXMuVVNFUl9DQVJUPy5mb3JFYWNoKChpdGVtOiBPcmRlcmVkSXRlbXMpID0+IHtcbiAgICAgICAgICAgIGlmIChpdGVtLml0ZW1JZCA9PSBwcm9kdWN0Lml0ZW1JZCkge1xuICAgICAgICAgICAgICBpZiAocHJvZHVjdD8uaXRlbVZhcmlhbnQ/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtVmFyaWVudDogSXRlbVZhcmlhbnQgPSBwcm9kdWN0Py5pdGVtVmFyaWFudD8uWzBdO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtVmFyaWVudC52YXJpYW50SWQgPT0gaXRlbS52YXJpZW50SWQpIHtcbiAgICAgICAgICAgICAgICAgIHByb2R1Y3QuaXRlbUltYWdlcyA9IGl0ZW1WYXJpZW50LnZhcmlhbnRJbWFnZXMgPz8gW107XG4gICAgICAgICAgICAgICAgICBwcm9kdWN0LnByaWNlID0gaXRlbVZhcmllbnQuaXRlbVZhcmlhbnRQcmljZTtcbiAgICAgICAgICAgICAgICAgIHByb2R1Y3QucXVhbnRpdHkgPSBpdGVtLnF1YW50aXR5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcm9kdWN0LnF1YW50aXR5ID0gaXRlbS5xdWFudGl0eTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyV2hpc2hsaXN0KCkudGhlbigod2lzaGxpc3RSZXNwb25zZSkgPT4ge1xuICAgICAgd2lzaGxpc3RSZXNwb25zZS5vbnN1Y2Nlc3MgPSAod2hpc2xpc3REYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5VU0VSX1dJU0hMSVNUID0gd2hpc2xpc3REYXRhLnRhcmdldC5yZXN1bHQgYXMgdW5rbm93biBhcyBPcmRlcmVkSXRlbXNbXSB8fCBbXTtcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGE/LmZvckVhY2goKHByb2R1Y3Q6IFByb2R1Y3QpID0+IHtcbiAgICAgICAgICB0aGlzLlVTRVJfV0lTSExJU1Q/LmZvckVhY2goKGl0ZW06IE9yZGVyZWRJdGVtcykgPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW0uaXRlbUlkID09IHByb2R1Y3QuaXRlbUlkKSB7XG4gICAgICAgICAgICAgIGlmIChwcm9kdWN0Py5pdGVtVmFyaWFudD8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1WYXJpZW50OiBJdGVtVmFyaWFudCA9IHByb2R1Y3Q/Lml0ZW1WYXJpYW50Py5bMF07XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1WYXJpZW50LnZhcmlhbnRJZCA9PSBpdGVtLnZhcmllbnRJZCkge1xuICAgICAgICAgICAgICAgICAgcHJvZHVjdC5pdGVtSW1hZ2VzID0gaXRlbVZhcmllbnQ/LnZhcmlhbnRJbWFnZXMgPz8gW107XG4gICAgICAgICAgICAgICAgICBwcm9kdWN0LnByaWNlID0gaXRlbVZhcmllbnQuaXRlbVZhcmlhbnRQcmljZTtcbiAgICAgICAgICAgICAgICAgIHByb2R1Y3Qud2hpc2xpc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcm9kdWN0LndoaXNsaXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmaWx0ZXJCeUNhdGVnb3J5Q29sbGVjdGlvblBhcmFtKHFDYXRlZ29yaWVzOiBhbnksIHFDb2xsZWN0aW9uczogYW55KSB7XG4gICAgY29uc3QgY2F0ZWdvcmllcyA9IHFDYXRlZ29yaWVzPy5zcGxpdChcIitcIik/Lm1hcCgoY2F0ZWdvcnk6IHN0cmluZykgPT4gY2F0ZWdvcnkucmVwbGFjZUFsbChcIl9cIiwgXCIgXCIpLnRvTG93ZXJDYXNlKCkpLmZpbHRlcigoY2F0ZWdvcnk6IHN0cmluZykgPT4gY2F0ZWdvcnkubGVuZ3RoID4gMCk7XG4gICAgY29uc3QgY29sbGVjdGlvbnMgPSBxQ29sbGVjdGlvbnM/LnNwbGl0KFwiK1wiKT8ubWFwKChjb2xsZWN0aW9uOiBzdHJpbmcpID0+IGNvbGxlY3Rpb24ucmVwbGFjZUFsbChcIl9cIiwgXCIgXCIpLnRvTG93ZXJDYXNlKCkpLmZpbHRlcigoY29sbGVjdGlvbjogc3RyaW5nKSA9PiBjb2xsZWN0aW9uLmxlbmd0aCA+IDApO1xuXG4gICAgaWYgKChjYXRlZ29yaWVzPy5sZW5ndGggPz8gMCkgPiAwIHx8IChjb2xsZWN0aW9ucz8ubGVuZ3RoID8/IDApID4gMClcbiAgICAgIHRoaXMubGF0ZXN0QW5hbHlpY3NFdmVudCA9ICdGSUxURVJfQVBQTElFRCc7XG5cbiAgICB0aGlzLmNhdGVnb3JpZXM/LmZvckVhY2goKGNhdGVnb3J5KSA9PiB7XG4gICAgICBjYXRlZ29yeS5zdGF0dXMgPSBjYXRlZ29yaWVzPy5pbmNsdWRlcyhjYXRlZ29yeT8ub3B0aW9uPy50b0xvd2VyQ2FzZSgpKSA/PyBmYWxzZTtcbiAgICB9KTtcbiAgICB0aGlzLmNvbGxlY3Rpb25zPy5mb3JFYWNoKChjb2xsZWN0aW9uKSA9PiB7XG4gICAgICBjb2xsZWN0aW9uLnN0YXR1cyA9IGNvbGxlY3Rpb25zPy5pbmNsdWRlcyhjb2xsZWN0aW9uPy5vcHRpb24/LnRvTG93ZXJDYXNlKCkpID8/IGZhbHNlO1xuICAgIH0pO1xuICAgIHRoaXMuZmlsdGVyZWRDaGlwcyA9IFtcbiAgICAgIC4uLnRoaXMuc2VsZWN0ZWRDYXRlZ29yeUNvbGxlY3Rpb25DaGlwcy5tYXAoeCA9PiAoeyAuLi54LCB0eXBlOiAnY2F0ZWdvcnlPckNvbGxlY3Rpb24nIH0pKSxcbiAgICAgIC4uLnRoaXMuc2VsZWN0ZWRQcmljZVJhbmdlQ2hpcHMsXG4gICAgICAuLi50aGlzLnNlbGVjdGVkUmF0aW5nQ2hpcHMsXG4gICAgXTtcbiAgICAvLyBETyBOT1QgcmVidWlsZCBmaWx0ZXJMaXN0IGhlcmUhIChDaGlwcyB3aWxsIGF1dG8tdXBkYXRlIGZyb20gc3RhdHVzIGFycmF5cyB2aWEgdGhlIGdldHRlci4pXG4gICAgdGhpcy5maWx0ZXJJdGVtTGlzdCgpO1xuICB9XG5cbiAgcmVtb3ZlRmlsdGVyKGZpbHRlcjogYW55KSB7XG4gICAgaWYgKGZpbHRlci50eXBlID09PSAncHJpY2UnKSB7XG4gICAgICAvLyBEZXNlbGVjdCB0aGlzIHByaWNlIHJhbmdlIGFuZCB0cmlnZ2VyIGZpbHRlclxuICAgICAgY29uc3QgaWR4ID0gdGhpcy5wcmljZVJhbmdlcy5maW5kSW5kZXgoXG4gICAgICAgIHByID0+IGZpbHRlci5pZCA9PT0gJ3ByaWNlLScgKyBwci5taW4gKyAnLScgKyBwci5tYXhcbiAgICAgICk7XG4gICAgICBpZiAoaWR4ID4gLTEpIHtcbiAgICAgICAgdGhpcy5wcmljZVJhbmdlc1tpZHhdLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMub25QcmljZVJhbmdlQ2hhbmdlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGZpbHRlci50eXBlID09PSAncmF0aW5nJykge1xuICAgICAgY29uc3QgcmF0aW5nID0gdGhpcy5yYXRpbmdPcHRpb25zLmZpbmQociA9PiBmaWx0ZXIuaWQgPT09ICdyYXRpbmctJyArIHIubWluICsgJy0nICsgci5tYXgpO1xuICAgICAgaWYgKHJhdGluZykge1xuICAgICAgICByYXRpbmcuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VsZWN0ZWRSYXRpbmdzID0gdGhpcy5yYXRpbmdPcHRpb25zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5zZWxlY3RlZCk7XG4gICAgICB0aGlzLm1pblJhdGluZyA9IHNlbGVjdGVkUmF0aW5ncy5sZW5ndGggPyBNYXRoLm1pbiguLi5zZWxlY3RlZFJhdGluZ3MubWFwKChpdGVtKSA9PiBpdGVtLm1pbikpIDogMDtcbiAgICAgIHRoaXMubWF4UmF0aW5nID0gc2VsZWN0ZWRSYXRpbmdzLmxlbmd0aCA/IE1hdGgubWF4KC4uLnNlbGVjdGVkUmF0aW5ncy5tYXAoKGl0ZW0pID0+IGl0ZW0ubWF4KSkgOiAwO1xuXG4gICAgICB0aGlzLmZpbHRlcmVkQ2hpcHMgPSBbXG4gICAgICAgIC4uLnRoaXMuc2VsZWN0ZWRDYXRlZ29yeUNvbGxlY3Rpb25DaGlwcy5tYXAoeCA9PiAoeyAuLi54LCB0eXBlOiAnY2F0ZWdvcnlPckNvbGxlY3Rpb24nIH0pKSxcbiAgICAgICAgLi4udGhpcy5zZWxlY3RlZFByaWNlUmFuZ2VDaGlwcyxcbiAgICAgICAgLi4udGhpcy5zZWxlY3RlZFJhdGluZ0NoaXBzLFxuICAgICAgXTtcbiAgICAgIHRoaXMucGFnZU5vID0gMTtcbiAgICAgIHRoaXMubmF2aWdhdGVGaWx0ZXIodGhpcy5zb3J0QnkgPz8gXCJcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQXNzdW1lIHJlbWFpbmluZyBjaGlwcyBhcmUgY2F0ZWdvcmllcyBvciBjb2xsZWN0aW9uc1xuICAgIC8vIFJlbW92ZSBzZWxlY3Rpb24gYnkgaWRcbiAgICBpZiAodGhpcy5jYXRlZ29yaWVzKSB7XG4gICAgICBjb25zdCBjYXQgPSB0aGlzLmNhdGVnb3JpZXMuZmluZChjYXQgPT4gY2F0LmlkID09PSBmaWx0ZXIuaWQpO1xuICAgICAgaWYgKGNhdCkgY2F0LnN0YXR1cyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb2xsZWN0aW9ucykge1xuICAgICAgY29uc3QgY29sbCA9IHRoaXMuY29sbGVjdGlvbnMuZmluZChjb2xsID0+IGNvbGwuaWQgPT09IGZpbHRlci5pZCk7XG4gICAgICBpZiAoY29sbCkgY29sbC5zdGF0dXMgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5maWx0ZXJlZENoaXBzID0gW1xuICAgICAgLi4udGhpcy5zZWxlY3RlZENhdGVnb3J5Q29sbGVjdGlvbkNoaXBzLm1hcCh4ID0+ICh7IC4uLngsIHR5cGU6ICdjYXRlZ29yeU9yQ29sbGVjdGlvbicgfSkpLFxuICAgICAgLi4udGhpcy5zZWxlY3RlZFByaWNlUmFuZ2VDaGlwcyxcbiAgICAgIC4uLnRoaXMuc2VsZWN0ZWRSYXRpbmdDaGlwcyxcbiAgICBdO1xuICAgIHRoaXMucGFnZU5vID0gMTtcbiAgICB0aGlzLm5hdmlnYXRlRmlsdGVyKHRoaXMuc29ydEJ5ID8/IFwiXCIpO1xuICB9XG5cbiAgYXBwbHlQcm9kdWN0V2lkdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3R5bGVzPy50aGVtZSA9PT0gdGhpcy50aGVtZS5UaGVtZTEgfHxcbiAgICAgICh0aGlzLnNjcmVlbldpZHRoIDwgNDc1ICYmIHRoaXMuc3R5bGVzPy50aGVtZSA9PSB0aGlzLnRoZW1lLlRoZW1lMilcbiAgfVxuXG4gIGdldFByb2R1Y3RXaWR0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5zY3JlZW5XaWR0aCA+IDQ3NSA/ICh0aGlzLnNjcmVlbldpZHRoIDwgMTAyNSA/ICcyNSUnIDogJ2NhbGMoJyArICgoMTAwIC8gKHRoaXMuc3R5bGVzPy5lbGVtZW50SW5Sb3cgfHwgNCkpKSArICclKScpIDogKHRoaXMuc3R5bGVzPy5tb2JpbGVDb2x1bW4gPT09IDEgPyAnOTglJyA6ICc0OCUnKVxuICB9XG5cbiAgcHJvY2VlZFRvUHJvZHVjdERlc2MocHJvZHVjdDogUHJvZHVjdCkge1xuICAgIGNvbnN0IHNsdWcgPSBwcm9kdWN0LnNsdWdpZmllZE5hbWUgfHwgdGhpcy50b1NsdWcocHJvZHVjdC5uYW1lKTtcbiAgICBpZiAoIXNsdWcpXG4gICAgICByZXR1cm47XG5cbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ2RldGFpbHMnLCBzbHVnXSk7XG4gIH1cblxuICBwcml2YXRlIHRvU2x1ZyhpbnB1dDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghaW5wdXQpXG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IG5vV2hpdGVzcGFjZSA9IGlucHV0LnJlcGxhY2UoL1xccysvZywgJy0nKTtcbiAgICBjb25zdCBub3JtYWxpemVkID0gbm9XaGl0ZXNwYWNlLm5vcm1hbGl6ZSgnTkZEJyk7XG4gICAgY29uc3Qgc2x1ZyA9IG5vcm1hbGl6ZWQucmVwbGFjZSgvW15cXHctXS9nLCAnJyk7XG5cbiAgICByZXR1cm4gc2x1Z1xuICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgIC5yZXBsYWNlKC8tKy9nLCAnLScpXG4gICAgICAucmVwbGFjZSgvXi18LSQvZywgJycpO1xuICB9XG5cbiAgcmluZ1NpemVzID0gW1xuICAgIHsgc2l6ZTogJ0JhbmRzJywgc3RhdHVzOiBmYWxzZSB9LFxuICAgIHsgc2l6ZTogJ0NvY2t0YWlsJywgc3RhdHVzOiBmYWxzZSB9LFxuICAgIHsgc2l6ZTogJ0Nhc3VhbCBSaW5ncycsIHN0YXR1czogZmFsc2UgfSxcbiAgICB7IHNpemU6ICdIYWxvJywgc3RhdHVzOiBmYWxzZSB9XG4gIF07XG5cbiAgcHJvZHVjdFR5cGVzRGF0YSA9IFtcbiAgICB7IHNpemU6ICdFYXJyaW5ncycsIHN0YXR1czogZmFsc2UgfSxcbiAgICB7IHNpemU6ICdQZW5kYW50cycsIHN0YXR1czogZmFsc2UgfSxcbiAgICB7IHNpemU6ICdSaW5ncycsIHN0YXR1czogZmFsc2UgfSxcbiAgICB7IHNpemU6ICdOZWNrbGFjZXMnLCBzdGF0dXM6IGZhbHNlIH1cbiAgXVxuXG4gIHNob3BGb3JEYXRhID0gW1xuICAgIHsgc2l6ZTogJ1dvbWVuJywgc3RhdHVzOiBmYWxzZSB9LFxuICAgIHsgc2l6ZTogJ01lbicsIHN0YXR1czogZmFsc2UgfSxcbiAgICB7IHNpemU6ICdCYWJ5Jywgc3RhdHVzOiBmYWxzZSB9LFxuICAgIHsgc2l6ZTogJ0tpZHMnLCBzdGF0dXM6IGZhbHNlIH1cbiAgXVxuXG4gIG1hdGVyaWFsU2l6ZURhdGEgPSBbXG4gICAgeyBzaXplOiAnUGxhdGludW0nLCBzdGF0dXM6IGZhbHNlIH0sXG4gICAgeyBzaXplOiAnR29sZCcsIHN0YXR1czogZmFsc2UgfSxcbiAgICB7IHNpemU6ICdEaWFtb25kJywgc3RhdHVzOiBmYWxzZSB9LFxuICAgIHsgc2l6ZTogJ0dlbXN0b25lJywgc3RhdHVzOiBmYWxzZSB9XG4gIF1cblxuICBtZXRhbFNpemVEYXRhID0gW1xuICAgIHsgc2l6ZTogJzIyIEtUIFllbGxvdycsIHN0YXR1czogZmFsc2UgfSxcbiAgICB7IHNpemU6ICcxOCBLVCBZZWxsb3cnLCBzdGF0dXM6IGZhbHNlIH0sXG4gICAgeyBzaXplOiAnOSBLVCBZZWxsb3cnLCBzdGF0dXM6IGZhbHNlIH0sXG4gICAgeyBzaXplOiAnMTggS1QgV2hpdGUnLCBzdGF0dXM6IGZhbHNlIH1cbiAgXVxuXG4gIHRvZ2dsZU1ldGFsU2l6ZShzaXplOiBhbnkpIHtcbiAgICBzaXplLnN0YXR1cyA9ICFzaXplLnN0YXR1cztcbiAgfVxuXG4gIHRvZ2dsZVNob3BTaXplKHNpemU6IGFueSkge1xuICAgIHNpemUuc3RhdHVzID0gIXNpemUuc3RhdHVzO1xuICB9XG5cbiAgdG9nZ2xlU2l6ZShzaXplOiBhbnkpIHtcbiAgICBzaXplLnN0YXR1cyA9ICFzaXplLnN0YXR1cztcbiAgfVxuXG4gIHRvZ2dsZVByb2R1Y3RTaXplKHNpemU6IGFueSkge1xuICAgIHNpemUuc3RhdHVzID0gIXNpemUuc3RhdHVzO1xuICB9XG5cbiAgdG9nZ2xlTWF0ZXJpYWxTaXplKHNpemU6IGFueSkge1xuICAgIHNpemUuc3RhdHVzID0gIXNpemUuc3RhdHVzO1xuICB9XG5cbiAgY2xlYXJGaWx0ZXIoKSB7XG4gICAgdGhpcy5jYXRlZ29yaWVzLmZvckVhY2goKGNhdGVnb3J5KSA9PiBjYXRlZ29yeS5zdGF0dXMgPSBmYWxzZSk7XG4gICAgdGhpcy5jb2xsZWN0aW9ucy5mb3JFYWNoKChjb2xsZWN0aW9uKSA9PiBjb2xsZWN0aW9uLnN0YXR1cyA9IGZhbHNlKTtcbiAgICB0aGlzLnByaWNlUmFuZ2VzLmZvckVhY2gocHIgPT4gcHIuc2VsZWN0ZWQgPSBmYWxzZSk7XG4gICAgdGhpcy5wcmljaW5nTWluID0gdGhpcy5taW5Qcm9kdWN0UHJpY2U7XG4gICAgdGhpcy5wcmljaW5nTWF4ID0gdGhpcy5tYXhQcm9kdWN0UHJpY2U7XG4gICAgdGhpcy5yYXRpbmdPcHRpb25zLmZvckVhY2goKHJhdGluZykgPT4gcmF0aW5nLnNlbGVjdGVkID0gZmFsc2UpO1xuICAgIHRoaXMubWluUmF0aW5nID0gMDtcbiAgICB0aGlzLm1heFJhdGluZyA9IDA7XG4gICAgdGhpcy5yaW5nU2l6ZXMuZm9yRWFjaCgoc2l6ZSkgPT4gc2l6ZS5zdGF0dXMgPSBmYWxzZSk7XG4gICAgdGhpcy5wcm9kdWN0VHlwZXNEYXRhLmZvckVhY2goKHNpemUpID0+IHNpemUuc3RhdHVzID0gZmFsc2UpO1xuICAgIHRoaXMuc2hvcEZvckRhdGEuZm9yRWFjaCgoc2l6ZSkgPT4gc2l6ZS5zdGF0dXMgPSBmYWxzZSk7XG4gICAgdGhpcy5tYXRlcmlhbFNpemVEYXRhLmZvckVhY2goKHNpemUpID0+IHNpemUuc3RhdHVzID0gZmFsc2UpO1xuICAgIHRoaXMubWV0YWxTaXplRGF0YS5mb3JFYWNoKChzaXplKSA9PiBzaXplLnN0YXR1cyA9IGZhbHNlKTtcbiAgICB0aGlzLmZpbHRlcmVkQ2hpcHMgPSBbXTtcbiAgICAvLyB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ2xpc3QnXSk7XG4gICAgdGhpcy5uYXZpZ2F0ZUZpbHRlcih0aGlzLnNvcnRCeSlcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoJ2ZpbHRlclNjcm9sbCcsIHsgc3RhdGljOiB0cnVlIH0pIGZpbHRlclNjcm9sbCE6IEVsZW1lbnRSZWY7XG5cbiAgaXNTeW5jaW5nID0gZmFsc2U7XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuZmlsdGVyU2Nyb2xsPy5uYXRpdmVFbGVtZW50Py5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCAoKSA9PiB0aGlzLmhhbmRsZVN5bmNTY3JvbGwoKSk7XG4gICAgdGhpcy5zdGFydFRhZ0N5Y2xlKCk7XG4gIH1cblxuICBzdGFydFRhZ0N5Y2xlKCk6IHZvaWQge1xuICAgIHRoaXMudGFnSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAodGhpcy5yZXNwb25zZURhdGEgfHwgW10pLmZvckVhY2gocCA9PiB7XG4gICAgICAgIGlmICgocD8udGFncz8ubGVuZ3RoID8/IDApID4gMSkge1xuICAgICAgICAgIGNvbnN0IGN1ciA9IHRoaXMudGFnSW5kZXhNYXBbcC5pdGVtSWRdID8/IDA7XG4gICAgICAgICAgdGhpcy50YWdJbmRleE1hcFtwLml0ZW1JZF0gPSAoY3VyICsgMSkgJSBwLnRhZ3MubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LCAzMDAwKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGNsZWFySW50ZXJ2YWwodGhpcy50YWdJbnRlcnZhbCk7XG4gIH1cblxuICBoYW5kbGVTeW5jU2Nyb2xsKCkge1xuICAgIC8vIERvbid0IHJlY3Vyc2l2ZWx5IHRyaWdnZXIgc2Nyb2xsc1xuICAgIGlmICh0aGlzLmlzU3luY2luZykgcmV0dXJuO1xuXG4gICAgY29uc3QgZmlsdGVyRWwgPSB0aGlzLmZpbHRlclNjcm9sbC5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGxpc3RFbCA9IHRoaXMubGlzdFNjcm9sbENvbnRhaW5lcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWxpc3RFbCkgcmV0dXJuO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHdoZW4gZmlsdGVyIGhhcyBcInNjcm9sbGVkIHBhc3RcIiB0aGUgaGVpZ2h0IG9mIHRoZSByaWdodCBzaWRlXG4gICAgY29uc3QgZmlsdGVyU2Nyb2xsYWJsZUV4Y2VzcyA9IGZpbHRlckVsLnNjcm9sbEhlaWdodCAtIGZpbHRlckVsLmNsaWVudEhlaWdodDtcbiAgICBjb25zdCBsaXN0U2Nyb2xsYWJsZSA9IGxpc3RFbC5zY3JvbGxIZWlnaHQgLSBsaXN0RWwuY2xpZW50SGVpZ2h0O1xuXG4gICAgaWYgKGZpbHRlckVsLnNjcm9sbFRvcCA+IGxpc3RTY3JvbGxhYmxlKSB7XG4gICAgICB0aGlzLmlzU3luY2luZyA9IHRydWU7XG4gICAgICAvLyBTY3JvbGwgcmlnaHQgc2lkZSBpbiBzeW5jIGFzIHdlbGxcbiAgICAgIGxpc3RFbC5zY3JvbGxUb3AgPSBmaWx0ZXJFbC5zY3JvbGxUb3AgLSAoZmlsdGVyU2Nyb2xsYWJsZUV4Y2VzcyAtIGxpc3RTY3JvbGxhYmxlKTtcbiAgICAgIHRoaXMuaXNTeW5jaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cblxuICB0b2dnbGVJdGVtVG9GYXYoZXZlbnQ6IFBvaW50ZXJFdmVudCB8IE1vdXNlRXZlbnQsIHByb2R1Y3Q6IFByb2R1Y3QsIHR5cGU6ICdBREQnIHwgJ1JFTU9WRScpIHtcbiAgICBpZiAodHlwZSA9PSAnQUREJykge1xuICAgICAgcHJvZHVjdC53aGlzbGlzdCA9IHRydWU7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnc3VjY2VzcycsIHN1bW1hcnk6ICdXaXNobGlzdCcsIGRldGFpbDogJ0l0ZW0gYWRkZWQgdG8geW91ciB3aXNobGlzdCcgfSk7XG4gICAgICBpZiAocHJvZHVjdD8uaXRlbVZhcmlhbnQ/Lmxlbmd0aCkge1xuICAgICAgICBjb25zdCBpdGVtVmFyaWVudDogSXRlbVZhcmlhbnQgfCBudWxsID0gdGhpcy5nZXRJdGVtVmFyaWVudChwcm9kdWN0LCBwcm9kdWN0LnZhcmllbnRJZCk7XG4gICAgICAgIGlmIChpdGVtVmFyaWVudCkge1xuICAgICAgICAgIGl0ZW1WYXJpZW50Lndpc2hsaXN0ID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZEl0ZW1Ub0Zhdm91cml0ZShwcm9kdWN0IGFzIFByb2R1Y3QsIGl0ZW1WYXJpZW50LnZhcmlhbnRJZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkSXRlbVRvRmF2b3VyaXRlKHByb2R1Y3QpO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHByb2R1Y3Qud2hpc2xpc3QgPSBmYWxzZTtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdpbmZvJywgc3VtbWFyeTogJ1dpc2hsaXN0JywgZGV0YWlsOiAnSXRlbSByZW1vdmVkIGZyb20geW91ciB3aXNobGlzdCcgfSk7XG4gICAgICB0aGlzLmNhcnRTZXJ2aWNlLnJlbW92ZUl0ZW1Gcm9tRmF2b3VyaXRlKHByb2R1Y3QudmFyaWVudElkLCBwcm9kdWN0Lml0ZW1JZCk7XG4gICAgfVxuICAgIGlmIChwcm9kdWN0LndoaXNsaXN0KSB7XG4gICAgICB0aGlzLlVTRVJfV0lTSExJU1Q/LnB1c2gobmV3IE9yZGVyZWRJdGVtcyhwcm9kdWN0LCBwcm9kdWN0LnZhcmllbnRJZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLlVTRVJfV0lTSExJU1QgPSB0aGlzLlVTRVJfV0lTSExJU1Q/LmZpbHRlcigoaXRlbTogT3JkZXJlZEl0ZW1zKSA9PiBpdGVtLnZhcmllbnRJZCAhPSBwcm9kdWN0LnZhcmllbnRJZCkgPz8gW107XG4gICAgfVxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgYWRkSXRlbVRvQ2FydChldmVudDogUG9pbnRlckV2ZW50IHwgTW91c2VFdmVudCwgcHJvZHVjdDogUHJvZHVjdCwgdHlwZTogJ0FERCcgfCAnU1VCU1RSQUNUJykge1xuICAgIGlmICh0aGlzLmlzSXRlbU91dE9mU3RvY2socHJvZHVjdCkpIHtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICd3YXJuJywgc3VtbWFyeTogJ0NhcnQnLCBkZXRhaWw6ICdJdGVtIGlzIG5vdCBhdmFpbGFibGUgYXMgb2Ygbm93LiBXZSB3aWxsIG5vdGlmeSB5b3Ugb25jZSBhdmFpbGFibGUnIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwcm9kdWN0LnF1YW50aXR5ICs9ICh0eXBlID09ICdBREQnID8gMSA6IC0xKTtcbiAgICBpZiAocHJvZHVjdD8uaXRlbVZhcmlhbnQ/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgaXRlbVZhcmllbnQ6IEl0ZW1WYXJpYW50IHwgbnVsbCA9IHRoaXMuZ2V0SXRlbVZhcmllbnQocHJvZHVjdCwgcHJvZHVjdC52YXJpZW50SWQpO1xuICAgICAgaWYgKGl0ZW1WYXJpZW50KSB7XG4gICAgICAgIGl0ZW1WYXJpZW50LnF1YW50aXR5ID0gcHJvZHVjdC5xdWFudGl0eTtcbiAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRJdGVtVG9DYXJ0KHByb2R1Y3QsIGl0ZW1WYXJpZW50LnZhcmlhbnRJZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkSXRlbVRvQ2FydChwcm9kdWN0KTtcbiAgICB9XG4gICAgaWYgKHByb2R1Y3QucXVhbnRpdHkpIHtcbiAgICAgIGxldCBpc1ByZXNlbnQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgIHRoaXMuVVNFUl9DQVJUPy5mb3JFYWNoKChpdGVtOiBPcmRlcmVkSXRlbXMpID0+IHtcbiAgICAgICAgaWYgKGl0ZW0udmFyaWVudElkID09IHByb2R1Y3QudmFyaWVudElkKSB7XG4gICAgICAgICAgaXRlbS5xdWFudGl0eSA9IHByb2R1Y3QucXVhbnRpdHk7XG4gICAgICAgICAgaXNQcmVzZW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIGlmICghaXNQcmVzZW50KVxuICAgICAgICB0aGlzLlVTRVJfQ0FSVD8ucHVzaChuZXcgT3JkZXJlZEl0ZW1zKHByb2R1Y3QsIHByb2R1Y3QudmFyaWVudElkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuVVNFUl9DQVJUID0gdGhpcy5VU0VSX0NBUlQ/LmZpbHRlcigoaXRlbTogT3JkZXJlZEl0ZW1zKSA9PiBpdGVtLnZhcmllbnRJZCAhPSBwcm9kdWN0LnZhcmllbnRJZCkgPz8gW107XG4gICAgfVxuICB9XG5cbiAgc2VhcmNoUHJvZHVjdCgpIHtcbiAgICB0aGlzLm5hdmlnYXRlRmlsdGVyKHRoaXMuc29ydEJ5ID8/IFwiXCIpO1xuICB9XG5cbiAgc2VsZWN0VmFyaWVudChwcm9kdWN0OiBQcm9kdWN0LCB2YXJpZW50OiBJdGVtVmFyaWFudCkge1xuICAgIHByb2R1Y3QudmFyaWVudElkID0gdmFyaWVudC52YXJpYW50SWQ7XG4gICAgcHJvZHVjdC5pdGVtSW1hZ2VzID0gdmFyaWVudC52YXJpYW50SW1hZ2VzO1xuICAgIHByb2R1Y3QucHJpY2UgPSB2YXJpZW50Lml0ZW1WYXJpYW50UHJpY2U7XG4gICAgcHJvZHVjdC5pdGVtSW52ZW50b3J5ID0gdmFyaWVudC5pdGVtSW52ZW50b3J5O1xuICAgIHByb2R1Y3QucXVhbnRpdHkgPSB0aGlzLmdldFZhcmllbnRRdWFudGl0eSh2YXJpZW50KTtcbiAgICBwcm9kdWN0LndoaXNsaXN0ID0gdGhpcy5pc1ZhcmllbnRQcmVzZW50SW5XaXNodGxpc3QodmFyaWVudCk7XG4gIH1cblxuICBwcml2YXRlIGdldFZhcmllbnRRdWFudGl0eShwcm9kdWN0VmFyaWVudDogSXRlbVZhcmlhbnQpOiBudW1iZXIge1xuICAgIGxldCBpdGVtUXVhbnRpdHk6IG51bWJlciA9IDA7XG4gICAgdGhpcy5VU0VSX0NBUlQ/LmZvckVhY2goKGl0ZW06IE9yZGVyZWRJdGVtcykgPT4ge1xuICAgICAgaWYgKHByb2R1Y3RWYXJpZW50LnZhcmlhbnRJZCA9PSBpdGVtLnZhcmllbnRJZClcbiAgICAgICAgaXRlbVF1YW50aXR5ID0gaXRlbS5xdWFudGl0eTtcbiAgICB9KVxuICAgIHJldHVybiBpdGVtUXVhbnRpdHk7XG4gIH1cbiAgcHJpdmF0ZSBpc1ZhcmllbnRQcmVzZW50SW5XaXNodGxpc3QocHJvZHVjdFZhcmllbnQ6IEl0ZW1WYXJpYW50KTogYm9vbGVhbiB7XG4gICAgbGV0IHByZXNlbnQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICB0aGlzLlVTRVJfV0lTSExJU1Q/LmZvckVhY2goKGl0ZW06IE9yZGVyZWRJdGVtcykgPT4ge1xuICAgICAgaWYgKHByb2R1Y3RWYXJpZW50LnZhcmlhbnRJZCA9PSBpdGVtLnZhcmllbnRJZClcbiAgICAgICAgcHJlc2VudCA9IHRydWU7XG4gICAgfSlcbiAgICByZXR1cm4gcHJlc2VudDtcbiAgfVxuXG5cbiAgLy8gYXBwbHlGaWx0ZXIoY2F0ZWdvcnk/OiBhbnksIHR5cGU/OiAnU09SVCcgfCAnRklMVEVSJykge1xuICAvLyAgIHRoaXMucGFnZU5vID0gMTtcbiAgLy8gICBpZiAodHlwZSA9PT0gXCJGSUxURVJcIikge1xuICAvLyAgICAgY2F0ZWdvcnkuc3RhdHVzID0gIWNhdGVnb3J5LnN0YXR1cztcbiAgLy8gICB9XG4gIC8vICAgLy8gRm9yIFNPUlQsIHNvcnRCeSBpcyBhbHJlYWR5IHNldCBmcm9tIG5nTW9kZWxcbiAgLy8gICB0aGlzLmZpbHRlckJvdHRvbVNoZWV0UmVmPy5kaXNtaXNzKCk7XG4gIC8vICAgdGhpcy5uYXZpZ2F0ZUZpbHRlcih0aGlzLnNvcnRCeSk7XG4gIC8vIH1cblxuICBuYXZpZ2F0ZUZpbHRlcihzb3J0aW5nOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNvcnRCeSA9IHNvcnRpbmc7XG4gICAgbGV0IHNlbGVjdGVkQ2F0ZWdvcnkgPSBcIlwiO1xuICAgIGxldCBzZWxlY3RlZENvbGxlY3Rpb24gPSBcIlwiO1xuICAgIHRoaXMuY2F0ZWdvcmllcy5maWx0ZXIoKGNhdGVnb3J5KSA9PiBjYXRlZ29yeS5zdGF0dXMpLm1hcCgoY2F0ZWdvcnkpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmNhdGVnb3J5LFxuICAgICAgICBzbHVnOiBjYXRlZ29yeS5vcHRpb24ucmVwbGFjZUFsbChcIiBcIiwgXCJfXCIpXG4gICAgICB9XG4gICAgfSkuZm9yRWFjaCgoY2F0ZWdvcnkpID0+IHNlbGVjdGVkQ2F0ZWdvcnkgKz0gKGNhdGVnb3J5LnNsdWcgKyBcIitcIikpO1xuICAgIHRoaXMuY29sbGVjdGlvbnMuZmlsdGVyKChjb2xsZWN0aW9uKSA9PiBjb2xsZWN0aW9uLnN0YXR1cykubWFwKChjb2xsZWN0aW9uKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jb2xsZWN0aW9uLFxuICAgICAgICBzbHVnOiBjb2xsZWN0aW9uLm9wdGlvbi5yZXBsYWNlQWxsKFwiIFwiLCBcIl9cIilcbiAgICAgIH1cbiAgICB9KS5mb3JFYWNoKChjb2xsZWN0aW9uKSA9PiBzZWxlY3RlZENvbGxlY3Rpb24gKz0gKGNvbGxlY3Rpb24uc2x1ZyArIFwiK1wiKSk7XG4gICAgdGhpcy5zb3J0aW5nRGlhbG9nUmVmPy5kaXNtaXNzKCk7XG4gICAgdGhpcy5maWx0ZXJJdGVtTGlzdCgpO1xuICB9XG4gIGNsb3NlRmlsdGVyKCkge1xuICAgIHRoaXMuZmlsdGVyQm90dG9tU2hlZXRSZWY/LmRpc21pc3MoKTtcbiAgfVxuICBvcGVuRmlsdGVyKEZpbHRlclNlY3Rpb246IGFueSkge1xuICAgIHRoaXMuZmlsdGVyQm90dG9tU2hlZXRSZWYgPSB0aGlzLm1hdEJvdHRvbVNoZWV0Lm9wZW4oRmlsdGVyU2VjdGlvbik7XG4gIH1cbiAgb3BlblNvcnRpbmcoU29ydGluZ1NlY3Rpb246IGFueSkge1xuICAgIHRoaXMuc29ydGluZ0RpYWxvZ1JlZiA9IHRoaXMubWF0Qm90dG9tU2hlZXQub3BlbihTb3J0aW5nU2VjdGlvbiwge30pO1xuICB9XG4gIHBhZ2luYXRpb25DaGFuZ2UocGFnZTogbnVtYmVyKSB7XG4gICAgdGhpcy5wYWdlTm8gPSBwYWdlO1xuICAgIHRoaXMubmF2aWdhdGVGaWx0ZXIodGhpcy5zb3J0QnkgPz8gXCJcIik7XG4gICAgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgPSAwO1xuICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICB9XG4gIGNsb3NlRGlhbG9nKCkge1xuICAgIHRoaXMuc29ydGluZ0RpYWxvZ1JlZj8uZGlzbWlzcygpO1xuICB9XG4gIGlzSXRlbU91dE9mU3RvY2socHJvZHVjdDogUHJvZHVjdCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwcm9kdWN0Lml0ZW1JbnZlbnRvcnk/Lm9wZW5pbmdTdG9jayA9PSAwO1xuICB9XG4gIGdldEl0ZW1WYXJpZW50KHByb2R1Y3Q6IFByb2R1Y3QsIHZhcmllbnRJZDogc3RyaW5nKTogSXRlbVZhcmlhbnQgfCBudWxsIHtcbiAgICBsZXQgc2VsZWN0ZWRWYXJpZW50OiBJdGVtVmFyaWFudCB8IG51bGwgPSBudWxsO1xuICAgIHByb2R1Y3Q/Lml0ZW1WYXJpYW50Py5mb3JFYWNoKCh2YXJpZW50OiBJdGVtVmFyaWFudCkgPT4ge1xuICAgICAgaWYgKHZhcmllbnQudmFyaWFudElkID09PSB2YXJpZW50SWQpXG4gICAgICAgIHNlbGVjdGVkVmFyaWVudCA9IHZhcmllbnQ7XG4gICAgfSlcbiAgICByZXR1cm4gc2VsZWN0ZWRWYXJpZW50O1xuICB9XG4gIGdldCBpc01vYmlsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2luZG93LmlubmVyV2lkdGggPCA0NzU7XG4gIH1cbiAgZ2V0IGN1cnJlbmN5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEJVU0lORVNTX0NPTlNUQU5UUy5DVVJSRU5DWTtcbiAgfVxuICBnZXQgbWluU2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1pbih0aGlzLnRvdGFsQ291bnQsICgoKHRoaXMucGFnZU5vIC0gMSkgKiB0aGlzLnNpemUgKyAxKSArIHRoaXMuc2l6ZSkpO1xuICB9XG5cbiAgZ2V0UHJvZHVjdEltYWdlcyhwcm9kdWN0OiBhbnkpIHtcbiAgICBpZiAoIXByb2R1Y3RbJ2N1cnJlbnRJbWFnZUluZGV4J10pIHByb2R1Y3RbJ2N1cnJlbnRJbWFnZUluZGV4J10gPSAwO1xuICAgIGxldCBpbWFnZUluZGV4OiBudW1iZXIgPSBwcm9kdWN0WydjdXJyZW50SW1hZ2VJbmRleCddICUgcHJvZHVjdD8uWydpdGVtSW1hZ2VzJ10/Lmxlbmd0aDtcbiAgICByZXR1cm4gcHJvZHVjdD8uWydpdGVtSW1hZ2VzJ10/LltpbWFnZUluZGV4XT8uaW1nVXJsXG4gIH1cblxuICBhc3luYyBjaGFuZ2VJbWFnZShwcm9kdWN0OiBhbnksIGFjdGlvbjogJ1BSRVYnIHwgJ05FWFQnLCBpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5pbWFnZUluZGV4ID0gaW5kZXg7XG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDMwMCkpO1xuICAgIGlmIChhY3Rpb24gPT09ICdORVhUJykge1xuICAgICAgcHJvZHVjdFsnY3VycmVudEltYWdlSW5kZXgnXSsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9kdWN0WydjdXJyZW50SW1hZ2VJbmRleCddLS07XG4gICAgICBpZiAocHJvZHVjdFsnY3VycmVudEltYWdlSW5kZXgnXSA8IDApXG4gICAgICAgIHByb2R1Y3RbJ2N1cnJlbnRJbWFnZUluZGV4J10gPSBwcm9kdWN0Py5bJ2l0ZW1JbWFnZXMnXT8ubGVuZ3RoIC0gMTtcbiAgICB9XG4gICAgdGhpcy5pbWFnZUluZGV4ID0gLTE7XG4gIH1cblxuICBnZXRCdXR0b25JZChpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YT8uYWN0aW9uPy5idXR0b25zW2luZGV4XT8uaWQgPz8gXCJcIjtcbiAgfVxuICBnZXRCdXR0b25TdHlsZShpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YT8uYWN0aW9uPy5idXR0b25zW2luZGV4XT8uc3R5bGVzO1xuICB9XG4gIGdldEVsZW1lbnRSb3coKSB7XG4gICAgcmV0dXJuIHRoaXMuc3R5bGVzPy5lbGVtZW50SW5Sb3cgPz8gNVxuICB9XG5cbiAgc2hvd0FsbENhdGVnb3JpZXMgPSBmYWxzZTtcblxuICBnZXQgZGlzcGxheWVkQ2F0ZWdvcmllcygpIHtcbiAgICByZXR1cm4gdGhpcy5zaG93QWxsQ2F0ZWdvcmllcyA/IHRoaXMuY2F0ZWdvcmllcyA6IHRoaXMuY2F0ZWdvcmllcy5zbGljZSgwLCA0KTtcbiAgfVxuXG4gIHRvZ2dsZUNhdGVnb3JpZXMoKSB7XG4gICAgdGhpcy5zaG93QWxsQ2F0ZWdvcmllcyA9ICF0aGlzLnNob3dBbGxDYXRlZ29yaWVzO1xuICB9XG5cbiAgc2hvd0FsbENvbGxlY3Rpb25zID0gZmFsc2U7XG5cbiAgZ2V0IGRpc3BsYXllZENvbGxlY3Rpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnNob3dBbGxDb2xsZWN0aW9ucyA/IHRoaXMuY29sbGVjdGlvbnMgOiB0aGlzLmNvbGxlY3Rpb25zLnNsaWNlKDAsIDQpO1xuICB9XG5cbiAgdG9nZ2xlQ29sbGVjdGlvbnMoKSB7XG4gICAgdGhpcy5zaG93QWxsQ29sbGVjdGlvbnMgPSAhdGhpcy5zaG93QWxsQ29sbGVjdGlvbnM7XG4gIH1cblxuICBjYXRlZ29yaWVzQ29sbGFwc2VkID0gZmFsc2U7XG4gIGNvbGxlY3Rpb25zQ29sbGFwc2VkID0gZmFsc2U7XG4gIHJhdGluZ3NDb2xsYXBzZWQgPSBmYWxzZTtcbiAgcHJpY2VDb2xsYXBzZWQgPSBmYWxzZTtcbiAgcHJvZHVjdFR5cGVDb2xsYXBzZWQgPSBmYWxzZTtcbiAgc2hvcEZvckNvbGxhcHNlZCA9IGZhbHNlO1xuICBtYXRlcmlhbENvbGxhcHNlZCA9IGZhbHNlO1xuICBtZXRhbENvbGxhcHNlZCA9IGZhbHNlO1xuICByaW5nU3R5bGVDb2xsYXBzZWQgPSBmYWxzZTtcblxuICBhc3luYyBhZGRUb1RyaWFsQ2FydChwcm9kdWN0OiBQcm9kdWN0KSB7XG4gICAgbGV0IGlzSXRlbUFkZGVkOiBib29sZWFuID0gdHJ1ZVxuICAgIGlmIChwcm9kdWN0Py5pdGVtVmFyaWFudD8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBpdGVtVmFyaWVudDogSXRlbVZhcmlhbnQgfCBudWxsID0gdGhpcy5nZXRJdGVtVmFyaWVudChwcm9kdWN0LCBwcm9kdWN0LnZhcmllbnRJZCk7XG4gICAgICBpZiAoaXRlbVZhcmllbnQpIHtcbiAgICAgICAgaXRlbVZhcmllbnQud2lzaGxpc3QgPSB0cnVlO1xuICAgICAgICBpc0l0ZW1BZGRlZCA9IGF3YWl0IHRoaXMuY2FydFNlcnZpY2UuYWRkSXRlbVRvVHJpYWwocHJvZHVjdCBhcyBQcm9kdWN0LCBpdGVtVmFyaWVudC52YXJpYW50SWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpc0l0ZW1BZGRlZCA9IGF3YWl0IHRoaXMuY2FydFNlcnZpY2UuYWRkSXRlbVRvVHJpYWwocHJvZHVjdCk7XG4gICAgfVxuICAgIGlmIChpc0l0ZW1BZGRlZClcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdzdWNjZXNzJywgc3VtbWFyeTogJ1RyeSBhdCBob21lJywgZGV0YWlsOiAnSXRlbSBhZGRlZCB0byB5b3VyIHRyaWFsIGNhcnQnIH0pO1xuICAgIGVsc2VcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdUcnkgYXQgaG9tZScsIGRldGFpbDogJ0l0ZW0gYWxyZWFkeSBhZGRlZCB0byB5b3VyIHRyaWFsIGNhcnQnIH0pO1xuICB9XG5cbiAgcHJvZHVjdE5hbWU6IHN0cmluZyA9IFwiXCJcbiAgb3BlbkRpYWxvZ0JveCh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8SFRNTERpdkVsZW1lbnQ+LCBwcm9kdWN0TmFtZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5wcm9kdWN0TmFtZSA9IHByb2R1Y3ROYW1lO1xuICAgIGNvbnN0IGNvbmZpZzogTWF0RGlhbG9nQ29uZmlnID0ge1xuICAgICAgcGFuZWxDbGFzczogJycsXG4gICAgICBkaXNhYmxlQ2xvc2U6IGZhbHNlLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5zY3JlZW5XaWR0aCA+IDQ3NSkge1xuICAgICAgY29uZmlnLnBhbmVsQ2xhc3MgPSAndmlkZW8tY2FsbC1kaWFsb2cnO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25maWcud2lkdGggPSAnMTAwdncnO1xuICAgICAgY29uZmlnLmhlaWdodCA9ICcxMDB2aCc7XG4gICAgICBjb25maWcubWF4V2lkdGggPSAnMTAwdncnO1xuICAgICAgY29uZmlnLnBhbmVsQ2xhc3MgPSAnYXBwb2ludG1lbnQtZm9ybSc7XG4gICAgfVxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMubWF0RGlhbG9nLm9wZW4odGVtcGxhdGUsIGNvbmZpZyk7XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJyc7XG4gICAgfSk7XG4gIH1cblxuXG4gIG1hdENsb3NlRGlhbG9nKCkge1xuICAgIHRoaXMubWF0RGlhbG9nLmNsb3NlQWxsKCk7XG4gIH1cblxuICBvdGhlckxhbmd1YWdlOiBzdHJpbmcgPSAnJztcblxuICB2aWRlb0NhbGxQYXlsb2FkOiBhbnkgPSB7XG4gICAgYnVzaW5lc3NJZDogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2J1c2luZXNzSWQnKSA/PyBcIlwiLFxuICAgIG1vYmlsZU51bWJlcjogXCJcIixcbiAgICBwaW5jb2RlOiBcIlwiLFxuICAgIHVzZXJuYW1lOiBcIlwiLFxuICAgIGVtYWlsOiBcIlwiLFxuICAgIG1lc3NhZ2U6IGBgLFxuICB9XG5cbiAgdmFsaWRhdGlvbkVycm9yczogYW55ID0ge1xuICAgIHVzZXJuYW1lOiBmYWxzZSxcbiAgICBtb2JpbGVOdW1iZXI6IGZhbHNlLFxuICAgIC8vIHBpbmNvZGU6IGZhbHNlLFxuICAgIC8vIGVtYWlsOiBmYWxzZVxuICB9O1xuICBpc1N1Ym1pdHRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2NoZWR1bGVkOiBib29sZWFuID0gZmFsc2U7XG4gIHNjaGVkdWxlVmlkZW9DYWxsKCkge1xuICAgIGlmICh0aGlzLmlzU3VibWl0dGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlc2V0VmFsaWRhdGlvbkVycm9ycygpO1xuICAgIGxldCBoYXNFcnJvcnMgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMudmlkZW9DYWxsUGF5bG9hZC51c2VybmFtZT8udHJpbSgpKSB7XG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMudXNlcm5hbWUgPSB0cnVlO1xuICAgICAgaGFzRXJyb3JzID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnZpZGVvQ2FsbFBheWxvYWQubW9iaWxlTnVtYmVyKSB7XG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMubW9iaWxlTnVtYmVyID0gdHJ1ZTtcbiAgICAgIGhhc0Vycm9ycyA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh0aGlzLnZpZGVvQ2FsbFBheWxvYWQubW9iaWxlTnVtYmVyLnRvU3RyaW5nKCkubGVuZ3RoICE9PSAxMCkge1xuICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzLm1vYmlsZU51bWJlciA9IHRydWU7XG4gICAgICBoYXNFcnJvcnMgPSB0cnVlO1xuICAgIH1cbiAgICAvLyBpZiAoIXRoaXMudmlkZW9DYWxsUGF5bG9hZC5waW5jb2RlKSB7XG4gICAgLy8gICB0aGlzLnZhbGlkYXRpb25FcnJvcnMucGluY29kZSA9IHRydWU7XG4gICAgLy8gICBoYXNFcnJvcnMgPSB0cnVlO1xuICAgIC8vIH0gZWxzZSBpZiAodGhpcy52aWRlb0NhbGxQYXlsb2FkLnBpbmNvZGUudG9TdHJpbmcoKS5sZW5ndGggIT09IDYpIHtcbiAgICAvLyAgIHRoaXMudmFsaWRhdGlvbkVycm9ycy5waW5jb2RlID0gdHJ1ZTtcbiAgICAvLyAgIGhhc0Vycm9ycyA9IHRydWU7XG4gICAgLy8gfVxuXG4gICAgLy8gaWYgKCF0aGlzLnZpZGVvQ2FsbFBheWxvYWQuZW1haWw/LnRyaW0oKSkge1xuICAgIC8vICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzLmVtYWlsID0gdHJ1ZTtcbiAgICAvLyAgIGhhc0Vycm9ycyA9IHRydWU7XG4gICAgLy8gfSBlbHNlIGlmICghL15bYS16QS1aMC05Ll8lKy1dK0BbYS16QS1aMC05Li1dK1xcLlthLXpBLVpdezIsfSQvLnRlc3QodGhpcy52aWRlb0NhbGxQYXlsb2FkLmVtYWlsKSkge1xuICAgIC8vICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzLmVtYWlsID0gdHJ1ZTtcbiAgICAvLyAgIGhhc0Vycm9ycyA9IHRydWU7XG4gICAgLy8gfVxuICAgIC8vIHx8ICF0aGlzLnZpZGVvQ2FsbFBheWxvYWQucGluY29kZVxuICAgIGlmIChoYXNFcnJvcnMpIHtcbiAgICAgIGlmICghdGhpcy52aWRlb0NhbGxQYXlsb2FkLnVzZXJuYW1lPy50cmltKCkgfHwgIXRoaXMudmlkZW9DYWxsUGF5bG9hZC5tb2JpbGVOdW1iZXIpIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgIHNldmVyaXR5OiAnd2FybicsXG4gICAgICAgICAgc3VtbWFyeTogJ1ZpZGVvIENhbGwgU2NoZWR1bGUnLFxuICAgICAgICAgIGRldGFpbDogJ1BsZWFzZSBmaWxsIGFsbCB0aGUgcmVxdWlyZWQgZGV0YWlscycsXG4gICAgICAgICAga2V5OiAnVmlkZW8gQ2FsbCBTY2hlZHVsZSdcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMudmlkZW9DYWxsUGF5bG9hZC5tb2JpbGVOdW1iZXIudG9TdHJpbmcoKS5sZW5ndGggIT09IDEwKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICBzZXZlcml0eTogJ3dhcm4nLFxuICAgICAgICAgIHN1bW1hcnk6ICdWaWRlbyBDYWxsIFNjaGVkdWxlJyxcbiAgICAgICAgICBkZXRhaWw6ICdQbGVhc2UgZW50ZXIgYSB2YWxpZCAxMC1kaWdpdCBtb2JpbGUgbnVtYmVyJyxcbiAgICAgICAgICBrZXk6ICdWaWRlbyBDYWxsIFNjaGVkdWxlJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIH0gZWxzZSBpZiAodGhpcy52aWRlb0NhbGxQYXlsb2FkLnBpbmNvZGUudG9TdHJpbmcoKS5sZW5ndGggIT09IDYpIHtcbiAgICAgIC8vICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgLy8gICAgIHNldmVyaXR5OiAnd2FybicsXG4gICAgICAvLyAgICAgc3VtbWFyeTogJ1ZpZGVvIENhbGwgU2NoZWR1bGUnLFxuICAgICAgLy8gICAgIGRldGFpbDogJ1BsZWFzZSBlbnRlciBhIHZhbGlkIDYtZGlnaXQgcGluY29kZScsXG4gICAgICAvLyAgICAga2V5OiAnVmlkZW8gQ2FsbCBTY2hlZHVsZSdcbiAgICAgIC8vICAgfSk7XG4gICAgICAvLyB9XG4gICAgICAvLyBlbHNlIGlmICghdGhpcy52aWRlb0NhbGxQYXlsb2FkLmVtYWlsPy50cmltKCkgfHwgIS9eW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcXC5bYS16QS1aXXsyLH0kLy50ZXN0KHRoaXMudmlkZW9DYWxsUGF5bG9hZC5lbWFpbCkpIHtcbiAgICAgIC8vICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgLy8gICAgIHNldmVyaXR5OiAnd2FybicsXG4gICAgICAvLyAgICAgc3VtbWFyeTogJ1ZpZGVvIENhbGwgU2NoZWR1bGUnLFxuICAgICAgLy8gICAgIGRldGFpbDogJ1BsZWFzZSBlbnRlciBhIHZhbGlkIGVtYWlsIGFkZHJlc3MnLFxuICAgICAgLy8gICAgIGtleTogJ1ZpZGVvIENhbGwgU2NoZWR1bGUnXG4gICAgICAvLyAgIH0pO1xuICAgICAgLy8gfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNTdWJtaXR0aW5nID0gdHJ1ZTtcbiAgICB0aGlzLnZpZGVvQ2FsbFBheWxvYWQubWVzc2FnZSA9IHRoaXMudmlkZW9DYWxsUGF5bG9hZC5tZXNzYWdlICsgYEhpLCBJJ3ZlIGp1c3Qgc2NoZWR1bGVkIGEgdmlkZW8gY2FsbCB3aXRoIHlvdSBmb3IgdGhpcyBwcm9kdWN0ICR7dGhpcy5wcm9kdWN0TmFtZX0uIEl0J3MgaW1wb3J0YW50IGFuZCBJJ2QgYXBwcmVjaWF0ZSB5b3VyIHRpbWUg4oCUIGxvb2tpbmcgZm9yd2FyZCB0byBjb25uZWN0aW5nIGFzIHNvb24gYXMgcG9zc2libGUgIGluICR7dGhpcy5zZWxlY3RlZExhbmcgPT0gJ090aGVycycgPyB0aGlzLm90aGVyTGFuZ3VhZ2UgOiB0aGlzLnNlbGVjdGVkTGFuZ30gbGFuZ3VhZ2VgO1xuICAgIHRoaXMucmVzdFNlcnZpY2UucG9zdFZpZGVvQ2FsbERldGFpbHModGhpcy52aWRlb0NhbGxQYXlsb2FkKS5zdWJzY3JpYmUoXG4gICAgICAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgIHNldmVyaXR5OiAnc3VjY2VzcycsXG4gICAgICAgICAgc3VtbWFyeTogJ1ZpZGVvIENhbGwgU2NoZWR1bGUnLFxuICAgICAgICAgIGRldGFpbDogJ1lvdXIgVmlkZW8gQ2FsbCBpcyBTY2hlZHVsZWQgU3VjY2Vzc2Z1bGx5JyxcbiAgICAgICAgICBrZXk6ICdWaWRlbyBTY2hlZHVsaW5nJ1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pc1N1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLm1hdENsb3NlRGlhbG9nKCk7XG4gICAgICB9LFxuICAgICAgKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuaXNTdWJtaXR0aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICBzdW1tYXJ5OiAnRXJyb3InLFxuICAgICAgICAgIGRldGFpbDogZXJyPy5lcnJvcj8ubWVzc2FnZSxcbiAgICAgICAgICBrZXk6ICdWaWRlbyBDYWxsIFNjaGVkdWxlJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHJlc2V0VmFsaWRhdGlvbkVycm9ycygpIHtcbiAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMgPSB7XG4gICAgICB1c2VybmFtZTogZmFsc2UsXG4gICAgICBtb2JpbGVOdW1iZXI6IGZhbHNlLFxuICAgICAgcGluY29kZTogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgcmVzZXRGb3JtKCkge1xuICAgIHRoaXMudmlkZW9DYWxsUGF5bG9hZCA9IHtcbiAgICAgIHVzZXJuYW1lOiAnJyxcbiAgICAgIG1vYmlsZU51bWJlcjogJycsXG4gICAgICBwaW5jb2RlOiAnJyxcbiAgICAgIG1lc3NhZ2U6ICcnXG4gICAgfTtcbiAgICB0aGlzLnJlc2V0VmFsaWRhdGlvbkVycm9ycygpO1xuICB9XG4gIG9uSW5wdXRDaGFuZ2UoZmllbGQ6IGFueSkge1xuICAgIGlmICh0aGlzLnZhbGlkYXRpb25FcnJvcnNbZmllbGRdKSB7XG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnNbZmllbGRdID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIGNsb3NlTW9kYWwoKSB7XG4gICAgY29uc3QgbW9kYWxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4YW1wbGVNb2RhbENlbnRlcicpO1xuICAgIGlmIChtb2RhbEVsZW1lbnQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKG1vZGFsRWxlbWVudCwgJ2RhdGEtYnMtZGlzbWlzcycsICdtb2RhbCcpO1xuICAgICAgbW9kYWxFbGVtZW50LmNsaWNrKCk7XG4gICAgfVxuICB9XG5cbiAgbGFuZ3VhZ2VzOiBzdHJpbmdbXSA9IFtcIkVuZ2xpc2hcIiwgXCJUZWx1Z3VcIiwgXCJIaW5kaVwiLCBcIlRhbWlsXCIsIFwiS2FubmFkYVwiLCBcIk1hbGF5YWxhbVwiLCBcIk90aGVyc1wiXVxuICBzZWxlY3RlZExhbmc6IHN0cmluZyA9IHRoaXMubGFuZ3VhZ2VzWzBdXG5cbiAgZ2V0VGV4dENvbG9yKGNvbG9yOiBhbnkpIHtcbiAgICBjb25zdCB0aHJlc2hvbGQgPSAxMzA7XG4gICAgY29uc3QgciA9IHBhcnNlSW50KGNvbG9yLnNsaWNlKDEsIDMpLCAxNik7XG4gICAgY29uc3QgZyA9IHBhcnNlSW50KGNvbG9yLnNsaWNlKDMsIDUpLCAxNik7XG4gICAgY29uc3QgYiA9IHBhcnNlSW50KGNvbG9yLnNsaWNlKDUsIDcpLCAxNik7XG4gICAgY29uc3QgYnJpZ2h0bmVzcyA9IChyICogMjk5ICsgZyAqIDU4NyArIGIgKiAxMTQpIC8gMTAwMDtcblxuICAgIHJldHVybiBicmlnaHRuZXNzID4gdGhyZXNob2xkID8gJyMwMDAwMDAnIDogJyNmZmZmZmYnO1xuICB9XG59XG4iLCI8cC10b2FzdCBwb3NpdGlvbj1cImJvdHRvbS1yaWdodFwiIFtiYXNlWkluZGV4XT1cIjEwMDAwMDAwMDAwXCIgW2F1dG9aSW5kZXhdPVwidHJ1ZVwiXG4gIFtzaG93VHJhbnNmb3JtT3B0aW9uc109XCJpc01vYmlsZSA/ICd0cmFuc2xhdGVZKC0xMDAlKScgOiAnJ1wiPjwvcC10b2FzdD5cbjxwLXRvYXN0IHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCIgW2Jhc2VaSW5kZXhdPVwiMTAwMDAwMDAwMDBcIiBbYXV0b1pJbmRleF09XCJ0cnVlXCIga2V5PVwiVmlkZW8gQ2FsbCBTY2hlZHVsZVwiXG4gIFtzaG93VHJhbnNmb3JtT3B0aW9uc109XCJpc01vYmlsZSA/ICd0cmFuc2xhdGVZKC0xMDAlKScgOiAnJ1wiPjwvcC10b2FzdD5cbjxwLXRvYXN0IHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCIgW2Jhc2VaSW5kZXhdPVwiMTAwMDAwMDAwMDBcIiBbYXV0b1pJbmRleF09XCJ0cnVlXCIga2V5PVwiVmlkZW8gU2NoZWR1bGluZ1wiXG4gIFtzaG93VHJhbnNmb3JtT3B0aW9uc109XCJpc01vYmlsZSA/ICd0cmFuc2xhdGVZKC0xMDAlKScgOiAnJ1wiPjwvcC10b2FzdD5cblxuPCEtLSA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIiAqbmdJZj1cImlzTW9iaWxlXCIgW25nQ2xhc3NdPVwieydpbnB1dC1ncm91cC1zdGlja3knOiBzY3JvbGxpbmdWYWx1ZSA+IDIwfVwiPlxuICA8bWF0LWljb24gY2xhc3M9XCJmLTIwIGQtZmxleCBhbGlnbi1pdGVtLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+c2VhcmNoPC9tYXQtaWNvbj5cbiAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaCBQcm9kdWN0Li5cIiBhcmlhLWxhYmVsPVwiU2VhcmNoIFByb2R1Y3RcIlxuICAgIFsobmdNb2RlbCldPVwic2VhcmNoVGV4dFwiIChuZ01vZGVsQ2hhbmdlKT1cInNlYXJjaFByb2R1Y3QoKVwiPlxuPC9kaXY+IC0tPlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9hZGluZ1wiPlxuICA8c2VjdGlvbiBbaWRdPVwiZGF0YT8uaWRcIiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZCB0b3RhbC1jb250YWluZXJcIiBbc2ltcG9MYXlvdXRdPVwic3R5bGVzPy5sYXlvdXRcIiBzaW1wb0hvdmVyXG4gICAgKGhvdmVyaW5nKT1cInNob3dFZGl0VGFicygkZXZlbnQpXCIgW3NpbXBvQmFja2dyb3VuZF09XCJzdHlsZXM/LmJhY2tncm91bmRcIlxuICAgIFtzdHlsZS5wYWRkaW5nVG9wLnB4XT1cImlzTW9iaWxlID8gJzAgIWltcG9ydGFudCcgOiAnJ1wiIFthdHRyLnN0eWxlXT1cImN1c3RvbUNsYXNzXCJcbiAgICBbc3BhY2luZ0hvcml6b250YWxdPVwic3R5bGVzTGF5b3V0XCI+XG5cbiAgICA8IS0tIDxkaXYgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7XCIgY2xhc3M9XCJzcGVlZGRpYWwtbGluZWFyXCIgKm5nSWY9XCJpc01vYmlsZVwiPlxuICAgICAgPHAtc3BlZWREaWFsIFttb2RlbF09XCJpdGVtc1wiIGRpcmVjdGlvbj1cInVwXCJcbiAgICAgICAgW2J1dHRvblN0eWxlXT1cInsnYm9yZGVyLXJhZGl1cyc6ICc1MCUnLCAnaGVpZ2h0JzogJzMwcHgnfVwiPjwvcC1zcGVlZERpYWw+XG4gICAgPC9kaXY+IC0tPlxuXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgdy0xMDAgb25seURlc2t0b3BcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItdG9wLXNlY3Rpb24gZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWJhc2VsaW5lXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXIgYm9keS1sYXJnZVwiPlxuICAgICAgICAgIEZpbHRlcnNcbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjbGVhclwiIChjbGljayk9XCJjbGVhckZpbHRlcigpXCIgW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj5cbiAgICAgICAgICBDTEVBUiBBTExcbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaXRlbWlkPVwidG9wLXNlY3Rpb25cIiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIlxuICAgICAgICBzdHlsZT1cIndpZHRoOiA3Ny41JTsgbWFyZ2luLXJpZ2h0OiAxJTtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMTVcIiBzdHlsZT1cIndpZHRoOiA3NSU7IGRpc3BsYXk6ZmxleDsgZmxleC13cmFwOndyYXBcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWx0ZXIgb2YgZmlsdGVyZWRDaGlwc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtLWNlbnRlciB3LTkwIGNoaXBcIj5cbiAgICAgICAgICAgICAgPHNwYW4+e3tmaWx0ZXIubmFtZX19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjsgd2lkdGg6MjBweDsgaGVpZ2h0OiAyMHB4O1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdHlsZT1cImZvbnQtc2l6ZTogMjBweDtcIiAoY2xpY2spPVwicmVtb3ZlRmlsdGVyKGZpbHRlcilcIj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiIHN0eWxlPVwiZ2FwOiAxMHB4O1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmcy02IGZ3LW5vcm1hbCBtci0zXCI+U29ydCBieTwvZGl2PlxuICAgICAgICAgIDxzZWxlY3QgWyhuZ01vZGVsKV09XCJzb3J0QnlcIiAoY2hhbmdlKT1cImFwcGx5RmlsdGVyKCRldmVudCwgJ1NPUlQnKVwiIHN0eWxlPVwiY29sb3I6IGJsYWNrO1wiPlxuICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiZmlsdGVyLnZhbHVlXCIgKm5nRm9yPVwibGV0IGZpbHRlciBvZiBmaWx0ZXJpbmdBcnJheVwiPnt7IGZpbHRlci5uYW1lIH19PC9vcHRpb24+XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1zb3J0LWRyb3Bkb3duXCIgdGFiaW5kZXg9XCIwXCIgKGJsdXIpPVwiY2xvc2VEcm9wZG93bigpXCIgKGNsaWNrKT1cInRvZ2dsZURyb3Bkb3duKClcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNvcnQtbGFiZWxcIj5Tb3J0IEJ5Ojwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlbGVjdGVkLXZhbHVlXCI+e3sgZ2V0U2VsZWN0ZWROYW1lKCkgfHwgJ0ZlYXR1cmVkJyB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRvZ2dsZS1pY29uXCIgW2NsYXNzLm9wZW5dPVwiaXNPcGVuXCI+JiM5NjYyOzwvc3Bhbj4gPCEtLSBEb3duIGFycm93LCByb3RhdGVzIG9wZW4gLS0+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwib3B0aW9uc1wiICpuZ0lmPVwiaXNPcGVuXCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWx0ZXIgb2YgZmlsdGVyaW5nQXJyYXlcIiBjbGFzcz1cIm9wdGlvblwiIFtjbGFzcy5zZWxlY3RlZF09XCJmaWx0ZXIudmFsdWUgPT09IHNvcnRCeVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RPcHRpb24oZmlsdGVyLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIHt7IGZpbHRlci5uYW1lIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cImlzTW9iaWxlXCIgY2xhc3M9XCJkLWZsZXggdy0xMDAgb25seU1vYmlsZSBnYXAtMTUgZmxleC13cmFwXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWx0ZXIgb2YgZmlsdGVyZWRDaGlwc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW0tY2VudGVyIHctOTAgY2hpcFwiPlxuICAgICAgICAgIDxzcGFuPnt7ZmlsdGVyLm5hbWV9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjsgd2lkdGg6MjBweDsgaGVpZ2h0OiAyMHB4O1wiPlxuICAgICAgICAgICAgPG1hdC1pY29uIHN0eWxlPVwiZm9udC1zaXplOiAyMHB4O1wiIChjbGljayk9XCJyZW1vdmVGaWx0ZXIoZmlsdGVyKVwiPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibWFpbi1wcm9kdWN0LXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItc2lkZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiRmlsdGVyU2VjdGlvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IFtpZF09XCJkYXRhPy5pZFwiIFtzaW1wb0FuaW1hdGlvbl09XCJzdHlsZXM/LmFuaW1hdGlvblwiIGNsYXNzPVwicmlnaHQtc2lkZVwiIChzY3JvbGwpPVwiaGFuZGxlUHJvZHVjdExpc3RTY3JvbGwoKVwiXG4gICAgICAgICNsaXN0U2Nyb2xsQ29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWFwaUxvYWRpbmdcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1wYXJlbnRcIiAqbmdJZj1cInJlc3BvbnNlRGF0YSAmJiByZXNwb25zZURhdGEubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiByZXNwb25zZURhdGE7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cInByb2R1Y3RcIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiYXBwbHlQcm9kdWN0V2lkdGgoKSA/IGdldFByb2R1Y3RXaWR0aCgpIDogJydcIiBzdHlsZT1cImN1cnNvcjpwb2ludGVyOyBwb3NpdGlvbjogcmVsYXRpdmU7XCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdHlsZXM/LnRoZW1lID09IHRoZW1lLlRoZW1lMVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJQcm9kdWN0RGVzYzsgY29udGV4dDoge2RhdGE6IHByb2R1Y3QsIGluZGV4OiBpfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN0eWxlcz8udGhlbWUgIT0gdGhlbWUuVGhlbWUxXCI+XG4gICAgICAgICAgICAgICAgPHNpbXBvLXNtYWxsLXByb2R1Y3QtbGlzdGluZyBbcHJvZHVjdF09XCJwcm9kdWN0XCIgW2RhdGFdPVwiZGF0YVwiIFtpc1Njcm9sbGFibGVdPVwic2NyZWVuV2lkdGggPiA0NzVcIlxuICAgICAgICAgICAgICAgICAgW2luZGV4XT1cImlcIj48L3NpbXBvLXNtYWxsLXByb2R1Y3QtbGlzdGluZz5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c2ltcG8tY2FyZC1za2VsZXRvbi1sb2FkZXIgKm5nSWY9XCJpc0xpc3RMb2FkaW5nXCIgW2NvdW50XT1cImdldEVsZW1lbnRSb3coKVwiPjwvc2ltcG8tY2FyZC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJlbXB0eS1jYXJ0XCIgKm5nSWY9XCIhaXNMaXN0TG9hZGluZyAmJiByZXNwb25zZURhdGE/Lmxlbmd0aCA9PSAwXCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FydC1pbWFnZVwiPlxuICAgICAgICAgICAgICAgIDxpbWcgbG9hZGluZz1cImxhenlcIiBzdHlsZT1cImhlaWdodDogMTUwcHg7IHdpZHRoOiAxNTBweDtcIlxuICAgICAgICAgICAgICAgICAgc3JjPVwiaHR0cHM6Ly9wcm9kLXNpbXBvLnMzLmFwLXNvdXRoLTEuYW1hem9uYXdzLmNvbS9wcm9kLWltYWdlcy8xMDcyMTNjMTcxNjU0MzMzNDA0MGVtcHR5LWNhcnQucG5nXCJcbiAgICAgICAgICAgICAgICAgIGFsdD1cIlwiPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcnQtdGV4dFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkaW5nLW1lZGl1bSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgUHJvZHVjdCBsaXN0IGlzIGVtcHR5XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIG10LTRcIj5cbiAgICAgICAgICAgICAgICAgIExvb2tzIGxpa2Ugbm8gaXRlbSBpcyBwcmVzZW50IHdpdGggZmlsdGVyLiBHbyBhaGVhZCAmIGV4cGxvcmUgdG9wIGNhdGVnb3JpZXMuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPHNpbXBvLWNhcmQtc2tlbGV0b24tbG9hZGVyICpuZ0lmPVwiYXBpTG9hZGluZ1wiIFtjb3VudF09XCJnZXRFbGVtZW50Um93KClcIj48L3NpbXBvLWNhcmQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJib3R0b20tZmlsdGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmlsdGVyLXRleHRcIiBzdHlsZT1cImdhcDogMTBweFwiIChjbGljayk9XCJvcGVuU29ydGluZyhTb3J0aW5nU2VjdGlvbilcIj5cbiAgICAgICAgICA8bWF0LWljb24+c29ydDwvbWF0LWljb24+XG4gICAgICAgICAgPHNwYW4+U29ydCBieTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaXZpZGVyXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmlsdGVyLXRleHRcIiBzdHlsZT1cImdhcDogMTBweFwiIChjbGljayk9XCJvcGVuRmlsdGVyKEZpbHRlclNlY3Rpb24pXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmZpbHRlcl9saXN0PC9tYXQtaWNvbj5cbiAgICAgICAgICA8c3Bhbj5GaWx0ZXI8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IFtuZ0NsYXNzXT1cInsnaG92ZXJfZWZmZWN0JzogZWRpdH1cIiAqbmdJZj1cInNob3dFZGl0b3JzXCI+XG4gICAgICA8c2ltcG8taG92ZXItZWxlbWVudHMgW2RhdGFdPVwiZGF0YVwiIFtpbmRleF09XCJpbmRleFwiIFtlZGl0T3B0aW9uc109XCJlZGl0XCJcbiAgICAgICAgW2lzRWNvbW1lcmNlXT1cInRydWVcIj48L3NpbXBvLWhvdmVyLWVsZW1lbnRzPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCJzaG93RGVsZXRlXCIgW25nQ2xhc3NdPVwieydob3Zlcl9lZmZlY3QnOiBkZWxldGV9XCI+XG4gICAgICA8c2ltcG8tZGVsZXRlLWhvdmVyLWVsZW1lbnQgW2RhdGFdPVwiZGF0YVwiIFtpbmRleF09XCJpbmRleFwiPjwvc2ltcG8tZGVsZXRlLWhvdmVyLWVsZW1lbnQ+XG4gICAgPC9kaXY+XG4gIDwvc2VjdGlvbj5cbjwvbmctY29udGFpbmVyPlxuXG48bmd4LXNrZWxldG9uLWxvYWRlciAqbmdJZj1cImlzTG9hZGluZ1wiIGNvdW50PVwiMVwiIGFwcGVhcmFuY2U9XCJjaXJjbGVcIlxuICBbdGhlbWVdPVwieyB3aWR0aDogJzEwMCUnLCBoZWlnaHQ6ICc0MHZoJywgJ2JvcmRlci1yYWRpdXMnOiAnMTBweCcsICdwb3NpdGlvbic6ICdyZWxhdGl2ZScsICdyaWdodCc6ICc1cHgnIH1cIj48L25neC1za2VsZXRvbi1sb2FkZXI+XG5cbjxuZy10ZW1wbGF0ZSAjRmF2b3VyaXRlVGFncyBsZXQtcHJvZHVjdD1cImRhdGFcIj5cbiAgPGRpdiBjbGFzcz1cImZhdi1pY29uLXdyYXBwZXJcIj5cbiAgICA8bWF0LWljb24gY2xhc3M9XCJmYXYtaWNvblwiIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcbiAgICAgIChjbGljayk9XCJ0b2dnbGVJdGVtVG9GYXYoJGV2ZW50LCBwcm9kdWN0LCAnQUREJylcIiAqbmdJZj1cIiFwcm9kdWN0LndoaXNsaXN0XCI+ZmF2b3JpdGVfYm9yZGVyXG4gICAgPC9tYXQtaWNvbj5cbiAgICA8bWF0LWljb24gY2xhc3M9XCJmYXYtaWNvblwiIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcbiAgICAgIChjbGljayk9XCJ0b2dnbGVJdGVtVG9GYXYoJGV2ZW50LCBwcm9kdWN0LCAnUkVNT1ZFJylcIiAqbmdJZj1cInByb2R1Y3Qud2hpc2xpc3RcIj5mYXZvcml0ZVxuICAgIDwvbWF0LWljb24+XG4gICAgPHNwYW4gY2xhc3M9XCJmYXYtdG9vbHRpcFwiPlxuICAgICAge3sgcHJvZHVjdC53aGlzbGlzdCA/ICdSZW1vdmUgZnJvbSB3aXNobGlzdCcgOiAnQWRkIHRvIHdpc2hsaXN0JyB9fVxuICAgIDwvc3Bhbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG5cblxuPG5nLXRlbXBsYXRlICNUYWdzIGxldC1wcm9kdWN0PVwiZGF0YVwiPlxuICA8ZGl2IGNsYXNzPVwicHJvZHVjdC10YWctYmFkZ2VcIiAqbmdJZj1cInByb2R1Y3Q/LnRhZ3M/Lmxlbmd0aFwiPlxuICAgIDxzcGFuICpuZ0Zvcj1cImxldCB0YWcgb2YgcHJvZHVjdC50YWdzOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJwcm9kdWN0LXRhZy1sYWJlbFwiXG4gICAgICBbY2xhc3MudGFnLWFjdGl2ZV09XCJpID09PSAodGFnSW5kZXhNYXBbcHJvZHVjdC5pdGVtSWRdID8/IDApXCIgW3N0eWxlLmJhY2tncm91bmRdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXG4gICAgICBbc3R5bGUuY29sb3JdPVwiZ2V0VGV4dENvbG9yKHN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IpXCI+XG4gICAgICB7eyB0YWcgfX1cbiAgICA8L3NwYW4+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuXG48bmctdGVtcGxhdGUgI0ZpbHRlclNlY3Rpb24+XG4gIDxzZWN0aW9uPlxuICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzLXNlY3Rpb25cIiAqbmdJZj1cImNhdGVnb3JpZXM/Lmxlbmd0aFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMgaGVhZGluZy1zbWFsbCBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCJcbiAgICAgICAgKGNsaWNrKT1cImNhdGVnb3JpZXNDb2xsYXBzZWQgPSAhY2F0ZWdvcmllc0NvbGxhcHNlZFwiIHN0eWxlPVwiY3Vyc29yOnBvaW50ZXJcIj5cbiAgICAgICAgPGg2PjxiPlNob3AgYnkgQ2F0ZWdvcmllczwvYj48L2g2PlxuICAgICAgICA8bWF0LWljb24+e3sgY2F0ZWdvcmllc0NvbGxhcHNlZCA/ICdleHBhbmRfbW9yZScgOiAnZXhwYW5kX2xlc3MnIH19PC9tYXQtaWNvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjYXRlZ29yaWVzQ29sbGFwc2VkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1vcHRpb25zXCIgKm5nRm9yPVwibGV0IGNhdGVnb3J5IG9mIGRpc3BsYXllZENhdGVnb3JpZXNcIlxuICAgICAgICAgIChjbGljayk9XCJhcHBseUZpbHRlcihjYXRlZ29yeSwgJ0ZJTFRFUicpXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiY2hlY2stY29sb3JcIiBbc3R5bGUuLS1jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcbiAgICAgICAgICAgIFtjaGVja2VkXT1cImNhdGVnb3J5LnN0YXR1c1wiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRyaW0tdGV4dFwiPnt7Y2F0ZWdvcnkub3B0aW9uIHwgdGl0bGVjYXNlfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJjYXRlZ29yaWVzLmxlbmd0aCA+IDRcIiBjbGFzcz1cInRvZ2dsZS1jYXRlZ29yaWVzXCIgKGNsaWNrKT1cInRvZ2dsZUNhdGVnb3JpZXMoKVwiXG4gICAgICAgICAgW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRvZ2dsZS10ZXh0XCI+XG4gICAgICAgICAgICB7eyBzaG93QWxsQ2F0ZWdvcmllcyA/ICdTaG93IExlc3MnIDogJ1Nob3cgTW9yZScgfX1cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHJvcGRvd24taWNvblwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNob3dBbGxDYXRlZ29yaWVzXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmV4cGFuZF9tb3JlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93QWxsQ2F0ZWdvcmllc1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5leHBhbmRfbGVzczwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzLXNlY3Rpb25cIiAqbmdJZj1cImNvbGxlY3Rpb25zPy5sZW5ndGhcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzIGhlYWRpbmctc21hbGwgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiXG4gICAgICAgIChjbGljayk9XCJjb2xsZWN0aW9uc0NvbGxhcHNlZCA9ICFjb2xsZWN0aW9uc0NvbGxhcHNlZFwiIHN0eWxlPVwiY3Vyc29yOnBvaW50ZXJcIj5cbiAgICAgICAgPGg2PjxiPlNob3AgYnkgQ29sbGVjdGlvbnM8L2I+PC9oNj5cbiAgICAgICAgPG1hdC1pY29uPnt7IGNvbGxlY3Rpb25zQ29sbGFwc2VkID8gJ2V4cGFuZF9tb3JlJyA6ICdleHBhbmRfbGVzcycgfX08L21hdC1pY29uPlxuICAgICAgPC9kaXY+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbGxlY3Rpb25zQ29sbGFwc2VkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1vcHRpb25zXCIgKm5nRm9yPVwibGV0IGNvbGxlY3Rpb24gb2YgZGlzcGxheWVkQ29sbGVjdGlvbnNcIlxuICAgICAgICAgIChjbGljayk9XCJhcHBseUZpbHRlcihjb2xsZWN0aW9uLCAnRklMVEVSJylcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJjaGVjay1jb2xvclwiIFtzdHlsZS4tLWNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxuICAgICAgICAgICAgW2NoZWNrZWRdPVwiY29sbGVjdGlvbi5zdGF0dXNcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0cmltLXRleHRcIj57e2NvbGxlY3Rpb24ub3B0aW9uIHwgdGl0bGVjYXNlfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJjb2xsZWN0aW9ucy5sZW5ndGggPiA0XCIgY2xhc3M9XCJ0b2dnbGUtY2F0ZWdvcmllc1wiIChjbGljayk9XCJ0b2dnbGVDb2xsZWN0aW9ucygpXCJcbiAgICAgICAgICBbc3R5bGUuY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9nZ2xlLXRleHRcIj5cbiAgICAgICAgICAgIHt7IHNob3dBbGxDb2xsZWN0aW9ucyA/ICdTaG93IExlc3MnIDogJ1Nob3cgTW9yZScgfX1cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHJvcGRvd24taWNvblwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNob3dBbGxDb2xsZWN0aW9uc1wiPjxtYXQtaWNvbj5leHBhbmRfbW9yZTwvbWF0LWljb24+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93QWxsQ29sbGVjdGlvbnNcIj48bWF0LWljb24+ZXhwYW5kX2xlc3M8L21hdC1pY29uPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzIGhlYWRpbmctc21hbGwgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiXG4gICAgICAgIChjbGljayk9XCJyYXRpbmdzQ29sbGFwc2VkID0gIXJhdGluZ3NDb2xsYXBzZWRcIiBzdHlsZT1cImN1cnNvcjpwb2ludGVyXCI+XG4gICAgICAgIDxoNj48Yj5SYXRpbmdzPC9iPjwvaDY+XG4gICAgICAgIDxtYXQtaWNvbj57eyByYXRpbmdzQ29sbGFwc2VkID8gJ2V4cGFuZF9tb3JlJyA6ICdleHBhbmRfbGVzcycgfX08L21hdC1pY29uPlxuICAgICAgPC9kaXY+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXJhdGluZ3NDb2xsYXBzZWRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LW9wdGlvbnNcIiAqbmdGb3I9XCJsZXQgcmF0aW5nIG9mIHJhdGluZ09wdGlvbnNcIiAoY2xpY2spPVwib25SYXRpbmdDaGFuZ2UocmF0aW5nKVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImNoZWNrLWNvbG9yXCIgW3N0eWxlLi0tY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJyYXRpbmcuc2VsZWN0ZWRcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0cmltLXRleHRcIj57eyByYXRpbmcubGFiZWwgfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzIGhlYWRpbmctc21hbGwgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiXG4gICAgICAgIChjbGljayk9XCJwcmljZUNvbGxhcHNlZCA9ICFwcmljZUNvbGxhcHNlZFwiIHN0eWxlPVwiY3Vyc29yOnBvaW50ZXJcIj5cbiAgICAgICAgPGg2PjxiPlNob3AgYnkgcHJpY2U8L2I+PC9oNj5cbiAgICAgICAgPG1hdC1pY29uPnt7IHByaWNlQ29sbGFwc2VkID8gJ2V4cGFuZF9tb3JlJyA6ICdleHBhbmRfbGVzcycgfX08L21hdC1pY29uPlxuICAgICAgPC9kaXY+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXByaWNlQ29sbGFwc2VkXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNhdGVnb3J5LW9wdGlvbnNcIiAqbmdGb3I9XCJsZXQgcmFuZ2Ugb2YgcHJpY2VSYW5nZXM7bGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImNoZWNrLWNvbG9yXCIgW3N0eWxlLi0tY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJhbmdlLnNlbGVjdGVkXCIgKGNoYW5nZSk9XCJvblByaWNlUmFuZ2VDaGFuZ2UoaSlcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0cmltLXRleHRcIj57eyByYW5nZS5sYWJlbCB9fTwvZGl2PlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cblxuXG4gICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMtc2VjdGlvblwiICpuZ0lmPVwidG9TaG93SW5KZXdlbGxlcnlcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzIGhlYWRpbmctc21hbGwgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiXG4gICAgICAgIChjbGljayk9XCJwcm9kdWN0VHlwZUNvbGxhcHNlZCA9ICFwcm9kdWN0VHlwZUNvbGxhcHNlZFwiIHN0eWxlPVwiY3Vyc29yOnBvaW50ZXJcIj5cbiAgICAgICAgPGg2PjxiPlByb2R1Y3QgVHlwZTwvYj48L2g2PlxuICAgICAgICA8bWF0LWljb24+e3sgcHJvZHVjdFR5cGVDb2xsYXBzZWQgPyAnZXhwYW5kX21vcmUnIDogJ2V4cGFuZF9sZXNzJyB9fTwvbWF0LWljb24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcHJvZHVjdFR5cGVDb2xsYXBzZWRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LW9wdGlvbnNcIiAqbmdGb3I9XCJsZXQgc2l6ZSBvZiBwcm9kdWN0VHlwZXNEYXRhXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiY2hlY2stY29sb3JcIiBbc3R5bGUuLS1jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcbiAgICAgICAgICAgIFtjaGVja2VkXT1cInNpemUuc3RhdHVzXCIgKGNoYW5nZSk9XCJ0b2dnbGVQcm9kdWN0U2l6ZShzaXplKVwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRyaW0tdGV4dFwiPnt7IHNpemUuc2l6ZSB9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMtc2VjdGlvblwiICpuZ0lmPVwidG9TaG93SW5KZXdlbGxlcnlcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzIGhlYWRpbmctc21hbGwgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiXG4gICAgICAgIChjbGljayk9XCJzaG9wRm9yQ29sbGFwc2VkID0gIXNob3BGb3JDb2xsYXBzZWRcIiBzdHlsZT1cImN1cnNvcjpwb2ludGVyXCI+XG4gICAgICAgIDxoNj48Yj5TaG9wIGZvcjwvYj48L2g2PlxuICAgICAgICA8bWF0LWljb24+e3sgc2hvcEZvckNvbGxhcHNlZCA/ICdleHBhbmRfbW9yZScgOiAnZXhwYW5kX2xlc3MnIH19PC9tYXQtaWNvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFzaG9wRm9yQ29sbGFwc2VkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1vcHRpb25zXCIgKm5nRm9yPVwibGV0IHNpemUgb2Ygc2hvcEZvckRhdGFcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJjaGVjay1jb2xvclwiIFtzdHlsZS4tLWNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxuICAgICAgICAgICAgW2NoZWNrZWRdPVwic2l6ZS5zdGF0dXNcIiAoY2hhbmdlKT1cInRvZ2dsZVNob3BTaXplKHNpemUpXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJpbS10ZXh0XCI+e3sgc2l6ZS5zaXplIH19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllcy1zZWN0aW9uXCIgKm5nSWY9XCJ0b1Nob3dJbkpld2VsbGVyeVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMgaGVhZGluZy1zbWFsbCBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCJcbiAgICAgICAgKGNsaWNrKT1cIm1hdGVyaWFsQ29sbGFwc2VkID0gIW1hdGVyaWFsQ29sbGFwc2VkXCIgc3R5bGU9XCJjdXJzb3I6cG9pbnRlclwiPlxuICAgICAgICA8aDY+PGI+TWF0ZXJpYWw8L2I+PC9oNj5cbiAgICAgICAgPG1hdC1pY29uPnt7IG1hdGVyaWFsQ29sbGFwc2VkID8gJ2V4cGFuZF9tb3JlJyA6ICdleHBhbmRfbGVzcycgfX08L21hdC1pY29uPlxuICAgICAgPC9kaXY+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIW1hdGVyaWFsQ29sbGFwc2VkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1vcHRpb25zXCIgKm5nRm9yPVwibGV0IHNpemUgb2YgbWF0ZXJpYWxTaXplRGF0YVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImNoZWNrLWNvbG9yXCIgW3N0eWxlLi0tY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJzaXplLnN0YXR1c1wiIChjaGFuZ2UpPVwidG9nZ2xlTWF0ZXJpYWxTaXplKHNpemUpXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJpbS10ZXh0XCI+e3sgc2l6ZS5zaXplIH19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllcy1zZWN0aW9uXCIgKm5nSWY9XCJ0b1Nob3dJbkpld2VsbGVyeVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMgaGVhZGluZy1zbWFsbCBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCJcbiAgICAgICAgKGNsaWNrKT1cIm1ldGFsQ29sbGFwc2VkID0gIW1ldGFsQ29sbGFwc2VkXCIgc3R5bGU9XCJjdXJzb3I6cG9pbnRlclwiPlxuICAgICAgICA8aDY+PGI+TWV0YWw8L2I+PC9oNj5cbiAgICAgICAgPG1hdC1pY29uPnt7IG1ldGFsQ29sbGFwc2VkID8gJ2V4cGFuZF9tb3JlJyA6ICdleHBhbmRfbGVzcycgfX08L21hdC1pY29uPlxuICAgICAgPC9kaXY+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIW1ldGFsQ29sbGFwc2VkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1vcHRpb25zXCIgKm5nRm9yPVwibGV0IHNpemUgb2YgbWV0YWxTaXplRGF0YVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImNoZWNrLWNvbG9yXCIgW3N0eWxlLi0tY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJzaXplLnN0YXR1c1wiIChjaGFuZ2UpPVwidG9nZ2xlTWV0YWxTaXplKHNpemUpXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJpbS10ZXh0XCI+e3sgc2l6ZS5zaXplIH19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllcy1zZWN0aW9uXCIgKm5nSWY9XCJ0b1Nob3dJbkpld2VsbGVyeVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMgaGVhZGluZy1zbWFsbCBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCJcbiAgICAgICAgKGNsaWNrKT1cInJpbmdTdHlsZUNvbGxhcHNlZCA9ICFyaW5nU3R5bGVDb2xsYXBzZWRcIiBzdHlsZT1cImN1cnNvcjpwb2ludGVyXCI+XG4gICAgICAgIDxoNj48Yj5SaW5nIFN0eWxlPC9iPjwvaDY+XG4gICAgICAgIDxtYXQtaWNvbj57eyByaW5nU3R5bGVDb2xsYXBzZWQgPyAnZXhwYW5kX21vcmUnIDogJ2V4cGFuZF9sZXNzJyB9fTwvbWF0LWljb24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcmluZ1N0eWxlQ29sbGFwc2VkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1vcHRpb25zXCIgKm5nRm9yPVwibGV0IHNpemUgb2YgcmluZ1NpemVzXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiY2hlY2stY29sb3JcIiBbc3R5bGUuLS1jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcbiAgICAgICAgICAgIFtjaGVja2VkXT1cInNpemUuc3RhdHVzXCIgKGNoYW5nZSk9XCJ0b2dnbGVTaXplKHNpemUpXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJpbS10ZXh0XCI+e3sgc2l6ZS5zaXplIH19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvc2VjdGlvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjU29ydGluZ1NlY3Rpb24+XG4gIDxzZWN0aW9uIHN0eWxlPVwicGFkZGluZzogMTBweFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzIGhlYWRpbmctc21hbGwgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW0tY2VudGVyIFwiIHN0eWxlPVwicGFkZGluZzogMHB4O1wiPlxuICAgICAgPHNwYW4+U29ydCBieTwvc3Bhbj5cbiAgICAgIDxtYXQtaWNvbiAoY2xpY2spPVwiY2xvc2VEaWFsb2coKVwiPmNsb3NlPC9tYXQtaWNvbj5cbiAgICA8L2Rpdj5cbiAgICA8bWF0LXJhZGlvLWdyb3VwIGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uXCIgWyhuZ01vZGVsKV09XCJzb3J0QnlcIj5cbiAgICAgIDxtYXQtcmFkaW8tYnV0dG9uICpuZ0Zvcj1cImxldCBzb3J0aW5nVHlwZSBvZiBmaWx0ZXJpbmdBcnJheVwiIChjbGljayk9XCJzZWxlY3RPcHRpb24oc29ydGluZ1R5cGUsICRldmVudClcIlxuICAgICAgICBbdmFsdWVdPVwic29ydGluZ1R5cGUudmFsdWVcIj57e3NvcnRpbmdUeXBlLm5hbWV9fTwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICA8L21hdC1yYWRpby1ncm91cD5cbiAgPC9zZWN0aW9uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNQcm9kdWN0RGVzYyBsZXQtcHJvZHVjdD1cImRhdGFcIiBsZXQtaW5kZXg9XCJpbmRleFwiPlxuICA8bmctdGVtcGxhdGUgI3RoZW1lMXN0eWxlMT5cbiAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1jYXJkIHBvc2l0aW9uLXJlbGF0aXZlIGgtMTAwXCIgW25nQ2xhc3NdPVwieydob3Zlci1lZmZlY3QnOiBzdHlsZXM/LnRoZW1lID09IHRoZW1lLlRoZW1lMX1cIj5cbiAgICAgIDxkaXYgKm5nSWY9XCIhKHByb2R1Y3QuaXRlbUltYWdlcz8ubGVuZ3RoICYmIHByb2R1Y3QuaXRlbUltYWdlcz8uWzBdPy5pbWdVcmwpXCJcbiAgICAgICAgY2xhc3M9XCJkZWZhdWx0LWltYWdlIHBvc2l0aW9uLXJlbGF0aXZlXCI+XG4gICAgICAgIDxpbWcgbG9hZGluZz1cImxhenlcIiBzcmM9XCJodHRwczovL2kucG9zdGltZy5jYy9oUFMySnBWMC9uby1pbWFnZS1hdmFpbGFibGUuanBnXCIgYWx0PVwiXCJcbiAgICAgICAgICAoY2xpY2spPVwicHJvY2VlZFRvUHJvZHVjdERlc2MocHJvZHVjdClcIiBbc2ltcG9CYWNrZ3JvdW5kXT1cInN0eWxlcz8uYmFja2dyb3VuZFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiRmF2b3VyaXRlVGFnczsgY29udGV4dDoge2RhdGE6IHByb2R1Y3R9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJUYWdzOyBjb250ZXh0OiB7ZGF0YTogcHJvZHVjdH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwicHJvZHVjdC5pdGVtSW1hZ2VzPy5sZW5ndGggJiYgcHJvZHVjdC5pdGVtSW1hZ2VzPy5bMF0/LmltZ1VybFwiXG4gICAgICAgIGNsYXNzPVwiZGVmYXVsdC1pbWFnZSBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxuICAgICAgICA8aW1nIGxvYWRpbmc9XCJsYXp5XCIgb25lcnJvcj1cInRoaXMuc3JjPSdodHRwczovL2kucG9zdGltZy5jYy9oUFMySnBWMC9uby1pbWFnZS1hdmFpbGFibGUuanBnJ1wiXG4gICAgICAgICAgW3NyY109XCJnZXRQcm9kdWN0SW1hZ2VzKHByb2R1Y3QpXCIgYWx0PVwiXCIgY2xhc3M9XCJwcm9kdWN0LWltZ1wiIFtjbGFzcy5mYWRlLW91dF09XCJpbWFnZUluZGV4ID09IGluZGV4XCJcbiAgICAgICAgICAoY2xpY2spPVwicHJvY2VlZFRvUHJvZHVjdERlc2MocHJvZHVjdClcIiBbc2ltcG9CYWNrZ3JvdW5kXT1cInN0eWxlcz8uYmFja2dyb3VuZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2Fyb3VzZWwtYnV0dG9uc1wiICpuZ0lmPVwicHJvZHVjdC5pdGVtSW1hZ2VzPy5sZW5ndGggPiAxXCI+XG4gICAgICAgICAgPGRpdj48bWF0LWljb24gKGNsaWNrKT1cImNoYW5nZUltYWdlKHByb2R1Y3QsICdQUkVWJywgaW5kZXgpXCI+a2V5Ym9hcmRfYXJyb3dfbGVmdDwvbWF0LWljb24+PC9kaXY+XG4gICAgICAgICAgPGRpdj48bWF0LWljb24gKGNsaWNrKT1cImNoYW5nZUltYWdlKHByb2R1Y3QsICdORVhUJywgaW5kZXgpXCI+a2V5Ym9hcmRfYXJyb3dfcmlnaHQ8L21hdC1pY29uPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIkZhdm91cml0ZVRhZ3M7IGNvbnRleHQ6IHtkYXRhOiBwcm9kdWN0fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiVGFnczsgY29udGV4dDoge2RhdGE6IHByb2R1Y3R9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIm10LTIgdy0xMDBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInZhcmllbnQtbGlzdFwiICpuZ0lmPVwicHJvZHVjdD8uaXRlbVZhcmlhbnQ/Lmxlbmd0aFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHZhcmllbnQgb2YgcHJvZHVjdD8uaXRlbVZhcmlhbnQ7IGxldCBpZHggPSBpbmRleFwiPlxuICAgICAgICAgICAgPGltZyBsb2FkaW5nPVwibGF6eVwiIG9uZXJyb3I9XCJ0aGlzLnNyYz0naHR0cHM6Ly9pLnBvc3RpbWcuY2MvaFBTMkpwVjAvbm8taW1hZ2UtYXZhaWxhYmxlLmpwZydcIlxuICAgICAgICAgICAgICBbc3JjXT1cInZhcmllbnQudmFyaWFudEltYWdlcz8uWzBdPy5pbWdVcmxcIiBhbHQ9XCJcIiBjbGFzcz1cInZhcmllbnRcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3NlbGVjdGVkLXZhcmllbnQnOiB2YXJpZW50LnZhcmlhbnRJZCA9PSBwcm9kdWN0LnZhcmllbnRJZH1cIlxuICAgICAgICAgICAgICBbc3R5bGUuYm9yZGVyQ29sb3JdPVwidmFyaWVudC52YXJpYW50SWQgPT0gcHJvZHVjdC52YXJpZW50SWQgPyAnYmx1ZScgOiAndHJhbnNwYXJlbnQnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFZhcmllbnQocHJvZHVjdCwgdmFyaWVudClcIj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbS1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIiBbc3R5bGUuZGlzcGxheV09XCJ0cnVlID8gJ2Jsb2NrIWltcG9ydGFudCcgOiAnJ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmljZSBib2R5LWxhcmdlIHRleHQtbGVmdCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGctMTBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmcy0xNlwiPlxuICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJIVE1MXT0nY3VycmVuY3knPjwvc3Bhbj5cbiAgICAgICAgICAgICAge3twcm9kdWN0Py5wcmljZT8uc2VsbGluZ1ByaWNlIHwgbnVtYmVyOicxLjItMid9fVxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmcy0xNiB0ZXh0LXN0YXJ0XCI+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicHJvZHVjdD8ucHJpY2U/LnZhbHVlIC0gcHJvZHVjdD8ucHJpY2U/LmRpc2NvdW50ZWRQcmljZSA+IDJcIiBjbGFzcz1cImRpc2NvdW50LXByaWNlXCI+XG4gICAgICAgICAgICAgICAge3twcm9kdWN0Py5wcmljZT8udmFsdWUgfCBudW1iZXI6JzEuMi0yJ319XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwicHJpY2UgZGlzY291bnQtcHJpY2VcIiAqbmdJZj1cInByb2R1Y3Q/LnByaWNlPy5kaXNjb3VudGVkUHJpY2UgPCBwcm9kdWN0Py5wcmljZT8uc2VsbGluZ1ByaWNlXCI+XG4gICAgICAgICAgICAgIDxzcGFuIFtpbm5lckhUTUxdPSdjdXJyZW5jeSc+PC9zcGFuPlxuICAgICAgICAgICAgICB7e3Byb2R1Y3QucHJpY2Uuc2VsbGluZ1ByaWNlIHwgbnVtYmVyOicxLjItMid9fVxuICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtbmFtZSBoZWFkaW5nLWxhcmdlIHctMTAwIHRleHQtbGVmdCB0cmltLXRleHRcIlxuICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj57eyBwcm9kdWN0Lm5hbWUgfX08L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXRlcmlhbC1pbmZvXCJcbiAgICAgICAgICAgICpuZ0lmPVwiaXNNYXRlcmlhbEJhc2VkUHJpY2luZyAmJiAocHJvZHVjdD8ubWF0ZXJpYWxzPy5sZW5ndGggfHwgcHJvZHVjdD8uYmFzZVdlaWdodClcIj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicHJvZHVjdD8ubWF0ZXJpYWxzPy5bMF0/LnB1cml0eVwiPnt7IHByb2R1Y3QubWF0ZXJpYWxzWzBdLnB1cml0eSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicHJvZHVjdD8ubWF0ZXJpYWxzPy5bMF0/LnB1cml0eSAmJiBwcm9kdWN0Py5iYXNlV2VpZ2h0XCI+IMK3IDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicHJvZHVjdD8uYmFzZVdlaWdodFwiPnt7IHByb2R1Y3QuYmFzZVdlaWdodCB9fWc8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cImNvbnRlbnQ/LmRpc3BsYXk/LnNob3dCdXR0b24gJiYgIWVjb21Db25maWdzPy5hcHBvaW50bWVudEJvb2tpbmdFbmFibGVkICYmIHByb2R1Y3QuaXRlbUludmVudG9yeT8ub3BlbmluZ1N0b2NrID4gMFwiXG4gICAgICAgICAgICBjbGFzcz1cImFkZC10by1jYXJ0LWJ0blwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNlbmQtYnRuIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBwLTJcIiBbYnV0dG9uRGF0YV09XCJidXR0b24/LmNvbnRlbnRcIlxuICAgICAgICAgICAgICBzaW1wb0J1dHRvbkRpcmVjdGl2ZSBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCIgW2NvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxuICAgICAgICAgICAgICBbYmFja2dyb3VuZEluZm9dPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kXCIgW2FwcEJ1dHRvbkVkaXRvcl09XCJlZGl0ID8/IGZhbHNlXCJcbiAgICAgICAgICAgICAgW2J1dHRvblN0eWxlXT1cImdldEJ1dHRvblN0eWxlKDEpXCIgW2J1dHRvbklkXT1cImdldEJ1dHRvbklkKDEpXCIgW2lkXT1cImRhdGE/LmlkK2dldEJ1dHRvbklkKDEpXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCIoIXByb2R1Y3QucXVhbnRpdHkgJiYgIWlzSXRlbU91dE9mU3RvY2socHJvZHVjdCkpICYmIElzRWNvbW1lcmNlXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZEl0ZW1Ub0NhcnQoJGV2ZW50LCBwcm9kdWN0LCAnQUREJylcIj5BZGQgdG8gQ2FydDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFJc0Vjb21tZXJjZVwiIFtidXR0b25EYXRhXT1cImJ1dHRvbj8uY29udGVudFwiIHNpbXBvQnV0dG9uRGlyZWN0aXZlIFtzZWN0aW9uSWRdPVwiZGF0YT8uaWRcIlxuICAgICAgICAgICAgICBbY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiIFtiYWNrZ3JvdW5kSW5mb109XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmRcIlxuICAgICAgICAgICAgICBbYXBwQnV0dG9uRWRpdG9yXT1cImVkaXQgPz8gZmFsc2VcIiBbYnV0dG9uU3R5bGVdPVwiZ2V0QnV0dG9uU3R5bGUoMSlcIiBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMSlcIlxuICAgICAgICAgICAgICBbaWRdPVwiZGF0YT8uaWQrZ2V0QnV0dG9uSWQoMSlcIiAoY2xpY2spPVwicmFpc2VMZWFkKClcIj5Ob3RpZnkgTWU8L2J1dHRvbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWFudGl0eSBmdWxsLXdpZHRoLXF1YW50aXR5XCIgW3N0eWxlLmJvcmRlckNvbG9yXT1cImdldEJ1dHRvblN0eWxlKDEpPy5iYWNrZ3JvdW5kXCJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cInRydWUgPyAnMTAwJScgOiAnJ1wiICpuZ0lmPVwicHJvZHVjdC5xdWFudGl0eSAmJiAhaXNJdGVtT3V0T2ZTdG9jayhwcm9kdWN0KVwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoYW5nZS1xdWFudGl0eVwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImdldEJ1dHRvblN0eWxlKDEpPy5iYWNrZ3JvdW5kXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiZ2V0QnV0dG9uU3R5bGUoMSk/LnRleHRDb2xvclwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZEl0ZW1Ub0NhcnQoJGV2ZW50LCBwcm9kdWN0LCAnU1VCU1RSQUNUJylcIj4tPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cIndpZHRoOiA3MCU7XCI+e3twcm9kdWN0LnF1YW50aXR5fX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hhbmdlLXF1YW50aXR5XCIgW3N0eWxlLmJhY2tncm91bmRdPVwiZ2V0QnV0dG9uU3R5bGUoMSk/LmJhY2tncm91bmRcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJnZXRCdXR0b25TdHlsZSgxKT8udGV4dENvbG9yXCIgKGNsaWNrKT1cImFkZEl0ZW1Ub0NhcnQoJGV2ZW50LCBwcm9kdWN0LCAnQUREJylcIj4rPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxidXR0b24gZGlzYWJsZWQgY2xhc3M9XCJvdXQtb2Ytc3RvY2tcIiAqbmdJZj1cImlzSXRlbU91dE9mU3RvY2socHJvZHVjdClcIj5PdXQgT2YgU3RvY2s8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJ5LWJ1dHRvbi1zZWN0aW9uXCJcbiAgICAgICAgICAgICpuZ0lmPVwiY29udGVudD8uZGlzcGxheT8uc2hvd0J1dHRvbiAmJiBlY29tQ29uZmlncz8uYXBwb2ludG1lbnRCb29raW5nRW5hYmxlZCAmJiBwcm9kdWN0Py5pdGVtSW52ZW50b3J5Py5vcGVuaW5nU3RvY2sgPiAwXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJ5LWF0LWhvbWVcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNlbmQtYnRuIHAtMlwiIFtidXR0b25EYXRhXT1cImJ1dHRvbj8uY29udGVudFwiIHNpbXBvQnV0dG9uRGlyZWN0aXZlIFtzZWN0aW9uSWRdPVwiZGF0YT8uaWRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRUb1RyaWFsQ2FydChwcm9kdWN0KVwiIFtjb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcbiAgICAgICAgICAgICAgICBbYmFja2dyb3VuZEluZm9dPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kXCIgW2FwcEJ1dHRvbkVkaXRvcl09XCJlZGl0ID8/IGZhbHNlXCJcbiAgICAgICAgICAgICAgICBbYnV0dG9uU3R5bGVdPVwiZ2V0QnV0dG9uU3R5bGUoMSlcIiBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMSlcIiBbaWRdPVwiZGF0YT8uaWQrZ2V0QnV0dG9uSWQoMSlcIj5UUlkgQVRcbiAgICAgICAgICAgICAgICBIT01FPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2aWRlby1jYWxsLWltYWdlXCI+XG4gICAgICAgICAgICAgIDxpbWcgc3JjPVwiaHR0cHM6Ly9kMno5NDk3eHA4eGIxMi5jbG91ZGZyb250Lm5ldC9wcm9kLWltYWdlcy81Nzg2MDZjMTc1MzQ1MDgxMDI2MnZpZGVvX0NhbGwuc3ZnXCJcbiAgICAgICAgICAgICAgICBhbHQ9XCJ2aWRlb1wiIChjbGljayk9XCJvcGVuRGlhbG9nQm94KGRpYWxvZ0JveCwgcHJvZHVjdC5uYW1lKVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwic2NyZWVuV2lkdGggPCA0NzUgJiYgc3R5bGVzPy5tb2JpbGVDb2x1bW4gPT09IDE7IGVsc2UgdGhlbWUxc3R5bGUxXCI+XG4gICAgPGRpdiBjbGFzcz1cInJvdyB3LTEwMFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC04IGQtZmxleCBmbGV4LWNvbHVtbiBnYXAtM1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1sZWZ0XCIgW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj57eyBwcm9kdWN0Lm5hbWUgfX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZzLTE2IHRleHQtc3RhcnRcIj5cbiAgICAgICAgICA8c3BhbiBbaW5uZXJIVE1MXT0nY3VycmVuY3knPjwvc3Bhbj5cbiAgICAgICAgICB7e3Byb2R1Y3Q/LnByaWNlPy5zZWxsaW5nUHJpY2UgfCBudW1iZXI6JzEuMi0yJ319XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctNDVcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cImNvbnRlbnQ/LmRpc3BsYXk/LnNob3dCdXR0b24gJiYgIWVjb21Db25maWdzPy5hcHBvaW50bWVudEJvb2tpbmdFbmFibGVkICYmIHByb2R1Y3QuaXRlbUludmVudG9yeT8ub3BlbmluZ1N0b2NrID4gMFwiXG4gICAgICAgICAgICBjbGFzcz1cImFkZC10by1jYXJ0LWJ0biB3LTEwMFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNlbmQtYnRuIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBwLTJcIiBbYnV0dG9uRGF0YV09XCJidXR0b24/LmNvbnRlbnRcIlxuICAgICAgICAgICAgICBzaW1wb0J1dHRvbkRpcmVjdGl2ZSBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCIgW2NvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxuICAgICAgICAgICAgICBbYmFja2dyb3VuZEluZm9dPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kXCIgW2FwcEJ1dHRvbkVkaXRvcl09XCJlZGl0ID8/IGZhbHNlXCJcbiAgICAgICAgICAgICAgW2J1dHRvblN0eWxlXT1cImdldEJ1dHRvblN0eWxlKDEpXCIgW2J1dHRvbklkXT1cImdldEJ1dHRvbklkKDEpXCIgW2lkXT1cImRhdGE/LmlkK2dldEJ1dHRvbklkKDEpXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCIoIXByb2R1Y3QucXVhbnRpdHkgJiYgIWlzSXRlbU91dE9mU3RvY2socHJvZHVjdCkpICYmIElzRWNvbW1lcmNlXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZEl0ZW1Ub0NhcnQoJGV2ZW50LCBwcm9kdWN0LCAnQUREJylcIj5BZGQgdG8gQ2FydDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFJc0Vjb21tZXJjZVwiIFtidXR0b25EYXRhXT1cImJ1dHRvbj8uY29udGVudFwiIHNpbXBvQnV0dG9uRGlyZWN0aXZlIFtzZWN0aW9uSWRdPVwiZGF0YT8uaWRcIlxuICAgICAgICAgICAgICBbY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiIFtiYWNrZ3JvdW5kSW5mb109XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmRcIlxuICAgICAgICAgICAgICBbYXBwQnV0dG9uRWRpdG9yXT1cImVkaXQgPz8gZmFsc2VcIiBbYnV0dG9uU3R5bGVdPVwiZ2V0QnV0dG9uU3R5bGUoMSlcIiBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMSlcIlxuICAgICAgICAgICAgICBbaWRdPVwiZGF0YT8uaWQrZ2V0QnV0dG9uSWQoMSlcIiAoY2xpY2spPVwicmFpc2VMZWFkKClcIj5Ob3RpZnkgTWU8L2J1dHRvbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWFudGl0eSBmdWxsLXdpZHRoLXF1YW50aXR5IGJyLThcIiBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiZ2V0QnV0dG9uU3R5bGUoMSk/LmJhY2tncm91bmRcIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwidHJ1ZSA/ICcxMDAlJyA6ICcnXCIgKm5nSWY9XCJwcm9kdWN0LnF1YW50aXR5ICYmICFpc0l0ZW1PdXRPZlN0b2NrKHByb2R1Y3QpXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hhbmdlLXF1YW50aXR5IHctMzUgYnItOFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImdldEJ1dHRvblN0eWxlKDEpPy5iYWNrZ3JvdW5kXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiZ2V0QnV0dG9uU3R5bGUoMSk/LnRleHRDb2xvclwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZEl0ZW1Ub0NhcnQoJGV2ZW50LCBwcm9kdWN0LCAnU1VCU1RSQUNUJylcIj4tPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cIndpZHRoOiA3MCU7XCI+e3twcm9kdWN0LnF1YW50aXR5fX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hhbmdlLXF1YW50aXR5IHctMzUgYnItOFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImdldEJ1dHRvblN0eWxlKDEpPy5iYWNrZ3JvdW5kXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiZ2V0QnV0dG9uU3R5bGUoMSk/LnRleHRDb2xvclwiIChjbGljayk9XCJhZGRJdGVtVG9DYXJ0KCRldmVudCwgcHJvZHVjdCwgJ0FERCcpXCI+Kzwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8YnV0dG9uIGRpc2FibGVkIGNsYXNzPVwib3V0LW9mLXN0b2NrIHctMTAwXCIgKm5nSWY9XCJpc0l0ZW1PdXRPZlN0b2NrKHByb2R1Y3QpXCI+T3V0IE9mIFN0b2NrPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRyeS1idXR0b24tc2VjdGlvbiB3LTEwMFwiXG4gICAgICAgICAgICAqbmdJZj1cImNvbnRlbnQ/LmRpc3BsYXk/LnNob3dCdXR0b24gJiYgZWNvbUNvbmZpZ3M/LmFwcG9pbnRtZW50Qm9va2luZ0VuYWJsZWQgJiYgcHJvZHVjdD8uaXRlbUludmVudG9yeT8ub3BlbmluZ1N0b2NrID4gMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRyeS1hdC1ob21lXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzZW5kLWJ0biBwLTJcIiBbYnV0dG9uRGF0YV09XCJidXR0b24/LmNvbnRlbnRcIiBzaW1wb0J1dHRvbkRpcmVjdGl2ZSBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkVG9UcmlhbENhcnQocHJvZHVjdClcIiBbY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgW2JhY2tncm91bmRJbmZvXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZFwiIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgW2J1dHRvblN0eWxlXT1cImdldEJ1dHRvblN0eWxlKDEpXCIgW2J1dHRvbklkXT1cImdldEJ1dHRvbklkKDEpXCIgW2lkXT1cImRhdGE/LmlkK2dldEJ1dHRvbklkKDEpXCI+VFJZIEFUXG4gICAgICAgICAgICAgICAgSE9NRTwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmlkZW8tY2FsbC1pbWFnZVwiPlxuICAgICAgICAgICAgICA8aW1nIHNyYz1cImh0dHBzOi8vZDJ6OTQ5N3hwOHhiMTIuY2xvdWRmcm9udC5uZXQvcHJvZC1pbWFnZXMvNTc4NjA2YzE3NTM0NTA4MTAyNjJ2aWRlb19DYWxsLnN2Z1wiXG4gICAgICAgICAgICAgICAgYWx0PVwidmlkZW9cIiAoY2xpY2spPVwib3BlbkRpYWxvZ0JveChkaWFsb2dCb3gsIHByb2R1Y3QubmFtZSlcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTQgaC0xMDAgcG9zaXRpb24tcmVsYXRpdmVcIj5cbiAgICAgICAgPGltZyBsb2FkaW5nPVwibGF6eVwiIG9uZXJyb3I9XCJ0aGlzLnNyYz0naHR0cHM6Ly9pLnBvc3RpbWcuY2MvaFBTMkpwVjAvbm8taW1hZ2UtYXZhaWxhYmxlLmpwZydcIlxuICAgICAgICAgIFtzcmNdPVwiZ2V0UHJvZHVjdEltYWdlcyhwcm9kdWN0KVwiIGFsdD1cIlwiIGNsYXNzPVwidy1oLTExMFwiIFtjbGFzcy5mYWRlLW91dF09XCJpbWFnZUluZGV4ID09IGluZGV4XCJcbiAgICAgICAgICAoY2xpY2spPVwicHJvY2VlZFRvUHJvZHVjdERlc2MocHJvZHVjdClcIj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG5cblxuICA8L25nLWNvbnRhaW5lcj5cblxuXG5cblxuXG48L25nLXRlbXBsYXRlPlxuXG5cblxuPG5nLXRlbXBsYXRlICNkaWFsb2dCb3g+XG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlciBkLWZsZXggYWxpZ24taXRlbS1jZW50ZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJoZWFkaW5nLXZpZGVvIHctMTAwIHB5LTIgdGV4dC1jZW50ZXJcIj5MaXZlIFZpZGVvIGNhbGwgYXQgeW91ciBjb252ZW5pZW5jZSE8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzY2hlZHVsZS1oZWFkZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtZW5kIHAtMlwiPlxuICAgICAgICA8bWF0LWljb24gKGNsaWNrKT1cIm1hdENsb3NlRGlhbG9nKClcIlxuICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGYtMThcIj5jbG9zZTwvbWF0LWljb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBoLTEwMFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBoLTEwMCB3LTEwMCB2aWRlby1jYWxsLWNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgaC0xMDBcIiAqbmdJZj1cIiFpc01vYmlsZVwiPlxuICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgIHNyYz1cImh0dHBzOi8vZDJ6OTQ5N3hwOHhiMTIuY2xvdWRmcm9udC5uZXQvcHJvZC1pbWFnZXMvNTU3Njk5YzE3NTM3Nzk1MDM5MTNmcmVlcGlrLW92ZXJoZWFkLXNob3QtYS1wZXJzb24taG9sZGluZy1hLXNtYXJ0cGhvbmUtd2l0aC1hLTEwMjlfdm1nOEdxSGogKG9ubGluZS12aWRlby1jdXR0ZXIuY29tKS5naWZcIlxuICAgICAgICAgICAgYWx0PVwiXCIgY2xhc3M9XCJ3LTEwMCBoLTEwMFwiIHN0eWxlPVwib2JqZWN0LWZpdDogY292ZXI7XCI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgcG9zaXRpb24tcmVsYXRpdmUgaC0xMDAgY2FsbC1kZXRhaWxzXCI+XG4gICAgICAgICAgPCEtLSBOYW1lIElucHV0IHdpdGggVmFsaWRhdGlvbiAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZmllbGQgbXktM1wiIFtjbGFzcy5lcnJvci1ib3JkZXJdPVwidmFsaWRhdGlvbkVycm9ycy51c2VybmFtZVwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBOYW1lKlwiIFsobmdNb2RlbCldPVwidmlkZW9DYWxsUGF5bG9hZC51c2VybmFtZVwiXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0Q2hhbmdlKCd1c2VybmFtZScpXCI+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJpbnB1dC1maWVsZCBteS0zXCIgW2NsYXNzLmVycm9yLWJvcmRlcl09XCJ2YWxpZGF0aW9uRXJyb3JzLmVtYWlsXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImVtYWlsXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBFbWFpbCpcIiBbKG5nTW9kZWwpXT1cInZpZGVvQ2FsbFBheWxvYWQuZW1haWxcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25JbnB1dENoYW5nZSgnZW1haWwnKVwiPlxuICAgICAgICAgIDwvZGl2PiAtLT5cblxuICAgICAgICAgIDwhLS0gTW9iaWxlIE51bWJlciBJbnB1dCB3aXRoIFZhbGlkYXRpb24gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWZpZWxkIG15LTNcIiBbY2xhc3MuZXJyb3ItYm9yZGVyXT1cInZhbGlkYXRpb25FcnJvcnMubW9iaWxlTnVtYmVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLXRleHQtY2FsbFwiPklOICs5MTwvZGl2PlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBwbGFjZWhvbGRlcj1cIkVudGVyIE1vYmlsZSpcIiBbKG5nTW9kZWwpXT1cInZpZGVvQ2FsbFBheWxvYWQubW9iaWxlTnVtYmVyXCJcbiAgICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJ21vYmlsZU51bWJlcicpXCI+XG4gICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgIDwhLS0gUGluY29kZSBJbnB1dCB3aXRoIFZhbGlkYXRpb25cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZmllbGQgbXktM1wiIFtjbGFzcy5lcnJvci1ib3JkZXJdPVwidmFsaWRhdGlvbkVycm9ycy5waW5jb2RlXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLXRleHQtY2FsbCBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciB3LTEyIGJvcmRlci11bnNldFwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJmLTE4IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiPmdwc19maXhlZDwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBQaW4gQ29kZSpcIiBjbGFzcz1cInctODhcIiBbKG5nTW9kZWwpXT1cInZpZGVvQ2FsbFBheWxvYWQucGluY29kZVwiXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0Q2hhbmdlKCdwaW5jb2RlJylcIj5cbiAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxhbmd1YWdlIG15LTNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaW5pLXRleHQgbWItMlwiPkxhbmd1YWdlIFByZWZlcmVuY2U8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYW5ndWFnZS1jb250YWluZXIgZC1mbGV4IGdhcC0yIGZsZXgtd3JhcCBtdC0xXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGxhbmcgb2YgbGFuZ3VhZ2VzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhbmcgcHgtMiBweS0xIHJvdW5kZWQgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwibGFuZyA9PSBzZWxlY3RlZExhbmcgPyBkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogJydcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGVkTGFuZyA9IGxhbmdcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImxhbmcgPT0gc2VsZWN0ZWRMYW5nID8gZ2V0VGV4dENvbG9yKGRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IpIDogJyMwMDAwMDAnXCI+XG4gICAgICAgICAgICAgICAgICB7e2xhbmd9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZExhbmcgPT0gJ090aGVycydcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1maWVsZCBteS0zXCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgT3RoZXIgTGFuZ3VhZ2VcIiBbKG5nTW9kZWwpXT1cIm90aGVyTGFuZ3VhZ2VcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ2aWRlby1idG4gbXQtMiBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIiAoY2xpY2spPVwic2NoZWR1bGVWaWRlb0NhbGwoKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNTdWJtaXR0aW5nXCIgW3N0eWxlLmJhY2tncm91bmRdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiIFtzdHlsZS5jb2xvcl09XCJnZXRUZXh0Q29sb3IoZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvcilcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1N1Ym1pdHRpbmdcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXItYm9yZGVyIHNwaW5uZXItYm9yZGVyLXNtIG1lLTJcIiByb2xlPVwic3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIj5Mb2FkaW5nLi4uPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgU0NIRURVTElORy4uLlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzU3VibWl0dGluZyAmJiAhc2NoZWR1bGVkXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbj52aWRlb19jYWxsPC9tYXQtaWNvbj4mbmJzcDtcbiAgICAgICAgICAgICAgU0NIRURVTEUgQSBWSURFTyBDQUxMXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzY2hlZHVsZWRcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uPmNoZWNrX2NpcmNsZTwvbWF0LWljb24+Jm5ic3A7XG4gICAgICAgICAgICAgIFNDSEVEVUxFRCBTVUNDRVNTRlVMTFlcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+Il19