@norwegian/core-components 5.18.0 → 5.18.2

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 (515) hide show
  1. package/esm2020/lib/components/accordion/accordion.component.mjs +148 -0
  2. package/esm2020/lib/components/accordion/accordion.module.mjs +20 -0
  3. package/esm2020/lib/components/airport-select/airport-select-dropdown/airport-select-dropdown.component.mjs +610 -0
  4. package/esm2020/lib/components/airport-select/airport-select.component.mjs +438 -0
  5. package/esm2020/lib/components/airport-select/airport-select.module.mjs +42 -0
  6. package/esm2020/lib/components/airport-select/services/airport-select-dropdown.service.mjs +35 -0
  7. package/esm2020/lib/components/airport-select/services/airport-select.service.mjs +38 -0
  8. package/esm2020/lib/components/autocomplete/autocomplete.component.mjs +287 -0
  9. package/esm2020/lib/components/autocomplete/autocomplete.module.mjs +43 -0
  10. package/esm2020/lib/components/backdrop/backdrop.component.mjs +56 -0
  11. package/esm2020/lib/components/backdrop/backdrop.module.mjs +24 -0
  12. package/esm2020/lib/components/box/box.component.mjs +68 -0
  13. package/esm2020/lib/components/box/box.module.mjs +19 -0
  14. package/esm2020/lib/components/button/button.component.mjs +167 -0
  15. package/esm2020/lib/components/button/button.module.mjs +20 -0
  16. package/esm2020/lib/components/checkbox/checkbox.component.mjs +148 -0
  17. package/esm2020/lib/components/checkbox/checkbox.module.mjs +20 -0
  18. package/esm2020/lib/components/chip/chip.component.mjs +53 -0
  19. package/esm2020/lib/components/chip/chip.module.mjs +24 -0
  20. package/esm2020/lib/components/container/container.component.mjs +50 -0
  21. package/esm2020/lib/components/container/container.module.mjs +19 -0
  22. package/esm2020/lib/components/continue/continue.component.mjs +194 -0
  23. package/esm2020/lib/components/continue/continue.module.mjs +34 -0
  24. package/esm2020/lib/components/cover/cover.component.mjs +75 -0
  25. package/esm2020/lib/components/cover/cover.module.mjs +21 -0
  26. package/esm2020/lib/components/datepicker/calendar/calendar.component.mjs +583 -0
  27. package/esm2020/lib/components/datepicker/datepicker.component.mjs +550 -0
  28. package/esm2020/lib/components/datepicker/datepicker.module.mjs +55 -0
  29. package/esm2020/lib/components/datepicker/services/calendar.service.mjs +213 -0
  30. package/esm2020/lib/components/datepicker-combo/datepicker-combo.component.mjs +355 -0
  31. package/esm2020/lib/components/datepicker-combo/datepicker-combo.module.mjs +31 -0
  32. package/esm2020/lib/components/divider/divider.component.mjs +61 -0
  33. package/esm2020/lib/components/divider/divider.module.mjs +20 -0
  34. package/esm2020/lib/components/dropdown/dropdown.component.mjs +169 -0
  35. package/esm2020/lib/components/dropdown/dropdown.module.mjs +32 -0
  36. package/esm2020/lib/components/filter/filter.component.mjs +1253 -0
  37. package/esm2020/lib/components/filter/filter.module.mjs +73 -0
  38. package/esm2020/lib/components/grid/col/col.component.mjs +49 -0
  39. package/esm2020/lib/components/grid/grid.component.mjs +72 -0
  40. package/esm2020/lib/components/grid/grid.module.mjs +20 -0
  41. package/esm2020/lib/components/icon/icon.component.mjs +44 -0
  42. package/esm2020/lib/components/icon/icon.module.mjs +24 -0
  43. package/esm2020/lib/components/icon-list/icon-list.component.mjs +50 -0
  44. package/esm2020/lib/components/icon-list/icon-list.module.mjs +20 -0
  45. package/esm2020/lib/components/info/info.component.mjs +106 -0
  46. package/esm2020/lib/components/info/info.module.mjs +36 -0
  47. package/esm2020/lib/components/input/input.component.mjs +179 -0
  48. package/esm2020/lib/components/input/input.module.mjs +21 -0
  49. package/esm2020/lib/components/journey/journey.component.mjs +126 -0
  50. package/esm2020/lib/components/journey/journey.module.mjs +28 -0
  51. package/esm2020/lib/components/journey-availability/journey-availability.component.mjs +126 -0
  52. package/esm2020/lib/components/journey-availability/journey-availability.module.mjs +39 -0
  53. package/esm2020/lib/components/journey-availability-list/journey-availability-list.component.mjs +185 -0
  54. package/{esm2015/lib/components/journey-availability-list/journey-availability-list.module.js → esm2020/lib/components/journey-availability-list/journey-availability-list.module.mjs} +27 -14
  55. package/esm2020/lib/components/journey-selection/journey-selection.component.mjs +112 -0
  56. package/esm2020/lib/components/journey-selection/journey-selection.module.mjs +35 -0
  57. package/esm2020/lib/components/journey-stopover/journey-stopover.component.mjs +125 -0
  58. package/esm2020/lib/components/journey-stopover/journey-stopover.module.mjs +28 -0
  59. package/esm2020/lib/components/list/list-item/list-item.component.mjs +52 -0
  60. package/esm2020/lib/components/list/list.component.mjs +78 -0
  61. package/esm2020/lib/components/list/list.module.mjs +20 -0
  62. package/esm2020/lib/components/modal/modal.component.mjs +141 -0
  63. package/esm2020/lib/components/modal/modal.module.mjs +38 -0
  64. package/esm2020/lib/components/number-field/number-field.component.mjs +135 -0
  65. package/esm2020/lib/components/number-field/number-field.module.mjs +39 -0
  66. package/esm2020/lib/components/page-footer/page-footer.component.mjs +54 -0
  67. package/esm2020/lib/components/page-footer/page-footer.module.mjs +21 -0
  68. package/esm2020/lib/components/page-header/hamburger/hamburger.component.mjs +22 -0
  69. package/esm2020/lib/components/page-header/page-header.component.mjs +142 -0
  70. package/esm2020/lib/components/page-header/page-header.module.mjs +23 -0
  71. package/esm2020/lib/components/page-header/search/search.component.mjs +49 -0
  72. package/{esm2015/lib/components/passenger-select/models/passengers.model.js → esm2020/lib/components/passenger-select/models/passengers.model.mjs} +1 -1
  73. package/esm2020/lib/components/passenger-select/passenger-select.component.mjs +225 -0
  74. package/esm2020/lib/components/passenger-select/passenger-select.module.mjs +28 -0
  75. package/esm2020/lib/components/phone-number/phone-number.component.mjs +148 -0
  76. package/esm2020/lib/components/phone-number/phone-number.module.mjs +44 -0
  77. package/esm2020/lib/components/premium-toggle/premium-toggle.component.mjs +69 -0
  78. package/esm2020/lib/components/premium-toggle/premium-toggle.module.mjs +28 -0
  79. package/esm2020/lib/components/radio/radio.component.mjs +98 -0
  80. package/esm2020/lib/components/radio/radio.module.mjs +20 -0
  81. package/esm2020/lib/components/select/optgroup/optgroup.component.mjs +29 -0
  82. package/esm2020/lib/components/select/option/option.component.mjs +26 -0
  83. package/esm2020/lib/components/select/select.component.mjs +354 -0
  84. package/esm2020/lib/components/select/select.module.mjs +30 -0
  85. package/esm2020/lib/components/simple-list/simple-list.component.mjs +48 -0
  86. package/esm2020/lib/components/simple-list/simple-list.module.mjs +19 -0
  87. package/esm2020/lib/components/slide-toggle/slide-toggle.component.mjs +111 -0
  88. package/esm2020/lib/components/slide-toggle/slide-toggle.module.mjs +31 -0
  89. package/esm2020/lib/components/slider/slider.component.mjs +501 -0
  90. package/esm2020/lib/components/slider/slider.module.mjs +28 -0
  91. package/esm2020/lib/components/sort/sort.component.mjs +93 -0
  92. package/esm2020/lib/components/sort/sort.module.mjs +36 -0
  93. package/esm2020/lib/components/spinner/spinner.component.mjs +112 -0
  94. package/esm2020/lib/components/spinner/spinner.module.mjs +19 -0
  95. package/esm2020/lib/components/subsidy-discount/subsidy-discount.component.mjs +110 -0
  96. package/esm2020/lib/components/subsidy-discount/subsidy-discount.module.mjs +36 -0
  97. package/esm2020/lib/components/suggestions/suggestions.component.mjs +43 -0
  98. package/esm2020/lib/components/suggestions/suggestions.module.mjs +28 -0
  99. package/esm2020/lib/components/tab-group/tab/tab.component.mjs +131 -0
  100. package/esm2020/lib/components/tab-group/tab-group.component.mjs +87 -0
  101. package/esm2020/lib/components/tab-group/tab-group.module.mjs +29 -0
  102. package/esm2020/lib/components/table/column/column.component.mjs +16 -0
  103. package/esm2020/lib/components/table/column-group/column-group.component.mjs +30 -0
  104. package/esm2020/lib/components/table/services/table.service.mjs +21 -0
  105. package/esm2020/lib/components/table/table-body/table-body.component.mjs +23 -0
  106. package/esm2020/lib/components/table/table-foot/table-foot.component.mjs +23 -0
  107. package/esm2020/lib/components/table/table-head/table-head.component.mjs +23 -0
  108. package/esm2020/lib/components/table/table-row/table-data/table-data.component.mjs +15 -0
  109. package/esm2020/lib/components/table/table-row/table-header/table-header.component.mjs +15 -0
  110. package/esm2020/lib/components/table/table-row/table-row.component.mjs +23 -0
  111. package/esm2020/lib/components/table/table.component.mjs +29 -0
  112. package/esm2020/lib/components/table/table.module.mjs +68 -0
  113. package/esm2020/lib/components/textarea/textarea.component.mjs +93 -0
  114. package/esm2020/lib/components/textarea/textarea.module.mjs +31 -0
  115. package/esm2020/lib/components/toggle/toggle.component.mjs +103 -0
  116. package/esm2020/lib/components/toggle/toggle.module.mjs +35 -0
  117. package/esm2020/lib/components/trip-summary/trip-summary.component.mjs +170 -0
  118. package/esm2020/lib/components/trip-summary/trip-summary.module.mjs +36 -0
  119. package/esm2020/lib/components/weather-icon/weather-icon.component.mjs +60 -0
  120. package/esm2020/lib/components/weather-icon/weather-icon.module.mjs +19 -0
  121. package/esm2020/lib/core/base/nas-component.base.mjs +47 -0
  122. package/esm2020/lib/core/directives/nas-class/nas-class.directive.mjs +80 -0
  123. package/esm2020/lib/core/directives/nas-class/nas-class.module.mjs +22 -0
  124. package/{esm2015/lib/core/extensions/html-element.extension.js → esm2020/lib/core/extensions/html-element.extension.mjs} +1 -1
  125. package/esm2020/lib/core/services/abandoned-basket/abandoned-basket.service.mjs +58 -0
  126. package/esm2020/lib/core/services/animate-helper/animate-helper.service.mjs +49 -0
  127. package/esm2020/lib/core/services/bem-helper/bem-helper.service.mjs +44 -0
  128. package/esm2020/lib/core/services/date/date-helper.service.mjs +199 -0
  129. package/esm2020/lib/core/services/device/device-helper.service.mjs +46 -0
  130. package/esm2020/lib/core/services/geolocation/geolocation.service.mjs +63 -0
  131. package/esm2020/lib/core/services/language/language-helper.service.mjs +129 -0
  132. package/esm2020/lib/core/services/sort/sort.service.mjs +22 -0
  133. package/esm2020/lib/core/services/viewport/viewport.service.mjs +32 -0
  134. package/esm2020/lib/services/get-position.service.mjs +23 -0
  135. package/esm2020/norwegian-core-components.mjs +5 -0
  136. package/fesm2015/norwegian-core-components.mjs +11843 -0
  137. package/fesm2015/norwegian-core-components.mjs.map +1 -0
  138. package/fesm2020/norwegian-core-components.mjs +11829 -0
  139. package/fesm2020/norwegian-core-components.mjs.map +1 -0
  140. package/index.d.ts +5 -0
  141. package/lib/components/accordion/accordion.component.d.ts +3 -0
  142. package/lib/components/accordion/accordion.module.d.ts +8 -0
  143. package/lib/components/airport-select/airport-select-dropdown/airport-select-dropdown.component.d.ts +5 -2
  144. package/lib/components/airport-select/airport-select.component.d.ts +5 -2
  145. package/lib/components/airport-select/airport-select.module.d.ts +11 -0
  146. package/lib/components/airport-select/services/airport-select-dropdown.service.d.ts +3 -0
  147. package/lib/components/airport-select/services/airport-select.service.d.ts +3 -0
  148. package/lib/components/autocomplete/autocomplete.component.d.ts +5 -2
  149. package/lib/components/autocomplete/autocomplete.module.d.ts +11 -0
  150. package/lib/components/backdrop/backdrop.component.d.ts +3 -0
  151. package/lib/components/backdrop/backdrop.module.d.ts +7 -0
  152. package/lib/components/box/box.component.d.ts +3 -4
  153. package/lib/components/box/box.module.d.ts +7 -0
  154. package/lib/components/button/button.component.d.ts +3 -0
  155. package/lib/components/button/button.module.d.ts +8 -0
  156. package/lib/components/checkbox/checkbox.component.d.ts +5 -2
  157. package/lib/components/checkbox/checkbox.module.d.ts +8 -0
  158. package/lib/components/chip/chip.component.d.ts +3 -0
  159. package/lib/components/chip/chip.module.d.ts +7 -0
  160. package/lib/components/container/container.component.d.ts +3 -4
  161. package/lib/components/container/container.module.d.ts +7 -0
  162. package/lib/components/continue/continue.component.d.ts +3 -0
  163. package/lib/components/continue/continue.module.d.ts +9 -0
  164. package/lib/components/cover/cover.component.d.ts +3 -0
  165. package/lib/components/cover/cover.module.d.ts +9 -0
  166. package/lib/components/datepicker/calendar/calendar.component.d.ts +5 -2
  167. package/lib/components/datepicker/datepicker.component.d.ts +5 -2
  168. package/lib/components/datepicker/datepicker.module.d.ts +14 -0
  169. package/lib/components/datepicker/services/calendar.service.d.ts +3 -0
  170. package/lib/components/datepicker-combo/datepicker-combo.component.d.ts +3 -0
  171. package/lib/components/datepicker-combo/datepicker-combo.module.d.ts +8 -0
  172. package/lib/components/divider/divider.component.d.ts +3 -4
  173. package/lib/components/divider/divider.module.d.ts +8 -0
  174. package/lib/components/dropdown/dropdown.component.d.ts +3 -0
  175. package/lib/components/dropdown/dropdown.module.d.ts +9 -0
  176. package/lib/components/filter/filter.component.d.ts +5 -2
  177. package/lib/components/filter/filter.module.d.ts +18 -0
  178. package/lib/components/grid/col/col.component.d.ts +4 -1
  179. package/lib/components/grid/grid.component.d.ts +3 -4
  180. package/lib/components/grid/grid.module.d.ts +8 -0
  181. package/lib/components/icon/icon.component.d.ts +3 -4
  182. package/lib/components/icon/icon.module.d.ts +7 -0
  183. package/lib/components/icon-list/icon-list.component.d.ts +3 -0
  184. package/lib/components/icon-list/icon-list.module.d.ts +8 -0
  185. package/lib/components/info/info.component.d.ts +3 -0
  186. package/lib/components/info/info.module.d.ts +10 -0
  187. package/lib/components/input/input.component.d.ts +5 -2
  188. package/lib/components/input/input.module.d.ts +9 -0
  189. package/lib/components/journey/journey.component.d.ts +3 -0
  190. package/lib/components/journey/journey.module.d.ts +8 -0
  191. package/lib/components/journey-availability/journey-availability.component.d.ts +3 -0
  192. package/lib/components/journey-availability/journey-availability.module.d.ts +10 -0
  193. package/lib/components/journey-availability-list/journey-availability-list.component.d.ts +3 -0
  194. package/lib/components/journey-availability-list/journey-availability-list.module.d.ts +10 -0
  195. package/lib/components/journey-selection/journey-selection.component.d.ts +3 -0
  196. package/lib/components/journey-selection/journey-selection.module.d.ts +9 -0
  197. package/lib/components/journey-stopover/journey-stopover.component.d.ts +3 -0
  198. package/lib/components/journey-stopover/journey-stopover.module.d.ts +8 -0
  199. package/lib/components/list/list-item/list-item.component.d.ts +3 -0
  200. package/lib/components/list/list.component.d.ts +4 -1
  201. package/lib/components/list/list.module.d.ts +8 -0
  202. package/lib/components/modal/modal.component.d.ts +3 -0
  203. package/lib/components/modal/modal.module.d.ts +10 -0
  204. package/lib/components/number-field/number-field.component.d.ts +5 -2
  205. package/lib/components/number-field/number-field.module.d.ts +10 -0
  206. package/lib/components/page-footer/page-footer.component.d.ts +3 -0
  207. package/lib/components/page-footer/page-footer.module.d.ts +9 -0
  208. package/lib/components/page-header/hamburger/hamburger.component.d.ts +3 -0
  209. package/lib/components/page-header/page-header.component.d.ts +3 -0
  210. package/lib/components/page-header/page-header.module.d.ts +11 -0
  211. package/lib/components/page-header/search/search.component.d.ts +3 -0
  212. package/lib/components/passenger-select/models/passengers.model.d.ts +2 -2
  213. package/lib/components/passenger-select/passenger-select.component.d.ts +5 -2
  214. package/lib/components/passenger-select/passenger-select.module.d.ts +8 -0
  215. package/lib/components/phone-number/phone-number.component.d.ts +5 -2
  216. package/lib/components/phone-number/phone-number.module.d.ts +11 -0
  217. package/lib/components/premium-toggle/premium-toggle.component.d.ts +3 -0
  218. package/lib/components/premium-toggle/premium-toggle.module.d.ts +8 -0
  219. package/lib/components/radio/radio.component.d.ts +5 -2
  220. package/lib/components/radio/radio.module.d.ts +8 -0
  221. package/lib/components/select/optgroup/optgroup.component.d.ts +3 -0
  222. package/lib/components/select/option/option.component.d.ts +3 -0
  223. package/lib/components/select/select.component.d.ts +6 -3
  224. package/lib/components/select/select.module.d.ts +10 -0
  225. package/lib/components/simple-list/simple-list.component.d.ts +4 -1
  226. package/lib/components/simple-list/simple-list.module.d.ts +7 -0
  227. package/lib/components/slide-toggle/slide-toggle.component.d.ts +5 -2
  228. package/lib/components/slide-toggle/slide-toggle.module.d.ts +8 -0
  229. package/lib/components/slider/slider.component.d.ts +5 -2
  230. package/lib/components/slider/slider.module.d.ts +8 -0
  231. package/lib/components/sort/sort.component.d.ts +3 -0
  232. package/lib/components/sort/sort.module.d.ts +10 -0
  233. package/lib/components/spinner/spinner.component.d.ts +11 -4
  234. package/lib/components/spinner/spinner.module.d.ts +7 -0
  235. package/lib/components/subsidy-discount/subsidy-discount.component.d.ts +3 -0
  236. package/lib/components/subsidy-discount/subsidy-discount.module.d.ts +10 -0
  237. package/lib/components/suggestions/suggestions.component.d.ts +3 -0
  238. package/lib/components/suggestions/suggestions.module.d.ts +8 -0
  239. package/lib/components/tab-group/tab/tab.component.d.ts +3 -0
  240. package/lib/components/tab-group/tab-group.component.d.ts +3 -0
  241. package/lib/components/tab-group/tab-group.module.d.ts +9 -0
  242. package/lib/components/table/column/column.component.d.ts +3 -0
  243. package/lib/components/table/column-group/column-group.component.d.ts +3 -0
  244. package/lib/components/table/services/table.service.d.ts +3 -0
  245. package/lib/components/table/table-body/table-body.component.d.ts +3 -0
  246. package/lib/components/table/table-foot/table-foot.component.d.ts +3 -0
  247. package/lib/components/table/table-head/table-head.component.d.ts +3 -0
  248. package/lib/components/table/table-row/table-data/table-data.component.d.ts +3 -0
  249. package/lib/components/table/table-row/table-header/table-header.component.d.ts +3 -0
  250. package/lib/components/table/table-row/table-row.component.d.ts +3 -0
  251. package/lib/components/table/table.component.d.ts +3 -0
  252. package/lib/components/table/table.module.d.ts +15 -0
  253. package/lib/components/textarea/textarea.component.d.ts +5 -2
  254. package/lib/components/textarea/textarea.module.d.ts +8 -0
  255. package/lib/components/toggle/toggle.component.d.ts +6 -3
  256. package/lib/components/toggle/toggle.module.d.ts +9 -0
  257. package/lib/components/trip-summary/trip-summary.component.d.ts +3 -0
  258. package/lib/components/trip-summary/trip-summary.module.d.ts +10 -0
  259. package/lib/components/weather-icon/weather-icon.component.d.ts +3 -0
  260. package/lib/components/weather-icon/weather-icon.module.d.ts +7 -0
  261. package/lib/core/directives/nas-class/nas-class.directive.d.ts +3 -0
  262. package/lib/core/directives/nas-class/nas-class.module.d.ts +6 -0
  263. package/lib/core/services/abandoned-basket/abandoned-basket.service.d.ts +3 -0
  264. package/lib/core/services/animate-helper/animate-helper.service.d.ts +3 -0
  265. package/lib/core/services/bem-helper/bem-helper.service.d.ts +3 -0
  266. package/lib/core/services/date/date-helper.service.d.ts +3 -0
  267. package/lib/core/services/device/device-helper.service.d.ts +3 -0
  268. package/lib/core/services/geolocation/geolocation.service.d.ts +3 -0
  269. package/lib/core/services/language/language-helper.service.d.ts +3 -0
  270. package/lib/core/services/sort/sort.service.d.ts +3 -0
  271. package/lib/core/services/viewport/viewport.service.d.ts +3 -0
  272. package/lib/services/get-position.service.d.ts +3 -0
  273. package/package.json +21 -9
  274. package/bundles/norwegian-core-components.umd.js +0 -12174
  275. package/bundles/norwegian-core-components.umd.js.map +0 -1
  276. package/esm2015/lib/components/accordion/accordion.component.js +0 -130
  277. package/esm2015/lib/components/accordion/accordion.module.js +0 -15
  278. package/esm2015/lib/components/airport-select/airport-select-dropdown/airport-select-dropdown.component.js +0 -583
  279. package/esm2015/lib/components/airport-select/airport-select.component.js +0 -400
  280. package/esm2015/lib/components/airport-select/airport-select.module.js +0 -27
  281. package/esm2015/lib/components/airport-select/services/airport-select-dropdown.service.js +0 -34
  282. package/esm2015/lib/components/airport-select/services/airport-select.service.js +0 -37
  283. package/esm2015/lib/components/autocomplete/autocomplete.component.js +0 -265
  284. package/esm2015/lib/components/autocomplete/autocomplete.module.js +0 -26
  285. package/esm2015/lib/components/backdrop/backdrop.component.js +0 -54
  286. package/esm2015/lib/components/backdrop/backdrop.module.js +0 -17
  287. package/esm2015/lib/components/box/box.component.js +0 -61
  288. package/esm2015/lib/components/box/box.module.js +0 -14
  289. package/esm2015/lib/components/button/button.component.js +0 -140
  290. package/esm2015/lib/components/button/button.module.js +0 -15
  291. package/esm2015/lib/components/checkbox/checkbox.component.js +0 -127
  292. package/esm2015/lib/components/checkbox/checkbox.module.js +0 -15
  293. package/esm2015/lib/components/chip/chip.component.js +0 -50
  294. package/esm2015/lib/components/chip/chip.module.js +0 -17
  295. package/esm2015/lib/components/container/container.component.js +0 -47
  296. package/esm2015/lib/components/container/container.module.js +0 -14
  297. package/esm2015/lib/components/continue/continue.component.js +0 -173
  298. package/esm2015/lib/components/continue/continue.module.js +0 -23
  299. package/esm2015/lib/components/cover/cover.component.js +0 -61
  300. package/esm2015/lib/components/cover/cover.module.js +0 -16
  301. package/esm2015/lib/components/datepicker/calendar/calendar.component.js +0 -560
  302. package/esm2015/lib/components/datepicker/datepicker.component.js +0 -515
  303. package/esm2015/lib/components/datepicker/datepicker.module.js +0 -34
  304. package/esm2015/lib/components/datepicker/services/calendar.service.js +0 -217
  305. package/esm2015/lib/components/datepicker-combo/datepicker-combo.component.js +0 -317
  306. package/esm2015/lib/components/datepicker-combo/datepicker-combo.module.js +0 -22
  307. package/esm2015/lib/components/divider/divider.component.js +0 -53
  308. package/esm2015/lib/components/divider/divider.module.js +0 -15
  309. package/esm2015/lib/components/dropdown/dropdown.component.js +0 -150
  310. package/esm2015/lib/components/dropdown/dropdown.module.js +0 -21
  311. package/esm2015/lib/components/filter/filter.component.js +0 -1122
  312. package/esm2015/lib/components/filter/filter.module.js +0 -44
  313. package/esm2015/lib/components/grid/col/col.component.js +0 -49
  314. package/esm2015/lib/components/grid/grid.component.js +0 -63
  315. package/esm2015/lib/components/grid/grid.module.js +0 -15
  316. package/esm2015/lib/components/icon/icon.component.js +0 -42
  317. package/esm2015/lib/components/icon/icon.module.js +0 -17
  318. package/esm2015/lib/components/icon-list/icon-list.component.js +0 -46
  319. package/esm2015/lib/components/icon-list/icon-list.module.js +0 -15
  320. package/esm2015/lib/components/info/info.component.js +0 -94
  321. package/esm2015/lib/components/info/info.module.js +0 -23
  322. package/esm2015/lib/components/input/input.component.js +0 -148
  323. package/esm2015/lib/components/input/input.module.js +0 -16
  324. package/esm2015/lib/components/journey/journey.component.js +0 -122
  325. package/esm2015/lib/components/journey/journey.module.js +0 -19
  326. package/esm2015/lib/components/journey-availability/journey-availability.component.js +0 -125
  327. package/esm2015/lib/components/journey-availability/journey-availability.module.js +0 -26
  328. package/esm2015/lib/components/journey-availability-list/journey-availability-list.component.js +0 -175
  329. package/esm2015/lib/components/journey-selection/journey-selection.component.js +0 -110
  330. package/esm2015/lib/components/journey-selection/journey-selection.module.js +0 -24
  331. package/esm2015/lib/components/journey-stopover/journey-stopover.component.js +0 -121
  332. package/esm2015/lib/components/journey-stopover/journey-stopover.module.js +0 -19
  333. package/esm2015/lib/components/list/list-item/list-item.component.js +0 -56
  334. package/esm2015/lib/components/list/list.component.js +0 -75
  335. package/esm2015/lib/components/list/list.module.js +0 -15
  336. package/esm2015/lib/components/modal/modal.component.js +0 -131
  337. package/esm2015/lib/components/modal/modal.module.js +0 -25
  338. package/esm2015/lib/components/number-field/number-field.component.js +0 -118
  339. package/esm2015/lib/components/number-field/number-field.module.js +0 -24
  340. package/esm2015/lib/components/page-footer/page-footer.component.js +0 -49
  341. package/esm2015/lib/components/page-footer/page-footer.module.js +0 -16
  342. package/esm2015/lib/components/page-header/hamburger/hamburger.component.js +0 -24
  343. package/esm2015/lib/components/page-header/page-header.component.js +0 -126
  344. package/esm2015/lib/components/page-header/page-header.module.js +0 -18
  345. package/esm2015/lib/components/page-header/search/search.component.js +0 -47
  346. package/esm2015/lib/components/passenger-select/passenger-select.component.js +0 -207
  347. package/esm2015/lib/components/passenger-select/passenger-select.module.js +0 -19
  348. package/esm2015/lib/components/phone-number/phone-number.component.js +0 -115
  349. package/esm2015/lib/components/phone-number/phone-number.module.js +0 -27
  350. package/esm2015/lib/components/premium-toggle/premium-toggle.component.js +0 -66
  351. package/esm2015/lib/components/premium-toggle/premium-toggle.module.js +0 -19
  352. package/esm2015/lib/components/radio/radio.component.js +0 -79
  353. package/esm2015/lib/components/radio/radio.module.js +0 -15
  354. package/esm2015/lib/components/select/optgroup/optgroup.component.js +0 -31
  355. package/esm2015/lib/components/select/option/option.component.js +0 -29
  356. package/esm2015/lib/components/select/select.component.js +0 -325
  357. package/esm2015/lib/components/select/select.module.js +0 -21
  358. package/esm2015/lib/components/simple-list/simple-list.component.js +0 -42
  359. package/esm2015/lib/components/simple-list/simple-list.module.js +0 -14
  360. package/esm2015/lib/components/slide-toggle/slide-toggle.component.js +0 -105
  361. package/esm2015/lib/components/slide-toggle/slide-toggle.module.js +0 -20
  362. package/esm2015/lib/components/slider/slider.component.js +0 -475
  363. package/esm2015/lib/components/slider/slider.module.js +0 -19
  364. package/esm2015/lib/components/sort/sort.component.js +0 -87
  365. package/esm2015/lib/components/sort/sort.module.js +0 -23
  366. package/esm2015/lib/components/spinner/spinner.component.js +0 -84
  367. package/esm2015/lib/components/spinner/spinner.module.js +0 -14
  368. package/esm2015/lib/components/subsidy-discount/subsidy-discount.component.js +0 -101
  369. package/esm2015/lib/components/subsidy-discount/subsidy-discount.module.js +0 -23
  370. package/esm2015/lib/components/suggestions/suggestions.component.js +0 -40
  371. package/esm2015/lib/components/suggestions/suggestions.module.js +0 -19
  372. package/esm2015/lib/components/tab-group/tab/tab.component.js +0 -123
  373. package/esm2015/lib/components/tab-group/tab-group.component.js +0 -85
  374. package/esm2015/lib/components/tab-group/tab-group.module.js +0 -20
  375. package/esm2015/lib/components/table/column/column.component.js +0 -17
  376. package/esm2015/lib/components/table/column-group/column-group.component.js +0 -34
  377. package/esm2015/lib/components/table/services/table.service.js +0 -20
  378. package/esm2015/lib/components/table/table-body/table-body.component.js +0 -27
  379. package/esm2015/lib/components/table/table-foot/table-foot.component.js +0 -27
  380. package/esm2015/lib/components/table/table-head/table-head.component.js +0 -27
  381. package/esm2015/lib/components/table/table-row/table-data/table-data.component.js +0 -15
  382. package/esm2015/lib/components/table/table-row/table-header/table-header.component.js +0 -15
  383. package/esm2015/lib/components/table/table-row/table-row.component.js +0 -27
  384. package/esm2015/lib/components/table/table.component.js +0 -29
  385. package/esm2015/lib/components/table/table.module.js +0 -45
  386. package/esm2015/lib/components/textarea/textarea.component.js +0 -73
  387. package/esm2015/lib/components/textarea/textarea.module.js +0 -20
  388. package/esm2015/lib/components/toggle/toggle.component.js +0 -86
  389. package/esm2015/lib/components/toggle/toggle.module.js +0 -22
  390. package/esm2015/lib/components/trip-summary/trip-summary.component.js +0 -152
  391. package/esm2015/lib/components/trip-summary/trip-summary.module.js +0 -23
  392. package/esm2015/lib/components/weather-icon/weather-icon.component.js +0 -56
  393. package/esm2015/lib/components/weather-icon/weather-icon.module.js +0 -14
  394. package/esm2015/lib/core/base/nas-component.base.js +0 -48
  395. package/esm2015/lib/core/directives/nas-class/nas-class.directive.js +0 -75
  396. package/esm2015/lib/core/directives/nas-class/nas-class.module.js +0 -17
  397. package/esm2015/lib/core/services/abandoned-basket/abandoned-basket.service.js +0 -55
  398. package/esm2015/lib/core/services/animate-helper/animate-helper.service.js +0 -47
  399. package/esm2015/lib/core/services/bem-helper/bem-helper.service.js +0 -41
  400. package/esm2015/lib/core/services/date/date-helper.service.js +0 -196
  401. package/esm2015/lib/core/services/device/device-helper.service.js +0 -43
  402. package/esm2015/lib/core/services/geolocation/geolocation.service.js +0 -60
  403. package/esm2015/lib/core/services/language/language-helper.service.js +0 -162
  404. package/esm2015/lib/core/services/sort/sort.service.js +0 -19
  405. package/esm2015/lib/core/services/viewport/viewport.service.js +0 -29
  406. package/esm2015/lib/services/get-position.service.js +0 -21
  407. package/esm2015/norwegian-core-components.js +0 -12
  408. package/fesm2015/norwegian-core-components.js +0 -10835
  409. package/fesm2015/norwegian-core-components.js.map +0 -1
  410. package/norwegian-core-components.d.ts +0 -11
  411. package/norwegian-core-components.metadata.json +0 -1
  412. /package/{esm2015/lib/components/accordion/index.js → esm2020/lib/components/accordion/index.mjs} +0 -0
  413. /package/{esm2015/lib/components/airport-select/index.js → esm2020/lib/components/airport-select/index.mjs} +0 -0
  414. /package/{esm2015/lib/components/airport-select/models/airport.model.js → esm2020/lib/components/airport-select/models/airport.model.mjs} +0 -0
  415. /package/{esm2015/lib/components/airport-select/models/results-labels.model.js → esm2020/lib/components/airport-select/models/results-labels.model.mjs} +0 -0
  416. /package/{esm2015/lib/components/autocomplete/index.js → esm2020/lib/components/autocomplete/index.mjs} +0 -0
  417. /package/{esm2015/lib/components/autocomplete/models/autocomplete.model.js → esm2020/lib/components/autocomplete/models/autocomplete.model.mjs} +0 -0
  418. /package/{esm2015/lib/components/backdrop/index.js → esm2020/lib/components/backdrop/index.mjs} +0 -0
  419. /package/{esm2015/lib/components/box/index.js → esm2020/lib/components/box/index.mjs} +0 -0
  420. /package/{esm2015/lib/components/button/index.js → esm2020/lib/components/button/index.mjs} +0 -0
  421. /package/{esm2015/lib/components/checkbox/index.js → esm2020/lib/components/checkbox/index.mjs} +0 -0
  422. /package/{esm2015/lib/components/chip/index.js → esm2020/lib/components/chip/index.mjs} +0 -0
  423. /package/{esm2015/lib/components/container/index.js → esm2020/lib/components/container/index.mjs} +0 -0
  424. /package/{esm2015/lib/components/continue/index.js → esm2020/lib/components/continue/index.mjs} +0 -0
  425. /package/{esm2015/lib/components/cover/index.js → esm2020/lib/components/cover/index.mjs} +0 -0
  426. /package/{esm2015/lib/components/datepicker/calendar/calendar-date.model.js → esm2020/lib/components/datepicker/calendar/calendar-date.model.mjs} +0 -0
  427. /package/{esm2015/lib/components/datepicker/calendar/enums/week-start.enum.js → esm2020/lib/components/datepicker/calendar/enums/week-start.enum.mjs} +0 -0
  428. /package/{esm2015/lib/components/datepicker/calendar/models/day.model.js → esm2020/lib/components/datepicker/calendar/models/day.model.mjs} +0 -0
  429. /package/{esm2015/lib/components/datepicker/calendar/models/select-option.model.js → esm2020/lib/components/datepicker/calendar/models/select-option.model.mjs} +0 -0
  430. /package/{esm2015/lib/components/datepicker/calendar/models/week.model.js → esm2020/lib/components/datepicker/calendar/models/week.model.mjs} +0 -0
  431. /package/{esm2015/lib/components/datepicker/index.js → esm2020/lib/components/datepicker/index.mjs} +0 -0
  432. /package/{esm2015/lib/components/datepicker-combo/index.js → esm2020/lib/components/datepicker-combo/index.mjs} +0 -0
  433. /package/{esm2015/lib/components/divider/index.js → esm2020/lib/components/divider/index.mjs} +0 -0
  434. /package/{esm2015/lib/components/dropdown/index.js → esm2020/lib/components/dropdown/index.mjs} +0 -0
  435. /package/{esm2015/lib/components/filter/enums/trip-type.enum.js → esm2020/lib/components/filter/enums/trip-type.enum.mjs} +0 -0
  436. /package/{esm2015/lib/components/filter/index.js → esm2020/lib/components/filter/index.mjs} +0 -0
  437. /package/{esm2015/lib/components/grid/index.js → esm2020/lib/components/grid/index.mjs} +0 -0
  438. /package/{esm2015/lib/components/icon/index.js → esm2020/lib/components/icon/index.mjs} +0 -0
  439. /package/{esm2015/lib/components/icon-list/icon-list.model.js → esm2020/lib/components/icon-list/icon-list.model.mjs} +0 -0
  440. /package/{esm2015/lib/components/icon-list/index.js → esm2020/lib/components/icon-list/index.mjs} +0 -0
  441. /package/{esm2015/lib/components/index.js → esm2020/lib/components/index.mjs} +0 -0
  442. /package/{esm2015/lib/components/info/index.js → esm2020/lib/components/info/index.mjs} +0 -0
  443. /package/{esm2015/lib/components/info/models/info.model.js → esm2020/lib/components/info/models/info.model.mjs} +0 -0
  444. /package/{esm2015/lib/components/input/index.js → esm2020/lib/components/input/index.mjs} +0 -0
  445. /package/{esm2015/lib/components/journey/index.js → esm2020/lib/components/journey/index.mjs} +0 -0
  446. /package/{esm2015/lib/components/journey/models/journey-flight.model.js → esm2020/lib/components/journey/models/journey-flight.model.mjs} +0 -0
  447. /package/{esm2015/lib/components/journey/models/journey.model.js → esm2020/lib/components/journey/models/journey.model.mjs} +0 -0
  448. /package/{esm2015/lib/components/journey-availability/index.js → esm2020/lib/components/journey-availability/index.mjs} +0 -0
  449. /package/{esm2015/lib/components/journey-availability-list/enums/availability-sort-option.enum.js → esm2020/lib/components/journey-availability-list/enums/availability-sort-option.enum.mjs} +0 -0
  450. /package/{esm2015/lib/components/journey-availability-list/index.js → esm2020/lib/components/journey-availability-list/index.mjs} +0 -0
  451. /package/{esm2015/lib/components/journey-selection/index.js → esm2020/lib/components/journey-selection/index.mjs} +0 -0
  452. /package/{esm2015/lib/components/journey-selection/models/journey-selection-collapsed.model.js → esm2020/lib/components/journey-selection/models/journey-selection-collapsed.model.mjs} +0 -0
  453. /package/{esm2015/lib/components/journey-selection/models/journey-selection-common.model.js → esm2020/lib/components/journey-selection/models/journey-selection-common.model.mjs} +0 -0
  454. /package/{esm2015/lib/components/journey-selection/models/journey-selection-expanded.model.js → esm2020/lib/components/journey-selection/models/journey-selection-expanded.model.mjs} +0 -0
  455. /package/{esm2015/lib/components/journey-selection/models/journey-selection.model.js → esm2020/lib/components/journey-selection/models/journey-selection.model.mjs} +0 -0
  456. /package/{esm2015/lib/components/journey-stopover/index.js → esm2020/lib/components/journey-stopover/index.mjs} +0 -0
  457. /package/{esm2015/lib/components/journey-stopover/models/stopover-time.model.js → esm2020/lib/components/journey-stopover/models/stopover-time.model.mjs} +0 -0
  458. /package/{esm2015/lib/components/list/index.js → esm2020/lib/components/list/index.mjs} +0 -0
  459. /package/{esm2015/lib/components/modal/index.js → esm2020/lib/components/modal/index.mjs} +0 -0
  460. /package/{esm2015/lib/components/number-field/index.js → esm2020/lib/components/number-field/index.mjs} +0 -0
  461. /package/{esm2015/lib/components/page-footer/index.js → esm2020/lib/components/page-footer/index.mjs} +0 -0
  462. /package/{esm2015/lib/components/page-header/index.js → esm2020/lib/components/page-header/index.mjs} +0 -0
  463. /package/{esm2015/lib/components/passenger-select/enums/passenger-type.enum.js → esm2020/lib/components/passenger-select/enums/passenger-type.enum.mjs} +0 -0
  464. /package/{esm2015/lib/components/passenger-select/index.js → esm2020/lib/components/passenger-select/index.mjs} +0 -0
  465. /package/{esm2015/lib/components/phone-number/index.js → esm2020/lib/components/phone-number/index.mjs} +0 -0
  466. /package/{esm2015/lib/components/premium-toggle/index.js → esm2020/lib/components/premium-toggle/index.mjs} +0 -0
  467. /package/{esm2015/lib/components/radio/index.js → esm2020/lib/components/radio/index.mjs} +0 -0
  468. /package/{esm2015/lib/components/select/index.js → esm2020/lib/components/select/index.mjs} +0 -0
  469. /package/{esm2015/lib/components/select/models/select-option.model.js → esm2020/lib/components/select/models/select-option.model.mjs} +0 -0
  470. /package/{esm2015/lib/components/simple-list/index.js → esm2020/lib/components/simple-list/index.mjs} +0 -0
  471. /package/{esm2015/lib/components/slide-toggle/index.js → esm2020/lib/components/slide-toggle/index.mjs} +0 -0
  472. /package/{esm2015/lib/components/slider/index.js → esm2020/lib/components/slider/index.mjs} +0 -0
  473. /package/{esm2015/lib/components/sort/index.js → esm2020/lib/components/sort/index.mjs} +0 -0
  474. /package/{esm2015/lib/components/spinner/index.js → esm2020/lib/components/spinner/index.mjs} +0 -0
  475. /package/{esm2015/lib/components/subsidy-discount/index.js → esm2020/lib/components/subsidy-discount/index.mjs} +0 -0
  476. /package/{esm2015/lib/components/subsidy-discount/models/subsidy-discount.model.js → esm2020/lib/components/subsidy-discount/models/subsidy-discount.model.mjs} +0 -0
  477. /package/{esm2015/lib/components/suggestions/index.js → esm2020/lib/components/suggestions/index.mjs} +0 -0
  478. /package/{esm2015/lib/components/tab-group/index.js → esm2020/lib/components/tab-group/index.mjs} +0 -0
  479. /package/{esm2015/lib/components/table/index.js → esm2020/lib/components/table/index.mjs} +0 -0
  480. /package/{esm2015/lib/components/textarea/index.js → esm2020/lib/components/textarea/index.mjs} +0 -0
  481. /package/{esm2015/lib/components/toggle/index.js → esm2020/lib/components/toggle/index.mjs} +0 -0
  482. /package/{esm2015/lib/components/toggle/models/options.model.js → esm2020/lib/components/toggle/models/options.model.mjs} +0 -0
  483. /package/{esm2015/lib/components/trip-summary/index.js → esm2020/lib/components/trip-summary/index.mjs} +0 -0
  484. /package/{esm2015/lib/components/weather-icon/index.js → esm2020/lib/components/weather-icon/index.mjs} +0 -0
  485. /package/{esm2015/lib/core/decorators/debounce.decorator.js → esm2020/lib/core/decorators/debounce.decorator.mjs} +0 -0
  486. /package/{esm2015/lib/core/directives/index.js → esm2020/lib/core/directives/index.mjs} +0 -0
  487. /package/{esm2015/lib/core/index.js → esm2020/lib/core/index.mjs} +0 -0
  488. /package/{esm2015/lib/core/models/abandoned-basket-item.model.js → esm2020/lib/core/models/abandoned-basket-item.model.mjs} +0 -0
  489. /package/{esm2015/lib/core/models/animate.model.js → esm2020/lib/core/models/animate.model.mjs} +0 -0
  490. /package/{esm2015/lib/core/models/class.model.js → esm2020/lib/core/models/class.model.mjs} +0 -0
  491. /package/{esm2015/lib/core/models/index.js → esm2020/lib/core/models/index.mjs} +0 -0
  492. /package/{esm2015/lib/core/models/link.model.js → esm2020/lib/core/models/link.model.mjs} +0 -0
  493. /package/{esm2015/lib/core/models/position.model.js → esm2020/lib/core/models/position.model.mjs} +0 -0
  494. /package/{esm2015/lib/core/models/utc-date.model.js → esm2020/lib/core/models/utc-date.model.mjs} +0 -0
  495. /package/{esm2015/lib/core/services/date/date-compare.enum.js → esm2020/lib/core/services/date/date-compare.enum.mjs} +0 -0
  496. /package/{esm2015/lib/core/services/geolocation/geolocation-state.enum.js → esm2020/lib/core/services/geolocation/geolocation-state.enum.mjs} +0 -0
  497. /package/{esm2015/lib/core/services/index.js → esm2020/lib/core/services/index.mjs} +0 -0
  498. /package/{esm2015/lib/index.js → esm2020/lib/index.mjs} +0 -0
  499. /package/{esm2015/lib/services/index.js → esm2020/lib/services/index.mjs} +0 -0
  500. /package/{esm2015/lib/shared/index.js → esm2020/lib/shared/index.mjs} +0 -0
  501. /package/{esm2015/lib/shared/models/flight-details.js → esm2020/lib/shared/models/flight-details.mjs} +0 -0
  502. /package/{esm2015/lib/shared/models/index.js → esm2020/lib/shared/models/index.mjs} +0 -0
  503. /package/{esm2015/lib/shared/models/journey-availability-sort.model.js → esm2020/lib/shared/models/journey-availability-sort.model.mjs} +0 -0
  504. /package/{esm2015/lib/shared/models/journey-availability.model.js → esm2020/lib/shared/models/journey-availability.model.mjs} +0 -0
  505. /package/{esm2015/lib/shared/models/journey-details.model.js → esm2020/lib/shared/models/journey-details.model.mjs} +0 -0
  506. /package/{esm2015/lib/shared/models/journey-duration.model.js → esm2020/lib/shared/models/journey-duration.model.mjs} +0 -0
  507. /package/{esm2015/lib/shared/models/journey-stopover.model.js → esm2020/lib/shared/models/journey-stopover.model.mjs} +0 -0
  508. /package/{esm2015/lib/shared/models/journey-transit-info.model.js → esm2020/lib/shared/models/journey-transit-info.model.mjs} +0 -0
  509. /package/{esm2015/lib/shared/models/operating-carrier.model.js → esm2020/lib/shared/models/operating-carrier.model.mjs} +0 -0
  510. /package/{esm2015/lib/shared/models/sort-option.model.js → esm2020/lib/shared/models/sort-option.model.mjs} +0 -0
  511. /package/{esm2015/lib/shared/models/sort.model.js → esm2020/lib/shared/models/sort.model.mjs} +0 -0
  512. /package/{esm2015/lib/shared/models/trip-item-details.model.js → esm2020/lib/shared/models/trip-item-details.model.mjs} +0 -0
  513. /package/{esm2015/lib/shared/models/trip-summary-details.model.js → esm2020/lib/shared/models/trip-summary-details.model.mjs} +0 -0
  514. /package/{esm2015/lib/shared/models/trip-summary.model.js → esm2020/lib/shared/models/trip-summary.model.mjs} +0 -0
  515. /package/{esm2015/public_api.js → esm2020/public_api.mjs} +0 -0
