@bikdotai/bik-component-library 0.0.788-beta.8 → 0.0.788

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 (1583) hide show
  1. package/dist/cjs/assets/icons/Ai_event_generating.svg.js +1 -1
  2. package/dist/cjs/assets/icons/DocsIcon.d.ts +6 -0
  3. package/dist/cjs/assets/icons/DocsIcon.js +1 -0
  4. package/dist/cjs/assets/icons/DoubtIcon.d.ts +6 -0
  5. package/dist/cjs/assets/icons/DoubtIcon.js +1 -0
  6. package/dist/cjs/assets/icons/EditLabel.d.ts +7 -0
  7. package/dist/cjs/assets/icons/EditLabel.js +1 -0
  8. package/dist/cjs/assets/icons/NotesIcon.d.ts +6 -0
  9. package/dist/cjs/assets/icons/NotesIcon.js +1 -0
  10. package/dist/cjs/assets/icons/StepsIcon.d.ts +6 -0
  11. package/dist/cjs/assets/icons/StepsIcon.js +1 -0
  12. package/dist/cjs/assets/icons/StoreIcon.d.ts +6 -0
  13. package/dist/cjs/assets/icons/StoreIcon.js +1 -0
  14. package/dist/cjs/assets/icons/ThreeColumnsIcon.d.ts +6 -0
  15. package/dist/cjs/assets/icons/ThreeColumnsIcon.js +1 -0
  16. package/dist/cjs/assets/icons/index.d.ts +7 -0
  17. package/dist/cjs/assets/icons/magic-line.svg.js +1 -0
  18. package/dist/cjs/assets/icons/refresh-purple.svg.js +1 -0
  19. package/dist/cjs/assets/icons/rewind.svg.js +1 -0
  20. package/dist/cjs/assets/icons/thumbs_down.svg.js +1 -0
  21. package/dist/cjs/assets/icons/thumbs_up.svg.js +1 -0
  22. package/dist/cjs/components/ProgressChecklist/MultiChecklistItem.d.ts +29 -1
  23. package/dist/cjs/components/ProgressChecklist/ProgressChecklist.d.ts +3 -27
  24. package/dist/cjs/components/ProgressChecklist/ProgressChecklist.js +1 -1
  25. package/dist/cjs/components/QueryBuilder/Filters/CustomField/components/CustomField.js +1 -1
  26. package/dist/cjs/components/QueryBuilder/Filters/Event/components/EventFilter.js +1 -1
  27. package/dist/cjs/components/QueryBuilder/Filters/Segment/components/SegmentFilter.js +1 -1
  28. package/dist/cjs/components/QueryBuilder/Filters/UserProperty/components/UserPropertyFilter.js +1 -1
  29. package/dist/cjs/components/QueryBuilder/Triggers/EVENTS/components/EventsTrigger.d.ts +1 -1
  30. package/dist/cjs/components/QueryBuilder/Triggers/EVENTS/components/EventsTrigger.js +1 -1
  31. package/dist/cjs/components/QueryBuilder/Triggers/EVENTS/selectors/useIGTriggerNameCacheSelector.d.ts +1 -1
  32. package/dist/cjs/components/QueryBuilder/Triggers/IG/components/IGTrigger.d.ts +1 -1
  33. package/dist/cjs/components/QueryBuilder/Triggers/IG/selectors/useIGTriggerNameCacheSelector.d.ts +1 -1
  34. package/dist/cjs/components/QueryBuilder/Triggers/components/BaseTriggerQueryBuilderNode.d.ts +2 -2
  35. package/dist/cjs/components/QueryBuilder/Triggers/components/BaseTriggerQueryBuilderNode.js +1 -1
  36. package/dist/cjs/components/QueryBuilder/components/Connectors/Components/EmojiPicker.d.ts +1 -2
  37. package/dist/cjs/components/QueryBuilder/components/Connectors/Components/EmojiPicker.js +1 -1
  38. package/dist/cjs/components/QueryBuilder/components/Connectors/Components/InTheLast.js +1 -1
  39. package/dist/cjs/components/QueryBuilder/components/Connectors/Components/InTwoLast.js +1 -1
  40. package/dist/cjs/components/QueryBuilder/components/Connectors/Components/MultiselectDropdownFreeText.js +1 -1
  41. package/dist/cjs/components/QueryBuilder/components/Connectors/Components/SingleselectDropdownFreeText.d.ts +5 -2
  42. package/dist/cjs/components/QueryBuilder/components/Connectors/Components/SingleselectDropdownFreeText.js +1 -1
  43. package/dist/cjs/components/QueryBuilder/components/Connectors/Connector.js +1 -1
  44. package/dist/cjs/components/QueryBuilder/components/DropdownWrapper.d.ts +3 -1
  45. package/dist/cjs/components/QueryBuilder/components/DropdownWrapper.js +1 -1
  46. package/dist/cjs/components/QueryBuilder/components/QueryBuilderNode/Property/PropertyNode.js +1 -1
  47. package/dist/cjs/components/QueryBuilder/constants/connector.d.ts +1 -1
  48. package/dist/cjs/components/QueryBuilder/constants/connector.js +1 -1
  49. package/dist/cjs/components/QueryBuilder/constants/connectorPosition.js +1 -1
  50. package/dist/cjs/components/QueryBuilder/helpers/Connector.helper.d.ts +1 -1
  51. package/dist/cjs/components/QueryBuilder/helpers/Connector.helper.js +1 -1
  52. package/dist/cjs/components/QueryBuilder/helpers/PropertyCustomProcessor.d.ts +1 -1
  53. package/dist/cjs/components/QueryBuilder/helpers/SegmentValidator.d.ts +3 -15
  54. package/dist/cjs/components/QueryBuilder/types/QueryBuilder.type.d.ts +2 -22
  55. package/dist/cjs/components/QueryBuilder/types/QueryBuilder.type.js +1 -1
  56. package/dist/cjs/components/QueryBuilder/types/QueryBuilderAPI.type.d.ts +1 -1
  57. package/dist/cjs/components/QueryBuilder/types/QueryBuilderConnector.type.d.ts +6 -1
  58. package/dist/cjs/components/QueryBuilder/types/QueryBuilderEnum.type.d.ts +21 -0
  59. package/dist/cjs/components/QueryBuilder/types/QueryBuilderEnum.type.js +1 -0
  60. package/dist/cjs/components/QueryBuilder/types/index.d.ts +2 -1
  61. package/dist/cjs/components/SearchFilter/components/DatePickerButton.d.ts +1 -1
  62. package/dist/cjs/components/SearchFilter/components/DateRangeOnlyButton.d.ts +1 -1
  63. package/dist/cjs/components/SearchFilter/components/SearchFilterItem.d.ts +1 -1
  64. package/dist/cjs/components/SearchFilter/components/SearchFilterItem.js +1 -1
  65. package/dist/cjs/components/SearchFilter/types/SearchFilter.type.d.ts +1 -1
  66. package/dist/cjs/components/TablePagination/TablePagination.d.ts +1 -0
  67. package/dist/cjs/components/TablePagination/TablePagination.js +1 -1
  68. package/dist/cjs/components/WhatsAppTextEditor/AIRephrase.styled.d.ts +10 -0
  69. package/dist/cjs/components/WhatsAppTextEditor/AIRephrase.styled.js +1 -0
  70. package/dist/cjs/components/WhatsAppTextEditor/AIRephraseButton.d.ts +20 -0
  71. package/dist/cjs/components/WhatsAppTextEditor/AIRephraseButton.js +1 -0
  72. package/dist/cjs/components/WhatsAppTextEditor/BorderAnimation.d.ts +11 -0
  73. package/dist/cjs/components/WhatsAppTextEditor/BorderAnimation.js +1 -0
  74. package/dist/cjs/components/WhatsAppTextEditor/CustomEditor.styled.d.ts +13 -0
  75. package/dist/cjs/components/WhatsAppTextEditor/CustomEditor.styled.js +1 -1
  76. package/dist/cjs/components/WhatsAppTextEditor/WhatsAppTextEditor.d.ts +131 -3
  77. package/dist/cjs/components/WhatsAppTextEditor/WhatsAppTextEditor.js +5 -1
  78. package/dist/cjs/components/WhatsAppTextEditor/WhatsAppTextEditorHeader.d.ts +39 -1
  79. package/dist/cjs/components/WhatsAppTextEditor/WhatsAppTextEditorHeader.js +1 -1
  80. package/dist/cjs/components/WhatsAppTextEditor/ai/actionRegistry.d.ts +15 -0
  81. package/dist/cjs/components/WhatsAppTextEditor/ai/actionRegistry.js +1 -0
  82. package/dist/cjs/components/WhatsAppTextEditor/ai/aiTag.d.ts +63 -0
  83. package/dist/cjs/components/WhatsAppTextEditor/ai/aiTag.js +1 -0
  84. package/dist/cjs/components/WhatsAppTextEditor/ai/api.d.ts +22 -0
  85. package/dist/cjs/components/WhatsAppTextEditor/ai/api.js +1 -0
  86. package/dist/cjs/components/accordion/Accordion.d.ts +2 -35
  87. package/dist/cjs/components/accordion/Accordion.model.d.ts +35 -0
  88. package/dist/cjs/components/accordion/Accordion.style.d.ts +1 -1
  89. package/dist/cjs/components/alerts/Alert.styled.js +1 -0
  90. package/dist/cjs/components/analytics-card/AnalyticsCard.d.ts +1 -1
  91. package/dist/cjs/components/analytics-card/AnalyticsCard.model.d.ts +1 -0
  92. package/dist/cjs/components/analytics-card/AnalyticsCard.styled.d.ts +1 -1
  93. package/dist/cjs/components/analytics-chips-and-dropdowns/AnalyticsChip.d.ts +1 -17
  94. package/dist/cjs/components/analytics-chips-and-dropdowns/AnalyticsChip.model.d.ts +18 -0
  95. package/dist/cjs/components/analytics-chips-and-dropdowns/AnalyticsChipChannelFooter.d.ts +1 -1
  96. package/dist/cjs/components/analytics-chips-and-dropdowns/AnalyticsDropdown.js +1 -1
  97. package/dist/cjs/components/analytics-chips-and-dropdowns/AnalyticsMultiChip.d.ts +1 -1
  98. package/dist/cjs/components/analytics-chips-and-dropdowns/chart/HorizontalBarGraph/HorizontalGraph.js +1 -1
  99. package/dist/cjs/components/analytics-chips-and-dropdowns/chart/LazyCharts.d.ts +2 -0
  100. package/dist/cjs/components/analytics-chips-and-dropdowns/chart/LazyCharts.js +1 -0
  101. package/dist/cjs/components/analytics-chips-and-dropdowns/chart/Pie/PieChartAnalytics.js +1 -1
  102. package/dist/cjs/components/analytics-chips-and-dropdowns/chart/VerticalBarGraph/VerticalGraph.js +1 -1
  103. package/dist/cjs/components/analytics-chips-and-dropdowns/chart/heatmap/HeatMap.d.ts +4 -0
  104. package/dist/cjs/components/analytics-chips-and-dropdowns/chart/heatmap/HeatMap.js +1 -1
  105. package/dist/cjs/components/avatar/Avatar.js +1 -1
  106. package/dist/cjs/components/bik-layout/BikHeader.js +1 -1
  107. package/dist/cjs/components/bik-layout/BikSidebar.d.ts +1 -1
  108. package/dist/cjs/components/bik-layout/CommonStyles.js +1 -1
  109. package/dist/cjs/components/bik-layout/Sidebar.model.d.ts +27 -0
  110. package/dist/cjs/components/bik-layout/SidebarPopup.d.ts +1 -1
  111. package/dist/cjs/components/bik-layout/SidebarSkeleton.d.ts +1 -1
  112. package/dist/cjs/components/bik-layout/SidebarStyles.d.ts +1 -1
  113. package/dist/cjs/components/bik-layout/SimpleSidebar.d.ts +1 -27
  114. package/dist/cjs/components/country-code-picker/CountryCodePicker.js +1 -1
  115. package/dist/cjs/components/country-code-picker/CountryPicker.js +1 -1
  116. package/dist/cjs/components/custom-date-time/CustomDateTime.js +1 -1
  117. package/dist/cjs/components/custom-date-time/DateSelector/DateSelector.js +1 -1
  118. package/dist/cjs/components/data-source-panel/DataSourceInfoFooter.js +1 -1
  119. package/dist/cjs/components/datePicker/TimePicker.js +1 -1
  120. package/dist/cjs/components/discount-modal/CouponExpiration/CouponExpiration.js +1 -1
  121. package/dist/cjs/components/discount-modal/DiscountModal.js +1 -1
  122. package/dist/cjs/components/discount-modal/DynamicCoupon/DynamicCoupon.js +1 -1
  123. package/dist/cjs/components/discount-modal/DynamicCoupon/MinimumRequirementComponent.js +1 -1
  124. package/dist/cjs/components/dropdown/Dropdown.d.ts +2 -0
  125. package/dist/cjs/components/dropdown/Dropdown.js +1 -1
  126. package/dist/cjs/components/dropdown/DropdownPopover/index.js +1 -1
  127. package/dist/cjs/components/dropdown/OpenedDropdown/components/OpennedDropdown.js +1 -1
  128. package/dist/cjs/components/dropdown/OpenedDropdown/components/menu/MenuItem.d.ts +6 -0
  129. package/dist/cjs/components/dropdown/OpenedDropdown/components/menu/MenuItem.js +34 -4
  130. package/dist/cjs/components/dropdown/OpenedDropdown/components/menu/MenuList.d.ts +2 -0
  131. package/dist/cjs/components/dropdown/OpenedDropdown/components/menu/MenuList.js +1 -1
  132. package/dist/cjs/components/dropdown/OpenedDropdown/components/multiSelect/MultiSelectDropdownBottomBar.d.ts +1 -0
  133. package/dist/cjs/components/dropdown/OpenedDropdown/components/multiSelect/MultiSelectDropdownBottomBar.js +1 -1
  134. package/dist/cjs/components/dropdown/OpenedDropdown/components/searchbox/SearchZeroState.d.ts +2 -0
  135. package/dist/cjs/components/dropdown/OpenedDropdown/components/searchbox/SearchZeroState.js +1 -1
  136. package/dist/cjs/components/dropdown/hooks/useDropdown.d.ts +2 -0
  137. package/dist/cjs/components/dropdown/hooks/useDropdown.js +1 -1
  138. package/dist/cjs/components/dropdown/type.d.ts +17 -0
  139. package/dist/cjs/components/dropdown-button/DropdownButton.js +1 -1
  140. package/dist/cjs/components/feature-announcements/MajorUpdatePopup.js +1 -1
  141. package/dist/cjs/components/feature-announcements/MinorUpdatePopup.js +1 -1
  142. package/dist/cjs/components/feature-announcements/types/feature.types.d.ts +1 -0
  143. package/dist/cjs/components/floating-input-dropdown/FloatingInputDropdown.d.ts +1 -1
  144. package/dist/cjs/components/image-cropper/BikImageCropper.d.ts +1 -6
  145. package/dist/cjs/components/image-cropper/BikImageCropper.model.d.ts +6 -0
  146. package/dist/cjs/components/image-cropper/BikImagePipeline/BikImagePipeline.d.ts +1 -1
  147. package/dist/cjs/components/input/ChipInput.js +1 -1
  148. package/dist/cjs/components/input/ChipInput.styled.d.ts +6 -66
  149. package/dist/cjs/components/input/ChipInput.styled.js +1 -1
  150. package/dist/cjs/components/input/Input-helper.d.ts +3 -1
  151. package/dist/cjs/components/input/Input-helper.js +1 -1
  152. package/dist/cjs/components/input/Input.d.ts +1 -71
  153. package/dist/cjs/components/input/Input.js +1 -1
  154. package/dist/cjs/components/input/Input.model.d.ts +76 -0
  155. package/dist/cjs/components/input/Input.styled.d.ts +2 -1
  156. package/dist/cjs/components/input/Input.styled.js +1 -1
  157. package/dist/cjs/components/input-with-vars/InputWithVariables.d.ts +1 -1
  158. package/dist/cjs/components/list-item/List.model.d.ts +18 -0
  159. package/dist/cjs/components/list-item/ListItem.d.ts +1 -17
  160. package/dist/cjs/components/list-item/ListItem.styled.d.ts +1 -1
  161. package/dist/cjs/components/list-item/themes.d.ts +1 -1
  162. package/dist/cjs/components/multi-level-dropdown/GroupedMenuList.d.ts +6 -1
  163. package/dist/cjs/components/multi-level-dropdown/GroupedMenuList.js +1 -1
  164. package/dist/cjs/components/multi-level-dropdown/MenuItem.d.ts +5 -1
  165. package/dist/cjs/components/multi-level-dropdown/MenuItem.js +1 -1
  166. package/dist/cjs/components/multi-level-dropdown/MenuList.d.ts +4 -0
  167. package/dist/cjs/components/multi-level-dropdown/MenuList.js +1 -1
  168. package/dist/cjs/components/multi-level-dropdown/MultiLevelDropdown.js +1 -1
  169. package/dist/cjs/components/multi-level-dropdown/type.d.ts +5 -1
  170. package/dist/cjs/components/product-picker-v2/ProductPickerTag.d.ts +2 -2
  171. package/dist/cjs/components/product-picker-v2/collectionScreen.d.ts +3 -3
  172. package/dist/cjs/components/product-picker-v2/helpers/ProductHelper.d.ts +3 -4
  173. package/dist/cjs/components/product-picker-v2/index.d.ts +1 -1
  174. package/dist/cjs/components/product-picker-v2/modal.d.ts +2 -58
  175. package/dist/cjs/components/product-picker-v2/product.d.ts +2 -3
  176. package/dist/cjs/components/product-picker-v2/productInfoOverlay.d.ts +1 -2
  177. package/dist/cjs/components/product-picker-v2/productScreen.d.ts +3 -3
  178. package/dist/cjs/components/product-picker-v2/productScreen.js +1 -1
  179. package/dist/cjs/components/product-picker-v2/rearrangeScreen.d.ts +3 -4
  180. package/dist/cjs/components/product-picker-v2/rearrangeScreen.js +1 -1
  181. package/dist/cjs/components/product-picker-v2/reducers.d.ts +1 -1
  182. package/dist/cjs/components/product-picker-v2/reducers.js +1 -1
  183. package/dist/cjs/components/product-picker-v2/searchScreen.d.ts +3 -4
  184. package/dist/cjs/components/product-picker-v2/selectedScreen.d.ts +3 -4
  185. package/dist/cjs/components/product-picker-v2/type.d.ts +65 -0
  186. package/dist/cjs/components/product-picker-v2/utility.d.ts +3 -3
  187. package/dist/cjs/components/product-picker-v2/utility.js +1 -1
  188. package/dist/cjs/components/product-picker-v2/variant.d.ts +2 -12
  189. package/dist/cjs/components/product-picker-v2/variantComponents.d.ts +2 -3
  190. package/dist/cjs/components/product-picker-v2/variantComponents.js +1 -1
  191. package/dist/cjs/components/radioButton/RadioButton.d.ts +1 -0
  192. package/dist/cjs/components/radioButton/RadioButton.js +1 -1
  193. package/dist/cjs/components/sample-button/SampleButton.d.ts +1 -16
  194. package/dist/cjs/components/sample-button/SampleButton.model.d.ts +17 -0
  195. package/dist/cjs/components/sample-button/SampleButton.styled.d.ts +1 -1
  196. package/dist/cjs/components/sample-button/themes.d.ts +1 -1
  197. package/dist/cjs/components/searchBar/searchBar.d.ts +1 -1
  198. package/dist/cjs/components/slider/slider.js +1 -1
  199. package/dist/cjs/components/stepper/Stepper.d.ts +1 -17
  200. package/dist/cjs/components/stepper/Stepper.model.d.ts +17 -0
  201. package/dist/cjs/components/stepper/Stepper.styled.d.ts +1 -1
  202. package/dist/cjs/components/stepper/StepperService.d.ts +1 -1
  203. package/dist/cjs/components/stepper/themes.d.ts +1 -1
  204. package/dist/cjs/components/tag/Tag.d.ts +1 -1
  205. package/dist/cjs/components/tag/Tag.js +1 -1
  206. package/dist/cjs/components/tag/Tag.stories.d.ts +5 -5
  207. package/dist/cjs/components/tag/Tag.styled.d.ts +3 -0
  208. package/dist/cjs/components/tag/Tag.styled.js +1 -1
  209. package/dist/cjs/components/tag/model.d.ts +15 -0
  210. package/dist/cjs/components/template-context-mapper/TemplateContextMapper.d.ts +9 -9
  211. package/dist/cjs/components/template-context-mapper/TemplateContextMapper.js +1 -1
  212. package/dist/cjs/components/template-context-mapper/context/templateModalContext.d.ts +7 -7
  213. package/dist/cjs/components/template-context-mapper/custom-hooks/useAdditionalVariables.d.ts +1 -1
  214. package/dist/cjs/components/template-context-mapper/helpers/WebpushTemplateHelper.d.ts +6 -4
  215. package/dist/cjs/components/template-context-mapper/helpers/WebpushTemplateHelper.js +1 -1
  216. package/dist/cjs/components/template-context-mapper/modalElements/Body.d.ts +2 -2
  217. package/dist/cjs/components/template-context-mapper/modalElements/Body.js +10 -10
  218. package/dist/cjs/components/template-context-mapper/modalElements/DesktopPreview.js +7 -7
  219. package/dist/cjs/components/template-context-mapper/modalElements/EditMediaModal.d.ts +3 -3
  220. package/dist/cjs/components/template-context-mapper/modalElements/EditMediaModal.js +1 -1
  221. package/dist/cjs/components/template-context-mapper/modalElements/EditWebpushTemplate.d.ts +2 -2
  222. package/dist/cjs/components/template-context-mapper/modalElements/EditWebpushTemplate.js +1 -1
  223. package/dist/cjs/components/template-context-mapper/modalElements/EditWhatsAppCarouselTemplateV2.d.ts +3 -14
  224. package/dist/cjs/components/template-context-mapper/modalElements/EditWhatsAppCarouselTemplateV2.js +1 -1
  225. package/dist/cjs/components/template-context-mapper/modalElements/EditWhatsAppTemplateV2.d.ts +5 -5
  226. package/dist/cjs/components/template-context-mapper/modalElements/EditWhatsAppTemplateV2.js +2 -2
  227. package/dist/cjs/components/template-context-mapper/modalElements/Footer.js +4 -4
  228. package/dist/cjs/components/template-context-mapper/modalElements/MobilePreview.d.ts +1 -1
  229. package/dist/cjs/components/template-context-mapper/modalElements/MobilePreview.js +3 -3
  230. package/dist/cjs/components/template-context-mapper/modalElements/QualityWarningModal.d.ts +1 -1
  231. package/dist/cjs/components/template-context-mapper/modalElements/TemplateAnalyticsComponent.d.ts +1 -1
  232. package/dist/cjs/components/template-context-mapper/modalElements/TemplateSelectModalContent.d.ts +2 -2
  233. package/dist/cjs/components/template-context-mapper/modalElements/VariableConnector.d.ts +1 -1
  234. package/dist/cjs/components/template-context-mapper/modalElements/VariableConnector.js +4 -4
  235. package/dist/cjs/components/template-context-mapper/modalElements/VariableConnectorWhatsApp.d.ts +5 -4
  236. package/dist/cjs/components/template-context-mapper/modalElements/VariableConnectorWhatsApp.js +1 -1
  237. package/dist/cjs/components/template-context-mapper/modalElements/VariableEditorHeader.d.ts +1 -1
  238. package/dist/cjs/components/template-context-mapper/modalElements/WhatsAppTemplateCardButtonV2.d.ts +2 -2
  239. package/dist/cjs/components/template-context-mapper/modalElements/WhatsAppTemplateCardButtonV2.js +1 -1
  240. package/dist/cjs/components/template-context-mapper/modalElements/modal.d.ts +13 -0
  241. package/dist/cjs/components/template-context-mapper/modalElements/useEditWhtasappTemplateMedia.d.ts +1 -1
  242. package/dist/cjs/components/template-context-mapper/modalElements/useEditWhtasappTemplateMedia.js +1 -1
  243. package/dist/cjs/components/template-context-mapper/utils/convertPlaceholdersToBikDropdown.d.ts +2 -2
  244. package/dist/cjs/components/template-context-mapper/utils/getDataFromTemplateComponent.d.ts +2 -2
  245. package/dist/cjs/components/template-context-mapper/utils/highlightFor.d.ts +1 -1
  246. package/dist/cjs/components/template-preview/TemplatePreview.js +1 -1
  247. package/dist/cjs/components/template-preview/models/TemplateMeta.d.ts +1 -1
  248. package/dist/cjs/components/template-preview/models/WhatsAppTemplate.d.ts +1 -0
  249. package/dist/cjs/components/template-preview/models/WhatsappCarouselTemplate.d.ts +4 -2
  250. package/dist/cjs/components/toaster/Toaster.styled.js +1 -1
  251. package/dist/cjs/components/variable-picker-v3/SubHeaderItems.js +1 -1
  252. package/dist/cjs/components/zeroState/ZeroState.js +2 -1
  253. package/dist/cjs/firebase/environment.d.ts +58 -0
  254. package/dist/cjs/firebase/environment.js +1 -0
  255. package/dist/cjs/firebase/firebaseUserFetcher.d.ts +34 -0
  256. package/dist/cjs/firebase/firebaseUserFetcher.js +1 -0
  257. package/dist/cjs/firebase/index.d.ts +7 -0
  258. package/dist/cjs/firebase/lazyFirebaseApp.d.ts +22 -0
  259. package/dist/cjs/firebase/lazyFirebaseApp.js +1 -0
  260. package/dist/cjs/firebase/lazyFirebaseMethods.d.ts +589 -0
  261. package/dist/cjs/firebase/lazyFirebaseMethods.js +1 -0
  262. package/dist/cjs/firebase/lazyFirestore.d.ts +6 -0
  263. package/dist/cjs/firebase/lazyFirestore.js +1 -0
  264. package/dist/cjs/firebase/lazyFirestoreLite.d.ts +6 -0
  265. package/dist/cjs/firebase/lazyFirestoreLite.js +1 -0
  266. package/dist/cjs/firebase/lazyStorage.d.ts +5 -0
  267. package/dist/cjs/firebase/lazyStorage.js +1 -0
  268. package/dist/cjs/helpers/BaseWhatsappContentLang.helper.js +1 -1
  269. package/dist/cjs/icons/Actions/Common actions/Activate.d.ts +7 -0
  270. package/dist/cjs/icons/Actions/Common actions/Activate.js +1 -0
  271. package/dist/cjs/icons/Actions/Common actions/Code.d.ts +7 -0
  272. package/dist/cjs/icons/Actions/Common actions/Code.js +1 -0
  273. package/dist/cjs/icons/Actions/Common actions/Cross.d.ts +7 -0
  274. package/dist/cjs/icons/Actions/Common actions/Cross.js +1 -0
  275. package/dist/cjs/icons/Actions/Common actions/Deactivate.d.ts +7 -0
  276. package/dist/cjs/icons/Actions/Common actions/Deactivate.js +1 -0
  277. package/dist/cjs/icons/Actions/Common actions/Delete.d.ts +7 -0
  278. package/dist/cjs/icons/Actions/Common actions/Delete.js +1 -0
  279. package/dist/cjs/icons/Actions/Common actions/Edit.d.ts +7 -0
  280. package/dist/cjs/icons/Actions/Common actions/Edit.js +1 -0
  281. package/dist/cjs/icons/Actions/Common actions/Forward.d.ts +7 -0
  282. package/dist/cjs/icons/Actions/Common actions/Forward.js +1 -0
  283. package/dist/cjs/icons/Actions/Common actions/Fullscreen.d.ts +7 -0
  284. package/dist/cjs/icons/Actions/Common actions/Fullscreen.js +1 -0
  285. package/dist/cjs/icons/Actions/Common actions/LinkSimpleHorizontal.d.ts +7 -0
  286. package/dist/cjs/icons/Actions/Common actions/LinkSimpleHorizontal.js +1 -0
  287. package/dist/cjs/icons/Actions/Common actions/Minus.d.ts +7 -0
  288. package/dist/cjs/icons/Actions/Common actions/Minus.js +1 -0
  289. package/dist/cjs/icons/Actions/Common actions/Plus.d.ts +7 -0
  290. package/dist/cjs/icons/Actions/Common actions/Plus.js +1 -0
  291. package/dist/cjs/icons/Actions/Common actions/SendAirplane.d.ts +7 -0
  292. package/dist/cjs/icons/Actions/Common actions/SendAirplane.js +1 -0
  293. package/dist/cjs/icons/Actions/Common actions/ShareAndroid.d.ts +7 -0
  294. package/dist/cjs/icons/Actions/Common actions/ShareAndroid.js +1 -0
  295. package/dist/cjs/icons/Actions/Common actions/index.d.ts +13 -0
  296. package/dist/cjs/icons/Actions/Formatting/CheckboxIcon.d.ts +7 -0
  297. package/dist/cjs/icons/Actions/Formatting/CheckboxIcon.js +1 -0
  298. package/dist/cjs/icons/Actions/Formatting/Copy.d.ts +7 -0
  299. package/dist/cjs/icons/Actions/Formatting/Copy.js +1 -0
  300. package/dist/cjs/icons/Actions/Formatting/Dropdown.d.ts +7 -0
  301. package/dist/cjs/icons/Actions/Formatting/Dropdown.js +1 -0
  302. package/dist/cjs/icons/Actions/Formatting/MultiLine.d.ts +7 -0
  303. package/dist/cjs/icons/Actions/Formatting/MultiLine.js +1 -0
  304. package/dist/cjs/icons/Actions/Formatting/MultiSelect.d.ts +7 -0
  305. package/dist/cjs/icons/Actions/Formatting/MultiSelect.js +1 -0
  306. package/dist/cjs/icons/Actions/Formatting/Number.d.ts +7 -0
  307. package/dist/cjs/icons/Actions/Formatting/Number.js +1 -0
  308. package/dist/cjs/icons/Actions/Formatting/Text.d.ts +7 -0
  309. package/dist/cjs/icons/Actions/Formatting/Text.js +1 -0
  310. package/dist/cjs/icons/Actions/Formatting/Textbox.d.ts +7 -0
  311. package/dist/cjs/icons/Actions/Formatting/Textbox.js +1 -0
  312. package/dist/cjs/icons/Actions/Formatting/index.d.ts +8 -0
  313. package/dist/cjs/icons/Actions/Navigation/ArrowRedo.d.ts +7 -0
  314. package/dist/cjs/icons/Actions/Navigation/ArrowRedo.js +1 -0
  315. package/dist/cjs/icons/Actions/Navigation/ArrowUndo.d.ts +7 -0
  316. package/dist/cjs/icons/Actions/Navigation/ArrowUndo.js +1 -0
  317. package/dist/cjs/icons/Actions/Navigation/LogIn.d.ts +7 -0
  318. package/dist/cjs/icons/Actions/Navigation/LogIn.js +1 -0
  319. package/dist/cjs/icons/Actions/Navigation/LogOut.d.ts +7 -0
  320. package/dist/cjs/icons/Actions/Navigation/LogOut.js +1 -0
  321. package/dist/cjs/icons/Actions/Navigation/OpenNewWindow.d.ts +7 -0
  322. package/dist/cjs/icons/Actions/Navigation/OpenNewWindow.js +1 -0
  323. package/dist/cjs/icons/Actions/Navigation/Refresh.d.ts +7 -0
  324. package/dist/cjs/icons/Actions/Navigation/Refresh.js +1 -0
  325. package/dist/cjs/icons/Actions/Navigation/Rewind.d.ts +7 -0
  326. package/dist/cjs/icons/Actions/Navigation/Rewind.js +1 -0
  327. package/dist/cjs/icons/Actions/Navigation/Sync.d.ts +7 -0
  328. package/dist/cjs/icons/Actions/Navigation/Sync.js +1 -0
  329. package/dist/cjs/icons/Actions/Navigation/index.d.ts +8 -0
  330. package/dist/cjs/icons/Actions/Selection/HandleDrag.d.ts +7 -0
  331. package/dist/cjs/icons/Actions/Selection/HandleDrag.js +1 -0
  332. package/dist/cjs/icons/Actions/Selection/SingleChoice.d.ts +7 -0
  333. package/dist/cjs/icons/Actions/Selection/SingleChoice.js +1 -0
  334. package/dist/cjs/icons/Actions/Selection/index.d.ts +2 -0
  335. package/dist/cjs/icons/Arrows/Carat/CaratDown.d.ts +7 -0
  336. package/dist/cjs/icons/Arrows/Carat/CaratDown.js +1 -0
  337. package/dist/cjs/icons/Arrows/Carat/CaratLeft.d.ts +7 -0
  338. package/dist/cjs/icons/Arrows/Carat/CaratLeft.js +1 -0
  339. package/dist/cjs/icons/Arrows/Carat/CaratRight.d.ts +7 -0
  340. package/dist/cjs/icons/Arrows/Carat/CaratRight.js +1 -0
  341. package/dist/cjs/icons/Arrows/Carat/CaratUp.d.ts +7 -0
  342. package/dist/cjs/icons/Arrows/Carat/CaratUp.js +1 -0
  343. package/dist/cjs/icons/Arrows/Carat/index.d.ts +4 -0
  344. package/dist/cjs/icons/Arrows/Chevron/ChevronDown.d.ts +7 -0
  345. package/dist/cjs/icons/Arrows/Chevron/ChevronDown.js +1 -0
  346. package/dist/cjs/icons/Arrows/Chevron/ChevronLeft.d.ts +7 -0
  347. package/dist/cjs/icons/Arrows/Chevron/ChevronLeft.js +1 -0
  348. package/dist/cjs/icons/Arrows/Chevron/ChevronRight.d.ts +7 -0
  349. package/dist/cjs/icons/Arrows/Chevron/ChevronRight.js +1 -0
  350. package/dist/cjs/icons/Arrows/Chevron/ChevronUp.d.ts +7 -0
  351. package/dist/cjs/icons/Arrows/Chevron/ChevronUp.js +1 -0
  352. package/dist/cjs/icons/Arrows/Chevron/index.d.ts +4 -0
  353. package/dist/cjs/icons/Arrows/Double chevron/ChevronDoubleDown.d.ts +7 -0
  354. package/dist/cjs/icons/Arrows/Double chevron/ChevronDoubleDown.js +1 -0
  355. package/dist/cjs/icons/Arrows/Double chevron/ChevronDoubleLeft.d.ts +7 -0
  356. package/dist/cjs/icons/Arrows/Double chevron/ChevronDoubleLeft.js +1 -0
  357. package/dist/cjs/icons/Arrows/Double chevron/ChevronDoubleRight.d.ts +7 -0
  358. package/dist/cjs/icons/Arrows/Double chevron/ChevronDoubleRight.js +1 -0
  359. package/dist/cjs/icons/Arrows/Double chevron/ChevronDoubleUp.d.ts +7 -0
  360. package/dist/cjs/icons/Arrows/Double chevron/ChevronDoubleUp.js +1 -0
  361. package/dist/cjs/icons/Arrows/Double chevron/index.d.ts +4 -0
  362. package/dist/cjs/icons/Arrows/Normal arrows/ArrowDown.d.ts +7 -0
  363. package/dist/cjs/icons/Arrows/Normal arrows/ArrowDown.js +1 -0
  364. package/dist/cjs/icons/Arrows/Normal arrows/ArrowDownLeft.d.ts +7 -0
  365. package/dist/cjs/icons/Arrows/Normal arrows/ArrowDownLeft.js +1 -0
  366. package/dist/cjs/icons/Arrows/Normal arrows/ArrowDownRight.d.ts +7 -0
  367. package/dist/cjs/icons/Arrows/Normal arrows/ArrowDownRight.js +1 -0
  368. package/dist/cjs/icons/Arrows/Normal arrows/ArrowLeft.d.ts +7 -0
  369. package/dist/cjs/icons/Arrows/Normal arrows/ArrowLeft.js +1 -0
  370. package/dist/cjs/icons/Arrows/Normal arrows/ArrowRight.d.ts +7 -0
  371. package/dist/cjs/icons/Arrows/Normal arrows/ArrowRight.js +1 -0
  372. package/dist/cjs/icons/Arrows/Normal arrows/ArrowUp.d.ts +7 -0
  373. package/dist/cjs/icons/Arrows/Normal arrows/ArrowUp.js +1 -0
  374. package/dist/cjs/icons/Arrows/Normal arrows/ArrowUpLeft.d.ts +7 -0
  375. package/dist/cjs/icons/Arrows/Normal arrows/ArrowUpLeft.js +1 -0
  376. package/dist/cjs/icons/Arrows/Normal arrows/ArrowUpRight.d.ts +7 -0
  377. package/dist/cjs/icons/Arrows/Normal arrows/ArrowUpRight.js +1 -0
  378. package/dist/cjs/icons/Arrows/Normal arrows/index.d.ts +8 -0
  379. package/dist/cjs/icons/Arrows/Special/ArrowSwitch.d.ts +7 -0
  380. package/dist/cjs/icons/Arrows/Special/ArrowSwitch.js +1 -0
  381. package/dist/cjs/icons/Arrows/Special/index.d.ts +1 -0
  382. package/dist/cjs/icons/BIK AI specific/AiEmoji.d.ts +7 -0
  383. package/dist/cjs/icons/BIK AI specific/AiEmoji.js +1 -0
  384. package/dist/cjs/icons/BIK AI specific/AiRobot.d.ts +7 -0
  385. package/dist/cjs/icons/BIK AI specific/AiRobot.js +1 -0
  386. package/dist/cjs/icons/BIK AI specific/Expand.d.ts +7 -0
  387. package/dist/cjs/icons/BIK AI specific/Expand.js +1 -0
  388. package/dist/cjs/icons/BIK AI specific/GeminiSparkle.d.ts +7 -0
  389. package/dist/cjs/icons/BIK AI specific/ManifestSparkle.d.ts +7 -0
  390. package/dist/cjs/icons/BIK AI specific/PricePlease.d.ts +7 -0
  391. package/dist/cjs/icons/BIK AI specific/PricePlease.js +1 -0
  392. package/dist/cjs/icons/BIK AI specific/Shape.d.ts +7 -0
  393. package/dist/cjs/icons/BIK AI specific/Shape.js +1 -0
  394. package/dist/cjs/icons/BIK AI specific/Shorter.d.ts +7 -0
  395. package/dist/cjs/icons/BIK AI specific/Shorter.js +1 -0
  396. package/dist/cjs/icons/BIK AI specific/Sparkling2Line.d.ts +7 -0
  397. package/dist/cjs/icons/BIK AI specific/Sparkling2Line.js +1 -0
  398. package/dist/cjs/icons/BIK AI specific/Write.d.ts +7 -0
  399. package/dist/cjs/icons/BIK AI specific/Write.js +1 -0
  400. package/dist/cjs/icons/BIK AI specific/index.d.ts +10 -0
  401. package/dist/cjs/icons/Informational/Common UI/Bell.d.ts +7 -0
  402. package/dist/cjs/icons/Informational/Common UI/Bell.js +1 -0
  403. package/dist/cjs/icons/Informational/Common UI/BellSync.d.ts +7 -0
  404. package/dist/cjs/icons/Informational/Common UI/BellSync.js +1 -0
  405. package/dist/cjs/icons/Informational/Common UI/Bulb.d.ts +7 -0
  406. package/dist/cjs/icons/Informational/Common UI/Bulb.js +1 -0
  407. package/dist/cjs/icons/Informational/Common UI/MenuHamburger.d.ts +7 -0
  408. package/dist/cjs/icons/Informational/Common UI/MenuHamburger.js +1 -0
  409. package/dist/cjs/icons/Informational/Common UI/MessageSearch.d.ts +7 -0
  410. package/dist/cjs/icons/Informational/Common UI/MessageSearch.js +1 -0
  411. package/dist/cjs/icons/Informational/Common UI/MoreHorizontal.d.ts +7 -0
  412. package/dist/cjs/icons/Informational/Common UI/MoreHorizontal.js +1 -0
  413. package/dist/cjs/icons/Informational/Common UI/MoreVertical.d.ts +7 -0
  414. package/dist/cjs/icons/Informational/Common UI/MoreVertical.js +1 -0
  415. package/dist/cjs/icons/Informational/Common UI/Placeholder.d.ts +7 -0
  416. package/dist/cjs/icons/Informational/Common UI/Search.d.ts +7 -0
  417. package/dist/cjs/icons/Informational/Common UI/Search.js +1 -0
  418. package/dist/cjs/icons/Informational/Common UI/Settings.d.ts +7 -0
  419. package/dist/cjs/icons/Informational/Common UI/Settings.js +1 -0
  420. package/dist/cjs/icons/Informational/Common UI/Training.d.ts +7 -0
  421. package/dist/cjs/icons/Informational/Common UI/Training.js +1 -0
  422. package/dist/cjs/icons/Informational/Common UI/index.d.ts +11 -0
  423. package/dist/cjs/icons/Informational/Communication/Chat.d.ts +7 -0
  424. package/dist/cjs/icons/Informational/Communication/Chat.js +1 -0
  425. package/dist/cjs/icons/Informational/Communication/ChatCheck.d.ts +7 -0
  426. package/dist/cjs/icons/Informational/Communication/ChatCheck.js +1 -0
  427. package/dist/cjs/icons/Informational/Communication/ChatQuestion.d.ts +7 -0
  428. package/dist/cjs/icons/Informational/Communication/ChatQuestion.js +1 -0
  429. package/dist/cjs/icons/Informational/Communication/ChatStar.d.ts +7 -0
  430. package/dist/cjs/icons/Informational/Communication/ChatStar.js +1 -0
  431. package/dist/cjs/icons/Informational/Communication/Email.d.ts +7 -0
  432. package/dist/cjs/icons/Informational/Communication/Email.js +1 -0
  433. package/dist/cjs/icons/Informational/Communication/LiveChat.d.ts +7 -0
  434. package/dist/cjs/icons/Informational/Communication/LiveChat.js +1 -0
  435. package/dist/cjs/icons/Informational/Communication/Phone.d.ts +7 -0
  436. package/dist/cjs/icons/Informational/Communication/Phone.js +1 -0
  437. package/dist/cjs/icons/Informational/Communication/index.d.ts +7 -0
  438. package/dist/cjs/icons/Informational/Customer intent/ClipboardCheck.d.ts +7 -0
  439. package/dist/cjs/icons/Informational/Customer intent/ClipboardCheck.js +1 -0
  440. package/dist/cjs/icons/Informational/Customer intent/Experimental.d.ts +7 -0
  441. package/dist/cjs/icons/Informational/Customer intent/Experimental.js +1 -0
  442. package/dist/cjs/icons/Informational/Customer intent/Help.d.ts +7 -0
  443. package/dist/cjs/icons/Informational/Customer intent/Help.js +1 -0
  444. package/dist/cjs/icons/Informational/Customer intent/Percent.d.ts +7 -0
  445. package/dist/cjs/icons/Informational/Customer intent/Percent.js +1 -0
  446. package/dist/cjs/icons/Informational/Customer intent/Purchase.d.ts +7 -0
  447. package/dist/cjs/icons/Informational/Customer intent/Purchase.js +1 -0
  448. package/dist/cjs/icons/Informational/Customer intent/Services.d.ts +7 -0
  449. package/dist/cjs/icons/Informational/Customer intent/Services.js +1 -0
  450. package/dist/cjs/icons/Informational/Customer intent/ShoppingCart.d.ts +7 -0
  451. package/dist/cjs/icons/Informational/Customer intent/ShoppingCart.js +1 -0
  452. package/dist/cjs/icons/Informational/Customer intent/SingleChoice.d.ts +7 -0
  453. package/dist/cjs/icons/Informational/Customer intent/SingleChoice.js +1 -0
  454. package/dist/cjs/icons/Informational/Customer intent/Unsatisfactory.d.ts +7 -0
  455. package/dist/cjs/icons/Informational/Customer intent/Unsatisfactory.js +1 -0
  456. package/dist/cjs/icons/Informational/Customer intent/UserSound.d.ts +7 -0
  457. package/dist/cjs/icons/Informational/Customer intent/UserSound.js +1 -0
  458. package/dist/cjs/icons/Informational/Customer intent/index.d.ts +10 -0
  459. package/dist/cjs/icons/Informational/Date and time/Calendar.d.ts +7 -0
  460. package/dist/cjs/icons/Informational/Date and time/Calendar.js +1 -0
  461. package/dist/cjs/icons/Informational/Date and time/CalendarAdd.d.ts +7 -0
  462. package/dist/cjs/icons/Informational/Date and time/CalendarAdd.js +1 -0
  463. package/dist/cjs/icons/Informational/Date and time/Clock.d.ts +7 -0
  464. package/dist/cjs/icons/Informational/Date and time/Clock.js +1 -0
  465. package/dist/cjs/icons/Informational/Date and time/HourGlass.d.ts +7 -0
  466. package/dist/cjs/icons/Informational/Date and time/HourGlass.js +1 -0
  467. package/dist/cjs/icons/Informational/Date and time/WorkingHours.d.ts +7 -0
  468. package/dist/cjs/icons/Informational/Date and time/WorkingHours.js +1 -0
  469. package/dist/cjs/icons/Informational/Date and time/index.d.ts +5 -0
  470. package/dist/cjs/icons/Informational/Files and folders/Archive1.d.ts +7 -0
  471. package/dist/cjs/icons/Informational/Files and folders/Archive1.js +1 -0
  472. package/dist/cjs/icons/Informational/Files and folders/Excel.d.ts +7 -0
  473. package/dist/cjs/icons/Informational/Files and folders/Excel.js +1 -0
  474. package/dist/cjs/icons/Informational/Files and folders/File.d.ts +7 -0
  475. package/dist/cjs/icons/Informational/Files and folders/File.js +1 -0
  476. package/dist/cjs/icons/Informational/Files and folders/FileCsv.d.ts +7 -0
  477. package/dist/cjs/icons/Informational/Files and folders/FileCsv.js +1 -0
  478. package/dist/cjs/icons/Informational/Files and folders/FilePage.d.ts +7 -0
  479. package/dist/cjs/icons/Informational/Files and folders/FilePage.js +1 -0
  480. package/dist/cjs/icons/Informational/Files and folders/FilePdf.d.ts +7 -0
  481. package/dist/cjs/icons/Informational/Files and folders/FilePdf.js +1 -0
  482. package/dist/cjs/icons/Informational/Files and folders/Folder.d.ts +7 -0
  483. package/dist/cjs/icons/Informational/Files and folders/Folder.js +1 -0
  484. package/dist/cjs/icons/Informational/Files and folders/MediaMessage.d.ts +7 -0
  485. package/dist/cjs/icons/Informational/Files and folders/MediaMessage.js +1 -0
  486. package/dist/cjs/icons/Informational/Files and folders/Move.d.ts +7 -0
  487. package/dist/cjs/icons/Informational/Files and folders/Move.js +1 -0
  488. package/dist/cjs/icons/Informational/Files and folders/OrderHistory.d.ts +7 -0
  489. package/dist/cjs/icons/Informational/Files and folders/OrderHistory.js +1 -0
  490. package/dist/cjs/icons/Informational/Files and folders/TextMessage.d.ts +7 -0
  491. package/dist/cjs/icons/Informational/Files and folders/TextMessage.js +1 -0
  492. package/dist/cjs/icons/Informational/Files and folders/Unarchive.d.ts +7 -0
  493. package/dist/cjs/icons/Informational/Files and folders/Unarchive.js +1 -0
  494. package/dist/cjs/icons/Informational/Files and folders/index.d.ts +12 -0
  495. package/dist/cjs/icons/Informational/Finance/Bank.d.ts +7 -0
  496. package/dist/cjs/icons/Informational/Finance/Bank.js +1 -0
  497. package/dist/cjs/icons/Informational/Finance/CashOnDelivery.d.ts +7 -0
  498. package/dist/cjs/icons/Informational/Finance/CashOnDelivery.js +1 -0
  499. package/dist/cjs/icons/Informational/Finance/ChartLine.d.ts +7 -0
  500. package/dist/cjs/icons/Informational/Finance/ChartLine.js +1 -0
  501. package/dist/cjs/icons/Informational/Finance/CreditCard.d.ts +7 -0
  502. package/dist/cjs/icons/Informational/Finance/CreditCard.js +1 -0
  503. package/dist/cjs/icons/Informational/Finance/Growth.d.ts +7 -0
  504. package/dist/cjs/icons/Informational/Finance/Growth.js +1 -0
  505. package/dist/cjs/icons/Informational/Finance/Money1.d.ts +7 -0
  506. package/dist/cjs/icons/Informational/Finance/Money1.js +1 -0
  507. package/dist/cjs/icons/Informational/Finance/NoCredits.d.ts +7 -0
  508. package/dist/cjs/icons/Informational/Finance/NoCredits.js +1 -0
  509. package/dist/cjs/icons/Informational/Finance/Percent.d.ts +7 -0
  510. package/dist/cjs/icons/Informational/Finance/Percent.js +1 -0
  511. package/dist/cjs/icons/Informational/Finance/Rupee.d.ts +7 -0
  512. package/dist/cjs/icons/Informational/Finance/Rupee.js +1 -0
  513. package/dist/cjs/icons/Informational/Finance/TablerTicket.d.ts +7 -0
  514. package/dist/cjs/icons/Informational/Finance/Wallet.d.ts +7 -0
  515. package/dist/cjs/icons/Informational/Finance/Wallet.js +1 -0
  516. package/dist/cjs/icons/Informational/Finance/index.d.ts +11 -0
  517. package/dist/cjs/icons/Informational/General/AlertTriangle.d.ts +7 -0
  518. package/dist/cjs/icons/Informational/General/AlertTriangle.js +1 -0
  519. package/dist/cjs/icons/Informational/General/Check.d.ts +7 -0
  520. package/dist/cjs/icons/Informational/General/Check.js +1 -0
  521. package/dist/cjs/icons/Informational/General/CheckDouble.d.ts +7 -0
  522. package/dist/cjs/icons/Informational/General/CheckDouble.js +1 -0
  523. package/dist/cjs/icons/Informational/General/CloseTicket1.d.ts +7 -0
  524. package/dist/cjs/icons/Informational/General/CloseTicket1.js +1 -0
  525. package/dist/cjs/icons/Informational/General/Error.d.ts +7 -0
  526. package/dist/cjs/icons/Informational/General/Error.js +1 -0
  527. package/dist/cjs/icons/Informational/General/FailDoc.d.ts +7 -0
  528. package/dist/cjs/icons/Informational/General/FailDoc.js +1 -0
  529. package/dist/cjs/icons/Informational/General/Help.d.ts +7 -0
  530. package/dist/cjs/icons/Informational/General/Help.js +1 -0
  531. package/dist/cjs/icons/Informational/General/IcList.d.ts +7 -0
  532. package/dist/cjs/icons/Informational/General/IcList.js +1 -0
  533. package/dist/cjs/icons/Informational/General/Info.d.ts +7 -0
  534. package/dist/cjs/icons/Informational/General/Info.js +1 -0
  535. package/dist/cjs/icons/Informational/General/NewTicket.d.ts +7 -0
  536. package/dist/cjs/icons/Informational/General/NewTicket.js +1 -0
  537. package/dist/cjs/icons/Informational/General/RoundCheck.d.ts +7 -0
  538. package/dist/cjs/icons/Informational/General/RoundCheck.js +1 -0
  539. package/dist/cjs/icons/Informational/General/Slash.d.ts +7 -0
  540. package/dist/cjs/icons/Informational/General/Slash.js +1 -0
  541. package/dist/cjs/icons/Informational/General/index.d.ts +12 -0
  542. package/dist/cjs/icons/Informational/Identity/Chatbot.d.ts +7 -0
  543. package/dist/cjs/icons/Informational/Identity/Chatbot.js +1 -0
  544. package/dist/cjs/icons/Informational/Identity/Contacts.d.ts +7 -0
  545. package/dist/cjs/icons/Informational/Identity/Contacts.js +1 -0
  546. package/dist/cjs/icons/Informational/Identity/Group.d.ts +7 -0
  547. package/dist/cjs/icons/Informational/Identity/Group.js +1 -0
  548. package/dist/cjs/icons/Informational/Identity/IdCard.d.ts +7 -0
  549. package/dist/cjs/icons/Informational/Identity/IdCard.js +1 -0
  550. package/dist/cjs/icons/Informational/Identity/Person.d.ts +7 -0
  551. package/dist/cjs/icons/Informational/Identity/Person.js +1 -0
  552. package/dist/cjs/icons/Informational/Identity/Robot.d.ts +7 -0
  553. package/dist/cjs/icons/Informational/Identity/Robot.js +1 -0
  554. package/dist/cjs/icons/Informational/Identity/Union.d.ts +7 -0
  555. package/dist/cjs/icons/Informational/Identity/Union.js +1 -0
  556. package/dist/cjs/icons/Informational/Identity/Union1.d.ts +7 -0
  557. package/dist/cjs/icons/Informational/Identity/Union1.js +1 -0
  558. package/dist/cjs/icons/Informational/Identity/UserMinus1.d.ts +7 -0
  559. package/dist/cjs/icons/Informational/Identity/UserMinus1.js +1 -0
  560. package/dist/cjs/icons/Informational/Identity/UserPlus.d.ts +7 -0
  561. package/dist/cjs/icons/Informational/Identity/UserPlus.js +1 -0
  562. package/dist/cjs/icons/Informational/Identity/index.d.ts +10 -0
  563. package/dist/cjs/icons/Informational/Location/Address.d.ts +7 -0
  564. package/dist/cjs/icons/Informational/Location/Address.js +1 -0
  565. package/dist/cjs/icons/Informational/Location/LanguageChange.d.ts +7 -0
  566. package/dist/cjs/icons/Informational/Location/LanguageChange.js +1 -0
  567. package/dist/cjs/icons/Informational/Location/MapPin.d.ts +7 -0
  568. package/dist/cjs/icons/Informational/Location/MapPin.js +1 -0
  569. package/dist/cjs/icons/Informational/Location/Truck.d.ts +7 -0
  570. package/dist/cjs/icons/Informational/Location/Truck.js +1 -0
  571. package/dist/cjs/icons/Informational/Location/index.d.ts +4 -0
  572. package/dist/cjs/icons/Informational/Store related/AllProduct.d.ts +7 -0
  573. package/dist/cjs/icons/Informational/Store related/AllProduct.js +1 -0
  574. package/dist/cjs/icons/Informational/Store related/Clipboard.d.ts +7 -0
  575. package/dist/cjs/icons/Informational/Store related/Clipboard.js +1 -0
  576. package/dist/cjs/icons/Informational/Store related/ClipboardCheck.d.ts +7 -0
  577. package/dist/cjs/icons/Informational/Store related/ClipboardCheck.js +1 -0
  578. package/dist/cjs/icons/Informational/Store related/CustomerReport.d.ts +7 -0
  579. package/dist/cjs/icons/Informational/Store related/CustomerReport.js +1 -0
  580. package/dist/cjs/icons/Informational/Store related/InventoryReport.d.ts +7 -0
  581. package/dist/cjs/icons/Informational/Store related/InventoryReport.js +1 -0
  582. package/dist/cjs/icons/Informational/Store related/LegalBalance.d.ts +7 -0
  583. package/dist/cjs/icons/Informational/Store related/OrderReport.d.ts +7 -0
  584. package/dist/cjs/icons/Informational/Store related/OrderReport.js +1 -0
  585. package/dist/cjs/icons/Informational/Store related/PaymentReport.d.ts +7 -0
  586. package/dist/cjs/icons/Informational/Store related/PaymentReport.js +1 -0
  587. package/dist/cjs/icons/Informational/Store related/Store.d.ts +7 -0
  588. package/dist/cjs/icons/Informational/Store related/Store.js +1 -0
  589. package/dist/cjs/icons/Informational/Store related/StoreSync.d.ts +7 -0
  590. package/dist/cjs/icons/Informational/Store related/StoreSync.js +1 -0
  591. package/dist/cjs/icons/Informational/Store related/index.d.ts +10 -0
  592. package/dist/cjs/icons/Informational/eCommerce/AddLabel.d.ts +7 -0
  593. package/dist/cjs/icons/Informational/eCommerce/AddLabel.js +1 -0
  594. package/dist/cjs/icons/Informational/eCommerce/Click.d.ts +7 -0
  595. package/dist/cjs/icons/Informational/eCommerce/Click.js +1 -0
  596. package/dist/cjs/icons/Informational/eCommerce/Filter.d.ts +7 -0
  597. package/dist/cjs/icons/Informational/eCommerce/Filter.js +1 -0
  598. package/dist/cjs/icons/Informational/eCommerce/Gift1.d.ts +7 -0
  599. package/dist/cjs/icons/Informational/eCommerce/Gift1.js +1 -0
  600. package/dist/cjs/icons/Informational/eCommerce/GiftMinus.d.ts +7 -0
  601. package/dist/cjs/icons/Informational/eCommerce/GiftMinus.js +1 -0
  602. package/dist/cjs/icons/Informational/eCommerce/GiftPlus.d.ts +7 -0
  603. package/dist/cjs/icons/Informational/eCommerce/GiftPlus.js +1 -0
  604. package/dist/cjs/icons/Informational/eCommerce/Promocode.d.ts +7 -0
  605. package/dist/cjs/icons/Informational/eCommerce/Promocode.js +1 -0
  606. package/dist/cjs/icons/Informational/eCommerce/Receipt.d.ts +7 -0
  607. package/dist/cjs/icons/Informational/eCommerce/Receipt.js +1 -0
  608. package/dist/cjs/icons/Informational/eCommerce/ShieldCheck.d.ts +7 -0
  609. package/dist/cjs/icons/Informational/eCommerce/ShieldCheck.js +1 -0
  610. package/dist/cjs/icons/Informational/eCommerce/ShoppingBag.d.ts +7 -0
  611. package/dist/cjs/icons/Informational/eCommerce/ShoppingBag.js +1 -0
  612. package/dist/cjs/icons/Informational/eCommerce/ShoppingBasket.d.ts +7 -0
  613. package/dist/cjs/icons/Informational/eCommerce/ShoppingBasket.js +1 -0
  614. package/dist/cjs/icons/Informational/eCommerce/ShoppingCart.d.ts +7 -0
  615. package/dist/cjs/icons/Informational/eCommerce/ShoppingCart.js +1 -0
  616. package/dist/cjs/icons/Informational/eCommerce/index.d.ts +12 -0
  617. package/dist/cjs/icons/Legacy - Bikayi specific/Categories/Box.d.ts +7 -0
  618. package/dist/cjs/icons/Legacy - Bikayi specific/Categories/Box.js +1 -0
  619. package/dist/cjs/icons/Legacy - Bikayi specific/Categories/Box2.d.ts +7 -0
  620. package/dist/cjs/icons/Legacy - Bikayi specific/Categories/Box2.js +1 -0
  621. package/dist/cjs/icons/Legacy - Bikayi specific/Categories/index.d.ts +2 -0
  622. package/dist/cjs/icons/Legacy - Bikayi specific/Navigation/Journeys.d.ts +7 -0
  623. package/dist/cjs/icons/Legacy - Bikayi specific/Navigation/Journeys.js +1 -0
  624. package/dist/cjs/icons/Legacy - Bikayi specific/Navigation/Services.d.ts +7 -0
  625. package/dist/cjs/icons/Legacy - Bikayi specific/Navigation/Services.js +1 -0
  626. package/dist/cjs/icons/Legacy - Bikayi specific/Navigation/index.d.ts +2 -0
  627. package/dist/cjs/icons/Legacy - Bikayi specific/Plans/PlanUltimate.d.ts +7 -0
  628. package/dist/cjs/icons/Legacy - Bikayi specific/Plans/PlanUltimate.js +1 -0
  629. package/dist/cjs/icons/Legacy - Bikayi specific/Plans/index.d.ts +1 -0
  630. package/dist/cjs/icons/Legacy - Bikayi specific/Services/Businesscard.d.ts +7 -0
  631. package/dist/cjs/icons/Legacy - Bikayi specific/Services/Businesscard.js +1 -0
  632. package/dist/cjs/icons/Legacy - Bikayi specific/Services/Customdomain.d.ts +7 -0
  633. package/dist/cjs/icons/Legacy - Bikayi specific/Services/Customdomain.js +1 -0
  634. package/dist/cjs/icons/Legacy - Bikayi specific/Services/Marketing.d.ts +7 -0
  635. package/dist/cjs/icons/Legacy - Bikayi specific/Services/Marketing.js +1 -0
  636. package/dist/cjs/icons/Legacy - Bikayi specific/Services/PaymentLink.d.ts +7 -0
  637. package/dist/cjs/icons/Legacy - Bikayi specific/Services/PaymentLink.js +1 -0
  638. package/dist/cjs/icons/Legacy - Bikayi specific/Services/Theme.d.ts +7 -0
  639. package/dist/cjs/icons/Legacy - Bikayi specific/Services/Theme.js +1 -0
  640. package/dist/cjs/icons/Legacy - Bikayi specific/Services/index.d.ts +5 -0
  641. package/dist/cjs/icons/Media/Audio/Microphone.d.ts +7 -0
  642. package/dist/cjs/icons/Media/Audio/Microphone.js +1 -0
  643. package/dist/cjs/icons/Media/Audio/Pause.d.ts +7 -0
  644. package/dist/cjs/icons/Media/Audio/Pause.js +1 -0
  645. package/dist/cjs/icons/Media/Audio/Play.d.ts +7 -0
  646. package/dist/cjs/icons/Media/Audio/Play.js +1 -0
  647. package/dist/cjs/icons/Media/Audio/Sleep.d.ts +7 -0
  648. package/dist/cjs/icons/Media/Audio/Sleep.js +1 -0
  649. package/dist/cjs/icons/Media/Audio/VolumeMute.d.ts +7 -0
  650. package/dist/cjs/icons/Media/Audio/VolumeMute.js +1 -0
  651. package/dist/cjs/icons/Media/Audio/VolumeOneline.d.ts +7 -0
  652. package/dist/cjs/icons/Media/Audio/VolumeOneline.js +1 -0
  653. package/dist/cjs/icons/Media/Audio/VolumeTwoline.d.ts +7 -0
  654. package/dist/cjs/icons/Media/Audio/VolumeTwoline.js +1 -0
  655. package/dist/cjs/icons/Media/Audio/index.d.ts +7 -0
  656. package/dist/cjs/icons/Media/Devices/Desktop.d.ts +7 -0
  657. package/dist/cjs/icons/Media/Devices/Desktop.js +1 -0
  658. package/dist/cjs/icons/Media/Devices/Smartphone.d.ts +7 -0
  659. package/dist/cjs/icons/Media/Devices/Smartphone.js +1 -0
  660. package/dist/cjs/icons/Media/Devices/index.d.ts +2 -0
  661. package/dist/cjs/icons/Media/Others/BarcodeScan.d.ts +7 -0
  662. package/dist/cjs/icons/Media/Others/BarcodeScan.js +1 -0
  663. package/dist/cjs/icons/Media/Others/Download.d.ts +7 -0
  664. package/dist/cjs/icons/Media/Others/Download.js +1 -0
  665. package/dist/cjs/icons/Media/Others/EmojiSmile.d.ts +7 -0
  666. package/dist/cjs/icons/Media/Others/EmojiSmile.js +1 -0
  667. package/dist/cjs/icons/Media/Others/Paperclip.d.ts +7 -0
  668. package/dist/cjs/icons/Media/Others/Paperclip.js +1 -0
  669. package/dist/cjs/icons/Media/Others/Upload.d.ts +7 -0
  670. package/dist/cjs/icons/Media/Others/Upload.js +1 -0
  671. package/dist/cjs/icons/Media/Others/index.d.ts +5 -0
  672. package/dist/cjs/icons/Media/Visual/Camera.d.ts +7 -0
  673. package/dist/cjs/icons/Media/Visual/Camera.js +1 -0
  674. package/dist/cjs/icons/Media/Visual/CameraAdd.d.ts +7 -0
  675. package/dist/cjs/icons/Media/Visual/CameraAdd.js +1 -0
  676. package/dist/cjs/icons/Media/Visual/Crop.d.ts +7 -0
  677. package/dist/cjs/icons/Media/Visual/Crop.js +1 -0
  678. package/dist/cjs/icons/Media/Visual/FlashOff.d.ts +7 -0
  679. package/dist/cjs/icons/Media/Visual/FlashOff.js +1 -0
  680. package/dist/cjs/icons/Media/Visual/FlashOn.d.ts +7 -0
  681. package/dist/cjs/icons/Media/Visual/FlashOn.js +1 -0
  682. package/dist/cjs/icons/Media/Visual/Image.d.ts +7 -0
  683. package/dist/cjs/icons/Media/Visual/Image.js +1 -0
  684. package/dist/cjs/icons/Media/Visual/ImageAdd.d.ts +7 -0
  685. package/dist/cjs/icons/Media/Visual/ImageAdd.js +1 -0
  686. package/dist/cjs/icons/Media/Visual/Images.d.ts +7 -0
  687. package/dist/cjs/icons/Media/Visual/Images.js +1 -0
  688. package/dist/cjs/icons/Media/Visual/Maximize.d.ts +7 -0
  689. package/dist/cjs/icons/Media/Visual/Maximize.js +1 -0
  690. package/dist/cjs/icons/Media/Visual/RotateAnticlockwise.d.ts +7 -0
  691. package/dist/cjs/icons/Media/Visual/RotateAnticlockwise.js +1 -0
  692. package/dist/cjs/icons/Media/Visual/RotateClockwise.d.ts +7 -0
  693. package/dist/cjs/icons/Media/Visual/RotateClockwise.js +1 -0
  694. package/dist/cjs/icons/Media/Visual/VideoCamcorder.d.ts +7 -0
  695. package/dist/cjs/icons/Media/Visual/VideoCamcorder.js +1 -0
  696. package/dist/cjs/icons/Media/Visual/VideoFilm.d.ts +7 -0
  697. package/dist/cjs/icons/Media/Visual/VideoFilm.js +1 -0
  698. package/dist/cjs/icons/Media/Visual/index.d.ts +13 -0
  699. package/dist/cjs/icons/Social/Channels/Email.d.ts +6 -0
  700. package/dist/cjs/icons/Social/Channels/Email.js +1 -0
  701. package/dist/cjs/icons/Social/Channels/EmailMarketing.d.ts +6 -0
  702. package/dist/cjs/icons/Social/Channels/EmailMarketing.js +1 -0
  703. package/dist/cjs/icons/Social/Channels/Facebook.d.ts +6 -0
  704. package/dist/cjs/icons/Social/Channels/Facebook.js +1 -0
  705. package/dist/cjs/icons/Social/Channels/FacebookComment.d.ts +6 -0
  706. package/dist/cjs/icons/Social/Channels/FacebookComment.js +1 -0
  707. package/dist/cjs/icons/Social/Channels/Instagram.d.ts +6 -0
  708. package/dist/cjs/icons/Social/Channels/Instagram.js +1 -0
  709. package/dist/cjs/icons/Social/Channels/InstagramIcon.d.ts +6 -0
  710. package/dist/cjs/icons/Social/Channels/InstagramIcon.js +1 -0
  711. package/dist/cjs/icons/Social/Channels/Messenger.d.ts +6 -0
  712. package/dist/cjs/icons/Social/Channels/Messenger.js +1 -0
  713. package/dist/cjs/icons/Social/Channels/Tasks.d.ts +6 -0
  714. package/dist/cjs/icons/Social/Channels/Tasks.js +1 -0
  715. package/dist/cjs/icons/Social/Channels/WebPush.d.ts +6 -0
  716. package/dist/cjs/icons/Social/Channels/WebPush.js +1 -0
  717. package/dist/cjs/icons/Social/Channels/WhatsApp.d.ts +6 -0
  718. package/dist/cjs/icons/Social/Channels/WhatsApp.js +1 -0
  719. package/dist/cjs/icons/Social/Channels/index.d.ts +10 -0
  720. package/dist/cjs/icons/Social/Social/EmailMarketing.d.ts +7 -0
  721. package/dist/cjs/icons/Social/Social/EmailMarketing.js +1 -0
  722. package/dist/cjs/icons/Social/Social/Facebook.d.ts +7 -0
  723. package/dist/cjs/icons/Social/Social/Facebook.js +1 -0
  724. package/dist/cjs/icons/Social/Social/Google.d.ts +7 -0
  725. package/dist/cjs/icons/Social/Social/Google.js +1 -0
  726. package/dist/cjs/icons/Social/Social/Instagram.d.ts +7 -0
  727. package/dist/cjs/icons/Social/Social/Instagram.js +1 -0
  728. package/dist/cjs/icons/Social/Social/Messenger.d.ts +7 -0
  729. package/dist/cjs/icons/Social/Social/Messenger.js +1 -0
  730. package/dist/cjs/icons/Social/Social/Rcs.d.ts +7 -0
  731. package/dist/cjs/icons/Social/Social/Rcs.js +1 -0
  732. package/dist/cjs/icons/Social/Social/Twitter.d.ts +7 -0
  733. package/dist/cjs/icons/Social/Social/Twitter.js +1 -0
  734. package/dist/cjs/icons/Social/Social/Website.d.ts +7 -0
  735. package/dist/cjs/icons/Social/Social/Website.js +1 -0
  736. package/dist/cjs/icons/Social/Social/Whatsapp.d.ts +7 -0
  737. package/dist/cjs/icons/Social/Social/Whatsapp.js +1 -0
  738. package/dist/cjs/icons/Social/Social/Youtube.d.ts +7 -0
  739. package/dist/cjs/icons/Social/Social/Youtube.js +1 -0
  740. package/dist/cjs/icons/Social/Social/index.d.ts +10 -0
  741. package/dist/cjs/icons/Toggles/General/Eye.d.ts +7 -0
  742. package/dist/cjs/icons/Toggles/General/Eye.js +1 -0
  743. package/dist/cjs/icons/Toggles/General/EyeClosed.d.ts +7 -0
  744. package/dist/cjs/icons/Toggles/General/EyeClosed.js +1 -0
  745. package/dist/cjs/icons/Toggles/General/EyeOff.d.ts +7 -0
  746. package/dist/cjs/icons/Toggles/General/EyeOff.js +1 -0
  747. package/dist/cjs/icons/Toggles/General/HeartEmpty.d.ts +7 -0
  748. package/dist/cjs/icons/Toggles/General/HeartEmpty.js +1 -0
  749. package/dist/cjs/icons/Toggles/General/HeartFilled.d.ts +7 -0
  750. package/dist/cjs/icons/Toggles/General/HeartFilled.js +1 -0
  751. package/dist/cjs/icons/Toggles/General/Lock.d.ts +7 -0
  752. package/dist/cjs/icons/Toggles/General/Lock.js +1 -0
  753. package/dist/cjs/icons/Toggles/General/StarEmpty.d.ts +7 -0
  754. package/dist/cjs/icons/Toggles/General/StarEmpty.js +1 -0
  755. package/dist/cjs/icons/Toggles/General/StarFilled.d.ts +7 -0
  756. package/dist/cjs/icons/Toggles/General/StarFilled.js +1 -0
  757. package/dist/cjs/icons/Toggles/General/StarHalf.d.ts +7 -0
  758. package/dist/cjs/icons/Toggles/General/StarHalf.js +1 -0
  759. package/dist/cjs/icons/Toggles/General/Unlock.d.ts +7 -0
  760. package/dist/cjs/icons/Toggles/General/Unlock.js +1 -0
  761. package/dist/cjs/icons/Toggles/General/index.d.ts +10 -0
  762. package/dist/cjs/icons/index.d.ts +43 -0
  763. package/dist/cjs/icons/index.js +1 -0
  764. package/dist/cjs/icons/registry.d.ts +10 -0
  765. package/dist/cjs/index.d.ts +3 -0
  766. package/dist/cjs/index.js +1 -1
  767. package/dist/cjs/request-executor/executor.d.ts +99 -0
  768. package/dist/cjs/request-executor/executor.js +1 -0
  769. package/dist/cjs/request-executor/index.d.ts +2 -0
  770. package/dist/cjs/request-executor/model.d.ts +14 -0
  771. package/dist/cjs/utils/logging/ErrorConstructor/ApiError.d.ts +3 -0
  772. package/dist/cjs/utils/logging/ErrorConstructor/ApiError.js +1 -0
  773. package/dist/cjs/utils/logging/ErrorConstructor/BroadcastFlowError.d.ts +4 -0
  774. package/dist/cjs/utils/logging/ErrorConstructor/BroadcastFlowError.js +1 -0
  775. package/dist/cjs/utils/logging/ErrorConstructor/CohortError.d.ts +4 -0
  776. package/dist/cjs/utils/logging/ErrorConstructor/CohortError.js +1 -0
  777. package/dist/cjs/utils/logging/ErrorConstructor/CustomError.d.ts +3 -0
  778. package/dist/cjs/utils/logging/ErrorConstructor/CustomError.js +1 -0
  779. package/dist/cjs/utils/logging/ErrorConstructor/ExcelUploadError.d.ts +3 -0
  780. package/dist/cjs/utils/logging/ErrorConstructor/ExcelUploadError.js +1 -0
  781. package/dist/cjs/utils/logging/ErrorConstructor/FirebaseCallError.d.ts +3 -0
  782. package/dist/cjs/utils/logging/ErrorConstructor/FirebaseCallError.js +1 -0
  783. package/dist/cjs/utils/logging/ErrorConstructor/FirebaseSubscriptionError.d.ts +3 -0
  784. package/dist/cjs/utils/logging/ErrorConstructor/FirebaseSubscriptionError.js +1 -0
  785. package/dist/cjs/utils/logging/ErrorConstructor/RechargeFailure.d.ts +3 -0
  786. package/dist/cjs/utils/logging/ErrorConstructor/RechargeFailure.js +1 -0
  787. package/dist/cjs/utils/logging/ErrorConstructor/WhatsappIntegrationError.d.ts +3 -0
  788. package/dist/cjs/utils/logging/ErrorConstructor/WhatsappIntegrationError.js +1 -0
  789. package/dist/cjs/utils/logging/Logger.d.ts +24 -0
  790. package/dist/cjs/utils/logging/Logger.js +1 -0
  791. package/dist/cjs/utils/logging/index.d.ts +10 -0
  792. package/dist/esm/assets/icons/Ai_event_generating.svg.js +1 -1
  793. package/dist/esm/assets/icons/DocsIcon.d.ts +6 -0
  794. package/dist/esm/assets/icons/DocsIcon.js +1 -0
  795. package/dist/esm/assets/icons/DoubtIcon.d.ts +6 -0
  796. package/dist/esm/assets/icons/DoubtIcon.js +1 -0
  797. package/dist/esm/assets/icons/EditLabel.d.ts +7 -0
  798. package/dist/esm/assets/icons/EditLabel.js +1 -0
  799. package/dist/esm/assets/icons/NotesIcon.d.ts +6 -0
  800. package/dist/esm/assets/icons/NotesIcon.js +1 -0
  801. package/dist/esm/assets/icons/StepsIcon.d.ts +6 -0
  802. package/dist/esm/assets/icons/StepsIcon.js +1 -0
  803. package/dist/esm/assets/icons/StoreIcon.d.ts +6 -0
  804. package/dist/esm/assets/icons/StoreIcon.js +1 -0
  805. package/dist/esm/assets/icons/ThreeColumnsIcon.d.ts +6 -0
  806. package/dist/esm/assets/icons/ThreeColumnsIcon.js +1 -0
  807. package/dist/esm/assets/icons/index.d.ts +7 -0
  808. package/dist/esm/assets/icons/magic-line.svg.js +1 -0
  809. package/dist/esm/assets/icons/refresh-purple.svg.js +1 -0
  810. package/dist/esm/assets/icons/rewind.svg.js +1 -0
  811. package/dist/esm/assets/icons/thumbs_down.svg.js +1 -0
  812. package/dist/esm/assets/icons/thumbs_up.svg.js +1 -0
  813. package/dist/esm/components/ProgressChecklist/MultiChecklistItem.d.ts +29 -1
  814. package/dist/esm/components/ProgressChecklist/ProgressChecklist.d.ts +3 -27
  815. package/dist/esm/components/ProgressChecklist/ProgressChecklist.js +1 -1
  816. package/dist/esm/components/QueryBuilder/Filters/CustomField/components/CustomField.js +1 -1
  817. package/dist/esm/components/QueryBuilder/Filters/Event/components/EventFilter.js +1 -1
  818. package/dist/esm/components/QueryBuilder/Filters/Segment/components/SegmentFilter.js +1 -1
  819. package/dist/esm/components/QueryBuilder/Filters/UserProperty/components/UserPropertyFilter.js +1 -1
  820. package/dist/esm/components/QueryBuilder/Triggers/EVENTS/components/EventsTrigger.d.ts +1 -1
  821. package/dist/esm/components/QueryBuilder/Triggers/EVENTS/components/EventsTrigger.js +1 -1
  822. package/dist/esm/components/QueryBuilder/Triggers/EVENTS/selectors/useIGTriggerNameCacheSelector.d.ts +1 -1
  823. package/dist/esm/components/QueryBuilder/Triggers/IG/components/IGTrigger.d.ts +1 -1
  824. package/dist/esm/components/QueryBuilder/Triggers/IG/selectors/useIGTriggerNameCacheSelector.d.ts +1 -1
  825. package/dist/esm/components/QueryBuilder/Triggers/components/BaseTriggerQueryBuilderNode.d.ts +2 -2
  826. package/dist/esm/components/QueryBuilder/Triggers/components/BaseTriggerQueryBuilderNode.js +1 -1
  827. package/dist/esm/components/QueryBuilder/components/Connectors/Components/EmojiPicker.d.ts +1 -2
  828. package/dist/esm/components/QueryBuilder/components/Connectors/Components/EmojiPicker.js +1 -1
  829. package/dist/esm/components/QueryBuilder/components/Connectors/Components/InTheLast.js +1 -1
  830. package/dist/esm/components/QueryBuilder/components/Connectors/Components/InTwoLast.js +1 -1
  831. package/dist/esm/components/QueryBuilder/components/Connectors/Components/MultiselectDropdownFreeText.js +1 -1
  832. package/dist/esm/components/QueryBuilder/components/Connectors/Components/SingleselectDropdownFreeText.d.ts +5 -2
  833. package/dist/esm/components/QueryBuilder/components/Connectors/Components/SingleselectDropdownFreeText.js +1 -1
  834. package/dist/esm/components/QueryBuilder/components/Connectors/Connector.js +1 -1
  835. package/dist/esm/components/QueryBuilder/components/DropdownWrapper.d.ts +3 -1
  836. package/dist/esm/components/QueryBuilder/components/DropdownWrapper.js +1 -1
  837. package/dist/esm/components/QueryBuilder/components/QueryBuilderNode/Property/PropertyNode.js +1 -1
  838. package/dist/esm/components/QueryBuilder/constants/connector.d.ts +1 -1
  839. package/dist/esm/components/QueryBuilder/constants/connector.js +1 -1
  840. package/dist/esm/components/QueryBuilder/constants/connectorPosition.js +1 -1
  841. package/dist/esm/components/QueryBuilder/helpers/Connector.helper.d.ts +1 -1
  842. package/dist/esm/components/QueryBuilder/helpers/Connector.helper.js +1 -1
  843. package/dist/esm/components/QueryBuilder/helpers/PropertyCustomProcessor.d.ts +1 -1
  844. package/dist/esm/components/QueryBuilder/helpers/SegmentValidator.d.ts +3 -15
  845. package/dist/esm/components/QueryBuilder/types/QueryBuilder.type.d.ts +2 -22
  846. package/dist/esm/components/QueryBuilder/types/QueryBuilder.type.js +1 -1
  847. package/dist/esm/components/QueryBuilder/types/QueryBuilderAPI.type.d.ts +1 -1
  848. package/dist/esm/components/QueryBuilder/types/QueryBuilderConnector.type.d.ts +6 -1
  849. package/dist/esm/components/QueryBuilder/types/QueryBuilderEnum.type.d.ts +21 -0
  850. package/dist/esm/components/QueryBuilder/types/QueryBuilderEnum.type.js +1 -0
  851. package/dist/esm/components/QueryBuilder/types/index.d.ts +2 -1
  852. package/dist/esm/components/SearchFilter/components/DatePickerButton.d.ts +1 -1
  853. package/dist/esm/components/SearchFilter/components/DateRangeOnlyButton.d.ts +1 -1
  854. package/dist/esm/components/SearchFilter/components/SearchFilterItem.d.ts +1 -1
  855. package/dist/esm/components/SearchFilter/components/SearchFilterItem.js +1 -1
  856. package/dist/esm/components/SearchFilter/types/SearchFilter.type.d.ts +1 -1
  857. package/dist/esm/components/TablePagination/TablePagination.d.ts +1 -0
  858. package/dist/esm/components/TablePagination/TablePagination.js +1 -1
  859. package/dist/esm/components/WhatsAppTextEditor/AIRephrase.styled.d.ts +10 -0
  860. package/dist/esm/components/WhatsAppTextEditor/AIRephrase.styled.js +1 -0
  861. package/dist/esm/components/WhatsAppTextEditor/AIRephraseButton.d.ts +20 -0
  862. package/dist/esm/components/WhatsAppTextEditor/AIRephraseButton.js +1 -0
  863. package/dist/esm/components/WhatsAppTextEditor/BorderAnimation.d.ts +11 -0
  864. package/dist/esm/components/WhatsAppTextEditor/BorderAnimation.js +1 -0
  865. package/dist/esm/components/WhatsAppTextEditor/CustomEditor.styled.d.ts +13 -0
  866. package/dist/esm/components/WhatsAppTextEditor/CustomEditor.styled.js +1 -1
  867. package/dist/esm/components/WhatsAppTextEditor/WhatsAppTextEditor.d.ts +131 -3
  868. package/dist/esm/components/WhatsAppTextEditor/WhatsAppTextEditor.js +5 -1
  869. package/dist/esm/components/WhatsAppTextEditor/WhatsAppTextEditorHeader.d.ts +39 -1
  870. package/dist/esm/components/WhatsAppTextEditor/WhatsAppTextEditorHeader.js +1 -1
  871. package/dist/esm/components/WhatsAppTextEditor/ai/actionRegistry.d.ts +15 -0
  872. package/dist/esm/components/WhatsAppTextEditor/ai/actionRegistry.js +1 -0
  873. package/dist/esm/components/WhatsAppTextEditor/ai/aiTag.d.ts +63 -0
  874. package/dist/esm/components/WhatsAppTextEditor/ai/aiTag.js +1 -0
  875. package/dist/esm/components/WhatsAppTextEditor/ai/api.d.ts +22 -0
  876. package/dist/esm/components/WhatsAppTextEditor/ai/api.js +1 -0
  877. package/dist/esm/components/accordion/Accordion.d.ts +2 -35
  878. package/dist/esm/components/accordion/Accordion.model.d.ts +35 -0
  879. package/dist/esm/components/accordion/Accordion.style.d.ts +1 -1
  880. package/dist/esm/components/alerts/Alert.styled.js +9 -8
  881. package/dist/esm/components/analytics-card/AnalyticsCard.d.ts +1 -1
  882. package/dist/esm/components/analytics-card/AnalyticsCard.model.d.ts +1 -0
  883. package/dist/esm/components/analytics-card/AnalyticsCard.styled.d.ts +1 -1
  884. package/dist/esm/components/analytics-chips-and-dropdowns/AnalyticsChip.d.ts +1 -17
  885. package/dist/esm/components/analytics-chips-and-dropdowns/AnalyticsChip.model.d.ts +18 -0
  886. package/dist/esm/components/analytics-chips-and-dropdowns/AnalyticsChipChannelFooter.d.ts +1 -1
  887. package/dist/esm/components/analytics-chips-and-dropdowns/AnalyticsDropdown.js +1 -1
  888. package/dist/esm/components/analytics-chips-and-dropdowns/AnalyticsMultiChip.d.ts +1 -1
  889. package/dist/esm/components/analytics-chips-and-dropdowns/chart/HorizontalBarGraph/HorizontalGraph.js +1 -1
  890. package/dist/esm/components/analytics-chips-and-dropdowns/chart/LazyCharts.d.ts +2 -0
  891. package/dist/esm/components/analytics-chips-and-dropdowns/chart/LazyCharts.js +1 -0
  892. package/dist/esm/components/analytics-chips-and-dropdowns/chart/Pie/PieChartAnalytics.js +1 -1
  893. package/dist/esm/components/analytics-chips-and-dropdowns/chart/VerticalBarGraph/VerticalGraph.js +1 -1
  894. package/dist/esm/components/analytics-chips-and-dropdowns/chart/heatmap/HeatMap.d.ts +4 -0
  895. package/dist/esm/components/analytics-chips-and-dropdowns/chart/heatmap/HeatMap.js +1 -1
  896. package/dist/esm/components/avatar/Avatar.js +1 -1
  897. package/dist/esm/components/bik-layout/BikHeader.js +1 -1
  898. package/dist/esm/components/bik-layout/BikSidebar.d.ts +1 -1
  899. package/dist/esm/components/bik-layout/CommonStyles.js +1 -1
  900. package/dist/esm/components/bik-layout/Sidebar.model.d.ts +27 -0
  901. package/dist/esm/components/bik-layout/SidebarPopup.d.ts +1 -1
  902. package/dist/esm/components/bik-layout/SidebarSkeleton.d.ts +1 -1
  903. package/dist/esm/components/bik-layout/SidebarStyles.d.ts +1 -1
  904. package/dist/esm/components/bik-layout/SimpleSidebar.d.ts +1 -27
  905. package/dist/esm/components/country-code-picker/CountryCodePicker.js +1 -1
  906. package/dist/esm/components/country-code-picker/CountryPicker.js +1 -1
  907. package/dist/esm/components/custom-date-time/CustomDateTime.js +1 -1
  908. package/dist/esm/components/custom-date-time/DateSelector/DateSelector.js +1 -1
  909. package/dist/esm/components/data-source-panel/DataSourceInfoFooter.js +1 -1
  910. package/dist/esm/components/datePicker/TimePicker.js +1 -1
  911. package/dist/esm/components/discount-modal/CouponExpiration/CouponExpiration.js +1 -1
  912. package/dist/esm/components/discount-modal/DiscountModal.js +1 -1
  913. package/dist/esm/components/discount-modal/DynamicCoupon/DynamicCoupon.js +1 -1
  914. package/dist/esm/components/discount-modal/DynamicCoupon/MinimumRequirementComponent.js +1 -1
  915. package/dist/esm/components/dropdown/Dropdown.d.ts +2 -0
  916. package/dist/esm/components/dropdown/Dropdown.js +1 -1
  917. package/dist/esm/components/dropdown/DropdownPopover/index.js +1 -1
  918. package/dist/esm/components/dropdown/OpenedDropdown/components/OpennedDropdown.js +1 -1
  919. package/dist/esm/components/dropdown/OpenedDropdown/components/menu/MenuItem.d.ts +6 -0
  920. package/dist/esm/components/dropdown/OpenedDropdown/components/menu/MenuItem.js +36 -6
  921. package/dist/esm/components/dropdown/OpenedDropdown/components/menu/MenuList.d.ts +2 -0
  922. package/dist/esm/components/dropdown/OpenedDropdown/components/menu/MenuList.js +1 -1
  923. package/dist/esm/components/dropdown/OpenedDropdown/components/multiSelect/MultiSelectDropdownBottomBar.d.ts +1 -0
  924. package/dist/esm/components/dropdown/OpenedDropdown/components/multiSelect/MultiSelectDropdownBottomBar.js +1 -1
  925. package/dist/esm/components/dropdown/OpenedDropdown/components/searchbox/SearchZeroState.d.ts +2 -0
  926. package/dist/esm/components/dropdown/OpenedDropdown/components/searchbox/SearchZeroState.js +1 -1
  927. package/dist/esm/components/dropdown/hooks/useDropdown.d.ts +2 -0
  928. package/dist/esm/components/dropdown/hooks/useDropdown.js +1 -1
  929. package/dist/esm/components/dropdown/type.d.ts +17 -0
  930. package/dist/esm/components/dropdown-button/DropdownButton.js +1 -1
  931. package/dist/esm/components/feature-announcements/MajorUpdatePopup.js +1 -1
  932. package/dist/esm/components/feature-announcements/MinorUpdatePopup.js +1 -1
  933. package/dist/esm/components/feature-announcements/types/feature.types.d.ts +1 -0
  934. package/dist/esm/components/floating-input-dropdown/FloatingInputDropdown.d.ts +1 -1
  935. package/dist/esm/components/image-cropper/BikImageCropper.d.ts +1 -6
  936. package/dist/esm/components/image-cropper/BikImageCropper.model.d.ts +6 -0
  937. package/dist/esm/components/image-cropper/BikImagePipeline/BikImagePipeline.d.ts +1 -1
  938. package/dist/esm/components/input/ChipInput.js +1 -1
  939. package/dist/esm/components/input/ChipInput.styled.d.ts +6 -66
  940. package/dist/esm/components/input/ChipInput.styled.js +1 -1
  941. package/dist/esm/components/input/Input-helper.d.ts +3 -1
  942. package/dist/esm/components/input/Input-helper.js +1 -1
  943. package/dist/esm/components/input/Input.d.ts +1 -71
  944. package/dist/esm/components/input/Input.js +1 -1
  945. package/dist/esm/components/input/Input.model.d.ts +76 -0
  946. package/dist/esm/components/input/Input.styled.d.ts +2 -1
  947. package/dist/esm/components/input/Input.styled.js +1 -1
  948. package/dist/esm/components/input-with-vars/InputWithVariables.d.ts +1 -1
  949. package/dist/esm/components/list-item/List.model.d.ts +18 -0
  950. package/dist/esm/components/list-item/ListItem.d.ts +1 -17
  951. package/dist/esm/components/list-item/ListItem.styled.d.ts +1 -1
  952. package/dist/esm/components/list-item/themes.d.ts +1 -1
  953. package/dist/esm/components/multi-level-dropdown/GroupedMenuList.d.ts +6 -1
  954. package/dist/esm/components/multi-level-dropdown/GroupedMenuList.js +1 -1
  955. package/dist/esm/components/multi-level-dropdown/MenuItem.d.ts +5 -1
  956. package/dist/esm/components/multi-level-dropdown/MenuItem.js +1 -1
  957. package/dist/esm/components/multi-level-dropdown/MenuList.d.ts +4 -0
  958. package/dist/esm/components/multi-level-dropdown/MenuList.js +1 -1
  959. package/dist/esm/components/multi-level-dropdown/MultiLevelDropdown.js +1 -1
  960. package/dist/esm/components/multi-level-dropdown/type.d.ts +5 -1
  961. package/dist/esm/components/product-picker-v2/ProductPickerTag.d.ts +2 -2
  962. package/dist/esm/components/product-picker-v2/collectionScreen.d.ts +3 -3
  963. package/dist/esm/components/product-picker-v2/helpers/ProductHelper.d.ts +3 -4
  964. package/dist/esm/components/product-picker-v2/index.d.ts +1 -1
  965. package/dist/esm/components/product-picker-v2/modal.d.ts +2 -58
  966. package/dist/esm/components/product-picker-v2/product.d.ts +2 -3
  967. package/dist/esm/components/product-picker-v2/productInfoOverlay.d.ts +1 -2
  968. package/dist/esm/components/product-picker-v2/productScreen.d.ts +3 -3
  969. package/dist/esm/components/product-picker-v2/productScreen.js +1 -1
  970. package/dist/esm/components/product-picker-v2/rearrangeScreen.d.ts +3 -4
  971. package/dist/esm/components/product-picker-v2/rearrangeScreen.js +1 -1
  972. package/dist/esm/components/product-picker-v2/reducers.d.ts +1 -1
  973. package/dist/esm/components/product-picker-v2/reducers.js +1 -1
  974. package/dist/esm/components/product-picker-v2/searchScreen.d.ts +3 -4
  975. package/dist/esm/components/product-picker-v2/selectedScreen.d.ts +3 -4
  976. package/dist/esm/components/product-picker-v2/type.d.ts +65 -0
  977. package/dist/esm/components/product-picker-v2/utility.d.ts +3 -3
  978. package/dist/esm/components/product-picker-v2/utility.js +1 -1
  979. package/dist/esm/components/product-picker-v2/variant.d.ts +2 -12
  980. package/dist/esm/components/product-picker-v2/variantComponents.d.ts +2 -3
  981. package/dist/esm/components/product-picker-v2/variantComponents.js +1 -1
  982. package/dist/esm/components/radioButton/RadioButton.d.ts +1 -0
  983. package/dist/esm/components/radioButton/RadioButton.js +1 -1
  984. package/dist/esm/components/sample-button/SampleButton.d.ts +1 -16
  985. package/dist/esm/components/sample-button/SampleButton.model.d.ts +17 -0
  986. package/dist/esm/components/sample-button/SampleButton.styled.d.ts +1 -1
  987. package/dist/esm/components/sample-button/themes.d.ts +1 -1
  988. package/dist/esm/components/searchBar/searchBar.d.ts +1 -1
  989. package/dist/esm/components/slider/slider.js +1 -1
  990. package/dist/esm/components/stepper/Stepper.d.ts +1 -17
  991. package/dist/esm/components/stepper/Stepper.model.d.ts +17 -0
  992. package/dist/esm/components/stepper/Stepper.styled.d.ts +1 -1
  993. package/dist/esm/components/stepper/StepperService.d.ts +1 -1
  994. package/dist/esm/components/stepper/themes.d.ts +1 -1
  995. package/dist/esm/components/tag/Tag.d.ts +1 -1
  996. package/dist/esm/components/tag/Tag.js +1 -1
  997. package/dist/esm/components/tag/Tag.stories.d.ts +5 -5
  998. package/dist/esm/components/tag/Tag.styled.d.ts +3 -0
  999. package/dist/esm/components/tag/Tag.styled.js +1 -1
  1000. package/dist/esm/components/tag/model.d.ts +15 -0
  1001. package/dist/esm/components/template-context-mapper/TemplateContextMapper.d.ts +9 -9
  1002. package/dist/esm/components/template-context-mapper/TemplateContextMapper.js +1 -1
  1003. package/dist/esm/components/template-context-mapper/context/templateModalContext.d.ts +7 -7
  1004. package/dist/esm/components/template-context-mapper/custom-hooks/useAdditionalVariables.d.ts +1 -1
  1005. package/dist/esm/components/template-context-mapper/helpers/WebpushTemplateHelper.d.ts +6 -4
  1006. package/dist/esm/components/template-context-mapper/helpers/WebpushTemplateHelper.js +1 -1
  1007. package/dist/esm/components/template-context-mapper/modalElements/Body.d.ts +2 -2
  1008. package/dist/esm/components/template-context-mapper/modalElements/Body.js +10 -10
  1009. package/dist/esm/components/template-context-mapper/modalElements/DesktopPreview.js +6 -6
  1010. package/dist/esm/components/template-context-mapper/modalElements/EditMediaModal.d.ts +3 -3
  1011. package/dist/esm/components/template-context-mapper/modalElements/EditMediaModal.js +1 -1
  1012. package/dist/esm/components/template-context-mapper/modalElements/EditWebpushTemplate.d.ts +2 -2
  1013. package/dist/esm/components/template-context-mapper/modalElements/EditWebpushTemplate.js +1 -1
  1014. package/dist/esm/components/template-context-mapper/modalElements/EditWhatsAppCarouselTemplateV2.d.ts +3 -14
  1015. package/dist/esm/components/template-context-mapper/modalElements/EditWhatsAppCarouselTemplateV2.js +1 -1
  1016. package/dist/esm/components/template-context-mapper/modalElements/EditWhatsAppTemplateV2.d.ts +5 -5
  1017. package/dist/esm/components/template-context-mapper/modalElements/EditWhatsAppTemplateV2.js +1 -1
  1018. package/dist/esm/components/template-context-mapper/modalElements/Footer.js +4 -4
  1019. package/dist/esm/components/template-context-mapper/modalElements/MobilePreview.d.ts +1 -1
  1020. package/dist/esm/components/template-context-mapper/modalElements/MobilePreview.js +5 -5
  1021. package/dist/esm/components/template-context-mapper/modalElements/QualityWarningModal.d.ts +1 -1
  1022. package/dist/esm/components/template-context-mapper/modalElements/TemplateAnalyticsComponent.d.ts +1 -1
  1023. package/dist/esm/components/template-context-mapper/modalElements/TemplateSelectModalContent.d.ts +2 -2
  1024. package/dist/esm/components/template-context-mapper/modalElements/VariableConnector.d.ts +1 -1
  1025. package/dist/esm/components/template-context-mapper/modalElements/VariableConnector.js +1 -1
  1026. package/dist/esm/components/template-context-mapper/modalElements/VariableConnectorWhatsApp.d.ts +5 -4
  1027. package/dist/esm/components/template-context-mapper/modalElements/VariableConnectorWhatsApp.js +1 -1
  1028. package/dist/esm/components/template-context-mapper/modalElements/VariableEditorHeader.d.ts +1 -1
  1029. package/dist/esm/components/template-context-mapper/modalElements/WhatsAppTemplateCardButtonV2.d.ts +2 -2
  1030. package/dist/esm/components/template-context-mapper/modalElements/WhatsAppTemplateCardButtonV2.js +1 -1
  1031. package/dist/esm/components/template-context-mapper/modalElements/modal.d.ts +13 -0
  1032. package/dist/esm/components/template-context-mapper/modalElements/useEditWhtasappTemplateMedia.d.ts +1 -1
  1033. package/dist/esm/components/template-context-mapper/modalElements/useEditWhtasappTemplateMedia.js +1 -1
  1034. package/dist/esm/components/template-context-mapper/utils/convertPlaceholdersToBikDropdown.d.ts +2 -2
  1035. package/dist/esm/components/template-context-mapper/utils/getDataFromTemplateComponent.d.ts +2 -2
  1036. package/dist/esm/components/template-context-mapper/utils/highlightFor.d.ts +1 -1
  1037. package/dist/esm/components/template-preview/TemplatePreview.js +1 -1
  1038. package/dist/esm/components/template-preview/models/TemplateMeta.d.ts +1 -1
  1039. package/dist/esm/components/template-preview/models/WhatsAppTemplate.d.ts +1 -0
  1040. package/dist/esm/components/template-preview/models/WhatsappCarouselTemplate.d.ts +4 -2
  1041. package/dist/esm/components/toaster/Toaster.styled.js +1 -1
  1042. package/dist/esm/components/variable-picker-v3/SubHeaderItems.js +1 -1
  1043. package/dist/esm/components/zeroState/ZeroState.js +2 -1
  1044. package/dist/esm/firebase/environment.d.ts +58 -0
  1045. package/dist/esm/firebase/environment.js +1 -0
  1046. package/dist/esm/firebase/firebaseUserFetcher.d.ts +34 -0
  1047. package/dist/esm/firebase/firebaseUserFetcher.js +1 -0
  1048. package/dist/esm/firebase/index.d.ts +7 -0
  1049. package/dist/esm/firebase/lazyFirebaseApp.d.ts +22 -0
  1050. package/dist/esm/firebase/lazyFirebaseApp.js +1 -0
  1051. package/dist/esm/firebase/lazyFirebaseMethods.d.ts +589 -0
  1052. package/dist/esm/firebase/lazyFirebaseMethods.js +1 -0
  1053. package/dist/esm/firebase/lazyFirestore.d.ts +6 -0
  1054. package/dist/esm/firebase/lazyFirestore.js +1 -0
  1055. package/dist/esm/firebase/lazyFirestoreLite.d.ts +6 -0
  1056. package/dist/esm/firebase/lazyFirestoreLite.js +1 -0
  1057. package/dist/esm/firebase/lazyStorage.d.ts +5 -0
  1058. package/dist/esm/firebase/lazyStorage.js +1 -0
  1059. package/dist/esm/helpers/BaseWhatsappContentLang.helper.js +1 -1
  1060. package/dist/esm/icons/Actions/Common actions/Activate.d.ts +7 -0
  1061. package/dist/esm/icons/Actions/Common actions/Activate.js +1 -0
  1062. package/dist/esm/icons/Actions/Common actions/Code.d.ts +7 -0
  1063. package/dist/esm/icons/Actions/Common actions/Code.js +1 -0
  1064. package/dist/esm/icons/Actions/Common actions/Cross.d.ts +7 -0
  1065. package/dist/esm/icons/Actions/Common actions/Cross.js +1 -0
  1066. package/dist/esm/icons/Actions/Common actions/Deactivate.d.ts +7 -0
  1067. package/dist/esm/icons/Actions/Common actions/Deactivate.js +1 -0
  1068. package/dist/esm/icons/Actions/Common actions/Delete.d.ts +7 -0
  1069. package/dist/esm/icons/Actions/Common actions/Delete.js +1 -0
  1070. package/dist/esm/icons/Actions/Common actions/Edit.d.ts +7 -0
  1071. package/dist/esm/icons/Actions/Common actions/Edit.js +1 -0
  1072. package/dist/esm/icons/Actions/Common actions/Forward.d.ts +7 -0
  1073. package/dist/esm/icons/Actions/Common actions/Forward.js +1 -0
  1074. package/dist/esm/icons/Actions/Common actions/Fullscreen.d.ts +7 -0
  1075. package/dist/esm/icons/Actions/Common actions/Fullscreen.js +1 -0
  1076. package/dist/esm/icons/Actions/Common actions/LinkSimpleHorizontal.d.ts +7 -0
  1077. package/dist/esm/icons/Actions/Common actions/LinkSimpleHorizontal.js +1 -0
  1078. package/dist/esm/icons/Actions/Common actions/Minus.d.ts +7 -0
  1079. package/dist/esm/icons/Actions/Common actions/Minus.js +1 -0
  1080. package/dist/esm/icons/Actions/Common actions/Plus.d.ts +7 -0
  1081. package/dist/esm/icons/Actions/Common actions/Plus.js +1 -0
  1082. package/dist/esm/icons/Actions/Common actions/SendAirplane.d.ts +7 -0
  1083. package/dist/esm/icons/Actions/Common actions/SendAirplane.js +1 -0
  1084. package/dist/esm/icons/Actions/Common actions/ShareAndroid.d.ts +7 -0
  1085. package/dist/esm/icons/Actions/Common actions/ShareAndroid.js +1 -0
  1086. package/dist/esm/icons/Actions/Common actions/index.d.ts +13 -0
  1087. package/dist/esm/icons/Actions/Formatting/CheckboxIcon.d.ts +7 -0
  1088. package/dist/esm/icons/Actions/Formatting/CheckboxIcon.js +1 -0
  1089. package/dist/esm/icons/Actions/Formatting/Copy.d.ts +7 -0
  1090. package/dist/esm/icons/Actions/Formatting/Copy.js +1 -0
  1091. package/dist/esm/icons/Actions/Formatting/Dropdown.d.ts +7 -0
  1092. package/dist/esm/icons/Actions/Formatting/Dropdown.js +1 -0
  1093. package/dist/esm/icons/Actions/Formatting/MultiLine.d.ts +7 -0
  1094. package/dist/esm/icons/Actions/Formatting/MultiLine.js +1 -0
  1095. package/dist/esm/icons/Actions/Formatting/MultiSelect.d.ts +7 -0
  1096. package/dist/esm/icons/Actions/Formatting/MultiSelect.js +1 -0
  1097. package/dist/esm/icons/Actions/Formatting/Number.d.ts +7 -0
  1098. package/dist/esm/icons/Actions/Formatting/Number.js +1 -0
  1099. package/dist/esm/icons/Actions/Formatting/Text.d.ts +7 -0
  1100. package/dist/esm/icons/Actions/Formatting/Text.js +1 -0
  1101. package/dist/esm/icons/Actions/Formatting/Textbox.d.ts +7 -0
  1102. package/dist/esm/icons/Actions/Formatting/Textbox.js +1 -0
  1103. package/dist/esm/icons/Actions/Formatting/index.d.ts +8 -0
  1104. package/dist/esm/icons/Actions/Navigation/ArrowRedo.d.ts +7 -0
  1105. package/dist/esm/icons/Actions/Navigation/ArrowRedo.js +1 -0
  1106. package/dist/esm/icons/Actions/Navigation/ArrowUndo.d.ts +7 -0
  1107. package/dist/esm/icons/Actions/Navigation/ArrowUndo.js +1 -0
  1108. package/dist/esm/icons/Actions/Navigation/LogIn.d.ts +7 -0
  1109. package/dist/esm/icons/Actions/Navigation/LogIn.js +1 -0
  1110. package/dist/esm/icons/Actions/Navigation/LogOut.d.ts +7 -0
  1111. package/dist/esm/icons/Actions/Navigation/LogOut.js +1 -0
  1112. package/dist/esm/icons/Actions/Navigation/OpenNewWindow.d.ts +7 -0
  1113. package/dist/esm/icons/Actions/Navigation/OpenNewWindow.js +1 -0
  1114. package/dist/esm/icons/Actions/Navigation/Refresh.d.ts +7 -0
  1115. package/dist/esm/icons/Actions/Navigation/Refresh.js +1 -0
  1116. package/dist/esm/icons/Actions/Navigation/Rewind.d.ts +7 -0
  1117. package/dist/esm/icons/Actions/Navigation/Rewind.js +1 -0
  1118. package/dist/esm/icons/Actions/Navigation/Sync.d.ts +7 -0
  1119. package/dist/esm/icons/Actions/Navigation/Sync.js +1 -0
  1120. package/dist/esm/icons/Actions/Navigation/index.d.ts +8 -0
  1121. package/dist/esm/icons/Actions/Selection/HandleDrag.d.ts +7 -0
  1122. package/dist/esm/icons/Actions/Selection/HandleDrag.js +1 -0
  1123. package/dist/esm/icons/Actions/Selection/SingleChoice.d.ts +7 -0
  1124. package/dist/esm/icons/Actions/Selection/SingleChoice.js +1 -0
  1125. package/dist/esm/icons/Actions/Selection/index.d.ts +2 -0
  1126. package/dist/esm/icons/Arrows/Carat/CaratDown.d.ts +7 -0
  1127. package/dist/esm/icons/Arrows/Carat/CaratDown.js +1 -0
  1128. package/dist/esm/icons/Arrows/Carat/CaratLeft.d.ts +7 -0
  1129. package/dist/esm/icons/Arrows/Carat/CaratLeft.js +1 -0
  1130. package/dist/esm/icons/Arrows/Carat/CaratRight.d.ts +7 -0
  1131. package/dist/esm/icons/Arrows/Carat/CaratRight.js +1 -0
  1132. package/dist/esm/icons/Arrows/Carat/CaratUp.d.ts +7 -0
  1133. package/dist/esm/icons/Arrows/Carat/CaratUp.js +1 -0
  1134. package/dist/esm/icons/Arrows/Carat/index.d.ts +4 -0
  1135. package/dist/esm/icons/Arrows/Chevron/ChevronDown.d.ts +7 -0
  1136. package/dist/esm/icons/Arrows/Chevron/ChevronDown.js +1 -0
  1137. package/dist/esm/icons/Arrows/Chevron/ChevronLeft.d.ts +7 -0
  1138. package/dist/esm/icons/Arrows/Chevron/ChevronLeft.js +1 -0
  1139. package/dist/esm/icons/Arrows/Chevron/ChevronRight.d.ts +7 -0
  1140. package/dist/esm/icons/Arrows/Chevron/ChevronRight.js +1 -0
  1141. package/dist/esm/icons/Arrows/Chevron/ChevronUp.d.ts +7 -0
  1142. package/dist/esm/icons/Arrows/Chevron/ChevronUp.js +1 -0
  1143. package/dist/esm/icons/Arrows/Chevron/index.d.ts +4 -0
  1144. package/dist/esm/icons/Arrows/Double chevron/ChevronDoubleDown.d.ts +7 -0
  1145. package/dist/esm/icons/Arrows/Double chevron/ChevronDoubleDown.js +1 -0
  1146. package/dist/esm/icons/Arrows/Double chevron/ChevronDoubleLeft.d.ts +7 -0
  1147. package/dist/esm/icons/Arrows/Double chevron/ChevronDoubleLeft.js +1 -0
  1148. package/dist/esm/icons/Arrows/Double chevron/ChevronDoubleRight.d.ts +7 -0
  1149. package/dist/esm/icons/Arrows/Double chevron/ChevronDoubleRight.js +1 -0
  1150. package/dist/esm/icons/Arrows/Double chevron/ChevronDoubleUp.d.ts +7 -0
  1151. package/dist/esm/icons/Arrows/Double chevron/ChevronDoubleUp.js +1 -0
  1152. package/dist/esm/icons/Arrows/Double chevron/index.d.ts +4 -0
  1153. package/dist/esm/icons/Arrows/Normal arrows/ArrowDown.d.ts +7 -0
  1154. package/dist/esm/icons/Arrows/Normal arrows/ArrowDown.js +1 -0
  1155. package/dist/esm/icons/Arrows/Normal arrows/ArrowDownLeft.d.ts +7 -0
  1156. package/dist/esm/icons/Arrows/Normal arrows/ArrowDownLeft.js +1 -0
  1157. package/dist/esm/icons/Arrows/Normal arrows/ArrowDownRight.d.ts +7 -0
  1158. package/dist/esm/icons/Arrows/Normal arrows/ArrowDownRight.js +1 -0
  1159. package/dist/esm/icons/Arrows/Normal arrows/ArrowLeft.d.ts +7 -0
  1160. package/dist/esm/icons/Arrows/Normal arrows/ArrowLeft.js +1 -0
  1161. package/dist/esm/icons/Arrows/Normal arrows/ArrowRight.d.ts +7 -0
  1162. package/dist/esm/icons/Arrows/Normal arrows/ArrowRight.js +1 -0
  1163. package/dist/esm/icons/Arrows/Normal arrows/ArrowUp.d.ts +7 -0
  1164. package/dist/esm/icons/Arrows/Normal arrows/ArrowUp.js +1 -0
  1165. package/dist/esm/icons/Arrows/Normal arrows/ArrowUpLeft.d.ts +7 -0
  1166. package/dist/esm/icons/Arrows/Normal arrows/ArrowUpLeft.js +1 -0
  1167. package/dist/esm/icons/Arrows/Normal arrows/ArrowUpRight.d.ts +7 -0
  1168. package/dist/esm/icons/Arrows/Normal arrows/ArrowUpRight.js +1 -0
  1169. package/dist/esm/icons/Arrows/Normal arrows/index.d.ts +8 -0
  1170. package/dist/esm/icons/Arrows/Special/ArrowSwitch.d.ts +7 -0
  1171. package/dist/esm/icons/Arrows/Special/ArrowSwitch.js +1 -0
  1172. package/dist/esm/icons/Arrows/Special/index.d.ts +1 -0
  1173. package/dist/esm/icons/BIK AI specific/AiEmoji.d.ts +7 -0
  1174. package/dist/esm/icons/BIK AI specific/AiEmoji.js +1 -0
  1175. package/dist/esm/icons/BIK AI specific/AiRobot.d.ts +7 -0
  1176. package/dist/esm/icons/BIK AI specific/AiRobot.js +1 -0
  1177. package/dist/esm/icons/BIK AI specific/Expand.d.ts +7 -0
  1178. package/dist/esm/icons/BIK AI specific/Expand.js +1 -0
  1179. package/dist/esm/icons/BIK AI specific/GeminiSparkle.d.ts +7 -0
  1180. package/dist/esm/icons/BIK AI specific/ManifestSparkle.d.ts +7 -0
  1181. package/dist/esm/icons/BIK AI specific/PricePlease.d.ts +7 -0
  1182. package/dist/esm/icons/BIK AI specific/PricePlease.js +1 -0
  1183. package/dist/esm/icons/BIK AI specific/Shape.d.ts +7 -0
  1184. package/dist/esm/icons/BIK AI specific/Shape.js +1 -0
  1185. package/dist/esm/icons/BIK AI specific/Shorter.d.ts +7 -0
  1186. package/dist/esm/icons/BIK AI specific/Shorter.js +1 -0
  1187. package/dist/esm/icons/BIK AI specific/Sparkling2Line.d.ts +7 -0
  1188. package/dist/esm/icons/BIK AI specific/Sparkling2Line.js +1 -0
  1189. package/dist/esm/icons/BIK AI specific/Write.d.ts +7 -0
  1190. package/dist/esm/icons/BIK AI specific/Write.js +1 -0
  1191. package/dist/esm/icons/BIK AI specific/index.d.ts +10 -0
  1192. package/dist/esm/icons/Informational/Common UI/Bell.d.ts +7 -0
  1193. package/dist/esm/icons/Informational/Common UI/Bell.js +1 -0
  1194. package/dist/esm/icons/Informational/Common UI/BellSync.d.ts +7 -0
  1195. package/dist/esm/icons/Informational/Common UI/BellSync.js +1 -0
  1196. package/dist/esm/icons/Informational/Common UI/Bulb.d.ts +7 -0
  1197. package/dist/esm/icons/Informational/Common UI/Bulb.js +1 -0
  1198. package/dist/esm/icons/Informational/Common UI/MenuHamburger.d.ts +7 -0
  1199. package/dist/esm/icons/Informational/Common UI/MenuHamburger.js +1 -0
  1200. package/dist/esm/icons/Informational/Common UI/MessageSearch.d.ts +7 -0
  1201. package/dist/esm/icons/Informational/Common UI/MessageSearch.js +1 -0
  1202. package/dist/esm/icons/Informational/Common UI/MoreHorizontal.d.ts +7 -0
  1203. package/dist/esm/icons/Informational/Common UI/MoreHorizontal.js +1 -0
  1204. package/dist/esm/icons/Informational/Common UI/MoreVertical.d.ts +7 -0
  1205. package/dist/esm/icons/Informational/Common UI/MoreVertical.js +1 -0
  1206. package/dist/esm/icons/Informational/Common UI/Placeholder.d.ts +7 -0
  1207. package/dist/esm/icons/Informational/Common UI/Search.d.ts +7 -0
  1208. package/dist/esm/icons/Informational/Common UI/Search.js +1 -0
  1209. package/dist/esm/icons/Informational/Common UI/Settings.d.ts +7 -0
  1210. package/dist/esm/icons/Informational/Common UI/Settings.js +1 -0
  1211. package/dist/esm/icons/Informational/Common UI/Training.d.ts +7 -0
  1212. package/dist/esm/icons/Informational/Common UI/Training.js +1 -0
  1213. package/dist/esm/icons/Informational/Common UI/index.d.ts +11 -0
  1214. package/dist/esm/icons/Informational/Communication/Chat.d.ts +7 -0
  1215. package/dist/esm/icons/Informational/Communication/Chat.js +1 -0
  1216. package/dist/esm/icons/Informational/Communication/ChatCheck.d.ts +7 -0
  1217. package/dist/esm/icons/Informational/Communication/ChatCheck.js +1 -0
  1218. package/dist/esm/icons/Informational/Communication/ChatQuestion.d.ts +7 -0
  1219. package/dist/esm/icons/Informational/Communication/ChatQuestion.js +1 -0
  1220. package/dist/esm/icons/Informational/Communication/ChatStar.d.ts +7 -0
  1221. package/dist/esm/icons/Informational/Communication/ChatStar.js +1 -0
  1222. package/dist/esm/icons/Informational/Communication/Email.d.ts +7 -0
  1223. package/dist/esm/icons/Informational/Communication/Email.js +1 -0
  1224. package/dist/esm/icons/Informational/Communication/LiveChat.d.ts +7 -0
  1225. package/dist/esm/icons/Informational/Communication/LiveChat.js +1 -0
  1226. package/dist/esm/icons/Informational/Communication/Phone.d.ts +7 -0
  1227. package/dist/esm/icons/Informational/Communication/Phone.js +1 -0
  1228. package/dist/esm/icons/Informational/Communication/index.d.ts +7 -0
  1229. package/dist/esm/icons/Informational/Customer intent/ClipboardCheck.d.ts +7 -0
  1230. package/dist/esm/icons/Informational/Customer intent/ClipboardCheck.js +1 -0
  1231. package/dist/esm/icons/Informational/Customer intent/Experimental.d.ts +7 -0
  1232. package/dist/esm/icons/Informational/Customer intent/Experimental.js +1 -0
  1233. package/dist/esm/icons/Informational/Customer intent/Help.d.ts +7 -0
  1234. package/dist/esm/icons/Informational/Customer intent/Help.js +1 -0
  1235. package/dist/esm/icons/Informational/Customer intent/Percent.d.ts +7 -0
  1236. package/dist/esm/icons/Informational/Customer intent/Percent.js +1 -0
  1237. package/dist/esm/icons/Informational/Customer intent/Purchase.d.ts +7 -0
  1238. package/dist/esm/icons/Informational/Customer intent/Purchase.js +1 -0
  1239. package/dist/esm/icons/Informational/Customer intent/Services.d.ts +7 -0
  1240. package/dist/esm/icons/Informational/Customer intent/Services.js +1 -0
  1241. package/dist/esm/icons/Informational/Customer intent/ShoppingCart.d.ts +7 -0
  1242. package/dist/esm/icons/Informational/Customer intent/ShoppingCart.js +1 -0
  1243. package/dist/esm/icons/Informational/Customer intent/SingleChoice.d.ts +7 -0
  1244. package/dist/esm/icons/Informational/Customer intent/SingleChoice.js +1 -0
  1245. package/dist/esm/icons/Informational/Customer intent/Unsatisfactory.d.ts +7 -0
  1246. package/dist/esm/icons/Informational/Customer intent/Unsatisfactory.js +1 -0
  1247. package/dist/esm/icons/Informational/Customer intent/UserSound.d.ts +7 -0
  1248. package/dist/esm/icons/Informational/Customer intent/UserSound.js +1 -0
  1249. package/dist/esm/icons/Informational/Customer intent/index.d.ts +10 -0
  1250. package/dist/esm/icons/Informational/Date and time/Calendar.d.ts +7 -0
  1251. package/dist/esm/icons/Informational/Date and time/Calendar.js +1 -0
  1252. package/dist/esm/icons/Informational/Date and time/CalendarAdd.d.ts +7 -0
  1253. package/dist/esm/icons/Informational/Date and time/CalendarAdd.js +1 -0
  1254. package/dist/esm/icons/Informational/Date and time/Clock.d.ts +7 -0
  1255. package/dist/esm/icons/Informational/Date and time/Clock.js +1 -0
  1256. package/dist/esm/icons/Informational/Date and time/HourGlass.d.ts +7 -0
  1257. package/dist/esm/icons/Informational/Date and time/HourGlass.js +1 -0
  1258. package/dist/esm/icons/Informational/Date and time/WorkingHours.d.ts +7 -0
  1259. package/dist/esm/icons/Informational/Date and time/WorkingHours.js +1 -0
  1260. package/dist/esm/icons/Informational/Date and time/index.d.ts +5 -0
  1261. package/dist/esm/icons/Informational/Files and folders/Archive1.d.ts +7 -0
  1262. package/dist/esm/icons/Informational/Files and folders/Archive1.js +1 -0
  1263. package/dist/esm/icons/Informational/Files and folders/Excel.d.ts +7 -0
  1264. package/dist/esm/icons/Informational/Files and folders/Excel.js +1 -0
  1265. package/dist/esm/icons/Informational/Files and folders/File.d.ts +7 -0
  1266. package/dist/esm/icons/Informational/Files and folders/File.js +1 -0
  1267. package/dist/esm/icons/Informational/Files and folders/FileCsv.d.ts +7 -0
  1268. package/dist/esm/icons/Informational/Files and folders/FileCsv.js +1 -0
  1269. package/dist/esm/icons/Informational/Files and folders/FilePage.d.ts +7 -0
  1270. package/dist/esm/icons/Informational/Files and folders/FilePage.js +1 -0
  1271. package/dist/esm/icons/Informational/Files and folders/FilePdf.d.ts +7 -0
  1272. package/dist/esm/icons/Informational/Files and folders/FilePdf.js +1 -0
  1273. package/dist/esm/icons/Informational/Files and folders/Folder.d.ts +7 -0
  1274. package/dist/esm/icons/Informational/Files and folders/Folder.js +1 -0
  1275. package/dist/esm/icons/Informational/Files and folders/MediaMessage.d.ts +7 -0
  1276. package/dist/esm/icons/Informational/Files and folders/MediaMessage.js +1 -0
  1277. package/dist/esm/icons/Informational/Files and folders/Move.d.ts +7 -0
  1278. package/dist/esm/icons/Informational/Files and folders/Move.js +1 -0
  1279. package/dist/esm/icons/Informational/Files and folders/OrderHistory.d.ts +7 -0
  1280. package/dist/esm/icons/Informational/Files and folders/OrderHistory.js +1 -0
  1281. package/dist/esm/icons/Informational/Files and folders/TextMessage.d.ts +7 -0
  1282. package/dist/esm/icons/Informational/Files and folders/TextMessage.js +1 -0
  1283. package/dist/esm/icons/Informational/Files and folders/Unarchive.d.ts +7 -0
  1284. package/dist/esm/icons/Informational/Files and folders/Unarchive.js +1 -0
  1285. package/dist/esm/icons/Informational/Files and folders/index.d.ts +12 -0
  1286. package/dist/esm/icons/Informational/Finance/Bank.d.ts +7 -0
  1287. package/dist/esm/icons/Informational/Finance/Bank.js +1 -0
  1288. package/dist/esm/icons/Informational/Finance/CashOnDelivery.d.ts +7 -0
  1289. package/dist/esm/icons/Informational/Finance/CashOnDelivery.js +1 -0
  1290. package/dist/esm/icons/Informational/Finance/ChartLine.d.ts +7 -0
  1291. package/dist/esm/icons/Informational/Finance/ChartLine.js +1 -0
  1292. package/dist/esm/icons/Informational/Finance/CreditCard.d.ts +7 -0
  1293. package/dist/esm/icons/Informational/Finance/CreditCard.js +1 -0
  1294. package/dist/esm/icons/Informational/Finance/Growth.d.ts +7 -0
  1295. package/dist/esm/icons/Informational/Finance/Growth.js +1 -0
  1296. package/dist/esm/icons/Informational/Finance/Money1.d.ts +7 -0
  1297. package/dist/esm/icons/Informational/Finance/Money1.js +1 -0
  1298. package/dist/esm/icons/Informational/Finance/NoCredits.d.ts +7 -0
  1299. package/dist/esm/icons/Informational/Finance/NoCredits.js +1 -0
  1300. package/dist/esm/icons/Informational/Finance/Percent.d.ts +7 -0
  1301. package/dist/esm/icons/Informational/Finance/Percent.js +1 -0
  1302. package/dist/esm/icons/Informational/Finance/Rupee.d.ts +7 -0
  1303. package/dist/esm/icons/Informational/Finance/Rupee.js +1 -0
  1304. package/dist/esm/icons/Informational/Finance/TablerTicket.d.ts +7 -0
  1305. package/dist/esm/icons/Informational/Finance/Wallet.d.ts +7 -0
  1306. package/dist/esm/icons/Informational/Finance/Wallet.js +1 -0
  1307. package/dist/esm/icons/Informational/Finance/index.d.ts +11 -0
  1308. package/dist/esm/icons/Informational/General/AlertTriangle.d.ts +7 -0
  1309. package/dist/esm/icons/Informational/General/AlertTriangle.js +1 -0
  1310. package/dist/esm/icons/Informational/General/Check.d.ts +7 -0
  1311. package/dist/esm/icons/Informational/General/Check.js +1 -0
  1312. package/dist/esm/icons/Informational/General/CheckDouble.d.ts +7 -0
  1313. package/dist/esm/icons/Informational/General/CheckDouble.js +1 -0
  1314. package/dist/esm/icons/Informational/General/CloseTicket1.d.ts +7 -0
  1315. package/dist/esm/icons/Informational/General/CloseTicket1.js +1 -0
  1316. package/dist/esm/icons/Informational/General/Error.d.ts +7 -0
  1317. package/dist/esm/icons/Informational/General/Error.js +1 -0
  1318. package/dist/esm/icons/Informational/General/FailDoc.d.ts +7 -0
  1319. package/dist/esm/icons/Informational/General/FailDoc.js +1 -0
  1320. package/dist/esm/icons/Informational/General/Help.d.ts +7 -0
  1321. package/dist/esm/icons/Informational/General/Help.js +1 -0
  1322. package/dist/esm/icons/Informational/General/IcList.d.ts +7 -0
  1323. package/dist/esm/icons/Informational/General/IcList.js +1 -0
  1324. package/dist/esm/icons/Informational/General/Info.d.ts +7 -0
  1325. package/dist/esm/icons/Informational/General/Info.js +1 -0
  1326. package/dist/esm/icons/Informational/General/NewTicket.d.ts +7 -0
  1327. package/dist/esm/icons/Informational/General/NewTicket.js +1 -0
  1328. package/dist/esm/icons/Informational/General/RoundCheck.d.ts +7 -0
  1329. package/dist/esm/icons/Informational/General/RoundCheck.js +1 -0
  1330. package/dist/esm/icons/Informational/General/Slash.d.ts +7 -0
  1331. package/dist/esm/icons/Informational/General/Slash.js +1 -0
  1332. package/dist/esm/icons/Informational/General/index.d.ts +12 -0
  1333. package/dist/esm/icons/Informational/Identity/Chatbot.d.ts +7 -0
  1334. package/dist/esm/icons/Informational/Identity/Chatbot.js +1 -0
  1335. package/dist/esm/icons/Informational/Identity/Contacts.d.ts +7 -0
  1336. package/dist/esm/icons/Informational/Identity/Contacts.js +1 -0
  1337. package/dist/esm/icons/Informational/Identity/Group.d.ts +7 -0
  1338. package/dist/esm/icons/Informational/Identity/Group.js +1 -0
  1339. package/dist/esm/icons/Informational/Identity/IdCard.d.ts +7 -0
  1340. package/dist/esm/icons/Informational/Identity/IdCard.js +1 -0
  1341. package/dist/esm/icons/Informational/Identity/Person.d.ts +7 -0
  1342. package/dist/esm/icons/Informational/Identity/Person.js +1 -0
  1343. package/dist/esm/icons/Informational/Identity/Robot.d.ts +7 -0
  1344. package/dist/esm/icons/Informational/Identity/Robot.js +1 -0
  1345. package/dist/esm/icons/Informational/Identity/Union.d.ts +7 -0
  1346. package/dist/esm/icons/Informational/Identity/Union.js +1 -0
  1347. package/dist/esm/icons/Informational/Identity/Union1.d.ts +7 -0
  1348. package/dist/esm/icons/Informational/Identity/Union1.js +1 -0
  1349. package/dist/esm/icons/Informational/Identity/UserMinus1.d.ts +7 -0
  1350. package/dist/esm/icons/Informational/Identity/UserMinus1.js +1 -0
  1351. package/dist/esm/icons/Informational/Identity/UserPlus.d.ts +7 -0
  1352. package/dist/esm/icons/Informational/Identity/UserPlus.js +1 -0
  1353. package/dist/esm/icons/Informational/Identity/index.d.ts +10 -0
  1354. package/dist/esm/icons/Informational/Location/Address.d.ts +7 -0
  1355. package/dist/esm/icons/Informational/Location/Address.js +1 -0
  1356. package/dist/esm/icons/Informational/Location/LanguageChange.d.ts +7 -0
  1357. package/dist/esm/icons/Informational/Location/LanguageChange.js +1 -0
  1358. package/dist/esm/icons/Informational/Location/MapPin.d.ts +7 -0
  1359. package/dist/esm/icons/Informational/Location/MapPin.js +1 -0
  1360. package/dist/esm/icons/Informational/Location/Truck.d.ts +7 -0
  1361. package/dist/esm/icons/Informational/Location/Truck.js +1 -0
  1362. package/dist/esm/icons/Informational/Location/index.d.ts +4 -0
  1363. package/dist/esm/icons/Informational/Store related/AllProduct.d.ts +7 -0
  1364. package/dist/esm/icons/Informational/Store related/AllProduct.js +1 -0
  1365. package/dist/esm/icons/Informational/Store related/Clipboard.d.ts +7 -0
  1366. package/dist/esm/icons/Informational/Store related/Clipboard.js +1 -0
  1367. package/dist/esm/icons/Informational/Store related/ClipboardCheck.d.ts +7 -0
  1368. package/dist/esm/icons/Informational/Store related/ClipboardCheck.js +1 -0
  1369. package/dist/esm/icons/Informational/Store related/CustomerReport.d.ts +7 -0
  1370. package/dist/esm/icons/Informational/Store related/CustomerReport.js +1 -0
  1371. package/dist/esm/icons/Informational/Store related/InventoryReport.d.ts +7 -0
  1372. package/dist/esm/icons/Informational/Store related/InventoryReport.js +1 -0
  1373. package/dist/esm/icons/Informational/Store related/LegalBalance.d.ts +7 -0
  1374. package/dist/esm/icons/Informational/Store related/OrderReport.d.ts +7 -0
  1375. package/dist/esm/icons/Informational/Store related/OrderReport.js +1 -0
  1376. package/dist/esm/icons/Informational/Store related/PaymentReport.d.ts +7 -0
  1377. package/dist/esm/icons/Informational/Store related/PaymentReport.js +1 -0
  1378. package/dist/esm/icons/Informational/Store related/Store.d.ts +7 -0
  1379. package/dist/esm/icons/Informational/Store related/Store.js +1 -0
  1380. package/dist/esm/icons/Informational/Store related/StoreSync.d.ts +7 -0
  1381. package/dist/esm/icons/Informational/Store related/StoreSync.js +1 -0
  1382. package/dist/esm/icons/Informational/Store related/index.d.ts +10 -0
  1383. package/dist/esm/icons/Informational/eCommerce/AddLabel.d.ts +7 -0
  1384. package/dist/esm/icons/Informational/eCommerce/AddLabel.js +1 -0
  1385. package/dist/esm/icons/Informational/eCommerce/Click.d.ts +7 -0
  1386. package/dist/esm/icons/Informational/eCommerce/Click.js +1 -0
  1387. package/dist/esm/icons/Informational/eCommerce/Filter.d.ts +7 -0
  1388. package/dist/esm/icons/Informational/eCommerce/Filter.js +1 -0
  1389. package/dist/esm/icons/Informational/eCommerce/Gift1.d.ts +7 -0
  1390. package/dist/esm/icons/Informational/eCommerce/Gift1.js +1 -0
  1391. package/dist/esm/icons/Informational/eCommerce/GiftMinus.d.ts +7 -0
  1392. package/dist/esm/icons/Informational/eCommerce/GiftMinus.js +1 -0
  1393. package/dist/esm/icons/Informational/eCommerce/GiftPlus.d.ts +7 -0
  1394. package/dist/esm/icons/Informational/eCommerce/GiftPlus.js +1 -0
  1395. package/dist/esm/icons/Informational/eCommerce/Promocode.d.ts +7 -0
  1396. package/dist/esm/icons/Informational/eCommerce/Promocode.js +1 -0
  1397. package/dist/esm/icons/Informational/eCommerce/Receipt.d.ts +7 -0
  1398. package/dist/esm/icons/Informational/eCommerce/Receipt.js +1 -0
  1399. package/dist/esm/icons/Informational/eCommerce/ShieldCheck.d.ts +7 -0
  1400. package/dist/esm/icons/Informational/eCommerce/ShieldCheck.js +1 -0
  1401. package/dist/esm/icons/Informational/eCommerce/ShoppingBag.d.ts +7 -0
  1402. package/dist/esm/icons/Informational/eCommerce/ShoppingBag.js +1 -0
  1403. package/dist/esm/icons/Informational/eCommerce/ShoppingBasket.d.ts +7 -0
  1404. package/dist/esm/icons/Informational/eCommerce/ShoppingBasket.js +1 -0
  1405. package/dist/esm/icons/Informational/eCommerce/ShoppingCart.d.ts +7 -0
  1406. package/dist/esm/icons/Informational/eCommerce/ShoppingCart.js +1 -0
  1407. package/dist/esm/icons/Informational/eCommerce/index.d.ts +12 -0
  1408. package/dist/esm/icons/Legacy - Bikayi specific/Categories/Box.d.ts +7 -0
  1409. package/dist/esm/icons/Legacy - Bikayi specific/Categories/Box.js +1 -0
  1410. package/dist/esm/icons/Legacy - Bikayi specific/Categories/Box2.d.ts +7 -0
  1411. package/dist/esm/icons/Legacy - Bikayi specific/Categories/Box2.js +1 -0
  1412. package/dist/esm/icons/Legacy - Bikayi specific/Categories/index.d.ts +2 -0
  1413. package/dist/esm/icons/Legacy - Bikayi specific/Navigation/Journeys.d.ts +7 -0
  1414. package/dist/esm/icons/Legacy - Bikayi specific/Navigation/Journeys.js +1 -0
  1415. package/dist/esm/icons/Legacy - Bikayi specific/Navigation/Services.d.ts +7 -0
  1416. package/dist/esm/icons/Legacy - Bikayi specific/Navigation/Services.js +1 -0
  1417. package/dist/esm/icons/Legacy - Bikayi specific/Navigation/index.d.ts +2 -0
  1418. package/dist/esm/icons/Legacy - Bikayi specific/Plans/PlanUltimate.d.ts +7 -0
  1419. package/dist/esm/icons/Legacy - Bikayi specific/Plans/PlanUltimate.js +1 -0
  1420. package/dist/esm/icons/Legacy - Bikayi specific/Plans/index.d.ts +1 -0
  1421. package/dist/esm/icons/Legacy - Bikayi specific/Services/Businesscard.d.ts +7 -0
  1422. package/dist/esm/icons/Legacy - Bikayi specific/Services/Businesscard.js +1 -0
  1423. package/dist/esm/icons/Legacy - Bikayi specific/Services/Customdomain.d.ts +7 -0
  1424. package/dist/esm/icons/Legacy - Bikayi specific/Services/Customdomain.js +1 -0
  1425. package/dist/esm/icons/Legacy - Bikayi specific/Services/Marketing.d.ts +7 -0
  1426. package/dist/esm/icons/Legacy - Bikayi specific/Services/Marketing.js +1 -0
  1427. package/dist/esm/icons/Legacy - Bikayi specific/Services/PaymentLink.d.ts +7 -0
  1428. package/dist/esm/icons/Legacy - Bikayi specific/Services/PaymentLink.js +1 -0
  1429. package/dist/esm/icons/Legacy - Bikayi specific/Services/Theme.d.ts +7 -0
  1430. package/dist/esm/icons/Legacy - Bikayi specific/Services/Theme.js +1 -0
  1431. package/dist/esm/icons/Legacy - Bikayi specific/Services/index.d.ts +5 -0
  1432. package/dist/esm/icons/Media/Audio/Microphone.d.ts +7 -0
  1433. package/dist/esm/icons/Media/Audio/Microphone.js +1 -0
  1434. package/dist/esm/icons/Media/Audio/Pause.d.ts +7 -0
  1435. package/dist/esm/icons/Media/Audio/Pause.js +1 -0
  1436. package/dist/esm/icons/Media/Audio/Play.d.ts +7 -0
  1437. package/dist/esm/icons/Media/Audio/Play.js +1 -0
  1438. package/dist/esm/icons/Media/Audio/Sleep.d.ts +7 -0
  1439. package/dist/esm/icons/Media/Audio/Sleep.js +1 -0
  1440. package/dist/esm/icons/Media/Audio/VolumeMute.d.ts +7 -0
  1441. package/dist/esm/icons/Media/Audio/VolumeMute.js +1 -0
  1442. package/dist/esm/icons/Media/Audio/VolumeOneline.d.ts +7 -0
  1443. package/dist/esm/icons/Media/Audio/VolumeOneline.js +1 -0
  1444. package/dist/esm/icons/Media/Audio/VolumeTwoline.d.ts +7 -0
  1445. package/dist/esm/icons/Media/Audio/VolumeTwoline.js +1 -0
  1446. package/dist/esm/icons/Media/Audio/index.d.ts +7 -0
  1447. package/dist/esm/icons/Media/Devices/Desktop.d.ts +7 -0
  1448. package/dist/esm/icons/Media/Devices/Desktop.js +1 -0
  1449. package/dist/esm/icons/Media/Devices/Smartphone.d.ts +7 -0
  1450. package/dist/esm/icons/Media/Devices/Smartphone.js +1 -0
  1451. package/dist/esm/icons/Media/Devices/index.d.ts +2 -0
  1452. package/dist/esm/icons/Media/Others/BarcodeScan.d.ts +7 -0
  1453. package/dist/esm/icons/Media/Others/BarcodeScan.js +1 -0
  1454. package/dist/esm/icons/Media/Others/Download.d.ts +7 -0
  1455. package/dist/esm/icons/Media/Others/Download.js +1 -0
  1456. package/dist/esm/icons/Media/Others/EmojiSmile.d.ts +7 -0
  1457. package/dist/esm/icons/Media/Others/EmojiSmile.js +1 -0
  1458. package/dist/esm/icons/Media/Others/Paperclip.d.ts +7 -0
  1459. package/dist/esm/icons/Media/Others/Paperclip.js +1 -0
  1460. package/dist/esm/icons/Media/Others/Upload.d.ts +7 -0
  1461. package/dist/esm/icons/Media/Others/Upload.js +1 -0
  1462. package/dist/esm/icons/Media/Others/index.d.ts +5 -0
  1463. package/dist/esm/icons/Media/Visual/Camera.d.ts +7 -0
  1464. package/dist/esm/icons/Media/Visual/Camera.js +1 -0
  1465. package/dist/esm/icons/Media/Visual/CameraAdd.d.ts +7 -0
  1466. package/dist/esm/icons/Media/Visual/CameraAdd.js +1 -0
  1467. package/dist/esm/icons/Media/Visual/Crop.d.ts +7 -0
  1468. package/dist/esm/icons/Media/Visual/Crop.js +1 -0
  1469. package/dist/esm/icons/Media/Visual/FlashOff.d.ts +7 -0
  1470. package/dist/esm/icons/Media/Visual/FlashOff.js +1 -0
  1471. package/dist/esm/icons/Media/Visual/FlashOn.d.ts +7 -0
  1472. package/dist/esm/icons/Media/Visual/FlashOn.js +1 -0
  1473. package/dist/esm/icons/Media/Visual/Image.d.ts +7 -0
  1474. package/dist/esm/icons/Media/Visual/Image.js +1 -0
  1475. package/dist/esm/icons/Media/Visual/ImageAdd.d.ts +7 -0
  1476. package/dist/esm/icons/Media/Visual/ImageAdd.js +1 -0
  1477. package/dist/esm/icons/Media/Visual/Images.d.ts +7 -0
  1478. package/dist/esm/icons/Media/Visual/Images.js +1 -0
  1479. package/dist/esm/icons/Media/Visual/Maximize.d.ts +7 -0
  1480. package/dist/esm/icons/Media/Visual/Maximize.js +1 -0
  1481. package/dist/esm/icons/Media/Visual/RotateAnticlockwise.d.ts +7 -0
  1482. package/dist/esm/icons/Media/Visual/RotateAnticlockwise.js +1 -0
  1483. package/dist/esm/icons/Media/Visual/RotateClockwise.d.ts +7 -0
  1484. package/dist/esm/icons/Media/Visual/RotateClockwise.js +1 -0
  1485. package/dist/esm/icons/Media/Visual/VideoCamcorder.d.ts +7 -0
  1486. package/dist/esm/icons/Media/Visual/VideoCamcorder.js +1 -0
  1487. package/dist/esm/icons/Media/Visual/VideoFilm.d.ts +7 -0
  1488. package/dist/esm/icons/Media/Visual/VideoFilm.js +1 -0
  1489. package/dist/esm/icons/Media/Visual/index.d.ts +13 -0
  1490. package/dist/esm/icons/Social/Channels/Email.d.ts +6 -0
  1491. package/dist/esm/icons/Social/Channels/Email.js +1 -0
  1492. package/dist/esm/icons/Social/Channels/EmailMarketing.d.ts +6 -0
  1493. package/dist/esm/icons/Social/Channels/EmailMarketing.js +1 -0
  1494. package/dist/esm/icons/Social/Channels/Facebook.d.ts +6 -0
  1495. package/dist/esm/icons/Social/Channels/Facebook.js +1 -0
  1496. package/dist/esm/icons/Social/Channels/FacebookComment.d.ts +6 -0
  1497. package/dist/esm/icons/Social/Channels/FacebookComment.js +1 -0
  1498. package/dist/esm/icons/Social/Channels/Instagram.d.ts +6 -0
  1499. package/dist/esm/icons/Social/Channels/Instagram.js +1 -0
  1500. package/dist/esm/icons/Social/Channels/InstagramIcon.d.ts +6 -0
  1501. package/dist/esm/icons/Social/Channels/InstagramIcon.js +1 -0
  1502. package/dist/esm/icons/Social/Channels/Messenger.d.ts +6 -0
  1503. package/dist/esm/icons/Social/Channels/Messenger.js +1 -0
  1504. package/dist/esm/icons/Social/Channels/Tasks.d.ts +6 -0
  1505. package/dist/esm/icons/Social/Channels/Tasks.js +1 -0
  1506. package/dist/esm/icons/Social/Channels/WebPush.d.ts +6 -0
  1507. package/dist/esm/icons/Social/Channels/WebPush.js +1 -0
  1508. package/dist/esm/icons/Social/Channels/WhatsApp.d.ts +6 -0
  1509. package/dist/esm/icons/Social/Channels/WhatsApp.js +1 -0
  1510. package/dist/esm/icons/Social/Channels/index.d.ts +10 -0
  1511. package/dist/esm/icons/Social/Social/EmailMarketing.d.ts +7 -0
  1512. package/dist/esm/icons/Social/Social/EmailMarketing.js +1 -0
  1513. package/dist/esm/icons/Social/Social/Facebook.d.ts +7 -0
  1514. package/dist/esm/icons/Social/Social/Facebook.js +1 -0
  1515. package/dist/esm/icons/Social/Social/Google.d.ts +7 -0
  1516. package/dist/esm/icons/Social/Social/Google.js +1 -0
  1517. package/dist/esm/icons/Social/Social/Instagram.d.ts +7 -0
  1518. package/dist/esm/icons/Social/Social/Instagram.js +1 -0
  1519. package/dist/esm/icons/Social/Social/Messenger.d.ts +7 -0
  1520. package/dist/esm/icons/Social/Social/Messenger.js +1 -0
  1521. package/dist/esm/icons/Social/Social/Rcs.d.ts +7 -0
  1522. package/dist/esm/icons/Social/Social/Rcs.js +1 -0
  1523. package/dist/esm/icons/Social/Social/Twitter.d.ts +7 -0
  1524. package/dist/esm/icons/Social/Social/Twitter.js +1 -0
  1525. package/dist/esm/icons/Social/Social/Website.d.ts +7 -0
  1526. package/dist/esm/icons/Social/Social/Website.js +1 -0
  1527. package/dist/esm/icons/Social/Social/Whatsapp.d.ts +7 -0
  1528. package/dist/esm/icons/Social/Social/Whatsapp.js +1 -0
  1529. package/dist/esm/icons/Social/Social/Youtube.d.ts +7 -0
  1530. package/dist/esm/icons/Social/Social/Youtube.js +1 -0
  1531. package/dist/esm/icons/Social/Social/index.d.ts +10 -0
  1532. package/dist/esm/icons/Toggles/General/Eye.d.ts +7 -0
  1533. package/dist/esm/icons/Toggles/General/Eye.js +1 -0
  1534. package/dist/esm/icons/Toggles/General/EyeClosed.d.ts +7 -0
  1535. package/dist/esm/icons/Toggles/General/EyeClosed.js +1 -0
  1536. package/dist/esm/icons/Toggles/General/EyeOff.d.ts +7 -0
  1537. package/dist/esm/icons/Toggles/General/EyeOff.js +1 -0
  1538. package/dist/esm/icons/Toggles/General/HeartEmpty.d.ts +7 -0
  1539. package/dist/esm/icons/Toggles/General/HeartEmpty.js +1 -0
  1540. package/dist/esm/icons/Toggles/General/HeartFilled.d.ts +7 -0
  1541. package/dist/esm/icons/Toggles/General/HeartFilled.js +1 -0
  1542. package/dist/esm/icons/Toggles/General/Lock.d.ts +7 -0
  1543. package/dist/esm/icons/Toggles/General/Lock.js +1 -0
  1544. package/dist/esm/icons/Toggles/General/StarEmpty.d.ts +7 -0
  1545. package/dist/esm/icons/Toggles/General/StarEmpty.js +1 -0
  1546. package/dist/esm/icons/Toggles/General/StarFilled.d.ts +7 -0
  1547. package/dist/esm/icons/Toggles/General/StarFilled.js +1 -0
  1548. package/dist/esm/icons/Toggles/General/StarHalf.d.ts +7 -0
  1549. package/dist/esm/icons/Toggles/General/StarHalf.js +1 -0
  1550. package/dist/esm/icons/Toggles/General/Unlock.d.ts +7 -0
  1551. package/dist/esm/icons/Toggles/General/Unlock.js +1 -0
  1552. package/dist/esm/icons/Toggles/General/index.d.ts +10 -0
  1553. package/dist/esm/icons/index.d.ts +43 -0
  1554. package/dist/esm/icons/index.js +1 -0
  1555. package/dist/esm/icons/registry.d.ts +10 -0
  1556. package/dist/esm/index.d.ts +3 -0
  1557. package/dist/esm/index.js +1 -1
  1558. package/dist/esm/request-executor/executor.d.ts +99 -0
  1559. package/dist/esm/request-executor/executor.js +1 -0
  1560. package/dist/esm/request-executor/index.d.ts +2 -0
  1561. package/dist/esm/request-executor/model.d.ts +14 -0
  1562. package/dist/esm/utils/logging/ErrorConstructor/ApiError.d.ts +3 -0
  1563. package/dist/esm/utils/logging/ErrorConstructor/ApiError.js +1 -0
  1564. package/dist/esm/utils/logging/ErrorConstructor/BroadcastFlowError.d.ts +4 -0
  1565. package/dist/esm/utils/logging/ErrorConstructor/BroadcastFlowError.js +1 -0
  1566. package/dist/esm/utils/logging/ErrorConstructor/CohortError.d.ts +4 -0
  1567. package/dist/esm/utils/logging/ErrorConstructor/CohortError.js +1 -0
  1568. package/dist/esm/utils/logging/ErrorConstructor/CustomError.d.ts +3 -0
  1569. package/dist/esm/utils/logging/ErrorConstructor/CustomError.js +1 -0
  1570. package/dist/esm/utils/logging/ErrorConstructor/ExcelUploadError.d.ts +3 -0
  1571. package/dist/esm/utils/logging/ErrorConstructor/ExcelUploadError.js +1 -0
  1572. package/dist/esm/utils/logging/ErrorConstructor/FirebaseCallError.d.ts +3 -0
  1573. package/dist/esm/utils/logging/ErrorConstructor/FirebaseCallError.js +1 -0
  1574. package/dist/esm/utils/logging/ErrorConstructor/FirebaseSubscriptionError.d.ts +3 -0
  1575. package/dist/esm/utils/logging/ErrorConstructor/FirebaseSubscriptionError.js +1 -0
  1576. package/dist/esm/utils/logging/ErrorConstructor/RechargeFailure.d.ts +3 -0
  1577. package/dist/esm/utils/logging/ErrorConstructor/RechargeFailure.js +1 -0
  1578. package/dist/esm/utils/logging/ErrorConstructor/WhatsappIntegrationError.d.ts +3 -0
  1579. package/dist/esm/utils/logging/ErrorConstructor/WhatsappIntegrationError.js +1 -0
  1580. package/dist/esm/utils/logging/Logger.d.ts +24 -0
  1581. package/dist/esm/utils/logging/Logger.js +1 -0
  1582. package/dist/esm/utils/logging/index.d.ts +10 -0
  1583. package/package.json +27 -11
@@ -1 +1,5 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../_virtual/_tslib.js"),t=require("react/jsx-runtime"),n=require("../../assets/icons/info.svg.js"),r=require("../../helpers/BaseWhatsappContentLang.helper.js"),l=require("react"),o=require("../../constants/Theme.js"),i=require("../TypographyStyle.js"),u=require("./CustomEditor.styled.js"),s=require("./WhatsAppTextEditorHeader.js");function c(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=c(l);const d="Character limit reached",v=new r.BaseWhatsappContentLangHelper,h={[s.EditorActionTypes.BOLD]:"*",[s.EditorActionTypes.ITALIC]:"_",[s.EditorActionTypes.STRIKETHROUGH]:"~"},p=a.default.forwardRef(((r,c)=>{var a,p,{onChange:f,onClickVariable:g,text:x,RightComponent:j,error:C,limit:m,onError:E,rows:T,actions:O}=r,y=e.__rest(r,["onChange","onClickVariable","text","RightComponent","error","limit","onError","rows","actions"]);const L=l.useRef(null);function S(e){const t=null==L?void 0:L.current;null!=t&&(t.selectionStart?(t.focus(),t.selectionEnd=e):t.focus())}function R(e){var t,n;let r=null!==(n=null===(t=L.current)||void 0===t?void 0:t.value)&&void 0!==n?n:"";if(L.current&&e){const t=L.current.selectionStart,n=L.current.selectionEnd,l=e;if(t===n)return b(l);{r=v.wrappWildcard(t,n,l,r);const e=v.getHTML(r);return L.current.value=r,{text:r,html:e}}}return{text:r,html:r}}function b(e){var t,n;let r=null!==(n=null===(t=L.current)||void 0===t?void 0:t.value)&&void 0!==n?n:"";if(L.current&&e){const t=L.current.selectionStart;if(t===L.current.selectionEnd)return H(e,t)}return{text:r,html:r}}function H(e,t){var n,r;let l=null!==(r=null===(n=L.current)||void 0===n?void 0:n.value)&&void 0!==r?r:"";l=l.slice(0,t)+e+l.slice(t);const o=v.getHTML(l);return L.current.value=l,{text:l,html:o}}return l.useImperativeHandle(c,(()=>({addTextOrWrap:R,addText:b,get(){var e,t;return null!==(t=null===(e=L.current)||void 0===e?void 0:e.value)&&void 0!==t?t:""},setCaretPosition:S}))),l.useEffect((()=>{if(null==L?void 0:L.current){L.current.value=x||"";const e=v.getHTML(x||"");null==f||f(x||"",e)}}),[x]),l.useEffect((()=>{var e,t;(null===(e=null==L?void 0:L.current)||void 0===e?void 0:e.value)&&m&&((null===(t=null==L?void 0:L.current)||void 0===t?void 0:t.value.length)>m?null==E||E(d):null==E||E(null!=C?C:""))}),[null===(a=null==L?void 0:L.current)||void 0===a?void 0:a.value.length]),t.jsxs(u.OuterContainer,{children:[t.jsxs(u.Container,Object.assign({isError:!!C},{children:[t.jsx(s.WhatsAppTextEditorHeader,{actions:O,ref:L,onActionSelect:function(e){if((null==h?void 0:h[e])&&L.current){const t=L.current.selectionStart;if(t===L.current.selectionEnd){H(null==h?void 0:h[e],t);const{text:n,html:r}=H(null==h?void 0:h[e],t);S(t+1),null==f||f(n,r)}else{const{text:t,html:n}=R(null==h?void 0:h[e]);null==f||f(t,n)}}},RightComponent:j,onEmojiClick:function(e){const{text:t,html:n}=b(e);null==f||f(t,n)}}),t.jsx(u.TextSpace,Object.assign({ref:L,onChange:function(e){const t=e.target.value,n=v.getHTML(t);null==f||f(t,n)}},y,{rows:T}))]})),C&&C!==d?t.jsxs("div",Object.assign({style:{display:"flex",gap:6,alignItems:"center"}},{children:[t.jsx(n.default,{width:16,height:16,color:o.COLORS.content.negative}),t.jsx(i.BodyCaption,Object.assign({color:o.COLORS.content.negative},{children:C}))]})):t.jsx(t.Fragment,{children:m&&(null==L?void 0:L.current)?t.jsxs(i.BodyCaption,Object.assign({style:{color:C===d||(null===(p=null==L?void 0:L.current)||void 0===p?void 0:p.value.length)>m?o.COLORS.content.negative:o.COLORS.content.secondary}},{children:[L.current.value.length,"/",m]})):t.jsx(t.Fragment,{})})]})}));p.displayName="WhatsAppTextEditor",exports.WhatsAppTextEditor=p;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var I=require("@emotion/styled/base"),g=require("../../_virtual/_tslib.js"),C=require("react/jsx-runtime"),A=require("@emotion/react"),l=require("../../assets/icons/check.svg.js"),c=require("../../assets/icons/chevronLeft.svg.js"),b=require("../../assets/icons/chevronRight.svg.js"),Z=require("../../assets/icons/cross.svg.js"),G=require("../../assets/icons/edit.svg.js"),X=require("../../assets/icons/info.svg.js"),d=require("../../assets/icons/rewind.svg.js"),V=require("../../assets/icons/thumbs_down.svg.js"),W=require("../../assets/icons/thumbs_up.svg.js"),H=require("../../helpers/BaseWhatsappContentLang.helper.js"),R=require("react"),B=require("../../constants/Theme.js"),J=require("../tooltips/Tooltip.js"),m=require("../TypographyStyle.js"),N=require("./ai/actionRegistry.js"),u=require("./ai/aiTag.js"),Y=require("./ai/api.js"),F=require("./CustomEditor.styled.js"),x=require("./WhatsAppTextEditorHeader.js");function y(I){return I&&"object"==typeof I&&"default"in I?I:{default:I}}var p=y(I),h=y(R);function a(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}const i="Character limit reached",n=A.keyframes`
2
+ 0% { opacity: 0.55; }
3
+ 50% { opacity: 1; }
4
+ 100% { opacity: 0.55; }
5
+ `,S=p.default("div","production"===process.env.NODE_ENV?{target:"ea7i3sh18"}:{target:"ea7i3sh18",label:"EditorSkeletonContainer"})("production"===process.env.NODE_ENV?{name:"zdv776",styles:"padding:14px 12px;display:flex;flex-direction:column;gap:10px;min-height:150px"}:{name:"zdv776",styles:"padding:14px 12px;display:flex;flex-direction:column;gap:10px;min-height:150px",map:"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBbUMyQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBPcmlnaW5hbCBwcmVmaWxsIGJvZHkgZm9yIEFJIHRhZyByZWNvbXB1dGU7IHNlZWRlZCBvbmNlLCBuZXZlciB0aGUgbGl2ZSBgY3VycmVudFRleHRgIGZhbGxiYWNrLiAqL1xyXG4gICAgY29uc3QgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZiA9IHVzZVJlZignJyk7XHJcbiAgICBjb25zdCBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZiA9IHVzZVJlZihmYWxzZSk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSAnJztcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghcHJlZmlsbFdhc0FpR2VuZXJhdGVkKSB7XHJcbiAgICAgICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50ID0gJyc7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBzZWVkID0gaW5wdXRWYWx1ZSAhPT0gbnVsbCAmJiBpbnB1dFZhbHVlICE9PSB2b2lkIDAgPyBpbnB1dFZhbHVlIDogJyc7XHJcbiAgICAgICAgaWYgKHNlZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSBzZWVkO1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBpbnB1dFZhbHVlLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChuZXh0VGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCByZWNvbXB1dGVQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCh7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgY3VycmVudEVkaXRlZFRleHQ6IG5leHRUZXh0LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlY29tcHV0ZVBheWxvYWQpLCB7IHNvdXJjZTogJ3Bvc3RfZWRpdF9kZWJvdW5jZScgfSkpO1xyXG4gICAgfSwgW29uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlICYmIHRleHQgIT09IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlKSB7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKHRleHQpO1xyXG4gICAgICAgICAgICB9LCBBSV9UQUdfUkVDT01QVVRFX0lETEVfTVMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXkpIHx8ICcwJyk7XHJcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oY2FjaGVkKSkge1xyXG4gICAgICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KGNhY2hlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgaGlnaGxpZ2h0U3RvcmFnZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKSB7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGVsaWdpYmxlID0gISFjdXJyZW50VGV4dC50cmltKCkgJiYgY3VycmVudFRleHQubGVuZ3RoID49IHJlcGhyYXNlTWluQ2hhcnM7XHJcbiAgICAgICAgaWYgKHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGVsaWdpYmxlO1xyXG4gICAgICAgICAgICBpZiAoZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICAgICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNyb3NzZWRUaHJlc2hvbGQgPSAhcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCAmJiBlbGlnaWJsZTtcclxuICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICBpZiAoY3Jvc3NlZFRocmVzaG9sZCkge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgaXNHZW5lcmF0aW5nLCByZXBocmFzZU1pbkNoYXJzXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXNbc3VnZ2VzdGlvbkluZGV4XSB8fCAnJztcclxuICAgIGNvbnN0IGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlQ2FuZGlkYXRlKVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gYCR7c3VnZ2VzdGlvbkFjdGlvblR5cGV9LSR7c3VnZ2VzdGlvbkluZGV4fS0ke2FjdGl2ZUNhbmRpZGF0ZX1gO1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHN1Z2dlc3Rpb25JbmRleF0pO1xyXG4gICAgY29uc3QgaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUgPSAhIShhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSAmJlxyXG4gICAgICAgIGZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZVthY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleV0pO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvbkJhc2VIdG1sID0gdXNlTWVtbygoKSA9PiBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAnJyksIFtzdWdnZXN0aW9uQmFzZVRleHRdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoYWN0aXZlQ2FuZGlkYXRlKSwgW2FjdGl2ZUNhbmRpZGF0ZV0pO1xyXG4gICAgY29uc3QgY2FuUmVnZW5lcmF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8IE1BWF9TVUdHRVNUSU9OUztcclxuICAgIGNvbnN0IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA9ICEhc3VnZ2VzdGlvbkJhc2VUZXh0ICYmIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA+IDA7XHJcbiAgICBjb25zdCBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggPD0gMSB8fCBzdWdnZXN0aW9uSW5kZXggPD0gMDtcclxuICAgIGNvbnN0IGlzTmV4dFN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8XHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4ID49IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCAtIDE7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IHN1Z2dlc3Rpb25TY3JvbGxSZWYuY3VycmVudDtcclxuICAgICAgICBpZiAoIW5vZGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBub2RlLnNjcm9sbFRvcCA9IG5vZGUuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLCBpc0dlbmVyYXRpbmddKTtcclxuICAgIGNvbnN0IGV4ZWN1dGVBSUFjdGlvbiA9IHVzZUNhbGxiYWNrKChhY3Rpb25UeXBlLCByZWdlbmVyYXRlRXhpc3RpbmcgPSBmYWxzZSwgaW5zdHJ1Y3Rpb25PdmVycmlkZSwgdG9uZU92ZXJyaWRlSWQsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgdmFyIF9iO1xyXG4gICAgICAgIGlmICghb25BSUFjdGlvblJlcXVlc3QgJiZcclxuICAgICAgICAgICAgIWFwaUFkYXB0ZXIgJiZcclxuICAgICAgICAgICAgKCFyZXF1ZXN0RXhlY3V0b3IgfHwgIWJhc2VVcmwpKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignQUkgY29uZmlndXJhdGlvbiBtaXNzaW5nJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjdXJyZW50VGV4dC50cmltKCkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBtaW5DaGFyc0ZvckFjdGlvbiA9IG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIDUwO1xyXG4gICAgICAgIGlmIChjdXJyZW50VGV4dC5sZW5ndGggPCBtaW5DaGFyc0ZvckFjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAocmVnZW5lcmF0ZUV4aXN0aW5nICYmICFjYW5SZWdlbmVyYXRlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgYmFzZUNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVR5cGUgPT09ICd1dGlsaXR5JyAmJlxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50ID09PSBBSUFjdGlvblZhcmlhbnQuUkVQSFJBU0VcclxuICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJhc2VDb25maWcpLCB7IGxhYmVsOiAnUmVwaHJhc2UnLCBiYXNlUHJvbXB0OiBVVElMSVRZX1JFUEhSQVNFX1BST01QVCB9KSA6IGJhc2VDb25maWc7XHJcbiAgICAgICAgLy8gVG9uZSBpcyBzZW50IG9ubHkgYWZ0ZXIgZXhwbGljaXQgdXNlciBzZWxlY3Rpb24gKG9yIGV4cGxpY2l0IG92ZXJyaWRlKSxcclxuICAgICAgICAvLyBub3QgZnJvbSBkZWZhdWx0IHRvbmUgbWV0YWRhdGEuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lSWQgPSB0b25lT3ZlcnJpZGVJZCB8fCB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lID0gKF9iID0gY29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZmluZCgodG9uZSkgPT4gdG9uZS5pZCA9PT0gc2VsZWN0ZWRUb25lSWQpO1xyXG4gICAgICAgIGNvbnN0IGluc3RydWN0aW9uRm9yUHJvbXB0ID0gaW5zdHJ1Y3Rpb25PdmVycmlkZSAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgID8gaW5zdHJ1Y3Rpb25PdmVycmlkZVxyXG4gICAgICAgICAgICA6IGluc3RydWN0aW9uVGV4dDtcclxuICAgICAgICBjb25zdCBwcm9tcHQgPSAob25CdWlsZEFJUHJvbXB0ID09PSBudWxsIHx8IG9uQnVpbGRBSVByb21wdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25CdWlsZEFJUHJvbXB0KHtcclxuICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCxcclxuICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICB0b25lTGFiZWw6IHNlbGVjdGVkVG9uZSA9PT0gbnVsbCB8fCBzZWxlY3RlZFRvbmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlbGVjdGVkVG9uZS5sYWJlbCxcclxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgfSkpIHx8XHJcbiAgICAgICAgICAgIGJ1aWxkQWN0aW9uUHJvbXB0KHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZyxcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBzZXRJc0dlbmVyYXRpbmcodHJ1ZSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2FjdGlvbl90cmlnZ2VyZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgdGVtcGxhdGVfY2F0ZWdvcnk6IHRlbXBsYXRlVHlwZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvbkFJQWN0aW9uUmVxdWVzdFxyXG4gICAgICAgICAgICAgICAgPyB5aWVsZCBvbkFJQWN0aW9uUmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICA6IHlpZWxkIHJlcXVlc3RBSVN1Z2dlc3Rpb24oe1xyXG4gICAgICAgICAgICAgICAgICAgIGFwaUFkYXB0ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEV4ZWN1dG9yLFxyXG4gICAgICAgICAgICAgICAgICAgIGJhc2VVcmwsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICAgICAgICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnXHJcbiAgICAgICAgICAgICAgICA/IHJlc3VsdC50cmltKClcclxuICAgICAgICAgICAgICAgIDogKChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXN1bHQuYm9keSkgfHwgJycpLnRyaW0oKTtcclxuICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICghcmVnZW5lcmF0ZUV4aXN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQoY3VycmVudFRleHQpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUoYWN0aW9uVHlwZSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbY2FuZGlkYXRlXSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoKHByZXYpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBbLi4ucHJldiwgY2FuZGlkYXRlXS5zbGljZSgwLCBNQVhfU1VHR0VTVElPTlMpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KG5leHQubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignRmFpbGVkIHRvIGdlbmVyYXRlIEFJIHN1Z2dlc3Rpb24nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgIHNldElzR2VuZXJhdGluZyhmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSksIFtcclxuICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgYmFzZVVybCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgY2FuUmVnZW5lcmF0ZSxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpbnN0cnVjdGlvblRleHQsXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgdGVtcGxhdGVJZCxcclxuICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICBvbkVycm9yLFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICAgICAgb25BSUFjdGlvblJlcXVlc3QsXHJcbiAgICAgICAgb25CdWlsZEFJUHJvbXB0LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghYWN0aXZlQ2FuZGlkYXRlIHx8ICFzdWdnZXN0aW9uQmFzZVRleHQgfHwgIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQoYWN0aXZlQ2FuZGlkYXRlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9hY2NlcHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0ge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjdGlvblR5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBlZGl0ZWRFdmVudEVtaXR0ZWQ6IGZhbHNlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgaW5Jbml0aWFsQWlQaGFzZSA9IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IHRhZ1BheWxvYWQgPSBjb21wdXRlQWlUYWdPbkFjY2VwdCh7XHJcbiAgICAgICAgICAgIGJhc2VsaW5lVGV4dDogc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlOiBpbkluaXRpYWxBaVBoYXNlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChpbkluaXRpYWxBaVBoYXNlKSB7XHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRhZ1BheWxvYWQpLCB7IHNvdXJjZTogJ2FjY2VwdCcgfSkpO1xyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNldEVkaXRvclRleHQsXHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCxcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVSZWplY3RTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9kaXNjYXJkZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW2NsZWFyU3VnZ2VzdGlvblNlc3Npb24sIGVtaXRBSUV2ZW50LCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdGVtcGxhdGVJZF0pO1xyXG4gICAgY29uc3QgaGFuZGxlRmVlZGJhY2sgPSB1c2VDYWxsYmFjaygocmF0aW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSgocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XTogcmF0aW5nIH0pKSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXksXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25JbmRleCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBhaUhlYWRlckFjdGlvbnMgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gZW5hYmxlZEFJQWN0aW9ucy5tYXAoKGFjdGlvblR5cGUpID0+IHtcclxuICAgICAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgICAgICBjb25zdCBhY3Rpb25Db25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgICAgICBjb25zdCB0b25lSWQgPSB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGFjdGlvbkNvbmZpZy5sYWJlbCxcclxuICAgICAgICAgICAgICAgIGlzUHJpbWFyeTogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGlzR2VuZXJhdGluZyAmJiBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFjdXJyZW50VGV4dC50cmltKCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGV4dC5sZW5ndGggPFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBpc0dlbmVyYXRpbmcgfHxcclxuICAgICAgICAgICAgICAgICAgICAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSxcclxuICAgICAgICAgICAgICAgIHNob3dUb25lRHJvcGRvd246IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICAhISgoX2EgPSBhY3Rpb25Db25maWcudG9uZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpLFxyXG4gICAgICAgICAgICAgICAgdG9uZXM6IGFjdGlvbkNvbmZpZy50b25lcyxcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkVG9uZUlkOiB0b25lSWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgZW5hYmxlZEFJQWN0aW9ucyxcclxuICAgICAgICBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBtaW5DaGFyc0J5QWN0aW9uLFxyXG4gICAgXSk7XHJcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGFkZFRleHRPcldyYXAsXHJcbiAgICAgICAgICAgIGFkZFRleHQsXHJcbiAgICAgICAgICAgIGdldCgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0Q2FyZXRQb3NpdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2FkZFRleHRPcldyYXAsIGFkZFRleHQsIGN1cnJlbnRUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpbnB1dFZhbHVlID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgfSwgW2lucHV0VmFsdWUsIHNldEVkaXRvclRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFsaW1pdCB8fCAhb25FcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG5leHRFcnJvciA9IGN1cnJlbnRUZXh0Lmxlbmd0aCA+IGxpbWl0ID8gTElNSVRfUkVBQ0hFRCA6IGVycm9yICE9PSBudWxsICYmIGVycm9yICE9PSB2b2lkIDAgPyBlcnJvciA6ICcnO1xyXG4gICAgICAgIGlmIChsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPT09IG5leHRFcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9IG5leHRFcnJvcjtcclxuICAgICAgICBvbkVycm9yKG5leHRFcnJvcik7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIGVycm9yLCBsaW1pdCwgb25FcnJvcl0pO1xyXG4gICAgcmV0dXJuIChfanN4cyhPdXRlckNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pLCBfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkxJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzVXBJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2xpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNsaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkRJU0xJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzRG93bkljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIGNhblJlZ2VuZXJhdGUgPyAoX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogaXNHZW5lcmF0aW5nID8gJ1JlZ2VuZXJhdGluZ+KApicgOiAnUmVnZW5lcmF0ZScsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiUmVnZW5lcmF0ZSBzdWdnZXN0aW9uXCIsIFwiYXJpYS1idXN5XCI6IGlzR2VuZXJhdGluZywgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzR2VuZXJhdGluZywgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IGlzR2VuZXJhdGluZyA/IChfanN4KFJlZ2VuZXJhdGVJY29uU2hpbW1lciwgeyBcImFyaWEtaGlkZGVuXCI6IHRydWUgfSkpIDogKF9qc3goUmV3aW5kSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkpIH0pKSB9KSkpIDogbnVsbCwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNjYXJkXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzY2FyZCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gfSwgeyBjaGlsZHJlbjogX2pzeChDcm9zc0ljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiQWNjZXB0XCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiQWNjZXB0IHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlQWNjZXB0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENoZWNrSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKV0gfSldIH0pKSkgOiBpc0dlbmVyYXRpbmcgPyAoX2pzeHMoRWRpdG9yU2tlbGV0b25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5NiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTIlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg4JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI1NCVcIiB9KV0gfSkpIDogKF9qc3goVGV4dFNwYWNlLCBPYmplY3QuYXNzaWduKHsgcmVmOiB0ZXh0U3BhY2VSZWYgfSwgdGV4dEFyZWFQcm9wcywgeyB2YWx1ZTogY3VycmVudFRleHQsIG9uQ2hhbmdlOiBoYW5kbGVPbkNoYW5nZSwgb25CbHVyOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0UG9zdEVkaXRBaVRhZ1JlY29tcHV0ZShlLnRhcmdldC52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QXJlYU9uQmx1ciA9PT0gbnVsbCB8fCB0ZXh0QXJlYU9uQmx1ciA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dEFyZWFPbkJsdXIoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uUGFzdGU6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhc3RlZFRleHQgPSBlLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3RlZFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSAoX2EgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uU3RhcnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gKF9iID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvbkVuZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogc3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlZmVyIGxpdmUgRE9NIHZhbHVlIOKAlCBgY3VycmVudFRleHRgIGNhbiBsYWcgdGhlIHRleHRhcmVhIGZvciBiaWcgcGFzdGVzLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSAoX2MgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwudmFsdWUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRUZXh0ID0gYmFzZS5zbGljZSgwLCBzdGFydCkgKyBwYXN0ZWRUZXh0ICsgYmFzZS5zbGljZShlbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcmV0ID0gc3RhcnQgKyBwYXN0ZWRUZXh0Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YSA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGEuc2V0U2VsZWN0aW9uUmFuZ2UoY2FyZXQsIGNhcmV0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBpbnZhbGlkIHJhbmdlIGluIGVkZ2UgYnJvd3NlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCByb3dzOiByb3dzIH0pKSksIGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUgPyAoX2pzeHMoSW5zdHJ1Y3Rpb25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhJbnN0cnVjdGlvbklucHV0Um93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0SWNvbiwgeyB3aWR0aDogMTgsIGhlaWdodDogMTgsIGNvbG9yOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnkgfSksIF9qc3goSW5zdHJ1Y3Rpb25JbnB1dCwgeyB2YWx1ZTogaW5zdHJ1Y3Rpb25UZXh0LCBwbGFjZWhvbGRlcjogXCJBZGQgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIHRvIHJlZmluZSB5b3VyIG1lc3NhZ2VcIiwgb25DaGFuZ2U6IChlKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoZS50YXJnZXQudmFsdWUpIH0pLCBfanN4cyhJbnN0cnVjdGlvbkFjdGlvbnMsIHsgY2hpbGRyZW46IFtfanN4KEluc3RydWN0aW9uQ2FuY2VsLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiQ2FuY2VsXCIgfSkpLCBfanN4KEluc3RydWN0aW9uSW1wcm92ZSwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RydWN0aW9uVG9BcHBseSA9IGluc3RydWN0aW9uVGV4dC50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2luc3RydWN0aW9uX3VzZWQnLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbl90eXBlOiBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fdGV4dDogYW5vbnltaXplSW5zdHJ1Y3Rpb25UZXh0KGluc3RydWN0aW9uVG9BcHBseSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSwgZmFsc2UsIGluc3RydWN0aW9uVG9BcHBseSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJJbXByb3ZlXCIgfSkpXSB9KV0gfSksIGluc3RydWN0aW9uVGV4dC50cmltKCkubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5sZW5ndGggPiAwID8gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCwgeyBjaGlsZHJlbjogZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLm1hcCgoc3VnZ2VzdGlvbikgPT4gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgc2VsZWN0ZWQ6IGluc3RydWN0aW9uVGV4dCA9PT0gc3VnZ2VzdGlvbiwgb25DbGljazogKCkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KHN1Z2dlc3Rpb24pIH0sIHsgY2hpbGRyZW46IHN1Z2dlc3Rpb24gfSksIHN1Z2dlc3Rpb24pKSkgfSkpIDogbnVsbF0gfSkpIDogKF9qc3goV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB7IGFjdGlvbnM6IGFjdGlvbnMsIHJlZjogdGV4dFNwYWNlUmVmLCBvbkFjdGlvblNlbGVjdDogb25BY3Rpb25TZWxlY3QsIFJpZ2h0Q29tcG9uZW50OiBSaWdodENvbXBvbmVudCwgcmlnaHRBY3Rpb25zRGlzYWJsZWQ6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIG9uRW1vamlDbGljazogb25FbW9qaUFkZGl0aW9uLCBhaUFjdGlvbnM6IGFpSGVhZGVyQWN0aW9ucywgZGlzYWJsZUFsbEFjdGlvbnM6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIGluc3RydWN0aW9uQWN0aXZlOiBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBvbkFJSW5zdHJ1Y3Rpb25zQ2xpY2s6ICgpID0+IHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUodHJ1ZSksIG9uQUlUb25lQ2hhbmdlOiAoYWN0aW9uVHlwZSwgdG9uZUlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUb25lQnlBY3Rpb24oKHByZXYpID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXYpLCB7IFthY3Rpb25UeXBlXTogdG9uZUlkIH0pKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkFJVG9uZVNlbGVjdCA9PT0gbnVsbCB8fCBvbkFJVG9uZVNlbGVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRvbmVTZWxlY3QoYWN0aW9uVHlwZSwgdG9uZUlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHRvbmVJZCwgQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBvbkFJQWN0aW9uQ2xpY2s6IChhY3Rpb25UeXBlLCBhY3Rpb25WYXJpYW50ID0gQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGFjdGlvbiBzaG91bGQgbm90IHJldHJpZ2dlciBmcm9tIGNoaXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2VuZXJhdGUgaXMgb25seSB2aWEgZXhwbGljaXQgcmVnZW5lcmF0ZSBjb250cm9sLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldyBhY3Rpb24gc3RhcnRzIGEgZnJlc2ggc3VnZ2VzdGlvbiBzZXNzaW9uLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSldIH0pKV0gfSkpO1xyXG59KTtcclxuV2hhdHNBcHBUZXh0RWRpdG9yLmRpc3BsYXlOYW1lID0gJ1doYXRzQXBwVGV4dEVkaXRvcic7XHJcbmV4cG9ydCB7IEFJX1RBR19DSEFOR0VfUkFUSU9fVEhSRVNIT0xELCBjb21wdXRlQWlUYWdPbkFjY2VwdCwgbGV2ZW5zaHRlaW5EaXN0YW5jZSwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2hhdHNBcHBUZXh0RWRpdG9yLmpzLm1hcCJdfQ== */",toString:a}),k=p.default("div","production"===process.env.NODE_ENV?{target:"ea7i3sh17"}:{target:"ea7i3sh17",label:"EditorSkeletonLine"})("height:16px;border-radius:6px;width:",(I=>I.width),";background:#ececef;animation:",n," 1.1s ease-in-out infinite;"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBMENzQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBPcmlnaW5hbCBwcmVmaWxsIGJvZHkgZm9yIEFJIHRhZyByZWNvbXB1dGU7IHNlZWRlZCBvbmNlLCBuZXZlciB0aGUgbGl2ZSBgY3VycmVudFRleHRgIGZhbGxiYWNrLiAqL1xyXG4gICAgY29uc3QgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZiA9IHVzZVJlZignJyk7XHJcbiAgICBjb25zdCBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZiA9IHVzZVJlZihmYWxzZSk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSAnJztcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghcHJlZmlsbFdhc0FpR2VuZXJhdGVkKSB7XHJcbiAgICAgICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50ID0gJyc7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBzZWVkID0gaW5wdXRWYWx1ZSAhPT0gbnVsbCAmJiBpbnB1dFZhbHVlICE9PSB2b2lkIDAgPyBpbnB1dFZhbHVlIDogJyc7XHJcbiAgICAgICAgaWYgKHNlZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSBzZWVkO1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBpbnB1dFZhbHVlLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChuZXh0VGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCByZWNvbXB1dGVQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCh7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgY3VycmVudEVkaXRlZFRleHQ6IG5leHRUZXh0LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlY29tcHV0ZVBheWxvYWQpLCB7IHNvdXJjZTogJ3Bvc3RfZWRpdF9kZWJvdW5jZScgfSkpO1xyXG4gICAgfSwgW29uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlICYmIHRleHQgIT09IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlKSB7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKHRleHQpO1xyXG4gICAgICAgICAgICB9LCBBSV9UQUdfUkVDT01QVVRFX0lETEVfTVMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXkpIHx8ICcwJyk7XHJcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oY2FjaGVkKSkge1xyXG4gICAgICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KGNhY2hlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgaGlnaGxpZ2h0U3RvcmFnZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKSB7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGVsaWdpYmxlID0gISFjdXJyZW50VGV4dC50cmltKCkgJiYgY3VycmVudFRleHQubGVuZ3RoID49IHJlcGhyYXNlTWluQ2hhcnM7XHJcbiAgICAgICAgaWYgKHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGVsaWdpYmxlO1xyXG4gICAgICAgICAgICBpZiAoZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICAgICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNyb3NzZWRUaHJlc2hvbGQgPSAhcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCAmJiBlbGlnaWJsZTtcclxuICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICBpZiAoY3Jvc3NlZFRocmVzaG9sZCkge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgaXNHZW5lcmF0aW5nLCByZXBocmFzZU1pbkNoYXJzXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXNbc3VnZ2VzdGlvbkluZGV4XSB8fCAnJztcclxuICAgIGNvbnN0IGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlQ2FuZGlkYXRlKVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gYCR7c3VnZ2VzdGlvbkFjdGlvblR5cGV9LSR7c3VnZ2VzdGlvbkluZGV4fS0ke2FjdGl2ZUNhbmRpZGF0ZX1gO1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHN1Z2dlc3Rpb25JbmRleF0pO1xyXG4gICAgY29uc3QgaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUgPSAhIShhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSAmJlxyXG4gICAgICAgIGZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZVthY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleV0pO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvbkJhc2VIdG1sID0gdXNlTWVtbygoKSA9PiBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAnJyksIFtzdWdnZXN0aW9uQmFzZVRleHRdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoYWN0aXZlQ2FuZGlkYXRlKSwgW2FjdGl2ZUNhbmRpZGF0ZV0pO1xyXG4gICAgY29uc3QgY2FuUmVnZW5lcmF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8IE1BWF9TVUdHRVNUSU9OUztcclxuICAgIGNvbnN0IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA9ICEhc3VnZ2VzdGlvbkJhc2VUZXh0ICYmIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA+IDA7XHJcbiAgICBjb25zdCBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggPD0gMSB8fCBzdWdnZXN0aW9uSW5kZXggPD0gMDtcclxuICAgIGNvbnN0IGlzTmV4dFN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8XHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4ID49IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCAtIDE7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IHN1Z2dlc3Rpb25TY3JvbGxSZWYuY3VycmVudDtcclxuICAgICAgICBpZiAoIW5vZGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBub2RlLnNjcm9sbFRvcCA9IG5vZGUuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLCBpc0dlbmVyYXRpbmddKTtcclxuICAgIGNvbnN0IGV4ZWN1dGVBSUFjdGlvbiA9IHVzZUNhbGxiYWNrKChhY3Rpb25UeXBlLCByZWdlbmVyYXRlRXhpc3RpbmcgPSBmYWxzZSwgaW5zdHJ1Y3Rpb25PdmVycmlkZSwgdG9uZU92ZXJyaWRlSWQsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgdmFyIF9iO1xyXG4gICAgICAgIGlmICghb25BSUFjdGlvblJlcXVlc3QgJiZcclxuICAgICAgICAgICAgIWFwaUFkYXB0ZXIgJiZcclxuICAgICAgICAgICAgKCFyZXF1ZXN0RXhlY3V0b3IgfHwgIWJhc2VVcmwpKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignQUkgY29uZmlndXJhdGlvbiBtaXNzaW5nJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjdXJyZW50VGV4dC50cmltKCkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBtaW5DaGFyc0ZvckFjdGlvbiA9IG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIDUwO1xyXG4gICAgICAgIGlmIChjdXJyZW50VGV4dC5sZW5ndGggPCBtaW5DaGFyc0ZvckFjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAocmVnZW5lcmF0ZUV4aXN0aW5nICYmICFjYW5SZWdlbmVyYXRlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgYmFzZUNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVR5cGUgPT09ICd1dGlsaXR5JyAmJlxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50ID09PSBBSUFjdGlvblZhcmlhbnQuUkVQSFJBU0VcclxuICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJhc2VDb25maWcpLCB7IGxhYmVsOiAnUmVwaHJhc2UnLCBiYXNlUHJvbXB0OiBVVElMSVRZX1JFUEhSQVNFX1BST01QVCB9KSA6IGJhc2VDb25maWc7XHJcbiAgICAgICAgLy8gVG9uZSBpcyBzZW50IG9ubHkgYWZ0ZXIgZXhwbGljaXQgdXNlciBzZWxlY3Rpb24gKG9yIGV4cGxpY2l0IG92ZXJyaWRlKSxcclxuICAgICAgICAvLyBub3QgZnJvbSBkZWZhdWx0IHRvbmUgbWV0YWRhdGEuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lSWQgPSB0b25lT3ZlcnJpZGVJZCB8fCB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lID0gKF9iID0gY29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZmluZCgodG9uZSkgPT4gdG9uZS5pZCA9PT0gc2VsZWN0ZWRUb25lSWQpO1xyXG4gICAgICAgIGNvbnN0IGluc3RydWN0aW9uRm9yUHJvbXB0ID0gaW5zdHJ1Y3Rpb25PdmVycmlkZSAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgID8gaW5zdHJ1Y3Rpb25PdmVycmlkZVxyXG4gICAgICAgICAgICA6IGluc3RydWN0aW9uVGV4dDtcclxuICAgICAgICBjb25zdCBwcm9tcHQgPSAob25CdWlsZEFJUHJvbXB0ID09PSBudWxsIHx8IG9uQnVpbGRBSVByb21wdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25CdWlsZEFJUHJvbXB0KHtcclxuICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCxcclxuICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICB0b25lTGFiZWw6IHNlbGVjdGVkVG9uZSA9PT0gbnVsbCB8fCBzZWxlY3RlZFRvbmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlbGVjdGVkVG9uZS5sYWJlbCxcclxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgfSkpIHx8XHJcbiAgICAgICAgICAgIGJ1aWxkQWN0aW9uUHJvbXB0KHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZyxcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBzZXRJc0dlbmVyYXRpbmcodHJ1ZSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2FjdGlvbl90cmlnZ2VyZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgdGVtcGxhdGVfY2F0ZWdvcnk6IHRlbXBsYXRlVHlwZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvbkFJQWN0aW9uUmVxdWVzdFxyXG4gICAgICAgICAgICAgICAgPyB5aWVsZCBvbkFJQWN0aW9uUmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICA6IHlpZWxkIHJlcXVlc3RBSVN1Z2dlc3Rpb24oe1xyXG4gICAgICAgICAgICAgICAgICAgIGFwaUFkYXB0ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEV4ZWN1dG9yLFxyXG4gICAgICAgICAgICAgICAgICAgIGJhc2VVcmwsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICAgICAgICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnXHJcbiAgICAgICAgICAgICAgICA/IHJlc3VsdC50cmltKClcclxuICAgICAgICAgICAgICAgIDogKChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXN1bHQuYm9keSkgfHwgJycpLnRyaW0oKTtcclxuICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICghcmVnZW5lcmF0ZUV4aXN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQoY3VycmVudFRleHQpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUoYWN0aW9uVHlwZSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbY2FuZGlkYXRlXSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoKHByZXYpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBbLi4ucHJldiwgY2FuZGlkYXRlXS5zbGljZSgwLCBNQVhfU1VHR0VTVElPTlMpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KG5leHQubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignRmFpbGVkIHRvIGdlbmVyYXRlIEFJIHN1Z2dlc3Rpb24nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgIHNldElzR2VuZXJhdGluZyhmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSksIFtcclxuICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgYmFzZVVybCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgY2FuUmVnZW5lcmF0ZSxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpbnN0cnVjdGlvblRleHQsXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgdGVtcGxhdGVJZCxcclxuICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICBvbkVycm9yLFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICAgICAgb25BSUFjdGlvblJlcXVlc3QsXHJcbiAgICAgICAgb25CdWlsZEFJUHJvbXB0LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghYWN0aXZlQ2FuZGlkYXRlIHx8ICFzdWdnZXN0aW9uQmFzZVRleHQgfHwgIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQoYWN0aXZlQ2FuZGlkYXRlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9hY2NlcHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0ge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjdGlvblR5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBlZGl0ZWRFdmVudEVtaXR0ZWQ6IGZhbHNlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgaW5Jbml0aWFsQWlQaGFzZSA9IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IHRhZ1BheWxvYWQgPSBjb21wdXRlQWlUYWdPbkFjY2VwdCh7XHJcbiAgICAgICAgICAgIGJhc2VsaW5lVGV4dDogc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlOiBpbkluaXRpYWxBaVBoYXNlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChpbkluaXRpYWxBaVBoYXNlKSB7XHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRhZ1BheWxvYWQpLCB7IHNvdXJjZTogJ2FjY2VwdCcgfSkpO1xyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNldEVkaXRvclRleHQsXHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCxcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVSZWplY3RTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9kaXNjYXJkZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW2NsZWFyU3VnZ2VzdGlvblNlc3Npb24sIGVtaXRBSUV2ZW50LCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdGVtcGxhdGVJZF0pO1xyXG4gICAgY29uc3QgaGFuZGxlRmVlZGJhY2sgPSB1c2VDYWxsYmFjaygocmF0aW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSgocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XTogcmF0aW5nIH0pKSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXksXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25JbmRleCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBhaUhlYWRlckFjdGlvbnMgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gZW5hYmxlZEFJQWN0aW9ucy5tYXAoKGFjdGlvblR5cGUpID0+IHtcclxuICAgICAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgICAgICBjb25zdCBhY3Rpb25Db25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgICAgICBjb25zdCB0b25lSWQgPSB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGFjdGlvbkNvbmZpZy5sYWJlbCxcclxuICAgICAgICAgICAgICAgIGlzUHJpbWFyeTogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGlzR2VuZXJhdGluZyAmJiBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFjdXJyZW50VGV4dC50cmltKCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGV4dC5sZW5ndGggPFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBpc0dlbmVyYXRpbmcgfHxcclxuICAgICAgICAgICAgICAgICAgICAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSxcclxuICAgICAgICAgICAgICAgIHNob3dUb25lRHJvcGRvd246IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICAhISgoX2EgPSBhY3Rpb25Db25maWcudG9uZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpLFxyXG4gICAgICAgICAgICAgICAgdG9uZXM6IGFjdGlvbkNvbmZpZy50b25lcyxcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkVG9uZUlkOiB0b25lSWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgZW5hYmxlZEFJQWN0aW9ucyxcclxuICAgICAgICBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBtaW5DaGFyc0J5QWN0aW9uLFxyXG4gICAgXSk7XHJcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGFkZFRleHRPcldyYXAsXHJcbiAgICAgICAgICAgIGFkZFRleHQsXHJcbiAgICAgICAgICAgIGdldCgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0Q2FyZXRQb3NpdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2FkZFRleHRPcldyYXAsIGFkZFRleHQsIGN1cnJlbnRUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpbnB1dFZhbHVlID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgfSwgW2lucHV0VmFsdWUsIHNldEVkaXRvclRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFsaW1pdCB8fCAhb25FcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG5leHRFcnJvciA9IGN1cnJlbnRUZXh0Lmxlbmd0aCA+IGxpbWl0ID8gTElNSVRfUkVBQ0hFRCA6IGVycm9yICE9PSBudWxsICYmIGVycm9yICE9PSB2b2lkIDAgPyBlcnJvciA6ICcnO1xyXG4gICAgICAgIGlmIChsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPT09IG5leHRFcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9IG5leHRFcnJvcjtcclxuICAgICAgICBvbkVycm9yKG5leHRFcnJvcik7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIGVycm9yLCBsaW1pdCwgb25FcnJvcl0pO1xyXG4gICAgcmV0dXJuIChfanN4cyhPdXRlckNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pLCBfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkxJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzVXBJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2xpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNsaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkRJU0xJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzRG93bkljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIGNhblJlZ2VuZXJhdGUgPyAoX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogaXNHZW5lcmF0aW5nID8gJ1JlZ2VuZXJhdGluZ+KApicgOiAnUmVnZW5lcmF0ZScsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiUmVnZW5lcmF0ZSBzdWdnZXN0aW9uXCIsIFwiYXJpYS1idXN5XCI6IGlzR2VuZXJhdGluZywgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzR2VuZXJhdGluZywgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IGlzR2VuZXJhdGluZyA/IChfanN4KFJlZ2VuZXJhdGVJY29uU2hpbW1lciwgeyBcImFyaWEtaGlkZGVuXCI6IHRydWUgfSkpIDogKF9qc3goUmV3aW5kSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkpIH0pKSB9KSkpIDogbnVsbCwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNjYXJkXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzY2FyZCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gfSwgeyBjaGlsZHJlbjogX2pzeChDcm9zc0ljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiQWNjZXB0XCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiQWNjZXB0IHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlQWNjZXB0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENoZWNrSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKV0gfSldIH0pKSkgOiBpc0dlbmVyYXRpbmcgPyAoX2pzeHMoRWRpdG9yU2tlbGV0b25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5NiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTIlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg4JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI1NCVcIiB9KV0gfSkpIDogKF9qc3goVGV4dFNwYWNlLCBPYmplY3QuYXNzaWduKHsgcmVmOiB0ZXh0U3BhY2VSZWYgfSwgdGV4dEFyZWFQcm9wcywgeyB2YWx1ZTogY3VycmVudFRleHQsIG9uQ2hhbmdlOiBoYW5kbGVPbkNoYW5nZSwgb25CbHVyOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0UG9zdEVkaXRBaVRhZ1JlY29tcHV0ZShlLnRhcmdldC52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QXJlYU9uQmx1ciA9PT0gbnVsbCB8fCB0ZXh0QXJlYU9uQmx1ciA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dEFyZWFPbkJsdXIoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uUGFzdGU6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhc3RlZFRleHQgPSBlLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3RlZFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSAoX2EgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uU3RhcnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gKF9iID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvbkVuZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogc3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlZmVyIGxpdmUgRE9NIHZhbHVlIOKAlCBgY3VycmVudFRleHRgIGNhbiBsYWcgdGhlIHRleHRhcmVhIGZvciBiaWcgcGFzdGVzLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSAoX2MgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwudmFsdWUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRUZXh0ID0gYmFzZS5zbGljZSgwLCBzdGFydCkgKyBwYXN0ZWRUZXh0ICsgYmFzZS5zbGljZShlbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcmV0ID0gc3RhcnQgKyBwYXN0ZWRUZXh0Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YSA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGEuc2V0U2VsZWN0aW9uUmFuZ2UoY2FyZXQsIGNhcmV0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBpbnZhbGlkIHJhbmdlIGluIGVkZ2UgYnJvd3NlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCByb3dzOiByb3dzIH0pKSksIGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUgPyAoX2pzeHMoSW5zdHJ1Y3Rpb25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhJbnN0cnVjdGlvbklucHV0Um93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0SWNvbiwgeyB3aWR0aDogMTgsIGhlaWdodDogMTgsIGNvbG9yOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnkgfSksIF9qc3goSW5zdHJ1Y3Rpb25JbnB1dCwgeyB2YWx1ZTogaW5zdHJ1Y3Rpb25UZXh0LCBwbGFjZWhvbGRlcjogXCJBZGQgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIHRvIHJlZmluZSB5b3VyIG1lc3NhZ2VcIiwgb25DaGFuZ2U6IChlKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoZS50YXJnZXQudmFsdWUpIH0pLCBfanN4cyhJbnN0cnVjdGlvbkFjdGlvbnMsIHsgY2hpbGRyZW46IFtfanN4KEluc3RydWN0aW9uQ2FuY2VsLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiQ2FuY2VsXCIgfSkpLCBfanN4KEluc3RydWN0aW9uSW1wcm92ZSwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RydWN0aW9uVG9BcHBseSA9IGluc3RydWN0aW9uVGV4dC50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2luc3RydWN0aW9uX3VzZWQnLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbl90eXBlOiBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fdGV4dDogYW5vbnltaXplSW5zdHJ1Y3Rpb25UZXh0KGluc3RydWN0aW9uVG9BcHBseSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSwgZmFsc2UsIGluc3RydWN0aW9uVG9BcHBseSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJJbXByb3ZlXCIgfSkpXSB9KV0gfSksIGluc3RydWN0aW9uVGV4dC50cmltKCkubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5sZW5ndGggPiAwID8gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCwgeyBjaGlsZHJlbjogZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLm1hcCgoc3VnZ2VzdGlvbikgPT4gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgc2VsZWN0ZWQ6IGluc3RydWN0aW9uVGV4dCA9PT0gc3VnZ2VzdGlvbiwgb25DbGljazogKCkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KHN1Z2dlc3Rpb24pIH0sIHsgY2hpbGRyZW46IHN1Z2dlc3Rpb24gfSksIHN1Z2dlc3Rpb24pKSkgfSkpIDogbnVsbF0gfSkpIDogKF9qc3goV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB7IGFjdGlvbnM6IGFjdGlvbnMsIHJlZjogdGV4dFNwYWNlUmVmLCBvbkFjdGlvblNlbGVjdDogb25BY3Rpb25TZWxlY3QsIFJpZ2h0Q29tcG9uZW50OiBSaWdodENvbXBvbmVudCwgcmlnaHRBY3Rpb25zRGlzYWJsZWQ6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIG9uRW1vamlDbGljazogb25FbW9qaUFkZGl0aW9uLCBhaUFjdGlvbnM6IGFpSGVhZGVyQWN0aW9ucywgZGlzYWJsZUFsbEFjdGlvbnM6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIGluc3RydWN0aW9uQWN0aXZlOiBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBvbkFJSW5zdHJ1Y3Rpb25zQ2xpY2s6ICgpID0+IHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUodHJ1ZSksIG9uQUlUb25lQ2hhbmdlOiAoYWN0aW9uVHlwZSwgdG9uZUlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUb25lQnlBY3Rpb24oKHByZXYpID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXYpLCB7IFthY3Rpb25UeXBlXTogdG9uZUlkIH0pKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkFJVG9uZVNlbGVjdCA9PT0gbnVsbCB8fCBvbkFJVG9uZVNlbGVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRvbmVTZWxlY3QoYWN0aW9uVHlwZSwgdG9uZUlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHRvbmVJZCwgQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBvbkFJQWN0aW9uQ2xpY2s6IChhY3Rpb25UeXBlLCBhY3Rpb25WYXJpYW50ID0gQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGFjdGlvbiBzaG91bGQgbm90IHJldHJpZ2dlciBmcm9tIGNoaXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2VuZXJhdGUgaXMgb25seSB2aWEgZXhwbGljaXQgcmVnZW5lcmF0ZSBjb250cm9sLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldyBhY3Rpb24gc3RhcnRzIGEgZnJlc2ggc3VnZ2VzdGlvbiBzZXNzaW9uLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSldIH0pKV0gfSkpO1xyXG59KTtcclxuV2hhdHNBcHBUZXh0RWRpdG9yLmRpc3BsYXlOYW1lID0gJ1doYXRzQXBwVGV4dEVkaXRvcic7XHJcbmV4cG9ydCB7IEFJX1RBR19DSEFOR0VfUkFUSU9fVEhSRVNIT0xELCBjb21wdXRlQWlUYWdPbkFjY2VwdCwgbGV2ZW5zaHRlaW5EaXN0YW5jZSwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2hhdHNBcHBUZXh0RWRpdG9yLmpzLm1hcCJdfQ== */")),U=p.default("div","production"===process.env.NODE_ENV?{target:"ea7i3sh16"}:{target:"ea7i3sh16",label:"SuggestionSessionContainer"})("production"===process.env.NODE_ENV?{name:"lwqbyv",styles:"padding:12px;display:flex;flex-direction:column;gap:8px;max-height:260px;overflow-y:scroll;scrollbar-width:thin;scrollbar-color:#c8c8cf transparent;::-webkit-scrollbar{width:8px;}::-webkit-scrollbar-thumb{background:#c8c8cf;border-radius:8px;}::-webkit-scrollbar-track{background:transparent;}"}:{name:"lwqbyv",styles:"padding:12px;display:flex;flex-direction:column;gap:8px;max-height:260px;overflow-y:scroll;scrollbar-width:thin;scrollbar-color:#c8c8cf transparent;::-webkit-scrollbar{width:8px;}::-webkit-scrollbar-thumb{background:#c8c8cf;border-radius:8px;}::-webkit-scrollbar-track{background:transparent;}",map:"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBaUQ4QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBPcmlnaW5hbCBwcmVmaWxsIGJvZHkgZm9yIEFJIHRhZyByZWNvbXB1dGU7IHNlZWRlZCBvbmNlLCBuZXZlciB0aGUgbGl2ZSBgY3VycmVudFRleHRgIGZhbGxiYWNrLiAqL1xyXG4gICAgY29uc3QgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZiA9IHVzZVJlZignJyk7XHJcbiAgICBjb25zdCBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZiA9IHVzZVJlZihmYWxzZSk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSAnJztcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghcHJlZmlsbFdhc0FpR2VuZXJhdGVkKSB7XHJcbiAgICAgICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50ID0gJyc7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBzZWVkID0gaW5wdXRWYWx1ZSAhPT0gbnVsbCAmJiBpbnB1dFZhbHVlICE9PSB2b2lkIDAgPyBpbnB1dFZhbHVlIDogJyc7XHJcbiAgICAgICAgaWYgKHNlZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSBzZWVkO1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBpbnB1dFZhbHVlLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChuZXh0VGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCByZWNvbXB1dGVQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCh7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgY3VycmVudEVkaXRlZFRleHQ6IG5leHRUZXh0LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlY29tcHV0ZVBheWxvYWQpLCB7IHNvdXJjZTogJ3Bvc3RfZWRpdF9kZWJvdW5jZScgfSkpO1xyXG4gICAgfSwgW29uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlICYmIHRleHQgIT09IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlKSB7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKHRleHQpO1xyXG4gICAgICAgICAgICB9LCBBSV9UQUdfUkVDT01QVVRFX0lETEVfTVMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXkpIHx8ICcwJyk7XHJcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oY2FjaGVkKSkge1xyXG4gICAgICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KGNhY2hlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgaGlnaGxpZ2h0U3RvcmFnZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKSB7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGVsaWdpYmxlID0gISFjdXJyZW50VGV4dC50cmltKCkgJiYgY3VycmVudFRleHQubGVuZ3RoID49IHJlcGhyYXNlTWluQ2hhcnM7XHJcbiAgICAgICAgaWYgKHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGVsaWdpYmxlO1xyXG4gICAgICAgICAgICBpZiAoZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICAgICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNyb3NzZWRUaHJlc2hvbGQgPSAhcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCAmJiBlbGlnaWJsZTtcclxuICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICBpZiAoY3Jvc3NlZFRocmVzaG9sZCkge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgaXNHZW5lcmF0aW5nLCByZXBocmFzZU1pbkNoYXJzXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXNbc3VnZ2VzdGlvbkluZGV4XSB8fCAnJztcclxuICAgIGNvbnN0IGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlQ2FuZGlkYXRlKVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gYCR7c3VnZ2VzdGlvbkFjdGlvblR5cGV9LSR7c3VnZ2VzdGlvbkluZGV4fS0ke2FjdGl2ZUNhbmRpZGF0ZX1gO1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHN1Z2dlc3Rpb25JbmRleF0pO1xyXG4gICAgY29uc3QgaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUgPSAhIShhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSAmJlxyXG4gICAgICAgIGZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZVthY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleV0pO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvbkJhc2VIdG1sID0gdXNlTWVtbygoKSA9PiBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAnJyksIFtzdWdnZXN0aW9uQmFzZVRleHRdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoYWN0aXZlQ2FuZGlkYXRlKSwgW2FjdGl2ZUNhbmRpZGF0ZV0pO1xyXG4gICAgY29uc3QgY2FuUmVnZW5lcmF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8IE1BWF9TVUdHRVNUSU9OUztcclxuICAgIGNvbnN0IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA9ICEhc3VnZ2VzdGlvbkJhc2VUZXh0ICYmIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA+IDA7XHJcbiAgICBjb25zdCBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggPD0gMSB8fCBzdWdnZXN0aW9uSW5kZXggPD0gMDtcclxuICAgIGNvbnN0IGlzTmV4dFN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8XHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4ID49IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCAtIDE7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IHN1Z2dlc3Rpb25TY3JvbGxSZWYuY3VycmVudDtcclxuICAgICAgICBpZiAoIW5vZGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBub2RlLnNjcm9sbFRvcCA9IG5vZGUuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLCBpc0dlbmVyYXRpbmddKTtcclxuICAgIGNvbnN0IGV4ZWN1dGVBSUFjdGlvbiA9IHVzZUNhbGxiYWNrKChhY3Rpb25UeXBlLCByZWdlbmVyYXRlRXhpc3RpbmcgPSBmYWxzZSwgaW5zdHJ1Y3Rpb25PdmVycmlkZSwgdG9uZU92ZXJyaWRlSWQsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgdmFyIF9iO1xyXG4gICAgICAgIGlmICghb25BSUFjdGlvblJlcXVlc3QgJiZcclxuICAgICAgICAgICAgIWFwaUFkYXB0ZXIgJiZcclxuICAgICAgICAgICAgKCFyZXF1ZXN0RXhlY3V0b3IgfHwgIWJhc2VVcmwpKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignQUkgY29uZmlndXJhdGlvbiBtaXNzaW5nJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjdXJyZW50VGV4dC50cmltKCkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBtaW5DaGFyc0ZvckFjdGlvbiA9IG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIDUwO1xyXG4gICAgICAgIGlmIChjdXJyZW50VGV4dC5sZW5ndGggPCBtaW5DaGFyc0ZvckFjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAocmVnZW5lcmF0ZUV4aXN0aW5nICYmICFjYW5SZWdlbmVyYXRlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgYmFzZUNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVR5cGUgPT09ICd1dGlsaXR5JyAmJlxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50ID09PSBBSUFjdGlvblZhcmlhbnQuUkVQSFJBU0VcclxuICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJhc2VDb25maWcpLCB7IGxhYmVsOiAnUmVwaHJhc2UnLCBiYXNlUHJvbXB0OiBVVElMSVRZX1JFUEhSQVNFX1BST01QVCB9KSA6IGJhc2VDb25maWc7XHJcbiAgICAgICAgLy8gVG9uZSBpcyBzZW50IG9ubHkgYWZ0ZXIgZXhwbGljaXQgdXNlciBzZWxlY3Rpb24gKG9yIGV4cGxpY2l0IG92ZXJyaWRlKSxcclxuICAgICAgICAvLyBub3QgZnJvbSBkZWZhdWx0IHRvbmUgbWV0YWRhdGEuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lSWQgPSB0b25lT3ZlcnJpZGVJZCB8fCB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lID0gKF9iID0gY29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZmluZCgodG9uZSkgPT4gdG9uZS5pZCA9PT0gc2VsZWN0ZWRUb25lSWQpO1xyXG4gICAgICAgIGNvbnN0IGluc3RydWN0aW9uRm9yUHJvbXB0ID0gaW5zdHJ1Y3Rpb25PdmVycmlkZSAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgID8gaW5zdHJ1Y3Rpb25PdmVycmlkZVxyXG4gICAgICAgICAgICA6IGluc3RydWN0aW9uVGV4dDtcclxuICAgICAgICBjb25zdCBwcm9tcHQgPSAob25CdWlsZEFJUHJvbXB0ID09PSBudWxsIHx8IG9uQnVpbGRBSVByb21wdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25CdWlsZEFJUHJvbXB0KHtcclxuICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCxcclxuICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICB0b25lTGFiZWw6IHNlbGVjdGVkVG9uZSA9PT0gbnVsbCB8fCBzZWxlY3RlZFRvbmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlbGVjdGVkVG9uZS5sYWJlbCxcclxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgfSkpIHx8XHJcbiAgICAgICAgICAgIGJ1aWxkQWN0aW9uUHJvbXB0KHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZyxcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBzZXRJc0dlbmVyYXRpbmcodHJ1ZSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2FjdGlvbl90cmlnZ2VyZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgdGVtcGxhdGVfY2F0ZWdvcnk6IHRlbXBsYXRlVHlwZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvbkFJQWN0aW9uUmVxdWVzdFxyXG4gICAgICAgICAgICAgICAgPyB5aWVsZCBvbkFJQWN0aW9uUmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICA6IHlpZWxkIHJlcXVlc3RBSVN1Z2dlc3Rpb24oe1xyXG4gICAgICAgICAgICAgICAgICAgIGFwaUFkYXB0ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEV4ZWN1dG9yLFxyXG4gICAgICAgICAgICAgICAgICAgIGJhc2VVcmwsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICAgICAgICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnXHJcbiAgICAgICAgICAgICAgICA/IHJlc3VsdC50cmltKClcclxuICAgICAgICAgICAgICAgIDogKChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXN1bHQuYm9keSkgfHwgJycpLnRyaW0oKTtcclxuICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICghcmVnZW5lcmF0ZUV4aXN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQoY3VycmVudFRleHQpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUoYWN0aW9uVHlwZSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbY2FuZGlkYXRlXSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoKHByZXYpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBbLi4ucHJldiwgY2FuZGlkYXRlXS5zbGljZSgwLCBNQVhfU1VHR0VTVElPTlMpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KG5leHQubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignRmFpbGVkIHRvIGdlbmVyYXRlIEFJIHN1Z2dlc3Rpb24nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgIHNldElzR2VuZXJhdGluZyhmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSksIFtcclxuICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgYmFzZVVybCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgY2FuUmVnZW5lcmF0ZSxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpbnN0cnVjdGlvblRleHQsXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgdGVtcGxhdGVJZCxcclxuICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICBvbkVycm9yLFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICAgICAgb25BSUFjdGlvblJlcXVlc3QsXHJcbiAgICAgICAgb25CdWlsZEFJUHJvbXB0LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghYWN0aXZlQ2FuZGlkYXRlIHx8ICFzdWdnZXN0aW9uQmFzZVRleHQgfHwgIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQoYWN0aXZlQ2FuZGlkYXRlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9hY2NlcHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0ge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjdGlvblR5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBlZGl0ZWRFdmVudEVtaXR0ZWQ6IGZhbHNlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgaW5Jbml0aWFsQWlQaGFzZSA9IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IHRhZ1BheWxvYWQgPSBjb21wdXRlQWlUYWdPbkFjY2VwdCh7XHJcbiAgICAgICAgICAgIGJhc2VsaW5lVGV4dDogc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlOiBpbkluaXRpYWxBaVBoYXNlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChpbkluaXRpYWxBaVBoYXNlKSB7XHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRhZ1BheWxvYWQpLCB7IHNvdXJjZTogJ2FjY2VwdCcgfSkpO1xyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNldEVkaXRvclRleHQsXHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCxcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVSZWplY3RTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9kaXNjYXJkZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW2NsZWFyU3VnZ2VzdGlvblNlc3Npb24sIGVtaXRBSUV2ZW50LCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdGVtcGxhdGVJZF0pO1xyXG4gICAgY29uc3QgaGFuZGxlRmVlZGJhY2sgPSB1c2VDYWxsYmFjaygocmF0aW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSgocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XTogcmF0aW5nIH0pKSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXksXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25JbmRleCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBhaUhlYWRlckFjdGlvbnMgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gZW5hYmxlZEFJQWN0aW9ucy5tYXAoKGFjdGlvblR5cGUpID0+IHtcclxuICAgICAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgICAgICBjb25zdCBhY3Rpb25Db25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgICAgICBjb25zdCB0b25lSWQgPSB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGFjdGlvbkNvbmZpZy5sYWJlbCxcclxuICAgICAgICAgICAgICAgIGlzUHJpbWFyeTogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGlzR2VuZXJhdGluZyAmJiBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFjdXJyZW50VGV4dC50cmltKCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGV4dC5sZW5ndGggPFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBpc0dlbmVyYXRpbmcgfHxcclxuICAgICAgICAgICAgICAgICAgICAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSxcclxuICAgICAgICAgICAgICAgIHNob3dUb25lRHJvcGRvd246IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICAhISgoX2EgPSBhY3Rpb25Db25maWcudG9uZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpLFxyXG4gICAgICAgICAgICAgICAgdG9uZXM6IGFjdGlvbkNvbmZpZy50b25lcyxcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkVG9uZUlkOiB0b25lSWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgZW5hYmxlZEFJQWN0aW9ucyxcclxuICAgICAgICBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBtaW5DaGFyc0J5QWN0aW9uLFxyXG4gICAgXSk7XHJcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGFkZFRleHRPcldyYXAsXHJcbiAgICAgICAgICAgIGFkZFRleHQsXHJcbiAgICAgICAgICAgIGdldCgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0Q2FyZXRQb3NpdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2FkZFRleHRPcldyYXAsIGFkZFRleHQsIGN1cnJlbnRUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpbnB1dFZhbHVlID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgfSwgW2lucHV0VmFsdWUsIHNldEVkaXRvclRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFsaW1pdCB8fCAhb25FcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG5leHRFcnJvciA9IGN1cnJlbnRUZXh0Lmxlbmd0aCA+IGxpbWl0ID8gTElNSVRfUkVBQ0hFRCA6IGVycm9yICE9PSBudWxsICYmIGVycm9yICE9PSB2b2lkIDAgPyBlcnJvciA6ICcnO1xyXG4gICAgICAgIGlmIChsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPT09IG5leHRFcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9IG5leHRFcnJvcjtcclxuICAgICAgICBvbkVycm9yKG5leHRFcnJvcik7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIGVycm9yLCBsaW1pdCwgb25FcnJvcl0pO1xyXG4gICAgcmV0dXJuIChfanN4cyhPdXRlckNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pLCBfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkxJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzVXBJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2xpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNsaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkRJU0xJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzRG93bkljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIGNhblJlZ2VuZXJhdGUgPyAoX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogaXNHZW5lcmF0aW5nID8gJ1JlZ2VuZXJhdGluZ+KApicgOiAnUmVnZW5lcmF0ZScsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiUmVnZW5lcmF0ZSBzdWdnZXN0aW9uXCIsIFwiYXJpYS1idXN5XCI6IGlzR2VuZXJhdGluZywgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzR2VuZXJhdGluZywgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IGlzR2VuZXJhdGluZyA/IChfanN4KFJlZ2VuZXJhdGVJY29uU2hpbW1lciwgeyBcImFyaWEtaGlkZGVuXCI6IHRydWUgfSkpIDogKF9qc3goUmV3aW5kSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkpIH0pKSB9KSkpIDogbnVsbCwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNjYXJkXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzY2FyZCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gfSwgeyBjaGlsZHJlbjogX2pzeChDcm9zc0ljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiQWNjZXB0XCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiQWNjZXB0IHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlQWNjZXB0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENoZWNrSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKV0gfSldIH0pKSkgOiBpc0dlbmVyYXRpbmcgPyAoX2pzeHMoRWRpdG9yU2tlbGV0b25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5NiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTIlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg4JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI1NCVcIiB9KV0gfSkpIDogKF9qc3goVGV4dFNwYWNlLCBPYmplY3QuYXNzaWduKHsgcmVmOiB0ZXh0U3BhY2VSZWYgfSwgdGV4dEFyZWFQcm9wcywgeyB2YWx1ZTogY3VycmVudFRleHQsIG9uQ2hhbmdlOiBoYW5kbGVPbkNoYW5nZSwgb25CbHVyOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0UG9zdEVkaXRBaVRhZ1JlY29tcHV0ZShlLnRhcmdldC52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QXJlYU9uQmx1ciA9PT0gbnVsbCB8fCB0ZXh0QXJlYU9uQmx1ciA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dEFyZWFPbkJsdXIoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uUGFzdGU6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhc3RlZFRleHQgPSBlLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3RlZFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSAoX2EgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uU3RhcnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gKF9iID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvbkVuZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogc3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlZmVyIGxpdmUgRE9NIHZhbHVlIOKAlCBgY3VycmVudFRleHRgIGNhbiBsYWcgdGhlIHRleHRhcmVhIGZvciBiaWcgcGFzdGVzLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSAoX2MgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwudmFsdWUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRUZXh0ID0gYmFzZS5zbGljZSgwLCBzdGFydCkgKyBwYXN0ZWRUZXh0ICsgYmFzZS5zbGljZShlbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcmV0ID0gc3RhcnQgKyBwYXN0ZWRUZXh0Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YSA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGEuc2V0U2VsZWN0aW9uUmFuZ2UoY2FyZXQsIGNhcmV0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBpbnZhbGlkIHJhbmdlIGluIGVkZ2UgYnJvd3NlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCByb3dzOiByb3dzIH0pKSksIGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUgPyAoX2pzeHMoSW5zdHJ1Y3Rpb25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhJbnN0cnVjdGlvbklucHV0Um93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0SWNvbiwgeyB3aWR0aDogMTgsIGhlaWdodDogMTgsIGNvbG9yOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnkgfSksIF9qc3goSW5zdHJ1Y3Rpb25JbnB1dCwgeyB2YWx1ZTogaW5zdHJ1Y3Rpb25UZXh0LCBwbGFjZWhvbGRlcjogXCJBZGQgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIHRvIHJlZmluZSB5b3VyIG1lc3NhZ2VcIiwgb25DaGFuZ2U6IChlKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoZS50YXJnZXQudmFsdWUpIH0pLCBfanN4cyhJbnN0cnVjdGlvbkFjdGlvbnMsIHsgY2hpbGRyZW46IFtfanN4KEluc3RydWN0aW9uQ2FuY2VsLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiQ2FuY2VsXCIgfSkpLCBfanN4KEluc3RydWN0aW9uSW1wcm92ZSwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RydWN0aW9uVG9BcHBseSA9IGluc3RydWN0aW9uVGV4dC50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2luc3RydWN0aW9uX3VzZWQnLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbl90eXBlOiBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fdGV4dDogYW5vbnltaXplSW5zdHJ1Y3Rpb25UZXh0KGluc3RydWN0aW9uVG9BcHBseSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSwgZmFsc2UsIGluc3RydWN0aW9uVG9BcHBseSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJJbXByb3ZlXCIgfSkpXSB9KV0gfSksIGluc3RydWN0aW9uVGV4dC50cmltKCkubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5sZW5ndGggPiAwID8gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCwgeyBjaGlsZHJlbjogZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLm1hcCgoc3VnZ2VzdGlvbikgPT4gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgc2VsZWN0ZWQ6IGluc3RydWN0aW9uVGV4dCA9PT0gc3VnZ2VzdGlvbiwgb25DbGljazogKCkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KHN1Z2dlc3Rpb24pIH0sIHsgY2hpbGRyZW46IHN1Z2dlc3Rpb24gfSksIHN1Z2dlc3Rpb24pKSkgfSkpIDogbnVsbF0gfSkpIDogKF9qc3goV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB7IGFjdGlvbnM6IGFjdGlvbnMsIHJlZjogdGV4dFNwYWNlUmVmLCBvbkFjdGlvblNlbGVjdDogb25BY3Rpb25TZWxlY3QsIFJpZ2h0Q29tcG9uZW50OiBSaWdodENvbXBvbmVudCwgcmlnaHRBY3Rpb25zRGlzYWJsZWQ6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIG9uRW1vamlDbGljazogb25FbW9qaUFkZGl0aW9uLCBhaUFjdGlvbnM6IGFpSGVhZGVyQWN0aW9ucywgZGlzYWJsZUFsbEFjdGlvbnM6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIGluc3RydWN0aW9uQWN0aXZlOiBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBvbkFJSW5zdHJ1Y3Rpb25zQ2xpY2s6ICgpID0+IHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUodHJ1ZSksIG9uQUlUb25lQ2hhbmdlOiAoYWN0aW9uVHlwZSwgdG9uZUlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUb25lQnlBY3Rpb24oKHByZXYpID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXYpLCB7IFthY3Rpb25UeXBlXTogdG9uZUlkIH0pKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkFJVG9uZVNlbGVjdCA9PT0gbnVsbCB8fCBvbkFJVG9uZVNlbGVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRvbmVTZWxlY3QoYWN0aW9uVHlwZSwgdG9uZUlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHRvbmVJZCwgQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBvbkFJQWN0aW9uQ2xpY2s6IChhY3Rpb25UeXBlLCBhY3Rpb25WYXJpYW50ID0gQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGFjdGlvbiBzaG91bGQgbm90IHJldHJpZ2dlciBmcm9tIGNoaXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2VuZXJhdGUgaXMgb25seSB2aWEgZXhwbGljaXQgcmVnZW5lcmF0ZSBjb250cm9sLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldyBhY3Rpb24gc3RhcnRzIGEgZnJlc2ggc3VnZ2VzdGlvbiBzZXNzaW9uLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSldIH0pKV0gfSkpO1xyXG59KTtcclxuV2hhdHNBcHBUZXh0RWRpdG9yLmRpc3BsYXlOYW1lID0gJ1doYXRzQXBwVGV4dEVkaXRvcic7XHJcbmV4cG9ydCB7IEFJX1RBR19DSEFOR0VfUkFUSU9fVEhSRVNIT0xELCBjb21wdXRlQWlUYWdPbkFjY2VwdCwgbGV2ZW5zaHRlaW5EaXN0YW5jZSwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2hhdHNBcHBUZXh0RWRpdG9yLmpzLm1hcCJdfQ== */",toString:a}),s=p.default("div","production"===process.env.NODE_ENV?{target:"ea7i3sh15"}:{target:"ea7i3sh15",label:"SuggestionBaselineText"})("text-decoration:line-through;color:",B.COLORS.content.secondary,";"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBcUUwQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBPcmlnaW5hbCBwcmVmaWxsIGJvZHkgZm9yIEFJIHRhZyByZWNvbXB1dGU7IHNlZWRlZCBvbmNlLCBuZXZlciB0aGUgbGl2ZSBgY3VycmVudFRleHRgIGZhbGxiYWNrLiAqL1xyXG4gICAgY29uc3QgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZiA9IHVzZVJlZignJyk7XHJcbiAgICBjb25zdCBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZiA9IHVzZVJlZihmYWxzZSk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSAnJztcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghcHJlZmlsbFdhc0FpR2VuZXJhdGVkKSB7XHJcbiAgICAgICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50ID0gJyc7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBzZWVkID0gaW5wdXRWYWx1ZSAhPT0gbnVsbCAmJiBpbnB1dFZhbHVlICE9PSB2b2lkIDAgPyBpbnB1dFZhbHVlIDogJyc7XHJcbiAgICAgICAgaWYgKHNlZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSBzZWVkO1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBpbnB1dFZhbHVlLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChuZXh0VGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCByZWNvbXB1dGVQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCh7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgY3VycmVudEVkaXRlZFRleHQ6IG5leHRUZXh0LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlY29tcHV0ZVBheWxvYWQpLCB7IHNvdXJjZTogJ3Bvc3RfZWRpdF9kZWJvdW5jZScgfSkpO1xyXG4gICAgfSwgW29uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlICYmIHRleHQgIT09IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlKSB7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKHRleHQpO1xyXG4gICAgICAgICAgICB9LCBBSV9UQUdfUkVDT01QVVRFX0lETEVfTVMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXkpIHx8ICcwJyk7XHJcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oY2FjaGVkKSkge1xyXG4gICAgICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KGNhY2hlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgaGlnaGxpZ2h0U3RvcmFnZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKSB7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGVsaWdpYmxlID0gISFjdXJyZW50VGV4dC50cmltKCkgJiYgY3VycmVudFRleHQubGVuZ3RoID49IHJlcGhyYXNlTWluQ2hhcnM7XHJcbiAgICAgICAgaWYgKHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGVsaWdpYmxlO1xyXG4gICAgICAgICAgICBpZiAoZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICAgICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNyb3NzZWRUaHJlc2hvbGQgPSAhcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCAmJiBlbGlnaWJsZTtcclxuICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICBpZiAoY3Jvc3NlZFRocmVzaG9sZCkge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgaXNHZW5lcmF0aW5nLCByZXBocmFzZU1pbkNoYXJzXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXNbc3VnZ2VzdGlvbkluZGV4XSB8fCAnJztcclxuICAgIGNvbnN0IGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlQ2FuZGlkYXRlKVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gYCR7c3VnZ2VzdGlvbkFjdGlvblR5cGV9LSR7c3VnZ2VzdGlvbkluZGV4fS0ke2FjdGl2ZUNhbmRpZGF0ZX1gO1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHN1Z2dlc3Rpb25JbmRleF0pO1xyXG4gICAgY29uc3QgaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUgPSAhIShhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSAmJlxyXG4gICAgICAgIGZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZVthY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleV0pO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvbkJhc2VIdG1sID0gdXNlTWVtbygoKSA9PiBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAnJyksIFtzdWdnZXN0aW9uQmFzZVRleHRdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoYWN0aXZlQ2FuZGlkYXRlKSwgW2FjdGl2ZUNhbmRpZGF0ZV0pO1xyXG4gICAgY29uc3QgY2FuUmVnZW5lcmF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8IE1BWF9TVUdHRVNUSU9OUztcclxuICAgIGNvbnN0IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA9ICEhc3VnZ2VzdGlvbkJhc2VUZXh0ICYmIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA+IDA7XHJcbiAgICBjb25zdCBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggPD0gMSB8fCBzdWdnZXN0aW9uSW5kZXggPD0gMDtcclxuICAgIGNvbnN0IGlzTmV4dFN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8XHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4ID49IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCAtIDE7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IHN1Z2dlc3Rpb25TY3JvbGxSZWYuY3VycmVudDtcclxuICAgICAgICBpZiAoIW5vZGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBub2RlLnNjcm9sbFRvcCA9IG5vZGUuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLCBpc0dlbmVyYXRpbmddKTtcclxuICAgIGNvbnN0IGV4ZWN1dGVBSUFjdGlvbiA9IHVzZUNhbGxiYWNrKChhY3Rpb25UeXBlLCByZWdlbmVyYXRlRXhpc3RpbmcgPSBmYWxzZSwgaW5zdHJ1Y3Rpb25PdmVycmlkZSwgdG9uZU92ZXJyaWRlSWQsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgdmFyIF9iO1xyXG4gICAgICAgIGlmICghb25BSUFjdGlvblJlcXVlc3QgJiZcclxuICAgICAgICAgICAgIWFwaUFkYXB0ZXIgJiZcclxuICAgICAgICAgICAgKCFyZXF1ZXN0RXhlY3V0b3IgfHwgIWJhc2VVcmwpKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignQUkgY29uZmlndXJhdGlvbiBtaXNzaW5nJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjdXJyZW50VGV4dC50cmltKCkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBtaW5DaGFyc0ZvckFjdGlvbiA9IG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIDUwO1xyXG4gICAgICAgIGlmIChjdXJyZW50VGV4dC5sZW5ndGggPCBtaW5DaGFyc0ZvckFjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAocmVnZW5lcmF0ZUV4aXN0aW5nICYmICFjYW5SZWdlbmVyYXRlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgYmFzZUNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVR5cGUgPT09ICd1dGlsaXR5JyAmJlxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50ID09PSBBSUFjdGlvblZhcmlhbnQuUkVQSFJBU0VcclxuICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJhc2VDb25maWcpLCB7IGxhYmVsOiAnUmVwaHJhc2UnLCBiYXNlUHJvbXB0OiBVVElMSVRZX1JFUEhSQVNFX1BST01QVCB9KSA6IGJhc2VDb25maWc7XHJcbiAgICAgICAgLy8gVG9uZSBpcyBzZW50IG9ubHkgYWZ0ZXIgZXhwbGljaXQgdXNlciBzZWxlY3Rpb24gKG9yIGV4cGxpY2l0IG92ZXJyaWRlKSxcclxuICAgICAgICAvLyBub3QgZnJvbSBkZWZhdWx0IHRvbmUgbWV0YWRhdGEuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lSWQgPSB0b25lT3ZlcnJpZGVJZCB8fCB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lID0gKF9iID0gY29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZmluZCgodG9uZSkgPT4gdG9uZS5pZCA9PT0gc2VsZWN0ZWRUb25lSWQpO1xyXG4gICAgICAgIGNvbnN0IGluc3RydWN0aW9uRm9yUHJvbXB0ID0gaW5zdHJ1Y3Rpb25PdmVycmlkZSAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgID8gaW5zdHJ1Y3Rpb25PdmVycmlkZVxyXG4gICAgICAgICAgICA6IGluc3RydWN0aW9uVGV4dDtcclxuICAgICAgICBjb25zdCBwcm9tcHQgPSAob25CdWlsZEFJUHJvbXB0ID09PSBudWxsIHx8IG9uQnVpbGRBSVByb21wdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25CdWlsZEFJUHJvbXB0KHtcclxuICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCxcclxuICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICB0b25lTGFiZWw6IHNlbGVjdGVkVG9uZSA9PT0gbnVsbCB8fCBzZWxlY3RlZFRvbmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlbGVjdGVkVG9uZS5sYWJlbCxcclxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgfSkpIHx8XHJcbiAgICAgICAgICAgIGJ1aWxkQWN0aW9uUHJvbXB0KHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZyxcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBzZXRJc0dlbmVyYXRpbmcodHJ1ZSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2FjdGlvbl90cmlnZ2VyZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgdGVtcGxhdGVfY2F0ZWdvcnk6IHRlbXBsYXRlVHlwZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvbkFJQWN0aW9uUmVxdWVzdFxyXG4gICAgICAgICAgICAgICAgPyB5aWVsZCBvbkFJQWN0aW9uUmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICA6IHlpZWxkIHJlcXVlc3RBSVN1Z2dlc3Rpb24oe1xyXG4gICAgICAgICAgICAgICAgICAgIGFwaUFkYXB0ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEV4ZWN1dG9yLFxyXG4gICAgICAgICAgICAgICAgICAgIGJhc2VVcmwsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICAgICAgICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnXHJcbiAgICAgICAgICAgICAgICA/IHJlc3VsdC50cmltKClcclxuICAgICAgICAgICAgICAgIDogKChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXN1bHQuYm9keSkgfHwgJycpLnRyaW0oKTtcclxuICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICghcmVnZW5lcmF0ZUV4aXN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQoY3VycmVudFRleHQpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUoYWN0aW9uVHlwZSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbY2FuZGlkYXRlXSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoKHByZXYpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBbLi4ucHJldiwgY2FuZGlkYXRlXS5zbGljZSgwLCBNQVhfU1VHR0VTVElPTlMpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KG5leHQubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignRmFpbGVkIHRvIGdlbmVyYXRlIEFJIHN1Z2dlc3Rpb24nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgIHNldElzR2VuZXJhdGluZyhmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSksIFtcclxuICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgYmFzZVVybCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgY2FuUmVnZW5lcmF0ZSxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpbnN0cnVjdGlvblRleHQsXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgdGVtcGxhdGVJZCxcclxuICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICBvbkVycm9yLFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICAgICAgb25BSUFjdGlvblJlcXVlc3QsXHJcbiAgICAgICAgb25CdWlsZEFJUHJvbXB0LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghYWN0aXZlQ2FuZGlkYXRlIHx8ICFzdWdnZXN0aW9uQmFzZVRleHQgfHwgIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQoYWN0aXZlQ2FuZGlkYXRlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9hY2NlcHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0ge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjdGlvblR5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBlZGl0ZWRFdmVudEVtaXR0ZWQ6IGZhbHNlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgaW5Jbml0aWFsQWlQaGFzZSA9IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IHRhZ1BheWxvYWQgPSBjb21wdXRlQWlUYWdPbkFjY2VwdCh7XHJcbiAgICAgICAgICAgIGJhc2VsaW5lVGV4dDogc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlOiBpbkluaXRpYWxBaVBoYXNlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChpbkluaXRpYWxBaVBoYXNlKSB7XHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRhZ1BheWxvYWQpLCB7IHNvdXJjZTogJ2FjY2VwdCcgfSkpO1xyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNldEVkaXRvclRleHQsXHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCxcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVSZWplY3RTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9kaXNjYXJkZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW2NsZWFyU3VnZ2VzdGlvblNlc3Npb24sIGVtaXRBSUV2ZW50LCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdGVtcGxhdGVJZF0pO1xyXG4gICAgY29uc3QgaGFuZGxlRmVlZGJhY2sgPSB1c2VDYWxsYmFjaygocmF0aW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSgocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XTogcmF0aW5nIH0pKSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXksXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25JbmRleCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBhaUhlYWRlckFjdGlvbnMgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gZW5hYmxlZEFJQWN0aW9ucy5tYXAoKGFjdGlvblR5cGUpID0+IHtcclxuICAgICAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgICAgICBjb25zdCBhY3Rpb25Db25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgICAgICBjb25zdCB0b25lSWQgPSB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGFjdGlvbkNvbmZpZy5sYWJlbCxcclxuICAgICAgICAgICAgICAgIGlzUHJpbWFyeTogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGlzR2VuZXJhdGluZyAmJiBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFjdXJyZW50VGV4dC50cmltKCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGV4dC5sZW5ndGggPFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBpc0dlbmVyYXRpbmcgfHxcclxuICAgICAgICAgICAgICAgICAgICAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSxcclxuICAgICAgICAgICAgICAgIHNob3dUb25lRHJvcGRvd246IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICAhISgoX2EgPSBhY3Rpb25Db25maWcudG9uZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpLFxyXG4gICAgICAgICAgICAgICAgdG9uZXM6IGFjdGlvbkNvbmZpZy50b25lcyxcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkVG9uZUlkOiB0b25lSWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgZW5hYmxlZEFJQWN0aW9ucyxcclxuICAgICAgICBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBtaW5DaGFyc0J5QWN0aW9uLFxyXG4gICAgXSk7XHJcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGFkZFRleHRPcldyYXAsXHJcbiAgICAgICAgICAgIGFkZFRleHQsXHJcbiAgICAgICAgICAgIGdldCgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0Q2FyZXRQb3NpdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2FkZFRleHRPcldyYXAsIGFkZFRleHQsIGN1cnJlbnRUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpbnB1dFZhbHVlID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgfSwgW2lucHV0VmFsdWUsIHNldEVkaXRvclRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFsaW1pdCB8fCAhb25FcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG5leHRFcnJvciA9IGN1cnJlbnRUZXh0Lmxlbmd0aCA+IGxpbWl0ID8gTElNSVRfUkVBQ0hFRCA6IGVycm9yICE9PSBudWxsICYmIGVycm9yICE9PSB2b2lkIDAgPyBlcnJvciA6ICcnO1xyXG4gICAgICAgIGlmIChsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPT09IG5leHRFcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9IG5leHRFcnJvcjtcclxuICAgICAgICBvbkVycm9yKG5leHRFcnJvcik7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIGVycm9yLCBsaW1pdCwgb25FcnJvcl0pO1xyXG4gICAgcmV0dXJuIChfanN4cyhPdXRlckNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pLCBfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkxJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzVXBJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2xpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNsaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkRJU0xJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzRG93bkljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIGNhblJlZ2VuZXJhdGUgPyAoX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogaXNHZW5lcmF0aW5nID8gJ1JlZ2VuZXJhdGluZ+KApicgOiAnUmVnZW5lcmF0ZScsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiUmVnZW5lcmF0ZSBzdWdnZXN0aW9uXCIsIFwiYXJpYS1idXN5XCI6IGlzR2VuZXJhdGluZywgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzR2VuZXJhdGluZywgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IGlzR2VuZXJhdGluZyA/IChfanN4KFJlZ2VuZXJhdGVJY29uU2hpbW1lciwgeyBcImFyaWEtaGlkZGVuXCI6IHRydWUgfSkpIDogKF9qc3goUmV3aW5kSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkpIH0pKSB9KSkpIDogbnVsbCwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNjYXJkXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzY2FyZCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gfSwgeyBjaGlsZHJlbjogX2pzeChDcm9zc0ljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiQWNjZXB0XCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiQWNjZXB0IHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlQWNjZXB0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENoZWNrSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKV0gfSldIH0pKSkgOiBpc0dlbmVyYXRpbmcgPyAoX2pzeHMoRWRpdG9yU2tlbGV0b25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5NiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTIlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg4JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI1NCVcIiB9KV0gfSkpIDogKF9qc3goVGV4dFNwYWNlLCBPYmplY3QuYXNzaWduKHsgcmVmOiB0ZXh0U3BhY2VSZWYgfSwgdGV4dEFyZWFQcm9wcywgeyB2YWx1ZTogY3VycmVudFRleHQsIG9uQ2hhbmdlOiBoYW5kbGVPbkNoYW5nZSwgb25CbHVyOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0UG9zdEVkaXRBaVRhZ1JlY29tcHV0ZShlLnRhcmdldC52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QXJlYU9uQmx1ciA9PT0gbnVsbCB8fCB0ZXh0QXJlYU9uQmx1ciA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dEFyZWFPbkJsdXIoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uUGFzdGU6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhc3RlZFRleHQgPSBlLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3RlZFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSAoX2EgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uU3RhcnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gKF9iID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvbkVuZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogc3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlZmVyIGxpdmUgRE9NIHZhbHVlIOKAlCBgY3VycmVudFRleHRgIGNhbiBsYWcgdGhlIHRleHRhcmVhIGZvciBiaWcgcGFzdGVzLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSAoX2MgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwudmFsdWUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRUZXh0ID0gYmFzZS5zbGljZSgwLCBzdGFydCkgKyBwYXN0ZWRUZXh0ICsgYmFzZS5zbGljZShlbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcmV0ID0gc3RhcnQgKyBwYXN0ZWRUZXh0Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YSA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGEuc2V0U2VsZWN0aW9uUmFuZ2UoY2FyZXQsIGNhcmV0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBpbnZhbGlkIHJhbmdlIGluIGVkZ2UgYnJvd3NlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCByb3dzOiByb3dzIH0pKSksIGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUgPyAoX2pzeHMoSW5zdHJ1Y3Rpb25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhJbnN0cnVjdGlvbklucHV0Um93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0SWNvbiwgeyB3aWR0aDogMTgsIGhlaWdodDogMTgsIGNvbG9yOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnkgfSksIF9qc3goSW5zdHJ1Y3Rpb25JbnB1dCwgeyB2YWx1ZTogaW5zdHJ1Y3Rpb25UZXh0LCBwbGFjZWhvbGRlcjogXCJBZGQgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIHRvIHJlZmluZSB5b3VyIG1lc3NhZ2VcIiwgb25DaGFuZ2U6IChlKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoZS50YXJnZXQudmFsdWUpIH0pLCBfanN4cyhJbnN0cnVjdGlvbkFjdGlvbnMsIHsgY2hpbGRyZW46IFtfanN4KEluc3RydWN0aW9uQ2FuY2VsLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiQ2FuY2VsXCIgfSkpLCBfanN4KEluc3RydWN0aW9uSW1wcm92ZSwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RydWN0aW9uVG9BcHBseSA9IGluc3RydWN0aW9uVGV4dC50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2luc3RydWN0aW9uX3VzZWQnLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbl90eXBlOiBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fdGV4dDogYW5vbnltaXplSW5zdHJ1Y3Rpb25UZXh0KGluc3RydWN0aW9uVG9BcHBseSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSwgZmFsc2UsIGluc3RydWN0aW9uVG9BcHBseSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJJbXByb3ZlXCIgfSkpXSB9KV0gfSksIGluc3RydWN0aW9uVGV4dC50cmltKCkubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5sZW5ndGggPiAwID8gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCwgeyBjaGlsZHJlbjogZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLm1hcCgoc3VnZ2VzdGlvbikgPT4gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgc2VsZWN0ZWQ6IGluc3RydWN0aW9uVGV4dCA9PT0gc3VnZ2VzdGlvbiwgb25DbGljazogKCkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KHN1Z2dlc3Rpb24pIH0sIHsgY2hpbGRyZW46IHN1Z2dlc3Rpb24gfSksIHN1Z2dlc3Rpb24pKSkgfSkpIDogbnVsbF0gfSkpIDogKF9qc3goV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB7IGFjdGlvbnM6IGFjdGlvbnMsIHJlZjogdGV4dFNwYWNlUmVmLCBvbkFjdGlvblNlbGVjdDogb25BY3Rpb25TZWxlY3QsIFJpZ2h0Q29tcG9uZW50OiBSaWdodENvbXBvbmVudCwgcmlnaHRBY3Rpb25zRGlzYWJsZWQ6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIG9uRW1vamlDbGljazogb25FbW9qaUFkZGl0aW9uLCBhaUFjdGlvbnM6IGFpSGVhZGVyQWN0aW9ucywgZGlzYWJsZUFsbEFjdGlvbnM6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIGluc3RydWN0aW9uQWN0aXZlOiBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBvbkFJSW5zdHJ1Y3Rpb25zQ2xpY2s6ICgpID0+IHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUodHJ1ZSksIG9uQUlUb25lQ2hhbmdlOiAoYWN0aW9uVHlwZSwgdG9uZUlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUb25lQnlBY3Rpb24oKHByZXYpID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXYpLCB7IFthY3Rpb25UeXBlXTogdG9uZUlkIH0pKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkFJVG9uZVNlbGVjdCA9PT0gbnVsbCB8fCBvbkFJVG9uZVNlbGVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRvbmVTZWxlY3QoYWN0aW9uVHlwZSwgdG9uZUlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHRvbmVJZCwgQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBvbkFJQWN0aW9uQ2xpY2s6IChhY3Rpb25UeXBlLCBhY3Rpb25WYXJpYW50ID0gQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGFjdGlvbiBzaG91bGQgbm90IHJldHJpZ2dlciBmcm9tIGNoaXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2VuZXJhdGUgaXMgb25seSB2aWEgZXhwbGljaXQgcmVnZW5lcmF0ZSBjb250cm9sLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldyBhY3Rpb24gc3RhcnRzIGEgZnJlc2ggc3VnZ2VzdGlvbiBzZXNzaW9uLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSldIH0pKV0gfSkpO1xyXG59KTtcclxuV2hhdHNBcHBUZXh0RWRpdG9yLmRpc3BsYXlOYW1lID0gJ1doYXRzQXBwVGV4dEVkaXRvcic7XHJcbmV4cG9ydCB7IEFJX1RBR19DSEFOR0VfUkFUSU9fVEhSRVNIT0xELCBjb21wdXRlQWlUYWdPbkFjY2VwdCwgbGV2ZW5zaHRlaW5EaXN0YW5jZSwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2hhdHNBcHBUZXh0RWRpdG9yLmpzLm1hcCJdfQ== */")),Q=p.default("div","production"===process.env.NODE_ENV?{target:"ea7i3sh14"}:{target:"ea7i3sh14",label:"SuggestionCandidateText"})("color:",B.COLORS.content.primary,";"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBeUUyQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBPcmlnaW5hbCBwcmVmaWxsIGJvZHkgZm9yIEFJIHRhZyByZWNvbXB1dGU7IHNlZWRlZCBvbmNlLCBuZXZlciB0aGUgbGl2ZSBgY3VycmVudFRleHRgIGZhbGxiYWNrLiAqL1xyXG4gICAgY29uc3QgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZiA9IHVzZVJlZignJyk7XHJcbiAgICBjb25zdCBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZiA9IHVzZVJlZihmYWxzZSk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSAnJztcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghcHJlZmlsbFdhc0FpR2VuZXJhdGVkKSB7XHJcbiAgICAgICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50ID0gJyc7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBzZWVkID0gaW5wdXRWYWx1ZSAhPT0gbnVsbCAmJiBpbnB1dFZhbHVlICE9PSB2b2lkIDAgPyBpbnB1dFZhbHVlIDogJyc7XHJcbiAgICAgICAgaWYgKHNlZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSBzZWVkO1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBpbnB1dFZhbHVlLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChuZXh0VGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCByZWNvbXB1dGVQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCh7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgY3VycmVudEVkaXRlZFRleHQ6IG5leHRUZXh0LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlY29tcHV0ZVBheWxvYWQpLCB7IHNvdXJjZTogJ3Bvc3RfZWRpdF9kZWJvdW5jZScgfSkpO1xyXG4gICAgfSwgW29uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlICYmIHRleHQgIT09IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlKSB7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKHRleHQpO1xyXG4gICAgICAgICAgICB9LCBBSV9UQUdfUkVDT01QVVRFX0lETEVfTVMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXkpIHx8ICcwJyk7XHJcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oY2FjaGVkKSkge1xyXG4gICAgICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KGNhY2hlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgaGlnaGxpZ2h0U3RvcmFnZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKSB7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGVsaWdpYmxlID0gISFjdXJyZW50VGV4dC50cmltKCkgJiYgY3VycmVudFRleHQubGVuZ3RoID49IHJlcGhyYXNlTWluQ2hhcnM7XHJcbiAgICAgICAgaWYgKHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGVsaWdpYmxlO1xyXG4gICAgICAgICAgICBpZiAoZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICAgICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNyb3NzZWRUaHJlc2hvbGQgPSAhcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCAmJiBlbGlnaWJsZTtcclxuICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICBpZiAoY3Jvc3NlZFRocmVzaG9sZCkge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgaXNHZW5lcmF0aW5nLCByZXBocmFzZU1pbkNoYXJzXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXNbc3VnZ2VzdGlvbkluZGV4XSB8fCAnJztcclxuICAgIGNvbnN0IGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlQ2FuZGlkYXRlKVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gYCR7c3VnZ2VzdGlvbkFjdGlvblR5cGV9LSR7c3VnZ2VzdGlvbkluZGV4fS0ke2FjdGl2ZUNhbmRpZGF0ZX1gO1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHN1Z2dlc3Rpb25JbmRleF0pO1xyXG4gICAgY29uc3QgaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUgPSAhIShhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSAmJlxyXG4gICAgICAgIGZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZVthY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleV0pO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvbkJhc2VIdG1sID0gdXNlTWVtbygoKSA9PiBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAnJyksIFtzdWdnZXN0aW9uQmFzZVRleHRdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoYWN0aXZlQ2FuZGlkYXRlKSwgW2FjdGl2ZUNhbmRpZGF0ZV0pO1xyXG4gICAgY29uc3QgY2FuUmVnZW5lcmF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8IE1BWF9TVUdHRVNUSU9OUztcclxuICAgIGNvbnN0IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA9ICEhc3VnZ2VzdGlvbkJhc2VUZXh0ICYmIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA+IDA7XHJcbiAgICBjb25zdCBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggPD0gMSB8fCBzdWdnZXN0aW9uSW5kZXggPD0gMDtcclxuICAgIGNvbnN0IGlzTmV4dFN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8XHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4ID49IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCAtIDE7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IHN1Z2dlc3Rpb25TY3JvbGxSZWYuY3VycmVudDtcclxuICAgICAgICBpZiAoIW5vZGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBub2RlLnNjcm9sbFRvcCA9IG5vZGUuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLCBpc0dlbmVyYXRpbmddKTtcclxuICAgIGNvbnN0IGV4ZWN1dGVBSUFjdGlvbiA9IHVzZUNhbGxiYWNrKChhY3Rpb25UeXBlLCByZWdlbmVyYXRlRXhpc3RpbmcgPSBmYWxzZSwgaW5zdHJ1Y3Rpb25PdmVycmlkZSwgdG9uZU92ZXJyaWRlSWQsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgdmFyIF9iO1xyXG4gICAgICAgIGlmICghb25BSUFjdGlvblJlcXVlc3QgJiZcclxuICAgICAgICAgICAgIWFwaUFkYXB0ZXIgJiZcclxuICAgICAgICAgICAgKCFyZXF1ZXN0RXhlY3V0b3IgfHwgIWJhc2VVcmwpKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignQUkgY29uZmlndXJhdGlvbiBtaXNzaW5nJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjdXJyZW50VGV4dC50cmltKCkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBtaW5DaGFyc0ZvckFjdGlvbiA9IG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIDUwO1xyXG4gICAgICAgIGlmIChjdXJyZW50VGV4dC5sZW5ndGggPCBtaW5DaGFyc0ZvckFjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAocmVnZW5lcmF0ZUV4aXN0aW5nICYmICFjYW5SZWdlbmVyYXRlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgYmFzZUNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVR5cGUgPT09ICd1dGlsaXR5JyAmJlxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50ID09PSBBSUFjdGlvblZhcmlhbnQuUkVQSFJBU0VcclxuICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJhc2VDb25maWcpLCB7IGxhYmVsOiAnUmVwaHJhc2UnLCBiYXNlUHJvbXB0OiBVVElMSVRZX1JFUEhSQVNFX1BST01QVCB9KSA6IGJhc2VDb25maWc7XHJcbiAgICAgICAgLy8gVG9uZSBpcyBzZW50IG9ubHkgYWZ0ZXIgZXhwbGljaXQgdXNlciBzZWxlY3Rpb24gKG9yIGV4cGxpY2l0IG92ZXJyaWRlKSxcclxuICAgICAgICAvLyBub3QgZnJvbSBkZWZhdWx0IHRvbmUgbWV0YWRhdGEuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lSWQgPSB0b25lT3ZlcnJpZGVJZCB8fCB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lID0gKF9iID0gY29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZmluZCgodG9uZSkgPT4gdG9uZS5pZCA9PT0gc2VsZWN0ZWRUb25lSWQpO1xyXG4gICAgICAgIGNvbnN0IGluc3RydWN0aW9uRm9yUHJvbXB0ID0gaW5zdHJ1Y3Rpb25PdmVycmlkZSAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgID8gaW5zdHJ1Y3Rpb25PdmVycmlkZVxyXG4gICAgICAgICAgICA6IGluc3RydWN0aW9uVGV4dDtcclxuICAgICAgICBjb25zdCBwcm9tcHQgPSAob25CdWlsZEFJUHJvbXB0ID09PSBudWxsIHx8IG9uQnVpbGRBSVByb21wdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25CdWlsZEFJUHJvbXB0KHtcclxuICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCxcclxuICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICB0b25lTGFiZWw6IHNlbGVjdGVkVG9uZSA9PT0gbnVsbCB8fCBzZWxlY3RlZFRvbmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlbGVjdGVkVG9uZS5sYWJlbCxcclxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgfSkpIHx8XHJcbiAgICAgICAgICAgIGJ1aWxkQWN0aW9uUHJvbXB0KHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZyxcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBzZXRJc0dlbmVyYXRpbmcodHJ1ZSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2FjdGlvbl90cmlnZ2VyZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgdGVtcGxhdGVfY2F0ZWdvcnk6IHRlbXBsYXRlVHlwZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvbkFJQWN0aW9uUmVxdWVzdFxyXG4gICAgICAgICAgICAgICAgPyB5aWVsZCBvbkFJQWN0aW9uUmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICA6IHlpZWxkIHJlcXVlc3RBSVN1Z2dlc3Rpb24oe1xyXG4gICAgICAgICAgICAgICAgICAgIGFwaUFkYXB0ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEV4ZWN1dG9yLFxyXG4gICAgICAgICAgICAgICAgICAgIGJhc2VVcmwsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICAgICAgICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnXHJcbiAgICAgICAgICAgICAgICA/IHJlc3VsdC50cmltKClcclxuICAgICAgICAgICAgICAgIDogKChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXN1bHQuYm9keSkgfHwgJycpLnRyaW0oKTtcclxuICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICghcmVnZW5lcmF0ZUV4aXN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQoY3VycmVudFRleHQpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUoYWN0aW9uVHlwZSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbY2FuZGlkYXRlXSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoKHByZXYpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBbLi4ucHJldiwgY2FuZGlkYXRlXS5zbGljZSgwLCBNQVhfU1VHR0VTVElPTlMpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KG5leHQubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignRmFpbGVkIHRvIGdlbmVyYXRlIEFJIHN1Z2dlc3Rpb24nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgIHNldElzR2VuZXJhdGluZyhmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSksIFtcclxuICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgYmFzZVVybCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgY2FuUmVnZW5lcmF0ZSxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpbnN0cnVjdGlvblRleHQsXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgdGVtcGxhdGVJZCxcclxuICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICBvbkVycm9yLFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICAgICAgb25BSUFjdGlvblJlcXVlc3QsXHJcbiAgICAgICAgb25CdWlsZEFJUHJvbXB0LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghYWN0aXZlQ2FuZGlkYXRlIHx8ICFzdWdnZXN0aW9uQmFzZVRleHQgfHwgIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQoYWN0aXZlQ2FuZGlkYXRlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9hY2NlcHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0ge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjdGlvblR5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBlZGl0ZWRFdmVudEVtaXR0ZWQ6IGZhbHNlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgaW5Jbml0aWFsQWlQaGFzZSA9IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IHRhZ1BheWxvYWQgPSBjb21wdXRlQWlUYWdPbkFjY2VwdCh7XHJcbiAgICAgICAgICAgIGJhc2VsaW5lVGV4dDogc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlOiBpbkluaXRpYWxBaVBoYXNlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChpbkluaXRpYWxBaVBoYXNlKSB7XHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRhZ1BheWxvYWQpLCB7IHNvdXJjZTogJ2FjY2VwdCcgfSkpO1xyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNldEVkaXRvclRleHQsXHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCxcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVSZWplY3RTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9kaXNjYXJkZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW2NsZWFyU3VnZ2VzdGlvblNlc3Npb24sIGVtaXRBSUV2ZW50LCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdGVtcGxhdGVJZF0pO1xyXG4gICAgY29uc3QgaGFuZGxlRmVlZGJhY2sgPSB1c2VDYWxsYmFjaygocmF0aW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSgocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XTogcmF0aW5nIH0pKSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXksXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25JbmRleCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBhaUhlYWRlckFjdGlvbnMgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gZW5hYmxlZEFJQWN0aW9ucy5tYXAoKGFjdGlvblR5cGUpID0+IHtcclxuICAgICAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgICAgICBjb25zdCBhY3Rpb25Db25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgICAgICBjb25zdCB0b25lSWQgPSB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGFjdGlvbkNvbmZpZy5sYWJlbCxcclxuICAgICAgICAgICAgICAgIGlzUHJpbWFyeTogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGlzR2VuZXJhdGluZyAmJiBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFjdXJyZW50VGV4dC50cmltKCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGV4dC5sZW5ndGggPFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBpc0dlbmVyYXRpbmcgfHxcclxuICAgICAgICAgICAgICAgICAgICAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSxcclxuICAgICAgICAgICAgICAgIHNob3dUb25lRHJvcGRvd246IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICAhISgoX2EgPSBhY3Rpb25Db25maWcudG9uZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpLFxyXG4gICAgICAgICAgICAgICAgdG9uZXM6IGFjdGlvbkNvbmZpZy50b25lcyxcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkVG9uZUlkOiB0b25lSWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgZW5hYmxlZEFJQWN0aW9ucyxcclxuICAgICAgICBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBtaW5DaGFyc0J5QWN0aW9uLFxyXG4gICAgXSk7XHJcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGFkZFRleHRPcldyYXAsXHJcbiAgICAgICAgICAgIGFkZFRleHQsXHJcbiAgICAgICAgICAgIGdldCgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0Q2FyZXRQb3NpdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2FkZFRleHRPcldyYXAsIGFkZFRleHQsIGN1cnJlbnRUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpbnB1dFZhbHVlID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgfSwgW2lucHV0VmFsdWUsIHNldEVkaXRvclRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFsaW1pdCB8fCAhb25FcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG5leHRFcnJvciA9IGN1cnJlbnRUZXh0Lmxlbmd0aCA+IGxpbWl0ID8gTElNSVRfUkVBQ0hFRCA6IGVycm9yICE9PSBudWxsICYmIGVycm9yICE9PSB2b2lkIDAgPyBlcnJvciA6ICcnO1xyXG4gICAgICAgIGlmIChsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPT09IG5leHRFcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9IG5leHRFcnJvcjtcclxuICAgICAgICBvbkVycm9yKG5leHRFcnJvcik7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIGVycm9yLCBsaW1pdCwgb25FcnJvcl0pO1xyXG4gICAgcmV0dXJuIChfanN4cyhPdXRlckNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pLCBfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkxJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzVXBJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2xpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNsaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkRJU0xJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzRG93bkljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIGNhblJlZ2VuZXJhdGUgPyAoX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogaXNHZW5lcmF0aW5nID8gJ1JlZ2VuZXJhdGluZ+KApicgOiAnUmVnZW5lcmF0ZScsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiUmVnZW5lcmF0ZSBzdWdnZXN0aW9uXCIsIFwiYXJpYS1idXN5XCI6IGlzR2VuZXJhdGluZywgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzR2VuZXJhdGluZywgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IGlzR2VuZXJhdGluZyA/IChfanN4KFJlZ2VuZXJhdGVJY29uU2hpbW1lciwgeyBcImFyaWEtaGlkZGVuXCI6IHRydWUgfSkpIDogKF9qc3goUmV3aW5kSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkpIH0pKSB9KSkpIDogbnVsbCwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNjYXJkXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzY2FyZCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gfSwgeyBjaGlsZHJlbjogX2pzeChDcm9zc0ljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiQWNjZXB0XCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiQWNjZXB0IHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlQWNjZXB0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENoZWNrSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKV0gfSldIH0pKSkgOiBpc0dlbmVyYXRpbmcgPyAoX2pzeHMoRWRpdG9yU2tlbGV0b25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5NiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTIlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg4JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI1NCVcIiB9KV0gfSkpIDogKF9qc3goVGV4dFNwYWNlLCBPYmplY3QuYXNzaWduKHsgcmVmOiB0ZXh0U3BhY2VSZWYgfSwgdGV4dEFyZWFQcm9wcywgeyB2YWx1ZTogY3VycmVudFRleHQsIG9uQ2hhbmdlOiBoYW5kbGVPbkNoYW5nZSwgb25CbHVyOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0UG9zdEVkaXRBaVRhZ1JlY29tcHV0ZShlLnRhcmdldC52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QXJlYU9uQmx1ciA9PT0gbnVsbCB8fCB0ZXh0QXJlYU9uQmx1ciA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dEFyZWFPbkJsdXIoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uUGFzdGU6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhc3RlZFRleHQgPSBlLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3RlZFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSAoX2EgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uU3RhcnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gKF9iID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvbkVuZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogc3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlZmVyIGxpdmUgRE9NIHZhbHVlIOKAlCBgY3VycmVudFRleHRgIGNhbiBsYWcgdGhlIHRleHRhcmVhIGZvciBiaWcgcGFzdGVzLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSAoX2MgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwudmFsdWUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRUZXh0ID0gYmFzZS5zbGljZSgwLCBzdGFydCkgKyBwYXN0ZWRUZXh0ICsgYmFzZS5zbGljZShlbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcmV0ID0gc3RhcnQgKyBwYXN0ZWRUZXh0Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YSA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGEuc2V0U2VsZWN0aW9uUmFuZ2UoY2FyZXQsIGNhcmV0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBpbnZhbGlkIHJhbmdlIGluIGVkZ2UgYnJvd3NlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCByb3dzOiByb3dzIH0pKSksIGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUgPyAoX2pzeHMoSW5zdHJ1Y3Rpb25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhJbnN0cnVjdGlvbklucHV0Um93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0SWNvbiwgeyB3aWR0aDogMTgsIGhlaWdodDogMTgsIGNvbG9yOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnkgfSksIF9qc3goSW5zdHJ1Y3Rpb25JbnB1dCwgeyB2YWx1ZTogaW5zdHJ1Y3Rpb25UZXh0LCBwbGFjZWhvbGRlcjogXCJBZGQgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIHRvIHJlZmluZSB5b3VyIG1lc3NhZ2VcIiwgb25DaGFuZ2U6IChlKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoZS50YXJnZXQudmFsdWUpIH0pLCBfanN4cyhJbnN0cnVjdGlvbkFjdGlvbnMsIHsgY2hpbGRyZW46IFtfanN4KEluc3RydWN0aW9uQ2FuY2VsLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiQ2FuY2VsXCIgfSkpLCBfanN4KEluc3RydWN0aW9uSW1wcm92ZSwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RydWN0aW9uVG9BcHBseSA9IGluc3RydWN0aW9uVGV4dC50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2luc3RydWN0aW9uX3VzZWQnLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbl90eXBlOiBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fdGV4dDogYW5vbnltaXplSW5zdHJ1Y3Rpb25UZXh0KGluc3RydWN0aW9uVG9BcHBseSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSwgZmFsc2UsIGluc3RydWN0aW9uVG9BcHBseSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJJbXByb3ZlXCIgfSkpXSB9KV0gfSksIGluc3RydWN0aW9uVGV4dC50cmltKCkubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5sZW5ndGggPiAwID8gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCwgeyBjaGlsZHJlbjogZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLm1hcCgoc3VnZ2VzdGlvbikgPT4gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgc2VsZWN0ZWQ6IGluc3RydWN0aW9uVGV4dCA9PT0gc3VnZ2VzdGlvbiwgb25DbGljazogKCkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KHN1Z2dlc3Rpb24pIH0sIHsgY2hpbGRyZW46IHN1Z2dlc3Rpb24gfSksIHN1Z2dlc3Rpb24pKSkgfSkpIDogbnVsbF0gfSkpIDogKF9qc3goV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB7IGFjdGlvbnM6IGFjdGlvbnMsIHJlZjogdGV4dFNwYWNlUmVmLCBvbkFjdGlvblNlbGVjdDogb25BY3Rpb25TZWxlY3QsIFJpZ2h0Q29tcG9uZW50OiBSaWdodENvbXBvbmVudCwgcmlnaHRBY3Rpb25zRGlzYWJsZWQ6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIG9uRW1vamlDbGljazogb25FbW9qaUFkZGl0aW9uLCBhaUFjdGlvbnM6IGFpSGVhZGVyQWN0aW9ucywgZGlzYWJsZUFsbEFjdGlvbnM6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIGluc3RydWN0aW9uQWN0aXZlOiBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBvbkFJSW5zdHJ1Y3Rpb25zQ2xpY2s6ICgpID0+IHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUodHJ1ZSksIG9uQUlUb25lQ2hhbmdlOiAoYWN0aW9uVHlwZSwgdG9uZUlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUb25lQnlBY3Rpb24oKHByZXYpID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXYpLCB7IFthY3Rpb25UeXBlXTogdG9uZUlkIH0pKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkFJVG9uZVNlbGVjdCA9PT0gbnVsbCB8fCBvbkFJVG9uZVNlbGVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRvbmVTZWxlY3QoYWN0aW9uVHlwZSwgdG9uZUlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHRvbmVJZCwgQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBvbkFJQWN0aW9uQ2xpY2s6IChhY3Rpb25UeXBlLCBhY3Rpb25WYXJpYW50ID0gQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGFjdGlvbiBzaG91bGQgbm90IHJldHJpZ2dlciBmcm9tIGNoaXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2VuZXJhdGUgaXMgb25seSB2aWEgZXhwbGljaXQgcmVnZW5lcmF0ZSBjb250cm9sLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldyBhY3Rpb24gc3RhcnRzIGEgZnJlc2ggc3VnZ2VzdGlvbiBzZXNzaW9uLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSldIH0pKV0gfSkpO1xyXG59KTtcclxuV2hhdHNBcHBUZXh0RWRpdG9yLmRpc3BsYXlOYW1lID0gJ1doYXRzQXBwVGV4dEVkaXRvcic7XHJcbmV4cG9ydCB7IEFJX1RBR19DSEFOR0VfUkFUSU9fVEhSRVNIT0xELCBjb21wdXRlQWlUYWdPbkFjY2VwdCwgbGV2ZW5zaHRlaW5EaXN0YW5jZSwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2hhdHNBcHBUZXh0RWRpdG9yLmpzLm1hcCJdfQ== */")),z=p.default("div","production"===process.env.NODE_ENV?{target:"ea7i3sh13"}:{target:"ea7i3sh13",label:"SuggestionCandidateSkeleton"})("production"===process.env.NODE_ENV?{name:"j0onnx",styles:"display:flex;flex-direction:column;gap:8px;width:100%;min-height:40px"}:{name:"j0onnx",styles:"display:flex;flex-direction:column;gap:8px;width:100%;min-height:40px",map:"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBNEUrQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBPcmlnaW5hbCBwcmVmaWxsIGJvZHkgZm9yIEFJIHRhZyByZWNvbXB1dGU7IHNlZWRlZCBvbmNlLCBuZXZlciB0aGUgbGl2ZSBgY3VycmVudFRleHRgIGZhbGxiYWNrLiAqL1xyXG4gICAgY29uc3QgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZiA9IHVzZVJlZignJyk7XHJcbiAgICBjb25zdCBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZiA9IHVzZVJlZihmYWxzZSk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSAnJztcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghcHJlZmlsbFdhc0FpR2VuZXJhdGVkKSB7XHJcbiAgICAgICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50ID0gJyc7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBzZWVkID0gaW5wdXRWYWx1ZSAhPT0gbnVsbCAmJiBpbnB1dFZhbHVlICE9PSB2b2lkIDAgPyBpbnB1dFZhbHVlIDogJyc7XHJcbiAgICAgICAgaWYgKHNlZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSBzZWVkO1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBpbnB1dFZhbHVlLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChuZXh0VGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCByZWNvbXB1dGVQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCh7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgY3VycmVudEVkaXRlZFRleHQ6IG5leHRUZXh0LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlY29tcHV0ZVBheWxvYWQpLCB7IHNvdXJjZTogJ3Bvc3RfZWRpdF9kZWJvdW5jZScgfSkpO1xyXG4gICAgfSwgW29uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlICYmIHRleHQgIT09IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlKSB7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKHRleHQpO1xyXG4gICAgICAgICAgICB9LCBBSV9UQUdfUkVDT01QVVRFX0lETEVfTVMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXkpIHx8ICcwJyk7XHJcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oY2FjaGVkKSkge1xyXG4gICAgICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KGNhY2hlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgaGlnaGxpZ2h0U3RvcmFnZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKSB7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGVsaWdpYmxlID0gISFjdXJyZW50VGV4dC50cmltKCkgJiYgY3VycmVudFRleHQubGVuZ3RoID49IHJlcGhyYXNlTWluQ2hhcnM7XHJcbiAgICAgICAgaWYgKHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGVsaWdpYmxlO1xyXG4gICAgICAgICAgICBpZiAoZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICAgICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNyb3NzZWRUaHJlc2hvbGQgPSAhcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCAmJiBlbGlnaWJsZTtcclxuICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICBpZiAoY3Jvc3NlZFRocmVzaG9sZCkge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgaXNHZW5lcmF0aW5nLCByZXBocmFzZU1pbkNoYXJzXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXNbc3VnZ2VzdGlvbkluZGV4XSB8fCAnJztcclxuICAgIGNvbnN0IGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlQ2FuZGlkYXRlKVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gYCR7c3VnZ2VzdGlvbkFjdGlvblR5cGV9LSR7c3VnZ2VzdGlvbkluZGV4fS0ke2FjdGl2ZUNhbmRpZGF0ZX1gO1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHN1Z2dlc3Rpb25JbmRleF0pO1xyXG4gICAgY29uc3QgaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUgPSAhIShhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSAmJlxyXG4gICAgICAgIGZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZVthY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleV0pO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvbkJhc2VIdG1sID0gdXNlTWVtbygoKSA9PiBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAnJyksIFtzdWdnZXN0aW9uQmFzZVRleHRdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoYWN0aXZlQ2FuZGlkYXRlKSwgW2FjdGl2ZUNhbmRpZGF0ZV0pO1xyXG4gICAgY29uc3QgY2FuUmVnZW5lcmF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8IE1BWF9TVUdHRVNUSU9OUztcclxuICAgIGNvbnN0IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA9ICEhc3VnZ2VzdGlvbkJhc2VUZXh0ICYmIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA+IDA7XHJcbiAgICBjb25zdCBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggPD0gMSB8fCBzdWdnZXN0aW9uSW5kZXggPD0gMDtcclxuICAgIGNvbnN0IGlzTmV4dFN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8XHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4ID49IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCAtIDE7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IHN1Z2dlc3Rpb25TY3JvbGxSZWYuY3VycmVudDtcclxuICAgICAgICBpZiAoIW5vZGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBub2RlLnNjcm9sbFRvcCA9IG5vZGUuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLCBpc0dlbmVyYXRpbmddKTtcclxuICAgIGNvbnN0IGV4ZWN1dGVBSUFjdGlvbiA9IHVzZUNhbGxiYWNrKChhY3Rpb25UeXBlLCByZWdlbmVyYXRlRXhpc3RpbmcgPSBmYWxzZSwgaW5zdHJ1Y3Rpb25PdmVycmlkZSwgdG9uZU92ZXJyaWRlSWQsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgdmFyIF9iO1xyXG4gICAgICAgIGlmICghb25BSUFjdGlvblJlcXVlc3QgJiZcclxuICAgICAgICAgICAgIWFwaUFkYXB0ZXIgJiZcclxuICAgICAgICAgICAgKCFyZXF1ZXN0RXhlY3V0b3IgfHwgIWJhc2VVcmwpKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignQUkgY29uZmlndXJhdGlvbiBtaXNzaW5nJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjdXJyZW50VGV4dC50cmltKCkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBtaW5DaGFyc0ZvckFjdGlvbiA9IG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIDUwO1xyXG4gICAgICAgIGlmIChjdXJyZW50VGV4dC5sZW5ndGggPCBtaW5DaGFyc0ZvckFjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAocmVnZW5lcmF0ZUV4aXN0aW5nICYmICFjYW5SZWdlbmVyYXRlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgYmFzZUNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVR5cGUgPT09ICd1dGlsaXR5JyAmJlxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50ID09PSBBSUFjdGlvblZhcmlhbnQuUkVQSFJBU0VcclxuICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJhc2VDb25maWcpLCB7IGxhYmVsOiAnUmVwaHJhc2UnLCBiYXNlUHJvbXB0OiBVVElMSVRZX1JFUEhSQVNFX1BST01QVCB9KSA6IGJhc2VDb25maWc7XHJcbiAgICAgICAgLy8gVG9uZSBpcyBzZW50IG9ubHkgYWZ0ZXIgZXhwbGljaXQgdXNlciBzZWxlY3Rpb24gKG9yIGV4cGxpY2l0IG92ZXJyaWRlKSxcclxuICAgICAgICAvLyBub3QgZnJvbSBkZWZhdWx0IHRvbmUgbWV0YWRhdGEuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lSWQgPSB0b25lT3ZlcnJpZGVJZCB8fCB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lID0gKF9iID0gY29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZmluZCgodG9uZSkgPT4gdG9uZS5pZCA9PT0gc2VsZWN0ZWRUb25lSWQpO1xyXG4gICAgICAgIGNvbnN0IGluc3RydWN0aW9uRm9yUHJvbXB0ID0gaW5zdHJ1Y3Rpb25PdmVycmlkZSAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgID8gaW5zdHJ1Y3Rpb25PdmVycmlkZVxyXG4gICAgICAgICAgICA6IGluc3RydWN0aW9uVGV4dDtcclxuICAgICAgICBjb25zdCBwcm9tcHQgPSAob25CdWlsZEFJUHJvbXB0ID09PSBudWxsIHx8IG9uQnVpbGRBSVByb21wdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25CdWlsZEFJUHJvbXB0KHtcclxuICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCxcclxuICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICB0b25lTGFiZWw6IHNlbGVjdGVkVG9uZSA9PT0gbnVsbCB8fCBzZWxlY3RlZFRvbmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlbGVjdGVkVG9uZS5sYWJlbCxcclxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgfSkpIHx8XHJcbiAgICAgICAgICAgIGJ1aWxkQWN0aW9uUHJvbXB0KHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZyxcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBzZXRJc0dlbmVyYXRpbmcodHJ1ZSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2FjdGlvbl90cmlnZ2VyZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgdGVtcGxhdGVfY2F0ZWdvcnk6IHRlbXBsYXRlVHlwZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvbkFJQWN0aW9uUmVxdWVzdFxyXG4gICAgICAgICAgICAgICAgPyB5aWVsZCBvbkFJQWN0aW9uUmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICA6IHlpZWxkIHJlcXVlc3RBSVN1Z2dlc3Rpb24oe1xyXG4gICAgICAgICAgICAgICAgICAgIGFwaUFkYXB0ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEV4ZWN1dG9yLFxyXG4gICAgICAgICAgICAgICAgICAgIGJhc2VVcmwsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICAgICAgICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnXHJcbiAgICAgICAgICAgICAgICA/IHJlc3VsdC50cmltKClcclxuICAgICAgICAgICAgICAgIDogKChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXN1bHQuYm9keSkgfHwgJycpLnRyaW0oKTtcclxuICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICghcmVnZW5lcmF0ZUV4aXN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQoY3VycmVudFRleHQpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUoYWN0aW9uVHlwZSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbY2FuZGlkYXRlXSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoKHByZXYpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBbLi4ucHJldiwgY2FuZGlkYXRlXS5zbGljZSgwLCBNQVhfU1VHR0VTVElPTlMpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KG5leHQubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignRmFpbGVkIHRvIGdlbmVyYXRlIEFJIHN1Z2dlc3Rpb24nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgIHNldElzR2VuZXJhdGluZyhmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSksIFtcclxuICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgYmFzZVVybCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgY2FuUmVnZW5lcmF0ZSxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpbnN0cnVjdGlvblRleHQsXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgdGVtcGxhdGVJZCxcclxuICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICBvbkVycm9yLFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICAgICAgb25BSUFjdGlvblJlcXVlc3QsXHJcbiAgICAgICAgb25CdWlsZEFJUHJvbXB0LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghYWN0aXZlQ2FuZGlkYXRlIHx8ICFzdWdnZXN0aW9uQmFzZVRleHQgfHwgIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQoYWN0aXZlQ2FuZGlkYXRlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9hY2NlcHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0ge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjdGlvblR5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBlZGl0ZWRFdmVudEVtaXR0ZWQ6IGZhbHNlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgaW5Jbml0aWFsQWlQaGFzZSA9IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IHRhZ1BheWxvYWQgPSBjb21wdXRlQWlUYWdPbkFjY2VwdCh7XHJcbiAgICAgICAgICAgIGJhc2VsaW5lVGV4dDogc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlOiBpbkluaXRpYWxBaVBoYXNlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChpbkluaXRpYWxBaVBoYXNlKSB7XHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRhZ1BheWxvYWQpLCB7IHNvdXJjZTogJ2FjY2VwdCcgfSkpO1xyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNldEVkaXRvclRleHQsXHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCxcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVSZWplY3RTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9kaXNjYXJkZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW2NsZWFyU3VnZ2VzdGlvblNlc3Npb24sIGVtaXRBSUV2ZW50LCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdGVtcGxhdGVJZF0pO1xyXG4gICAgY29uc3QgaGFuZGxlRmVlZGJhY2sgPSB1c2VDYWxsYmFjaygocmF0aW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSgocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XTogcmF0aW5nIH0pKSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXksXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25JbmRleCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBhaUhlYWRlckFjdGlvbnMgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gZW5hYmxlZEFJQWN0aW9ucy5tYXAoKGFjdGlvblR5cGUpID0+IHtcclxuICAgICAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgICAgICBjb25zdCBhY3Rpb25Db25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgICAgICBjb25zdCB0b25lSWQgPSB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGFjdGlvbkNvbmZpZy5sYWJlbCxcclxuICAgICAgICAgICAgICAgIGlzUHJpbWFyeTogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGlzR2VuZXJhdGluZyAmJiBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFjdXJyZW50VGV4dC50cmltKCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGV4dC5sZW5ndGggPFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBpc0dlbmVyYXRpbmcgfHxcclxuICAgICAgICAgICAgICAgICAgICAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSxcclxuICAgICAgICAgICAgICAgIHNob3dUb25lRHJvcGRvd246IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICAhISgoX2EgPSBhY3Rpb25Db25maWcudG9uZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpLFxyXG4gICAgICAgICAgICAgICAgdG9uZXM6IGFjdGlvbkNvbmZpZy50b25lcyxcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkVG9uZUlkOiB0b25lSWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgZW5hYmxlZEFJQWN0aW9ucyxcclxuICAgICAgICBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBtaW5DaGFyc0J5QWN0aW9uLFxyXG4gICAgXSk7XHJcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGFkZFRleHRPcldyYXAsXHJcbiAgICAgICAgICAgIGFkZFRleHQsXHJcbiAgICAgICAgICAgIGdldCgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0Q2FyZXRQb3NpdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2FkZFRleHRPcldyYXAsIGFkZFRleHQsIGN1cnJlbnRUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpbnB1dFZhbHVlID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgfSwgW2lucHV0VmFsdWUsIHNldEVkaXRvclRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFsaW1pdCB8fCAhb25FcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG5leHRFcnJvciA9IGN1cnJlbnRUZXh0Lmxlbmd0aCA+IGxpbWl0ID8gTElNSVRfUkVBQ0hFRCA6IGVycm9yICE9PSBudWxsICYmIGVycm9yICE9PSB2b2lkIDAgPyBlcnJvciA6ICcnO1xyXG4gICAgICAgIGlmIChsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPT09IG5leHRFcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9IG5leHRFcnJvcjtcclxuICAgICAgICBvbkVycm9yKG5leHRFcnJvcik7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIGVycm9yLCBsaW1pdCwgb25FcnJvcl0pO1xyXG4gICAgcmV0dXJuIChfanN4cyhPdXRlckNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pLCBfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkxJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzVXBJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2xpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNsaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkRJU0xJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzRG93bkljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIGNhblJlZ2VuZXJhdGUgPyAoX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogaXNHZW5lcmF0aW5nID8gJ1JlZ2VuZXJhdGluZ+KApicgOiAnUmVnZW5lcmF0ZScsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiUmVnZW5lcmF0ZSBzdWdnZXN0aW9uXCIsIFwiYXJpYS1idXN5XCI6IGlzR2VuZXJhdGluZywgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzR2VuZXJhdGluZywgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IGlzR2VuZXJhdGluZyA/IChfanN4KFJlZ2VuZXJhdGVJY29uU2hpbW1lciwgeyBcImFyaWEtaGlkZGVuXCI6IHRydWUgfSkpIDogKF9qc3goUmV3aW5kSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkpIH0pKSB9KSkpIDogbnVsbCwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNjYXJkXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzY2FyZCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gfSwgeyBjaGlsZHJlbjogX2pzeChDcm9zc0ljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiQWNjZXB0XCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiQWNjZXB0IHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlQWNjZXB0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENoZWNrSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKV0gfSldIH0pKSkgOiBpc0dlbmVyYXRpbmcgPyAoX2pzeHMoRWRpdG9yU2tlbGV0b25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5NiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTIlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg4JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI1NCVcIiB9KV0gfSkpIDogKF9qc3goVGV4dFNwYWNlLCBPYmplY3QuYXNzaWduKHsgcmVmOiB0ZXh0U3BhY2VSZWYgfSwgdGV4dEFyZWFQcm9wcywgeyB2YWx1ZTogY3VycmVudFRleHQsIG9uQ2hhbmdlOiBoYW5kbGVPbkNoYW5nZSwgb25CbHVyOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0UG9zdEVkaXRBaVRhZ1JlY29tcHV0ZShlLnRhcmdldC52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QXJlYU9uQmx1ciA9PT0gbnVsbCB8fCB0ZXh0QXJlYU9uQmx1ciA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dEFyZWFPbkJsdXIoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uUGFzdGU6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhc3RlZFRleHQgPSBlLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3RlZFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSAoX2EgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uU3RhcnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gKF9iID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvbkVuZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogc3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlZmVyIGxpdmUgRE9NIHZhbHVlIOKAlCBgY3VycmVudFRleHRgIGNhbiBsYWcgdGhlIHRleHRhcmVhIGZvciBiaWcgcGFzdGVzLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSAoX2MgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwudmFsdWUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRUZXh0ID0gYmFzZS5zbGljZSgwLCBzdGFydCkgKyBwYXN0ZWRUZXh0ICsgYmFzZS5zbGljZShlbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcmV0ID0gc3RhcnQgKyBwYXN0ZWRUZXh0Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YSA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGEuc2V0U2VsZWN0aW9uUmFuZ2UoY2FyZXQsIGNhcmV0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBpbnZhbGlkIHJhbmdlIGluIGVkZ2UgYnJvd3NlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCByb3dzOiByb3dzIH0pKSksIGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUgPyAoX2pzeHMoSW5zdHJ1Y3Rpb25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhJbnN0cnVjdGlvbklucHV0Um93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0SWNvbiwgeyB3aWR0aDogMTgsIGhlaWdodDogMTgsIGNvbG9yOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnkgfSksIF9qc3goSW5zdHJ1Y3Rpb25JbnB1dCwgeyB2YWx1ZTogaW5zdHJ1Y3Rpb25UZXh0LCBwbGFjZWhvbGRlcjogXCJBZGQgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIHRvIHJlZmluZSB5b3VyIG1lc3NhZ2VcIiwgb25DaGFuZ2U6IChlKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoZS50YXJnZXQudmFsdWUpIH0pLCBfanN4cyhJbnN0cnVjdGlvbkFjdGlvbnMsIHsgY2hpbGRyZW46IFtfanN4KEluc3RydWN0aW9uQ2FuY2VsLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiQ2FuY2VsXCIgfSkpLCBfanN4KEluc3RydWN0aW9uSW1wcm92ZSwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RydWN0aW9uVG9BcHBseSA9IGluc3RydWN0aW9uVGV4dC50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2luc3RydWN0aW9uX3VzZWQnLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbl90eXBlOiBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fdGV4dDogYW5vbnltaXplSW5zdHJ1Y3Rpb25UZXh0KGluc3RydWN0aW9uVG9BcHBseSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSwgZmFsc2UsIGluc3RydWN0aW9uVG9BcHBseSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJJbXByb3ZlXCIgfSkpXSB9KV0gfSksIGluc3RydWN0aW9uVGV4dC50cmltKCkubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5sZW5ndGggPiAwID8gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCwgeyBjaGlsZHJlbjogZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLm1hcCgoc3VnZ2VzdGlvbikgPT4gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgc2VsZWN0ZWQ6IGluc3RydWN0aW9uVGV4dCA9PT0gc3VnZ2VzdGlvbiwgb25DbGljazogKCkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KHN1Z2dlc3Rpb24pIH0sIHsgY2hpbGRyZW46IHN1Z2dlc3Rpb24gfSksIHN1Z2dlc3Rpb24pKSkgfSkpIDogbnVsbF0gfSkpIDogKF9qc3goV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB7IGFjdGlvbnM6IGFjdGlvbnMsIHJlZjogdGV4dFNwYWNlUmVmLCBvbkFjdGlvblNlbGVjdDogb25BY3Rpb25TZWxlY3QsIFJpZ2h0Q29tcG9uZW50OiBSaWdodENvbXBvbmVudCwgcmlnaHRBY3Rpb25zRGlzYWJsZWQ6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIG9uRW1vamlDbGljazogb25FbW9qaUFkZGl0aW9uLCBhaUFjdGlvbnM6IGFpSGVhZGVyQWN0aW9ucywgZGlzYWJsZUFsbEFjdGlvbnM6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIGluc3RydWN0aW9uQWN0aXZlOiBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBvbkFJSW5zdHJ1Y3Rpb25zQ2xpY2s6ICgpID0+IHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUodHJ1ZSksIG9uQUlUb25lQ2hhbmdlOiAoYWN0aW9uVHlwZSwgdG9uZUlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUb25lQnlBY3Rpb24oKHByZXYpID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXYpLCB7IFthY3Rpb25UeXBlXTogdG9uZUlkIH0pKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkFJVG9uZVNlbGVjdCA9PT0gbnVsbCB8fCBvbkFJVG9uZVNlbGVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRvbmVTZWxlY3QoYWN0aW9uVHlwZSwgdG9uZUlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHRvbmVJZCwgQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBvbkFJQWN0aW9uQ2xpY2s6IChhY3Rpb25UeXBlLCBhY3Rpb25WYXJpYW50ID0gQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGFjdGlvbiBzaG91bGQgbm90IHJldHJpZ2dlciBmcm9tIGNoaXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2VuZXJhdGUgaXMgb25seSB2aWEgZXhwbGljaXQgcmVnZW5lcmF0ZSBjb250cm9sLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldyBhY3Rpb24gc3RhcnRzIGEgZnJlc2ggc3VnZ2VzdGlvbiBzZXNzaW9uLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSldIH0pKV0gfSkpO1xyXG59KTtcclxuV2hhdHNBcHBUZXh0RWRpdG9yLmRpc3BsYXlOYW1lID0gJ1doYXRzQXBwVGV4dEVkaXRvcic7XHJcbmV4cG9ydCB7IEFJX1RBR19DSEFOR0VfUkFUSU9fVEhSRVNIT0xELCBjb21wdXRlQWlUYWdPbkFjY2VwdCwgbGV2ZW5zaHRlaW5EaXN0YW5jZSwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2hhdHNBcHBUZXh0RWRpdG9yLmpzLm1hcCJdfQ== */",toString:a}),v=p.default("div","production"===process.env.NODE_ENV?{target:"ea7i3sh12"}:{target:"ea7i3sh12",label:"SuggestionControlsRow"})("production"===process.env.NODE_ENV?{name:"1pi78hi",styles:"display:flex;align-items:center;gap:6px"}:{name:"1pi78hi",styles:"display:flex;align-items:center;gap:6px",map:"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBbUZ5QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBPcmlnaW5hbCBwcmVmaWxsIGJvZHkgZm9yIEFJIHRhZyByZWNvbXB1dGU7IHNlZWRlZCBvbmNlLCBuZXZlciB0aGUgbGl2ZSBgY3VycmVudFRleHRgIGZhbGxiYWNrLiAqL1xyXG4gICAgY29uc3QgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZiA9IHVzZVJlZignJyk7XHJcbiAgICBjb25zdCBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZiA9IHVzZVJlZihmYWxzZSk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSAnJztcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghcHJlZmlsbFdhc0FpR2VuZXJhdGVkKSB7XHJcbiAgICAgICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50ID0gJyc7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBzZWVkID0gaW5wdXRWYWx1ZSAhPT0gbnVsbCAmJiBpbnB1dFZhbHVlICE9PSB2b2lkIDAgPyBpbnB1dFZhbHVlIDogJyc7XHJcbiAgICAgICAgaWYgKHNlZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSBzZWVkO1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBpbnB1dFZhbHVlLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChuZXh0VGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCByZWNvbXB1dGVQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCh7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgY3VycmVudEVkaXRlZFRleHQ6IG5leHRUZXh0LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlY29tcHV0ZVBheWxvYWQpLCB7IHNvdXJjZTogJ3Bvc3RfZWRpdF9kZWJvdW5jZScgfSkpO1xyXG4gICAgfSwgW29uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlICYmIHRleHQgIT09IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlKSB7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKHRleHQpO1xyXG4gICAgICAgICAgICB9LCBBSV9UQUdfUkVDT01QVVRFX0lETEVfTVMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXkpIHx8ICcwJyk7XHJcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oY2FjaGVkKSkge1xyXG4gICAgICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KGNhY2hlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgaGlnaGxpZ2h0U3RvcmFnZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKSB7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGVsaWdpYmxlID0gISFjdXJyZW50VGV4dC50cmltKCkgJiYgY3VycmVudFRleHQubGVuZ3RoID49IHJlcGhyYXNlTWluQ2hhcnM7XHJcbiAgICAgICAgaWYgKHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGVsaWdpYmxlO1xyXG4gICAgICAgICAgICBpZiAoZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICAgICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNyb3NzZWRUaHJlc2hvbGQgPSAhcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCAmJiBlbGlnaWJsZTtcclxuICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICBpZiAoY3Jvc3NlZFRocmVzaG9sZCkge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgaXNHZW5lcmF0aW5nLCByZXBocmFzZU1pbkNoYXJzXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXNbc3VnZ2VzdGlvbkluZGV4XSB8fCAnJztcclxuICAgIGNvbnN0IGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlQ2FuZGlkYXRlKVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gYCR7c3VnZ2VzdGlvbkFjdGlvblR5cGV9LSR7c3VnZ2VzdGlvbkluZGV4fS0ke2FjdGl2ZUNhbmRpZGF0ZX1gO1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHN1Z2dlc3Rpb25JbmRleF0pO1xyXG4gICAgY29uc3QgaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUgPSAhIShhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSAmJlxyXG4gICAgICAgIGZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZVthY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleV0pO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvbkJhc2VIdG1sID0gdXNlTWVtbygoKSA9PiBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAnJyksIFtzdWdnZXN0aW9uQmFzZVRleHRdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoYWN0aXZlQ2FuZGlkYXRlKSwgW2FjdGl2ZUNhbmRpZGF0ZV0pO1xyXG4gICAgY29uc3QgY2FuUmVnZW5lcmF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8IE1BWF9TVUdHRVNUSU9OUztcclxuICAgIGNvbnN0IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA9ICEhc3VnZ2VzdGlvbkJhc2VUZXh0ICYmIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA+IDA7XHJcbiAgICBjb25zdCBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggPD0gMSB8fCBzdWdnZXN0aW9uSW5kZXggPD0gMDtcclxuICAgIGNvbnN0IGlzTmV4dFN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8XHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4ID49IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCAtIDE7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IHN1Z2dlc3Rpb25TY3JvbGxSZWYuY3VycmVudDtcclxuICAgICAgICBpZiAoIW5vZGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBub2RlLnNjcm9sbFRvcCA9IG5vZGUuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLCBpc0dlbmVyYXRpbmddKTtcclxuICAgIGNvbnN0IGV4ZWN1dGVBSUFjdGlvbiA9IHVzZUNhbGxiYWNrKChhY3Rpb25UeXBlLCByZWdlbmVyYXRlRXhpc3RpbmcgPSBmYWxzZSwgaW5zdHJ1Y3Rpb25PdmVycmlkZSwgdG9uZU92ZXJyaWRlSWQsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgdmFyIF9iO1xyXG4gICAgICAgIGlmICghb25BSUFjdGlvblJlcXVlc3QgJiZcclxuICAgICAgICAgICAgIWFwaUFkYXB0ZXIgJiZcclxuICAgICAgICAgICAgKCFyZXF1ZXN0RXhlY3V0b3IgfHwgIWJhc2VVcmwpKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignQUkgY29uZmlndXJhdGlvbiBtaXNzaW5nJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjdXJyZW50VGV4dC50cmltKCkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBtaW5DaGFyc0ZvckFjdGlvbiA9IG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIDUwO1xyXG4gICAgICAgIGlmIChjdXJyZW50VGV4dC5sZW5ndGggPCBtaW5DaGFyc0ZvckFjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAocmVnZW5lcmF0ZUV4aXN0aW5nICYmICFjYW5SZWdlbmVyYXRlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgYmFzZUNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVR5cGUgPT09ICd1dGlsaXR5JyAmJlxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50ID09PSBBSUFjdGlvblZhcmlhbnQuUkVQSFJBU0VcclxuICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJhc2VDb25maWcpLCB7IGxhYmVsOiAnUmVwaHJhc2UnLCBiYXNlUHJvbXB0OiBVVElMSVRZX1JFUEhSQVNFX1BST01QVCB9KSA6IGJhc2VDb25maWc7XHJcbiAgICAgICAgLy8gVG9uZSBpcyBzZW50IG9ubHkgYWZ0ZXIgZXhwbGljaXQgdXNlciBzZWxlY3Rpb24gKG9yIGV4cGxpY2l0IG92ZXJyaWRlKSxcclxuICAgICAgICAvLyBub3QgZnJvbSBkZWZhdWx0IHRvbmUgbWV0YWRhdGEuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lSWQgPSB0b25lT3ZlcnJpZGVJZCB8fCB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lID0gKF9iID0gY29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZmluZCgodG9uZSkgPT4gdG9uZS5pZCA9PT0gc2VsZWN0ZWRUb25lSWQpO1xyXG4gICAgICAgIGNvbnN0IGluc3RydWN0aW9uRm9yUHJvbXB0ID0gaW5zdHJ1Y3Rpb25PdmVycmlkZSAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgID8gaW5zdHJ1Y3Rpb25PdmVycmlkZVxyXG4gICAgICAgICAgICA6IGluc3RydWN0aW9uVGV4dDtcclxuICAgICAgICBjb25zdCBwcm9tcHQgPSAob25CdWlsZEFJUHJvbXB0ID09PSBudWxsIHx8IG9uQnVpbGRBSVByb21wdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25CdWlsZEFJUHJvbXB0KHtcclxuICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCxcclxuICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICB0b25lTGFiZWw6IHNlbGVjdGVkVG9uZSA9PT0gbnVsbCB8fCBzZWxlY3RlZFRvbmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlbGVjdGVkVG9uZS5sYWJlbCxcclxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgfSkpIHx8XHJcbiAgICAgICAgICAgIGJ1aWxkQWN0aW9uUHJvbXB0KHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZyxcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBzZXRJc0dlbmVyYXRpbmcodHJ1ZSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2FjdGlvbl90cmlnZ2VyZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgdGVtcGxhdGVfY2F0ZWdvcnk6IHRlbXBsYXRlVHlwZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvbkFJQWN0aW9uUmVxdWVzdFxyXG4gICAgICAgICAgICAgICAgPyB5aWVsZCBvbkFJQWN0aW9uUmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICA6IHlpZWxkIHJlcXVlc3RBSVN1Z2dlc3Rpb24oe1xyXG4gICAgICAgICAgICAgICAgICAgIGFwaUFkYXB0ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEV4ZWN1dG9yLFxyXG4gICAgICAgICAgICAgICAgICAgIGJhc2VVcmwsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICAgICAgICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnXHJcbiAgICAgICAgICAgICAgICA/IHJlc3VsdC50cmltKClcclxuICAgICAgICAgICAgICAgIDogKChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXN1bHQuYm9keSkgfHwgJycpLnRyaW0oKTtcclxuICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICghcmVnZW5lcmF0ZUV4aXN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQoY3VycmVudFRleHQpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUoYWN0aW9uVHlwZSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbY2FuZGlkYXRlXSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoKHByZXYpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBbLi4ucHJldiwgY2FuZGlkYXRlXS5zbGljZSgwLCBNQVhfU1VHR0VTVElPTlMpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KG5leHQubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignRmFpbGVkIHRvIGdlbmVyYXRlIEFJIHN1Z2dlc3Rpb24nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgIHNldElzR2VuZXJhdGluZyhmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSksIFtcclxuICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgYmFzZVVybCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgY2FuUmVnZW5lcmF0ZSxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpbnN0cnVjdGlvblRleHQsXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgdGVtcGxhdGVJZCxcclxuICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICBvbkVycm9yLFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICAgICAgb25BSUFjdGlvblJlcXVlc3QsXHJcbiAgICAgICAgb25CdWlsZEFJUHJvbXB0LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghYWN0aXZlQ2FuZGlkYXRlIHx8ICFzdWdnZXN0aW9uQmFzZVRleHQgfHwgIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQoYWN0aXZlQ2FuZGlkYXRlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9hY2NlcHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0ge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjdGlvblR5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBlZGl0ZWRFdmVudEVtaXR0ZWQ6IGZhbHNlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgaW5Jbml0aWFsQWlQaGFzZSA9IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IHRhZ1BheWxvYWQgPSBjb21wdXRlQWlUYWdPbkFjY2VwdCh7XHJcbiAgICAgICAgICAgIGJhc2VsaW5lVGV4dDogc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlOiBpbkluaXRpYWxBaVBoYXNlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChpbkluaXRpYWxBaVBoYXNlKSB7XHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRhZ1BheWxvYWQpLCB7IHNvdXJjZTogJ2FjY2VwdCcgfSkpO1xyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNldEVkaXRvclRleHQsXHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCxcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVSZWplY3RTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9kaXNjYXJkZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW2NsZWFyU3VnZ2VzdGlvblNlc3Npb24sIGVtaXRBSUV2ZW50LCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdGVtcGxhdGVJZF0pO1xyXG4gICAgY29uc3QgaGFuZGxlRmVlZGJhY2sgPSB1c2VDYWxsYmFjaygocmF0aW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSgocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XTogcmF0aW5nIH0pKSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXksXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25JbmRleCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBhaUhlYWRlckFjdGlvbnMgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gZW5hYmxlZEFJQWN0aW9ucy5tYXAoKGFjdGlvblR5cGUpID0+IHtcclxuICAgICAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgICAgICBjb25zdCBhY3Rpb25Db25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgICAgICBjb25zdCB0b25lSWQgPSB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGFjdGlvbkNvbmZpZy5sYWJlbCxcclxuICAgICAgICAgICAgICAgIGlzUHJpbWFyeTogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGlzR2VuZXJhdGluZyAmJiBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFjdXJyZW50VGV4dC50cmltKCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGV4dC5sZW5ndGggPFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBpc0dlbmVyYXRpbmcgfHxcclxuICAgICAgICAgICAgICAgICAgICAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSxcclxuICAgICAgICAgICAgICAgIHNob3dUb25lRHJvcGRvd246IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICAhISgoX2EgPSBhY3Rpb25Db25maWcudG9uZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpLFxyXG4gICAgICAgICAgICAgICAgdG9uZXM6IGFjdGlvbkNvbmZpZy50b25lcyxcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkVG9uZUlkOiB0b25lSWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgZW5hYmxlZEFJQWN0aW9ucyxcclxuICAgICAgICBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBtaW5DaGFyc0J5QWN0aW9uLFxyXG4gICAgXSk7XHJcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGFkZFRleHRPcldyYXAsXHJcbiAgICAgICAgICAgIGFkZFRleHQsXHJcbiAgICAgICAgICAgIGdldCgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0Q2FyZXRQb3NpdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2FkZFRleHRPcldyYXAsIGFkZFRleHQsIGN1cnJlbnRUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpbnB1dFZhbHVlID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgfSwgW2lucHV0VmFsdWUsIHNldEVkaXRvclRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFsaW1pdCB8fCAhb25FcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG5leHRFcnJvciA9IGN1cnJlbnRUZXh0Lmxlbmd0aCA+IGxpbWl0ID8gTElNSVRfUkVBQ0hFRCA6IGVycm9yICE9PSBudWxsICYmIGVycm9yICE9PSB2b2lkIDAgPyBlcnJvciA6ICcnO1xyXG4gICAgICAgIGlmIChsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPT09IG5leHRFcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9IG5leHRFcnJvcjtcclxuICAgICAgICBvbkVycm9yKG5leHRFcnJvcik7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIGVycm9yLCBsaW1pdCwgb25FcnJvcl0pO1xyXG4gICAgcmV0dXJuIChfanN4cyhPdXRlckNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pLCBfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkxJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzVXBJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2xpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNsaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkRJU0xJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzRG93bkljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIGNhblJlZ2VuZXJhdGUgPyAoX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogaXNHZW5lcmF0aW5nID8gJ1JlZ2VuZXJhdGluZ+KApicgOiAnUmVnZW5lcmF0ZScsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiUmVnZW5lcmF0ZSBzdWdnZXN0aW9uXCIsIFwiYXJpYS1idXN5XCI6IGlzR2VuZXJhdGluZywgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzR2VuZXJhdGluZywgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IGlzR2VuZXJhdGluZyA/IChfanN4KFJlZ2VuZXJhdGVJY29uU2hpbW1lciwgeyBcImFyaWEtaGlkZGVuXCI6IHRydWUgfSkpIDogKF9qc3goUmV3aW5kSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkpIH0pKSB9KSkpIDogbnVsbCwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNjYXJkXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzY2FyZCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gfSwgeyBjaGlsZHJlbjogX2pzeChDcm9zc0ljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiQWNjZXB0XCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiQWNjZXB0IHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlQWNjZXB0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENoZWNrSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKV0gfSldIH0pKSkgOiBpc0dlbmVyYXRpbmcgPyAoX2pzeHMoRWRpdG9yU2tlbGV0b25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5NiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTIlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg4JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI1NCVcIiB9KV0gfSkpIDogKF9qc3goVGV4dFNwYWNlLCBPYmplY3QuYXNzaWduKHsgcmVmOiB0ZXh0U3BhY2VSZWYgfSwgdGV4dEFyZWFQcm9wcywgeyB2YWx1ZTogY3VycmVudFRleHQsIG9uQ2hhbmdlOiBoYW5kbGVPbkNoYW5nZSwgb25CbHVyOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0UG9zdEVkaXRBaVRhZ1JlY29tcHV0ZShlLnRhcmdldC52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QXJlYU9uQmx1ciA9PT0gbnVsbCB8fCB0ZXh0QXJlYU9uQmx1ciA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dEFyZWFPbkJsdXIoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uUGFzdGU6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhc3RlZFRleHQgPSBlLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3RlZFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSAoX2EgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uU3RhcnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gKF9iID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvbkVuZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogc3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlZmVyIGxpdmUgRE9NIHZhbHVlIOKAlCBgY3VycmVudFRleHRgIGNhbiBsYWcgdGhlIHRleHRhcmVhIGZvciBiaWcgcGFzdGVzLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSAoX2MgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwudmFsdWUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRUZXh0ID0gYmFzZS5zbGljZSgwLCBzdGFydCkgKyBwYXN0ZWRUZXh0ICsgYmFzZS5zbGljZShlbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcmV0ID0gc3RhcnQgKyBwYXN0ZWRUZXh0Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YSA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGEuc2V0U2VsZWN0aW9uUmFuZ2UoY2FyZXQsIGNhcmV0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBpbnZhbGlkIHJhbmdlIGluIGVkZ2UgYnJvd3NlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCByb3dzOiByb3dzIH0pKSksIGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUgPyAoX2pzeHMoSW5zdHJ1Y3Rpb25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhJbnN0cnVjdGlvbklucHV0Um93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0SWNvbiwgeyB3aWR0aDogMTgsIGhlaWdodDogMTgsIGNvbG9yOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnkgfSksIF9qc3goSW5zdHJ1Y3Rpb25JbnB1dCwgeyB2YWx1ZTogaW5zdHJ1Y3Rpb25UZXh0LCBwbGFjZWhvbGRlcjogXCJBZGQgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIHRvIHJlZmluZSB5b3VyIG1lc3NhZ2VcIiwgb25DaGFuZ2U6IChlKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoZS50YXJnZXQudmFsdWUpIH0pLCBfanN4cyhJbnN0cnVjdGlvbkFjdGlvbnMsIHsgY2hpbGRyZW46IFtfanN4KEluc3RydWN0aW9uQ2FuY2VsLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiQ2FuY2VsXCIgfSkpLCBfanN4KEluc3RydWN0aW9uSW1wcm92ZSwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RydWN0aW9uVG9BcHBseSA9IGluc3RydWN0aW9uVGV4dC50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2luc3RydWN0aW9uX3VzZWQnLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbl90eXBlOiBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fdGV4dDogYW5vbnltaXplSW5zdHJ1Y3Rpb25UZXh0KGluc3RydWN0aW9uVG9BcHBseSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSwgZmFsc2UsIGluc3RydWN0aW9uVG9BcHBseSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJJbXByb3ZlXCIgfSkpXSB9KV0gfSksIGluc3RydWN0aW9uVGV4dC50cmltKCkubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5sZW5ndGggPiAwID8gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCwgeyBjaGlsZHJlbjogZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLm1hcCgoc3VnZ2VzdGlvbikgPT4gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgc2VsZWN0ZWQ6IGluc3RydWN0aW9uVGV4dCA9PT0gc3VnZ2VzdGlvbiwgb25DbGljazogKCkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KHN1Z2dlc3Rpb24pIH0sIHsgY2hpbGRyZW46IHN1Z2dlc3Rpb24gfSksIHN1Z2dlc3Rpb24pKSkgfSkpIDogbnVsbF0gfSkpIDogKF9qc3goV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB7IGFjdGlvbnM6IGFjdGlvbnMsIHJlZjogdGV4dFNwYWNlUmVmLCBvbkFjdGlvblNlbGVjdDogb25BY3Rpb25TZWxlY3QsIFJpZ2h0Q29tcG9uZW50OiBSaWdodENvbXBvbmVudCwgcmlnaHRBY3Rpb25zRGlzYWJsZWQ6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIG9uRW1vamlDbGljazogb25FbW9qaUFkZGl0aW9uLCBhaUFjdGlvbnM6IGFpSGVhZGVyQWN0aW9ucywgZGlzYWJsZUFsbEFjdGlvbnM6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIGluc3RydWN0aW9uQWN0aXZlOiBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBvbkFJSW5zdHJ1Y3Rpb25zQ2xpY2s6ICgpID0+IHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUodHJ1ZSksIG9uQUlUb25lQ2hhbmdlOiAoYWN0aW9uVHlwZSwgdG9uZUlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUb25lQnlBY3Rpb24oKHByZXYpID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXYpLCB7IFthY3Rpb25UeXBlXTogdG9uZUlkIH0pKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkFJVG9uZVNlbGVjdCA9PT0gbnVsbCB8fCBvbkFJVG9uZVNlbGVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRvbmVTZWxlY3QoYWN0aW9uVHlwZSwgdG9uZUlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHRvbmVJZCwgQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBvbkFJQWN0aW9uQ2xpY2s6IChhY3Rpb25UeXBlLCBhY3Rpb25WYXJpYW50ID0gQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGFjdGlvbiBzaG91bGQgbm90IHJldHJpZ2dlciBmcm9tIGNoaXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2VuZXJhdGUgaXMgb25seSB2aWEgZXhwbGljaXQgcmVnZW5lcmF0ZSBjb250cm9sLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldyBhY3Rpb24gc3RhcnRzIGEgZnJlc2ggc3VnZ2VzdGlvbiBzZXNzaW9uLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSldIH0pKV0gfSkpO1xyXG59KTtcclxuV2hhdHNBcHBUZXh0RWRpdG9yLmRpc3BsYXlOYW1lID0gJ1doYXRzQXBwVGV4dEVkaXRvcic7XHJcbmV4cG9ydCB7IEFJX1RBR19DSEFOR0VfUkFUSU9fVEhSRVNIT0xELCBjb21wdXRlQWlUYWdPbkFjY2VwdCwgbGV2ZW5zaHRlaW5EaXN0YW5jZSwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2hhdHNBcHBUZXh0RWRpdG9yLmpzLm1hcCJdfQ== */",toString:a}),w=p.default("span","production"===process.env.NODE_ENV?{target:"ea7i3sh11"}:{target:"ea7i3sh11",label:"SuggestionCounter"})("color:",B.COLORS.content.primary,";font-size:14px;"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBd0ZzQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBPcmlnaW5hbCBwcmVmaWxsIGJvZHkgZm9yIEFJIHRhZyByZWNvbXB1dGU7IHNlZWRlZCBvbmNlLCBuZXZlciB0aGUgbGl2ZSBgY3VycmVudFRleHRgIGZhbGxiYWNrLiAqL1xyXG4gICAgY29uc3QgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZiA9IHVzZVJlZignJyk7XHJcbiAgICBjb25zdCBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZiA9IHVzZVJlZihmYWxzZSk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSAnJztcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghcHJlZmlsbFdhc0FpR2VuZXJhdGVkKSB7XHJcbiAgICAgICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50ID0gJyc7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBzZWVkID0gaW5wdXRWYWx1ZSAhPT0gbnVsbCAmJiBpbnB1dFZhbHVlICE9PSB2b2lkIDAgPyBpbnB1dFZhbHVlIDogJyc7XHJcbiAgICAgICAgaWYgKHNlZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSBzZWVkO1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBpbnB1dFZhbHVlLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChuZXh0VGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCByZWNvbXB1dGVQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCh7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgY3VycmVudEVkaXRlZFRleHQ6IG5leHRUZXh0LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlY29tcHV0ZVBheWxvYWQpLCB7IHNvdXJjZTogJ3Bvc3RfZWRpdF9kZWJvdW5jZScgfSkpO1xyXG4gICAgfSwgW29uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlICYmIHRleHQgIT09IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlKSB7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKHRleHQpO1xyXG4gICAgICAgICAgICB9LCBBSV9UQUdfUkVDT01QVVRFX0lETEVfTVMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXkpIHx8ICcwJyk7XHJcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oY2FjaGVkKSkge1xyXG4gICAgICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KGNhY2hlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgaGlnaGxpZ2h0U3RvcmFnZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKSB7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGVsaWdpYmxlID0gISFjdXJyZW50VGV4dC50cmltKCkgJiYgY3VycmVudFRleHQubGVuZ3RoID49IHJlcGhyYXNlTWluQ2hhcnM7XHJcbiAgICAgICAgaWYgKHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGVsaWdpYmxlO1xyXG4gICAgICAgICAgICBpZiAoZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICAgICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNyb3NzZWRUaHJlc2hvbGQgPSAhcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCAmJiBlbGlnaWJsZTtcclxuICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICBpZiAoY3Jvc3NlZFRocmVzaG9sZCkge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgaXNHZW5lcmF0aW5nLCByZXBocmFzZU1pbkNoYXJzXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXNbc3VnZ2VzdGlvbkluZGV4XSB8fCAnJztcclxuICAgIGNvbnN0IGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlQ2FuZGlkYXRlKVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gYCR7c3VnZ2VzdGlvbkFjdGlvblR5cGV9LSR7c3VnZ2VzdGlvbkluZGV4fS0ke2FjdGl2ZUNhbmRpZGF0ZX1gO1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHN1Z2dlc3Rpb25JbmRleF0pO1xyXG4gICAgY29uc3QgaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUgPSAhIShhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSAmJlxyXG4gICAgICAgIGZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZVthY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleV0pO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvbkJhc2VIdG1sID0gdXNlTWVtbygoKSA9PiBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAnJyksIFtzdWdnZXN0aW9uQmFzZVRleHRdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoYWN0aXZlQ2FuZGlkYXRlKSwgW2FjdGl2ZUNhbmRpZGF0ZV0pO1xyXG4gICAgY29uc3QgY2FuUmVnZW5lcmF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8IE1BWF9TVUdHRVNUSU9OUztcclxuICAgIGNvbnN0IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA9ICEhc3VnZ2VzdGlvbkJhc2VUZXh0ICYmIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA+IDA7XHJcbiAgICBjb25zdCBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggPD0gMSB8fCBzdWdnZXN0aW9uSW5kZXggPD0gMDtcclxuICAgIGNvbnN0IGlzTmV4dFN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8XHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4ID49IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCAtIDE7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IHN1Z2dlc3Rpb25TY3JvbGxSZWYuY3VycmVudDtcclxuICAgICAgICBpZiAoIW5vZGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBub2RlLnNjcm9sbFRvcCA9IG5vZGUuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLCBpc0dlbmVyYXRpbmddKTtcclxuICAgIGNvbnN0IGV4ZWN1dGVBSUFjdGlvbiA9IHVzZUNhbGxiYWNrKChhY3Rpb25UeXBlLCByZWdlbmVyYXRlRXhpc3RpbmcgPSBmYWxzZSwgaW5zdHJ1Y3Rpb25PdmVycmlkZSwgdG9uZU92ZXJyaWRlSWQsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgdmFyIF9iO1xyXG4gICAgICAgIGlmICghb25BSUFjdGlvblJlcXVlc3QgJiZcclxuICAgICAgICAgICAgIWFwaUFkYXB0ZXIgJiZcclxuICAgICAgICAgICAgKCFyZXF1ZXN0RXhlY3V0b3IgfHwgIWJhc2VVcmwpKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignQUkgY29uZmlndXJhdGlvbiBtaXNzaW5nJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjdXJyZW50VGV4dC50cmltKCkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBtaW5DaGFyc0ZvckFjdGlvbiA9IG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIDUwO1xyXG4gICAgICAgIGlmIChjdXJyZW50VGV4dC5sZW5ndGggPCBtaW5DaGFyc0ZvckFjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAocmVnZW5lcmF0ZUV4aXN0aW5nICYmICFjYW5SZWdlbmVyYXRlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgYmFzZUNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVR5cGUgPT09ICd1dGlsaXR5JyAmJlxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50ID09PSBBSUFjdGlvblZhcmlhbnQuUkVQSFJBU0VcclxuICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJhc2VDb25maWcpLCB7IGxhYmVsOiAnUmVwaHJhc2UnLCBiYXNlUHJvbXB0OiBVVElMSVRZX1JFUEhSQVNFX1BST01QVCB9KSA6IGJhc2VDb25maWc7XHJcbiAgICAgICAgLy8gVG9uZSBpcyBzZW50IG9ubHkgYWZ0ZXIgZXhwbGljaXQgdXNlciBzZWxlY3Rpb24gKG9yIGV4cGxpY2l0IG92ZXJyaWRlKSxcclxuICAgICAgICAvLyBub3QgZnJvbSBkZWZhdWx0IHRvbmUgbWV0YWRhdGEuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lSWQgPSB0b25lT3ZlcnJpZGVJZCB8fCB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lID0gKF9iID0gY29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZmluZCgodG9uZSkgPT4gdG9uZS5pZCA9PT0gc2VsZWN0ZWRUb25lSWQpO1xyXG4gICAgICAgIGNvbnN0IGluc3RydWN0aW9uRm9yUHJvbXB0ID0gaW5zdHJ1Y3Rpb25PdmVycmlkZSAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgID8gaW5zdHJ1Y3Rpb25PdmVycmlkZVxyXG4gICAgICAgICAgICA6IGluc3RydWN0aW9uVGV4dDtcclxuICAgICAgICBjb25zdCBwcm9tcHQgPSAob25CdWlsZEFJUHJvbXB0ID09PSBudWxsIHx8IG9uQnVpbGRBSVByb21wdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25CdWlsZEFJUHJvbXB0KHtcclxuICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCxcclxuICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICB0b25lTGFiZWw6IHNlbGVjdGVkVG9uZSA9PT0gbnVsbCB8fCBzZWxlY3RlZFRvbmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlbGVjdGVkVG9uZS5sYWJlbCxcclxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgfSkpIHx8XHJcbiAgICAgICAgICAgIGJ1aWxkQWN0aW9uUHJvbXB0KHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZyxcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBzZXRJc0dlbmVyYXRpbmcodHJ1ZSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2FjdGlvbl90cmlnZ2VyZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgdGVtcGxhdGVfY2F0ZWdvcnk6IHRlbXBsYXRlVHlwZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvbkFJQWN0aW9uUmVxdWVzdFxyXG4gICAgICAgICAgICAgICAgPyB5aWVsZCBvbkFJQWN0aW9uUmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICA6IHlpZWxkIHJlcXVlc3RBSVN1Z2dlc3Rpb24oe1xyXG4gICAgICAgICAgICAgICAgICAgIGFwaUFkYXB0ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEV4ZWN1dG9yLFxyXG4gICAgICAgICAgICAgICAgICAgIGJhc2VVcmwsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICAgICAgICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnXHJcbiAgICAgICAgICAgICAgICA/IHJlc3VsdC50cmltKClcclxuICAgICAgICAgICAgICAgIDogKChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXN1bHQuYm9keSkgfHwgJycpLnRyaW0oKTtcclxuICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICghcmVnZW5lcmF0ZUV4aXN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQoY3VycmVudFRleHQpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUoYWN0aW9uVHlwZSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbY2FuZGlkYXRlXSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoKHByZXYpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBbLi4ucHJldiwgY2FuZGlkYXRlXS5zbGljZSgwLCBNQVhfU1VHR0VTVElPTlMpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KG5leHQubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignRmFpbGVkIHRvIGdlbmVyYXRlIEFJIHN1Z2dlc3Rpb24nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgIHNldElzR2VuZXJhdGluZyhmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSksIFtcclxuICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgYmFzZVVybCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgY2FuUmVnZW5lcmF0ZSxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpbnN0cnVjdGlvblRleHQsXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgdGVtcGxhdGVJZCxcclxuICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICBvbkVycm9yLFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICAgICAgb25BSUFjdGlvblJlcXVlc3QsXHJcbiAgICAgICAgb25CdWlsZEFJUHJvbXB0LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghYWN0aXZlQ2FuZGlkYXRlIHx8ICFzdWdnZXN0aW9uQmFzZVRleHQgfHwgIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQoYWN0aXZlQ2FuZGlkYXRlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9hY2NlcHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0ge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjdGlvblR5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBlZGl0ZWRFdmVudEVtaXR0ZWQ6IGZhbHNlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgaW5Jbml0aWFsQWlQaGFzZSA9IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IHRhZ1BheWxvYWQgPSBjb21wdXRlQWlUYWdPbkFjY2VwdCh7XHJcbiAgICAgICAgICAgIGJhc2VsaW5lVGV4dDogc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlOiBpbkluaXRpYWxBaVBoYXNlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChpbkluaXRpYWxBaVBoYXNlKSB7XHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRhZ1BheWxvYWQpLCB7IHNvdXJjZTogJ2FjY2VwdCcgfSkpO1xyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNldEVkaXRvclRleHQsXHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCxcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVSZWplY3RTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9kaXNjYXJkZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW2NsZWFyU3VnZ2VzdGlvblNlc3Npb24sIGVtaXRBSUV2ZW50LCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdGVtcGxhdGVJZF0pO1xyXG4gICAgY29uc3QgaGFuZGxlRmVlZGJhY2sgPSB1c2VDYWxsYmFjaygocmF0aW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSgocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XTogcmF0aW5nIH0pKSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXksXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25JbmRleCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBhaUhlYWRlckFjdGlvbnMgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gZW5hYmxlZEFJQWN0aW9ucy5tYXAoKGFjdGlvblR5cGUpID0+IHtcclxuICAgICAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgICAgICBjb25zdCBhY3Rpb25Db25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgICAgICBjb25zdCB0b25lSWQgPSB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGFjdGlvbkNvbmZpZy5sYWJlbCxcclxuICAgICAgICAgICAgICAgIGlzUHJpbWFyeTogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGlzR2VuZXJhdGluZyAmJiBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFjdXJyZW50VGV4dC50cmltKCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGV4dC5sZW5ndGggPFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBpc0dlbmVyYXRpbmcgfHxcclxuICAgICAgICAgICAgICAgICAgICAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSxcclxuICAgICAgICAgICAgICAgIHNob3dUb25lRHJvcGRvd246IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICAhISgoX2EgPSBhY3Rpb25Db25maWcudG9uZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpLFxyXG4gICAgICAgICAgICAgICAgdG9uZXM6IGFjdGlvbkNvbmZpZy50b25lcyxcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkVG9uZUlkOiB0b25lSWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgZW5hYmxlZEFJQWN0aW9ucyxcclxuICAgICAgICBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBtaW5DaGFyc0J5QWN0aW9uLFxyXG4gICAgXSk7XHJcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGFkZFRleHRPcldyYXAsXHJcbiAgICAgICAgICAgIGFkZFRleHQsXHJcbiAgICAgICAgICAgIGdldCgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0Q2FyZXRQb3NpdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2FkZFRleHRPcldyYXAsIGFkZFRleHQsIGN1cnJlbnRUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpbnB1dFZhbHVlID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgfSwgW2lucHV0VmFsdWUsIHNldEVkaXRvclRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFsaW1pdCB8fCAhb25FcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG5leHRFcnJvciA9IGN1cnJlbnRUZXh0Lmxlbmd0aCA+IGxpbWl0ID8gTElNSVRfUkVBQ0hFRCA6IGVycm9yICE9PSBudWxsICYmIGVycm9yICE9PSB2b2lkIDAgPyBlcnJvciA6ICcnO1xyXG4gICAgICAgIGlmIChsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPT09IG5leHRFcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9IG5leHRFcnJvcjtcclxuICAgICAgICBvbkVycm9yKG5leHRFcnJvcik7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIGVycm9yLCBsaW1pdCwgb25FcnJvcl0pO1xyXG4gICAgcmV0dXJuIChfanN4cyhPdXRlckNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pLCBfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkxJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzVXBJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2xpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNsaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkRJU0xJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzRG93bkljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIGNhblJlZ2VuZXJhdGUgPyAoX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogaXNHZW5lcmF0aW5nID8gJ1JlZ2VuZXJhdGluZ+KApicgOiAnUmVnZW5lcmF0ZScsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiUmVnZW5lcmF0ZSBzdWdnZXN0aW9uXCIsIFwiYXJpYS1idXN5XCI6IGlzR2VuZXJhdGluZywgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzR2VuZXJhdGluZywgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IGlzR2VuZXJhdGluZyA/IChfanN4KFJlZ2VuZXJhdGVJY29uU2hpbW1lciwgeyBcImFyaWEtaGlkZGVuXCI6IHRydWUgfSkpIDogKF9qc3goUmV3aW5kSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkpIH0pKSB9KSkpIDogbnVsbCwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNjYXJkXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzY2FyZCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gfSwgeyBjaGlsZHJlbjogX2pzeChDcm9zc0ljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiQWNjZXB0XCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiQWNjZXB0IHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlQWNjZXB0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENoZWNrSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKV0gfSldIH0pKSkgOiBpc0dlbmVyYXRpbmcgPyAoX2pzeHMoRWRpdG9yU2tlbGV0b25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5NiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTIlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg4JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI1NCVcIiB9KV0gfSkpIDogKF9qc3goVGV4dFNwYWNlLCBPYmplY3QuYXNzaWduKHsgcmVmOiB0ZXh0U3BhY2VSZWYgfSwgdGV4dEFyZWFQcm9wcywgeyB2YWx1ZTogY3VycmVudFRleHQsIG9uQ2hhbmdlOiBoYW5kbGVPbkNoYW5nZSwgb25CbHVyOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0UG9zdEVkaXRBaVRhZ1JlY29tcHV0ZShlLnRhcmdldC52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QXJlYU9uQmx1ciA9PT0gbnVsbCB8fCB0ZXh0QXJlYU9uQmx1ciA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dEFyZWFPbkJsdXIoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uUGFzdGU6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhc3RlZFRleHQgPSBlLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3RlZFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSAoX2EgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uU3RhcnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gKF9iID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvbkVuZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogc3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlZmVyIGxpdmUgRE9NIHZhbHVlIOKAlCBgY3VycmVudFRleHRgIGNhbiBsYWcgdGhlIHRleHRhcmVhIGZvciBiaWcgcGFzdGVzLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSAoX2MgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwudmFsdWUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRUZXh0ID0gYmFzZS5zbGljZSgwLCBzdGFydCkgKyBwYXN0ZWRUZXh0ICsgYmFzZS5zbGljZShlbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcmV0ID0gc3RhcnQgKyBwYXN0ZWRUZXh0Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YSA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGEuc2V0U2VsZWN0aW9uUmFuZ2UoY2FyZXQsIGNhcmV0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBpbnZhbGlkIHJhbmdlIGluIGVkZ2UgYnJvd3NlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCByb3dzOiByb3dzIH0pKSksIGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUgPyAoX2pzeHMoSW5zdHJ1Y3Rpb25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhJbnN0cnVjdGlvbklucHV0Um93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0SWNvbiwgeyB3aWR0aDogMTgsIGhlaWdodDogMTgsIGNvbG9yOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnkgfSksIF9qc3goSW5zdHJ1Y3Rpb25JbnB1dCwgeyB2YWx1ZTogaW5zdHJ1Y3Rpb25UZXh0LCBwbGFjZWhvbGRlcjogXCJBZGQgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIHRvIHJlZmluZSB5b3VyIG1lc3NhZ2VcIiwgb25DaGFuZ2U6IChlKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoZS50YXJnZXQudmFsdWUpIH0pLCBfanN4cyhJbnN0cnVjdGlvbkFjdGlvbnMsIHsgY2hpbGRyZW46IFtfanN4KEluc3RydWN0aW9uQ2FuY2VsLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiQ2FuY2VsXCIgfSkpLCBfanN4KEluc3RydWN0aW9uSW1wcm92ZSwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RydWN0aW9uVG9BcHBseSA9IGluc3RydWN0aW9uVGV4dC50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2luc3RydWN0aW9uX3VzZWQnLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbl90eXBlOiBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fdGV4dDogYW5vbnltaXplSW5zdHJ1Y3Rpb25UZXh0KGluc3RydWN0aW9uVG9BcHBseSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSwgZmFsc2UsIGluc3RydWN0aW9uVG9BcHBseSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJJbXByb3ZlXCIgfSkpXSB9KV0gfSksIGluc3RydWN0aW9uVGV4dC50cmltKCkubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5sZW5ndGggPiAwID8gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCwgeyBjaGlsZHJlbjogZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLm1hcCgoc3VnZ2VzdGlvbikgPT4gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgc2VsZWN0ZWQ6IGluc3RydWN0aW9uVGV4dCA9PT0gc3VnZ2VzdGlvbiwgb25DbGljazogKCkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KHN1Z2dlc3Rpb24pIH0sIHsgY2hpbGRyZW46IHN1Z2dlc3Rpb24gfSksIHN1Z2dlc3Rpb24pKSkgfSkpIDogbnVsbF0gfSkpIDogKF9qc3goV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB7IGFjdGlvbnM6IGFjdGlvbnMsIHJlZjogdGV4dFNwYWNlUmVmLCBvbkFjdGlvblNlbGVjdDogb25BY3Rpb25TZWxlY3QsIFJpZ2h0Q29tcG9uZW50OiBSaWdodENvbXBvbmVudCwgcmlnaHRBY3Rpb25zRGlzYWJsZWQ6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIG9uRW1vamlDbGljazogb25FbW9qaUFkZGl0aW9uLCBhaUFjdGlvbnM6IGFpSGVhZGVyQWN0aW9ucywgZGlzYWJsZUFsbEFjdGlvbnM6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIGluc3RydWN0aW9uQWN0aXZlOiBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBvbkFJSW5zdHJ1Y3Rpb25zQ2xpY2s6ICgpID0+IHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUodHJ1ZSksIG9uQUlUb25lQ2hhbmdlOiAoYWN0aW9uVHlwZSwgdG9uZUlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUb25lQnlBY3Rpb24oKHByZXYpID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXYpLCB7IFthY3Rpb25UeXBlXTogdG9uZUlkIH0pKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkFJVG9uZVNlbGVjdCA9PT0gbnVsbCB8fCBvbkFJVG9uZVNlbGVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRvbmVTZWxlY3QoYWN0aW9uVHlwZSwgdG9uZUlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHRvbmVJZCwgQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBvbkFJQWN0aW9uQ2xpY2s6IChhY3Rpb25UeXBlLCBhY3Rpb25WYXJpYW50ID0gQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGFjdGlvbiBzaG91bGQgbm90IHJldHJpZ2dlciBmcm9tIGNoaXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2VuZXJhdGUgaXMgb25seSB2aWEgZXhwbGljaXQgcmVnZW5lcmF0ZSBjb250cm9sLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldyBhY3Rpb24gc3RhcnRzIGEgZnJlc2ggc3VnZ2VzdGlvbiBzZXNzaW9uLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSldIH0pKV0gfSkpO1xyXG59KTtcclxuV2hhdHNBcHBUZXh0RWRpdG9yLmRpc3BsYXlOYW1lID0gJ1doYXRzQXBwVGV4dEVkaXRvcic7XHJcbmV4cG9ydCB7IEFJX1RBR19DSEFOR0VfUkFUSU9fVEhSRVNIT0xELCBjb21wdXRlQWlUYWdPbkFjY2VwdCwgbGV2ZW5zaHRlaW5EaXN0YW5jZSwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2hhdHNBcHBUZXh0RWRpdG9yLmpzLm1hcCJdfQ== */")),o=p.default("button","production"===process.env.NODE_ENV?{target:"ea7i3sh10"}:{target:"ea7i3sh10",label:"SuggestionIconButton"})("border:0;background:transparent;padding:6px;border-radius:6px;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;color:",B.COLORS.content.primary,";transition:background-color 0.12s ease;:not(:disabled):hover{background-color:",B.COLORS.surface.hovered,";}:disabled{opacity:0.35;cursor:not-allowed;}"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBNEYyQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBPcmlnaW5hbCBwcmVmaWxsIGJvZHkgZm9yIEFJIHRhZyByZWNvbXB1dGU7IHNlZWRlZCBvbmNlLCBuZXZlciB0aGUgbGl2ZSBgY3VycmVudFRleHRgIGZhbGxiYWNrLiAqL1xyXG4gICAgY29uc3QgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZiA9IHVzZVJlZignJyk7XHJcbiAgICBjb25zdCBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZiA9IHVzZVJlZihmYWxzZSk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSAnJztcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghcHJlZmlsbFdhc0FpR2VuZXJhdGVkKSB7XHJcbiAgICAgICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50ID0gJyc7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBzZWVkID0gaW5wdXRWYWx1ZSAhPT0gbnVsbCAmJiBpbnB1dFZhbHVlICE9PSB2b2lkIDAgPyBpbnB1dFZhbHVlIDogJyc7XHJcbiAgICAgICAgaWYgKHNlZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSBzZWVkO1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBpbnB1dFZhbHVlLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChuZXh0VGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCByZWNvbXB1dGVQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCh7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgY3VycmVudEVkaXRlZFRleHQ6IG5leHRUZXh0LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlY29tcHV0ZVBheWxvYWQpLCB7IHNvdXJjZTogJ3Bvc3RfZWRpdF9kZWJvdW5jZScgfSkpO1xyXG4gICAgfSwgW29uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlICYmIHRleHQgIT09IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlKSB7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKHRleHQpO1xyXG4gICAgICAgICAgICB9LCBBSV9UQUdfUkVDT01QVVRFX0lETEVfTVMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXkpIHx8ICcwJyk7XHJcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oY2FjaGVkKSkge1xyXG4gICAgICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KGNhY2hlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgaGlnaGxpZ2h0U3RvcmFnZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKSB7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGVsaWdpYmxlID0gISFjdXJyZW50VGV4dC50cmltKCkgJiYgY3VycmVudFRleHQubGVuZ3RoID49IHJlcGhyYXNlTWluQ2hhcnM7XHJcbiAgICAgICAgaWYgKHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGVsaWdpYmxlO1xyXG4gICAgICAgICAgICBpZiAoZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICAgICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNyb3NzZWRUaHJlc2hvbGQgPSAhcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCAmJiBlbGlnaWJsZTtcclxuICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICBpZiAoY3Jvc3NlZFRocmVzaG9sZCkge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgaXNHZW5lcmF0aW5nLCByZXBocmFzZU1pbkNoYXJzXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXNbc3VnZ2VzdGlvbkluZGV4XSB8fCAnJztcclxuICAgIGNvbnN0IGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlQ2FuZGlkYXRlKVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gYCR7c3VnZ2VzdGlvbkFjdGlvblR5cGV9LSR7c3VnZ2VzdGlvbkluZGV4fS0ke2FjdGl2ZUNhbmRpZGF0ZX1gO1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHN1Z2dlc3Rpb25JbmRleF0pO1xyXG4gICAgY29uc3QgaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUgPSAhIShhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSAmJlxyXG4gICAgICAgIGZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZVthY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleV0pO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvbkJhc2VIdG1sID0gdXNlTWVtbygoKSA9PiBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAnJyksIFtzdWdnZXN0aW9uQmFzZVRleHRdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoYWN0aXZlQ2FuZGlkYXRlKSwgW2FjdGl2ZUNhbmRpZGF0ZV0pO1xyXG4gICAgY29uc3QgY2FuUmVnZW5lcmF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8IE1BWF9TVUdHRVNUSU9OUztcclxuICAgIGNvbnN0IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA9ICEhc3VnZ2VzdGlvbkJhc2VUZXh0ICYmIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA+IDA7XHJcbiAgICBjb25zdCBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggPD0gMSB8fCBzdWdnZXN0aW9uSW5kZXggPD0gMDtcclxuICAgIGNvbnN0IGlzTmV4dFN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8XHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4ID49IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCAtIDE7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IHN1Z2dlc3Rpb25TY3JvbGxSZWYuY3VycmVudDtcclxuICAgICAgICBpZiAoIW5vZGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBub2RlLnNjcm9sbFRvcCA9IG5vZGUuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLCBpc0dlbmVyYXRpbmddKTtcclxuICAgIGNvbnN0IGV4ZWN1dGVBSUFjdGlvbiA9IHVzZUNhbGxiYWNrKChhY3Rpb25UeXBlLCByZWdlbmVyYXRlRXhpc3RpbmcgPSBmYWxzZSwgaW5zdHJ1Y3Rpb25PdmVycmlkZSwgdG9uZU92ZXJyaWRlSWQsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgdmFyIF9iO1xyXG4gICAgICAgIGlmICghb25BSUFjdGlvblJlcXVlc3QgJiZcclxuICAgICAgICAgICAgIWFwaUFkYXB0ZXIgJiZcclxuICAgICAgICAgICAgKCFyZXF1ZXN0RXhlY3V0b3IgfHwgIWJhc2VVcmwpKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignQUkgY29uZmlndXJhdGlvbiBtaXNzaW5nJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjdXJyZW50VGV4dC50cmltKCkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBtaW5DaGFyc0ZvckFjdGlvbiA9IG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIDUwO1xyXG4gICAgICAgIGlmIChjdXJyZW50VGV4dC5sZW5ndGggPCBtaW5DaGFyc0ZvckFjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAocmVnZW5lcmF0ZUV4aXN0aW5nICYmICFjYW5SZWdlbmVyYXRlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgYmFzZUNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVR5cGUgPT09ICd1dGlsaXR5JyAmJlxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50ID09PSBBSUFjdGlvblZhcmlhbnQuUkVQSFJBU0VcclxuICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJhc2VDb25maWcpLCB7IGxhYmVsOiAnUmVwaHJhc2UnLCBiYXNlUHJvbXB0OiBVVElMSVRZX1JFUEhSQVNFX1BST01QVCB9KSA6IGJhc2VDb25maWc7XHJcbiAgICAgICAgLy8gVG9uZSBpcyBzZW50IG9ubHkgYWZ0ZXIgZXhwbGljaXQgdXNlciBzZWxlY3Rpb24gKG9yIGV4cGxpY2l0IG92ZXJyaWRlKSxcclxuICAgICAgICAvLyBub3QgZnJvbSBkZWZhdWx0IHRvbmUgbWV0YWRhdGEuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lSWQgPSB0b25lT3ZlcnJpZGVJZCB8fCB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lID0gKF9iID0gY29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZmluZCgodG9uZSkgPT4gdG9uZS5pZCA9PT0gc2VsZWN0ZWRUb25lSWQpO1xyXG4gICAgICAgIGNvbnN0IGluc3RydWN0aW9uRm9yUHJvbXB0ID0gaW5zdHJ1Y3Rpb25PdmVycmlkZSAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgID8gaW5zdHJ1Y3Rpb25PdmVycmlkZVxyXG4gICAgICAgICAgICA6IGluc3RydWN0aW9uVGV4dDtcclxuICAgICAgICBjb25zdCBwcm9tcHQgPSAob25CdWlsZEFJUHJvbXB0ID09PSBudWxsIHx8IG9uQnVpbGRBSVByb21wdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25CdWlsZEFJUHJvbXB0KHtcclxuICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCxcclxuICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICB0b25lTGFiZWw6IHNlbGVjdGVkVG9uZSA9PT0gbnVsbCB8fCBzZWxlY3RlZFRvbmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlbGVjdGVkVG9uZS5sYWJlbCxcclxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgfSkpIHx8XHJcbiAgICAgICAgICAgIGJ1aWxkQWN0aW9uUHJvbXB0KHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZyxcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBzZXRJc0dlbmVyYXRpbmcodHJ1ZSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2FjdGlvbl90cmlnZ2VyZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgdGVtcGxhdGVfY2F0ZWdvcnk6IHRlbXBsYXRlVHlwZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvbkFJQWN0aW9uUmVxdWVzdFxyXG4gICAgICAgICAgICAgICAgPyB5aWVsZCBvbkFJQWN0aW9uUmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICA6IHlpZWxkIHJlcXVlc3RBSVN1Z2dlc3Rpb24oe1xyXG4gICAgICAgICAgICAgICAgICAgIGFwaUFkYXB0ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEV4ZWN1dG9yLFxyXG4gICAgICAgICAgICAgICAgICAgIGJhc2VVcmwsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICAgICAgICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnXHJcbiAgICAgICAgICAgICAgICA/IHJlc3VsdC50cmltKClcclxuICAgICAgICAgICAgICAgIDogKChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXN1bHQuYm9keSkgfHwgJycpLnRyaW0oKTtcclxuICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICghcmVnZW5lcmF0ZUV4aXN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQoY3VycmVudFRleHQpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUoYWN0aW9uVHlwZSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbY2FuZGlkYXRlXSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoKHByZXYpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBbLi4ucHJldiwgY2FuZGlkYXRlXS5zbGljZSgwLCBNQVhfU1VHR0VTVElPTlMpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KG5leHQubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignRmFpbGVkIHRvIGdlbmVyYXRlIEFJIHN1Z2dlc3Rpb24nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgIHNldElzR2VuZXJhdGluZyhmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSksIFtcclxuICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgYmFzZVVybCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgY2FuUmVnZW5lcmF0ZSxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpbnN0cnVjdGlvblRleHQsXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgdGVtcGxhdGVJZCxcclxuICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICBvbkVycm9yLFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICAgICAgb25BSUFjdGlvblJlcXVlc3QsXHJcbiAgICAgICAgb25CdWlsZEFJUHJvbXB0LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghYWN0aXZlQ2FuZGlkYXRlIHx8ICFzdWdnZXN0aW9uQmFzZVRleHQgfHwgIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQoYWN0aXZlQ2FuZGlkYXRlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9hY2NlcHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0ge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjdGlvblR5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBlZGl0ZWRFdmVudEVtaXR0ZWQ6IGZhbHNlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgaW5Jbml0aWFsQWlQaGFzZSA9IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IHRhZ1BheWxvYWQgPSBjb21wdXRlQWlUYWdPbkFjY2VwdCh7XHJcbiAgICAgICAgICAgIGJhc2VsaW5lVGV4dDogc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlOiBpbkluaXRpYWxBaVBoYXNlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChpbkluaXRpYWxBaVBoYXNlKSB7XHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRhZ1BheWxvYWQpLCB7IHNvdXJjZTogJ2FjY2VwdCcgfSkpO1xyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNldEVkaXRvclRleHQsXHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCxcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVSZWplY3RTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9kaXNjYXJkZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW2NsZWFyU3VnZ2VzdGlvblNlc3Npb24sIGVtaXRBSUV2ZW50LCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdGVtcGxhdGVJZF0pO1xyXG4gICAgY29uc3QgaGFuZGxlRmVlZGJhY2sgPSB1c2VDYWxsYmFjaygocmF0aW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSgocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XTogcmF0aW5nIH0pKSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXksXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25JbmRleCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBhaUhlYWRlckFjdGlvbnMgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gZW5hYmxlZEFJQWN0aW9ucy5tYXAoKGFjdGlvblR5cGUpID0+IHtcclxuICAgICAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgICAgICBjb25zdCBhY3Rpb25Db25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgICAgICBjb25zdCB0b25lSWQgPSB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGFjdGlvbkNvbmZpZy5sYWJlbCxcclxuICAgICAgICAgICAgICAgIGlzUHJpbWFyeTogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGlzR2VuZXJhdGluZyAmJiBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFjdXJyZW50VGV4dC50cmltKCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGV4dC5sZW5ndGggPFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBpc0dlbmVyYXRpbmcgfHxcclxuICAgICAgICAgICAgICAgICAgICAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSxcclxuICAgICAgICAgICAgICAgIHNob3dUb25lRHJvcGRvd246IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICAhISgoX2EgPSBhY3Rpb25Db25maWcudG9uZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpLFxyXG4gICAgICAgICAgICAgICAgdG9uZXM6IGFjdGlvbkNvbmZpZy50b25lcyxcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkVG9uZUlkOiB0b25lSWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgZW5hYmxlZEFJQWN0aW9ucyxcclxuICAgICAgICBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBtaW5DaGFyc0J5QWN0aW9uLFxyXG4gICAgXSk7XHJcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGFkZFRleHRPcldyYXAsXHJcbiAgICAgICAgICAgIGFkZFRleHQsXHJcbiAgICAgICAgICAgIGdldCgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0Q2FyZXRQb3NpdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2FkZFRleHRPcldyYXAsIGFkZFRleHQsIGN1cnJlbnRUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpbnB1dFZhbHVlID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgfSwgW2lucHV0VmFsdWUsIHNldEVkaXRvclRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFsaW1pdCB8fCAhb25FcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG5leHRFcnJvciA9IGN1cnJlbnRUZXh0Lmxlbmd0aCA+IGxpbWl0ID8gTElNSVRfUkVBQ0hFRCA6IGVycm9yICE9PSBudWxsICYmIGVycm9yICE9PSB2b2lkIDAgPyBlcnJvciA6ICcnO1xyXG4gICAgICAgIGlmIChsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPT09IG5leHRFcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9IG5leHRFcnJvcjtcclxuICAgICAgICBvbkVycm9yKG5leHRFcnJvcik7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIGVycm9yLCBsaW1pdCwgb25FcnJvcl0pO1xyXG4gICAgcmV0dXJuIChfanN4cyhPdXRlckNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pLCBfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkxJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzVXBJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2xpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNsaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkRJU0xJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzRG93bkljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIGNhblJlZ2VuZXJhdGUgPyAoX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogaXNHZW5lcmF0aW5nID8gJ1JlZ2VuZXJhdGluZ+KApicgOiAnUmVnZW5lcmF0ZScsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiUmVnZW5lcmF0ZSBzdWdnZXN0aW9uXCIsIFwiYXJpYS1idXN5XCI6IGlzR2VuZXJhdGluZywgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzR2VuZXJhdGluZywgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IGlzR2VuZXJhdGluZyA/IChfanN4KFJlZ2VuZXJhdGVJY29uU2hpbW1lciwgeyBcImFyaWEtaGlkZGVuXCI6IHRydWUgfSkpIDogKF9qc3goUmV3aW5kSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkpIH0pKSB9KSkpIDogbnVsbCwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNjYXJkXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzY2FyZCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gfSwgeyBjaGlsZHJlbjogX2pzeChDcm9zc0ljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiQWNjZXB0XCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiQWNjZXB0IHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlQWNjZXB0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENoZWNrSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKV0gfSldIH0pKSkgOiBpc0dlbmVyYXRpbmcgPyAoX2pzeHMoRWRpdG9yU2tlbGV0b25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5NiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTIlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg4JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI1NCVcIiB9KV0gfSkpIDogKF9qc3goVGV4dFNwYWNlLCBPYmplY3QuYXNzaWduKHsgcmVmOiB0ZXh0U3BhY2VSZWYgfSwgdGV4dEFyZWFQcm9wcywgeyB2YWx1ZTogY3VycmVudFRleHQsIG9uQ2hhbmdlOiBoYW5kbGVPbkNoYW5nZSwgb25CbHVyOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0UG9zdEVkaXRBaVRhZ1JlY29tcHV0ZShlLnRhcmdldC52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QXJlYU9uQmx1ciA9PT0gbnVsbCB8fCB0ZXh0QXJlYU9uQmx1ciA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dEFyZWFPbkJsdXIoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uUGFzdGU6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhc3RlZFRleHQgPSBlLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3RlZFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSAoX2EgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uU3RhcnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gKF9iID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvbkVuZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogc3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlZmVyIGxpdmUgRE9NIHZhbHVlIOKAlCBgY3VycmVudFRleHRgIGNhbiBsYWcgdGhlIHRleHRhcmVhIGZvciBiaWcgcGFzdGVzLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSAoX2MgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwudmFsdWUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRUZXh0ID0gYmFzZS5zbGljZSgwLCBzdGFydCkgKyBwYXN0ZWRUZXh0ICsgYmFzZS5zbGljZShlbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcmV0ID0gc3RhcnQgKyBwYXN0ZWRUZXh0Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YSA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGEuc2V0U2VsZWN0aW9uUmFuZ2UoY2FyZXQsIGNhcmV0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBpbnZhbGlkIHJhbmdlIGluIGVkZ2UgYnJvd3NlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCByb3dzOiByb3dzIH0pKSksIGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUgPyAoX2pzeHMoSW5zdHJ1Y3Rpb25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhJbnN0cnVjdGlvbklucHV0Um93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0SWNvbiwgeyB3aWR0aDogMTgsIGhlaWdodDogMTgsIGNvbG9yOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnkgfSksIF9qc3goSW5zdHJ1Y3Rpb25JbnB1dCwgeyB2YWx1ZTogaW5zdHJ1Y3Rpb25UZXh0LCBwbGFjZWhvbGRlcjogXCJBZGQgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIHRvIHJlZmluZSB5b3VyIG1lc3NhZ2VcIiwgb25DaGFuZ2U6IChlKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoZS50YXJnZXQudmFsdWUpIH0pLCBfanN4cyhJbnN0cnVjdGlvbkFjdGlvbnMsIHsgY2hpbGRyZW46IFtfanN4KEluc3RydWN0aW9uQ2FuY2VsLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiQ2FuY2VsXCIgfSkpLCBfanN4KEluc3RydWN0aW9uSW1wcm92ZSwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RydWN0aW9uVG9BcHBseSA9IGluc3RydWN0aW9uVGV4dC50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2luc3RydWN0aW9uX3VzZWQnLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbl90eXBlOiBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fdGV4dDogYW5vbnltaXplSW5zdHJ1Y3Rpb25UZXh0KGluc3RydWN0aW9uVG9BcHBseSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSwgZmFsc2UsIGluc3RydWN0aW9uVG9BcHBseSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJJbXByb3ZlXCIgfSkpXSB9KV0gfSksIGluc3RydWN0aW9uVGV4dC50cmltKCkubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5sZW5ndGggPiAwID8gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCwgeyBjaGlsZHJlbjogZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLm1hcCgoc3VnZ2VzdGlvbikgPT4gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgc2VsZWN0ZWQ6IGluc3RydWN0aW9uVGV4dCA9PT0gc3VnZ2VzdGlvbiwgb25DbGljazogKCkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KHN1Z2dlc3Rpb24pIH0sIHsgY2hpbGRyZW46IHN1Z2dlc3Rpb24gfSksIHN1Z2dlc3Rpb24pKSkgfSkpIDogbnVsbF0gfSkpIDogKF9qc3goV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB7IGFjdGlvbnM6IGFjdGlvbnMsIHJlZjogdGV4dFNwYWNlUmVmLCBvbkFjdGlvblNlbGVjdDogb25BY3Rpb25TZWxlY3QsIFJpZ2h0Q29tcG9uZW50OiBSaWdodENvbXBvbmVudCwgcmlnaHRBY3Rpb25zRGlzYWJsZWQ6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIG9uRW1vamlDbGljazogb25FbW9qaUFkZGl0aW9uLCBhaUFjdGlvbnM6IGFpSGVhZGVyQWN0aW9ucywgZGlzYWJsZUFsbEFjdGlvbnM6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIGluc3RydWN0aW9uQWN0aXZlOiBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBvbkFJSW5zdHJ1Y3Rpb25zQ2xpY2s6ICgpID0+IHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUodHJ1ZSksIG9uQUlUb25lQ2hhbmdlOiAoYWN0aW9uVHlwZSwgdG9uZUlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUb25lQnlBY3Rpb24oKHByZXYpID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXYpLCB7IFthY3Rpb25UeXBlXTogdG9uZUlkIH0pKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkFJVG9uZVNlbGVjdCA9PT0gbnVsbCB8fCBvbkFJVG9uZVNlbGVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRvbmVTZWxlY3QoYWN0aW9uVHlwZSwgdG9uZUlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHRvbmVJZCwgQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBvbkFJQWN0aW9uQ2xpY2s6IChhY3Rpb25UeXBlLCBhY3Rpb25WYXJpYW50ID0gQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGFjdGlvbiBzaG91bGQgbm90IHJldHJpZ2dlciBmcm9tIGNoaXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2VuZXJhdGUgaXMgb25seSB2aWEgZXhwbGljaXQgcmVnZW5lcmF0ZSBjb250cm9sLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldyBhY3Rpb24gc3RhcnRzIGEgZnJlc2ggc3VnZ2VzdGlvbiBzZXNzaW9uLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSldIH0pKV0gfSkpO1xyXG59KTtcclxuV2hhdHNBcHBUZXh0RWRpdG9yLmRpc3BsYXlOYW1lID0gJ1doYXRzQXBwVGV4dEVkaXRvcic7XHJcbmV4cG9ydCB7IEFJX1RBR19DSEFOR0VfUkFUSU9fVEhSRVNIT0xELCBjb21wdXRlQWlUYWdPbkFjY2VwdCwgbGV2ZW5zaHRlaW5EaXN0YW5jZSwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2hhdHNBcHBUZXh0RWRpdG9yLmpzLm1hcCJdfQ== */")),t=p.default(o,"production"===process.env.NODE_ENV?{target:"ea7i3sh9"}:{target:"ea7i3sh9",label:"SuggestionRegenerateButton"})("production"===process.env.NODE_ENV?{name:"p2u7ri",styles:":disabled{opacity:1;cursor:wait;}"}:{name:"p2u7ri",styles:":disabled{opacity:1;cursor:wait;}",map:"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBZ0hnRSIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBPcmlnaW5hbCBwcmVmaWxsIGJvZHkgZm9yIEFJIHRhZyByZWNvbXB1dGU7IHNlZWRlZCBvbmNlLCBuZXZlciB0aGUgbGl2ZSBgY3VycmVudFRleHRgIGZhbGxiYWNrLiAqL1xyXG4gICAgY29uc3QgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZiA9IHVzZVJlZignJyk7XHJcbiAgICBjb25zdCBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZiA9IHVzZVJlZihmYWxzZSk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSAnJztcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghcHJlZmlsbFdhc0FpR2VuZXJhdGVkKSB7XHJcbiAgICAgICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50ID0gJyc7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBzZWVkID0gaW5wdXRWYWx1ZSAhPT0gbnVsbCAmJiBpbnB1dFZhbHVlICE9PSB2b2lkIDAgPyBpbnB1dFZhbHVlIDogJyc7XHJcbiAgICAgICAgaWYgKHNlZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSBzZWVkO1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBpbnB1dFZhbHVlLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChuZXh0VGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCByZWNvbXB1dGVQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCh7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgY3VycmVudEVkaXRlZFRleHQ6IG5leHRUZXh0LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlY29tcHV0ZVBheWxvYWQpLCB7IHNvdXJjZTogJ3Bvc3RfZWRpdF9kZWJvdW5jZScgfSkpO1xyXG4gICAgfSwgW29uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlICYmIHRleHQgIT09IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlKSB7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKHRleHQpO1xyXG4gICAgICAgICAgICB9LCBBSV9UQUdfUkVDT01QVVRFX0lETEVfTVMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXkpIHx8ICcwJyk7XHJcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oY2FjaGVkKSkge1xyXG4gICAgICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KGNhY2hlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgaGlnaGxpZ2h0U3RvcmFnZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKSB7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGVsaWdpYmxlID0gISFjdXJyZW50VGV4dC50cmltKCkgJiYgY3VycmVudFRleHQubGVuZ3RoID49IHJlcGhyYXNlTWluQ2hhcnM7XHJcbiAgICAgICAgaWYgKHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGVsaWdpYmxlO1xyXG4gICAgICAgICAgICBpZiAoZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICAgICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNyb3NzZWRUaHJlc2hvbGQgPSAhcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCAmJiBlbGlnaWJsZTtcclxuICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICBpZiAoY3Jvc3NlZFRocmVzaG9sZCkge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgaXNHZW5lcmF0aW5nLCByZXBocmFzZU1pbkNoYXJzXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXNbc3VnZ2VzdGlvbkluZGV4XSB8fCAnJztcclxuICAgIGNvbnN0IGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlQ2FuZGlkYXRlKVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gYCR7c3VnZ2VzdGlvbkFjdGlvblR5cGV9LSR7c3VnZ2VzdGlvbkluZGV4fS0ke2FjdGl2ZUNhbmRpZGF0ZX1gO1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHN1Z2dlc3Rpb25JbmRleF0pO1xyXG4gICAgY29uc3QgaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUgPSAhIShhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSAmJlxyXG4gICAgICAgIGZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZVthY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleV0pO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvbkJhc2VIdG1sID0gdXNlTWVtbygoKSA9PiBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAnJyksIFtzdWdnZXN0aW9uQmFzZVRleHRdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoYWN0aXZlQ2FuZGlkYXRlKSwgW2FjdGl2ZUNhbmRpZGF0ZV0pO1xyXG4gICAgY29uc3QgY2FuUmVnZW5lcmF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8IE1BWF9TVUdHRVNUSU9OUztcclxuICAgIGNvbnN0IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA9ICEhc3VnZ2VzdGlvbkJhc2VUZXh0ICYmIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA+IDA7XHJcbiAgICBjb25zdCBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggPD0gMSB8fCBzdWdnZXN0aW9uSW5kZXggPD0gMDtcclxuICAgIGNvbnN0IGlzTmV4dFN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8XHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4ID49IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCAtIDE7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IHN1Z2dlc3Rpb25TY3JvbGxSZWYuY3VycmVudDtcclxuICAgICAgICBpZiAoIW5vZGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBub2RlLnNjcm9sbFRvcCA9IG5vZGUuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLCBpc0dlbmVyYXRpbmddKTtcclxuICAgIGNvbnN0IGV4ZWN1dGVBSUFjdGlvbiA9IHVzZUNhbGxiYWNrKChhY3Rpb25UeXBlLCByZWdlbmVyYXRlRXhpc3RpbmcgPSBmYWxzZSwgaW5zdHJ1Y3Rpb25PdmVycmlkZSwgdG9uZU92ZXJyaWRlSWQsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgdmFyIF9iO1xyXG4gICAgICAgIGlmICghb25BSUFjdGlvblJlcXVlc3QgJiZcclxuICAgICAgICAgICAgIWFwaUFkYXB0ZXIgJiZcclxuICAgICAgICAgICAgKCFyZXF1ZXN0RXhlY3V0b3IgfHwgIWJhc2VVcmwpKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignQUkgY29uZmlndXJhdGlvbiBtaXNzaW5nJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjdXJyZW50VGV4dC50cmltKCkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBtaW5DaGFyc0ZvckFjdGlvbiA9IG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIDUwO1xyXG4gICAgICAgIGlmIChjdXJyZW50VGV4dC5sZW5ndGggPCBtaW5DaGFyc0ZvckFjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAocmVnZW5lcmF0ZUV4aXN0aW5nICYmICFjYW5SZWdlbmVyYXRlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgYmFzZUNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVR5cGUgPT09ICd1dGlsaXR5JyAmJlxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50ID09PSBBSUFjdGlvblZhcmlhbnQuUkVQSFJBU0VcclxuICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJhc2VDb25maWcpLCB7IGxhYmVsOiAnUmVwaHJhc2UnLCBiYXNlUHJvbXB0OiBVVElMSVRZX1JFUEhSQVNFX1BST01QVCB9KSA6IGJhc2VDb25maWc7XHJcbiAgICAgICAgLy8gVG9uZSBpcyBzZW50IG9ubHkgYWZ0ZXIgZXhwbGljaXQgdXNlciBzZWxlY3Rpb24gKG9yIGV4cGxpY2l0IG92ZXJyaWRlKSxcclxuICAgICAgICAvLyBub3QgZnJvbSBkZWZhdWx0IHRvbmUgbWV0YWRhdGEuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lSWQgPSB0b25lT3ZlcnJpZGVJZCB8fCB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lID0gKF9iID0gY29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZmluZCgodG9uZSkgPT4gdG9uZS5pZCA9PT0gc2VsZWN0ZWRUb25lSWQpO1xyXG4gICAgICAgIGNvbnN0IGluc3RydWN0aW9uRm9yUHJvbXB0ID0gaW5zdHJ1Y3Rpb25PdmVycmlkZSAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgID8gaW5zdHJ1Y3Rpb25PdmVycmlkZVxyXG4gICAgICAgICAgICA6IGluc3RydWN0aW9uVGV4dDtcclxuICAgICAgICBjb25zdCBwcm9tcHQgPSAob25CdWlsZEFJUHJvbXB0ID09PSBudWxsIHx8IG9uQnVpbGRBSVByb21wdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25CdWlsZEFJUHJvbXB0KHtcclxuICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCxcclxuICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICB0b25lTGFiZWw6IHNlbGVjdGVkVG9uZSA9PT0gbnVsbCB8fCBzZWxlY3RlZFRvbmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlbGVjdGVkVG9uZS5sYWJlbCxcclxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgfSkpIHx8XHJcbiAgICAgICAgICAgIGJ1aWxkQWN0aW9uUHJvbXB0KHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZyxcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBzZXRJc0dlbmVyYXRpbmcodHJ1ZSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2FjdGlvbl90cmlnZ2VyZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgdGVtcGxhdGVfY2F0ZWdvcnk6IHRlbXBsYXRlVHlwZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvbkFJQWN0aW9uUmVxdWVzdFxyXG4gICAgICAgICAgICAgICAgPyB5aWVsZCBvbkFJQWN0aW9uUmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICA6IHlpZWxkIHJlcXVlc3RBSVN1Z2dlc3Rpb24oe1xyXG4gICAgICAgICAgICAgICAgICAgIGFwaUFkYXB0ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEV4ZWN1dG9yLFxyXG4gICAgICAgICAgICAgICAgICAgIGJhc2VVcmwsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICAgICAgICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnXHJcbiAgICAgICAgICAgICAgICA/IHJlc3VsdC50cmltKClcclxuICAgICAgICAgICAgICAgIDogKChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXN1bHQuYm9keSkgfHwgJycpLnRyaW0oKTtcclxuICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICghcmVnZW5lcmF0ZUV4aXN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQoY3VycmVudFRleHQpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUoYWN0aW9uVHlwZSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbY2FuZGlkYXRlXSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoKHByZXYpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBbLi4ucHJldiwgY2FuZGlkYXRlXS5zbGljZSgwLCBNQVhfU1VHR0VTVElPTlMpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KG5leHQubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignRmFpbGVkIHRvIGdlbmVyYXRlIEFJIHN1Z2dlc3Rpb24nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgIHNldElzR2VuZXJhdGluZyhmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSksIFtcclxuICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgYmFzZVVybCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgY2FuUmVnZW5lcmF0ZSxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpbnN0cnVjdGlvblRleHQsXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgdGVtcGxhdGVJZCxcclxuICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICBvbkVycm9yLFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICAgICAgb25BSUFjdGlvblJlcXVlc3QsXHJcbiAgICAgICAgb25CdWlsZEFJUHJvbXB0LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghYWN0aXZlQ2FuZGlkYXRlIHx8ICFzdWdnZXN0aW9uQmFzZVRleHQgfHwgIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQoYWN0aXZlQ2FuZGlkYXRlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9hY2NlcHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0ge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjdGlvblR5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBlZGl0ZWRFdmVudEVtaXR0ZWQ6IGZhbHNlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgaW5Jbml0aWFsQWlQaGFzZSA9IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IHRhZ1BheWxvYWQgPSBjb21wdXRlQWlUYWdPbkFjY2VwdCh7XHJcbiAgICAgICAgICAgIGJhc2VsaW5lVGV4dDogc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlOiBpbkluaXRpYWxBaVBoYXNlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChpbkluaXRpYWxBaVBoYXNlKSB7XHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRhZ1BheWxvYWQpLCB7IHNvdXJjZTogJ2FjY2VwdCcgfSkpO1xyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNldEVkaXRvclRleHQsXHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCxcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVSZWplY3RTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9kaXNjYXJkZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW2NsZWFyU3VnZ2VzdGlvblNlc3Npb24sIGVtaXRBSUV2ZW50LCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdGVtcGxhdGVJZF0pO1xyXG4gICAgY29uc3QgaGFuZGxlRmVlZGJhY2sgPSB1c2VDYWxsYmFjaygocmF0aW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSgocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XTogcmF0aW5nIH0pKSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXksXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25JbmRleCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBhaUhlYWRlckFjdGlvbnMgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gZW5hYmxlZEFJQWN0aW9ucy5tYXAoKGFjdGlvblR5cGUpID0+IHtcclxuICAgICAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgICAgICBjb25zdCBhY3Rpb25Db25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgICAgICBjb25zdCB0b25lSWQgPSB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGFjdGlvbkNvbmZpZy5sYWJlbCxcclxuICAgICAgICAgICAgICAgIGlzUHJpbWFyeTogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGlzR2VuZXJhdGluZyAmJiBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFjdXJyZW50VGV4dC50cmltKCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGV4dC5sZW5ndGggPFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBpc0dlbmVyYXRpbmcgfHxcclxuICAgICAgICAgICAgICAgICAgICAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSxcclxuICAgICAgICAgICAgICAgIHNob3dUb25lRHJvcGRvd246IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICAhISgoX2EgPSBhY3Rpb25Db25maWcudG9uZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpLFxyXG4gICAgICAgICAgICAgICAgdG9uZXM6IGFjdGlvbkNvbmZpZy50b25lcyxcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkVG9uZUlkOiB0b25lSWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgZW5hYmxlZEFJQWN0aW9ucyxcclxuICAgICAgICBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBtaW5DaGFyc0J5QWN0aW9uLFxyXG4gICAgXSk7XHJcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGFkZFRleHRPcldyYXAsXHJcbiAgICAgICAgICAgIGFkZFRleHQsXHJcbiAgICAgICAgICAgIGdldCgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0Q2FyZXRQb3NpdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2FkZFRleHRPcldyYXAsIGFkZFRleHQsIGN1cnJlbnRUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpbnB1dFZhbHVlID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgfSwgW2lucHV0VmFsdWUsIHNldEVkaXRvclRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFsaW1pdCB8fCAhb25FcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG5leHRFcnJvciA9IGN1cnJlbnRUZXh0Lmxlbmd0aCA+IGxpbWl0ID8gTElNSVRfUkVBQ0hFRCA6IGVycm9yICE9PSBudWxsICYmIGVycm9yICE9PSB2b2lkIDAgPyBlcnJvciA6ICcnO1xyXG4gICAgICAgIGlmIChsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPT09IG5leHRFcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9IG5leHRFcnJvcjtcclxuICAgICAgICBvbkVycm9yKG5leHRFcnJvcik7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIGVycm9yLCBsaW1pdCwgb25FcnJvcl0pO1xyXG4gICAgcmV0dXJuIChfanN4cyhPdXRlckNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pLCBfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkxJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzVXBJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2xpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNsaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkRJU0xJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzRG93bkljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIGNhblJlZ2VuZXJhdGUgPyAoX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogaXNHZW5lcmF0aW5nID8gJ1JlZ2VuZXJhdGluZ+KApicgOiAnUmVnZW5lcmF0ZScsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiUmVnZW5lcmF0ZSBzdWdnZXN0aW9uXCIsIFwiYXJpYS1idXN5XCI6IGlzR2VuZXJhdGluZywgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzR2VuZXJhdGluZywgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IGlzR2VuZXJhdGluZyA/IChfanN4KFJlZ2VuZXJhdGVJY29uU2hpbW1lciwgeyBcImFyaWEtaGlkZGVuXCI6IHRydWUgfSkpIDogKF9qc3goUmV3aW5kSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkpIH0pKSB9KSkpIDogbnVsbCwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNjYXJkXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzY2FyZCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gfSwgeyBjaGlsZHJlbjogX2pzeChDcm9zc0ljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiQWNjZXB0XCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiQWNjZXB0IHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlQWNjZXB0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENoZWNrSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKV0gfSldIH0pKSkgOiBpc0dlbmVyYXRpbmcgPyAoX2pzeHMoRWRpdG9yU2tlbGV0b25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5NiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTIlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg4JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI1NCVcIiB9KV0gfSkpIDogKF9qc3goVGV4dFNwYWNlLCBPYmplY3QuYXNzaWduKHsgcmVmOiB0ZXh0U3BhY2VSZWYgfSwgdGV4dEFyZWFQcm9wcywgeyB2YWx1ZTogY3VycmVudFRleHQsIG9uQ2hhbmdlOiBoYW5kbGVPbkNoYW5nZSwgb25CbHVyOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0UG9zdEVkaXRBaVRhZ1JlY29tcHV0ZShlLnRhcmdldC52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QXJlYU9uQmx1ciA9PT0gbnVsbCB8fCB0ZXh0QXJlYU9uQmx1ciA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dEFyZWFPbkJsdXIoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uUGFzdGU6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhc3RlZFRleHQgPSBlLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3RlZFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSAoX2EgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uU3RhcnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gKF9iID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvbkVuZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogc3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlZmVyIGxpdmUgRE9NIHZhbHVlIOKAlCBgY3VycmVudFRleHRgIGNhbiBsYWcgdGhlIHRleHRhcmVhIGZvciBiaWcgcGFzdGVzLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSAoX2MgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwudmFsdWUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRUZXh0ID0gYmFzZS5zbGljZSgwLCBzdGFydCkgKyBwYXN0ZWRUZXh0ICsgYmFzZS5zbGljZShlbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcmV0ID0gc3RhcnQgKyBwYXN0ZWRUZXh0Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YSA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGEuc2V0U2VsZWN0aW9uUmFuZ2UoY2FyZXQsIGNhcmV0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBpbnZhbGlkIHJhbmdlIGluIGVkZ2UgYnJvd3NlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCByb3dzOiByb3dzIH0pKSksIGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUgPyAoX2pzeHMoSW5zdHJ1Y3Rpb25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhJbnN0cnVjdGlvbklucHV0Um93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0SWNvbiwgeyB3aWR0aDogMTgsIGhlaWdodDogMTgsIGNvbG9yOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnkgfSksIF9qc3goSW5zdHJ1Y3Rpb25JbnB1dCwgeyB2YWx1ZTogaW5zdHJ1Y3Rpb25UZXh0LCBwbGFjZWhvbGRlcjogXCJBZGQgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIHRvIHJlZmluZSB5b3VyIG1lc3NhZ2VcIiwgb25DaGFuZ2U6IChlKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoZS50YXJnZXQudmFsdWUpIH0pLCBfanN4cyhJbnN0cnVjdGlvbkFjdGlvbnMsIHsgY2hpbGRyZW46IFtfanN4KEluc3RydWN0aW9uQ2FuY2VsLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiQ2FuY2VsXCIgfSkpLCBfanN4KEluc3RydWN0aW9uSW1wcm92ZSwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RydWN0aW9uVG9BcHBseSA9IGluc3RydWN0aW9uVGV4dC50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2luc3RydWN0aW9uX3VzZWQnLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbl90eXBlOiBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fdGV4dDogYW5vbnltaXplSW5zdHJ1Y3Rpb25UZXh0KGluc3RydWN0aW9uVG9BcHBseSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSwgZmFsc2UsIGluc3RydWN0aW9uVG9BcHBseSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJJbXByb3ZlXCIgfSkpXSB9KV0gfSksIGluc3RydWN0aW9uVGV4dC50cmltKCkubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5sZW5ndGggPiAwID8gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCwgeyBjaGlsZHJlbjogZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLm1hcCgoc3VnZ2VzdGlvbikgPT4gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgc2VsZWN0ZWQ6IGluc3RydWN0aW9uVGV4dCA9PT0gc3VnZ2VzdGlvbiwgb25DbGljazogKCkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KHN1Z2dlc3Rpb24pIH0sIHsgY2hpbGRyZW46IHN1Z2dlc3Rpb24gfSksIHN1Z2dlc3Rpb24pKSkgfSkpIDogbnVsbF0gfSkpIDogKF9qc3goV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB7IGFjdGlvbnM6IGFjdGlvbnMsIHJlZjogdGV4dFNwYWNlUmVmLCBvbkFjdGlvblNlbGVjdDogb25BY3Rpb25TZWxlY3QsIFJpZ2h0Q29tcG9uZW50OiBSaWdodENvbXBvbmVudCwgcmlnaHRBY3Rpb25zRGlzYWJsZWQ6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIG9uRW1vamlDbGljazogb25FbW9qaUFkZGl0aW9uLCBhaUFjdGlvbnM6IGFpSGVhZGVyQWN0aW9ucywgZGlzYWJsZUFsbEFjdGlvbnM6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIGluc3RydWN0aW9uQWN0aXZlOiBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBvbkFJSW5zdHJ1Y3Rpb25zQ2xpY2s6ICgpID0+IHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUodHJ1ZSksIG9uQUlUb25lQ2hhbmdlOiAoYWN0aW9uVHlwZSwgdG9uZUlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUb25lQnlBY3Rpb24oKHByZXYpID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXYpLCB7IFthY3Rpb25UeXBlXTogdG9uZUlkIH0pKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkFJVG9uZVNlbGVjdCA9PT0gbnVsbCB8fCBvbkFJVG9uZVNlbGVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRvbmVTZWxlY3QoYWN0aW9uVHlwZSwgdG9uZUlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHRvbmVJZCwgQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBvbkFJQWN0aW9uQ2xpY2s6IChhY3Rpb25UeXBlLCBhY3Rpb25WYXJpYW50ID0gQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGFjdGlvbiBzaG91bGQgbm90IHJldHJpZ2dlciBmcm9tIGNoaXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2VuZXJhdGUgaXMgb25seSB2aWEgZXhwbGljaXQgcmVnZW5lcmF0ZSBjb250cm9sLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldyBhY3Rpb24gc3RhcnRzIGEgZnJlc2ggc3VnZ2VzdGlvbiBzZXNzaW9uLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSldIH0pKV0gfSkpO1xyXG59KTtcclxuV2hhdHNBcHBUZXh0RWRpdG9yLmRpc3BsYXlOYW1lID0gJ1doYXRzQXBwVGV4dEVkaXRvcic7XHJcbmV4cG9ydCB7IEFJX1RBR19DSEFOR0VfUkFUSU9fVEhSRVNIT0xELCBjb21wdXRlQWlUYWdPbkFjY2VwdCwgbGV2ZW5zaHRlaW5EaXN0YW5jZSwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2hhdHNBcHBUZXh0RWRpdG9yLmpzLm1hcCJdfQ== */",toString:a}),j=p.default("div","production"===process.env.NODE_ENV?{target:"ea7i3sh8"}:{target:"ea7i3sh8",label:"RegenerateIconShimmer"})("width:14px;height:14px;border-radius:4px;background:#ececef;flex-shrink:0;animation:",n," 1.1s ease-in-out infinite;"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBc0h5QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBPcmlnaW5hbCBwcmVmaWxsIGJvZHkgZm9yIEFJIHRhZyByZWNvbXB1dGU7IHNlZWRlZCBvbmNlLCBuZXZlciB0aGUgbGl2ZSBgY3VycmVudFRleHRgIGZhbGxiYWNrLiAqL1xyXG4gICAgY29uc3QgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZiA9IHVzZVJlZignJyk7XHJcbiAgICBjb25zdCBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZiA9IHVzZVJlZihmYWxzZSk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSAnJztcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghcHJlZmlsbFdhc0FpR2VuZXJhdGVkKSB7XHJcbiAgICAgICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50ID0gJyc7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBzZWVkID0gaW5wdXRWYWx1ZSAhPT0gbnVsbCAmJiBpbnB1dFZhbHVlICE9PSB2b2lkIDAgPyBpbnB1dFZhbHVlIDogJyc7XHJcbiAgICAgICAgaWYgKHNlZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSBzZWVkO1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBpbnB1dFZhbHVlLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChuZXh0VGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCByZWNvbXB1dGVQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCh7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgY3VycmVudEVkaXRlZFRleHQ6IG5leHRUZXh0LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlY29tcHV0ZVBheWxvYWQpLCB7IHNvdXJjZTogJ3Bvc3RfZWRpdF9kZWJvdW5jZScgfSkpO1xyXG4gICAgfSwgW29uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlICYmIHRleHQgIT09IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlKSB7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKHRleHQpO1xyXG4gICAgICAgICAgICB9LCBBSV9UQUdfUkVDT01QVVRFX0lETEVfTVMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXkpIHx8ICcwJyk7XHJcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oY2FjaGVkKSkge1xyXG4gICAgICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KGNhY2hlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgaGlnaGxpZ2h0U3RvcmFnZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKSB7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGVsaWdpYmxlID0gISFjdXJyZW50VGV4dC50cmltKCkgJiYgY3VycmVudFRleHQubGVuZ3RoID49IHJlcGhyYXNlTWluQ2hhcnM7XHJcbiAgICAgICAgaWYgKHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGVsaWdpYmxlO1xyXG4gICAgICAgICAgICBpZiAoZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICAgICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNyb3NzZWRUaHJlc2hvbGQgPSAhcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCAmJiBlbGlnaWJsZTtcclxuICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICBpZiAoY3Jvc3NlZFRocmVzaG9sZCkge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgaXNHZW5lcmF0aW5nLCByZXBocmFzZU1pbkNoYXJzXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXNbc3VnZ2VzdGlvbkluZGV4XSB8fCAnJztcclxuICAgIGNvbnN0IGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlQ2FuZGlkYXRlKVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gYCR7c3VnZ2VzdGlvbkFjdGlvblR5cGV9LSR7c3VnZ2VzdGlvbkluZGV4fS0ke2FjdGl2ZUNhbmRpZGF0ZX1gO1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHN1Z2dlc3Rpb25JbmRleF0pO1xyXG4gICAgY29uc3QgaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUgPSAhIShhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSAmJlxyXG4gICAgICAgIGZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZVthY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleV0pO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvbkJhc2VIdG1sID0gdXNlTWVtbygoKSA9PiBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAnJyksIFtzdWdnZXN0aW9uQmFzZVRleHRdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoYWN0aXZlQ2FuZGlkYXRlKSwgW2FjdGl2ZUNhbmRpZGF0ZV0pO1xyXG4gICAgY29uc3QgY2FuUmVnZW5lcmF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8IE1BWF9TVUdHRVNUSU9OUztcclxuICAgIGNvbnN0IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA9ICEhc3VnZ2VzdGlvbkJhc2VUZXh0ICYmIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA+IDA7XHJcbiAgICBjb25zdCBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggPD0gMSB8fCBzdWdnZXN0aW9uSW5kZXggPD0gMDtcclxuICAgIGNvbnN0IGlzTmV4dFN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8XHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4ID49IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCAtIDE7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IHN1Z2dlc3Rpb25TY3JvbGxSZWYuY3VycmVudDtcclxuICAgICAgICBpZiAoIW5vZGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBub2RlLnNjcm9sbFRvcCA9IG5vZGUuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLCBpc0dlbmVyYXRpbmddKTtcclxuICAgIGNvbnN0IGV4ZWN1dGVBSUFjdGlvbiA9IHVzZUNhbGxiYWNrKChhY3Rpb25UeXBlLCByZWdlbmVyYXRlRXhpc3RpbmcgPSBmYWxzZSwgaW5zdHJ1Y3Rpb25PdmVycmlkZSwgdG9uZU92ZXJyaWRlSWQsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgdmFyIF9iO1xyXG4gICAgICAgIGlmICghb25BSUFjdGlvblJlcXVlc3QgJiZcclxuICAgICAgICAgICAgIWFwaUFkYXB0ZXIgJiZcclxuICAgICAgICAgICAgKCFyZXF1ZXN0RXhlY3V0b3IgfHwgIWJhc2VVcmwpKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignQUkgY29uZmlndXJhdGlvbiBtaXNzaW5nJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjdXJyZW50VGV4dC50cmltKCkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBtaW5DaGFyc0ZvckFjdGlvbiA9IG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIDUwO1xyXG4gICAgICAgIGlmIChjdXJyZW50VGV4dC5sZW5ndGggPCBtaW5DaGFyc0ZvckFjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAocmVnZW5lcmF0ZUV4aXN0aW5nICYmICFjYW5SZWdlbmVyYXRlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgYmFzZUNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVR5cGUgPT09ICd1dGlsaXR5JyAmJlxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50ID09PSBBSUFjdGlvblZhcmlhbnQuUkVQSFJBU0VcclxuICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJhc2VDb25maWcpLCB7IGxhYmVsOiAnUmVwaHJhc2UnLCBiYXNlUHJvbXB0OiBVVElMSVRZX1JFUEhSQVNFX1BST01QVCB9KSA6IGJhc2VDb25maWc7XHJcbiAgICAgICAgLy8gVG9uZSBpcyBzZW50IG9ubHkgYWZ0ZXIgZXhwbGljaXQgdXNlciBzZWxlY3Rpb24gKG9yIGV4cGxpY2l0IG92ZXJyaWRlKSxcclxuICAgICAgICAvLyBub3QgZnJvbSBkZWZhdWx0IHRvbmUgbWV0YWRhdGEuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lSWQgPSB0b25lT3ZlcnJpZGVJZCB8fCB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lID0gKF9iID0gY29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZmluZCgodG9uZSkgPT4gdG9uZS5pZCA9PT0gc2VsZWN0ZWRUb25lSWQpO1xyXG4gICAgICAgIGNvbnN0IGluc3RydWN0aW9uRm9yUHJvbXB0ID0gaW5zdHJ1Y3Rpb25PdmVycmlkZSAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgID8gaW5zdHJ1Y3Rpb25PdmVycmlkZVxyXG4gICAgICAgICAgICA6IGluc3RydWN0aW9uVGV4dDtcclxuICAgICAgICBjb25zdCBwcm9tcHQgPSAob25CdWlsZEFJUHJvbXB0ID09PSBudWxsIHx8IG9uQnVpbGRBSVByb21wdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25CdWlsZEFJUHJvbXB0KHtcclxuICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCxcclxuICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICB0b25lTGFiZWw6IHNlbGVjdGVkVG9uZSA9PT0gbnVsbCB8fCBzZWxlY3RlZFRvbmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlbGVjdGVkVG9uZS5sYWJlbCxcclxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgfSkpIHx8XHJcbiAgICAgICAgICAgIGJ1aWxkQWN0aW9uUHJvbXB0KHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZyxcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBzZXRJc0dlbmVyYXRpbmcodHJ1ZSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2FjdGlvbl90cmlnZ2VyZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgdGVtcGxhdGVfY2F0ZWdvcnk6IHRlbXBsYXRlVHlwZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvbkFJQWN0aW9uUmVxdWVzdFxyXG4gICAgICAgICAgICAgICAgPyB5aWVsZCBvbkFJQWN0aW9uUmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICA6IHlpZWxkIHJlcXVlc3RBSVN1Z2dlc3Rpb24oe1xyXG4gICAgICAgICAgICAgICAgICAgIGFwaUFkYXB0ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEV4ZWN1dG9yLFxyXG4gICAgICAgICAgICAgICAgICAgIGJhc2VVcmwsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICAgICAgICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnXHJcbiAgICAgICAgICAgICAgICA/IHJlc3VsdC50cmltKClcclxuICAgICAgICAgICAgICAgIDogKChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXN1bHQuYm9keSkgfHwgJycpLnRyaW0oKTtcclxuICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICghcmVnZW5lcmF0ZUV4aXN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQoY3VycmVudFRleHQpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUoYWN0aW9uVHlwZSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbY2FuZGlkYXRlXSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoKHByZXYpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBbLi4ucHJldiwgY2FuZGlkYXRlXS5zbGljZSgwLCBNQVhfU1VHR0VTVElPTlMpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KG5leHQubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignRmFpbGVkIHRvIGdlbmVyYXRlIEFJIHN1Z2dlc3Rpb24nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgIHNldElzR2VuZXJhdGluZyhmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSksIFtcclxuICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgYmFzZVVybCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgY2FuUmVnZW5lcmF0ZSxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpbnN0cnVjdGlvblRleHQsXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgdGVtcGxhdGVJZCxcclxuICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICBvbkVycm9yLFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICAgICAgb25BSUFjdGlvblJlcXVlc3QsXHJcbiAgICAgICAgb25CdWlsZEFJUHJvbXB0LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghYWN0aXZlQ2FuZGlkYXRlIHx8ICFzdWdnZXN0aW9uQmFzZVRleHQgfHwgIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQoYWN0aXZlQ2FuZGlkYXRlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9hY2NlcHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0ge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjdGlvblR5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBlZGl0ZWRFdmVudEVtaXR0ZWQ6IGZhbHNlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgaW5Jbml0aWFsQWlQaGFzZSA9IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IHRhZ1BheWxvYWQgPSBjb21wdXRlQWlUYWdPbkFjY2VwdCh7XHJcbiAgICAgICAgICAgIGJhc2VsaW5lVGV4dDogc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlOiBpbkluaXRpYWxBaVBoYXNlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChpbkluaXRpYWxBaVBoYXNlKSB7XHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRhZ1BheWxvYWQpLCB7IHNvdXJjZTogJ2FjY2VwdCcgfSkpO1xyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNldEVkaXRvclRleHQsXHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCxcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVSZWplY3RTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9kaXNjYXJkZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW2NsZWFyU3VnZ2VzdGlvblNlc3Npb24sIGVtaXRBSUV2ZW50LCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdGVtcGxhdGVJZF0pO1xyXG4gICAgY29uc3QgaGFuZGxlRmVlZGJhY2sgPSB1c2VDYWxsYmFjaygocmF0aW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSgocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XTogcmF0aW5nIH0pKSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXksXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25JbmRleCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBhaUhlYWRlckFjdGlvbnMgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gZW5hYmxlZEFJQWN0aW9ucy5tYXAoKGFjdGlvblR5cGUpID0+IHtcclxuICAgICAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgICAgICBjb25zdCBhY3Rpb25Db25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgICAgICBjb25zdCB0b25lSWQgPSB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGFjdGlvbkNvbmZpZy5sYWJlbCxcclxuICAgICAgICAgICAgICAgIGlzUHJpbWFyeTogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGlzR2VuZXJhdGluZyAmJiBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFjdXJyZW50VGV4dC50cmltKCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGV4dC5sZW5ndGggPFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBpc0dlbmVyYXRpbmcgfHxcclxuICAgICAgICAgICAgICAgICAgICAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSxcclxuICAgICAgICAgICAgICAgIHNob3dUb25lRHJvcGRvd246IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICAhISgoX2EgPSBhY3Rpb25Db25maWcudG9uZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpLFxyXG4gICAgICAgICAgICAgICAgdG9uZXM6IGFjdGlvbkNvbmZpZy50b25lcyxcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkVG9uZUlkOiB0b25lSWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgZW5hYmxlZEFJQWN0aW9ucyxcclxuICAgICAgICBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBtaW5DaGFyc0J5QWN0aW9uLFxyXG4gICAgXSk7XHJcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGFkZFRleHRPcldyYXAsXHJcbiAgICAgICAgICAgIGFkZFRleHQsXHJcbiAgICAgICAgICAgIGdldCgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0Q2FyZXRQb3NpdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2FkZFRleHRPcldyYXAsIGFkZFRleHQsIGN1cnJlbnRUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpbnB1dFZhbHVlID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgfSwgW2lucHV0VmFsdWUsIHNldEVkaXRvclRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFsaW1pdCB8fCAhb25FcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG5leHRFcnJvciA9IGN1cnJlbnRUZXh0Lmxlbmd0aCA+IGxpbWl0ID8gTElNSVRfUkVBQ0hFRCA6IGVycm9yICE9PSBudWxsICYmIGVycm9yICE9PSB2b2lkIDAgPyBlcnJvciA6ICcnO1xyXG4gICAgICAgIGlmIChsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPT09IG5leHRFcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9IG5leHRFcnJvcjtcclxuICAgICAgICBvbkVycm9yKG5leHRFcnJvcik7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIGVycm9yLCBsaW1pdCwgb25FcnJvcl0pO1xyXG4gICAgcmV0dXJuIChfanN4cyhPdXRlckNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pLCBfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkxJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzVXBJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2xpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNsaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkRJU0xJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzRG93bkljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIGNhblJlZ2VuZXJhdGUgPyAoX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogaXNHZW5lcmF0aW5nID8gJ1JlZ2VuZXJhdGluZ+KApicgOiAnUmVnZW5lcmF0ZScsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiUmVnZW5lcmF0ZSBzdWdnZXN0aW9uXCIsIFwiYXJpYS1idXN5XCI6IGlzR2VuZXJhdGluZywgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzR2VuZXJhdGluZywgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IGlzR2VuZXJhdGluZyA/IChfanN4KFJlZ2VuZXJhdGVJY29uU2hpbW1lciwgeyBcImFyaWEtaGlkZGVuXCI6IHRydWUgfSkpIDogKF9qc3goUmV3aW5kSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkpIH0pKSB9KSkpIDogbnVsbCwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNjYXJkXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzY2FyZCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gfSwgeyBjaGlsZHJlbjogX2pzeChDcm9zc0ljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiQWNjZXB0XCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiQWNjZXB0IHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlQWNjZXB0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENoZWNrSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKV0gfSldIH0pKSkgOiBpc0dlbmVyYXRpbmcgPyAoX2pzeHMoRWRpdG9yU2tlbGV0b25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5NiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTIlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg4JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI1NCVcIiB9KV0gfSkpIDogKF9qc3goVGV4dFNwYWNlLCBPYmplY3QuYXNzaWduKHsgcmVmOiB0ZXh0U3BhY2VSZWYgfSwgdGV4dEFyZWFQcm9wcywgeyB2YWx1ZTogY3VycmVudFRleHQsIG9uQ2hhbmdlOiBoYW5kbGVPbkNoYW5nZSwgb25CbHVyOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0UG9zdEVkaXRBaVRhZ1JlY29tcHV0ZShlLnRhcmdldC52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QXJlYU9uQmx1ciA9PT0gbnVsbCB8fCB0ZXh0QXJlYU9uQmx1ciA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dEFyZWFPbkJsdXIoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uUGFzdGU6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhc3RlZFRleHQgPSBlLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3RlZFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSAoX2EgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uU3RhcnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gKF9iID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvbkVuZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogc3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlZmVyIGxpdmUgRE9NIHZhbHVlIOKAlCBgY3VycmVudFRleHRgIGNhbiBsYWcgdGhlIHRleHRhcmVhIGZvciBiaWcgcGFzdGVzLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSAoX2MgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwudmFsdWUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRUZXh0ID0gYmFzZS5zbGljZSgwLCBzdGFydCkgKyBwYXN0ZWRUZXh0ICsgYmFzZS5zbGljZShlbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcmV0ID0gc3RhcnQgKyBwYXN0ZWRUZXh0Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YSA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGEuc2V0U2VsZWN0aW9uUmFuZ2UoY2FyZXQsIGNhcmV0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBpbnZhbGlkIHJhbmdlIGluIGVkZ2UgYnJvd3NlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCByb3dzOiByb3dzIH0pKSksIGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUgPyAoX2pzeHMoSW5zdHJ1Y3Rpb25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhJbnN0cnVjdGlvbklucHV0Um93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0SWNvbiwgeyB3aWR0aDogMTgsIGhlaWdodDogMTgsIGNvbG9yOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnkgfSksIF9qc3goSW5zdHJ1Y3Rpb25JbnB1dCwgeyB2YWx1ZTogaW5zdHJ1Y3Rpb25UZXh0LCBwbGFjZWhvbGRlcjogXCJBZGQgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIHRvIHJlZmluZSB5b3VyIG1lc3NhZ2VcIiwgb25DaGFuZ2U6IChlKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoZS50YXJnZXQudmFsdWUpIH0pLCBfanN4cyhJbnN0cnVjdGlvbkFjdGlvbnMsIHsgY2hpbGRyZW46IFtfanN4KEluc3RydWN0aW9uQ2FuY2VsLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiQ2FuY2VsXCIgfSkpLCBfanN4KEluc3RydWN0aW9uSW1wcm92ZSwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RydWN0aW9uVG9BcHBseSA9IGluc3RydWN0aW9uVGV4dC50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2luc3RydWN0aW9uX3VzZWQnLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbl90eXBlOiBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fdGV4dDogYW5vbnltaXplSW5zdHJ1Y3Rpb25UZXh0KGluc3RydWN0aW9uVG9BcHBseSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSwgZmFsc2UsIGluc3RydWN0aW9uVG9BcHBseSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJJbXByb3ZlXCIgfSkpXSB9KV0gfSksIGluc3RydWN0aW9uVGV4dC50cmltKCkubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5sZW5ndGggPiAwID8gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCwgeyBjaGlsZHJlbjogZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLm1hcCgoc3VnZ2VzdGlvbikgPT4gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgc2VsZWN0ZWQ6IGluc3RydWN0aW9uVGV4dCA9PT0gc3VnZ2VzdGlvbiwgb25DbGljazogKCkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KHN1Z2dlc3Rpb24pIH0sIHsgY2hpbGRyZW46IHN1Z2dlc3Rpb24gfSksIHN1Z2dlc3Rpb24pKSkgfSkpIDogbnVsbF0gfSkpIDogKF9qc3goV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB7IGFjdGlvbnM6IGFjdGlvbnMsIHJlZjogdGV4dFNwYWNlUmVmLCBvbkFjdGlvblNlbGVjdDogb25BY3Rpb25TZWxlY3QsIFJpZ2h0Q29tcG9uZW50OiBSaWdodENvbXBvbmVudCwgcmlnaHRBY3Rpb25zRGlzYWJsZWQ6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIG9uRW1vamlDbGljazogb25FbW9qaUFkZGl0aW9uLCBhaUFjdGlvbnM6IGFpSGVhZGVyQWN0aW9ucywgZGlzYWJsZUFsbEFjdGlvbnM6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIGluc3RydWN0aW9uQWN0aXZlOiBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBvbkFJSW5zdHJ1Y3Rpb25zQ2xpY2s6ICgpID0+IHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUodHJ1ZSksIG9uQUlUb25lQ2hhbmdlOiAoYWN0aW9uVHlwZSwgdG9uZUlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUb25lQnlBY3Rpb24oKHByZXYpID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXYpLCB7IFthY3Rpb25UeXBlXTogdG9uZUlkIH0pKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkFJVG9uZVNlbGVjdCA9PT0gbnVsbCB8fCBvbkFJVG9uZVNlbGVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRvbmVTZWxlY3QoYWN0aW9uVHlwZSwgdG9uZUlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHRvbmVJZCwgQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBvbkFJQWN0aW9uQ2xpY2s6IChhY3Rpb25UeXBlLCBhY3Rpb25WYXJpYW50ID0gQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGFjdGlvbiBzaG91bGQgbm90IHJldHJpZ2dlciBmcm9tIGNoaXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2VuZXJhdGUgaXMgb25seSB2aWEgZXhwbGljaXQgcmVnZW5lcmF0ZSBjb250cm9sLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldyBhY3Rpb24gc3RhcnRzIGEgZnJlc2ggc3VnZ2VzdGlvbiBzZXNzaW9uLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSldIH0pKV0gfSkpO1xyXG59KTtcclxuV2hhdHNBcHBUZXh0RWRpdG9yLmRpc3BsYXlOYW1lID0gJ1doYXRzQXBwVGV4dEVkaXRvcic7XHJcbmV4cG9ydCB7IEFJX1RBR19DSEFOR0VfUkFUSU9fVEhSRVNIT0xELCBjb21wdXRlQWlUYWdPbkFjY2VwdCwgbGV2ZW5zaHRlaW5EaXN0YW5jZSwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2hhdHNBcHBUZXh0RWRpdG9yLmpzLm1hcCJdfQ== */")),T=p.default("div","production"===process.env.NODE_ENV?{target:"ea7i3sh7"}:{target:"ea7i3sh7",label:"InstructionContainer"})("background:",B.COLORS.surface.standard,";display:flex;flex-direction:column;padding:8px 12px;gap:10px;border-radius:0 0 4px 4px;position:relative;"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBK0h3QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBPcmlnaW5hbCBwcmVmaWxsIGJvZHkgZm9yIEFJIHRhZyByZWNvbXB1dGU7IHNlZWRlZCBvbmNlLCBuZXZlciB0aGUgbGl2ZSBgY3VycmVudFRleHRgIGZhbGxiYWNrLiAqL1xyXG4gICAgY29uc3QgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZiA9IHVzZVJlZignJyk7XHJcbiAgICBjb25zdCBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZiA9IHVzZVJlZihmYWxzZSk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSAnJztcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghcHJlZmlsbFdhc0FpR2VuZXJhdGVkKSB7XHJcbiAgICAgICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50ID0gJyc7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBzZWVkID0gaW5wdXRWYWx1ZSAhPT0gbnVsbCAmJiBpbnB1dFZhbHVlICE9PSB2b2lkIDAgPyBpbnB1dFZhbHVlIDogJyc7XHJcbiAgICAgICAgaWYgKHNlZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSBzZWVkO1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBpbnB1dFZhbHVlLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChuZXh0VGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCByZWNvbXB1dGVQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCh7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgY3VycmVudEVkaXRlZFRleHQ6IG5leHRUZXh0LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlY29tcHV0ZVBheWxvYWQpLCB7IHNvdXJjZTogJ3Bvc3RfZWRpdF9kZWJvdW5jZScgfSkpO1xyXG4gICAgfSwgW29uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlICYmIHRleHQgIT09IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlKSB7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKHRleHQpO1xyXG4gICAgICAgICAgICB9LCBBSV9UQUdfUkVDT01QVVRFX0lETEVfTVMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXkpIHx8ICcwJyk7XHJcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oY2FjaGVkKSkge1xyXG4gICAgICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KGNhY2hlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgaGlnaGxpZ2h0U3RvcmFnZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKSB7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGVsaWdpYmxlID0gISFjdXJyZW50VGV4dC50cmltKCkgJiYgY3VycmVudFRleHQubGVuZ3RoID49IHJlcGhyYXNlTWluQ2hhcnM7XHJcbiAgICAgICAgaWYgKHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGVsaWdpYmxlO1xyXG4gICAgICAgICAgICBpZiAoZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICAgICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNyb3NzZWRUaHJlc2hvbGQgPSAhcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCAmJiBlbGlnaWJsZTtcclxuICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICBpZiAoY3Jvc3NlZFRocmVzaG9sZCkge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgaXNHZW5lcmF0aW5nLCByZXBocmFzZU1pbkNoYXJzXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXNbc3VnZ2VzdGlvbkluZGV4XSB8fCAnJztcclxuICAgIGNvbnN0IGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlQ2FuZGlkYXRlKVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gYCR7c3VnZ2VzdGlvbkFjdGlvblR5cGV9LSR7c3VnZ2VzdGlvbkluZGV4fS0ke2FjdGl2ZUNhbmRpZGF0ZX1gO1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHN1Z2dlc3Rpb25JbmRleF0pO1xyXG4gICAgY29uc3QgaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUgPSAhIShhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSAmJlxyXG4gICAgICAgIGZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZVthY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleV0pO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvbkJhc2VIdG1sID0gdXNlTWVtbygoKSA9PiBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAnJyksIFtzdWdnZXN0aW9uQmFzZVRleHRdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoYWN0aXZlQ2FuZGlkYXRlKSwgW2FjdGl2ZUNhbmRpZGF0ZV0pO1xyXG4gICAgY29uc3QgY2FuUmVnZW5lcmF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8IE1BWF9TVUdHRVNUSU9OUztcclxuICAgIGNvbnN0IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA9ICEhc3VnZ2VzdGlvbkJhc2VUZXh0ICYmIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA+IDA7XHJcbiAgICBjb25zdCBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggPD0gMSB8fCBzdWdnZXN0aW9uSW5kZXggPD0gMDtcclxuICAgIGNvbnN0IGlzTmV4dFN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8XHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4ID49IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCAtIDE7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IHN1Z2dlc3Rpb25TY3JvbGxSZWYuY3VycmVudDtcclxuICAgICAgICBpZiAoIW5vZGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBub2RlLnNjcm9sbFRvcCA9IG5vZGUuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLCBpc0dlbmVyYXRpbmddKTtcclxuICAgIGNvbnN0IGV4ZWN1dGVBSUFjdGlvbiA9IHVzZUNhbGxiYWNrKChhY3Rpb25UeXBlLCByZWdlbmVyYXRlRXhpc3RpbmcgPSBmYWxzZSwgaW5zdHJ1Y3Rpb25PdmVycmlkZSwgdG9uZU92ZXJyaWRlSWQsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgdmFyIF9iO1xyXG4gICAgICAgIGlmICghb25BSUFjdGlvblJlcXVlc3QgJiZcclxuICAgICAgICAgICAgIWFwaUFkYXB0ZXIgJiZcclxuICAgICAgICAgICAgKCFyZXF1ZXN0RXhlY3V0b3IgfHwgIWJhc2VVcmwpKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignQUkgY29uZmlndXJhdGlvbiBtaXNzaW5nJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjdXJyZW50VGV4dC50cmltKCkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBtaW5DaGFyc0ZvckFjdGlvbiA9IG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIDUwO1xyXG4gICAgICAgIGlmIChjdXJyZW50VGV4dC5sZW5ndGggPCBtaW5DaGFyc0ZvckFjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAocmVnZW5lcmF0ZUV4aXN0aW5nICYmICFjYW5SZWdlbmVyYXRlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgYmFzZUNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVR5cGUgPT09ICd1dGlsaXR5JyAmJlxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50ID09PSBBSUFjdGlvblZhcmlhbnQuUkVQSFJBU0VcclxuICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJhc2VDb25maWcpLCB7IGxhYmVsOiAnUmVwaHJhc2UnLCBiYXNlUHJvbXB0OiBVVElMSVRZX1JFUEhSQVNFX1BST01QVCB9KSA6IGJhc2VDb25maWc7XHJcbiAgICAgICAgLy8gVG9uZSBpcyBzZW50IG9ubHkgYWZ0ZXIgZXhwbGljaXQgdXNlciBzZWxlY3Rpb24gKG9yIGV4cGxpY2l0IG92ZXJyaWRlKSxcclxuICAgICAgICAvLyBub3QgZnJvbSBkZWZhdWx0IHRvbmUgbWV0YWRhdGEuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lSWQgPSB0b25lT3ZlcnJpZGVJZCB8fCB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lID0gKF9iID0gY29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZmluZCgodG9uZSkgPT4gdG9uZS5pZCA9PT0gc2VsZWN0ZWRUb25lSWQpO1xyXG4gICAgICAgIGNvbnN0IGluc3RydWN0aW9uRm9yUHJvbXB0ID0gaW5zdHJ1Y3Rpb25PdmVycmlkZSAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgID8gaW5zdHJ1Y3Rpb25PdmVycmlkZVxyXG4gICAgICAgICAgICA6IGluc3RydWN0aW9uVGV4dDtcclxuICAgICAgICBjb25zdCBwcm9tcHQgPSAob25CdWlsZEFJUHJvbXB0ID09PSBudWxsIHx8IG9uQnVpbGRBSVByb21wdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25CdWlsZEFJUHJvbXB0KHtcclxuICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCxcclxuICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICB0b25lTGFiZWw6IHNlbGVjdGVkVG9uZSA9PT0gbnVsbCB8fCBzZWxlY3RlZFRvbmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlbGVjdGVkVG9uZS5sYWJlbCxcclxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgfSkpIHx8XHJcbiAgICAgICAgICAgIGJ1aWxkQWN0aW9uUHJvbXB0KHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZyxcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBzZXRJc0dlbmVyYXRpbmcodHJ1ZSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2FjdGlvbl90cmlnZ2VyZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgdGVtcGxhdGVfY2F0ZWdvcnk6IHRlbXBsYXRlVHlwZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvbkFJQWN0aW9uUmVxdWVzdFxyXG4gICAgICAgICAgICAgICAgPyB5aWVsZCBvbkFJQWN0aW9uUmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICA6IHlpZWxkIHJlcXVlc3RBSVN1Z2dlc3Rpb24oe1xyXG4gICAgICAgICAgICAgICAgICAgIGFwaUFkYXB0ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEV4ZWN1dG9yLFxyXG4gICAgICAgICAgICAgICAgICAgIGJhc2VVcmwsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICAgICAgICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnXHJcbiAgICAgICAgICAgICAgICA/IHJlc3VsdC50cmltKClcclxuICAgICAgICAgICAgICAgIDogKChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXN1bHQuYm9keSkgfHwgJycpLnRyaW0oKTtcclxuICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICghcmVnZW5lcmF0ZUV4aXN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQoY3VycmVudFRleHQpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUoYWN0aW9uVHlwZSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbY2FuZGlkYXRlXSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoKHByZXYpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBbLi4ucHJldiwgY2FuZGlkYXRlXS5zbGljZSgwLCBNQVhfU1VHR0VTVElPTlMpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KG5leHQubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignRmFpbGVkIHRvIGdlbmVyYXRlIEFJIHN1Z2dlc3Rpb24nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgIHNldElzR2VuZXJhdGluZyhmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSksIFtcclxuICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgYmFzZVVybCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgY2FuUmVnZW5lcmF0ZSxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpbnN0cnVjdGlvblRleHQsXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgdGVtcGxhdGVJZCxcclxuICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICBvbkVycm9yLFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICAgICAgb25BSUFjdGlvblJlcXVlc3QsXHJcbiAgICAgICAgb25CdWlsZEFJUHJvbXB0LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghYWN0aXZlQ2FuZGlkYXRlIHx8ICFzdWdnZXN0aW9uQmFzZVRleHQgfHwgIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQoYWN0aXZlQ2FuZGlkYXRlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9hY2NlcHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0ge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjdGlvblR5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBlZGl0ZWRFdmVudEVtaXR0ZWQ6IGZhbHNlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgaW5Jbml0aWFsQWlQaGFzZSA9IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IHRhZ1BheWxvYWQgPSBjb21wdXRlQWlUYWdPbkFjY2VwdCh7XHJcbiAgICAgICAgICAgIGJhc2VsaW5lVGV4dDogc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlOiBpbkluaXRpYWxBaVBoYXNlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChpbkluaXRpYWxBaVBoYXNlKSB7XHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRhZ1BheWxvYWQpLCB7IHNvdXJjZTogJ2FjY2VwdCcgfSkpO1xyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNldEVkaXRvclRleHQsXHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCxcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVSZWplY3RTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9kaXNjYXJkZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW2NsZWFyU3VnZ2VzdGlvblNlc3Npb24sIGVtaXRBSUV2ZW50LCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdGVtcGxhdGVJZF0pO1xyXG4gICAgY29uc3QgaGFuZGxlRmVlZGJhY2sgPSB1c2VDYWxsYmFjaygocmF0aW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSgocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XTogcmF0aW5nIH0pKSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXksXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25JbmRleCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBhaUhlYWRlckFjdGlvbnMgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gZW5hYmxlZEFJQWN0aW9ucy5tYXAoKGFjdGlvblR5cGUpID0+IHtcclxuICAgICAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgICAgICBjb25zdCBhY3Rpb25Db25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgICAgICBjb25zdCB0b25lSWQgPSB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGFjdGlvbkNvbmZpZy5sYWJlbCxcclxuICAgICAgICAgICAgICAgIGlzUHJpbWFyeTogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGlzR2VuZXJhdGluZyAmJiBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFjdXJyZW50VGV4dC50cmltKCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGV4dC5sZW5ndGggPFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBpc0dlbmVyYXRpbmcgfHxcclxuICAgICAgICAgICAgICAgICAgICAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSxcclxuICAgICAgICAgICAgICAgIHNob3dUb25lRHJvcGRvd246IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICAhISgoX2EgPSBhY3Rpb25Db25maWcudG9uZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpLFxyXG4gICAgICAgICAgICAgICAgdG9uZXM6IGFjdGlvbkNvbmZpZy50b25lcyxcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkVG9uZUlkOiB0b25lSWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgZW5hYmxlZEFJQWN0aW9ucyxcclxuICAgICAgICBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBtaW5DaGFyc0J5QWN0aW9uLFxyXG4gICAgXSk7XHJcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGFkZFRleHRPcldyYXAsXHJcbiAgICAgICAgICAgIGFkZFRleHQsXHJcbiAgICAgICAgICAgIGdldCgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0Q2FyZXRQb3NpdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2FkZFRleHRPcldyYXAsIGFkZFRleHQsIGN1cnJlbnRUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpbnB1dFZhbHVlID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgfSwgW2lucHV0VmFsdWUsIHNldEVkaXRvclRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFsaW1pdCB8fCAhb25FcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG5leHRFcnJvciA9IGN1cnJlbnRUZXh0Lmxlbmd0aCA+IGxpbWl0ID8gTElNSVRfUkVBQ0hFRCA6IGVycm9yICE9PSBudWxsICYmIGVycm9yICE9PSB2b2lkIDAgPyBlcnJvciA6ICcnO1xyXG4gICAgICAgIGlmIChsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPT09IG5leHRFcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9IG5leHRFcnJvcjtcclxuICAgICAgICBvbkVycm9yKG5leHRFcnJvcik7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIGVycm9yLCBsaW1pdCwgb25FcnJvcl0pO1xyXG4gICAgcmV0dXJuIChfanN4cyhPdXRlckNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pLCBfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkxJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzVXBJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2xpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNsaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkRJU0xJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzRG93bkljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIGNhblJlZ2VuZXJhdGUgPyAoX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogaXNHZW5lcmF0aW5nID8gJ1JlZ2VuZXJhdGluZ+KApicgOiAnUmVnZW5lcmF0ZScsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiUmVnZW5lcmF0ZSBzdWdnZXN0aW9uXCIsIFwiYXJpYS1idXN5XCI6IGlzR2VuZXJhdGluZywgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzR2VuZXJhdGluZywgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IGlzR2VuZXJhdGluZyA/IChfanN4KFJlZ2VuZXJhdGVJY29uU2hpbW1lciwgeyBcImFyaWEtaGlkZGVuXCI6IHRydWUgfSkpIDogKF9qc3goUmV3aW5kSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkpIH0pKSB9KSkpIDogbnVsbCwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNjYXJkXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzY2FyZCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gfSwgeyBjaGlsZHJlbjogX2pzeChDcm9zc0ljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiQWNjZXB0XCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiQWNjZXB0IHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlQWNjZXB0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENoZWNrSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKV0gfSldIH0pKSkgOiBpc0dlbmVyYXRpbmcgPyAoX2pzeHMoRWRpdG9yU2tlbGV0b25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5NiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTIlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg4JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI1NCVcIiB9KV0gfSkpIDogKF9qc3goVGV4dFNwYWNlLCBPYmplY3QuYXNzaWduKHsgcmVmOiB0ZXh0U3BhY2VSZWYgfSwgdGV4dEFyZWFQcm9wcywgeyB2YWx1ZTogY3VycmVudFRleHQsIG9uQ2hhbmdlOiBoYW5kbGVPbkNoYW5nZSwgb25CbHVyOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0UG9zdEVkaXRBaVRhZ1JlY29tcHV0ZShlLnRhcmdldC52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QXJlYU9uQmx1ciA9PT0gbnVsbCB8fCB0ZXh0QXJlYU9uQmx1ciA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dEFyZWFPbkJsdXIoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uUGFzdGU6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhc3RlZFRleHQgPSBlLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3RlZFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSAoX2EgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uU3RhcnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gKF9iID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvbkVuZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogc3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlZmVyIGxpdmUgRE9NIHZhbHVlIOKAlCBgY3VycmVudFRleHRgIGNhbiBsYWcgdGhlIHRleHRhcmVhIGZvciBiaWcgcGFzdGVzLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSAoX2MgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwudmFsdWUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRUZXh0ID0gYmFzZS5zbGljZSgwLCBzdGFydCkgKyBwYXN0ZWRUZXh0ICsgYmFzZS5zbGljZShlbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcmV0ID0gc3RhcnQgKyBwYXN0ZWRUZXh0Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YSA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGEuc2V0U2VsZWN0aW9uUmFuZ2UoY2FyZXQsIGNhcmV0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBpbnZhbGlkIHJhbmdlIGluIGVkZ2UgYnJvd3NlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCByb3dzOiByb3dzIH0pKSksIGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUgPyAoX2pzeHMoSW5zdHJ1Y3Rpb25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhJbnN0cnVjdGlvbklucHV0Um93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0SWNvbiwgeyB3aWR0aDogMTgsIGhlaWdodDogMTgsIGNvbG9yOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnkgfSksIF9qc3goSW5zdHJ1Y3Rpb25JbnB1dCwgeyB2YWx1ZTogaW5zdHJ1Y3Rpb25UZXh0LCBwbGFjZWhvbGRlcjogXCJBZGQgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIHRvIHJlZmluZSB5b3VyIG1lc3NhZ2VcIiwgb25DaGFuZ2U6IChlKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoZS50YXJnZXQudmFsdWUpIH0pLCBfanN4cyhJbnN0cnVjdGlvbkFjdGlvbnMsIHsgY2hpbGRyZW46IFtfanN4KEluc3RydWN0aW9uQ2FuY2VsLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiQ2FuY2VsXCIgfSkpLCBfanN4KEluc3RydWN0aW9uSW1wcm92ZSwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RydWN0aW9uVG9BcHBseSA9IGluc3RydWN0aW9uVGV4dC50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2luc3RydWN0aW9uX3VzZWQnLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbl90eXBlOiBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fdGV4dDogYW5vbnltaXplSW5zdHJ1Y3Rpb25UZXh0KGluc3RydWN0aW9uVG9BcHBseSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSwgZmFsc2UsIGluc3RydWN0aW9uVG9BcHBseSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJJbXByb3ZlXCIgfSkpXSB9KV0gfSksIGluc3RydWN0aW9uVGV4dC50cmltKCkubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5sZW5ndGggPiAwID8gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCwgeyBjaGlsZHJlbjogZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLm1hcCgoc3VnZ2VzdGlvbikgPT4gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgc2VsZWN0ZWQ6IGluc3RydWN0aW9uVGV4dCA9PT0gc3VnZ2VzdGlvbiwgb25DbGljazogKCkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KHN1Z2dlc3Rpb24pIH0sIHsgY2hpbGRyZW46IHN1Z2dlc3Rpb24gfSksIHN1Z2dlc3Rpb24pKSkgfSkpIDogbnVsbF0gfSkpIDogKF9qc3goV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB7IGFjdGlvbnM6IGFjdGlvbnMsIHJlZjogdGV4dFNwYWNlUmVmLCBvbkFjdGlvblNlbGVjdDogb25BY3Rpb25TZWxlY3QsIFJpZ2h0Q29tcG9uZW50OiBSaWdodENvbXBvbmVudCwgcmlnaHRBY3Rpb25zRGlzYWJsZWQ6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIG9uRW1vamlDbGljazogb25FbW9qaUFkZGl0aW9uLCBhaUFjdGlvbnM6IGFpSGVhZGVyQWN0aW9ucywgZGlzYWJsZUFsbEFjdGlvbnM6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIGluc3RydWN0aW9uQWN0aXZlOiBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBvbkFJSW5zdHJ1Y3Rpb25zQ2xpY2s6ICgpID0+IHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUodHJ1ZSksIG9uQUlUb25lQ2hhbmdlOiAoYWN0aW9uVHlwZSwgdG9uZUlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUb25lQnlBY3Rpb24oKHByZXYpID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXYpLCB7IFthY3Rpb25UeXBlXTogdG9uZUlkIH0pKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkFJVG9uZVNlbGVjdCA9PT0gbnVsbCB8fCBvbkFJVG9uZVNlbGVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRvbmVTZWxlY3QoYWN0aW9uVHlwZSwgdG9uZUlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHRvbmVJZCwgQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBvbkFJQWN0aW9uQ2xpY2s6IChhY3Rpb25UeXBlLCBhY3Rpb25WYXJpYW50ID0gQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGFjdGlvbiBzaG91bGQgbm90IHJldHJpZ2dlciBmcm9tIGNoaXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2VuZXJhdGUgaXMgb25seSB2aWEgZXhwbGljaXQgcmVnZW5lcmF0ZSBjb250cm9sLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldyBhY3Rpb24gc3RhcnRzIGEgZnJlc2ggc3VnZ2VzdGlvbiBzZXNzaW9uLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSldIH0pKV0gfSkpO1xyXG59KTtcclxuV2hhdHNBcHBUZXh0RWRpdG9yLmRpc3BsYXlOYW1lID0gJ1doYXRzQXBwVGV4dEVkaXRvcic7XHJcbmV4cG9ydCB7IEFJX1RBR19DSEFOR0VfUkFUSU9fVEhSRVNIT0xELCBjb21wdXRlQWlUYWdPbkFjY2VwdCwgbGV2ZW5zaHRlaW5EaXN0YW5jZSwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2hhdHNBcHBUZXh0RWRpdG9yLmpzLm1hcCJdfQ== */")),e=p.default("div","production"===process.env.NODE_ENV?{target:"ea7i3sh6"}:{target:"ea7i3sh6",label:"InstructionInputRow"})("border:1px solid #f5a4c0;border-radius:10px;padding:8px 10px;display:flex;align-items:center;gap:10px;background:",B.COLORS.surface.standard,";"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBd0l1QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBPcmlnaW5hbCBwcmVmaWxsIGJvZHkgZm9yIEFJIHRhZyByZWNvbXB1dGU7IHNlZWRlZCBvbmNlLCBuZXZlciB0aGUgbGl2ZSBgY3VycmVudFRleHRgIGZhbGxiYWNrLiAqL1xyXG4gICAgY29uc3QgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZiA9IHVzZVJlZignJyk7XHJcbiAgICBjb25zdCBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZiA9IHVzZVJlZihmYWxzZSk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSAnJztcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghcHJlZmlsbFdhc0FpR2VuZXJhdGVkKSB7XHJcbiAgICAgICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50ID0gJyc7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBzZWVkID0gaW5wdXRWYWx1ZSAhPT0gbnVsbCAmJiBpbnB1dFZhbHVlICE9PSB2b2lkIDAgPyBpbnB1dFZhbHVlIDogJyc7XHJcbiAgICAgICAgaWYgKHNlZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSBzZWVkO1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBpbnB1dFZhbHVlLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChuZXh0VGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCByZWNvbXB1dGVQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCh7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgY3VycmVudEVkaXRlZFRleHQ6IG5leHRUZXh0LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlY29tcHV0ZVBheWxvYWQpLCB7IHNvdXJjZTogJ3Bvc3RfZWRpdF9kZWJvdW5jZScgfSkpO1xyXG4gICAgfSwgW29uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlICYmIHRleHQgIT09IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlKSB7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKHRleHQpO1xyXG4gICAgICAgICAgICB9LCBBSV9UQUdfUkVDT01QVVRFX0lETEVfTVMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXkpIHx8ICcwJyk7XHJcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oY2FjaGVkKSkge1xyXG4gICAgICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KGNhY2hlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgaGlnaGxpZ2h0U3RvcmFnZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKSB7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGVsaWdpYmxlID0gISFjdXJyZW50VGV4dC50cmltKCkgJiYgY3VycmVudFRleHQubGVuZ3RoID49IHJlcGhyYXNlTWluQ2hhcnM7XHJcbiAgICAgICAgaWYgKHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGVsaWdpYmxlO1xyXG4gICAgICAgICAgICBpZiAoZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICAgICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNyb3NzZWRUaHJlc2hvbGQgPSAhcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCAmJiBlbGlnaWJsZTtcclxuICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICBpZiAoY3Jvc3NlZFRocmVzaG9sZCkge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgaXNHZW5lcmF0aW5nLCByZXBocmFzZU1pbkNoYXJzXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXNbc3VnZ2VzdGlvbkluZGV4XSB8fCAnJztcclxuICAgIGNvbnN0IGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlQ2FuZGlkYXRlKVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gYCR7c3VnZ2VzdGlvbkFjdGlvblR5cGV9LSR7c3VnZ2VzdGlvbkluZGV4fS0ke2FjdGl2ZUNhbmRpZGF0ZX1gO1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHN1Z2dlc3Rpb25JbmRleF0pO1xyXG4gICAgY29uc3QgaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUgPSAhIShhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSAmJlxyXG4gICAgICAgIGZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZVthY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleV0pO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvbkJhc2VIdG1sID0gdXNlTWVtbygoKSA9PiBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAnJyksIFtzdWdnZXN0aW9uQmFzZVRleHRdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoYWN0aXZlQ2FuZGlkYXRlKSwgW2FjdGl2ZUNhbmRpZGF0ZV0pO1xyXG4gICAgY29uc3QgY2FuUmVnZW5lcmF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8IE1BWF9TVUdHRVNUSU9OUztcclxuICAgIGNvbnN0IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA9ICEhc3VnZ2VzdGlvbkJhc2VUZXh0ICYmIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA+IDA7XHJcbiAgICBjb25zdCBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggPD0gMSB8fCBzdWdnZXN0aW9uSW5kZXggPD0gMDtcclxuICAgIGNvbnN0IGlzTmV4dFN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8XHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4ID49IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCAtIDE7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IHN1Z2dlc3Rpb25TY3JvbGxSZWYuY3VycmVudDtcclxuICAgICAgICBpZiAoIW5vZGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBub2RlLnNjcm9sbFRvcCA9IG5vZGUuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLCBpc0dlbmVyYXRpbmddKTtcclxuICAgIGNvbnN0IGV4ZWN1dGVBSUFjdGlvbiA9IHVzZUNhbGxiYWNrKChhY3Rpb25UeXBlLCByZWdlbmVyYXRlRXhpc3RpbmcgPSBmYWxzZSwgaW5zdHJ1Y3Rpb25PdmVycmlkZSwgdG9uZU92ZXJyaWRlSWQsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgdmFyIF9iO1xyXG4gICAgICAgIGlmICghb25BSUFjdGlvblJlcXVlc3QgJiZcclxuICAgICAgICAgICAgIWFwaUFkYXB0ZXIgJiZcclxuICAgICAgICAgICAgKCFyZXF1ZXN0RXhlY3V0b3IgfHwgIWJhc2VVcmwpKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignQUkgY29uZmlndXJhdGlvbiBtaXNzaW5nJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjdXJyZW50VGV4dC50cmltKCkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBtaW5DaGFyc0ZvckFjdGlvbiA9IG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIDUwO1xyXG4gICAgICAgIGlmIChjdXJyZW50VGV4dC5sZW5ndGggPCBtaW5DaGFyc0ZvckFjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAocmVnZW5lcmF0ZUV4aXN0aW5nICYmICFjYW5SZWdlbmVyYXRlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgYmFzZUNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVR5cGUgPT09ICd1dGlsaXR5JyAmJlxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50ID09PSBBSUFjdGlvblZhcmlhbnQuUkVQSFJBU0VcclxuICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJhc2VDb25maWcpLCB7IGxhYmVsOiAnUmVwaHJhc2UnLCBiYXNlUHJvbXB0OiBVVElMSVRZX1JFUEhSQVNFX1BST01QVCB9KSA6IGJhc2VDb25maWc7XHJcbiAgICAgICAgLy8gVG9uZSBpcyBzZW50IG9ubHkgYWZ0ZXIgZXhwbGljaXQgdXNlciBzZWxlY3Rpb24gKG9yIGV4cGxpY2l0IG92ZXJyaWRlKSxcclxuICAgICAgICAvLyBub3QgZnJvbSBkZWZhdWx0IHRvbmUgbWV0YWRhdGEuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lSWQgPSB0b25lT3ZlcnJpZGVJZCB8fCB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lID0gKF9iID0gY29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZmluZCgodG9uZSkgPT4gdG9uZS5pZCA9PT0gc2VsZWN0ZWRUb25lSWQpO1xyXG4gICAgICAgIGNvbnN0IGluc3RydWN0aW9uRm9yUHJvbXB0ID0gaW5zdHJ1Y3Rpb25PdmVycmlkZSAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgID8gaW5zdHJ1Y3Rpb25PdmVycmlkZVxyXG4gICAgICAgICAgICA6IGluc3RydWN0aW9uVGV4dDtcclxuICAgICAgICBjb25zdCBwcm9tcHQgPSAob25CdWlsZEFJUHJvbXB0ID09PSBudWxsIHx8IG9uQnVpbGRBSVByb21wdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25CdWlsZEFJUHJvbXB0KHtcclxuICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCxcclxuICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICB0b25lTGFiZWw6IHNlbGVjdGVkVG9uZSA9PT0gbnVsbCB8fCBzZWxlY3RlZFRvbmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlbGVjdGVkVG9uZS5sYWJlbCxcclxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgfSkpIHx8XHJcbiAgICAgICAgICAgIGJ1aWxkQWN0aW9uUHJvbXB0KHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZyxcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBzZXRJc0dlbmVyYXRpbmcodHJ1ZSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2FjdGlvbl90cmlnZ2VyZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgdGVtcGxhdGVfY2F0ZWdvcnk6IHRlbXBsYXRlVHlwZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvbkFJQWN0aW9uUmVxdWVzdFxyXG4gICAgICAgICAgICAgICAgPyB5aWVsZCBvbkFJQWN0aW9uUmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICA6IHlpZWxkIHJlcXVlc3RBSVN1Z2dlc3Rpb24oe1xyXG4gICAgICAgICAgICAgICAgICAgIGFwaUFkYXB0ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEV4ZWN1dG9yLFxyXG4gICAgICAgICAgICAgICAgICAgIGJhc2VVcmwsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICAgICAgICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnXHJcbiAgICAgICAgICAgICAgICA/IHJlc3VsdC50cmltKClcclxuICAgICAgICAgICAgICAgIDogKChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXN1bHQuYm9keSkgfHwgJycpLnRyaW0oKTtcclxuICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICghcmVnZW5lcmF0ZUV4aXN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQoY3VycmVudFRleHQpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUoYWN0aW9uVHlwZSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbY2FuZGlkYXRlXSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoKHByZXYpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBbLi4ucHJldiwgY2FuZGlkYXRlXS5zbGljZSgwLCBNQVhfU1VHR0VTVElPTlMpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KG5leHQubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignRmFpbGVkIHRvIGdlbmVyYXRlIEFJIHN1Z2dlc3Rpb24nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgIHNldElzR2VuZXJhdGluZyhmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSksIFtcclxuICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgYmFzZVVybCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgY2FuUmVnZW5lcmF0ZSxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpbnN0cnVjdGlvblRleHQsXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgdGVtcGxhdGVJZCxcclxuICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICBvbkVycm9yLFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICAgICAgb25BSUFjdGlvblJlcXVlc3QsXHJcbiAgICAgICAgb25CdWlsZEFJUHJvbXB0LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghYWN0aXZlQ2FuZGlkYXRlIHx8ICFzdWdnZXN0aW9uQmFzZVRleHQgfHwgIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQoYWN0aXZlQ2FuZGlkYXRlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9hY2NlcHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0ge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjdGlvblR5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBlZGl0ZWRFdmVudEVtaXR0ZWQ6IGZhbHNlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgaW5Jbml0aWFsQWlQaGFzZSA9IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IHRhZ1BheWxvYWQgPSBjb21wdXRlQWlUYWdPbkFjY2VwdCh7XHJcbiAgICAgICAgICAgIGJhc2VsaW5lVGV4dDogc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlOiBpbkluaXRpYWxBaVBoYXNlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChpbkluaXRpYWxBaVBoYXNlKSB7XHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRhZ1BheWxvYWQpLCB7IHNvdXJjZTogJ2FjY2VwdCcgfSkpO1xyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNldEVkaXRvclRleHQsXHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCxcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVSZWplY3RTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9kaXNjYXJkZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW2NsZWFyU3VnZ2VzdGlvblNlc3Npb24sIGVtaXRBSUV2ZW50LCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdGVtcGxhdGVJZF0pO1xyXG4gICAgY29uc3QgaGFuZGxlRmVlZGJhY2sgPSB1c2VDYWxsYmFjaygocmF0aW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSgocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XTogcmF0aW5nIH0pKSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXksXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25JbmRleCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBhaUhlYWRlckFjdGlvbnMgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gZW5hYmxlZEFJQWN0aW9ucy5tYXAoKGFjdGlvblR5cGUpID0+IHtcclxuICAgICAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgICAgICBjb25zdCBhY3Rpb25Db25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgICAgICBjb25zdCB0b25lSWQgPSB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGFjdGlvbkNvbmZpZy5sYWJlbCxcclxuICAgICAgICAgICAgICAgIGlzUHJpbWFyeTogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGlzR2VuZXJhdGluZyAmJiBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFjdXJyZW50VGV4dC50cmltKCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGV4dC5sZW5ndGggPFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBpc0dlbmVyYXRpbmcgfHxcclxuICAgICAgICAgICAgICAgICAgICAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSxcclxuICAgICAgICAgICAgICAgIHNob3dUb25lRHJvcGRvd246IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICAhISgoX2EgPSBhY3Rpb25Db25maWcudG9uZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpLFxyXG4gICAgICAgICAgICAgICAgdG9uZXM6IGFjdGlvbkNvbmZpZy50b25lcyxcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkVG9uZUlkOiB0b25lSWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgZW5hYmxlZEFJQWN0aW9ucyxcclxuICAgICAgICBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBtaW5DaGFyc0J5QWN0aW9uLFxyXG4gICAgXSk7XHJcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGFkZFRleHRPcldyYXAsXHJcbiAgICAgICAgICAgIGFkZFRleHQsXHJcbiAgICAgICAgICAgIGdldCgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0Q2FyZXRQb3NpdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2FkZFRleHRPcldyYXAsIGFkZFRleHQsIGN1cnJlbnRUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpbnB1dFZhbHVlID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgfSwgW2lucHV0VmFsdWUsIHNldEVkaXRvclRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFsaW1pdCB8fCAhb25FcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG5leHRFcnJvciA9IGN1cnJlbnRUZXh0Lmxlbmd0aCA+IGxpbWl0ID8gTElNSVRfUkVBQ0hFRCA6IGVycm9yICE9PSBudWxsICYmIGVycm9yICE9PSB2b2lkIDAgPyBlcnJvciA6ICcnO1xyXG4gICAgICAgIGlmIChsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPT09IG5leHRFcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9IG5leHRFcnJvcjtcclxuICAgICAgICBvbkVycm9yKG5leHRFcnJvcik7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIGVycm9yLCBsaW1pdCwgb25FcnJvcl0pO1xyXG4gICAgcmV0dXJuIChfanN4cyhPdXRlckNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pLCBfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkxJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzVXBJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2xpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNsaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkRJU0xJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzRG93bkljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIGNhblJlZ2VuZXJhdGUgPyAoX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogaXNHZW5lcmF0aW5nID8gJ1JlZ2VuZXJhdGluZ+KApicgOiAnUmVnZW5lcmF0ZScsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiUmVnZW5lcmF0ZSBzdWdnZXN0aW9uXCIsIFwiYXJpYS1idXN5XCI6IGlzR2VuZXJhdGluZywgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzR2VuZXJhdGluZywgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IGlzR2VuZXJhdGluZyA/IChfanN4KFJlZ2VuZXJhdGVJY29uU2hpbW1lciwgeyBcImFyaWEtaGlkZGVuXCI6IHRydWUgfSkpIDogKF9qc3goUmV3aW5kSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkpIH0pKSB9KSkpIDogbnVsbCwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNjYXJkXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzY2FyZCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gfSwgeyBjaGlsZHJlbjogX2pzeChDcm9zc0ljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiQWNjZXB0XCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiQWNjZXB0IHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlQWNjZXB0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENoZWNrSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKV0gfSldIH0pKSkgOiBpc0dlbmVyYXRpbmcgPyAoX2pzeHMoRWRpdG9yU2tlbGV0b25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5NiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTIlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg4JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI1NCVcIiB9KV0gfSkpIDogKF9qc3goVGV4dFNwYWNlLCBPYmplY3QuYXNzaWduKHsgcmVmOiB0ZXh0U3BhY2VSZWYgfSwgdGV4dEFyZWFQcm9wcywgeyB2YWx1ZTogY3VycmVudFRleHQsIG9uQ2hhbmdlOiBoYW5kbGVPbkNoYW5nZSwgb25CbHVyOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0UG9zdEVkaXRBaVRhZ1JlY29tcHV0ZShlLnRhcmdldC52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QXJlYU9uQmx1ciA9PT0gbnVsbCB8fCB0ZXh0QXJlYU9uQmx1ciA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dEFyZWFPbkJsdXIoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uUGFzdGU6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhc3RlZFRleHQgPSBlLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3RlZFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSAoX2EgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uU3RhcnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gKF9iID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvbkVuZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogc3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlZmVyIGxpdmUgRE9NIHZhbHVlIOKAlCBgY3VycmVudFRleHRgIGNhbiBsYWcgdGhlIHRleHRhcmVhIGZvciBiaWcgcGFzdGVzLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSAoX2MgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwudmFsdWUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRUZXh0ID0gYmFzZS5zbGljZSgwLCBzdGFydCkgKyBwYXN0ZWRUZXh0ICsgYmFzZS5zbGljZShlbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcmV0ID0gc3RhcnQgKyBwYXN0ZWRUZXh0Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YSA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGEuc2V0U2VsZWN0aW9uUmFuZ2UoY2FyZXQsIGNhcmV0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBpbnZhbGlkIHJhbmdlIGluIGVkZ2UgYnJvd3NlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCByb3dzOiByb3dzIH0pKSksIGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUgPyAoX2pzeHMoSW5zdHJ1Y3Rpb25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhJbnN0cnVjdGlvbklucHV0Um93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0SWNvbiwgeyB3aWR0aDogMTgsIGhlaWdodDogMTgsIGNvbG9yOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnkgfSksIF9qc3goSW5zdHJ1Y3Rpb25JbnB1dCwgeyB2YWx1ZTogaW5zdHJ1Y3Rpb25UZXh0LCBwbGFjZWhvbGRlcjogXCJBZGQgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIHRvIHJlZmluZSB5b3VyIG1lc3NhZ2VcIiwgb25DaGFuZ2U6IChlKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoZS50YXJnZXQudmFsdWUpIH0pLCBfanN4cyhJbnN0cnVjdGlvbkFjdGlvbnMsIHsgY2hpbGRyZW46IFtfanN4KEluc3RydWN0aW9uQ2FuY2VsLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiQ2FuY2VsXCIgfSkpLCBfanN4KEluc3RydWN0aW9uSW1wcm92ZSwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RydWN0aW9uVG9BcHBseSA9IGluc3RydWN0aW9uVGV4dC50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2luc3RydWN0aW9uX3VzZWQnLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbl90eXBlOiBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fdGV4dDogYW5vbnltaXplSW5zdHJ1Y3Rpb25UZXh0KGluc3RydWN0aW9uVG9BcHBseSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSwgZmFsc2UsIGluc3RydWN0aW9uVG9BcHBseSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJJbXByb3ZlXCIgfSkpXSB9KV0gfSksIGluc3RydWN0aW9uVGV4dC50cmltKCkubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5sZW5ndGggPiAwID8gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCwgeyBjaGlsZHJlbjogZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLm1hcCgoc3VnZ2VzdGlvbikgPT4gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgc2VsZWN0ZWQ6IGluc3RydWN0aW9uVGV4dCA9PT0gc3VnZ2VzdGlvbiwgb25DbGljazogKCkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KHN1Z2dlc3Rpb24pIH0sIHsgY2hpbGRyZW46IHN1Z2dlc3Rpb24gfSksIHN1Z2dlc3Rpb24pKSkgfSkpIDogbnVsbF0gfSkpIDogKF9qc3goV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB7IGFjdGlvbnM6IGFjdGlvbnMsIHJlZjogdGV4dFNwYWNlUmVmLCBvbkFjdGlvblNlbGVjdDogb25BY3Rpb25TZWxlY3QsIFJpZ2h0Q29tcG9uZW50OiBSaWdodENvbXBvbmVudCwgcmlnaHRBY3Rpb25zRGlzYWJsZWQ6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIG9uRW1vamlDbGljazogb25FbW9qaUFkZGl0aW9uLCBhaUFjdGlvbnM6IGFpSGVhZGVyQWN0aW9ucywgZGlzYWJsZUFsbEFjdGlvbnM6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIGluc3RydWN0aW9uQWN0aXZlOiBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBvbkFJSW5zdHJ1Y3Rpb25zQ2xpY2s6ICgpID0+IHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUodHJ1ZSksIG9uQUlUb25lQ2hhbmdlOiAoYWN0aW9uVHlwZSwgdG9uZUlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUb25lQnlBY3Rpb24oKHByZXYpID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXYpLCB7IFthY3Rpb25UeXBlXTogdG9uZUlkIH0pKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkFJVG9uZVNlbGVjdCA9PT0gbnVsbCB8fCBvbkFJVG9uZVNlbGVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRvbmVTZWxlY3QoYWN0aW9uVHlwZSwgdG9uZUlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHRvbmVJZCwgQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBvbkFJQWN0aW9uQ2xpY2s6IChhY3Rpb25UeXBlLCBhY3Rpb25WYXJpYW50ID0gQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGFjdGlvbiBzaG91bGQgbm90IHJldHJpZ2dlciBmcm9tIGNoaXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2VuZXJhdGUgaXMgb25seSB2aWEgZXhwbGljaXQgcmVnZW5lcmF0ZSBjb250cm9sLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldyBhY3Rpb24gc3RhcnRzIGEgZnJlc2ggc3VnZ2VzdGlvbiBzZXNzaW9uLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSldIH0pKV0gfSkpO1xyXG59KTtcclxuV2hhdHNBcHBUZXh0RWRpdG9yLmRpc3BsYXlOYW1lID0gJ1doYXRzQXBwVGV4dEVkaXRvcic7XHJcbmV4cG9ydCB7IEFJX1RBR19DSEFOR0VfUkFUSU9fVEhSRVNIT0xELCBjb21wdXRlQWlUYWdPbkFjY2VwdCwgbGV2ZW5zaHRlaW5EaXN0YW5jZSwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2hhdHNBcHBUZXh0RWRpdG9yLmpzLm1hcCJdfQ== */")),D=p.default("input","production"===process.env.NODE_ENV?{target:"ea7i3sh5"}:{target:"ea7i3sh5",label:"InstructionInput"})("flex:1;min-width:0;border:0;outline:none;font-size:14px;background:transparent;color:",B.COLORS.content.primary,";"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBaUpzQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBPcmlnaW5hbCBwcmVmaWxsIGJvZHkgZm9yIEFJIHRhZyByZWNvbXB1dGU7IHNlZWRlZCBvbmNlLCBuZXZlciB0aGUgbGl2ZSBgY3VycmVudFRleHRgIGZhbGxiYWNrLiAqL1xyXG4gICAgY29uc3QgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZiA9IHVzZVJlZignJyk7XHJcbiAgICBjb25zdCBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZiA9IHVzZVJlZihmYWxzZSk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSAnJztcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghcHJlZmlsbFdhc0FpR2VuZXJhdGVkKSB7XHJcbiAgICAgICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50ID0gJyc7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBzZWVkID0gaW5wdXRWYWx1ZSAhPT0gbnVsbCAmJiBpbnB1dFZhbHVlICE9PSB2b2lkIDAgPyBpbnB1dFZhbHVlIDogJyc7XHJcbiAgICAgICAgaWYgKHNlZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSBzZWVkO1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBpbnB1dFZhbHVlLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChuZXh0VGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCByZWNvbXB1dGVQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCh7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgY3VycmVudEVkaXRlZFRleHQ6IG5leHRUZXh0LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlY29tcHV0ZVBheWxvYWQpLCB7IHNvdXJjZTogJ3Bvc3RfZWRpdF9kZWJvdW5jZScgfSkpO1xyXG4gICAgfSwgW29uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlICYmIHRleHQgIT09IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlKSB7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKHRleHQpO1xyXG4gICAgICAgICAgICB9LCBBSV9UQUdfUkVDT01QVVRFX0lETEVfTVMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXkpIHx8ICcwJyk7XHJcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oY2FjaGVkKSkge1xyXG4gICAgICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KGNhY2hlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgaGlnaGxpZ2h0U3RvcmFnZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKSB7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGVsaWdpYmxlID0gISFjdXJyZW50VGV4dC50cmltKCkgJiYgY3VycmVudFRleHQubGVuZ3RoID49IHJlcGhyYXNlTWluQ2hhcnM7XHJcbiAgICAgICAgaWYgKHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGVsaWdpYmxlO1xyXG4gICAgICAgICAgICBpZiAoZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICAgICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNyb3NzZWRUaHJlc2hvbGQgPSAhcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCAmJiBlbGlnaWJsZTtcclxuICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICBpZiAoY3Jvc3NlZFRocmVzaG9sZCkge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgaXNHZW5lcmF0aW5nLCByZXBocmFzZU1pbkNoYXJzXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXNbc3VnZ2VzdGlvbkluZGV4XSB8fCAnJztcclxuICAgIGNvbnN0IGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlQ2FuZGlkYXRlKVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gYCR7c3VnZ2VzdGlvbkFjdGlvblR5cGV9LSR7c3VnZ2VzdGlvbkluZGV4fS0ke2FjdGl2ZUNhbmRpZGF0ZX1gO1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHN1Z2dlc3Rpb25JbmRleF0pO1xyXG4gICAgY29uc3QgaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUgPSAhIShhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSAmJlxyXG4gICAgICAgIGZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZVthY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleV0pO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvbkJhc2VIdG1sID0gdXNlTWVtbygoKSA9PiBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAnJyksIFtzdWdnZXN0aW9uQmFzZVRleHRdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoYWN0aXZlQ2FuZGlkYXRlKSwgW2FjdGl2ZUNhbmRpZGF0ZV0pO1xyXG4gICAgY29uc3QgY2FuUmVnZW5lcmF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8IE1BWF9TVUdHRVNUSU9OUztcclxuICAgIGNvbnN0IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA9ICEhc3VnZ2VzdGlvbkJhc2VUZXh0ICYmIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA+IDA7XHJcbiAgICBjb25zdCBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggPD0gMSB8fCBzdWdnZXN0aW9uSW5kZXggPD0gMDtcclxuICAgIGNvbnN0IGlzTmV4dFN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8XHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4ID49IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCAtIDE7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IHN1Z2dlc3Rpb25TY3JvbGxSZWYuY3VycmVudDtcclxuICAgICAgICBpZiAoIW5vZGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBub2RlLnNjcm9sbFRvcCA9IG5vZGUuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLCBpc0dlbmVyYXRpbmddKTtcclxuICAgIGNvbnN0IGV4ZWN1dGVBSUFjdGlvbiA9IHVzZUNhbGxiYWNrKChhY3Rpb25UeXBlLCByZWdlbmVyYXRlRXhpc3RpbmcgPSBmYWxzZSwgaW5zdHJ1Y3Rpb25PdmVycmlkZSwgdG9uZU92ZXJyaWRlSWQsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgdmFyIF9iO1xyXG4gICAgICAgIGlmICghb25BSUFjdGlvblJlcXVlc3QgJiZcclxuICAgICAgICAgICAgIWFwaUFkYXB0ZXIgJiZcclxuICAgICAgICAgICAgKCFyZXF1ZXN0RXhlY3V0b3IgfHwgIWJhc2VVcmwpKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignQUkgY29uZmlndXJhdGlvbiBtaXNzaW5nJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjdXJyZW50VGV4dC50cmltKCkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBtaW5DaGFyc0ZvckFjdGlvbiA9IG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIDUwO1xyXG4gICAgICAgIGlmIChjdXJyZW50VGV4dC5sZW5ndGggPCBtaW5DaGFyc0ZvckFjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAocmVnZW5lcmF0ZUV4aXN0aW5nICYmICFjYW5SZWdlbmVyYXRlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgYmFzZUNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVR5cGUgPT09ICd1dGlsaXR5JyAmJlxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50ID09PSBBSUFjdGlvblZhcmlhbnQuUkVQSFJBU0VcclxuICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJhc2VDb25maWcpLCB7IGxhYmVsOiAnUmVwaHJhc2UnLCBiYXNlUHJvbXB0OiBVVElMSVRZX1JFUEhSQVNFX1BST01QVCB9KSA6IGJhc2VDb25maWc7XHJcbiAgICAgICAgLy8gVG9uZSBpcyBzZW50IG9ubHkgYWZ0ZXIgZXhwbGljaXQgdXNlciBzZWxlY3Rpb24gKG9yIGV4cGxpY2l0IG92ZXJyaWRlKSxcclxuICAgICAgICAvLyBub3QgZnJvbSBkZWZhdWx0IHRvbmUgbWV0YWRhdGEuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lSWQgPSB0b25lT3ZlcnJpZGVJZCB8fCB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lID0gKF9iID0gY29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZmluZCgodG9uZSkgPT4gdG9uZS5pZCA9PT0gc2VsZWN0ZWRUb25lSWQpO1xyXG4gICAgICAgIGNvbnN0IGluc3RydWN0aW9uRm9yUHJvbXB0ID0gaW5zdHJ1Y3Rpb25PdmVycmlkZSAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgID8gaW5zdHJ1Y3Rpb25PdmVycmlkZVxyXG4gICAgICAgICAgICA6IGluc3RydWN0aW9uVGV4dDtcclxuICAgICAgICBjb25zdCBwcm9tcHQgPSAob25CdWlsZEFJUHJvbXB0ID09PSBudWxsIHx8IG9uQnVpbGRBSVByb21wdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25CdWlsZEFJUHJvbXB0KHtcclxuICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCxcclxuICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICB0b25lTGFiZWw6IHNlbGVjdGVkVG9uZSA9PT0gbnVsbCB8fCBzZWxlY3RlZFRvbmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlbGVjdGVkVG9uZS5sYWJlbCxcclxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgfSkpIHx8XHJcbiAgICAgICAgICAgIGJ1aWxkQWN0aW9uUHJvbXB0KHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZyxcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBzZXRJc0dlbmVyYXRpbmcodHJ1ZSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2FjdGlvbl90cmlnZ2VyZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgdGVtcGxhdGVfY2F0ZWdvcnk6IHRlbXBsYXRlVHlwZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvbkFJQWN0aW9uUmVxdWVzdFxyXG4gICAgICAgICAgICAgICAgPyB5aWVsZCBvbkFJQWN0aW9uUmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICA6IHlpZWxkIHJlcXVlc3RBSVN1Z2dlc3Rpb24oe1xyXG4gICAgICAgICAgICAgICAgICAgIGFwaUFkYXB0ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEV4ZWN1dG9yLFxyXG4gICAgICAgICAgICAgICAgICAgIGJhc2VVcmwsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICAgICAgICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnXHJcbiAgICAgICAgICAgICAgICA/IHJlc3VsdC50cmltKClcclxuICAgICAgICAgICAgICAgIDogKChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXN1bHQuYm9keSkgfHwgJycpLnRyaW0oKTtcclxuICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICghcmVnZW5lcmF0ZUV4aXN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQoY3VycmVudFRleHQpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUoYWN0aW9uVHlwZSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbY2FuZGlkYXRlXSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoKHByZXYpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBbLi4ucHJldiwgY2FuZGlkYXRlXS5zbGljZSgwLCBNQVhfU1VHR0VTVElPTlMpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KG5leHQubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignRmFpbGVkIHRvIGdlbmVyYXRlIEFJIHN1Z2dlc3Rpb24nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgIHNldElzR2VuZXJhdGluZyhmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSksIFtcclxuICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgYmFzZVVybCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgY2FuUmVnZW5lcmF0ZSxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpbnN0cnVjdGlvblRleHQsXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgdGVtcGxhdGVJZCxcclxuICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICBvbkVycm9yLFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICAgICAgb25BSUFjdGlvblJlcXVlc3QsXHJcbiAgICAgICAgb25CdWlsZEFJUHJvbXB0LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghYWN0aXZlQ2FuZGlkYXRlIHx8ICFzdWdnZXN0aW9uQmFzZVRleHQgfHwgIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQoYWN0aXZlQ2FuZGlkYXRlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9hY2NlcHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0ge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjdGlvblR5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBlZGl0ZWRFdmVudEVtaXR0ZWQ6IGZhbHNlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgaW5Jbml0aWFsQWlQaGFzZSA9IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IHRhZ1BheWxvYWQgPSBjb21wdXRlQWlUYWdPbkFjY2VwdCh7XHJcbiAgICAgICAgICAgIGJhc2VsaW5lVGV4dDogc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlOiBpbkluaXRpYWxBaVBoYXNlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChpbkluaXRpYWxBaVBoYXNlKSB7XHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRhZ1BheWxvYWQpLCB7IHNvdXJjZTogJ2FjY2VwdCcgfSkpO1xyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNldEVkaXRvclRleHQsXHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCxcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVSZWplY3RTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9kaXNjYXJkZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW2NsZWFyU3VnZ2VzdGlvblNlc3Npb24sIGVtaXRBSUV2ZW50LCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdGVtcGxhdGVJZF0pO1xyXG4gICAgY29uc3QgaGFuZGxlRmVlZGJhY2sgPSB1c2VDYWxsYmFjaygocmF0aW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSgocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XTogcmF0aW5nIH0pKSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXksXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25JbmRleCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBhaUhlYWRlckFjdGlvbnMgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gZW5hYmxlZEFJQWN0aW9ucy5tYXAoKGFjdGlvblR5cGUpID0+IHtcclxuICAgICAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgICAgICBjb25zdCBhY3Rpb25Db25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgICAgICBjb25zdCB0b25lSWQgPSB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGFjdGlvbkNvbmZpZy5sYWJlbCxcclxuICAgICAgICAgICAgICAgIGlzUHJpbWFyeTogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGlzR2VuZXJhdGluZyAmJiBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFjdXJyZW50VGV4dC50cmltKCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGV4dC5sZW5ndGggPFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBpc0dlbmVyYXRpbmcgfHxcclxuICAgICAgICAgICAgICAgICAgICAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSxcclxuICAgICAgICAgICAgICAgIHNob3dUb25lRHJvcGRvd246IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICAhISgoX2EgPSBhY3Rpb25Db25maWcudG9uZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpLFxyXG4gICAgICAgICAgICAgICAgdG9uZXM6IGFjdGlvbkNvbmZpZy50b25lcyxcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkVG9uZUlkOiB0b25lSWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgZW5hYmxlZEFJQWN0aW9ucyxcclxuICAgICAgICBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBtaW5DaGFyc0J5QWN0aW9uLFxyXG4gICAgXSk7XHJcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGFkZFRleHRPcldyYXAsXHJcbiAgICAgICAgICAgIGFkZFRleHQsXHJcbiAgICAgICAgICAgIGdldCgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0Q2FyZXRQb3NpdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2FkZFRleHRPcldyYXAsIGFkZFRleHQsIGN1cnJlbnRUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpbnB1dFZhbHVlID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgfSwgW2lucHV0VmFsdWUsIHNldEVkaXRvclRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFsaW1pdCB8fCAhb25FcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG5leHRFcnJvciA9IGN1cnJlbnRUZXh0Lmxlbmd0aCA+IGxpbWl0ID8gTElNSVRfUkVBQ0hFRCA6IGVycm9yICE9PSBudWxsICYmIGVycm9yICE9PSB2b2lkIDAgPyBlcnJvciA6ICcnO1xyXG4gICAgICAgIGlmIChsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPT09IG5leHRFcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9IG5leHRFcnJvcjtcclxuICAgICAgICBvbkVycm9yKG5leHRFcnJvcik7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIGVycm9yLCBsaW1pdCwgb25FcnJvcl0pO1xyXG4gICAgcmV0dXJuIChfanN4cyhPdXRlckNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pLCBfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkxJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzVXBJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2xpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNsaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkRJU0xJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzRG93bkljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIGNhblJlZ2VuZXJhdGUgPyAoX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogaXNHZW5lcmF0aW5nID8gJ1JlZ2VuZXJhdGluZ+KApicgOiAnUmVnZW5lcmF0ZScsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiUmVnZW5lcmF0ZSBzdWdnZXN0aW9uXCIsIFwiYXJpYS1idXN5XCI6IGlzR2VuZXJhdGluZywgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzR2VuZXJhdGluZywgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IGlzR2VuZXJhdGluZyA/IChfanN4KFJlZ2VuZXJhdGVJY29uU2hpbW1lciwgeyBcImFyaWEtaGlkZGVuXCI6IHRydWUgfSkpIDogKF9qc3goUmV3aW5kSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkpIH0pKSB9KSkpIDogbnVsbCwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNjYXJkXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzY2FyZCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gfSwgeyBjaGlsZHJlbjogX2pzeChDcm9zc0ljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiQWNjZXB0XCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiQWNjZXB0IHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlQWNjZXB0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENoZWNrSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKV0gfSldIH0pKSkgOiBpc0dlbmVyYXRpbmcgPyAoX2pzeHMoRWRpdG9yU2tlbGV0b25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5NiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTIlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg4JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI1NCVcIiB9KV0gfSkpIDogKF9qc3goVGV4dFNwYWNlLCBPYmplY3QuYXNzaWduKHsgcmVmOiB0ZXh0U3BhY2VSZWYgfSwgdGV4dEFyZWFQcm9wcywgeyB2YWx1ZTogY3VycmVudFRleHQsIG9uQ2hhbmdlOiBoYW5kbGVPbkNoYW5nZSwgb25CbHVyOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0UG9zdEVkaXRBaVRhZ1JlY29tcHV0ZShlLnRhcmdldC52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QXJlYU9uQmx1ciA9PT0gbnVsbCB8fCB0ZXh0QXJlYU9uQmx1ciA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dEFyZWFPbkJsdXIoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uUGFzdGU6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhc3RlZFRleHQgPSBlLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3RlZFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSAoX2EgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uU3RhcnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gKF9iID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvbkVuZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogc3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlZmVyIGxpdmUgRE9NIHZhbHVlIOKAlCBgY3VycmVudFRleHRgIGNhbiBsYWcgdGhlIHRleHRhcmVhIGZvciBiaWcgcGFzdGVzLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSAoX2MgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwudmFsdWUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRUZXh0ID0gYmFzZS5zbGljZSgwLCBzdGFydCkgKyBwYXN0ZWRUZXh0ICsgYmFzZS5zbGljZShlbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcmV0ID0gc3RhcnQgKyBwYXN0ZWRUZXh0Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YSA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGEuc2V0U2VsZWN0aW9uUmFuZ2UoY2FyZXQsIGNhcmV0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBpbnZhbGlkIHJhbmdlIGluIGVkZ2UgYnJvd3NlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCByb3dzOiByb3dzIH0pKSksIGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUgPyAoX2pzeHMoSW5zdHJ1Y3Rpb25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhJbnN0cnVjdGlvbklucHV0Um93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0SWNvbiwgeyB3aWR0aDogMTgsIGhlaWdodDogMTgsIGNvbG9yOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnkgfSksIF9qc3goSW5zdHJ1Y3Rpb25JbnB1dCwgeyB2YWx1ZTogaW5zdHJ1Y3Rpb25UZXh0LCBwbGFjZWhvbGRlcjogXCJBZGQgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIHRvIHJlZmluZSB5b3VyIG1lc3NhZ2VcIiwgb25DaGFuZ2U6IChlKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoZS50YXJnZXQudmFsdWUpIH0pLCBfanN4cyhJbnN0cnVjdGlvbkFjdGlvbnMsIHsgY2hpbGRyZW46IFtfanN4KEluc3RydWN0aW9uQ2FuY2VsLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiQ2FuY2VsXCIgfSkpLCBfanN4KEluc3RydWN0aW9uSW1wcm92ZSwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RydWN0aW9uVG9BcHBseSA9IGluc3RydWN0aW9uVGV4dC50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2luc3RydWN0aW9uX3VzZWQnLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbl90eXBlOiBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fdGV4dDogYW5vbnltaXplSW5zdHJ1Y3Rpb25UZXh0KGluc3RydWN0aW9uVG9BcHBseSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSwgZmFsc2UsIGluc3RydWN0aW9uVG9BcHBseSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJJbXByb3ZlXCIgfSkpXSB9KV0gfSksIGluc3RydWN0aW9uVGV4dC50cmltKCkubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5sZW5ndGggPiAwID8gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCwgeyBjaGlsZHJlbjogZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLm1hcCgoc3VnZ2VzdGlvbikgPT4gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgc2VsZWN0ZWQ6IGluc3RydWN0aW9uVGV4dCA9PT0gc3VnZ2VzdGlvbiwgb25DbGljazogKCkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KHN1Z2dlc3Rpb24pIH0sIHsgY2hpbGRyZW46IHN1Z2dlc3Rpb24gfSksIHN1Z2dlc3Rpb24pKSkgfSkpIDogbnVsbF0gfSkpIDogKF9qc3goV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB7IGFjdGlvbnM6IGFjdGlvbnMsIHJlZjogdGV4dFNwYWNlUmVmLCBvbkFjdGlvblNlbGVjdDogb25BY3Rpb25TZWxlY3QsIFJpZ2h0Q29tcG9uZW50OiBSaWdodENvbXBvbmVudCwgcmlnaHRBY3Rpb25zRGlzYWJsZWQ6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIG9uRW1vamlDbGljazogb25FbW9qaUFkZGl0aW9uLCBhaUFjdGlvbnM6IGFpSGVhZGVyQWN0aW9ucywgZGlzYWJsZUFsbEFjdGlvbnM6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIGluc3RydWN0aW9uQWN0aXZlOiBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBvbkFJSW5zdHJ1Y3Rpb25zQ2xpY2s6ICgpID0+IHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUodHJ1ZSksIG9uQUlUb25lQ2hhbmdlOiAoYWN0aW9uVHlwZSwgdG9uZUlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUb25lQnlBY3Rpb24oKHByZXYpID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXYpLCB7IFthY3Rpb25UeXBlXTogdG9uZUlkIH0pKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkFJVG9uZVNlbGVjdCA9PT0gbnVsbCB8fCBvbkFJVG9uZVNlbGVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRvbmVTZWxlY3QoYWN0aW9uVHlwZSwgdG9uZUlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHRvbmVJZCwgQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBvbkFJQWN0aW9uQ2xpY2s6IChhY3Rpb25UeXBlLCBhY3Rpb25WYXJpYW50ID0gQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGFjdGlvbiBzaG91bGQgbm90IHJldHJpZ2dlciBmcm9tIGNoaXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2VuZXJhdGUgaXMgb25seSB2aWEgZXhwbGljaXQgcmVnZW5lcmF0ZSBjb250cm9sLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldyBhY3Rpb24gc3RhcnRzIGEgZnJlc2ggc3VnZ2VzdGlvbiBzZXNzaW9uLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSldIH0pKV0gfSkpO1xyXG59KTtcclxuV2hhdHNBcHBUZXh0RWRpdG9yLmRpc3BsYXlOYW1lID0gJ1doYXRzQXBwVGV4dEVkaXRvcic7XHJcbmV4cG9ydCB7IEFJX1RBR19DSEFOR0VfUkFUSU9fVEhSRVNIT0xELCBjb21wdXRlQWlUYWdPbkFjY2VwdCwgbGV2ZW5zaHRlaW5EaXN0YW5jZSwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2hhdHNBcHBUZXh0RWRpdG9yLmpzLm1hcCJdfQ== */")),L=p.default("div","production"===process.env.NODE_ENV?{target:"ea7i3sh4"}:{target:"ea7i3sh4",label:"InstructionActions"})("production"===process.env.NODE_ENV?{name:"1og3vwv",styles:"display:flex;align-items:center;gap:10px"}:{name:"1og3vwv",styles:"display:flex;align-items:center;gap:10px",map:"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBMEpzQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBPcmlnaW5hbCBwcmVmaWxsIGJvZHkgZm9yIEFJIHRhZyByZWNvbXB1dGU7IHNlZWRlZCBvbmNlLCBuZXZlciB0aGUgbGl2ZSBgY3VycmVudFRleHRgIGZhbGxiYWNrLiAqL1xyXG4gICAgY29uc3QgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZiA9IHVzZVJlZignJyk7XHJcbiAgICBjb25zdCBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZiA9IHVzZVJlZihmYWxzZSk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSAnJztcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghcHJlZmlsbFdhc0FpR2VuZXJhdGVkKSB7XHJcbiAgICAgICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50ID0gJyc7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBzZWVkID0gaW5wdXRWYWx1ZSAhPT0gbnVsbCAmJiBpbnB1dFZhbHVlICE9PSB2b2lkIDAgPyBpbnB1dFZhbHVlIDogJyc7XHJcbiAgICAgICAgaWYgKHNlZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSBzZWVkO1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBpbnB1dFZhbHVlLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChuZXh0VGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCByZWNvbXB1dGVQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCh7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgY3VycmVudEVkaXRlZFRleHQ6IG5leHRUZXh0LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlY29tcHV0ZVBheWxvYWQpLCB7IHNvdXJjZTogJ3Bvc3RfZWRpdF9kZWJvdW5jZScgfSkpO1xyXG4gICAgfSwgW29uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlICYmIHRleHQgIT09IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlKSB7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKHRleHQpO1xyXG4gICAgICAgICAgICB9LCBBSV9UQUdfUkVDT01QVVRFX0lETEVfTVMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXkpIHx8ICcwJyk7XHJcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oY2FjaGVkKSkge1xyXG4gICAgICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KGNhY2hlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgaGlnaGxpZ2h0U3RvcmFnZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKSB7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGVsaWdpYmxlID0gISFjdXJyZW50VGV4dC50cmltKCkgJiYgY3VycmVudFRleHQubGVuZ3RoID49IHJlcGhyYXNlTWluQ2hhcnM7XHJcbiAgICAgICAgaWYgKHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGVsaWdpYmxlO1xyXG4gICAgICAgICAgICBpZiAoZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICAgICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNyb3NzZWRUaHJlc2hvbGQgPSAhcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCAmJiBlbGlnaWJsZTtcclxuICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICBpZiAoY3Jvc3NlZFRocmVzaG9sZCkge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgaXNHZW5lcmF0aW5nLCByZXBocmFzZU1pbkNoYXJzXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXNbc3VnZ2VzdGlvbkluZGV4XSB8fCAnJztcclxuICAgIGNvbnN0IGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlQ2FuZGlkYXRlKVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gYCR7c3VnZ2VzdGlvbkFjdGlvblR5cGV9LSR7c3VnZ2VzdGlvbkluZGV4fS0ke2FjdGl2ZUNhbmRpZGF0ZX1gO1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHN1Z2dlc3Rpb25JbmRleF0pO1xyXG4gICAgY29uc3QgaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUgPSAhIShhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSAmJlxyXG4gICAgICAgIGZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZVthY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleV0pO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvbkJhc2VIdG1sID0gdXNlTWVtbygoKSA9PiBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAnJyksIFtzdWdnZXN0aW9uQmFzZVRleHRdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoYWN0aXZlQ2FuZGlkYXRlKSwgW2FjdGl2ZUNhbmRpZGF0ZV0pO1xyXG4gICAgY29uc3QgY2FuUmVnZW5lcmF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8IE1BWF9TVUdHRVNUSU9OUztcclxuICAgIGNvbnN0IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA9ICEhc3VnZ2VzdGlvbkJhc2VUZXh0ICYmIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA+IDA7XHJcbiAgICBjb25zdCBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggPD0gMSB8fCBzdWdnZXN0aW9uSW5kZXggPD0gMDtcclxuICAgIGNvbnN0IGlzTmV4dFN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8XHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4ID49IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCAtIDE7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IHN1Z2dlc3Rpb25TY3JvbGxSZWYuY3VycmVudDtcclxuICAgICAgICBpZiAoIW5vZGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBub2RlLnNjcm9sbFRvcCA9IG5vZGUuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLCBpc0dlbmVyYXRpbmddKTtcclxuICAgIGNvbnN0IGV4ZWN1dGVBSUFjdGlvbiA9IHVzZUNhbGxiYWNrKChhY3Rpb25UeXBlLCByZWdlbmVyYXRlRXhpc3RpbmcgPSBmYWxzZSwgaW5zdHJ1Y3Rpb25PdmVycmlkZSwgdG9uZU92ZXJyaWRlSWQsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgdmFyIF9iO1xyXG4gICAgICAgIGlmICghb25BSUFjdGlvblJlcXVlc3QgJiZcclxuICAgICAgICAgICAgIWFwaUFkYXB0ZXIgJiZcclxuICAgICAgICAgICAgKCFyZXF1ZXN0RXhlY3V0b3IgfHwgIWJhc2VVcmwpKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignQUkgY29uZmlndXJhdGlvbiBtaXNzaW5nJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjdXJyZW50VGV4dC50cmltKCkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBtaW5DaGFyc0ZvckFjdGlvbiA9IG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIDUwO1xyXG4gICAgICAgIGlmIChjdXJyZW50VGV4dC5sZW5ndGggPCBtaW5DaGFyc0ZvckFjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAocmVnZW5lcmF0ZUV4aXN0aW5nICYmICFjYW5SZWdlbmVyYXRlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgYmFzZUNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVR5cGUgPT09ICd1dGlsaXR5JyAmJlxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50ID09PSBBSUFjdGlvblZhcmlhbnQuUkVQSFJBU0VcclxuICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJhc2VDb25maWcpLCB7IGxhYmVsOiAnUmVwaHJhc2UnLCBiYXNlUHJvbXB0OiBVVElMSVRZX1JFUEhSQVNFX1BST01QVCB9KSA6IGJhc2VDb25maWc7XHJcbiAgICAgICAgLy8gVG9uZSBpcyBzZW50IG9ubHkgYWZ0ZXIgZXhwbGljaXQgdXNlciBzZWxlY3Rpb24gKG9yIGV4cGxpY2l0IG92ZXJyaWRlKSxcclxuICAgICAgICAvLyBub3QgZnJvbSBkZWZhdWx0IHRvbmUgbWV0YWRhdGEuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lSWQgPSB0b25lT3ZlcnJpZGVJZCB8fCB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lID0gKF9iID0gY29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZmluZCgodG9uZSkgPT4gdG9uZS5pZCA9PT0gc2VsZWN0ZWRUb25lSWQpO1xyXG4gICAgICAgIGNvbnN0IGluc3RydWN0aW9uRm9yUHJvbXB0ID0gaW5zdHJ1Y3Rpb25PdmVycmlkZSAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgID8gaW5zdHJ1Y3Rpb25PdmVycmlkZVxyXG4gICAgICAgICAgICA6IGluc3RydWN0aW9uVGV4dDtcclxuICAgICAgICBjb25zdCBwcm9tcHQgPSAob25CdWlsZEFJUHJvbXB0ID09PSBudWxsIHx8IG9uQnVpbGRBSVByb21wdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25CdWlsZEFJUHJvbXB0KHtcclxuICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCxcclxuICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICB0b25lTGFiZWw6IHNlbGVjdGVkVG9uZSA9PT0gbnVsbCB8fCBzZWxlY3RlZFRvbmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlbGVjdGVkVG9uZS5sYWJlbCxcclxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgfSkpIHx8XHJcbiAgICAgICAgICAgIGJ1aWxkQWN0aW9uUHJvbXB0KHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZyxcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBzZXRJc0dlbmVyYXRpbmcodHJ1ZSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2FjdGlvbl90cmlnZ2VyZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgdGVtcGxhdGVfY2F0ZWdvcnk6IHRlbXBsYXRlVHlwZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvbkFJQWN0aW9uUmVxdWVzdFxyXG4gICAgICAgICAgICAgICAgPyB5aWVsZCBvbkFJQWN0aW9uUmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICA6IHlpZWxkIHJlcXVlc3RBSVN1Z2dlc3Rpb24oe1xyXG4gICAgICAgICAgICAgICAgICAgIGFwaUFkYXB0ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEV4ZWN1dG9yLFxyXG4gICAgICAgICAgICAgICAgICAgIGJhc2VVcmwsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICAgICAgICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnXHJcbiAgICAgICAgICAgICAgICA/IHJlc3VsdC50cmltKClcclxuICAgICAgICAgICAgICAgIDogKChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXN1bHQuYm9keSkgfHwgJycpLnRyaW0oKTtcclxuICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICghcmVnZW5lcmF0ZUV4aXN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQoY3VycmVudFRleHQpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUoYWN0aW9uVHlwZSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbY2FuZGlkYXRlXSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoKHByZXYpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBbLi4ucHJldiwgY2FuZGlkYXRlXS5zbGljZSgwLCBNQVhfU1VHR0VTVElPTlMpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KG5leHQubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignRmFpbGVkIHRvIGdlbmVyYXRlIEFJIHN1Z2dlc3Rpb24nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgIHNldElzR2VuZXJhdGluZyhmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSksIFtcclxuICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgYmFzZVVybCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgY2FuUmVnZW5lcmF0ZSxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpbnN0cnVjdGlvblRleHQsXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgdGVtcGxhdGVJZCxcclxuICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICBvbkVycm9yLFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICAgICAgb25BSUFjdGlvblJlcXVlc3QsXHJcbiAgICAgICAgb25CdWlsZEFJUHJvbXB0LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghYWN0aXZlQ2FuZGlkYXRlIHx8ICFzdWdnZXN0aW9uQmFzZVRleHQgfHwgIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQoYWN0aXZlQ2FuZGlkYXRlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9hY2NlcHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0ge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjdGlvblR5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBlZGl0ZWRFdmVudEVtaXR0ZWQ6IGZhbHNlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgaW5Jbml0aWFsQWlQaGFzZSA9IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IHRhZ1BheWxvYWQgPSBjb21wdXRlQWlUYWdPbkFjY2VwdCh7XHJcbiAgICAgICAgICAgIGJhc2VsaW5lVGV4dDogc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlOiBpbkluaXRpYWxBaVBoYXNlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChpbkluaXRpYWxBaVBoYXNlKSB7XHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRhZ1BheWxvYWQpLCB7IHNvdXJjZTogJ2FjY2VwdCcgfSkpO1xyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNldEVkaXRvclRleHQsXHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCxcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVSZWplY3RTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9kaXNjYXJkZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW2NsZWFyU3VnZ2VzdGlvblNlc3Npb24sIGVtaXRBSUV2ZW50LCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdGVtcGxhdGVJZF0pO1xyXG4gICAgY29uc3QgaGFuZGxlRmVlZGJhY2sgPSB1c2VDYWxsYmFjaygocmF0aW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSgocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XTogcmF0aW5nIH0pKSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXksXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25JbmRleCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBhaUhlYWRlckFjdGlvbnMgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gZW5hYmxlZEFJQWN0aW9ucy5tYXAoKGFjdGlvblR5cGUpID0+IHtcclxuICAgICAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgICAgICBjb25zdCBhY3Rpb25Db25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgICAgICBjb25zdCB0b25lSWQgPSB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGFjdGlvbkNvbmZpZy5sYWJlbCxcclxuICAgICAgICAgICAgICAgIGlzUHJpbWFyeTogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGlzR2VuZXJhdGluZyAmJiBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFjdXJyZW50VGV4dC50cmltKCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGV4dC5sZW5ndGggPFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBpc0dlbmVyYXRpbmcgfHxcclxuICAgICAgICAgICAgICAgICAgICAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSxcclxuICAgICAgICAgICAgICAgIHNob3dUb25lRHJvcGRvd246IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICAhISgoX2EgPSBhY3Rpb25Db25maWcudG9uZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpLFxyXG4gICAgICAgICAgICAgICAgdG9uZXM6IGFjdGlvbkNvbmZpZy50b25lcyxcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkVG9uZUlkOiB0b25lSWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgZW5hYmxlZEFJQWN0aW9ucyxcclxuICAgICAgICBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBtaW5DaGFyc0J5QWN0aW9uLFxyXG4gICAgXSk7XHJcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGFkZFRleHRPcldyYXAsXHJcbiAgICAgICAgICAgIGFkZFRleHQsXHJcbiAgICAgICAgICAgIGdldCgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0Q2FyZXRQb3NpdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2FkZFRleHRPcldyYXAsIGFkZFRleHQsIGN1cnJlbnRUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpbnB1dFZhbHVlID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgfSwgW2lucHV0VmFsdWUsIHNldEVkaXRvclRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFsaW1pdCB8fCAhb25FcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG5leHRFcnJvciA9IGN1cnJlbnRUZXh0Lmxlbmd0aCA+IGxpbWl0ID8gTElNSVRfUkVBQ0hFRCA6IGVycm9yICE9PSBudWxsICYmIGVycm9yICE9PSB2b2lkIDAgPyBlcnJvciA6ICcnO1xyXG4gICAgICAgIGlmIChsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPT09IG5leHRFcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9IG5leHRFcnJvcjtcclxuICAgICAgICBvbkVycm9yKG5leHRFcnJvcik7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIGVycm9yLCBsaW1pdCwgb25FcnJvcl0pO1xyXG4gICAgcmV0dXJuIChfanN4cyhPdXRlckNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pLCBfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkxJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzVXBJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2xpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNsaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkRJU0xJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzRG93bkljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIGNhblJlZ2VuZXJhdGUgPyAoX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogaXNHZW5lcmF0aW5nID8gJ1JlZ2VuZXJhdGluZ+KApicgOiAnUmVnZW5lcmF0ZScsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiUmVnZW5lcmF0ZSBzdWdnZXN0aW9uXCIsIFwiYXJpYS1idXN5XCI6IGlzR2VuZXJhdGluZywgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzR2VuZXJhdGluZywgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IGlzR2VuZXJhdGluZyA/IChfanN4KFJlZ2VuZXJhdGVJY29uU2hpbW1lciwgeyBcImFyaWEtaGlkZGVuXCI6IHRydWUgfSkpIDogKF9qc3goUmV3aW5kSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkpIH0pKSB9KSkpIDogbnVsbCwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNjYXJkXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzY2FyZCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gfSwgeyBjaGlsZHJlbjogX2pzeChDcm9zc0ljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiQWNjZXB0XCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiQWNjZXB0IHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlQWNjZXB0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENoZWNrSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKV0gfSldIH0pKSkgOiBpc0dlbmVyYXRpbmcgPyAoX2pzeHMoRWRpdG9yU2tlbGV0b25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5NiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTIlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg4JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI1NCVcIiB9KV0gfSkpIDogKF9qc3goVGV4dFNwYWNlLCBPYmplY3QuYXNzaWduKHsgcmVmOiB0ZXh0U3BhY2VSZWYgfSwgdGV4dEFyZWFQcm9wcywgeyB2YWx1ZTogY3VycmVudFRleHQsIG9uQ2hhbmdlOiBoYW5kbGVPbkNoYW5nZSwgb25CbHVyOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0UG9zdEVkaXRBaVRhZ1JlY29tcHV0ZShlLnRhcmdldC52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QXJlYU9uQmx1ciA9PT0gbnVsbCB8fCB0ZXh0QXJlYU9uQmx1ciA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dEFyZWFPbkJsdXIoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uUGFzdGU6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhc3RlZFRleHQgPSBlLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3RlZFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSAoX2EgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uU3RhcnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gKF9iID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvbkVuZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogc3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlZmVyIGxpdmUgRE9NIHZhbHVlIOKAlCBgY3VycmVudFRleHRgIGNhbiBsYWcgdGhlIHRleHRhcmVhIGZvciBiaWcgcGFzdGVzLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSAoX2MgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwudmFsdWUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRUZXh0ID0gYmFzZS5zbGljZSgwLCBzdGFydCkgKyBwYXN0ZWRUZXh0ICsgYmFzZS5zbGljZShlbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcmV0ID0gc3RhcnQgKyBwYXN0ZWRUZXh0Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YSA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGEuc2V0U2VsZWN0aW9uUmFuZ2UoY2FyZXQsIGNhcmV0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBpbnZhbGlkIHJhbmdlIGluIGVkZ2UgYnJvd3NlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCByb3dzOiByb3dzIH0pKSksIGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUgPyAoX2pzeHMoSW5zdHJ1Y3Rpb25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhJbnN0cnVjdGlvbklucHV0Um93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0SWNvbiwgeyB3aWR0aDogMTgsIGhlaWdodDogMTgsIGNvbG9yOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnkgfSksIF9qc3goSW5zdHJ1Y3Rpb25JbnB1dCwgeyB2YWx1ZTogaW5zdHJ1Y3Rpb25UZXh0LCBwbGFjZWhvbGRlcjogXCJBZGQgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIHRvIHJlZmluZSB5b3VyIG1lc3NhZ2VcIiwgb25DaGFuZ2U6IChlKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoZS50YXJnZXQudmFsdWUpIH0pLCBfanN4cyhJbnN0cnVjdGlvbkFjdGlvbnMsIHsgY2hpbGRyZW46IFtfanN4KEluc3RydWN0aW9uQ2FuY2VsLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiQ2FuY2VsXCIgfSkpLCBfanN4KEluc3RydWN0aW9uSW1wcm92ZSwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RydWN0aW9uVG9BcHBseSA9IGluc3RydWN0aW9uVGV4dC50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2luc3RydWN0aW9uX3VzZWQnLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbl90eXBlOiBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fdGV4dDogYW5vbnltaXplSW5zdHJ1Y3Rpb25UZXh0KGluc3RydWN0aW9uVG9BcHBseSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSwgZmFsc2UsIGluc3RydWN0aW9uVG9BcHBseSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJJbXByb3ZlXCIgfSkpXSB9KV0gfSksIGluc3RydWN0aW9uVGV4dC50cmltKCkubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5sZW5ndGggPiAwID8gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCwgeyBjaGlsZHJlbjogZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLm1hcCgoc3VnZ2VzdGlvbikgPT4gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgc2VsZWN0ZWQ6IGluc3RydWN0aW9uVGV4dCA9PT0gc3VnZ2VzdGlvbiwgb25DbGljazogKCkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KHN1Z2dlc3Rpb24pIH0sIHsgY2hpbGRyZW46IHN1Z2dlc3Rpb24gfSksIHN1Z2dlc3Rpb24pKSkgfSkpIDogbnVsbF0gfSkpIDogKF9qc3goV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB7IGFjdGlvbnM6IGFjdGlvbnMsIHJlZjogdGV4dFNwYWNlUmVmLCBvbkFjdGlvblNlbGVjdDogb25BY3Rpb25TZWxlY3QsIFJpZ2h0Q29tcG9uZW50OiBSaWdodENvbXBvbmVudCwgcmlnaHRBY3Rpb25zRGlzYWJsZWQ6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIG9uRW1vamlDbGljazogb25FbW9qaUFkZGl0aW9uLCBhaUFjdGlvbnM6IGFpSGVhZGVyQWN0aW9ucywgZGlzYWJsZUFsbEFjdGlvbnM6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIGluc3RydWN0aW9uQWN0aXZlOiBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBvbkFJSW5zdHJ1Y3Rpb25zQ2xpY2s6ICgpID0+IHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUodHJ1ZSksIG9uQUlUb25lQ2hhbmdlOiAoYWN0aW9uVHlwZSwgdG9uZUlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUb25lQnlBY3Rpb24oKHByZXYpID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXYpLCB7IFthY3Rpb25UeXBlXTogdG9uZUlkIH0pKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkFJVG9uZVNlbGVjdCA9PT0gbnVsbCB8fCBvbkFJVG9uZVNlbGVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRvbmVTZWxlY3QoYWN0aW9uVHlwZSwgdG9uZUlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHRvbmVJZCwgQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBvbkFJQWN0aW9uQ2xpY2s6IChhY3Rpb25UeXBlLCBhY3Rpb25WYXJpYW50ID0gQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGFjdGlvbiBzaG91bGQgbm90IHJldHJpZ2dlciBmcm9tIGNoaXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2VuZXJhdGUgaXMgb25seSB2aWEgZXhwbGljaXQgcmVnZW5lcmF0ZSBjb250cm9sLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldyBhY3Rpb24gc3RhcnRzIGEgZnJlc2ggc3VnZ2VzdGlvbiBzZXNzaW9uLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSldIH0pKV0gfSkpO1xyXG59KTtcclxuV2hhdHNBcHBUZXh0RWRpdG9yLmRpc3BsYXlOYW1lID0gJ1doYXRzQXBwVGV4dEVkaXRvcic7XHJcbmV4cG9ydCB7IEFJX1RBR19DSEFOR0VfUkFUSU9fVEhSRVNIT0xELCBjb21wdXRlQWlUYWdPbkFjY2VwdCwgbGV2ZW5zaHRlaW5EaXN0YW5jZSwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2hhdHNBcHBUZXh0RWRpdG9yLmpzLm1hcCJdfQ== */",toString:a}),K=p.default("button","production"===process.env.NODE_ENV?{target:"ea7i3sh3"}:{target:"ea7i3sh3",label:"InstructionCancel"})("border:0;background:transparent;color:",B.COLORS.content.secondary,";font-size:14px;font-weight:500;padding:0;cursor:pointer;"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBK0p3QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBPcmlnaW5hbCBwcmVmaWxsIGJvZHkgZm9yIEFJIHRhZyByZWNvbXB1dGU7IHNlZWRlZCBvbmNlLCBuZXZlciB0aGUgbGl2ZSBgY3VycmVudFRleHRgIGZhbGxiYWNrLiAqL1xyXG4gICAgY29uc3QgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZiA9IHVzZVJlZignJyk7XHJcbiAgICBjb25zdCBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZiA9IHVzZVJlZihmYWxzZSk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSAnJztcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghcHJlZmlsbFdhc0FpR2VuZXJhdGVkKSB7XHJcbiAgICAgICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50ID0gJyc7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBzZWVkID0gaW5wdXRWYWx1ZSAhPT0gbnVsbCAmJiBpbnB1dFZhbHVlICE9PSB2b2lkIDAgPyBpbnB1dFZhbHVlIDogJyc7XHJcbiAgICAgICAgaWYgKHNlZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSBzZWVkO1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBpbnB1dFZhbHVlLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChuZXh0VGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCByZWNvbXB1dGVQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCh7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgY3VycmVudEVkaXRlZFRleHQ6IG5leHRUZXh0LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlY29tcHV0ZVBheWxvYWQpLCB7IHNvdXJjZTogJ3Bvc3RfZWRpdF9kZWJvdW5jZScgfSkpO1xyXG4gICAgfSwgW29uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlICYmIHRleHQgIT09IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlKSB7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKHRleHQpO1xyXG4gICAgICAgICAgICB9LCBBSV9UQUdfUkVDT01QVVRFX0lETEVfTVMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXkpIHx8ICcwJyk7XHJcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oY2FjaGVkKSkge1xyXG4gICAgICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KGNhY2hlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgaGlnaGxpZ2h0U3RvcmFnZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKSB7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGVsaWdpYmxlID0gISFjdXJyZW50VGV4dC50cmltKCkgJiYgY3VycmVudFRleHQubGVuZ3RoID49IHJlcGhyYXNlTWluQ2hhcnM7XHJcbiAgICAgICAgaWYgKHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGVsaWdpYmxlO1xyXG4gICAgICAgICAgICBpZiAoZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICAgICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNyb3NzZWRUaHJlc2hvbGQgPSAhcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCAmJiBlbGlnaWJsZTtcclxuICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICBpZiAoY3Jvc3NlZFRocmVzaG9sZCkge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgaXNHZW5lcmF0aW5nLCByZXBocmFzZU1pbkNoYXJzXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXNbc3VnZ2VzdGlvbkluZGV4XSB8fCAnJztcclxuICAgIGNvbnN0IGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlQ2FuZGlkYXRlKVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gYCR7c3VnZ2VzdGlvbkFjdGlvblR5cGV9LSR7c3VnZ2VzdGlvbkluZGV4fS0ke2FjdGl2ZUNhbmRpZGF0ZX1gO1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHN1Z2dlc3Rpb25JbmRleF0pO1xyXG4gICAgY29uc3QgaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUgPSAhIShhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSAmJlxyXG4gICAgICAgIGZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZVthY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleV0pO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvbkJhc2VIdG1sID0gdXNlTWVtbygoKSA9PiBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAnJyksIFtzdWdnZXN0aW9uQmFzZVRleHRdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoYWN0aXZlQ2FuZGlkYXRlKSwgW2FjdGl2ZUNhbmRpZGF0ZV0pO1xyXG4gICAgY29uc3QgY2FuUmVnZW5lcmF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8IE1BWF9TVUdHRVNUSU9OUztcclxuICAgIGNvbnN0IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA9ICEhc3VnZ2VzdGlvbkJhc2VUZXh0ICYmIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA+IDA7XHJcbiAgICBjb25zdCBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggPD0gMSB8fCBzdWdnZXN0aW9uSW5kZXggPD0gMDtcclxuICAgIGNvbnN0IGlzTmV4dFN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8XHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4ID49IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCAtIDE7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IHN1Z2dlc3Rpb25TY3JvbGxSZWYuY3VycmVudDtcclxuICAgICAgICBpZiAoIW5vZGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBub2RlLnNjcm9sbFRvcCA9IG5vZGUuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLCBpc0dlbmVyYXRpbmddKTtcclxuICAgIGNvbnN0IGV4ZWN1dGVBSUFjdGlvbiA9IHVzZUNhbGxiYWNrKChhY3Rpb25UeXBlLCByZWdlbmVyYXRlRXhpc3RpbmcgPSBmYWxzZSwgaW5zdHJ1Y3Rpb25PdmVycmlkZSwgdG9uZU92ZXJyaWRlSWQsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgdmFyIF9iO1xyXG4gICAgICAgIGlmICghb25BSUFjdGlvblJlcXVlc3QgJiZcclxuICAgICAgICAgICAgIWFwaUFkYXB0ZXIgJiZcclxuICAgICAgICAgICAgKCFyZXF1ZXN0RXhlY3V0b3IgfHwgIWJhc2VVcmwpKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignQUkgY29uZmlndXJhdGlvbiBtaXNzaW5nJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjdXJyZW50VGV4dC50cmltKCkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBtaW5DaGFyc0ZvckFjdGlvbiA9IG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIDUwO1xyXG4gICAgICAgIGlmIChjdXJyZW50VGV4dC5sZW5ndGggPCBtaW5DaGFyc0ZvckFjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAocmVnZW5lcmF0ZUV4aXN0aW5nICYmICFjYW5SZWdlbmVyYXRlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgYmFzZUNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVR5cGUgPT09ICd1dGlsaXR5JyAmJlxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50ID09PSBBSUFjdGlvblZhcmlhbnQuUkVQSFJBU0VcclxuICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJhc2VDb25maWcpLCB7IGxhYmVsOiAnUmVwaHJhc2UnLCBiYXNlUHJvbXB0OiBVVElMSVRZX1JFUEhSQVNFX1BST01QVCB9KSA6IGJhc2VDb25maWc7XHJcbiAgICAgICAgLy8gVG9uZSBpcyBzZW50IG9ubHkgYWZ0ZXIgZXhwbGljaXQgdXNlciBzZWxlY3Rpb24gKG9yIGV4cGxpY2l0IG92ZXJyaWRlKSxcclxuICAgICAgICAvLyBub3QgZnJvbSBkZWZhdWx0IHRvbmUgbWV0YWRhdGEuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lSWQgPSB0b25lT3ZlcnJpZGVJZCB8fCB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lID0gKF9iID0gY29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZmluZCgodG9uZSkgPT4gdG9uZS5pZCA9PT0gc2VsZWN0ZWRUb25lSWQpO1xyXG4gICAgICAgIGNvbnN0IGluc3RydWN0aW9uRm9yUHJvbXB0ID0gaW5zdHJ1Y3Rpb25PdmVycmlkZSAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgID8gaW5zdHJ1Y3Rpb25PdmVycmlkZVxyXG4gICAgICAgICAgICA6IGluc3RydWN0aW9uVGV4dDtcclxuICAgICAgICBjb25zdCBwcm9tcHQgPSAob25CdWlsZEFJUHJvbXB0ID09PSBudWxsIHx8IG9uQnVpbGRBSVByb21wdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25CdWlsZEFJUHJvbXB0KHtcclxuICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCxcclxuICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICB0b25lTGFiZWw6IHNlbGVjdGVkVG9uZSA9PT0gbnVsbCB8fCBzZWxlY3RlZFRvbmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlbGVjdGVkVG9uZS5sYWJlbCxcclxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgfSkpIHx8XHJcbiAgICAgICAgICAgIGJ1aWxkQWN0aW9uUHJvbXB0KHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZyxcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBzZXRJc0dlbmVyYXRpbmcodHJ1ZSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2FjdGlvbl90cmlnZ2VyZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgdGVtcGxhdGVfY2F0ZWdvcnk6IHRlbXBsYXRlVHlwZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvbkFJQWN0aW9uUmVxdWVzdFxyXG4gICAgICAgICAgICAgICAgPyB5aWVsZCBvbkFJQWN0aW9uUmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICA6IHlpZWxkIHJlcXVlc3RBSVN1Z2dlc3Rpb24oe1xyXG4gICAgICAgICAgICAgICAgICAgIGFwaUFkYXB0ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEV4ZWN1dG9yLFxyXG4gICAgICAgICAgICAgICAgICAgIGJhc2VVcmwsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICAgICAgICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnXHJcbiAgICAgICAgICAgICAgICA/IHJlc3VsdC50cmltKClcclxuICAgICAgICAgICAgICAgIDogKChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXN1bHQuYm9keSkgfHwgJycpLnRyaW0oKTtcclxuICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICghcmVnZW5lcmF0ZUV4aXN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQoY3VycmVudFRleHQpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUoYWN0aW9uVHlwZSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbY2FuZGlkYXRlXSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoKHByZXYpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBbLi4ucHJldiwgY2FuZGlkYXRlXS5zbGljZSgwLCBNQVhfU1VHR0VTVElPTlMpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KG5leHQubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignRmFpbGVkIHRvIGdlbmVyYXRlIEFJIHN1Z2dlc3Rpb24nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgIHNldElzR2VuZXJhdGluZyhmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSksIFtcclxuICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgYmFzZVVybCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgY2FuUmVnZW5lcmF0ZSxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpbnN0cnVjdGlvblRleHQsXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgdGVtcGxhdGVJZCxcclxuICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICBvbkVycm9yLFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICAgICAgb25BSUFjdGlvblJlcXVlc3QsXHJcbiAgICAgICAgb25CdWlsZEFJUHJvbXB0LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghYWN0aXZlQ2FuZGlkYXRlIHx8ICFzdWdnZXN0aW9uQmFzZVRleHQgfHwgIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQoYWN0aXZlQ2FuZGlkYXRlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9hY2NlcHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0ge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjdGlvblR5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBlZGl0ZWRFdmVudEVtaXR0ZWQ6IGZhbHNlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgaW5Jbml0aWFsQWlQaGFzZSA9IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IHRhZ1BheWxvYWQgPSBjb21wdXRlQWlUYWdPbkFjY2VwdCh7XHJcbiAgICAgICAgICAgIGJhc2VsaW5lVGV4dDogc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlOiBpbkluaXRpYWxBaVBoYXNlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChpbkluaXRpYWxBaVBoYXNlKSB7XHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRhZ1BheWxvYWQpLCB7IHNvdXJjZTogJ2FjY2VwdCcgfSkpO1xyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNldEVkaXRvclRleHQsXHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCxcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVSZWplY3RTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9kaXNjYXJkZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW2NsZWFyU3VnZ2VzdGlvblNlc3Npb24sIGVtaXRBSUV2ZW50LCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdGVtcGxhdGVJZF0pO1xyXG4gICAgY29uc3QgaGFuZGxlRmVlZGJhY2sgPSB1c2VDYWxsYmFjaygocmF0aW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSgocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XTogcmF0aW5nIH0pKSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXksXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25JbmRleCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBhaUhlYWRlckFjdGlvbnMgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gZW5hYmxlZEFJQWN0aW9ucy5tYXAoKGFjdGlvblR5cGUpID0+IHtcclxuICAgICAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgICAgICBjb25zdCBhY3Rpb25Db25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgICAgICBjb25zdCB0b25lSWQgPSB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGFjdGlvbkNvbmZpZy5sYWJlbCxcclxuICAgICAgICAgICAgICAgIGlzUHJpbWFyeTogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGlzR2VuZXJhdGluZyAmJiBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFjdXJyZW50VGV4dC50cmltKCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGV4dC5sZW5ndGggPFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBpc0dlbmVyYXRpbmcgfHxcclxuICAgICAgICAgICAgICAgICAgICAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSxcclxuICAgICAgICAgICAgICAgIHNob3dUb25lRHJvcGRvd246IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICAhISgoX2EgPSBhY3Rpb25Db25maWcudG9uZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpLFxyXG4gICAgICAgICAgICAgICAgdG9uZXM6IGFjdGlvbkNvbmZpZy50b25lcyxcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkVG9uZUlkOiB0b25lSWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgZW5hYmxlZEFJQWN0aW9ucyxcclxuICAgICAgICBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBtaW5DaGFyc0J5QWN0aW9uLFxyXG4gICAgXSk7XHJcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGFkZFRleHRPcldyYXAsXHJcbiAgICAgICAgICAgIGFkZFRleHQsXHJcbiAgICAgICAgICAgIGdldCgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0Q2FyZXRQb3NpdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2FkZFRleHRPcldyYXAsIGFkZFRleHQsIGN1cnJlbnRUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpbnB1dFZhbHVlID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgfSwgW2lucHV0VmFsdWUsIHNldEVkaXRvclRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFsaW1pdCB8fCAhb25FcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG5leHRFcnJvciA9IGN1cnJlbnRUZXh0Lmxlbmd0aCA+IGxpbWl0ID8gTElNSVRfUkVBQ0hFRCA6IGVycm9yICE9PSBudWxsICYmIGVycm9yICE9PSB2b2lkIDAgPyBlcnJvciA6ICcnO1xyXG4gICAgICAgIGlmIChsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPT09IG5leHRFcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9IG5leHRFcnJvcjtcclxuICAgICAgICBvbkVycm9yKG5leHRFcnJvcik7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIGVycm9yLCBsaW1pdCwgb25FcnJvcl0pO1xyXG4gICAgcmV0dXJuIChfanN4cyhPdXRlckNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pLCBfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkxJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzVXBJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2xpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNsaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkRJU0xJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzRG93bkljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIGNhblJlZ2VuZXJhdGUgPyAoX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogaXNHZW5lcmF0aW5nID8gJ1JlZ2VuZXJhdGluZ+KApicgOiAnUmVnZW5lcmF0ZScsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiUmVnZW5lcmF0ZSBzdWdnZXN0aW9uXCIsIFwiYXJpYS1idXN5XCI6IGlzR2VuZXJhdGluZywgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzR2VuZXJhdGluZywgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IGlzR2VuZXJhdGluZyA/IChfanN4KFJlZ2VuZXJhdGVJY29uU2hpbW1lciwgeyBcImFyaWEtaGlkZGVuXCI6IHRydWUgfSkpIDogKF9qc3goUmV3aW5kSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkpIH0pKSB9KSkpIDogbnVsbCwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNjYXJkXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzY2FyZCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gfSwgeyBjaGlsZHJlbjogX2pzeChDcm9zc0ljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiQWNjZXB0XCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiQWNjZXB0IHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlQWNjZXB0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENoZWNrSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKV0gfSldIH0pKSkgOiBpc0dlbmVyYXRpbmcgPyAoX2pzeHMoRWRpdG9yU2tlbGV0b25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5NiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTIlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg4JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI1NCVcIiB9KV0gfSkpIDogKF9qc3goVGV4dFNwYWNlLCBPYmplY3QuYXNzaWduKHsgcmVmOiB0ZXh0U3BhY2VSZWYgfSwgdGV4dEFyZWFQcm9wcywgeyB2YWx1ZTogY3VycmVudFRleHQsIG9uQ2hhbmdlOiBoYW5kbGVPbkNoYW5nZSwgb25CbHVyOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0UG9zdEVkaXRBaVRhZ1JlY29tcHV0ZShlLnRhcmdldC52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QXJlYU9uQmx1ciA9PT0gbnVsbCB8fCB0ZXh0QXJlYU9uQmx1ciA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dEFyZWFPbkJsdXIoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uUGFzdGU6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhc3RlZFRleHQgPSBlLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3RlZFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSAoX2EgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uU3RhcnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gKF9iID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvbkVuZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogc3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlZmVyIGxpdmUgRE9NIHZhbHVlIOKAlCBgY3VycmVudFRleHRgIGNhbiBsYWcgdGhlIHRleHRhcmVhIGZvciBiaWcgcGFzdGVzLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSAoX2MgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwudmFsdWUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRUZXh0ID0gYmFzZS5zbGljZSgwLCBzdGFydCkgKyBwYXN0ZWRUZXh0ICsgYmFzZS5zbGljZShlbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcmV0ID0gc3RhcnQgKyBwYXN0ZWRUZXh0Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YSA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGEuc2V0U2VsZWN0aW9uUmFuZ2UoY2FyZXQsIGNhcmV0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBpbnZhbGlkIHJhbmdlIGluIGVkZ2UgYnJvd3NlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCByb3dzOiByb3dzIH0pKSksIGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUgPyAoX2pzeHMoSW5zdHJ1Y3Rpb25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhJbnN0cnVjdGlvbklucHV0Um93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0SWNvbiwgeyB3aWR0aDogMTgsIGhlaWdodDogMTgsIGNvbG9yOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnkgfSksIF9qc3goSW5zdHJ1Y3Rpb25JbnB1dCwgeyB2YWx1ZTogaW5zdHJ1Y3Rpb25UZXh0LCBwbGFjZWhvbGRlcjogXCJBZGQgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIHRvIHJlZmluZSB5b3VyIG1lc3NhZ2VcIiwgb25DaGFuZ2U6IChlKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoZS50YXJnZXQudmFsdWUpIH0pLCBfanN4cyhJbnN0cnVjdGlvbkFjdGlvbnMsIHsgY2hpbGRyZW46IFtfanN4KEluc3RydWN0aW9uQ2FuY2VsLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiQ2FuY2VsXCIgfSkpLCBfanN4KEluc3RydWN0aW9uSW1wcm92ZSwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RydWN0aW9uVG9BcHBseSA9IGluc3RydWN0aW9uVGV4dC50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2luc3RydWN0aW9uX3VzZWQnLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbl90eXBlOiBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fdGV4dDogYW5vbnltaXplSW5zdHJ1Y3Rpb25UZXh0KGluc3RydWN0aW9uVG9BcHBseSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSwgZmFsc2UsIGluc3RydWN0aW9uVG9BcHBseSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJJbXByb3ZlXCIgfSkpXSB9KV0gfSksIGluc3RydWN0aW9uVGV4dC50cmltKCkubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5sZW5ndGggPiAwID8gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCwgeyBjaGlsZHJlbjogZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLm1hcCgoc3VnZ2VzdGlvbikgPT4gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgc2VsZWN0ZWQ6IGluc3RydWN0aW9uVGV4dCA9PT0gc3VnZ2VzdGlvbiwgb25DbGljazogKCkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KHN1Z2dlc3Rpb24pIH0sIHsgY2hpbGRyZW46IHN1Z2dlc3Rpb24gfSksIHN1Z2dlc3Rpb24pKSkgfSkpIDogbnVsbF0gfSkpIDogKF9qc3goV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB7IGFjdGlvbnM6IGFjdGlvbnMsIHJlZjogdGV4dFNwYWNlUmVmLCBvbkFjdGlvblNlbGVjdDogb25BY3Rpb25TZWxlY3QsIFJpZ2h0Q29tcG9uZW50OiBSaWdodENvbXBvbmVudCwgcmlnaHRBY3Rpb25zRGlzYWJsZWQ6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIG9uRW1vamlDbGljazogb25FbW9qaUFkZGl0aW9uLCBhaUFjdGlvbnM6IGFpSGVhZGVyQWN0aW9ucywgZGlzYWJsZUFsbEFjdGlvbnM6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIGluc3RydWN0aW9uQWN0aXZlOiBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBvbkFJSW5zdHJ1Y3Rpb25zQ2xpY2s6ICgpID0+IHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUodHJ1ZSksIG9uQUlUb25lQ2hhbmdlOiAoYWN0aW9uVHlwZSwgdG9uZUlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUb25lQnlBY3Rpb24oKHByZXYpID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXYpLCB7IFthY3Rpb25UeXBlXTogdG9uZUlkIH0pKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkFJVG9uZVNlbGVjdCA9PT0gbnVsbCB8fCBvbkFJVG9uZVNlbGVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRvbmVTZWxlY3QoYWN0aW9uVHlwZSwgdG9uZUlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHRvbmVJZCwgQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBvbkFJQWN0aW9uQ2xpY2s6IChhY3Rpb25UeXBlLCBhY3Rpb25WYXJpYW50ID0gQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGFjdGlvbiBzaG91bGQgbm90IHJldHJpZ2dlciBmcm9tIGNoaXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2VuZXJhdGUgaXMgb25seSB2aWEgZXhwbGljaXQgcmVnZW5lcmF0ZSBjb250cm9sLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldyBhY3Rpb24gc3RhcnRzIGEgZnJlc2ggc3VnZ2VzdGlvbiBzZXNzaW9uLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSldIH0pKV0gfSkpO1xyXG59KTtcclxuV2hhdHNBcHBUZXh0RWRpdG9yLmRpc3BsYXlOYW1lID0gJ1doYXRzQXBwVGV4dEVkaXRvcic7XHJcbmV4cG9ydCB7IEFJX1RBR19DSEFOR0VfUkFUSU9fVEhSRVNIT0xELCBjb21wdXRlQWlUYWdPbkFjY2VwdCwgbGV2ZW5zaHRlaW5EaXN0YW5jZSwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2hhdHNBcHBUZXh0RWRpdG9yLmpzLm1hcCJdfQ== */")),O=p.default("button","production"===process.env.NODE_ENV?{target:"ea7i3sh2"}:{target:"ea7i3sh2",label:"InstructionImprove"})("border:1px solid #5d3a72;color:#5d3a72;background:",B.COLORS.surface.standard,";border-radius:8px;padding:8px 14px;font-size:14px;line-height:1.1;font-weight:600;cursor:pointer;"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBd0t5QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBPcmlnaW5hbCBwcmVmaWxsIGJvZHkgZm9yIEFJIHRhZyByZWNvbXB1dGU7IHNlZWRlZCBvbmNlLCBuZXZlciB0aGUgbGl2ZSBgY3VycmVudFRleHRgIGZhbGxiYWNrLiAqL1xyXG4gICAgY29uc3QgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZiA9IHVzZVJlZignJyk7XHJcbiAgICBjb25zdCBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZiA9IHVzZVJlZihmYWxzZSk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSAnJztcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghcHJlZmlsbFdhc0FpR2VuZXJhdGVkKSB7XHJcbiAgICAgICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50ID0gJyc7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBzZWVkID0gaW5wdXRWYWx1ZSAhPT0gbnVsbCAmJiBpbnB1dFZhbHVlICE9PSB2b2lkIDAgPyBpbnB1dFZhbHVlIDogJyc7XHJcbiAgICAgICAgaWYgKHNlZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSBzZWVkO1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBpbnB1dFZhbHVlLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChuZXh0VGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCByZWNvbXB1dGVQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCh7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgY3VycmVudEVkaXRlZFRleHQ6IG5leHRUZXh0LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlY29tcHV0ZVBheWxvYWQpLCB7IHNvdXJjZTogJ3Bvc3RfZWRpdF9kZWJvdW5jZScgfSkpO1xyXG4gICAgfSwgW29uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlICYmIHRleHQgIT09IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlKSB7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKHRleHQpO1xyXG4gICAgICAgICAgICB9LCBBSV9UQUdfUkVDT01QVVRFX0lETEVfTVMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXkpIHx8ICcwJyk7XHJcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oY2FjaGVkKSkge1xyXG4gICAgICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KGNhY2hlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgaGlnaGxpZ2h0U3RvcmFnZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKSB7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGVsaWdpYmxlID0gISFjdXJyZW50VGV4dC50cmltKCkgJiYgY3VycmVudFRleHQubGVuZ3RoID49IHJlcGhyYXNlTWluQ2hhcnM7XHJcbiAgICAgICAgaWYgKHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGVsaWdpYmxlO1xyXG4gICAgICAgICAgICBpZiAoZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICAgICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNyb3NzZWRUaHJlc2hvbGQgPSAhcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCAmJiBlbGlnaWJsZTtcclxuICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICBpZiAoY3Jvc3NlZFRocmVzaG9sZCkge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgaXNHZW5lcmF0aW5nLCByZXBocmFzZU1pbkNoYXJzXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXNbc3VnZ2VzdGlvbkluZGV4XSB8fCAnJztcclxuICAgIGNvbnN0IGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlQ2FuZGlkYXRlKVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gYCR7c3VnZ2VzdGlvbkFjdGlvblR5cGV9LSR7c3VnZ2VzdGlvbkluZGV4fS0ke2FjdGl2ZUNhbmRpZGF0ZX1gO1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHN1Z2dlc3Rpb25JbmRleF0pO1xyXG4gICAgY29uc3QgaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUgPSAhIShhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSAmJlxyXG4gICAgICAgIGZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZVthY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleV0pO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvbkJhc2VIdG1sID0gdXNlTWVtbygoKSA9PiBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAnJyksIFtzdWdnZXN0aW9uQmFzZVRleHRdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoYWN0aXZlQ2FuZGlkYXRlKSwgW2FjdGl2ZUNhbmRpZGF0ZV0pO1xyXG4gICAgY29uc3QgY2FuUmVnZW5lcmF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8IE1BWF9TVUdHRVNUSU9OUztcclxuICAgIGNvbnN0IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA9ICEhc3VnZ2VzdGlvbkJhc2VUZXh0ICYmIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA+IDA7XHJcbiAgICBjb25zdCBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggPD0gMSB8fCBzdWdnZXN0aW9uSW5kZXggPD0gMDtcclxuICAgIGNvbnN0IGlzTmV4dFN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8XHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4ID49IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCAtIDE7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IHN1Z2dlc3Rpb25TY3JvbGxSZWYuY3VycmVudDtcclxuICAgICAgICBpZiAoIW5vZGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBub2RlLnNjcm9sbFRvcCA9IG5vZGUuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLCBpc0dlbmVyYXRpbmddKTtcclxuICAgIGNvbnN0IGV4ZWN1dGVBSUFjdGlvbiA9IHVzZUNhbGxiYWNrKChhY3Rpb25UeXBlLCByZWdlbmVyYXRlRXhpc3RpbmcgPSBmYWxzZSwgaW5zdHJ1Y3Rpb25PdmVycmlkZSwgdG9uZU92ZXJyaWRlSWQsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgdmFyIF9iO1xyXG4gICAgICAgIGlmICghb25BSUFjdGlvblJlcXVlc3QgJiZcclxuICAgICAgICAgICAgIWFwaUFkYXB0ZXIgJiZcclxuICAgICAgICAgICAgKCFyZXF1ZXN0RXhlY3V0b3IgfHwgIWJhc2VVcmwpKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignQUkgY29uZmlndXJhdGlvbiBtaXNzaW5nJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjdXJyZW50VGV4dC50cmltKCkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBtaW5DaGFyc0ZvckFjdGlvbiA9IG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIDUwO1xyXG4gICAgICAgIGlmIChjdXJyZW50VGV4dC5sZW5ndGggPCBtaW5DaGFyc0ZvckFjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAocmVnZW5lcmF0ZUV4aXN0aW5nICYmICFjYW5SZWdlbmVyYXRlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgYmFzZUNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVR5cGUgPT09ICd1dGlsaXR5JyAmJlxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50ID09PSBBSUFjdGlvblZhcmlhbnQuUkVQSFJBU0VcclxuICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJhc2VDb25maWcpLCB7IGxhYmVsOiAnUmVwaHJhc2UnLCBiYXNlUHJvbXB0OiBVVElMSVRZX1JFUEhSQVNFX1BST01QVCB9KSA6IGJhc2VDb25maWc7XHJcbiAgICAgICAgLy8gVG9uZSBpcyBzZW50IG9ubHkgYWZ0ZXIgZXhwbGljaXQgdXNlciBzZWxlY3Rpb24gKG9yIGV4cGxpY2l0IG92ZXJyaWRlKSxcclxuICAgICAgICAvLyBub3QgZnJvbSBkZWZhdWx0IHRvbmUgbWV0YWRhdGEuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lSWQgPSB0b25lT3ZlcnJpZGVJZCB8fCB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lID0gKF9iID0gY29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZmluZCgodG9uZSkgPT4gdG9uZS5pZCA9PT0gc2VsZWN0ZWRUb25lSWQpO1xyXG4gICAgICAgIGNvbnN0IGluc3RydWN0aW9uRm9yUHJvbXB0ID0gaW5zdHJ1Y3Rpb25PdmVycmlkZSAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgID8gaW5zdHJ1Y3Rpb25PdmVycmlkZVxyXG4gICAgICAgICAgICA6IGluc3RydWN0aW9uVGV4dDtcclxuICAgICAgICBjb25zdCBwcm9tcHQgPSAob25CdWlsZEFJUHJvbXB0ID09PSBudWxsIHx8IG9uQnVpbGRBSVByb21wdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25CdWlsZEFJUHJvbXB0KHtcclxuICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCxcclxuICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICB0b25lTGFiZWw6IHNlbGVjdGVkVG9uZSA9PT0gbnVsbCB8fCBzZWxlY3RlZFRvbmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlbGVjdGVkVG9uZS5sYWJlbCxcclxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgfSkpIHx8XHJcbiAgICAgICAgICAgIGJ1aWxkQWN0aW9uUHJvbXB0KHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZyxcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBzZXRJc0dlbmVyYXRpbmcodHJ1ZSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2FjdGlvbl90cmlnZ2VyZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgdGVtcGxhdGVfY2F0ZWdvcnk6IHRlbXBsYXRlVHlwZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvbkFJQWN0aW9uUmVxdWVzdFxyXG4gICAgICAgICAgICAgICAgPyB5aWVsZCBvbkFJQWN0aW9uUmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICA6IHlpZWxkIHJlcXVlc3RBSVN1Z2dlc3Rpb24oe1xyXG4gICAgICAgICAgICAgICAgICAgIGFwaUFkYXB0ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEV4ZWN1dG9yLFxyXG4gICAgICAgICAgICAgICAgICAgIGJhc2VVcmwsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICAgICAgICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnXHJcbiAgICAgICAgICAgICAgICA/IHJlc3VsdC50cmltKClcclxuICAgICAgICAgICAgICAgIDogKChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXN1bHQuYm9keSkgfHwgJycpLnRyaW0oKTtcclxuICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICghcmVnZW5lcmF0ZUV4aXN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQoY3VycmVudFRleHQpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUoYWN0aW9uVHlwZSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbY2FuZGlkYXRlXSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoKHByZXYpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBbLi4ucHJldiwgY2FuZGlkYXRlXS5zbGljZSgwLCBNQVhfU1VHR0VTVElPTlMpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KG5leHQubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignRmFpbGVkIHRvIGdlbmVyYXRlIEFJIHN1Z2dlc3Rpb24nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgIHNldElzR2VuZXJhdGluZyhmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSksIFtcclxuICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgYmFzZVVybCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgY2FuUmVnZW5lcmF0ZSxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpbnN0cnVjdGlvblRleHQsXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgdGVtcGxhdGVJZCxcclxuICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICBvbkVycm9yLFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICAgICAgb25BSUFjdGlvblJlcXVlc3QsXHJcbiAgICAgICAgb25CdWlsZEFJUHJvbXB0LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghYWN0aXZlQ2FuZGlkYXRlIHx8ICFzdWdnZXN0aW9uQmFzZVRleHQgfHwgIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQoYWN0aXZlQ2FuZGlkYXRlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9hY2NlcHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0ge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjdGlvblR5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBlZGl0ZWRFdmVudEVtaXR0ZWQ6IGZhbHNlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgaW5Jbml0aWFsQWlQaGFzZSA9IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IHRhZ1BheWxvYWQgPSBjb21wdXRlQWlUYWdPbkFjY2VwdCh7XHJcbiAgICAgICAgICAgIGJhc2VsaW5lVGV4dDogc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlOiBpbkluaXRpYWxBaVBoYXNlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChpbkluaXRpYWxBaVBoYXNlKSB7XHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRhZ1BheWxvYWQpLCB7IHNvdXJjZTogJ2FjY2VwdCcgfSkpO1xyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNldEVkaXRvclRleHQsXHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCxcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVSZWplY3RTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9kaXNjYXJkZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW2NsZWFyU3VnZ2VzdGlvblNlc3Npb24sIGVtaXRBSUV2ZW50LCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdGVtcGxhdGVJZF0pO1xyXG4gICAgY29uc3QgaGFuZGxlRmVlZGJhY2sgPSB1c2VDYWxsYmFjaygocmF0aW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSgocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XTogcmF0aW5nIH0pKSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXksXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25JbmRleCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBhaUhlYWRlckFjdGlvbnMgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gZW5hYmxlZEFJQWN0aW9ucy5tYXAoKGFjdGlvblR5cGUpID0+IHtcclxuICAgICAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgICAgICBjb25zdCBhY3Rpb25Db25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgICAgICBjb25zdCB0b25lSWQgPSB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGFjdGlvbkNvbmZpZy5sYWJlbCxcclxuICAgICAgICAgICAgICAgIGlzUHJpbWFyeTogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGlzR2VuZXJhdGluZyAmJiBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFjdXJyZW50VGV4dC50cmltKCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGV4dC5sZW5ndGggPFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBpc0dlbmVyYXRpbmcgfHxcclxuICAgICAgICAgICAgICAgICAgICAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSxcclxuICAgICAgICAgICAgICAgIHNob3dUb25lRHJvcGRvd246IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICAhISgoX2EgPSBhY3Rpb25Db25maWcudG9uZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpLFxyXG4gICAgICAgICAgICAgICAgdG9uZXM6IGFjdGlvbkNvbmZpZy50b25lcyxcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkVG9uZUlkOiB0b25lSWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgZW5hYmxlZEFJQWN0aW9ucyxcclxuICAgICAgICBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBtaW5DaGFyc0J5QWN0aW9uLFxyXG4gICAgXSk7XHJcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGFkZFRleHRPcldyYXAsXHJcbiAgICAgICAgICAgIGFkZFRleHQsXHJcbiAgICAgICAgICAgIGdldCgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0Q2FyZXRQb3NpdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2FkZFRleHRPcldyYXAsIGFkZFRleHQsIGN1cnJlbnRUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpbnB1dFZhbHVlID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgfSwgW2lucHV0VmFsdWUsIHNldEVkaXRvclRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFsaW1pdCB8fCAhb25FcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG5leHRFcnJvciA9IGN1cnJlbnRUZXh0Lmxlbmd0aCA+IGxpbWl0ID8gTElNSVRfUkVBQ0hFRCA6IGVycm9yICE9PSBudWxsICYmIGVycm9yICE9PSB2b2lkIDAgPyBlcnJvciA6ICcnO1xyXG4gICAgICAgIGlmIChsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPT09IG5leHRFcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9IG5leHRFcnJvcjtcclxuICAgICAgICBvbkVycm9yKG5leHRFcnJvcik7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIGVycm9yLCBsaW1pdCwgb25FcnJvcl0pO1xyXG4gICAgcmV0dXJuIChfanN4cyhPdXRlckNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pLCBfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkxJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzVXBJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2xpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNsaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkRJU0xJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzRG93bkljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIGNhblJlZ2VuZXJhdGUgPyAoX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogaXNHZW5lcmF0aW5nID8gJ1JlZ2VuZXJhdGluZ+KApicgOiAnUmVnZW5lcmF0ZScsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiUmVnZW5lcmF0ZSBzdWdnZXN0aW9uXCIsIFwiYXJpYS1idXN5XCI6IGlzR2VuZXJhdGluZywgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzR2VuZXJhdGluZywgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IGlzR2VuZXJhdGluZyA/IChfanN4KFJlZ2VuZXJhdGVJY29uU2hpbW1lciwgeyBcImFyaWEtaGlkZGVuXCI6IHRydWUgfSkpIDogKF9qc3goUmV3aW5kSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkpIH0pKSB9KSkpIDogbnVsbCwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNjYXJkXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzY2FyZCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gfSwgeyBjaGlsZHJlbjogX2pzeChDcm9zc0ljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiQWNjZXB0XCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiQWNjZXB0IHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlQWNjZXB0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENoZWNrSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKV0gfSldIH0pKSkgOiBpc0dlbmVyYXRpbmcgPyAoX2pzeHMoRWRpdG9yU2tlbGV0b25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5NiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTIlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg4JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI1NCVcIiB9KV0gfSkpIDogKF9qc3goVGV4dFNwYWNlLCBPYmplY3QuYXNzaWduKHsgcmVmOiB0ZXh0U3BhY2VSZWYgfSwgdGV4dEFyZWFQcm9wcywgeyB2YWx1ZTogY3VycmVudFRleHQsIG9uQ2hhbmdlOiBoYW5kbGVPbkNoYW5nZSwgb25CbHVyOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0UG9zdEVkaXRBaVRhZ1JlY29tcHV0ZShlLnRhcmdldC52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QXJlYU9uQmx1ciA9PT0gbnVsbCB8fCB0ZXh0QXJlYU9uQmx1ciA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dEFyZWFPbkJsdXIoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uUGFzdGU6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhc3RlZFRleHQgPSBlLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3RlZFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSAoX2EgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uU3RhcnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gKF9iID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvbkVuZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogc3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlZmVyIGxpdmUgRE9NIHZhbHVlIOKAlCBgY3VycmVudFRleHRgIGNhbiBsYWcgdGhlIHRleHRhcmVhIGZvciBiaWcgcGFzdGVzLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSAoX2MgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwudmFsdWUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRUZXh0ID0gYmFzZS5zbGljZSgwLCBzdGFydCkgKyBwYXN0ZWRUZXh0ICsgYmFzZS5zbGljZShlbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcmV0ID0gc3RhcnQgKyBwYXN0ZWRUZXh0Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YSA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGEuc2V0U2VsZWN0aW9uUmFuZ2UoY2FyZXQsIGNhcmV0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBpbnZhbGlkIHJhbmdlIGluIGVkZ2UgYnJvd3NlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCByb3dzOiByb3dzIH0pKSksIGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUgPyAoX2pzeHMoSW5zdHJ1Y3Rpb25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhJbnN0cnVjdGlvbklucHV0Um93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0SWNvbiwgeyB3aWR0aDogMTgsIGhlaWdodDogMTgsIGNvbG9yOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnkgfSksIF9qc3goSW5zdHJ1Y3Rpb25JbnB1dCwgeyB2YWx1ZTogaW5zdHJ1Y3Rpb25UZXh0LCBwbGFjZWhvbGRlcjogXCJBZGQgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIHRvIHJlZmluZSB5b3VyIG1lc3NhZ2VcIiwgb25DaGFuZ2U6IChlKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoZS50YXJnZXQudmFsdWUpIH0pLCBfanN4cyhJbnN0cnVjdGlvbkFjdGlvbnMsIHsgY2hpbGRyZW46IFtfanN4KEluc3RydWN0aW9uQ2FuY2VsLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiQ2FuY2VsXCIgfSkpLCBfanN4KEluc3RydWN0aW9uSW1wcm92ZSwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RydWN0aW9uVG9BcHBseSA9IGluc3RydWN0aW9uVGV4dC50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2luc3RydWN0aW9uX3VzZWQnLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbl90eXBlOiBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fdGV4dDogYW5vbnltaXplSW5zdHJ1Y3Rpb25UZXh0KGluc3RydWN0aW9uVG9BcHBseSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSwgZmFsc2UsIGluc3RydWN0aW9uVG9BcHBseSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJJbXByb3ZlXCIgfSkpXSB9KV0gfSksIGluc3RydWN0aW9uVGV4dC50cmltKCkubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5sZW5ndGggPiAwID8gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCwgeyBjaGlsZHJlbjogZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLm1hcCgoc3VnZ2VzdGlvbikgPT4gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgc2VsZWN0ZWQ6IGluc3RydWN0aW9uVGV4dCA9PT0gc3VnZ2VzdGlvbiwgb25DbGljazogKCkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KHN1Z2dlc3Rpb24pIH0sIHsgY2hpbGRyZW46IHN1Z2dlc3Rpb24gfSksIHN1Z2dlc3Rpb24pKSkgfSkpIDogbnVsbF0gfSkpIDogKF9qc3goV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB7IGFjdGlvbnM6IGFjdGlvbnMsIHJlZjogdGV4dFNwYWNlUmVmLCBvbkFjdGlvblNlbGVjdDogb25BY3Rpb25TZWxlY3QsIFJpZ2h0Q29tcG9uZW50OiBSaWdodENvbXBvbmVudCwgcmlnaHRBY3Rpb25zRGlzYWJsZWQ6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIG9uRW1vamlDbGljazogb25FbW9qaUFkZGl0aW9uLCBhaUFjdGlvbnM6IGFpSGVhZGVyQWN0aW9ucywgZGlzYWJsZUFsbEFjdGlvbnM6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIGluc3RydWN0aW9uQWN0aXZlOiBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBvbkFJSW5zdHJ1Y3Rpb25zQ2xpY2s6ICgpID0+IHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUodHJ1ZSksIG9uQUlUb25lQ2hhbmdlOiAoYWN0aW9uVHlwZSwgdG9uZUlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUb25lQnlBY3Rpb24oKHByZXYpID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXYpLCB7IFthY3Rpb25UeXBlXTogdG9uZUlkIH0pKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkFJVG9uZVNlbGVjdCA9PT0gbnVsbCB8fCBvbkFJVG9uZVNlbGVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRvbmVTZWxlY3QoYWN0aW9uVHlwZSwgdG9uZUlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHRvbmVJZCwgQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBvbkFJQWN0aW9uQ2xpY2s6IChhY3Rpb25UeXBlLCBhY3Rpb25WYXJpYW50ID0gQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGFjdGlvbiBzaG91bGQgbm90IHJldHJpZ2dlciBmcm9tIGNoaXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2VuZXJhdGUgaXMgb25seSB2aWEgZXhwbGljaXQgcmVnZW5lcmF0ZSBjb250cm9sLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldyBhY3Rpb24gc3RhcnRzIGEgZnJlc2ggc3VnZ2VzdGlvbiBzZXNzaW9uLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSldIH0pKV0gfSkpO1xyXG59KTtcclxuV2hhdHNBcHBUZXh0RWRpdG9yLmRpc3BsYXlOYW1lID0gJ1doYXRzQXBwVGV4dEVkaXRvcic7XHJcbmV4cG9ydCB7IEFJX1RBR19DSEFOR0VfUkFUSU9fVEhSRVNIT0xELCBjb21wdXRlQWlUYWdPbkFjY2VwdCwgbGV2ZW5zaHRlaW5EaXN0YW5jZSwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2hhdHNBcHBUZXh0RWRpdG9yLmpzLm1hcCJdfQ== */")),P=p.default("div","production"===process.env.NODE_ENV?{target:"ea7i3sh1"}:{target:"ea7i3sh1",label:"InstructionSuggestionList"})("margin-top:10px;border-radius:12px;background:",B.COLORS.surface.standard,";box-shadow:0 6px 18px rgba(0, 0, 0, 0.1);overflow:hidden;"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBbUw2QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBPcmlnaW5hbCBwcmVmaWxsIGJvZHkgZm9yIEFJIHRhZyByZWNvbXB1dGU7IHNlZWRlZCBvbmNlLCBuZXZlciB0aGUgbGl2ZSBgY3VycmVudFRleHRgIGZhbGxiYWNrLiAqL1xyXG4gICAgY29uc3QgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZiA9IHVzZVJlZignJyk7XHJcbiAgICBjb25zdCBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZiA9IHVzZVJlZihmYWxzZSk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSAnJztcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghcHJlZmlsbFdhc0FpR2VuZXJhdGVkKSB7XHJcbiAgICAgICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50ID0gJyc7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBzZWVkID0gaW5wdXRWYWx1ZSAhPT0gbnVsbCAmJiBpbnB1dFZhbHVlICE9PSB2b2lkIDAgPyBpbnB1dFZhbHVlIDogJyc7XHJcbiAgICAgICAgaWYgKHNlZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSBzZWVkO1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBpbnB1dFZhbHVlLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChuZXh0VGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCByZWNvbXB1dGVQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCh7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgY3VycmVudEVkaXRlZFRleHQ6IG5leHRUZXh0LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlY29tcHV0ZVBheWxvYWQpLCB7IHNvdXJjZTogJ3Bvc3RfZWRpdF9kZWJvdW5jZScgfSkpO1xyXG4gICAgfSwgW29uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlICYmIHRleHQgIT09IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlKSB7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKHRleHQpO1xyXG4gICAgICAgICAgICB9LCBBSV9UQUdfUkVDT01QVVRFX0lETEVfTVMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXkpIHx8ICcwJyk7XHJcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oY2FjaGVkKSkge1xyXG4gICAgICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KGNhY2hlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgaGlnaGxpZ2h0U3RvcmFnZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKSB7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGVsaWdpYmxlID0gISFjdXJyZW50VGV4dC50cmltKCkgJiYgY3VycmVudFRleHQubGVuZ3RoID49IHJlcGhyYXNlTWluQ2hhcnM7XHJcbiAgICAgICAgaWYgKHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGVsaWdpYmxlO1xyXG4gICAgICAgICAgICBpZiAoZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICAgICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNyb3NzZWRUaHJlc2hvbGQgPSAhcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCAmJiBlbGlnaWJsZTtcclxuICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICBpZiAoY3Jvc3NlZFRocmVzaG9sZCkge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgaXNHZW5lcmF0aW5nLCByZXBocmFzZU1pbkNoYXJzXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXNbc3VnZ2VzdGlvbkluZGV4XSB8fCAnJztcclxuICAgIGNvbnN0IGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlQ2FuZGlkYXRlKVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gYCR7c3VnZ2VzdGlvbkFjdGlvblR5cGV9LSR7c3VnZ2VzdGlvbkluZGV4fS0ke2FjdGl2ZUNhbmRpZGF0ZX1gO1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHN1Z2dlc3Rpb25JbmRleF0pO1xyXG4gICAgY29uc3QgaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUgPSAhIShhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSAmJlxyXG4gICAgICAgIGZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZVthY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleV0pO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvbkJhc2VIdG1sID0gdXNlTWVtbygoKSA9PiBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAnJyksIFtzdWdnZXN0aW9uQmFzZVRleHRdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoYWN0aXZlQ2FuZGlkYXRlKSwgW2FjdGl2ZUNhbmRpZGF0ZV0pO1xyXG4gICAgY29uc3QgY2FuUmVnZW5lcmF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8IE1BWF9TVUdHRVNUSU9OUztcclxuICAgIGNvbnN0IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA9ICEhc3VnZ2VzdGlvbkJhc2VUZXh0ICYmIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA+IDA7XHJcbiAgICBjb25zdCBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggPD0gMSB8fCBzdWdnZXN0aW9uSW5kZXggPD0gMDtcclxuICAgIGNvbnN0IGlzTmV4dFN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8XHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4ID49IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCAtIDE7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IHN1Z2dlc3Rpb25TY3JvbGxSZWYuY3VycmVudDtcclxuICAgICAgICBpZiAoIW5vZGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBub2RlLnNjcm9sbFRvcCA9IG5vZGUuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLCBpc0dlbmVyYXRpbmddKTtcclxuICAgIGNvbnN0IGV4ZWN1dGVBSUFjdGlvbiA9IHVzZUNhbGxiYWNrKChhY3Rpb25UeXBlLCByZWdlbmVyYXRlRXhpc3RpbmcgPSBmYWxzZSwgaW5zdHJ1Y3Rpb25PdmVycmlkZSwgdG9uZU92ZXJyaWRlSWQsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgdmFyIF9iO1xyXG4gICAgICAgIGlmICghb25BSUFjdGlvblJlcXVlc3QgJiZcclxuICAgICAgICAgICAgIWFwaUFkYXB0ZXIgJiZcclxuICAgICAgICAgICAgKCFyZXF1ZXN0RXhlY3V0b3IgfHwgIWJhc2VVcmwpKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignQUkgY29uZmlndXJhdGlvbiBtaXNzaW5nJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjdXJyZW50VGV4dC50cmltKCkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBtaW5DaGFyc0ZvckFjdGlvbiA9IG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIDUwO1xyXG4gICAgICAgIGlmIChjdXJyZW50VGV4dC5sZW5ndGggPCBtaW5DaGFyc0ZvckFjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAocmVnZW5lcmF0ZUV4aXN0aW5nICYmICFjYW5SZWdlbmVyYXRlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgYmFzZUNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVR5cGUgPT09ICd1dGlsaXR5JyAmJlxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50ID09PSBBSUFjdGlvblZhcmlhbnQuUkVQSFJBU0VcclxuICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJhc2VDb25maWcpLCB7IGxhYmVsOiAnUmVwaHJhc2UnLCBiYXNlUHJvbXB0OiBVVElMSVRZX1JFUEhSQVNFX1BST01QVCB9KSA6IGJhc2VDb25maWc7XHJcbiAgICAgICAgLy8gVG9uZSBpcyBzZW50IG9ubHkgYWZ0ZXIgZXhwbGljaXQgdXNlciBzZWxlY3Rpb24gKG9yIGV4cGxpY2l0IG92ZXJyaWRlKSxcclxuICAgICAgICAvLyBub3QgZnJvbSBkZWZhdWx0IHRvbmUgbWV0YWRhdGEuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lSWQgPSB0b25lT3ZlcnJpZGVJZCB8fCB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lID0gKF9iID0gY29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZmluZCgodG9uZSkgPT4gdG9uZS5pZCA9PT0gc2VsZWN0ZWRUb25lSWQpO1xyXG4gICAgICAgIGNvbnN0IGluc3RydWN0aW9uRm9yUHJvbXB0ID0gaW5zdHJ1Y3Rpb25PdmVycmlkZSAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgID8gaW5zdHJ1Y3Rpb25PdmVycmlkZVxyXG4gICAgICAgICAgICA6IGluc3RydWN0aW9uVGV4dDtcclxuICAgICAgICBjb25zdCBwcm9tcHQgPSAob25CdWlsZEFJUHJvbXB0ID09PSBudWxsIHx8IG9uQnVpbGRBSVByb21wdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25CdWlsZEFJUHJvbXB0KHtcclxuICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCxcclxuICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICB0b25lTGFiZWw6IHNlbGVjdGVkVG9uZSA9PT0gbnVsbCB8fCBzZWxlY3RlZFRvbmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlbGVjdGVkVG9uZS5sYWJlbCxcclxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgfSkpIHx8XHJcbiAgICAgICAgICAgIGJ1aWxkQWN0aW9uUHJvbXB0KHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZyxcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBzZXRJc0dlbmVyYXRpbmcodHJ1ZSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2FjdGlvbl90cmlnZ2VyZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgdGVtcGxhdGVfY2F0ZWdvcnk6IHRlbXBsYXRlVHlwZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvbkFJQWN0aW9uUmVxdWVzdFxyXG4gICAgICAgICAgICAgICAgPyB5aWVsZCBvbkFJQWN0aW9uUmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICA6IHlpZWxkIHJlcXVlc3RBSVN1Z2dlc3Rpb24oe1xyXG4gICAgICAgICAgICAgICAgICAgIGFwaUFkYXB0ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEV4ZWN1dG9yLFxyXG4gICAgICAgICAgICAgICAgICAgIGJhc2VVcmwsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICAgICAgICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnXHJcbiAgICAgICAgICAgICAgICA/IHJlc3VsdC50cmltKClcclxuICAgICAgICAgICAgICAgIDogKChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXN1bHQuYm9keSkgfHwgJycpLnRyaW0oKTtcclxuICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICghcmVnZW5lcmF0ZUV4aXN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQoY3VycmVudFRleHQpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUoYWN0aW9uVHlwZSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbY2FuZGlkYXRlXSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoKHByZXYpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBbLi4ucHJldiwgY2FuZGlkYXRlXS5zbGljZSgwLCBNQVhfU1VHR0VTVElPTlMpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KG5leHQubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignRmFpbGVkIHRvIGdlbmVyYXRlIEFJIHN1Z2dlc3Rpb24nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgIHNldElzR2VuZXJhdGluZyhmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSksIFtcclxuICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgYmFzZVVybCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgY2FuUmVnZW5lcmF0ZSxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpbnN0cnVjdGlvblRleHQsXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgdGVtcGxhdGVJZCxcclxuICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICBvbkVycm9yLFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICAgICAgb25BSUFjdGlvblJlcXVlc3QsXHJcbiAgICAgICAgb25CdWlsZEFJUHJvbXB0LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghYWN0aXZlQ2FuZGlkYXRlIHx8ICFzdWdnZXN0aW9uQmFzZVRleHQgfHwgIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQoYWN0aXZlQ2FuZGlkYXRlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9hY2NlcHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0ge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjdGlvblR5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBlZGl0ZWRFdmVudEVtaXR0ZWQ6IGZhbHNlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgaW5Jbml0aWFsQWlQaGFzZSA9IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IHRhZ1BheWxvYWQgPSBjb21wdXRlQWlUYWdPbkFjY2VwdCh7XHJcbiAgICAgICAgICAgIGJhc2VsaW5lVGV4dDogc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlOiBpbkluaXRpYWxBaVBoYXNlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChpbkluaXRpYWxBaVBoYXNlKSB7XHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRhZ1BheWxvYWQpLCB7IHNvdXJjZTogJ2FjY2VwdCcgfSkpO1xyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNldEVkaXRvclRleHQsXHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCxcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVSZWplY3RTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9kaXNjYXJkZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW2NsZWFyU3VnZ2VzdGlvblNlc3Npb24sIGVtaXRBSUV2ZW50LCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdGVtcGxhdGVJZF0pO1xyXG4gICAgY29uc3QgaGFuZGxlRmVlZGJhY2sgPSB1c2VDYWxsYmFjaygocmF0aW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSgocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XTogcmF0aW5nIH0pKSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXksXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25JbmRleCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBhaUhlYWRlckFjdGlvbnMgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gZW5hYmxlZEFJQWN0aW9ucy5tYXAoKGFjdGlvblR5cGUpID0+IHtcclxuICAgICAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgICAgICBjb25zdCBhY3Rpb25Db25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgICAgICBjb25zdCB0b25lSWQgPSB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGFjdGlvbkNvbmZpZy5sYWJlbCxcclxuICAgICAgICAgICAgICAgIGlzUHJpbWFyeTogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGlzR2VuZXJhdGluZyAmJiBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFjdXJyZW50VGV4dC50cmltKCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGV4dC5sZW5ndGggPFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBpc0dlbmVyYXRpbmcgfHxcclxuICAgICAgICAgICAgICAgICAgICAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSxcclxuICAgICAgICAgICAgICAgIHNob3dUb25lRHJvcGRvd246IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICAhISgoX2EgPSBhY3Rpb25Db25maWcudG9uZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpLFxyXG4gICAgICAgICAgICAgICAgdG9uZXM6IGFjdGlvbkNvbmZpZy50b25lcyxcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkVG9uZUlkOiB0b25lSWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgZW5hYmxlZEFJQWN0aW9ucyxcclxuICAgICAgICBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBtaW5DaGFyc0J5QWN0aW9uLFxyXG4gICAgXSk7XHJcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGFkZFRleHRPcldyYXAsXHJcbiAgICAgICAgICAgIGFkZFRleHQsXHJcbiAgICAgICAgICAgIGdldCgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0Q2FyZXRQb3NpdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2FkZFRleHRPcldyYXAsIGFkZFRleHQsIGN1cnJlbnRUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpbnB1dFZhbHVlID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgfSwgW2lucHV0VmFsdWUsIHNldEVkaXRvclRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFsaW1pdCB8fCAhb25FcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG5leHRFcnJvciA9IGN1cnJlbnRUZXh0Lmxlbmd0aCA+IGxpbWl0ID8gTElNSVRfUkVBQ0hFRCA6IGVycm9yICE9PSBudWxsICYmIGVycm9yICE9PSB2b2lkIDAgPyBlcnJvciA6ICcnO1xyXG4gICAgICAgIGlmIChsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPT09IG5leHRFcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9IG5leHRFcnJvcjtcclxuICAgICAgICBvbkVycm9yKG5leHRFcnJvcik7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIGVycm9yLCBsaW1pdCwgb25FcnJvcl0pO1xyXG4gICAgcmV0dXJuIChfanN4cyhPdXRlckNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pLCBfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkxJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzVXBJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2xpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNsaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkRJU0xJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzRG93bkljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIGNhblJlZ2VuZXJhdGUgPyAoX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogaXNHZW5lcmF0aW5nID8gJ1JlZ2VuZXJhdGluZ+KApicgOiAnUmVnZW5lcmF0ZScsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiUmVnZW5lcmF0ZSBzdWdnZXN0aW9uXCIsIFwiYXJpYS1idXN5XCI6IGlzR2VuZXJhdGluZywgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzR2VuZXJhdGluZywgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IGlzR2VuZXJhdGluZyA/IChfanN4KFJlZ2VuZXJhdGVJY29uU2hpbW1lciwgeyBcImFyaWEtaGlkZGVuXCI6IHRydWUgfSkpIDogKF9qc3goUmV3aW5kSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkpIH0pKSB9KSkpIDogbnVsbCwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNjYXJkXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzY2FyZCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gfSwgeyBjaGlsZHJlbjogX2pzeChDcm9zc0ljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiQWNjZXB0XCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiQWNjZXB0IHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlQWNjZXB0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENoZWNrSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKV0gfSldIH0pKSkgOiBpc0dlbmVyYXRpbmcgPyAoX2pzeHMoRWRpdG9yU2tlbGV0b25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5NiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTIlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg4JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI1NCVcIiB9KV0gfSkpIDogKF9qc3goVGV4dFNwYWNlLCBPYmplY3QuYXNzaWduKHsgcmVmOiB0ZXh0U3BhY2VSZWYgfSwgdGV4dEFyZWFQcm9wcywgeyB2YWx1ZTogY3VycmVudFRleHQsIG9uQ2hhbmdlOiBoYW5kbGVPbkNoYW5nZSwgb25CbHVyOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0UG9zdEVkaXRBaVRhZ1JlY29tcHV0ZShlLnRhcmdldC52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QXJlYU9uQmx1ciA9PT0gbnVsbCB8fCB0ZXh0QXJlYU9uQmx1ciA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dEFyZWFPbkJsdXIoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uUGFzdGU6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhc3RlZFRleHQgPSBlLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3RlZFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSAoX2EgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uU3RhcnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gKF9iID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvbkVuZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogc3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlZmVyIGxpdmUgRE9NIHZhbHVlIOKAlCBgY3VycmVudFRleHRgIGNhbiBsYWcgdGhlIHRleHRhcmVhIGZvciBiaWcgcGFzdGVzLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSAoX2MgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwudmFsdWUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRUZXh0ID0gYmFzZS5zbGljZSgwLCBzdGFydCkgKyBwYXN0ZWRUZXh0ICsgYmFzZS5zbGljZShlbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcmV0ID0gc3RhcnQgKyBwYXN0ZWRUZXh0Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YSA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGEuc2V0U2VsZWN0aW9uUmFuZ2UoY2FyZXQsIGNhcmV0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBpbnZhbGlkIHJhbmdlIGluIGVkZ2UgYnJvd3NlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCByb3dzOiByb3dzIH0pKSksIGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUgPyAoX2pzeHMoSW5zdHJ1Y3Rpb25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhJbnN0cnVjdGlvbklucHV0Um93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0SWNvbiwgeyB3aWR0aDogMTgsIGhlaWdodDogMTgsIGNvbG9yOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnkgfSksIF9qc3goSW5zdHJ1Y3Rpb25JbnB1dCwgeyB2YWx1ZTogaW5zdHJ1Y3Rpb25UZXh0LCBwbGFjZWhvbGRlcjogXCJBZGQgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIHRvIHJlZmluZSB5b3VyIG1lc3NhZ2VcIiwgb25DaGFuZ2U6IChlKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoZS50YXJnZXQudmFsdWUpIH0pLCBfanN4cyhJbnN0cnVjdGlvbkFjdGlvbnMsIHsgY2hpbGRyZW46IFtfanN4KEluc3RydWN0aW9uQ2FuY2VsLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiQ2FuY2VsXCIgfSkpLCBfanN4KEluc3RydWN0aW9uSW1wcm92ZSwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RydWN0aW9uVG9BcHBseSA9IGluc3RydWN0aW9uVGV4dC50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2luc3RydWN0aW9uX3VzZWQnLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbl90eXBlOiBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fdGV4dDogYW5vbnltaXplSW5zdHJ1Y3Rpb25UZXh0KGluc3RydWN0aW9uVG9BcHBseSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSwgZmFsc2UsIGluc3RydWN0aW9uVG9BcHBseSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJJbXByb3ZlXCIgfSkpXSB9KV0gfSksIGluc3RydWN0aW9uVGV4dC50cmltKCkubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5sZW5ndGggPiAwID8gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCwgeyBjaGlsZHJlbjogZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLm1hcCgoc3VnZ2VzdGlvbikgPT4gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgc2VsZWN0ZWQ6IGluc3RydWN0aW9uVGV4dCA9PT0gc3VnZ2VzdGlvbiwgb25DbGljazogKCkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KHN1Z2dlc3Rpb24pIH0sIHsgY2hpbGRyZW46IHN1Z2dlc3Rpb24gfSksIHN1Z2dlc3Rpb24pKSkgfSkpIDogbnVsbF0gfSkpIDogKF9qc3goV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB7IGFjdGlvbnM6IGFjdGlvbnMsIHJlZjogdGV4dFNwYWNlUmVmLCBvbkFjdGlvblNlbGVjdDogb25BY3Rpb25TZWxlY3QsIFJpZ2h0Q29tcG9uZW50OiBSaWdodENvbXBvbmVudCwgcmlnaHRBY3Rpb25zRGlzYWJsZWQ6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIG9uRW1vamlDbGljazogb25FbW9qaUFkZGl0aW9uLCBhaUFjdGlvbnM6IGFpSGVhZGVyQWN0aW9ucywgZGlzYWJsZUFsbEFjdGlvbnM6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIGluc3RydWN0aW9uQWN0aXZlOiBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBvbkFJSW5zdHJ1Y3Rpb25zQ2xpY2s6ICgpID0+IHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUodHJ1ZSksIG9uQUlUb25lQ2hhbmdlOiAoYWN0aW9uVHlwZSwgdG9uZUlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUb25lQnlBY3Rpb24oKHByZXYpID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXYpLCB7IFthY3Rpb25UeXBlXTogdG9uZUlkIH0pKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkFJVG9uZVNlbGVjdCA9PT0gbnVsbCB8fCBvbkFJVG9uZVNlbGVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRvbmVTZWxlY3QoYWN0aW9uVHlwZSwgdG9uZUlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHRvbmVJZCwgQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBvbkFJQWN0aW9uQ2xpY2s6IChhY3Rpb25UeXBlLCBhY3Rpb25WYXJpYW50ID0gQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGFjdGlvbiBzaG91bGQgbm90IHJldHJpZ2dlciBmcm9tIGNoaXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2VuZXJhdGUgaXMgb25seSB2aWEgZXhwbGljaXQgcmVnZW5lcmF0ZSBjb250cm9sLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldyBhY3Rpb24gc3RhcnRzIGEgZnJlc2ggc3VnZ2VzdGlvbiBzZXNzaW9uLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSldIH0pKV0gfSkpO1xyXG59KTtcclxuV2hhdHNBcHBUZXh0RWRpdG9yLmRpc3BsYXlOYW1lID0gJ1doYXRzQXBwVGV4dEVkaXRvcic7XHJcbmV4cG9ydCB7IEFJX1RBR19DSEFOR0VfUkFUSU9fVEhSRVNIT0xELCBjb21wdXRlQWlUYWdPbkFjY2VwdCwgbGV2ZW5zaHRlaW5EaXN0YW5jZSwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2hhdHNBcHBUZXh0RWRpdG9yLmpzLm1hcCJdfQ== */")),E=p.default("button","production"===process.env.NODE_ENV?{target:"ea7i3sh0"}:{target:"ea7i3sh0",label:"InstructionSuggestionButton"})("width:100%;border:0;border-top:1px solid ",B.COLORS.stroke.primary,";background:",(I=>I.selected?"#e5f3e8":"transparent"),";color:",(I=>I.selected?"#1e6b34":B.COLORS.content.primary),";text-align:left;padding:12px 14px;font-size:14px;line-height:1.2;cursor:pointer;:first-of-type{border-top:0;}"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBMExrRCIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBPcmlnaW5hbCBwcmVmaWxsIGJvZHkgZm9yIEFJIHRhZyByZWNvbXB1dGU7IHNlZWRlZCBvbmNlLCBuZXZlciB0aGUgbGl2ZSBgY3VycmVudFRleHRgIGZhbGxiYWNrLiAqL1xyXG4gICAgY29uc3QgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZiA9IHVzZVJlZignJyk7XHJcbiAgICBjb25zdCBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZiA9IHVzZVJlZihmYWxzZSk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSAnJztcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghcHJlZmlsbFdhc0FpR2VuZXJhdGVkKSB7XHJcbiAgICAgICAgICAgIHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50ID0gJyc7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByZWZpbGxCYXNlbGluZUNhcHR1cmVkUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBzZWVkID0gaW5wdXRWYWx1ZSAhPT0gbnVsbCAmJiBpbnB1dFZhbHVlICE9PSB2b2lkIDAgPyBpbnB1dFZhbHVlIDogJyc7XHJcbiAgICAgICAgaWYgKHNlZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgPSBzZWVkO1xyXG4gICAgICAgICAgICBwcmVmaWxsQmFzZWxpbmVDYXB0dXJlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBpbnB1dFZhbHVlLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkXSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChuZXh0VGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCByZWNvbXB1dGVQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCh7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgY3VycmVudEVkaXRlZFRleHQ6IG5leHRUZXh0LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlY29tcHV0ZVBheWxvYWQpLCB7IHNvdXJjZTogJ3Bvc3RfZWRpdF9kZWJvdW5jZScgfSkpO1xyXG4gICAgfSwgW29uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWQgPyBwcmVmaWxsQmFzZWxpbmVUZXh0UmVmLmN1cnJlbnQgOiAnJyk7XHJcbiAgICAgICAgaWYgKGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlICYmIHRleHQgIT09IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlKSB7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKHRleHQpO1xyXG4gICAgICAgICAgICB9LCBBSV9UQUdfUkVDT01QVVRFX0lETEVfTVMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXkpIHx8ICcwJyk7XHJcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oY2FjaGVkKSkge1xyXG4gICAgICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KGNhY2hlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleSwgaGlnaGxpZ2h0U3RvcmFnZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKSB7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGVsaWdpYmxlID0gISFjdXJyZW50VGV4dC50cmltKCkgJiYgY3VycmVudFRleHQubGVuZ3RoID49IHJlcGhyYXNlTWluQ2hhcnM7XHJcbiAgICAgICAgaWYgKHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGVsaWdpYmxlO1xyXG4gICAgICAgICAgICBpZiAoZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICAgICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNyb3NzZWRUaHJlc2hvbGQgPSAhcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCAmJiBlbGlnaWJsZTtcclxuICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gdHJ1ZTtcclxuICAgICAgICBpZiAoY3Jvc3NlZFRocmVzaG9sZCkge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgaXNHZW5lcmF0aW5nLCByZXBocmFzZU1pbkNoYXJzXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXNbc3VnZ2VzdGlvbkluZGV4XSB8fCAnJztcclxuICAgIGNvbnN0IGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlQ2FuZGlkYXRlKVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gYCR7c3VnZ2VzdGlvbkFjdGlvblR5cGV9LSR7c3VnZ2VzdGlvbkluZGV4fS0ke2FjdGl2ZUNhbmRpZGF0ZX1gO1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHN1Z2dlc3Rpb25JbmRleF0pO1xyXG4gICAgY29uc3QgaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUgPSAhIShhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSAmJlxyXG4gICAgICAgIGZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZVthY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleV0pO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvbkJhc2VIdG1sID0gdXNlTWVtbygoKSA9PiBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAnJyksIFtzdWdnZXN0aW9uQmFzZVRleHRdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoYWN0aXZlQ2FuZGlkYXRlKSwgW2FjdGl2ZUNhbmRpZGF0ZV0pO1xyXG4gICAgY29uc3QgY2FuUmVnZW5lcmF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8IE1BWF9TVUdHRVNUSU9OUztcclxuICAgIGNvbnN0IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA9ICEhc3VnZ2VzdGlvbkJhc2VUZXh0ICYmIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA+IDA7XHJcbiAgICBjb25zdCBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggPD0gMSB8fCBzdWdnZXN0aW9uSW5kZXggPD0gMDtcclxuICAgIGNvbnN0IGlzTmV4dFN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8XHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4ID49IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCAtIDE7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IHN1Z2dlc3Rpb25TY3JvbGxSZWYuY3VycmVudDtcclxuICAgICAgICBpZiAoIW5vZGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBub2RlLnNjcm9sbFRvcCA9IG5vZGUuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgfSwgW2FjdGl2ZUNhbmRpZGF0ZSwgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLCBpc0dlbmVyYXRpbmddKTtcclxuICAgIGNvbnN0IGV4ZWN1dGVBSUFjdGlvbiA9IHVzZUNhbGxiYWNrKChhY3Rpb25UeXBlLCByZWdlbmVyYXRlRXhpc3RpbmcgPSBmYWxzZSwgaW5zdHJ1Y3Rpb25PdmVycmlkZSwgdG9uZU92ZXJyaWRlSWQsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgdmFyIF9iO1xyXG4gICAgICAgIGlmICghb25BSUFjdGlvblJlcXVlc3QgJiZcclxuICAgICAgICAgICAgIWFwaUFkYXB0ZXIgJiZcclxuICAgICAgICAgICAgKCFyZXF1ZXN0RXhlY3V0b3IgfHwgIWJhc2VVcmwpKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignQUkgY29uZmlndXJhdGlvbiBtaXNzaW5nJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjdXJyZW50VGV4dC50cmltKCkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBtaW5DaGFyc0ZvckFjdGlvbiA9IG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIDUwO1xyXG4gICAgICAgIGlmIChjdXJyZW50VGV4dC5sZW5ndGggPCBtaW5DaGFyc0ZvckFjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAocmVnZW5lcmF0ZUV4aXN0aW5nICYmICFjYW5SZWdlbmVyYXRlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgYmFzZUNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVR5cGUgPT09ICd1dGlsaXR5JyAmJlxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50ID09PSBBSUFjdGlvblZhcmlhbnQuUkVQSFJBU0VcclxuICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJhc2VDb25maWcpLCB7IGxhYmVsOiAnUmVwaHJhc2UnLCBiYXNlUHJvbXB0OiBVVElMSVRZX1JFUEhSQVNFX1BST01QVCB9KSA6IGJhc2VDb25maWc7XHJcbiAgICAgICAgLy8gVG9uZSBpcyBzZW50IG9ubHkgYWZ0ZXIgZXhwbGljaXQgdXNlciBzZWxlY3Rpb24gKG9yIGV4cGxpY2l0IG92ZXJyaWRlKSxcclxuICAgICAgICAvLyBub3QgZnJvbSBkZWZhdWx0IHRvbmUgbWV0YWRhdGEuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lSWQgPSB0b25lT3ZlcnJpZGVJZCB8fCB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUb25lID0gKF9iID0gY29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZmluZCgodG9uZSkgPT4gdG9uZS5pZCA9PT0gc2VsZWN0ZWRUb25lSWQpO1xyXG4gICAgICAgIGNvbnN0IGluc3RydWN0aW9uRm9yUHJvbXB0ID0gaW5zdHJ1Y3Rpb25PdmVycmlkZSAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgID8gaW5zdHJ1Y3Rpb25PdmVycmlkZVxyXG4gICAgICAgICAgICA6IGluc3RydWN0aW9uVGV4dDtcclxuICAgICAgICBjb25zdCBwcm9tcHQgPSAob25CdWlsZEFJUHJvbXB0ID09PSBudWxsIHx8IG9uQnVpbGRBSVByb21wdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25CdWlsZEFJUHJvbXB0KHtcclxuICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCxcclxuICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICB0b25lTGFiZWw6IHNlbGVjdGVkVG9uZSA9PT0gbnVsbCB8fCBzZWxlY3RlZFRvbmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlbGVjdGVkVG9uZS5sYWJlbCxcclxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgfSkpIHx8XHJcbiAgICAgICAgICAgIGJ1aWxkQWN0aW9uUHJvbXB0KHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZyxcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBzZXRJc0dlbmVyYXRpbmcodHJ1ZSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2FjdGlvbl90cmlnZ2VyZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgdGVtcGxhdGVfY2F0ZWdvcnk6IHRlbXBsYXRlVHlwZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvbkFJQWN0aW9uUmVxdWVzdFxyXG4gICAgICAgICAgICAgICAgPyB5aWVsZCBvbkFJQWN0aW9uUmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICB0b25lSWQ6IHNlbGVjdGVkVG9uZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICA6IHlpZWxkIHJlcXVlc3RBSVN1Z2dlc3Rpb24oe1xyXG4gICAgICAgICAgICAgICAgICAgIGFwaUFkYXB0ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEV4ZWN1dG9yLFxyXG4gICAgICAgICAgICAgICAgICAgIGJhc2VVcmwsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdCxcclxuICAgICAgICAgICAgICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICAgICAgICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnXHJcbiAgICAgICAgICAgICAgICA/IHJlc3VsdC50cmltKClcclxuICAgICAgICAgICAgICAgIDogKChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXN1bHQuYm9keSkgfHwgJycpLnRyaW0oKTtcclxuICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICghcmVnZW5lcmF0ZUV4aXN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQoY3VycmVudFRleHQpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUoYWN0aW9uVHlwZSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbY2FuZGlkYXRlXSk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoKHByZXYpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBbLi4ucHJldiwgY2FuZGlkYXRlXS5zbGljZSgwLCBNQVhfU1VHR0VTVElPTlMpO1xyXG4gICAgICAgICAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KG5leHQubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FcnJvcignRmFpbGVkIHRvIGdlbmVyYXRlIEFJIHN1Z2dlc3Rpb24nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgIHNldElzR2VuZXJhdGluZyhmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSksIFtcclxuICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgYmFzZVVybCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgY2FuUmVnZW5lcmF0ZSxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpbnN0cnVjdGlvblRleHQsXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgdGVtcGxhdGVJZCxcclxuICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICBpbnRlbnQsXHJcbiAgICAgICAgY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgc3lzdGVtSWQsXHJcbiAgICAgICAgdXNlQ2FzZSxcclxuICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgIHRlbXBsYXRlVHlwZSxcclxuICAgICAgICBvbkVycm9yLFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICAgICAgb25BSUFjdGlvblJlcXVlc3QsXHJcbiAgICAgICAgb25CdWlsZEFJUHJvbXB0LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghYWN0aXZlQ2FuZGlkYXRlIHx8ICFzdWdnZXN0aW9uQmFzZVRleHQgfHwgIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQoYWN0aXZlQ2FuZGlkYXRlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9hY2NlcHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0ge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjdGlvblR5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBlZGl0ZWRFdmVudEVtaXR0ZWQ6IGZhbHNlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgaW5Jbml0aWFsQWlQaGFzZSA9IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IHRhZ1BheWxvYWQgPSBjb21wdXRlQWlUYWdPbkFjY2VwdCh7XHJcbiAgICAgICAgICAgIGJhc2VsaW5lVGV4dDogc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgICAgICBhY2NlcHRlZFRleHQ6IGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlOiBpbkluaXRpYWxBaVBoYXNlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChpbkluaXRpYWxBaVBoYXNlKSB7XHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCA9PT0gbnVsbCB8fCBvbkFJVGFnQ29tcHV0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUYWdDb21wdXRlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRhZ1BheWxvYWQpLCB7IHNvdXJjZTogJ2FjY2VwdCcgfSkpO1xyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkJhc2VUZXh0LFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNldEVkaXRvclRleHQsXHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIG9uQUlUYWdDb21wdXRlZCxcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBoYW5kbGVSZWplY3RTdWdnZXN0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmICghc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9kaXNjYXJkZWQnLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW2NsZWFyU3VnZ2VzdGlvblNlc3Npb24sIGVtaXRBSUV2ZW50LCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdGVtcGxhdGVJZF0pO1xyXG4gICAgY29uc3QgaGFuZGxlRmVlZGJhY2sgPSB1c2VDYWxsYmFjaygocmF0aW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSB8fCAhYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSgocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XTogcmF0aW5nIH0pKSk7XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXksXHJcbiAgICAgICAgZW1pdEFJRXZlbnQsXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25JbmRleCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBhaUhlYWRlckFjdGlvbnMgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gZW5hYmxlZEFJQWN0aW9ucy5tYXAoKGFjdGlvblR5cGUpID0+IHtcclxuICAgICAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgICAgICBjb25zdCBhY3Rpb25Db25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgICAgICBjb25zdCB0b25lSWQgPSB0b25lQnlBY3Rpb25bYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGFjdGlvbkNvbmZpZy5sYWJlbCxcclxuICAgICAgICAgICAgICAgIGlzUHJpbWFyeTogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGlzR2VuZXJhdGluZyAmJiBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFjdXJyZW50VGV4dC50cmltKCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGV4dC5sZW5ndGggPFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBpc0dlbmVyYXRpbmcgfHxcclxuICAgICAgICAgICAgICAgICAgICAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSxcclxuICAgICAgICAgICAgICAgIHNob3dUb25lRHJvcGRvd246IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICAhISgoX2EgPSBhY3Rpb25Db25maWcudG9uZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpLFxyXG4gICAgICAgICAgICAgICAgdG9uZXM6IGFjdGlvbkNvbmZpZy50b25lcyxcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkVG9uZUlkOiB0b25lSWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbXHJcbiAgICAgICAgZW5hYmxlZEFJQWN0aW9ucyxcclxuICAgICAgICBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyxcclxuICAgICAgICBhY3RpdmVBY3Rpb25Qcm9tcHRzLFxyXG4gICAgICAgIHRvbmVCeUFjdGlvbixcclxuICAgICAgICBpc0dlbmVyYXRpbmcsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uLFxyXG4gICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICBtaW5DaGFyc0J5QWN0aW9uLFxyXG4gICAgXSk7XHJcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGFkZFRleHRPcldyYXAsXHJcbiAgICAgICAgICAgIGFkZFRleHQsXHJcbiAgICAgICAgICAgIGdldCgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0Q2FyZXRQb3NpdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2FkZFRleHRPcldyYXAsIGFkZFRleHQsIGN1cnJlbnRUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpbnB1dFZhbHVlID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgfSwgW2lucHV0VmFsdWUsIHNldEVkaXRvclRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFsaW1pdCB8fCAhb25FcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG5leHRFcnJvciA9IGN1cnJlbnRUZXh0Lmxlbmd0aCA+IGxpbWl0ID8gTElNSVRfUkVBQ0hFRCA6IGVycm9yICE9PSBudWxsICYmIGVycm9yICE9PSB2b2lkIDAgPyBlcnJvciA6ICcnO1xyXG4gICAgICAgIGlmIChsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPT09IG5leHRFcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9IG5leHRFcnJvcjtcclxuICAgICAgICBvbkVycm9yKG5leHRFcnJvcik7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIGVycm9yLCBsaW1pdCwgb25FcnJvcl0pO1xyXG4gICAgcmV0dXJuIChfanN4cyhPdXRlckNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pLCBfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkxJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzVXBJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2xpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNsaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGhhc0ZlZWRiYWNrRm9yQWN0aXZlQ2FuZGlkYXRlLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVGZWVkYmFjayhBSUZlZWRiYWNrUmF0aW5nLkRJU0xJS0UpIH0sIHsgY2hpbGRyZW46IF9qc3goVGh1bWJzRG93bkljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIGNhblJlZ2VuZXJhdGUgPyAoX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogaXNHZW5lcmF0aW5nID8gJ1JlZ2VuZXJhdGluZ+KApicgOiAnUmVnZW5lcmF0ZScsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiUmVnZW5lcmF0ZSBzdWdnZXN0aW9uXCIsIFwiYXJpYS1idXN5XCI6IGlzR2VuZXJhdGluZywgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzR2VuZXJhdGluZywgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihzdWdnZXN0aW9uQWN0aW9uVHlwZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IGlzR2VuZXJhdGluZyA/IChfanN4KFJlZ2VuZXJhdGVJY29uU2hpbW1lciwgeyBcImFyaWEtaGlkZGVuXCI6IHRydWUgfSkpIDogKF9qc3goUmV3aW5kSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkpIH0pKSB9KSkpIDogbnVsbCwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNjYXJkXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzY2FyZCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gfSwgeyBjaGlsZHJlbjogX2pzeChDcm9zc0ljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiQWNjZXB0XCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiQWNjZXB0IHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlQWNjZXB0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENoZWNrSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKV0gfSldIH0pKSkgOiBpc0dlbmVyYXRpbmcgPyAoX2pzeHMoRWRpdG9yU2tlbGV0b25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5NiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTIlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg4JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI1NCVcIiB9KV0gfSkpIDogKF9qc3goVGV4dFNwYWNlLCBPYmplY3QuYXNzaWduKHsgcmVmOiB0ZXh0U3BhY2VSZWYgfSwgdGV4dEFyZWFQcm9wcywgeyB2YWx1ZTogY3VycmVudFRleHQsIG9uQ2hhbmdlOiBoYW5kbGVPbkNoYW5nZSwgb25CbHVyOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0UG9zdEVkaXRBaVRhZ1JlY29tcHV0ZShlLnRhcmdldC52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QXJlYU9uQmx1ciA9PT0gbnVsbCB8fCB0ZXh0QXJlYU9uQmx1ciA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dEFyZWFPbkJsdXIoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uUGFzdGU6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhc3RlZFRleHQgPSBlLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3RlZFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSAoX2EgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uU3RhcnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gKF9iID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvbkVuZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogc3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlZmVyIGxpdmUgRE9NIHZhbHVlIOKAlCBgY3VycmVudFRleHRgIGNhbiBsYWcgdGhlIHRleHRhcmVhIGZvciBiaWcgcGFzdGVzLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSAoX2MgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwudmFsdWUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRUZXh0ID0gYmFzZS5zbGljZSgwLCBzdGFydCkgKyBwYXN0ZWRUZXh0ICsgYmFzZS5zbGljZShlbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQobmV4dFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcmV0ID0gc3RhcnQgKyBwYXN0ZWRUZXh0Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YSA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGEuc2V0U2VsZWN0aW9uUmFuZ2UoY2FyZXQsIGNhcmV0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBpbnZhbGlkIHJhbmdlIGluIGVkZ2UgYnJvd3NlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCByb3dzOiByb3dzIH0pKSksIGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUgPyAoX2pzeHMoSW5zdHJ1Y3Rpb25Db250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhJbnN0cnVjdGlvbklucHV0Um93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0SWNvbiwgeyB3aWR0aDogMTgsIGhlaWdodDogMTgsIGNvbG9yOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnkgfSksIF9qc3goSW5zdHJ1Y3Rpb25JbnB1dCwgeyB2YWx1ZTogaW5zdHJ1Y3Rpb25UZXh0LCBwbGFjZWhvbGRlcjogXCJBZGQgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIHRvIHJlZmluZSB5b3VyIG1lc3NhZ2VcIiwgb25DaGFuZ2U6IChlKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoZS50YXJnZXQudmFsdWUpIH0pLCBfanN4cyhJbnN0cnVjdGlvbkFjdGlvbnMsIHsgY2hpbGRyZW46IFtfanN4KEluc3RydWN0aW9uQ2FuY2VsLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiQ2FuY2VsXCIgfSkpLCBfanN4KEluc3RydWN0aW9uSW1wcm92ZSwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RydWN0aW9uVG9BcHBseSA9IGluc3RydWN0aW9uVGV4dC50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2luc3RydWN0aW9uX3VzZWQnLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbl90eXBlOiBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fdGV4dDogYW5vbnltaXplSW5zdHJ1Y3Rpb25UZXh0KGluc3RydWN0aW9uVG9BcHBseSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSwgZmFsc2UsIGluc3RydWN0aW9uVG9BcHBseSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJJbXByb3ZlXCIgfSkpXSB9KV0gfSksIGluc3RydWN0aW9uVGV4dC50cmltKCkubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5sZW5ndGggPiAwID8gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCwgeyBjaGlsZHJlbjogZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLm1hcCgoc3VnZ2VzdGlvbikgPT4gKF9qc3goSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgc2VsZWN0ZWQ6IGluc3RydWN0aW9uVGV4dCA9PT0gc3VnZ2VzdGlvbiwgb25DbGljazogKCkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KHN1Z2dlc3Rpb24pIH0sIHsgY2hpbGRyZW46IHN1Z2dlc3Rpb24gfSksIHN1Z2dlc3Rpb24pKSkgfSkpIDogbnVsbF0gfSkpIDogKF9qc3goV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB7IGFjdGlvbnM6IGFjdGlvbnMsIHJlZjogdGV4dFNwYWNlUmVmLCBvbkFjdGlvblNlbGVjdDogb25BY3Rpb25TZWxlY3QsIFJpZ2h0Q29tcG9uZW50OiBSaWdodENvbXBvbmVudCwgcmlnaHRBY3Rpb25zRGlzYWJsZWQ6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIG9uRW1vamlDbGljazogb25FbW9qaUFkZGl0aW9uLCBhaUFjdGlvbnM6IGFpSGVhZGVyQWN0aW9ucywgZGlzYWJsZUFsbEFjdGlvbnM6IHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiB8fCBpc0dlbmVyYXRpbmcsIGluc3RydWN0aW9uQWN0aXZlOiBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBvbkFJSW5zdHJ1Y3Rpb25zQ2xpY2s6ICgpID0+IHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUodHJ1ZSksIG9uQUlUb25lQ2hhbmdlOiAoYWN0aW9uVHlwZSwgdG9uZUlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUb25lQnlBY3Rpb24oKHByZXYpID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXYpLCB7IFthY3Rpb25UeXBlXTogdG9uZUlkIH0pKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkFJVG9uZVNlbGVjdCA9PT0gbnVsbCB8fCBvbkFJVG9uZVNlbGVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRvbmVTZWxlY3QoYWN0aW9uVHlwZSwgdG9uZUlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHRvbmVJZCwgQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBvbkFJQWN0aW9uQ2xpY2s6IChhY3Rpb25UeXBlLCBhY3Rpb25WYXJpYW50ID0gQUlBY3Rpb25WYXJpYW50LkRFRkFVTFQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0dlbmVyYXRpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGFjdGlvbiBzaG91bGQgbm90IHJldHJpZ2dlciBmcm9tIGNoaXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2VuZXJhdGUgaXMgb25seSB2aWEgZXhwbGljaXQgcmVnZW5lcmF0ZSBjb250cm9sLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldyBhY3Rpb24gc3RhcnRzIGEgZnJlc2ggc3VnZ2VzdGlvbiBzZXNzaW9uLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY3Rpb25WYXJpYW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSldIH0pKV0gfSkpO1xyXG59KTtcclxuV2hhdHNBcHBUZXh0RWRpdG9yLmRpc3BsYXlOYW1lID0gJ1doYXRzQXBwVGV4dEVkaXRvcic7XHJcbmV4cG9ydCB7IEFJX1RBR19DSEFOR0VfUkFUSU9fVEhSRVNIT0xELCBjb21wdXRlQWlUYWdPbkFjY2VwdCwgbGV2ZW5zaHRlaW5EaXN0YW5jZSwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2hhdHNBcHBUZXh0RWRpdG9yLmpzLm1hcCJdfQ== */"));var f;!function(I){I.LIKE="like",I.DISLIKE="dislike"}(f||(f={}));const M=new H.BaseWhatsappContentLangHelper,r={[x.EditorActionTypes.BOLD]:"*",[x.EditorActionTypes.ITALIC]:"_",[x.EditorActionTypes.STRIKETHROUGH]:"~"};const q=h.default.forwardRef(((I,A)=>{var{onChange:H,onClickVariable:y,text:p,RightComponent:h,error:a,limit:n,onError:q,rows:_,actions:$,editorInstanceKey:II,editorSessionId:gI,templateType:CI="marketing",templateId:AI,requestExecutor:lI,baseUrl:cI,endpointPath:bI,useCase:ZI,storeId:GI,apiAdapter:XI,conversationId:dI="whatsapp-template-editor",systemId:VI="whatsapp-writer",intent:WI="default",enabledAIActions:HI=[x.AIEditorActionTypes.REPHRASE,x.AIEditorActionTypes.SHORTEN,x.AIEditorActionTypes.EXPAND,x.AIEditorActionTypes.EMOJIFY],disableBuiltInAIActions:RI=!1,promptOverrides:BI,rephraseTones:JI,aiActionMinChars:mI,instructionSuggestions:NI=N.DEFAULT_INSTRUCTION_SUGGESTIONS,onAnalyticsEvent:uI,onAITagComputed:YI,prefillWasAiGenerated:FI=!1,editorHeader:xI,onAIToneSelect:yI,onAIActionRequest:pI,onBuildAIPrompt:hI,onBlur:aI}=I,iI=g.__rest(I,["onChange","onClickVariable","text","RightComponent","error","limit","onError","rows","actions","editorInstanceKey","editorSessionId","templateType","templateId","requestExecutor","baseUrl","endpointPath","useCase","storeId","apiAdapter","conversationId","systemId","intent","enabledAIActions","disableBuiltInAIActions","promptOverrides","rephraseTones","aiActionMinChars","instructionSuggestions","onAnalyticsEvent","onAITagComputed","prefillWasAiGenerated","editorHeader","onAIToneSelect","onAIActionRequest","onBuildAIPrompt","onBlur"]);const nI=R.useRef(null),[SI,kI]=R.useState(p||""),[UI,sI]=R.useState(!1),[QI,zI]=R.useState(0),[vI,wI]=R.useState(!1),[oI,tI]=R.useState(!1),[jI,TI]=R.useState(""),[eI,DI]=R.useState({}),[LI,KI]=R.useState(null),[OI,PI]=R.useState([]),[EI,fI]=R.useState(0),[MI,rI]=R.useState(null),qI=R.useRef(null),_I=R.useRef(null),$I=R.useRef(null),Ig=R.useRef(null),gg=R.useRef(null),Cg=R.useRef(null),Ag=R.useRef(null),lg=R.useRef(!!FI),cg=R.useRef(null),bg=R.useRef(""),Zg=R.useRef(!1),[Gg,Xg]=R.useState({}),dg=R.useRef(`mount-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`),Vg=R.useMemo((()=>function(I){return`whatsapp-editor-rephrase-highlight-${I||"default"}`}(`${II||"default"}-${gI||dg.current}`)),[II,gI]);R.useEffect((()=>{lg.current=!!FI}),[FI,II]),R.useEffect((()=>{Zg.current=!1,bg.current=""}),[II,gI]),R.useEffect((()=>{if(!FI)return Zg.current=!1,void(bg.current="");if(Zg.current)return;const I=null!=p?p:"";I.length>0&&(bg.current=I,Zg.current=!0)}),[FI,p,II,gI]);const Wg=R.useMemo((()=>N.resolveActionPrompts(CI,BI,JI)),[BI,JI,CI]),Hg=R.useMemo((()=>{const I=jI.trim().toLowerCase();return I?NI.filter((g=>g.toLowerCase().includes(I))):[]}),[NI,jI]),Rg=R.useMemo((()=>Object.assign(Object.assign({},N.DEFAULT_AI_ACTION_MIN_CHARS),mI||{})),[mI]),Bg=Rg[x.AIEditorActionTypes.REPHRASE]||N.DEFAULT_AI_ACTION_MIN_CHARS[x.AIEditorActionTypes.REPHRASE],Jg=R.useCallback((I=>{const g=I.trim().replace(/\s+/g," ");if(!g)return"";const C=g.split(" ").length;return`[anonymized:length_${g.length}:words_${C}]`}),[]),mg=R.useCallback(((I,g)=>{null==uI||uI(I,g)}),[uI]),Ng=R.useCallback((I=>{kI((g=>g===I?g:I))}),[]),ug=R.useCallback((I=>{if(Cg.current&&clearTimeout(Cg.current),I.length>1200)return null==H||H(I,I),void(Cg.current=setTimeout((()=>{null==H||H(I,M.getHTML(I))}),16));null==H||H(I,M.getHTML(I))}),[H]),Yg=R.useCallback((I=>{const g=cg.current,C=(null==g?void 0:g.acceptedText)||(FI?bg.current:"");if(!C)return;if(I===C)return;const A=u.computeAiTagOnPostEdit({acceptedAiText:C,currentEditedText:I});null==YI||YI(Object.assign(Object.assign({},A),{source:"post_edit_debounce"}))}),[YI,FI]),Fg=R.useCallback((()=>{KI(null),PI([]),fI(0),rI(null),Xg({})}),[]),xg=R.useCallback((()=>{if(vI)return;if(QI>=5)return;const I=QI+1;zI(I),"undefined"!=typeof window&&II&&sessionStorage.setItem(Vg,String(I)),sI(!0),$I.current&&clearTimeout($I.current),$I.current=setTimeout((()=>{sI(!1)}),1200)}),[II,Vg,vI,QI]),yg=R.useRef(xg);function pg(I){const g=null==nI?void 0:nI.current;null!=g&&(g.selectionStart?(g.focus(),g.selectionEnd=I):g.focus())}function hg(I){var g,C;let A=null!==(C=null===(g=nI.current)||void 0===g?void 0:g.value)&&void 0!==C?C:"";if(nI.current&&I){const g=nI.current.selectionStart,C=nI.current.selectionEnd,l=I;if(g===C)return ag(l);{A=M.wrappWildcard(g,C,l,A);const I=M.getHTML(A);return Ng(A),{text:A,html:I}}}return{text:A,html:A}}function ag(I){var g,C;const A=null!==(C=null===(g=nI.current)||void 0===g?void 0:g.value)&&void 0!==C?C:"";if(nI.current&&I){const g=nI.current.selectionStart;if(g===nI.current.selectionEnd)return ig(I,g)}return{text:A,html:A}}function ig(I,g){var C,A;let l=null!==(A=null===(C=nI.current)||void 0===C?void 0:C.value)&&void 0!==A?A:"";l=l.slice(0,g)+I+l.slice(g);const c=M.getHTML(l);return Ng(l),{text:l,html:c}}yg.current=xg,R.useEffect((()=>{if("undefined"==typeof window||!II)return;const I=Number(sessionStorage.getItem(Vg)||"0");return Number.isNaN(I)||zI(I),()=>{sessionStorage.removeItem(Vg)}}),[II,Vg]),R.useEffect((()=>{if(vI)return sI(!1),void(_I.current&&(clearTimeout(_I.current),_I.current=null));const I=!!SI.trim()&&SI.length>=Bg;if(null===gg.current)return gg.current=I,void(I&&(_I.current=setTimeout((()=>{yg.current()}),3e3)));if(!I)return gg.current=!1,sI(!1),void(_I.current&&(clearTimeout(_I.current),_I.current=null));const g=!gg.current&&I;gg.current=!0,g&&yg.current(),_I.current&&clearTimeout(_I.current),_I.current=setTimeout((()=>{yg.current()}),3e3)}),[SI,vI,Bg]),R.useEffect((()=>()=>{_I.current&&clearTimeout(_I.current),$I.current&&clearTimeout($I.current),Cg.current&&clearTimeout(Cg.current),Ig.current&&clearTimeout(Ig.current)}),[]);const ng=OI[EI]||"",Sg=R.useMemo((()=>MI&&ng?`${MI}-${EI}-${ng}`:null),[ng,MI,EI]),kg=!(!Sg||!Gg[Sg]),Ug=R.useMemo((()=>M.getHTML(LI||"")),[LI]),sg=R.useMemo((()=>M.getHTML(ng)),[ng]),Qg=OI.length<3,zg=!!LI&&OI.length>0,vg=OI.length<=1||EI<=0,wg=OI.length<=1||EI>=OI.length-1;R.useEffect((()=>{if(!zg)return;const I=qI.current;I&&(I.scrollTop=I.scrollHeight)}),[ng,zg,vI]);const og=R.useCallback((function(I){let C=arguments.length>1&&void 0!==arguments[1]&&arguments[1],A=arguments.length>2?arguments[2]:void 0,l=arguments.length>3?arguments[3]:void 0,c=arguments.length>4&&void 0!==arguments[4]?arguments[4]:x.AIActionVariant.DEFAULT;return g.__awaiter(void 0,void 0,void 0,(function*(){var g;if(!(pI||XI||lI&&cI))return void(null==q||q("AI configuration missing"));if(!SI.trim())return;const b=Rg[I]||N.DEFAULT_AI_ACTION_MIN_CHARS[I]||50;if(SI.length<b)return;if(vI)return;if(C&&!Qg)return;const Z=Wg[I],G=I===x.AIEditorActionTypes.REPHRASE&&"utility"===CI&&c===x.AIActionVariant.REPHRASE?Object.assign(Object.assign({},Z),{label:"Rephrase",basePrompt:"Rephrase this WhatsApp utility template to improve clarity and readability while preserving variables, intent, and compliance."}):Z,X=l||eI[I],d=null===(g=G.tones)||void 0===g?void 0:g.find((I=>I.id===X)),V=void 0!==A?A:jI,W=(null==hI?void 0:hI({actionType:I,actionVariant:c,currentText:SI,templateType:CI,config:G,toneId:X,toneLabel:null==d?void 0:d.label,instructionText:V||void 0}))||Y.buildActionPrompt({config:G,currentText:SI,selectedToneId:X,instructionText:V});wI(!0),mg("ai_action_triggered",{action_type:I,template_id:AI,template_category:CI});try{const g=pI?yield pI({actionType:I,actionVariant:c,currentText:SI,templateType:CI,toneId:X,toneLabel:null==d?void 0:d.label,instructionText:V||void 0,prompt:W}):yield Y.requestAISuggestion({apiAdapter:XI,requestExecutor:lI,baseUrl:cI,endpointPath:bI,prompt:W,intent:WI,conversationId:dI,systemId:VI,useCase:ZI,storeId:GI}),A="string"==typeof g?g.trim():((null==g?void 0:g.body)||"").trim();if(!A)return;if(!C)return KI(SI),rI(I),PI([A]),void fI(0);PI((I=>{const g=[...I,A].slice(0,3);return fI(g.length-1),g}))}catch(I){null==q||q("Failed to generate AI suggestion")}finally{wI(!1)}}))}),[lI,cI,SI,vI,Qg,Wg,eI,jI,mg,AI,bI,XI,WI,dI,VI,ZI,GI,CI,q,Rg,pI,hI]),tg=R.useCallback((()=>{if(!ng||!LI||!MI)return;Ng(ng),ug(ng),mg("ai_suggestion_accepted",{action_type:MI,template_id:AI}),cg.current={acceptedText:ng,baselineText:LI,actionType:MI,editedEventEmitted:!1};const I=lg.current,g=u.computeAiTagOnAccept({baselineText:LI,acceptedText:ng,initialAiPrefillPhase:I});I&&(lg.current=!1),null==YI||YI(Object.assign(Object.assign({},g),{source:"accept"})),Fg()}),[ng,LI,MI,Ng,ug,mg,AI,YI,Fg]),jg=R.useCallback((()=>{MI&&(mg("ai_suggestion_discarded",{action_type:MI,template_id:AI}),Fg())}),[Fg,mg,MI,AI]),Tg=R.useCallback((I=>{MI&&Sg&&(Gg[Sg]||(Xg((g=>Object.assign(Object.assign({},g),{[Sg]:I}))),mg("ai_feedback_submitted",{action_type:MI,template_id:AI,rating:I,candidate_index:EI+1})))}),[Sg,mg,Gg,MI,EI,AI]),eg=R.useMemo((()=>RI?[]:HI.map((I=>{var g;const C=Wg[I],A=eI[I];return{type:I,label:C.label,isPrimary:I===x.AIEditorActionTypes.REPHRASE,loading:vI&&MI===I,highlighted:I===x.AIEditorActionTypes.REPHRASE&&UI,disabled:!SI.trim()||SI.length<(Rg[I]||N.DEFAULT_AI_ACTION_MIN_CHARS[I]||50)||vI||zg&&MI===I,showToneDropdown:I===x.AIEditorActionTypes.REPHRASE&&!!(null===(g=C.tones)||void 0===g?void 0:g.length),tones:C.tones,selectedToneId:A}}))),[HI,RI,Wg,eI,vI,MI,zg,UI,SI,Rg]);return R.useImperativeHandle(A,(()=>({addTextOrWrap:hg,addText:ag,get:()=>SI,setCaretPosition:pg})),[hg,ag,SI]),R.useEffect((()=>{void 0!==p&&Ng(p||"")}),[p,Ng]),R.useEffect((()=>{if(!n||!q)return;const I=SI.length>n?i:null!=a?a:"";Ag.current!==I&&(Ag.current=I,q(I))}),[SI,a,n,q]),C.jsxs(F.OuterContainer,{children:[C.jsxs(F.EditorFooterRow,{children:[C.jsx(F.EditorFooterTitle,{children:xI?C.jsx(m.TitleSmall,Object.assign({"data-test":"body-text-for-edit-template"},{children:xI})):null}),C.jsxs(F.EditorFooterRight,{children:[a&&a!==i?C.jsxs(C.Fragment,{children:[C.jsx(X.default,{width:16,height:16,color:B.COLORS.content.negative}),C.jsx(m.BodyCaption,Object.assign({color:B.COLORS.content.negative},{children:a}))]}):null,n?C.jsxs(m.BodyCaption,Object.assign({style:{color:a===i||SI.length>n?B.COLORS.content.negative:B.COLORS.content.secondary}},{children:[SI.length,"/",n]})):null]})]}),C.jsxs(F.Container,Object.assign({isError:!!a},{children:[zg?C.jsxs(U,Object.assign({ref:qI},{children:[C.jsx(s,{dangerouslySetInnerHTML:{__html:Ug}}),vI?C.jsx(Q,Object.assign({"aria-busy":"true"},{children:C.jsxs(z,{children:[C.jsx(k,{width:"96%"}),C.jsx(k,{width:"84%"}),C.jsx(k,{width:"68%"})]})})):C.jsx(Q,{dangerouslySetInnerHTML:{__html:sg}}),C.jsxs(v,{children:[C.jsxs(w,{children:[EI+1,"/",OI.length]}),C.jsx(o,Object.assign({"aria-label":"Previous suggestion",type:"button",disabled:vg,onClick:()=>fI((I=>Math.max(0,I-1)))},{children:C.jsx(c.default,{width:14,height:14})})),C.jsx(o,Object.assign({"aria-label":"Next suggestion",type:"button",disabled:wg,onClick:()=>fI((I=>Math.min(OI.length-1,I+1)))},{children:C.jsx(b.default,{width:14,height:14})})),C.jsx(J.Tooltip,Object.assign({body:"Like",placement:"top"},{children:C.jsx(o,Object.assign({"aria-label":"Like suggestion",type:"button",disabled:kg,onClick:()=>Tg(f.LIKE)},{children:C.jsx(W.default,{width:14,height:14})}))})),C.jsx(J.Tooltip,Object.assign({body:"Dislike",placement:"top"},{children:C.jsx(o,Object.assign({"aria-label":"Dislike suggestion",type:"button",disabled:kg,onClick:()=>Tg(f.DISLIKE)},{children:C.jsx(V.default,{width:14,height:14})}))})),Qg?C.jsx(J.Tooltip,Object.assign({body:vI?"Regenerating…":"Regenerate",placement:"top"},{children:C.jsx(t,Object.assign({"aria-label":"Regenerate suggestion","aria-busy":vI,type:"button",disabled:vI,onClick:()=>{MI&&og(MI,!0)}},{children:vI?C.jsx(j,{"aria-hidden":!0}):C.jsx(d.default,{width:14,height:14})}))})):null,C.jsx(J.Tooltip,Object.assign({body:"Discard",placement:"top"},{children:C.jsx(o,Object.assign({"aria-label":"Discard suggestion",type:"button",onClick:jg},{children:C.jsx(Z.default,{width:14,height:14})}))})),C.jsx(J.Tooltip,Object.assign({body:"Accept",placement:"top"},{children:C.jsx(o,Object.assign({"aria-label":"Accept suggestion",type:"button",onClick:tg},{children:C.jsx(l.default,{width:14,height:14})}))}))]})]})):vI?C.jsxs(S,{children:[C.jsx(k,{width:"96%"}),C.jsx(k,{width:"92%"}),C.jsx(k,{width:"88%"}),C.jsx(k,{width:"54%"})]}):C.jsx(F.TextSpace,Object.assign({ref:nI},iI,{value:SI,onChange:function(I){const g=I.target.value,C=cg.current;C&&!C.editedEventEmitted&&g!==C.acceptedText&&(cg.current=Object.assign(Object.assign({},C),{editedEventEmitted:!0}),mg("ai_suggestion_edited",{action_type:C.actionType,template_id:AI})),Ig.current&&(clearTimeout(Ig.current),Ig.current=null);const A=(null==C?void 0:C.acceptedText)||(FI?bg.current:"");A&&g!==A&&(Ig.current=setTimeout((()=>{Yg(g)}),1e3)),Ng(g),ug(g)},onBlur:I=>{Ig.current&&(clearTimeout(Ig.current),Ig.current=null),Yg(I.target.value),null==aI||aI(I)},onPaste:I=>{var g,C,A;const l=I.clipboardData.getData("text");if(l.length>1200){I.preventDefault();const c=nI.current,b=null!==(g=null==c?void 0:c.selectionStart)&&void 0!==g?g:0,Z=null!==(C=null==c?void 0:c.selectionEnd)&&void 0!==C?C:b,G=null!==(A=null==c?void 0:c.value)&&void 0!==A?A:SI,X=G.slice(0,b)+l+G.slice(Z);Ng(X),ug(X);const d=b+l.length;requestAnimationFrame((()=>{const I=nI.current;if(I)try{I.setSelectionRange(d,d)}catch(I){}}))}},rows:_})),oI?C.jsxs(T,{children:[C.jsxs(e,{children:[C.jsx(G.default,{width:18,height:18,color:B.COLORS.content.secondary}),C.jsx(D,{value:jI,placeholder:"Add specific instructions to refine your message",onChange:I=>TI(I.target.value)}),C.jsxs(L,{children:[C.jsx(K,Object.assign({type:"button",onClick:()=>{TI(""),tI(!1)}},{children:"Cancel"})),C.jsx(O,Object.assign({type:"button",onClick:()=>{const I=jI.trim();I&&mg("ai_instruction_used",{action_type:x.AIEditorActionTypes.REPHRASE,template_id:AI,instruction_text:Jg(I)}),tI(!1),TI(""),og(x.AIEditorActionTypes.REPHRASE,!1,I)}},{children:"Improve"}))]})]}),jI.trim().length>0&&Hg.length>0?C.jsx(P,{children:Hg.map((I=>C.jsx(E,Object.assign({type:"button",selected:jI===I,onClick:()=>TI(I)},{children:I}),I)))}):null]}):C.jsx(x.WhatsAppTextEditorHeader,{actions:$,ref:nI,onActionSelect:function(I){const g=r[I];if(g&&nI.current){const I=nI.current.selectionStart;if(I===nI.current.selectionEnd){const{text:C}=ig(g,I);pg(I+1),ug(C)}else{const{text:I}=hg(g);ug(I)}}},RightComponent:h,rightActionsDisabled:zg||vI,onEmojiClick:function(I){const{text:g}=ag(I);ug(g)},aiActions:eg,disableAllActions:zg||vI,instructionActive:oI,onAIInstructionsClick:()=>tI(!0),onAIToneChange:(I,g)=>{DI((C=>Object.assign(Object.assign({},C),{[I]:g}))),null==yI||yI(I,g),I===x.AIEditorActionTypes.REPHRASE&&og(I,!1,void 0,g,x.AIActionVariant.DEFAULT)},onAIActionClick:function(I){let g=arguments.length>1&&void 0!==arguments[1]?arguments[1]:x.AIActionVariant.DEFAULT;if(!vI){if(zg){if(MI===I)return;return Fg(),void og(I,!1,void 0,void 0,g)}og(I,!1,void 0,void 0,g)}}})]}))]})}));q.displayName="WhatsAppTextEditor",exports.AI_TAG_CHANGE_RATIO_THRESHOLD=u.AI_TAG_CHANGE_RATIO_THRESHOLD,exports.computeAiTagOnAccept=u.computeAiTagOnAccept,exports.levenshteinDistance=u.levenshteinDistance,exports.WhatsAppTextEditor=q;