@airtable/blocks 1.9.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 (291) hide show
  1. package/CHANGELOG.md +10 -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 +4 -2
  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 +5 -14
  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 +2 -1
  19. package/dist/cjs/models/mutations.js +20 -163
  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 +10 -8
  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 +42 -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 +57 -11
  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 +2 -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 +2 -1
  220. package/dist/cjs/viewport.js +2 -1
  221. package/dist/cjs/warning.js +2 -1
  222. package/dist/cjs/watchable.js +17 -2
  223. package/dist/types/src/models/base.d.ts +2 -1
  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 +3 -13
  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/mutations.d.ts.map +1 -1
  233. package/dist/types/src/models/query_manager.d.ts +2 -0
  234. package/dist/types/src/models/query_manager.d.ts.map +1 -0
  235. package/dist/types/src/models/record.d.ts +12 -3
  236. package/dist/types/src/models/record.d.ts.map +1 -1
  237. package/dist/types/src/models/record_query_result.d.ts +3 -2
  238. package/dist/types/src/models/record_query_result.d.ts.map +1 -1
  239. package/dist/types/src/models/record_store.d.ts.map +1 -1
  240. package/dist/types/src/models/table.d.ts +2 -1
  241. package/dist/types/src/models/table.d.ts.map +1 -1
  242. package/dist/types/src/models/table_or_view_query_result.d.ts +3 -5
  243. package/dist/types/src/models/table_or_view_query_result.d.ts.map +1 -1
  244. package/dist/types/src/models/view_data_store.d.ts +0 -1
  245. package/dist/types/src/models/view_data_store.d.ts.map +1 -1
  246. package/dist/types/src/models/view_metadata_query_result.d.ts +1 -1
  247. package/dist/types/src/models/view_metadata_query_result.d.ts.map +1 -1
  248. package/dist/types/src/private_utils.d.ts +24 -1
  249. package/dist/types/src/private_utils.d.ts.map +1 -1
  250. package/dist/types/src/sdk.d.ts.map +1 -1
  251. package/dist/types/src/testing/abstract_mock_airtable_interface.d.ts +11 -11
  252. package/dist/types/src/testing/abstract_mock_airtable_interface.d.ts.map +1 -1
  253. package/dist/types/src/types/airtable_interface.d.ts +48 -20
  254. package/dist/types/src/types/airtable_interface.d.ts.map +1 -1
  255. package/dist/types/src/types/block_query_spec.d.ts +139 -0
  256. package/dist/types/src/types/block_query_spec.d.ts.map +1 -0
  257. package/dist/types/src/types/field.d.ts +7 -1
  258. package/dist/types/src/types/field.d.ts.map +1 -1
  259. package/dist/types/src/types/table.d.ts +0 -2
  260. package/dist/types/src/types/table.d.ts.map +1 -1
  261. package/dist/types/src/types/view.d.ts +3 -8
  262. package/dist/types/src/types/view.d.ts.map +1 -1
  263. package/dist/types/src/ui/cell_renderer.d.ts +1 -1
  264. package/dist/types/src/ui/color_palette.d.ts +1 -1
  265. package/dist/types/src/ui/control_sizes.d.ts +1 -1
  266. package/dist/types/src/ui/field_icon.d.ts +1 -1
  267. package/dist/types/src/ui/heading.d.ts +1 -1
  268. package/dist/types/src/ui/icon.d.ts +1 -1
  269. package/dist/types/src/ui/icon_config.d.ts +33 -31
  270. package/dist/types/src/ui/icon_config.d.ts.map +1 -1
  271. package/dist/types/src/ui/input.d.ts +10 -10
  272. package/dist/types/src/ui/link.d.ts +1 -1
  273. package/dist/types/src/ui/link.d.ts.map +1 -1
  274. package/dist/types/src/ui/record_card.d.ts +1 -1
  275. package/dist/types/src/ui/system/utils/create_style_prop_types.d.ts +1 -1
  276. package/dist/types/src/ui/system/utils/create_style_prop_types.d.ts.map +1 -1
  277. package/dist/types/src/ui/text.d.ts +1 -1
  278. package/dist/types/src/ui/theme/default_theme/index.d.ts +1 -1
  279. package/dist/types/src/ui/theme/theme_context.d.ts +1 -1
  280. package/dist/types/src/ui/theme/use_theme.d.ts +1 -1
  281. package/dist/types/src/ui/use_global_config.d.ts +1 -1
  282. package/dist/types/src/watchable.d.ts.map +1 -1
  283. package/dist/types/test/airtable_interface_mocks/fixture_data.d.ts +7 -5
  284. package/dist/types/test/airtable_interface_mocks/fixture_data.d.ts.map +1 -1
  285. package/dist/types/test/airtable_interface_mocks/mock_airtable_interface.d.ts +18 -11
  286. package/dist/types/test/airtable_interface_mocks/mock_airtable_interface.d.ts.map +1 -1
  287. package/dist/types/test/airtable_interface_mocks/mock_base_data_stores.d.ts +51 -0
  288. package/dist/types/test/airtable_interface_mocks/mock_base_data_stores.d.ts.map +1 -0
  289. package/dist/types/test/test_helpers.d.ts +2 -0
  290. package/dist/types/test/test_helpers.d.ts.map +1 -1
  291. package/package.json +2 -1