@@ -0,0 +1,610 @@
1
+ /**
2
+ * @license
3
+ * Copyright Norwegian Air Shuttle. All Rights Reserved.
4
+ */
5
+ import { DOCUMENT } from '@angular/common';
6
+ import { Component, EventEmitter, Inject, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core';
7
+ import { NasComponentBase } from '../../../core/base/nas-component.base';
8
+ import { GeolocationState } from '../../../core/services/geolocation/geolocation-state.enum';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "../services/airport-select.service";
11
+ import * as i2 from "../services/airport-select-dropdown.service";
12
+ import * as i3 from "../../../core/services/geolocation/geolocation.service";
13
+ import * as i4 from "@angular/common";
14
+ import * as i5 from "@angular/forms";
15
+ import * as i6 from "../../../core/directives/nas-class/nas-class.directive";
16
+ import * as i7 from "../../icon/icon.component";
17
+ import * as i8 from "../../button/button.component";
18
+ let nextId = 0;
19
+ export class AirportSelectDropdownComponent extends NasComponentBase {
20
+ get closestAirports() {
21
+ return this.closestAirportsValue;
22
+ }
23
+ set closestAirports(airports) {
24
+ if (!airports || !airports.length) {
25
+ return;
26
+ }
27
+ this.closestAirportsValue = airports;
28
+ this.geolocationState = GeolocationState.granted;
29
+ }
30
+ get airport() {
31
+ return this.airportValue;
32
+ }
33
+ set airport(airport) {
34
+ if (!airport) {
35
+ return;
36
+ }
37
+ this.airportValue = airport;
38
+ this.selectedModel = airport.name;
39
+ this.filteredAirports = this.selectService.filter(this.airports, this.selectedModel);
40
+ }
41
+ get open() {
42
+ return this.openValue;
43
+ }
44
+ set open(value) {
45
+ if (this.openValue === value) {
46
+ return;
47
+ }
48
+ clearTimeout(this.inputSelectionTimeout);
49
+ this.openValue = value;
50
+ if (value) {
51
+ this.inputSelectionTimeout = setTimeout(() => {
52
+ this.input.nativeElement.select();
53
+ }, 100);
54
+ }
55
+ }
56
+ get airports() {
57
+ return this.airportsValue;
58
+ }
59
+ set airports(airports) {
60
+ this.airportsValue = airports;
61
+ this.filteredAirports = this.selectService.filter(this.airports, this.selectedModel);
62
+ }
63
+ get selectedModel() {
64
+ return this.selectedModelValue;
65
+ }
66
+ set selectedModel(model) {
67
+ this.selectedModelValue = model;
68
+ if (!this.nasFormGroup || !this.nasFormControlName) {
69
+ return;
70
+ }
71
+ const control = this.nasFormGroup.get(this.nasFormControlName);
72
+ if (control && control.value !== model) {
73
+ control.patchValue(model);
74
+ }
75
+ }
76
+ get resultsId() {
77
+ return `nas-airport-select-dropdown-results-${this.componentId}`;
78
+ }
79
+ get labelId() {
80
+ return `nas-airport-select-dropdown-label-${this.componentId}`;
81
+ }
82
+ get inputId() {
83
+ return `nas-airport-select-dropdown-input-${this.componentId}`;
84
+ }
85
+ get geolocationIcon() {
86
+ if (this.focusOnGeolocation && this.geolocationState !== GeolocationState.denied) {
87
+ return 'geolocation--light';
88
+ }
89
+ if (this.geolocationState === GeolocationState.denied) {
90
+ return 'geolocation--disabled';
91
+ }
92
+ return 'geolocation';
93
+ }
94
+ constructor(document, selectService, airportSelectDropdownService, geolocationService) {
95
+ super('nas-airport-select');
96
+ this.document = document;
97
+ this.selectService = selectService;
98
+ this.airportSelectDropdownService = airportSelectDropdownService;
99
+ this.geolocationService = geolocationService;
100
+ this.focusedAirportIndex = -1;
101
+ this.focusedLatestSearchesIndex = -1;
102
+ this.focusedClosestAirportIndex = -1;
103
+ this.filteredAirports = this.airports;
104
+ this.displayAllAirportsLabel = true;
105
+ this.geolocationState = null;
106
+ this.isValid = true;
107
+ this.selected = new EventEmitter();
108
+ this.openChange = new EventEmitter();
109
+ this.focusOnNext = new EventEmitter();
110
+ this.focusOnPrevious = new EventEmitter();
111
+ this.positionChange = new EventEmitter();
112
+ this.componentId = nextId++;
113
+ }
114
+ ngOnInit() {
115
+ if (!this.ariaLabelClear) {
116
+ this.warnMissingAccessibiltyInput('ariaLabelClear');
117
+ }
118
+ if (!this.ariaLabelBackdrop) {
119
+ this.warnMissingAccessibiltyInput('ariaLabelBackdrop');
120
+ }
121
+ this.selectedModel = this.airport ? this.airport.name : '';
122
+ if (this.exists(this.displayClosestAirports)) {
123
+ this.geolocationService.getState().subscribe((state) => {
124
+ this.geolocationState = state;
125
+ if (state === GeolocationState.granted) {
126
+ this.updateCurrentPosition();
127
+ }
128
+ });
129
+ }
130
+ if (!this.selectedModel) {
131
+ this.filteredAirports = this.selectService.filter(this.airports, this.selectedModel);
132
+ return;
133
+ }
134
+ this.displayLatestSearches = false;
135
+ this.displayClosestAirports = false;
136
+ this.displayAllAirportsLabel = false;
137
+ if (!this.filteredAirports) {
138
+ return;
139
+ }
140
+ const airport = this.filteredAirports.find(x => x.name === this.selectedModel);
141
+ if (airport) {
142
+ this.focusedAirportCode = airport.code;
143
+ }
144
+ }
145
+ getAllAirportsAirportId(airportCode) {
146
+ return `nas-airport-select-dropdown-airport-${this.componentId}-all-airports-${airportCode}`;
147
+ }
148
+ getClosestAirportsAirportId(airportCode) {
149
+ return `nas-airport-select-dropdown-airport-${this.componentId}-closest-airports-${airportCode}`;
150
+ }
151
+ getLatestSearchesAirportId(airportCode) {
152
+ return `nas-airport-select-dropdown-airport-${this.componentId}-latest-searches-${airportCode}`;
153
+ }
154
+ updateCurrentPosition() {
155
+ if (this.geolocationState === GeolocationState.denied
156
+ || this.geolocationState === GeolocationState.unknown) {
157
+ return;
158
+ }
159
+ this.geolocationService.getCurrentPosition().subscribe((x) => {
160
+ this.positionChange.emit(x);
161
+ }, (error) => {
162
+ if (error.PERMISSION_DENIED) {
163
+ this.geolocationState = GeolocationState.denied;
164
+ }
165
+ });
166
+ }
167
+ setOpen() {
168
+ if (this.open) {
169
+ return;
170
+ }
171
+ this.open = true;
172
+ this.openChange.emit(true);
173
+ }
174
+ onGeolocationHover(hover) {
175
+ if (hover && this.geolocationState !== GeolocationState.denied) {
176
+ this.focusOnGeolocation = true;
177
+ }
178
+ else {
179
+ this.focusOnGeolocation = false;
180
+ }
181
+ }
182
+ blur() {
183
+ if (this.keepSelection) {
184
+ this.selectedModel = this.lastSelectedModel;
185
+ }
186
+ this.open = false;
187
+ this.openChange.emit(false);
188
+ if (this.selectedModel === this.lastSelectedModel) {
189
+ return;
190
+ }
191
+ if (this.selectedModel) {
192
+ if (this.filteredAirports) {
193
+ let airport = this.filteredAirports.find(x => x.name === this.selectedModel);
194
+ if (!airport) {
195
+ airport = this.filteredAirports[0];
196
+ }
197
+ this.updateSelected(airport);
198
+ }
199
+ }
200
+ else {
201
+ this.updateSelected({
202
+ airportName: '',
203
+ code: '',
204
+ countryName: '',
205
+ displayName: '',
206
+ name: '',
207
+ normalizedAirportName: ''
208
+ });
209
+ }
210
+ }
211
+ filter() {
212
+ let isEmpty = false;
213
+ if (!this.nasFormGroup || !this.nasFormControlName) {
214
+ if (!this.selectedModel) {
215
+ this.resetFilter();
216
+ isEmpty = true;
217
+ }
218
+ else {
219
+ this.focusedAirportIndex = 0;
220
+ this.filteredAirports = this.selectService.filter(this.airports, this.selectedModel);
221
+ this.focusedAirportCode = this.filteredAirports[0].code;
222
+ }
223
+ }
224
+ else {
225
+ const control = this.nasFormGroup.get(this.nasFormControlName);
226
+ if (!control || !control.value) {
227
+ this.resetFilter();
228
+ isEmpty = true;
229
+ }
230
+ else {
231
+ this.focusedAirportIndex = 0;
232
+ this.filteredAirports = this.selectService.filter(this.airports, control.value);
233
+ this.focusedAirportCode = this.filteredAirports[0].code;
234
+ }
235
+ }
236
+ this.displayLatestSearches = isEmpty;
237
+ this.displayClosestAirports = isEmpty;
238
+ this.displayAllAirportsLabel = isEmpty;
239
+ }
240
+ clearSelected(event) {
241
+ event.preventDefault();
242
+ if (this.keepSelection) {
243
+ this.lastSelectedModel = this.airport.name;
244
+ }
245
+ this.selectedModel = '';
246
+ this.updateSelected({
247
+ name: '',
248
+ countryName: '',
249
+ code: '',
250
+ displayName: '',
251
+ airportName: '',
252
+ normalizedAirportName: ''
253
+ });
254
+ this.focusedAirportIndex = -1;
255
+ this.focusedLatestSearchesIndex = -1;
256
+ this.focusedClosestAirportIndex = -1;
257
+ this.focusedAirportCode = '';
258
+ this.focusedLatestSearchesAirportCode = '';
259
+ this.focusedClosestAirportCode = '';
260
+ this.filteredAirports = this.airports;
261
+ this.open = true;
262
+ this.displayLatestSearches = true;
263
+ this.displayClosestAirports = true;
264
+ this.displayAllAirportsLabel = true;
265
+ }
266
+ focusDown() {
267
+ const hasLatestSearches = this.airportSelectDropdownService
268
+ .hasLatestSearches(this.exists(this.displayLatestSearches), this.latestSearches);
269
+ const hasClosestAirports = this.airportSelectDropdownService
270
+ .hasClosestAirports(this.exists(this.displayClosestAirports), this.closestAirports);
271
+ if (this.geolocationState !== null &&
272
+ this.geolocationState !== GeolocationState.granted &&
273
+ this.geolocationState !== GeolocationState.denied &&
274
+ !this.focusOnGeolocation &&
275
+ this.focusedAirportIndex === -1 &&
276
+ this.focusedLatestSearchesIndex === -1) {
277
+ this.focusOnGeolocation = true;
278
+ }
279
+ else if (hasLatestSearches && this.focusedLatestSearchesIndex < this.latestSearches.length - 1) {
280
+ this.focusDownLatestSearches();
281
+ }
282
+ else if (hasClosestAirports
283
+ && this.airportSelectDropdownService.isIndexInClosestAirports(this.focusedClosestAirportIndex, this.closestAirports)) {
284
+ this.focusDownClosestAirports();
285
+ }
286
+ else {
287
+ this.focusDownAirports(hasClosestAirports, hasLatestSearches);
288
+ }
289
+ this.autoScroll(66);
290
+ }
291
+ focusUp() {
292
+ const hasLatestSearches = this.airportSelectDropdownService
293
+ .hasLatestSearches(this.exists(this.displayLatestSearches), this.latestSearches);
294
+ const hasClosestAirports = this.airportSelectDropdownService
295
+ .hasClosestAirports(this.exists(this.displayClosestAirports), this.closestAirports);
296
+ const hasGeolocation = this.geolocationState !== null &&
297
+ this.geolocationState !== GeolocationState.granted &&
298
+ this.geolocationState !== GeolocationState.denied &&
299
+ !this.focusOnGeolocation;
300
+ if (this.focusedAirportIndex > 0) {
301
+ this.focusUpAirports(hasClosestAirports, hasLatestSearches);
302
+ }
303
+ else if (hasClosestAirports && this.focusedAirportIndex <= 0 && this.focusedClosestAirportIndex > 0) {
304
+ this.focusUpClosestAirports(hasLatestSearches);
305
+ }
306
+ else if (hasLatestSearches && hasClosestAirports && this.focusedClosestAirportIndex <= 0
307
+ || hasLatestSearches && !hasClosestAirports && this.focusedAirportIndex <= 0) {
308
+ this.focusUpLatestSearches();
309
+ }
310
+ else if (hasGeolocation && hasLatestSearches && this.focusedLatestSearchesIndex <= 0
311
+ || hasGeolocation && !hasLatestSearches && this.focusedAirportIndex <= 0) {
312
+ this.focusOnGeolocation = true;
313
+ this.focusedAirportCode = '';
314
+ this.focusedLatestSearchesAirportCode = '';
315
+ this.focusedLatestSearchesIndex = -1;
316
+ this.focusedAirportIndex = -1;
317
+ }
318
+ else {
319
+ this.blur();
320
+ }
321
+ this.autoScroll(66);
322
+ }
323
+ setSelected(airport) {
324
+ this.updateSelected(airport);
325
+ this.open = false;
326
+ this.openChange.emit(false);
327
+ }
328
+ onKeyDown(event) {
329
+ switch (event.key) {
330
+ case 'Escape':
331
+ this.open = false;
332
+ if (this.keepSelection && !this.airport.name) {
333
+ this.blur();
334
+ }
335
+ break;
336
+ case 'Tab':
337
+ case 'Enter':
338
+ if (this.filteredAirports) {
339
+ const airport = this.filteredAirports.find(x => x.code === this.focusedAirportCode) || this.filteredAirports[0];
340
+ this.selectedModel = airport.name || '';
341
+ }
342
+ if (this.focusOnGeolocation) {
343
+ event.preventDefault();
344
+ this.updateCurrentPosition();
345
+ return;
346
+ }
347
+ else {
348
+ this.blur();
349
+ if (!event.shiftKey) {
350
+ event.preventDefault();
351
+ this.focusOnNext.emit(event);
352
+ }
353
+ else {
354
+ this.focusOnPrevious.emit();
355
+ }
356
+ }
357
+ if (!event.shiftKey) {
358
+ event.preventDefault();
359
+ setTimeout(() => {
360
+ this.focusOnNext.emit(event);
361
+ });
362
+ }
363
+ else {
364
+ this.open = false;
365
+ }
366
+ break;
367
+ case 'ArrowDown':
368
+ case 'Down':
369
+ this.focusDown();
370
+ break;
371
+ case 'ArrowUp':
372
+ case 'Up':
373
+ this.focusUp();
374
+ break;
375
+ case 'Backspace':
376
+ case 'Delete':
377
+ if (this.keepSelection) {
378
+ this.lastSelectedModel = this.airport.name;
379
+ }
380
+ break;
381
+ default:
382
+ break;
383
+ }
384
+ }
385
+ resetFilter() {
386
+ this.focusedAirportIndex = -1;
387
+ this.focusedLatestSearchesIndex = -1;
388
+ this.focusedClosestAirportIndex = -1;
389
+ this.focusedAirportCode = '';
390
+ this.focusedLatestSearchesAirportCode = '';
391
+ this.focusedClosestAirportCode = '';
392
+ this.filteredAirports = this.airports;
393
+ }
394
+ updateSelected(airport) {
395
+ this.selectedModel = airport.name;
396
+ if (this.keepSelection && airport.name.length) {
397
+ this.lastSelectedModel = airport.name;
398
+ }
399
+ this.selected.emit(airport);
400
+ }
401
+ focusDownLatestSearches() {
402
+ this.focusOnGeolocation = false;
403
+ let index = this.focusedLatestSearchesIndex;
404
+ index = index + 1;
405
+ const airport = this.latestSearches[index];
406
+ this.focusedLatestSearchesIndex = index;
407
+ this.focusedLatestSearchesAirportCode = airport.code;
408
+ this.focusedAirportCode = '';
409
+ this.focusedClosestAirportCode = '';
410
+ this.updateSelected(airport);
411
+ }
412
+ focusDownClosestAirports() {
413
+ let index = this.focusedClosestAirportIndex;
414
+ index = index + 1;
415
+ const airport = this.closestAirports[index];
416
+ this.focusedClosestAirportIndex = index;
417
+ this.focusedClosestAirportCode = airport.code || '';
418
+ this.focusedAirportCode = '';
419
+ this.focusedLatestSearchesAirportCode = '';
420
+ this.updateSelected(airport);
421
+ }
422
+ focusDownAirports(hasClosestAirports, hasLatestSearches) {
423
+ let index = this.focusedAirportIndex;
424
+ this.focusOnGeolocation = false;
425
+ index = index + 1;
426
+ if (this.filteredAirports && index > this.filteredAirports.length - 1) {
427
+ this.focusedClosestAirportIndex = -1;
428
+ this.focusedLatestSearchesIndex = -1;
429
+ this.focusedAirportIndex = -1;
430
+ if (this.geolocationState !== GeolocationState.granted) {
431
+ this.focusOnGeolocation = true;
432
+ this.focusedAirportCode = '';
433
+ this.focusedClosestAirportCode = '';
434
+ this.focusedLatestSearchesAirportCode = '';
435
+ return;
436
+ }
437
+ else if (hasLatestSearches) {
438
+ this.focusDownLatestSearches();
439
+ return;
440
+ }
441
+ else if (hasClosestAirports) {
442
+ this.focusDownClosestAirports();
443
+ return;
444
+ }
445
+ }
446
+ this.focusedAirportIndex = index;
447
+ if (this.filteredAirports) {
448
+ const airport = this.filteredAirports[index];
449
+ if (airport) {
450
+ this.focusedAirportCode = airport.code;
451
+ this.selectedModel = airport.name;
452
+ }
453
+ }
454
+ this.focusedLatestSearchesAirportCode = '';
455
+ this.focusedClosestAirportCode = '';
456
+ }
457
+ focusUpAirports(hasClosestAirports, hasLatestSearches) {
458
+ let index = this.focusedAirportIndex;
459
+ this.focusOnGeolocation = false;
460
+ if (index - 1 < 0) {
461
+ this.focusedAirportIndex = -1;
462
+ this.focusedAirportCode = '';
463
+ this.blur();
464
+ if (!hasClosestAirports) {
465
+ this.focusedClosestAirportCode = '';
466
+ }
467
+ if (!hasLatestSearches) {
468
+ this.focusedClosestAirportCode = '';
469
+ }
470
+ return;
471
+ }
472
+ index = index - 1;
473
+ this.focusedAirportIndex = index;
474
+ this.focusedLatestSearchesAirportCode = '';
475
+ this.focusedClosestAirportCode = '';
476
+ if (this.filteredAirports) {
477
+ const airport = this.filteredAirports[index];
478
+ if (airport) {
479
+ this.focusedAirportCode = airport.code;
480
+ this.selectedModel = airport.name;
481
+ }
482
+ }
483
+ }
484
+ autoScroll(extraOffset) {
485
+ if (!this.results) {
486
+ return;
487
+ }
488
+ const results = this.results.nativeElement;
489
+ const focusedItem = this.document.querySelector('.nas-airport-select__list-item--focus');
490
+ if (focusedItem) {
491
+ results.scrollTo(0, 0);
492
+ results.scrollTo(0, focusedItem.offsetTop + extraOffset - results.clientHeight);
493
+ }
494
+ }
495
+ focusUpLatestSearches() {
496
+ this.focusOnGeolocation = false;
497
+ let latestSearchesIndex = this.focusedLatestSearchesIndex;
498
+ if (latestSearchesIndex < 0) {
499
+ this.focusedLatestSearchesIndex = -1;
500
+ this.focusedLatestSearchesAirportCode = '';
501
+ this.blur();
502
+ return;
503
+ }
504
+ const closestAirportIndex = this.focusedClosestAirportIndex;
505
+ const airportsIndex = this.focusedAirportIndex;
506
+ if (closestAirportIndex < 0 && airportsIndex < 0) {
507
+ latestSearchesIndex = latestSearchesIndex - 1;
508
+ if (latestSearchesIndex < 0) {
509
+ this.focusedLatestSearchesIndex = -1;
510
+ this.focusedLatestSearchesAirportCode = '';
511
+ this.blur();
512
+ return;
513
+ }
514
+ }
515
+ const airport = this.latestSearches[latestSearchesIndex];
516
+ this.focusedLatestSearchesIndex = latestSearchesIndex;
517
+ this.focusedLatestSearchesAirportCode = airport.code;
518
+ this.focusedClosestAirportCode = '';
519
+ this.focusedClosestAirportIndex = -1;
520
+ this.focusedAirportCode = '';
521
+ this.focusedAirportIndex = -1;
522
+ this.updateSelected(airport);
523
+ }
524
+ focusUpClosestAirports(hasLatestSearches) {
525
+ let closestAirportIndex = this.focusedClosestAirportIndex;
526
+ if (!hasLatestSearches && closestAirportIndex <= 0) {
527
+ this.focusedClosestAirportIndex = -1;
528
+ this.blur();
529
+ return;
530
+ }
531
+ if (closestAirportIndex - 1 < 0) {
532
+ this.focusedClosestAirportIndex = -1;
533
+ this.focusedClosestAirportCode = '';
534
+ return;
535
+ }
536
+ if (this.focusedAirportIndex < 0) {
537
+ closestAirportIndex = closestAirportIndex - 1;
538
+ }
539
+ const airport = this.closestAirports[closestAirportIndex];
540
+ this.focusedClosestAirportIndex = closestAirportIndex;
541
+ this.focusedClosestAirportCode = airport.code;
542
+ this.focusedAirportCode = '';
543
+ this.focusedAirportIndex = -1;
544
+ this.updateSelected(airport);
545
+ }
546
+ }
547
+ AirportSelectDropdownComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AirportSelectDropdownComponent, deps: [{ token: DOCUMENT }, { token: i1.AirportSelectService }, { token: i2.AirportSelectDropdownService }, { token: i3.GeolocationService }], target: i0.ɵɵFactoryTarget.Component });
548
+ AirportSelectDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: AirportSelectDropdownComponent, selector: "nas-airport-select-dropdown", inputs: { displayLatestSearches: "displayLatestSearches", displayClosestAirports: "displayClosestAirports", latestSearches: "latestSearches", resultsLabels: "resultsLabels", airportSelectLabel: "airportSelectLabel", airportSelectPlaceholder: "airportSelectPlaceholder", airportSelectIconModifier: "airportSelectIconModifier", keepSelection: "keepSelection", nasFormControlName: "nasFormControlName", nasFormGroup: "nasFormGroup", enableGeolocation: "enableGeolocation", ariaLabelClear: "ariaLabelClear", ariaLabelBackdrop: "ariaLabelBackdrop", isValid: "isValid", invalidText: "invalidText", closestAirports: "closestAirports", airport: "airport", open: "open", airports: "airports" }, outputs: { selected: "selected", openChange: "openChange", focusOnNext: "focusOnNext", focusOnPrevious: "focusOnPrevious", positionChange: "positionChange" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["airportSelect"], descendants: true }, { propertyName: "results", first: true, predicate: ["results"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"!nasFormControlName; else reactiveForm\">\n <label [id]=\"labelId\"\n [attr.aria-label]=\"airportSelectLabel\"\n [nasClass]=\"getClass('wrapper', open && 'active')\">\n <span [nasClass]=\"getClass('label')\">\n <ng-container *ngIf=\"airportSelectLabel; else emptyLabel\">{{airportSelectLabel}}</ng-container>\n <ng-template #emptyLabel>&nbsp;</ng-template>\n </span>\n <input #airportSelect\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"none\"\n [id]=\"inputId\"\n [attr.aria-controls]=\"resultsId\"\n [attr.aria-expanded]=\"open ? 'true' : 'false'\"\n [attr.aria-owns]=\"resultsId\"\n [nasClass]=\"getClass('input')\"\n [placeholder]=\"airportSelectPlaceholder\"\n (focus)=\"setOpen()\"\n (mousedown)=\"setOpen()\"\n (input)=\"filter()\"\n (keydown)=\"onKeyDown($event)\"\n [(ngModel)]=\"selectedModel\" />\n <span [nasClass]=\"getClass('icon')\">\n <button type=\"button\"\n role=\"button\"\n tabindex=\"-1\"\n *ngIf=\"selectedModel; else isEmpty\"\n [attr.aria-label]=\"ariaLabelClear\"\n (click)=\"clearSelected($event)\">\n <nas-icon [type]=\"'remove'\"></nas-icon>\n </button>\n <ng-template #isEmpty>\n <nas-icon [type]=\"'small'\"\n [icon]=\"airportSelectIconModifier\"></nas-icon>\n </ng-template>\n </span>\n </label>\n</ng-container>\n<ng-template #reactiveForm>\n <label [id]=\"labelId\"\n [attr.aria-label]=\"airportSelectLabel\"\n [nasClass]=\"getClass('wrapper', open && 'active')\"\n [formGroup]=\"nasFormGroup\">\n <span [nasClass]=\"getClass('label')\"\n *ngIf=\"airportSelectLabel\">{{airportSelectLabel}}</span>\n <input #airportSelect\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n aria-autocomplete=\"none\"\n [id]=\"inputId\"\n [attr.aria-controls]=\"resultsId\"\n [attr.aria-expanded]=\"open ? 'true' : 'false'\"\n [attr.aria-owns]=\"resultsId\"\n [nasClass]=\"getClass('input')\"\n [formControlName]=\"nasFormControlName\"\n [placeholder]=\"airportSelectPlaceholder\"\n (mousedown)=\"setOpen()\"\n (focus)=\"setOpen()\"\n (input)=\"filter()\"\n (keydown)=\"onKeyDown($event)\" />\n <span [nasClass]=\"getClass('icon')\">\n <button type=\"button\"\n role=\"button\"\n tabindex=\"-1\"\n *ngIf=\"selectedModel; else isEmpty\"\n [attr.aria-label]=\"ariaLabelClear\"\n (click)=\"clearSelected($event)\">\n <nas-icon [type]=\"'remove'\"></nas-icon>\n </button>\n <ng-template #isEmpty>\n <nas-icon [type]=\"'small'\"\n [icon]=\"airportSelectIconModifier\"></nas-icon>\n </ng-template>\n </span>\n </label>\n</ng-template>\n<div [nasClass]=\"getClass('results-wrapper')\"\n [id]=\"resultsId\"\n [attr.aria-expanded]=\"open ? 'true' : 'false'\">\n <ul #results\n role=\"listbox\"\n *ngIf=\"open\"\n [attr.aria-labelledby]=\"labelId\"\n [nasClass]=\"getClass('results')\">\n <ng-container *ngIf=\"exists(enableGeolocation) && geolocationState !== null && geolocationState !== 0 && isValid\">\n <li role=\"option\">\n <nas-button link\n secondary\n [disabled]=\"geolocationState === 2\"\n [cssStyle]=\"{'height': '66px', 'text-decoration': 'underline', 'display': 'flex', 'justify-content': 'space-between'}\"\n [cssClass]=\"getClass('item', ['geolocation', focusOnGeolocation && geolocationState !== 2 && 'focus', geolocationState === 2 && 'disabled'])\"\n [tabindex]=\"-1\"\n (clickChange)=\"updateCurrentPosition()\"\n (mouseenter)=\"onGeolocationHover(true)\"\n (mouseleave)=\"onGeolocationHover(false)\">\n <span *ngIf=\"geolocationState === 1; else geolocationDenied\"\n [nasClass]=\"getClass('geolocation', 'label')\">{{resultsLabels?.geolocation}}</span>\n <ng-template #geolocationDenied>\n <span [nasClass]=\"getClass('geolocation', 'label')\">{{resultsLabels?.geolocationDenied}}</span>\n </ng-template>\n <nas-icon [nasClass]=\"getClass('geolocation', 'icon')\"\n [type]=\"geolocationIcon\"></nas-icon>\n </nas-button>\n </li>\n </ng-container>\n <li role=\"separator\"\n [nasClass]=\"getClass('list-section-label')\"\n *ngIf=\"latestSearches?.length > 0\n && exists(displayLatestSearches)\n && resultsLabels?.latestSearches\n && isValid\">\n <span>{{resultsLabels?.latestSearches}}</span>\n </li>\n <ng-container *ngIf=\"exists(displayLatestSearches) && isValid\">\n <li role=\"option\"\n *ngFor=\"let airport of latestSearches\"\n [id]=\"getLatestSearchesAirportId(airport.code)\"\n [attr.aria-selected]=\"airport.code === focusedLatestSearchesAirportCode\"\n [nasClass]=\"getClass('list-item', airport.code === focusedLatestSearchesAirportCode && 'focus')\">\n <button type=\"button\"\n [nasClass]=\"getClass('item', airport.code === focusedLatestSearchesAirportCode && 'focus')\"\n (click)=\"setSelected(airport)\"\n tabindex=\"-1\">\n <span [nasClass]=\"getClass('name')\">{{airport.name}}</span>\n <span [nasClass]=\"getClass('code')\"></span>\n <span [nasClass]=\"getClass('country')\">{{airport.countryName}}</span>\n </button>\n </li>\n </ng-container>\n <li role=\"separator\"\n *ngIf=\"exists(displayClosestAirports)\n && geolocationState !== null\n && geolocationState === 0\n && closestAirports?.length > 0\n && resultsLabels?.closestAirports\n && isValid\"\n [nasClass]=\"getClass('list-section-label')\">\n <span>{{resultsLabels?.closestAirports}}</span>\n </li>\n <ng-container *ngIf=\"exists(displayClosestAirports) && geolocationState === 0 && isValid\">\n <li role=\"option\"\n *ngFor=\"let airport of closestAirports\"\n [id]=\"getClosestAirportsAirportId(airport.code)\"\n [attr.aria-selected]=\"airport.code === focusedClosestAirportCode\"\n [nasClass]=\"getClass('list-item', airport.code === focusedClosestAirportCode && 'focus')\">\n <button type=\"button\"\n [nasClass]=\"getClass('item', airport.code === focusedClosestAirportCode && 'focus')\"\n (click)=\"setSelected(airport)\"\n tabindex=\"-1\">\n <span [nasClass]=\"getClass('name')\">{{airport.name}}</span>\n <span [nasClass]=\"getClass('code')\"></span>\n <span [nasClass]=\"getClass('country')\">{{airport.countryName}}</span>\n </button>\n </li>\n </ng-container>\n <li role=\"separator\"\n [nasClass]=\"getClass('list-section-label')\"\n *ngIf=\"displayAllAirportsLabel && resultsLabels?.allAirports && isValid\">\n <span>{{resultsLabels?.allAirports}}</span>\n </li>\n <ng-container *ngIf=\"isValid\">\n <li role=\"option\"\n *ngFor=\"let airport of filteredAirports\"\n [id]=\"getAllAirportsAirportId(airport.code)\"\n [attr.aria-selected]=\"airport.code === focusedAirportCode\"\n [nasClass]=\"getClass('list-item', airport.code === focusedAirportCode && 'focus')\">\n <button type=\"button\"\n [nasClass]=\"getClass('item', airport.code === focusedAirportCode && 'focus')\"\n (click)=\"setSelected(airport)\"\n tabindex=\"-1\">\n <span [nasClass]=\"getClass('name')\">{{airport.name}}</span>\n <span [nasClass]=\"getClass('code')\"></span>\n <span [nasClass]=\"getClass('country')\">{{airport.countryName}}</span>\n </button>\n </li>\n </ng-container>\n <li *ngIf=\"!isValid\"\n role=\"listitem\">\n <span [nasClass]=\"getClass('name', 'invalid')\">{{invalidText}}</span>\n </li>\n </ul>\n</div>\n<button type=\"button\"\n tabindex=\"0\"\n *ngIf=\"open\"\n [attr.aria-label]=\"ariaLabelBackdrop\"\n [nasClass]=\"getClass('backdrop')\"\n (click)=\"blur()\"></button>", styles: [""], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NasClassDirective, selector: "[nasClass]", inputs: ["nasClass", "attr.class"] }, { kind: "component", type: i7.IconComponent, selector: "nas-icon", inputs: ["icon", "type", "isIndicator", "lightCircularBackground", "cssClass"] }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i8.ButtonComponent, selector: "nas-button", inputs: ["primary", "secondary", "link", "approve", "light", "large", "block", "flex", "compact", "right", "spaceless", "transparent", "href", "trackingvalue", "canContinueOnDisabled", "disabled", "type", "cssClass", "ariaLabel", "cssStyle", "tabindex", "overrideBaseCssClass", "useRouterLink", "id", "target"], outputs: ["clickChange"] }], encapsulation: i0.ViewEncapsulation.None });
549
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AirportSelectDropdownComponent, decorators: [{
550
+ type: Component,
551
+ args: [{ selector: 'nas-airport-select-dropdown', encapsulation: ViewEncapsulation.None, template: "<ng-container *ngIf=\"!nasFormControlName; else reactiveForm\">\n <label [id]=\"labelId\"\n [attr.aria-label]=\"airportSelectLabel\"\n [nasClass]=\"getClass('wrapper', open && 'active')\">\n <span [nasClass]=\"getClass('label')\">\n <ng-container *ngIf=\"airportSelectLabel; else emptyLabel\">{{airportSelectLabel}}</ng-container>\n <ng-template #emptyLabel>&nbsp;</ng-template>\n </span>\n <input #airportSelect\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"none\"\n [id]=\"inputId\"\n [attr.aria-controls]=\"resultsId\"\n [attr.aria-expanded]=\"open ? 'true' : 'false'\"\n [attr.aria-owns]=\"resultsId\"\n [nasClass]=\"getClass('input')\"\n [placeholder]=\"airportSelectPlaceholder\"\n (focus)=\"setOpen()\"\n (mousedown)=\"setOpen()\"\n (input)=\"filter()\"\n (keydown)=\"onKeyDown($event)\"\n [(ngModel)]=\"selectedModel\" />\n <span [nasClass]=\"getClass('icon')\">\n <button type=\"button\"\n role=\"button\"\n tabindex=\"-1\"\n *ngIf=\"selectedModel; else isEmpty\"\n [attr.aria-label]=\"ariaLabelClear\"\n (click)=\"clearSelected($event)\">\n <nas-icon [type]=\"'remove'\"></nas-icon>\n </button>\n <ng-template #isEmpty>\n <nas-icon [type]=\"'small'\"\n [icon]=\"airportSelectIconModifier\"></nas-icon>\n </ng-template>\n </span>\n </label>\n</ng-container>\n<ng-template #reactiveForm>\n <label [id]=\"labelId\"\n [attr.aria-label]=\"airportSelectLabel\"\n [nasClass]=\"getClass('wrapper', open && 'active')\"\n [formGroup]=\"nasFormGroup\">\n <span [nasClass]=\"getClass('label')\"\n *ngIf=\"airportSelectLabel\">{{airportSelectLabel}}</span>\n <input #airportSelect\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n aria-autocomplete=\"none\"\n [id]=\"inputId\"\n [attr.aria-controls]=\"resultsId\"\n [attr.aria-expanded]=\"open ? 'true' : 'false'\"\n [attr.aria-owns]=\"resultsId\"\n [nasClass]=\"getClass('input')\"\n [formControlName]=\"nasFormControlName\"\n [placeholder]=\"airportSelectPlaceholder\"\n (mousedown)=\"setOpen()\"\n (focus)=\"setOpen()\"\n (input)=\"filter()\"\n (keydown)=\"onKeyDown($event)\" />\n <span [nasClass]=\"getClass('icon')\">\n <button type=\"button\"\n role=\"button\"\n tabindex=\"-1\"\n *ngIf=\"selectedModel; else isEmpty\"\n [attr.aria-label]=\"ariaLabelClear\"\n (click)=\"clearSelected($event)\">\n <nas-icon [type]=\"'remove'\"></nas-icon>\n </button>\n <ng-template #isEmpty>\n <nas-icon [type]=\"'small'\"\n [icon]=\"airportSelectIconModifier\"></nas-icon>\n </ng-template>\n </span>\n </label>\n</ng-template>\n<div [nasClass]=\"getClass('results-wrapper')\"\n [id]=\"resultsId\"\n [attr.aria-expanded]=\"open ? 'true' : 'false'\">\n <ul #results\n role=\"listbox\"\n *ngIf=\"open\"\n [attr.aria-labelledby]=\"labelId\"\n [nasClass]=\"getClass('results')\">\n <ng-container *ngIf=\"exists(enableGeolocation) && geolocationState !== null && geolocationState !== 0 && isValid\">\n <li role=\"option\">\n <nas-button link\n secondary\n [disabled]=\"geolocationState === 2\"\n [cssStyle]=\"{'height': '66px', 'text-decoration': 'underline', 'display': 'flex', 'justify-content': 'space-between'}\"\n [cssClass]=\"getClass('item', ['geolocation', focusOnGeolocation && geolocationState !== 2 && 'focus', geolocationState === 2 && 'disabled'])\"\n [tabindex]=\"-1\"\n (clickChange)=\"updateCurrentPosition()\"\n (mouseenter)=\"onGeolocationHover(true)\"\n (mouseleave)=\"onGeolocationHover(false)\">\n <span *ngIf=\"geolocationState === 1; else geolocationDenied\"\n [nasClass]=\"getClass('geolocation', 'label')\">{{resultsLabels?.geolocation}}</span>\n <ng-template #geolocationDenied>\n <span [nasClass]=\"getClass('geolocation', 'label')\">{{resultsLabels?.geolocationDenied}}</span>\n </ng-template>\n <nas-icon [nasClass]=\"getClass('geolocation', 'icon')\"\n [type]=\"geolocationIcon\"></nas-icon>\n </nas-button>\n </li>\n </ng-container>\n <li role=\"separator\"\n [nasClass]=\"getClass('list-section-label')\"\n *ngIf=\"latestSearches?.length > 0\n && exists(displayLatestSearches)\n && resultsLabels?.latestSearches\n && isValid\">\n <span>{{resultsLabels?.latestSearches}}</span>\n </li>\n <ng-container *ngIf=\"exists(displayLatestSearches) && isValid\">\n <li role=\"option\"\n *ngFor=\"let airport of latestSearches\"\n [id]=\"getLatestSearchesAirportId(airport.code)\"\n [attr.aria-selected]=\"airport.code === focusedLatestSearchesAirportCode\"\n [nasClass]=\"getClass('list-item', airport.code === focusedLatestSearchesAirportCode && 'focus')\">\n <button type=\"button\"\n [nasClass]=\"getClass('item', airport.code === focusedLatestSearchesAirportCode && 'focus')\"\n (click)=\"setSelected(airport)\"\n tabindex=\"-1\">\n <span [nasClass]=\"getClass('name')\">{{airport.name}}</span>\n <span [nasClass]=\"getClass('code')\"></span>\n <span [nasClass]=\"getClass('country')\">{{airport.countryName}}</span>\n </button>\n </li>\n </ng-container>\n <li role=\"separator\"\n *ngIf=\"exists(displayClosestAirports)\n && geolocationState !== null\n && geolocationState === 0\n && closestAirports?.length > 0\n && resultsLabels?.closestAirports\n && isValid\"\n [nasClass]=\"getClass('list-section-label')\">\n <span>{{resultsLabels?.closestAirports}}</span>\n </li>\n <ng-container *ngIf=\"exists(displayClosestAirports) && geolocationState === 0 && isValid\">\n <li role=\"option\"\n *ngFor=\"let airport of closestAirports\"\n [id]=\"getClosestAirportsAirportId(airport.code)\"\n [attr.aria-selected]=\"airport.code === focusedClosestAirportCode\"\n [nasClass]=\"getClass('list-item', airport.code === focusedClosestAirportCode && 'focus')\">\n <button type=\"button\"\n [nasClass]=\"getClass('item', airport.code === focusedClosestAirportCode && 'focus')\"\n (click)=\"setSelected(airport)\"\n tabindex=\"-1\">\n <span [nasClass]=\"getClass('name')\">{{airport.name}}</span>\n <span [nasClass]=\"getClass('code')\"></span>\n <span [nasClass]=\"getClass('country')\">{{airport.countryName}}</span>\n </button>\n </li>\n </ng-container>\n <li role=\"separator\"\n [nasClass]=\"getClass('list-section-label')\"\n *ngIf=\"displayAllAirportsLabel && resultsLabels?.allAirports && isValid\">\n <span>{{resultsLabels?.allAirports}}</span>\n </li>\n <ng-container *ngIf=\"isValid\">\n <li role=\"option\"\n *ngFor=\"let airport of filteredAirports\"\n [id]=\"getAllAirportsAirportId(airport.code)\"\n [attr.aria-selected]=\"airport.code === focusedAirportCode\"\n [nasClass]=\"getClass('list-item', airport.code === focusedAirportCode && 'focus')\">\n <button type=\"button\"\n [nasClass]=\"getClass('item', airport.code === focusedAirportCode && 'focus')\"\n (click)=\"setSelected(airport)\"\n tabindex=\"-1\">\n <span [nasClass]=\"getClass('name')\">{{airport.name}}</span>\n <span [nasClass]=\"getClass('code')\"></span>\n <span [nasClass]=\"getClass('country')\">{{airport.countryName}}</span>\n </button>\n </li>\n </ng-container>\n <li *ngIf=\"!isValid\"\n role=\"listitem\">\n <span [nasClass]=\"getClass('name', 'invalid')\">{{invalidText}}</span>\n </li>\n </ul>\n</div>\n<button type=\"button\"\n tabindex=\"0\"\n *ngIf=\"open\"\n [attr.aria-label]=\"ariaLabelBackdrop\"\n [nasClass]=\"getClass('backdrop')\"\n (click)=\"blur()\"></button>" }]
552
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
553
+ type: Inject,
554
+ args: [DOCUMENT]
555
+ }] }, { type: i1.AirportSelectService }, { type: i2.AirportSelectDropdownService }, { type: i3.GeolocationService }]; }, propDecorators: { input: [{
556
+ type: ViewChild,
557
+ args: ['airportSelect']
558
+ }], results: [{
559
+ type: ViewChild,
560
+ args: ['results']
561
+ }], displayLatestSearches: [{
562
+ type: Input
563
+ }], displayClosestAirports: [{
564
+ type: Input
565
+ }], latestSearches: [{
566
+ type: Input
567
+ }], resultsLabels: [{
568
+ type: Input
569
+ }], airportSelectLabel: [{
570
+ type: Input
571
+ }], airportSelectPlaceholder: [{
572
+ type: Input
573
+ }], airportSelectIconModifier: [{
574
+ type: Input
575
+ }], keepSelection: [{
576
+ type: Input
577
+ }], nasFormControlName: [{
578
+ type: Input
579
+ }], nasFormGroup: [{
580
+ type: Input
581
+ }], enableGeolocation: [{
582
+ type: Input
583
+ }], ariaLabelClear: [{
584
+ type: Input
585
+ }], ariaLabelBackdrop: [{
586
+ type: Input
587
+ }], isValid: [{
588
+ type: Input
589
+ }], invalidText: [{
590
+ type: Input
591
+ }], closestAirports: [{
592
+ type: Input
593
+ }], airport: [{
594
+ type: Input
595
+ }], open: [{
596
+ type: Input
597
+ }], airports: [{
598
+ type: Input
599
+ }], selected: [{
600
+ type: Output
601
+ }], openChange: [{
602
+ type: Output
603
+ }], focusOnNext: [{
604
+ type: Output
605
+ }], focusOnPrevious: [{
606
+ type: Output
607
+ }], positionChange: [{
608
+ type: Output
609
+ }] } });
610
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWlycG9ydC1zZWxlY3QtZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9haXJwb3J0LXNlbGVjdC9haXJwb3J0LXNlbGVjdC1kcm9wZG93bi9haXJwb3J0LXNlbGVjdC1kcm9wZG93bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2FpcnBvcnQtc2VsZWN0L2FpcnBvcnQtc2VsZWN0LWRyb3Bkb3duL2FpcnBvcnQtc2VsZWN0LWRyb3Bkb3duLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUNILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBTXpFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJEQUEyRCxDQUFDOzs7Ozs7Ozs7O0FBRTdGLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztBQVFmLE1BQU0sT0FBTyw4QkFBK0IsU0FBUSxnQkFBZ0I7SUFvQ2xFLElBQ0ksZUFBZTtRQUNqQixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztJQUNuQyxDQUFDO0lBQ0QsSUFBSSxlQUFlLENBQUMsUUFBNkI7UUFDL0MsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFDakMsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLG9CQUFvQixHQUFH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OzJIQTNvQlUsOEJBQThCLGtCQWdKL0IsUUFBUTsrR0FoSlAsOEJBQThCLG9tQ0NqQzNDLGdoUUErTDRCOzJGRDlKZiw4QkFBOEI7a0JBTjFDLFNBQVM7K0JBQ0UsNkJBQTZCLGlCQUd4QixpQkFBaUIsQ0FBQyxJQUFJOzswQkFrSmxDLE1BQU07MkJBQUMsUUFBUTsySkEvSFUsS0FBSztzQkFBaEMsU0FBUzt1QkFBQyxlQUFlO2dCQUNKLE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUztnQkFFWCxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csc0JBQXNCO3NCQUE5QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csd0JBQXdCO3NCQUFoQyxLQUFLO2dCQUNHLHlCQUF5QjtzQkFBakMsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFHRixlQUFlO3NCQURsQixLQUFLO2dCQWNGLE9BQU87c0JBRFYsS0FBSztnQkFlRixJQUFJO3NCQURQLEtBQUs7Z0JBb0JGLFFBQVE7c0JBRFgsS0FBSztnQkFTSSxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgTm9yd2VnaWFuIEFpciBTaHV0dGxlLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICovXG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVbnR5cGVkRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTmFzQ29tcG9uZW50QmFzZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvYmFzZS9uYXMtY29tcG9uZW50LmJhc2UnO1xuaW1wb3J0IHsgR2VvbG9jYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9nZW9sb2NhdGlvbi9nZW9sb2NhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEFpcnBvcnRNb2RlbCB9IGZyb20gJy4uL21vZGVscy9haXJwb3J0Lm1vZGVsJztcbmltcG9ydCB7IFJlc3VsdHNMYWJlbHNNb2RlbCB9IGZyb20gJy4uL21vZGVscy9yZXN1bHRzLWxhYmVscy5tb2RlbCc7XG5pbXBvcnQgeyBBaXJwb3J0U2VsZWN0RHJvcGRvd25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYWlycG9ydC1zZWxlY3QtZHJvcGRvd24uc2VydmljZSc7XG5pbXBvcnQgeyBBaXJwb3J0U2VsZWN0U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2FpcnBvcnQtc2VsZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgR2VvbG9jYXRpb25TdGF0ZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvZ2VvbG9jYXRpb24vZ2VvbG9jYXRpb24tc3RhdGUuZW51bSc7XG5cbmxldCBuZXh0SWQgPSAwO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduYXMtYWlycG9ydC1zZWxlY3QtZHJvcGRvd24nLFxuICB0ZW1wbGF0ZVVybDogJy4vYWlycG9ydC1zZWxlY3QtZHJvcGRvd24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9haXJwb3J0LXNlbGVjdC1kcm9wZG93bi5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIEFpcnBvcnRTZWxlY3REcm9wZG93bkNvbXBvbmVudCBleHRlbmRzIE5hc0NvbXBvbmVudEJhc2UgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIGFpcnBvcnRWYWx1ZTogQWlycG9ydE1vZGVsO1xuICBhaXJwb3J0c1ZhbHVlOiBBcnJheTxBaXJwb3J0TW9kZWw+O1xuICBmb2N1c2VkQWlycG9ydEluZGV4ID0gLTE7XG4gIGZvY3VzZWRMYXRlc3RTZWFyY2hlc0luZGV4ID0gLTE7XG4gIGZvY3VzZWRDbG9zZXN0QWlycG9ydEluZGV4ID0gLTE7XG4gIGZvY3VzZWRDbG9zZXN0QWlycG9ydENvZGU6IHN0cmluZztcbiAgZm9jdXNlZEFpcnBvcnRDb2RlOiBzdHJpbmc7XG4gIGZvY3VzZWRMYXRlc3RTZWFyY2hlc0FpcnBvcnRDb2RlOiBzdHJpbmc7XG4gIGZpbHRlcmVkQWlycG9ydHM6IEFycmF5PEFpcnBvcnRNb2RlbD4gPSB0aGlzLmFpcnBvcnRzO1xuICBkaXNwbGF5QWxsQWlycG9ydHNMYWJlbCA9IHRydWU7XG4gIHNlbGVjdGVkTGFiZWw6IHN0cmluZztcbiAgb3BlblZhbHVlOiBib29sZWFuO1xuICBmb2N1c09uR2VvbG9jYXRpb246IGJvb2xlYW47XG4gIGdlb2xvY2F0aW9uU3RhdGU6IEdlb2xvY2F0aW9uU3RhdGUgPSBudWxsO1xuXG4gIEBWaWV3Q2hpbGQoJ2FpcnBvcnRTZWxlY3QnKSBpbnB1dDogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgncmVzdWx0cycpIHJlc3VsdHM6IEVsZW1lbnRSZWY7XG5cbiAgQElucHV0KCkgZGlzcGxheUxhdGVzdFNlYXJjaGVzPzogYm9vbGVhbjtcbiAgQElucHV0KCkgZGlzcGxheUNsb3Nlc3RBaXJwb3J0cz86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGxhdGVzdFNlYXJjaGVzOiBBcnJheTxBaXJwb3J0TW9kZWw+O1xuICBASW5wdXQoKSByZXN1bHRzTGFiZWxzOiBSZXN1bHRzTGFiZWxzTW9kZWw7XG4gIEBJbnB1dCgpIGFpcnBvcnRTZWxlY3RMYWJlbDogc3RyaW5nO1xuICBASW5wdXQoKSBhaXJwb3J0U2VsZWN0UGxhY2Vob2xkZXI6IHN0cmluZztcbiAgQElucHV0KCkgYWlycG9ydFNlbGVjdEljb25Nb2RpZmllcjogc3RyaW5nO1xuICBASW5wdXQoKSBrZWVwU2VsZWN0aW9uOiBib29sZWFuO1xuICBASW5wdXQoKSBuYXNGb3JtQ29udHJvbE5hbWU6IHN0cmluZztcbiAgQElucHV0KCkgbmFzRm9ybUdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwO1xuICBASW5wdXQoKSBlbmFibGVHZW9sb2NhdGlvbj86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGFyaWFMYWJlbENsZWFyOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGFyaWFMYWJlbEJhY2tkcm9wOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGlzVmFsaWQgPSB0cnVlO1xuICBASW5wdXQoKSBpbnZhbGlkVGV4dDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBjbG9zZXN0QWlycG9ydHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvc2VzdEFpcnBvcnRzVmFsdWU7XG4gIH1cbiAgc2V0IGNsb3Nlc3RBaXJwb3J0cyhhaXJwb3J0czogQXJyYXk8QWlycG9ydE1vZGVsPikge1xuICAgIGlmICghYWlycG9ydHMgfHwgIWFpcnBvcnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2xvc2VzdEFpcnBvcnRzVmFsdWUgPSBhaXJwb3J0cztcbiAgICB0aGlzLmdlb2xvY2F0aW9uU3RhdGUgPSBHZW9sb2NhdGlvblN0YXRlLmdyYW50ZWQ7XG4gIH1cblxuICBASW5wdXQoKVxuICBnZXQgYWlycG9ydCgpIHtcbiAgICByZXR1cm4gdGhpcy5haXJwb3J0VmFsdWU7XG4gIH1cbiAgc2V0IGFpcnBvcnQoYWlycG9ydDogQWlycG9ydE1vZGVsKSB7XG4gICAgaWYgKCFhaXJwb3J0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5haXJwb3J0VmFsdWUgPSBhaXJwb3J0O1xuICAgIHRoaXMuc2VsZWN0ZWRNb2RlbCA9IGFpcnBvcnQubmFtZTtcbiAgICB0aGlzLmZpbHRlcmVkQWlycG9ydHMgPSB0aGlzLnNlbGVjdFNlcnZpY2UuZmlsdGVyKHRoaXMuYWlycG9ydHMsIHRoaXMuc2VsZWN0ZWRNb2RlbCk7XG4gIH1cblxuICBASW5wdXQoKVxuICBnZXQgb3BlbigpIHtcbiAgICByZXR1cm4gdGhpcy5vcGVuVmFsdWU7XG4gIH1cbiAgc2V0IG9wZW4odmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5vcGVuVmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuaW5wdXRTZWxlY3Rpb25UaW1lb3V0KTtcbiAgICB0aGlzLm9wZW5WYWx1ZSA9IHZhbHVlO1xuXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLmlucHV0U2VsZWN0aW9uVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0KCk7XG4gICAgICB9LCAxMDApO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpXG4gIGdldCBhaXJwb3J0cygpIHtcbiAgICByZXR1cm4gdGhpcy5haXJwb3J0c1ZhbHVlO1xuICB9XG4gIHNldCBhaXJwb3J0cyhhaXJwb3J0czogQXJyYXk8QWlycG9ydE1vZGVsPikge1xuICAgIHRoaXMuYWlycG9ydHNWYWx1ZSA9IGFpcnBvcnRzO1xuICAgIHRoaXMuZmlsdGVyZWRBaXJwb3J0cyA9IHRoaXMuc2VsZWN0U2VydmljZS5maWx0ZXIodGhpcy5haXJwb3J0cywgdGhpcy5zZWxlY3RlZE1vZGVsKTtcbiAgfVxuXG4gIEBPdXRwdXQoKSBzZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8QWlycG9ydE1vZGVsPigpO1xuICBAT3V0cHV0KCkgb3BlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgQE91dHB1dCgpIGZvY3VzT25OZXh0ID0gbmV3IEV2ZW50RW1pdHRlcjxLZXlib2FyZEV2ZW50PigpO1xuICBAT3V0cHV0KCkgZm9jdXNPblByZXZpb3VzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcG9zaXRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEdlb2xvY2F0aW9uUG9zaXRpb24+KCk7XG5cbiAgZ2V0IHNlbGVjdGVkTW9kZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRNb2RlbFZhbHVlO1xuICB9XG4gIHNldCBzZWxlY3RlZE1vZGVsKG1vZGVsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNlbGVjdGVkTW9kZWxWYWx1ZSA9IG1vZGVsO1xuXG4gICAgaWYgKCF0aGlzLm5hc0Zvcm1Hcm91cCB8fCAhdGhpcy5uYXNGb3JtQ29udHJvbE5hbWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5uYXNGb3JtR3JvdXAuZ2V0KHRoaXMubmFzRm9ybUNvbnRyb2xOYW1lKTtcblxuICAgIGlmIChjb250cm9sICYmIGNvbnRyb2wudmFsdWUgIT09IG1vZGVsKSB7XG4gICAgICBjb250cm9sLnBhdGNoVmFsdWUobW9kZWwpO1xuICAgIH1cbiAgfVxuXG4gIGdldCByZXN1bHRzSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYG5hcy1haXJwb3J0LXNlbGVjdC1kcm9wZG93bi1yZXN1bHRzLSR7dGhpcy5jb21wb25lbnRJZH1gO1xuICB9XG5cbiAgZ2V0IGxhYmVsSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYG5hcy1haXJwb3J0LXNlbGVjdC1kcm9wZG93bi1sYWJlbC0ke3RoaXMuY29tcG9uZW50SWR9YDtcbiAgfVxuXG4gIGdldCBpbnB1dElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBuYXMtYWlycG9ydC1zZWxlY3QtZHJvcGRvd24taW5wdXQtJHt0aGlzLmNvbXBvbmVudElkfWA7XG4gIH1cblxuICBnZXQgZ2VvbG9jYXRpb25JY29uKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZm9jdXNPbkdlb2xvY2F0aW9uICYmIHRoaXMuZ2VvbG9jYXRpb25TdGF0ZSAhPT0gR2VvbG9jYXRpb25TdGF0ZS5kZW5pZWQpIHtcbiAgICAgIHJldHVybiAnZ2VvbG9jYXRpb24tLWxpZ2h0JztcbiAgICB9XG4gICAgaWYgKHRoaXMuZ2VvbG9jYXRpb25TdGF0ZSA9PT0gR2VvbG9jYXRpb25TdGF0ZS5kZW5pZWQpIHtcbiAgICAgIHJldHVybiAnZ2VvbG9jYXRpb24tLWRpc2FibGVkJztcbiAgICB9XG5cbiAgICByZXR1cm4gJ2dlb2xvY2F0aW9uJztcbiAgfVxuXG4gIHByaXZhdGUgbGFzdFNlbGVjdGVkTW9kZWw6IHN0cmluZztcbiAgcHJpdmF0ZSBzZWxlY3RlZE1vZGVsVmFsdWU6IHN0cmluZztcbiAgcHJpdmF0ZSBpbnB1dFNlbGVjdGlvblRpbWVvdXQ6IGFueTtcbiAgcHJpdmF0ZSBjbG9zZXN0QWlycG9ydHNWYWx1ZTogQXJyYXk8QWlycG9ydE1vZGVsPjtcbiAgcHJpdmF0ZSBjb21wb25lbnRJZDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IGFueSxcbiAgICBwcml2YXRlIHNlbGVjdFNlcnZpY2U6IEFpcnBvcnRTZWxlY3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWlycG9ydFNlbGVjdERyb3Bkb3duU2VydmljZTogQWlycG9ydFNlbGVjdERyb3Bkb3duU2VydmljZSxcbiAgICBwcml2YXRlIGdlb2xvY2F0aW9uU2VydmljZTogR2VvbG9jYXRpb25TZXJ2aWNlKSB7XG4gICAgc3VwZXIoJ25hcy1haXJwb3J0LXNlbGVjdCcpO1xuICAgIHRoaXMuY29tcG9uZW50SWQgPSBuZXh0SWQrKztcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5hcmlhTGFiZWxDbGVhcikge1xuICAgICAgdGhpcy53YXJuTWlzc2luZ0FjY2Vzc2liaWx0eUlucHV0KCdhcmlhTGFiZWxDbGVhcicpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYXJpYUxhYmVsQmFja2Ryb3ApIHtcbiAgICAgIHRoaXMud2Fybk1pc3NpbmdBY2Nlc3NpYmlsdHlJbnB1dCgnYXJpYUxhYmVsQmFja2Ryb3AnKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkTW9kZWwgPSB0aGlzLmFpcnBvcnQgPyB0aGlzLmFpcnBvcnQubmFtZSA6ICcnO1xuXG4gICAgaWYgKHRoaXMuZXhpc3RzKHRoaXMuZGlzcGxheUNsb3Nlc3RBaXJwb3J0cykpIHtcbiAgICAgIHRoaXMuZ2VvbG9jYXRpb25TZXJ2aWNlLmdldFN0YXRlKCkuc3Vic2NyaWJlKChzdGF0ZTogR2VvbG9jYXRpb25TdGF0ZSkgPT4ge1xuICAgICAgICB0aGlzLmdlb2xvY2F0aW9uU3RhdGUgPSBzdGF0ZTtcblxuICAgICAgICBpZiAoc3RhdGUgPT09IEdlb2xvY2F0aW9uU3RhdGUuZ3JhbnRlZCkge1xuICAgICAgICAgIHRoaXMudXBkYXRlQ3VycmVudFBvc2l0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zZWxlY3RlZE1vZGVsKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkQWlycG9ydHMgPSB0aGlzLnNlbGVjdFNlcnZpY2UuZmlsdGVyKHRoaXMuYWlycG9ydHMsIHRoaXMuc2VsZWN0ZWRNb2RlbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kaXNwbGF5TGF0ZXN0U2VhcmNoZXMgPSBmYWxzZTtcbiAgICB0aGlzLmRpc3BsYXlDbG9zZXN0QWlycG9ydHMgPSBmYWxzZTtcbiAgICB0aGlzLmRpc3BsYXlBbGxBaXJwb3J0c0xhYmVsID0gZmFsc2U7XG5cbiAgICBpZiAoIXRoaXMuZmlsdGVyZWRBaXJwb3J0cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGFpcnBvcnQgPSB0aGlzLmZpbHRlcmVkQWlycG9ydHMuZmluZCh4ID0+IHgubmFtZSA9PT0gdGhpcy5zZWxlY3RlZE1vZGVsKTtcblxuICAgIGlmIChhaXJwb3J0KSB7XG4gICAgICB0aGlzLmZvY3VzZWRBaXJwb3J0Q29kZSA9IGFpcnBvcnQuY29kZTtcbiAgICB9XG4gIH1cblxuICBnZXRBbGxBaXJwb3J0c0FpcnBvcnRJZChhaXJwb3J0Q29kZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYG5hcy1haXJwb3J0LXNlbGVjdC1kcm9wZG93bi1haXJwb3J0LSR7dGhpcy5jb21wb25lbnRJZH0tYWxsLWFpcnBvcnRzLSR7YWlycG9ydENvZGV9YDtcbiAgfVxuXG4gIGdldENsb3Nlc3RBaXJwb3J0c0FpcnBvcnRJZChhaXJwb3J0Q29kZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYG5hcy1haXJwb3J0LXNlbGVjdC1kcm9wZG93bi1haXJwb3J0LSR7dGhpcy5jb21wb25lbnRJZH0tY2xvc2VzdC1haXJwb3J0cy0ke2FpcnBvcnRDb2RlfWA7XG4gIH1cblxuICBnZXRMYXRlc3RTZWFyY2hlc0FpcnBvcnRJZChhaXJwb3J0Q29kZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYG5hcy1haXJwb3J0LXNlbGVjdC1kcm9wZG93bi1haXJwb3J0LSR7dGhpcy5jb21wb25lbnRJZH0tbGF0ZXN0LXNlYXJjaGVzLSR7YWlycG9ydENvZGV9YDtcbiAgfVxuXG4gIHVwZGF0ZUN1cnJlbnRQb3NpdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5nZW9sb2NhdGlvblN0YXRlID09PSBHZW9sb2NhdGlvblN0YXRlLmRlbmllZFxuICAgICAgfHwgdGhpcy5nZW9sb2NhdGlvblN0YXRlID09PSBHZW9sb2NhdGlvblN0YXRlLnVua25vd24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmdlb2xvY2F0aW9uU2VydmljZS5nZXRDdXJyZW50UG9zaXRpb24oKS5zdWJzY3JpYmUoKHg6IEdlb2xvY2F0aW9uUG9zaXRpb24pID0+IHtcbiAgICAgIHRoaXMucG9zaXRpb25DaGFuZ2UuZW1pdCh4KTtcbiAgICB9LCAoZXJyb3I6IEdlb2xvY2F0aW9uUG9zaXRpb25FcnJvcikgPT4ge1xuICAgICAgaWYgKGVycm9yLlBFUk1JU1NJT05fREVOSUVEKSB7XG4gICAgICAgIHRoaXMuZ2VvbG9jYXRpb25TdGF0ZSA9IEdlb2xvY2F0aW9uU3RhdGUuZGVuaWVkO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2V0T3BlbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vcGVuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vcGVuID0gdHJ1ZTtcbiAgICB0aGlzLm9wZW5DaGFuZ2UuZW1pdCh0cnVlKTtcbiAgfVxuXG4gIG9uR2VvbG9jYXRpb25Ib3Zlcihob3ZlcjogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChob3ZlciAmJiB0aGlzLmdlb2xvY2F0aW9uU3RhdGUgIT09IEdlb2xvY2F0aW9uU3RhdGUuZGVuaWVkKSB7XG4gICAgICB0aGlzLmZvY3VzT25HZW9sb2NhdGlvbiA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9jdXNPbkdlb2xvY2F0aW9uID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYmx1cigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5rZWVwU2VsZWN0aW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTW9kZWwgPSB0aGlzLmxhc3RTZWxlY3RlZE1vZGVsO1xuICAgIH1cblxuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgIHRoaXMub3BlbkNoYW5nZS5lbWl0KGZhbHNlKTtcblxuICAgIGlmICh0aGlzLnNlbGVjdGVkTW9kZWwgPT09IHRoaXMubGFzdFNlbGVjdGVkTW9kZWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZWxlY3RlZE1vZGVsKSB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJlZEFpcnBvcnRzKSB7XG4gICAgICAgIGxldCBhaXJwb3J0ID0gdGhpcy5maWx0ZXJlZEFpcnBvcnRzLmZpbmQoeCA9PiB4Lm5hbWUgPT09IHRoaXMuc2VsZWN0ZWRNb2RlbCk7XG4gICAgICAgIGlmICghYWlycG9ydCkge1xuICAgICAgICAgIGFpcnBvcnQgPSB0aGlzLmZpbHRlcmVkQWlycG9ydHNbMF07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZChhaXJwb3J0KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZCh7XG4gICAgICAgIGFpcnBvcnROYW1lOiAnJyxcbiAgICAgICAgY29kZTogJycsXG4gICAgICAgIGNvdW50cnlOYW1lOiAnJyxcbiAgICAgICAgZGlzcGxheU5hbWU6ICcnLFxuICAgICAgICBuYW1lOiAnJyxcbiAgICAgICAgbm9ybWFsaXplZEFpcnBvcnROYW1lOiAnJ1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZmlsdGVyKCk6IHZvaWQge1xuICAgIGxldCBpc0VtcHR5ID0gZmFsc2U7XG5cbiAgICBpZiAoIXRoaXMubmFzRm9ybUdyb3VwIHx8ICF0aGlzLm5hc0Zvcm1Db250cm9sTmFtZSkge1xuICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkTW9kZWwpIHtcbiAgICAgICAgdGhpcy5yZXNldEZpbHRlcigpO1xuICAgICAgICBpc0VtcHR5ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZEFpcnBvcnRJbmRleCA9IDA7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRBaXJwb3J0cyA9IHRoaXMuc2VsZWN0U2VydmljZS5maWx0ZXIodGhpcy5haXJwb3J0cywgdGhpcy5zZWxlY3RlZE1vZGVsKTtcbiAgICAgICAgdGhpcy5mb2N1c2VkQWlycG9ydENvZGUgPSB0aGlzLmZpbHRlcmVkQWlycG9ydHNbMF0uY29kZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMubmFzRm9ybUdyb3VwLmdldCh0aGlzLm5hc0Zvcm1Db250cm9sTmFtZSk7XG5cbiAgICAgIGlmICghY29udHJvbCB8fCAhY29udHJvbC52YWx1ZSkge1xuICAgICAgICB0aGlzLnJlc2V0RmlsdGVyKCk7XG4gICAgICAgIGlzRW1wdHkgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkQWlycG9ydEluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5maWx0ZXJlZEFpcnBvcnRzID0gdGhpcy5zZWxlY3RTZXJ2aWNlLmZpbHRlcih0aGlzLmFpcnBvcnRzLCBjb250cm9sLnZhbHVlKTtcbiAgICAgICAgdGhpcy5mb2N1c2VkQWlycG9ydENvZGUgPSB0aGlzLmZpbHRlcmVkQWlycG9ydHNbMF0uY29kZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmRpc3BsYXlMYXRlc3RTZWFyY2hlcyA9IGlzRW1wdHk7XG4gICAgdGhpcy5kaXNwbGF5Q2xvc2VzdEFpcnBvcnRzID0gaXNFbXB0eTtcbiAgICB0aGlzLmRpc3BsYXlBbGxBaXJwb3J0c0xhYmVsID0gaXNFbXB0eTtcbiAgfVxuXG4gIGNsZWFyU2VsZWN0ZWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGlmICh0aGlzLmtlZXBTZWxlY3Rpb24pIHtcbiAgICAgIHRoaXMubGFzdFNlbGVjdGVkTW9kZWwgPSB0aGlzLmFpcnBvcnQubmFtZTtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkTW9kZWwgPSAnJztcblxuICAgIHRoaXMudXBkYXRlU2VsZWN0ZWQoe1xuICAgICAgbmFtZTogJycsXG4gICAgICBjb3VudHJ5TmFtZTogJycsXG4gICAgICBjb2RlOiAnJyxcbiAgICAgIGRpc3BsYXlOYW1lOiAnJyxcbiAgICAgIGFpcnBvcnROYW1lOiAnJyxcbiAgICAgIG5vcm1hbGl6ZWRBaXJwb3J0TmFtZTogJydcbiAgICB9KTtcblxuICAgIHRoaXMuZm9jdXNlZEFpcnBvcnRJbmRleCA9IC0xO1xuICAgIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzSW5kZXggPSAtMTtcbiAgICB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydEluZGV4ID0gLTE7XG4gICAgdGhpcy5mb2N1c2VkQWlycG9ydENvZGUgPSAnJztcbiAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0FpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy5maWx0ZXJlZEFpcnBvcnRzID0gdGhpcy5haXJwb3J0cztcblxuICAgIHRoaXMub3BlbiA9IHRydWU7XG4gICAgdGhpcy5kaXNwbGF5TGF0ZXN0U2VhcmNoZXMgPSB0cnVlO1xuICAgIHRoaXMuZGlzcGxheUNsb3Nlc3RBaXJwb3J0cyA9IHRydWU7XG4gICAgdGhpcy5kaXNwbGF5QWxsQWlycG9ydHNMYWJlbCA9IHRydWU7XG4gIH1cblxuICBmb2N1c0Rvd24oKTogdm9pZCB7XG4gICAgY29uc3QgaGFzTGF0ZXN0U2VhcmNoZXMgPSB0aGlzLmFpcnBvcnRTZWxlY3REcm9wZG93blNlcnZpY2VcbiAgICAgIC5oYXNMYXRlc3RTZWFyY2hlcyh0aGlzLmV4aXN0cyh0aGlzLmRpc3BsYXlMYXRlc3RTZWFyY2hlcyksIHRoaXMubGF0ZXN0U2VhcmNoZXMpO1xuXG4gICAgY29uc3QgaGFzQ2xvc2VzdEFpcnBvcnRzID0gdGhpcy5haXJwb3J0U2VsZWN0RHJvcGRvd25TZXJ2aWNlXG4gICAgICAuaGFzQ2xvc2VzdEFpcnBvcnRzKHRoaXMuZXhpc3RzKHRoaXMuZGlzcGxheUNsb3Nlc3RBaXJwb3J0cyksIHRoaXMuY2xvc2VzdEFpcnBvcnRzKTtcblxuICAgIGlmICh0aGlzLmdlb2xvY2F0aW9uU3RhdGUgIT09IG51bGwgJiZcbiAgICAgIHRoaXMuZ2VvbG9jYXRpb25TdGF0ZSAhPT0gR2VvbG9jYXRpb25TdGF0ZS5ncmFudGVkICYmXG4gICAgICB0aGlzLmdlb2xvY2F0aW9uU3RhdGUgIT09IEdlb2xvY2F0aW9uU3RhdGUuZGVuaWVkICYmXG4gICAgICAhdGhpcy5mb2N1c09uR2VvbG9jYXRpb24gJiZcbiAgICAgIHRoaXMuZm9jdXNlZEFpcnBvcnRJbmRleCA9PT0gLTEgJiZcbiAgICAgIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzSW5kZXggPT09IC0xKSB7XG4gICAgICB0aGlzLmZvY3VzT25HZW9sb2NhdGlvbiA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChoYXNMYXRlc3RTZWFyY2hlcyAmJiB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0luZGV4IDwgdGhpcy5sYXRlc3RTZWFyY2hlcy5sZW5ndGggLSAxKSB7XG4gICAgICB0aGlzLmZvY3VzRG93bkxhdGVzdFNlYXJjaGVzKCk7XG4gICAgfSBlbHNlIGlmIChoYXNDbG9zZXN0QWlycG9ydHNcbiAgICAgICYmIHRoaXMuYWlycG9ydFNlbGVjdERyb3Bkb3duU2VydmljZS5pc0luZGV4SW5DbG9zZXN0QWlycG9ydHModGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRJbmRleCwgdGhpcy5jbG9zZXN0QWlycG9ydHMpKSB7XG4gICAgICB0aGlzLmZvY3VzRG93bkNsb3Nlc3RBaXJwb3J0cygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvY3VzRG93bkFpcnBvcnRzKGhhc0Nsb3Nlc3RBaXJwb3J0cywgaGFzTGF0ZXN0U2VhcmNoZXMpO1xuICAgIH1cblxuICAgIHRoaXMuYXV0b1Njcm9sbCg2Nik7XG4gIH1cblxuICBmb2N1c1VwKCk6IHZvaWQge1xuICAgIGNvbnN0IGhhc0xhdGVzdFNlYXJjaGVzID0gdGhpcy5haXJwb3J0U2VsZWN0RHJvcGRvd25TZXJ2aWNlXG4gICAgICAuaGFzTGF0ZXN0U2VhcmNoZXModGhpcy5leGlzdHModGhpcy5kaXNwbGF5TGF0ZXN0U2VhcmNoZXMpLCB0aGlzLmxhdGVzdFNlYXJjaGVzKTtcblxuICAgIGNvbnN0IGhhc0Nsb3Nlc3RBaXJwb3J0cyA9IHRoaXMuYWlycG9ydFNlbGVjdERyb3Bkb3duU2VydmljZVxuICAgICAgLmhhc0Nsb3Nlc3RBaXJwb3J0cyh0aGlzLmV4aXN0cyh0aGlzLmRpc3BsYXlDbG9zZXN0QWlycG9ydHMpLCB0aGlzLmNsb3Nlc3RBaXJwb3J0cyk7XG5cbiAgICBjb25zdCBoYXNHZW9sb2NhdGlvbiA9IHRoaXMuZ2VvbG9jYXRpb25TdGF0ZSAhPT0gbnVsbCAmJlxuICAgICAgdGhpcy5nZW9sb2NhdGlvblN0YXRlICE9PSBHZW9sb2NhdGlvblN0YXRlLmdyYW50ZWQgJiZcbiAgICAgIHRoaXMuZ2VvbG9jYXRpb25TdGF0ZSAhPT0gR2VvbG9jYXRpb25TdGF0ZS5kZW5pZWQgJiZcbiAgICAgICF0aGlzLmZvY3VzT25HZW9sb2NhdGlvbjtcblxuICAgIGlmICh0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXggPiAwKSB7XG4gICAgICB0aGlzLmZvY3VzVXBBaXJwb3J0cyhoYXNDbG9zZXN0QWlycG9ydHMsIGhhc0xhdGVzdFNlYXJjaGVzKTtcbiAgICB9IGVsc2UgaWYgKGhhc0Nsb3Nlc3RBaXJwb3J0cyAmJiB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXggPD0gMCAmJiB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydEluZGV4ID4gMCkge1xuICAgICAgdGhpcy5mb2N1c1VwQ2xvc2VzdEFpcnBvcnRzKGhhc0xhdGVzdFNlYXJjaGVzKTtcbiAgICB9IGVsc2UgaWYgKGhhc0xhdGVzdFNlYXJjaGVzICYmIGhhc0Nsb3Nlc3RBaXJwb3J0cyAmJiB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydEluZGV4IDw9IDBcbiAgICAgIHx8IGhhc0xhdGVzdFNlYXJjaGVzICYmICFoYXNDbG9zZXN0QWlycG9ydHMgJiYgdGhpcy5mb2N1c2VkQWlycG9ydEluZGV4IDw9IDApIHtcbiAgICAgIHRoaXMuZm9jdXNVcExhdGVzdFNlYXJjaGVzKCk7XG4gICAgfSBlbHNlIGlmIChoYXNHZW9sb2NhdGlvbiAmJiBoYXNMYXRlc3RTZWFyY2hlcyAmJiB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0luZGV4IDw9IDBcbiAgICAgIHx8IGhhc0dlb2xvY2F0aW9uICYmICFoYXNMYXRlc3RTZWFyY2hlcyAmJiB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXggPD0gMCkge1xuICAgICAgdGhpcy5mb2N1c09uR2VvbG9jYXRpb24gPSB0cnVlO1xuICAgICAgdGhpcy5mb2N1c2VkQWlycG9ydENvZGUgPSAnJztcbiAgICAgIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzQWlycG9ydENvZGUgPSAnJztcbiAgICAgIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzSW5kZXggPSAtMTtcbiAgICAgIHRoaXMuZm9jdXNlZEFpcnBvcnRJbmRleCA9IC0xO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJsdXIoKTtcbiAgICB9XG5cbiAgICB0aGlzLmF1dG9TY3JvbGwoNjYpO1xuICB9XG5cbiAgc2V0U2VsZWN0ZWQoYWlycG9ydDogQWlycG9ydE1vZGVsKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVTZWxlY3RlZChhaXJwb3J0KTtcbiAgICB0aGlzLm9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLm9wZW5DaGFuZ2UuZW1pdChmYWxzZSk7XG4gIH1cblxuICBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnRXNjYXBlJzpcbiAgICAgICAgdGhpcy5vcGVuID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmtlZXBTZWxlY3Rpb24gJiYgIXRoaXMuYWlycG9ydC5uYW1lKSB7XG4gICAgICAgICAgdGhpcy5ibHVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdUYWInOlxuICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgICBpZiAodGhpcy5maWx0ZXJlZEFpcnBvcnRzKSB7XG4gICAgICAgICAgY29uc3QgYWlycG9ydCA9IHRoaXMuZmlsdGVyZWRBaXJwb3J0cy5maW5kKHggPT4geC5jb2RlID09PSB0aGlzLmZvY3VzZWRBaXJwb3J0Q29kZSkgfHwgdGhpcy5maWx0ZXJlZEFpcnBvcnRzWzBdO1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNb2RlbCA9IGFpcnBvcnQubmFtZSB8fCAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmZvY3VzT25HZW9sb2NhdGlvbikge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy51cGRhdGVDdXJyZW50UG9zaXRpb24oKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5ibHVyKCk7XG4gICAgICAgICAgaWYgKCFldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNPbk5leHQuZW1pdChldmVudCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNPblByZXZpb3VzLmVtaXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzT25OZXh0LmVtaXQoZXZlbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgIGNhc2UgJ0Rvd24nOlxuICAgICAgICB0aGlzLmZvY3VzRG93bigpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgY2FzZSAnVXAnOlxuICAgICAgICB0aGlzLmZvY3VzVXAoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdCYWNrc3BhY2UnOlxuICAgICAgY2FzZSAnRGVsZXRlJzpcbiAgICAgICAgaWYgKHRoaXMua2VlcFNlbGVjdGlvbikge1xuICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkTW9kZWwgPSB0aGlzLmFpcnBvcnQubmFtZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRGaWx0ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c2VkQWlycG9ydEluZGV4ID0gLTE7XG4gICAgdGhpcy5mb2N1c2VkTGF0ZXN0U2VhcmNoZXNJbmRleCA9IC0xO1xuICAgIHRoaXMuZm9jdXNlZENsb3Nlc3RBaXJwb3J0SW5kZXggPSAtMTtcbiAgICB0aGlzLmZvY3VzZWRBaXJwb3J0Q29kZSA9ICcnO1xuICAgIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzQWlycG9ydENvZGUgPSAnJztcbiAgICB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydENvZGUgPSAnJztcbiAgICB0aGlzLmZpbHRlcmVkQWlycG9ydHMgPSB0aGlzLmFpcnBvcnRzO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTZWxlY3RlZChhaXJwb3J0OiBBaXJwb3J0TW9kZWwpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkTW9kZWwgPSBhaXJwb3J0Lm5hbWU7XG4gICAgaWYgKHRoaXMua2VlcFNlbGVjdGlvbiAmJiBhaXJwb3J0Lm5hbWUubGVuZ3RoKSB7XG4gICAgICB0aGlzLmxhc3RTZWxlY3RlZE1vZGVsID0gYWlycG9ydC5uYW1lO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdGVkLmVtaXQoYWlycG9ydCk7XG4gIH1cblxuICBwcml2YXRlIGZvY3VzRG93bkxhdGVzdFNlYXJjaGVzKCk6IHZvaWQge1xuICAgIHRoaXMuZm9jdXNPbkdlb2xvY2F0aW9uID0gZmFsc2U7XG5cbiAgICBsZXQgaW5kZXggPSB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0luZGV4O1xuXG4gICAgaW5kZXggPSBpbmRleCArIDE7XG5cbiAgICBjb25zdCBhaXJwb3J0ID0gdGhpcy5sYXRlc3RTZWFyY2hlc1tpbmRleF07XG5cbiAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0luZGV4ID0gaW5kZXg7XG4gICAgdGhpcy5mb2N1c2VkTGF0ZXN0U2VhcmNoZXNBaXJwb3J0Q29kZSA9IGFpcnBvcnQuY29kZTtcbiAgICB0aGlzLmZvY3VzZWRBaXJwb3J0Q29kZSA9ICcnO1xuICAgIHRoaXMuZm9jdXNlZENsb3Nlc3RBaXJwb3J0Q29kZSA9ICcnO1xuICAgIHRoaXMudXBkYXRlU2VsZWN0ZWQoYWlycG9ydCk7XG4gIH1cblxuICBwcml2YXRlIGZvY3VzRG93bkNsb3Nlc3RBaXJwb3J0cygpOiB2b2lkIHtcbiAgICBsZXQgaW5kZXggPSB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydEluZGV4O1xuXG4gICAgaW5kZXggPSBpbmRleCArIDE7XG5cbiAgICBjb25zdCBhaXJwb3J0ID0gdGhpcy5jbG9zZXN0QWlycG9ydHNbaW5kZXhdO1xuXG4gICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRJbmRleCA9IGluZGV4O1xuICAgIHRoaXMuZm9jdXNlZENsb3Nlc3RBaXJwb3J0Q29kZSA9IGFpcnBvcnQuY29kZSB8fCAnJztcbiAgICB0aGlzLmZvY3VzZWRBaXJwb3J0Q29kZSA9ICcnO1xuICAgIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzQWlycG9ydENvZGUgPSAnJztcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkKGFpcnBvcnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb2N1c0Rvd25BaXJwb3J0cyhoYXNDbG9zZXN0QWlycG9ydHM6IGJvb2xlYW4sIGhhc0xhdGVzdFNlYXJjaGVzOiBib29sZWFuKTogdm9pZCB7XG4gICAgbGV0IGluZGV4ID0gdGhpcy5mb2N1c2VkQWlycG9ydEluZGV4O1xuICAgIHRoaXMuZm9jdXNPbkdlb2xvY2F0aW9uID0gZmFsc2U7XG5cbiAgICBpbmRleCA9IGluZGV4ICsgMTtcblxuICAgIGlmICh0aGlzLmZpbHRlcmVkQWlycG9ydHMgJiYgaW5kZXggPiB0aGlzLmZpbHRlcmVkQWlycG9ydHMubGVuZ3RoIC0gMSkge1xuICAgICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRJbmRleCA9IC0xO1xuICAgICAgdGhpcy5mb2N1c2VkTGF0ZXN0U2VhcmNoZXNJbmRleCA9IC0xO1xuICAgICAgdGhpcy5mb2N1c2VkQWlycG9ydEluZGV4ID0gLTE7XG5cbiAgICAgIGlmICh0aGlzLmdlb2xvY2F0aW9uU3RhdGUgIT09IEdlb2xvY2F0aW9uU3RhdGUuZ3JhbnRlZCkge1xuICAgICAgICB0aGlzLmZvY3VzT25HZW9sb2NhdGlvbiA9IHRydWU7XG4gICAgICAgIHRoaXMuZm9jdXNlZEFpcnBvcnRDb2RlID0gJyc7XG4gICAgICAgIHRoaXMuZm9jdXNlZENsb3Nlc3RBaXJwb3J0Q29kZSA9ICcnO1xuICAgICAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0FpcnBvcnRDb2RlID0gJyc7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAoaGFzTGF0ZXN0U2VhcmNoZXMpIHtcbiAgICAgICAgdGhpcy5mb2N1c0Rvd25MYXRlc3RTZWFyY2hlcygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKGhhc0Nsb3Nlc3RBaXJwb3J0cykge1xuICAgICAgICB0aGlzLmZvY3VzRG93bkNsb3Nlc3RBaXJwb3J0cygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5mb2N1c2VkQWlycG9ydEluZGV4ID0gaW5kZXg7XG5cbiAgICBpZiAodGhpcy5maWx0ZXJlZEFpcnBvcnRzKSB7XG4gICAgICBjb25zdCBhaXJwb3J0ID0gdGhpcy5maWx0ZXJlZEFpcnBvcnRzW2luZGV4XTtcblxuICAgICAgaWYgKGFpcnBvcnQpIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkQWlycG9ydENvZGUgPSBhaXJwb3J0LmNvZGU7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRNb2RlbCA9IGFpcnBvcnQubmFtZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0FpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRDb2RlID0gJyc7XG4gIH1cblxuICBwcml2YXRlIGZvY3VzVXBBaXJwb3J0cyhoYXNDbG9zZXN0QWlycG9ydHM6IGJvb2xlYW4sIGhhc0xhdGVzdFNlYXJjaGVzOiBib29sZWFuKTogdm9pZCB7XG4gICAgbGV0IGluZGV4ID0gdGhpcy5mb2N1c2VkQWlycG9ydEluZGV4O1xuICAgIHRoaXMuZm9jdXNPbkdlb2xvY2F0aW9uID0gZmFsc2U7XG5cbiAgICBpZiAoaW5kZXggLSAxIDwgMCkge1xuICAgICAgdGhpcy5mb2N1c2VkQWlycG9ydEluZGV4ID0gLTE7XG4gICAgICB0aGlzLmZvY3VzZWRBaXJwb3J0Q29kZSA9ICcnO1xuICAgICAgdGhpcy5ibHVyKCk7XG5cbiAgICAgIGlmICghaGFzQ2xvc2VzdEFpcnBvcnRzKSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZENsb3Nlc3RBaXJwb3J0Q29kZSA9ICcnO1xuICAgICAgfVxuICAgICAgaWYgKCFoYXNMYXRlc3RTZWFyY2hlcykge1xuICAgICAgICB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydENvZGUgPSAnJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGluZGV4ID0gaW5kZXggLSAxO1xuXG4gICAgdGhpcy5mb2N1c2VkQWlycG9ydEluZGV4ID0gaW5kZXg7XG4gICAgdGhpcy5mb2N1c2VkTGF0ZXN0U2VhcmNoZXNBaXJwb3J0Q29kZSA9ICcnO1xuICAgIHRoaXMuZm9jdXNlZENsb3Nlc3RBaXJwb3J0Q29kZSA9ICcnO1xuXG4gICAgaWYgKHRoaXMuZmlsdGVyZWRBaXJwb3J0cykge1xuICAgICAgY29uc3QgYWlycG9ydCA9IHRoaXMuZmlsdGVyZWRBaXJwb3J0c1tpbmRleF07XG5cbiAgICAgIGlmIChhaXJwb3J0KSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZEFpcnBvcnRDb2RlID0gYWlycG9ydC5jb2RlO1xuICAgICAgICB0aGlzLnNlbGVjdGVkTW9kZWwgPSBhaXJwb3J0Lm5hbWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhdXRvU2Nyb2xsKGV4dHJhT2Zmc2V0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucmVzdWx0cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHRzID0gdGhpcy5yZXN1bHRzLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgZm9jdXNlZEl0ZW0gPSB0aGlzLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5uYXMtYWlycG9ydC1zZWxlY3RfX2xpc3QtaXRlbS0tZm9jdXMnKTtcblxuICAgIGlmIChmb2N1c2VkSXRlbSkge1xuICAgICAgcmVzdWx0cy5zY3JvbGxUbygwLCAwKTtcbiAgICAgIHJlc3VsdHMuc2Nyb2xsVG8oMCwgZm9jdXNlZEl0ZW0ub2Zmc2V0VG9wICsgZXh0cmFPZmZzZXQgLSByZXN1bHRzLmNsaWVudEhlaWdodCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmb2N1c1VwTGF0ZXN0U2VhcmNoZXMoKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c09uR2VvbG9jYXRpb24gPSBmYWxzZTtcblxuICAgIGxldCBsYXRlc3RTZWFyY2hlc0luZGV4ID0gdGhpcy5mb2N1c2VkTGF0ZXN0U2VhcmNoZXNJbmRleDtcblxuICAgIGlmIChsYXRlc3RTZWFyY2hlc0luZGV4IDwgMCkge1xuICAgICAgdGhpcy5mb2N1c2VkTGF0ZXN0U2VhcmNoZXNJbmRleCA9IC0xO1xuICAgICAgdGhpcy5mb2N1c2VkTGF0ZXN0U2VhcmNoZXNBaXJwb3J0Q29kZSA9ICcnO1xuICAgICAgdGhpcy5ibHVyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2xvc2VzdEFpcnBvcnRJbmRleCA9IHRoaXMuZm9jdXNlZENsb3Nlc3RBaXJwb3J0SW5kZXg7XG4gICAgY29uc3QgYWlycG9ydHNJbmRleCA9IHRoaXMuZm9jdXNlZEFpcnBvcnRJbmRleDtcblxuICAgIGlmIChjbG9zZXN0QWlycG9ydEluZGV4IDwgMCAmJiBhaXJwb3J0c0luZGV4IDwgMCkge1xuICAgICAgbGF0ZXN0U2VhcmNoZXNJbmRleCA9IGxhdGVzdFNlYXJjaGVzSW5kZXggLSAxO1xuXG4gICAgICBpZiAobGF0ZXN0U2VhcmNoZXNJbmRleCA8IDApIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkTGF0ZXN0U2VhcmNoZXNJbmRleCA9IC0xO1xuICAgICAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0FpcnBvcnRDb2RlID0gJyc7XG4gICAgICAgIHRoaXMuYmx1cigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYWlycG9ydCA9IHRoaXMubGF0ZXN0U2VhcmNoZXNbbGF0ZXN0U2VhcmNoZXNJbmRleF07XG5cbiAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0luZGV4ID0gbGF0ZXN0U2VhcmNoZXNJbmRleDtcbiAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0FpcnBvcnRDb2RlID0gYWlycG9ydC5jb2RlO1xuICAgIHRoaXMuZm9jdXNlZENsb3Nlc3RBaXJwb3J0Q29kZSA9ICcnO1xuICAgIHRoaXMuZm9jdXNlZENsb3Nlc3RBaXJwb3J0SW5kZXggPSAtMTtcbiAgICB0aGlzLmZvY3VzZWRBaXJwb3J0Q29kZSA9ICcnO1xuICAgIHRoaXMuZm9jdXNlZEFpcnBvcnRJbmRleCA9IC0xO1xuICAgIHRoaXMudXBkYXRlU2VsZWN0ZWQoYWlycG9ydCk7XG4gIH1cblxuICBwcml2YXRlIGZvY3VzVXBDbG9zZXN0QWlycG9ydHMoaGFzTGF0ZXN0U2VhcmNoZXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBsZXQgY2xvc2VzdEFpcnBvcnRJbmRleCA9IHRoaXMuZm9jdXNlZENsb3Nlc3RBaXJwb3J0SW5kZXg7XG5cbiAgICBpZiAoIWhhc0xhdGVzdFNlYXJjaGVzICYmIGNsb3Nlc3RBaXJwb3J0SW5kZXggPD0gMCkge1xuICAgICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRJbmRleCA9IC0xO1xuICAgICAgdGhpcy5ibHVyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNsb3Nlc3RBaXJwb3J0SW5kZXggLSAxIDwgMCkge1xuICAgICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRJbmRleCA9IC0xO1xuICAgICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRDb2RlID0gJyc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZm9jdXNlZEFpcnBvcnRJbmRleCA8IDApIHtcbiAgICAgIGNsb3Nlc3RBaXJwb3J0SW5kZXggPSBjbG9zZXN0QWlycG9ydEluZGV4IC0gMTtcbiAgICB9XG5cbiAgICBjb25zdCBhaXJwb3J0ID0gdGhpcy5jbG9zZXN0QWlycG9ydHNbY2xvc2VzdEFpcnBvcnRJbmRleF07XG4gICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRJbmRleCA9IGNsb3Nlc3RBaXJwb3J0SW5kZXg7XG4gICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRDb2RlID0gYWlycG9ydC5jb2RlO1xuICAgIHRoaXMuZm9jdXNlZEFpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy5mb2N1c2VkQWlycG9ydEluZGV4ID0gLTE7XG5cbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkKGFpcnBvcnQpO1xuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiIW5hc0Zvcm1Db250cm9sTmFtZTsgZWxzZSByZWFjdGl2ZUZvcm1cIj5cbiAgPGxhYmVsIFtpZF09XCJsYWJlbElkXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFpcnBvcnRTZWxlY3RMYWJlbFwiXG4gICAgW25hc0NsYXNzXT1cImdldENsYXNzKCd3cmFwcGVyJywgb3BlbiAmJiAnYWN0aXZlJylcIj5cbiAgICA8c3BhbiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2xhYmVsJylcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhaXJwb3J0U2VsZWN0TGFiZWw7IGVsc2UgZW1wdHlMYWJlbFwiPnt7YWlycG9ydFNlbGVjdExhYmVsfX08L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZW1wdHlMYWJlbD4mbmJzcDs8L25nLXRlbXBsYXRlPlxuICAgIDwvc3Bhbj5cbiAgICA8aW5wdXQgI2FpcnBvcnRTZWxlY3RcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIHJvbGU9XCJjb21ib2JveFwiXG4gICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgYXJpYS1oYXNwb3B1cD1cImxpc3Rib3hcIlxuICAgICAgYXJpYS1hdXRvY29tcGxldGU9XCJub25lXCJcbiAgICAgIFtpZF09XCJpbnB1dElkXCJcbiAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwicmVzdWx0c0lkXCJcbiAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwib3BlbiA/ICd0cnVlJyA6ICdmYWxzZSdcIlxuICAgICAgW2F0dHIuYXJpYS1vd25zXT1cInJlc3VsdHNJZFwiXG4gICAgICBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2lucHV0JylcIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cImFpcnBvcnRTZWxlY3RQbGFjZWhvbGRlclwiXG4gICAgICAoZm9jdXMpPVwic2V0T3BlbigpXCJcbiAgICAgIChtb3VzZWRvd24pPVwic2V0T3BlbigpXCJcbiAgICAgIChpbnB1dCk9XCJmaWx0ZXIoKVwiXG4gICAgICAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiXG4gICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkTW9kZWxcIiAvPlxuICAgIDxzcGFuIFtuYXNDbGFzc109XCJnZXRDbGFzcygnaWNvbicpXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICpuZ0lmPVwic2VsZWN0ZWRNb2RlbDsgZWxzZSBpc0VtcHR5XCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxDbGVhclwiXG4gICAgICAgIChjbGljayk9XCJjbGVhclNlbGVjdGVkKCRldmVudClcIj5cbiAgICAgICAgPG5hcy1pY29uIFt0eXBlXT1cIidyZW1vdmUnXCI+PC9uYXMtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPG5nLXRlbXBsYXRlICNpc0VtcHR5PlxuICAgICAgICA8bmFzLWljb24gW3R5cGVdPVwiJ3NtYWxsJ1wiXG4gICAgICAgICAgW2ljb25dPVwiYWlycG9ydFNlbGVjdEljb25Nb2RpZmllclwiPjwvbmFzLWljb24+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvc3Bhbj5cbiAgPC9sYWJlbD5cbjwvbmctY29udGFpbmVyPlxuPG5nLXRlbXBsYXRlICNyZWFjdGl2ZUZvcm0+XG4gIDxsYWJlbCBbaWRdPVwibGFiZWxJZFwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhaXJwb3J0U2VsZWN0TGFiZWxcIlxuICAgIFtuYXNDbGFzc109XCJnZXRDbGFzcygnd3JhcHBlcicsIG9wZW4gJiYgJ2FjdGl2ZScpXCJcbiAgICBbZm9ybUdyb3VwXT1cIm5hc0Zvcm1Hcm91cFwiPlxuICAgIDxzcGFuIFtuYXNDbGFzc109XCJnZXRDbGFzcygnbGFiZWwnKVwiXG4gICAgICAqbmdJZj1cImFpcnBvcnRTZWxlY3RMYWJlbFwiPnt7YWlycG9ydFNlbGVjdExhYmVsfX08L3NwYW4+XG4gICAgPGlucHV0ICNhaXJwb3J0U2VsZWN0XG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICByb2xlPVwiY29tYm9ib3hcIlxuICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgIGFyaWEtYXV0b2NvbXBsZXRlPVwibm9uZVwiXG4gICAgICBbaWRdPVwiaW5wdXRJZFwiXG4gICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cInJlc3VsdHNJZFwiXG4gICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cIm9wZW4gPyAndHJ1ZScgOiAnZmFsc2UnXCJcbiAgICAgIFthdHRyLmFyaWEtb3duc109XCJyZXN1bHRzSWRcIlxuICAgICAgW25hc0NsYXNzXT1cImdldENsYXNzKCdpbnB1dCcpXCJcbiAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwibmFzRm9ybUNvbnRyb2xOYW1lXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJhaXJwb3J0U2VsZWN0UGxhY2Vob2xkZXJcIlxuICAgICAgKG1vdXNlZG93bik9XCJzZXRPcGVuKClcIlxuICAgICAgKGZvY3VzKT1cInNldE9wZW4oKVwiXG4gICAgICAoaW5wdXQpPVwiZmlsdGVyKClcIlxuICAgICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIiAvPlxuICAgIDxzcGFuIFtuYXNDbGFzc109XCJnZXRDbGFzcygnaWNvbicpXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICpuZ0lmPVwic2VsZWN0ZWRNb2RlbDsgZWxzZSBpc0VtcHR5XCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxDbGVhclwiXG4gICAgICAgIChjbGljayk9XCJjbGVhclNlbGVjdGVkKCRldmVudClcIj5cbiAgICAgICAgPG5hcy1pY29uIFt0eXBlXT1cIidyZW1vdmUnXCI+PC9uYXMtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPG5nLXRlbXBsYXRlICNpc0VtcHR5PlxuICAgICAgICA8bmFzLWljb24gW3R5cGVdPVwiJ3NtYWxsJ1wiXG4gICAgICAgICAgW2ljb25dPVwiYWlycG9ydFNlbGVjdEljb25Nb2RpZmllclwiPjwvbmFzLWljb24+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvc3Bhbj5cbiAgPC9sYWJlbD5cbjwvbmctdGVtcGxhdGU+XG48ZGl2IFtuYXNDbGFzc109XCJnZXRDbGFzcygncmVzdWx0cy13cmFwcGVyJylcIlxuICBbaWRdPVwicmVzdWx0c0lkXCJcbiAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJvcGVuID8gJ3RydWUnIDogJ2ZhbHNlJ1wiPlxuICA8dWwgI3Jlc3VsdHNcbiAgICByb2xlPVwibGlzdGJveFwiXG4gICAgKm5nSWY9XCJvcGVuXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwibGFiZWxJZFwiXG4gICAgW25hc0NsYXNzXT1cImdldENsYXNzKCdyZXN1bHRzJylcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZXhpc3RzKGVuYWJsZUdlb2xvY2F0aW9uKSAmJiBnZW9sb2NhdGlvblN0YXRlICE9PSBudWxsICYmIGdlb2xvY2F0aW9uU3RhdGUgIT09IDAgJiYgaXNWYWxpZFwiPlxuICAgICAgPGxpIHJvbGU9XCJvcHRpb25cIj5cbiAgICAgICAgPG5hcy1idXR0b24gbGlua1xuICAgICAgICAgIHNlY29uZGFyeVxuICAgICAgICAgIFtkaXNhYmxlZF09XCJnZW9sb2NhdGlvblN0YXRlID09PSAyXCJcbiAgICAgICAgICBbY3NzU3R5bGVdPVwieydoZWlnaHQnOiAnNjZweCcsICd0ZXh0LWRlY29yYXRpb24nOiAndW5kZXJsaW5lJywgJ2Rpc3BsYXknOiAnZmxleCcsICdqdXN0aWZ5LWNvbnRlbnQnOiAnc3BhY2UtYmV0d2Vlbid9XCJcbiAgICAgICAgICBbY3NzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2l0ZW0nLCBbJ2dlb2xvY2F0aW9uJywgZm9jdXNPbkdlb2xvY2F0aW9uICYmIGdlb2xvY2F0aW9uU3RhdGUgIT09IDIgJiYgJ2ZvY3VzJywgZ2VvbG9jYXRpb25TdGF0ZSA9PT0gMiAmJiAnZGlzYWJsZWQnXSlcIlxuICAgICAgICAgIFt0YWJpbmRleF09XCItMVwiXG4gICAgICAgICAgKGNsaWNrQ2hhbmdlKT1cInVwZGF0ZUN1cnJlbnRQb3NpdGlvbigpXCJcbiAgICAgICAgICAobW91c2VlbnRlcik9XCJvbkdlb2xvY2F0aW9uSG92ZXIodHJ1ZSlcIlxuICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uR2VvbG9jYXRpb25Ib3ZlcihmYWxzZSlcIj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdlb2xvY2F0aW9uU3RhdGUgPT09IDE7IGVsc2UgZ2VvbG9jYXRpb25EZW5pZWRcIlxuICAgICAgICAgICAgW25hc0NsYXNzXT1cImdldENsYXNzKCdnZW9sb2NhdGlvbicsICdsYWJlbCcpXCI+e3tyZXN1bHRzTGFiZWxzPy5nZW9sb2NhdGlvbn19PC9zcGFuPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZ2VvbG9jYXRpb25EZW5pZWQ+XG4gICAgICAgICAgICA8c3BhbiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2dlb2xvY2F0aW9uJywgJ2xhYmVsJylcIj57e3Jlc3VsdHNMYWJlbHM/Lmdlb2xvY2F0aW9uRGVuaWVkfX08L3NwYW4+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmFzLWljb24gW25hc0NsYXNzXT1cImdldENsYXNzKCdnZW9sb2NhdGlvbicsICdpY29uJylcIlxuICAgICAgICAgICAgW3R5cGVdPVwiZ2VvbG9jYXRpb25JY29uXCI+PC9uYXMtaWNvbj5cbiAgICAgICAgPC9uYXMtYnV0dG9uPlxuICAgICAgPC9saT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bGkgcm9sZT1cInNlcGFyYXRvclwiXG4gICAgICBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2xpc3Qtc2VjdGlvbi1sYWJlbCcpXCJcbiAgICAgICpuZ0lmPVwibGF0ZXN0U2VhcmNoZXM/Lmxlbmd0aCA+IDBcbiAgICAgICYmIGV4aXN0cyhkaXNwbGF5TGF0ZXN0U2VhcmNoZXMpXG4gICAgICAmJiByZXN1bHRzTGFiZWxzPy5sYXRlc3RTZWFyY2hlc1xuICAgICAgJiYgaXNWYWxpZFwiPlxuICAgICAgPHNwYW4+e3tyZXN1bHRzTGFiZWxzPy5sYXRlc3RTZWFyY2hlc319PC9zcGFuPlxuICAgIDwvbGk+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImV4aXN0cyhkaXNwbGF5TGF0ZXN0U2VhcmNoZXMpICYmIGlzVmFsaWRcIj5cbiAgICAgIDxsaSByb2xlPVwib3B0aW9uXCJcbiAgICAgICAgKm5nRm9yPVwibGV0IGFpcnBvcnQgb2YgbGF0ZXN0U2VhcmNoZXNcIlxuICAgICAgICBbaWRdPVwiZ2V0TGF0ZXN0U2VhcmNoZXNBaXJwb3J0SWQoYWlycG9ydC5jb2RlKVwiXG4gICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiYWlycG9ydC5jb2RlID09PSBmb2N1c2VkTGF0ZXN0U2VhcmNoZXNBaXJwb3J0Q29kZVwiXG4gICAgICAgIFtuYXNDbGFzc109XCJnZXRDbGFzcygnbGlzdC1pdGVtJywgYWlycG9ydC5jb2RlID09PSBmb2N1c2VkTGF0ZXN0U2VhcmNoZXNBaXJwb3J0Q29kZSAmJiAnZm9jdXMnKVwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIFtuYXNDbGFzc109XCJnZXRDbGFzcygnaXRlbScsIGFpcnBvcnQuY29kZSA9PT0gZm9jdXNlZExhdGVzdFNlYXJjaGVzQWlycG9ydENvZGUgJiYgJ2ZvY3VzJylcIlxuICAgICAgICAgIChjbGljayk9XCJzZXRTZWxlY3RlZChhaXJwb3J0KVwiXG4gICAgICAgICAgdGFiaW5kZXg9XCItMVwiPlxuICAgICAgICAgIDxzcGFuIFtuYXNDbGFzc109XCJnZXRDbGFzcygnbmFtZScpXCI+e3thaXJwb3J0Lm5hbWV9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2NvZGUnKVwiPjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2NvdW50cnknKVwiPnt7YWlycG9ydC5jb3VudHJ5TmFtZX19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbGk+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPGxpIHJvbGU9XCJzZXBhcmF0b3JcIlxuICAgICAgKm5nSWY9XCJleGlzdHMoZGlzcGxheUNsb3Nlc3RBaXJwb3J0cylcbiAgICAgICAmJiBnZW9sb2NhdGlvblN0YXRlICE9PSBudWxsXG4gICAgICAgJiYgZ2VvbG9jYXRpb25TdGF0ZSA9PT0gMFxuICAgICAgICYmIGNsb3Nlc3RBaXJwb3J0cz8ubGVuZ3RoID4gMFxuICAgICAgICYmIHJlc3VsdHNMYWJlbHM/LmNsb3Nlc3RBaXJwb3J0c1xuICAgICAgICYmIGlzVmFsaWRcIlxuICAgICAgW25hc0NsYXNzXT1cImdldENsYXNzKCdsaXN0LXNlY3Rpb24tbGFiZWwnKVwiPlxuICAgICAgPHNwYW4+e3tyZXN1bHRzTGFiZWxzPy5jbG9zZXN0QWlycG9ydHN9fTwvc3Bhbj5cbiAgICA8L2xpPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJleGlzdHMoZGlzcGxheUNsb3Nlc3RBaXJwb3J0cykgJiYgZ2VvbG9jYXRpb25TdGF0ZSA9PT0gMCAmJiBpc1ZhbGlkXCI+XG4gICAgICA8bGkgcm9sZT1cIm9wdGlvblwiXG4gICAgICAgICpuZ0Zvcj1cImxldCBhaXJwb3J0IG9mIGNsb3Nlc3RBaXJwb3J0c1wiXG4gICAgICAgIFtpZF09XCJnZXRDbG9zZXN0QWlycG9ydHNBaXJwb3J0SWQoYWlycG9ydC5jb2RlKVwiXG4gICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiYWlycG9ydC5jb2RlID09PSBmb2N1c2VkQ2xvc2VzdEFpcnBvcnRDb2RlXCJcbiAgICAgICAgW25hc0NsYXNzXT1cImdldENsYXNzKCdsaXN0LWl0ZW0nLCBhaXJwb3J0LmNvZGUgPT09IGZvY3VzZWRDbG9zZXN0QWlycG9ydENvZGUgJiYgJ2ZvY3VzJylcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2l0ZW0nLCBhaXJwb3J0LmNvZGUgPT09IGZvY3VzZWRDbG9zZXN0QWlycG9ydENvZGUgJiYgJ2ZvY3VzJylcIlxuICAgICAgICAgIChjbGljayk9XCJzZXRTZWxlY3RlZChhaXJwb3J0KVwiXG4gICAgICAgICAgdGFiaW5kZXg9XCItMVwiPlxuICAgICAgICAgIDxzcGFuIFtuYXNDbGFzc109XCJnZXRDbGFzcygnbmFtZScpXCI+e3thaXJwb3J0Lm5hbWV9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2NvZGUnKVwiPjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2NvdW50cnknKVwiPnt7YWlycG9ydC5jb3VudHJ5TmFtZX19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbGk+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPGxpIHJvbGU9XCJzZXBhcmF0b3JcIlxuICAgICAgW25hc0NsYXNzXT1cImdldENsYXNzKCdsaXN0LXNlY3Rpb24tbGFiZWwnKVwiXG4gICAgICAqbmdJZj1cImRpc3BsYXlBbGxBaXJwb3J0c0xhYmVsICYmIHJlc3VsdHNMYWJlbHM/LmFsbEFpcnBvcnRzICYmIGlzVmFsaWRcIj5cbiAgICAgIDxzcGFuPnt7cmVzdWx0c0xhYmVscz8uYWxsQWlycG9ydHN9fTwvc3Bhbj5cbiAgICA8L2xpPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1ZhbGlkXCI+XG4gICAgICA8bGkgcm9sZT1cIm9wdGlvblwiXG4gICAgICAgICpuZ0Zvcj1cImxldCBhaXJwb3J0IG9mIGZpbHRlcmVkQWlycG9ydHNcIlxuICAgICAgICBbaWRdPVwiZ2V0QWxsQWlycG9ydHNBaXJwb3J0SWQoYWlycG9ydC5jb2RlKVwiXG4gICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiYWlycG9ydC5jb2RlID09PSBmb2N1c2VkQWlycG9ydENvZGVcIlxuICAgICAgICBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2xpc3QtaXRlbScsIGFpcnBvcnQuY29kZSA9PT0gZm9jdXNlZEFpcnBvcnRDb2RlICYmICdmb2N1cycpXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgW25hc0NsYXNzXT1cImdldENsYXNzKCdpdGVtJywgYWlycG9ydC5jb2RlID09PSBmb2N1c2VkQWlycG9ydENvZGUgJiYgJ2ZvY3VzJylcIlxuICAgICAgICAgIChjbGljayk9XCJzZXRTZWxlY3RlZChhaXJwb3J0KVwiXG4gICAgICAgICAgdGFiaW5kZXg9XCItMVwiPlxuICAgICAgICAgIDxzcGFuIFtuYXNDbGFzc109XCJnZXRDbGFzcygnbmFtZScpXCI+e3thaXJwb3J0Lm5hbWV9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2NvZGUnKVwiPjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2NvdW50cnknKVwiPnt7YWlycG9ydC5jb3VudHJ5TmFtZX19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbGk+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPGxpICpuZ0lmPVwiIWlzVmFsaWRcIlxuICAgICAgcm9sZT1cImxpc3RpdGVtXCI+XG4gICAgICA8c3BhbiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ25hbWUnLCAnaW52YWxpZCcpXCI+e3tpbnZhbGlkVGV4dH19PC9zcGFuPlxuICAgIDwvbGk+XG4gIDwvdWw+XG48L2Rpdj5cbjxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gIHRhYmluZGV4PVwiMFwiXG4gICpuZ0lmPVwib3BlblwiXG4gIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsQmFja2Ryb3BcIlxuICBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2JhY2tkcm9wJylcIlxuICAoY2xpY2spPVwiYmx1cigpXCI+PC9idXR0b24+Il19