buildingproduct-library 0.2.73

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 (295) hide show
  1. package/README.md +24 -0
  2. package/assets/fonts/arial-webfont.woff +0 -0
  3. package/assets/fonts/arial-webfont.woff2 +0 -0
  4. package/assets/fonts/arialblack-webfont.woff +0 -0
  5. package/assets/fonts/arialblack-webfont.woff2 +0 -0
  6. package/assets/fonts/arialbold-webfont.woff +0 -0
  7. package/assets/fonts/arialbold-webfont.woff2 +0 -0
  8. package/assets/fonts/helveticaneue.woff +0 -0
  9. package/assets/fonts/helveticaneue.woff2 +0 -0
  10. package/assets/fonts/helveticaneuemedium-webfont.woff +0 -0
  11. package/assets/fonts/helveticaneuemedium-webfont.woff2 +0 -0
  12. package/assets/fonts/helveticaneuethin-webfont.woff +0 -0
  13. package/assets/fonts/helveticaneuethin-webfont.woff2 +0 -0
  14. package/assets/fonts/icomoon.ttf +0 -0
  15. package/assets/fonts/icomoon.woff +0 -0
  16. package/assets/images/ActivateIcon.svg +14 -0
  17. package/assets/images/AlertIcon.svg +3 -0
  18. package/assets/images/DisableIcon.svg +3 -0
  19. package/assets/images/Divider line.svg +3 -0
  20. package/assets/images/EditIconEnabled.svg +6 -0
  21. package/assets/images/EditIcondisabled.svg +6 -0
  22. package/assets/images/Grid-dark.svg +8 -0
  23. package/assets/images/Grid-light.svg +8 -0
  24. package/assets/images/Hamburger_icon_white.png +0 -0
  25. package/assets/images/Icon-awesome-user-alt-white.svg +13 -0
  26. package/assets/images/Icon-ionic-ios-arrow-down.svg +3 -0
  27. package/assets/images/Icon-ionic-ios-help-circle.svg +6 -0
  28. package/assets/images/Icon-ionic-ios-home.svg +6 -0
  29. package/assets/images/Icon-ionic-ios-settings.svg +6 -0
  30. package/assets/images/Icon-material-shopping-cart.svg +7 -0
  31. package/assets/images/Invited.svg +4 -0
  32. package/assets/images/List-dark.svg +3 -0
  33. package/assets/images/List-light.svg +3 -0
  34. package/assets/images/PDP-add-more.svg +3 -0
  35. package/assets/images/PDP-colour-selected.svg +7 -0
  36. package/assets/images/PDP-quote-exists.svg +12 -0
  37. package/assets/images/PDP-remove-icon.svg +3 -0
  38. package/assets/images/Selected icon.svg +3 -0
  39. package/assets/images/Selected-icon.svg +3 -0
  40. package/assets/images/banner-image.png +0 -0
  41. package/assets/images/br_down.png +0 -0
  42. package/assets/images/cart-shopping-fast.svg +6 -0
  43. package/assets/images/check-square.svg +3 -0
  44. package/assets/images/checkmark-circle-outline.svg +4 -0
  45. package/assets/images/closegrey.svg +71 -0
  46. package/assets/images/dashboard.svg +35 -0
  47. package/assets/images/delivery.svg +11 -0
  48. package/assets/images/download-icon.svg +7 -0
  49. package/assets/images/downloads-dark.svg +6 -0
  50. package/assets/images/downloads-light.svg +6 -0
  51. package/assets/images/erroricon.svg +3 -0
  52. package/assets/images/home-icon.svg +6 -0
  53. package/assets/images/home_banner.png +0 -0
  54. package/assets/images/ic_calender.svg +15 -0
  55. package/assets/images/icon-clock-icon.svg +10 -0
  56. package/assets/images/icon-feather-edit.svg +6 -0
  57. package/assets/images/icon-flashing-black.svg +3 -0
  58. package/assets/images/icon-flashing-white.svg +3 -0
  59. package/assets/images/icon-ionic-ios-search.svg +3 -0
  60. package/assets/images/icon-logout.svg +6 -0
  61. package/assets/images/icon-mail-icon.svg +7 -0
  62. package/assets/images/icon-metro-info.svg +3 -0
  63. package/assets/images/ionic-arrow-back.svg +3 -0
  64. package/assets/images/ionic-ios-feather-phone.svg +3 -0
  65. package/assets/images/ionic-ios-help-circle-outline.svg +6 -0
  66. package/assets/images/ionic-ios-location-outline.svg +3 -0
  67. package/assets/images/ionic-ios-my-location.svg +3 -0
  68. package/assets/images/ionic-ios-users-outline.svg +3 -0
  69. package/assets/images/ionic-trash.svg +3 -0
  70. package/assets/images/logo-black.svg +16 -0
  71. package/assets/images/logo-dark.svg +48 -0
  72. package/assets/images/logo.svg +16 -0
  73. package/assets/images/my-account.svg +21 -0
  74. package/assets/images/my-list.svg +43 -0
  75. package/assets/images/my-team.svg +17 -0
  76. package/assets/images/newsfeed-banner.jpg +0 -0
  77. package/assets/images/no-saved-cart.svg +3 -0
  78. package/assets/images/open-account-logout.png +0 -0
  79. package/assets/images/orders.svg +23 -0
  80. package/assets/images/pdp-noimage.svg +21 -0
  81. package/assets/images/pickup.svg +8 -0
  82. package/assets/images/plp-grid-noimage.svg +22 -0
  83. package/assets/images/plp-list-noimage.svg +16 -0
  84. package/assets/images/product-banner.png +0 -0
  85. package/assets/images/product-details-dark.svg +10 -0
  86. package/assets/images/product-details-light.svg +10 -0
  87. package/assets/images/products.svg +34 -0
  88. package/assets/images/quotes.svg +12 -0
  89. package/assets/images/related-products-dark.svg +9 -0
  90. package/assets/images/related-products-light.svg +9 -0
  91. package/assets/images/search-noimage.svg +16 -0
  92. package/assets/images/see-more-bg-hover.svg +1 -0
  93. package/assets/images/see-more-bg.svg +1 -0
  94. package/assets/images/shopping-cart-icon.svg +14 -0
  95. package/assets/images/slash-small-white.svg +3 -0
  96. package/assets/images/warningicon.svg +3 -0
  97. package/assets/images/why-dimond.svg +7 -0
  98. package/buildingproduct-library-0.2.73.tgz +0 -0
  99. package/buildingproduct-library.d.ts +5 -0
  100. package/bundles/buildingproduct-library.umd.js +9907 -0
  101. package/bundles/buildingproduct-library.umd.js.map +1 -0
  102. package/esm2015/buildingproduct-library.js +5 -0
  103. package/esm2015/lib/account-dropdown/account-dropdown.component.js +126 -0
  104. package/esm2015/lib/account-dropdown/account-dropdown.module.js +55 -0
  105. package/esm2015/lib/account-dropdown/account-dropdown.service.js +55 -0
  106. package/esm2015/lib/checkout/add-new-address/add-new-address.component.js +435 -0
  107. package/esm2015/lib/checkout/checkout.module.js +141 -0
  108. package/esm2015/lib/checkout/custom-checkout/custom-checkout.component.js +362 -0
  109. package/esm2015/lib/checkout/order-confirmation/order-confirmation.component.js +41 -0
  110. package/esm2015/lib/checkout/order-review/delivery-information/delivery-information.component.js +32 -0
  111. package/esm2015/lib/checkout/order-review/order-review-grid/order-review-grid.component.js +92 -0
  112. package/esm2015/lib/checkout/order-review/order-review-list/order-review-list.component.js +94 -0
  113. package/esm2015/lib/checkout/order-review/order-review.component.js +147 -0
  114. package/esm2015/lib/constants/general.js +57 -0
  115. package/esm2015/lib/contact-us/contact-us.component.js +38 -0
  116. package/esm2015/lib/contact-us/contact-us.module.js +41 -0
  117. package/esm2015/lib/custom-cart/addto-saved-carts/addto-saved-carts.component.js +48 -0
  118. package/esm2015/lib/custom-cart/custom-cart.component.js +94 -0
  119. package/esm2015/lib/custom-cart/custom-cart.module.js +91 -0
  120. package/esm2015/lib/custom-header-logo/custom-header-logo.component.js +26 -0
  121. package/esm2015/lib/custom-header-logo/custom-header-logo.module.js +54 -0
  122. package/esm2015/lib/custom-header-paragraph/custom-header-paragraph.component.js +24 -0
  123. package/esm2015/lib/custom-header-paragraph/custom-header-paragraph.module.js +48 -0
  124. package/esm2015/lib/custom-mini-cart/custom-mini-cart.component.js +138 -0
  125. package/esm2015/lib/custom-mini-cart/custom-mini-cart.module.js +68 -0
  126. package/esm2015/lib/custom-navigation/custom-navigation/custom-navigation.component.js +121 -0
  127. package/esm2015/lib/custom-navigation/custom-navigation.module.js +89 -0
  128. package/esm2015/lib/custom-order-details/custom-order-details.component.js +197 -0
  129. package/esm2015/lib/custom-order-details/custom-order-details.module.js +91 -0
  130. package/esm2015/lib/custom-order-details/download-popup/download-popup.component.js +34 -0
  131. package/esm2015/lib/custom-order-details/order-detail-grid/order-detail-grid.component.js +108 -0
  132. package/esm2015/lib/custom-order-details/order-detail-list/order-detail-list.component.js +103 -0
  133. package/esm2015/lib/custom-order-history/custom-order-history.component.js +652 -0
  134. package/esm2015/lib/custom-order-history/custom-order-history.module.js +97 -0
  135. package/esm2015/lib/custom-order-history/slider-progress/slider-progress.component.js +62 -0
  136. package/esm2015/lib/custom-saved-cart/custom-saved-cart-details/custom-save-cart-dtl/custom-save-cart-dtl.component.js +96 -0
  137. package/esm2015/lib/custom-saved-cart/custom-saved-cart-details/custom-saved-cart-details.module.js +125 -0
  138. package/esm2015/lib/custom-saved-cart/custom-saved-cart-details/saved-cart-details-action/saved-cart-details-action.component.js +115 -0
  139. package/esm2015/lib/custom-saved-cart/custom-saved-cart-details/saved-cart-details-overview/saved-cart-details-overview.component.js +56 -0
  140. package/esm2015/lib/custom-saved-cart/custom-saved-cart-details/saved-cart-details.service.js +33 -0
  141. package/esm2015/lib/custom-saved-cart/custom-saved-cart.component.js +107 -0
  142. package/esm2015/lib/custom-saved-cart/custom-saved-cart.module.js +89 -0
  143. package/esm2015/lib/custom-saved-cart/save-cart.service.js +67 -0
  144. package/esm2015/lib/custom-saved-cart/saved-cart-general.js +49 -0
  145. package/esm2015/lib/custom-saved-cart/saved-cart.service.js +39 -0
  146. package/esm2015/lib/custom-search/custom-search.component.js +132 -0
  147. package/esm2015/lib/custom-search/custom-search.module.js +46 -0
  148. package/esm2015/lib/custom-user-account/custom-user-account.component.js +92 -0
  149. package/esm2015/lib/custom-user-account/custom-user-account.module.js +63 -0
  150. package/esm2015/lib/directives/custom-directives.module.js +22 -0
  151. package/esm2015/lib/directives/custom-paginatior.directive.js +127 -0
  152. package/esm2015/lib/environments/environment.js +24 -0
  153. package/esm2015/lib/find-store/find-store.component.js +94 -0
  154. package/esm2015/lib/find-store/find-store.module.js +66 -0
  155. package/esm2015/lib/help-support/help-support.component.js +24 -0
  156. package/esm2015/lib/help-support/help-support.module.js +38 -0
  157. package/esm2015/lib/my-account/account-dashboard/account-dashboard.component.js +134 -0
  158. package/esm2015/lib/my-account/account-statements/account-statements.component.js +57 -0
  159. package/esm2015/lib/my-account/invoice-credit/invoice-credit.component.js +342 -0
  160. package/esm2015/lib/my-account/my-account.component.js +85 -0
  161. package/esm2015/lib/my-account/my-account.module.js +91 -0
  162. package/esm2015/lib/my-team/my-team.component.js +418 -0
  163. package/esm2015/lib/my-team/my-team.module.js +96 -0
  164. package/esm2015/lib/my-team/team-member.service.js +123 -0
  165. package/esm2015/lib/pipes/custom-date-pipe.pipe.js +26 -0
  166. package/esm2015/lib/preference/preference.component.js +19 -0
  167. package/esm2015/lib/preference/preference.module.js +45 -0
  168. package/esm2015/lib/services/account-dropdown-state.service.js +21 -0
  169. package/esm2015/lib/services/cart.service.js +70 -0
  170. package/esm2015/lib/services/checkout.service.js +73 -0
  171. package/esm2015/lib/services/endPointURL.js +187 -0
  172. package/esm2015/lib/services/find-store.service.js +61 -0
  173. package/esm2015/lib/services/logout.service.js +50 -0
  174. package/esm2015/lib/services/my-account.service.js +68 -0
  175. package/esm2015/lib/services/order-history.service.js +65 -0
  176. package/esm2015/lib/services/order.review.js +38 -0
  177. package/esm2015/lib/services/search.service.js +42 -0
  178. package/esm2015/lib/services/user-account-detail-service.service.js +44 -0
  179. package/esm2015/lib/shared/CustomProduct.js +47 -0
  180. package/esm2015/lib/shared/active-saved-cart/active-saved-cart.component.js +105 -0
  181. package/esm2015/lib/shared/custom-breadcrum/custom-breadcrum.component.js +92 -0
  182. package/esm2015/lib/shared/custom-cart-detail/custom-cart-detail.component.js +95 -0
  183. package/esm2015/lib/shared/custom-cart-detail/custom-cart-grid/custom-cart-grid.component.js +355 -0
  184. package/esm2015/lib/shared/custom-cart-detail/custom-cart-list/custom-cart-list.component.js +360 -0
  185. package/esm2015/lib/shared/custom-cart-detail/custom-product-quantity-form/custom-product-quantity-form.component.js +575 -0
  186. package/esm2015/lib/shared/custom-cart-detail/split.pipe.js +17 -0
  187. package/esm2015/lib/shared/date-range-picker/date-range-picker.component.js +123 -0
  188. package/esm2015/lib/shared/regEx.validator.js +15 -0
  189. package/esm2015/lib/shared/saved-cart-popup/saved-cart-popup.component.js +85 -0
  190. package/esm2015/lib/shared/shared-components.module.js +108 -0
  191. package/esm2015/lib/shared/shared-download-order/shared-download-order.component.js +143 -0
  192. package/esm2015/lib/spa-custom-header.component.js +26 -0
  193. package/esm2015/lib/spa-custom-header.module.js +145 -0
  194. package/esm2015/lib/spa-custom-header.service.js +14 -0
  195. package/esm2015/lib/utils/utils.js +27 -0
  196. package/esm2015/lib/utils.js +27 -0
  197. package/esm2015/public-api.js +35 -0
  198. package/fesm2015/buildingproduct-library.js +9190 -0
  199. package/fesm2015/buildingproduct-library.js.map +1 -0
  200. package/lib/account-dropdown/account-dropdown.component.d.ts +22 -0
  201. package/lib/account-dropdown/account-dropdown.module.d.ts +10 -0
  202. package/lib/account-dropdown/account-dropdown.service.d.ts +14 -0
  203. package/lib/checkout/add-new-address/add-new-address.component.d.ts +29 -0
  204. package/lib/checkout/checkout.module.d.ts +26 -0
  205. package/lib/checkout/custom-checkout/custom-checkout.component.d.ts +80 -0
  206. package/lib/checkout/order-confirmation/order-confirmation.component.d.ts +26 -0
  207. package/lib/checkout/order-review/delivery-information/delivery-information.component.d.ts +13 -0
  208. package/lib/checkout/order-review/order-review-grid/order-review-grid.component.d.ts +27 -0
  209. package/lib/checkout/order-review/order-review-list/order-review-list.component.d.ts +28 -0
  210. package/lib/checkout/order-review/order-review.component.d.ts +44 -0
  211. package/lib/constants/general.d.ts +50 -0
  212. package/lib/contact-us/contact-us.component.d.ts +13 -0
  213. package/lib/contact-us/contact-us.module.d.ts +9 -0
  214. package/lib/custom-cart/addto-saved-carts/addto-saved-carts.component.d.ts +18 -0
  215. package/lib/custom-cart/custom-cart.component.d.ts +25 -0
  216. package/lib/custom-cart/custom-cart.module.d.ts +15 -0
  217. package/lib/custom-header-logo/custom-header-logo.component.d.ts +11 -0
  218. package/lib/custom-header-logo/custom-header-logo.module.d.ts +11 -0
  219. package/lib/custom-header-paragraph/custom-header-paragraph.component.d.ts +11 -0
  220. package/lib/custom-header-paragraph/custom-header-paragraph.module.d.ts +10 -0
  221. package/lib/custom-mini-cart/custom-mini-cart.component.d.ts +45 -0
  222. package/lib/custom-mini-cart/custom-mini-cart.module.d.ts +14 -0
  223. package/lib/custom-navigation/custom-navigation/custom-navigation.component.d.ts +37 -0
  224. package/lib/custom-navigation/custom-navigation.module.d.ts +21 -0
  225. package/lib/custom-order-details/custom-order-details.component.d.ts +60 -0
  226. package/lib/custom-order-details/custom-order-details.module.d.ts +17 -0
  227. package/lib/custom-order-details/download-popup/download-popup.component.d.ts +15 -0
  228. package/lib/custom-order-details/order-detail-grid/order-detail-grid.component.d.ts +30 -0
  229. package/lib/custom-order-details/order-detail-list/order-detail-list.component.d.ts +28 -0
  230. package/lib/custom-order-history/custom-order-history.component.d.ts +96 -0
  231. package/lib/custom-order-history/custom-order-history.module.d.ts +17 -0
  232. package/lib/custom-order-history/slider-progress/slider-progress.component.d.ts +15 -0
  233. package/lib/custom-saved-cart/custom-saved-cart-details/custom-save-cart-dtl/custom-save-cart-dtl.component.d.ts +32 -0
  234. package/lib/custom-saved-cart/custom-saved-cart-details/custom-saved-cart-details.module.d.ts +20 -0
  235. package/lib/custom-saved-cart/custom-saved-cart-details/saved-cart-details-action/saved-cart-details-action.component.d.ts +68 -0
  236. package/lib/custom-saved-cart/custom-saved-cart-details/saved-cart-details-overview/saved-cart-details-overview.component.d.ts +31 -0
  237. package/lib/custom-saved-cart/custom-saved-cart-details/saved-cart-details.service.d.ts +15 -0
  238. package/lib/custom-saved-cart/custom-saved-cart.component.d.ts +57 -0
  239. package/lib/custom-saved-cart/custom-saved-cart.module.d.ts +16 -0
  240. package/lib/custom-saved-cart/save-cart.service.d.ts +17 -0
  241. package/lib/custom-saved-cart/saved-cart-general.d.ts +88 -0
  242. package/lib/custom-saved-cart/saved-cart.service.d.ts +11 -0
  243. package/lib/custom-search/custom-search.component.d.ts +35 -0
  244. package/lib/custom-search/custom-search.module.d.ts +10 -0
  245. package/lib/custom-user-account/custom-user-account.component.d.ts +35 -0
  246. package/lib/custom-user-account/custom-user-account.module.d.ts +12 -0
  247. package/lib/directives/custom-directives.module.d.ts +8 -0
  248. package/lib/directives/custom-paginatior.directive.d.ts +24 -0
  249. package/lib/environments/environment.d.ts +12 -0
  250. package/lib/find-store/find-store.component.d.ts +34 -0
  251. package/lib/find-store/find-store.module.d.ts +12 -0
  252. package/lib/help-support/help-support.component.d.ts +11 -0
  253. package/lib/help-support/help-support.module.d.ts +9 -0
  254. package/lib/my-account/account-dashboard/account-dashboard.component.d.ts +34 -0
  255. package/lib/my-account/account-statements/account-statements.component.d.ts +24 -0
  256. package/lib/my-account/invoice-credit/invoice-credit.component.d.ts +62 -0
  257. package/lib/my-account/my-account.component.d.ts +26 -0
  258. package/lib/my-account/my-account.module.d.ts +18 -0
  259. package/lib/my-team/my-team.component.d.ts +96 -0
  260. package/lib/my-team/my-team.module.d.ts +17 -0
  261. package/lib/my-team/team-member.service.d.ts +17 -0
  262. package/lib/pipes/custom-date-pipe.pipe.d.ts +11 -0
  263. package/lib/preference/preference.component.d.ts +8 -0
  264. package/lib/preference/preference.module.d.ts +10 -0
  265. package/lib/services/account-dropdown-state.service.d.ts +10 -0
  266. package/lib/services/cart.service.d.ts +15 -0
  267. package/lib/services/checkout.service.d.ts +17 -0
  268. package/lib/services/endPointURL.d.ts +153 -0
  269. package/lib/services/find-store.service.d.ts +14 -0
  270. package/lib/services/logout.service.d.ts +11 -0
  271. package/lib/services/my-account.service.d.ts +16 -0
  272. package/lib/services/order-history.service.d.ts +14 -0
  273. package/lib/services/order.review.d.ts +11 -0
  274. package/lib/services/search.service.d.ts +11 -0
  275. package/lib/services/user-account-detail-service.service.d.ts +15 -0
  276. package/lib/shared/CustomProduct.d.ts +27 -0
  277. package/lib/shared/active-saved-cart/active-saved-cart.component.d.ts +56 -0
  278. package/lib/shared/custom-breadcrum/custom-breadcrum.component.d.ts +28 -0
  279. package/lib/shared/custom-cart-detail/custom-cart-detail.component.d.ts +32 -0
  280. package/lib/shared/custom-cart-detail/custom-cart-grid/custom-cart-grid.component.d.ts +74 -0
  281. package/lib/shared/custom-cart-detail/custom-cart-list/custom-cart-list.component.d.ts +79 -0
  282. package/lib/shared/custom-cart-detail/custom-product-quantity-form/custom-product-quantity-form.component.d.ts +93 -0
  283. package/lib/shared/custom-cart-detail/split.pipe.d.ts +7 -0
  284. package/lib/shared/date-range-picker/date-range-picker.component.d.ts +31 -0
  285. package/lib/shared/regEx.validator.d.ts +8 -0
  286. package/lib/shared/saved-cart-popup/saved-cart-popup.component.d.ts +37 -0
  287. package/lib/shared/shared-components.module.d.ts +24 -0
  288. package/lib/shared/shared-download-order/shared-download-order.component.d.ts +37 -0
  289. package/lib/spa-custom-header.component.d.ts +11 -0
  290. package/lib/spa-custom-header.module.d.ts +28 -0
  291. package/lib/spa-custom-header.service.d.ts +6 -0
  292. package/lib/utils/utils.d.ts +6 -0
  293. package/lib/utils.d.ts +5 -0
  294. package/package.json +90 -0
  295. package/public-api.d.ts +31 -0