@@ -337,7 +337,8 @@ function (_AbstractModel) {
337
337
  /**
338
338
  * Updates the description for this field.
339
339
  *
340
- * To remove an existing description, pass `''` or `null` as the new description.
340
+ * To remove an existing description, pass `''` as the new description.
341
+ * `null` is also accepted and will be coerced to `''` for consistency with field creation.
341
342
  *
342
343
  * Throws an error if the user does not have permission to update the field, or if an invalid
343
344
  * description is provided.
@@ -350,18 +351,7 @@ function (_AbstractModel) {
350
351
  *
351
352
  * @example
352
353
  * ```js
353
- * async function addChoiceToSelectField(selectField, nameForNewOption) {
354
- * const updatedOptions = {
355
- * choices: [
356
- * ...selectField.options.choices,
357
- * {name: nameForNewOption},
358
- * ]
359
- * };
360
- *
361
- * if (selectField.hasPermissionToUpdateOptions(updatedOptions)) {
362
- * await selectField.updateOptionsAsync(updatedOptions);
363
- * }
364
- * }
354
+ * await myTextField.updateDescriptionAsync('This is a text field');
365
355
  * ```
366
356
  */
367
357
 
@@ -661,4 +651,5 @@ function (_AbstractModel) {
661
651
 
662
652
  (0, _defineProperty2.default)(Field, "_className", 'Field');
663
653
  var _default = Field;
664
- exports.default = _default;
654
+ exports.default = _default;
655
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbHMvZmllbGQudHMiXSwibmFtZXMiOlsiV2F0Y2hhYmxlRmllbGRLZXlzIiwiT2JqZWN0IiwiZnJlZXplIiwibmFtZSIsInR5cGUiLCJvcHRpb25zIiwiaXNDb21wdXRlZCIsImRlc2NyaXB0aW9uIiwiRmllbGQiLCJrZXkiLCJzZGsiLCJwYXJlbnRUYWJsZSIsImZpZWxkSWQiLCJfcGFyZW50VGFibGUiLCJfY2FjaGVkRmllbGRUeXBlQ29uZmlnT3JOdWxsIiwiYWlydGFibGVJbnRlcmZhY2UiLCJfc2RrIiwiX19haXJ0YWJsZUludGVyZmFjZSIsImFwcEludGVyZmFjZSIsIl9fYXBwSW50ZXJmYWNlIiwiZmllbGRUeXBlUHJvdmlkZXIiLCJnZXRDb25maWciLCJfZGF0YSIsIl9fZ2V0RmllbGROYW1lc0J5SWQiLCJfX211dGF0aW9ucyIsImNoZWNrUGVybWlzc2lvbnNGb3JNdXRhdGlvbiIsIk11dGF0aW9uVHlwZXMiLCJVUERBVEVfU0lOR0xFX0ZJRUxEX0NPTkZJRyIsInRhYmxlSWQiLCJpZCIsImNvbmZpZyIsImNoZWNrUGVybWlzc2lvbnNGb3JVcGRhdGVPcHRpb25zIiwiaGFzUGVybWlzc2lvbiIsIm9wdHMiLCJhcHBseU11dGF0aW9uQXN5bmMiLCJVUERBVEVfU0lOR0xFX0ZJRUxEX0RFU0NSSVBUSU9OIiwiY2hlY2tQZXJtaXNzaW9uc0ZvclVwZGF0ZURlc2NyaXB0aW9uIiwiYWdncmVnYXRvciIsImFnZ3JlZ2F0b3JLZXkiLCJhdmFpbGFibGVBZ2dyZWdhdG9yS2V5cyIsImFnZ3JlZ2F0b3JzIiwiZ2V0QXZhaWxhYmxlQWdncmVnYXRvcktleXNGb3JGaWVsZCIsInNvbWUiLCJzdHJpbmciLCJjZWxsVmFsdWUiLCJjb252ZXJ0U3RyaW5nVG9DZWxsVmFsdWUiLCJ2YWxpZGF0aW9uUmVzdWx0IiwidmFsaWRhdGVDZWxsVmFsdWVGb3JVcGRhdGUiLCJpc1ZhbGlkIiwiZGlydHlQYXRocyIsIl9jbGVhckNhY2hlZENvbmZpZyIsIl9vbkNoYW5nZSIsInR5cGVPcHRpb25zIiwidGFibGVEYXRhIiwiX2Jhc2VEYXRhIiwidGFibGVzQnlJZCIsImZpZWxkc0J5SWQiLCJfaWQiLCJfZ2V0Q2FjaGVkQ29uZmlnRnJvbUZpZWxkVHlwZVByb3ZpZGVyIiwiRmllbGRUeXBlIiwiTVVMVElQTEVfTE9PS1VQX1ZBTFVFUyIsInByaW1hcnlGaWVsZCIsImF2YWlsYWJsZUFnZ3JlZ2F0b3JLZXlzU2V0IiwiU2V0IiwicmVxdWlyZSIsImZpbHRlciIsImhhcyIsIkFic3RyYWN0TW9kZWwiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFQQTs7QUFBOEM7QUFXOUM7QUFDQTtBQUNBLElBQU1BLGtCQUFrQixHQUFHQyxNQUFNLENBQUNDLE1BQVAsQ0FBYztBQUNyQ0MsRUFBQUEsSUFBSSxFQUFFLE1BRCtCO0FBRXJDQyxFQUFBQSxJQUFJLEVBQUUsTUFGK0I7QUFHckNDLEVBQUFBLE9BQU8sRUFBRSxTQUg0QjtBQUlyQ0MsRUFBQUEsVUFBVSxFQUFFLFlBSnlCO0FBS3JDQyxFQUFBQSxXQUFXLEVBQUU7QUFMd0IsQ0FBZCxDQUEzQjtBQVFBOzs7Ozs7Ozs7QUFVQTs7Ozs7Ozs7Ozs7OztJQWFNQyxLOzs7Ozs7O0FBQ0Y7O0FBRUE7b0NBQ3VCQyxHLEVBQWE7QUFDaEMsYUFBTyxnQ0FBWVQsa0JBQVosRUFBZ0NTLEdBQWhDLENBQVA7QUFDSDtBQUNEOzs7O0FBSUE7OztBQUdBLGlCQUFZQyxHQUFaLEVBQXNCQyxXQUF0QixFQUEwQ0MsT0FBMUMsRUFBMkQ7QUFBQTs7QUFBQTtBQUN2RCwyR0FBTUYsR0FBTixFQUFXRSxPQUFYO0FBRHVEO0FBQUE7QUFHdkQsVUFBS0MsWUFBTCxHQUFvQkYsV0FBcEI7QUFDQSxVQUFLRyw0QkFBTCxHQUFvQyxJQUFwQztBQUp1RDtBQUsxRDtBQUVEOzs7Ozs7O0FBOEVBO0FBQ0E7QUFDQTs0REFDeUQ7QUFD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V0FObUM7O0FBTzFDLGFBQU8sMkJBQU9BLFdBQVAsRUFBb0J5QixNQUFwQixDQUEyQjVCLFVBQVUsSUFBSTtBQUM1QyxlQUFPeUIsMEJBQTBCLENBQUNJLEdBQTNCLENBQStCN0IsVUFBVSxDQUFDNUIsR0FBMUMsQ0FBUDtBQUNILE9BRk0sQ0FBUDtBQUdIOzs7RUFsWWUwRCx1Qjs7OEJBQWQzRCxLLGdCQUVrQixPO2VBdWVUQSxLIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBtb2R1bGUgQGFpcnRhYmxlL2Jsb2Nrcy9tb2RlbHM6IEZpZWxkICovIC8qKiAqL1xuaW1wb3J0IHtBZ2dyZWdhdG9yS2V5fSBmcm9tICcuLi90eXBlcy9hZ2dyZWdhdG9ycyc7XG5pbXBvcnQgU2RrIGZyb20gJy4uL3Nkayc7XG5pbXBvcnQge011dGF0aW9uVHlwZXMsIFBlcm1pc3Npb25DaGVja1Jlc3VsdCwgVXBkYXRlRmllbGRPcHRpb25zT3B0c30gZnJvbSAnLi4vdHlwZXMvbXV0YXRpb25zJztcbmltcG9ydCB7RmllbGREYXRhLCBGaWVsZFR5cGUsIEZpZWxkT3B0aW9ucywgRmllbGRDb25maWd9IGZyb20gJy4uL3R5cGVzL2ZpZWxkJztcbmltcG9ydCB7aXNFbnVtVmFsdWUsIGNsb25lRGVlcCwgdmFsdWVzLCBPYmplY3RWYWx1ZXMsIEZsb3dBbnlPYmplY3R9IGZyb20gJy4uL3ByaXZhdGVfdXRpbHMnO1xuaW1wb3J0IHtGaWVsZFR5cGVDb25maWd9IGZyb20gJy4uL3R5cGVzL2FpcnRhYmxlX2ludGVyZmFjZSc7XG5pbXBvcnQgQWJzdHJhY3RNb2RlbCBmcm9tICcuL2Fic3RyYWN0X21vZGVsJztcbmltcG9ydCB7QWdncmVnYXRvcn0gZnJvbSAnLi9jcmVhdGVfYWdncmVnYXRvcnMnO1xuaW1wb3J0IFRhYmxlIGZyb20gJy4vdGFibGUnO1xuXG4vLyBUaGlzIGRvZXNuJ3QgZm9sbG93IG91ciBlbnVtIG5hbWluZyBjb252ZW50aW9ucyBiZWNhdXNlIHdlIHdhbnQgdGhlIGtleXNcbi8vIHRvIG1pcnJvciB0aGUgbWV0aG9kL2dldHRlciBuYW1lcyBvbiB0aGUgbW9kZWwgY2xhc3MuXG5jb25zdCBXYXRjaGFibGVGaWVsZEtleXMgPSBPYmplY3QuZnJlZXplKHtcbiAgICBuYW1lOiAnbmFtZScgYXMgY29uc3QsXG4gICAgdHlwZTogJ3R5cGUnIGFzIGNvbnN0LFxuICAgIG9wdGlvbnM6ICdvcHRpb25zJyBhcyBjb25zdCxcbiAgICBpc0NvbXB1dGVkOiAnaXNDb21wdXRlZCcgYXMgY29uc3QsXG4gICAgZGVzY3JpcHRpb246ICdkZXNjcmlwdGlvbicgYXMgY29uc3QsXG59KTtcblxuLyoqXG4gKiBBbGwgdGhlIHdhdGNoYWJsZSBrZXlzIGluIGEgZmllbGQuXG4gKiAtIGBuYW1lYFxuICogLSBgdHlwZWBcbiAqIC0gYG9wdGlvbnNgXG4gKiAtIGBpc0NvbXB1dGVkYFxuICogLSBgZGVzY3JpcHRpb25gXG4gKi9cbmV4cG9ydCB0eXBlIFdhdGNoYWJsZUZpZWxkS2V5ID0gT2JqZWN0VmFsdWVzPHR5cGVvZiBXYXRjaGFibGVGaWVsZEtleXM+O1xuXG4vKipcbiAqIE1vZGVsIGNsYXNzIHJlcHJlc2VudGluZyBhIGZpZWxkIGluIGEgdGFibGUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGpzXG4gKiBpbXBvcnQge2Jhc2V9IGZyb20gJ0BhaXJ0YWJsZS9ibG9ja3MnO1xuICpcbiAqIGNvbnN0IHRhYmxlID0gYmFzZS5nZXRUYWJsZUJ5TmFtZSgnVGFibGUgMScpO1xuICogY29uc3QgZmllbGQgPSB0YWJsZS5nZXRGaWVsZEJ5TmFtZSgnTmFtZScpO1xuICogY29uc29sZS5sb2coJ1RoZSB0eXBlIG9mIHRoaXMgZmllbGQgaXMnLCBmaWVsZC50eXBlKTtcbiAqIGBgYFxuICogQGRvY3NQYXRoIG1vZGVscy9GaWVsZFxuICovXG5jbGFzcyBGaWVsZCBleHRlbmRzIEFic3RyYWN0TW9kZWw8RmllbGREYXRhLCBXYXRjaGFibGVGaWVsZEtleT4ge1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBzdGF0aWMgX2NsYXNzTmFtZSA9ICdGaWVsZCc7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHN0YXRpYyBfaXNXYXRjaGFibGVLZXkoa2V5OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGlzRW51bVZhbHVlKFdhdGNoYWJsZUZpZWxkS2V5cywga2V5KTtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9wYXJlbnRUYWJsZTogVGFibGU7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9jYWNoZWRGaWVsZFR5cGVDb25maWdPck51bGw6IEZpZWxkVHlwZUNvbmZpZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc2RrOiBTZGssIHBhcmVudFRhYmxlOiBUYWJsZSwgZmllbGRJZDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHNkaywgZmllbGRJZCk7XG5cbiAgICAgICAgdGhpcy5fcGFyZW50VGFibGUgPSBwYXJlbnRUYWJsZTtcbiAgICAgICAgdGhpcy5fY2FjaGVkRmllbGRUeXBlQ29uZmlnT3JOdWxsID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXQgX2RhdGFPck51bGxJZkRlbGV0ZWQoKTogRmllbGREYXRhIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHRhYmxlRGF0YSA9IHRoaXMuX2Jhc2VEYXRhLnRhYmxlc0J5SWRbdGhpcy5wYXJlbnRUYWJsZS5pZF07XG4gICAgICAgIHJldHVybiB0YWJsZURhdGE/LmZpZWxkc0J5SWRbdGhpcy5faWRdID8/IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSB0YWJsZSB0aGF0IHRoaXMgZmllbGQgYmVsb25ncyB0by4gU2hvdWxkIG5ldmVyIGNoYW5nZSBiZWNhdXNlIGZpZWxkcyBhcmVuJ3QgbW92ZWQgYmV0d2VlbiB0YWJsZXMuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWwgKHNpbmNlIHdlIG1heSBub3QgYmUgYWJsZSB0byByZXR1cm4gcGFyZW50IG1vZGVsIGluc3RhbmNlcyBpbiB0aGUgaW1tdXRhYmxlIG1vZGVscyB3b3JsZClcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZmllbGQgPSBteVRhYmxlLmdldEZpZWxkQnlOYW1lKCdOYW1lJyk7XG4gICAgICogY29uc29sZS5sb2coZmllbGQucGFyZW50VGFibGUuaWQgPT09IG15VGFibGUuaWQpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgcGFyZW50VGFibGUoKTogVGFibGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50VGFibGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmaWVsZC4gQ2FuIGJlIHdhdGNoZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogY29uc29sZS5sb2cobXlGaWVsZC5uYW1lKTtcbiAgICAgKiAvLyA9PiAnTmFtZSdcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS5uYW1lO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgZmllbGQuIENhbiBiZSB3YXRjaGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnNvbGUubG9nKG15RmllbGQudHlwZSk7XG4gICAgICogLy8gPT4gJ3NpbmdsZUxpbmVUZXh0J1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdldCB0eXBlKCk6IEZpZWxkVHlwZSB7XG4gICAgICAgIGNvbnN0IHt0eXBlfSA9IHRoaXMuX2dldENhY2hlZENvbmZpZ0Zyb21GaWVsZFR5cGVQcm92aWRlcigpO1xuICAgICAgICAvLyBXZSBpbnRlbmQgdG8gc3dpdGNoIGZyb20gXCJsb29rdXBcIiB0byBcIm11bHRpcGxlTG9va3VwVmFsdWVzXCIsIGJ1dCBuZWVkIHRvIHN1cHBvcnQgYm90aFxuICAgICAgICAvLyB1bnRpbCB0aGUgdHJhbnNpdGlvbiBpcyBjb21wbGV0ZS4gU2VlIDxodHRwczovL2FpcnRhYmxlLnF1aXAuY29tL1Z4YU1BbUFmVXNjcz4gZm9yIG1vcmUuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKHR5cGUgPT09ICdsb29rdXAnKSB7XG4gICAgICAgICAgICByZXR1cm4gRmllbGRUeXBlLk1VTFRJUExFX0xPT0tVUF9WQUxVRVM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIG9mIHRoZSBmaWVsZC4gVGhlIHN0cnVjdHVyZSBvZiB0aGUgZmllbGQnc1xuICAgICAqIG9wdGlvbnMgZGVwZW5kIG9uIHRoZSBmaWVsZCdzIHR5cGUuIGBudWxsYCBpZiB0aGUgZmllbGQgaGFzIG5vIG9wdGlvbnMuXG4gICAgICogQ2FuIGJlIHdhdGNoZWQuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBGaWVsZFR5cGV9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7RmllbGRUeXBlfSBmcm9tICdAYWlydGFibGUvYmxvY2tzL21vZGVscyc7XG4gICAgICpcbiAgICAgKiBpZiAobXlGaWVsZC50eXBlID09PSBGaWVsZFR5cGUuQ1VSUkVOQ1kpIHtcbiAgICAgKiAgICAgY29uc29sZS5sb2cobXlGaWVsZC5vcHRpb25zLnN5bWJvbCk7XG4gICAgICogICAgIC8vID0+ICckJ1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgb3B0aW9ucygpOiBGaWVsZE9wdGlvbnMgfCBudWxsIHtcbiAgICAgICAgY29uc3Qge29wdGlvbnN9ID0gdGhpcy5fZ2V0Q2FjaGVkQ29uZmlnRnJvbUZpZWxkVHlwZVByb3ZpZGVyKCk7XG5cbiAgICAgICAgLy8gVE9ETzogSW4gdGhlIG5leHQgYnJlYWtpbmcgcmVsZWFzZSBmcmVlemUgKGluc2lkZSBvZiB0aGUgY2FjaGUpIGFuZCByZXBsYWNlXG4gICAgICAgIC8vIEZpZWxkT3B0aW9ucyB3aXRoIHJlYWRvbmx5PEZpZWxkT3B0aW9ucz4uXG4gICAgICAgIC8vIFRvZGF5IHRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSB3ZSByZS11c2UgdGhlIGZpZWxkVHlwZVByb3ZpZGVyLmdldENvbmZpZyByZXNwb25zZS5cbiAgICAgICAgcmV0dXJuIG9wdGlvbnMgPyBjbG9uZURlZXAob3B0aW9ucykgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIFdlIHVzZSBhIGNhY2hlZCByZXNwb25zZSBmcm9tIEZpZWxkVHlwZVByb3ZpZGVyIGJlY2F1c2UgZ2V0dGluZyB0aGUgY29uZmlnIGNhblxuICAgIC8vIGJlIGFuIGV4cGVuc2l2ZSBvcGVyYXRpb24uIEluIHBhcnRpY3VsYXIgd2hlbiBmaWVsZENvbmZpZ3MgYXJlIGV4dHJlbWVseSBsYXJnZVxuICAgIC8vIChlZzogU2VsZWN0IGZpZWxkcyB3aXRoIGxvdHMgb2Ygc2VsZWN0IG9wdGlvbnMpXG4gICAgX2dldENhY2hlZENvbmZpZ0Zyb21GaWVsZFR5cGVQcm92aWRlcigpOiBGaWVsZFR5cGVDb25maWcge1xuICAgICAgICBpZiAodGhpcy5fY2FjaGVkRmllbGRUeXBlQ29uZmlnT3JOdWxsICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGVkRmllbGRUeXBlQ29uZmlnT3JOdWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFpcnRhYmxlSW50ZXJmYWNlID0gdGhpcy5fc2RrLl9fYWlydGFibGVJbnRlcmZhY2U7XG4gICAgICAgIGNvbnN0IGFwcEludGVyZmFjZSA9IHRoaXMuX3Nkay5fX2FwcEludGVyZmFjZTtcblxuICAgICAgICB0aGlzLl9jYWNoZWRGaWVsZFR5cGVDb25maWdPck51bGwgPSBhaXJ0YWJsZUludGVyZmFjZS5maWVsZFR5cGVQcm92aWRlci5nZXRDb25maWcoXG4gICAgICAgICAgICBhcHBJbnRlcmZhY2UsXG4gICAgICAgICAgICB0aGlzLl9kYXRhLFxuICAgICAgICAgICAgdGhpcy5wYXJlbnRUYWJsZS5fX2dldEZpZWxkTmFtZXNCeUlkKCksXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZEZpZWxkVHlwZUNvbmZpZ09yTnVsbDtcbiAgICB9XG4gICAgX2NsZWFyQ2FjaGVkQ29uZmlnKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jYWNoZWRGaWVsZFR5cGVDb25maWdPck51bGwgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIGFuZCBvcHRpb25zIG9mIHRoZSBmaWVsZCB0byBtYWtlIHR5cGUgbmFycm93aW5nIGBGaWVsZE9wdGlvbnNgIGVhc2llci5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIEZpZWxkQ29uZmlnfVxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgZmllbGRDb25maWcgPSBmaWVsZC5jb25maWc7XG4gICAgICogaWYgKGZpZWxkQ29uZmlnLnR5cGUgPT09IEZpZWxkVHlwZS5TSU5HTEVfU0VMRUNUKSB7XG4gICAgICogICAgIHJldHVybiBmaWVsZENvbmZpZy5vcHRpb25zLmNob2ljZXM7XG4gICAgICogfSBlbHNlIGlmIChmaWVsZENvbmZpZy50eXBlID09PSBGaWVsZFR5cGUuTVVMVElQTEVfTE9PS1VQX1ZBTFVFUyAmJiBmaWVsZENvbmZpZy5vcHRpb25zLmlzVmFsaWQpIHtcbiAgICAgKiAgICAgaWYgKGZpZWxkQ29uZmlnLm9wdGlvbnMucmVzdWx0LnR5cGUgPT09IEZpZWxkVHlwZS5TSU5HTEVfU0VMRUNUKSB7XG4gICAgICogICAgICAgICByZXR1cm4gZmllbGRDb25maWcub3B0aW9ucy5yZXN1bHQub3B0aW9ucy5jaG9pY2VzO1xuICAgICAqICAgICB9XG4gICAgICogfVxuICAgICAqIHJldHVybiBERUZBVUxUX0NIT0lDRVM7XG4gICAgICovXG4gICAgZ2V0IGNvbmZpZygpOiBGaWVsZENvbmZpZyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgIH0gYXMgRmllbGRDb25maWc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gcGVyZm9ybSB0aGUgZ2l2ZW4gb3B0aW9ucyB1cGRhdGUuXG4gICAgICpcbiAgICAgKiBBY2NlcHRzIHBhcnRpYWwgaW5wdXQsIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB7QGxpbmsgdXBkYXRlT3B0aW9uc0FzeW5jfS5cbiAgICAgKlxuICAgICAqIFJldHVybnMgYHtoYXNQZXJtaXNzaW9uOiB0cnVlfWAgaWYgdGhlIGN1cnJlbnQgdXNlciBjYW4gdXBkYXRlIHRoZSBzcGVjaWZpZWQgZmllbGQsXG4gICAgICogYHtoYXNQZXJtaXNzaW9uOiBmYWxzZSwgcmVhc29uRGlzcGxheVN0cmluZzogc3RyaW5nfWAgb3RoZXJ3aXNlLiBgcmVhc29uRGlzcGxheVN0cmluZ2AgbWF5IGJlXG4gICAgICogdXNlZCB0byBkaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2UgdG8gdGhlIHVzZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBuZXcgb3B0aW9ucyBmb3IgdGhlIGZpZWxkXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdXBkYXRlRmllbGRDaGVja1Jlc3VsdCA9IGZpZWxkLmNoZWNrUGVybWlzc2lvbnNGb3JVcGRhdGVPcHRpb25zKCk7XG4gICAgICpcbiAgICAgKiBpZiAoIXVwZGF0ZUZpZWxkQ2hlY2tSZXN1bHQuaGFzUGVybWlzc2lvbikge1xuICAgICAqICAgICBhbGVydCh1cGRhdGVGaWVsZENoZWNrUmVzdWx0LnJlYXNvbkRpc3BsYXlTdHJpbmcpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjaGVja1Blcm1pc3Npb25zRm9yVXBkYXRlT3B0aW9ucyhvcHRpb25zPzogRmllbGRPcHRpb25zKTogUGVybWlzc2lvbkNoZWNrUmVzdWx0IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nkay5fX211dGF0aW9ucy5jaGVja1Blcm1pc3Npb25zRm9yTXV0YXRpb24oe1xuICAgICAgICAgICAgdHlwZTogTXV0YXRpb25UeXBlcy5VUERBVEVfU0lOR0xFX0ZJRUxEX0NPTkZJRyxcbiAgICAgICAgICAgIHRhYmxlSWQ6IHRoaXMucGFyZW50VGFibGUuaWQsXG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gYWxpYXMgZm9yIGBjaGVja1Blcm1pc3Npb25zRm9yVXBkYXRlT3B0aW9ucyhvcHRpb25zKS5oYXNQZXJtaXNzaW9uYC5cbiAgICAgKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gcGVyZm9ybSB0aGUgb3B0aW9ucyB1cGRhdGUuXG4gICAgICpcbiAgICAgKiBBY2NlcHRzIHBhcnRpYWwgaW5wdXQsIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB7QGxpbmsgdXBkYXRlT3B0aW9uc0FzeW5jfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIG5ldyBvcHRpb25zIGZvciB0aGUgZmllbGRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjYW5VcGRhdGVGaWVsZCA9IGZpZWxkLmhhc1Blcm1pc3Npb25Ub1VwZGF0ZU9wdGlvbnMoKTtcbiAgICAgKlxuICAgICAqIGlmICghY2FuVXBkYXRlRmllbGQpIHtcbiAgICAgKiAgICAgYWxlcnQoJ25vdCBhbGxvd2VkIScpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBoYXNQZXJtaXNzaW9uVG9VcGRhdGVPcHRpb25zKG9wdGlvbnM/OiBGaWVsZE9wdGlvbnMpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tQZXJtaXNzaW9uc0ZvclVwZGF0ZU9wdGlvbnMob3B0aW9ucykuaGFzUGVybWlzc2lvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBvcHRpb25zIGZvciB0aGlzIGZpZWxkLlxuICAgICAqXG4gICAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSB1c2VyIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byB1cGRhdGUgdGhlIGZpZWxkLCBpZiBpbnZhbGlkXG4gICAgICogb3B0aW9ucyBhcmUgcHJvdmlkZWQsIGlmIHRoaXMgZmllbGQgaGFzIG5vIHdyaXRhYmxlIG9wdGlvbnMsIG9yIGlmIHVwZGF0ZXMgdG8gdGhpcyBmaWVsZFxuICAgICAqIHR5cGUgaXMgbm90IHN1cHBvcnRlZC5cbiAgICAgKlxuICAgICAqIFJlZmVyIHRvIHtAbGluayBGaWVsZFR5cGV9IGZvciBzdXBwb3J0ZWQgZmllbGQgdHlwZXMsIHRoZSB3cml0ZSBmb3JtYXQgZm9yIG9wdGlvbnMsIGFuZFxuICAgICAqIG90aGVyIHNwZWNpZmljcyBmb3IgY2VydGFpbiBmaWVsZCB0eXBlcy5cbiAgICAgKlxuICAgICAqIFRoaXMgYWN0aW9uIGlzIGFzeW5jaHJvbm91cy4gVW5saWtlIHVwZGF0ZXMgdG8gY2VsbCB2YWx1ZXMsIHVwZGF0ZXMgdG8gZmllbGQgb3B0aW9ucyBhcmVcbiAgICAgKiAqKm5vdCoqIGFwcGxpZWQgb3B0aW1pc3RpY2FsbHkgbG9jYWxseS4gWW91IG11c3QgYGF3YWl0YCB0aGUgcmV0dXJuZWQgcHJvbWlzZSBiZWZvcmVcbiAgICAgKiByZWx5aW5nIG9uIHRoZSBjaGFuZ2UgaW4geW91ciBhcHAuXG4gICAgICpcbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIHBhc3MgYW4gYG9wdHNgIG9iamVjdCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LiBTZWUge0BsaW5rIFVwZGF0ZUZpZWxkT3B0aW9uc09wdHN9XG4gICAgICogZm9yIGF2YWlsYWJsZSBvcHRpb25zLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgbmV3IG9wdGlvbnMgZm9yIHRoZSBmaWVsZFxuICAgICAqIEBwYXJhbSBvcHRzIG9wdGlvbmFsIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBiZWhhdmlvciBvZiB0aGUgdXBkYXRlXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogYXN5bmMgZnVuY3Rpb24gYWRkQ2hvaWNlVG9TZWxlY3RGaWVsZChzZWxlY3RGaWVsZCwgbmFtZUZvck5ld09wdGlvbikge1xuICAgICAqICAgICBjb25zdCB1cGRhdGVkT3B0aW9ucyA9IHtcbiAgICAgKiAgICAgICAgIGNob2ljZXM6IFtcbiAgICAgKiAgICAgICAgICAgICAuLi5zZWxlY3RGaWVsZC5vcHRpb25zLmNob2ljZXMsXG4gICAgICogICAgICAgICAgICAge25hbWU6IG5hbWVGb3JOZXdPcHRpb259LFxuICAgICAqICAgICAgICAgXVxuICAgICAqICAgICB9O1xuICAgICAqXG4gICAgICogICAgIGlmIChzZWxlY3RGaWVsZC5oYXNQZXJtaXNzaW9uVG9VcGRhdGVPcHRpb25zKHVwZGF0ZWRPcHRpb25zKSkge1xuICAgICAqICAgICAgICAgYXdhaXQgc2VsZWN0RmllbGQudXBkYXRlT3B0aW9uc0FzeW5jKHVwZGF0ZWRPcHRpb25zKTtcbiAgICAgKiAgICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVPcHRpb25zQXN5bmMoXG4gICAgICAgIG9wdGlvbnM6IEZpZWxkT3B0aW9ucyxcbiAgICAgICAgb3B0czogVXBkYXRlRmllbGRPcHRpb25zT3B0cyA9IHt9LFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLl9zZGsuX19tdXRhdGlvbnMuYXBwbHlNdXRhdGlvbkFzeW5jKHtcbiAgICAgICAgICAgIHR5cGU6IE11dGF0aW9uVHlwZXMuVVBEQVRFX1NJTkdMRV9GSUVMRF9DT05GSUcsXG4gICAgICAgICAgICB0YWJsZUlkOiB0aGlzLnBhcmVudFRhYmxlLmlkLFxuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcHRzLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIHBlcmZvcm0gdGhlIGdpdmVuIGRlc2NyaXB0aW9uIHVwZGF0ZS5cbiAgICAgKlxuICAgICAqIEFjY2VwdHMgcGFydGlhbCBpbnB1dCwgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIHtAbGluayB1cGRhdGVEZXNjcmlwdGlvbkFzeW5jfS5cbiAgICAgKlxuICAgICAqIFJldHVybnMgYHtoYXNQZXJtaXNzaW9uOiB0cnVlfWAgaWYgdGhlIGN1cnJlbnQgdXNlciBjYW4gdXBkYXRlIHRoZSBzcGVjaWZpZWQgZmllbGQsXG4gICAgICogYHtoYXNQZXJtaXNzaW9uOiBmYWxzZSwgcmVhc29uRGlzcGxheVN0cmluZzogc3RyaW5nfWAgb3RoZXJ3aXNlLiBgcmVhc29uRGlzcGxheVN0cmluZ2AgbWF5IGJlXG4gICAgICogdXNlZCB0byBkaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2UgdG8gdGhlIHVzZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gbmV3IGRlc2NyaXB0aW9uIGZvciB0aGUgZmllbGRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB1cGRhdGVGaWVsZENoZWNrUmVzdWx0ID0gZmllbGQuY2hlY2tQZXJtaXNzaW9uc0ZvclVwZGF0ZURlc2NyaXB0aW9uKCk7XG4gICAgICpcbiAgICAgKiBpZiAoIXVwZGF0ZUZpZWxkQ2hlY2tSZXN1bHQuaGFzUGVybWlzc2lvbikge1xuICAgICAqICAgICBhbGVydCh1cGRhdGVGaWVsZENoZWNrUmVzdWx0LnJlYXNvbkRpc3BsYXlTdHJpbmcpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjaGVja1Blcm1pc3Npb25zRm9yVXBkYXRlRGVzY3JpcHRpb24oZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsKTogUGVybWlzc2lvbkNoZWNrUmVzdWx0IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nkay5fX211dGF0aW9ucy5jaGVja1Blcm1pc3Npb25zRm9yTXV0YXRpb24oe1xuICAgICAgICAgICAgdHlwZTogTXV0YXRpb25UeXBlcy5VUERBVEVfU0lOR0xFX0ZJRUxEX0RFU0NSSVBUSU9OLFxuICAgICAgICAgICAgdGFibGVJZDogdGhpcy5wYXJlbnRUYWJsZS5pZCxcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIGFsaWFzIGZvciBgY2hlY2tQZXJtaXNzaW9uc0ZvclVwZGF0ZURlc2NyaXB0aW9uKG9wdGlvbnMpLmhhc1Blcm1pc3Npb25gLlxuICAgICAqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgdXNlciBoYXMgcGVybWlzc2lvbiB0byBwZXJmb3JtIHRoZSBkZXNjcmlwdGlvbiB1cGRhdGUuXG4gICAgICpcbiAgICAgKiBBY2NlcHRzIHBhcnRpYWwgaW5wdXQsIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB7QGxpbmsgdXBkYXRlRGVzY3JpcHRpb25Bc3luY30uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gbmV3IGRlc2NyaXB0aW9uIGZvciB0aGUgZmllbGRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjYW5VcGRhdGVGaWVsZCA9IGZpZWxkLmhhc1Blcm1pc3Npb25Ub1VwZGF0ZURlc2NyaXB0aW9uKCk7XG4gICAgICpcbiAgICAgKiBpZiAoIWNhblVwZGF0ZUZpZWxkKSB7XG4gICAgICogICAgIGFsZXJ0KCdub3QgYWxsb3dlZCEnKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgaGFzUGVybWlzc2lvblRvVXBkYXRlRGVzY3JpcHRpb24oZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoZWNrUGVybWlzc2lvbnNGb3JVcGRhdGVEZXNjcmlwdGlvbihkZXNjcmlwdGlvbikuaGFzUGVybWlzc2lvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhpcyBmaWVsZC5cbiAgICAgKlxuICAgICAqIFRvIHJlbW92ZSBhbiBleGlzdGluZyBkZXNjcmlwdGlvbiwgcGFzcyBgJydgIGFzIHRoZSBuZXcgZGVzY3JpcHRpb24uXG4gICAgICogYG51bGxgIGlzIGFsc28gYWNjZXB0ZWQgYW5kIHdpbGwgYmUgY29lcmNlZCB0byBgJydgIGZvciBjb25zaXN0ZW5jeSB3aXRoIGZpZWxkIGNyZWF0aW9uLlxuICAgICAqXG4gICAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSB1c2VyIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byB1cGRhdGUgdGhlIGZpZWxkLCBvciBpZiBhbiBpbnZhbGlkXG4gICAgICogZGVzY3JpcHRpb24gaXMgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBUaGlzIGFjdGlvbiBpcyBhc3luY2hyb25vdXMuIFVubGlrZSB1cGRhdGVzIHRvIGNlbGwgdmFsdWVzLCB1cGRhdGVzIHRvIGZpZWxkIGRlc2NyaXB0aW9ucyBhcmVcbiAgICAgKiAqKm5vdCoqIGFwcGxpZWQgb3B0aW1pc3RpY2FsbHkgbG9jYWxseS4gWW91IG11c3QgYGF3YWl0YCB0aGUgcmV0dXJuZWQgcHJvbWlzZSBiZWZvcmVcbiAgICAgKiByZWx5aW5nIG9uIHRoZSBjaGFuZ2UgaW4geW91ciBhcHAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gbmV3IGRlc2NyaXB0aW9uIGZvciB0aGUgZmllbGRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBganNcbiAgICAgKiBhd2FpdCBteVRleHRGaWVsZC51cGRhdGVEZXNjcmlwdGlvbkFzeW5jKCdUaGlzIGlzIGEgdGV4dCBmaWVsZCcpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZURlc2NyaXB0aW9uQXN5bmMoZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fc2RrLl9fbXV0YXRpb25zLmFwcGx5TXV0YXRpb25Bc3luYyh7XG4gICAgICAgICAgICB0eXBlOiBNdXRhdGlvblR5cGVzLlVQREFURV9TSU5HTEVfRklFTERfREVTQ1JJUFRJT04sXG4gICAgICAgICAgICB0YWJsZUlkOiB0aGlzLnBhcmVudFRhYmxlLmlkLFxuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoaXMgZmllbGQgaXMgY29tcHV0ZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLiBBIGZpZWxkIGlzXG4gICAgICogXCJjb21wdXRlZFwiIGlmIGl0J3MgdmFsdWUgaXMgbm90IHNldCBieSB1c2VyIGlucHV0IChlLmcuIGF1dG9OdW1iZXIsIGZvcm11bGEsXG4gICAgICogZXRjLikuIENhbiBiZSB3YXRjaGVkXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogY29uc29sZS5sb2cobXlTaW5nbGVMaW5lVGV4dEZpZWxkLmlzQ29tcHV0ZWQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICogY29uc29sZS5sb2cobXlBdXRvTnVtYmVyRmllbGQuaXNDb21wdXRlZCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdldCBpc0NvbXB1dGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBhaXJ0YWJsZUludGVyZmFjZSA9IHRoaXMuX3Nkay5fX2FpcnRhYmxlSW50ZXJmYWNlO1xuICAgICAgICByZXR1cm4gYWlydGFibGVJbnRlcmZhY2UuZmllbGRUeXBlUHJvdmlkZXIuaXNDb21wdXRlZCh0aGlzLl9kYXRhKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoaXMgZmllbGQgaXMgaXRzIHBhcmVudCB0YWJsZSdzIHByaW1hcnkgZmllbGQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqIFNob3VsZCBuZXZlciBjaGFuZ2UgYmVjYXVzZSB0aGUgcHJpbWFyeSBmaWVsZCBvZiBhIHRhYmxlIGNhbm5vdCBjaGFuZ2UuXG4gICAgICovXG4gICAgZ2V0IGlzUHJpbWFyeUZpZWxkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pZCA9PT0gdGhpcy5wYXJlbnRUYWJsZS5wcmltYXJ5RmllbGQuaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmaWVsZCwgaWYgaXQgaGFzIG9uZS4gQ2FuIGJlIHdhdGNoZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogY29uc29sZS5sb2cobXlGaWVsZC5kZXNjcmlwdGlvbik7XG4gICAgICogLy8gPT4gJ1RoaXMgaXMgbXkgZmllbGQnXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS5kZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgLy8gVGhlIGZvbGxvd2luZyBtZXRob2QgaXMgdW50ZXN0ZWQgYmVjYXVzZSBpdHMgaW1wbGVtZW50YXRpb24gcmVzaXN0c1xuICAgIC8vIHRlc3RpbmcgYW5kIGJlY2F1c2UgaXQgaXMgZXhwZWN0ZWQgdG8gYmUgcmVkZXNpZ25lZC5cbiAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhdmFpbGFibGUgYWdncmVnYXRvcnMgZ2l2ZW4gdGhpcyBmaWVsZCdzIGNvbmZpZ3VyYXRpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZmllbGRBZ2dyZWdhdG9ycyA9IG15RmllbGQuYXZhaWxhYmxlQWdncmVnYXRvcnM7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGF2YWlsYWJsZUFnZ3JlZ2F0b3JzKCk6IEFycmF5PEFnZ3JlZ2F0b3I+IHtcbiAgICAgICAgY29uc3QgYWlydGFibGVJbnRlcmZhY2UgPSB0aGlzLl9zZGsuX19haXJ0YWJsZUludGVyZmFjZTtcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlQWdncmVnYXRvcktleXNTZXQgPSBuZXcgU2V0KFxuICAgICAgICAgICAgYWlydGFibGVJbnRlcmZhY2UuYWdncmVnYXRvcnMuZ2V0QXZhaWxhYmxlQWdncmVnYXRvcktleXNGb3JGaWVsZCh0aGlzLl9kYXRhKSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCB7YWdncmVnYXRvcnN9ID0gcmVxdWlyZSgnLi9tb2RlbHMnKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlcyhhZ2dyZWdhdG9ycykuZmlsdGVyKGFnZ3JlZ2F0b3IgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF2YWlsYWJsZUFnZ3JlZ2F0b3JLZXlzU2V0LmhhcyhhZ2dyZWdhdG9yLmtleSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBUaGUgZm9sbG93aW5nIG1ldGhvZCBpcyB1bnRlc3RlZCBiZWNhdXNlIGl0cyBpbXBsZW1lbnRhdGlvbiByZXNpc3RzXG4gICAgLy8gdGVzdGluZyBhbmQgYmVjYXVzZSBpdCBpcyBleHBlY3RlZCB0byBiZSByZWRlc2lnbmVkLlxuICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBhZ2dyZWdhdG9yIGlzIGF2YWlsYWJsZSBmb3IgdGhpcyBmaWVsZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhZ2dyZWdhdG9yIFRoZSBhZ2dyZWdhdG9yIG9iamVjdCBvciBhZ2dyZWdhdG9yIGtleS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHthZ2dyZWdhdG9yc30gZnJvbSAnQGFpcnRhYmxlL2Jsb2Nrcy9tb2RlbHMnO1xuICAgICAqIGNvbnN0IGFnZ3JlZ2F0b3IgPSBhZ2dyZWdhdG9ycy50b3RhbEF0dGFjaG1lbnRTaXplO1xuICAgICAqXG4gICAgICogLy8gVXNpbmcgYW4gYWdncmVnYXRvciBvYmplY3RcbiAgICAgKiBjb25zb2xlLmxvZyhteUF0dGFjaG1lbnRGaWVsZC5pc0FnZ3JlZ2F0b3JBdmFpbGFibGUoYWdncmVnYXRvcikpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIC8vIFVzaW5nIGFuIGFnZ3JlZ2F0b3Iga2V5XG4gICAgICogY29uc29sZS5sb2cobXlUZXh0RmllbGQuaXNBZ2dyZWdhdG9yQXZhaWxhYmxlKCd0b3RhbEF0dGFjaG1lbnRTaXplJykpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICogYGBgXG4gICAgICovXG4gICAgaXNBZ2dyZWdhdG9yQXZhaWxhYmxlKGFnZ3JlZ2F0b3I6IEFnZ3JlZ2F0b3IgfCBBZ2dyZWdhdG9yS2V5KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGFnZ3JlZ2F0b3JLZXkgPSB0eXBlb2YgYWdncmVnYXRvciA9PT0gJ3N0cmluZycgPyBhZ2dyZWdhdG9yIDogYWdncmVnYXRvci5rZXk7XG5cbiAgICAgICAgY29uc3QgYWlydGFibGVJbnRlcmZhY2UgPSB0aGlzLl9zZGsuX19haXJ0YWJsZUludGVyZmFjZTtcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlQWdncmVnYXRvcktleXMgPSBhaXJ0YWJsZUludGVyZmFjZS5hZ2dyZWdhdG9ycy5nZXRBdmFpbGFibGVBZ2dyZWdhdG9yS2V5c0ZvckZpZWxkKFxuICAgICAgICAgICAgdGhpcy5fZGF0YSxcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gYXZhaWxhYmxlQWdncmVnYXRvcktleXMuc29tZShrZXkgPT4ga2V5ID09PSBhZ2dyZWdhdG9yS2V5KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXR0ZW1wdCB0byBwYXJzZSBhIGdpdmVuIHN0cmluZyBhbmQgcmV0dXJuIGEgdmFsaWQgY2VsbCB2YWx1ZSBmb3IgdGhlIGZpZWxkJ3MgY3VycmVudCBjb25maWcuXG4gICAgICogUmV0dXJucyBgbnVsbGAgaWYgdW5hYmxlIHRvIHBhcnNlIHRoZSBnaXZlbiBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RyaW5nIFRoZSBzdHJpbmcgdG8gcGFyc2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGlucHV0U3RyaW5nID0gJzQyJztcbiAgICAgKiBjb25zdCBjZWxsVmFsdWUgPSBteU51bWJlckZpZWxkLmNvbnZlcnRTdHJpbmdUb0NlbGxWYWx1ZShpbnB1dFN0cmluZyk7XG4gICAgICogY29uc29sZS5sb2coY2VsbFZhbHVlID09PSA0Mik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNvbnZlcnRTdHJpbmdUb0NlbGxWYWx1ZShzdHJpbmc6IHN0cmluZyk6IHVua25vd24ge1xuICAgICAgICBjb25zdCBhaXJ0YWJsZUludGVyZmFjZSA9IHRoaXMuX3Nkay5fX2FpcnRhYmxlSW50ZXJmYWNlO1xuICAgICAgICBjb25zdCBhcHBJbnRlcmZhY2UgPSB0aGlzLl9zZGsuX19hcHBJbnRlcmZhY2U7XG5cbiAgICAgICAgY29uc3QgY2VsbFZhbHVlID0gYWlydGFibGVJbnRlcmZhY2UuZmllbGRUeXBlUHJvdmlkZXIuY29udmVydFN0cmluZ1RvQ2VsbFZhbHVlKFxuICAgICAgICAgICAgYXBwSW50ZXJmYWNlLFxuICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgdGhpcy5fZGF0YSxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBUZW1wb3JhcmlseSBiYWlsIG91dCBvZiB2YWxpZGF0aW5nIGNvbXB1dGVkIHZhbHVlcyAoc2luY2UgdmFsaWRhdGlvbiB3aWxsIGNyYXNoKVxuICAgICAgICAvLyB3aGlsZSB3ZSB3b3JrIG91dCBpZiB3ZSBhY3R1YWxseSBoYXZlIHRvIHZhbGlkYXRlIG9yIG5vdC4gSWRlYWxseSB3ZSBqdXN0IGRlbGV0ZSBhbGxcbiAgICAgICAgLy8gdGhlIHZhbGlkYXRpb25cbiAgICAgICAgLy8gVE9ETyhlbW1hKTogZGVsZXRlIG1lIG9yIHRpZHkgbWUgdXBcbiAgICAgICAgaWYgKHRoaXMuaXNDb21wdXRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNlbGxWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPRE8oZW1tYSk6IGRvIHdlIG5lZWQgdG8gdmFsaWRhdGUgaGVyZT9cbiAgICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGFpcnRhYmxlSW50ZXJmYWNlLmZpZWxkVHlwZVByb3ZpZGVyLnZhbGlkYXRlQ2VsbFZhbHVlRm9yVXBkYXRlKFxuICAgICAgICAgICAgYXBwSW50ZXJmYWNlLFxuICAgICAgICAgICAgY2VsbFZhbHVlLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHRoaXMuX2RhdGEsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNlbGxWYWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9fdHJpZ2dlck9uQ2hhbmdlRm9yRGlydHlQYXRocyhkaXJ0eVBhdGhzOiBGbG93QW55T2JqZWN0KSB7XG4gICAgICAgIC8vIEFsd2F5cyBjbGVhciB0aGUgY2FjaGVkIGNvbmZpZyB3aGVuIGFueXRoaW5nIG9uIHRoZSBmaWVsZCBkYXRhIG1vZGVsIGNoYW5nZXNcbiAgICAgICAgdGhpcy5fY2xlYXJDYWNoZWRDb25maWcoKTtcblxuICAgICAgICBpZiAoZGlydHlQYXRocy5uYW1lKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShXYXRjaGFibGVGaWVsZEtleXMubmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpcnR5UGF0aHMudHlwZSkge1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UoV2F0Y2hhYmxlRmllbGRLZXlzLnR5cGUpO1xuXG4gICAgICAgICAgICAvLyBUT0RPOiBpdCB3b3VsZCBiZSBiZXR0ZXIgaWYgd2Ugb25seSB0cmlnZ2VyIHRoaXMgd2hlblxuICAgICAgICAgICAgLy8gd2Uga25vdyBpc0NvbXB1dGVkIGNoYW5nZWQuXG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShXYXRjaGFibGVGaWVsZEtleXMuaXNDb21wdXRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpcnR5UGF0aHMudHlwZU9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKFdhdGNoYWJsZUZpZWxkS2V5cy5vcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlydHlQYXRocy5kZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UoV2F0Y2hhYmxlRmllbGRLZXlzLmRlc2NyaXB0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRmllbGQ7XG4iXX0=
@@ -245,19 +245,13 @@ function (_RecordQueryResult) {
245
245
  while (1) {
246
246
  switch (_context2.prev = _context2.next) {
247
247
  case 0:
248
- this._parentQueryResult.__groupedRecordQueryResultPool.registerObjectForReuseStrong(this); // Ensure we invalidate our memoized computed recordIds whenever a relevant hook changes
249
- // TODO: (SeanKeenan) At the moment this should never be relevant, because groups are recreated
250
- // anytime the groups change - but this is how it should work once groups persist AND
251
- // watching recordIds only changes if records in this group change.
252
- // In the meantime this does ensure that a deleted GroupedRecordQuery with stale recordIds
253
- // doesn't return the cached array.
248
+ // TODO: This entire class assumes it is torn down and re-created by the parent whenever
249
+ // a change to the group is made.
250
+ this._parentQueryResult.__groupedRecordQueryResultPool.registerObjectForReuseStrong(this);
254
251
 
255
-
256
- this.watch(['recordIds', 'groups', 'groupLevels'], this._invalidateComputedRecordIds, this);
257
- this.watch(['recordIds'], this._invalidateRecordIdsSet, this);
258
252
  return _context2.abrupt("return", this._getChangedKeysOnLoad());
259
253
 
260
- case 4:
254
+ case 2:
261
255
  case "end":
262
256
  return _context2.stop();
263
257
  }
@@ -269,10 +263,7 @@ function (_RecordQueryResult) {
269
263
  }, {
270
264
  key: "_unloadData",
271
265
  value: function _unloadData() {
272
- // Ensure we invalidate our memoized computed recordIds whenever a relevant hook changes
273
- this.unwatch(['recordIds', 'groups', 'groupLevels'], this._invalidateComputedRecordIds, this);
274
- this.unwatch(['recordIds'], this._invalidateRecordIdsSet, this); // Invalidate both of the caches, as this object can no longer be accessed
275
-
266
+ // Invalidate both of the caches, as this object can no longer be accessed
276
267
  this._invalidateComputedRecordIds();
277
268
 
278
269
  this._invalidateRecordIdsSet();
@@ -472,4 +463,5 @@ function (_RecordQueryResult) {
472
463
 
473
464
  (0, _defineProperty2.default)(GroupedRecordQueryResult, "_className", 'GroupedRecordQueryResult');
474
465
  var _default = GroupedRecordQueryResult;
475
- exports.default = _default;
466
+ exports.default = _default;
467
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbHMvZ3JvdXBlZF9yZWNvcmRfcXVlcnlfcmVzdWx0LnRzIl0sIm5hbWVzIjpbIkdyb3VwZWRSZWNvcmRRdWVyeVJlc3VsdCIsInBhcmVudFF1ZXJ5UmVzdWx0IiwiZ3JvdXBEYXRhIiwiZ3JvdXBMZXZlbCIsIm5vcm1hbGl6ZWRPcHRzIiwic2RrIiwiX19ncm91cGVkUmVjb3JkUXVlcnlSZXN1bHRQb29sIiwiT2JqZWN0UG9vbCIsIl9wYXJlbnRRdWVyeVJlc3VsdCIsIl9ncm91cERhdGEiLCJfZ3JvdXBMZXZlbHMiLCJncm91cExldmVsRGF0YVNsaWNlZEZvckNoaWxkcmVuIiwic2xpY2UiLCJfb3JkZXJlZENoaWxkcmVuR3JvdXBzIiwiZ3JvdXBzIiwibWFwIiwic2luZ2xlR3JvdXBEYXRhIiwiZ3JvdXAiLCJnZXRPYmplY3RGb3JSZXVzZSIsImxvYWREYXRhQXN5bmMiLCJfZGF0YSIsInZpc2libGVSZWNvcmRJZHMiLCJyZWNvcmRJZHMiLCJwdXNoIiwiX29yZGVyZWRSZWNvcmRJZHMiLCJrZXlzIiwiY2FsbGJhY2siLCJjb250ZXh0IiwidmFsaWRLZXlzIiwid2F0Y2giLCJ1bndhdGNoIiwiX2dldENoYW5nZWRLZXlzT25Mb2FkIiwicmVnaXN0ZXJPYmplY3RGb3JSZXVzZVN0cm9uZyIsIl9pbnZhbGlkYXRlQ29tcHV0ZWRSZWNvcmRJZHMiLCJfaW52YWxpZGF0ZVJlY29yZElkc1NldCIsIl91bmxvYWRDaGlsZHJlbkdyb3Vwc0lmTmVlZGVkIiwidW5yZWdpc3Rlck9iamVjdEZvclJldXNlU3Ryb25nIiwidW5sb2FkRGF0YSIsIl9yZWNvcmRJZHNTZXQiLCJyZWNvcmRJZHNTZXQiLCJyZWNvcmRJZCIsImdyb3VwTGV2ZWxzIiwiZmllbGRJZCIsInBhcmVudFRhYmxlIiwiZ2V0RmllbGRCeUlkIiwiaXNEYXRhTG9hZGVkIiwiX2NvbXB1dGVSZWNvcmRJZHMiLCJmaWVsZHMiLCJfc2VyaWFsaXplZE9wdHMiLCJpZCIsIl9kYXRhT3JOdWxsSWZEZWxldGVkIiwiUmVjb3JkUXVlcnlSZXN1bHQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSUE7O0FBSUE7O0FBT0E7O0FBZkE7O0FBQTBEOztBQTBCMUQ7Ozs7Ozs7Ozs7SUFVTUEsd0I7Ozs7O0FBQ0Y7O0FBR0E7O0FBR0E7O0FBR0E7Ozs7OztBQVFBOztBQUNBO0FBR0E7O0FBQ0E7QUFHQTs7QUFHQTs7QUFNQTtBQUNBLG9DQUNJQyxpQkFESixFQUVJQyxTQUZKLEVBR0lDLFVBSEosRUFJSUMsY0FKSixFQUtJQyxHQUxKLEVBTUU7QUFBQTs7QUFBQTtBQUNFLDhIQUFNQSxHQUFOLEVBQVdELGNBQVg7QUFERjtBQUFBO0FBQUE7QUFBQTtBQUFBLGdHQWxCbUQsSUFrQm5EO0FBQUEsb0dBZmtELElBZWxEO0FBQUE7QUFHRSxVQUFLRSw4QkFBTCxHQUFzQyxJQUFJQyxvQkFBSixDQUFlUCx3QkFBZixDQUF0QztBQUNBLFVBQUtRLGtCQUFMLEdBQTBCUCxpQkFBMUI7QUFDQSxVQUFLUSxVQUFMLEdBQWtCUCxTQUFsQjtBQUNBLFVBQUtRLFlBQUwsR0FBb0JQLFVBQXBCOztBQUNBLFFBQU1RLCtCQUErQixHQUFHLE1BQUtELFlBQUwsQ0FBa0JFLEtBQWxCLENBQXdCLENBQXhCLENBQXhDOztBQUNBLFVBQUtDLHNCQUFMLEdBQThCWCxTQUFTLENBQUNZLE1BQVYsR0FDeEJaLFNBQVMsQ0FBQ1ksTUFBVixDQUFpQkMsR0FBakIsQ0FBcUJDLGVBQWUsSUFBSTtBQUNwQyxVQUFNQyxLQUFLLEdBQUcsTUFBS1gsOEJBQUwsQ0FBb0NZLGlCQUFwQyw4Q0FFVkYsZUFGVSxFQUdWTCwrQkFIVSxFQUlWUCxjQUpVLEVBS1ZDLEdBTFUsQ0FBZCxDQURvQyxDQVFwQztBQUNBOzs7QUFDQVksTUFBQUEsS0FBSyxDQUFDRSxhQUFOO0FBQ0EsYUFBT0YsS0FBUDtBQUNILEtBWkQsQ0FEd0IsR0FjeEIsSUFkTjtBQVJGO0FBdUJEO0FBRUQ7Ozs7Ozs7O0FBMkNBOzs7Ozt3Q0FLNkM7QUFDekM7QUFDQSxVQUFJLENBQUMsS0FBS0gsTUFBVixFQUFrQjtBQUFBOztBQUNkO0FBQ0E7QUFDQTtBQUNBLHdDQUFPLEtBQUtNLEtBQUwsQ0FBV2xCLFNBQVgsQ0FBcUJtQixnQkFBNUIseUVBQWdELEVBQWhEO0FBQ0gsT0FQd0MsQ0FTekM7OztBQUNBLFVBQUlDLFNBQTBCLEdBQUcsRUFBakM7QUFWeUM7QUFBQTtBQUFBOztBQUFBO0FBV3pDLDZCQUFvQixLQUFLUixNQUF6Qiw4SEFBaUM7QUFBQSxjQUF0QkcsS0FBc0I7QUFDN0JLLFVBQUFBLFNBQVMsQ0FBQ0MsSUFBVixDQUFlLEdBQUdOLEtBQUssQ0FBQ0ssU0FBeEI7QUFDSDtBQWJ3QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQWN6QyxhQUFPQSxTQUFQO0FBQ0g7QUFFRDs7Ozs7Ozs7O21EQU1xQztBQUNqQyxXQUFLRSxpQkFBTCxHQUF5QixJQUF6QjtBQUNIO0FBRUQ7Ozs7Ozs7OztBQTBCQTswQkFFSUMsSSxFQUNBQyxRLEVBQ0FDLE8sRUFDb0M7QUFDcEM7QUFDQTtBQUNBLFVBQU1DLFNBQVMsR0FBRyxLQUFLcEIsa0JBQUwsQ0FBd0JxQixLQUF4QixDQUE4QkosSUFBOUIsRUFBb0NDLFFBQXBDLEVBQThDQyxPQUE5QyxDQUFsQjs7QUFDQSxhQUFPQyxTQUFQO0FBQ0g7QUFFRDs7Ozs0QkFFSUgsSSxFQUNBQyxRLEVBQ0FDLE8sRUFDb0M7QUFDcEMsYUFBTyxLQUFLbkIsa0JBQUwsQ0FBd0JzQixPQUF4QixDQUFnQ0wsSUFBaEMsRUFBc0NDLFFBQXRDLEVBQWdEQyxPQUFoRCxDQUFQO0FBQ0g7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUtBOzs7OzRDQUM4RDtBQUMxRCxhQUFPLEtBQUtuQixrQkFBTCxDQUF3QnVCLHFCQUF4QixFQUFQO0FBQ0g7QUFFRDs7Ozs7Ozs7O0FBRUk7QUFDQTtBQUNBLG1CQUFLdkIsa0JBQUwsQ0FBd0JGLDhCQUF4QixDQUF1RDBCLDRCQUF2RCxDQUFvRixJQUFwRjs7Z0RBQ08sS0FBS0QscUJBQUwsRTs7Ozs7Ozs7O0FBR1g7Ozs7a0NBQ2M7QUFDVjtBQUNBLFdBQUtFLDRCQUFMOztBQUNBLFdBQUtDLHVCQUFMOztBQUVBLFdBQUtDLDZCQUFMOztBQUNBLFdBQUszQixrQkFBTCxDQUF3QkYsOEJBQXhCLENBQXVEOEIsOEJBQXZELENBQXNGLElBQXRGO0FBQ0g7QUFFRDs7Ozs7QUFnQ0E7b0RBQ2dDO0FBQzVCLFVBQUksS0FBS3ZCLHNCQUFULEVBQWlDO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQzdCLGdDQUFvQixLQUFLQSxzQkFBekIsbUlBQWlEO0FBQUEsZ0JBQXRDSSxLQUFzQztBQUM3Q0EsWUFBQUEsS0FBSyxDQUFDb0IsVUFBTjtBQUNIO0FBSDRCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFJaEM7QUFDSjtBQUVEOzs7OzhDQUMwQjtBQUN0QixXQUFLQyxhQUFMLEdBQXFCLElBQXJCO0FBQ0g7QUFFRDs7OztpREFDNkI7QUFDekI7QUFDQSxVQUFJLENBQUMsS0FBS0EsYUFBVixFQUF5QjtBQUNyQixZQUFNQyxZQUF1QyxHQUFHLEVBQWhEO0FBRHFCO0FBQUE7QUFBQTs7QUFBQTtBQUVyQixnQ0FBdUIsS0FBS2pCLFNBQTVCLG1JQUF1QztBQUFBLGdCQUE1QmtCLFFBQTRCO0FBQ25DRCxZQUFBQSxZQUFZLENBQUNDLFFBQUQsQ0FBWixHQUF5QixJQUF6QjtBQUNIO0FBSm9CO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBS3JCLGFBQUtGLGFBQUwsR0FBcUJDLFlBQXJCO0FBQ0g7O0FBRUQsYUFBTyxLQUFLRCxhQUFaO0FBQ0g7Ozt3QkE3TW9EO0FBQ2pELGFBQU8sS0FBS3pCLHNCQUFaO0FBQ0g7QUFFRDs7Ozt3QkFDdUM7QUFDbkMsYUFBTyxLQUFLTyxLQUFMLENBQVdxQixXQUFYLENBQXVCLENBQXZCLENBQVA7QUFDSDtBQUVEOzs7Ozs7d0JBR3VCO0FBQ25CLGFBQU8sS0FBS3RDLFVBQUwsQ0FBZ0J1QyxPQUF2QjtBQUNIO0FBRUQ7Ozs7Ozt3QkFHbUI7QUFDZixhQUFPLEtBQUtDLFdBQUwsQ0FBaUJDLFlBQWpCLENBQThCLEtBQUtGLE9BQW5DLENBQVA7QUFDSCxLLENBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7d0JBSXlCO0FBQ3JCLGFBQU8sS0FBS2xDLGtCQUFMLENBQXdCbUMsV0FBL0I7QUFDSDs7O3dCQXVDd0M7QUFDckMsa0NBQVUsS0FBS0UsWUFBZixFQUE2Qiw2Q0FBN0I7O0FBRUEsVUFBSSxLQUFLckIsaUJBQUwsS0FBMkIsSUFBL0IsRUFBcUM7QUFDakMsYUFBS0EsaUJBQUwsR0FBeUIsS0FBS3NCLGlCQUFMLEVBQXpCO0FBQ0g7O0FBRUQsYUFBTyxLQUFLdEIsaUJBQVo7QUFDSDtBQUVEOzs7Ozs7Ozs7d0JBTWtDO0FBQzlCLGtDQUFVLEtBQUtxQixZQUFmLEVBQTZCLDZDQUE3QjtBQUNBLGFBQU8sS0FBS3JDLGtCQUFMLENBQXdCdUMsTUFBL0I7QUFDSDs7O3dCQW9EZTtBQUNaO0FBQ0EsdUJBQVUsS0FBS0MsZUFBZixlQUFtQyxLQUFLQyxFQUF4QztBQUNIO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O3dCQVdnRTtBQUM1RCxVQUFJLEtBQUt6QyxrQkFBTCxDQUF3QjBDLG9CQUF4QixLQUFpRCxJQUFyRCxFQUEyRDtBQUN2RCxlQUFPLElBQVA7QUFDSDs7QUFDRCxhQUFPO0FBQ0hoRCxRQUFBQSxTQUFTLEVBQUUsS0FBS08sVUFEYjtBQUVIZ0MsUUFBQUEsV0FBVyxFQUFFLEtBQUsvQjtBQUZmLE9BQVA7QUFJSDtBQUVEOzs7O3dCQUM0QjtBQUN4QixhQUFPLEtBQUtGLGtCQUFMLENBQXdCcUMsWUFBL0I7QUFDSDs7O0VBdlBrQ00sNEI7OzhCQUFqQ25ELHdCLGdCQUVrQiwwQjtlQW9SVEEsd0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQG1vZHVsZSBAYWlydGFibGUvYmxvY2tzL21vZGVsczogUmVjb3JkUXVlcnlSZXN1bHQgKi8gLyoqICovXG5pbXBvcnQge0ZpZWxkSWR9IGZyb20gJy4uL3R5cGVzL2ZpZWxkJztcbmltcG9ydCBTZGsgZnJvbSAnLi4vc2RrJztcbmltcG9ydCB7Rmxvd0FueUZ1bmN0aW9uLCBGbG93QW55T2JqZWN0LCBPYmplY3RNYXB9IGZyb20gJy4uL3ByaXZhdGVfdXRpbHMnO1xuaW1wb3J0IHtpbnZhcmlhbnR9IGZyb20gJy4uL2Vycm9yX3V0aWxzJztcbmltcG9ydCB7UmVjb3JkSWR9IGZyb20gJy4uL3R5cGVzL3JlY29yZCc7XG5pbXBvcnQge0dyb3VwRGF0YX0gZnJvbSAnLi4vdHlwZXMvdmlldyc7XG5pbXBvcnQge05vcm1hbGl6ZWRHcm91cExldmVsfSBmcm9tICcuLi90eXBlcy9haXJ0YWJsZV9pbnRlcmZhY2UnO1xuaW1wb3J0IFJlY29yZFF1ZXJ5UmVzdWx0LCB7XG4gICAgV2F0Y2hhYmxlUmVjb3JkUXVlcnlSZXN1bHRLZXksXG4gICAgTm9ybWFsaXplZFJlY29yZFF1ZXJ5UmVzdWx0T3B0cyxcbn0gZnJvbSAnLi9yZWNvcmRfcXVlcnlfcmVzdWx0JztcblxuaW1wb3J0IFRhYmxlIGZyb20gJy4vdGFibGUnO1xuaW1wb3J0IEZpZWxkIGZyb20gJy4vZmllbGQnO1xuaW1wb3J0IE9iamVjdFBvb2wgZnJvbSAnLi9vYmplY3RfcG9vbCc7XG5pbXBvcnQgVGFibGVPclZpZXdRdWVyeVJlc3VsdCBmcm9tICcuL3RhYmxlX29yX3ZpZXdfcXVlcnlfcmVzdWx0JztcblxuLyoqIEBoaWRkZW4gKi9cbi8vIEV2ZW4gdGhvdWdoIHdlIGRvbid0IGxvYWQgdGhlIGRhdGEsIHdlIHN0aWxsIGFjY2VzcyBpdCB0aHJvdWdoIGAuX2RhdGFgIHNvIHRoYXRcbi8vIHdlIGNhbiBiZSBlbnN1cmVkIHRoZSBtb2RlbCBoYXNuJ3QgYmVlbiBkZWxldGVkLlxuaW50ZXJmYWNlIEdyb3VwZWRSZWNvcmRRdWVyeVJlc3VsdERhdGEge1xuICAgIGdyb3VwRGF0YTogR3JvdXBEYXRhO1xuICAgIGdyb3VwTGV2ZWxzOiBSZWFkb25seUFycmF5PE5vcm1hbGl6ZWRHcm91cExldmVsPjtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgZ3JvdXAgb2YgcmVjb3JkcyByZXR1cm5lZCBmcm9tIGEgZ3JvdXAgcXVlcnkuIFNlZSB7QGxpbmsgUmVjb3JkUXVlcnlSZXN1bHR9IGZvciBtYWluXG4gKiBkb2N1bWVudGF0aW9uLlxuICpcbiAqIERvIG5vdCBpbnN0YW50aWF0ZS4gWW91IGNhbiBnZXQgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYnkgY2FsbGluZ1xuICogYHJlY29yZFF1ZXJ5UmVzdWx0Lmdyb3Vwc2AuXG4gKlxuICogQGRvY3NQYXRoIG1vZGVscy9xdWVyeSByZXN1bHRzL0dyb3VwZWRSZWNvcmRRdWVyeVJlc3VsdFxuICogQGhpZGRlblxuICovXG5jbGFzcyBHcm91cGVkUmVjb3JkUXVlcnlSZXN1bHQgZXh0ZW5kcyBSZWNvcmRRdWVyeVJlc3VsdDxHcm91cGVkUmVjb3JkUXVlcnlSZXN1bHREYXRhPiB7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHN0YXRpYyBfY2xhc3NOYW1lID0gJ0dyb3VwZWRSZWNvcmRRdWVyeVJlc3VsdCc7XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3BhcmVudFF1ZXJ5UmVzdWx0OiBUYWJsZU9yVmlld1F1ZXJ5UmVzdWx0IHwgR3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0O1xuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9ncm91cERhdGE6IEdyb3VwRGF0YTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgaW5jbHVkZXMgZ3JvdXBMZXZlbCBmb3IgYWxsIGNoaWxkcmVuICYgcGFyZW50IGdyb3VwZWQgbGF5ZXJzLCB0aGUgZ2V0dGVyXG4gICAgICogcmV0dXJucyBvbmx5IHRoZSBncm91cExldmVscyBmb3IgdGhpcyBsYXllci5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9ncm91cExldmVsczogUmVhZG9ubHlBcnJheTxOb3JtYWxpemVkR3JvdXBMZXZlbD47XG5cbiAgICAvLyBUaGlzIGlzIHRoZSBvcmRlcmVkIGxpc3Qgb2YgZ3JvdXBzLlxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfb3JkZXJlZENoaWxkcmVuR3JvdXBzOiBBcnJheTxHcm91cGVkUmVjb3JkUXVlcnlSZXN1bHQ+IHwgbnVsbDtcblxuICAgIC8vIGxhemlseSBnZW5lcmF0ZWQgc2V0IG9mIHJlY29yZCBpZHNcbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3JlY29yZElkc1NldDoge1trZXk6IHN0cmluZ106IHRydWUgfCB2b2lkfSB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gbGF6aWx5IGdlbmVyYXRlZCBvcmRlcmVkIGFycmF5IG9mIHJlY29yZElkc1xuICAgIF9vcmRlcmVkUmVjb3JkSWRzOiBSZWFkb25seUFycmF5PFJlY29yZElkPiB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9fZ3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0UG9vbDogT2JqZWN0UG9vbDxcbiAgICAgICAgR3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0LFxuICAgICAgICB0eXBlb2YgR3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0XG4gICAgPjtcblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcGFyZW50UXVlcnlSZXN1bHQ6IFRhYmxlT3JWaWV3UXVlcnlSZXN1bHQgfCBHcm91cGVkUmVjb3JkUXVlcnlSZXN1bHQsXG4gICAgICAgIGdyb3VwRGF0YTogR3JvdXBEYXRhLFxuICAgICAgICBncm91cExldmVsOiBSZWFkb25seUFycmF5PE5vcm1hbGl6ZWRHcm91cExldmVsPixcbiAgICAgICAgbm9ybWFsaXplZE9wdHM6IE5vcm1hbGl6ZWRSZWNvcmRRdWVyeVJlc3VsdE9wdHMsXG4gICAgICAgIHNkazogU2RrLFxuICAgICkge1xuICAgICAgICBzdXBlcihzZGssIG5vcm1hbGl6ZWRPcHRzKTtcblxuICAgICAgICB0aGlzLl9fZ3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0UG9vbCA9IG5ldyBPYmplY3RQb29sKEdyb3VwZWRSZWNvcmRRdWVyeVJlc3VsdCk7XG4gICAgICAgIHRoaXMuX3BhcmVudFF1ZXJ5UmVzdWx0ID0gcGFyZW50UXVlcnlSZXN1bHQ7XG4gICAgICAgIHRoaXMuX2dyb3VwRGF0YSA9IGdyb3VwRGF0YTtcbiAgICAgICAgdGhpcy5fZ3JvdXBMZXZlbHMgPSBncm91cExldmVsO1xuICAgICAgICBjb25zdCBncm91cExldmVsRGF0YVNsaWNlZEZvckNoaWxkcmVuID0gdGhpcy5fZ3JvdXBMZXZlbHMuc2xpY2UoMSk7XG4gICAgICAgIHRoaXMuX29yZGVyZWRDaGlsZHJlbkdyb3VwcyA9IGdyb3VwRGF0YS5ncm91cHNcbiAgICAgICAgICAgID8gZ3JvdXBEYXRhLmdyb3Vwcy5tYXAoc2luZ2xlR3JvdXBEYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5fX2dyb3VwZWRSZWNvcmRRdWVyeVJlc3VsdFBvb2wuZ2V0T2JqZWN0Rm9yUmV1c2UoXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVHcm91cERhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgZ3JvdXBMZXZlbERhdGFTbGljZWRGb3JDaGlsZHJlbixcbiAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkT3B0cyxcbiAgICAgICAgICAgICAgICAgICAgICBzZGssXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYXdhaXQgdGhlIGxvYWRpbmcsIGxldCBvdGhlcnMgY2hlY2sgaXNEYXRhTG9hZGVkLlxuICAgICAgICAgICAgICAgICAgLy8gKGl0IGRvZXNuJ3QgdGFrZSBhbnkgdGltZSBhbnl3YXkpLiBMb2FkaW5nIGFsc28gc3Ryb25nIHJldGFpbnMuXG4gICAgICAgICAgICAgICAgICBncm91cC5sb2FkRGF0YUFzeW5jKCk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXA7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBjaGlsZHJlbiBncm91cHMgb2YgdGhpcyBncm91cCAoaWYgYW55IGV4aXN0KVxuICAgICAqL1xuICAgIGdldCBncm91cHMoKTogQXJyYXk8R3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0PiB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3JkZXJlZENoaWxkcmVuR3JvdXBzO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBnZXQgZ3JvdXBMZXZlbCgpOiBOb3JtYWxpemVkR3JvdXBMZXZlbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLmdyb3VwTGV2ZWxzWzBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGZpZWxkSWQgdGhhdCB0aGlzIGdyb3VwIGlzIGdyb3VwZWQgYnlcbiAgICAgKi9cbiAgICBnZXQgZmllbGRJZCgpOiBGaWVsZElkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBMZXZlbC5maWVsZElkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGZpZWxkIHRoYXQgdGhpcyBncm91cCBpcyBncm91cGVkIGJ5XG4gICAgICovXG4gICAgZ2V0IGZpZWxkKCk6IEZpZWxkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50VGFibGUuZ2V0RmllbGRCeUlkKHRoaXMuZmllbGRJZCk7XG4gICAgfVxuXG4gICAgLy8gVE9ETyAoU2VhbktlZW5hbikgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBjYW4ndCBhbHdheXMgaXRlcmF0ZSBkb3duIGFuZCBmaW5kXG4gICAgLy8gYSByZWNvcmQsIGl0J3MgcG9zc2libGUgdG8gaGF2ZSBcImVtcHR5IGdyb3Vwc1wiLlxuICAgIC8vIGdldFZhbHVlKCkge1xuICAgIC8vIH1cblxuICAgIC8vIFRPRE8gKFNlYW5LZWVuYW4pXG4gICAgLy8gZ2V0VmFsdWVBc1N0cmluZygpIHtcbiAgICAvLyB9XG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWwgKHNpbmNlIHdlIG1heSBub3QgYmUgYWJsZSB0byByZXR1cm4gcGFyZW50IG1vZGVsIGluc3RhbmNlcyBpbiB0aGUgaW1tdXRhYmxlIG1vZGVscyB3b3JsZClcbiAgICAgKiBUaGUgdGFibGUgdGhhdCByZWNvcmRzIGluIHRoaXMgUmVjb3JkUXVlcnlSZXN1bHQgYXJlIHBhcnQgb2ZcbiAgICAgKi9cbiAgICBnZXQgcGFyZW50VGFibGUoKTogVGFibGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50UXVlcnlSZXN1bHQucGFyZW50VGFibGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjdXJzaXZlbHkgZ2V0cyBhbGwgcmVjb3JkSWRzIGluIHRoZSBjaGlsZHJlbiBncm91cHMsIGtlZXBpbmcgcmVjb3JkSWRzIGluIGdyb3VwIG9yZGVyXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfY29tcHV0ZVJlY29yZElkcygpOiBSZWFkb25seUFycmF5PFJlY29yZElkPiB7XG4gICAgICAgIC8vIElmIHdlIGFyZSBhIGxlYWYgbm9kZSwgcmV0dXJuIHRoZSByYXcgcmVjb3JkSWRzXG4gICAgICAgIGlmICghdGhpcy5ncm91cHMpIHtcbiAgICAgICAgICAgIC8vIFR5cGVzY3JpcHQgY2FuJ3QgaW5mZXIgaWYgZ3JvdXBzIGlzIGVtcHR5IHZpc2libGVSZWNvcmRJZHMgbXVzdCBiZSBwb3B1bGF0ZWRcbiAgICAgICAgICAgIC8vIGJ1dCB0aGUgZXh0cmEgc2FmZXR5IGlzbid0IGJhZC4gKGlzdGFuYnVsIGFsc28gY2FuJ3QgaWdub3JlIGp1c3QgdGhlID8/KVxuICAgICAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kYXRhLmdyb3VwRGF0YS52aXNpYmxlUmVjb3JkSWRzID8/IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlIGJ1aWxkIHRoZSByZWNvcmRJZCdzIGZyb20gY2hpbGRyZW4gZ3JvdXBzXG4gICAgICAgIGxldCByZWNvcmRJZHM6IEFycmF5PFJlY29yZElkPiA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHRoaXMuZ3JvdXBzKSB7XG4gICAgICAgICAgICByZWNvcmRJZHMucHVzaCguLi5ncm91cC5yZWNvcmRJZHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWNvcmRJZHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW55dGltZSB0aGUgcmVjb3JkSWRzIHRvIHJldHVybiBjb3VsZCBoYXZlIGNoYW5nZWQsIHdlIGNsZWFyIHRoaXMgc28gdGhhdFxuICAgICAqIHRoZSBuZXh0IHRpbWUgdGhlIHVzZXIgcmVxdWVzdHMgcmVjb3JkSWRzIGl0IHJlY29tcHV0ZXNcbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9pbnZhbGlkYXRlQ29tcHV0ZWRSZWNvcmRJZHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29yZGVyZWRSZWNvcmRJZHMgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9yZGVyZWQgYXJyYXkgb2YgYWxsIHRoZSByZWNvcmQgaWRzIGluc2lkZSB0aGlzIGdyb3VwLCBpbiBncm91cCBvcmRlci5cbiAgICAgKiBUaGlzIHJldHVybnMgYWxsIHJlY29yZElkcyBvZiBhbGwgY2hpbGRyZW4gZ3JvdXBzIChpbiBncm91cGVkIG9yZGVyKS5cbiAgICAgKiBXYXRjaGFibGUuXG4gICAgICovXG4gICAgZ2V0IHJlY29yZElkcygpOiBSZWFkb25seUFycmF5PFJlY29yZElkPiB7XG4gICAgICAgIGludmFyaWFudCh0aGlzLmlzRGF0YUxvYWRlZCwgJ0dyb3VwZWRSZWNvcmRRdWVyeVJlc3VsdCBkYXRhIGlzIG5vdCBsb2FkZWQnKTtcblxuICAgICAgICBpZiAodGhpcy5fb3JkZXJlZFJlY29yZElkcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fb3JkZXJlZFJlY29yZElkcyA9IHRoaXMuX2NvbXB1dGVSZWNvcmRJZHMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9vcmRlcmVkUmVjb3JkSWRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBmaWVsZHMgdGhhdCB3ZXJlIHVzZWQgdG8gY3JlYXRlIHRoZSBwYXJlbnQgUmVjb3JkUXVlcnlSZXN1bHQgdGhhdCBjcmVhdGVkIHRoaXMgR3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0LlxuICAgICAqIFRoaXMgaXMgc2VwYXJhdGUgZnJvbSB0aGUgZmllbGQvZmllbGRJZCBwcm9wZXJ0eSAtIHdoaWNoIGlzIHRoZSBmaWVsZCB0aGlzIGdyb3VwaW5nIGlzIGJhc2VkIHVwb24uXG4gICAgICogTnVsbCBpZiBmaWVsZHMgd2VyZSBub3Qgc3BlY2lmaWVkLCB3aGljaCBtZWFucyB0aGUgUmVjb3JkUXVlcnlSZXN1bHRcbiAgICAgKiB3aWxsIGxvYWQgYWxsIGZpZWxkcyBpbiB0aGUgdGFibGUuXG4gICAgICovXG4gICAgZ2V0IGZpZWxkcygpOiBBcnJheTxGaWVsZD4gfCBudWxsIHtcbiAgICAgICAgaW52YXJpYW50KHRoaXMuaXNEYXRhTG9hZGVkLCAnR3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0IGRhdGEgaXMgbm90IGxvYWRlZCcpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50UXVlcnlSZXN1bHQuZmllbGRzO1xuICAgIH1cblxuICAgIC8qKiBAaW5oZXJpdGRvYyAqL1xuICAgIHdhdGNoKFxuICAgICAgICBrZXlzOiBXYXRjaGFibGVSZWNvcmRRdWVyeVJlc3VsdEtleSB8IFJlYWRvbmx5QXJyYXk8V2F0Y2hhYmxlUmVjb3JkUXVlcnlSZXN1bHRLZXk+LFxuICAgICAgICBjYWxsYmFjazogRmxvd0FueUZ1bmN0aW9uLFxuICAgICAgICBjb250ZXh0PzogRmxvd0FueU9iamVjdCB8IG51bGwsXG4gICAgKTogQXJyYXk8V2F0Y2hhYmxlUmVjb3JkUXVlcnlSZXN1bHRLZXk+IHtcbiAgICAgICAgLy8gVE9ETyAoU2VhbktlZW5hbik6IFRoaXMgcHJvdmlkZXMgZXZlbnRzIGV2ZW4gaWYgdGhleSBvY2N1ciBvdXRzaWRlIG9mIHRoaXMgZ3JvdXBcbiAgICAgICAgLy8gVGhpcyBpcyBhbiBpc3N1ZSB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkIGJlZm9yZSB0aGlzIEFQSSBpcyBtYWRlIHB1YmxpY1xuICAgICAgICBjb25zdCB2YWxpZEtleXMgPSB0aGlzLl9wYXJlbnRRdWVyeVJlc3VsdC53YXRjaChrZXlzLCBjYWxsYmFjaywgY29udGV4dCk7XG4gICAgICAgIHJldHVybiB2YWxpZEtleXM7XG4gICAgfVxuXG4gICAgLyoqIEBpbmhlcml0ZG9jICovXG4gICAgdW53YXRjaChcbiAgICAgICAga2V5czogV2F0Y2hhYmxlUmVjb3JkUXVlcnlSZXN1bHRLZXkgfCBSZWFkb25seUFycmF5PFdhdGNoYWJsZVJlY29yZFF1ZXJ5UmVzdWx0S2V5PixcbiAgICAgICAgY2FsbGJhY2s6IEZsb3dBbnlGdW5jdGlvbixcbiAgICAgICAgY29udGV4dD86IEZsb3dBbnlPYmplY3QgfCBudWxsLFxuICAgICk6IEFycmF5PFdhdGNoYWJsZVJlY29yZFF1ZXJ5UmVzdWx0S2V5PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnRRdWVyeVJlc3VsdC51bndhdGNoKGtleXMsIGNhbGxiYWNrLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICAvKiogQGluaGVyaXRkb2MgKi9cbiAgICBhc3luYyBsb2FkRGF0YUFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCBzdXBlci5sb2FkRGF0YUFzeW5jKCk7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9nZXRDaGFuZ2VkS2V5c09uTG9hZCgpOiBBcnJheTxXYXRjaGFibGVSZWNvcmRRdWVyeVJlc3VsdEtleT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50UXVlcnlSZXN1bHQuX2dldENoYW5nZWRLZXlzT25Mb2FkKCk7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIGFzeW5jIF9sb2FkRGF0YUFzeW5jKCk6IFByb21pc2U8QXJyYXk8V2F0Y2hhYmxlUmVjb3JkUXVlcnlSZXN1bHRLZXk+PiB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgZW50aXJlIGNsYXNzIGFzc3VtZXMgaXQgaXMgdG9ybiBkb3duIGFuZCByZS1jcmVhdGVkIGJ5IHRoZSBwYXJlbnQgd2hlbmV2ZXJcbiAgICAgICAgLy8gYSBjaGFuZ2UgdG8gdGhlIGdyb3VwIGlzIG1hZGUuXG4gICAgICAgIHRoaXMuX3BhcmVudFF1ZXJ5UmVzdWx0Ll9fZ3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0UG9vbC5yZWdpc3Rlck9iamVjdEZvclJldXNlU3Ryb25nKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Q2hhbmdlZEtleXNPbkxvYWQoKTtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3VubG9hZERhdGEoKSB7XG4gICAgICAgIC8vIEludmFsaWRhdGUgYm90aCBvZiB0aGUgY2FjaGVzLCBhcyB0aGlzIG9iamVjdCBjYW4gbm8gbG9uZ2VyIGJlIGFjY2Vzc2VkXG4gICAgICAgIHRoaXMuX2ludmFsaWRhdGVDb21wdXRlZFJlY29yZElkcygpO1xuICAgICAgICB0aGlzLl9pbnZhbGlkYXRlUmVjb3JkSWRzU2V0KCk7XG5cbiAgICAgICAgdGhpcy5fdW5sb2FkQ2hpbGRyZW5Hcm91cHNJZk5lZWRlZCgpO1xuICAgICAgICB0aGlzLl9wYXJlbnRRdWVyeVJlc3VsdC5fX2dyb3VwZWRSZWNvcmRRdWVyeVJlc3VsdFBvb2wudW5yZWdpc3Rlck9iamVjdEZvclJldXNlU3Ryb25nKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBnZXQgX19wb29sS2V5KCkge1xuICAgICAgICAvLyBUT0RPIChTZWFuS2VlbmFuKSBXZSBkb24ndCBoYXZlIGFuIGFjdHVhbCBncm91cElkLCBidXQgd2hpbGUgaWQgaXMgdW5pcXVlOyB0aGlzIHNob3VsZCBoYXZlIGlkIHJlbW92ZWRcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuX3NlcmlhbGl6ZWRPcHRzfTo6JHt0aGlzLmlkfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtb2RlbCBkb2Vzbid0IGFjdHVhbGx5IGxvYWQgZGF0YSwgYnV0IGl0IGRvZXMgdXNlIHRoZSBgX2RhdGFgXG4gICAgICogcHJvcGVydHkgc28gdGhhdCBjaGVja3MgZm9yIG1vZGVsIGRlbGV0aW9uIGJlaGF2ZSBhcHByb3ByaWF0ZWx5LlxuICAgICAqXG4gICAgICogVGhpcyBpcyBjb25zaWRlcmVkIGRlbGV0ZWQgaWYgdGhlIHBhcmVudCBxdWVyeSByZXN1bHQgaGFzIGJlZW4gZGVsZXRlZC5cbiAgICAgKlxuICAgICAqIFdlIHJldHVybiBncm91cERhdGEsIGluc3RlYWQgb2YgcHJlY29tcHV0aW5nIGFsbCBjaGlsZHJlbiBncm91cHMgYmVjYXVzZVxuICAgICAqIHdlIHBlcmZvcm0gdGhlIGNvbXB1dGF0aW9uK2NhY2hpbmcgbGF6aWx5IG9uIHJlcXVlc3RcbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldCBfZGF0YU9yTnVsbElmRGVsZXRlZCgpOiBHcm91cGVkUmVjb3JkUXVlcnlSZXN1bHREYXRhIHwgbnVsbCB7XG4gICAgICAgIGlmICh0aGlzLl9wYXJlbnRRdWVyeVJlc3VsdC5fZGF0YU9yTnVsbElmRGVsZXRlZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGdyb3VwRGF0YTogdGhpcy5fZ3JvdXBEYXRhLFxuICAgICAgICAgICAgZ3JvdXBMZXZlbHM6IHRoaXMuX2dyb3VwTGV2ZWxzLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKiBAaW5oZXJpdGRvYyAqL1xuICAgIGdldCBpc0RhdGFMb2FkZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnRRdWVyeVJlc3VsdC5pc0RhdGFMb2FkZWQ7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF91bmxvYWRDaGlsZHJlbkdyb3Vwc0lmTmVlZGVkKCkge1xuICAgICAgICBpZiAodGhpcy5fb3JkZXJlZENoaWxkcmVuR3JvdXBzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHRoaXMuX29yZGVyZWRDaGlsZHJlbkdyb3Vwcykge1xuICAgICAgICAgICAgICAgIGdyb3VwLnVubG9hZERhdGEoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfaW52YWxpZGF0ZVJlY29yZElkc1NldCgpIHtcbiAgICAgICAgdGhpcy5fcmVjb3JkSWRzU2V0ID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2dldE9yR2VuZXJhdGVSZWNvcmRJZHNTZXQoKSB7XG4gICAgICAgIC8vIFRPRE8gKFNlYW5LZWVuYW4pOiB0aGlzIGxvZ2ljIGlzIGR1cGxpY2F0ZWQgaW4gdGFibGVPclZpZXdRdWVyeVJlc3VsdFxuICAgICAgICBpZiAoIXRoaXMuX3JlY29yZElkc1NldCkge1xuICAgICAgICAgICAgY29uc3QgcmVjb3JkSWRzU2V0OiBPYmplY3RNYXA8UmVjb3JkSWQsIHRydWU+ID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlY29yZElkIG9mIHRoaXMucmVjb3JkSWRzKSB7XG4gICAgICAgICAgICAgICAgcmVjb3JkSWRzU2V0W3JlY29yZElkXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9yZWNvcmRJZHNTZXQgPSByZWNvcmRJZHNTZXQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fcmVjb3JkSWRzU2V0O1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgR3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0O1xuIl19
@@ -29,6 +29,8 @@ Object.defineProperty(exports, "__esModule", {
29
29
  });
30
30
  exports.default = exports.getLinkedTableId = void 0;
31
31
 
32
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
33
+
32
34
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
33
35
 
34
36
  require("regenerator-runtime/runtime");
@@ -53,8 +55,12 @@ var _field = require("../types/field");
53
55
 
54
56
  var _error_utils = require("../error_utils");
55
57
 
58
+ var _block_query_spec = require("../types/block_query_spec");
59
+
56
60
  var _record_query_result = _interopRequireDefault(require("./record_query_result"));
57
61
 
62
+ var _record_store = require("./record_store");
63
+
58
64
  /** @module @airtable/blocks/models: RecordQueryResult */
59
65
 
60
66
  /** */
@@ -118,6 +124,8 @@ function (_RecordQueryResult) {
118
124
 
119
125
  /** @internal */
120
126
 
127
+ /** @internal */
128
+
121
129
  /** @internal */
122
130
  function LinkedRecordsQueryResult(record, field, normalizedOpts, sdk) {
123
131
  var _this;
@@ -134,6 +142,7 @@ function (_RecordQueryResult) {
134
142
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "_computedRecordIdsSet", null);
135
143
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "_computedFilteredSortedRecordIds", null);
136
144
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "_cellValueChangeHandlerByFieldId", {});
145
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "_recordStoreQueryId", null);
137
146
  (0, _error_utils.invariant)(record.parentTable === field.parentTable, 'record and field must belong to the same table');
138
147
  _this._record = record;
139
148
  _this._field = field;
@@ -279,7 +288,7 @@ function (_RecordQueryResult) {
279
288
  }, {
280
289
  key: "_loadDataAsync",
281
290
  value: function _loadDataAsync() {
282
- var initiallyLoaded, changedKeys, fieldIds, _iteratorNormalCompletion3, _didIteratorError3, _iteratorError3, _iterator3, _step3, fieldId;
291
+ var initiallyLoaded, _ref, _ref2, recordStoreQueryId, changedKeys, fieldIds, _iteratorNormalCompletion3, _didIteratorError3, _iteratorError3, _iterator3, _step3, fieldId;
283
292
 
284
293
  return _regenerator.default.async(function _loadDataAsync$(_context2) {
285
294
  while (1) {
@@ -291,11 +300,21 @@ function (_RecordQueryResult) {
291
300
 
292
301
  this._watchLinkedQueryResult();
293
302
 
294
- initiallyLoaded = this._linkedQueryResult.isDataLoaded;
303
+ initiallyLoaded = this._linkedQueryResult.isDataLoaded; // https://airtable.com/appahuJQw7qfQTBBU/tblSbpimM8Spp9txp/viweAFIus3MhU9Gxa/recNjFYJpeV23LPhH?blocks=hide
304
+ // TODO: (#proj-blocks-sdk-record-limits) Currently queries all cell values in a table
305
+ // when loading linked record data. Must add a LinkedRecord query type in the future.
306
+ // Since _loadDataAsync can only be called once, this recordStoreQueryId is only set once,
307
+ // although it is guaranteed to be stable if needed (so long as this._field.id is stable)
308
+
295
309
  _context2.next = 6;
296
- return _regenerator.default.awrap(Promise.all([this._sdk.base.__getRecordStore(this._record.parentTable.id).loadCellValuesInFieldIdsAsync([this._field.id]), this._linkedQueryResult.loadDataAsync(), this._loadRecordColorsAsync()]));
310
+ return _regenerator.default.awrap(Promise.all([this._sdk.base.__getRecordStore(this._record.parentTable.id).loadAllCellValuesInFieldIdsAsync([this._field.id]), this._linkedQueryResult.loadDataAsync(), this._loadRecordColorsAsync()]));
297
311
 
298
312
  case 6:
313
+ _ref = _context2.sent;
314
+ _ref2 = (0, _slicedToArray2.default)(_ref, 1);
315
+ recordStoreQueryId = _ref2[0];
316
+ this._recordStoreQueryId = recordStoreQueryId;
317
+
299
318
  this._invalidateComputedData();
300
319
 
301
320
  changedKeys = ['records', 'recordIds', 'recordColors']; // If the linked query result was not initially loaded, then the
@@ -311,55 +330,55 @@ function (_RecordQueryResult) {
311
330
  _iteratorNormalCompletion3 = true;
312
331
  _didIteratorError3 = false;
313
332
  _iteratorError3 = undefined;
314
- _context2.prev = 13;
333
+ _context2.prev = 17;
315
334
 
316
335
  for (_iterator3 = fieldIds[Symbol.iterator](); !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
317
336
  fieldId = _step3.value;
318
337
  changedKeys.push(_record_query_result.default.WatchableCellValuesInFieldKeyPrefix + fieldId);
319
338
  }
320
339
 
321
- _context2.next = 21;
340
+ _context2.next = 25;
322
341
  break;
323
342
 
324
- case 17:
325
- _context2.prev = 17;
326
- _context2.t0 = _context2["catch"](13);
343
+ case 21:
344
+ _context2.prev = 21;
345
+ _context2.t0 = _context2["catch"](17);
327
346
  _didIteratorError3 = true;
328
347
  _iteratorError3 = _context2.t0;
329
348
 
330
- case 21:
331
- _context2.prev = 21;
332
- _context2.prev = 22;
349
+ case 25:
350
+ _context2.prev = 25;
351
+ _context2.prev = 26;
333
352
 
334
353
  if (!_iteratorNormalCompletion3 && _iterator3.return != null) {
335
354
  _iterator3.return();
336
355
  }
337
356
 
338
- case 24:
339
- _context2.prev = 24;
357
+ case 28:
358
+ _context2.prev = 28;
340
359
 
341
360
  if (!_didIteratorError3) {
342
- _context2.next = 27;
361
+ _context2.next = 31;
343
362
  break;
344
363
  }
345
364
 
346
365
  throw _iteratorError3;
347
366
 
348
- case 27:
349
- return _context2.finish(24);
367
+ case 31:
368
+ return _context2.finish(28);
350
369
 
351
- case 28:
352
- return _context2.finish(21);
370
+ case 32:
371
+ return _context2.finish(25);
353
372
 
354
- case 29:
373
+ case 33:
355
374
  return _context2.abrupt("return", changedKeys);
356
375
 
357
- case 30:
376
+ case 34:
358
377
  case "end":
359
378
  return _context2.stop();
360
379
  }
361
380
  }
362
- }, null, this, [[13, 17, 21, 29], [22,, 24, 28]]);
381
+ }, null, this, [[17, 21, 25, 33], [26,, 28, 32]]);
363
382
  }
364
383
  /** @internal */
365
384
 
@@ -376,7 +395,9 @@ function (_RecordQueryResult) {
376
395
 
377
396
  this._unwatchLinkedQueryResult();
378
397
 
379
- this._sdk.base.__getRecordStore(this._record.parentTable.id).unloadCellValuesInFieldIds([this._field.id]);
398
+ (0, _error_utils.invariant)(this._recordStoreQueryId, 'Unsubscribing from linked record record store without queryId');
399
+
400
+ this._originRecordStore.unloadCellValuesForQueryIdsThatAreSubscribedToAllCells([this._recordStoreQueryId]);
380
401
 
381
402
  this._linkedQueryResult.unloadData();
382
403
 
@@ -448,7 +469,12 @@ function (_RecordQueryResult) {
448
469
  // result
449
470
 
450
471
 
451
- this._originRecordStore.watch('recordIds', this._onOriginRecordsChange, this); // if the linked field in the origin table is deleted, we need to
472
+ this._originRecordStore.watchWithRecordQueryResult({
473
+ recordQueryResult: this,
474
+ keys: _record_store.WatchableRecordStoreKeys.recordIds,
475
+ callbackForRegistration: this._onOriginRecordsChange,
476
+ context: this
477
+ }); // if the linked field in the origin table is deleted, we need to
452
478
  // invalidate this result
453
479
 
454
480
 
@@ -592,11 +618,12 @@ function (_RecordQueryResult) {
592
618
  if (Array.isArray(recordIds)) {
593
619
  var recordIdsSet = this._getOrGenerateRecordIdsSet();
594
620
 
595
- var filteredRecordIds = recordIds.filter(id => typeof id === 'string' && recordIdsSet[id] === true);
621
+ var filteredRecordIds = recordIds.filter(id => typeof id === 'string' && recordIdsSet[id] === true); // There should always be a filteredRecordIds found for this query
622
+ // type - not finding any is a fundamental mistake in our query engine
596
623
 
597
- if (filteredRecordIds.length) {
598
- this._onChange(_record_query_result.default.WatchableCellValuesInFieldKeyPrefix + fieldId, filteredRecordIds);
599
- }
624
+ (0, _error_utils.invariant)(filteredRecordIds.length, 'Filtered record change on incorrect record, query engine issue');
625
+
626
+ this._onChange(_record_query_result.default.WatchableCellValuesInFieldKeyPrefix + fieldId, filteredRecordIds);
600
627
  } else {
601
628
  this._onChange(_record_query_result.default.WatchableCellValuesInFieldKeyPrefix + fieldId);
602
629
  }
@@ -776,6 +803,27 @@ function (_RecordQueryResult) {
776
803
  (0, _error_utils.invariant)(recordIdsSet, 'recordIdsSet must exist');
777
804
  return recordIdsSet;
778
805
  }
806
+ /**
807
+ * This allows a record query result to specify the source of the query
808
+ * eg: View, Table, Linked record when watching fields.
809
+ * This scopes the watch to those fields + rows in the query.
810
+ *
811
+ * @internal
812
+ */
813
+
814
+ }, {
815
+ key: "__constructQuerySpecForBlockFieldSelectionSpec",
816
+ value: function __constructQuerySpecForBlockFieldSelectionSpec(fieldSelection) {
817
+ // The origin tableId is always the one referred to here as we must watch the origin record for deletion
818
+ var originTableId = this._record.parentTable.id;
819
+ return {
820
+ sourceType: _block_query_spec.BlockQuerySourceType.TABLE,
821
+ sourceTableId: originTableId,
822
+ recordSelection: {
823
+ fieldSelection
824
+ }
825
+ };
826
+ }
779
827
  }, {
780
828
  key: "isValid",
781
829
  get: function get() {
@@ -894,4 +942,5 @@ function (_RecordQueryResult) {
894
942
 
895
943
  (0, _defineProperty2.default)(LinkedRecordsQueryResult, "_className", 'LinkedRecordsQueryResult');
896
944
  var _default = LinkedRecordsQueryResult;
897
- exports.default = _default;
945
+ exports.default = _default;
946
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbHMvbGlua2VkX3JlY29yZHNfcXVlcnlfcmVzdWx0LnRzIl0sIm5hbWVzIjpbImdldExpbmtlZFRhYmxlSWQiLCJmaWVsZCIsIm9wdGlvbnMiLCJsaW5rZWRUYWJsZUlkIiwiTGlua2VkUmVjb3Jkc1F1ZXJ5UmVzdWx0IiwicmVjb3JkIiwibm9ybWFsaXplZE9wdHMiLCJzZGsiLCJwYXJlbnRUYWJsZSIsIl9yZWNvcmQiLCJfZmllbGQiLCJfbGlua2VkVGFibGUiLCJ0YWJsZSIsIl9vcmlnaW5SZWNvcmRTdG9yZSIsIl9zZGsiLCJiYXNlIiwiX19nZXRSZWNvcmRTdG9yZSIsImlkIiwiX2xpbmtlZFJlY29yZFN0b3JlIiwicmVjb3JkU3RvcmUiLCJfbGlua2VkUXVlcnlSZXN1bHQiLCJfX3RhYmxlT3JWaWV3UXVlcnlSZXN1bHRQb29sIiwiZ2V0T2JqZWN0Rm9yUmV1c2UiLCJrZXlzIiwiY2FsbGJhY2siLCJjb250ZXh0IiwiaXNWYWxpZCIsInZhbGlkS2V5cyIsImtleSIsIlJlY29yZFF1ZXJ5UmVzdWx0IiwiV2F0Y2hhYmxlS2V5cyIsImNlbGxWYWx1ZXMiLCJfd2F0Y2hMaW5rZWRRdWVyeUNlbGxWYWx1ZXNJZk5lZWRlZEFmdGVyV2F0Y2giLCJzdGFydHNXaXRoIiwiV2F0Y2hhYmxlQ2VsbFZhbHVlc0luRmllbGRLZXlQcmVmaXgiLCJmaWVsZElkIiwic3Vic3RyaW5nIiwibGVuZ3RoIiwiX3dhdGNoTGlua2VkUXVlcnlDZWxsVmFsdWVzSW5GaWVsZElmTmVlZGVkQWZ0ZXJXYXRjaCIsImFycmF5S2V5cyIsIkFycmF5IiwiaXNBcnJheSIsIl91bndhdGNoTGlua2VkUXVlcnlDZWxsVmFsdWVzSWZQb3NzaWJsZUJlZm9yZVVud2F0Y2giLCJfdW53YXRjaExpbmtlZFF1ZXJ5Q2VsbFZhbHVlc0luRmllbGRJZlBvc3NpYmxlQmVmb3JlVW53YXRjaCIsImlzRGF0YUxvYWRlZCIsImxvYWREYXRhQXN5bmMiLCJ1bmxvYWREYXRhIiwiX19saW5rZWRSZWNvcmRzUXVlcnlSZXN1bHRQb29sIiwicmVnaXN0ZXJPYmplY3RGb3JSZXVzZVN0cm9uZyIsIl93YXRjaE9yaWdpbiIsIl93YXRjaExpbmtlZFF1ZXJ5UmVzdWx0IiwiaW5pdGlhbGx5TG9hZGVkIiwiUHJvbWlzZSIsImFsbCIsImxvYWRBbGxDZWxsVmFsdWVzSW5GaWVsZElkc0FzeW5jIiwiX2xvYWRSZWNvcmRDb2xvcnNBc3luYyIsInJlY29yZFN0b3JlUXVlcnlJZCIsIl9yZWNvcmRTdG9yZVF1ZXJ5SWQiLCJfaW52YWxpZGF0ZUNvbXB1dGVkRGF0YSIsImNoYW5nZWRLZXlzIiwicHVzaCIsImZpZWxkSWRzIiwiX25vcm1hbGl6ZWRPcHRzIiwiZmllbGRJZHNPck51bGxJZkFsbEZpZWxkcyIsImZpZWxkcyIsIm1hcCIsInVucmVnaXN0ZXJPYmplY3RGb3JSZXVzZVN0cm9uZyIsIl91bndhdGNoT3JpZ2luIiwiX3Vud2F0Y2hMaW5rZWRRdWVyeVJlc3VsdCIsInVubG9hZENlbGxWYWx1ZXNGb3JRdWVyeUlkc1RoYXRBcmVTdWJzY3JpYmVkVG9BbGxDZWxscyIsIl91bmxvYWRSZWNvcmRDb2xvcnMiLCJfY2VsbFZhbHVlc1dhdGNoQ291bnQiLCJfd2F0Y2hMaW5rZWRRdWVyeUNlbGxWYWx1ZXMiLCJfdW53YXRjaExpbmtlZFF1ZXJ5Q2VsbFZhbHVlcyIsIl9jZWxsVmFsdWVXYXRjaENvdW50QnlGaWVsZElkIiwiX3dhdGNoTGlua2VkUXVlcnlDZWxsVmFsdWVzSW5GaWVsZCIsIl91bndhdGNoTGlua2VkUXVlcnlDZWxsVmFsdWVzSW5GaWVsZCIsIndhdGNoIiwiX29uT3JpZ2luQ2VsbFZhbHVlQ2hhbmdlIiwiX29uT3JpZ2luRmllbGRDb25maWdDaGFuZ2UiLCJ3YXRjaFdpdGhSZWNvcmRRdWVyeVJlc3VsdCIsInJlY29yZFF1ZXJ5UmVzdWx0IiwiV2F0Y2hhYmxlUmVjb3JkU3RvcmVLZXlzIiwicmVjb3JkSWRzIiwiY2FsbGJhY2tGb3JSZWdpc3RyYXRpb24iLCJfb25PcmlnaW5SZWNvcmRzQ2hhbmdlIiwiX29uT3JpZ2luRmllbGRzQ2hhbmdlIiwidW53YXRjaCIsIl9vbkxpbmtlZFJlY29yZElkc0NoYW5nZSIsIl9vbkxpbmtlZENlbGxWYWx1ZXNDaGFuZ2UiLCJfZ2V0T25MaW5rZWRDZWxsVmFsdWVzSW5GaWVsZENoYW5nZSIsIl9vbkNoYW5nZSIsInF1ZXJ5UmVzdWx0IiwiY2hhbmdlcyIsInJlY29yZElkc1NldCIsIl9nZXRPckdlbmVyYXRlUmVjb3JkSWRzU2V0IiwiZmlsdGVyIiwiX2NlbGxWYWx1ZUNoYW5nZUhhbmRsZXJCeUZpZWxkSWQiLCJmaWx0ZXJlZFJlY29yZElkcyIsImlzRGVsZXRlZCIsIl9pc1ZhbGlkIiwidHlwZSIsIkZpZWxkVHlwZSIsIk1VTFRJUExFX1JFQ09SRF9MSU5LUyIsIl9pbnZhbGlkYXRlUXVlcnlSZXN1bHQiLCJfdW5sb2FkRGF0YSIsIk9iamVjdCIsIl9jb21wdXRlZFJlY29yZElkc1NldCIsIl9jb21wdXRlZEZpbHRlcmVkU29ydGVkUmVjb3JkSWRzIiwiX2dlbmVyYXRlQ29tcHV0ZWREYXRhIiwicmF3Q2VsbFZhbHVlIiwiZ2V0Q2VsbFZhbHVlIiwiY2VsbFZhbHVlIiwibGlua2VkUmVjb3JkIiwicmVjb3JkSWQiLCJoYXNSZWNvcmQiLCJzb3J0cyIsIl9nZW5lcmF0ZUNvbXB1dGVkRGF0YUlmTmVlZGVkIiwiZmllbGRTZWxlY3Rpb24iLCJvcmlnaW5UYWJsZUlkIiwic291cmNlVHlwZSIsIkJsb2NrUXVlcnlTb3VyY2VUeXBlIiwiVEFCTEUiLCJzb3VyY2VUYWJsZUlkIiwicmVjb3JkU2VsZWN0aW9uIiwiZ2V0UmVjb3JkQnlJZElmRXhpc3RzIiwiX3NlcmlhbGl6ZWRPcHRzIiwiX2NoYW5nZVdhdGNoZXJzQnlLZXkiLCJjb3VudEJ5RmllbGRJZCIsIndhdGNoS2V5cyIsIndhdGNoS2V5Iiwic2xpY2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0E7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Q0MsVUFBMUQsS0FBeUUsRUFBMUUsRUFBOEVNLE1BQXJGO0FBQ0g7Ozt3QkFpQnNFO0FBQ25FLFVBQU0yRixjQUEwQyxHQUFHLEVBQW5EO0FBQ0EsVUFBTUMsU0FBUyxHQUFHdkIsTUFBTSxDQUFDbkYsSUFBUCxDQUFZLEtBQUt3RyxvQkFBakIsRUFBdUMvQixNQUF2QyxDQUE4Q3BFLEdBQUcsSUFBSTtBQUNuRSxlQUFPQSxHQUFHLENBQUNLLFVBQUosQ0FBZUosNkJBQWtCSyxtQ0FBakMsQ0FBUDtBQUNILE9BRmlCLENBQWxCO0FBRm1FO0FBQUE7QUFBQTs7QUFBQTtBQUtuRSw4QkFBdUIrRixTQUF2QixtSUFBa0M7QUFBQSxjQUF2QkMsUUFBdUI7QUFDOUIsY0FBTS9GLE9BQU8sR0FBRytGLFFBQVEsQ0FBQ0MsS0FBVCxDQUNadEcsNkJBQWtCSyxtQ0FBbEIsQ0FBc0RHLE1BRDFDLENBQWhCO0FBR0EyRixVQUFBQSxjQUFjLENBQUM3RixPQUFELENBQWQsR0FBMEIsS0FBSzRGLG9CQUFMLENBQTBCRyxRQUExQixFQUFvQzdGLE1BQTlEO0FBQ0g7QUFWa0U7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFZbkUsYUFBTzJGLGNBQVA7QUFDSDs7O3dCQThIK0Q7QUFDNUQsVUFBSSxLQUFLdkgsT0FBTCxDQUFhMEYsU0FBYixJQUEwQixLQUFLakYsa0JBQUwsQ0FBd0JpRixTQUF0RCxFQUFpRTtBQUM3RCxlQUFPLElBQVA7QUFDSDs7QUFFRCxhQUFPLEVBQVA7QUFDSDs7O0VBN2JrQ3RFLDRCOzs4QkFBakN6Qix3QixnQkFFa0IsMEI7ZUEycEJUQSx3QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBhaXJ0YWJsZS9ibG9ja3MvbW9kZWxzOiBSZWNvcmRRdWVyeVJlc3VsdCAqLyAvKiogKi9cbmltcG9ydCB7RmllbGRUeXBlLCBGaWVsZElkfSBmcm9tICcuLi90eXBlcy9maWVsZCc7XG5pbXBvcnQgU2RrIGZyb20gJy4uL3Nkayc7XG5pbXBvcnQge0Zsb3dBbnlGdW5jdGlvbiwgRmxvd0FueU9iamVjdCwgT2JqZWN0TWFwfSBmcm9tICcuLi9wcml2YXRlX3V0aWxzJztcbmltcG9ydCB7aW52YXJpYW50fSBmcm9tICcuLi9lcnJvcl91dGlscyc7XG5pbXBvcnQge1JlY29yZElkfSBmcm9tICcuLi90eXBlcy9yZWNvcmQnO1xuaW1wb3J0IHtcbiAgICBCbG9ja1F1ZXJ5SWQsXG4gICAgQmxvY2tRdWVyeVNwZWMsXG4gICAgQmxvY2tRdWVyeVNvdXJjZVR5cGUsXG4gICAgQmxvY2tGaWVsZFNlbGVjdGlvblNwZWMsXG59IGZyb20gJy4uL3R5cGVzL2Jsb2NrX3F1ZXJ5X3NwZWMnO1xuaW1wb3J0IFJlY29yZFF1ZXJ5UmVzdWx0LCB7XG4gICAgV2F0Y2hhYmxlUmVjb3JkUXVlcnlSZXN1bHRLZXksXG4gICAgTm9ybWFsaXplZFJlY29yZFF1ZXJ5UmVzdWx0T3B0cyxcbn0gZnJvbSAnLi9yZWNvcmRfcXVlcnlfcmVzdWx0JztcbmltcG9ydCBUYWJsZU9yVmlld1F1ZXJ5UmVzdWx0IGZyb20gJy4vdGFibGVfb3Jfdmlld19xdWVyeV9yZXN1bHQnO1xuXG5pbXBvcnQgVGFibGUgZnJvbSAnLi90YWJsZSc7XG5pbXBvcnQgRmllbGQgZnJvbSAnLi9maWVsZCc7XG5pbXBvcnQgUmVjb3JkIGZyb20gJy4vcmVjb3JkJztcbmltcG9ydCBSZWNvcmRTdG9yZSwge1dhdGNoYWJsZVJlY29yZFN0b3JlS2V5c30gZnJvbSAnLi9yZWNvcmRfc3RvcmUnO1xuXG5leHBvcnQgY29uc3QgZ2V0TGlua2VkVGFibGVJZCA9IChmaWVsZDogRmllbGQpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBmaWVsZC5vcHRpb25zO1xuICAgIGNvbnN0IGxpbmtlZFRhYmxlSWQgPSBvcHRpb25zICYmIG9wdGlvbnMubGlua2VkVGFibGVJZDtcbiAgICBpbnZhcmlhbnQodHlwZW9mIGxpbmtlZFRhYmxlSWQgPT09ICdzdHJpbmcnLCAnbGlua2VkVGFibGVJZCBtdXN0IGV4aXN0Jyk7XG5cbiAgICByZXR1cm4gbGlua2VkVGFibGVJZDtcbn07XG5cbi8qKiBpbnRlcm5hbCAqL1xuaW50ZXJmYWNlIExpbmtlZFJlY29yZHNRdWVyeVJlc3VsdERhdGEge31cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgc2V0IG9mIHJlY29yZHMgZnJvbSBhIExpbmtlZFJlY29yZCBjZWxsIHZhbHVlLiBTZWUge0BsaW5rIFJlY29yZFF1ZXJ5UmVzdWx0fSBmb3IgbWFpblxuICogZG9jdW1lbnRhdGlvbi5cbiAqXG4gKiBEbyBub3QgaW5zdGFudGlhdGUuIFlvdSBjYW4gZ2V0IGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGJ5IGNhbGxpbmdcbiAqIGByZWNvcmQuc2VsZWN0TGlua2VkUmVjb3Jkc0Zyb21DZWxsYC5cbiAqXG4gKiBAZG9jc1BhdGggbW9kZWxzL3F1ZXJ5IHJlc3VsdHMvTGlua2VkUmVjb3Jkc1F1ZXJ5UmVzdWx0XG4gKi9cbmNsYXNzIExpbmtlZFJlY29yZHNRdWVyeVJlc3VsdCBleHRlbmRzIFJlY29yZFF1ZXJ5UmVzdWx0PExpbmtlZFJlY29yZHNRdWVyeVJlc3VsdERhdGE+IHtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgc3RhdGljIF9jbGFzc05hbWUgPSAnTGlua2VkUmVjb3Jkc1F1ZXJ5UmVzdWx0JztcblxuICAgIC8vIHRoZSByZWNvcmQgY29udGFpbmluZyB0aGUgbGlua2VkLXJlY29yZCBjZWxsIHRoaXMgaXMgYSBxdWVyeSBvZi5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3JlY29yZDogUmVjb3JkO1xuICAgIC8vIHRoZSBjZWxsJ3MgZmllbGQgaW4gdGhlIHJlY29yZFxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfZmllbGQ6IEZpZWxkO1xuICAgIC8vIHRoZSB0YWJsZSB3ZSdyZSBsaW5raW5nIHRvXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9saW5rZWRUYWJsZTogVGFibGU7XG4gICAgLy8gdGhlIHJlY29yZHMgc3RvcmUgZm9yIHRoZSBvcmlnaW4gdGFibGVcbiAgICAvKiogQGludGVybmFsICovXG4gICAgX29yaWdpblJlY29yZFN0b3JlOiBSZWNvcmRTdG9yZTtcbiAgICAvLyB0aGUgcmVjb3JkcyBzdG9yZSBmb3IgdGhlIGxpbmtlZCB0YWJsZVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfbGlua2VkUmVjb3JkU3RvcmU6IFJlY29yZFN0b3JlO1xuICAgIC8vIGEgUmVjb3JkUXVlcnlSZXN1bHQgY29udGFpbmluZyBhbGwgdGhlIHJvd3MgaW4gdGhlIGxpbmtlZCB0YWJsZVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfbGlua2VkUXVlcnlSZXN1bHQ6IFRhYmxlT3JWaWV3UXVlcnlSZXN1bHQ7XG4gICAgLy8gaXMgdGhlIHF1ZXJ5IHJlc3VsdCBjdXJyZW50bHkgdmFsaWQuIGlmIHRoZSBmaWVsZCBjb25maWcgY2hhbmdlcyB0byBsaW5rXG4gICAgLy8gdG8gYW5vdGhlciB0YWJsZSBvciBub3QgYmUgYSBsaW5rZWQgcmVjb3JkIGZpZWxkIGF0IGFsbCwgaXNWYWxpZCB3aWxsXG4gICAgLy8gYmVjb21lIGZhbHNlLiBvbmNlIGEgTGlua2VkUmVjb3Jkc1F1ZXJ5UmVzdWx0IGhhcyBiZWNvbWUgaW52YWxpZCwgaXQgd2lsbFxuICAgIC8vIG5vdCBiZWNvbWUgdmFsaWQgYWdhaW4uXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9pc1ZhbGlkOiBib29sZWFuID0gdHJ1ZTtcbiAgICAvLyBhIGxhemlseS1nZW5lcmF0ZWQgc2V0IG9mIHRoZSByZWNvcmQgaWRzIGluIHRoZSByZXN1bHQgc2V0LlxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfY29tcHV0ZWRSZWNvcmRJZHNTZXQ6IHtba2V5OiBzdHJpbmddOiB0cnVlIHwgdm9pZH0gfCBudWxsID0gbnVsbDtcbiAgICAvLyBhIGxhemlseS1nZW5lcmF0ZWQgYXJyYXkgb2YgdGhlIHJlY29yZCBpZHMgaW4gdGhlIHF1ZXJ5IHJlc3VsdC5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2NvbXB1dGVkRmlsdGVyZWRTb3J0ZWRSZWNvcmRJZHM6IEFycmF5PHN0cmluZz4gfCBudWxsID0gbnVsbDtcbiAgICAvLyBob3cgbWFueSB0aW1lcyBoYXMgZWFjaCAnY2VsbFZhbHVlc0luRmllbGQ6JEZpZWxkSWQnIGJlZW4gd2F0Y2hlZD9cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2NlbGxWYWx1ZUNoYW5nZUhhbmRsZXJCeUZpZWxkSWQ6IHtcbiAgICAgICAgW2tleTogc3RyaW5nXTogKFxuICAgICAgICAgICAgYXJnMTogVGFibGVPclZpZXdRdWVyeVJlc3VsdCxcbiAgICAgICAgICAgIGtleTogc3RyaW5nLFxuICAgICAgICAgICAgcmVjb3JkSWRzOiBBcnJheTxSZWNvcmRJZD4gfCB2b2lkLFxuICAgICAgICApID0+IHZvaWQ7XG4gICAgfSA9IHt9O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfcmVjb3JkU3RvcmVRdWVyeUlkOiBCbG9ja1F1ZXJ5SWQgfCBudWxsID0gbnVsbDtcblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcmVjb3JkOiBSZWNvcmQsXG4gICAgICAgIGZpZWxkOiBGaWVsZCxcbiAgICAgICAgbm9ybWFsaXplZE9wdHM6IE5vcm1hbGl6ZWRSZWNvcmRRdWVyeVJlc3VsdE9wdHMsXG4gICAgICAgIHNkazogU2RrLFxuICAgICkge1xuICAgICAgICBzdXBlcihzZGssIG5vcm1hbGl6ZWRPcHRzKTtcblxuICAgICAgICBpbnZhcmlhbnQoXG4gICAgICAgICAgICByZWNvcmQucGFyZW50VGFibGUgPT09IGZpZWxkLnBhcmVudFRhYmxlLFxuICAgICAgICAgICAgJ3JlY29yZCBhbmQgZmllbGQgbXVzdCBiZWxvbmcgdG8gdGhlIHNhbWUgdGFibGUnLFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuX3JlY29yZCA9IHJlY29yZDtcbiAgICAgICAgdGhpcy5fZmllbGQgPSBmaWVsZDtcbiAgICAgICAgdGhpcy5fbGlua2VkVGFibGUgPSBub3JtYWxpemVkT3B0cy50YWJsZTtcbiAgICAgICAgdGhpcy5fb3JpZ2luUmVjb3JkU3RvcmUgPSB0aGlzLl9zZGsuYmFzZS5fX2dldFJlY29yZFN0b3JlKHRoaXMuX3JlY29yZC5wYXJlbnRUYWJsZS5pZCk7XG4gICAgICAgIHRoaXMuX2xpbmtlZFJlY29yZFN0b3JlID0gbm9ybWFsaXplZE9wdHMucmVjb3JkU3RvcmU7XG5cbiAgICAgICAgLy8gd2UgY291bGQgcmVseSBvbiBSZWNvcmRRdWVyeVJlc3VsdCdzIHJldXNlIHBvb2wgdG8gbWFrZSBzdXJlIHdlIGdldCBiYWNrXG4gICAgICAgIC8vIHRoZSBzYW1lIFJlY29yZFF1ZXJ5UmVzdWx0IGV2ZXJ5IHRpbWUsIGJ1dCB0aGF0IHdvdWxkIG1ha2UgaXQgbXVjaCBoYXJkZXJcbiAgICAgICAgLy8gdG8gbWFrZSBzdXJlIHdlIHVud2F0Y2ggZXZlcnl0aGluZyBmcm9tIHRoZSBvbGQgUmVjb3JkUXVlcnlSZXN1bHQgaWYgZS5nLlxuICAgICAgICAvLyB0aGUgZmllbGQgY29uZmlnIGNoYW5nZXMgdG8gcG9pbnQgYXQgYSBkaWZmZXJlbnQgdGFibGVcbiAgICAgICAgdGhpcy5fbGlua2VkUXVlcnlSZXN1bHQgPSB0aGlzLl9saW5rZWRUYWJsZS5fX3RhYmxlT3JWaWV3UXVlcnlSZXN1bHRQb29sLmdldE9iamVjdEZvclJldXNlKFxuICAgICAgICAgICAgdGhpcy5fc2RrLFxuICAgICAgICAgICAgdGhpcy5fbGlua2VkVGFibGUsXG4gICAgICAgICAgICBub3JtYWxpemVkT3B0cyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJcyB0aGUgcXVlcnkgcmVzdWx0IGN1cnJlbnRseSB2YWxpZD8gVGhpcyB2YWx1ZSBhbHdheXMgc3RhcnRzIGFzICd0cnVlJyxcbiAgICAgKiBidXQgY2FuIGJlY29tZSBmYWxzZSBpZiB0aGUgcmVjb3JkIGZyb20gd2hpY2ggdGhpcyByZXN1bHQgd2FzIGNyZWF0ZWQgaXNcbiAgICAgKiBkZWxldGVkLCBpZiB0aGUgZmllbGQgaXMgZGVsZXRlZCwgaWYgdGhlIGZpZWxkIGNvbmZpZyBjaGFuZ2VzIHRvIGxpbmsgdG9cbiAgICAgKiBhIGRpZmZlcmVudCB0YWJsZSwgb3IgaWYgdGhlIGZpZWxkIGNvbmZpZyBjaGFuZ2VzIHRvIGxpbmsgdG8gYSB0eXBlXG4gICAgICogb3RoZXIgdGhhbiBNVUxUSVBMRV9SRUNPUkRfTElOS1MuIE9uY2UgYGlzVmFsaWRgIGhhcyBiZWNvbWUgZmFsc2UsIGl0XG4gICAgICogd2lsbCBuZXZlciBiZWNvbWUgdHJ1ZSBhZ2Fpbi4gTWFueSBmaWVsZHMgd2lsbCB0aHJvdyBvbiBhdHRlbXB0aW5nIHRvXG4gICAgICogYWNjZXNzIHRoZW0sIGFuZCB3YXRjaGVzIHdpbGwgbm8gbG9uZ2VyIGZpcmUuXG4gICAgICovXG4gICAgZ2V0IGlzVmFsaWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1ZhbGlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB0YWJsZSB0aGF0IHJlY29yZHMgaW4gdGhpcyBSZWNvcmRRdWVyeVJlc3VsdCBhcmUgcGFydCBvZlxuICAgICAqXG4gICAgICogQGludGVybmFsIChzaW5jZSB3ZSBtYXkgbm90IGJlIGFibGUgdG8gcmV0dXJuIHBhcmVudCBtb2RlbCBpbnN0YW5jZXMgaW4gdGhlIGltbXV0YWJsZSBtb2RlbHMgd29ybGQpXG4gICAgICovXG4gICAgZ2V0IHBhcmVudFRhYmxlKCk6IFRhYmxlIHtcbiAgICAgICAgaW52YXJpYW50KHRoaXMuaXNWYWxpZCwgJ0xpbmtlZFJlY29yZHNRdWVyeVJlc3VsdCBpcyBubyBsb25nZXIgdmFsaWQnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xpbmtlZFRhYmxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9yZGVyZWQgYXJyYXkgb2YgYWxsIHRoZSBsaW5rZWQgcmVjb3JkIGlkcy4gV2F0Y2hhYmxlLlxuICAgICAqL1xuICAgIGdldCByZWNvcmRJZHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIGludmFyaWFudCh0aGlzLmlzVmFsaWQsICdMaW5rZWRSZWNvcmRzUXVlcnlSZXN1bHQgaXMgbm8gbG9uZ2VyIHZhbGlkJyk7XG4gICAgICAgIGludmFyaWFudCh0aGlzLmlzRGF0YUxvYWRlZCwgJ0xpbmtlZFJlY29yZHNRdWVyeVJlc3VsdCBkYXRhIGlzIG5vdCBsb2FkZWQnKTtcblxuICAgICAgICAvLyByZWNvcmQgaWRzIGFyZSBsYXppbHkgZ2VuZXJhdGVkXG4gICAgICAgIHRoaXMuX2dlbmVyYXRlQ29tcHV0ZWREYXRhSWZOZWVkZWQoKTtcblxuICAgICAgICBpbnZhcmlhbnQodGhpcy5fY29tcHV0ZWRGaWx0ZXJlZFNvcnRlZFJlY29yZElkcywgJ25vIHJlY29yZElkcycpO1xuICAgICAgICByZXR1cm4gdGhpcy5fY29tcHV0ZWRGaWx0ZXJlZFNvcnRlZFJlY29yZElkcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcmRlcmVkIGFycmF5IG9mIGFsbCB0aGUgbGlua2VkIHJlY29yZHMuIFdhdGNoYWJsZS5cbiAgICAgKi9cbiAgICBnZXQgcmVjb3JkcygpOiBBcnJheTxSZWNvcmQ+IHtcbiAgICAgICAgaW52YXJpYW50KHRoaXMuaXNWYWxpZCwgJ0xpbmtlZFJlY29yZHNRdWVyeVJlc3VsdCBpcyBubyBsb25nZXIgdmFsaWQnKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5yZWNvcmRJZHMubWFwKHJlY29yZElkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlY29yZCA9IHRoaXMuX2xpbmtlZFJlY29yZFN0b3JlLmdldFJlY29yZEJ5SWRJZkV4aXN0cyhyZWNvcmRJZCk7XG4gICAgICAgICAgICBpbnZhcmlhbnQocmVjb3JkLCAnTm8gcmVjb3JkIGZvciBpZDogJXMnLCByZWNvcmRJZCk7XG4gICAgICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZmllbGRzIHRoYXQgd2VyZSB1c2VkIHRvIGNyZWF0ZSB0aGlzIExpbmtlZFJlY29yZHNRdWVyeVJlc3VsdC5cbiAgICAgKi9cbiAgICBnZXQgZmllbGRzKCk6IEFycmF5PEZpZWxkPiB8IG51bGwge1xuICAgICAgICBpbnZhcmlhbnQodGhpcy5pc1ZhbGlkLCAnTGlua2VkUmVjb3Jkc1F1ZXJ5UmVzdWx0IGlzIG5vIGxvbmdlciB2YWxpZCcpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9saW5rZWRRdWVyeVJlc3VsdC5maWVsZHM7XG4gICAgfVxuXG4gICAgLyoqIEBpbmhlcml0ZG9jICovXG4gICAgd2F0Y2goXG4gICAgICAgIGtleXM6IFdhdGNoYWJsZVJlY29yZFF1ZXJ5UmVzdWx0S2V5IHwgUmVhZG9ubHlBcnJheTxXYXRjaGFibGVSZWNvcmRRdWVyeVJlc3VsdEtleT4sXG4gICAgICAgIGNhbGxiYWNrOiBGbG93QW55RnVuY3Rpb24sXG4gICAgICAgIGNvbnRleHQ/OiBGbG93QW55T2JqZWN0IHwgbnVsbCxcbiAgICApOiBBcnJheTxXYXRjaGFibGVSZWNvcmRRdWVyeVJlc3VsdEtleT4ge1xuICAgICAgICBpbnZhcmlhbnQodGhpcy5pc1ZhbGlkLCAnY2Fubm90IHdhdGNoIGFuIGludmFsaWQgTGlua2VkUmVjb3Jkc1F1ZXJ5UmVzdWx0Jyk7XG5cbiAgICAgICAgY29uc3QgdmFsaWRLZXlzID0gc3VwZXIud2F0Y2goa2V5cywgY2FsbGJhY2ssIGNvbnRleHQpO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB2YWxpZEtleXMpIHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09IFJlY29yZFF1ZXJ5UmVzdWx0LldhdGNoYWJsZUtleXMuY2VsbFZhbHVlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dhdGNoTGlua2VkUXVlcnlDZWxsVmFsdWVzSWZOZWVkZWRBZnRlcldhdGNoKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChSZWNvcmRRdWVyeVJlc3VsdC5XYXRjaGFibGVDZWxsVmFsdWVzSW5GaWVsZEtleVByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZElkID0ga2V5LnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgUmVjb3JkUXVlcnlSZXN1bHQuV2F0Y2hhYmxlQ2VsbFZhbHVlc0luRmllbGRLZXlQcmVmaXgubGVuZ3RoLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2F0Y2hMaW5rZWRRdWVyeUNlbGxWYWx1ZXNJbkZpZWxkSWZOZWVkZWRBZnRlcldhdGNoKGZpZWxkSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWxpZEtleXM7XG4gICAgfVxuXG4gICAgLyoqIEBpbmhlcml0ZG9jICovXG4gICAgdW53YXRjaChcbiAgICAgICAga2V5czogV2F0Y2hhYmxlUmVjb3JkUXVlcnlSZXN1bHRLZXkgfCBSZWFkb25seUFycmF5PFdhdGNoYWJsZVJlY29yZFF1ZXJ5UmVzdWx0S2V5PixcbiAgICAgICAgY2FsbGJhY2s6IEZsb3dBbnlGdW5jdGlvbixcbiAgICAgICAgY29udGV4dD86IEZsb3dBbnlPYmplY3QgfCBudWxsLFxuICAgICk6IEFycmF5PFdhdGNoYWJsZVJlY29yZFF1ZXJ5UmVzdWx0S2V5PiB7XG4gICAgICAgIGNvbnN0IGFycmF5S2V5cyA9IChBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtrZXlzXSkgYXMgUmVhZG9ubHlBcnJheTxcbiAgICAgICAgICAgIFdhdGNoYWJsZVJlY29yZFF1ZXJ5UmVzdWx0S2V5XG4gICAgICAgID47XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgYXJyYXlLZXlzKSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSBSZWNvcmRRdWVyeVJlc3VsdC5XYXRjaGFibGVLZXlzLmNlbGxWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91bndhdGNoTGlua2VkUXVlcnlDZWxsVmFsdWVzSWZQb3NzaWJsZUJlZm9yZVVud2F0Y2goKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKFJlY29yZFF1ZXJ5UmVzdWx0LldhdGNoYWJsZUNlbGxWYWx1ZXNJbkZpZWxkS2V5UHJlZml4KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkSWQgPSBrZXkuc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICBSZWNvcmRRdWVyeVJlc3VsdC5XYXRjaGFibGVDZWxsVmFsdWVzSW5GaWVsZEtleVByZWZpeC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLl91bndhdGNoTGlua2VkUXVlcnlDZWxsVmFsdWVzSW5GaWVsZElmUG9zc2libGVCZWZvcmVVbndhdGNoKGZpZWxkSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLnVud2F0Y2goYXJyYXlLZXlzLCBjYWxsYmFjaywgY29udGV4dCk7XG4gICAgfVxuXG4gICAgLyoqIEBpbmhlcml0ZG9jICovXG4gICAgYXN5bmMgbG9hZERhdGFBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgc3VwZXIubG9hZERhdGFBc3luYygpO1xuXG4gICAgICAgIC8vIFRoaXMgY29uZGl0aW9uIGNhbm5vdCBiZSBkZXRlcm1pbmlzdGljYWxseSByZXByb2R1Y2VkIGluIHRoZSB0ZXN0aW5nXG4gICAgICAgIC8vIGVudmlyb25tZW50LlxuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgICAgICAgaWYgKCF0aGlzLmlzRGF0YUxvYWRlZCkge1xuICAgICAgICAgICAgLy8gZGF0YSBzdGlsbCBtaWdodCBub3QgYmUgbG9hZGVkIGFmdGVyIHRoZSBwcm9taXNlIHJlc29sdmVzIGlmIHRoZVxuICAgICAgICAgICAgLy8gbGlua2VkIHRhYmxlIGNoYW5nZWQuIGluIHRoYXQgY2FzZSwgY2FsbCBhZ2FpbjpcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZERhdGFBc3luYygpO1xuICAgICAgICAgICAgLy8gdGhlcmUgaGFzIHRvIGJlIGFuIHVubG9hZERhdGEgY2FsbCBmb3IgZXZlcnkgbG9hZERhdGFBc3luYyBjYWxsLlxuICAgICAgICAgICAgLy8gY2FsbCBpdCBoZXJlIHRvIG9mZnNldCBjYWxsaW5nIGxvYWREYXRhQXN5bmMgYSBzZWNvbmQgdGltZVxuICAgICAgICAgICAgdGhpcy51bmxvYWREYXRhKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgYXN5bmMgX2xvYWREYXRhQXN5bmMoKTogUHJvbWlzZTxBcnJheTxXYXRjaGFibGVSZWNvcmRRdWVyeVJlc3VsdEtleT4+IHtcbiAgICAgICAgdGhpcy5fcmVjb3JkLl9fbGlua2VkUmVjb3Jkc1F1ZXJ5UmVzdWx0UG9vbC5yZWdpc3Rlck9iamVjdEZvclJldXNlU3Ryb25nKHRoaXMpO1xuICAgICAgICB0aGlzLl93YXRjaE9yaWdpbigpO1xuICAgICAgICB0aGlzLl93YXRjaExpbmtlZFF1ZXJ5UmVzdWx0KCk7XG4gICAgICAgIGNvbnN0IGluaXRpYWxseUxvYWRlZCA9IHRoaXMuX2xpbmtlZFF1ZXJ5UmVzdWx0LmlzRGF0YUxvYWRlZDtcblxuICAgICAgICAvLyBodHRwczovL2FpcnRhYmxlLmNvbS9hcHBhaHVKUXc3cWZRVEJCVS90YmxTYnBpbU04U3BwOXR4cC92aXdlQUZJdXMzTWhVOUd4YS9yZWNOakZZSnBlVjIzTFBoSD9ibG9ja3M9aGlkZVxuICAgICAgICAvLyBUT0RPOiAoI3Byb2otYmxvY2tzLXNkay1yZWNvcmQtbGltaXRzKSBDdXJyZW50bHkgcXVlcmllcyBhbGwgY2VsbCB2YWx1ZXMgaW4gYSB0YWJsZVxuICAgICAgICAvLyB3aGVuIGxvYWRpbmcgbGlua2VkIHJlY29yZCBkYXRhLiBNdXN0IGFkZCBhIExpbmtlZFJlY29yZCBxdWVyeSB0eXBlIGluIHRoZSBmdXR1cmUuXG4gICAgICAgIC8vIFNpbmNlIF9sb2FkRGF0YUFzeW5jIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLCB0aGlzIHJlY29yZFN0b3JlUXVlcnlJZCBpcyBvbmx5IHNldCBvbmNlLFxuICAgICAgICAvLyBhbHRob3VnaCBpdCBpcyBndWFyYW50ZWVkIHRvIGJlIHN0YWJsZSBpZiBuZWVkZWQgKHNvIGxvbmcgYXMgdGhpcy5fZmllbGQuaWQgaXMgc3RhYmxlKVxuICAgICAgICBjb25zdCBbcmVjb3JkU3RvcmVRdWVyeUlkXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIHRoaXMuX3Nkay5iYXNlXG4gICAgICAgICAgICAgICAgLl9fZ2V0UmVjb3JkU3RvcmUodGhpcy5fcmVjb3JkLnBhcmVudFRhYmxlLmlkKVxuICAgICAgICAgICAgICAgIC5sb2FkQWxsQ2VsbFZhbHVlc0luRmllbGRJZHNBc3luYyhbdGhpcy5fZmllbGQuaWRdKSxcbiAgICAgICAgICAgIHRoaXMuX2xpbmtlZFF1ZXJ5UmVzdWx0LmxvYWREYXRhQXN5bmMoKSxcbiAgICAgICAgICAgIHRoaXMuX2xvYWRSZWNvcmRDb2xvcnNBc3luYygpLFxuICAgICAgICBdKTtcbiAgICAgICAgdGhpcy5fcmVjb3JkU3RvcmVRdWVyeUlkID0gcmVjb3JkU3RvcmVRdWVyeUlkO1xuXG4gICAgICAgIHRoaXMuX2ludmFsaWRhdGVDb21wdXRlZERhdGEoKTtcblxuICAgICAgICBjb25zdCBjaGFuZ2VkS2V5cyA9IFsncmVjb3JkcycsICdyZWNvcmRJZHMnLCAncmVjb3JkQ29sb3JzJ107XG5cbiAgICAgICAgLy8gSWYgdGhlIGxpbmtlZCBxdWVyeSByZXN1bHQgd2FzIG5vdCBpbml0aWFsbHkgbG9hZGVkLCB0aGVuIHRoZVxuICAgICAgICAvLyBgY2VsbFZhbHVlc2AgZXZlbnQgd2lsbCBiZSBlbWl0dGVkIHZpYSBgX29uTGlua2VkQ2VsbFZhbHVlc0NoYW5nZWAuXG4gICAgICAgIC8vIE90aGVyd2lzZSwgaXQgbXVzdCBiZSBleHBsaWNpdGx5IGluY2x1ZGVkIGhlcmUgaW4gb3JkZXIgdG8gcHJvbW90ZVxuICAgICAgICAvLyBjb25zaXN0ZW5jeS5cbiAgICAgICAgaWYgKGluaXRpYWxseUxvYWRlZCkge1xuICAgICAgICAgICAgY2hhbmdlZEtleXMucHVzaCgnY2VsbFZhbHVlcycpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmllbGRJZHMgPVxuICAgICAgICAgICAgdGhpcy5fbm9ybWFsaXplZE9wdHMuZmllbGRJZHNPck51bGxJZkFsbEZpZWxkcyB8fFxuICAgICAgICAgICAgdGhpcy5wYXJlbnRUYWJsZS5maWVsZHMubWFwKGZpZWxkID0+IGZpZWxkLmlkKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkSWQgb2YgZmllbGRJZHMpIHtcbiAgICAgICAgICAgIGNoYW5nZWRLZXlzLnB1c2goUmVjb3JkUXVlcnlSZXN1bHQuV2F0Y2hhYmxlQ2VsbFZhbHVlc0luRmllbGRLZXlQcmVmaXggKyBmaWVsZElkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjaGFuZ2VkS2V5cztcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3VubG9hZERhdGEoKSB7XG4gICAgICAgIC8vIFRoZSBpbnZlcnNlIG9mIHRoaXMgY29uZGl0aW9uIGNhbm5vdCBiZSBkZXRlcm1pbmlzdGljYWxseSByZXByb2R1Y2VkXG4gICAgICAgIC8vIGluIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50LlxuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZVxuICAgICAgICBpZiAodGhpcy5pc1ZhbGlkKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWNvcmQuX19saW5rZWRSZWNvcmRzUXVlcnlSZXN1bHRQb29sLnVucmVnaXN0ZXJPYmplY3RGb3JSZXVzZVN0cm9uZyh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuX3Vud2F0Y2hPcmlnaW4oKTtcbiAgICAgICAgICAgIHRoaXMuX3Vud2F0Y2hMaW5rZWRRdWVyeVJlc3VsdCgpO1xuXG4gICAgICAgICAgICBpbnZhcmlhbnQoXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVjb3JkU3RvcmVRdWVyeUlkLFxuICAgICAgICAgICAgICAgICdVbnN1YnNjcmliaW5nIGZyb20gbGlua2VkIHJlY29yZCByZWNvcmQgc3RvcmUgd2l0aG91dCBxdWVyeUlkJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLl9vcmlnaW5SZWNvcmRTdG9yZS51bmxvYWRDZWxsVmFsdWVzRm9yUXVlcnlJZHNUaGF0QXJlU3Vic2NyaWJlZFRvQWxsQ2VsbHMoW1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlY29yZFN0b3JlUXVlcnlJZCxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgdGhpcy5fbGlua2VkUXVlcnlSZXN1bHQudW5sb2FkRGF0YSgpO1xuICAgICAgICAgICAgdGhpcy5fdW5sb2FkUmVjb3JkQ29sb3JzKCk7XG5cbiAgICAgICAgICAgIHRoaXMuX2ludmFsaWRhdGVDb21wdXRlZERhdGEoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoZSBrZXkgdXNlZCB0byBpZGVudGlmeSB0aGlzIHF1ZXJ5IHJlc3VsdCBpbiBPYmplY3RQb29sXG4gICAgICpcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IF9fcG9vbEtleSgpIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuX3NlcmlhbGl6ZWRPcHRzfTo6JHt0aGlzLl9maWVsZC5pZH06OiR7dGhpcy5fbGlua2VkVGFibGUuaWR9Ojoke3RoaXMuaXNWYWxpZH1gO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBnZXQgX2NlbGxWYWx1ZXNXYXRjaENvdW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAodGhpcy5fY2hhbmdlV2F0Y2hlcnNCeUtleVtSZWNvcmRRdWVyeVJlc3VsdC5XYXRjaGFibGVLZXlzLmNlbGxWYWx1ZXNdIHx8IFtdKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF93YXRjaExpbmtlZFF1ZXJ5Q2VsbFZhbHVlc0lmTmVlZGVkQWZ0ZXJXYXRjaCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NlbGxWYWx1ZXNXYXRjaENvdW50ID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLl93YXRjaExpbmtlZFF1ZXJ5Q2VsbFZhbHVlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF91bndhdGNoTGlua2VkUXVlcnlDZWxsVmFsdWVzSWZQb3NzaWJsZUJlZm9yZVVud2F0Y2goKSB7XG4gICAgICAgIGlmICh0aGlzLl9jZWxsVmFsdWVzV2F0Y2hDb3VudCA9PT0gMSAmJiB0aGlzLmlzVmFsaWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3Vud2F0Y2hMaW5rZWRRdWVyeUNlbGxWYWx1ZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBnZXQgX2NlbGxWYWx1ZVdhdGNoQ291bnRCeUZpZWxkSWQoKTogUmVhZG9ubHk8e1trZXk6IHN0cmluZ106IG51bWJlcn0+IHtcbiAgICAgICAgY29uc3QgY291bnRCeUZpZWxkSWQ6IE9iamVjdE1hcDxGaWVsZElkLCBudW1iZXI+ID0ge307XG4gICAgICAgIGNvbnN0IHdhdGNoS2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuX2NoYW5nZVdhdGNoZXJzQnlLZXkpLmZpbHRlcihrZXkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGtleS5zdGFydHNXaXRoKFJlY29yZFF1ZXJ5UmVzdWx0LldhdGNoYWJsZUNlbGxWYWx1ZXNJbkZpZWxkS2V5UHJlZml4KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAoY29uc3Qgd2F0Y2hLZXkgb2Ygd2F0Y2hLZXlzKSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZElkID0gd2F0Y2hLZXkuc2xpY2UoXG4gICAgICAgICAgICAgICAgUmVjb3JkUXVlcnlSZXN1bHQuV2F0Y2hhYmxlQ2VsbFZhbHVlc0luRmllbGRLZXlQcmVmaXgubGVuZ3RoLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvdW50QnlGaWVsZElkW2ZpZWxkSWRdID0gdGhpcy5fY2hhbmdlV2F0Y2hlcnNCeUtleVt3YXRjaEtleV0ubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvdW50QnlGaWVsZElkO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfd2F0Y2hMaW5rZWRRdWVyeUNlbGxWYWx1ZXNJbkZpZWxkSWZOZWVkZWRBZnRlcldhdGNoKGZpZWxkSWQ6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5fY2VsbFZhbHVlV2F0Y2hDb3VudEJ5RmllbGRJZFtmaWVsZElkXSA9PT0gMSAmJiB0aGlzLmlzVmFsaWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3dhdGNoTGlua2VkUXVlcnlDZWxsVmFsdWVzSW5GaWVsZChmaWVsZElkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfdW53YXRjaExpbmtlZFF1ZXJ5Q2VsbFZhbHVlc0luRmllbGRJZlBvc3NpYmxlQmVmb3JlVW53YXRjaChmaWVsZElkOiBzdHJpbmcpIHtcbiAgICAgICAgaW52YXJpYW50KFxuICAgICAgICAgICAgdGhpcy5fY2VsbFZhbHVlV2F0Y2hDb3VudEJ5RmllbGRJZFtmaWVsZElkXSxcbiAgICAgICAgICAgIFwiY2VsbFZhbHVlc0luRmllbGQ6JXMgb3Zlci1mcmVlJ2RcIixcbiAgICAgICAgICAgIGZpZWxkSWQsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NlbGxWYWx1ZVdhdGNoQ291bnRCeUZpZWxkSWRbZmllbGRJZF0gPT09IDEgJiYgdGhpcy5pc1ZhbGlkKSB7XG4gICAgICAgICAgICB0aGlzLl91bndhdGNoTGlua2VkUXVlcnlDZWxsVmFsdWVzSW5GaWVsZChmaWVsZElkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfd2F0Y2hPcmlnaW4oKSB7XG4gICAgICAgIC8vIGlmIHRoZSBjZWxsIHZhbHVlcyBpbiB0aGUgcmVjb3JkIGNoYW5nZSwgd2UgbmVlZCB0byBpbnZhbGlkYXRlIG91clxuICAgICAgICAvLyBjYWNoZWQgZGF0YSBhbmQgbm90aWZ5IHdhdGNoZXJzXG4gICAgICAgIHRoaXMuX3JlY29yZC53YXRjaChcbiAgICAgICAgICAgIGBjZWxsVmFsdWVJbkZpZWxkOiR7dGhpcy5fZmllbGQuaWR9YCxcbiAgICAgICAgICAgIHRoaXMuX29uT3JpZ2luQ2VsbFZhbHVlQ2hhbmdlLFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGNvbmZpZyBjaGFuZ2VzLCB3ZSBuZWVkIHRvIGludmFsaWRhdGUgY2FjaGVkIGRhdGEsXG4gICAgICAgIC8vIGFuZCBwb3RlbnRpYWxseSBzdGFydCB3YXRjaGluZyBhIGRpZmZlcmVudCB0YWJsZVxuICAgICAgICB0aGlzLl9maWVsZC53YXRjaCgndHlwZScsIHRoaXMuX29uT3JpZ2luRmllbGRDb25maWdDaGFuZ2UsIHRoaXMpO1xuICAgICAgICB0aGlzLl9maWVsZC53YXRjaCgnb3B0aW9ucycsIHRoaXMuX29uT3JpZ2luRmllbGRDb25maWdDaGFuZ2UsIHRoaXMpO1xuICAgICAgICAvLyBpZiB0aGUgdW5kZXJseWluZyByZWNvcmQgaXMgZGVsZXRlZCwgd2UgbmVlZCB0byBpbnZhbGlkYXRlIHRoaXNcbiAgICAgICAgLy8gcmVzdWx0XG4gICAgICAgIHRoaXMuX29yaWdpblJlY29yZFN0b3JlLndhdGNoV2l0aFJlY29yZFF1ZXJ5UmVzdWx0KHtcbiAgICAgICAgICAgIHJlY29yZFF1ZXJ5UmVzdWx0OiB0aGlzLFxuICAgICAgICAgICAga2V5czogV2F0Y2hhYmxlUmVjb3JkU3RvcmVLZXlzLnJlY29yZElkcyxcbiAgICAgICAgICAgIGNhbGxiYWNrRm9yUmVnaXN0cmF0aW9uOiB0aGlzLl9vbk9yaWdpblJlY29yZHNDaGFuZ2UsXG4gICAgICAgICAgICBjb250ZXh0OiB0aGlzLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gaWYgdGhlIGxpbmtlZCBmaWVsZCBpbiB0aGUgb3JpZ2luIHRhYmxlIGlzIGRlbGV0ZWQsIHdlIG5lZWQgdG9cbiAgICAgICAgLy8gaW52YWxpZGF0ZSB0aGlzIHJlc3VsdFxuICAgICAgICB0aGlzLl9yZWNvcmQucGFyZW50VGFibGUud2F0Y2goJ2ZpZWxkcycsIHRoaXMuX29uT3JpZ2luRmllbGRzQ2hhbmdlLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3Vud2F0Y2hPcmlnaW4oKSB7XG4gICAgICAgIHRoaXMuX3JlY29yZC51bndhdGNoKFxuICAgICAgICAgICAgYGNlbGxWYWx1ZUluRmllbGQ6JHt0aGlzLl9maWVsZC5pZH1gLFxuICAgICAgICAgICAgdGhpcy5fb25PcmlnaW5DZWxsVmFsdWVDaGFuZ2UsXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLl9maWVsZC51bndhdGNoKCd0eXBlJywgdGhpcy5fb25PcmlnaW5GaWVsZENvbmZpZ0NoYW5nZSwgdGhpcyk7XG4gICAgICAgIHRoaXMuX2ZpZWxkLnVud2F0Y2goJ29wdGlvbnMnLCB0aGlzLl9vbk9yaWdpbkZpZWxkQ29uZmlnQ2hhbmdlLCB0aGlzKTtcbiAgICAgICAgdGhpcy5fb3JpZ2luUmVjb3JkU3RvcmUudW53YXRjaCgncmVjb3JkSWRzJywgdGhpcy5fb25PcmlnaW5SZWNvcmRzQ2hhbmdlLCB0aGlzKTtcbiAgICAgICAgdGhpcy5fcmVjb3JkLnBhcmVudFRhYmxlLnVud2F0Y2goJ2ZpZWxkcycsIHRoaXMuX29uT3JpZ2luRmllbGRzQ2hhbmdlLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3dhdGNoTGlua2VkUXVlcnlSZXN1bHQoKSB7XG4gICAgICAgIC8vIGluIHRoZSBsaW5rZWQgdGFibGUsIGFsbCB3ZSBjYXJlIGFib3V0IGlzIHRoZSBzZXQgb2YgcmVjb3JkSWRzLlxuICAgICAgICAvLyB0aGlzIHdhdGNoIGZpcmUgd2hlbiB0aGV5J3JlIGFkZGVkL3JlbW92ZWQgYW5kIHdoZW4gdGhleSBjaGFuZ2VcbiAgICAgICAgLy8gb3JkZXIuIHdlIG9ubHkgY2FyZSBhYm91dCBvcmRlciwgYmVjYXVzZSBhZGQvcmVtb3ZlIGlzIGhhbmRsZWQgYnlcbiAgICAgICAgLy8gd2F0Y2hpbmcgdGhlIG9yaWdpbiByZWNvcmRcbiAgICAgICAgdGhpcy5fbGlua2VkUXVlcnlSZXN1bHQud2F0Y2goJ3JlY29yZElkcycsIHRoaXMuX29uTGlua2VkUmVjb3JkSWRzQ2hhbmdlLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3Vud2F0Y2hMaW5rZWRRdWVyeVJlc3VsdCgpIHtcbiAgICAgICAgdGhpcy5fbGlua2VkUXVlcnlSZXN1bHQudW53YXRjaCgncmVjb3JkSWRzJywgdGhpcy5fb25MaW5rZWRSZWNvcmRJZHNDaGFuZ2UsIHRoaXMpO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfd2F0Y2hMaW5rZWRRdWVyeUNlbGxWYWx1ZXMoKSB7XG4gICAgICAgIHRoaXMuX2xpbmtlZFF1ZXJ5UmVzdWx0LndhdGNoKCdjZWxsVmFsdWVzJywgdGhpcy5fb25MaW5rZWRDZWxsVmFsdWVzQ2hhbmdlLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3Vud2F0Y2hMaW5rZWRRdWVyeUNlbGxWYWx1ZXMoKSB7XG4gICAgICAgIHRoaXMuX2xpbmtlZFF1ZXJ5UmVzdWx0LnVud2F0Y2goJ2NlbGxWYWx1ZXMnLCB0aGlzLl9vbkxpbmtlZENlbGxWYWx1ZXNDaGFuZ2UsIHRoaXMpO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfd2F0Y2hMaW5rZWRRdWVyeUNlbGxWYWx1ZXNJbkZpZWxkKGZpZWxkSWQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9saW5rZWRRdWVyeVJlc3VsdC53YXRjaChcbiAgICAgICAgICAgIFJlY29yZFF1ZXJ5UmVzdWx0LldhdGNoYWJsZUNlbGxWYWx1ZXNJbkZpZWxkS2V5UHJlZml4ICsgZmllbGRJZCxcbiAgICAgICAgICAgIHRoaXMuX2dldE9uTGlua2VkQ2VsbFZhbHVlc0luRmllbGRDaGFuZ2UoZmllbGRJZCksXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfdW53YXRjaExpbmtlZFF1ZXJ5Q2VsbFZhbHVlc0luRmllbGQoZmllbGRJZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2xpbmtlZFF1ZXJ5UmVzdWx0LnVud2F0Y2goXG4gICAgICAgICAgICBSZWNvcmRRdWVyeVJlc3VsdC5XYXRjaGFibGVDZWxsVmFsdWVzSW5GaWVsZEtleVByZWZpeCArIGZpZWxkSWQsXG4gICAgICAgICAgICB0aGlzLl9nZXRPbkxpbmtlZENlbGxWYWx1ZXNJbkZpZWxkQ2hhbmdlKGZpZWxkSWQpLFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX29uTGlua2VkUmVjb3JkSWRzQ2hhbmdlKCkge1xuICAgICAgICBpbnZhcmlhbnQodGhpcy5pc1ZhbGlkLCAnd2F0Y2gga2V5IGNoYW5nZSBldmVudCB3aGlsc3QgaW52YWxpZCcpO1xuICAgICAgICBpZiAoIXRoaXMuaXNEYXRhTG9hZGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9pbnZhbGlkYXRlQ29tcHV0ZWREYXRhKCk7XG5cbiAgICAgICAgLy8gd2UgZG9uJ3QgYWN0dWFsbHkga25vdyBhdCB0aGlzIHN0YWdlIHdoZXRoZXIgYW55dGhpbmcgY2hhbmdlZCBvclxuICAgICAgICAvLyBub3QuIGl0IG1heSBoYXZlIGRvbmUgdGhvdWdoLCBzbyBub3RpZnkgd2F0Y2hlcnNcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UoJ3JlY29yZHMnKTtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UoJ3JlY29yZElkcycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbW9kZWwgZG9lc24ndCB1c2UgdGhlIGBfZGF0YWAgY29tcHV0ZWQgcHJvcGVydHkgaXQgaW5oZXJpdHMgZnJvbVxuICAgICAqIEFic3RyYWN0TW9kZWwuIEl0IGltcGxlbWVudHMgdGhlIGZvbGxvd2luZyBtZXRob2Qgb25seSBzbyB0aGF0IGludGVybmFsXG4gICAgICogY2hlY2tzIGZvciBtb2RlbCBkZWxldGlvbiBiZWhhdmUgYXBwcm9wcmlhdGVseSAodGhlIGRhdGEgaXRzZWxmIGlzXG4gICAgICogaW5jb25zZXF1ZW50aWFsKS5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldCBfZGF0YU9yTnVsbElmRGVsZXRlZCgpOiBMaW5rZWRSZWNvcmRzUXVlcnlSZXN1bHREYXRhIHwgbnVsbCB7XG4gICAgICAgIGlmICh0aGlzLl9yZWNvcmQuaXNEZWxldGVkIHx8IHRoaXMuX2xpbmtlZFJlY29yZFN0b3JlLmlzRGVsZXRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9vbkxpbmtlZENlbGxWYWx1ZXNDaGFuZ2UoXG4gICAgICAgIHF1ZXJ5UmVzdWx0OiBUYWJsZU9yVmlld1F1ZXJ5UmVzdWx0LFxuICAgICAgICBrZXk6IHN0cmluZyxcbiAgICAgICAgY2hhbmdlcz86IHtmaWVsZElkcz86IEFycmF5PEZpZWxkSWQ+OyByZWNvcmRJZHM/OiBBcnJheTxSZWNvcmRJZD59LFxuICAgICkge1xuICAgICAgICBpbnZhcmlhbnQodGhpcy5pc1ZhbGlkLCAnd2F0Y2gga2V5IGNoYW5nZSBldmVudCB3aGlsc3QgaW52YWxpZCcpO1xuXG4gICAgICAgIGlmIChjaGFuZ2VzICYmIGNoYW5nZXMuZmllbGRJZHMgJiYgY2hhbmdlcy5yZWNvcmRJZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlY29yZElkc1NldCA9IHRoaXMuX2dldE9yR2VuZXJhdGVSZWNvcmRJZHNTZXQoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlY29yZElkcyA9IGNoYW5nZXMucmVjb3JkSWRzLmZpbHRlcihpZCA9PiByZWNvcmRJZHNTZXRbaWRdID09PSB0cnVlKTtcbiAgICAgICAgICAgIGlmIChyZWNvcmRJZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UoJ2NlbGxWYWx1ZXMnLCB7ZmllbGRJZHM6IGNoYW5nZXMuZmllbGRJZHMsIHJlY29yZElkc30pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UoJ2NlbGxWYWx1ZXMnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfZ2V0T25MaW5rZWRDZWxsVmFsdWVzSW5GaWVsZENoYW5nZShcbiAgICAgICAgZmllbGRJZDogc3RyaW5nLFxuICAgICk6IChhcmcxOiBUYWJsZU9yVmlld1F1ZXJ5UmVzdWx0LCBrZXk6IHN0cmluZywgcmVjb3JkSWRzOiBBcnJheTxSZWNvcmRJZD4gfCB2b2lkKSA9PiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jZWxsVmFsdWVDaGFuZ2VIYW5kbGVyQnlGaWVsZElkW2ZpZWxkSWRdKSB7XG4gICAgICAgICAgICB0aGlzLl9jZWxsVmFsdWVDaGFuZ2VIYW5kbGVyQnlGaWVsZElkW2ZpZWxkSWRdID0gKFxuICAgICAgICAgICAgICAgIHF1ZXJ5UmVzdWx0OiBUYWJsZU9yVmlld1F1ZXJ5UmVzdWx0LFxuICAgICAgICAgICAgICAgIGtleTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHJlY29yZElkczogQXJyYXk8UmVjb3JkSWQ+IHwgdm9pZCxcbiAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgIGludmFyaWFudCh0aGlzLmlzVmFsaWQsICd3YXRjaCBrZXkgY2hhbmdlIGV2ZW50IHdoaWxzdCBpbnZhbGlkJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBUaGUgbGlua2VkIHJlY29yZCBtYXkgZmluaXNoIGxvYWRpbmcgYmVmb3JlIGl0cyBwYXJlbnQuIEluXG4gICAgICAgICAgICAgICAgLy8gdGhhdCBjYXNlLCB0aGUgYXBwcm9wcmlhdGUgZXZlbnRzIHdpbGwgYmUgdHJpZ2dlcmVkIGJ5IHRoZVxuICAgICAgICAgICAgICAgIC8vIGBfbG9hZERhdGFBc3luY2AgbWV0aG9kLlxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0RhdGFMb2FkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFRoZSBgZWxzZWAgYnJhbmNoIHdpbGwgb25seSBiZSByZWFjaGVkIHdoZW4gdGhlIHVuZGVybHlpbmdcbiAgICAgICAgICAgICAgICAvLyBgUmVjb3JkT3JWaWV3UXVlcnlSZXN1bHRgIGlzIGxvYWRlZCwgdW5sb2FkZWQsIGFuZCB0aGVuXG4gICAgICAgICAgICAgICAgLy8gbG9hZGVkIGFnYWluLiBCZWNhdXNlIHRoYXQgcXVlcnkgcmVzdWx0IGlzIG5vdCBkaXJlY3RseVxuICAgICAgICAgICAgICAgIC8vIGV4cG9zZWQgdG8gY29uc3VtZXJzLCB0aGUgY29uZGl0aW9uIGNhbiBvbmx5IGJlIG1ldCB3aGVuIHRoZVxuICAgICAgICAgICAgICAgIC8vIFNESyBpcyBtaXN1c2VkIChlLmcuIHJlcGVhdGVkbHkgZnJlZWluZyByZWxhdGVkIHF1ZXJ5XG4gICAgICAgICAgICAgICAgLy8gcmVzdWx0cykuIFRoZSBgZWxzZWAgYnJhbmNoIGF0dGVtcHRzIHRvIGhhbmRsZSB0aGF0XG4gICAgICAgICAgICAgICAgLy8gc2l0dWF0aW9uIGluIGEgbG9naWNhbCB3YXksIGJ1dCBpdCBpcyBub3QgdGVzdGVkIGJlY2F1c2UgaXRcbiAgICAgICAgICAgICAgICAvLyBpcyBmdW5kYW1lbnRhbGx5IGludmFsaWQuXG4gICAgICAgICAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIGVsc2VcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZWNvcmRJZHMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZElkc1NldCA9IHRoaXMuX2dldE9yR2VuZXJhdGVSZWNvcmRJZHNTZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRSZWNvcmRJZHMgPSByZWNvcmRJZHMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQgPT4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJiByZWNvcmRJZHNTZXRbaWRdID09PSB0cnVlLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBzaG91bGQgYWx3YXlzIGJlIGEgZmlsdGVyZWRSZWNvcmRJZHMgZm91bmQgZm9yIHRoaXMgcXVlcnlcbiAgICAgICAgICAgICAgICAgICAgLy8gdHlwZSAtIG5vdCBmaW5kaW5nIGFueSBpcyBhIGZ1bmRhbWVudGFsIG1pc3Rha2UgaW4gb3VyIHF1ZXJ5IGVuZ2luZVxuICAgICAgICAgICAgICAgICAgICBpbnZhcmlhbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZFJlY29yZElkcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAnRmlsdGVyZWQgcmVjb3JkIGNoYW5nZSBvbiBpbmNvcnJlY3QgcmVjb3JkLCBxdWVyeSBlbmdpbmUgaXNzdWUnLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlY29yZFF1ZXJ5UmVzdWx0LldhdGNoYWJsZUNlbGxWYWx1ZXNJbkZpZWxkS2V5UHJlZml4ICsgZmllbGRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkUmVjb3JkSWRzLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKFJlY29yZFF1ZXJ5UmVzdWx0LldhdGNoYWJsZUNlbGxWYWx1ZXNJbkZpZWxkS2V5UHJlZml4ICsgZmllbGRJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9jZWxsVmFsdWVDaGFuZ2VIYW5kbGVyQnlGaWVsZElkW2ZpZWxkSWRdO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfb25PcmlnaW5DZWxsVmFsdWVDaGFuZ2UoKSB7XG4gICAgICAgIGludmFyaWFudCh0aGlzLmlzVmFsaWQsICd3YXRjaCBrZXkgY2hhbmdlIGV2ZW50IHdoaWxzdCBpbnZhbGlkJyk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzRGF0YUxvYWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIHdoZW4gdGhlIG9yaWdpbiBjZWxsIHZhbHVlIChsaXN0aW5nIGFsbCB0aGUgbGlua2VkIHJlY29yZHMpIGNoYW5nZXMsXG4gICAgICAgIC8vIGludmFsaWRhdGUgYWxsIHRoZSBkYXRhIHdlIGhhdmUgc3RvcmVkIC0gd2UgbmVlZCB0byBjb21wbGV0ZWx5XG4gICAgICAgIC8vIHJlZ2VuZXJhdGUgaXRcbiAgICAgICAgdGhpcy5faW52YWxpZGF0ZUNvbXB1dGVkRGF0YSgpO1xuXG4gICAgICAgIC8vIG5vdGlmeSB3YXRjaGVycyB0aGF0IG91ciBzZXQgb2YgbGlua2VkIHJlY29yZHMgaGFzIGNoYW5nZWRcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UoJ3JlY29yZHMnKTtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UoJ3JlY29yZElkcycpO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfb25PcmlnaW5SZWNvcmRzQ2hhbmdlKCkge1xuICAgICAgICBpZiAodGhpcy5fcmVjb3JkLmlzRGVsZXRlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9vbk9yaWdpbkZpZWxkc0NoYW5nZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZpZWxkLmlzRGVsZXRlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9vbk9yaWdpbkZpZWxkQ29uZmlnQ2hhbmdlKCkge1xuICAgICAgICBpbnZhcmlhbnQodGhpcy5pc1ZhbGlkLCAnd2F0Y2gga2V5IGNoYW5nZSBldmVudCB3aGlsc3QgaW52YWxpZCcpO1xuXG4gICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLl9maWVsZC50eXBlO1xuXG4gICAgICAgIGlmICh0eXBlICE9PSBGaWVsZFR5cGUuTVVMVElQTEVfUkVDT1JEX0xJTktTKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnZhbGlkYXRlUXVlcnlSZXN1bHQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxpbmtlZFRhYmxlSWQgPSBnZXRMaW5rZWRUYWJsZUlkKHRoaXMuX2ZpZWxkKTtcbiAgICAgICAgaWYgKGxpbmtlZFRhYmxlSWQgIT09IHRoaXMuX2xpbmtlZFRhYmxlLmlkKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnZhbGlkYXRlUXVlcnlSZXN1bHQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfaW52YWxpZGF0ZVF1ZXJ5UmVzdWx0KCkge1xuICAgICAgICBpZiAodGhpcy5pc0RhdGFMb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3VubG9hZERhdGEoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fY2VsbFZhbHVlc1dhdGNoQ291bnQgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl91bndhdGNoTGlua2VkUXVlcnlDZWxsVmFsdWVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBmaWVsZElkIG9mIE9iamVjdC5rZXlzKHRoaXMuX2NlbGxWYWx1ZVdhdGNoQ291bnRCeUZpZWxkSWQpKSB7XG4gICAgICAgICAgICB0aGlzLl91bndhdGNoTGlua2VkUXVlcnlDZWxsVmFsdWVzSW5GaWVsZChmaWVsZElkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UoJ3JlY29yZHMnKTtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UoJ3JlY29yZElkcycpO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfaW52YWxpZGF0ZUNvbXB1dGVkRGF0YSgpIHtcbiAgICAgICAgdGhpcy5fY29tcHV0ZWRSZWNvcmRJZHNTZXQgPSBudWxsO1xuICAgICAgICB0aGlzLl9jb21wdXRlZEZpbHRlcmVkU29ydGVkUmVjb3JkSWRzID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2dlbmVyYXRlQ29tcHV0ZWREYXRhSWZOZWVkZWQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fY29tcHV0ZWRSZWNvcmRJZHNTZXQpIHtcbiAgICAgICAgICAgIHRoaXMuX2dlbmVyYXRlQ29tcHV0ZWREYXRhKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2dlbmVyYXRlQ29tcHV0ZWREYXRhKCkge1xuICAgICAgICBjb25zdCByZWNvcmRJZHNTZXQ6IE9iamVjdE1hcDxSZWNvcmRJZCwgdHJ1ZT4gPSB7fTtcbiAgICAgICAgY29uc3QgcmF3Q2VsbFZhbHVlID0gdGhpcy5fcmVjb3JkLmdldENlbGxWYWx1ZSh0aGlzLl9maWVsZCk7XG4gICAgICAgIGNvbnN0IGNlbGxWYWx1ZSA9IHJhd0NlbGxWYWx1ZSA9PT0gbnVsbCA/IFtdIDogcmF3Q2VsbFZhbHVlO1xuICAgICAgICBpbnZhcmlhbnQoQXJyYXkuaXNBcnJheShjZWxsVmFsdWUpLCAnY2VsbFZhbHVlIHNob3VsZCBiZSBhcnJheScpO1xuXG4gICAgICAgIGZvciAoY29uc3QgbGlua2VkUmVjb3JkIG9mIGNlbGxWYWx1ZSkge1xuICAgICAgICAgICAgaW52YXJpYW50KFxuICAgICAgICAgICAgICAgIGxpbmtlZFJlY29yZCAmJiB0eXBlb2YgbGlua2VkUmVjb3JkID09PSAnb2JqZWN0JyxcbiAgICAgICAgICAgICAgICAnbGlua2VkIHJlY29yZCBzaG91bGQgYmUgb2JqZWN0JyxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlY29yZElkID0gbGlua2VkUmVjb3JkLmlkO1xuICAgICAgICAgICAgaW52YXJpYW50KHR5cGVvZiByZWNvcmRJZCA9PT0gJ3N0cmluZycsICdpZCBzaG91bGQgYmUgcHJlc2VudCcpO1xuXG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHVzZSB0aGUgcXVlcnkgcmVzdWx0IGFzIHRoZSBzb3VyY2Ugb2YgdHJ1dGggZm9yXG4gICAgICAgICAgICAvLyByZWNvcmRJZHMsIHNpbmNlIHdoZW4gdGhlIGNsaWVudCBkZWxldGVzIGEgcmVjb3JkIGZyb20gdGhlIGxpbmtlZFxuICAgICAgICAgICAgLy8gdGFibGUsIHdlIHVwZGF0ZSBpdCBvcHRpbWlzdGljYWxseSBidXQgdGhlIG9yaWdpbiBjZWxsIHZhbHVlXG4gICAgICAgICAgICAvLyBkb2Vzbid0IHVwZGF0ZSB1bnRpbCByZWNlaXZpbmcgdGhlIHB1c2ggcGF5bG9hZC5cbiAgICAgICAgICAgIGlmICh0aGlzLl9saW5rZWRRdWVyeVJlc3VsdC5oYXNSZWNvcmQocmVjb3JkSWQpKSB7XG4gICAgICAgICAgICAgICAgcmVjb3JkSWRzU2V0W3JlY29yZElkXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jb21wdXRlZFJlY29yZElkc1NldCA9IHJlY29yZElkc1NldDtcblxuICAgICAgICBpZiAodGhpcy5fbm9ybWFsaXplZE9wdHMuc29ydHMgJiYgdGhpcy5fbm9ybWFsaXplZE9wdHMuc29ydHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyB3aGVuIHNvcnRzIGFyZSBwcmVzZW50LCByZWNvcmQgb3JkZXIgY29tZXMgZnJvbSB0aGUgcXVlcnkgcmVzdWx0XG4gICAgICAgICAgICB0aGlzLl9jb21wdXRlZEZpbHRlcmVkU29ydGVkUmVjb3JkSWRzID0gdGhpcy5fbGlua2VkUXVlcnlSZXN1bHQucmVjb3JkSWRzLmZpbHRlcihcbiAgICAgICAgICAgICAgICByZWNvcmRJZCA9PiByZWNvcmRJZHNTZXRbcmVjb3JkSWRdID09PSB0cnVlLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHdpdGggbm8gc29ydHMsIHJlY29yZCBvcmRlciBpcyB0aGUgc2FtZSBhcyBpbiB0aGUgY2VsbCBpbiB0aGVcbiAgICAgICAgICAgIC8vIG1haW4gQWlydGFibGUgVUkuIFNpbmNlIHdlIGdlbmVyYXRlZCByZWNvcmRJZHNTZXQgYnkgaXRlcmF0aW5nXG4gICAgICAgICAgICAvLyBvdmVyIHRoZSBjZWxsIHZhbHVlLCB3ZSdyZSBndWFyYW50ZWVkIHRoYXQgdGhlIGtleSBvcmRlciBtYXRjaGVzXG4gICAgICAgICAgICAvLyB0aGUgbGlua2VkIHJlY29yZCBvcmRlciBpbiB0aGUgY2VsbC5cbiAgICAgICAgICAgIHRoaXMuX2NvbXB1dGVkRmlsdGVyZWRTb3J0ZWRSZWNvcmRJZHMgPSBPYmplY3Qua2V5cyhyZWNvcmRJZHNTZXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9nZXRPckdlbmVyYXRlUmVjb3JkSWRzU2V0KCkge1xuICAgICAgICB0aGlzLl9nZW5lcmF0ZUNvbXB1dGVkRGF0YUlmTmVlZGVkKCk7XG4gICAgICAgIGNvbnN0IHJlY29yZElkc1NldCA9IHRoaXMuX2NvbXB1dGVkUmVjb3JkSWRzU2V0O1xuICAgICAgICBpbnZhcmlhbnQocmVjb3JkSWRzU2V0LCAncmVjb3JkSWRzU2V0IG11c3QgZXhpc3QnKTtcbiAgICAgICAgcmV0dXJuIHJlY29yZElkc1NldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGFsbG93cyBhIHJlY29yZCBxdWVyeSByZXN1bHQgdG8gc3BlY2lmeSB0aGUgc291cmNlIG9mIHRoZSBxdWVyeVxuICAgICAqIGVnOiBWaWV3LCBUYWJsZSwgTGlua2VkIHJlY29yZCB3aGVuIHdhdGNoaW5nIGZpZWxkcy5cbiAgICAgKiBUaGlzIHNjb3BlcyB0aGUgd2F0Y2ggdG8gdGhvc2UgZmllbGRzICsgcm93cyBpbiB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfX2NvbnN0cnVjdFF1ZXJ5U3BlY0ZvckJsb2NrRmllbGRTZWxlY3Rpb25TcGVjKFxuICAgICAgICBmaWVsZFNlbGVjdGlvbjogQmxvY2tGaWVsZFNlbGVjdGlvblNwZWMsXG4gICAgKTogQmxvY2tRdWVyeVNwZWMge1xuICAgICAgICAvLyBUaGUgb3JpZ2luIHRhYmxlSWQgaXMgYWx3YXlzIHRoZSBvbmUgcmVmZXJyZWQgdG8gaGVyZSBhcyB3ZSBtdXN0IHdhdGNoIHRoZSBvcmlnaW4gcmVjb3JkIGZvciBkZWxldGlvblxuICAgICAgICBjb25zdCBvcmlnaW5UYWJsZUlkID0gdGhpcy5fcmVjb3JkLnBhcmVudFRhYmxlLmlkO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzb3VyY2VUeXBlOiBCbG9ja1F1ZXJ5U291cmNlVHlwZS5UQUJMRSxcbiAgICAgICAgICAgIHNvdXJjZVRhYmxlSWQ6IG9yaWdpblRhYmxlSWQsXG4gICAgICAgICAgICByZWNvcmRTZWxlY3Rpb246IHtcbiAgICAgICAgICAgICAgICBmaWVsZFNlbGVjdGlvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMaW5rZWRSZWNvcmRzUXVlcnlSZXN1bHQ7XG4iXX0=
@@ -148,4 +148,5 @@ Object.defineProperty(exports, 'aggregators', {
148
148
 
149
149
  return initializedAggregators;
150
150
  }
151
- });
151
+ });
152
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbHMvbW9kZWxzLnRzIl0sIm5hbWVzIjpbImluaXRpYWxpemVkQWdncmVnYXRvcnMiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJlbnVtZXJhYmxlIiwiZ2V0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBOzs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBakJBOztBQUNBOztBQUFlO0FBc0JmLElBQUlBLHNCQUFpRCxHQUFHLElBQXhEO0FBQ0FDLE1BQU0sQ0FBQ0MsY0FBUCxDQUFzQkMsT0FBdEIsRUFBK0IsYUFBL0IsRUFBOEM7QUFDMUNDLEVBQUFBLFVBQVUsRUFBRSxJQUQ4QjtBQUUxQ0MsRUFBQUEsR0FBRyxFQUFFLE1BQU07QUFDUCxRQUFJLENBQUNMLHNCQUFMLEVBQTZCO0FBQ3pCQSxNQUFBQSxzQkFBc0IsR0FBRyxrQ0FBekI7QUFDSDs7QUFDRCxXQUFPQSxzQkFBUDtBQUNIO0FBUHlDLENBQTlDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaXN0YW5idWwgaWdub3JlIGZpbGVcbi8qKiBAaWdub3JlICovIC8qKiAqL1xuaW1wb3J0ICogYXMgcmVjb3JkQ29sb3JpbmcgZnJvbSAnLi9yZWNvcmRfY29sb3JpbmcnO1xuaW1wb3J0IGNyZWF0ZUFnZ3JlZ2F0b3JzIGZyb20gJy4vY3JlYXRlX2FnZ3JlZ2F0b3JzJztcbmV4cG9ydCB7RmllbGRUeXBlLCBGaWVsZENvbmZpZ30gZnJvbSAnLi4vdHlwZXMvZmllbGQnO1xuZXhwb3J0IHtWaWV3VHlwZX0gZnJvbSAnLi4vdHlwZXMvdmlldyc7XG5leHBvcnQge2RlZmF1bHQgYXMgQmFzZX0gZnJvbSAnLi9iYXNlJztcbmV4cG9ydCB7ZGVmYXVsdCBhcyBUYWJsZX0gZnJvbSAnLi90YWJsZSc7XG5leHBvcnQge2RlZmF1bHQgYXMgRmllbGR9IGZyb20gJy4vZmllbGQnO1xuZXhwb3J0IHtkZWZhdWx0IGFzIFZpZXd9IGZyb20gJy4vdmlldyc7XG5leHBvcnQge2RlZmF1bHQgYXMgUmVjb3JkfSBmcm9tICcuL3JlY29yZCc7XG5leHBvcnQge2RlZmF1bHQgYXMgUmVjb3JkUXVlcnlSZXN1bHR9IGZyb20gJy4vcmVjb3JkX3F1ZXJ5X3Jlc3VsdCc7XG5leHBvcnQge2RlZmF1bHQgYXMgVGFibGVPclZpZXdRdWVyeVJlc3VsdH0gZnJvbSAnLi90YWJsZV9vcl92aWV3X3F1ZXJ5X3Jlc3VsdCc7XG5leHBvcnQge2RlZmF1bHQgYXMgR3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0fSBmcm9tICcuL2dyb3VwZWRfcmVjb3JkX3F1ZXJ5X3Jlc3VsdCc7XG5leHBvcnQge2RlZmF1bHQgYXMgTGlua2VkUmVjb3Jkc1F1ZXJ5UmVzdWx0fSBmcm9tICcuL2xpbmtlZF9yZWNvcmRzX3F1ZXJ5X3Jlc3VsdCc7XG5leHBvcnQge2RlZmF1bHQgYXMgVmlld01ldGFkYXRhUXVlcnlSZXN1bHR9IGZyb20gJy4vdmlld19tZXRhZGF0YV9xdWVyeV9yZXN1bHQnO1xuZXhwb3J0IHtkZWZhdWx0IGFzIFNlc3Npb259IGZyb20gJy4vc2Vzc2lvbic7XG5leHBvcnQge2RlZmF1bHQgYXMgQ3Vyc29yfSBmcm9tICcuL2N1cnNvcic7XG5leHBvcnQge3JlY29yZENvbG9yaW5nfTtcblxuLy8gSEFDSzogYWdncmVnYXRvcnMgbmVlZCBhaXJ0YWJsZV9pbnRlcmZhY2UgdG8gaW5pdGlhbGl6ZSAtIHJlYWxseSwgdGhleSBzaG91bGQgYmUgYSBwcm9wZXJ0eSBvZlxuLy8gYmFzZSBpbnN0ZWFkIG9mIGhlcmUuIHRvIHdvcmsgYXJvdW5kIHRoYXQsIHRoZXkncmUgaW5pdGlhbGl6ZWQgbGF6aWx5IGZvciBub3c6XG5leHBvcnQgZGVjbGFyZSB2YXIgYWdncmVnYXRvcnM6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUFnZ3JlZ2F0b3JzPjtcbmxldCBpbml0aWFsaXplZEFnZ3JlZ2F0b3JzOiBudWxsIHwgdHlwZW9mIGFnZ3JlZ2F0b3JzID0gbnVsbDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnYWdncmVnYXRvcnMnLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgaWYgKCFpbml0aWFsaXplZEFnZ3JlZ2F0b3JzKSB7XG4gICAgICAgICAgICBpbml0aWFsaXplZEFnZ3JlZ2F0b3JzID0gY3JlYXRlQWdncmVnYXRvcnMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5pdGlhbGl6ZWRBZ2dyZWdhdG9ycztcbiAgICB9LFxufSk7XG4iXX0=
@@ -12,4 +12,5 @@ exports.MAX_FIELD_DESCRIPTION_LENGTH = MAX_FIELD_DESCRIPTION_LENGTH;
12
12
  var MAX_TABLE_NAME_LENGTH = 255;
13
13
  exports.MAX_TABLE_NAME_LENGTH = MAX_TABLE_NAME_LENGTH;
14
14
  var MAX_NUM_FIELDS_PER_TABLE = 500;
15
- exports.MAX_NUM_FIELDS_PER_TABLE = MAX_NUM_FIELDS_PER_TABLE;
15
+ exports.MAX_NUM_FIELDS_PER_TABLE = MAX_NUM_FIELDS_PER_TABLE;
16
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbHMvbXV0YXRpb25fY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbIk1BWF9GSUVMRF9OQU1FX0xFTkdUSCIsIk1BWF9GSUVMRF9ERVNDUklQVElPTl9MRU5HVEgiLCJNQVhfVEFCTEVfTkFNRV9MRU5HVEgiLCJNQVhfTlVNX0ZJRUxEU19QRVJfVEFCTEUiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ08sSUFBTUEscUJBQXFCLEdBQUcsR0FBOUI7O0FBQ0EsSUFBTUMsNEJBQTRCLEdBQUcsS0FBckM7O0FBQ0EsSUFBTUMscUJBQXFCLEdBQUcsR0FBOUI7O0FBQ0EsSUFBTUMsd0JBQXdCLEdBQUcsR0FBakMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBNaXJyb3JlZCBmcm9tIGNsaWVudFNlcnZlclNoYXJlZENvbmZpZ1NldHRpbmdzXG5leHBvcnQgY29uc3QgTUFYX0ZJRUxEX05BTUVfTEVOR1RIID0gMjU1O1xuZXhwb3J0IGNvbnN0IE1BWF9GSUVMRF9ERVNDUklQVElPTl9MRU5HVEggPSAyMDAwMDtcbmV4cG9ydCBjb25zdCBNQVhfVEFCTEVfTkFNRV9MRU5HVEggPSAyNTU7XG5leHBvcnQgY29uc3QgTUFYX05VTV9GSUVMRFNfUEVSX1RBQkxFID0gNTAwO1xuIl19