@airtable/blocks 1.8.0 → 1.10.0-experimental-48096ae-20211116

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 (304) hide show
  1. package/CHANGELOG.md +20 -1
  2. package/dist/cjs/color_utils.js +2 -1
  3. package/dist/cjs/colors.js +2 -1
  4. package/dist/cjs/error_utils.js +19 -1
  5. package/dist/cjs/event_tracker.js +2 -1
  6. package/dist/cjs/global_config.js +2 -1
  7. package/dist/cjs/index.js +2 -1
  8. package/dist/cjs/injected/airtable_interface.js +2 -1
  9. package/dist/cjs/models/abstract_model.js +2 -1
  10. package/dist/cjs/models/abstract_model_with_async_data.js +2 -1
  11. package/dist/cjs/models/base.js +18 -6
  12. package/dist/cjs/models/create_aggregators.js +2 -1
  13. package/dist/cjs/models/cursor.js +4 -1
  14. package/dist/cjs/models/field.js +148 -28
  15. package/dist/cjs/models/grouped_record_query_result.js +7 -15
  16. package/dist/cjs/models/linked_records_query_result.js +77 -28
  17. package/dist/cjs/models/models.js +2 -1
  18. package/dist/cjs/models/mutation_constants.js +5 -2
  19. package/dist/cjs/models/mutations.js +69 -177
  20. package/dist/cjs/models/object_pool.js +2 -1
  21. package/dist/cjs/models/query_manager.js +328 -0
  22. package/dist/cjs/models/record.js +310 -56
  23. package/dist/cjs/models/record_coloring.js +2 -1
  24. package/dist/cjs/models/record_query_result.js +6 -2
  25. package/dist/cjs/models/record_store.js +556 -766
  26. package/dist/cjs/models/session.js +2 -1
  27. package/dist/cjs/models/table.js +24 -14
  28. package/dist/cjs/models/table_or_view_query_result.js +482 -415
  29. package/dist/cjs/models/view.js +2 -1
  30. package/dist/cjs/models/view_data_store.js +245 -296
  31. package/dist/cjs/models/view_metadata_query_result.js +2 -1
  32. package/dist/cjs/perform_record_action.js +2 -1
  33. package/dist/cjs/private_utils.js +52 -1
  34. package/dist/cjs/sdk.js +13 -2
  35. package/dist/cjs/settings_button.js +2 -1
  36. package/dist/cjs/stats/block_stats.js +2 -1
  37. package/dist/cjs/testing/abstract_mock_airtable_interface.js +367 -0
  38. package/dist/cjs/types/aggregators.js +2 -1
  39. package/dist/cjs/types/airtable_interface.js +2 -1
  40. package/dist/cjs/types/attachment.js +2 -1
  41. package/dist/cjs/types/backend_fetch_types.js +2 -1
  42. package/dist/cjs/types/base.js +2 -1
  43. package/dist/cjs/types/block.js +2 -1
  44. package/dist/cjs/types/block_query_spec.js +86 -0
  45. package/dist/cjs/types/collaborator.js +2 -1
  46. package/dist/cjs/types/cursor.js +2 -1
  47. package/dist/cjs/types/field.js +2 -1
  48. package/dist/cjs/types/global_config.js +2 -1
  49. package/dist/cjs/types/mutations.js +3 -1
  50. package/dist/cjs/types/permission_levels.js +2 -1
  51. package/dist/cjs/types/record.js +2 -1
  52. package/dist/cjs/types/record_action_data.js +2 -1
  53. package/dist/cjs/types/stat.js +2 -1
  54. package/dist/cjs/types/table.js +2 -1
  55. package/dist/cjs/types/undo_redo.js +2 -1
  56. package/dist/cjs/types/view.js +2 -1
  57. package/dist/cjs/types/viewport.js +2 -1
  58. package/dist/cjs/ui/base_provider.js +2 -1
  59. package/dist/cjs/ui/baymax_utils.js +2 -1
  60. package/dist/cjs/ui/block_wrapper.js +2 -1
  61. package/dist/cjs/ui/box.js +2 -1
  62. package/dist/cjs/ui/button.js +2 -1
  63. package/dist/cjs/ui/cell_renderer.js +2 -1
  64. package/dist/cjs/ui/choice_token.js +2 -1
  65. package/dist/cjs/ui/collaborator_token.js +2 -1
  66. package/dist/cjs/ui/color_palette.js +2 -1
  67. package/dist/cjs/ui/color_palette_synced.js +2 -1
  68. package/dist/cjs/ui/confirmation_dialog.js +2 -1
  69. package/dist/cjs/ui/control_sizes.js +2 -1
  70. package/dist/cjs/ui/create_detect_element_resize.js +2 -1
  71. package/dist/cjs/ui/css_helpers.js +2 -1
  72. package/dist/cjs/ui/dialog.js +2 -1
  73. package/dist/cjs/ui/dialog_close_button.js +2 -1
  74. package/dist/cjs/ui/expand_record.js +2 -1
  75. package/dist/cjs/ui/expand_record_list.js +2 -1
  76. package/dist/cjs/ui/expand_record_picker_async.js +2 -1
  77. package/dist/cjs/ui/field_icon.js +2 -1
  78. package/dist/cjs/ui/field_picker.js +2 -1
  79. package/dist/cjs/ui/field_picker_synced.js +2 -1
  80. package/dist/cjs/ui/form_field.js +2 -1
  81. package/dist/cjs/ui/geometry/geometry.js +2 -1
  82. package/dist/cjs/ui/geometry/point.js +2 -1
  83. package/dist/cjs/ui/geometry/rect.js +2 -1
  84. package/dist/cjs/ui/geometry/size.js +2 -1
  85. package/dist/cjs/ui/global_alert.js +2 -1
  86. package/dist/cjs/ui/global_config_synced_component_helpers.js +2 -1
  87. package/dist/cjs/ui/heading.js +2 -1
  88. package/dist/cjs/ui/icon.js +2 -1
  89. package/dist/cjs/ui/icon_config.js +6 -3
  90. package/dist/cjs/ui/initialize_block.js +2 -1
  91. package/dist/cjs/ui/input.js +2 -1
  92. package/dist/cjs/ui/input_synced.js +2 -1
  93. package/dist/cjs/ui/key_codes.js +2 -1
  94. package/dist/cjs/ui/label.js +2 -1
  95. package/dist/cjs/ui/link.js +2 -1
  96. package/dist/cjs/ui/loader.js +2 -1
  97. package/dist/cjs/ui/modal.js +2 -1
  98. package/dist/cjs/ui/model_picker_select.js +2 -1
  99. package/dist/cjs/ui/popover.js +2 -1
  100. package/dist/cjs/ui/progress_bar.js +2 -1
  101. package/dist/cjs/ui/record_card.js +2 -1
  102. package/dist/cjs/ui/record_card_list.js +2 -1
  103. package/dist/cjs/ui/remote_utils.js +2 -1
  104. package/dist/cjs/ui/sdk_context.js +2 -1
  105. package/dist/cjs/ui/select.js +2 -1
  106. package/dist/cjs/ui/select_and_select_buttons_helpers.js +2 -1
  107. package/dist/cjs/ui/select_buttons.js +2 -1
  108. package/dist/cjs/ui/select_buttons_synced.js +2 -1
  109. package/dist/cjs/ui/select_synced.js +2 -1
  110. package/dist/cjs/ui/switch.js +2 -1
  111. package/dist/cjs/ui/switch_synced.js +2 -1
  112. package/dist/cjs/ui/synced.js +2 -1
  113. package/dist/cjs/ui/system/all_styles_set.js +2 -1
  114. package/dist/cjs/ui/system/appearance/appearance_set.js +2 -1
  115. package/dist/cjs/ui/system/appearance/background_color.js +2 -1
  116. package/dist/cjs/ui/system/appearance/border.js +2 -1
  117. package/dist/cjs/ui/system/appearance/border_radius.js +2 -1
  118. package/dist/cjs/ui/system/appearance/box_shadow.js +2 -1
  119. package/dist/cjs/ui/system/appearance/opacity.js +2 -1
  120. package/dist/cjs/ui/system/dimensions/dimensions_set.js +2 -1
  121. package/dist/cjs/ui/system/dimensions/height.js +2 -1
  122. package/dist/cjs/ui/system/dimensions/max_height.js +2 -1
  123. package/dist/cjs/ui/system/dimensions/max_width.js +2 -1
  124. package/dist/cjs/ui/system/dimensions/min_height.js +2 -1
  125. package/dist/cjs/ui/system/dimensions/min_width.js +2 -1
  126. package/dist/cjs/ui/system/dimensions/width.js +2 -1
  127. package/dist/cjs/ui/system/display.js +2 -1
  128. package/dist/cjs/ui/system/flex_container/align_content.js +2 -1
  129. package/dist/cjs/ui/system/flex_container/align_items.js +2 -1
  130. package/dist/cjs/ui/system/flex_container/flex_container_set.js +2 -1
  131. package/dist/cjs/ui/system/flex_container/flex_direction.js +2 -1
  132. package/dist/cjs/ui/system/flex_container/flex_wrap.js +2 -1
  133. package/dist/cjs/ui/system/flex_container/justify_content.js +2 -1
  134. package/dist/cjs/ui/system/flex_container/justify_items.js +2 -1
  135. package/dist/cjs/ui/system/flex_item/align_self.js +2 -1
  136. package/dist/cjs/ui/system/flex_item/flex.js +2 -1
  137. package/dist/cjs/ui/system/flex_item/flex_basis.js +2 -1
  138. package/dist/cjs/ui/system/flex_item/flex_grow.js +2 -1
  139. package/dist/cjs/ui/system/flex_item/flex_item_set.js +2 -1
  140. package/dist/cjs/ui/system/flex_item/flex_shrink.js +2 -1
  141. package/dist/cjs/ui/system/flex_item/justify_self.js +2 -1
  142. package/dist/cjs/ui/system/flex_item/order.js +2 -1
  143. package/dist/cjs/ui/system/index.js +2 -1
  144. package/dist/cjs/ui/system/overflow.js +2 -1
  145. package/dist/cjs/ui/system/position/bottom.js +2 -1
  146. package/dist/cjs/ui/system/position/left.js +2 -1
  147. package/dist/cjs/ui/system/position/position.js +2 -1
  148. package/dist/cjs/ui/system/position/position_set.js +2 -1
  149. package/dist/cjs/ui/system/position/right.js +2 -1
  150. package/dist/cjs/ui/system/position/top.js +2 -1
  151. package/dist/cjs/ui/system/position/z_index.js +2 -1
  152. package/dist/cjs/ui/system/spacing/margin.js +2 -1
  153. package/dist/cjs/ui/system/spacing/padding.js +2 -1
  154. package/dist/cjs/ui/system/spacing/spacing_set.js +2 -1
  155. package/dist/cjs/ui/system/typography/font_family.js +2 -1
  156. package/dist/cjs/ui/system/typography/font_size.js +2 -1
  157. package/dist/cjs/ui/system/typography/font_style.js +2 -1
  158. package/dist/cjs/ui/system/typography/font_weight.js +2 -1
  159. package/dist/cjs/ui/system/typography/letter_spacing.js +2 -1
  160. package/dist/cjs/ui/system/typography/line_height.js +2 -1
  161. package/dist/cjs/ui/system/typography/text_align.js +2 -1
  162. package/dist/cjs/ui/system/typography/text_color.js +2 -1
  163. package/dist/cjs/ui/system/typography/text_decoration.js +2 -1
  164. package/dist/cjs/ui/system/typography/text_transform.js +2 -1
  165. package/dist/cjs/ui/system/typography/typography_set.js +2 -1
  166. package/dist/cjs/ui/system/utils/create_responsive_prop_type.js +2 -1
  167. package/dist/cjs/ui/system/utils/create_style_prop_types.js +2 -1
  168. package/dist/cjs/ui/system/utils/csstype.js +2 -1
  169. package/dist/cjs/ui/system/utils/ensure_numbers_are_within_scale.js +2 -1
  170. package/dist/cjs/ui/system/utils/get_style_props_for_responsive_prop.js +2 -1
  171. package/dist/cjs/ui/system/utils/types.js +2 -1
  172. package/dist/cjs/ui/table_picker.js +2 -1
  173. package/dist/cjs/ui/table_picker_synced.js +2 -1
  174. package/dist/cjs/ui/text.js +2 -1
  175. package/dist/cjs/ui/text_button.js +2 -1
  176. package/dist/cjs/ui/theme/default_theme/button_variants.js +2 -1
  177. package/dist/cjs/ui/theme/default_theme/control_sizes.js +2 -1
  178. package/dist/cjs/ui/theme/default_theme/heading_styles.js +2 -1
  179. package/dist/cjs/ui/theme/default_theme/index.js +2 -1
  180. package/dist/cjs/ui/theme/default_theme/input_variants.js +2 -1
  181. package/dist/cjs/ui/theme/default_theme/link_variants.js +2 -1
  182. package/dist/cjs/ui/theme/default_theme/select_buttons_variants.js +2 -1
  183. package/dist/cjs/ui/theme/default_theme/select_variants.js +2 -1
  184. package/dist/cjs/ui/theme/default_theme/switch_variants.js +2 -1
  185. package/dist/cjs/ui/theme/default_theme/text_button_variants.js +2 -1
  186. package/dist/cjs/ui/theme/default_theme/text_styles.js +2 -1
  187. package/dist/cjs/ui/theme/default_theme/tokens.js +2 -1
  188. package/dist/cjs/ui/theme/theme_context.js +2 -1
  189. package/dist/cjs/ui/theme/use_theme.js +2 -1
  190. package/dist/cjs/ui/tooltip.js +2 -1
  191. package/dist/cjs/ui/types/aria_props.js +2 -1
  192. package/dist/cjs/ui/types/data_attributes_prop.js +2 -1
  193. package/dist/cjs/ui/types/tooltip_anchor_props.js +2 -1
  194. package/dist/cjs/ui/ui.js +2 -1
  195. package/dist/cjs/ui/unstable_standalone_ui.js +2 -1
  196. package/dist/cjs/ui/use_array_identity.js +2 -1
  197. package/dist/cjs/ui/use_base.js +2 -1
  198. package/dist/cjs/ui/use_cursor.js +2 -1
  199. package/dist/cjs/ui/use_form_field.js +2 -1
  200. package/dist/cjs/ui/use_global_config.js +3 -2
  201. package/dist/cjs/ui/use_loadable.js +2 -1
  202. package/dist/cjs/ui/use_record_action_data.js +2 -1
  203. package/dist/cjs/ui/use_records.js +7 -2
  204. package/dist/cjs/ui/use_session.js +2 -1
  205. package/dist/cjs/ui/use_settings_button.js +2 -1
  206. package/dist/cjs/ui/use_styled_system.js +2 -1
  207. package/dist/cjs/ui/use_synced.js +2 -1
  208. package/dist/cjs/ui/use_text_color_for_background_color.js +2 -1
  209. package/dist/cjs/ui/use_view_metadata.js +2 -1
  210. package/dist/cjs/ui/use_viewport.js +2 -1
  211. package/dist/cjs/ui/use_watchable.js +2 -1
  212. package/dist/cjs/ui/view_picker.js +2 -1
  213. package/dist/cjs/ui/view_picker_synced.js +2 -1
  214. package/dist/cjs/ui/viewport_constraint.js +2 -1
  215. package/dist/cjs/ui/with_hooks.js +2 -1
  216. package/dist/cjs/ui/with_styled_system.js +2 -1
  217. package/dist/cjs/undo_redo.js +2 -1
  218. package/dist/cjs/unstable_private_utils.js +2 -1
  219. package/dist/cjs/unstable_testing_utils.js +3 -2
  220. package/dist/cjs/viewport.js +2 -1
  221. package/dist/cjs/warning.js +2 -1
  222. package/dist/cjs/watchable.js +125 -72
  223. package/dist/types/src/models/base.d.ts +10 -3
  224. package/dist/types/src/models/base.d.ts.map +1 -1
  225. package/dist/types/src/models/cursor.d.ts +2 -0
  226. package/dist/types/src/models/cursor.d.ts.map +1 -1
  227. package/dist/types/src/models/field.d.ts +65 -1
  228. package/dist/types/src/models/field.d.ts.map +1 -1
  229. package/dist/types/src/models/grouped_record_query_result.d.ts +3 -3
  230. package/dist/types/src/models/grouped_record_query_result.d.ts.map +1 -1
  231. package/dist/types/src/models/linked_records_query_result.d.ts.map +1 -1
  232. package/dist/types/src/models/mutation_constants.d.ts +1 -0
  233. package/dist/types/src/models/mutation_constants.d.ts.map +1 -1
  234. package/dist/types/src/models/mutations.d.ts.map +1 -1
  235. package/dist/types/src/models/query_manager.d.ts +2 -0
  236. package/dist/types/src/models/query_manager.d.ts.map +1 -0
  237. package/dist/types/src/models/record.d.ts +12 -3
  238. package/dist/types/src/models/record.d.ts.map +1 -1
  239. package/dist/types/src/models/record_query_result.d.ts +3 -2
  240. package/dist/types/src/models/record_query_result.d.ts.map +1 -1
  241. package/dist/types/src/models/record_store.d.ts.map +1 -1
  242. package/dist/types/src/models/table.d.ts +8 -4
  243. package/dist/types/src/models/table.d.ts.map +1 -1
  244. package/dist/types/src/models/table_or_view_query_result.d.ts +3 -5
  245. package/dist/types/src/models/table_or_view_query_result.d.ts.map +1 -1
  246. package/dist/types/src/models/view_data_store.d.ts +0 -1
  247. package/dist/types/src/models/view_data_store.d.ts.map +1 -1
  248. package/dist/types/src/models/view_metadata_query_result.d.ts +1 -1
  249. package/dist/types/src/models/view_metadata_query_result.d.ts.map +1 -1
  250. package/dist/types/src/private_utils.d.ts +30 -1
  251. package/dist/types/src/private_utils.d.ts.map +1 -1
  252. package/dist/types/src/sdk.d.ts.map +1 -1
  253. package/dist/types/src/testing/{mock_airtable_interface.d.ts → abstract_mock_airtable_interface.d.ts} +20 -15
  254. package/dist/types/src/testing/abstract_mock_airtable_interface.d.ts.map +1 -0
  255. package/dist/types/src/types/airtable_interface.d.ts +48 -20
  256. package/dist/types/src/types/airtable_interface.d.ts.map +1 -1
  257. package/dist/types/src/types/block_query_spec.d.ts +139 -0
  258. package/dist/types/src/types/block_query_spec.d.ts.map +1 -0
  259. package/dist/types/src/types/field.d.ts +80 -44
  260. package/dist/types/src/types/field.d.ts.map +1 -1
  261. package/dist/types/src/types/mutations.d.ts +31 -3
  262. package/dist/types/src/types/mutations.d.ts.map +1 -1
  263. package/dist/types/src/types/table.d.ts +0 -2
  264. package/dist/types/src/types/table.d.ts.map +1 -1
  265. package/dist/types/src/types/view.d.ts +3 -8
  266. package/dist/types/src/types/view.d.ts.map +1 -1
  267. package/dist/types/src/ui/cell_renderer.d.ts +1 -1
  268. package/dist/types/src/ui/color_palette.d.ts +1 -1
  269. package/dist/types/src/ui/control_sizes.d.ts +1 -1
  270. package/dist/types/src/ui/field_icon.d.ts +1 -1
  271. package/dist/types/src/ui/heading.d.ts +1 -1
  272. package/dist/types/src/ui/icon.d.ts +1 -1
  273. package/dist/types/src/ui/icon_config.d.ts +33 -31
  274. package/dist/types/src/ui/icon_config.d.ts.map +1 -1
  275. package/dist/types/src/ui/input.d.ts +10 -10
  276. package/dist/types/src/ui/link.d.ts +1 -1
  277. package/dist/types/src/ui/link.d.ts.map +1 -1
  278. package/dist/types/src/ui/record_card.d.ts +1 -1
  279. package/dist/types/src/ui/system/utils/create_style_prop_types.d.ts +1 -1
  280. package/dist/types/src/ui/system/utils/create_style_prop_types.d.ts.map +1 -1
  281. package/dist/types/src/ui/text.d.ts +1 -1
  282. package/dist/types/src/ui/theme/default_theme/index.d.ts +1 -1
  283. package/dist/types/src/ui/theme/theme_context.d.ts +1 -1
  284. package/dist/types/src/ui/theme/use_theme.d.ts +1 -1
  285. package/dist/types/src/ui/use_global_config.d.ts +1 -1
  286. package/dist/types/src/unstable_testing_utils.d.ts +1 -1
  287. package/dist/types/src/unstable_testing_utils.d.ts.map +1 -1
  288. package/dist/types/src/watchable.d.ts.map +1 -1
  289. package/dist/types/test/airtable_interface_mocks/fixture_data.d.ts +121 -0
  290. package/dist/types/test/airtable_interface_mocks/fixture_data.d.ts.map +1 -0
  291. package/dist/types/test/airtable_interface_mocks/linked_records.d.ts +2 -2
  292. package/dist/types/test/airtable_interface_mocks/linked_records.d.ts.map +1 -1
  293. package/dist/types/test/airtable_interface_mocks/{mock_airtable_interface_internal.d.ts → mock_airtable_interface.d.ts} +26 -18
  294. package/dist/types/test/airtable_interface_mocks/mock_airtable_interface.d.ts.map +1 -0
  295. package/dist/types/test/airtable_interface_mocks/mock_base_data_stores.d.ts +51 -0
  296. package/dist/types/test/airtable_interface_mocks/mock_base_data_stores.d.ts.map +1 -0
  297. package/dist/types/test/airtable_interface_mocks/project_tracker.d.ts +2 -2
  298. package/dist/types/test/airtable_interface_mocks/project_tracker.d.ts.map +1 -1
  299. package/dist/types/test/test_helpers.d.ts +2 -0
  300. package/dist/types/test/test_helpers.d.ts.map +1 -1
  301. package/package.json +2 -1
  302. package/dist/cjs/testing/mock_airtable_interface.js +0 -317
  303. package/dist/types/src/testing/mock_airtable_interface.d.ts.map +0 -1
  304. package/dist/types/test/airtable_interface_mocks/mock_airtable_interface_internal.d.ts.map +0 -1