@@ -0,0 +1,575 @@
1
+ import { __rest } from "tslib";
2
+ import { Component, ViewChild, Input, Output, EventEmitter, } from '@angular/core';
3
+ import { BehaviorSubject } from 'rxjs';
4
+ import { FormGroup } from '@angular/forms';
5
+ import { AccessoriesQuantity, ProductQuantity } from '../../CustomProduct';
6
+ import { RegexValidator, RegexConstants } from '../../regEx.validator';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/forms";
9
+ import * as i2 from "../../../services/cart.service";
10
+ import * as i3 from "@spartacus/core";
11
+ import * as i4 from "@spartacus/storefront";
12
+ import * as i5 from "@angular/common";
13
+ import * as i6 from "@ng-bootstrap/ng-bootstrap";
14
+ export class CustomProductQuantityFormComponent {
15
+ constructor(formBuilder, cdr, cartService, activeCartService, currentProductService) {
16
+ this.formBuilder = formBuilder;
17
+ this.cdr = cdr;
18
+ this.cartService = cartService;
19
+ this.activeCartService = activeCartService;
20
+ this.currentProductService = currentProductService;
21
+ this.env = sessionStorage.getItem('env');
22
+ this.environment = JSON.parse(this.env);
23
+ this.isDesktop = true;
24
+ this.isMobile = false;
25
+ this.isTablet = false;
26
+ this.totalPrice = '0.0';
27
+ this.hasBundle = false;
28
+ this.unitType = 'per LM';
29
+ this.accessoriesPrice = 0;
30
+ this.selectedColour = null;
31
+ this.isFinishedProduct = false;
32
+ this.isFlashingProduct = false;
33
+ this.listView = true;
34
+ this.productForm = new FormGroup({});
35
+ this.disableAddMore = false;
36
+ this.bundleList = [];
37
+ this.errorIndex = [];
38
+ this.hasProdRefIndex = [];
39
+ this.hasProdRef = false;
40
+ this.hasMinlengthError = [];
41
+ this.rowIndex = 0;
42
+ this.showWaitCursor = new BehaviorSubject(true);
43
+ this.addToCartError = null;
44
+ this.modalBundleForm = new FormGroup({});
45
+ this.editProdBundle = '';
46
+ this.editProdRef = '';
47
+ this.selectedIndex = null;
48
+ this.hasData = false;
49
+ this.product$ = this.currentProductService.getProduct();
50
+ this.updateCartEntires = new EventEmitter();
51
+ }
52
+ ngOnInit() {
53
+ var _a;
54
+ const cartObj = localStorage.getItem('spartacus⚿dimond-spa⚿cart');
55
+ this.cartId = (_a = JSON.parse(cartObj)) === null || _a === void 0 ? void 0 : _a.active;
56
+ this.screenWidth = window.innerWidth + 'px';
57
+ if (this.productDetails) {
58
+ this.createProductForm();
59
+ }
60
+ }
61
+ ngOnChanges(changes) {
62
+ var _a;
63
+ if (!((_a = changes === null || changes === void 0 ? void 0 : changes.productDetails) === null || _a === void 0 ? void 0 : _a.firstChange)) {
64
+ this.cdr.detectChanges();
65
+ }
66
+ }
67
+ // Create a Product Quantity Form
68
+ createProductForm() {
69
+ var _a, _b, _c, _d, _e;
70
+ this.accessoriesPrice = 0;
71
+ this.totalLength = null;
72
+ this.totalPrice = '0.0';
73
+ this.hasBundle = false;
74
+ this.disableAddMore = false;
75
+ this.bundleList = [];
76
+ this.errorIndex = [];
77
+ this.hasProdRefIndex = [];
78
+ this.rowIndex = 0;
79
+ this.productForm = new FormGroup({});
80
+ this.addToCartError = null;
81
+ this.productForm = this.formBuilder.group({
82
+ bundling: [''],
83
+ productQuantity: this.formBuilder.array([]),
84
+ jobReference: ['', [RegexValidator(RegexConstants.JOB_REFERENCE)]],
85
+ });
86
+ this.editProdBundle = '';
87
+ this.editProdRef = '';
88
+ this.selectedIndex = null;
89
+ this.hasProdRef = false;
90
+ this.hasMinlengthError = [];
91
+ if (this.isFinishedProduct) {
92
+ this.addProductQuantityFormGroup();
93
+ (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls[0]) === null || _b === void 0 ? void 0 : _b.patchValue({
94
+ prodQty: (_c = this.productDetails) === null || _c === void 0 ? void 0 : _c.quantity,
95
+ });
96
+ }
97
+ else {
98
+ this.modalBundleForm = this.formBuilder.group({
99
+ modBundle: ['', [RegexValidator(RegexConstants.BUNDLE_NAME)]],
100
+ modRef: ['', [RegexValidator(RegexConstants.JOB_REFERENCE)]],
101
+ });
102
+ (_e = (_d = this.productDetails) === null || _d === void 0 ? void 0 : _d.subLineConfigInfos) === null || _e === void 0 ? void 0 : _e.forEach((val, index) => {
103
+ var _a, _b;
104
+ this.addProductQuantityFormGroup();
105
+ if (!this.isNullOrEmpty(val === null || val === void 0 ? void 0 : val.bundleName)) {
106
+ this.hasBundle = true;
107
+ (_b = (_a = this.productForm) === null || _a === void 0 ? void 0 : _a.get('bundling')) === null || _b === void 0 ? void 0 : _b.setValue(true);
108
+ }
109
+ this.productQuantityForm.controls[index].patchValue({
110
+ prodBundle: val === null || val === void 0 ? void 0 : val.bundleName,
111
+ prodLen: this.pad3Digits(val === null || val === void 0 ? void 0 : val.length),
112
+ prodQty: val === null || val === void 0 ? void 0 : val.quantity,
113
+ prodRef: val === null || val === void 0 ? void 0 : val.reference,
114
+ });
115
+ });
116
+ }
117
+ this.cdr.detectChanges();
118
+ }
119
+ // Updating the Bundle
120
+ updateBundling(event) {
121
+ var _a, _b, _c;
122
+ this.hasBundle = ((_a = event.currentTarget) === null || _a === void 0 ? void 0 : _a.checked) === true;
123
+ if (this.hasBundle) {
124
+ (_c = (_b = this.productQuantityForm) === null || _b === void 0 ? void 0 : _b.controls) === null || _c === void 0 ? void 0 : _c.forEach((element, index) => {
125
+ this.updateSameBundleReference(null, index);
126
+ });
127
+ }
128
+ this.updateTotal();
129
+ }
130
+ // Check if any value is empty or undefined
131
+ isNullOrEmpty(value) {
132
+ return value == null || value == undefined || value == '';
133
+ }
134
+ // Check for any errors while updating the quantity
135
+ hasErrorIndex(index) {
136
+ return this.errorIndex[index] == true;
137
+ }
138
+ // Check if any Same Reference Error
139
+ hasProdRefErrorIndex(index) {
140
+ return this.hasProdRefIndex[index] == true;
141
+ }
142
+ // Group the Quantity values based on bundle
143
+ groupByBundle(items, key) {
144
+ return items.reduce((result, item) => (Object.assign(Object.assign({}, result), { [item[key]]: [...(result[item[key]] || []), item] })), {});
145
+ }
146
+ // Check the total bundle weight and update the error if it reaches to maximum bundle size for each bundle
147
+ checkTotalBundleWeight(formValues) {
148
+ var _a, _b;
149
+ let groupTotal = 0;
150
+ formValues === null || formValues === void 0 ? void 0 : formValues.forEach((currentValue) => {
151
+ const qty = parseFloat(currentValue === null || currentValue === void 0 ? void 0 : currentValue.prodQty);
152
+ const len = parseFloat(currentValue === null || currentValue === void 0 ? void 0 : currentValue.prodLen);
153
+ if (!this.isNullOrEmpty(qty) && !this.isNullOrEmpty(len)) {
154
+ groupTotal += qty * len;
155
+ }
156
+ });
157
+ groupTotal = groupTotal * (((_a = this.cuttingValidation) === null || _a === void 0 ? void 0 : _a.weightPerLM) || 1);
158
+ return groupTotal > (((_b = this.cuttingValidation) === null || _b === void 0 ? void 0 : _b.maxBundleLoad) || 1000);
159
+ }
160
+ // Get the last row of a bundle based on bundle name
161
+ getLastBundleIndex(bundleName) {
162
+ var _a, _b;
163
+ let indexValue = null;
164
+ (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.getRawValue()) === null || _b === void 0 ? void 0 : _b.forEach((element, index) => {
165
+ var _a;
166
+ if (((_a = element === null || element === void 0 ? void 0 : element.prodBundle) === null || _a === void 0 ? void 0 : _a.toUpperCase()) == (bundleName === null || bundleName === void 0 ? void 0 : bundleName.toUpperCase())) {
167
+ indexValue = index;
168
+ }
169
+ });
170
+ return indexValue;
171
+ }
172
+ // Get the Reference value of the same bundle and update
173
+ getPrevBundleReferenceValue(index) {
174
+ var _a, _b, _c, _d, _e, _f, _g, _h;
175
+ const bundleName = this.selectedIndex == null
176
+ ? (_d = (_c = (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls[index]) === null || _b === void 0 ? void 0 : _b.get('prodBundle')) === null || _c === void 0 ? void 0 : _c.value) === null || _d === void 0 ? void 0 : _d.toUpperCase()
177
+ : (_g = (_f = (_e = this.modalBundleForm) === null || _e === void 0 ? void 0 : _e.get('modBundle')) === null || _f === void 0 ? void 0 : _f.value) === null || _g === void 0 ? void 0 : _g.toUpperCase();
178
+ let refValue = '';
179
+ (_h = this.productQuantityForm) === null || _h === void 0 ? void 0 : _h.controls.forEach((element, ind) => {
180
+ var _a, _b, _c, _d, _e;
181
+ const otherRefValue = (_c = (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls[ind]) === null || _b === void 0 ? void 0 : _b.get('prodRef')) === null || _c === void 0 ? void 0 : _c.value;
182
+ if (((_e = (_d = element === null || element === void 0 ? void 0 : element.value) === null || _d === void 0 ? void 0 : _d.prodBundle) === null || _e === void 0 ? void 0 : _e.toUpperCase()) ==
183
+ (bundleName === null || bundleName === void 0 ? void 0 : bundleName.toUpperCase()) &&
184
+ (ind != index || this.selectedIndex != null) &&
185
+ !this.isNullOrEmpty(otherRefValue)) {
186
+ refValue = otherRefValue;
187
+ }
188
+ });
189
+ return refValue || '';
190
+ }
191
+ // Check if Same Refrence is already used
192
+ checkHasSameReference(index, currentReference, bundleName) {
193
+ var _a, _b;
194
+ let hasRef = false;
195
+ const prodRefValues = (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls) === null || _b === void 0 ? void 0 : _b.filter((element) => {
196
+ var _a, _b, _c;
197
+ return (((_a = element === null || element === void 0 ? void 0 : element.value) === null || _a === void 0 ? void 0 : _a.prodRef) == currentReference &&
198
+ ((_c = (_b = element === null || element === void 0 ? void 0 : element.value) === null || _b === void 0 ? void 0 : _b.prodBundle) === null || _c === void 0 ? void 0 : _c.toUpperCase()) !=
199
+ (bundleName === null || bundleName === void 0 ? void 0 : bundleName.toUpperCase()) &&
200
+ !this.isNullOrEmpty(currentReference));
201
+ });
202
+ if ((prodRefValues === null || prodRefValues === void 0 ? void 0 : prodRefValues.length) > 0) {
203
+ this.hasProdRefIndex[index] = true;
204
+ hasRef = true;
205
+ }
206
+ else {
207
+ this.hasProdRefIndex[index] = false;
208
+ }
209
+ this.cdr.detectChanges();
210
+ return hasRef;
211
+ }
212
+ // Update the Reference Value if already the same bundle is present
213
+ updateSameBundleReference(event, index, isReference = false) {
214
+ var _a, _b, _c, _d, _e, _f, _g, _h;
215
+ const bundleName = ((_c = (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls[index]) === null || _b === void 0 ? void 0 : _b.get('prodBundle')) === null || _c === void 0 ? void 0 : _c.value) ||
216
+ ((_d = this.modalBundleForm.get('modBundle')) === null || _d === void 0 ? void 0 : _d.value);
217
+ const newRefValue = event != null
218
+ ? event.currentTarget.value
219
+ : ((_g = (_f = (_e = this.productQuantityForm) === null || _e === void 0 ? void 0 : _e.controls[index]) === null || _f === void 0 ? void 0 : _f.get('prodRef')) === null || _g === void 0 ? void 0 : _g.value) ||
220
+ ((_h = this.modalBundleForm) === null || _h === void 0 ? void 0 : _h.get('modRef').value);
221
+ isReference = isReference
222
+ ? this.checkHasSameReference(index, newRefValue, bundleName)
223
+ : false;
224
+ if (!isReference) {
225
+ this.productQuantityForm.controls.forEach((element, ind) => {
226
+ var _a, _b, _c, _d, _e;
227
+ if (((_b = (_a = element === null || element === void 0 ? void 0 : element.value) === null || _a === void 0 ? void 0 : _a.prodBundle) === null || _b === void 0 ? void 0 : _b.toUpperCase()) ==
228
+ (bundleName === null || bundleName === void 0 ? void 0 : bundleName.toUpperCase()) &&
229
+ ind != index &&
230
+ !this.isNullOrEmpty(newRefValue) &&
231
+ !this.isNullOrEmpty(bundleName)) {
232
+ (_e = (_d = (_c = this.productQuantityForm) === null || _c === void 0 ? void 0 : _c.controls[ind]) === null || _d === void 0 ? void 0 : _d.get('prodRef')) === null || _e === void 0 ? void 0 : _e.setValue(newRefValue);
233
+ }
234
+ });
235
+ }
236
+ this.cdr.detectChanges();
237
+ }
238
+ // Update the same Bundle Refrence Value to all other Bundles if any changes in Reference Value
239
+ populateSameBundleReference(event, index) {
240
+ var _a, _b, _c, _d, _e;
241
+ if (event) {
242
+ const prevRefValue = this.getPrevBundleReferenceValue(index);
243
+ if (!this.isNullOrEmpty(prevRefValue)) {
244
+ (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls[index].get('prodRef')) === null || _b === void 0 ? void 0 : _b.setValue(prevRefValue);
245
+ this.modalBundleForm.get('modRef').setValue(prevRefValue);
246
+ }
247
+ }
248
+ else {
249
+ if (!this.isNullOrEmpty(this.getPrevBundleReferenceValue(index))) {
250
+ (_e = (_d = (_c = this.productQuantityForm) === null || _c === void 0 ? void 0 : _c.controls[index]) === null || _d === void 0 ? void 0 : _d.get('prodRef')) === null || _e === void 0 ? void 0 : _e.setValue(this.getPrevBundleReferenceValue(index) || '');
251
+ }
252
+ }
253
+ this.cdr.detectChanges();
254
+ }
255
+ // Update the Bundle List if more than one bundle/rows
256
+ updateBundleList() {
257
+ var _a, _b;
258
+ const formValues = this.groupByBundle((_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.getRawValue(), 'prodBundle');
259
+ if (((_b = Object.keys(formValues)) === null || _b === void 0 ? void 0 : _b.length) > 1) {
260
+ this.bundleList = Object.keys(formValues);
261
+ }
262
+ this.cdr.detectChanges();
263
+ }
264
+ // Get Bundle values only for mobile view
265
+ getBundleValues(index) {
266
+ var _a, _b, _c, _d, _e, _f;
267
+ const bundleValues = [];
268
+ bundleValues.push((_c = (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls[index]) === null || _b === void 0 ? void 0 : _b.get('prodBundle')) === null || _c === void 0 ? void 0 : _c.value);
269
+ bundleValues.push((_f = (_e = (_d = this.productQuantityForm) === null || _d === void 0 ? void 0 : _d.controls[index]) === null || _e === void 0 ? void 0 : _e.get('prodRef')) === null || _f === void 0 ? void 0 : _f.value);
270
+ return bundleValues;
271
+ }
272
+ // Edit Bundle Values
273
+ editBundleValue(index) {
274
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
275
+ this.selectedIndex = index;
276
+ (_a = this.modalBundleForm) === null || _a === void 0 ? void 0 : _a.get('modBundle').setValue((_d = (_c = (_b = this.productQuantityForm) === null || _b === void 0 ? void 0 : _b.controls[index]) === null || _c === void 0 ? void 0 : _c.get('prodBundle')) === null || _d === void 0 ? void 0 : _d.value.toUpperCase());
277
+ (_f = (_e = this.modalBundleForm) === null || _e === void 0 ? void 0 : _e.get('modRef')) === null || _f === void 0 ? void 0 : _f.setValue((_j = (_h = (_g = this.productQuantityForm) === null || _g === void 0 ? void 0 : _g.controls[index]) === null || _h === void 0 ? void 0 : _h.get('prodRef')) === null || _j === void 0 ? void 0 : _j.value);
278
+ this.cdr.detectChanges();
279
+ }
280
+ // Update/Save Bundle values
281
+ saveBundleDetails(event) {
282
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
283
+ (_c = (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls[this.selectedIndex]) === null || _b === void 0 ? void 0 : _b.get('prodBundle')) === null || _c === void 0 ? void 0 : _c.setValue((_e = (_d = this.modalBundleForm) === null || _d === void 0 ? void 0 : _d.get('modBundle')) === null || _e === void 0 ? void 0 : _e.value.toUpperCase());
284
+ (_h = (_g = (_f = this.productQuantityForm) === null || _f === void 0 ? void 0 : _f.controls[this.selectedIndex]) === null || _g === void 0 ? void 0 : _g.get('prodRef')) === null || _h === void 0 ? void 0 : _h.setValue((_k = (_j = this.modalBundleForm) === null || _j === void 0 ? void 0 : _j.get('modRef')) === null || _k === void 0 ? void 0 : _k.value);
285
+ this.updateSameBundleReference(null, this.selectedIndex, true);
286
+ this.updateTotal();
287
+ this.selectedIndex = null;
288
+ this.closebutton.nativeElement.click();
289
+ }
290
+ // Update Cart Deatils
291
+ updateCartDetails() {
292
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
293
+ if (this.isValidForm()) {
294
+ let payLoad = {};
295
+ if (this.isFinishedProduct) {
296
+ payLoad = {
297
+ quantity: (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls[0].get('prodQty')) === null || _b === void 0 ? void 0 : _b.value,
298
+ product: {
299
+ code: (_d = (_c = this.productDetails) === null || _c === void 0 ? void 0 : _c.product) === null || _d === void 0 ? void 0 : _d.code,
300
+ },
301
+ jobReference: (_f = (_e = this.productDetails) === null || _e === void 0 ? void 0 : _e.product) === null || _f === void 0 ? void 0 : _f.jobReference,
302
+ };
303
+ }
304
+ else {
305
+ payLoad = {
306
+ quantity: 1,
307
+ configurationInfos: [(_g = this.productDetails) === null || _g === void 0 ? void 0 : _g.configValues],
308
+ subLineConfigInfos: [],
309
+ jobReference: (_j = (_h = this.productDetails) === null || _h === void 0 ? void 0 : _h.product) === null || _j === void 0 ? void 0 : _j.jobReference,
310
+ };
311
+ (_l = (_k = this.productQuantityForm) === null || _k === void 0 ? void 0 : _k.controls) === null || _l === void 0 ? void 0 : _l.forEach((element, index) => {
312
+ var _a, _b, _c, _d, _e;
313
+ const configInfos = {
314
+ configuratorType: 'CUTTING',
315
+ quantity: (_a = element === null || element === void 0 ? void 0 : element.value) === null || _a === void 0 ? void 0 : _a.prodQty,
316
+ length: (_b = element === null || element === void 0 ? void 0 : element.value) === null || _b === void 0 ? void 0 : _b.prodLen,
317
+ };
318
+ if (this.hasBundle && ((_c = element === null || element === void 0 ? void 0 : element.value) === null || _c === void 0 ? void 0 : _c.prodBundle)) {
319
+ configInfos.bundleName = (_d = element === null || element === void 0 ? void 0 : element.value) === null || _d === void 0 ? void 0 : _d.prodBundle;
320
+ configInfos.reference = (_e = element === null || element === void 0 ? void 0 : element.value) === null || _e === void 0 ? void 0 : _e.prodRef;
321
+ }
322
+ payLoad.subLineConfigInfos.push(configInfos);
323
+ });
324
+ if ((payLoad === null || payLoad === void 0 ? void 0 : payLoad.configurationInfos) &&
325
+ ((_m = payLoad === null || payLoad === void 0 ? void 0 : payLoad.configurationInfos) === null || _m === void 0 ? void 0 : _m.length) > 0 &&
326
+ this.isNullOrEmpty(payLoad === null || payLoad === void 0 ? void 0 : payLoad.configurationInfos[0])) {
327
+ payLoad === null || payLoad === void 0 ? true : delete payLoad.configurationInfos;
328
+ }
329
+ }
330
+ this.cartService
331
+ .updateCartEntry(this.cartId, (_o = this.productDetails) === null || _o === void 0 ? void 0 : _o.entryNumber, payLoad)
332
+ .subscribe((response) => {
333
+ if (response) {
334
+ this.activeCartService.reloadActiveCart();
335
+ this.updateCartEntires.emit(true);
336
+ }
337
+ }, (error) => {
338
+ var _a, _b, _c, _d;
339
+ this.addToCartError =
340
+ ((_b = (_a = error === null || error === void 0 ? void 0 : error.error) === null || _a === void 0 ? void 0 : _a.errors[0]) === null || _b === void 0 ? void 0 : _b.message) ||
341
+ ((_d = (_c = error === null || error === void 0 ? void 0 : error.error) === null || _c === void 0 ? void 0 : _c.errors[0]) === null || _d === void 0 ? void 0 : _d.errorMessage);
342
+ });
343
+ }
344
+ }
345
+ // Update Total Price and Total length based on user inputs on each row
346
+ updateTotal() {
347
+ var _a, _b, _c, _d;
348
+ this.totalLength = 0;
349
+ this.totalPrice = 0;
350
+ if (!this.isFinishedProduct) {
351
+ const formValues = this.groupByBundle((_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.getRawValue(), 'prodBundle');
352
+ this.productQuantityForm.controls.forEach((element, index) => {
353
+ var _a, _b, _c, _d, _e, _f, _g, _h;
354
+ const qty = parseFloat((_a = element === null || element === void 0 ? void 0 : element.value) === null || _a === void 0 ? void 0 : _a.prodQty);
355
+ const len = parseFloat((_b = element === null || element === void 0 ? void 0 : element.value) === null || _b === void 0 ? void 0 : _b.prodLen);
356
+ const currentBundleName = (_d = (_c = element === null || element === void 0 ? void 0 : element.value) === null || _c === void 0 ? void 0 : _c.prodBundle) === null || _d === void 0 ? void 0 : _d.toUpperCase();
357
+ let total = 0;
358
+ if (!this.isNullOrEmpty(qty) &&
359
+ !this.isNullOrEmpty(len) &&
360
+ !isNaN(qty) &&
361
+ !isNaN(len)) {
362
+ total = qty * len;
363
+ if (!this.hasBundle) {
364
+ this.errorIndex[index] =
365
+ total * (((_e = this.cuttingValidation) === null || _e === void 0 ? void 0 : _e.weightPerLM) || 1) >
366
+ (((_f = this.cuttingValidation) === null || _f === void 0 ? void 0 : _f.maxBundleLoad) || 1000)
367
+ ? true
368
+ : false;
369
+ }
370
+ else if (this.checkTotalBundleWeight(formValues[currentBundleName])) {
371
+ const errorIndexNo = this.getLastBundleIndex(currentBundleName);
372
+ if (!this.isNullOrEmpty(errorIndexNo)) {
373
+ this.errorIndex[errorIndexNo] = true;
374
+ }
375
+ }
376
+ else {
377
+ this.errorIndex[index] = false;
378
+ }
379
+ }
380
+ if (!isNaN(qty) && !isNaN(len)) {
381
+ this.totalLength = this.totalLength + total;
382
+ this.totalPrice =
383
+ this.totalLength * ((_h = (_g = this.productDetails) === null || _g === void 0 ? void 0 : _g.price) === null || _h === void 0 ? void 0 : _h.value);
384
+ }
385
+ });
386
+ }
387
+ else {
388
+ this.totalLength = null;
389
+ const qty = (_d = (_c = (_b = this.productQuantityForm) === null || _b === void 0 ? void 0 : _b.controls[0]) === null || _c === void 0 ? void 0 : _c.get('prodQty')) === null || _d === void 0 ? void 0 : _d.value;
390
+ if (!isNaN(qty)) {
391
+ this.totalPrice = qty * this.accessoriesPrice;
392
+ }
393
+ }
394
+ this.updateCartDetails();
395
+ }
396
+ // Utility Function to get Key Values
397
+ getKeyValues(source, search) {
398
+ if (typeof source !== 'object') {
399
+ return [];
400
+ }
401
+ const [key, next] = Object.keys(source);
402
+ const _a = source, _b = key, value = _a[_b], rest = __rest(_a, [typeof _b === "symbol" ? _b : _b + ""]);
403
+ return [
404
+ ...(key === search ? [value] : this.getKeyValues(value, search)),
405
+ ...(next ? this.getKeyValues(rest, search) : []),
406
+ ];
407
+ }
408
+ // Get the values of Quantity Form
409
+ getProductQuantityFormGroup() {
410
+ return this.formBuilder.group(this.isFinishedProduct ? new AccessoriesQuantity() : new ProductQuantity());
411
+ }
412
+ get productQuantityForm() {
413
+ return this.productForm.get('productQuantity');
414
+ }
415
+ // Add the Quanity Form when user clicks on Add More button
416
+ addProductQuantityFormGroup(event) {
417
+ var _a, _b, _c;
418
+ event === null || event === void 0 ? void 0 : event.preventDefault();
419
+ (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.push(this.getProductQuantityFormGroup());
420
+ const bundles = this.groupByBundle((_b = this.productQuantityForm) === null || _b === void 0 ? void 0 : _b.getRawValue(), 'prodBundle');
421
+ this.disableAddMore = ((_c = this.productQuantityForm) === null || _c === void 0 ? void 0 : _c.length) > 99;
422
+ this.errorIndex[this.rowIndex] = false;
423
+ this.hasProdRefIndex[this.rowIndex++] = false;
424
+ this.cdr.detectChanges();
425
+ }
426
+ // Update the Quantity form if user clicks on remove button
427
+ removeProductQuantityForm(index, event) {
428
+ var _a;
429
+ event.preventDefault();
430
+ this.productQuantityForm.removeAt(index);
431
+ this.rowIndex--;
432
+ this.disableAddMore = ((_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.length) > 99;
433
+ this.cdr.detectChanges();
434
+ this.updateTotal();
435
+ }
436
+ // Get Job Reference Errors
437
+ jobReferenceErrors() {
438
+ var _a, _b;
439
+ return (_b = (_a = this.productForm) === null || _a === void 0 ? void 0 : _a.get('jobReference')) === null || _b === void 0 ? void 0 : _b.errors;
440
+ }
441
+ // Get Product Quantity Errors
442
+ prodQtyErrors(index) {
443
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
444
+ return ((((_c = (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls[index]) === null || _b === void 0 ? void 0 : _b.get('prodQty')) === null || _c === void 0 ? void 0 : _c.errors) ||
445
+ ((_f = (_e = (_d = this.productQuantityForm) === null || _d === void 0 ? void 0 : _d.controls[index]) === null || _e === void 0 ? void 0 : _e.get('prodQty')) === null || _f === void 0 ? void 0 : _f.invalid)) &&
446
+ (((_j = (_h = (_g = this.productQuantityForm) === null || _g === void 0 ? void 0 : _g.controls[index]) === null || _h === void 0 ? void 0 : _h.get('prodQty')) === null || _j === void 0 ? void 0 : _j.dirty) ||
447
+ ((_m = (_l = (_k = this.productQuantityForm) === null || _k === void 0 ? void 0 : _k.controls[index]) === null || _l === void 0 ? void 0 : _l.get('prodQty')) === null || _m === void 0 ? void 0 : _m.touched)));
448
+ }
449
+ // Get Product Length Errors
450
+ prodLenErrors(index) {
451
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
452
+ return ((((_c = (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls[index]) === null || _b === void 0 ? void 0 : _b.get('prodLen')) === null || _c === void 0 ? void 0 : _c.errors) ||
453
+ ((_f = (_e = (_d = this.productQuantityForm) === null || _d === void 0 ? void 0 : _d.controls[index]) === null || _e === void 0 ? void 0 : _e.get('prodLen')) === null || _f === void 0 ? void 0 : _f.invalid)) &&
454
+ (((_j = (_h = (_g = this.productQuantityForm) === null || _g === void 0 ? void 0 : _g.controls[index]) === null || _h === void 0 ? void 0 : _h.get('prodLen')) === null || _j === void 0 ? void 0 : _j.dirty) ||
455
+ ((_m = (_l = (_k = this.productQuantityForm) === null || _k === void 0 ? void 0 : _k.controls[index]) === null || _l === void 0 ? void 0 : _l.get('prodLen')) === null || _m === void 0 ? void 0 : _m.touched)));
456
+ }
457
+ // Get Product Length Errors
458
+ minLenErrors(index) {
459
+ var _a;
460
+ return ((_a = this.hasMinlengthError) === null || _a === void 0 ? void 0 : _a.indexOf(index)) !== -1;
461
+ }
462
+ // Get Product Bundle Errors
463
+ prodBundleErrors(index) {
464
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
465
+ return ((((_c = (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls[index]) === null || _b === void 0 ? void 0 : _b.get('prodBundle')) === null || _c === void 0 ? void 0 : _c.errors) ||
466
+ ((_f = (_e = (_d = this.productQuantityForm) === null || _d === void 0 ? void 0 : _d.controls[index]) === null || _e === void 0 ? void 0 : _e.get('prodBundle')) === null || _f === void 0 ? void 0 : _f.invalid)) &&
467
+ (((_j = (_h = (_g = this.productQuantityForm) === null || _g === void 0 ? void 0 : _g.controls[index]) === null || _h === void 0 ? void 0 : _h.get('prodBundle')) === null || _j === void 0 ? void 0 : _j.dirty) ||
468
+ ((_m = (_l = (_k = this.productQuantityForm) === null || _k === void 0 ? void 0 : _k.controls[index]) === null || _l === void 0 ? void 0 : _l.get('prodBundle')) === null || _m === void 0 ? void 0 : _m.touched)));
469
+ }
470
+ // Get Product Bunlde Reference Errors
471
+ prodRefErrors(index) {
472
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
473
+ return ((((_c = (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls[index]) === null || _b === void 0 ? void 0 : _b.get('prodRef')) === null || _c === void 0 ? void 0 : _c.errors) ||
474
+ ((_f = (_e = (_d = this.productQuantityForm) === null || _d === void 0 ? void 0 : _d.controls[index]) === null || _e === void 0 ? void 0 : _e.get('prodRef')) === null || _f === void 0 ? void 0 : _f.invalid)) &&
475
+ (((_j = (_h = (_g = this.productQuantityForm) === null || _g === void 0 ? void 0 : _g.controls[index]) === null || _h === void 0 ? void 0 : _h.get('prodRef')) === null || _j === void 0 ? void 0 : _j.dirty) ||
476
+ ((_m = (_l = (_k = this.productQuantityForm) === null || _k === void 0 ? void 0 : _k.controls[index]) === null || _l === void 0 ? void 0 : _l.get('prodRef')) === null || _m === void 0 ? void 0 : _m.touched)));
477
+ }
478
+ // Check if form is Valid or not
479
+ isValidForm() {
480
+ var _a, _b, _c;
481
+ let valid = true;
482
+ if (this.hasBundle) {
483
+ return (_a = this.productForm) === null || _a === void 0 ? void 0 : _a.valid;
484
+ }
485
+ else {
486
+ (_c = (_b = this.productQuantityForm) === null || _b === void 0 ? void 0 : _b.controls) === null || _c === void 0 ? void 0 : _c.forEach((element) => {
487
+ var _a, _b, _c;
488
+ valid = this.isFinishedProduct
489
+ ? (_a = element === null || element === void 0 ? void 0 : element.get('prodQty')) === null || _a === void 0 ? void 0 : _a.valid
490
+ : ((_b = element === null || element === void 0 ? void 0 : element.get('prodLen')) === null || _b === void 0 ? void 0 : _b.valid) && ((_c = element === null || element === void 0 ? void 0 : element.get('prodQty')) === null || _c === void 0 ? void 0 : _c.valid);
491
+ });
492
+ }
493
+ return valid;
494
+ }
495
+ // Check if any errors present on any row and diplay it on UI
496
+ hasErrors(index) {
497
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
498
+ return ((_c = (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls[index]) === null || _b === void 0 ? void 0 : _b.get('prodQty')) === null || _c === void 0 ? void 0 : _c.errors) ||
499
+ ((_f = (_e = (_d = this.productQuantityForm) === null || _d === void 0 ? void 0 : _d.controls[index]) === null || _e === void 0 ? void 0 : _e.get('prodLen')) === null || _f === void 0 ? void 0 : _f.errors) ||
500
+ ((_j = (_h = (_g = this.productQuantityForm) === null || _g === void 0 ? void 0 : _g.controls[index]) === null || _h === void 0 ? void 0 : _h.get('prodBundle')) === null || _j === void 0 ? void 0 : _j.errors) ||
501
+ ((_m = (_l = (_k = this.productQuantityForm) === null || _k === void 0 ? void 0 : _k.controls[index]) === null || _l === void 0 ? void 0 : _l.get('prodRef')) === null || _m === void 0 ? void 0 : _m.errors)
502
+ ? true
503
+ : false;
504
+ }
505
+ // Check if Any Entry has less than Minimum length
506
+ checkHasMinLengthQty() {
507
+ var _a, _b;
508
+ this.hasMinlengthError = [];
509
+ (_b = (_a = this.productQuantityForm) === null || _a === void 0 ? void 0 : _a.controls) === null || _b === void 0 ? void 0 : _b.forEach((element, ind) => {
510
+ var _a, _b, _c;
511
+ if (((_a = element === null || element === void 0 ? void 0 : element.value) === null || _a === void 0 ? void 0 : _a.prodLen) < ((_b = this.cuttingValidation) === null || _b === void 0 ? void 0 : _b.minLength) &&
512
+ !this.isNullOrEmpty((_c = element === null || element === void 0 ? void 0 : element.value) === null || _c === void 0 ? void 0 : _c.prodLen)) {
513
+ this.hasMinlengthError.push(ind);
514
+ }
515
+ });
516
+ this.cdr.detectChanges();
517
+ }
518
+ pad3Digits(value) {
519
+ var _a, _b;
520
+ const qty = value;
521
+ if (!this.isNullOrEmpty(qty) && !isNaN(qty)) {
522
+ return (_b = (_a = parseFloat(qty)) === null || _a === void 0 ? void 0 : _a.toFixed(3)) === null || _b === void 0 ? void 0 : _b.replace(/(\d)(?=(\d{3})+\b)/g, '$1,');
523
+ }
524
+ }
525
+ // Convert Length to demial format after blur
526
+ updateLenthValue(element) {
527
+ if (!this.isNullOrEmpty(element === null || element === void 0 ? void 0 : element.value)) {
528
+ element.value = this.pad3Digits(element.value);
529
+ }
530
+ this.checkHasMinLengthQty();
531
+ }
532
+ }
533
+ CustomProductQuantityFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: CustomProductQuantityFormComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }, { token: i2.CartService }, { token: i3.ActiveCartService }, { token: i4.CurrentProductService }], target: i0.ɵɵFactoryTarget.Component });
534
+ CustomProductQuantityFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: CustomProductQuantityFormComponent, selector: "app-custom-product-quantity-form", inputs: { hasBundle: "hasBundle", productCode: "productCode", productDetails: "productDetails", unitType: "unitType", accessoriesPrice: "accessoriesPrice", selectedColour: "selectedColour", cuttingValidation: "cuttingValidation", finishedVariantDetails: "finishedVariantDetails", finishedAvailableColours: "finishedAvailableColours", isFinishedProduct: "isFinishedProduct", isFlashingProduct: "isFlashingProduct", listView: "listView" }, outputs: { updateCartEntires: "updateCartEntires" }, viewQueries: [{ propertyName: "closeInviteModal", first: true, predicate: ["closeInviteModal"], descendants: true }, { propertyName: "closebutton", first: true, predicate: ["closebutton"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"productDetails\" [formGroup]=\"productForm\">\r\n <div class=\"row\">\r\n <ng-container>\r\n <div\r\n class=\"col p-0 bundling\"\r\n *ngIf=\"!isFinishedProduct && !isFlashingProduct\"\r\n >\r\n <span class=\"pr-2 font-weight-bold text\">Bundling </span>\r\n <span>\r\n <label class=\"switch\">\r\n <input\r\n type=\"checkbox\"\r\n formControlName=\"bundling\"\r\n (change)=\"updateBundling($event)\"\r\n />\r\n <span class=\"slider round\"></span>\r\n </label>\r\n </span>\r\n </div>\r\n </ng-container>\r\n <div class=\"quantity border p-3 mt-4\">\r\n <ng-container formArrayName=\"productQuantity\">\r\n <datalist id=\"bundleList\">\r\n <option *ngFor=\"let bundle of bundleList\">\r\n {{ bundle }}\r\n </option>\r\n </datalist>\r\n <table\r\n class=\"no-border\"\r\n [ngClass]=\"{\r\n 'has-bundle': hasBundle,\r\n accessories: isFinishedProduct\r\n }\"\r\n >\r\n <thead>\r\n <th>Quantity</th>\r\n <th *ngIf=\"!isFinishedProduct\">Length (LM)</th>\r\n <th *ngIf=\"hasBundle\">\r\n Bundle\r\n <span\r\n class=\"info-icon\"\r\n ngbTooltip=\"Bundle Information goes here....\"\r\n placement=\"bottom\"\r\n >\r\n </span>\r\n </th>\r\n <th\r\n *ngIf=\"hasBundle\"\r\n class=\"d-none\"\r\n [ngClass]=\"{ 'd-lg-block': listView }\"\r\n >\r\n Reference\r\n <span\r\n class=\"info-icon\"\r\n ngbTooltip=\"Reference Information goes here....\"\r\n placement=\"bottom\"\r\n >\r\n </span>\r\n </th>\r\n <th></th>\r\n </thead>\r\n <tbody>\r\n <ng-container\r\n *ngFor=\"\r\n let val of productForm.get('productQuantity')['controls'];\r\n let i = index\r\n \"\r\n [formGroupName]=\"i\"\r\n >\r\n <tr>\r\n <td>\r\n <input\r\n class=\"form-control prod-qty\"\r\n formControlName=\"prodQty\"\r\n minlength=\"1\"\r\n maxlength=\"2\"\r\n OnlyNumber=\"true\"\r\n (blur)=\"updateTotal()\"\r\n />\r\n </td>\r\n <td *ngIf=\"!isFinishedProduct\">\r\n <input\r\n class=\"form-control prod-len\"\r\n formControlName=\"prodLen\"\r\n #prodLen\r\n minlength=\"1\"\r\n maxlength=\"7\"\r\n OnlyNumber=\"true\"\r\n (blur)=\"updateTotal(); updateLenthValue(prodLen)\"\r\n />\r\n </td>\r\n <td *ngIf=\"hasBundle && !isFinishedProduct\">\r\n <div class=\"d-none\" [ngClass]=\"{ 'd-lg-block': listView }\">\r\n <input\r\n class=\"form-control prod-bundle\"\r\n formControlName=\"prodBundle\"\r\n #prodBundle\r\n (input)=\"\r\n prodBundle.value = prodBundle.value.toUpperCase()\r\n \"\r\n minlength=\"1\"\r\n maxlength=\"2\"\r\n (blur)=\"\r\n updateTotal(); populateSameBundleReference(null, i)\r\n \"\r\n (focus)=\"updateBundleList()\"\r\n list=\"bundleList\"\r\n />\r\n </div>\r\n <div [ngClass]=\"{ 'd-lg-none d-xl-none': listView }\">\r\n <p class=\"p-0 m-0\" *ngFor=\"let value of getBundleValues(i)\">\r\n {{ value }}\r\n </p>\r\n </div>\r\n <div class=\"side-menu-button\" *ngIf=\"!listView\">\r\n <div class=\"btn-group dropleft\" *ngIf=\"hasBundle\">\r\n <a\r\n type=\"button\"\r\n class=\"dropdown-toggle\"\r\n href=\"#\"\r\n role=\"button\"\r\n data-toggle=\"dropdown\"\r\n aria-haspopup=\"true\"\r\n aria-expanded=\"false\"\r\n >\r\n <i class=\"fa fa-ellipsis-v\"></i>\r\n </a>\r\n <div class=\"dropdown-menu\">\r\n <a\r\n class=\"dropdown-item m-0\"\r\n data-toggle=\"modal\"\r\n data-target=\"#bundleModal\"\r\n (click)=\"editBundleValue(i)\"\r\n >\r\n Edit Bundle Value\r\n </a>\r\n <a\r\n class=\"dropdown-item m-0\"\r\n *ngIf=\"i > 0 || productQuantityForm.length > 1\"\r\n (click)=\"removeProductQuantityForm(i, $event)\"\r\n >\r\n Remove\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </td>\r\n <td *ngIf=\"hasBundle && !isFinishedProduct && listView\">\r\n <div class=\"d-none\" [ngClass]=\"{ 'd-lg-block': listView }\">\r\n <input\r\n class=\"form-control prod-reference\"\r\n minlength=\"1\"\r\n maxlength=\"15\"\r\n (focus)=\"populateSameBundleReference($event, i)\"\r\n formControlName=\"prodRef\"\r\n (blur)=\"\r\n updateTotal();\r\n updateSameBundleReference($event, i, true)\r\n \"\r\n />\r\n </div>\r\n </td>\r\n <td *ngIf=\"listView\">\r\n <button\r\n *ngIf=\"\r\n i > 0 || (productQuantityForm.length > 1 && listView)\r\n \"\r\n class=\"simple close d-sm-none d-md-none d-lg-block d-xl-block\"\r\n (click)=\"removeProductQuantityForm(i, $event)\"\r\n >\r\n <i class=\"fas fa-times-circle custom-arrow remove-icon\"></i>\r\n </button>\r\n\r\n <div [ngClass]=\"{ 'd-lg-none d-xl-none': listView }\">\r\n <div class=\"btn-group dropleft\" *ngIf=\"hasBundle\">\r\n <a\r\n type=\"button\"\r\n class=\"dropdown-toggle\"\r\n href=\"#\"\r\n role=\"button\"\r\n data-toggle=\"dropdown\"\r\n aria-haspopup=\"true\"\r\n aria-expanded=\"false\"\r\n >\r\n <i class=\"fa fa-ellipsis-v\"></i>\r\n </a>\r\n <div class=\"dropdown-menu\">\r\n <a\r\n class=\"dropdown-item m-0\"\r\n data-toggle=\"modal\"\r\n data-target=\"#bundleModal\"\r\n (click)=\"editBundleValue(i)\"\r\n >\r\n Edit Bundle Value\r\n </a>\r\n <a\r\n class=\"dropdown-item m-0\"\r\n *ngIf=\"i > 0 || productQuantityForm.length > 1\"\r\n (click)=\"removeProductQuantityForm(i, $event)\"\r\n >\r\n Remove\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"hasErrors(i)\">\r\n <td colspan=\"4\" class=\"text-danger\">\r\n <div class=\"mt-0\" *ngIf=\"prodQtyErrors(i)\">\r\n Please enter valid Quantity\r\n </div>\r\n <div class=\"mt-2\" *ngIf=\"prodLenErrors(i)\">\r\n Please enter valid Length\r\n </div>\r\n <div class=\"mt-2\" *ngIf=\"minLenErrors(i)\">\r\n Minimum length should be at least\r\n {{ cuttingValidation?.minLength }}\r\n </div>\r\n <div class=\"mt-2\" *ngIf=\"prodBundleErrors(i)\">\r\n Please enter valid Bundle Name\r\n </div>\r\n <div class=\"mt-2\" *ngIf=\"prodRefErrors(i)\">\r\n Please enter valid Reference\r\n </div>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"hasErrorIndex(i)\">\r\n <td colspan=\"4\" class=\"text-danger\">\r\n Should not exceed maximum bundle size\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"hasProdRefErrorIndex(i)\">\r\n <td colspan=\"4\" class=\"text-danger\">\r\n This Reference value is already used. Please use other value\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n <button\r\n class=\"simple pl-2\"\r\n *ngIf=\"!isFinishedProduct && !disableAddMore\"\r\n (click)=\"addProductQuantityFormGroup($event)\"\r\n >\r\n <span class=\"mr-1 add-more\"> </span>\r\n Add more\r\n </button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-container>\r\n\r\n<div\r\n class=\"row mt-4 col-sm-12 alert alert-danger justify-content-start\"\r\n role=\"alert\"\r\n *ngIf=\"addToCartError | async\"\r\n>\r\n <img\r\n class=\"mr-3\"\r\n src=\"../../../../../assets/images/erroricon.svg\"\r\n alt=\"alert\"\r\n />\r\n {{ addToCartError }}\r\n</div>\r\n\r\n<div\r\n class=\"modal fade edit-bundle-form\"\r\n id=\"bundleModal\"\r\n role=\"dialog\"\r\n aria-hidden=\"true\"\r\n>\r\n <div class=\"modal-dialog modal-lg\" role=\"document\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">Bundle Value</h4>\r\n <i\r\n class=\"icon-close invite-pop-close\"\r\n data-dismiss=\"modal\"\r\n aria-label=\"Close\"\r\n ></i>\r\n </div>\r\n <div class=\"modal-body m-0 pl-2 pr-2\">\r\n <table class=\"table no-border\" *ngIf=\"!isFinishedProduct\">\r\n <thead>\r\n <th>\r\n Bundle\r\n <span\r\n class=\"info-icon\"\r\n ngbTooltip=\"Bundle Information goes here....\"\r\n placement=\"bottom\"\r\n >\r\n </span>\r\n </th>\r\n <th>\r\n Reference\r\n <span\r\n class=\"info-icon\"\r\n ngbTooltip=\"Reference Information goes here....\"\r\n placement=\"bottom\"\r\n >\r\n </span>\r\n </th>\r\n </thead>\r\n <tbody [formGroup]=\"modalBundleForm\">\r\n <tr>\r\n <td>\r\n <datalist id=\"modBundleList\">\r\n <option *ngFor=\"let bundle of bundleList\">\r\n {{ bundle }}\r\n </option>\r\n </datalist>\r\n <input\r\n class=\"form-control\"\r\n maxlength=\"2\"\r\n formControlName=\"modBundle\"\r\n #modBundle\r\n (focus)=\"updateBundleList()\"\r\n (input)=\"modBundle.value = modBundle.value.toUpperCase()\"\r\n list=\"modBundleList\"\r\n (blur)=\"populateSameBundleReference(null, selectedIndex)\"\r\n />\r\n </td>\r\n <td>\r\n <input\r\n class=\"form-control\"\r\n maxlength=\"15\"\r\n (focus)=\"populateSameBundleReference($event, selectedIndex)\"\r\n formControlName=\"modRef\"\r\n />\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div class=\"modal-footer\">\r\n <button\r\n type=\"submit\"\r\n data-dismiss=\"modal\"\r\n #closebutton\r\n class=\"btn btn-light\"\r\n >\r\n Cancel\r\n </button>\r\n <button type=\"submit\" (click)=\"saveBundleDetails($event)\" class=\"btn\">\r\n Save\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";@media screen and (min-width: 1366px){:root{--fontsize12: .75rem;--fontsize14: .875rem;--fontsize16: 1rem;--fontsize17: 1.063rem;--fontsize17-5: 1.1rem;--fontsize18: 1.125rem;--fontsize18-4: 1.5rem;--fontsize20: 1.25rem;--fontsize21: 1.313rem;--fontsize22: 1.375rem;--fontsize23: 1.438rem;--fontsize24: 1.5rem;--fontsize26: 1.625rem;--fontsize28: 1.75rem;--fontsize30: 1.625rem;--fontsize32: 2rem;--fontsize34: 2.125rem;--fontsize36: 2rem;--fontsize40: 2.25rem;--fontsize46: 2.875rem;--fontsize80: 5rem}}@media screen and (max-width: 1365px) and (min-width: 768px){:root{--fontsize12: .75rem;--fontsize14: .875rem;--fontsize16: 1rem;--fontsize17: .9rem;--fontsize17-5: 1rem;--fontsize18: .875rem;--fontsize20: 1rem;--fontsize21: 1.063rem;--fontsize22: 1.125rem;--fontsize23: 1.188rem;--fontsize24: 1rem;--fontsize28: 1.5rem;--fontsize30: 1.25rem;--fontsize32: 1.75rem;--fontsize34: 1.875rem;--fontsize36: 1.625rem;--fontsize40: 2.5rem;--fontsize46: 2.875rem;--fontsize80: 3.5rem}}@media screen and (max-width: 767px){:root{--fontsize12: .75rem;--fontsize14: .875rem;--fontsize16: 1rem;--fontsize16-5: .77rem;--fontsize17: .9rem;--fontsize17-5: 1rem;--fontsize18: .875rem;--fontsize19: .938rem;--fontsize20: 1rem;--fontsize21: 1.063rem;--fontsize22: 1.125rem;--fontsize23: 1.188rem;--fontsize24: 1rem;--fontsize26: 1.25rem;--fontsize28: 1.5rem;--fontsize30: 1.25rem;--fontsize32: 1.75rem;--fontsize34: 1.875rem;--fontsize36: 1.625rem;--fontsize40: 2.5rem;--fontsize46: 2rem;--fontsize80: 2.5rem}}@font-face{font-family:icomoon;font-weight:400;src:url(../assets/fonts/icomoon.ttf) format(\"ttf\"),url(../assets/fonts/icomoon.woff) format(\"woff\");font-weight:normal;font-style:normal;font-display:swap}@font-face{font-family:\"Arial Regular\";src:url(../assets/fonts/arial-webfont.woff) format(\"woff\"),url(../assets/fonts/arial-webfont.woff2) format(\"woff2\");font-weight:normal;font-style:normal}@font-face{font-family:\"Arial Bold\";src:url(../assets/fonts/arialbold-webfont.woff) format(\"woff\"),url(../assets/fonts/arialbold-webfont.woff2) format(\"woff2\");font-weight:normal;font-style:normal}@font-face{font-family:\"Arial Black\";src:url(../assets/fonts/arialblack-webfont.woff) format(\"woff\"),url(../assets/fonts/arialblack-webfont.woff2) format(\"woff2\");font-weight:normal;font-style:normal}@font-face{font-family:\"Helvetica Neue Reqular\";src:url(../assets/fonts/helveticaneue.woff) format(\"woff\"),url(../assets/fonts/helveticaneue.woff2) format(\"woff2\");font-weight:normal;font-style:normal}@font-face{font-family:\"Helvetica Neue Thin\";src:url(../assets/fonts/helveticaneuethin-webfont.woff) format(\"woff\"),url(../assets/fonts/helveticaneuethin-webfont.woff2) format(\"woff2\");font-weight:normal;font-style:normal}@font-face{font-family:\"Helvetica Neue Medium\";src:url(../assets/fonts/helveticaneuemedium-webfont.woff) format(\"woff\"),url(../assets/fonts/helveticaneuemedium-webfont.woff2) format(\"woff2\");font-weight:normal;font-style:normal}[class*=\" icon-\"],[class^=icon-]{font-family:icomoon!important;font-feature-settings:normal;font-variant:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-style:normal;font-weight:400;line-height:1;text-transform:none;font-display:swap}.icon-right:before{content:\"\\e902\"}.icon-materials:before{content:\"\\e900\"}.icon-natural-lighting:before{content:\"\\e90a\"}.icon-rainwater:before{content:\"\\e901\"}.icon-roofing:before{content:\"\\e90b\"}.icon-flashing{position:relative;display:inline-block;height:32px;text-align:center;width:32px}.icon-flashing:before,.mainnav-link-level-2.show .navTagChild .icon-flashing:before{content:url(../assets/images/icon-flashing-white.svg);height:20px;width:20px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);line-height:15px}li.megamenuSubChild:hover .icon-flashing:before{content:url(../assets/images/icon-flashing-black.svg)}.icon-structural:before{content:\"\\e90c\"}.icon-accessories-old .path1:before{content:\"\\e903\"}.icon-accessories-old .path2:before{margin-left:-1em;content:\"\\e904\"}.icon-accessories-old .path3:before{margin-left:-1em;content:\"\\e905\"}.icon-cladding-old .path1:before{content:\"\\e90d\"}.icon-cladding-old .path2:before{margin-left:-1em;content:\"\\e90e\"}.icon-close:before{content:\"\\e90f\"}.icon-message:before{content:\"\\e910\"}.icon-search .path1:before{content:\"\\e906\"}.icon-search .path2:before{content:\"\\e907\"}.icon-search .path3:before{margin-left:-1.0156em;content:\"\\e908\"}.icon-summary:before{content:\"\\e911\"}.icon-branch:before{content:\"\\e912\"}.icon-delivery:before{content:\"\\e913\"}.icon-downloads:before{content:\"\\e909\"}.icon-drawings:before{content:\"\\e914\"}.icon-full:before{content:\"\\e915\"}.icon-manual:before{content:\"\\e916\"}.icon-payment:before{content:\"\\e917\"}.icon-empty .path1:before{content:\"\\e918\"}.icon-empty .path2:before{margin-left:-1em;content:\"\\e919\"}.icon-empty .path3:before{margin-left:-1em;content:\"\\e91a\"}.icon-product-overview:before{content:\"\\e91b\"}.icon-arrows:before{content:\"\\e91c\"}.icon-selected:before{content:\"\\e91d\"}.icon-accessories:before{content:\"\\e91b\"}.icon-cladding:before{content:\"\\e91e\"}.icon-Triangle:before{content:\"\\e91f\"}.icon-home:before{content:\"\\e920\"}.icon-faq:before{content:\"\\e921\"}.icon-temperature:before{content:\"\\e922\"}body header{font-family:\"Arial Regular\",sans-serif}header{background-color:#1d1d1b;position:sticky;top:0;background-size:100% 25%!important;background-repeat:no-repeat;z-index:10}header .header{max-width:100%;padding:0}header cx-banner cx-media img{margin-top:.7rem;margin-bottom:0}header label{display:inline-flex}header .SiteLinks{height:52px;display:flex;align-items:center;justify-content:space-between;padding-top:5px;padding-bottom:5px}header .SiteLinks cx-paragraph p{color:#fff;font-size:var(--fontsize16);line-height:var(--fontsize16);margin-bottom:0}header .SiteLinks cx-paragraph{font-size:var(--fontsize16)}header .SiteLinks app-account-dropdown,header .SiteLinks app-find-store{width:calc(25% - 25px);max-width:328px;margin-right:25px}header .SiteLinks app-contact-us{width:calc(20% - 25px);max-width:100px;margin-left:auto}header .SiteLinks app-custom-mini-cart{width:10%}header .SiteLinks .preferenceLink{margin-left:auto}header .SiteLinks .preferenceLink cx-generic-link{margin:0}header .SiteLinks .preferenceLink cx-generic-link cx-media img{height:22px;margin:0}header .SiteLogo .storeLogo{position:absolute;z-index:99;left:40px;bottom:10px}header .SiteLogo .homeLogo{max-width:28px;height:28px;position:absolute;z-index:99;bottom:47px}header .NavigationBar{flex:70%;background-color:#b61828;min-height:40px;display:flex;align-items:center;position:relative;z-index:10}header .logoutMenu{margin-top:0!important}header .logoutMenu li{cursor:pointer;background-color:#4c4c4c;color:#fff}header .logoutMenu li:hover{text-decoration:underline;background-color:#4c4c4c}header .MarketingContext{width:100%;margin:auto}.customer-service-icon{cursor:pointer}.helpSupport{width:20rem;border:0;margin-top:.5rem!important;transform:translate(-42%,36px)!important;padding:1rem 1rem 0;background-color:#393939;color:#fff;top:0}.helpSupport .arrow-up{position:absolute;top:-8px;right:44%;width:0;height:0;border-left:15px solid rgba(0,0,0,0);border-right:15px solid rgba(0,0,0,0);border-bottom:15px solid #393939}.helpSupport .contact-us-info .heading{font-family:\"Arial Bold\",sans-serif}.helpSupport .contact-us-info .detail{font-size:var(--fontsize14);line-height:2rem}.helpSupport .contact-us-info .detail .service-icon{height:20px;width:20px;margin-right:10px}.helpSupport .contact-us-info .contactLink a{font-size:var(--fontsize14);text-decoration:underline;text-transform:uppercase}.helpSupport .contact-us-info a{color:#fff;text-decoration:none}.helpSupport .contact-us-info a:hover{text-decoration:underline}.pageTitle{font-family:\"Helvetica Neue Regular\",sans-serif;font-size:var(--fontsize54)}#visualization-container{text-align:center;margin:0 auto}#cds-viewer-container-3d{width:320px;height:200px}#cds-viewer-container-2d{width:320px;height:200px}[aria-label=Close]{cursor:pointer}cx-media.is-missing{background:url(./assets/images/search-noimage.svg);background-size:cover;background-position:center;background-repeat:no-repeat}cx-global-message{position:fixed;top:9rem;width:100%;z-index:13}@media screen and (max-width: 991px){cx-global-message{top:3.75rem}cx-storefront header{background-color:#b61828}cx-storefront header cx-banner cx-media img{margin:auto}cx-storefront header .SiteLogo{width:100%;max-width:211px;margin:auto;padding-left:30px;box-sizing:border-box}cx-storefront header .SiteLogo .storeLogo{position:unset}cx-storefront header .SearchBox{margin:14px 0 10px;width:30px}cx-storefront header .SiteLinks{background-color:transparent;width:110px;margin:auto 25px auto 0}cx-storefront header .SiteLinks app-account-dropdown,cx-storefront header .SiteLinks app-find-store,cx-storefront header .SiteLinks app-contact-us,cx-storefront header .SiteLinks cx-paragraph,cx-storefront header .SiteLinks .preferenceLink{display:none}cx-storefront header .SiteLinks app-custom-mini-cart,cx-storefront header .SiteLinks app-custom-user-account{width:35px}cx-storefront header.is-expanded{overflow-y:auto;position:fixed;bottom:0;top:0;width:calc(100% - 99px)}cx-storefront header.is-expanded .header{background-color:#b61828;margin-left:0}cx-storefront header.is-expanded .PreHeader{position:absolute;right:15px;top:15px}cx-storefront header.is-expanded .SearchBox{display:none}cx-storefront header.is-expanded .SiteLogo{position:absolute;top:25px;z-index:9}cx-storefront header.is-expanded .SiteLinks{background-color:#1d1d1b;width:100%;margin:15px auto 15px 0;height:unset;padding:15px;max-width:100%;position:relative;z-index:9;top:60px}cx-storefront header.is-expanded .SiteLinks app-account-dropdown,cx-storefront header.is-expanded .SiteLinks app-find-store,cx-storefront header.is-expanded .SiteLinks app-contact-us,cx-storefront header.is-expanded .SiteLinks cx-paragraph,cx-storefront header.is-expanded .SiteLinks .preferenceLink{display:block}cx-storefront header.is-expanded .SiteLinks app-custom-mini-cart,cx-storefront header.is-expanded .SiteLinks app-custom-user-account{display:none}cx-storefront header.is-expanded .SiteLinks app-account-dropdown{width:100%;max-width:100%}cx-storefront header.is-expanded .SiteLinks app-find-store{width:50%;max-width:328px;min-width:328px}cx-storefront header.is-expanded .SiteLinks app-contact-us{margin-right:15px;margin-left:auto;width:115px;max-width:unset}cx-storefront header.is-expanded .navigation{position:relative;top:45px}cx-storefront header.is-expanded:before{background-color:#0000004d;right:0;content:\"\";position:fixed;z-index:2;top:0;bottom:0;height:100vh;width:99px}cx-storefront header.is-expanded:after{background-color:transparent}}@media screen and (max-width: 576px){cx-storefront header .SiteLogo{max-width:80px}cx-storefront header .SiteLogo .storeLogo{display:none}cx-storefront header .searchBox{height:45px}cx-storefront header.is-expanded{width:100%}cx-storefront header.is-expanded .header,cx-storefront header.is-expanded .navigation{width:100%}cx-storefront header.is-expanded .SiteLogo{max-width:211px!important}cx-storefront header.is-expanded .SiteLogo .storeLogo{display:block}cx-storefront header.is-expanded .SiteLinks{max-width:100%;width:100%}cx-storefront header.is-expanded .SiteLinks app-account-dropdown,cx-storefront header.is-expanded .SiteLinks app-find-store,cx-storefront header.is-expanded .SiteLinks app-contact-us,cx-storefront header.is-expanded .SiteLinks cx-paragraph,cx-storefront header.is-expanded .SiteLinks .preferenceLink{display:block}cx-storefront header.is-expanded .SiteLinks app-custom-mini-cart,cx-storefront header.is-expanded .SiteLinks app-custom-user-account{display:none}cx-storefront header.is-expanded .SiteLinks app-find-store{width:100%;max-width:100%;margin-bottom:10px}cx-storefront header.is-expanded .SiteLinks app-contact-us{margin-left:0}cx-storefront header.is-expanded .SiteLinks cx-paragraph{margin-left:auto}cx-storefront header.is-expanded:before{display:none}.pageTitle{font-size:28px}}.product-code{color:#6f6f6f}.category-image{width:250px;height:180px}.display_color{text-align:center;position:relative;top:4px;font-family:\"Arial Bold\",sans-serif}.colours .colour{padding:0 15px;position:relative}.colours .colour .checkbox{display:none}.colours .colour .colour-title{position:absolute;bottom:-48px;width:40px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;font-size:var(--fontsize14);text-align:center;cursor:grabbing}.colours .colour.selected{border:1px solid #000000}.colours .colour.selected .checkbox{position:absolute;background:url(\"data:image/svg+xml,%3Csvg xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 width%3D%2217.186%22 height%3D%2217.186%22 viewBox%3D%220 0 17.186 17.186%22%3E%0D %3Cg id%3D%22Group_12857%22 data-name%3D%22Group 12857%22 transform%3D%22translate(0.25 0.25)%22%3E%0D %3Ccircle id%3D%22Ellipse_14%22 data-name%3D%22Ellipse 14%22 cx%3D%228.316%22 cy%3D%228.316%22 r%3D%228.316%22 transform%3D%22translate(0 0.039)%22%2F%3E%0D %3Cpath id%3D%22Icon_ionic-md-checkmark-circle%22 data-name%3D%22Icon ionic-md-checkmark-circle%22 d%3D%22M11.718%2C3.375a8.343%2C8.343%2C0%2C1%2C0%2C8.343%2C8.343A8.367%2C8.367%2C0%2C0%2C0%2C11.718%2C3.375ZM10.005%2C16.166%2C5.729%2C11.89l1.2-1.2%2C3.08%2C3.08%2C6.5-6.5%2C1.2%2C1.2Z%22 transform%3D%22translate(-3.375 -3.375)%22 fill%3D%22%23fff%22%2F%3E%0D %3Cpath id%3D%22Icon_ionic-md-checkmark-circle_-_Outline%22 data-name%3D%22Icon ionic-md-checkmark-circle - Outline%22 d%3D%22M11.718%2C3.125a8.583%2C8.583%2C0%2C0%2C1%2C6.069%2C14.662A8.583%2C8.583%2C0%2C1%2C1%2C5.649%2C5.649%2C8.532%2C8.532%2C0%2C0%2C1%2C11.718%2C3.125Zm0%2C16.686A8.117%2C8.117%2C0%2C1%2C0%2C6%2C17.433%2C8.035%2C8.035%2C0%2C0%2C0%2C11.718%2C19.811ZM16.511%2C6.916l1.553%2C1.553-8.059%2C8.05L5.376%2C11.89l1.553-1.553%2C3.08%2C3.08Zm.846%2C1.553-.846-.846-6.5%2C6.5-3.08-3.08-.846.846%2C3.922%2C3.922Z%22 transform%3D%22translate(-3.375 -3.375)%22%2F%3E%0D %3C%2Fg%3E%0D%3C%2Fsvg%3E%0D\") no-repeat center;width:20px;height:20px;display:inline-block;top:10px;left:10px}.colours .colour.main{box-sizing:border-box;width:40px;height:40px;display:inline-block;padding:0;border:1px solid #C6C6C6}.bundling{text-align:right;top:30px}.bundling span.text{display:inline-block;position:relative;top:-18px}.switch{position:relative;display:inline-block;width:60px;margin-top:-4px;height:30px}.switch input{opacity:0;width:0;height:0}.switch input:not(:checked)+.slider:after{content:\"NO\";right:10px;position:absolute;color:#fff;top:5px;font-size:var(--fontsize12);font-family:\"Arial Bold\",sans-serif}.switch input:checked+.slider{background-color:#b61828}.switch input:checked+.slider:before{transform:translate(26px);left:8px}.switch input:checked+.slider:after{content:\"YES\";left:8px;position:absolute;color:#fff;top:6px;font-size:var(--fontsize12);font-family:\"Arial Bold\",sans-serif}.switch input:focus+.slider{box-shadow:0 0 1px #2196f3}.slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#a6a6a5;transition:.4s}.slider:before{position:absolute;content:\"\";height:21px;width:22px;top:4px;left:5px;bottom:4px;background-color:#fff;transition:.4s}.slider.round{border-radius:34px}.slider.round:before{border-radius:50%}::ng-deep .info-icon{position:relative;background:url(\"data:image/svg+xml,%3Csvg xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 width%3D%2216%22 height%3D%2216%22 viewBox%3D%220 0 16 16%22%3E%0D %3Cpath id%3D%22Icon_metro-info%22 data-name%3D%22Icon metro-info%22 d%3D%22M9.571%2C6.678a.752.752%2C0%2C0%2C1%2C.75-.75h.5a.752.752%2C0%2C0%2C1%2C.75.75v.5a.752.752%2C0%2C0%2C1-.75.75h-.5a.752.752%2C0%2C0%2C1-.75-.75Zm3%2C7.25h-4v-1h1v-3h-1v-1h3v4h1Zm-2-12a8%2C8%2C0%2C1%2C0%2C8%2C8%2C8%2C8%2C0%2C0%2C0-8-8Zm0%2C14.5a6.5%2C6.5%2C0%2C1%2C1%2C6.5-6.5A6.5%2C6.5%2C0%2C0%2C1%2C10.571%2C16.428Z%22 transform%3D%22translate(-2.571 -1.928)%22 fill%3D%22%23c6c6c6%22%2F%3E%0D%3C%2Fsvg%3E%0D\") no-repeat center;width:16px;height:16px;display:inline-block;top:3px}::ng-deep .edit-bundle-form .modal-dialog{padding:10px;transform:translateY(-50%);top:30%;margin:0 auto}::ng-deep .edit-bundle-form .modal-header{border-bottom:0}::ng-deep .edit-bundle-form .modal-body{padding-top:0;padding-bottom:0}::ng-deep .edit-bundle-form .modal-footer{border-top:none}::ng-deep .edit-bundle-form .modal-footer button{background-color:#1d1d1b;text-transform:uppercase;text-decoration:none;height:44px;font-family:\"Arial Bold\",sans-serif;min-width:86px;color:#fff;font-size:var(--fontsize14)}::ng-deep .edit-bundle-form .modal-footer button.btn-light{border:none;background-color:#fff;color:#1d1d1b;text-decoration:underline;text-transform:capitalize;font-size:var(--fontsize16);font-family:\"Arial Regular\",sans-serif}::ng-deep .edit-bundle-form .table th{text-transform:capitalize}::ng-deep .edit-bundle-form .table tr,::ng-deep .edit-bundle-form .table td,::ng-deep .edit-bundle-form .table th{border:none;text-align:left;padding-bottom:0;padding-top:10px}::ng-deep .edit-bundle-form .table td:nth-child(1){width:100px;max-width:100px;min-width:100px;padding-right:15px}::ng-deep .edit-bundle-form .table td:nth-child(2){width:150px}::ng-deep main{overflow-x:hidden}::ng-deep main .no-border{border:none!important}::ng-deep main .full-width{max-width:100%!important}::ng-deep main .add-more{position:relative;background:url(\"data:image/svg+xml,%3Csvg xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 width%3D%2219%22 height%3D%2219%22 viewBox%3D%220 0 19 19%22%3E%0D %3Cpath id%3D%22Icon_awesome-plus-circle%22 data-name%3D%22Icon awesome-plus-circle%22 d%3D%22M10.063.563a9.5%2C9.5%2C0%2C1%2C0%2C9.5%2C9.5A9.5%2C9.5%2C0%2C0%2C0%2C10.063.563Zm5.516%2C10.573a.461.461%2C0%2C0%2C1-.46.46H11.595v3.524a.461.461%2C0%2C0%2C1-.46.46H8.99a.461.461%2C0%2C0%2C1-.46-.46V11.595H5.006a.461.461%2C0%2C0%2C1-.46-.46V8.99a.461.461%2C0%2C0%2C1%2C.46-.46H8.53V5.006a.461.461%2C0%2C0%2C1%2C.46-.46h2.145a.461.461%2C0%2C0%2C1%2C.46.46V8.53h3.524a.461.461%2C0%2C0%2C1%2C.46.46Z%22 transform%3D%22translate(-0.563 -0.563)%22%2F%3E%0D%3C%2Fsvg%3E%0D\") no-repeat center;width:20px;height:20px;display:inline-block;top:4px}::ng-deep main .remove-icon{position:relative;top:-4px}::ng-deep main .bg-white{background:#ffffff;border-radius:5px}::ng-deep main sub{bottom:0em;font-size:var(--fontsize12)}::ng-deep main hr{border-top:2px solid #C6C6C6}::ng-deep main .product-name{font-family:\"Helvetica Neue Regular\",sans-serif;font-size:var(--fontsize54)}::ng-deep main .colours-link{color:#000;text-decoration:underline;font-size:var(--fontsize14);cursor:pointer}::ng-deep main .colours-link:hover{color:#fa4d56}::ng-deep main .quantity{width:100%}::ng-deep main .quantity .simple{background:none;border:none}::ng-deep main .quantity table{min-width:80%}::ng-deep main .quantity table th{padding:0 10px}::ng-deep main .quantity table th:nth-child(3){min-width:92px}::ng-deep main .quantity table td{padding:10px;box-sizing:border-box}::ng-deep main .quantity table td:nth-child(1){width:80px;min-width:80px}::ng-deep main .quantity table td:nth-child(2){width:110px;min-width:110px}::ng-deep main .quantity table td:nth-child(3){width:100%;text-align:left;position:relative}::ng-deep main .quantity table td:nth-child(3) button{position:absolute;top:23%}::ng-deep main .quantity table td input{width:100%}::ng-deep main .quantity table td .dropleft .dropdown-menu{top:35px!important}::ng-deep main .quantity table td .dropleft .dropdown-menu .dropdown-item{cursor:pointer}::ng-deep main .quantity table td .dropleft .dropdown-toggle:before{display:none}::ng-deep main .quantity table td .side-menu-button{position:absolute;right:10px;top:16px}::ng-deep main .quantity table.accessories .prod-qty{max-width:65px}::ng-deep main .quantity table.has-bundle td:nth-child(3){width:95px}::ng-deep main .quantity table.has-bundle td:nth-child(4){width:170px}@media screen and (max-width: 767px){::ng-deep main .quantity table.has-bundle td:nth-child(4){display:none}}::ng-deep main .table.attributes-table{border:none}::ng-deep main .table.attributes-table th{background-color:#646363;font-family:\"Arial Bold\",sans-serif;color:#fff;height:35px;vertical-align:middle}::ng-deep main .table.attributes-table td{vertical-align:top}::ng-deep main .add-to-cart{background:#1D1D1B;width:100%;height:44px;font-family:\"Arial Bold\",sans-serif;text-align:center;color:#fff;font-size:var(--fontsize14)}::ng-deep main .add-to-cart:disabled{cursor:not-allowed;border:1px solid #A6A6A5;background:#A6A6A5}::ng-deep main .disable{cursor:not-allowed!important}::ng-deep main .tabs{display:flex;align-items:center;padding:15px;width:100%}::ng-deep main .tabs .tab-link{display:flex;width:31.7%;box-sizing:border-box;margin-right:2%;border:1px solid #1D1D1B;padding:0;background-color:#fff;align-items:center;cursor:pointer}::ng-deep main .tabs .tab-link:last-child{margin-right:0}::ng-deep main .tabs .tab-link .icon{width:44px;min-width:44px;height:44px;border-right:1px solid #1D1D1B}::ng-deep main .tabs .tab-link .icon.product-overiew{background:url(\"data:image/svg+xml,%3Csvg xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 width%3D%2226%22 height%3D%2222%22 viewBox%3D%220 0 26 22%22%3E%0D %3Cg id%3D%22Group_14012%22 data-name%3D%22Group 14012%22 transform%3D%22translate(-316 -1291)%22%3E%0D %3Cpath id%3D%22Rectangle_1493%22 data-name%3D%22Rectangle 1493%22 d%3D%22M1%2C1V5H5V1H1M0%2C0H6V6H0Z%22 transform%3D%22translate(316 1291)%22 fill%3D%22%231d1d1b%22%2F%3E%0D %3Cpath id%3D%22Rectangle_1494%22 data-name%3D%22Rectangle 1494%22 d%3D%22M1%2C1V5H5V1H1M0%2C0H6V6H0Z%22 transform%3D%22translate(316 1299)%22 fill%3D%22%231d1d1b%22%2F%3E%0D %3Cpath id%3D%22Rectangle_1495%22 data-name%3D%22Rectangle 1495%22 d%3D%22M1%2C1V5H5V1H1M0%2C0H6V6H0Z%22 transform%3D%22translate(316 1307)%22 fill%3D%22%231d1d1b%22%2F%3E%0D %3Cpath id%3D%22Line_464%22 data-name%3D%22Line 464%22 d%3D%22M18%2C.5H0v-1H18Z%22 transform%3D%22translate(324 1294)%22 fill%3D%22%231d1d1b%22%2F%3E%0D %3Cpath id%3D%22Line_465%22 data-name%3D%22Line 465%22 d%3D%22M18%2C.5H0v-1H18Z%22 transform%3D%22translate(324 1302)%22 fill%3D%22%231d1d1b%22%2F%3E%0D %3Cpath id%3D%22Line_466%22 data-name%3D%22Line 466%22 d%3D%22M18%2C.5H0v-1H18Z%22 transform%3D%22translate(324 1310)%22 fill%3D%22%231d1d1b%22%2F%3E%0D %3C%2Fg%3E%0D%3C%2Fsvg%3E%0D\") no-repeat center}::ng-deep main .tabs .tab-link .icon.downloads{background:url(\"data:image/svg+xml,%3Csvg xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 width%3D%2221%22 height%3D%2221%22 viewBox%3D%220 0 21 21%22%3E%0D %3Cg id%3D%22Group_14014%22 data-name%3D%22Group 14014%22 transform%3D%22translate(0.5 0.5)%22%3E%0D %3Cpath id%3D%22Path_11231%22 data-name%3D%22Path 11231%22 d%3D%22M23.848%2C18.9%2C15.99%2C11.175h4.558V1.282h6.6v9.893h4.558Zm-5.414-6.724L23.848%2C17.5l5.414-5.322H26.147V2.282h-4.6v9.893Z%22 transform%3D%22translate(-13.85 -1.782)%22%2F%3E%0D %3Cpath id%3D%22Path_11232%22 data-name%3D%22Path 11232%22 d%3D%22M22.282%2C69.593h-21V62.275h1v6.318h19V62.275h1Z%22 transform%3D%22translate(-1.781 -49.093)%22%2F%3E%0D %3C%2Fg%3E%0D%3C%2Fsvg%3E%0D\") no-repeat center}::ng-deep main .tabs .tab-link .icon.related-products{position:relative;background:url(\"data:image/svg+xml,%3Csvg id%3D%22Group_14016%22 data-name%3D%22Group 14016%22 xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 width%3D%2220%22 height%3D%2220%22 viewBox%3D%220 0 20 20%22%3E%0D %3Cpath id%3D%22Rectangle_1364%22 data-name%3D%22Rectangle 1364%22 d%3D%22M1%2C1V8H8V1H1M0%2C0H9V9H0Z%22 transform%3D%22translate(0 11)%22 fill%3D%22%231d1d1b%22%2F%3E%0D %3Cpath id%3D%22Rectangle_1366%22 data-name%3D%22Rectangle 1366%22 d%3D%22M1%2C1V8H8V1H1M0%2C0H9V9H0Z%22 transform%3D%22translate(11 11)%22 fill%3D%22%231d1d1b%22%2F%3E%0D %3Cpath id%3D%22Rectangle_1365%22 data-name%3D%22Rectangle 1365%22 d%3D%22M1%2C1V8H8V1H1M0%2C0H9V9H0Z%22 fill%3D%22%231d1d1b%22%2F%3E%0D %3Cg id%3D%22Group_13038%22 data-name%3D%22Group 13038%22 transform%3D%22translate(11)%22%3E%0D %3Cpath id%3D%22Line_321%22 data-name%3D%22Line 321%22 d%3D%22M.5%2C9h-1V0h1Z%22 transform%3D%22translate(4.5)%22 fill%3D%22%231d1d1b%22%2F%3E%0D %3Cpath id%3D%22Line_322%22 data-name%3D%22Line 322%22 d%3D%22M9%2C.5H0v-1H9Z%22 transform%3D%22translate(0 4.5)%22 fill%3D%22%231d1d1b%22%2F%3E%0D %3C%2Fg%3E%0D%3C%2Fsvg%3E%0D\") no-repeat center}::ng-deep main .tabs .tab-link .label{font-size:var(--fontsize14);font-family:\"Arial Bold\",sans-serif;text-transform:uppercase;text-align:center;width:100%;padding:8px}::ng-deep main .tabs .tab-link:hover,::ng-deep main .tabs .tab-link.active{color:#fff;background:#1D1D1B}::ng-deep main .tabs .tab-link:hover .icon,::ng-deep main .tabs .tab-link.active .icon{border-right:1px solid #ffffff}::ng-deep main .tabs .tab-link:hover .icon.product-overiew,::ng-deep main .tabs .tab-link.active .icon.product-overiew{background:url(\"data:image/svg+xml,%3Csvg xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 width%3D%2226%22 height%3D%2222%22 viewBox%3D%220 0 26 22%22%3E%0D %3Cg id%3D%22Group_14011%22 data-name%3D%22Group 14011%22 transform%3D%22translate(-316 -1291)%22%3E%0D %3Cpath id%3D%22Rectangle_1493%22 data-name%3D%22Rectangle 1493%22 d%3D%22M1%2C1V5H5V1H1M0%2C0H6V6H0Z%22 transform%3D%22translate(316 1291)%22 fill%3D%22%23fff%22%2F%3E%0D %3Cpath id%3D%22Rectangle_1494%22 data-name%3D%22Rectangle 1494%22 d%3D%22M1%2C1V5H5V1H1M0%2C0H6V6H0Z%22 transform%3D%22translate(316 1299)%22 fill%3D%22%23fff%22%2F%3E%0D %3Cpath id%3D%22Rectangle_1495%22 data-name%3D%22Rectangle 1495%22 d%3D%22M1%2C1V5H5V1H1M0%2C0H6V6H0Z%22 transform%3D%22translate(316 1307)%22 fill%3D%22%23fff%22%2F%3E%0D %3Cpath id%3D%22Line_464%22 data-name%3D%22Line 464%22 d%3D%22M18%2C.5H0v-1H18Z%22 transform%3D%22translate(324 1294)%22 fill%3D%22%23fff%22%2F%3E%0D %3Cpath id%3D%22Line_465%22 data-name%3D%22Line 465%22 d%3D%22M18%2C.5H0v-1H18Z%22 transform%3D%22translate(324 1302)%22 fill%3D%22%23fff%22%2F%3E%0D %3Cpath id%3D%22Line_466%22 data-name%3D%22Line 466%22 d%3D%22M18%2C.5H0v-1H18Z%22 transform%3D%22translate(324 1310)%22 fill%3D%22%23fff%22%2F%3E%0D %3C%2Fg%3E%0D%3C%2Fsvg%3E%0D\") no-repeat center}::ng-deep main .tabs .tab-link:hover .icon.downloads,::ng-deep main .tabs .tab-link.active .icon.downloads{background:url(\"data:image/svg+xml,%3Csvg xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 width%3D%2221%22 height%3D%2221%22 viewBox%3D%220 0 21 21%22%3E%0D %3Cg id%3D%22Group_14017%22 data-name%3D%22Group 14017%22 transform%3D%22translate(0.5 0.5)%22%3E%0D %3Cpath id%3D%22Path_11231%22 data-name%3D%22Path 11231%22 d%3D%22M23.848%2C18.9%2C15.99%2C11.175h4.558V1.282h6.6v9.893h4.558Zm-5.414-6.724L23.848%2C17.5l5.414-5.322H26.147V2.282h-4.6v9.893Z%22 transform%3D%22translate(-13.85 -1.782)%22 fill%3D%22%23fff%22%2F%3E%0D %3Cpath id%3D%22Path_11232%22 data-name%3D%22Path 11232%22 d%3D%22M22.282%2C69.593h-21V62.275h1v6.318h19V62.275h1Z%22 transform%3D%22translate(-1.781 -49.093)%22 fill%3D%22%23fff%22%2F%3E%0D %3C%2Fg%3E%0D%3C%2Fsvg%3E%0D\") no-repeat center}::ng-deep main .tabs .tab-link:hover .icon.related-products,::ng-deep main .tabs .tab-link.active .icon.related-products{background:url(\"data:image/svg+xml,%3Csvg id%3D%22Group_14015%22 data-name%3D%22Group 14015%22 xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 width%3D%2220%22 height%3D%2220%22 viewBox%3D%220 0 20 20%22%3E%0D %3Cpath id%3D%22Rectangle_1364%22 data-name%3D%22Rectangle 1364%22 d%3D%22M1%2C1V8H8V1H1M0%2C0H9V9H0Z%22 transform%3D%22translate(0 11)%22 fill%3D%22%23fff%22%2F%3E%0D %3Cpath id%3D%22Rectangle_1366%22 data-name%3D%22Rectangle 1366%22 d%3D%22M1%2C1V8H8V1H1M0%2C0H9V9H0Z%22 transform%3D%22translate(11 11)%22 fill%3D%22%23fff%22%2F%3E%0D %3Cpath id%3D%22Rectangle_1365%22 data-name%3D%22Rectangle 1365%22 d%3D%22M1%2C1V8H8V1H1M0%2C0H9V9H0Z%22 fill%3D%22%23fff%22%2F%3E%0D %3Cg id%3D%22Group_13038%22 data-name%3D%22Group 13038%22 transform%3D%22translate(11)%22%3E%0D %3Cpath id%3D%22Line_321%22 data-name%3D%22Line 321%22 d%3D%22M.5%2C9h-1V0h1Z%22 transform%3D%22translate(4.5)%22 fill%3D%22%23fff%22%2F%3E%0D %3Cpath id%3D%22Line_322%22 data-name%3D%22Line 322%22 d%3D%22M9%2C.5H0v-1H9Z%22 transform%3D%22translate(0 4.5)%22 fill%3D%22%23fff%22%2F%3E%0D %3C%2Fg%3E%0D%3C%2Fsvg%3E%0D\") no-repeat center}.modal-title{font-family:\"Arial Bold\",sans-serif}.invite-pop-close{cursor:pointer}.more-content{display:flex;border:1px solid #548AF7;padding:8px;background-color:#edf5ff}.more-content img{position:relative;top:-12px}@media screen and (max-width: 767px){::ng-deep main .category-image{max-width:320px;width:100%!important}::ng-deep main .tabs{flex-direction:row;align-items:stretch}::ng-deep main .tabs .tab-link{align-items:center;flex-direction:column}::ng-deep main .tabs .tab-link .icon{border-right:none}}\n"], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["disabled", "formControlName", "ngModel"], outputs: ["ngModelChange"] }, { type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i6.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i1.MinLengthValidator, selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", inputs: ["minlength"] }, { type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }], pipes: { "async": i5.AsyncPipe } });
535
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: CustomProductQuantityFormComponent, decorators: [{
536
+ type: Component,
537
+ args: [{
538
+ selector: 'app-custom-product-quantity-form',
539
+ templateUrl: './custom-product-quantity-form.component.html',
540
+ styleUrls: ['./custom-product-quantity-form.component.scss'],
541
+ }]
542
+ }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }, { type: i2.CartService }, { type: i3.ActiveCartService }, { type: i4.CurrentProductService }]; }, propDecorators: { hasBundle: [{
543
+ type: Input
544
+ }], productCode: [{
545
+ type: Input
546
+ }], productDetails: [{
547
+ type: Input
548
+ }], unitType: [{
549
+ type: Input
550
+ }], accessoriesPrice: [{
551
+ type: Input
552
+ }], selectedColour: [{
553
+ type: Input
554
+ }], cuttingValidation: [{
555
+ type: Input
556
+ }], finishedVariantDetails: [{
557
+ type: Input
558
+ }], finishedAvailableColours: [{
559
+ type: Input
560
+ }], isFinishedProduct: [{
561
+ type: Input
562
+ }], isFlashingProduct: [{
563
+ type: Input
564
+ }], listView: [{
565
+ type: Input
566
+ }], closeInviteModal: [{
567
+ type: ViewChild,
568
+ args: ['closeInviteModal']
569
+ }], closebutton: [{
570
+ type: ViewChild,
571
+ args: ['closebutton']
572
+ }], updateCartEntires: [{
573
+ type: Output
574
+ }] } });
575
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXByb2R1Y3QtcXVhbnRpdHktZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9idWlsZGluZ3Byb2R1Y3RfbGlicmFyeS9zcmMvbGliL3NoYXJlZC9jdXN0b20tY2FydC1kZXRhaWwvY3VzdG9tLXByb2R1Y3QtcXVhbnRpdHktZm9ybS9jdXN0b20tcHJvZHVjdC1xdWFudGl0eS1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J1aWxkaW5ncHJvZHVjdF9saWJyYXJ5L3NyYy9saWIvc2hhcmVkL2N1c3RvbS1jYXJ0LWRldGFpbC9jdXN0b20tcHJvZHVjdC1xdWFudGl0eS1mb3JtL2N1c3RvbS1wcm9kdWN0LXF1YW50aXR5LWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFFTCxTQUFTLEVBSVQsU0FBUyxFQUVULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxFQUEwQixTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7QUFPdkUsTUFBTSxPQUFPLGtDQUFrQztJQXdEN0MsWUFDVSxXQUF3QixFQUN4QixHQUFzQixFQUN0QixXQUF3QixFQUN4QixpQkFBb0MsRUFDcEMscUJBQTRDO1FBSjVDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLHNC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QUFLLENBQUMsRUFBRTtZQUN2QyxPQUFPLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2hEO1FBQ0QsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQzs7Z0lBem5CVSxrQ0FBa0M7b0hBQWxDLGtDQUFrQywyeEJDekIvQywrdGFBZ1dBOzRGRHZVYSxrQ0FBa0M7a0JBTDlDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGtDQUFrQztvQkFDNUMsV0FBVyxFQUFFLCtDQUErQztvQkFDNUQsU0FBUyxFQUFFLENBQUMsK0NBQStDLENBQUM7aUJBQzdEO2dPQVdVLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFDRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQTRCeUIsZ0JBQWdCO3NCQUE5QyxTQUFTO3VCQUFDLGtCQUFrQjtnQkFDSCxXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWE7Z0JBRWQsaUJBQWlCO3NCQUExQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgT25Jbml0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFZpZXdDaGlsZCxcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ3VycmVudFByb2R1Y3RTZXJ2aWNlIH0gZnJvbSAnQHNwYXJ0YWN1cy9zdG9yZWZyb250JztcclxuaW1wb3J0IHsgQWN0aXZlQ2FydFNlcnZpY2UsIFByb2R1Y3QgfSBmcm9tICdAc3BhcnRhY3VzL2NvcmUnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBDYXJ0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NhcnQuc2VydmljZSc7XHJcbmltcG9ydCB7IEFjY2Vzc29yaWVzUXVhbnRpdHksIFByb2R1Y3RRdWFudGl0eSB9IGZyb20gJy4uLy4uL0N1c3RvbVByb2R1Y3QnO1xyXG5pbXBvcnQgeyBSZWdleFZhbGlkYXRvciwgUmVnZXhDb25zdGFudHMgfSBmcm9tICcuLi8uLi9yZWdFeC52YWxpZGF0b3InO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtY3VzdG9tLXByb2R1Y3QtcXVhbnRpdHktZm9ybScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2N1c3RvbS1wcm9kdWN0LXF1YW50aXR5LWZvcm0uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2N1c3RvbS1wcm9kdWN0LXF1YW50aXR5LWZvcm0uY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEN1c3RvbVByb2R1Y3RRdWFudGl0eUZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcbiAgZW52OiBhbnkgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdlbnYnKTtcclxuICBlbnZpcm9ubWVudCA6IGFueSA9IEpTT04ucGFyc2UodGhpcy5lbnYpO1xyXG4gIGlzRGVza3RvcDogYm9vbGVhbiA9IHRydWU7XHJcbiAgaXNNb2JpbGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc1RhYmxldDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICB0b3RhbExlbmd0aDogYW55O1xyXG4gIHRvdGFsUHJpY2U6IGFueSA9ICcwLjAnO1xyXG5cclxuICBASW5wdXQoKSBoYXNCdW5kbGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBwcm9kdWN0Q29kZTogYW55O1xyXG4gIEBJbnB1dCgpIHByb2R1Y3REZXRhaWxzOiBhbnk7XHJcbiAgQElucHV0KCkgdW5pdFR5cGU6IGFueSA9ICdwZXIgTE0nO1xyXG4gIEBJbnB1dCgpIGFjY2Vzc29yaWVzUHJpY2UgPSAwO1xyXG4gIEBJbnB1dCgpIHNlbGVjdGVkQ29sb3VyOiBhbnkgPSBudWxsO1xyXG4gIEBJbnB1dCgpIGN1dHRpbmdWYWxpZGF0aW9uOiBhbnk7XHJcbiAgQElucHV0KCkgZmluaXNoZWRWYXJpYW50RGV0YWlsczogYW55O1xyXG4gIEBJbnB1dCgpIGZpbmlzaGVkQXZhaWxhYmxlQ29sb3VyczogYW55O1xyXG4gIEBJbnB1dCgpIGlzRmluaXNoZWRQcm9kdWN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgaXNGbGFzaGluZ1Byb2R1Y3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBsaXN0VmlldzogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIHByb2R1Y3RGb3JtOiBhbnkgPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuXHJcbiAgZGlzYWJsZUFkZE1vcmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgYnVuZGxlTGlzdDogYW55ID0gW107XHJcblxyXG4gIGVycm9ySW5kZXg6IGFueSA9IFtdO1xyXG4gIGhhc1Byb2RSZWZJbmRleDogYW55ID0gW107XHJcbiAgaGFzUHJvZFJlZjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGhhc01pbmxlbmd0aEVycm9yOiBhbnkgPSBbXTtcclxuICByb3dJbmRleCA9IDA7XHJcbiAgY2FydElkOiBhbnk7XHJcblxyXG4gIHNob3dXYWl0Q3Vyc29yID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcclxuXHJcbiAgYWRkVG9DYXJ0RXJyb3I6IGFueSA9IG51bGw7XHJcbiAgbW9kYWxCdW5kbGVGb3JtOiBhbnkgPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuICBlZGl0UHJvZEJ1bmRsZTogYW55ID0gJyc7XHJcbiAgZWRpdFByb2RSZWY6IGFueSA9ICcnO1xyXG4gIHNlbGVjdGVkSW5kZXg6IGFueSA9IG51bGw7XHJcblxyXG4gIGhhc0RhdGE6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJvZHVjdCQ6IE9ic2VydmFibGU8UHJvZHVjdCB8IG51bGw+ID1cclxuICAgIHRoaXMuY3VycmVudFByb2R1Y3RTZXJ2aWNlLmdldFByb2R1Y3QoKTtcclxuXHJcbiAgQFZpZXdDaGlsZCgnY2xvc2VJbnZpdGVNb2RhbCcpIGNsb3NlSW52aXRlTW9kYWw6IGFueTtcclxuICBAVmlld0NoaWxkKCdjbG9zZWJ1dHRvbicpIGNsb3NlYnV0dG9uOiBhbnk7XHJcblxyXG4gIEBPdXRwdXQoKSB1cGRhdGVDYXJ0RW50aXJlczogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIHNjcmVlbldpZHRoOiBhbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIGNhcnRTZXJ2aWNlOiBDYXJ0U2VydmljZSxcclxuICAgIHByaXZhdGUgYWN0aXZlQ2FydFNlcnZpY2U6IEFjdGl2ZUNhcnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjdXJyZW50UHJvZHVjdFNlcnZpY2U6IEN1cnJlbnRQcm9kdWN0U2VydmljZVxyXG4gICkge31cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBjb25zdCBjYXJ0T2JqOiBhbnkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc3BhcnRhY3Vz4pq/ZGltb25kLXNwYeKav2NhcnQnKTtcclxuICAgIHRoaXMuY2FydElkID0gSlNPTi5wYXJzZShjYXJ0T2JqKT8uYWN0aXZlO1xyXG4gICAgdGhpcy5zY3JlZW5XaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoICsgJ3B4JztcclxuICAgIGlmICh0aGlzLnByb2R1Y3REZXRhaWxzKSB7XHJcbiAgICAgIHRoaXMuY3JlYXRlUHJvZHVjdEZvcm0oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmICghY2hhbmdlcz8ucHJvZHVjdERldGFpbHM/LmZpcnN0Q2hhbmdlKSB7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIENyZWF0ZSBhIFByb2R1Y3QgUXVhbnRpdHkgRm9ybVxyXG4gIGNyZWF0ZVByb2R1Y3RGb3JtKCk6IHZvaWQge1xyXG4gICAgdGhpcy5hY2Nlc3Nvcmllc1ByaWNlID0gMDtcclxuICAgIHRoaXMudG90YWxMZW5ndGggPSBudWxsO1xyXG4gICAgdGhpcy50b3RhbFByaWNlID0gJzAuMCc7XHJcbiAgICB0aGlzLmhhc0J1bmRsZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5kaXNhYmxlQWRkTW9yZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5idW5kbGVMaXN0ID0gW107XHJcbiAgICB0aGlzLmVycm9ySW5kZXggPSBbXTtcclxuICAgIHRoaXMuaGFzUHJvZFJlZkluZGV4ID0gW107XHJcbiAgICB0aGlzLnJvd0luZGV4ID0gMDtcclxuICAgIHRoaXMucHJvZHVjdEZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuICAgIHRoaXMuYWRkVG9DYXJ0RXJyb3IgPSBudWxsO1xyXG4gICAgdGhpcy5wcm9kdWN0Rm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICBidW5kbGluZzogWycnXSxcclxuICAgICAgcHJvZHVjdFF1YW50aXR5OiB0aGlzLmZvcm1CdWlsZGVyLmFycmF5KFtdKSxcclxuICAgICAgam9iUmVmZXJlbmNlOiBbJycsIFtSZWdleFZhbGlkYXRvcihSZWdleENvbnN0YW50cy5KT0JfUkVGRVJFTkNFKV1dLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5lZGl0UHJvZEJ1bmRsZSA9ICcnO1xyXG4gICAgdGhpcy5lZGl0UHJvZFJlZiA9ICcnO1xyXG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gbnVsbDtcclxuICAgIHRoaXMuaGFzUHJvZFJlZiA9IGZhbHNlO1xyXG4gICAgdGhpcy5oYXNNaW5sZW5ndGhFcnJvciA9IFtdO1xyXG5cclxuICAgIGlmICh0aGlzLmlzRmluaXNoZWRQcm9kdWN0KSB7XHJcbiAgICAgIHRoaXMuYWRkUHJvZHVjdFF1YW50aXR5Rm9ybUdyb3VwKCk7XHJcbiAgICAgIHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHNbMF0/LnBhdGNoVmFsdWUoe1xyXG4gICAgICAgIHByb2RRdHk6IHRoaXMucHJvZHVjdERldGFpbHM/LnF1YW50aXR5LFxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubW9kYWxCdW5kbGVGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgICAgbW9kQnVuZGxlOiBbJycsIFtSZWdleFZhbGlkYXRvcihSZWdleENvbnN0YW50cy5CVU5ETEVfTkFNRSldXSxcclxuICAgICAgICBtb2RSZWY6IFsnJywgW1JlZ2V4VmFsaWRhdG9yKFJlZ2V4Q29uc3RhbnRzLkpPQl9SRUZFUkVOQ0UpXV0sXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnByb2R1Y3REZXRhaWxzPy5zdWJMaW5lQ29uZmlnSW5mb3M/LmZvckVhY2goXHJcbiAgICAgICAgKHZhbDogYW55LCBpbmRleDogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmFkZFByb2R1Y3RRdWFudGl0eUZvcm1Hcm91cCgpO1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmlzTnVsbE9yRW1wdHkodmFsPy5idW5kbGVOYW1lKSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhc0J1bmRsZSA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMucHJvZHVjdEZvcm0/LmdldCgnYnVuZGxpbmcnKT8uc2V0VmFsdWUodHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0uY29udHJvbHNbaW5kZXhdLnBhdGNoVmFsdWUoe1xyXG4gICAgICAgICAgICBwcm9kQnVuZGxlOiB2YWw/LmJ1bmRsZU5hbWUsXHJcbiAgICAgICAgICAgIHByb2RMZW46IHRoaXMucGFkM0RpZ2l0cyh2YWw/Lmxlbmd0aCksXHJcbiAgICAgICAgICAgIHByb2RRdHk6IHZhbD8ucXVhbnRpdHksXHJcbiAgICAgICAgICAgIHByb2RSZWY6IHZhbD8ucmVmZXJlbmNlLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgLy8gVXBkYXRpbmcgdGhlIEJ1bmRsZVxyXG4gIHVwZGF0ZUJ1bmRsaW5nKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuaGFzQnVuZGxlID0gZXZlbnQuY3VycmVudFRhcmdldD8uY2hlY2tlZCA9PT0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLmhhc0J1bmRsZSkge1xyXG4gICAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzPy5mb3JFYWNoKFxyXG4gICAgICAgIChlbGVtZW50OiBhbnksIGluZGV4OiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMudXBkYXRlU2FtZUJ1bmRsZVJlZmVyZW5jZShudWxsLCBpbmRleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGVUb3RhbCgpO1xyXG4gIH1cclxuXHJcbiAgLy8gQ2hlY2sgaWYgYW55IHZhbHVlIGlzIGVtcHR5IG9yIHVuZGVmaW5lZFxyXG4gIGlzTnVsbE9yRW1wdHkodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT0gdW5kZWZpbmVkIHx8IHZhbHVlID09ICcnO1xyXG4gIH1cclxuXHJcbiAgLy8gQ2hlY2sgZm9yIGFueSBlcnJvcnMgd2hpbGUgdXBkYXRpbmcgdGhlIHF1YW50aXR5XHJcbiAgaGFzRXJyb3JJbmRleChpbmRleDogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5lcnJvckluZGV4W2luZGV4XSA9PSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8gQ2hlY2sgaWYgYW55IFNhbWUgUmVmZXJlbmNlIEVycm9yXHJcbiAgaGFzUHJvZFJlZkVycm9ySW5kZXgoaW5kZXg6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaGFzUHJvZFJlZkluZGV4W2luZGV4XSA9PSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8gR3JvdXAgdGhlIFF1YW50aXR5IHZhbHVlcyBiYXNlZCBvbiBidW5kbGVcclxuICBncm91cEJ5QnVuZGxlKGl0ZW1zOiBhbnksIGtleTogYW55KTogYW55IHtcclxuICAgIHJldHVybiBpdGVtcy5yZWR1Y2UoXHJcbiAgICAgIChyZXN1bHQ6IGFueSwgaXRlbTogYW55KSA9PiAoe1xyXG4gICAgICAgIC4uLnJlc3VsdCxcclxuICAgICAgICBbaXRlbVtrZXldXTogWy4uLihyZXN1bHRbaXRlbVtrZXldXSB8fCBbXSksIGl0ZW1dLFxyXG4gICAgICB9KSxcclxuICAgICAge31cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLyBDaGVjayB0aGUgdG90YWwgYnVuZGxlIHdlaWdodCBhbmQgdXBkYXRlIHRoZSBlcnJvciBpZiBpdCByZWFjaGVzIHRvIG1heGltdW0gYnVuZGxlIHNpemUgZm9yIGVhY2ggYnVuZGxlXHJcbiAgY2hlY2tUb3RhbEJ1bmRsZVdlaWdodChmb3JtVmFsdWVzOiBhbnkpOiBhbnkge1xyXG4gICAgbGV0IGdyb3VwVG90YWwgPSAwO1xyXG4gICAgZm9ybVZhbHVlcz8uZm9yRWFjaCgoY3VycmVudFZhbHVlOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgcXR5ID0gcGFyc2VGbG9hdChjdXJyZW50VmFsdWU/LnByb2RRdHkpO1xyXG4gICAgICBjb25zdCBsZW4gPSBwYXJzZUZsb2F0KGN1cnJlbnRWYWx1ZT8ucHJvZExlbik7XHJcbiAgICAgIGlmICghdGhpcy5pc051bGxPckVtcHR5KHF0eSkgJiYgIXRoaXMuaXNOdWxsT3JFbXB0eShsZW4pKSB7XHJcbiAgICAgICAgZ3JvdXBUb3RhbCArPSBxdHkgKiBsZW47XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgZ3JvdXBUb3RhbCA9IGdyb3VwVG90YWwgKiAodGhpcy5jdXR0aW5nVmFsaWRhdGlvbj8ud2VpZ2h0UGVyTE0gfHwgMSk7XHJcbiAgICByZXR1cm4gZ3JvdXBUb3RhbCA+ICh0aGlzLmN1dHRpbmdWYWxpZGF0aW9uPy5tYXhCdW5kbGVMb2FkIHx8IDEwMDApO1xyXG4gIH1cclxuXHJcbiAgLy8gR2V0IHRoZSBsYXN0IHJvdyBvZiBhIGJ1bmRsZSBiYXNlZCBvbiBidW5kbGUgbmFtZVxyXG4gIGdldExhc3RCdW5kbGVJbmRleChidW5kbGVOYW1lOiBhbnkpOiBhbnkge1xyXG4gICAgbGV0IGluZGV4VmFsdWU6IGFueSA9IG51bGw7XHJcbiAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm1cclxuICAgICAgPy5nZXRSYXdWYWx1ZSgpXHJcbiAgICAgID8uZm9yRWFjaCgoZWxlbWVudDogYW55LCBpbmRleDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQ/LnByb2RCdW5kbGU/LnRvVXBwZXJDYXNlKCkgPT0gYnVuZGxlTmFtZT8udG9VcHBlckNhc2UoKSkge1xyXG4gICAgICAgICAgaW5kZXhWYWx1ZSA9IGluZGV4O1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICByZXR1cm4gaW5kZXhWYWx1ZTtcclxuICB9XHJcblxyXG4gIC8vIEdldCB0aGUgUmVmZXJlbmNlIHZhbHVlIG9mIHRoZSBzYW1lIGJ1bmRsZSBhbmQgdXBkYXRlXHJcbiAgZ2V0UHJldkJ1bmRsZVJlZmVyZW5jZVZhbHVlKGluZGV4OiBhbnkpOiBhbnkge1xyXG4gICAgY29uc3QgYnVuZGxlTmFtZSA9XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9PSBudWxsXHJcbiAgICAgICAgPyB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzW2luZGV4XVxyXG4gICAgICAgICAgICA/LmdldCgncHJvZEJ1bmRsZScpXHJcbiAgICAgICAgICAgID8udmFsdWU/LnRvVXBwZXJDYXNlKClcclxuICAgICAgICA6IHRoaXMubW9kYWxCdW5kbGVGb3JtPy5nZXQoJ21vZEJ1bmRsZScpPy52YWx1ZT8udG9VcHBlckNhc2UoKTtcclxuICAgIGxldCByZWZWYWx1ZSA9ICcnO1xyXG4gICAgdGhpcy5wcm9kdWN0UXVhbnRpdHlGb3JtPy5jb250cm9scy5mb3JFYWNoKChlbGVtZW50OiBhbnksIGluZDogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IG90aGVyUmVmVmFsdWUgPVxyXG4gICAgICAgIHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHNbaW5kXT8uZ2V0KCdwcm9kUmVmJyk/LnZhbHVlO1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgZWxlbWVudD8udmFsdWU/LnByb2RCdW5kbGU/LnRvVXBwZXJDYXNlKCkgPT1cclxuICAgICAgICAgIGJ1bmRsZU5hbWU/LnRvVXBwZXJDYXNlKCkgJiZcclxuICAgICAgICAoaW5kICE9IGluZGV4IHx8IHRoaXMuc2VsZWN0ZWRJbmRleCAhPSBudWxsKSAmJlxyXG4gICAgICAgICF0aGlzLmlzTnVsbE9yRW1wdHkob3RoZXJSZWZWYWx1ZSlcclxuICAgICAgKSB7XHJcbiAgICAgICAgcmVmVmFsdWUgPSBvdGhlclJlZlZhbHVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiByZWZWYWx1ZSB8fCAnJztcclxuICB9XHJcblxyXG4gIC8vIENoZWNrIGlmIFNhbWUgUmVmcmVuY2UgaXMgYWxyZWFkeSB1c2VkXHJcbiAgY2hlY2tIYXNTYW1lUmVmZXJlbmNlKFxyXG4gICAgaW5kZXg6IGFueSxcclxuICAgIGN1cnJlbnRSZWZlcmVuY2U6IGFueSxcclxuICAgIGJ1bmRsZU5hbWU6IGFueVxyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGhhc1JlZiA9IGZhbHNlO1xyXG4gICAgY29uc3QgcHJvZFJlZlZhbHVlcyA9IHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHM/LmZpbHRlcihcclxuICAgICAgKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICBlbGVtZW50Py52YWx1ZT8ucHJvZFJlZiA9PSBjdXJyZW50UmVmZXJlbmNlICYmXHJcbiAgICAgICAgICBlbGVtZW50Py52YWx1ZT8ucHJvZEJ1bmRsZT8udG9VcHBlckNhc2UoKSAhPVxyXG4gICAgICAgICAgICBidW5kbGVOYW1lPy50b1VwcGVyQ2FzZSgpICYmXHJcbiAgICAgICAgICAhdGhpcy5pc051bGxPckVtcHR5KGN1cnJlbnRSZWZlcmVuY2UpXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICAgIGlmIChwcm9kUmVmVmFsdWVzPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuaGFzUHJvZFJlZkluZGV4W2luZGV4XSA9IHRydWU7XHJcbiAgICAgIGhhc1JlZiA9IHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmhhc1Byb2RSZWZJbmRleFtpbmRleF0gPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIHJldHVybiBoYXNSZWY7XHJcbiAgfVxyXG5cclxuICAvLyBVcGRhdGUgdGhlIFJlZmVyZW5jZSBWYWx1ZSBpZiBhbHJlYWR5IHRoZSBzYW1lIGJ1bmRsZSBpcyBwcmVzZW50XHJcbiAgdXBkYXRlU2FtZUJ1bmRsZVJlZmVyZW5jZShcclxuICAgIGV2ZW50OiBhbnksXHJcbiAgICBpbmRleDogYW55LFxyXG4gICAgaXNSZWZlcmVuY2U6IGJvb2xlYW4gPSBmYWxzZVxyXG4gICk6IHZvaWQge1xyXG4gICAgY29uc3QgYnVuZGxlTmFtZSA9XHJcbiAgICAgIHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHNbaW5kZXhdPy5nZXQoJ3Byb2RCdW5kbGUnKT8udmFsdWUgfHxcclxuICAgICAgdGhpcy5tb2RhbEJ1bmRsZUZvcm0uZ2V0KCdtb2RCdW5kbGUnKT8udmFsdWU7XHJcbiAgICBjb25zdCBuZXdSZWZWYWx1ZSA9XHJcbiAgICAgIGV2ZW50ICE9IG51bGxcclxuICAgICAgICA/IGV2ZW50LmN1cnJlbnRUYXJnZXQudmFsdWVcclxuICAgICAgICA6IHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHNbaW5kZXhdPy5nZXQoJ3Byb2RSZWYnKT8udmFsdWUgfHxcclxuICAgICAgICAgIHRoaXMubW9kYWxCdW5kbGVGb3JtPy5nZXQoJ21vZFJlZicpLnZhbHVlO1xyXG4gICAgaXNSZWZlcmVuY2UgPSBpc1JlZmVyZW5jZVxyXG4gICAgICA/IHRoaXMuY2hlY2tIYXNTYW1lUmVmZXJlbmNlKGluZGV4LCBuZXdSZWZWYWx1ZSwgYnVuZGxlTmFtZSlcclxuICAgICAgOiBmYWxzZTtcclxuICAgIGlmICghaXNSZWZlcmVuY2UpIHtcclxuICAgICAgdGhpcy5wcm9kdWN0UXVhbnRpdHlGb3JtLmNvbnRyb2xzLmZvckVhY2goKGVsZW1lbnQ6IGFueSwgaW5kOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBlbGVtZW50Py52YWx1ZT8ucHJvZEJ1bmRsZT8udG9VcHBlckNhc2UoKSA9PVxyXG4gICAgICAgICAgICBidW5kbGVOYW1lPy50b1VwcGVyQ2FzZSgpICYmXHJcbiAgICAgICAgICBpbmQgIT0gaW5kZXggJiZcclxuICAgICAgICAgICF0aGlzLmlzTnVsbE9yRW1wdHkobmV3UmVmVmFsdWUpICYmXHJcbiAgICAgICAgICAhdGhpcy5pc051bGxPckVtcHR5KGJ1bmRsZU5hbWUpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzW2luZF1cclxuICAgICAgICAgICAgPy5nZXQoJ3Byb2RSZWYnKVxyXG4gICAgICAgICAgICA/LnNldFZhbHVlKG5ld1JlZlZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgLy8gVXBkYXRlIHRoZSBzYW1lIEJ1bmRsZSBSZWZyZW5jZSBWYWx1ZSB0byBhbGwgb3RoZXIgQnVuZGxlcyBpZiBhbnkgY2hhbmdlcyBpbiBSZWZlcmVuY2UgVmFsdWVcclxuICBwb3B1bGF0ZVNhbWVCdW5kbGVSZWZlcmVuY2UoZXZlbnQ6IGFueSwgaW5kZXg6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgIGNvbnN0IHByZXZSZWZWYWx1ZSA9IHRoaXMuZ2V0UHJldkJ1bmRsZVJlZmVyZW5jZVZhbHVlKGluZGV4KTtcclxuICAgICAgaWYgKCF0aGlzLmlzTnVsbE9yRW1wdHkocHJldlJlZlZhbHVlKSkge1xyXG4gICAgICAgIHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHNbaW5kZXhdXHJcbiAgICAgICAgICAuZ2V0KCdwcm9kUmVmJylcclxuICAgICAgICAgID8uc2V0VmFsdWUocHJldlJlZlZhbHVlKTtcclxuICAgICAgICB0aGlzLm1vZGFsQnVuZGxlRm9ybS5nZXQoJ21vZFJlZicpLnNldFZhbHVlKHByZXZSZWZWYWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICghdGhpcy5pc051bGxPckVtcHR5KHRoaXMuZ2V0UHJldkJ1bmRsZVJlZmVyZW5jZVZhbHVlKGluZGV4KSkpIHtcclxuICAgICAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzW2luZGV4XVxyXG4gICAgICAgICAgPy5nZXQoJ3Byb2RSZWYnKVxyXG4gICAgICAgICAgPy5zZXRWYWx1ZSh0aGlzLmdldFByZXZCdW5kbGVSZWZlcmVuY2VWYWx1ZShpbmRleCkgfHwgJycpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICAvLyBVcGRhdGUgdGhlIEJ1bmRsZSBMaXN0IGlmIG1vcmUgdGhhbiBvbmUgYnVuZGxlL3Jvd3NcclxuICB1cGRhdGVCdW5kbGVMaXN0KCk6IHZvaWQge1xyXG4gICAgY29uc3QgZm9ybVZhbHVlcyA9IHRoaXMuZ3JvdXBCeUJ1bmRsZShcclxuICAgICAgdGhpcy5wcm9kdWN0UXVhbnRpdHlGb3JtPy5nZXRSYXdWYWx1ZSgpLFxyXG4gICAgICAncHJvZEJ1bmRsZSdcclxuICAgICk7XHJcbiAgICBpZiAoT2JqZWN0LmtleXMoZm9ybVZhbHVlcyk/Lmxlbmd0aCA+IDEpIHtcclxuICAgICAgdGhpcy5idW5kbGVMaXN0ID0gT2JqZWN0LmtleXMoZm9ybVZhbHVlcyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICAvLyBHZXQgQnVuZGxlIHZhbHVlcyBvbmx5IGZvciBtb2JpbGUgdmlld1xyXG4gIGdldEJ1bmRsZVZhbHVlcyhpbmRleDogYW55KTogYW55IHtcclxuICAgIGNvbnN0IGJ1bmRsZVZhbHVlcyA9IFtdO1xyXG4gICAgYnVuZGxlVmFsdWVzLnB1c2goXHJcbiAgICAgIHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHNbaW5kZXhdPy5nZXQoJ3Byb2RCdW5kbGUnKT8udmFsdWVcclxuICAgICk7XHJcbiAgICBidW5kbGVWYWx1ZXMucHVzaChcclxuICAgICAgdGhpcy5wcm9kdWN0UXVhbnRpdHlGb3JtPy5jb250cm9sc1tpbmRleF0/LmdldCgncHJvZFJlZicpPy52YWx1ZVxyXG4gICAgKTtcclxuICAgIHJldHVybiBidW5kbGVWYWx1ZXM7XHJcbiAgfVxyXG5cclxuICAvLyBFZGl0IEJ1bmRsZSBWYWx1ZXNcclxuICBlZGl0QnVuZGxlVmFsdWUoaW5kZXg6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gaW5kZXg7XHJcbiAgICB0aGlzLm1vZGFsQnVuZGxlRm9ybVxyXG4gICAgICA/LmdldCgnbW9kQnVuZGxlJylcclxuICAgICAgLnNldFZhbHVlKFxyXG4gICAgICAgIHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHNbaW5kZXhdXHJcbiAgICAgICAgICA/LmdldCgncHJvZEJ1bmRsZScpXHJcbiAgICAgICAgICA/LnZhbHVlLnRvVXBwZXJDYXNlKClcclxuICAgICAgKTtcclxuICAgIHRoaXMubW9kYWxCdW5kbGVGb3JtXHJcbiAgICAgID8uZ2V0KCdtb2RSZWYnKVxyXG4gICAgICA/LnNldFZhbHVlKFxyXG4gICAgICAgIHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHNbaW5kZXhdPy5nZXQoJ3Byb2RSZWYnKT8udmFsdWVcclxuICAgICAgKTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIC8vIFVwZGF0ZS9TYXZlIEJ1bmRsZSB2YWx1ZXNcclxuICBzYXZlQnVuZGxlRGV0YWlscyhldmVudDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzW3RoaXMuc2VsZWN0ZWRJbmRleF1cclxuICAgICAgPy5nZXQoJ3Byb2RCdW5kbGUnKVxyXG4gICAgICA/LnNldFZhbHVlKHRoaXMubW9kYWxCdW5kbGVGb3JtPy5nZXQoJ21vZEJ1bmRsZScpPy52YWx1ZS50b1VwcGVyQ2FzZSgpKTtcclxuICAgIHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHNbdGhpcy5zZWxlY3RlZEluZGV4XVxyXG4gICAgICA/LmdldCgncHJvZFJlZicpXHJcbiAgICAgID8uc2V0VmFsdWUodGhpcy5tb2RhbEJ1bmRsZUZvcm0/LmdldCgnbW9kUmVmJyk/LnZhbHVlKTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZVNhbWVCdW5kbGVSZWZlcmVuY2UobnVsbCwgdGhpcy5zZWxlY3RlZEluZGV4LCB0cnVlKTtcclxuICAgIHRoaXMudXBkYXRlVG90YWwoKTtcclxuICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IG51bGw7XHJcblxyXG4gICAgdGhpcy5jbG9zZWJ1dHRvbi5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XHJcbiAgfVxyXG5cclxuICAvLyBVcGRhdGUgQ2FydCBEZWF0aWxzXHJcbiAgdXBkYXRlQ2FydERldGFpbHMoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pc1ZhbGlkRm9ybSgpKSB7XHJcbiAgICAgIGxldCBwYXlMb2FkOiBhbnkgPSB7fTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmlzRmluaXNoZWRQcm9kdWN0KSB7XHJcbiAgICAgICAgcGF5TG9hZCA9IHtcclxuICAgICAgICAgIHF1YW50aXR5OiB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzWzBdLmdldCgncHJvZFF0eScpPy52YWx1ZSxcclxuICAgICAgICAgIHByb2R1Y3Q6IHtcclxuICAgICAgICAgICAgY29kZTogdGhpcy5wcm9kdWN0RGV0YWlscz8ucHJvZHVjdD8uY29kZSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBqb2JSZWZlcmVuY2U6IHRoaXMucHJvZHVjdERldGFpbHM/LnByb2R1Y3Q/LmpvYlJlZmVyZW5jZSxcclxuICAgICAgICB9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHBheUxvYWQgPSB7XHJcbiAgICAgICAgICBxdWFudGl0eTogMSxcclxuICAgICAgICAgIGNvbmZpZ3VyYXRpb25JbmZvczogW3RoaXMucHJvZHVjdERldGFpbHM/LmNvbmZpZ1ZhbHVlc10sXHJcbiAgICAgICAgICBzdWJMaW5lQ29uZmlnSW5mb3M6IFtdLFxyXG4gICAgICAgICAgam9iUmVmZXJlbmNlOiB0aGlzLnByb2R1Y3REZXRhaWxzPy5wcm9kdWN0Py5qb2JSZWZlcmVuY2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzPy5mb3JFYWNoKFxyXG4gICAgICAgICAgKGVsZW1lbnQ6IGFueSwgaW5kZXg6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjb25maWdJbmZvczogYW55ID0ge1xyXG4gICAgICAgICAgICAgIGNvbmZpZ3VyYXRvclR5cGU6ICdDVVRUSU5HJyxcclxuICAgICAgICAgICAgICBxdWFudGl0eTogZWxlbWVudD8udmFsdWU/LnByb2RRdHksXHJcbiAgICAgICAgICAgICAgbGVuZ3RoOiBlbGVtZW50Py52YWx1ZT8ucHJvZExlbixcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzQnVuZGxlICYmIGVsZW1lbnQ/LnZhbHVlPy5wcm9kQnVuZGxlKSB7XHJcbiAgICAgICAgICAgICAgY29uZmlnSW5mb3MuYnVuZGxlTmFtZSA9IGVsZW1lbnQ/LnZhbHVlPy5wcm9kQnVuZGxlO1xyXG4gICAgICAgICAgICAgIGNvbmZpZ0luZm9zLnJlZmVyZW5jZSA9IGVsZW1lbnQ/LnZhbHVlPy5wcm9kUmVmO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHBheUxvYWQuc3ViTGluZUNvbmZpZ0luZm9zLnB1c2goY29uZmlnSW5mb3MpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgcGF5TG9hZD8uY29uZmlndXJhdGlvbkluZm9zICYmXHJcbiAgICAgICAgICBwYXlMb2FkPy5jb25maWd1cmF0aW9uSW5mb3M/Lmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgIHRoaXMuaXNOdWxsT3JFbXB0eShwYXlMb2FkPy5jb25maWd1cmF0aW9uSW5mb3NbMF0pXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBkZWxldGUgcGF5TG9hZD8uY29uZmlndXJhdGlvbkluZm9zO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jYXJ0U2VydmljZVxyXG4gICAgICAgIC51cGRhdGVDYXJ0RW50cnkodGhpcy5jYXJ0SWQsIHRoaXMucHJvZHVjdERldGFpbHM/LmVudHJ5TnVtYmVyLCBwYXlMb2FkKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUNhcnRTZXJ2aWNlLnJlbG9hZEFjdGl2ZUNhcnQoKTtcclxuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcnRFbnRpcmVzLmVtaXQodHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmFkZFRvQ2FydEVycm9yID1cclxuICAgICAgICAgICAgICBlcnJvcj8uZXJyb3I/LmVycm9yc1swXT8ubWVzc2FnZSB8fFxyXG4gICAgICAgICAgICAgIGVycm9yPy5lcnJvcj8uZXJyb3JzWzBdPy5lcnJvck1lc3NhZ2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIFVwZGF0ZSBUb3RhbCBQcmljZSBhbmQgVG90YWwgbGVuZ3RoIGJhc2VkIG9uIHVzZXIgaW5wdXRzIG9uIGVhY2ggcm93XHJcbiAgdXBkYXRlVG90YWwoKTogdm9pZCB7XHJcbiAgICB0aGlzLnRvdGFsTGVuZ3RoID0gMDtcclxuICAgIHRoaXMudG90YWxQcmljZSA9IDA7XHJcbiAgICBpZiAoIXRoaXMuaXNGaW5pc2hlZFByb2R1Y3QpIHtcclxuICAgICAgY29uc3QgZm9ybVZhbHVlcyA9IHRoaXMuZ3JvdXBCeUJ1bmRsZShcclxuICAgICAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmdldFJhd1ZhbHVlKCksXHJcbiAgICAgICAgJ3Byb2RCdW5kbGUnXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybS5jb250cm9scy5mb3JFYWNoKChlbGVtZW50OiBhbnksIGluZGV4OiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCBxdHkgPSBwYXJzZUZsb2F0KGVsZW1lbnQ/LnZhbHVlPy5wcm9kUXR5KTtcclxuICAgICAgICBjb25zdCBsZW4gPSBwYXJzZUZsb2F0KGVsZW1lbnQ/LnZhbHVlPy5wcm9kTGVuKTtcclxuICAgICAgICBjb25zdCBjdXJyZW50QnVuZGxlTmFtZSA9IGVsZW1lbnQ/LnZhbHVlPy5wcm9kQnVuZGxlPy50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgIGxldCB0b3RhbCA9IDA7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgIXRoaXMuaXNOdWxsT3JFbXB0eShxdHkpICYmXHJcbiAgICAgICAgICAhdGhpcy5pc051bGxPckVtcHR5KGxlbikgJiZcclxuICAgICAgICAgICFpc05hTihxdHkpICYmXHJcbiAgICAgICAgICAhaXNOYU4obGVuKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdG90YWwgPSBxdHkgKiBsZW47XHJcbiAgICAgICAgICBpZiAoIXRoaXMuaGFzQnVuZGxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXJyb3JJbmRleFtpbmRleF0gPVxyXG4gICAgICAgICAgICAgIHRvdGFsICogKHRoaXMuY3V0dGluZ1ZhbGlkYXRpb24/LndlaWdodFBlckxNIHx8IDEpID5cclxuICAgICAgICAgICAgICAodGhpcy5jdXR0aW5nVmFsaWRhdGlvbj8ubWF4QnVuZGxlTG9hZCB8fCAxMDAwKVxyXG4gICAgICAgICAgICAgICAgPyB0cnVlXHJcbiAgICAgICAgICAgICAgICA6IGZhbHNlO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAgdGhpcy5jaGVja1RvdGFsQnVuZGxlV2VpZ2h0KGZvcm1WYWx1ZXNbY3VycmVudEJ1bmRsZU5hbWVdKVxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVycm9ySW5kZXhObyA9IHRoaXMuZ2V0TGFzdEJ1bmRsZUluZGV4KGN1cnJlbnRCdW5kbGVOYW1lKTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzTnVsbE9yRW1wdHkoZXJyb3JJbmRleE5vKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuZXJyb3JJbmRleFtlcnJvckluZGV4Tm9dID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvckluZGV4W2luZGV4XSA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWlzTmFOKHF0eSkgJiYgIWlzTmFOKGxlbikpIHtcclxuICAgICAgICAgIHRoaXMudG90YWxMZW5ndGggPSB0aGlzLnRvdGFsTGVuZ3RoICsgdG90YWw7XHJcbiAgICAgICAgICB0aGlzLnRvdGFsUHJpY2UgPVxyXG4gICAgICAgICAgICB0aGlzLnRvdGFsTGVuZ3RoICogdGhpcy5wcm9kdWN0RGV0YWlscz8ucHJpY2U/LnZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnRvdGFsTGVuZ3RoID0gbnVsbDtcclxuICAgICAgY29uc3QgcXR5ID0gdGhpcy5wcm9kdWN0UXVhbnRpdHlGb3JtPy5jb250cm9sc1swXT8uZ2V0KCdwcm9kUXR5Jyk/LnZhbHVlO1xyXG4gICAgICBpZiAoIWlzTmFOKHF0eSkpIHtcclxuICAgICAgICB0aGlzLnRvdGFsUHJpY2UgPSBxdHkgKiB0aGlzLmFjY2Vzc29yaWVzUHJpY2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMudXBkYXRlQ2FydERldGFpbHMoKTtcclxuICB9XHJcblxyXG4gIC8vIFV0aWxpdHkgRnVuY3Rpb24gdG8gZ2V0IEtleSBWYWx1ZXNcclxuICBnZXRLZXlWYWx1ZXMoc291cmNlOiBhbnksIHNlYXJjaDogYW55KTogYW55IHtcclxuICAgIGlmICh0eXBlb2Ygc291cmNlICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgW2tleSwgbmV4dF0gPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xyXG4gICAgY29uc3QgeyBba2V5XTogdmFsdWUsIC4uLnJlc3QgfSA9IHNvdXJjZTtcclxuXHJcbiAgICByZXR1cm4gW1xyXG4gICAgICAuLi4oa2V5ID09PSBzZWFyY2ggPyBbdmFsdWVdIDogdGhpcy5nZXRLZXlWYWx1ZXModmFsdWUsIHNlYXJjaCkpLFxyXG4gICAgICAuLi4obmV4dCA/IHRoaXMuZ2V0S2V5VmFsdWVzKHJlc3QsIHNlYXJjaCkgOiBbXSksXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgLy8gR2V0IHRoZSB2YWx1ZXMgb2YgUXVhbnRpdHkgRm9ybVxyXG4gIGdldFByb2R1Y3RRdWFudGl0eUZvcm1Hcm91cCgpOiBGb3JtR3JvdXAge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoXHJcbiAgICAgIHRoaXMuaXNGaW5pc2hlZFByb2R1Y3QgPyBuZXcgQWNjZXNzb3JpZXNRdWFudGl0eSgpIDogbmV3IFByb2R1Y3RRdWFudGl0eSgpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHByb2R1Y3RRdWFudGl0eUZvcm0oKTogRm9ybUFycmF5IHtcclxuICAgIHJldHVybiB0aGlzLnByb2R1Y3RGb3JtLmdldCgncHJvZHVjdFF1YW50aXR5JykgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgLy8gQWRkIHRoZSBRdWFuaXR5IEZvcm0gd2hlbiB1c2VyIGNsaWNrcyBvbiBBZGQgTW9yZSBidXR0b25cclxuICBhZGRQcm9kdWN0UXVhbnRpdHlGb3JtR3JvdXAoZXZlbnQ/OiBhbnkpOiB2b2lkIHtcclxuICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgdGhpcy5wcm9kdWN0UXVhbnRpdHlGb3JtPy5wdXNoKHRoaXMuZ2V0UHJvZHVjdFF1YW50aXR5Rm9ybUdyb3VwKCkpO1xyXG4gICAgY29uc3QgYnVuZGxlcyA9IHRoaXMuZ3JvdXBCeUJ1bmRsZShcclxuICAgICAgdGhpcy5wcm9kdWN0UXVhbnRpdHlGb3JtPy5nZXRSYXdWYWx1ZSgpLFxyXG4gICAgICAncHJvZEJ1bmRsZSdcclxuICAgICk7XHJcbiAgICB0aGlzLmRpc2FibGVBZGRNb3JlID0gdGhpcy5wcm9kdWN0UXVhbnRpdHlGb3JtPy5sZW5ndGggPiA5OTtcclxuICAgIHRoaXMuZXJyb3JJbmRleFt0aGlzLnJvd0luZGV4XSA9IGZhbHNlO1xyXG4gICAgdGhpcy5oYXNQcm9kUmVmSW5kZXhbdGhpcy5yb3dJbmRleCsrXSA9IGZhbHNlO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgLy8gVXBkYXRlIHRoZSBRdWFudGl0eSBmb3JtIGlmIHVzZXIgY2xpY2tzIG9uIHJlbW92ZSBidXR0b25cclxuICByZW1vdmVQcm9kdWN0UXVhbnRpdHlGb3JtKGluZGV4OiBhbnksIGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0ucmVtb3ZlQXQoaW5kZXgpO1xyXG4gICAgdGhpcy5yb3dJbmRleC0tO1xyXG4gICAgdGhpcy5kaXNhYmxlQWRkTW9yZSA9IHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8ubGVuZ3RoID4gOTk7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB0aGlzLnVwZGF0ZVRvdGFsKCk7XHJcbiAgfVxyXG5cclxuICAvLyBHZXQgSm9iIFJlZmVyZW5jZSBFcnJvcnNcclxuICBqb2JSZWZlcmVuY2VFcnJvcnMoKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLnByb2R1Y3RGb3JtPy5nZXQoJ2pvYlJlZmVyZW5jZScpPy5lcnJvcnM7XHJcbiAgfVxyXG5cclxuICAvLyBHZXQgUHJvZHVjdCBRdWFudGl0eSBFcnJvcnNcclxuICBwcm9kUXR5RXJyb3JzKGluZGV4OiBhbnkpOiBhbnkge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgKHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHNbaW5kZXhdPy5nZXQoJ3Byb2RRdHknKT8uZXJyb3JzIHx8XHJcbiAgICAgICAgdGhpcy5wcm9kdWN0UXVhbnRpdHlGb3JtPy5jb250cm9sc1tpbmRleF0/LmdldCgncHJvZFF0eScpPy5pbnZhbGlkKSAmJlxyXG4gICAgICAodGhpcy5wcm9kdWN0UXVhbnRpdHlGb3JtPy5jb250cm9sc1tpbmRleF0/LmdldCgncHJvZFF0eScpPy5kaXJ0eSB8fFxyXG4gICAgICAgIHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHNbaW5kZXhdPy5nZXQoJ3Byb2RRdHknKT8udG91Y2hlZClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLyBHZXQgUHJvZHVjdCBMZW5ndGggRXJyb3JzXHJcbiAgcHJvZExlbkVycm9ycyhpbmRleDogYW55KTogYW55IHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgICh0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzW2luZGV4XT8uZ2V0KCdwcm9kTGVuJyk/LmVycm9ycyB8fFxyXG4gICAgICAgIHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHNbaW5kZXhdPy5nZXQoJ3Byb2RMZW4nKT8uaW52YWxpZCkgJiZcclxuICAgICAgKHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHNbaW5kZXhdPy5nZXQoJ3Byb2RMZW4nKT8uZGlydHkgfHxcclxuICAgICAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzW2luZGV4XT8uZ2V0KCdwcm9kTGVuJyk/LnRvdWNoZWQpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gR2V0IFByb2R1Y3QgTGVuZ3RoIEVycm9yc1xyXG4gIG1pbkxlbkVycm9ycyhpbmRleDogYW55KTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLmhhc01pbmxlbmd0aEVycm9yPy5pbmRleE9mKGluZGV4KSAhPT0gLTE7XHJcbiAgfVxyXG5cclxuICAvLyBHZXQgUHJvZHVjdCBCdW5kbGUgRXJyb3JzXHJcbiAgcHJvZEJ1bmRsZUVycm9ycyhpbmRleDogYW55KTogYW55IHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgICh0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzW2luZGV4XT8uZ2V0KCdwcm9kQnVuZGxlJyk/LmVycm9ycyB8fFxyXG4gICAgICAgIHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHNbaW5kZXhdPy5nZXQoJ3Byb2RCdW5kbGUnKVxyXG4gICAgICAgICAgPy5pbnZhbGlkKSAmJlxyXG4gICAgICAodGhpcy5wcm9kdWN0UXVhbnRpdHlGb3JtPy5jb250cm9sc1tpbmRleF0/LmdldCgncHJvZEJ1bmRsZScpPy5kaXJ0eSB8fFxyXG4gICAgICAgIHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHNbaW5kZXhdPy5nZXQoJ3Byb2RCdW5kbGUnKT8udG91Y2hlZClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLyBHZXQgUHJvZHVjdCBCdW5sZGUgUmVmZXJlbmNlIEVycm9yc1xyXG4gIHByb2RSZWZFcnJvcnMoaW5kZXg6IGFueSk6IGFueSB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICAodGhpcy5wcm9kdWN0UXVhbnRpdHlGb3JtPy5jb250cm9sc1tpbmRleF0/LmdldCgncHJvZFJlZicpPy5lcnJvcnMgfHxcclxuICAgICAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzW2luZGV4XT8uZ2V0KCdwcm9kUmVmJyk/LmludmFsaWQpICYmXHJcbiAgICAgICh0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzW2luZGV4XT8uZ2V0KCdwcm9kUmVmJyk/LmRpcnR5IHx8XHJcbiAgICAgICAgdGhpcy5wcm9kdWN0UXVhbnRpdHlGb3JtPy5jb250cm9sc1tpbmRleF0/LmdldCgncHJvZFJlZicpPy50b3VjaGVkKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vIENoZWNrIGlmIGZvcm0gaXMgVmFsaWQgb3Igbm90XHJcbiAgaXNWYWxpZEZvcm0oKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgdmFsaWQgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuaGFzQnVuZGxlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnByb2R1Y3RGb3JtPy52YWxpZDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucHJvZHVjdFF1YW50aXR5Rm9ybT8uY29udHJvbHM/LmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgIHZhbGlkID0gdGhpcy5pc0ZpbmlzaGVkUHJvZHVjdFxyXG4gICAgICAgICAgPyBlbGVtZW50Py5nZXQoJ3Byb2RRdHknKT8udmFsaWRcclxuICAgICAgICAgIDogZWxlbWVudD8uZ2V0KCdwcm9kTGVuJyk/LnZhbGlkICYmIGVsZW1lbnQ/LmdldCgncHJvZFF0eScpPy52YWxpZDtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsaWQ7XHJcbiAgfVxyXG5cclxuICAvLyBDaGVjayBpZiBhbnkgZXJyb3JzIHByZXNlbnQgb24gYW55IHJvdyBhbmQgZGlwbGF5IGl0IG9uIFVJXHJcbiAgaGFzRXJyb3JzKGluZGV4OiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzW2luZGV4XT8uZ2V0KCdwcm9kUXR5Jyk/LmVycm9ycyB8fFxyXG4gICAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzW2luZGV4XT8uZ2V0KCdwcm9kTGVuJyk/LmVycm9ycyB8fFxyXG4gICAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzW2luZGV4XT8uZ2V0KCdwcm9kQnVuZGxlJyk/LmVycm9ycyB8fFxyXG4gICAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzW2luZGV4XT8uZ2V0KCdwcm9kUmVmJyk/LmVycm9yc1xyXG4gICAgICA/IHRydWVcclxuICAgICAgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vIENoZWNrIGlmIEFueSBFbnRyeSBoYXMgbGVzcyB0aGFuIE1pbmltdW0gbGVuZ3RoXHJcbiAgY2hlY2tIYXNNaW5MZW5ndGhRdHkoKTogdm9pZCB7XHJcbiAgICB0aGlzLmhhc01pbmxlbmd0aEVycm9yID0gW107XHJcbiAgICB0aGlzLnByb2R1Y3RRdWFudGl0eUZvcm0/LmNvbnRyb2xzPy5mb3JFYWNoKChlbGVtZW50OiBhbnksIGluZDogYW55KSA9PiB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICBlbGVtZW50Py52YWx1ZT8ucHJvZExlbiA8IHRoaXMuY3V0dGluZ1ZhbGlkYXRpb24/Lm1pbkxlbmd0aCAmJlxyXG4gICAgICAgICF0aGlzLmlzTnVsbE9yRW1wdHkoZWxlbWVudD8udmFsdWU/LnByb2RMZW4pXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMuaGFzTWlubGVuZ3RoRXJyb3IucHVzaChpbmQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHBhZDNEaWdpdHModmFsdWU6IGFueSk6IGFueSB7XHJcbiAgICBjb25zdCBxdHkgPSB2YWx1ZTtcclxuICAgIGlmICghdGhpcy5pc051bGxPckVtcHR5KHF0eSkgJiYgIWlzTmFOKHF0eSkpIHtcclxuICAgICAgcmV0dXJuIHBhcnNlRmxvYXQocXR5KVxyXG4gICAgICAgID8udG9GaXhlZCgzKVxyXG4gICAgICAgID8ucmVwbGFjZSgvKFxcZCkoPz0oXFxkezN9KStcXGIpL2csICckMSwnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIENvbnZlcnQgTGVuZ3RoIHRvIGRlbWlhbCBmb3JtYXQgYWZ0ZXIgYmx1clxyXG4gIHVwZGF0ZUxlbnRoVmFsdWUoZWxlbWVudDogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaXNOdWxsT3JFbXB0eShlbGVtZW50Py52YWx1ZSkpIHtcclxuICAgICAgZWxlbWVudC52YWx1ZSA9IHRoaXMucGFkM0RpZ2l0cyhlbGVtZW50LnZhbHVlKTtcclxuICAgIH1cclxuICAgIHRoaXMuY2hlY2tIYXNNaW5MZW5ndGhRdHkoKTtcclxuICB9XHJcbn1cclxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cInByb2R1Y3REZXRhaWxzXCIgW2Zvcm1Hcm91cF09XCJwcm9kdWN0Rm9ybVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cImNvbCBwLTAgYnVuZGxpbmdcIlxyXG4gICAgICAgICpuZ0lmPVwiIWlzRmluaXNoZWRQcm9kdWN0ICYmICFpc0ZsYXNoaW5nUHJvZHVjdFwiXHJcbiAgICAgID5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInByLTIgZm9udC13ZWlnaHQtYm9sZCB0ZXh0XCI+QnVuZGxpbmcgPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwic3dpdGNoXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYnVuZGxpbmdcIlxyXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwidXBkYXRlQnVuZGxpbmcoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2xpZGVyIHJvdW5kXCI+PC9zcGFuPlxyXG4gICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicXVhbnRpdHkgYm9yZGVyIHAtMyBtdC00XCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgZm9ybUFycmF5TmFtZT1cInByb2R1Y3RRdWFudGl0eVwiPlxyXG4gICAgICAgIDxkYXRhbGlzdCBpZD1cImJ1bmRsZUxpc3RcIj5cclxuICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGJ1bmRsZSBvZiBidW5kbGVMaXN0XCI+XHJcbiAgICAgICAgICAgIHt7IGJ1bmRsZSB9fVxyXG4gICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgPC9kYXRhbGlzdD5cclxuICAgICAgICA8dGFibGVcclxuICAgICAgICAgIGNsYXNzPVwibm8tYm9yZGVyXCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgJ2hhcy1idW5kbGUnOiBoYXNCdW5kbGUsXHJcbiAgICAgICAgICAgIGFjY2Vzc29yaWVzOiBpc0ZpbmlzaGVkUHJvZHVjdFxyXG4gICAgICAgICAgfVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICA8dGg+UXVhbnRpdHk8L3RoPlxyXG4gICAgICAgICAgICA8dGggKm5nSWY9XCIhaXNGaW5pc2hlZFByb2R1Y3RcIj5MZW5ndGggKExNKTwvdGg+XHJcbiAgICAgICAgICAgIDx0aCAqbmdJZj1cImhhc0J1bmRsZVwiPlxyXG4gICAgICAgICAgICAgIEJ1bmRsZVxyXG4gICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImluZm8taWNvblwiXHJcbiAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwiQnVuZGxlIEluZm9ybWF0aW9uIGdvZXMgaGVyZS4uLi5cIlxyXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICA8dGhcclxuICAgICAgICAgICAgICAqbmdJZj1cImhhc0J1bmRsZVwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJkLW5vbmVcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2QtbGctYmxvY2snOiBsaXN0VmlldyB9XCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIFJlZmVyZW5jZVxyXG4gICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImluZm8taWNvblwiXHJcbiAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwiUmVmZXJlbmNlIEluZm9ybWF0aW9uIGdvZXMgaGVyZS4uLi5cIlxyXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICA8dGg+PC90aD5cclxuICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAqbmdGb3I9XCJcclxuICAgICAgICAgICAgICAgIGxldCB2YWwgb2YgcHJvZHVjdEZvcm0uZ2V0KCdwcm9kdWN0UXVhbnRpdHknKVsnY29udHJvbHMnXTtcclxuICAgICAgICAgICAgICAgIGxldCBpID0gaW5kZXhcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIFtmb3JtR3JvdXBOYW1lXT1cImlcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBwcm9kLXF0eVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicHJvZFF0eVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbWlubGVuZ3RoPVwiMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgT25seU51bWJlcj1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChibHVyKT1cInVwZGF0ZVRvdGFsKClcIlxyXG4gICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFpc0ZpbmlzaGVkUHJvZHVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBwcm9kLWxlblwiXHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicHJvZExlblwiXHJcbiAgICAgICAgICAgICAgICAgICAgI3Byb2RMZW5cclxuICAgICAgICAgICAgICAgICAgICBtaW5sZW5ndGg9XCIxXCJcclxuICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9XCI3XCJcclxuICAgICAgICAgICAgICAgICAgICBPbmx5TnVtYmVyPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwidXBkYXRlVG90YWwoKTsgdXBkYXRlTGVudGhWYWx1ZShwcm9kTGVuKVwiXHJcbiAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiaGFzQnVuZGxlICYmICFpc0ZpbmlzaGVkUHJvZHVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1ub25lXCIgW25nQ2xhc3NdPVwieyAnZC1sZy1ibG9jayc6IGxpc3RWaWV3IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIHByb2QtYnVuZGxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInByb2RCdW5kbGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgI3Byb2RCdW5kbGVcclxuICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZEJ1bmRsZS52YWx1ZSA9IHByb2RCdW5kbGUudmFsdWUudG9VcHBlckNhc2UoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgICAgIG1pbmxlbmd0aD1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlVG90YWwoKTsgcG9wdWxhdGVTYW1lQnVuZGxlUmVmZXJlbmNlKG51bGwsIGkpXHJcbiAgICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGZvY3VzKT1cInVwZGF0ZUJ1bmRsZUxpc3QoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBsaXN0PVwiYnVuZGxlTGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieyAnZC1sZy1ub25lIGQteGwtbm9uZSc6IGxpc3RWaWV3IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInAtMCBtLTBcIiAqbmdGb3I9XCJsZXQgdmFsdWUgb2YgZ2V0QnVuZGxlVmFsdWVzKGkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyB2YWx1ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaWRlLW1lbnUtYnV0dG9uXCIgKm5nSWY9XCIhbGlzdFZpZXdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGRyb3BsZWZ0XCIgKm5nSWY9XCJoYXNCdW5kbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLXRvZ2dsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9XCIjXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdG9nZ2xlPVwiZHJvcGRvd25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZWxsaXBzaXMtdlwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1pdGVtIG0tMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10b2dnbGU9XCJtb2RhbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10YXJnZXQ9XCIjYnVuZGxlTW9kYWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0QnVuZGxlVmFsdWUoaSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdCBCdW5kbGUgVmFsdWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24taXRlbSBtLTBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaSA+IDAgfHwgcHJvZHVjdFF1YW50aXR5Rm9ybS5sZW5ndGggPiAxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlUHJvZHVjdFF1YW50aXR5Rm9ybShpLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiaGFzQnVuZGxlICYmICFpc0ZpbmlzaGVkUHJvZHVjdCAmJiBsaXN0Vmlld1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1ub25lXCIgW25nQ2xhc3NdPVwieyAnZC1sZy1ibG9jayc6IGxpc3RWaWV3IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIHByb2QtcmVmZXJlbmNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIG1pbmxlbmd0aD1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMTVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGZvY3VzKT1cInBvcHVsYXRlU2FtZUJ1bmRsZVJlZmVyZW5jZSgkZXZlbnQsIGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInByb2RSZWZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVRvdGFsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNhbWVCdW5kbGVSZWZlcmVuY2UoJGV2ZW50LCBpLCB0cnVlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJsaXN0Vmlld1wiPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGkgPiAwIHx8IChwcm9kdWN0UXVhbnRpdHlGb3JtLmxlbmd0aCA+IDEgJiYgbGlzdFZpZXcpXHJcbiAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNpbXBsZSBjbG9zZSBkLXNtLW5vbmUgZC1tZC1ub25lIGQtbGctYmxvY2sgZC14bC1ibG9ja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVByb2R1Y3RRdWFudGl0eUZvcm0oaSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10aW1lcy1jaXJjbGUgY3VzdG9tLWFycm93IHJlbW92ZS1pY29uXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieyAnZC1sZy1ub25lIGQteGwtbm9uZSc6IGxpc3RWaWV3IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGRyb3BsZWZ0XCIgKm5nSWY9XCJoYXNCdW5kbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLXRvZ2dsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9XCIjXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdG9nZ2xlPVwiZHJvcGRvd25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZWxsaXBzaXMtdlwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1pdGVtIG0tMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10b2dnbGU9XCJtb2RhbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10YXJnZXQ9XCIjYnVuZGxlTW9kYWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0QnVuZGxlVmFsdWUoaSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdCBCdW5kbGUgVmFsdWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24taXRlbSBtLTBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaSA+IDAgfHwgcHJvZHVjdFF1YW50aXR5Rm9ybS5sZW5ndGggPiAxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlUHJvZHVjdFF1YW50aXR5Rm9ybShpLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgPHRyICpuZ0lmPVwiaGFzRXJyb3JzKGkpXCI+XHJcbiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjRcIiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0wXCIgKm5nSWY9XCJwcm9kUXR5RXJyb3JzKGkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgUGxlYXNlIGVudGVyIHZhbGlkIFF1YW50aXR5XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMlwiICpuZ0lmPVwicHJvZExlbkVycm9ycyhpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIFBsZWFzZSBlbnRlciB2YWxpZCBMZW5ndGhcclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCIgKm5nSWY9XCJtaW5MZW5FcnJvcnMoaSlcIj5cclxuICAgICAgICAgICAgICAgICAgICBNaW5pbXVtIGxlbmd0aCBzaG91bGQgYmUgYXQgbGVhc3RcclxuICAgICAgICAgICAgICAgICAgICB7eyBjdXR0aW5nVmFsaWRhdGlvbj8ubWluTGVuZ3RoIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMlwiICpuZ0lmPVwicHJvZEJ1bmRsZUVycm9ycyhpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIFBsZWFzZSBlbnRlciB2YWxpZCBCdW5kbGUgTmFtZVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTJcIiAqbmdJZj1cInByb2RSZWZFcnJvcnMoaSlcIj5cclxuICAgICAgICAgICAgICAgICAgICBQbGVhc2UgZW50ZXIgdmFsaWQgUmVmZXJlbmNlXHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgIDx0ciAqbmdJZj1cImhhc0Vycm9ySW5kZXgoaSlcIj5cclxuICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiNFwiIGNsYXNzPVwidGV4dC1kYW5nZXJcIj5cclxuICAgICAgICAgICAgICAgICAgU2hvdWxkIG5vdCBleGNlZWQgbWF4aW11bSBidW5kbGUgc2l6ZVxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgIDx0ciAqbmdJZj1cImhhc1Byb2RSZWZFcnJvckluZGV4KGkpXCI+XHJcbiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjRcIiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgIFRoaXMgUmVmZXJlbmNlIHZhbHVlIGlzIGFscmVhZHkgdXNlZC4gUGxlYXNlIHVzZSBvdGhlciB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgPC90YWJsZT5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICBjbGFzcz1cInNpbXBsZSBwbC0yXCJcclxuICAgICAgICAgICpuZ0lmPVwiIWlzRmluaXNoZWRQcm9kdWN0ICYmICFkaXNhYmxlQWRkTW9yZVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiYWRkUHJvZHVjdFF1YW50aXR5Rm9ybUdyb3VwKCRldmVudClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXItMSBhZGQtbW9yZVwiPiA8L3NwYW4+XHJcbiAgICAgICAgICBBZGQgbW9yZVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLWNvbnRhaW5lcj5cclxuXHJcbjxkaXZcclxuICBjbGFzcz1cInJvdyBtdC00IGNvbC1zbS0xMiBhbGVydCBhbGVydC1kYW5nZXIganVzdGlmeS1jb250ZW50LXN0YXJ0XCJcclxuICByb2xlPVwiYWxlcnRcIlxyXG4gICpuZ0lmPVwiYWRkVG9DYXJ0RXJyb3IgfCBhc3luY1wiXHJcbj5cclxuICA8aW1nXHJcbiAgICBjbGFzcz1cIm1yLTNcIlxyXG4gICAgc3JjPVwiLi4vLi4vLi4vLi4vLi4vYXNzZXRzL2ltYWdlcy9lcnJvcmljb24uc3ZnXCJcclxuICAgIGFsdD1cImFsZXJ0XCJcclxuICAvPlxyXG4gIHt7IGFkZFRvQ2FydEVycm9yIH19XHJcbjwvZGl2PlxyXG5cclxuPGRpdlxyXG4gIGNsYXNzPVwibW9kYWwgZmFkZSBlZGl0LWJ1bmRsZS1mb3JtXCJcclxuICBpZD1cImJ1bmRsZU1vZGFsXCJcclxuICByb2xlPVwiZGlhbG9nXCJcclxuICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4+XHJcbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1sZ1wiIHJvbGU9XCJkb2N1bWVudFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+QnVuZGxlIFZhbHVlPC9oND5cclxuICAgICAgICA8aVxyXG4gICAgICAgICAgY2xhc3M9XCJpY29uLWNsb3NlIGludml0ZS1wb3AtY2xvc2VcIlxyXG4gICAgICAgICAgZGF0YS1kaXNtaXNzPVwibW9kYWxcIlxyXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkNsb3NlXCJcclxuICAgICAgICA+PC9pPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHkgbS0wIHBsLTIgcHItMlwiPlxyXG4gICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIG5vLWJvcmRlclwiICpuZ0lmPVwiIWlzRmluaXNoZWRQcm9kdWN0XCI+XHJcbiAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgIDx0aD5cclxuICAgICAgICAgICAgICBCdW5kbGVcclxuICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpbmZvLWljb25cIlxyXG4gICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIkJ1bmRsZSBJbmZvcm1hdGlvbiBnb2VzIGhlcmUuLi4uXCJcclxuICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgPHRoPlxyXG4gICAgICAgICAgICAgIFJlZmVyZW5jZVxyXG4gICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImluZm8taWNvblwiXHJcbiAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwiUmVmZXJlbmNlIEluZm9ybWF0aW9uIGdvZXMgaGVyZS4uLi5cIlxyXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgIDx0Ym9keSBbZm9ybUdyb3VwXT1cIm1vZGFsQnVuZGxlRm9ybVwiPlxyXG4gICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPGRhdGFsaXN0IGlkPVwibW9kQnVuZGxlTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBidW5kbGUgb2YgYnVuZGxlTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGJ1bmRsZSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDwvZGF0YWxpc3Q+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibW9kQnVuZGxlXCJcclxuICAgICAgICAgICAgICAgICAgI21vZEJ1bmRsZVxyXG4gICAgICAgICAgICAgICAgICAoZm9jdXMpPVwidXBkYXRlQnVuZGxlTGlzdCgpXCJcclxuICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm1vZEJ1bmRsZS52YWx1ZSA9IG1vZEJ1bmRsZS52YWx1ZS50b1VwcGVyQ2FzZSgpXCJcclxuICAgICAgICAgICAgICAgICAgbGlzdD1cIm1vZEJ1bmRsZUxpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAoYmx1cik9XCJwb3B1bGF0ZVNhbWVCdW5kbGVSZWZlcmVuY2UobnVsbCwgc2VsZWN0ZWRJbmRleClcIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjE1XCJcclxuICAgICAgICAgICAgICAgICAgKGZvY3VzKT1cInBvcHVsYXRlU2FtZUJ1bmRsZVJlZmVyZW5jZSgkZXZlbnQsIHNlbGVjdGVkSW5kZXgpXCJcclxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibW9kUmVmXCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgPC90YWJsZT5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXHJcbiAgICAgICAgICBkYXRhLWRpc21pc3M9XCJtb2RhbFwiXHJcbiAgICAgICAgICAjY2xvc2VidXR0b25cclxuICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1saWdodFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgQ2FuY2VsXHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgKGNsaWNrKT1cInNhdmVCdW5kbGVEZXRhaWxzKCRldmVudClcIiBjbGFzcz1cImJ0blwiPlxyXG4gICAgICAgICAgU2F2ZVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19