@@ -22,7 +22,7 @@ Object.defineProperty(exports, "__esModule", {
22
22
  value: true
23
23
  });
24
24
  exports.normalizeSortsOrGroups = normalizeSortsOrGroups;
25
- exports.default = void 0;
25
+ exports.default = exports.WatchableRecordQueryResultKeys = void 0;
26
26
 
27
27
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
28
28
 
@@ -61,6 +61,8 @@ var _record_coloring = require("./record_coloring");
61
61
  /** @module @airtable/blocks/models: RecordQueryResult */
62
62
 
63
63
  /** */
64
+
65
+ /** @hidden */
64
66
  var WatchableRecordQueryResultKeys = Object.freeze({
65
67
  records: 'records',
66
68
  recordIds: 'recordIds',
@@ -70,6 +72,7 @@ var WatchableRecordQueryResultKeys = Object.freeze({
70
72
  groupLevels: 'groupLevels',
71
73
  isDataLoaded: 'isDataLoaded'
72
74
  });
75
+ exports.WatchableRecordQueryResultKeys = WatchableRecordQueryResultKeys;
73
76
  var WatchableCellValuesInFieldKeyPrefix = 'cellValuesInField:'; // The string case is to accommodate cellValuesInField:$FieldId.
74
77
 
75
78
  /**
@@ -697,4 +700,5 @@ function (_AbstractModelWithAsy) {
697
700
  (0, _defineProperty2.default)(RecordQueryResult, "WatchableKeys", WatchableRecordQueryResultKeys);
698
701
  (0, _defineProperty2.default)(RecordQueryResult, "WatchableCellValuesInFieldKeyPrefix", WatchableCellValuesInFieldKeyPrefix);
699
702
  var _default = RecordQueryResult;
700
- exports.default = _default;
703
+ exports.default = _default;
704
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbHMvcmVjb3JkX3F1ZXJ5X3Jlc3VsdC50cyJdLCJuYW1lcyI6WyJXYXRjaGFibGVSZWNvcmRRdWVyeVJlc3VsdEtleXMiLCJPYmplY3QiLCJmcmVlemUiLCJyZWNvcmRzIiwicmVjb3JkSWRzIiwiY2VsbFZhbHVlcyIsInJlY29yZENvbG9ycyIsImdyb3VwcyIsImdyb3VwTGV2ZWxzIiwiaXNEYXRhTG9hZGVkIiwiV2F0Y2hhYmxlQ2VsbFZhbHVlc0luRmllbGRLZXlQcmVmaXgiLCJfbm9ybWFsaXplU29ydE9yR3JvdXAiLCJ0YWJsZSIsInNvcnRPckdyb3VwIiwiZmllbGQiLCJfX2dldEZpZWxkTWF0Y2hpbmciLCJkaXJlY3Rpb24iLCJ1bmRlZmluZWQiLCJmaWVsZElkIiwiaWQiLCJub3JtYWxpemVTb3J0c09yR3JvdXBzIiwic29ydHNPckdyb3VwcyIsIm1hcCIsIlJlY29yZFF1ZXJ5UmVzdWx0Iiwia2V5Iiwic3RhcnRzV2l0aCIsIldhdGNoYWJsZUtleXMiLCJyZWNvcmRTdG9yZSIsIm9wdHMiLCJzb3J0cyIsImZpZWxkSWRzT3JOdWxsSWZBbGxGaWVsZHMiLCJmaWVsZHMiLCJBcnJheSIsImlzQXJyYXkiLCJmaWVsZE9yRmllbGRJZE9yRmllbGROYW1lIiwiRmllbGQiLCJwdXNoIiwicmVjb3JkQ29sb3JNb2RlIiwicmVjb3JkQ29sb3JNb2RlcyIsIm5vbmUiLCJ0eXBlIiwiUmVjb3JkQ29sb3JNb2RlVHlwZXMiLCJOT05FIiwiQllfU0VMRUNUX0ZJRUxEIiwic2VsZWN0RmllbGQiLCJGaWVsZFR5cGUiLCJTSU5HTEVfU0VMRUNUIiwicGFyZW50VGFibGUiLCJCWV9WSUVXIiwidmlldyIsInRhYmxlSWQiLCJzZGsiLCJub3JtYWxpemVkT3B0cyIsIl9ub3JtYWxpemVkT3B0cyIsIl9yZWNvcmRTdG9yZSIsInJlY29yZElkIiwicmVjb3JkIiwiZ2V0UmVjb3JkQnlJZElmRXhpc3RzIiwiaGFzUmVjb3JkIiwicmVjb3JkT3JSZWNvcmRJZCIsImdldFJlY29yZEJ5SWQiLCJfZ2V0T3JHZW5lcmF0ZVJlY29yZElkc1NldCIsIl9nZXRSZWNvcmQiLCJ2YWx1ZSIsImdldENlbGxWYWx1ZSIsImNvbG9yIiwiQ29sb3JzIiwiZ2V0Vmlld0RhdGFTdG9yZSIsImdldFJlY29yZENvbG9yIiwiX29uQ2hhbmdlIiwia2V5cyIsImNhbGxiYWNrIiwiY29udGV4dCIsInZhbGlkS2V5cyIsIl93YXRjaFJlY29yZENvbG9yc0lmTmVlZGVkIiwiX3Vud2F0Y2hSZWNvcmRDb2xvcnNJZlBvc3NpYmxlIiwiX2NoYW5nZVdhdGNoZXJzQnlLZXkiLCJ3YXRjaENvdW50IiwibGVuZ3RoIiwiX3JlY29yZENvbG9yQ2hhbmdlSGFuZGxlciIsIl93YXRjaFJlY29yZENvbG9ycyIsImhhbmRsZXIiLCJtb2RlbCIsIndhdGNoIiwiX3Vud2F0Y2hSZWNvcmRDb2xvcnMiLCJ1bndhdGNoIiwiaXNEZWxldGVkIiwibG9hZERhdGFBc3luYyIsInVubG9hZERhdGEiLCJKU09OIiwic3RyaW5naWZ5IiwiQWJzdHJhY3RNb2RlbFdpdGhBc3luY0RhdGEiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQTs7QUFHQTs7QUFDQTs7QUFVQTs7QUFHQTs7QUFFQTs7QUFHQTs7QUF2QkE7O0FBQTBEOztBQThCMUQ7QUFDTyxJQUFNQSw4QkFBOEIsR0FBR0MsTUFBTSxDQUFDQyxNQUFQLENBQWM7QUFDeERDLEVBQUFBLE9BQU8sRUFBRSxTQUQrQztBQUV4REMsRUFBQUEsU0FBUyxFQUFFLFdBRjZDO0FBR3hEQyxFQUFBQSxVQUFVLEVBQUUsWUFINEM7QUFJeERDLEVBQUFBLFlBQVksRUFBRSxjQUowQztBQUt4REMsRUFBQUEsTUFBTSxFQUFFLFFBTGdEO0FBTXhEQyxFQUFBQSxXQUFXLEVBQUUsYUFOMkM7QUFPeERDLEVBQUFBLFlBQVksRUFBRTtBQVAwQyxDQUFkLENBQXZDOztBQVNQLElBQU1DLG1DQUFt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akMsU0FBTCxDQUFla0IsR0FBZixDQUFtQmlDLFFBQVEsSUFBSTtBQUNsQyxZQUFNQyxNQUFNLEdBQUcsS0FBS0YsWUFBTCxDQUFrQkcscUJBQWxCLENBQXdDRixRQUF4QyxDQUFmOztBQUNBLG9DQUFVQyxNQUFWLEVBQWtCLHlCQUFsQjtBQUNBLGVBQU9BLE1BQVA7QUFDSCxPQUpNLENBQVA7QUFLSDs7O0VBaExtRG1DLHVDOzs4QkFBekNwRSxpQixnQkFNUyxtQjs4QkFOVEEsaUIsbUJBb0NZdkIsOEI7OEJBcENadUIsaUIseUNBc0NrQ2IsbUM7ZUF3Y2xDYSxpQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBhaXJ0YWJsZS9ibG9ja3MvbW9kZWxzOiBSZWNvcmRRdWVyeVJlc3VsdCAqLyAvKiogKi9cbmltcG9ydCBDb2xvcnMsIHtDb2xvcn0gZnJvbSAnLi4vY29sb3JzJztcbmltcG9ydCBTZGsgZnJvbSAnLi4vc2RrJztcbmltcG9ydCB7UmVjb3JkSWR9IGZyb20gJy4uL3R5cGVzL3JlY29yZCc7XG5pbXBvcnQge0ZpZWxkVHlwZSwgRmllbGRJZH0gZnJvbSAnLi4vdHlwZXMvZmllbGQnO1xuaW1wb3J0IHtcbiAgICBpc0VudW1WYWx1ZSxcbiAgICBhc3NlcnRFbnVtVmFsdWUsXG4gICAgZ2V0TG9jYWxseVVuaXF1ZUlkLFxuICAgIE9iamVjdFZhbHVlcyxcbiAgICBPYmplY3RNYXAsXG4gICAgY2FzdCxcbiAgICBGbG93QW55RnVuY3Rpb24sXG4gICAgRmxvd0FueU9iamVjdCxcbn0gZnJvbSAnLi4vcHJpdmF0ZV91dGlscyc7XG5pbXBvcnQge3NwYXduVW5rbm93blN3aXRjaENhc2VFcnJvciwgc3Bhd25FcnJvciwgaW52YXJpYW50fSBmcm9tICcuLi9lcnJvcl91dGlscyc7XG5pbXBvcnQgV2F0Y2hhYmxlIGZyb20gJy4uL3dhdGNoYWJsZSc7XG5pbXBvcnQge05vcm1hbGl6ZWRHcm91cExldmVsfSBmcm9tICcuLi90eXBlcy9haXJ0YWJsZV9pbnRlcmZhY2UnO1xuaW1wb3J0IEFic3RyYWN0TW9kZWxXaXRoQXN5bmNEYXRhIGZyb20gJy4vYWJzdHJhY3RfbW9kZWxfd2l0aF9hc3luY19kYXRhJztcbmltcG9ydCBUYWJsZSBmcm9tICcuL3RhYmxlJztcbmltcG9ydCBGaWVsZCBmcm9tICcuL2ZpZWxkJztcbmltcG9ydCBSZWNvcmQgZnJvbSAnLi9yZWNvcmQnO1xuaW1wb3J0IFJlY29yZFN0b3JlIGZyb20gJy4vcmVjb3JkX3N0b3JlJztcbmltcG9ydCB7XG4gICAgTW9kZVR5cGVzIGFzIFJlY29yZENvbG9yTW9kZVR5cGVzLFxuICAgIG1vZGVzIGFzIHJlY29yZENvbG9yTW9kZXMsXG4gICAgc2VyaWFsaXplIGFzIHNlcmlhbGl6ZUNvbG9yTW9kZSxcbiAgICBSZWNvcmRDb2xvck1vZGUsXG59IGZyb20gJy4vcmVjb3JkX2NvbG9yaW5nJztcblxuLyoqIEBoaWRkZW4gKi9cbmV4cG9ydCBjb25zdCBXYXRjaGFibGVSZWNvcmRRdWVyeVJlc3VsdEtleXMgPSBPYmplY3QuZnJlZXplKHtcbiAgICByZWNvcmRzOiAncmVjb3JkcycgYXMgY29uc3QsXG4gICAgcmVjb3JkSWRzOiAncmVjb3JkSWRzJyBhcyBjb25zdCxcbiAgICBjZWxsVmFsdWVzOiAnY2VsbFZhbHVlcycgYXMgY29uc3QsXG4gICAgcmVjb3JkQ29sb3JzOiAncmVjb3JkQ29sb3JzJyBhcyBjb25zdCxcbiAgICBncm91cHM6ICdncm91cHMnIGFzIGNvbnN0LFxuICAgIGdyb3VwTGV2ZWxzOiAnZ3JvdXBMZXZlbHMnIGFzIGNvbnN0LFxuICAgIGlzRGF0YUxvYWRlZDogJ2lzRGF0YUxvYWRlZCcgYXMgY29uc3QsXG59KTtcbmNvbnN0IFdhdGNoYWJsZUNlbGxWYWx1ZXNJbkZpZWxkS2V5UHJlZml4ID0gJ2NlbGxWYWx1ZXNJbkZpZWxkOic7XG5cbi8vIFRoZSBzdHJpbmcgY2FzZSBpcyB0byBhY2NvbW1vZGF0ZSBjZWxsVmFsdWVzSW5GaWVsZDokRmllbGRJZC5cbi8qKlxuICogQSBrZXkgaW4ge0BsaW5rIFJlY29yZFF1ZXJ5UmVzdWx0fSB0aGF0IGNhbiBiZSB3YXRjaGVkXG4gKiAtIGByZWNvcmRzYFxuICogLSBgcmVjb3JkSWRzYFxuICogLSBgY2VsbFZhbHVlc2BcbiAqIC0gYHJlY29yZENvbG9yc2BcbiAqIC0gYGlzRGF0YUxvYWRlZGBcbiAqIC0gYGNlbGxWYWx1ZXNJbkZpZWxkOntGSUVMRF9JRH1gXG4gKi9cbmV4cG9ydCB0eXBlIFdhdGNoYWJsZVJlY29yZFF1ZXJ5UmVzdWx0S2V5ID1cbiAgICB8IE9iamVjdFZhbHVlczx0eXBlb2YgV2F0Y2hhYmxlUmVjb3JkUXVlcnlSZXN1bHRLZXlzPlxuICAgIHwgc3RyaW5nO1xuXG4vKiogKi9cbmludGVyZmFjZSBTb3J0Q29uZmlnIHtcbiAgICAvKiogQSBmaWVsZCwgZmllbGQgaWQsIG9yIGZpZWxkIG5hbWUuICovXG4gICAgZmllbGQ6IEZpZWxkIHwgRmllbGRJZCB8IHN0cmluZztcbiAgICAvKiogVGhlIG9yZGVyIHRvIHNvcnQgaW4uIERlZmF1bHRzIHRvIGFzYy4gKi9cbiAgICBkaXJlY3Rpb24/OiAnYXNjJyB8ICdkZXNjJztcbn1cblxuLyoqIEBoaWRkZW4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTm9ybWFsaXplZFNvcnRDb25maWcge1xuICAgIGZpZWxkSWQ6IHN0cmluZztcbiAgICBkaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZWRHcm91cExldmVsIGlzIGluIGFpcnRhYmxlX2ludGVyZmFjZVxuICpcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHcm91cExldmVsRm9yVXBkYXRlIHtcbiAgICAvKiogQSBmaWVsZCwgZmllbGQgaWQsIG9yIGZpZWxkIG5hbWUuICovXG4gICAgZmllbGQ6IEZpZWxkIHwgRmllbGRJZCB8IHN0cmluZztcbiAgICAvKiogVGhlIG9yZGVyIHRvIHNvcnQgdGhpcyBncm91cCBpbi4gRGVmYXVsdHMgdG8gYXNjLiAqL1xuICAgIGRpcmVjdGlvbj86ICdhc2MnIHwgJ2Rlc2MnIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFZpZXcgQ29uZmlnIHRoYXQgY2FuIGJlIHNldCBieSBkZXZlbG9wZXJcbiAqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlld01ldGFkYXRhRm9yVXBkYXRlIHtcbiAgICAvKiogR3JvdXBzIGNvbmZpZyB0aGF0IGNhbiBiZSBzZXQgYnkgZGV2ZWxvcGVyOyBudWxsIHdpbGwgY2xlYXIgaXQsIHVuZGVmaW5lZCB3aWxsIHNraXAgaXQqL1xuICAgIGdyb3VwTGV2ZWxzPzogQXJyYXk8R3JvdXBMZXZlbEZvclVwZGF0ZT4gfCBudWxsIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFVzZWQgdG8gY29udHJvbCB3aGF0IGRhdGEgaXMgbG9hZGVkIGluIGEge0BsaW5rIFJlY29yZFF1ZXJ5UmVzdWx0fS4gVXNlZCB3aGVuIGNyZWF0aW5nIGFcbiAqIHF1ZXJ5IHJlc3VsdCB1c2luZyBgdGFibGUvdmlldy5zZWxlY3RSZWNvcmRzKClgIGFuZCBpbiBjb252ZW5pZW5jZSBob29rcyB7QGxpbmsgdXNlUmVjb3Jkc30uXG4gKlxuICogIyMgc29ydHNcbiAqIFBhc3MgYW4gYXJyYXkgb2Ygc29ydHMgdG8gY29udHJvbCB0aGUgb3JkZXIgb2YgcmVjb3Jkcy4gVGhlIGZpcnN0IHNvcnQgaW4gdGhlIGFycmF5IGhhcyB0aGVcbiAqIGhpZ2hlc3QgcHJpb3JpdHkuIElmIHlvdSBkb24ndCBzcGVjaWZ5IHNvcnRzLCB0aGUgcmVzdWx0IHdpbGwgdXNlIHRoZSBpbmhlcmVudCBvcmRlciBvZiB0aGVcbiAqIHNvdXJjZSBtb2RlbDogdGhlIHNhbWUgb3JkZXIgeW91J2Qgc2VlIGluIHRoZSBtYWluIFVJIGZvciB2aWV3cyBhbmQgbGlua2VkIHJlY29yZCBmaWVsZHMsIGFuZFxuICogYW4gYXJiaXRyYXJ5IChidXQgc3RhYmxlKSBvcmRlciBmb3IgdGFibGVzLlxuICpcbiAqIFJlY29yZCBjcmVhdGlvbiB0aW1lIGlzIHVzZWQgYXMgYSB0aWVicmVha2VyOiBwYXNzIGFuIGVtcHR5IGFycmF5IHRvIHNvcnQgYnkgY3JlYXRpb24gdGltZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3Qgb3B0cyA9IHtcbiAqICAgICBzb3J0czogW1xuICogICAgICAgICAvLyBzb3J0IGJ5IHNvbWVGaWVsZCBpbiBhc2NlbmRpbmcgb3JkZXIuLi5cbiAqICAgICAgICAge2ZpZWxkOiBzb21lRmllbGR9LFxuICogICAgICAgICAvLyB0aGVuIGJ5IHNvbWVPdGhlckZpZWxkIGluIGRlc2NlbmRpbmcgb3JkZXJcbiAqICAgICAgICAge2ZpZWxkOiBzb21lT3RoZXJGaWVsZCwgZGlyZWN0aW9uOiAnZGVzYyd9LFxuICogICAgIF1cbiAqIH07XG4gKiBjb25zdCByZWNvcmRzID0gdXNlUmVjb3Jkcyh0YWJsZSwgb3B0cyk7XG4gKiBjb25zdCBxdWVyeVJlc3VsdCA9IHRhYmxlLnNlbGVjdFJlY29yZHMob3B0cyk7XG4gKiBgYGBcbiAqXG4gKiAjIyBmaWVsZHNcbiAqIEdlbmVyYWxseSwgaXQncyBhIGdvb2QgaWRlYSB0byBsb2FkIGFzIGxpdHRsZSBkYXRhIGludG8geW91ciBhcHAgYXMgcG9zc2libGUgLSBBaXJ0YWJsZSBiYXNlc1xuICogY2FuIGdldCBwcmV0dHkgYmlnLCBhbmQgd2UgaGF2ZSB0byBrZWVwIGFsbCB0aGF0IGluZm9ybWF0aW9uIGluIG1lbW9yeSBhbmQgdXAgdG8gZGF0ZSBpZiB5b3UgYXNrXG4gKiBmb3IgaXQuIFRoZSBmaWVsZHMgb3B0aW9uIGxldHMgeW91IG1ha2Ugc3VyZSB0aGF0IG9ubHkgZGF0YSByZWxldmFudCB0byB5b3UgaXMgbG9hZGVkLlxuICpcbiAqIFlvdSBjYW4gc3BlY2lmeSBmaWVsZHMgd2l0aCBhIHtAbGluayBGaWVsZH0sIGJ5IElELCBvciBieSBuYW1lOlxuICogYGBganNcbiAqIGNvbnN0IG9wdHMgPSB7XG4gKiAgICAgZmllbGRzOiBbXG4gKiAgICAgICAgIC8vIHdlIHdhbnQgdG8gb25seSBsb2FkIGZpZWxkQTpcbiAqICAgICAgICAgZmllbGRBLFxuICogICAgICAgICAvLyB0aGUgZmllbGQgd2l0aCB0aGlzIGlkOlxuICogICAgICAgICAnZmxkWFhYWFhYWFhYWFhYWFgnLFxuICogICAgICAgICAvLyBhbmQgdGhlIGZpZWxkIG5hbWVkICdSYXRpbmcnOlxuICogICAgICAgICAnUmF0aW5nJyxcbiAqICAgICBdLFxuICogfTtcbiAqIGNvbnN0IHJlY29yZHMgPSB1c2VSZWNvcmRzKHRhYmxlLCBvcHRzKTtcbiAqIGNvbnN0IHF1ZXJ5UmVzdWx0ID0gdGFibGUuc2VsZWN0UmVjb3JkcyhvcHRzKTtcbiAqIGBgYFxuICpcbiAqICMjIHJlY29yZENvbG9yTW9kZVxuICogSnVzdCBsaWtlIGEgdmlldyBpbiBBaXJ0YWJsZSwgeW91IGNhbiBjb250cm9sIHRoZSBjb2xvcnMgb2YgcmVjb3JkcyBpbiBhIGZpZWxkLiBUaGVyZSBhcmUgdGhyZWVcbiAqIHN1cHBvcnRlZCByZWNvcmQgY29sb3IgbW9kZXM6IG5vbmUsIGJ5IGEgdmlldywgYW5kIGJ5IGEgc2VsZWN0IGZpZWxkLlxuICpcbiAqIGBgYGpzXG4gKiBpbXBvcnQge3JlY29yZENvbG9yaW5nfSBmcm9tICdAYWlydGFibGUvYmxvY2tzL21vZGVscyc7XG4gKiAvLyBObyByZWNvcmQgY29sb3Jpbmc6XG4gKiBjb25zdCBvcHRzID0ge1xuICogICAgIHJlY29yZENvbG9yTW9kZTogcmVjb3JkQ29sb3JpbmcubW9kZXMubm9uZSgpLFxuICogfTtcbiAqXG4gKiAvLyBDb2xvciBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIG9mIGEgdmlldzpcbiAqIGNvbnN0IG9wdHMgPSB7XG4gKiAgICAgcmVjb3JkQ29sb3JNb2RlOiByZWNvcmRDb2xvcmluZy5tb2Rlcy5ieVZpZXcoc29tZVZpZXcpLFxuICogfTtcbiAqXG4gKiAvLyBDb2xvciBieSBhIHNpbmdsZSBzZWxlY3QgZmllbGQ6XG4gKiBjb25zdCBvcHRzID0ge1xuICogICAgIHJlY29yZENvbG9yTW9kZTogcmVjb3JkQ29sb3JpbmcubW9kZXMuYnlTZWxlY3RGaWVsZChzb21lU2VsZWN0RmllbGQpLFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBZb3UgY2FuIGFjY2VzcyB2aWV3IGNvbG9yaW5nIGluZm9ybWF0aW9uIGRpcmVjdGx5IGZyb20gYSB7QGxpbmsgUmVjb3JkUXVlcnlSZXN1bHR9IG9yIGFcbiAqIHtAbGluayBSZWNvcmR9LCBidXQgeW91IGNhbiBvbmx5IGRpcmVjdGx5IGFjY2VzcyBzaW5nbGUgc2VsZWN0IGNvbG9yaW5nIGZyb20gYSBSZWNvcmRRdWVyeVJlc3VsdDpcbiAqXG4gKiBgYGBcbiAqIGNvbnN0IHF1ZXJ5UmVzdWx0ID0gdGFibGUuc2VsZWN0UmVjb3JkcyhvcHRzKTtcbiAqIGNvbnN0IHJlY29yZHMgPSB1c2VSZWNvcmRzKHRhYmxlLCBvcHRzKTtcbiAqXG4gKiAvLyBSZXR1cm5zIGJhc2VkIG9uIG9wdHMgY29sb3JpbmcgbW9kZVxuICogcXVlcnlSZXN1bHQuZ2V0UmVjb3JkQ29sb3IocmVjb3JkSWQpO1xuICpcbiAqIC8vIFJldHVybnMgYmFzZWQgb24gdmlld1xuICogLy8gV2lsbCB0aHJvdyBpZiB5b3UgZGlkIG5vdCBwYXNzIHJlY29yZENvbG9yaW5nLm1vZGVzLmJ5Vmlldyh2aWV3KSBpbiBvcHRzXG4gKiByZWNvcmRzWzBdLmdldENvbG9ySW5WaWV3KHZpZXcpO1xuICogYGBgXG4gKlxuICogVXNlIGByZWNvcmQuZ2V0Q2VsbFZhbHVlKHNpbmdsZVNlbGVjdEZpZWxkKS5jb2xvcmAgdG8gYWNjZXNzIHRoZSBjb2xvciBvZiBhIHNpbmdsZSBzZWxlY3QgZmllbGRcbiAqIGZvciBhIHJlY29yZC5cbiAqXG4gKiBCeSBkZWZhdWx0LCB2aWV3cyB3aWxsIGhhdmUgd2hpY2hldmVyIGNvbG9yaW5nIGlzIHNldCB1cCBpbiBBaXJ0YWJsZSBhbmQgdGFibGVzIHdvbid0IGhhdmUgYW55XG4gKiByZWNvcmQgY29sb3Jpbmc6XG4gKlxuICogYGBganNcbiAqIC8vIHRoZXNlIHR3byBhcmUgdGhlIHNhbWU6XG4gKiBzb21lVmlldy5zZWxlY3RSZWNvcmRzKCk7XG4gKiBzb21lVmlldy5zZWxlY3RSZWNvcmRzKHtcbiAqICAgICByZWNvcmRDb2xvck1vZGU6IHJlY29yZENvbG9yaW5nLm1vZGVzLmJ5Vmlldyhzb21lVmlldyksXG4gKiB9KTtcbiAqXG4gKiAvLyBhcyBhcmUgdGhlc2UgdHdvOlxuICogc29tZVRhYmxlLnNlbGVjdFJlY29yZHMoKTtcbiAqIHNvbWVUYWJsZS5zZWxlY3RSZWNvcmRzKHtcbiAqICAgICByZWNvcmRDb2xvck1vZGU6IHJlY29yZENvbG9yaW5nLm1vZGVzLm5vbmUoKSxcbiAqIH0pO1xuICogYGBgXG4gKlxuICogKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3JkUXVlcnlSZXN1bHRPcHRzIHtcbiAgICAvKiogVGhlIG9yZGVyIGluIHdoaWNoIHRvIHNvcnQgdGhlIHF1ZXJ5IHJlc3VsdCAqL1xuICAgIHNvcnRzPzogQXJyYXk8U29ydENvbmZpZz47XG4gICAgLyoqIFRoZSBmaWVsZHMgKG9yIGZpZWxkIG5hbWVzIG9yIGZpZWxkIGlkcykgdG8gbG9hZC4gRmFsc2V5IHZhbHVlcyB3aWxsIGJlIHJlbW92ZWQuICovXG4gICAgZmllbGRzPzogQXJyYXk8RmllbGQgfCBGaWVsZElkIHwgc3RyaW5nIHwgdm9pZCB8IG51bGwgfCBmYWxzZT47XG4gICAgLyoqIEhvdyByZWNvcmRzIGluIHRoaXMgUXVlcnlSZXN1bHQgc2hvdWxkIGJlIGNvbG9yZWQuICovXG4gICAgcmVjb3JkQ29sb3JNb2RlPzogbnVsbCB8IFJlY29yZENvbG9yTW9kZTtcbn1cblxuLyoqXG4gKiBBIHN1YnNldCBvZiB7QGxpbmsgUmVjb3JkUXVlcnlSZXN1bHRPcHRzfSB1c2VkIGluIHtAbGluayB1c2VSZWNvcmRCeUlkfSB0aGF0IG9taXRzIHNvcnRzLCBhc1xuICogdGhlcmUgaXMgb25seSBhIHNpbmdsZSByZWNvcmQuXG4gKlxuICogU2VlIFJlY29yZFF1ZXJ5UmVzdWx0T3B0cyBmb3IgZnVsbCBkZXRhaWxzIGFuZCBleGFtcGxlcy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3Qgb3B0cyA9IHtcbiAqICAgICBmaWVsZHM6IFsnTXkgZmllbGQnXSxcbiAqICAgICByZWNvcmRDb2xvck1vZGU6IHJlY29yZENvbG9yaW5nLm1vZGVzLmJ5Vmlldyh2aWV3KSxcbiAqIH07XG4gKiBjb25zdCByZWNvcmQgPSB1c2VSZWNvcmRCeUlkKHRhYmxlLCByZWNvcmRJZCwgb3B0cyk7XG4gKiAqL1xuZXhwb3J0IHR5cGUgU2luZ2xlUmVjb3JkUXVlcnlSZXN1bHRPcHRzID0gUGljazxSZWNvcmRRdWVyeVJlc3VsdE9wdHMsICdmaWVsZHMnIHwgJ3JlY29yZENvbG9yTW9kZSc+O1xuXG4vKipcbiAqIEEgc3Vic2V0IG9mIHtAbGluayBSZWNvcmRRdWVyeVJlc3VsdE9wdHN9IHVzZWQgaW4ge0BsaW5rIHVzZVJlY29yZElkc30gdGhhdCBvbWl0cyBmaWVsZHMgYW5kXG4gKiByZWNvcmRDb2xvck1vZGUsIGFzIHJlY29yZCBjZWxsIHZhbHVlcyBhbmQgY29sb3IgYXJlIG5vdCBhY2Nlc3NpYmxlIHZpYSB0aGlzIGhvb2suXG4gKlxuICogU2VlIFJlY29yZFF1ZXJ5UmVzdWx0T3B0cyBmb3IgZnVsbCBkZXRhaWxzIGFuZCBleGFtcGxlcy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3Qgb3B0cyA9IHtcbiAqICAgICBzb3J0czogW1xuICogICAgICAgICAvLyBzb3J0IGJ5IHNvbWVGaWVsZCBpbiBhc2NlbmRpbmcgb3JkZXIuLi5cbiAqICAgICAgICAge2ZpZWxkOiBzb21lRmllbGR9LFxuICogICAgICAgICAvLyB0aGVuIGJ5IHNvbWVPdGhlckZpZWxkIGluIGRlc2NlbmRpbmcgb3JkZXJcbiAqICAgICAgICAge2ZpZWxkOiBzb21lT3RoZXJGaWVsZCwgZGlyZWN0aW9uOiAnZGVzYyd9LFxuICogICAgIF1cbiAqIH07XG4gKiBjb25zdCByZWNvcmRJZHMgPSB1c2VSZWNvcmRJZHModGFibGUsIG9wdHMpO1xuICogKi9cbmV4cG9ydCB0eXBlIFJlY29yZElkUXVlcnlSZXN1bHRPcHRzID0gUGljazxSZWNvcmRRdWVyeVJlc3VsdE9wdHMsICdzb3J0cyc+O1xuXG4vKiogQGludGVybmFsICovXG5leHBvcnQgaW50ZXJmYWNlIE5vcm1hbGl6ZWRSZWNvcmRRdWVyeVJlc3VsdE9wdHMge1xuICAgIHNvcnRzOiBBcnJheTxOb3JtYWxpemVkU29ydENvbmZpZz4gfCBudWxsO1xuICAgIGZpZWxkSWRzT3JOdWxsSWZBbGxGaWVsZHM6IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIHJlY29yZENvbG9yTW9kZTogUmVjb3JkQ29sb3JNb2RlO1xuICAgIHRhYmxlOiBUYWJsZTtcbiAgICByZWNvcmRTdG9yZTogUmVjb3JkU3RvcmU7XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmludGVyZmFjZSBVbmtub3duQ29sb3JNb2RlIHtcbiAgICB0eXBlOiBuZXZlcjtcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gX25vcm1hbGl6ZVNvcnRPckdyb3VwKHRhYmxlOiBUYWJsZSwgc29ydE9yR3JvdXA6IFNvcnRDb25maWcgfCBHcm91cExldmVsRm9yVXBkYXRlKSB7XG4gICAgY29uc3QgZmllbGQgPSB0YWJsZS5fX2dldEZpZWxkTWF0Y2hpbmcoc29ydE9yR3JvdXAuZmllbGQpO1xuICAgIGlmIChcbiAgICAgICAgc29ydE9yR3JvdXAuZGlyZWN0aW9uICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgc29ydE9yR3JvdXAuZGlyZWN0aW9uICE9PSAnYXNjJyAmJlxuICAgICAgICBzb3J0T3JHcm91cC5kaXJlY3Rpb24gIT09ICdkZXNjJ1xuICAgICkge1xuICAgICAgICB0aHJvdyBzcGF3bkVycm9yKCdJbnZhbGlkIHNvcnQgZGlyZWN0aW9uOiAlcycsIHNvcnRPckdyb3VwLmRpcmVjdGlvbik7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGZpZWxkSWQ6IGZpZWxkLmlkLFxuICAgICAgICBkaXJlY3Rpb246IHNvcnRPckdyb3VwLmRpcmVjdGlvbiA/PyAnYXNjJyxcbiAgICB9O1xufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU29ydHNPckdyb3VwcyhcbiAgICB0YWJsZTogVGFibGUsXG4gICAgc29ydHNPckdyb3VwczogQXJyYXk8U29ydENvbmZpZyB8IEdyb3VwTGV2ZWxGb3JVcGRhdGU+IHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IEFycmF5PE5vcm1hbGl6ZWRHcm91cExldmVsIHwgTm9ybWFsaXplZFNvcnRDb25maWc+IHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHNvcnRzT3JHcm91cHMgPT09IHVuZGVmaW5lZCB8fCBzb3J0c09yR3JvdXBzID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBzb3J0c09yR3JvdXBzO1xuICAgIH1cbiAgICByZXR1cm4gc29ydHNPckdyb3Vwcy5tYXAoc29ydE9yR3JvdXAgPT4gX25vcm1hbGl6ZVNvcnRPckdyb3VwKHRhYmxlLCBzb3J0T3JHcm91cCkpO1xufVxuXG4vKipcbiAqIEEgUmVjb3JkUXVlcnlSZXN1bHQgcmVwcmVzZW50cyBhIHNldCBvZiByZWNvcmRzLiBJdCdzIGEgbGl0dGxlIGJpdCBsaWtlIGEgb25lLW9mZiBWaWV3IGluIEFpcnRhYmxlOiBpdFxuICogY29udGFpbnMgYSBidW5jaCBvZiByZWNvcmRzLCBmaWx0ZXJlZCB0byBhIHVzZWZ1bCBzdWJzZXQgb2YgdGhlIHJlY29yZHMgaW4gdGhlIHRhYmxlLiBUaG9zZVxuICogcmVjb3JkcyBjYW4gYmUgc29ydGVkIGFjY29yZGluZyB0byB5b3VyIHNwZWNpZmljYXRpb24sIGFuZCB0aGV5IGNhbiBiZSBjb2xvcmVkIGJ5IGEgc2VsZWN0IGZpZWxkXG4gKiBvciB1c2luZyB0aGUgY29sb3IgZnJvbSBhIHZpZXcuIEp1c3QgbGlrZSBhIHZpZXcsIHlvdSBjYW4gZWl0aGVyIGhhdmUgYWxsIHRoZSBmaWVsZHMgaW4gYSB0YWJsZVxuICogYXZhaWxhYmxlLCBvciB5b3UgY2FuIGp1c3QgYXNrIGZvciB0aGUgZmllbGRzIHRoYXQgYXJlIHJlbGV2YW50IHRvIHlvdS4gVGhlcmUgYXJlIHR3byB0eXBlcyBvZlxuICogUXVlcnlSZXN1bHQ6XG4gKlxuICogLSB7QGxpbmsgVGFibGVPclZpZXdRdWVyeVJlc3VsdH0gaXMgdGhlIG1vc3QgY29tbW9uLCBhbmQgaXMgYSBxdWVyeSByZXN1bHQgZmlsdGVyZWQgdG8gYWxsIHRoZVxuICogICByZWNvcmRzIGluIGEgc3BlY2lmaWMge0BsaW5rIFRhYmxlfSBvciB7QGxpbmsgVmlld30uIFlvdSBjYW4gZ2V0IG9uZSBvZiB0aGVzZSB3aXRoXG4gKiAgIGB0YWJsZS5zZWxlY3RSZWNvcmRzKClgIG9yIGB2aWV3LnNlbGVjdFJlY29yZHMoKWAuXG4gKiAtIHtAbGluayBMaW5rZWRSZWNvcmRzUXVlcnlSZXN1bHR9IGlzIGEgcXVlcnkgcmVzdWx0IG9mIGFsbCB0aGUgcmVjb3JkcyBpbiBhIHBhcnRpY3VsYXJcbiAqICAgW2xpbmtlZCByZWNvcmQgY2VsbF0oaHR0cHM6Ly9zdXBwb3J0LmFpcnRhYmxlLmNvbS9oYy9lbi11cy9hcnRpY2xlcy8yMDY0NTI4NDgtTGlua2VkLXJlY29yZC1maWVsZHMpLlxuICogICBZb3UgY2FuIGdldCBvbmUgb2YgdGhlc2Ugd2l0aCBgcmVjb3JkLnNlbGVjdExpbmtlZFJlY29yZHNGcm9tQ2VsbChzb21lRmllbGQpYC5cbiAqXG4gKiBPbmNlIHlvdSd2ZSBnb3QgYSBxdWVyeSByZXN1bHQsIHlvdSBuZWVkIHRvIGxvYWQgaXQgYmVmb3JlIHlvdSBjYW4gc3RhcnQgd29ya2luZyB3aXRoIGl0IC1cbiAqIGFwcHMgZG9uJ3QgbG9hZCByZWNvcmQgZGF0YSBieSBkZWZhdWx0LiBXZSByZWNvbW1lbmQgdXNpbmcge0BsaW5rIHVzZVJlY29yZHN9LFxuICoge0BsaW5rIHVzZVJlY29yZElkc30sIHtAbGluayB1c2VSZWNvcmRCeUlkfSBvciB7QGxpbmsgdXNlTG9hZGFibGV9IHRvIGhhbmRsZSB0aGlzLlxuICpcbiAqIElmIHlvdSdyZSBub3QgdXNpbmcgYSBxdWVyeSByZXN1bHQgaW4gYSBSZWFjdCBjb21wb25lbnQsIHlvdSBjYW4gbWFudWFsbHkgbG9hZCB0aGUgZGF0YSBhbmRcbiAqIHVubG9hZCBpdCB3aGVuIHlvdSdyZSBmaW5pc2hlZDpcbiAqXG4gKiBgYGBqc1xuICogYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZWNvcmRzQW5kRG9Tb21ldGhpbmdBc3luYyhteVRhYmxlKSB7XG4gKiAgICAgLy8gcXVlcnkgZm9yIGFsbCB0aGUgcmVjb3JkcyBpbiBcIm15VGFibGVcIlxuICogICAgIGNvbnN0IHF1ZXJ5UmVzdWx0ID0gbXlUYWJsZS5zZWxlY3RSZWNvcmRzKCk7XG4gKlxuICogICAgIC8vIGxvYWQgdGhlIGRhdGEgaW4gdGhlIHF1ZXJ5IHJlc3VsdDpcbiAqICAgICBhd2FpdCBxdWVyeVJlc3VsdC5sb2FkRGF0YUFzeW5jKCk7XG4gKlxuICogICAgIC8vIHdvcmsgd2l0aCB0aGUgZGF0YSBpbiB0aGUgcXVlcnkgcmVzdWx0XG4gKiAgICAgZG9Tb21ldGhpbmcocXVlcnlSZXN1bHQpO1xuICpcbiAqICAgICAvLyB3aGVuIHlvdSdyZSBkb25lLCB1bmxvYWQgdGhlIGRhdGE6XG4gKiAgICAgcXVlcnlSZXN1bHQudW5sb2FkRGF0YSgpO1xuICogfVxuICogYGBgXG4gKlxuICogV2hpbHN0IGxvYWRlZCwgYSBxdWVyeSByZXN1bHQgd2lsbCBhdXRvbWF0aWNhbGx5IGtlZXAgdXAgdG8gZGF0ZSB3aXRoIHdoYXQncyBpbiBBaXJ0YWJsZTpcbiAqIHJlY29yZHMgd2lsbCBnZXQgYWRkZWQgb3IgcmVtb3ZlZCwgdGhlIG9yZGVyIHdpbGwgY2hhbmdlLCBjZWxsIHZhbHVlcyB3aWxsIGJlIHVwZGF0ZWQsIGV0Yy5cbiAqIEFnYWluLCBpZiB5b3UncmUgd3JpdGluZyBhIFJlYWN0IGNvbXBvbmVudCB0aGVuIG91ciBob29rcyB3aWxsIGxvb2sgYWZ0ZXIgdGhhdCBmb3IgeW91LiBJZiBub3QsXG4gKiB5b3UgY2FuIGdldCBub3RpZmllZCBvZiB0aGVzZSBjaGFuZ2VzIHdpdGggYC53YXRjaCgpYC5cbiAqXG4gKiBXaGVuIGNhbGxpbmcgYSBgLnNlbGVjdCpgIG1ldGhvZCwgeW91IGNhbiBwYXNzIGluIGEgbnVtYmVyIG9mIG9wdGlvbnMgdG8gY29udHJvbCB0aGUgc29ydCBvcmRlcixcbiAqIGZpZWxkcyBsb2FkZWQgYW5kIGNvbG9yaW5nIG1vZGUgb2YgcmVjb3Jkczogc2VlIHtAbGluayBSZWNvcmRRdWVyeVJlc3VsdE9wdHN9IGZvciBleGFtcGxlcy5cbiAqXG4gKiBAZG9jc1BhdGggbW9kZWxzL3F1ZXJ5IHJlc3VsdHMvUmVjb3JkUXVlcnlSZXN1bHRcbiAqL1xuYWJzdHJhY3QgY2xhc3MgUmVjb3JkUXVlcnlSZXN1bHQ8RGF0YVR5cGUgPSB7fT4gZXh0ZW5kcyBBYnN0cmFjdE1vZGVsV2l0aEFzeW5jRGF0YTxcbiAgICBEYXRhVHlwZSxcbiAgICBXYXRjaGFibGVSZWNvcmRRdWVyeVJlc3VsdEtleVxuPiB7XG4gICAgLy8gQWJzdHJhY3QgcHJvcGVydGllcyAtIGNsYXNzZXMgZXh0ZW5kaW5nIFF1ZXJ5UmVzdWx0IG11c3Qgb3ZlcnJpZGUgdGhlc2U6XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHN0YXRpYyBfY2xhc3NOYW1lID0gJ1JlY29yZFF1ZXJ5UmVzdWx0JztcblxuICAgIC8qKlxuICAgICAqIFRoZSByZWNvcmQgSURzIGluIHRoaXMgUXVlcnlSZXN1bHQuXG4gICAgICogVGhyb3dzIGlmIGRhdGEgaXMgbm90IGxvYWRlZCB5ZXQuXG4gICAgICogQ2FuIGJlIHdhdGNoZWQuXG4gICAgICovXG4gICAgYWJzdHJhY3QgZ2V0IHJlY29yZElkcygpOiBSZWFkb25seUFycmF5PFJlY29yZElkPjtcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIHJlY29yZCBJRHMgaW4gdGhpcyBRdWVyeVJlc3VsdC5cbiAgICAgKiBUaHJvd3MgaWYgZGF0YSBpcyBub3QgbG9hZGVkIHlldC5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGFic3RyYWN0IF9nZXRPckdlbmVyYXRlUmVjb3JkSWRzU2V0KCk6IE9iamVjdE1hcDxSZWNvcmRJZCwgdHJ1ZSB8IHZvaWQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBmaWVsZHMgdGhhdCB3ZXJlIHVzZWQgdG8gY3JlYXRlIHRoaXMgUXVlcnlSZXN1bHQuXG4gICAgICogTnVsbCBpZiBmaWVsZHMgd2VyZSBub3Qgc3BlY2lmaWVkLCB3aGljaCBtZWFucyB0aGUgUXVlcnlSZXN1bHRcbiAgICAgKiB3aWxsIGxvYWQgYWxsIGZpZWxkcyBpbiB0aGUgdGFibGUuXG4gICAgICovXG4gICAgYWJzdHJhY3QgZ2V0IGZpZWxkcygpOiBBcnJheTxGaWVsZD4gfCBudWxsO1xuXG4gICAgLyoqXG4gICAgICogQGludGVybmFsIChzaW5jZSB3ZSBtYXkgbm90IGJlIGFibGUgdG8gcmV0dXJuIHBhcmVudCBtb2RlbCBpbnN0YW5jZXMgaW4gdGhlIGltbXV0YWJsZSBtb2RlbHMgd29ybGQpXG4gICAgICogVGhlIHRhYmxlIHRoYXQgcmVjb3JkcyBpbiB0aGlzIFF1ZXJ5UmVzdWx0IGFyZSBwYXJ0IG9mXG4gICAgICovXG4gICAgYWJzdHJhY3QgZ2V0IHBhcmVudFRhYmxlKCk6IFRhYmxlO1xuXG4gICAgLy8gcHJvdmlkZWQgcHJvcGVydGllcyArIG1ldGhvZHM6XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHN0YXRpYyBXYXRjaGFibGVLZXlzID0gV2F0Y2hhYmxlUmVjb3JkUXVlcnlSZXN1bHRLZXlzO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBzdGF0aWMgV2F0Y2hhYmxlQ2VsbFZhbHVlc0luRmllbGRLZXlQcmVmaXggPSBXYXRjaGFibGVDZWxsVmFsdWVzSW5GaWVsZEtleVByZWZpeDtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgc3RhdGljIF9pc1dhdGNoYWJsZUtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgaXNFbnVtVmFsdWUoV2F0Y2hhYmxlUmVjb3JkUXVlcnlSZXN1bHRLZXlzLCBrZXkpIHx8XG4gICAgICAgICAgICBrZXkuc3RhcnRzV2l0aChXYXRjaGFibGVDZWxsVmFsdWVzSW5GaWVsZEtleVByZWZpeClcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHN0YXRpYyBfc2hvdWxkTG9hZERhdGFGb3JLZXkoa2V5OiBXYXRjaGFibGVSZWNvcmRRdWVyeVJlc3VsdEtleSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAga2V5ID09PSBSZWNvcmRRdWVyeVJlc3VsdC5XYXRjaGFibGVLZXlzLnJlY29yZHMgfHxcbiAgICAgICAgICAgIGtleSA9PT0gUmVjb3JkUXVlcnlSZXN1bHQuV2F0Y2hhYmxlS2V5cy5yZWNvcmRJZHMgfHxcbiAgICAgICAgICAgIGtleSA9PT0gUmVjb3JkUXVlcnlSZXN1bHQuV2F0Y2hhYmxlS2V5cy5jZWxsVmFsdWVzIHx8XG4gICAgICAgICAgICBrZXkgPT09IFJlY29yZFF1ZXJ5UmVzdWx0LldhdGNoYWJsZUtleXMucmVjb3JkQ29sb3JzIHx8XG4gICAgICAgICAgICBrZXkgPT09IFJlY29yZFF1ZXJ5UmVzdWx0LldhdGNoYWJsZUtleXMuZ3JvdXBzIHx8XG4gICAgICAgICAgICBrZXkgPT09IFJlY29yZFF1ZXJ5UmVzdWx0LldhdGNoYWJsZUtleXMuZ3JvdXBMZXZlbHMgfHxcbiAgICAgICAgICAgIGtleS5zdGFydHNXaXRoKFJlY29yZFF1ZXJ5UmVzdWx0LldhdGNoYWJsZUNlbGxWYWx1ZXNJbkZpZWxkS2V5UHJlZml4KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBzdGF0aWMgX25vcm1hbGl6ZU9wdHMoXG4gICAgICAgIHRhYmxlOiBUYWJsZSxcbiAgICAgICAgcmVjb3JkU3RvcmU6IFJlY29yZFN0b3JlLFxuICAgICAgICBvcHRzOiBSZWNvcmRRdWVyeVJlc3VsdE9wdHMsXG4gICAgKTogTm9ybWFsaXplZFJlY29yZFF1ZXJ5UmVzdWx0T3B0cyB7XG4gICAgICAgIGNvbnN0IHNvcnRzID0gbm9ybWFsaXplU29ydHNPckdyb3Vwcyh0YWJsZSwgb3B0cy5zb3J0cykgPz8gbnVsbDtcblxuICAgICAgICBsZXQgZmllbGRJZHNPck51bGxJZkFsbEZpZWxkcyA9IG51bGw7XG4gICAgICAgIGlmIChvcHRzLmZpZWxkcykge1xuICAgICAgICAgICAgaW52YXJpYW50KEFycmF5LmlzQXJyYXkob3B0cy5maWVsZHMpLCAnTXVzdCBzcGVjaWZ5IGFuIGFycmF5IG9mIGZpZWxkcycpO1xuICAgICAgICAgICAgZmllbGRJZHNPck51bGxJZkFsbEZpZWxkcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZE9yRmllbGRJZE9yRmllbGROYW1lIG9mIG9wdHMuZmllbGRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFmaWVsZE9yRmllbGRJZE9yRmllbGROYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZpbHRlciBvdXQgZmFsc2UteSB2YWx1ZXMgc28gdXNlcnMgb2YgdGhpcyBBUElcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FuIGNvbnZlbmllbnRseSBsaXN0IGNvbmRpdGlvbmFsIGZpZWxkcywgZS5nLiBbZmllbGQxLCBpc0ZvbyAmJiBmaWVsZDJdXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBmaWVsZE9yRmllbGRJZE9yRmllbGROYW1lICE9PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgICAgICAhKGZpZWxkT3JGaWVsZElkT3JGaWVsZE5hbWUgaW5zdGFuY2VvZiBGaWVsZClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICdJbnZhbGlkIHZhbHVlIGZvciBmaWVsZCwgZXhwZWN0ZWQgYSBmaWVsZCwgaWQsIG9yIG5hbWUgYnV0IGdvdDogJXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRPckZpZWxkSWRPckZpZWxkTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSB0YWJsZS5fX2dldEZpZWxkTWF0Y2hpbmcoZmllbGRPckZpZWxkSWRPckZpZWxkTmFtZSk7XG4gICAgICAgICAgICAgICAgZmllbGRJZHNPck51bGxJZkFsbEZpZWxkcy5wdXNoKGZpZWxkLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlY29yZENvbG9yTW9kZSA9IG9wdHMucmVjb3JkQ29sb3JNb2RlIHx8IHJlY29yZENvbG9yTW9kZXMubm9uZSgpO1xuICAgICAgICBzd2l0Y2ggKHJlY29yZENvbG9yTW9kZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFJlY29yZENvbG9yTW9kZVR5cGVzLk5PTkU6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFJlY29yZENvbG9yTW9kZVR5cGVzLkJZX1NFTEVDVF9GSUVMRDpcbiAgICAgICAgICAgICAgICBpbnZhcmlhbnQoXG4gICAgICAgICAgICAgICAgICAgIHJlY29yZENvbG9yTW9kZS5zZWxlY3RGaWVsZC50eXBlID09PSBGaWVsZFR5cGUuU0lOR0xFX1NFTEVDVCxcbiAgICAgICAgICAgICAgICAgICAgJ0ludmFsaWQgZmllbGQgZm9yIGNvbG9yaW5nIHJlY29yZHMgYnkgc2VsZWN0IGZpZWxkOiBleHBlY3RlZCBhICVzLCBidXQgZ290IGEgJXMnLFxuICAgICAgICAgICAgICAgICAgICBGaWVsZFR5cGUuU0lOR0xFX1NFTEVDVCxcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkQ29sb3JNb2RlLnNlbGVjdEZpZWxkLnR5cGUsXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGludmFyaWFudChcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkQ29sb3JNb2RlLnNlbGVjdEZpZWxkLnBhcmVudFRhYmxlID09PSB0YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgJ0ludmFsaWQgZmllbGQgZm9yIGNvbG9yaW5nIHJlY29yZHMgYnkgc2VsZWN0IGZpZWxkOiB0aGUgc2luZ2xlIHNlbGVjdCBmaWVsZCBpcyBub3QgaW4gdGhlIHNhbWUgdGFibGUgYXMgdGhlIHJlY29yZHMnLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZmllbGRJZHNPck51bGxJZkFsbEZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZElkc09yTnVsbElmQWxsRmllbGRzLnB1c2gocmVjb3JkQ29sb3JNb2RlLnNlbGVjdEZpZWxkLmlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFJlY29yZENvbG9yTW9kZVR5cGVzLkJZX1ZJRVc6XG4gICAgICAgICAgICAgICAgaW52YXJpYW50KFxuICAgICAgICAgICAgICAgICAgICByZWNvcmRDb2xvck1vZGUudmlldy5wYXJlbnRUYWJsZSA9PT0gdGFibGUsXG4gICAgICAgICAgICAgICAgICAgICdJbnZhbGlkIHZpZXcgZm9yIGNvbG9yaW5nIHJlY29yZHMgZnJvbSB2aWV3OiB0aGUgdmlldyBpcyBub3QgaW4gdGhlIHNhbWUgdGFibGUgYXMgdGhlIHJlY29yZHMnLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgJ1Vua25vd24gcmVjb3JkIGNvbG9yaW5nIG1vZGUgdHlwZTogJXMnLFxuICAgICAgICAgICAgICAgICAgICBjYXN0PFVua25vd25Db2xvck1vZGU+KHJlY29yZENvbG9yTW9kZSkudHlwZSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaW52YXJpYW50KHRhYmxlLmlkID09PSByZWNvcmRTdG9yZS50YWJsZUlkLCAncmVjb3JkIHN0b3JlIGFuZCB0YWJsZSBtdXN0IG1hdGNoJyk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNvcnRzLFxuICAgICAgICAgICAgZmllbGRJZHNPck51bGxJZkFsbEZpZWxkcyxcbiAgICAgICAgICAgIHJlY29yZENvbG9yTW9kZSxcbiAgICAgICAgICAgIHRhYmxlLFxuICAgICAgICAgICAgcmVjb3JkU3RvcmUsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9ub3JtYWxpemVkT3B0czogTm9ybWFsaXplZFJlY29yZFF1ZXJ5UmVzdWx0T3B0cztcbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3JlY29yZFN0b3JlOiBSZWNvcmRTdG9yZTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3JlY29yZENvbG9yQ2hhbmdlSGFuZGxlcjogRmxvd0FueUZ1bmN0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihzZGs6IFNkaywgbm9ybWFsaXplZE9wdHM6IE5vcm1hbGl6ZWRSZWNvcmRRdWVyeVJlc3VsdE9wdHMpIHtcbiAgICAgICAgc3VwZXIoc2RrLCBnZXRMb2NhbGx5VW5pcXVlSWQoJ1JlY29yZFF1ZXJ5UmVzdWx0JykpO1xuICAgICAgICB0aGlzLl9ub3JtYWxpemVkT3B0cyA9IG5vcm1hbGl6ZWRPcHRzO1xuICAgICAgICB0aGlzLl9yZWNvcmRTdG9yZSA9IG5vcm1hbGl6ZWRPcHRzLnJlY29yZFN0b3JlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldCBfc2VyaWFsaXplZE9wdHMoKSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShbXG4gICAgICAgICAgICB0aGlzLl9ub3JtYWxpemVkT3B0cy5zb3J0cyxcbiAgICAgICAgICAgIHRoaXMuX25vcm1hbGl6ZWRPcHRzLmZpZWxkSWRzT3JOdWxsSWZBbGxGaWVsZHMsXG4gICAgICAgICAgICB0aGlzLl9ub3JtYWxpemVkT3B0cy50YWJsZS5pZCxcbiAgICAgICAgICAgIHNlcmlhbGl6ZUNvbG9yTW9kZSh0aGlzLl9ub3JtYWxpemVkT3B0cy5yZWNvcmRDb2xvck1vZGUpLFxuICAgICAgICBdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcmVjb3JkcyBpbiB0aGlzIFJlY29yZFF1ZXJ5UmVzdWx0LlxuICAgICAqIFRocm93cyBpZiBkYXRhIGlzIG5vdCBsb2FkZWQgeWV0LlxuICAgICAqIENhbiBiZSB3YXRjaGVkLlxuICAgICAqL1xuICAgIGdldCByZWNvcmRzKCk6IEFycmF5PFJlY29yZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWNvcmRJZHMubWFwKHJlY29yZElkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlY29yZCA9IHRoaXMuX3JlY29yZFN0b3JlLmdldFJlY29yZEJ5SWRJZkV4aXN0cyhyZWNvcmRJZCk7XG4gICAgICAgICAgICBpbnZhcmlhbnQocmVjb3JkLCAnUmVjb3JkIG1pc3NpbmcgaW4gdGFibGUnKTtcbiAgICAgICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIHNwZWNpZmljIHJlY29yZCBpbiB0aGUgcXVlcnkgcmVzdWx0LCBvciBudWxsIGlmIHRoYXQgcmVjb3JkIGRvZXNuJ3QgZXhpc3Qgb3IgaXNcbiAgICAgKiBmaWx0ZXJlZCBvdXQuIFRocm93cyBpZiBkYXRhIGlzIG5vdCBsb2FkZWQgeWV0LiBXYXRjaCB1c2luZyBgJ3JlY29yZElkcydgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlY29yZElkIHRoZSBJRCBvZiB0aGUge0BsaW5rIFJlY29yZH0geW91IHdhbnRcbiAgICAgKi9cbiAgICBnZXRSZWNvcmRCeUlkSWZFeGlzdHMocmVjb3JkSWQ6IFJlY29yZElkKTogUmVjb3JkIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHJlY29yZCA9IHRoaXMuX3JlY29yZFN0b3JlLmdldFJlY29yZEJ5SWRJZkV4aXN0cyhyZWNvcmRJZCk7XG4gICAgICAgIGlmICghcmVjb3JkIHx8ICF0aGlzLmhhc1JlY29yZChyZWNvcmQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgc3BlY2lmaWMgcmVjb3JkIGluIHRoZSBxdWVyeSByZXN1bHQsIG9yIHRocm93cyBpZiB0aGF0IHJlY29yZCBkb2Vzbid0IGV4aXN0IG9yIGlzXG4gICAgICogZmlsdGVyZWQgb3V0LiBUaHJvd3MgaWYgZGF0YSBpcyBub3QgbG9hZGVkIHlldC4gV2F0Y2ggdXNpbmcgYCdyZWNvcmRJZHMnYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWNvcmRJZCB0aGUgSUQgb2YgdGhlIHtAbGluayBSZWNvcmR9IHlvdSB3YW50XG4gICAgICovXG4gICAgZ2V0UmVjb3JkQnlJZChyZWNvcmRJZDogUmVjb3JkSWQpOiBSZWNvcmQge1xuICAgICAgICBjb25zdCByZWNvcmQgPSB0aGlzLmdldFJlY29yZEJ5SWRJZkV4aXN0cyhyZWNvcmRJZCk7XG4gICAgICAgIGlmICghcmVjb3JkKSB7XG4gICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKCdObyByZWNvcmQgd2l0aCBJRCAlcyBpbiB0aGlzIHF1ZXJ5IHJlc3VsdCcsIHJlY29yZElkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9nZXRSZWNvcmQocmVjb3JkT3JSZWNvcmRJZDogUmVjb3JkSWQgfCBSZWNvcmQpOiBSZWNvcmQge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRSZWNvcmRCeUlkKFxuICAgICAgICAgICAgdHlwZW9mIHJlY29yZE9yUmVjb3JkSWQgPT09ICdzdHJpbmcnID8gcmVjb3JkT3JSZWNvcmRJZCA6IHJlY29yZE9yUmVjb3JkSWQuaWQsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgdG8gc2VlIGlmIGEgcGFydGljdWxhciByZWNvcmQgb3IgcmVjb3JkIGlkIGlzIHByZXNlbnQgaW4gdGhpcyBxdWVyeSByZXN1bHQuIFJldHVybnNcbiAgICAgKiBmYWxzZSBpZiB0aGUgcmVjb3JkIGhhcyBiZWVuIGRlbGV0ZWQgb3IgaXMgZmlsdGVyZWQgb3V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlY29yZE9yUmVjb3JkSWQgdGhlIHJlY29yZCBvciByZWNvcmQgaWQgdG8gY2hlY2sgdGhlIHByZXNlbmNlIG9mXG4gICAgICovXG4gICAgaGFzUmVjb3JkKHJlY29yZE9yUmVjb3JkSWQ6IFJlY29yZElkIHwgUmVjb3JkKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHJlY29yZElkID1cbiAgICAgICAgICAgIHR5cGVvZiByZWNvcmRPclJlY29yZElkID09PSAnc3RyaW5nJyA/IHJlY29yZE9yUmVjb3JkSWQgOiByZWNvcmRPclJlY29yZElkLmlkO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0T3JHZW5lcmF0ZVJlY29yZElkc1NldCgpW3JlY29yZElkXSA9PT0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHtAbGluayBDb2xvcn0gb2YgYSBzcGVjaWZpYyByZWNvcmQgaW4gdGhlIHF1ZXJ5IHJlc3VsdC4gUmV0dXJucyBudWxsIGlmIHRoZSByZWNvcmRcbiAgICAgKiBoYXMgbm8gY29sb3IgaW4gdGhpcyBxdWVyeSByZXN1bHQuIFRocm93cyBpZiB0aGUgcmVjb3JkIGlzbid0IGluIHRoZSBSZWNvcmRRdWVyeVJlc3VsdC4gV2F0Y2hcbiAgICAgKiB3aXRoIHRoZSBgJ3JlY29yZENvbG9ycydgIGFuZCBgJ3JlY29yZElkc2Aga2V5cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWNvcmRPclJlY29yZElkIHRoZSByZWNvcmQgb3IgcmVjb3JkIElEIHlvdSB3YW50IHRoZSBjb2xvciBvZi5cbiAgICAgKi9cbiAgICBnZXRSZWNvcmRDb2xvcihyZWNvcmRPclJlY29yZElkOiBSZWNvcmRJZCB8IFJlY29yZCk6IENvbG9yIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHJlY29yZCA9IHRoaXMuX2dldFJlY29yZChyZWNvcmRPclJlY29yZElkKTtcbiAgICAgICAgY29uc3QgcmVjb3JkQ29sb3JNb2RlID0gdGhpcy5fbm9ybWFsaXplZE9wdHMucmVjb3JkQ29sb3JNb2RlO1xuXG4gICAgICAgIHN3aXRjaCAocmVjb3JkQ29sb3JNb2RlLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgUmVjb3JkQ29sb3JNb2RlVHlwZXMuTk9ORTpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNhc2UgUmVjb3JkQ29sb3JNb2RlVHlwZXMuQllfU0VMRUNUX0ZJRUxEOiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlY29yZENvbG9yTW9kZS5zZWxlY3RGaWVsZC50eXBlICE9PSBGaWVsZFR5cGUuU0lOR0xFX1NFTEVDVCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZWNvcmQuZ2V0Q2VsbFZhbHVlKHJlY29yZENvbG9yTW9kZS5zZWxlY3RGaWVsZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlICYmXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mICh2YWx1ZSBhcyBhbnkpLmNvbG9yID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICA/IGFzc2VydEVudW1WYWx1ZShDb2xvcnMsICh2YWx1ZSBhcyBhbnkpLmNvbG9yKVxuICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFJlY29yZENvbG9yTW9kZVR5cGVzLkJZX1ZJRVc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlY29yZFN0b3JlXG4gICAgICAgICAgICAgICAgICAgIC5nZXRWaWV3RGF0YVN0b3JlKHJlY29yZENvbG9yTW9kZS52aWV3LmlkKVxuICAgICAgICAgICAgICAgICAgICAuZ2V0UmVjb3JkQ29sb3IocmVjb3JkKTtcbiAgICAgICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICdVbmtub3duIHJlY29yZCBjb2xvcmluZyBtb2RlIHR5cGU6ICVzJyxcbiAgICAgICAgICAgICAgICAgICAgY2FzdDxVbmtub3duQ29sb3JNb2RlPihyZWNvcmRDb2xvck1vZGUpLnR5cGUsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9vbkNoYW5nZUlzRGF0YUxvYWRlZCgpIHtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UoV2F0Y2hhYmxlUmVjb3JkUXVlcnlSZXN1bHRLZXlzLmlzRGF0YUxvYWRlZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IG5vdGlmaWVkIG9mIGNoYW5nZXMgdG8gdGhlIHF1ZXJ5IHJlc3VsdC5cbiAgICAgKlxuICAgICAqIFdhdGNoYWJsZSBrZXlzIGFyZTpcbiAgICAgKiAtIGAncmVjb3JkcydgXG4gICAgICogLSBgJ3JlY29yZElkcydgXG4gICAgICogLSBgJ2NlbGxWYWx1ZXMnYFxuICAgICAqIC0gYCdyZWNvcmRDb2xvcnMnYFxuICAgICAqIC0gYCdpc0RhdGFMb2FkZWQnYFxuICAgICAqIC0gYCdjZWxsVmFsdWVzSW5GaWVsZDonICsgc29tZUZpZWxkSWRgXG4gICAgICpcbiAgICAgKiBFdmVyeSBjYWxsIHRvIGAud2F0Y2hgIHNob3VsZCBoYXZlIGEgbWF0Y2hpbmcgY2FsbCB0byBgLnVud2F0Y2hgLlxuICAgICAqXG4gICAgICogV2F0Y2hpbmcgYSBrZXkgdGhhdCBuZWVkcyB0byBsb2FkIGRhdGEgYXN5bmNocm9ub3VzbHkgd2lsbCBhdXRvbWF0aWNhbGx5XG4gICAgICogY2F1c2UgdGhlIGRhdGEgdG8gYmUgZmV0Y2hlZC4gT25jZSB0aGUgZGF0YSBpcyBhdmFpbGFibGUsIHRoZSBgY2FsbGJhY2tgXG4gICAgICogd2lsbCBiZSBjYWxsZWQuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBrZXlzIHRoYXQgd2VyZSB3YXRjaGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGtleXMgdGhlIGtleXMgdG8gd2F0Y2hcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgYSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhvc2Uga2V5cyBjaGFuZ2VcbiAgICAgKiBAcGFyYW0gY29udGV4dCBhbiBvcHRpb25hbCBjb250ZXh0IGZvciBgdGhpc2AgaW4gYGNhbGxiYWNrYC5cbiAgICAgKi9cbiAgICB3YXRjaChcbiAgICAgICAga2V5czogV2F0Y2hhYmxlUmVjb3JkUXVlcnlSZXN1bHRLZXkgfCBSZWFkb25seUFycmF5PFdhdGNoYWJsZVJlY29yZFF1ZXJ5UmVzdWx0S2V5PixcbiAgICAgICAgY2FsbGJhY2s6IEZsb3dBbnlGdW5jdGlvbixcbiAgICAgICAgY29udGV4dD86IEZsb3dBbnlPYmplY3QgfCBudWxsLFxuICAgICk6IEFycmF5PFdhdGNoYWJsZVJlY29yZFF1ZXJ5UmVzdWx0S2V5PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkS2V5cyA9IHN1cGVyLndhdGNoKGtleXMsIGNhbGxiYWNrLCBjb250ZXh0KTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdmFsaWRLZXlzKSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSBXYXRjaGFibGVSZWNvcmRRdWVyeVJlc3VsdEtleXMucmVjb3JkQ29sb3JzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2F0Y2hSZWNvcmRDb2xvcnNJZk5lZWRlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWxpZEtleXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW53YXRjaCBrZXlzIHdhdGNoZWQgd2l0aCBgLndhdGNoYC5cbiAgICAgKlxuICAgICAqIFNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMgZ2l2ZW4gdG8gYC53YXRjaGAuXG4gICAgICpcbiAgICAgKiBVbndhdGNoaW5nIGEga2V5IHRoYXQgbmVlZHMgdG8gbG9hZCBkYXRhIGFzeW5jaHJvbm91c2x5IHdpbGwgYXV0b21hdGljYWxseVxuICAgICAqIGNhdXNlIHRoZSBkYXRhIHRvIGJlIHVubG9hZGVkLlxuICAgICAqXG4gICAgICogUmV0dXJucyB0aGUgYXJyYXkgb2Yga2V5cyB0aGF0IHdlcmUgdW53YXRjaGVkXG4gICAgICpcbiAgICAgKiBAcGFyYW0ga2V5cyB0aGUga2V5cyB0byB1bndhdGNoXG4gICAgICogQHBhcmFtIGNhbGxiYWNrIHRoZSBmdW5jdGlvbiBwYXNzZWQgdG8gYC53YXRjaGAgZm9yIHRoZXNlIGtleXNcbiAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCB0aGF0IHdhcyBwYXNzZWQgdG8gYC53YXRjaGAgZm9yIHRoaXMgYGNhbGxiYWNrYFxuICAgICAqL1xuICAgIHVud2F0Y2goXG4gICAgICAgIGtleXM6IFdhdGNoYWJsZVJlY29yZFF1ZXJ5UmVzdWx0S2V5IHwgUmVhZG9ubHlBcnJheTxXYXRjaGFibGVSZWNvcmRRdWVyeVJlc3VsdEtleT4sXG4gICAgICAgIGNhbGxiYWNrOiBGbG93QW55RnVuY3Rpb24sXG4gICAgICAgIGNvbnRleHQ/OiBGbG93QW55T2JqZWN0IHwgbnVsbCxcbiAgICApOiBBcnJheTxXYXRjaGFibGVSZWNvcmRRdWVyeVJlc3VsdEtleT4ge1xuICAgICAgICBjb25zdCB2YWxpZEtleXMgPSBzdXBlci51bndhdGNoKGtleXMsIGNhbGxiYWNrLCBjb250ZXh0KTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdmFsaWRLZXlzKSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSBXYXRjaGFibGVSZWNvcmRRdWVyeVJlc3VsdEtleXMucmVjb3JkQ29sb3JzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdW53YXRjaFJlY29yZENvbG9yc0lmUG9zc2libGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsaWRLZXlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF93YXRjaFJlY29yZENvbG9yc0lmTmVlZGVkKCkge1xuICAgICAgICBpbnZhcmlhbnQoXG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VXYXRjaGVyc0J5S2V5W1dhdGNoYWJsZVJlY29yZFF1ZXJ5UmVzdWx0S2V5cy5yZWNvcmRDb2xvcnNdLFxuICAgICAgICAgICAgJ21ldGhvZCBtYXkgb25seSBiZSBjYWxsZWQgd2hlbiBgcmVjb3JkQ29sb3JzYCBrZXkgaGFzIGJlZW4gd2F0Y2hlZCcsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHdhdGNoQ291bnQgPSB0aGlzLl9jaGFuZ2VXYXRjaGVyc0J5S2V5W1dhdGNoYWJsZVJlY29yZFF1ZXJ5UmVzdWx0S2V5cy5yZWNvcmRDb2xvcnNdXG4gICAgICAgICAgICAubGVuZ3RoO1xuICAgICAgICBpZiAoIXRoaXMuX3JlY29yZENvbG9yQ2hhbmdlSGFuZGxlciAmJiB3YXRjaENvdW50ID49IDEpIHtcbiAgICAgICAgICAgIHRoaXMuX3dhdGNoUmVjb3JkQ29sb3JzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfd2F0Y2hSZWNvcmRDb2xvcnMoKSB7XG4gICAgICAgIGNvbnN0IHJlY29yZENvbG9yTW9kZSA9IHRoaXMuX25vcm1hbGl6ZWRPcHRzLnJlY29yZENvbG9yTW9kZTtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IChtb2RlbDogV2F0Y2hhYmxlPGFueT4sIGtleTogc3RyaW5nLCByZWNvcmRJZHM/OiBBcnJheTxSZWNvcmRJZD4pID0+IHtcbiAgICAgICAgICAgIGlmIChtb2RlbCA9PT0gdGhpcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKFdhdGNoYWJsZVJlY29yZFF1ZXJ5UmVzdWx0S2V5cy5yZWNvcmRDb2xvcnMsIHJlY29yZElkcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKFdhdGNoYWJsZVJlY29yZFF1ZXJ5UmVzdWx0S2V5cy5yZWNvcmRDb2xvcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHN3aXRjaCAocmVjb3JkQ29sb3JNb2RlLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgUmVjb3JkQ29sb3JNb2RlVHlwZXMuTk9ORTpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUmVjb3JkQ29sb3JNb2RlVHlwZXMuQllfU0VMRUNUX0ZJRUxEOlxuICAgICAgICAgICAgICAgIHRoaXMud2F0Y2goXG4gICAgICAgICAgICAgICAgICAgIGAke1dhdGNoYWJsZUNlbGxWYWx1ZXNJbkZpZWxkS2V5UHJlZml4fSR7cmVjb3JkQ29sb3JNb2RlLnNlbGVjdEZpZWxkLmlkfWAsXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZWNvcmRDb2xvck1vZGUuc2VsZWN0RmllbGQud2F0Y2goJ29wdGlvbnMnLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUmVjb3JkQ29sb3JNb2RlVHlwZXMuQllfVklFVzoge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlY29yZFN0b3JlXG4gICAgICAgICAgICAgICAgICAgIC5nZXRWaWV3RGF0YVN0b3JlKHJlY29yZENvbG9yTW9kZS52aWV3LmlkKVxuICAgICAgICAgICAgICAgICAgICAud2F0Y2goJ3JlY29yZENvbG9ycycsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgJ1Vua25vd24gcmVjb3JkIGNvbG9yaW5nIG1vZGUgdHlwZTogJXMnLFxuICAgICAgICAgICAgICAgICAgICBjYXN0PFVua25vd25Db2xvck1vZGU+KHJlY29yZENvbG9yTW9kZSkudHlwZSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcmVjb3JkQ29sb3JDaGFuZ2VIYW5kbGVyID0gaGFuZGxlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfdW53YXRjaFJlY29yZENvbG9yc0lmUG9zc2libGUoKSB7XG4gICAgICAgIGNvbnN0IHdhdGNoQ291bnQgPSAoXG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VXYXRjaGVyc0J5S2V5W1dhdGNoYWJsZVJlY29yZFF1ZXJ5UmVzdWx0S2V5cy5yZWNvcmRDb2xvcnNdIHx8IFtdXG4gICAgICAgICkubGVuZ3RoO1xuICAgICAgICBpZiAodGhpcy5fcmVjb3JkQ29sb3JDaGFuZ2VIYW5kbGVyICYmIHdhdGNoQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3Vud2F0Y2hSZWNvcmRDb2xvcnMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF91bndhdGNoUmVjb3JkQ29sb3JzKCkge1xuICAgICAgICBjb25zdCByZWNvcmRDb2xvck1vZGUgPSB0aGlzLl9ub3JtYWxpemVkT3B0cy5yZWNvcmRDb2xvck1vZGU7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLl9yZWNvcmRDb2xvckNoYW5nZUhhbmRsZXI7XG4gICAgICAgIGludmFyaWFudChoYW5kbGVyLCAncmVjb3JkIGNvbG9yIGNoYW5nZSBoYW5kbGVyIG11c3QgZXhpc3QnKTtcblxuICAgICAgICBzd2l0Y2ggKHJlY29yZENvbG9yTW9kZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFJlY29yZENvbG9yTW9kZVR5cGVzLk5PTkU6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFJlY29yZENvbG9yTW9kZVR5cGVzLkJZX1NFTEVDVF9GSUVMRDpcbiAgICAgICAgICAgICAgICB0aGlzLnVud2F0Y2goXG4gICAgICAgICAgICAgICAgICAgIGAke1dhdGNoYWJsZUNlbGxWYWx1ZXNJbkZpZWxkS2V5UHJlZml4fSR7cmVjb3JkQ29sb3JNb2RlLnNlbGVjdEZpZWxkLmlkfWAsXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZWNvcmRDb2xvck1vZGUuc2VsZWN0RmllbGQudW53YXRjaCgnb3B0aW9ucycsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBSZWNvcmRDb2xvck1vZGVUeXBlcy5CWV9WSUVXOiB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWNvcmRDb2xvck1vZGUudmlldy5pc0RlbGV0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVjb3JkU3RvcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWaWV3RGF0YVN0b3JlKHJlY29yZENvbG9yTW9kZS52aWV3LmlkKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnVud2F0Y2goJ3JlY29yZENvbG9ycycsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICdVbmtub3duIHJlY29yZCBjb2xvcmluZyBtb2RlIHR5cGU6ICVzJyxcbiAgICAgICAgICAgICAgICAgICAgY2FzdDxVbmtub3duQ29sb3JNb2RlPihyZWNvcmRDb2xvck1vZGUpLnR5cGUsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3JlY29yZENvbG9yQ2hhbmdlSGFuZGxlciA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgX2xvYWRSZWNvcmRDb2xvcnNBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcmVjb3JkQ29sb3JNb2RlID0gdGhpcy5fbm9ybWFsaXplZE9wdHMucmVjb3JkQ29sb3JNb2RlO1xuICAgICAgICBzd2l0Y2ggKHJlY29yZENvbG9yTW9kZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFJlY29yZENvbG9yTW9kZVR5cGVzLk5PTkU6XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY2FzZSBSZWNvcmRDb2xvck1vZGVUeXBlcy5CWV9TRUxFQ1RfRklFTEQ6XG4gICAgICAgICAgICAgICAgLy8gVGhlIHNlbGVjdCBmaWVsZCBpZCBnZXRzIGFkZGVkIHRvIGZpZWxkSWRzT3JOdWxsSWZBbGxGaWVsZHMsXG4gICAgICAgICAgICAgICAgLy8gc28gd2UgZG9uJ3QgbmVlZCB0byBoYW5kbGUgaXQgaGVyZVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgUmVjb3JkQ29sb3JNb2RlVHlwZXMuQllfVklFVzpcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9yZWNvcmRTdG9yZS5nZXRWaWV3RGF0YVN0b3JlKHJlY29yZENvbG9yTW9kZS52aWV3LmlkKS5sb2FkRGF0YUFzeW5jKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25Vbmtub3duU3dpdGNoQ2FzZUVycm9yKFxuICAgICAgICAgICAgICAgICAgICAncmVjb3JkIGNvbG9yIG1vZGUgdHlwZScsXG4gICAgICAgICAgICAgICAgICAgIHJlY29yZENvbG9yTW9kZSxcbiAgICAgICAgICAgICAgICAgICAgJ3R5cGUnLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfdW5sb2FkUmVjb3JkQ29sb3JzKCkge1xuICAgICAgICBjb25zdCByZWNvcmRDb2xvck1vZGUgPSB0aGlzLl9ub3JtYWxpemVkT3B0cy5yZWNvcmRDb2xvck1vZGU7XG4gICAgICAgIHN3aXRjaCAocmVjb3JkQ29sb3JNb2RlLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgUmVjb3JkQ29sb3JNb2RlVHlwZXMuTk9ORTpcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjYXNlIFJlY29yZENvbG9yTW9kZVR5cGVzLkJZX1NFTEVDVF9GSUVMRDpcbiAgICAgICAgICAgICAgICAvLyBoYW5kbGVkIGFzIHBhcnQgb2YgZmllbGRJZHNPck51bGxJZkFsbEZpZWxkc1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgUmVjb3JkQ29sb3JNb2RlVHlwZXMuQllfVklFVzpcbiAgICAgICAgICAgICAgICBpZiAoIXJlY29yZENvbG9yTW9kZS52aWV3LmlzRGVsZXRlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWNvcmRTdG9yZS5nZXRWaWV3RGF0YVN0b3JlKHJlY29yZENvbG9yTW9kZS52aWV3LmlkKS51bmxvYWREYXRhKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25Vbmtub3duU3dpdGNoQ2FzZUVycm9yKFxuICAgICAgICAgICAgICAgICAgICAncmVjb3JkIGNvbG9yIG1vZGUgdHlwZScsXG4gICAgICAgICAgICAgICAgICAgIHJlY29yZENvbG9yTW9kZSxcbiAgICAgICAgICAgICAgICAgICAgJ3R5cGUnLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJlY29yZFF1ZXJ5UmVzdWx0O1xuIl19