@mediusinc/mng-commons 5.5.0-rc.4 → 6.0.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. package/core/action/action-parameters.model.d.ts +4 -4
  2. package/core/data-providers/base.data-provider.d.ts +4 -7
  3. package/core/data-providers/lookup.data-provider.d.ts +2 -2
  4. package/core/descriptors/model.descriptor.d.ts +1 -7
  5. package/core/descriptors/tableview.descriptor.d.ts +5 -5
  6. package/core/helpers/route.d.ts +0 -1
  7. package/core/helpers/type-helpers.d.ts +8 -0
  8. package/core/index.d.ts +0 -3
  9. package/core/models/menu.model.d.ts +0 -4
  10. package/core/services/commons.service.d.ts +0 -32
  11. package/core/services/tokens/module-config.token.d.ts +0 -28
  12. package/esm2022/core/action/action-parameters.model.mjs +1 -1
  13. package/esm2022/core/data-providers/base.data-provider.mjs +2 -4
  14. package/esm2022/core/data-providers/lookup.data-provider.mjs +1 -1
  15. package/esm2022/core/descriptors/model.descriptor.mjs +1 -1
  16. package/esm2022/core/descriptors/tableview.descriptor.mjs +1 -1
  17. package/esm2022/core/helpers/type-helpers.mjs +1 -1
  18. package/esm2022/core/index.mjs +1 -4
  19. package/esm2022/core/models/menu.model.mjs +1 -1
  20. package/esm2022/core/services/commons.service.mjs +1 -34
  21. package/esm2022/core/services/tokens/module-config.token.mjs +1 -1
  22. package/esm2022/filter/descriptors/filter-lookup.descriptor.mjs +5 -86
  23. package/esm2022/filter/descriptors/filter.descriptor.mjs +7 -29
  24. package/esm2022/form/api/data-providers/lookup-data-provider.factory.mjs +14 -41
  25. package/esm2022/form/api/data-providers/lookup.data-provider.mjs +3 -3
  26. package/esm2022/model/class/data-providers/base-from-class-data-provider.factory.mjs +5 -0
  27. package/esm2022/model/class/descriptors/model-class.descriptor.mjs +28 -0
  28. package/esm2022/model/class/descriptors/type-class.descriptor.mjs +6 -0
  29. package/esm2022/model/class/helpers/model.mjs +53 -0
  30. package/esm2022/model/class/index.mjs +8 -0
  31. package/esm2022/model/class/mediusinc-mng-commons-model-class.mjs +5 -0
  32. package/esm2022/model/data-providers/base-from-type-data-provider.factory.mjs +11 -6
  33. package/esm2022/model/descriptors/model.descriptor.mjs +11 -54
  34. package/esm2022/model/descriptors/type.descriptor.mjs +2 -10
  35. package/esm2022/model/index.mjs +1 -2
  36. package/esm2022/table/api/class/class-table-attribute-converter.mjs +80 -0
  37. package/esm2022/table/api/class/class-table-attribute.model.mjs +2 -0
  38. package/esm2022/table/api/class/class-table-data-provider.factory.mjs +5 -0
  39. package/esm2022/table/api/class/class-table-descriptor-helpers.mjs +99 -0
  40. package/esm2022/table/api/class/class-table-descriptor.factory.mjs +21 -0
  41. package/esm2022/table/api/class/index.mjs +6 -0
  42. package/esm2022/table/api/class/mediusinc-mng-commons-table-api-class.mjs +5 -0
  43. package/esm2022/table/api/data-providers/table-data-provider.factory.mjs +14 -41
  44. package/esm2022/table/api/data-providers/table.data-provider.mjs +3 -9
  45. package/esm2022/table/api/descriptors/column.descriptor.mjs +8 -3
  46. package/esm2022/table/api/descriptors/table-descriptor.factory.mjs +10 -77
  47. package/esm2022/table/api/descriptors/table.descriptor.mjs +3 -3
  48. package/esm2022/table/api/helpers/column-converter.mjs +25 -0
  49. package/esm2022/table/api/helpers/table-data-provider-descriptor-convert.mjs +4 -4
  50. package/esm2022/table/api/index.mjs +2 -4
  51. package/esm2022/table/api/models/table-columns.model.mjs +1 -1
  52. package/esm2022/table/components/column-value/column-value.component.mjs +4 -3
  53. package/esm2022/table/components/filter/filter-active-tag/filter-active-tag.component.mjs +3 -3
  54. package/esm2022/table/components/filter/filter-form/filter-form.component.mjs +5 -5
  55. package/esm2022/table/components/table/table.component.mjs +6 -8
  56. package/esm2022/tableview/action/components/action/action.component.mjs +1 -1
  57. package/esm2022/tableview/action/components/editor/injector-context/action-editor-injector-context.component.mjs +10 -6
  58. package/esm2022/tableview/action/helpers/action-execution.mjs +1 -1
  59. package/esm2022/tableview/action/models/execution/action-context.model.mjs +1 -1
  60. package/esm2022/tableview/action/models/execution/action-instance.model.mjs +1 -1
  61. package/esm2022/tableview/action/services/action-executor.service.mjs +11 -11
  62. package/esm2022/tableview/action/services/data-provider-executor.service.mjs +18 -3
  63. package/esm2022/tableview/api/action/descriptors/action-confirmation.descriptor.mjs +1 -1
  64. package/esm2022/tableview/api/action/descriptors/action-descriptor.factory.mjs +13 -104
  65. package/esm2022/tableview/api/action/descriptors/action-editor-descriptor.factory.mjs +15 -62
  66. package/esm2022/tableview/api/action/descriptors/action-editor.descriptor.mjs +3 -63
  67. package/esm2022/tableview/api/action/descriptors/action-link-descriptor.factory.mjs +17 -30
  68. package/esm2022/tableview/api/action/descriptors/action-link.descriptor.mjs +1 -1
  69. package/esm2022/tableview/api/action/descriptors/action.descriptor.mjs +6 -29
  70. package/esm2022/tableview/api/action/descriptors/editor-action-descriptor.factory.mjs +21 -0
  71. package/esm2022/tableview/api/action/descriptors/editor-action-editor-descriptor.factory.mjs +21 -0
  72. package/esm2022/tableview/api/action/descriptors/table-action-descriptor.factory.mjs +37 -0
  73. package/esm2022/tableview/api/action/descriptors/table-action-editor-descriptor.factory.mjs +40 -0
  74. package/esm2022/tableview/api/action/helpers/data-provider-executors.mjs +25 -5
  75. package/esm2022/tableview/api/action/models/action-descriptor.types.mjs +1 -1
  76. package/esm2022/tableview/api/action/models/action-error.model.mjs +1 -1
  77. package/esm2022/tableview/api/action/models/execution/action-context-validation.model.mjs +1 -1
  78. package/esm2022/tableview/api/action/models/execution/action-context.model.mjs +1 -1
  79. package/esm2022/tableview/api/action/models/execution/action-instance.model.mjs +1 -1
  80. package/esm2022/tableview/api/action/models/tableview-action-default-categories.model.mjs +6 -6
  81. package/esm2022/tableview/api/action/services/data-provider-executor.service.mjs +3 -3
  82. package/esm2022/tableview/api/class/editor/class-editor-attribute-converter.mjs +85 -0
  83. package/esm2022/tableview/api/class/editor/class-editor-attribute.model.mjs +2 -0
  84. package/esm2022/tableview/api/class/editor/class-editor-data-provider.factory.mjs +5 -0
  85. package/esm2022/tableview/api/class/editor/class-editor-descriptor-helpers.mjs +95 -0
  86. package/esm2022/tableview/api/class/editor/class-editor-descriptor.factory.mjs +21 -0
  87. package/esm2022/tableview/api/class/index.mjs +13 -0
  88. package/esm2022/tableview/api/class/mediusinc-mng-commons-tableview-api-class.mjs +5 -0
  89. package/esm2022/tableview/api/class/tableview/class-tableview-attribute-converter.mjs +35 -0
  90. package/esm2022/tableview/api/class/tableview/class-tableview-attribute.model.mjs +2 -0
  91. package/esm2022/tableview/api/class/tableview/class-tableview-data-provider.factory.mjs +5 -0
  92. package/esm2022/tableview/api/class/tableview/class-tableview-descriptor-helpers.mjs +111 -0
  93. package/esm2022/tableview/api/class/tableview/class-tableview-descriptor.factory.mjs +26 -0
  94. package/esm2022/tableview/api/editor/data-providers/editor-data-provider.factory.mjs +14 -32
  95. package/esm2022/tableview/api/editor/data-providers/editor.data-provider.mjs +40 -7
  96. package/esm2022/tableview/api/editor/descriptors/editor-descriptor.factory.mjs +7 -73
  97. package/esm2022/tableview/api/editor/descriptors/editor.descriptor.mjs +49 -134
  98. package/esm2022/tableview/api/editor/descriptors/field-base.descriptor.mjs +11 -2
  99. package/esm2022/tableview/api/editor/descriptors/field-lookup.descriptor.mjs +3 -5
  100. package/esm2022/tableview/api/editor/descriptors/field-many.descriptor.mjs +2 -18
  101. package/esm2022/tableview/api/editor/descriptors/wrappers/editor-descriptor-nested-object-wrapper.mjs +51 -0
  102. package/esm2022/tableview/api/editor/models/editor-fields.model.mjs +1 -1
  103. package/esm2022/tableview/api/editor/models/form-editor.event.mjs +1 -1
  104. package/esm2022/tableview/api/index.mjs +8 -8
  105. package/esm2022/tableview/api/tableview/data-providers/tableview-data-provider.factory.mjs +13 -51
  106. package/esm2022/tableview/api/tableview/data-providers/tableview.data-provider.mjs +19 -11
  107. package/esm2022/tableview/api/tableview/descriptors/tableview-descriptor.factory.mjs +19 -96
  108. package/esm2022/tableview/api/tableview/descriptors/tableview.descriptor.mjs +29 -182
  109. package/esm2022/tableview/api/tableview/helpers/tableview-create.mjs +8 -6
  110. package/esm2022/tableview/api/tableview/helpers/tableview-data-provider-descriptor-convert.mjs +4 -4
  111. package/esm2022/tableview/api/tableview/helpers/tableview-default-actions.mjs +117 -99
  112. package/esm2022/tableview/api/tableview/helpers/tableview-input-builder.mjs +164 -7
  113. package/esm2022/tableview/api/tableview/models/tableview-descriptor-fields-manage-helper.type.mjs +2 -0
  114. package/esm2022/tableview/api/tableview/models/tableview-descriptor-helper.type.mjs +2 -0
  115. package/esm2022/tableview/api/tableview/models/tableview-input.model.mjs +1 -1
  116. package/esm2022/tableview/api/tableview/models/tableview-route.model.mjs +1 -1
  117. package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +6 -6
  118. package/esm2022/tableview/editor/helpers/editor-field.mjs +3 -3
  119. package/esm2022/tableview/editor/helpers/editor-formly.mjs +4 -4
  120. package/esm2022/tableview/editor/helpers/field-create.mjs +21 -0
  121. package/esm2022/tableview/index.mjs +3 -2
  122. package/esm2022/tableview/tableview/components/route/tableview-route.component.mjs +1 -1
  123. package/esm2022/tableview/tableview/components/tableview/tableview.component.mjs +3 -1
  124. package/fesm2022/mediusinc-mng-commons-core.mjs +687 -781
  125. package/fesm2022/mediusinc-mng-commons-core.mjs.map +1 -1
  126. package/fesm2022/mediusinc-mng-commons-filter.mjs +10 -113
  127. package/fesm2022/mediusinc-mng-commons-filter.mjs.map +1 -1
  128. package/fesm2022/mediusinc-mng-commons-form-api.mjs +15 -42
  129. package/fesm2022/mediusinc-mng-commons-form-api.mjs.map +1 -1
  130. package/fesm2022/mediusinc-mng-commons-model-class.mjs +97 -0
  131. package/fesm2022/mediusinc-mng-commons-model-class.mjs.map +1 -0
  132. package/fesm2022/mediusinc-mng-commons-model.mjs +23 -137
  133. package/fesm2022/mediusinc-mng-commons-model.mjs.map +1 -1
  134. package/fesm2022/mediusinc-mng-commons-table-api-class.mjs +204 -0
  135. package/fesm2022/mediusinc-mng-commons-table-api-class.mjs.map +1 -0
  136. package/fesm2022/mediusinc-mng-commons-table-api.mjs +55 -319
  137. package/fesm2022/mediusinc-mng-commons-table-api.mjs.map +1 -1
  138. package/fesm2022/mediusinc-mng-commons-table.mjs +14 -15
  139. package/fesm2022/mediusinc-mng-commons-table.mjs.map +1 -1
  140. package/fesm2022/mediusinc-mng-commons-tableview-api-class.mjs +367 -0
  141. package/fesm2022/mediusinc-mng-commons-tableview-api-class.mjs.map +1 -0
  142. package/fesm2022/mediusinc-mng-commons-tableview-api.mjs +715 -1298
  143. package/fesm2022/mediusinc-mng-commons-tableview-api.mjs.map +1 -1
  144. package/fesm2022/mediusinc-mng-commons-tableview.mjs +67 -27
  145. package/fesm2022/mediusinc-mng-commons-tableview.mjs.map +1 -1
  146. package/filter/descriptors/filter-lookup.descriptor.d.ts +1 -26
  147. package/filter/descriptors/filter.descriptor.d.ts +5 -12
  148. package/form/api/data-providers/lookup-data-provider.factory.d.ts +17 -20
  149. package/form/api/data-providers/lookup.data-provider.d.ts +3 -3
  150. package/model/class/README.md +8 -0
  151. package/model/class/data-providers/base-from-class-data-provider.factory.d.ts +3 -0
  152. package/model/class/descriptors/model-class.descriptor.d.ts +12 -0
  153. package/model/class/descriptors/type-class.descriptor.d.ts +3 -0
  154. package/model/{helpers → class/helpers}/model.d.ts +1 -2
  155. package/model/class/index.d.ts +4 -0
  156. package/model/data-providers/base-from-type-data-provider.factory.d.ts +13 -6
  157. package/model/descriptors/model.descriptor.d.ts +12 -27
  158. package/model/descriptors/type.descriptor.d.ts +0 -5
  159. package/model/index.d.ts +0 -1
  160. package/package.json +25 -7
  161. package/table/api/class/README.md +10 -0
  162. package/table/api/{helpers/class-attribute-converter.d.ts → class/class-table-attribute-converter.d.ts} +2 -9
  163. package/table/api/{models → class}/class-table-attribute.model.d.ts +1 -1
  164. package/table/api/class/class-table-data-provider.factory.d.ts +4 -0
  165. package/table/api/{helpers/table-descriptor-helpers.d.ts → class/class-table-descriptor-helpers.d.ts} +2 -4
  166. package/table/api/class/class-table-descriptor.factory.d.ts +11 -0
  167. package/table/api/class/index.d.ts +5 -0
  168. package/table/api/data-providers/table-data-provider.factory.d.ts +17 -20
  169. package/table/api/data-providers/table.data-provider.d.ts +4 -12
  170. package/table/api/descriptors/column.descriptor.d.ts +5 -2
  171. package/table/api/descriptors/table-descriptor.factory.d.ts +3 -39
  172. package/table/api/descriptors/table.descriptor.d.ts +3 -3
  173. package/table/api/helpers/column-converter.d.ts +7 -0
  174. package/table/api/helpers/table-data-provider-descriptor-convert.d.ts +3 -3
  175. package/table/api/index.d.ts +1 -3
  176. package/table/api/models/table-columns.model.d.ts +2 -2
  177. package/table/components/column-value/column-value.component.d.ts +1 -0
  178. package/table/components/filter/filter-active-tag/filter-active-tag.component.d.ts +1 -1
  179. package/table/components/filter/filter-form/filter-form.component.d.ts +1 -1
  180. package/table/components/filter/filter-overlay-with-tag/filter-overlay-with-tag.component.d.ts +1 -1
  181. package/table/components/table/table.component.d.ts +0 -9
  182. package/tableview/action/components/action/action.component.d.ts +2 -2
  183. package/tableview/action/components/editor/action-editor.component.d.ts +1 -1
  184. package/tableview/action/components/editor/injector-context/action-editor-injector-context.component.d.ts +6 -5
  185. package/tableview/action/components/localization/data-language-dropdown.component.d.ts +3 -3
  186. package/tableview/action/components/table/action-table.component.d.ts +3 -3
  187. package/tableview/action/helpers/action-execution.d.ts +1 -1
  188. package/tableview/action/models/execution/action-context.model.d.ts +3 -3
  189. package/tableview/action/models/execution/action-instance.model.d.ts +5 -5
  190. package/tableview/action/services/action-executor.service.d.ts +7 -7
  191. package/tableview/action/services/data-provider-executor.service.d.ts +16 -16
  192. package/tableview/action/services/view-container.service.d.ts +1 -1
  193. package/tableview/api/action/descriptors/action-confirmation.descriptor.d.ts +1 -1
  194. package/tableview/api/action/descriptors/action-descriptor.factory.d.ts +20 -31
  195. package/tableview/api/action/descriptors/action-editor-descriptor.factory.d.ts +18 -25
  196. package/tableview/api/action/descriptors/action-editor.descriptor.d.ts +22 -40
  197. package/tableview/api/action/descriptors/action-link-descriptor.factory.d.ts +21 -13
  198. package/tableview/api/action/descriptors/action-link.descriptor.d.ts +3 -3
  199. package/tableview/api/action/descriptors/action.descriptor.d.ts +31 -33
  200. package/tableview/api/action/descriptors/editor-action-descriptor.factory.d.ts +21 -0
  201. package/tableview/api/action/descriptors/editor-action-editor-descriptor.factory.d.ts +21 -0
  202. package/tableview/api/action/descriptors/table-action-descriptor.factory.d.ts +36 -0
  203. package/tableview/api/action/descriptors/table-action-editor-descriptor.factory.d.ts +40 -0
  204. package/tableview/api/action/helpers/data-provider-executors.d.ts +13 -8
  205. package/tableview/api/action/models/action-descriptor.types.d.ts +2 -2
  206. package/tableview/api/action/models/action-error.model.d.ts +1 -1
  207. package/tableview/api/action/models/execution/action-context-validation.model.d.ts +2 -2
  208. package/tableview/api/action/models/execution/action-context.model.d.ts +2 -2
  209. package/tableview/api/action/models/execution/action-instance.model.d.ts +1 -1
  210. package/tableview/api/action/models/tableview-action-default-categories.model.d.ts +5 -5
  211. package/tableview/api/action/services/data-provider-executor.service.d.ts +26 -25
  212. package/tableview/api/class/README.md +13 -0
  213. package/tableview/api/{editor/helpers/class-attribute-converter.d.ts → class/editor/class-editor-attribute-converter.d.ts} +2 -2
  214. package/tableview/api/{editor/models/class-tableview-attribute.model.d.ts → class/editor/class-editor-attribute.model.d.ts} +1 -1
  215. package/tableview/api/class/editor/class-editor-data-provider.factory.d.ts +4 -0
  216. package/tableview/api/{editor/helpers/editor-descriptor-helpers.d.ts → class/editor/class-editor-descriptor-helpers.d.ts} +2 -5
  217. package/tableview/api/class/editor/class-editor-descriptor.factory.d.ts +11 -0
  218. package/tableview/api/class/index.d.ts +10 -0
  219. package/tableview/api/{tableview/helpers/class-attribute-converter.d.ts → class/tableview/class-tableview-attribute-converter.d.ts} +1 -1
  220. package/tableview/api/{tableview/models → class/tableview}/class-tableview-attribute.model.d.ts +2 -2
  221. package/tableview/api/class/tableview/class-tableview-data-provider.factory.d.ts +4 -0
  222. package/tableview/api/{tableview/helpers/tableview-descriptor-helpers.d.ts → class/tableview/class-tableview-descriptor-helpers.d.ts} +1 -2
  223. package/tableview/api/class/tableview/class-tableview-descriptor.factory.d.ts +12 -0
  224. package/tableview/api/editor/data-providers/editor-data-provider.factory.d.ts +17 -16
  225. package/tableview/api/editor/data-providers/editor.data-provider.d.ts +64 -29
  226. package/tableview/api/editor/descriptors/editor-descriptor.factory.d.ts +5 -38
  227. package/tableview/api/editor/descriptors/editor.descriptor.d.ts +48 -112
  228. package/tableview/api/editor/descriptors/field-base.descriptor.d.ts +8 -1
  229. package/tableview/api/editor/descriptors/field-lookup.descriptor.d.ts +2 -3
  230. package/tableview/api/editor/descriptors/field-many.descriptor.d.ts +3 -11
  231. package/tableview/api/editor/descriptors/wrappers/editor-descriptor-nested-object-wrapper.d.ts +25 -0
  232. package/tableview/api/editor/models/editor-fields.model.d.ts +25 -21
  233. package/tableview/api/editor/models/form-editor.event.d.ts +0 -4
  234. package/tableview/api/index.d.ts +7 -6
  235. package/tableview/api/tableview/data-providers/tableview-data-provider.factory.d.ts +20 -25
  236. package/tableview/api/tableview/data-providers/tableview.data-provider.d.ts +22 -22
  237. package/tableview/api/tableview/descriptors/tableview-descriptor.factory.d.ts +20 -50
  238. package/tableview/api/tableview/descriptors/tableview.descriptor.d.ts +69 -163
  239. package/tableview/api/tableview/helpers/tableview-create.d.ts +18 -5
  240. package/tableview/api/tableview/helpers/tableview-data-provider-descriptor-convert.d.ts +2 -2
  241. package/tableview/api/tableview/helpers/tableview-default-actions.d.ts +73 -20
  242. package/tableview/api/tableview/helpers/tableview-input-builder.d.ts +87 -9
  243. package/tableview/api/tableview/models/tableview-descriptor-fields-manage-helper.type.d.ts +9 -0
  244. package/tableview/api/tableview/models/tableview-descriptor-helper.type.d.ts +2 -0
  245. package/tableview/api/tableview/models/tableview-input.model.d.ts +1 -1
  246. package/tableview/api/tableview/models/tableview-route.model.d.ts +1 -1
  247. package/tableview/editor/helpers/field-create.d.ts +9 -0
  248. package/tableview/index.d.ts +2 -1
  249. package/tableview/tableview/components/route/tableview-route.component.d.ts +1 -1
  250. package/tableview/tableview/components/tableview/tableview.component.d.ts +6 -6
  251. package/version-info.json +5 -5
  252. package/core/components/pages/error/error.page.component.d.ts +0 -11
  253. package/core/components/pages/not-found/not-found.page.component.d.ts +0 -11
  254. package/core/data-providers/base-data-provider.factory.d.ts +0 -13
  255. package/esm2022/core/components/pages/error/error.page.component.mjs +0 -24
  256. package/esm2022/core/components/pages/not-found/not-found.page.component.mjs +0 -24
  257. package/esm2022/core/data-providers/base-data-provider.factory.mjs +0 -28
  258. package/esm2022/model/helpers/model.mjs +0 -71
  259. package/esm2022/table/api/helpers/class-attribute-converter.mjs +0 -104
  260. package/esm2022/table/api/helpers/table-descriptor-helpers.mjs +0 -98
  261. package/esm2022/table/api/models/class-table-attribute.model.mjs +0 -2
  262. package/esm2022/tableview/api/editor/helpers/class-attribute-converter.mjs +0 -85
  263. package/esm2022/tableview/api/editor/helpers/editor-descriptor-helpers.mjs +0 -95
  264. package/esm2022/tableview/api/editor/models/class-tableview-attribute.model.mjs +0 -2
  265. package/esm2022/tableview/api/tableview/helpers/class-attribute-converter.mjs +0 -34
  266. package/esm2022/tableview/api/tableview/helpers/tableview-descriptor-helpers.mjs +0 -110
  267. package/esm2022/tableview/api/tableview/models/class-tableview-attribute.model.mjs +0 -2
@@ -7,6 +7,7 @@ import { FieldGroupDescriptor, FieldTabGroupDescriptor } from './field-group.des
7
7
  import { FieldLookupDescriptor, FieldLookupEnumDescriptor, fieldLookupGetProviderCfgObj } from './field-lookup.descriptor';
8
8
  import { FieldManyEditorDescriptor, FieldManyToManyEditorDescriptor, fieldManyToManyGetProviderCfgObj } from './field-many.descriptor';
9
9
  import { FieldInputDescriptor } from './field.descriptor';
10
+ import { EditorDescriptorNestedObjectWrapper } from './wrappers/editor-descriptor-nested-object-wrapper';
10
11
  export class EditorDescriptorInst {
11
12
  static { this.defaultGroupName = EDITOR_DEFAULT_GROUP_NAME; }
12
13
  /**
@@ -75,28 +76,58 @@ export class EditorDescriptorInst {
75
76
  get autofocusOnField() {
76
77
  return this._autofocusOnField;
77
78
  }
79
+ /**
80
+ * Dives into nested object to add fields from the nested object on property.
81
+ *
82
+ * @experimental
83
+ *
84
+ * @param property Model property name.
85
+ */
86
+ nested(property) {
87
+ return new EditorDescriptorNestedObjectWrapper(this, property);
88
+ }
78
89
  /**
79
90
  * Creates new tab group. Next added fields are added to newly created tab group.
80
91
  * @param name Name of the group.
81
- * @param title Title key for the tab.
92
+ * @param title Title key for the tab.7@return Newly created group descriptor.
93
+ * @return Newly created group descriptor.
82
94
  */
83
- createTabGroup(name, title) {
95
+ addTabGroup(name, title) {
84
96
  const tabGroup = new FieldTabGroupDescriptor(name);
85
97
  tabGroup.withTitle(title);
86
98
  this.createTabGroupDescriptor(tabGroup);
87
99
  return tabGroup;
88
100
  }
101
+ /**
102
+ * Creates new tab group. Next added fields are added to newly created tab group.
103
+ * @param name Name of the group.
104
+ * @param title Title key for the tab.7@return Newly created group descriptor.
105
+ */
106
+ withTabGroup(name, title) {
107
+ this.addTabGroup(name, title);
108
+ return this;
109
+ }
89
110
  /**
90
111
  * Creates new field group. Next added fields are added to newly created field group.
91
112
  * @param name Name of the group.
92
113
  * @param title Title key for the group.
114
+ * @return Newly created group descriptor.
93
115
  */
94
- createFieldGroup(name, title) {
116
+ addFieldGroup(name, title) {
95
117
  const fieldGroup = new FieldGroupDescriptor(name);
96
118
  fieldGroup.withTitle(title);
97
119
  this.createFieldGroupDescriptor(fieldGroup);
98
120
  return fieldGroup;
99
121
  }
122
+ /**
123
+ * Creates new field group. Next added fields are added to newly created field group.
124
+ * @param name Name of the group.
125
+ * @param title Title key for the group.
126
+ */
127
+ withFieldGroup(name, title) {
128
+ this.addFieldGroup(name, title);
129
+ return this;
130
+ }
100
131
  /**
101
132
  * Gets field by the model property name.
102
133
  * @param property Model property name.
@@ -166,7 +197,7 @@ export class EditorDescriptorInst {
166
197
  this.addFieldDescriptor(field);
167
198
  return field;
168
199
  }
169
- addFields(...properties) {
200
+ withFields(...properties) {
170
201
  properties.forEach(p => this.addField(p));
171
202
  return this;
172
203
  }
@@ -179,149 +210,33 @@ export class EditorDescriptorInst {
179
210
  * Adds lookup field.
180
211
  *
181
212
  * @param {Property} property - The property key of the editor.
182
- * @param {TypeDescriptor<FieldModel>} type - The type descriptor for the lookup model.
213
+ * @param {FieldsManageAddFieldLookupOpts<LookupModel, Service>} opts - Optional parameters configuring type and/or service provider.
183
214
  * @typeparam Property - The property key of the EditorModel.
184
215
  * @typeparam LookupModel - The field model type, defaults to the non-nullable type of the editor's property.
216
+ * @typeparam Service - Service used for data provider.
185
217
  * @typeparam FieldValue - The value type of field on editor.
186
218
  *
187
- * @returns {FieldLookupDescriptor<LookupModel, EditorModel, undefined, FieldValue>} - The field lookup descriptor.
219
+ * @returns {FieldLookupDescriptor<LookupModel, EditorModel, Service, FieldValue>} - The field lookup descriptor.
188
220
  */
189
- addFieldLookup(property, type) {
190
- return this.addFieldLookupUnsafe(property, type);
221
+ addFieldLookup(property, opts) {
222
+ return this.addFieldLookupUnsafe(property, opts);
191
223
  }
192
224
  /**
193
225
  * [UNSAFE] Adds lookup field.
194
226
  * This function is UNSAFE because property is not type-checked.
195
227
  *
196
228
  * @param {string} property Model property name.
197
- * @param {TypeDescriptor<FieldModel>} type - The type descriptor for the lookup model (defines 2nd generic).
198
- * @typeparam LookupModel - The field model type, defaults to the non-nullable type of the editor's property.
199
- * @typeparam FieldValue - The value type of field on editor.
200
- *
201
- * @returns {FieldLookupDescriptor<LookupModel, EditorModel, undefined, FieldValue>} - The field lookup descriptor.
202
- */
203
- addFieldLookupUnsafe(property, type) {
204
- const field = new FieldLookupDescriptor(property, {
205
- type: type?.classType
206
- });
207
- this.addFieldDescriptor(field);
208
- return field;
209
- }
210
- /**
211
- * Adds a field lookup with options value property for lookup model.
212
- *
213
- * @param {Property} property - The property key of the editor.
214
- * @param {TypeDescriptor<FieldModel>} type - The type descriptor for the lookup model.
215
- * @param {LookupValueProperty} lookupOptionsValueProperty - The value property used as value in the lookup options.
216
- * @typeparam Property - The property key of the EditorModel.
217
- * @typeparam LookupModel - The field model type, defaults to the non-nullable type of the editor's property.
218
- * @typeparam LookupValueProperty - The property of lookup model type.
219
- * @typeparam FieldValue - The value type of field on editor.
220
- *
221
- * @returns {FieldLookupDescriptor<LookupModel, EditorModel, undefined, FieldValue>} - The field lookup descriptor.
222
- */
223
- addFieldLookupWithOptionsValueProperty(property, type, lookupOptionsValueProperty) {
224
- return this.addFieldLookupWithOptionsValuePropertyUnsafe(property, type, lookupOptionsValueProperty);
225
- }
226
- /**
227
- * [UNSAFE] Adds a field lookup with options value property for lookup model.
228
- * This function is UNSAFE because property is not type-checked.
229
- *
230
- * @param {Property} property - The property key of the editor.
231
- * @param {TypeDescriptor<FieldModel>} type - The type descriptor for the lookup model.
232
- * @param {LookupValueProperty} lookupOptionsValueProperty - The value property used as value in the lookup options.
233
- * @typeparam Property - The property key of the EditorModel.
229
+ * @param {FieldsManageAddFieldLookupOpts<LookupModel, Service>} opts - Optional parameters configuring type and/or service provider.
234
230
  * @typeparam LookupModel - The field model type, defaults to the non-nullable type of the editor's property.
235
- * @typeparam LookupValueProperty - The property of lookup model type.
231
+ * @typeparam Service - Service used for data provider.
236
232
  * @typeparam FieldValue - The value type of field on editor.
237
- * @typeparam ParentEditorModel - The value type of parent form.
238
233
  *
239
- * @returns {FieldLookupDescriptor<LookupModel, EditorModel, undefined, FieldValue, ParentEditorModel>} - The field lookup descriptor.
234
+ * @returns {FieldLookupDescriptor<LookupModel, EditorModel, Service, FieldValue>} - The field lookup descriptor.
240
235
  */
241
- addFieldLookupWithOptionsValuePropertyUnsafe(property, type, lookupOptionsValueProperty) {
236
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
237
+ addFieldLookupUnsafe(property, opts) {
242
238
  const field = new FieldLookupDescriptor(property, {
243
- type: type?.classType,
244
- optionsValueProperty: lookupOptionsValueProperty
245
- });
246
- this.addFieldDescriptor(field);
247
- return field;
248
- }
249
- /**
250
- * Adds a field lookup with a data provider or service to the editor model.
251
- *
252
- * @param {Property} property - The property key of the editor.
253
- * @param {FieldLookupProviderType<LookupModel, Service>} provider - The field lookup data provider or service.
254
- * @param {TypeDescriptor<LookupModel>} [type] - The type of lookup - if data provider is passed as previous parameter, type can be omitted. If service is provider, type parameter is proposed in favour of correct typing.
255
- * @typeparam Property - The property key of the EditorModel.
256
- * @typeparam Service - The lookup service type.
257
- * @typeparam LookupModel - The field model type, defaults to the non-nullable type of the editor's property.
258
- * @typeparam FieldValue - The field value type, defaults to the editor's property type.
259
- *
260
- * @returns {FieldLookupDescriptor<LookupModel, EditorModel, Service, FieldValue>} Created field lookup descriptor.
261
- */
262
- addFieldLookupWithProvider(property, provider, type) {
263
- return this.addFieldLookupWithProviderUnsafe(property, provider, type);
264
- }
265
- /**
266
- * [UNSAFE] Adds a field lookup with a data provider or service to the editor model.
267
- * This function is UNSAFE because property is not type-checked.
268
- *
269
- * @param {string} property - The property key of the editor.
270
- * @param {FieldLookupProviderType<LookupModel, Service>} provider - The lookup provider or service for the field lookup.
271
- * @param {TypeDescriptor<LookupModel>?} type - Optional type descriptor for the field lookup.
272
- * @typeparam LookupModel - The field lookup model type.
273
- * @typeparam Service - The lookup service type.
274
- * @typeparam FieldValue - The value type of field on editor.
275
- *
276
- * @returns {FieldLookupDescriptor<LookupModel, EditorModel, Service, FieldValue>} - The field lookup descriptor added to the instance.
277
- */
278
- addFieldLookupWithProviderUnsafe(property, provider, type) {
279
- const cfg = fieldLookupGetProviderCfgObj(provider);
280
- const field = new FieldLookupDescriptor(property, {
281
- type: type?.classType,
282
- ...cfg
283
- });
284
- this.addFieldDescriptor(field);
285
- return field;
286
- }
287
- /**
288
- * Adds a field lookup with data provider or service and options value property for lookup model.
289
- *
290
- * @param {Property} property - The property key of the editor.
291
- * @param {FieldLookupProviderType<FieldModel, Service>} provider - The lookup provider.
292
- * @param {TypeDescriptor<FieldModel>} type - The type descriptor for the lookup model.
293
- * @param {LookupValueProperty} lookupOptionsValueProperty - The value property used as value in the lookup options.
294
- * @typeparam Property - The property key of the EditorModel.
295
- * @typeparam Service - The lookup service type.
296
- * @typeparam LookupModel - The field model type, defaults to the non-nullable type of the editor's property.
297
- * @typeparam LookupValueProperty - The property of lookup model type.
298
- * @typeparam FieldValue - The value type of field on editor.
299
- *
300
- * @returns {FieldLookupDescriptor<LookupModel, EditorModel, Service, FieldValue, ParentEditorModel>} - The field lookup descriptor.
301
- */
302
- addFieldLookupWithProviderAndOptionsValueProperty(property, provider, type, lookupOptionsValueProperty) {
303
- return this.addFieldLookupWithProviderAndOptionsValuePropertyUnsafe(property, provider, type, lookupOptionsValueProperty);
304
- }
305
- /**
306
- * [UNSAFE] Adds a field lookup with data provider or service and options value property for lookup model.
307
- * This function is UNSAFE because property is not type-checked.
308
- *
309
- * @param {string} property - The property key of the editor.
310
- * @param {FieldLookupProviderType<FieldModel, Service>} provider - The lookup provider.
311
- * @param {TypeDescriptor<FieldModel>} type - The type descriptor for the lookup model.
312
- * @param {string} lookupOptionsValueProperty - The value property used in the lookup options.
313
- * @typeparam Service - The service type.
314
- * @typeparam LookupModel - The field model type, defaults to the non-nullable type of the editor's property.
315
- * @typeparam FieldValue - The value type of field on editor.
316
- *
317
- * @returns {FieldLookupDescriptor<LookupModel, EditorModel, Service, FieldValue, ParentEditorModel>} - The field lookup descriptor.
318
- */
319
- addFieldLookupWithProviderAndOptionsValuePropertyUnsafe(property, provider, type, lookupOptionsValueProperty) {
320
- const cfg = fieldLookupGetProviderCfgObj(provider);
321
- const field = new FieldLookupDescriptor(property, {
322
- type: type?.classType,
323
- optionsValueProperty: lookupOptionsValueProperty,
324
- ...cfg
239
+ ...(opts?.serviceProvider ? fieldLookupGetProviderCfgObj(opts.serviceProvider) : {})
325
240
  });
326
241
  this.addFieldDescriptor(field);
327
242
  return field;
@@ -479,7 +394,7 @@ export class EditorDescriptorInst {
479
394
  createDefaultGroup() {
480
395
  this.createDefaultTabGroup();
481
396
  if (this._currentTabGroup?.fields.length === 0) {
482
- this.createFieldGroup(EditorDescriptorInst.defaultGroupName, null);
397
+ this.addFieldGroup(EditorDescriptorInst.defaultGroupName, null);
483
398
  }
484
399
  }
485
400
  /**
@@ -488,7 +403,7 @@ export class EditorDescriptorInst {
488
403
  */
489
404
  createDefaultTabGroup() {
490
405
  if (this._tabs.length === 0) {
491
- this.createTabGroup(EditorDescriptorInst.defaultGroupName, 'general.general');
406
+ this.addTabGroup(EditorDescriptorInst.defaultGroupName, 'general.general');
492
407
  }
493
408
  }
494
409
  /**
@@ -519,4 +434,4 @@ export class EditorDescriptorInst {
519
434
  return this._eventsSubject.asObservable();
520
435
  }
521
436
  }
522
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmRlc2NyaXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90YWJsZXZpZXcvYXBpL3NyYy9lZGl0b3IvZGVzY3JpcHRvcnMvZWRpdG9yLmRlc2NyaXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUU3QixPQUFPLEVBQWdCLG9CQUFvQixFQUF3RSxNQUFNLDZCQUE2QixDQUFDO0FBTXZKLE9BQU8sRUFBQyx5QkFBeUIsRUFBRSx1QkFBdUIsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBSTFGLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ2hFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBQyxvQkFBb0IsRUFBRSx1QkFBdUIsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZGLE9BQU8sRUFBQyxxQkFBcUIsRUFBRSx5QkFBeUIsRUFBMkIsNEJBQTRCLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUNsSixPQUFPLEVBQUMseUJBQXlCLEVBQUUsK0JBQStCLEVBQUUsZ0NBQWdDLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUVySSxPQUFPLEVBQUMsb0JBQW9CLEVBQTJCLE1BQU0sb0JBQW9CLENBQUM7QUFFbEYsTUFBTSxPQUFPLG9CQUFvQjthQUdOLHFCQUFnQixHQUFHLHlCQUF5QixBQUE1QixDQUE2QjtJQXdCcEU7Ozs7T0FJRztJQUNILFlBQW1CLEtBQW1DLEVBQUUsbUJBQW1CLEdBQUcsdUJBQXVCLENBQUMsSUFBSTtRQXpCMUcsY0FBYyxDQUFvQixVQUFLLEdBQWdELEVBQUUsQ0FBQztRQUMxRixjQUFjLENBQW9CLFlBQU8sR0FBZ0UsRUFBRSxDQUFDO1FBQzVHLGNBQWMsQ0FBVyxZQUFPLEdBQThDLEVBQUUsQ0FBQztRQVNqRixjQUFjLENB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LEVBQUUsS0FBSyxFQUFFLGNBQXdCLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRU0sZUFBZSxDQUFtQixRQUFnQixFQUFFLEtBQXdDLEVBQUUsY0FBc0I7UUFDdkgsSUFBSSxDQUFDLGlDQUFpQyxHQUFHLFFBQWtCLENBQUM7UUFDNUQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztRQUNoQyxJQUFJLENBQUMsMkJBQTJCLEdBQUcsY0FBd0IsQ0FBQztRQUM1RCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUV6QixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU0sU0FBUyxDQUFDLElBQXVCLEVBQUUsU0FBeUMsRUFBRSxJQUFpQztRQUNsSCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztZQUNyQixJQUFJLEVBQUUsSUFBSTtZQUNWLGFBQWEsRUFBRSxTQUFTO1lBQ3hCLElBQUksRUFBRSxTQUFTLENBQUMsSUFBaUI7WUFDakMsSUFBSSxFQUFFLElBQUk7U0FDYixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Zvcm1Hcm91cH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQge1N1YmplY3R9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge0FycmF5SXRlbVR5cGUsIENvbW1vbnNJbnRlcm5hbEVycm9yLCBFbnVtQ29uc3RhbnRUeXBlLCBJRWRpdG9yRGVzY3JpcHRvciwgSWRUeXBlLCBLZXlvZkFuZE9mVHlwZSwgTnVsbGFibGV9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvY29yZSc7XG5pbXBvcnQge0VudW1EZXNjcmlwdG9yLCBNb2RlbERlc2NyaXB0b3IsIFR5cGVEZXNjcmlwdG9yfSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL21vZGVsJztcbmltcG9ydCB7SVRhYmxlRGF0YVByb3ZpZGVyLCBUYWJsZURlc2NyaXB0b3JJbnN0fSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL3RhYmxlL2FwaSc7XG5cbmltcG9ydCB7VGFibGV2aWV3RGVzY3JpcHRvckluc3R9IGZyb20gJy4uLy4uL3RhYmxldmlldy9kZXNjcmlwdG9ycy90YWJsZXZpZXcuZGVzY3JpcHRvcic7XG5pbXBvcnQge0lGaWVsZHNNYW5hZ2VJbnRlcmZhY2V9IGZyb20gJy4uL21vZGVscy9lZGl0b3ItZmllbGRzLm1vZGVsJztcbmltcG9ydCB7RURJVE9SX0RFRkFVTFRfR1JPVVBfTkFNRSwgVGFibGV2aWV3RWRpdG9yVHlwZUVudW19IGZyb20gJy4uL21vZGVscy9lZGl0b3IubW9kZWwnO1xuaW1wb3J0IHtGb3JtVmFsaWRhdGlvbk1lc3NhZ2UsIEZvcm1WYWxpZGF0b3J9IGZyb20gJy4uL21vZGVscy9maWVsZC12YWxpZGF0aW9uLm1vZGVsJztcbmltcG9ydCB7Rm9ybUV2ZW50LCBGb3JtRXZlbnREYXRhLCBGb3JtRXZlbnRUeXBlRW51bX0gZnJvbSAnLi4vbW9kZWxzL2Zvcm0tZWRpdG9yLmV2ZW50JztcbmltcG9ydCB7SUZvcm1FZGl0b3JDb21wb25lbnR9IGZyb20gJy4uL21vZGVscy9mb3JtLWVkaXRvci5pbnRlcmZhY2UnO1xuaW1wb3J0IHtGaWVsZEFjdGlvbkRlc2NyaXB0b3J9IGZyb20gJy4vZmllbGQtYWN0aW9uLmRlc2NyaXB0b3InO1xuaW1wb3J0IHtBRmllbGREZXNjcmlwdG9yfSBmcm9tICcuL2ZpZWxkLWJhc2UuZGVzY3JpcHRvcic7XG5pbXBvcnQge0ZpZWxkR3JvdXBEZXNjcmlwdG9yLCBGaWVsZFRhYkdyb3VwRGVzY3JpcHRvcn0gZnJvbSAnLi9maWVsZC1ncm91cC5kZXNjcmlwdG9yJztcbmltcG9ydCB7RmllbGRMb29rdXBEZXNjcmlwdG9yLCBGaWVsZExvb2t1cEVudW1EZXNjcmlwdG9yLCBGaWVsZExvb2t1cFByb3ZpZGVyVHlwZSwgZmllbGRMb29rdXBHZXRQcm92aWRlckNmZ09ian0gZnJvbSAnLi9maWVsZC1sb29rdXAuZGVzY3JpcHRvcic7XG5pbXBvcnQge0ZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3IsIEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3IsIGZpZWxkTWFueVRvTWFueUdldFByb3ZpZGVyQ2ZnT2JqfSBmcm9tICcuL2ZpZWxkLW1hbnkuZGVzY3JpcHRvcic7XG5pbXBvcnQge0ZpZWxkVmFsaWRhdGlvbkRlc2NyaXB0b3JPcHRzVHlwZX0gZnJvbSAnLi9maWVsZC12YWxpZGF0aW9uLmRlc2NyaXB0b3InO1xuaW1wb3J0IHtGaWVsZElucHV0RGVzY3JpcHRvciwgRmllbGRJbnB1dERlc2NyaXB0b3JUeXBlfSBmcm9tICcuL2ZpZWxkLmRlc2NyaXB0b3InO1xuXG5leHBvcnQgY2xhc3MgRWRpdG9yRGVzY3JpcHRvckluc3Q8RWRpdG9yTW9kZWwsIFBhcmVudEVkaXRvck1vZGVsID0gdW5kZWZpbmVkPlxuICAgIGltcGxlbWVudHMgSUVkaXRvckRlc2NyaXB0b3I8RWRpdG9yTW9kZWwsIFBhcmVudEVkaXRvck1vZGVsPiwgSUZpZWxkc01hbmFnZUludGVyZmFjZTxFZGl0b3JNb2RlbCwgUGFyZW50RWRpdG9yTW9kZWw+XG57XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBkZWZhdWx0R3JvdXBOYW1lID0gRURJVE9SX0RFRkFVTFRfR1JPVVBfTkFNRTtcblxuICAgIC8qKiBAaWdub3JlICovIHByb3RlY3RlZCByZWFkb25seSBfbW9kZWw6IE1vZGVsRGVzY3JpcHRvcjxFZGl0b3JNb2RlbD47XG4gICAgLyoqIEBpZ25vcmUgKi8gcHJvdGVjdGVkIHJlYWRvbmx5IF90YWJsZXZpZXdFZGl0b3JUeXBlOiBUYWJsZXZpZXdFZGl0b3JUeXBlRW51bTtcbiAgICAvKiogQGlnbm9yZSAqLyBwcm90ZWN0ZWQgcmVhZG9ubHkgX3RhYnM6IEFycmF5PEZpZWxkVGFiR3JvdXBEZXNjcmlwdG9yPEVkaXRvck1vZGVsPj4gPSBbXTtcbiAgICAvKiogQGlnbm9yZSAqLyBwcm90ZWN0ZWQgcmVhZG9ubHkgX2dyb3VwczogQXJyYXk8RmllbGRHcm91cERlc2NyaXB0b3I8RWRpdG9yTW9kZWwsIFBhcmVudEVkaXRvck1vZGVsPj4gPSBbXTtcbiAgICAvKiogQGlnbm9yZSAqLyBwcm90ZWN0ZWQgX2ZpZWxkczogQXJyYXk8QUZpZWxkRGVzY3JpcHRvcjxhbnksIEVkaXRvck1vZGVsPj4gPSBbXTtcbiAgICAvKiogQGlnbm9yZSAqLyBwcm90ZWN0ZWQgX2N1cnJlbnRUYWJHcm91cD86IEZpZWxkVGFiR3JvdXBEZXNjcmlwdG9yPEVkaXRvck1vZGVsPjtcbiAgICAvKiogQGlnbm9yZSAqLyBwcm90ZWN0ZWQgX2N1cnJlbnRHcm91cD86IEZpZWxkR3JvdXBEZXNjcmlwdG9yPEVkaXRvck1vZGVsPjtcblxuICAgIC8qKiBAaWdub3JlICovIHByb3RlY3RlZCBfYXV0b1NhdmU/OiBib29sZWFuO1xuICAgIC8qKiBAaWdub3JlICovIHByb3RlY3RlZCBfYXV0b1NhdmVJZGVudGlmaWVyPzogc3RyaW5nO1xuXG4gICAgLyoqIEBpZ25vcmUgKi8gcHJvdGVjdGVkIF9hdXRvZm9jdXNPbkZpZWxkPzogYm9vbGVhbjtcblxuICAgIC8qKiBAaWdub3JlICovIHByb3RlY3RlZCBfZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIC8qKiBAaWdub3JlICovIHByb3RlY3RlZCBfaXNMb2NhbGl6ZWQgPSBmYWxzZTtcbiAgICAvKiogQGlnbm9yZSAqLyBwcm90ZWN0ZWQgX2xvY2FsaXphdGlvbkxvY2FsZVByb3BlcnR5Pzogc3RyaW5nO1xuICAgIC8qKiBAaWdub3JlICovIHByb3RlY3RlZCBfbG9jYWxpemF0aW9uTW9kZWw/OiBNb2RlbERlc2NyaXB0b3I8YW55PjtcbiAgICAvKiogQGlnbm9yZSAqLyBwcm90ZWN0ZWQgX2xvY2FsaXphdGlvbkxvY2FsaXphdGlvblByb3BlcnR5Pzogc3RyaW5nO1xuXG4gICAgLyoqIEBpZ25vcmUgKi8gcHJvdGVjdGVkIHJlYWRvbmx5IF9ldmVudHNTdWJqZWN0ID0gbmV3IFN1YmplY3Q8Rm9ybUV2ZW50PEVkaXRvck1vZGVsLCBQYXJlbnRFZGl0b3JNb2RlbD4+KCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG5ldyBpbnN0YW5jZSBvZiBlZGl0b3IgZGVzY3JpcHRvci5cbiAgICAgKiBAcGFyYW0gbW9kZWwgTW9kZWwgZGVzY3JpcHRvci5cbiAgICAgKiBAcGFyYW0gdGFibGV2aWV3RWRpdG9yVHlwZSBUeXBlIG9mIGVkaXRvciBpbiB0YWJsZXZpZXcgKGFkZCwgZWRpdCwgdmlldyBvciBub25lKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IobW9kZWw6IE1vZGVsRGVzY3JpcHRvcjxFZGl0b3JNb2RlbD4sIHRhYmxldmlld0VkaXRvclR5cGUgPSBUYWJsZXZpZXdFZGl0b3JUeXBlRW51bS5Ob25lKSB7XG4gICAgICAgIHRoaXMuX21vZGVsID0gbW9kZWw7XG4gICAgICAgIHRoaXMuX3RhYmxldmlld0VkaXRvclR5cGUgPSB0YWJsZXZpZXdFZGl0b3JUeXBlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vZGVsIGRlc2NyaXB0b3IgZm9yIGVkaXRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG1vZGVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbW9kZWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRWRpdG9yJ3MgdGFicy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRhYnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVkaXRvcidzIGZpZWxkcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZpZWxkcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpZWxkcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIGVkaXRvciBmb3IgdGFibGV2aWV3LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdGFibGV2aWV3RWRpdG9yVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYmxldmlld0VkaXRvclR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgZWRpdG9yIGlzIGRpc2FibGVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlzTG9jYWxpemVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNMb2NhbGl6ZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBsb2NhbGl6YXRpb25Mb2NhbGVQcm9wZXJ0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsaXphdGlvbkxvY2FsZVByb3BlcnR5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbG9jYWxpemF0aW9uTG9jYWxpemF0aW9uUHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGl6YXRpb25Mb2NhbGl6YXRpb25Qcm9wZXJ0eTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxvY2FsaXphdGlvbk1vZGVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxpemF0aW9uTW9kZWw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhdXRvU2F2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F1dG9TYXZlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYXV0b1NhdmVJZGVudGlmaWVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXV0b1NhdmVJZGVudGlmaWVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYXV0b2ZvY3VzT25GaWVsZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F1dG9mb2N1c09uRmllbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBuZXcgdGFiIGdyb3VwLiBOZXh0IGFkZGVkIGZpZWxkcyBhcmUgYWRkZWQgdG8gbmV3bHkgY3JlYXRlZCB0YWIgZ3JvdXAuXG4gICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgZ3JvdXAuXG4gICAgICogQHBhcmFtIHRpdGxlIFRpdGxlIGtleSBmb3IgdGhlIHRhYi5cbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlVGFiR3JvdXAobmFtZTogc3RyaW5nLCB0aXRsZT86IHN0cmluZyk6IEZpZWxkVGFiR3JvdXBEZXNjcmlwdG9yPEVkaXRvck1vZGVsPiB7XG4gICAgICAgIGNvbnN0IHRhYkdyb3VwID0gbmV3IEZpZWxkVGFiR3JvdXBEZXNjcmlwdG9yPEVkaXRvck1vZGVsPihuYW1lKTtcbiAgICAgICAgdGFiR3JvdXAud2l0aFRpdGxlKHRpdGxlKTtcbiAgICAgICAgdGhpcy5jcmVhdGVUYWJHcm91cERlc2NyaXB0b3IodGFiR3JvdXApO1xuICAgICAgICByZXR1cm4gdGFiR3JvdXA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBuZXcgZmllbGQgZ3JvdXAuIE5leHQgYWRkZWQgZmllbGRzIGFyZSBhZGRlZCB0byBuZXdseSBjcmVhdGVkIGZpZWxkIGdyb3VwLlxuICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGdyb3VwLlxuICAgICAqIEBwYXJhbSB0aXRsZSBUaXRsZSBrZXkgZm9yIHRoZSBncm91cC5cbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlRmllbGRHcm91cChuYW1lOiBzdHJpbmcsIHRpdGxlPzogc3RyaW5nIHwgbnVsbCk6IEZpZWxkR3JvdXBEZXNjcmlwdG9yPEVkaXRvck1vZGVsPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkR3JvdXAgPSBuZXcgRmllbGRHcm91cERlc2NyaXB0b3I8RWRpdG9yTW9kZWw+KG5hbWUpO1xuICAgICAgICBmaWVsZEdyb3VwLndpdGhUaXRsZSh0aXRsZSk7XG4gICAgICAgIHRoaXMuY3JlYXRlRmllbGRHcm91cERlc2NyaXB0b3IoZmllbGRHcm91cCk7XG4gICAgICAgIHJldHVybiBmaWVsZEdyb3VwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgZmllbGQgYnkgdGhlIG1vZGVsIHByb3BlcnR5IG5hbWUuXG4gICAgICogQHBhcmFtIHByb3BlcnR5IE1vZGVsIHByb3BlcnR5IG5hbWUuXG4gICAgICovXG4gICAgcHVibGljIGdldEZpZWxkKHByb3BlcnR5OiBrZXlvZiBFZGl0b3JNb2RlbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRGaWVsZFVuc2FmZShwcm9wZXJ0eSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgZmllbGQgYnkgdGhlIG1vZGVsIHByb3BlcnR5IG5hbWUgKFVOU0FGRSkuXG4gICAgICogQHBhcmFtIHByb3BlcnR5IE1vZGVsIHByb3BlcnR5IG5hbWUuXG4gICAgICovXG4gICAgcHVibGljIGdldEZpZWxkVW5zYWZlKHByb3BlcnR5OiBzdHJpbmcpOiBBRmllbGREZXNjcmlwdG9yPGFueSwgRWRpdG9yTW9kZWwsIFBhcmVudEVkaXRvck1vZGVsPiB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRzLmZpbmQoZiA9PiBmLnByb3BlcnR5ID09PSBwcm9wZXJ0eSkgPz8gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGZpZWxkIGJ5IHRoZSBtb2RlbCBwcm9wZXJ0eSBuYW1lLlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBNb2RlbCBwcm9wZXJ0eSBuYW1lLlxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVGaWVsZChwcm9wZXJ0eToga2V5b2YgRWRpdG9yTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlRmllbGRVbnNhZmUocHJvcGVydHkgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGZpZWxkIGJ5IHRoZSBtb2RlbCBwcm9wZXJ0eSBuYW1lIChVTlNBRkUpLlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBNb2RlbCBwcm9wZXJ0eSBuYW1lLlxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVGaWVsZFVuc2FmZShwcm9wZXJ0eTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZpZWxkSWR4ID0gdGhpcy5fZmllbGRzLmZpbmRJbmRleChmID0+IGYucHJvcGVydHkgPT09IHByb3BlcnR5KTtcbiAgICAgICAgaWYgKGZpZWxkSWR4IDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbW1vbnNJbnRlcm5hbEVycm9yKGBGaWVsZCAke3Byb3BlcnR5fSBkb2VzIG5vdCBleGlzdC5gLCB7bmFtZTogJ0VkaXRvckRlc2NyaXB0b3JFcnJvcid9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHRoaXMuX2dyb3Vwcykge1xuICAgICAgICAgICAgY29uc3QgZ3JvdXBGaWVsZElkeCA9IGdyb3VwLmZpZWxkcy5maW5kSW5kZXgoZiA9PiBmIGluc3RhbmNlb2YgQUZpZWxkRGVzY3JpcHRvciAmJiBmLnByb3BlcnR5ID09PSBwcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoZ3JvdXBGaWVsZElkeCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZ3JvdXAuZmllbGRzLnNwbGljZShncm91cEZpZWxkSWR4LCAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9maWVsZHMuc3BsaWNlKGZpZWxkSWR4LCAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGZpZWxkIGJ5IHRoZSBkZXNjcmlwdG9yLlxuICAgICAqIEBwYXJhbSBmaWVsZCBGaWVsZCBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRGaWVsZERlc2NyaXB0b3I8RmllbGRNb2RlbCwgRmllbGRWYWx1ZSA9IEZpZWxkTW9kZWw+KGZpZWxkOiBBRmllbGREZXNjcmlwdG9yPEZpZWxkTW9kZWwsIEVkaXRvck1vZGVsLCBGaWVsZFZhbHVlLCBQYXJlbnRFZGl0b3JNb2RlbD4pOiB0aGlzIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZpZWxkcy5zb21lKGYgPT4gZi5wcm9wZXJ0eSA9PT0gZmllbGQucHJvcGVydHkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQ29tbW9uc0ludGVybmFsRXJyb3IoYEZpZWxkICcke2ZpZWxkLnByb3BlcnR5fScgYWxyZWFkeSBleGlzdHMuYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jcmVhdGVEZWZhdWx0R3JvdXAoKTtcbiAgICAgICAgdGhpcy5fZmllbGRzLnB1c2goZmllbGQpO1xuICAgICAgICB0aGlzLl9jdXJyZW50R3JvdXA/LmFkZEZpZWxkKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBmaWVsZCBieSB0aGUgbW9kZWwgcHJvcGVydHkgbmFtZS5cbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgTW9kZWwgcHJvcGVydHkgbmFtZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkRmllbGQ8UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBFZGl0b3JNb2RlbCwgRmllbGRNb2RlbCA9IE5vbk51bGxhYmxlPEVkaXRvck1vZGVsW1Byb3BlcnR5XT4sIEZpZWxkVmFsdWUgPSBFZGl0b3JNb2RlbFtQcm9wZXJ0eV0+KHByb3BlcnR5OiBQcm9wZXJ0eSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRGaWVsZFVuc2FmZTxGaWVsZE1vZGVsLCBGaWVsZFZhbHVlPihwcm9wZXJ0eSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgZmllbGQgYnkgdGhlIG1vZGVsIHByb3BlcnR5IG5hbWUgKFVOU0FGRSkuIFByb3BlcnR5IGlzIG5vdCBjaGVja2VkIG9uIGVkaXRvciBtb2RlbC5cbiAgICAgKiBVc2Uge2FkZEZpZWxkfSBmb3Igc2FmZSB1c2FnZS5cbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgTW9kZWwgcHJvcGVydHkgbmFtZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkRmllbGRVbnNhZmU8RmllbGRNb2RlbCA9IEZpZWxkSW5wdXREZXNjcmlwdG9yVHlwZSwgRmllbGRWYWx1ZSA9IEZpZWxkTW9kZWw+KHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBuZXcgRmllbGRJbnB1dERlc2NyaXB0b3I8RWRpdG9yTW9kZWwsIEZpZWxkTW9kZWwsIEZpZWxkVmFsdWUsIFBhcmVudEVkaXRvck1vZGVsPihwcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuYWRkRmllbGREZXNjcmlwdG9yPEZpZWxkTW9kZWwsIEZpZWxkVmFsdWU+KGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWVsZHMoLi4ucHJvcGVydGllczogKGtleW9mIEVkaXRvck1vZGVsKVtdKTogdGhpcyB7XG4gICAgICAgIHByb3BlcnRpZXMuZm9yRWFjaChwID0+IHRoaXMuYWRkRmllbGQocCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmllbGRBY3Rpb24oYWN0aW9uTmFtZTogc3RyaW5nKTogRmllbGRBY3Rpb25EZXNjcmlwdG9yPEVkaXRvck1vZGVsLCBQYXJlbnRFZGl0b3JNb2RlbD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZEFjdGlvbkRlc2NyaXB0b3I8RWRpdG9yTW9kZWwsIFBhcmVudEVkaXRvck1vZGVsPihhY3Rpb25OYW1lKTtcbiAgICAgICAgdGhpcy5hZGRGaWVsZERlc2NyaXB0b3IoZmllbGQpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBsb29rdXAgZmllbGQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3BlcnR5fSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIGVkaXRvci5cbiAgICAgKiBAcGFyYW0ge1R5cGVEZXNjcmlwdG9yPEZpZWxkTW9kZWw+fSB0eXBlIC0gVGhlIHR5cGUgZGVzY3JpcHRvciBmb3IgdGhlIGxvb2t1cCBtb2RlbC5cbiAgICAgKiBAdHlwZXBhcmFtIFByb3BlcnR5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgRWRpdG9yTW9kZWwuXG4gICAgICogQHR5cGVwYXJhbSBMb29rdXBNb2RlbCAtIFRoZSBmaWVsZCBtb2RlbCB0eXBlLCBkZWZhdWx0cyB0byB0aGUgbm9uLW51bGxhYmxlIHR5cGUgb2YgdGhlIGVkaXRvcidzIHByb3BlcnR5LlxuICAgICAqIEB0eXBlcGFyYW0gRmllbGRWYWx1ZSAtIFRoZSB2YWx1ZSB0eXBlIG9mIGZpZWxkIG9uIGVkaXRvci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtGaWVsZExvb2t1cERlc2NyaXB0b3I8TG9va3VwTW9kZWwsIEVkaXRvck1vZGVsLCB1bmRlZmluZWQsIEZpZWxkVmFsdWU+fSAtIFRoZSBmaWVsZCBsb29rdXAgZGVzY3JpcHRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkRmllbGRMb29rdXA8UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBFZGl0b3JNb2RlbCwgTG9va3VwTW9kZWwgPSBOb25OdWxsYWJsZTxFZGl0b3JNb2RlbFtQcm9wZXJ0eV0+LCBGaWVsZFZhbHVlID0gRWRpdG9yTW9kZWxbUHJvcGVydHldPihcbiAgICAgICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgICAgICB0eXBlPzogVHlwZURlc2NyaXB0b3I8TG9va3VwTW9kZWw+XG4gICAgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZEZpZWxkTG9va3VwVW5zYWZlPExvb2t1cE1vZGVsLCBGaWVsZFZhbHVlPihwcm9wZXJ0eSBhcyBzdHJpbmcsIHR5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtVTlNBRkVdIEFkZHMgbG9va3VwIGZpZWxkLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgVU5TQUZFIGJlY2F1c2UgcHJvcGVydHkgaXMgbm90IHR5cGUtY2hlY2tlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBNb2RlbCBwcm9wZXJ0eSBuYW1lLlxuICAgICAqIEBwYXJhbSB7VHlwZURlc2NyaXB0b3I8RmllbGRNb2RlbD59IHR5cGUgLSBUaGUgdHlwZSBkZXNjcmlwdG9yIGZvciB0aGUgbG9va3VwIG1vZGVsIChkZWZpbmVzIDJuZCBnZW5lcmljKS5cbiAgICAgKiBAdHlwZXBhcmFtIExvb2t1cE1vZGVsIC0gVGhlIGZpZWxkIG1vZGVsIHR5cGUsIGRlZmF1bHRzIHRvIHRoZSBub24tbnVsbGFibGUgdHlwZSBvZiB0aGUgZWRpdG9yJ3MgcHJvcGVydHkuXG4gICAgICogQHR5cGVwYXJhbSBGaWVsZFZhbHVlIC0gVGhlIHZhbHVlIHR5cGUgb2YgZmllbGQgb24gZWRpdG9yLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0ZpZWxkTG9va3VwRGVzY3JpcHRvcjxMb29rdXBNb2RlbCwgRWRpdG9yTW9kZWwsIHVuZGVmaW5lZCwgRmllbGRWYWx1ZT59IC0gVGhlIGZpZWxkIGxvb2t1cCBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRGaWVsZExvb2t1cFVuc2FmZTxMb29rdXBNb2RlbCwgRmllbGRWYWx1ZSA9IExvb2t1cE1vZGVsPihwcm9wZXJ0eTogc3RyaW5nLCB0eXBlPzogVHlwZURlc2NyaXB0b3I8TG9va3VwTW9kZWw+KSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkTG9va3VwRGVzY3JpcHRvcjxMb29rdXBNb2RlbCwgRWRpdG9yTW9kZWwsIHVuZGVmaW5lZCwgRmllbGRWYWx1ZSwgUGFyZW50RWRpdG9yTW9kZWw+KHByb3BlcnR5LCB7XG4gICAgICAgICAgICB0eXBlOiB0eXBlPy5jbGFzc1R5cGVcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBmaWVsZCBsb29rdXAgd2l0aCBvcHRpb25zIHZhbHVlIHByb3BlcnR5IGZvciBsb29rdXAgbW9kZWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3BlcnR5fSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIGVkaXRvci5cbiAgICAgKiBAcGFyYW0ge1R5cGVEZXNjcmlwdG9yPEZpZWxkTW9kZWw+fSB0eXBlIC0gVGhlIHR5cGUgZGVzY3JpcHRvciBmb3IgdGhlIGxvb2t1cCBtb2RlbC5cbiAgICAgKiBAcGFyYW0ge0xvb2t1cFZhbHVlUHJvcGVydHl9IGxvb2t1cE9wdGlvbnNWYWx1ZVByb3BlcnR5IC0gVGhlIHZhbHVlIHByb3BlcnR5IHVzZWQgYXMgdmFsdWUgaW4gdGhlIGxvb2t1cCBvcHRpb25zLlxuICAgICAqIEB0eXBlcGFyYW0gUHJvcGVydHkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSBFZGl0b3JNb2RlbC5cbiAgICAgKiBAdHlwZXBhcmFtIExvb2t1cE1vZGVsIC0gVGhlIGZpZWxkIG1vZGVsIHR5cGUsIGRlZmF1bHRzIHRvIHRoZSBub24tbnVsbGFibGUgdHlwZSBvZiB0aGUgZWRpdG9yJ3MgcHJvcGVydHkuXG4gICAgICogQHR5cGVwYXJhbSBMb29rdXBWYWx1ZVByb3BlcnR5IC0gVGhlIHByb3BlcnR5IG9mIGxvb2t1cCBtb2RlbCB0eXBlLlxuICAgICAqIEB0eXBlcGFyYW0gRmllbGRWYWx1ZSAtIFRoZSB2YWx1ZSB0eXBlIG9mIGZpZWxkIG9uIGVkaXRvci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtGaWVsZExvb2t1cERlc2NyaXB0b3I8TG9va3VwTW9kZWwsIEVkaXRvck1vZGVsLCB1bmRlZmluZWQsIEZpZWxkVmFsdWU+fSAtIFRoZSBmaWVsZCBsb29rdXAgZGVzY3JpcHRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkRmllbGRMb29rdXBXaXRoT3B0aW9uc1ZhbHVlUHJvcGVydHk8XG4gICAgICAgIFByb3BlcnR5IGV4dGVuZHMga2V5b2YgRWRpdG9yTW9kZWwsXG4gICAgICAgIExvb2t1cE1vZGVsLFxuICAgICAgICBMb29rdXBWYWx1ZVByb3BlcnR5IGV4dGVuZHMgS2V5b2ZBbmRPZlR5cGU8TG9va3VwTW9kZWwsIEVkaXRvck1vZGVsW1Byb3BlcnR5XT4sXG4gICAgICAgIEZpZWxkVmFsdWUgPSBFZGl0b3JNb2RlbFtQcm9wZXJ0eV1cbiAgICA+KHByb3BlcnR5OiBQcm9wZXJ0eSwgdHlwZTogVHlwZURlc2NyaXB0b3I8TG9va3VwTW9kZWw+LCBsb29rdXBPcHRpb25zVmFsdWVQcm9wZXJ0eTogTG9va3VwVmFsdWVQcm9wZXJ0eSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRGaWVsZExvb2t1cFdpdGhPcHRpb25zVmFsdWVQcm9wZXJ0eVVuc2FmZTxMb29rdXBNb2RlbCwgRmllbGRWYWx1ZT4ocHJvcGVydHkgYXMgc3RyaW5nLCB0eXBlLCBsb29rdXBPcHRpb25zVmFsdWVQcm9wZXJ0eSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtVTlNBRkVdIEFkZHMgYSBmaWVsZCBsb29rdXAgd2l0aCBvcHRpb25zIHZhbHVlIHByb3BlcnR5IGZvciBsb29rdXAgbW9kZWwuXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBVTlNBRkUgYmVjYXVzZSBwcm9wZXJ0eSBpcyBub3QgdHlwZS1jaGVja2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSBlZGl0b3IuXG4gICAgICogQHBhcmFtIHtUeXBlRGVzY3JpcHRvcjxGaWVsZE1vZGVsPn0gdHlwZSAtIFRoZSB0eXBlIGRlc2NyaXB0b3IgZm9yIHRoZSBsb29rdXAgbW9kZWwuXG4gICAgICogQHBhcmFtIHtMb29rdXBWYWx1ZVByb3BlcnR5fSBsb29rdXBPcHRpb25zVmFsdWVQcm9wZXJ0eSAtIFRoZSB2YWx1ZSBwcm9wZXJ0eSB1c2VkIGFzIHZhbHVlIGluIHRoZSBsb29rdXAgb3B0aW9ucy5cbiAgICAgKiBAdHlwZXBhcmFtIFByb3BlcnR5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgRWRpdG9yTW9kZWwuXG4gICAgICogQHR5cGVwYXJhbSBMb29rdXBNb2RlbCAtIFRoZSBmaWVsZCBtb2RlbCB0eXBlLCBkZWZhdWx0cyB0byB0aGUgbm9uLW51bGxhYmxlIHR5cGUgb2YgdGhlIGVkaXRvcidzIHByb3BlcnR5LlxuICAgICAqIEB0eXBlcGFyYW0gTG9va3VwVmFsdWVQcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBvZiBsb29rdXAgbW9kZWwgdHlwZS5cbiAgICAgKiBAdHlwZXBhcmFtIEZpZWxkVmFsdWUgLSBUaGUgdmFsdWUgdHlwZSBvZiBmaWVsZCBvbiBlZGl0b3IuXG4gICAgICogQHR5cGVwYXJhbSBQYXJlbnRFZGl0b3JNb2RlbCAtIFRoZSB2YWx1ZSB0eXBlIG9mIHBhcmVudCBmb3JtLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0ZpZWxkTG9va3VwRGVzY3JpcHRvcjxMb29rdXBNb2RlbCwgRWRpdG9yTW9kZWwsIHVuZGVmaW5lZCwgRmllbGRWYWx1ZSwgUGFyZW50RWRpdG9yTW9kZWw+fSAtIFRoZSBmaWVsZCBsb29rdXAgZGVzY3JpcHRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkRmllbGRMb29rdXBXaXRoT3B0aW9uc1ZhbHVlUHJvcGVydHlVbnNhZmU8TG9va3VwTW9kZWwsIEZpZWxkVmFsdWUgPSBOdWxsYWJsZTxJZFR5cGU+PihcbiAgICAgICAgcHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgdHlwZTogVHlwZURlc2NyaXB0b3I8TG9va3VwTW9kZWw+LFxuICAgICAgICBsb29rdXBPcHRpb25zVmFsdWVQcm9wZXJ0eTogc3RyaW5nXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkTG9va3VwRGVzY3JpcHRvcjxMb29rdXBNb2RlbCwgRWRpdG9yTW9kZWwsIHVuZGVmaW5lZCwgRmllbGRWYWx1ZSwgUGFyZW50RWRpdG9yTW9kZWw+KHByb3BlcnR5LCB7XG4gICAgICAgICAgICB0eXBlOiB0eXBlPy5jbGFzc1R5cGUsXG4gICAgICAgICAgICBvcHRpb25zVmFsdWVQcm9wZXJ0eTogbG9va3VwT3B0aW9uc1ZhbHVlUHJvcGVydHlcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWRkRmllbGREZXNjcmlwdG9yPExvb2t1cE1vZGVsLCBGaWVsZFZhbHVlPihmaWVsZCk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgZmllbGQgbG9va3VwIHdpdGggYSBkYXRhIHByb3ZpZGVyIG9yIHNlcnZpY2UgdG8gdGhlIGVkaXRvciBtb2RlbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgZWRpdG9yLlxuICAgICAqIEBwYXJhbSB7RmllbGRMb29rdXBQcm92aWRlclR5cGU8TG9va3VwTW9kZWwsIFNlcnZpY2U+fSBwcm92aWRlciAtIFRoZSBmaWVsZCBsb29rdXAgZGF0YSBwcm92aWRlciBvciBzZXJ2aWNlLlxuICAgICAqIEBwYXJhbSB7VHlwZURlc2NyaXB0b3I8TG9va3VwTW9kZWw+fSBbdHlwZV0gLSBUaGUgdHlwZSBvZiBsb29rdXAgLSBpZiBkYXRhIHByb3ZpZGVyIGlzIHBhc3NlZCBhcyBwcmV2aW91cyBwYXJhbWV0ZXIsIHR5cGUgY2FuIGJlIG9taXR0ZWQuIElmIHNlcnZpY2UgaXMgcHJvdmlkZXIsIHR5cGUgcGFyYW1ldGVyIGlzIHByb3Bvc2VkIGluIGZhdm91ciBvZiBjb3JyZWN0IHR5cGluZy5cbiAgICAgKiBAdHlwZXBhcmFtIFByb3BlcnR5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgRWRpdG9yTW9kZWwuXG4gICAgICogQHR5cGVwYXJhbSBTZXJ2aWNlIC0gVGhlIGxvb2t1cCBzZXJ2aWNlIHR5cGUuXG4gICAgICogQHR5cGVwYXJhbSBMb29rdXBNb2RlbCAtIFRoZSBmaWVsZCBtb2RlbCB0eXBlLCBkZWZhdWx0cyB0byB0aGUgbm9uLW51bGxhYmxlIHR5cGUgb2YgdGhlIGVkaXRvcidzIHByb3BlcnR5LlxuICAgICAqIEB0eXBlcGFyYW0gRmllbGRWYWx1ZSAtIFRoZSBmaWVsZCB2YWx1ZSB0eXBlLCBkZWZhdWx0cyB0byB0aGUgZWRpdG9yJ3MgcHJvcGVydHkgdHlwZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtGaWVsZExvb2t1cERlc2NyaXB0b3I8TG9va3VwTW9kZWwsIEVkaXRvck1vZGVsLCBTZXJ2aWNlLCBGaWVsZFZhbHVlPn0gQ3JlYXRlZCBmaWVsZCBsb29rdXAgZGVzY3JpcHRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkRmllbGRMb29rdXBXaXRoUHJvdmlkZXI8UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBFZGl0b3JNb2RlbCwgU2VydmljZSwgTG9va3VwTW9kZWwgPSBOb25OdWxsYWJsZTxFZGl0b3JNb2RlbFtQcm9wZXJ0eV0+LCBGaWVsZFZhbHVlID0gRWRpdG9yTW9kZWxbUHJvcGVydHldPihcbiAgICAgICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgICAgICBwcm92aWRlcjogRmllbGRMb29rdXBQcm92aWRlclR5cGU8TG9va3VwTW9kZWwsIFNlcnZpY2U+LFxuICAgICAgICB0eXBlPzogVHlwZURlc2NyaXB0b3I8TG9va3VwTW9kZWw+XG4gICAgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZEZpZWxkTG9va3VwV2l0aFByb3ZpZGVyVW5zYWZlPExvb2t1cE1vZGVsLCBTZXJ2aWNlLCBGaWVsZFZhbHVlPihwcm9wZXJ0eSBhcyBzdHJpbmcsIHByb3ZpZGVyLCB0eXBlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbVU5TQUZFXSBBZGRzIGEgZmllbGQgbG9va3VwIHdpdGggYSBkYXRhIHByb3ZpZGVyIG9yIHNlcnZpY2UgdG8gdGhlIGVkaXRvciBtb2RlbC5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIFVOU0FGRSBiZWNhdXNlIHByb3BlcnR5IGlzIG5vdCB0eXBlLWNoZWNrZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSBlZGl0b3IuXG4gICAgICogQHBhcmFtIHtGaWVsZExvb2t1cFByb3ZpZGVyVHlwZTxMb29rdXBNb2RlbCwgU2VydmljZT59IHByb3ZpZGVyIC0gVGhlIGxvb2t1cCBwcm92aWRlciBvciBzZXJ2aWNlIGZvciB0aGUgZmllbGQgbG9va3VwLlxuICAgICAqIEBwYXJhbSB7VHlwZURlc2NyaXB0b3I8TG9va3VwTW9kZWw+P30gdHlwZSAtIE9wdGlvbmFsIHR5cGUgZGVzY3JpcHRvciBmb3IgdGhlIGZpZWxkIGxvb2t1cC5cbiAgICAgKiBAdHlwZXBhcmFtIExvb2t1cE1vZGVsIC0gVGhlIGZpZWxkIGxvb2t1cCBtb2RlbCB0eXBlLlxuICAgICAqIEB0eXBlcGFyYW0gU2VydmljZSAtIFRoZSBsb29rdXAgc2VydmljZSB0eXBlLlxuICAgICAqIEB0eXBlcGFyYW0gRmllbGRWYWx1ZSAtIFRoZSB2YWx1ZSB0eXBlIG9mIGZpZWxkIG9uIGVkaXRvci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtGaWVsZExvb2t1cERlc2NyaXB0b3I8TG9va3VwTW9kZWwsIEVkaXRvck1vZGVsLCBTZXJ2aWNlLCBGaWVsZFZhbHVlPn0gLSBUaGUgZmllbGQgbG9va3VwIGRlc2NyaXB0b3IgYWRkZWQgdG8gdGhlIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRGaWVsZExvb2t1cFdpdGhQcm92aWRlclVuc2FmZTxMb29rdXBNb2RlbCwgU2VydmljZSwgRmllbGRWYWx1ZSA9IExvb2t1cE1vZGVsPihcbiAgICAgICAgcHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgcHJvdmlkZXI6IEZpZWxkTG9va3VwUHJvdmlkZXJUeXBlPExvb2t1cE1vZGVsLCBTZXJ2aWNlPixcbiAgICAgICAgdHlwZT86IFR5cGVEZXNjcmlwdG9yPExvb2t1cE1vZGVsPlxuICAgICkge1xuICAgICAgICBjb25zdCBjZmcgPSBmaWVsZExvb2t1cEdldFByb3ZpZGVyQ2ZnT2JqKHByb3ZpZGVyKTtcbiAgICAgICAgY29uc3QgZmllbGQgPSBuZXcgRmllbGRMb29rdXBEZXNjcmlwdG9yPExvb2t1cE1vZGVsLCBFZGl0b3JNb2RlbCwgU2VydmljZSwgRmllbGRWYWx1ZSwgUGFyZW50RWRpdG9yTW9kZWw+KHByb3BlcnR5LCB7XG4gICAgICAgICAgICB0eXBlOiB0eXBlPy5jbGFzc1R5cGUsXG4gICAgICAgICAgICAuLi5jZmdcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBmaWVsZCBsb29rdXAgd2l0aCBkYXRhIHByb3ZpZGVyIG9yIHNlcnZpY2UgYW5kIG9wdGlvbnMgdmFsdWUgcHJvcGVydHkgZm9yIGxvb2t1cCBtb2RlbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgZWRpdG9yLlxuICAgICAqIEBwYXJhbSB7RmllbGRMb29rdXBQcm92aWRlclR5cGU8RmllbGRNb2RlbCwgU2VydmljZT59IHByb3ZpZGVyIC0gVGhlIGxvb2t1cCBwcm92aWRlci5cbiAgICAgKiBAcGFyYW0ge1R5cGVEZXNjcmlwdG9yPEZpZWxkTW9kZWw+fSB0eXBlIC0gVGhlIHR5cGUgZGVzY3JpcHRvciBmb3IgdGhlIGxvb2t1cCBtb2RlbC5cbiAgICAgKiBAcGFyYW0ge0xvb2t1cFZhbHVlUHJvcGVydHl9IGxvb2t1cE9wdGlvbnNWYWx1ZVByb3BlcnR5IC0gVGhlIHZhbHVlIHByb3BlcnR5IHVzZWQgYXMgdmFsdWUgaW4gdGhlIGxvb2t1cCBvcHRpb25zLlxuICAgICAqIEB0eXBlcGFyYW0gUHJvcGVydHkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSBFZGl0b3JNb2RlbC5cbiAgICAgKiBAdHlwZXBhcmFtIFNlcnZpY2UgLSBUaGUgbG9va3VwIHNlcnZpY2UgdHlwZS5cbiAgICAgKiBAdHlwZXBhcmFtIExvb2t1cE1vZGVsIC0gVGhlIGZpZWxkIG1vZGVsIHR5cGUsIGRlZmF1bHRzIHRvIHRoZSBub24tbnVsbGFibGUgdHlwZSBvZiB0aGUgZWRpdG9yJ3MgcHJvcGVydHkuXG4gICAgICogQHR5cGVwYXJhbSBMb29rdXBWYWx1ZVByb3BlcnR5IC0gVGhlIHByb3BlcnR5IG9mIGxvb2t1cCBtb2RlbCB0eXBlLlxuICAgICAqIEB0eXBlcGFyYW0gRmllbGRWYWx1ZSAtIFRoZSB2YWx1ZSB0eXBlIG9mIGZpZWxkIG9uIGVkaXRvci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtGaWVsZExvb2t1cERlc2NyaXB0b3I8TG9va3VwTW9kZWwsIEVkaXRvck1vZGVsLCBTZXJ2aWNlLCBGaWVsZFZhbHVlLCBQYXJlbnRFZGl0b3JNb2RlbD59IC0gVGhlIGZpZWxkIGxvb2t1cCBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIGFkZEZpZWxkTG9va3VwV2l0aFByb3ZpZGVyQW5kT3B0aW9uc1ZhbHVlUHJvcGVydHk8XG4gICAgICAgIFByb3BlcnR5IGV4dGVuZHMga2V5b2YgRWRpdG9yTW9kZWwsXG4gICAgICAgIFNlcnZpY2UsXG4gICAgICAgIExvb2t1cE1vZGVsLFxuICAgICAgICBMb29rdXBWYWx1ZVByb3BlcnR5IGV4dGVuZHMgS2V5b2ZBbmRPZlR5cGU8TG9va3VwTW9kZWwsIEVkaXRvck1vZGVsW1Byb3BlcnR5XT4sXG4gICAgICAgIEZpZWxkVmFsdWUgPSBFZGl0b3JNb2RlbFtQcm9wZXJ0eV1cbiAgICA+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIHByb3ZpZGVyOiBGaWVsZExvb2t1cFByb3ZpZGVyVHlwZTxMb29rdXBNb2RlbCwgU2VydmljZT4sXG4gICAgICAgIHR5cGU6IFR5cGVEZXNjcmlwdG9yPExvb2t1cE1vZGVsPixcbiAgICAgICAgbG9va3VwT3B0aW9uc1ZhbHVlUHJvcGVydHk6IExvb2t1cFZhbHVlUHJvcGVydHlcbiAgICApOiBGaWVsZExvb2t1cERlc2NyaXB0b3I8TG9va3VwTW9kZWwsIEVkaXRvck1vZGVsLCBTZXJ2aWNlLCBGaWVsZFZhbHVlLCBQYXJlbnRFZGl0b3JNb2RlbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRGaWVsZExvb2t1cFdpdGhQcm92aWRlckFuZE9wdGlvbnNWYWx1ZVByb3BlcnR5VW5zYWZlKHByb3BlcnR5IGFzIHN0cmluZywgcHJvdmlkZXIsIHR5cGUsIGxvb2t1cE9wdGlvbnNWYWx1ZVByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW1VOU0FGRV0gQWRkcyBhIGZpZWxkIGxvb2t1cCB3aXRoIGRhdGEgcHJvdmlkZXIgb3Igc2VydmljZSBhbmQgb3B0aW9ucyB2YWx1ZSBwcm9wZXJ0eSBmb3IgbG9va3VwIG1vZGVsLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgVU5TQUZFIGJlY2F1c2UgcHJvcGVydHkgaXMgbm90IHR5cGUtY2hlY2tlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIGVkaXRvci5cbiAgICAgKiBAcGFyYW0ge0ZpZWxkTG9va3VwUHJvdmlkZXJUeXBlPEZpZWxkTW9kZWwsIFNlcnZpY2U+fSBwcm92aWRlciAtIFRoZSBsb29rdXAgcHJvdmlkZXIuXG4gICAgICogQHBhcmFtIHtUeXBlRGVzY3JpcHRvcjxGaWVsZE1vZGVsPn0gdHlwZSAtIFRoZSB0eXBlIGRlc2NyaXB0b3IgZm9yIHRoZSBsb29rdXAgbW9kZWwuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxvb2t1cE9wdGlvbnNWYWx1ZVByb3BlcnR5IC0gVGhlIHZhbHVlIHByb3BlcnR5IHVzZWQgaW4gdGhlIGxvb2t1cCBvcHRpb25zLlxuICAgICAqIEB0eXBlcGFyYW0gU2VydmljZSAtIFRoZSBzZXJ2aWNlIHR5cGUuXG4gICAgICogQHR5cGVwYXJhbSBMb29rdXBNb2RlbCAtIFRoZSBmaWVsZCBtb2RlbCB0eXBlLCBkZWZhdWx0cyB0byB0aGUgbm9uLW51bGxhYmxlIHR5cGUgb2YgdGhlIGVkaXRvcidzIHByb3BlcnR5LlxuICAgICAqIEB0eXBlcGFyYW0gRmllbGRWYWx1ZSAtIFRoZSB2YWx1ZSB0eXBlIG9mIGZpZWxkIG9uIGVkaXRvci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtGaWVsZExvb2t1cERlc2NyaXB0b3I8TG9va3VwTW9kZWwsIEVkaXRvck1vZGVsLCBTZXJ2aWNlLCBGaWVsZFZhbHVlLCBQYXJlbnRFZGl0b3JNb2RlbD59IC0gVGhlIGZpZWxkIGxvb2t1cCBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIGFkZEZpZWxkTG9va3VwV2l0aFByb3ZpZGVyQW5kT3B0aW9uc1ZhbHVlUHJvcGVydHlVbnNhZmU8U2VydmljZSwgTG9va3VwTW9kZWwsIEZpZWxkVmFsdWUgPSBMb29rdXBNb2RlbD4oXG4gICAgICAgIHByb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIHByb3ZpZGVyOiBGaWVsZExvb2t1cFByb3ZpZGVyVHlwZTxMb29rdXBNb2RlbCwgU2VydmljZT4sXG4gICAgICAgIHR5cGU6IFR5cGVEZXNjcmlwdG9yPExvb2t1cE1vZGVsPixcbiAgICAgICAgbG9va3VwT3B0aW9uc1ZhbHVlUHJvcGVydHk6IHN0cmluZ1xuICAgICk6IEZpZWxkTG9va3VwRGVzY3JpcHRvcjxMb29rdXBNb2RlbCwgRWRpdG9yTW9kZWwsIFNlcnZpY2UsIEZpZWxkVmFsdWUsIFBhcmVudEVkaXRvck1vZGVsPiB7XG4gICAgICAgIGNvbnN0IGNmZyA9IGZpZWxkTG9va3VwR2V0UHJvdmlkZXJDZmdPYmoocHJvdmlkZXIpO1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZExvb2t1cERlc2NyaXB0b3I8TG9va3VwTW9kZWwsIEVkaXRvck1vZGVsLCBTZXJ2aWNlLCBGaWVsZFZhbHVlLCBQYXJlbnRFZGl0b3JNb2RlbD4ocHJvcGVydHksIHtcbiAgICAgICAgICAgIHR5cGU6IHR5cGU/LmNsYXNzVHlwZSxcbiAgICAgICAgICAgIG9wdGlvbnNWYWx1ZVByb3BlcnR5OiBsb29rdXBPcHRpb25zVmFsdWVQcm9wZXJ0eSxcbiAgICAgICAgICAgIC4uLmNmZ1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hZGRGaWVsZERlc2NyaXB0b3IoZmllbGQpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZpZWxkTG9va3VwRW51bTxQcm9wZXJ0eSBleHRlbmRzIGtleW9mIEVkaXRvck1vZGVsLCBFbnVtIGV4dGVuZHMgTm9uTnVsbGFibGU8RWRpdG9yTW9kZWxbUHJvcGVydHldPj4oXG4gICAgICAgIHByb3BlcnR5OiBrZXlvZiBFZGl0b3JNb2RlbCxcbiAgICAgICAgZW51bURlc2M6IEVudW1EZXNjcmlwdG9yPEVudW0+LFxuICAgICAgICBvcHRpb25zPzogQXJyYXk8RW51bT5cbiAgICApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkRmllbGRMb29rdXBFbnVtVW5zYWZlPEVudW0+KHByb3BlcnR5IGFzIHN0cmluZywgZW51bURlc2MsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgZW51bSBsb29rdXAgZmllbGQuXG4gICAgICogQHBhcmFtIHByb3BlcnR5IE1vZGVsJ3MgcHJvcGVydHkgbmFtZS5cbiAgICAgKiBAcGFyYW0gZW51bURlc2MgVHlwZSBvZiBlbnVtIG9yIGVudW0gZGVzY3JpcHRvci5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBQcm92aWRlcyBzdWJzZXQgb2YgZW51bSdzIGF2YWlsYWJsZSBjb25zdGFudHMuXG4gICAgICovXG4gICAgcHVibGljIGFkZEZpZWxkTG9va3VwRW51bVVuc2FmZTxFbnVtID0gRW51bUNvbnN0YW50VHlwZT4ocHJvcGVydHk6IHN0cmluZywgZW51bURlc2M6IEVudW1EZXNjcmlwdG9yPEVudW0+LCBvcHRpb25zPzogQXJyYXk8RW51bT4pIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBuZXcgRmllbGRMb29rdXBFbnVtRGVzY3JpcHRvcjxFbnVtLCBFZGl0b3JNb2RlbCwgUGFyZW50RWRpdG9yTW9kZWw+KHByb3BlcnR5LCBlbnVtRGVzYywgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgdGFibGUvZGV0YWlscy9hZGQvZWRpdCBmaWVsZCBmb3Igb25lLXRvLW1hbnkgKDE6bikgcmVsYXRpb25zLlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBNb2RlbCdzIHByb3BlcnR5IG5hbWUuXG4gICAgICogQHBhcmFtIHRhYmxldmlld0Rlc2NyaXB0b3IgVGFibGV2aWV3IGRlc2NyaXB0b3IgZm9yIHJlbGF0ZWQgbW9kZWwuXG4gICAgICovXG4gICAgcHVibGljIGFkZEZpZWxkTWFueUVkaXRvcjxQcm9wZXJ0eSBleHRlbmRzIGtleW9mIEVkaXRvck1vZGVsLCBGaWVsZE1vZGVsID0gQXJyYXlJdGVtVHlwZTxFZGl0b3JNb2RlbFtQcm9wZXJ0eV0+LCBGaWVsZFZhbHVlID0gRWRpdG9yTW9kZWxbUHJvcGVydHldPihcbiAgICAgICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgICAgICB0YWJsZXZpZXdEZXNjcmlwdG9yOiBUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsLCBhbnksIGFueSwgRWRpdG9yTW9kZWw+XG4gICAgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZEZpZWxkTWFueUVkaXRvclVuc2FmZTxGaWVsZE1vZGVsLCBGaWVsZFZhbHVlPihwcm9wZXJ0eSBhcyBzdHJpbmcsIHRhYmxldmlld0Rlc2NyaXB0b3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgdGFibGUvZGV0YWlscy9hZGQvZWRpdCBmaWVsZCBmb3Igb25lLXRvLW1hbnkgKDE6bikgcmVsYXRpb25zIChVTlNBRkUpLlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBNb2RlbCdzIHByb3BlcnR5IG5hbWUuXG4gICAgICogQHBhcmFtIHRhYmxldmlld0Rlc2NyaXB0b3IgVGFibGV2aWV3IGRlc2NyaXB0b3IgZm9yIHJlbGF0ZWQgbW9kZWwuXG4gICAgICovXG4gICAgcHVibGljIGFkZEZpZWxkTWFueUVkaXRvclVuc2FmZTxGaWVsZE1vZGVsLCBGaWVsZFZhbHVlID0gRmllbGRNb2RlbFtdPihcbiAgICAgICAgcHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgdGFibGV2aWV3RGVzY3JpcHRvcjogVGFibGV2aWV3RGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbCwgYW55LCBhbnksIEVkaXRvck1vZGVsPlxuICAgICk6IEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3I8RmllbGRNb2RlbCwgRWRpdG9yTW9kZWwsIEZpZWxkVmFsdWUsIFBhcmVudEVkaXRvck1vZGVsPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3I8RmllbGRNb2RlbCwgRWRpdG9yTW9kZWwsIEZpZWxkVmFsdWUsIFBhcmVudEVkaXRvck1vZGVsPihwcm9wZXJ0eSwgdGFibGV2aWV3RGVzY3JpcHRvcik7XG4gICAgICAgIHRoaXMuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWVsZE1hbnlUb01hbnlFZGl0b3I8UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBFZGl0b3JNb2RlbCwgU2VydmljZVR5cGUsIEZpZWxkTW9kZWwgPSBBcnJheUl0ZW1UeXBlPEVkaXRvck1vZGVsW1Byb3BlcnR5XT4sIEZpZWxkVmFsdWUgPSBFZGl0b3JNb2RlbFtQcm9wZXJ0eV0+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIG1haW5UYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbD4sXG4gICAgICAgIGxvb2t1cFRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsPixcbiAgICAgICAgbG9va3VwRGF0YVByb3ZpZGVyOiBJVGFibGVEYXRhUHJvdmlkZXI8RmllbGRNb2RlbCwgU2VydmljZVR5cGU+XG4gICAgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZEZpZWxkTWFueVRvTWFueUVkaXRvclVuc2FmZTxGaWVsZE1vZGVsLCBTZXJ2aWNlVHlwZSwgRmllbGRWYWx1ZT4ocHJvcGVydHkgYXMgc3RyaW5nLCBtYWluVGFibGVEZXNjcmlwdG9yLCBsb29rdXBUYWJsZURlc2NyaXB0b3IsIGxvb2t1cERhdGFQcm92aWRlcik7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZpZWxkTWFueVRvTWFueUVkaXRvclVuc2FmZTxGaWVsZE1vZGVsLCBTZXJ2aWNlVHlwZSwgRmllbGRWYWx1ZSA9IEZpZWxkTW9kZWxbXT4oXG4gICAgICAgIHByb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIG1haW5UYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbD4sXG4gICAgICAgIGxvb2t1cFRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsPixcbiAgICAgICAgbG9va3VwRGF0YVByb3ZpZGVyOiBJVGFibGVEYXRhUHJvdmlkZXI8RmllbGRNb2RlbCwgU2VydmljZVR5cGU+XG4gICAgKTogRmllbGRNYW55VG9NYW55RWRpdG9yRGVzY3JpcHRvcjxGaWVsZE1vZGVsLCBFZGl0b3JNb2RlbCwgU2VydmljZVR5cGUsIEZpZWxkVmFsdWUsIFBhcmVudEVkaXRvck1vZGVsPiB7XG4gICAgICAgIGNvbnN0IGNmZyA9IGZpZWxkTWFueVRvTWFueUdldFByb3ZpZGVyQ2ZnT2JqKGxvb2t1cERhdGFQcm92aWRlcik7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3I8RmllbGRNb2RlbCwgRWRpdG9yTW9kZWwsIFNlcnZpY2VUeXBlLCBGaWVsZFZhbHVlLCBQYXJlbnRFZGl0b3JNb2RlbD4oXG4gICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgIG1haW5UYWJsZURlc2NyaXB0b3IsXG4gICAgICAgICAgICBsb29rdXBUYWJsZURlc2NyaXB0b3IsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4uY2ZnXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2FibGVzIGZpZWxkIG9uIGVkaXRvci5cbiAgICAgKiBAcGFyYW0gZGlzYWJsZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aERpc2FibGVkKGRpc2FibGVkID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGdyb3VwIHZhbGlkYXRvciB0byBlZGl0b3IuXG4gICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdmFsaWRhdGlvbi5cbiAgICAgKiBAcGFyYW0gdmFsaWRhdG9yIEZpZWxkIHZhbGlkYXRvciBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBGaWVsZCB2YWxpZGF0aW9uIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIG9wdHMgQWRkaXRpb25hbCBjb25maWd1cmF0aW9uIGZvciB2YWxpZGF0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoVmFsaWRhdGlvbjxWYWx1ZSA9IEVkaXRvck1vZGVsPihcbiAgICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgICB2YWxpZGF0b3I/OiBGb3JtVmFsaWRhdG9yPFZhbHVlLCBQYXJlbnRFZGl0b3JNb2RlbD4sXG4gICAgICAgIG1lc3NhZ2U/OiBGb3JtVmFsaWRhdGlvbk1lc3NhZ2U8VmFsdWUsIFBhcmVudEVkaXRvck1vZGVsPixcbiAgICAgICAgb3B0cz86IEZpZWxkVmFsaWRhdGlvbkRlc2NyaXB0b3JPcHRzVHlwZTxrZXlvZiBFZGl0b3JNb2RlbD5cbiAgICApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aFZhbGlkYXRpb25VbnNhZmUobmFtZSwgdmFsaWRhdG9yLCBtZXNzYWdlLCBvcHRzIGFzIEZpZWxkVmFsaWRhdGlvbkRlc2NyaXB0b3JPcHRzVHlwZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBncm91cCB2YWxpZGF0b3IgdG8gZWRpdG9yLlxuICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHZhbGlkYXRpb24uXG4gICAgICogQHBhcmFtIHZhbGlkYXRvciBGaWVsZCB2YWxpZGF0b3IgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgRmllbGQgdmFsaWRhdGlvbiBtZXNzYWdlLlxuICAgICAqIEBwYXJhbSBvcHRzIEFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgdmFsaWRhdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aFZhbGlkYXRpb25VbnNhZmU8VmFsdWUgPSBFZGl0b3JNb2RlbD4oXG4gICAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgICAgdmFsaWRhdG9yPzogRm9ybVZhbGlkYXRvcjxWYWx1ZSwgUGFyZW50RWRpdG9yTW9kZWw+LFxuICAgICAgICBtZXNzYWdlPzogRm9ybVZhbGlkYXRpb25NZXNzYWdlPFZhbHVlLCBQYXJlbnRFZGl0b3JNb2RlbD4sXG4gICAgICAgIG9wdHM/OiBGaWVsZFZhbGlkYXRpb25EZXNjcmlwdG9yT3B0c1R5cGVcbiAgICApIHtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRHcm91cCkge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudEdyb3VwLndpdGhWYWxpZGF0aW9uKG5hbWUsIHZhbGlkYXRvciwgbWVzc2FnZSwgb3B0cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhBdXRvU2F2ZShlbmFibGVkID0gdHJ1ZSwgYXV0b1NhdmVJZGVudGlmaWVyPzogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2F1dG9TYXZlID0gZW5hYmxlZDtcbiAgICAgICAgdGhpcy5fYXV0b1NhdmVJZGVudGlmaWVyID0gYXV0b1NhdmVJZGVudGlmaWVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEF1dG9mb2N1c09uRmllbGQoZW5hYmxlZCA9IHRydWUpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fYXV0b2ZvY3VzT25GaWVsZCA9IGVuYWJsZWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjb3B5IG9mIGVkaXRvciBkZXNjcmlwdG9yIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29weSgpOiBFZGl0b3JEZXNjcmlwdG9ySW5zdDxFZGl0b3JNb2RlbCwgUGFyZW50RWRpdG9yTW9kZWw+IHtcbiAgICAgICAgY29uc3QgZWRpdG9yID0gbmV3IEVkaXRvckRlc2NyaXB0b3JJbnN0PEVkaXRvck1vZGVsLCBQYXJlbnRFZGl0b3JNb2RlbD4odGhpcy5tb2RlbC5jb3B5KCksIHRoaXMudGFibGV2aWV3RWRpdG9yVHlwZSk7XG5cbiAgICAgICAgZWRpdG9yLl9maWVsZHMgPSB0aGlzLl9maWVsZHMubWFwKGYgPT4gZi5jb3B5KCkpO1xuICAgICAgICBjb25zdCBmaWVsZHNNYXAgPSBlZGl0b3IuZmllbGRzLnJlZHVjZSgobWFwLCBmaWVsZCkgPT4ge1xuICAgICAgICAgICAgbWFwLnNldChmaWVsZC5wcm9wZXJ0eSwgZmllbGQpO1xuICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgfSwgbmV3IE1hcDxzdHJpbmcsIGFueT4oKSk7XG5cbiAgICAgICAgZm9yIChjb25zdCB0YWJHcm91cCBvZiB0aGlzLl90YWJzKSB7XG4gICAgICAgICAgICBjb25zdCB0YWJHcm91cENvcHkgPSB0YWJHcm91cC5jb3B5KHRydWUpO1xuICAgICAgICAgICAgLy8gc2V0IGZpZWxkc1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWJHcm91cC5maWVsZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cCA9IHRhYkdyb3VwLmZpZWxkc1tpXTtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cENvcHkgPSB0YWJHcm91cENvcHkuZmllbGRzW2ldO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBncm91cC5maWVsZHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmllbGRDb3B5ID0gZmllbGRzTWFwLmdldChncm91cC5maWVsZHNbal0ucHJvcGVydHkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkQ29weSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbW1vbnNJbnRlcm5hbEVycm9yKGBDb3VsZCBub3QgY29weSBlZGl0b3IgZGVzY3JpcHRvcjogZmllbGQgJyR7Z3JvdXAuZmllbGRzW2pdLnByb3BlcnR5fScgKHRhYiAnJHt0YWJHcm91cC5uYW1lfScsIGdyb3VwICR7Z3JvdXAubmFtZX0nKS5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBncm91cENvcHkuYWRkRmllbGQoZmllbGRDb3B5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWRpdG9yLl9ncm91cHMucHVzaChncm91cENvcHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWRpdG9yLl90YWJzLnB1c2godGFiR3JvdXBDb3B5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVkaXRvci5fY3VycmVudFRhYkdyb3VwID0gZWRpdG9yLl90YWJzLmxlbmd0aCA+IDAgPyBlZGl0b3IuX3RhYnNbZWRpdG9yLl90YWJzLmxlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZWRpdG9yLl9jdXJyZW50VGFiR3JvdXApIHtcbiAgICAgICAgICAgIGVkaXRvci5fY3VycmVudEdyb3VwID0gZWRpdG9yLl9jdXJyZW50VGFiR3JvdXAuZmllbGRzLmxlbmd0aCA+IDAgPyBlZGl0b3IuX2N1cnJlbnRUYWJHcm91cC5maWVsZHNbZWRpdG9yLl9jdXJyZW50VGFiR3JvdXAuZmllbGRzLmxlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgZWRpdG9yLl9kaXNhYmxlZCA9IHRoaXMuX2Rpc2FibGVkO1xuICAgICAgICBlZGl0b3IuX2F1dG9TYXZlID0gdGhpcy5fYXV0b1NhdmU7XG4gICAgICAgIGVkaXRvci5fYXV0b1NhdmVJZGVudGlmaWVyID0gdGhpcy5fYXV0b1NhdmVJZGVudGlmaWVyO1xuICAgICAgICBlZGl0b3IuX2F1dG9mb2N1c09uRmllbGQgPSB0aGlzLl9hdXRvZm9jdXNPbkZpZWxkO1xuICAgICAgICBlZGl0b3IuX2lzTG9jYWxpemVkID0gdGhpcy5faXNMb2NhbGl6ZWQ7XG4gICAgICAgIGVkaXRvci5fbG9jYWxpemF0aW9uTG9jYWxlUHJvcGVydHkgPSB0aGlzLl9sb2NhbGl6YXRpb25Mb2NhbGVQcm9wZXJ0eTtcbiAgICAgICAgZWRpdG9yLl9sb2NhbGl6YXRpb25Nb2RlbCA9IHRoaXMuX2xvY2FsaXphdGlvbk1vZGVsO1xuICAgICAgICBlZGl0b3IuX2xvY2FsaXphdGlvbkxvY2FsaXphdGlvblByb3BlcnR5ID0gdGhpcy5fbG9jYWxpemF0aW9uTG9jYWxpemF0aW9uUHJvcGVydHk7XG5cbiAgICAgICAgcmV0dXJuIGVkaXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVkIGdyb3VwIGZyb20gZmllbGQgZ3JvdXAgZGVzY3JpcHRvci5cbiAgICAgKiBAcGFyYW0gZmllbGRHcm91cCBGaWVsZCBncm91cCBkZXNjcmlwdG9yLlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVGaWVsZEdyb3VwRGVzY3JpcHRvcihmaWVsZEdyb3VwOiBGaWVsZEdyb3VwRGVzY3JpcHRvcjxFZGl0b3JNb2RlbCwgUGFyZW50RWRpdG9yTW9kZWw+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuY3JlYXRlRGVmYXVsdFRhYkdyb3VwKCk7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRHcm91cCA9IGZpZWxkR3JvdXA7XG4gICAgICAgIHRoaXMuX2dyb3Vwcy5wdXNoKGZpZWxkR3JvdXApO1xuICAgICAgICB0aGlzLl9jdXJyZW50VGFiR3JvdXA/LmFkZEZpZWxkKGZpZWxkR3JvdXApO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRhYiBncm91cCBmcm9tIHRhYiBncm91cCBkZXNjcmlwdG9yLlxuICAgICAqIEBwYXJhbSB0YWJHcm91cCBUYWIgZ3JvdXAgZGVzY3JpcHRvci5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY3JlYXRlVGFiR3JvdXBEZXNjcmlwdG9yKHRhYkdyb3VwOiBGaWVsZFRhYkdyb3VwRGVzY3JpcHRvcjxFZGl0b3JNb2RlbD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fY3VycmVudFRhYkdyb3VwID0gdGFiR3JvdXA7XG4gICAgICAgIHRoaXMuX3RhYnMucHVzaCh0YWJHcm91cCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgZGVmYXVsdCBmaWVsZCBncm91cC5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZURlZmF1bHRHcm91cCgpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVEZWZhdWx0VGFiR3JvdXAoKTtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUYWJHcm91cD8uZmllbGRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVGaWVsZEdyb3VwKEVkaXRvckRlc2NyaXB0b3JJbnN0LmRlZmF1bHRHcm91cE5hbWUsIG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBkZWZhdWx0IHRhYiBncm91cC5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZURlZmF1bHRUYWJHcm91cCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RhYnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVRhYkdyb3VwKEVkaXRvckRlc2NyaXB0b3JJbnN0LmRlZmF1bHRHcm91cE5hbWUsICdnZW5lcmFsLmdlbmVyYWwnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgY2FyZSBvZiBkaXNwbGF5aW5nIGNvcnJlY3QvbG9jYWxpemVkIGRhdGEgaW4gdGhlIGVkaXRvclxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBwcm9wZXJ0eSB0aGF0IHRlbGxzIHVzIHdoZXJlIG9uIHRoZSBtb2RlbCBhcmUgbG9jYWxpemF0aW9ucyBhY2Nlc3NpYmxlXG4gICAgICogQHBhcmFtIG1vZGVsIE1vZGVsIGZvciBsb2NhbGl6YXRpb25zXG4gICAgICogQHBhcmFtIGxvY2FsZVByb3BlcnR5IHByb3BlcnR5IGJ5IHdoaWNoIHdlIGZpbmQgdGhlIGxvY2FsZVxuICAgICAqL1xuICAgIHB1YmxpYyBsb2NhbGl6ZWQ8UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBFZGl0b3JNb2RlbCwgTG9jYWxpemF0aW9uTW9kZWwgPSBBcnJheUl0ZW1UeXBlPEVkaXRvck1vZGVsW1Byb3BlcnR5XT4+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIG1vZGVsOiBNb2RlbERlc2NyaXB0b3I8TG9jYWxpemF0aW9uTW9kZWw+LFxuICAgICAgICBsb2NhbGVQcm9wZXJ0eToga2V5b2YgTG9jYWxpemF0aW9uTW9kZWxcbiAgICApOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxpemVkVW5zYWZlKHByb3BlcnR5IGFzIHN0cmluZywgbW9kZWwsIGxvY2FsZVByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvY2FsaXplZFVuc2FmZTxMb2NhbGl6YXRpb25UeXBlPihwcm9wZXJ0eTogc3RyaW5nLCBtb2RlbDogTW9kZWxEZXNjcmlwdG9yPExvY2FsaXphdGlvblR5cGU+LCBsb2NhbGVQcm9wZXJ0eTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2xvY2FsaXphdGlvbkxvY2FsaXphdGlvblByb3BlcnR5ID0gcHJvcGVydHkgYXMgc3RyaW5nO1xuICAgICAgICB0aGlzLl9sb2NhbGl6YXRpb25Nb2RlbCA9IG1vZGVsO1xuICAgICAgICB0aGlzLl9sb2NhbGl6YXRpb25Mb2NhbGVQcm9wZXJ0eSA9IGxvY2FsZVByb3BlcnR5IGFzIHN0cmluZztcbiAgICAgICAgdGhpcy5faXNMb2NhbGl6ZWQgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZXh0RXZlbnQodHlwZTogRm9ybUV2ZW50VHlwZUVudW0sIGNvbXBvbmVudDogSUZvcm1FZGl0b3JDb21wb25lbnQ8YW55LCBhbnk+LCBkYXRhPzogRm9ybUV2ZW50RGF0YTxFZGl0b3JNb2RlbD4pIHtcbiAgICAgICAgdGhpcy5fZXZlbnRzU3ViamVjdC5uZXh0KHtcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICBmb3JtQ29tcG9uZW50OiBjb21wb25lbnQsXG4gICAgICAgICAgICBmb3JtOiBjb21wb25lbnQuZm9ybSBhcyBGb3JtR3JvdXAsXG4gICAgICAgICAgICBkYXRhOiBkYXRhXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZXZlbnRzJCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V2ZW50c1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxufVxuIl19
437
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmRlc2NyaXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90YWJsZXZpZXcvYXBpL3NyYy9lZGl0b3IvZGVzY3JpcHRvcnMvZWRpdG9yLmRlc2NyaXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUU3QixPQUFPLEVBQWdCLG9CQUFvQixFQUFzQyxNQUFNLDZCQUE2QixDQUFDO0FBTXJILE9BQU8sRUFBQyx5QkFBeUIsRUFBRSx1QkFBdUIsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBSTFGLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ2hFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBQyxvQkFBb0IsRUFBRSx1QkFBdUIsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZGLE9BQU8sRUFBQyxxQkFBcUIsRUFBRSx5QkFBeUIsRUFBRSw0QkFBNEIsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ3pILE9BQU8sRUFBQyx5QkFBeUIsRUFBRSwrQkFBK0IsRUFBRSxnQ0FBZ0MsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBRXJJLE9BQU8sRUFBQyxvQkFBb0IsRUFBMkIsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRixPQUFPLEVBQUMsbUNBQW1DLEVBQUMsTUFBTSxvREFBb0QsQ0FBQztBQUV2RyxNQUFNLE9BQU8sb0JBQW9CO2FBR04scUJBQWdCLEdBQUcseUJBQXlCLEFBQTVCLENBQTZCO0lBd0JwRTs7OztPQUlHO0lBQ0gsWUFBbUIsS0FBbUMsRUFBRSxtQkFBbUIsR0FBRyx1QkFBdUIsQ0FBQyxJQUFJO1FBekIxRyxjQUFjLENBQW9CLFVBQUssR0FBZ0QsRUFBRSxDQUFDO1FBQzFGLGNBQWMsQ0FBb0IsWUFBTyxHQUFnRSxFQUFFLENBQUM7UUFDNUcs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QUUsS0FBSyxFQUFFLGNBQXdCLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRU0sZUFBZSxDQUFtQixRQUFnQixFQUFFLEtBQXdDLEVBQUUsY0FBc0I7UUFDdkgsSUFBSSxDQUFDLGlDQUFpQyxHQUFHLFFBQWtCLENBQUM7UUFDNUQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztRQUNoQyxJQUFJLENBQUMsMkJBQTJCLEdBQUcsY0FBd0IsQ0FBQztRQUM1RCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUV6QixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU0sU0FBUyxDQUFDLElBQXVCLEVBQUUsU0FBeUMsRUFBRSxJQUFpQztRQUNsSCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztZQUNyQixJQUFJLEVBQUUsSUFBSTtZQUNWLGFBQWEsRUFBRSxTQUFTO1lBQ3hCLElBQUksRUFBRSxTQUFTLENBQUMsSUFBaUI7WUFDakMsSUFBSSxFQUFFLElBQUk7U0FDYixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Zvcm1Hcm91cH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQge1N1YmplY3R9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge0FycmF5SXRlbVR5cGUsIENvbW1vbnNJbnRlcm5hbEVycm9yLCBFbnVtQ29uc3RhbnRUeXBlLCBJRWRpdG9yRGVzY3JpcHRvcn0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9jb3JlJztcbmltcG9ydCB7RW51bURlc2NyaXB0b3IsIE1vZGVsRGVzY3JpcHRvcn0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9tb2RlbCc7XG5pbXBvcnQge0lUYWJsZURhdGFQcm92aWRlciwgVGFibGVEZXNjcmlwdG9ySW5zdH0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy90YWJsZS9hcGknO1xuXG5pbXBvcnQge1RhYmxldmlld0Rlc2NyaXB0b3JJbnN0fSBmcm9tICcuLi8uLi90YWJsZXZpZXcvZGVzY3JpcHRvcnMvdGFibGV2aWV3LmRlc2NyaXB0b3InO1xuaW1wb3J0IHtGaWVsZHNNYW5hZ2VBZGRGaWVsZExvb2t1cE9wdHMsIElGaWVsZHNNYW5hZ2VXaXRoR2V0RmllbGR9IGZyb20gJy4uL21vZGVscy9lZGl0b3ItZmllbGRzLm1vZGVsJztcbmltcG9ydCB7RURJVE9SX0RFRkFVTFRfR1JPVVBfTkFNRSwgVGFibGV2aWV3RWRpdG9yVHlwZUVudW19IGZyb20gJy4uL21vZGVscy9lZGl0b3IubW9kZWwnO1xuaW1wb3J0IHtGb3JtVmFsaWRhdGlvbk1lc3NhZ2UsIEZvcm1WYWxpZGF0b3J9IGZyb20gJy4uL21vZGVscy9maWVsZC12YWxpZGF0aW9uLm1vZGVsJztcbmltcG9ydCB7Rm9ybUV2ZW50LCBGb3JtRXZlbnREYXRhLCBGb3JtRXZlbnRUeXBlRW51bX0gZnJvbSAnLi4vbW9kZWxzL2Zvcm0tZWRpdG9yLmV2ZW50JztcbmltcG9ydCB7SUZvcm1FZGl0b3JDb21wb25lbnR9IGZyb20gJy4uL21vZGVscy9mb3JtLWVkaXRvci5pbnRlcmZhY2UnO1xuaW1wb3J0IHtGaWVsZEFjdGlvbkRlc2NyaXB0b3J9IGZyb20gJy4vZmllbGQtYWN0aW9uLmRlc2NyaXB0b3InO1xuaW1wb3J0IHtBRmllbGREZXNjcmlwdG9yfSBmcm9tICcuL2ZpZWxkLWJhc2UuZGVzY3JpcHRvcic7XG5pbXBvcnQge0ZpZWxkR3JvdXBEZXNjcmlwdG9yLCBGaWVsZFRhYkdyb3VwRGVzY3JpcHRvcn0gZnJvbSAnLi9maWVsZC1ncm91cC5kZXNjcmlwdG9yJztcbmltcG9ydCB7RmllbGRMb29rdXBEZXNjcmlwdG9yLCBGaWVsZExvb2t1cEVudW1EZXNjcmlwdG9yLCBmaWVsZExvb2t1cEdldFByb3ZpZGVyQ2ZnT2JqfSBmcm9tICcuL2ZpZWxkLWxvb2t1cC5kZXNjcmlwdG9yJztcbmltcG9ydCB7RmllbGRNYW55RWRpdG9yRGVzY3JpcHRvciwgRmllbGRNYW55VG9NYW55RWRpdG9yRGVzY3JpcHRvciwgZmllbGRNYW55VG9NYW55R2V0UHJvdmlkZXJDZmdPYmp9IGZyb20gJy4vZmllbGQtbWFueS5kZXNjcmlwdG9yJztcbmltcG9ydCB7RmllbGRWYWxpZGF0aW9uRGVzY3JpcHRvck9wdHNUeXBlfSBmcm9tICcuL2ZpZWxkLXZhbGlkYXRpb24uZGVzY3JpcHRvcic7XG5pbXBvcnQge0ZpZWxkSW5wdXREZXNjcmlwdG9yLCBGaWVsZElucHV0RGVzY3JpcHRvclR5cGV9IGZyb20gJy4vZmllbGQuZGVzY3JpcHRvcic7XG5pbXBvcnQge0VkaXRvckRlc2NyaXB0b3JOZXN0ZWRPYmplY3RXcmFwcGVyfSBmcm9tICcuL3dyYXBwZXJzL2VkaXRvci1kZXNjcmlwdG9yLW5lc3RlZC1vYmplY3Qtd3JhcHBlcic7XG5cbmV4cG9ydCBjbGFzcyBFZGl0b3JEZXNjcmlwdG9ySW5zdDxFZGl0b3JNb2RlbCwgUGFyZW50RWRpdG9yTW9kZWwgPSB1bmRlZmluZWQ+XG4gICAgaW1wbGVtZW50cyBJRWRpdG9yRGVzY3JpcHRvcjxFZGl0b3JNb2RlbCwgUGFyZW50RWRpdG9yTW9kZWw+LCBJRmllbGRzTWFuYWdlV2l0aEdldEZpZWxkPEVkaXRvck1vZGVsLCBQYXJlbnRFZGl0b3JNb2RlbD5cbntcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGRlZmF1bHRHcm91cE5hbWUgPSBFRElUT1JfREVGQVVMVF9HUk9VUF9OQU1FO1xuXG4gICAgLyoqIEBpZ25vcmUgKi8gcHJvdGVjdGVkIHJlYWRvbmx5IF9tb2RlbDogTW9kZWxEZXNjcmlwdG9yPEVkaXRvck1vZGVsPjtcbiAgICAvKiogQGlnbm9yZSAqLyBwcm90ZWN0ZWQgcmVhZG9ubHkgX3RhYmxldmlld0VkaXRvclR5cGU6IFRhYmxldmlld0VkaXRvclR5cGVFbnVtO1xuICAgIC8qKiBAaWdub3JlICovIHByb3RlY3RlZCByZWFkb25seSBfdGFiczogQXJyYXk8RmllbGRUYWJHcm91cERlc2NyaXB0b3I8RWRpdG9yTW9kZWw+PiA9IFtdO1xuICAgIC8qKiBAaWdub3JlICovIHByb3RlY3RlZCByZWFkb25seSBfZ3JvdXBzOiBBcnJheTxGaWVsZEdyb3VwRGVzY3JpcHRvcjxFZGl0b3JNb2RlbCwgUGFyZW50RWRpdG9yTW9kZWw+PiA9IFtdO1xuICAgIC8qKiBAaWdub3JlICovIHByb3RlY3RlZCBfZmllbGRzOiBBcnJheTxBRmllbGREZXNjcmlwdG9yPGFueSwgRWRpdG9yTW9kZWw+PiA9IFtdO1xuICAgIC8qKiBAaWdub3JlICovIHByb3RlY3RlZCBfY3VycmVudFRhYkdyb3VwPzogRmllbGRUYWJHcm91cERlc2NyaXB0b3I8RWRpdG9yTW9kZWw+O1xuICAgIC8qKiBAaWdub3JlICovIHByb3RlY3RlZCBfY3VycmVudEdyb3VwPzogRmllbGRHcm91cERlc2NyaXB0b3I8RWRpdG9yTW9kZWw+O1xuXG4gICAgLyoqIEBpZ25vcmUgKi8gcHJvdGVjdGVkIF9hdXRvU2F2ZT86IGJvb2xlYW47XG4gICAgLyoqIEBpZ25vcmUgKi8gcHJvdGVjdGVkIF9hdXRvU2F2ZUlkZW50aWZpZXI/OiBzdHJpbmc7XG5cbiAgICAvKiogQGlnbm9yZSAqLyBwcm90ZWN0ZWQgX2F1dG9mb2N1c09uRmllbGQ/OiBib29sZWFuO1xuXG4gICAgLyoqIEBpZ25vcmUgKi8gcHJvdGVjdGVkIF9kaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgLyoqIEBpZ25vcmUgKi8gcHJvdGVjdGVkIF9pc0xvY2FsaXplZCA9IGZhbHNlO1xuICAgIC8qKiBAaWdub3JlICovIHByb3RlY3RlZCBfbG9jYWxpemF0aW9uTG9jYWxlUHJvcGVydHk/OiBzdHJpbmc7XG4gICAgLyoqIEBpZ25vcmUgKi8gcHJvdGVjdGVkIF9sb2NhbGl6YXRpb25Nb2RlbD86IE1vZGVsRGVzY3JpcHRvcjxhbnk+O1xuICAgIC8qKiBAaWdub3JlICovIHByb3RlY3RlZCBfbG9jYWxpemF0aW9uTG9jYWxpemF0aW9uUHJvcGVydHk/OiBzdHJpbmc7XG5cbiAgICAvKiogQGlnbm9yZSAqLyBwcm90ZWN0ZWQgcmVhZG9ubHkgX2V2ZW50c1N1YmplY3QgPSBuZXcgU3ViamVjdDxGb3JtRXZlbnQ8RWRpdG9yTW9kZWwsIFBhcmVudEVkaXRvck1vZGVsPj4oKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgbmV3IGluc3RhbmNlIG9mIGVkaXRvciBkZXNjcmlwdG9yLlxuICAgICAqIEBwYXJhbSBtb2RlbCBNb2RlbCBkZXNjcmlwdG9yLlxuICAgICAqIEBwYXJhbSB0YWJsZXZpZXdFZGl0b3JUeXBlIFR5cGUgb2YgZWRpdG9yIGluIHRhYmxldmlldyAoYWRkLCBlZGl0LCB2aWV3IG9yIG5vbmUpLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihtb2RlbDogTW9kZWxEZXNjcmlwdG9yPEVkaXRvck1vZGVsPiwgdGFibGV2aWV3RWRpdG9yVHlwZSA9IFRhYmxldmlld0VkaXRvclR5cGVFbnVtLk5vbmUpIHtcbiAgICAgICAgdGhpcy5fbW9kZWwgPSBtb2RlbDtcbiAgICAgICAgdGhpcy5fdGFibGV2aWV3RWRpdG9yVHlwZSA9IHRhYmxldmlld0VkaXRvclR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW9kZWwgZGVzY3JpcHRvciBmb3IgZWRpdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbW9kZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tb2RlbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFZGl0b3IncyB0YWJzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdGFicygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRWRpdG9yJ3MgZmllbGRzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZmllbGRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFR5cGUgb2YgZWRpdG9yIGZvciB0YWJsZXZpZXcuXG4gICAgICovXG4gICAgcHVibGljIGdldCB0YWJsZXZpZXdFZGl0b3JUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGV2aWV3RWRpdG9yVHlwZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiBlZGl0b3IgaXMgZGlzYWJsZWQuXG4gICAgICovXG4gICAgcHVibGljIGdldCBkaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXNMb2NhbGl6ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0xvY2FsaXplZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxvY2FsaXphdGlvbkxvY2FsZVByb3BlcnR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxpemF0aW9uTG9jYWxlUHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBsb2NhbGl6YXRpb25Mb2NhbGl6YXRpb25Qcm9wZXJ0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsaXphdGlvbkxvY2FsaXphdGlvblByb3BlcnR5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbG9jYWxpemF0aW9uTW9kZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGl6YXRpb25Nb2RlbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGF1dG9TYXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXV0b1NhdmU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhdXRvU2F2ZUlkZW50aWZpZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hdXRvU2F2ZUlkZW50aWZpZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhdXRvZm9jdXNPbkZpZWxkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXV0b2ZvY3VzT25GaWVsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXZlcyBpbnRvIG5lc3RlZCBvYmplY3QgdG8gYWRkIGZpZWxkcyBmcm9tIHRoZSBuZXN0ZWQgb2JqZWN0IG9uIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnR5IE1vZGVsIHByb3BlcnR5IG5hbWUuXG4gICAgICovXG4gICAgcHVibGljIG5lc3RlZDxQcm9wZXJ0eSBleHRlbmRzIGtleW9mIEVkaXRvck1vZGVsPihwcm9wZXJ0eTogUHJvcGVydHkpOiBFZGl0b3JEZXNjcmlwdG9yTmVzdGVkT2JqZWN0V3JhcHBlcjxFZGl0b3JNb2RlbCwgUGFyZW50RWRpdG9yTW9kZWwsIE5vbk51bGxhYmxlPEVkaXRvck1vZGVsW1Byb3BlcnR5XT4+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBFZGl0b3JEZXNjcmlwdG9yTmVzdGVkT2JqZWN0V3JhcHBlcih0aGlzLCBwcm9wZXJ0eSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgbmV3IHRhYiBncm91cC4gTmV4dCBhZGRlZCBmaWVsZHMgYXJlIGFkZGVkIHRvIG5ld2x5IGNyZWF0ZWQgdGFiIGdyb3VwLlxuICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGdyb3VwLlxuICAgICAqIEBwYXJhbSB0aXRsZSBUaXRsZSBrZXkgZm9yIHRoZSB0YWIuN0ByZXR1cm4gTmV3bHkgY3JlYXRlZCBncm91cCBkZXNjcmlwdG9yLlxuICAgICAqIEByZXR1cm4gTmV3bHkgY3JlYXRlZCBncm91cCBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRUYWJHcm91cChuYW1lOiBzdHJpbmcsIHRpdGxlPzogc3RyaW5nKTogRmllbGRUYWJHcm91cERlc2NyaXB0b3I8RWRpdG9yTW9kZWw+IHtcbiAgICAgICAgY29uc3QgdGFiR3JvdXAgPSBuZXcgRmllbGRUYWJHcm91cERlc2NyaXB0b3I8RWRpdG9yTW9kZWw+KG5hbWUpO1xuICAgICAgICB0YWJHcm91cC53aXRoVGl0bGUodGl0bGUpO1xuICAgICAgICB0aGlzLmNyZWF0ZVRhYkdyb3VwRGVzY3JpcHRvcih0YWJHcm91cCk7XG4gICAgICAgIHJldHVybiB0YWJHcm91cDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG5ldyB0YWIgZ3JvdXAuIE5leHQgYWRkZWQgZmllbGRzIGFyZSBhZGRlZCB0byBuZXdseSBjcmVhdGVkIHRhYiBncm91cC5cbiAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBncm91cC5cbiAgICAgKiBAcGFyYW0gdGl0bGUgVGl0bGUga2V5IGZvciB0aGUgdGFiLjdAcmV0dXJuIE5ld2x5IGNyZWF0ZWQgZ3JvdXAgZGVzY3JpcHRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aFRhYkdyb3VwKG5hbWU6IHN0cmluZywgdGl0bGU/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5hZGRUYWJHcm91cChuYW1lLCB0aXRsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgbmV3IGZpZWxkIGdyb3VwLiBOZXh0IGFkZGVkIGZpZWxkcyBhcmUgYWRkZWQgdG8gbmV3bHkgY3JlYXRlZCBmaWVsZCBncm91cC5cbiAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBncm91cC5cbiAgICAgKiBAcGFyYW0gdGl0bGUgVGl0bGUga2V5IGZvciB0aGUgZ3JvdXAuXG4gICAgICogQHJldHVybiBOZXdseSBjcmVhdGVkIGdyb3VwIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIGFkZEZpZWxkR3JvdXAobmFtZTogc3RyaW5nLCB0aXRsZT86IHN0cmluZyB8IG51bGwpOiBGaWVsZEdyb3VwRGVzY3JpcHRvcjxFZGl0b3JNb2RlbD4ge1xuICAgICAgICBjb25zdCBmaWVsZEdyb3VwID0gbmV3IEZpZWxkR3JvdXBEZXNjcmlwdG9yPEVkaXRvck1vZGVsPihuYW1lKTtcbiAgICAgICAgZmllbGRHcm91cC53aXRoVGl0bGUodGl0bGUpO1xuICAgICAgICB0aGlzLmNyZWF0ZUZpZWxkR3JvdXBEZXNjcmlwdG9yKGZpZWxkR3JvdXApO1xuICAgICAgICByZXR1cm4gZmllbGRHcm91cDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG5ldyBmaWVsZCBncm91cC4gTmV4dCBhZGRlZCBmaWVsZHMgYXJlIGFkZGVkIHRvIG5ld2x5IGNyZWF0ZWQgZmllbGQgZ3JvdXAuXG4gICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgZ3JvdXAuXG4gICAgICogQHBhcmFtIHRpdGxlIFRpdGxlIGtleSBmb3IgdGhlIGdyb3VwLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoRmllbGRHcm91cChuYW1lOiBzdHJpbmcsIHRpdGxlPzogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuYWRkRmllbGRHcm91cChuYW1lLCB0aXRsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgZmllbGQgYnkgdGhlIG1vZGVsIHByb3BlcnR5IG5hbWUuXG4gICAgICogQHBhcmFtIHByb3BlcnR5IE1vZGVsIHByb3BlcnR5IG5hbWUuXG4gICAgICovXG4gICAgcHVibGljIGdldEZpZWxkPFByb3BlcnR5IGV4dGVuZHMga2V5b2YgRWRpdG9yTW9kZWwsIEZpZWxkTW9kZWwgPSBOb25OdWxsYWJsZTxFZGl0b3JNb2RlbFtQcm9wZXJ0eV0+LCBGaWVsZFZhbHVlID0gRWRpdG9yTW9kZWxbUHJvcGVydHldPihwcm9wZXJ0eTogUHJvcGVydHkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmllbGRVbnNhZmU8RmllbGRNb2RlbCwgRmllbGRWYWx1ZT4ocHJvcGVydHkgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGZpZWxkIGJ5IHRoZSBtb2RlbCBwcm9wZXJ0eSBuYW1lIChVTlNBRkUpLlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBNb2RlbCBwcm9wZXJ0eSBuYW1lLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGaWVsZFVuc2FmZTxGaWVsZE1vZGVsLCBGaWVsZFZhbHVlID0gRmllbGRNb2RlbD4ocHJvcGVydHk6IHN0cmluZyk6IEFGaWVsZERlc2NyaXB0b3I8RmllbGRNb2RlbCwgRWRpdG9yTW9kZWwsIEZpZWxkVmFsdWUsIFBhcmVudEVkaXRvck1vZGVsPiB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRzLmZpbmQoZiA9PiBmLnByb3BlcnR5ID09PSBwcm9wZXJ0eSkgPz8gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGZpZWxkIGJ5IHRoZSBtb2RlbCBwcm9wZXJ0eSBuYW1lLlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBNb2RlbCBwcm9wZXJ0eSBuYW1lLlxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVGaWVsZChwcm9wZXJ0eToga2V5b2YgRWRpdG9yTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlRmllbGRVbnNhZmUocHJvcGVydHkgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGZpZWxkIGJ5IHRoZSBtb2RlbCBwcm9wZXJ0eSBuYW1lIChVTlNBRkUpLlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBNb2RlbCBwcm9wZXJ0eSBuYW1lLlxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVGaWVsZFVuc2FmZShwcm9wZXJ0eTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZpZWxkSWR4ID0gdGhpcy5fZmllbGRzLmZpbmRJbmRleChmID0+IGYucHJvcGVydHkgPT09IHByb3BlcnR5KTtcbiAgICAgICAgaWYgKGZpZWxkSWR4IDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbW1vbnNJbnRlcm5hbEVycm9yKGBGaWVsZCAke3Byb3BlcnR5fSBkb2VzIG5vdCBleGlzdC5gLCB7bmFtZTogJ0VkaXRvckRlc2NyaXB0b3JFcnJvcid9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHRoaXMuX2dyb3Vwcykge1xuICAgICAgICAgICAgY29uc3QgZ3JvdXBGaWVsZElkeCA9IGdyb3VwLmZpZWxkcy5maW5kSW5kZXgoZiA9PiBmIGluc3RhbmNlb2YgQUZpZWxkRGVzY3JpcHRvciAmJiBmLnByb3BlcnR5ID09PSBwcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoZ3JvdXBGaWVsZElkeCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZ3JvdXAuZmllbGRzLnNwbGljZShncm91cEZpZWxkSWR4LCAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9maWVsZHMuc3BsaWNlKGZpZWxkSWR4LCAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGZpZWxkIGJ5IHRoZSBkZXNjcmlwdG9yLlxuICAgICAqIEBwYXJhbSBmaWVsZCBGaWVsZCBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRGaWVsZERlc2NyaXB0b3I8RmllbGRNb2RlbCwgRmllbGRWYWx1ZSA9IEZpZWxkTW9kZWw+KGZpZWxkOiBBRmllbGREZXNjcmlwdG9yPEZpZWxkTW9kZWwsIEVkaXRvck1vZGVsLCBGaWVsZFZhbHVlLCBQYXJlbnRFZGl0b3JNb2RlbD4pOiB0aGlzIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZpZWxkcy5zb21lKGYgPT4gZi5wcm9wZXJ0eSA9PT0gZmllbGQucHJvcGVydHkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQ29tbW9uc0ludGVybmFsRXJyb3IoYEZpZWxkICcke2ZpZWxkLnByb3BlcnR5fScgYWxyZWFkeSBleGlzdHMuYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jcmVhdGVEZWZhdWx0R3JvdXAoKTtcbiAgICAgICAgdGhpcy5fZmllbGRzLnB1c2goZmllbGQpO1xuICAgICAgICB0aGlzLl9jdXJyZW50R3JvdXA/LmFkZEZpZWxkKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBmaWVsZCBieSB0aGUgbW9kZWwgcHJvcGVydHkgbmFtZS5cbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgTW9kZWwgcHJvcGVydHkgbmFtZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkRmllbGQ8UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBFZGl0b3JNb2RlbCwgRmllbGRNb2RlbCA9IE5vbk51bGxhYmxlPEVkaXRvck1vZGVsW1Byb3BlcnR5XT4sIEZpZWxkVmFsdWUgPSBFZGl0b3JNb2RlbFtQcm9wZXJ0eV0+KHByb3BlcnR5OiBQcm9wZXJ0eSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRGaWVsZFVuc2FmZTxGaWVsZE1vZGVsLCBGaWVsZFZhbHVlPihwcm9wZXJ0eSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgZmllbGQgYnkgdGhlIG1vZGVsIHByb3BlcnR5IG5hbWUgKFVOU0FGRSkuIFByb3BlcnR5IGlzIG5vdCBjaGVja2VkIG9uIGVkaXRvciBtb2RlbC5cbiAgICAgKiBVc2Uge2FkZEZpZWxkfSBmb3Igc2FmZSB1c2FnZS5cbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgTW9kZWwgcHJvcGVydHkgbmFtZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkRmllbGRVbnNhZmU8RmllbGRNb2RlbCA9IEZpZWxkSW5wdXREZXNjcmlwdG9yVHlwZSwgRmllbGRWYWx1ZSA9IEZpZWxkTW9kZWw+KHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBuZXcgRmllbGRJbnB1dERlc2NyaXB0b3I8RWRpdG9yTW9kZWwsIEZpZWxkTW9kZWwsIEZpZWxkVmFsdWUsIFBhcmVudEVkaXRvck1vZGVsPihwcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuYWRkRmllbGREZXNjcmlwdG9yPEZpZWxkTW9kZWwsIEZpZWxkVmFsdWU+KGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRmllbGRzKC4uLnByb3BlcnRpZXM6IChrZXlvZiBFZGl0b3JNb2RlbClbXSk6IHRoaXMge1xuICAgICAgICBwcm9wZXJ0aWVzLmZvckVhY2gocCA9PiB0aGlzLmFkZEZpZWxkKHApKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZpZWxkQWN0aW9uKGFjdGlvbk5hbWU6IHN0cmluZyk6IEZpZWxkQWN0aW9uRGVzY3JpcHRvcjxFZGl0b3JNb2RlbCwgUGFyZW50RWRpdG9yTW9kZWw+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBuZXcgRmllbGRBY3Rpb25EZXNjcmlwdG9yPEVkaXRvck1vZGVsLCBQYXJlbnRFZGl0b3JNb2RlbD4oYWN0aW9uTmFtZSk7XG4gICAgICAgIHRoaXMuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgbG9va3VwIGZpZWxkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSBlZGl0b3IuXG4gICAgICogQHBhcmFtIHtGaWVsZHNNYW5hZ2VBZGRGaWVsZExvb2t1cE9wdHM8TG9va3VwTW9kZWwsIFNlcnZpY2U+fSBvcHRzIC0gT3B0aW9uYWwgcGFyYW1ldGVycyBjb25maWd1cmluZyB0eXBlIGFuZC9vciBzZXJ2aWNlIHByb3ZpZGVyLlxuICAgICAqIEB0eXBlcGFyYW0gUHJvcGVydHkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSBFZGl0b3JNb2RlbC5cbiAgICAgKiBAdHlwZXBhcmFtIExvb2t1cE1vZGVsIC0gVGhlIGZpZWxkIG1vZGVsIHR5cGUsIGRlZmF1bHRzIHRvIHRoZSBub24tbnVsbGFibGUgdHlwZSBvZiB0aGUgZWRpdG9yJ3MgcHJvcGVydHkuXG4gICAgICogQHR5cGVwYXJhbSBTZXJ2aWNlIC0gU2VydmljZSB1c2VkIGZvciBkYXRhIHByb3ZpZGVyLlxuICAgICAqIEB0eXBlcGFyYW0gRmllbGRWYWx1ZSAtIFRoZSB2YWx1ZSB0eXBlIG9mIGZpZWxkIG9uIGVkaXRvci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtGaWVsZExvb2t1cERlc2NyaXB0b3I8TG9va3VwTW9kZWwsIEVkaXRvck1vZGVsLCBTZXJ2aWNlLCBGaWVsZFZhbHVlPn0gLSBUaGUgZmllbGQgbG9va3VwIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIGFkZEZpZWxkTG9va3VwPFxuICAgICAgICBQcm9wZXJ0eSBleHRlbmRzIGtleW9mIEVkaXRvck1vZGVsLFxuICAgICAgICBTZXJ2aWNlID0gdW5kZWZpbmVkLFxuICAgICAgICBMb29rdXBNb2RlbCBleHRlbmRzIE5vbk51bGxhYmxlPEVkaXRvck1vZGVsW1Byb3BlcnR5XT4gPSBOb25OdWxsYWJsZTxFZGl0b3JNb2RlbFtQcm9wZXJ0eV0+LFxuICAgICAgICBGaWVsZFZhbHVlID0gRWRpdG9yTW9kZWxbUHJvcGVydHldXG4gICAgPihwcm9wZXJ0eTogUHJvcGVydHksIG9wdHM/OiBGaWVsZHNNYW5hZ2VBZGRGaWVsZExvb2t1cE9wdHM8TG9va3VwTW9kZWwsIFNlcnZpY2U+KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZEZpZWxkTG9va3VwVW5zYWZlPExvb2t1cE1vZGVsLCBTZXJ2aWNlLCBGaWVsZFZhbHVlPihwcm9wZXJ0eSBhcyBzdHJpbmcsIG9wdHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtVTlNBRkVdIEFkZHMgbG9va3VwIGZpZWxkLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgVU5TQUZFIGJlY2F1c2UgcHJvcGVydHkgaXMgbm90IHR5cGUtY2hlY2tlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBNb2RlbCBwcm9wZXJ0eSBuYW1lLlxuICAgICAqIEBwYXJhbSB7RmllbGRzTWFuYWdlQWRkRmllbGRMb29rdXBPcHRzPExvb2t1cE1vZGVsLCBTZXJ2aWNlPn0gb3B0cyAtIE9wdGlvbmFsIHBhcmFtZXRlcnMgY29uZmlndXJpbmcgdHlwZSBhbmQvb3Igc2VydmljZSBwcm92aWRlci5cbiAgICAgKiBAdHlwZXBhcmFtIExvb2t1cE1vZGVsIC0gVGhlIGZpZWxkIG1vZGVsIHR5cGUsIGRlZmF1bHRzIHRvIHRoZSBub24tbnVsbGFibGUgdHlwZSBvZiB0aGUgZWRpdG9yJ3MgcHJvcGVydHkuXG4gICAgICogQHR5cGVwYXJhbSBTZXJ2aWNlIC0gU2VydmljZSB1c2VkIGZvciBkYXRhIHByb3ZpZGVyLlxuICAgICAqIEB0eXBlcGFyYW0gRmllbGRWYWx1ZSAtIFRoZSB2YWx1ZSB0eXBlIG9mIGZpZWxkIG9uIGVkaXRvci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtGaWVsZExvb2t1cERlc2NyaXB0b3I8TG9va3VwTW9kZWwsIEVkaXRvck1vZGVsLCBTZXJ2aWNlLCBGaWVsZFZhbHVlPn0gLSBUaGUgZmllbGQgbG9va3VwIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHB1YmxpYyBhZGRGaWVsZExvb2t1cFVuc2FmZTxMb29rdXBNb2RlbCwgU2VydmljZSA9IHVuZGVmaW5lZCwgRmllbGRWYWx1ZSA9IExvb2t1cE1vZGVsPihwcm9wZXJ0eTogc3RyaW5nLCBvcHRzPzogRmllbGRzTWFuYWdlQWRkRmllbGRMb29rdXBPcHRzPExvb2t1cE1vZGVsLCBTZXJ2aWNlPikge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZExvb2t1cERlc2NyaXB0b3I8TG9va3VwTW9kZWwsIEVkaXRvck1vZGVsLCBTZXJ2aWNlLCBGaWVsZFZhbHVlLCBQYXJlbnRFZGl0b3JNb2RlbD4ocHJvcGVydHksIHtcbiAgICAgICAgICAgIC4uLihvcHRzPy5zZXJ2aWNlUHJvdmlkZXIgPyBmaWVsZExvb2t1cEdldFByb3ZpZGVyQ2ZnT2JqKG9wdHMuc2VydmljZVByb3ZpZGVyKSA6IHt9KVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hZGRGaWVsZERlc2NyaXB0b3IoZmllbGQpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZpZWxkTG9va3VwRW51bTxQcm9wZXJ0eSBleHRlbmRzIGtleW9mIEVkaXRvck1vZGVsLCBFbnVtIGV4dGVuZHMgTm9uTnVsbGFibGU8RWRpdG9yTW9kZWxbUHJvcGVydHldPj4oXG4gICAgICAgIHByb3BlcnR5OiBrZXlvZiBFZGl0b3JNb2RlbCxcbiAgICAgICAgZW51bURlc2M6IEVudW1EZXNjcmlwdG9yPEVudW0+LFxuICAgICAgICBvcHRpb25zPzogQXJyYXk8RW51bT5cbiAgICApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkRmllbGRMb29rdXBFbnVtVW5zYWZlPEVudW0+KHByb3BlcnR5IGFzIHN0cmluZywgZW51bURlc2MsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgZW51bSBsb29rdXAgZmllbGQuXG4gICAgICogQHBhcmFtIHByb3BlcnR5IE1vZGVsJ3MgcHJvcGVydHkgbmFtZS5cbiAgICAgKiBAcGFyYW0gZW51bURlc2MgVHlwZSBvZiBlbnVtIG9yIGVudW0gZGVzY3JpcHRvci5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBQcm92aWRlcyBzdWJzZXQgb2YgZW51bSdzIGF2YWlsYWJsZSBjb25zdGFudHMuXG4gICAgICovXG4gICAgcHVibGljIGFkZEZpZWxkTG9va3VwRW51bVVuc2FmZTxFbnVtID0gRW51bUNvbnN0YW50VHlwZT4ocHJvcGVydHk6IHN0cmluZywgZW51bURlc2M6IEVudW1EZXNjcmlwdG9yPEVudW0+LCBvcHRpb25zPzogQXJyYXk8RW51bT4pIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBuZXcgRmllbGRMb29rdXBFbnVtRGVzY3JpcHRvcjxFbnVtLCBFZGl0b3JNb2RlbCwgUGFyZW50RWRpdG9yTW9kZWw+KHByb3BlcnR5LCBlbnVtRGVzYywgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgdGFibGUvZGV0YWlscy9hZGQvZWRpdCBmaWVsZCBmb3Igb25lLXRvLW1hbnkgKDE6bikgcmVsYXRpb25zLlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBNb2RlbCdzIHByb3BlcnR5IG5hbWUuXG4gICAgICogQHBhcmFtIHRhYmxldmlld0Rlc2NyaXB0b3IgVGFibGV2aWV3IGRlc2NyaXB0b3IgZm9yIHJlbGF0ZWQgbW9kZWwuXG4gICAgICovXG4gICAgcHVibGljIGFkZEZpZWxkTWFueUVkaXRvcjxQcm9wZXJ0eSBleHRlbmRzIGtleW9mIEVkaXRvck1vZGVsLCBGaWVsZE1vZGVsID0gQXJyYXlJdGVtVHlwZTxFZGl0b3JNb2RlbFtQcm9wZXJ0eV0+LCBGaWVsZFZhbHVlID0gRWRpdG9yTW9kZWxbUHJvcGVydHldPihcbiAgICAgICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgICAgICB0YWJsZXZpZXdEZXNjcmlwdG9yOiBUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsLCBhbnksIGFueSwgRWRpdG9yTW9kZWwsIEZpZWxkTW9kZWwsIEZpZWxkTW9kZWwsIEZpZWxkTW9kZWwsIEZpZWxkTW9kZWw+XG4gICAgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZEZpZWxkTWFueUVkaXRvclVuc2FmZTxGaWVsZE1vZGVsLCBGaWVsZFZhbHVlPihwcm9wZXJ0eSBhcyBzdHJpbmcsIHRhYmxldmlld0Rlc2NyaXB0b3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgdGFibGUvZGV0YWlscy9hZGQvZWRpdCBmaWVsZCBmb3Igb25lLXRvLW1hbnkgKDE6bikgcmVsYXRpb25zIChVTlNBRkUpLlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBNb2RlbCdzIHByb3BlcnR5IG5hbWUuXG4gICAgICogQHBhcmFtIHRhYmxldmlld0Rlc2NyaXB0b3IgVGFibGV2aWV3IGRlc2NyaXB0b3IgZm9yIHJlbGF0ZWQgbW9kZWwuXG4gICAgICovXG4gICAgcHVibGljIGFkZEZpZWxkTWFueUVkaXRvclVuc2FmZTxGaWVsZE1vZGVsLCBGaWVsZFZhbHVlID0gRmllbGRNb2RlbFtdPihcbiAgICAgICAgcHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgdGFibGV2aWV3RGVzY3JpcHRvcjogVGFibGV2aWV3RGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbCwgYW55LCBhbnksIEVkaXRvck1vZGVsLCBGaWVsZE1vZGVsLCBGaWVsZE1vZGVsLCBGaWVsZE1vZGVsLCBGaWVsZE1vZGVsPlxuICAgICk6IEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3I8RmllbGRNb2RlbCwgRWRpdG9yTW9kZWwsIEZpZWxkVmFsdWUsIFBhcmVudEVkaXRvck1vZGVsPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3I8RmllbGRNb2RlbCwgRWRpdG9yTW9kZWwsIEZpZWxkVmFsdWUsIFBhcmVudEVkaXRvck1vZGVsPihwcm9wZXJ0eSwgdGFibGV2aWV3RGVzY3JpcHRvcik7XG4gICAgICAgIHRoaXMuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWVsZE1hbnlUb01hbnlFZGl0b3I8UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBFZGl0b3JNb2RlbCwgU2VydmljZVR5cGUsIEZpZWxkTW9kZWwgPSBBcnJheUl0ZW1UeXBlPEVkaXRvck1vZGVsW1Byb3BlcnR5XT4sIEZpZWxkVmFsdWUgPSBFZGl0b3JNb2RlbFtQcm9wZXJ0eV0+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIG1haW5UYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbCwgYW55LCBhbnk+LFxuICAgICAgICBsb29rdXBUYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbCwgYW55LCBhbnk+LFxuICAgICAgICBsb29rdXBEYXRhUHJvdmlkZXI6IElUYWJsZURhdGFQcm92aWRlcjxGaWVsZE1vZGVsLCBTZXJ2aWNlVHlwZSwgYW55LCBhbnk+XG4gICAgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZEZpZWxkTWFueVRvTWFueUVkaXRvclVuc2FmZTxGaWVsZE1vZGVsLCBTZXJ2aWNlVHlwZSwgRmllbGRWYWx1ZT4ocHJvcGVydHkgYXMgc3RyaW5nLCBtYWluVGFibGVEZXNjcmlwdG9yLCBsb29rdXBUYWJsZURlc2NyaXB0b3IsIGxvb2t1cERhdGFQcm92aWRlcik7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZpZWxkTWFueVRvTWFueUVkaXRvclVuc2FmZTxGaWVsZE1vZGVsLCBTZXJ2aWNlVHlwZSwgRmllbGRWYWx1ZSA9IEZpZWxkTW9kZWxbXT4oXG4gICAgICAgIHByb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIG1haW5UYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbCwgYW55LCBhbnk+LFxuICAgICAgICBsb29rdXBUYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbCwgYW55LCBhbnk+LFxuICAgICAgICBsb29rdXBEYXRhUHJvdmlkZXI6IElUYWJsZURhdGFQcm92aWRlcjxGaWVsZE1vZGVsLCBTZXJ2aWNlVHlwZSwgYW55LCBhbnk+XG4gICAgKTogRmllbGRNYW55VG9NYW55RWRpdG9yRGVzY3JpcHRvcjxGaWVsZE1vZGVsLCBFZGl0b3JNb2RlbCwgU2VydmljZVR5cGUsIEZpZWxkVmFsdWUsIFBhcmVudEVkaXRvck1vZGVsPiB7XG4gICAgICAgIGNvbnN0IGNmZyA9IGZpZWxkTWFueVRvTWFueUdldFByb3ZpZGVyQ2ZnT2JqKGxvb2t1cERhdGFQcm92aWRlcik7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3I8RmllbGRNb2RlbCwgRWRpdG9yTW9kZWwsIFNlcnZpY2VUeXBlLCBGaWVsZFZhbHVlLCBQYXJlbnRFZGl0b3JNb2RlbD4oXG4gICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgIG1haW5UYWJsZURlc2NyaXB0b3IsXG4gICAgICAgICAgICBsb29rdXBUYWJsZURlc2NyaXB0b3IsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4uY2ZnXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2FibGVzIGZpZWxkIG9uIGVkaXRvci5cbiAgICAgKiBAcGFyYW0gZGlzYWJsZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aERpc2FibGVkKGRpc2FibGVkID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGdyb3VwIHZhbGlkYXRvciB0byBlZGl0b3IuXG4gICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdmFsaWRhdGlvbi5cbiAgICAgKiBAcGFyYW0gdmFsaWRhdG9yIEZpZWxkIHZhbGlkYXRvciBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBGaWVsZCB2YWxpZGF0aW9uIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIG9wdHMgQWRkaXRpb25hbCBjb25maWd1cmF0aW9uIGZvciB2YWxpZGF0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoVmFsaWRhdGlvbjxWYWx1ZSA9IEVkaXRvck1vZGVsPihcbiAgICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgICB2YWxpZGF0b3I/OiBGb3JtVmFsaWRhdG9yPFZhbHVlLCBQYXJlbnRFZGl0b3JNb2RlbD4sXG4gICAgICAgIG1lc3NhZ2U/OiBGb3JtVmFsaWRhdGlvbk1lc3NhZ2U8VmFsdWUsIFBhcmVudEVkaXRvck1vZGVsPixcbiAgICAgICAgb3B0cz86IEZpZWxkVmFsaWRhdGlvbkRlc2NyaXB0b3JPcHRzVHlwZTxrZXlvZiBFZGl0b3JNb2RlbD5cbiAgICApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aFZhbGlkYXRpb25VbnNhZmUobmFtZSwgdmFsaWRhdG9yLCBtZXNzYWdlLCBvcHRzIGFzIEZpZWxkVmFsaWRhdGlvbkRlc2NyaXB0b3JPcHRzVHlwZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBncm91cCB2YWxpZGF0b3IgdG8gZWRpdG9yLlxuICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHZhbGlkYXRpb24uXG4gICAgICogQHBhcmFtIHZhbGlkYXRvciBGaWVsZCB2YWxpZGF0b3IgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgRmllbGQgdmFsaWRhdGlvbiBtZXNzYWdlLlxuICAgICAqIEBwYXJhbSBvcHRzIEFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgdmFsaWRhdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aFZhbGlkYXRpb25VbnNhZmU8VmFsdWUgPSBFZGl0b3JNb2RlbD4oXG4gICAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgICAgdmFsaWRhdG9yPzogRm9ybVZhbGlkYXRvcjxWYWx1ZSwgUGFyZW50RWRpdG9yTW9kZWw+LFxuICAgICAgICBtZXNzYWdlPzogRm9ybVZhbGlkYXRpb25NZXNzYWdlPFZhbHVlLCBQYXJlbnRFZGl0b3JNb2RlbD4sXG4gICAgICAgIG9wdHM/OiBGaWVsZFZhbGlkYXRpb25EZXNjcmlwdG9yT3B0c1R5cGVcbiAgICApIHtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRHcm91cCkge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudEdyb3VwLndpdGhWYWxpZGF0aW9uKG5hbWUsIHZhbGlkYXRvciwgbWVzc2FnZSwgb3B0cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhBdXRvU2F2ZShlbmFibGVkID0gdHJ1ZSwgYXV0b1NhdmVJZGVudGlmaWVyPzogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2F1dG9TYXZlID0gZW5hYmxlZDtcbiAgICAgICAgdGhpcy5fYXV0b1NhdmVJZGVudGlmaWVyID0gYXV0b1NhdmVJZGVudGlmaWVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEF1dG9mb2N1c09uRmllbGQoZW5hYmxlZCA9IHRydWUpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fYXV0b2ZvY3VzT25GaWVsZCA9IGVuYWJsZWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjb3B5IG9mIGVkaXRvciBkZXNjcmlwdG9yIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29weSgpOiBFZGl0b3JEZXNjcmlwdG9ySW5zdDxFZGl0b3JNb2RlbCwgUGFyZW50RWRpdG9yTW9kZWw+IHtcbiAgICAgICAgY29uc3QgZWRpdG9yID0gbmV3IEVkaXRvckRlc2NyaXB0b3JJbnN0PEVkaXRvck1vZGVsLCBQYXJlbnRFZGl0b3JNb2RlbD4odGhpcy5tb2RlbC5jb3B5KCksIHRoaXMudGFibGV2aWV3RWRpdG9yVHlwZSk7XG5cbiAgICAgICAgZWRpdG9yLl9maWVsZHMgPSB0aGlzLl9maWVsZHMubWFwKGYgPT4gZi5jb3B5KCkpO1xuICAgICAgICBjb25zdCBmaWVsZHNNYXAgPSBlZGl0b3IuZmllbGRzLnJlZHVjZSgobWFwLCBmaWVsZCkgPT4ge1xuICAgICAgICAgICAgbWFwLnNldChmaWVsZC5wcm9wZXJ0eSwgZmllbGQpO1xuICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgfSwgbmV3IE1hcDxzdHJpbmcsIGFueT4oKSk7XG5cbiAgICAgICAgZm9yIChjb25zdCB0YWJHcm91cCBvZiB0aGlzLl90YWJzKSB7XG4gICAgICAgICAgICBjb25zdCB0YWJHcm91cENvcHkgPSB0YWJHcm91cC5jb3B5KHRydWUpO1xuICAgICAgICAgICAgLy8gc2V0IGZpZWxkc1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWJHcm91cC5maWVsZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cCA9IHRhYkdyb3VwLmZpZWxkc1tpXTtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cENvcHkgPSB0YWJHcm91cENvcHkuZmllbGRzW2ldO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBncm91cC5maWVsZHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmllbGRDb3B5ID0gZmllbGRzTWFwLmdldChncm91cC5maWVsZHNbal0ucHJvcGVydHkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkQ29weSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbW1vbnNJbnRlcm5hbEVycm9yKGBDb3VsZCBub3QgY29weSBlZGl0b3IgZGVzY3JpcHRvcjogZmllbGQgJyR7Z3JvdXAuZmllbGRzW2pdLnByb3BlcnR5fScgKHRhYiAnJHt0YWJHcm91cC5uYW1lfScsIGdyb3VwICR7Z3JvdXAubmFtZX0nKS5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBncm91cENvcHkuYWRkRmllbGQoZmllbGRDb3B5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWRpdG9yLl9ncm91cHMucHVzaChncm91cENvcHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWRpdG9yLl90YWJzLnB1c2godGFiR3JvdXBDb3B5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVkaXRvci5fY3VycmVudFRhYkdyb3VwID0gZWRpdG9yLl90YWJzLmxlbmd0aCA+IDAgPyBlZGl0b3IuX3RhYnNbZWRpdG9yLl90YWJzLmxlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZWRpdG9yLl9jdXJyZW50VGFiR3JvdXApIHtcbiAgICAgICAgICAgIGVkaXRvci5fY3VycmVudEdyb3VwID0gZWRpdG9yLl9jdXJyZW50VGFiR3JvdXAuZmllbGRzLmxlbmd0aCA+IDAgPyBlZGl0b3IuX2N1cnJlbnRUYWJHcm91cC5maWVsZHNbZWRpdG9yLl9jdXJyZW50VGFiR3JvdXAuZmllbGRzLmxlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgZWRpdG9yLl9kaXNhYmxlZCA9IHRoaXMuX2Rpc2FibGVkO1xuICAgICAgICBlZGl0b3IuX2F1dG9TYXZlID0gdGhpcy5fYXV0b1NhdmU7XG4gICAgICAgIGVkaXRvci5fYXV0b1NhdmVJZGVudGlmaWVyID0gdGhpcy5fYXV0b1NhdmVJZGVudGlmaWVyO1xuICAgICAgICBlZGl0b3IuX2F1dG9mb2N1c09uRmllbGQgPSB0aGlzLl9hdXRvZm9jdXNPbkZpZWxkO1xuICAgICAgICBlZGl0b3IuX2lzTG9jYWxpemVkID0gdGhpcy5faXNMb2NhbGl6ZWQ7XG4gICAgICAgIGVkaXRvci5fbG9jYWxpemF0aW9uTG9jYWxlUHJvcGVydHkgPSB0aGlzLl9sb2NhbGl6YXRpb25Mb2NhbGVQcm9wZXJ0eTtcbiAgICAgICAgZWRpdG9yLl9sb2NhbGl6YXRpb25Nb2RlbCA9IHRoaXMuX2xvY2FsaXphdGlvbk1vZGVsO1xuICAgICAgICBlZGl0b3IuX2xvY2FsaXphdGlvbkxvY2FsaXphdGlvblByb3BlcnR5ID0gdGhpcy5fbG9jYWxpemF0aW9uTG9jYWxpemF0aW9uUHJvcGVydHk7XG5cbiAgICAgICAgcmV0dXJuIGVkaXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVkIGdyb3VwIGZyb20gZmllbGQgZ3JvdXAgZGVzY3JpcHRvci5cbiAgICAgKiBAcGFyYW0gZmllbGRHcm91cCBGaWVsZCBncm91cCBkZXNjcmlwdG9yLlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVGaWVsZEdyb3VwRGVzY3JpcHRvcihmaWVsZEdyb3VwOiBGaWVsZEdyb3VwRGVzY3JpcHRvcjxFZGl0b3JNb2RlbCwgUGFyZW50RWRpdG9yTW9kZWw+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuY3JlYXRlRGVmYXVsdFRhYkdyb3VwKCk7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRHcm91cCA9IGZpZWxkR3JvdXA7XG4gICAgICAgIHRoaXMuX2dyb3Vwcy5wdXNoKGZpZWxkR3JvdXApO1xuICAgICAgICB0aGlzLl9jdXJyZW50VGFiR3JvdXA/LmFkZEZpZWxkKGZpZWxkR3JvdXApO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRhYiBncm91cCBmcm9tIHRhYiBncm91cCBkZXNjcmlwdG9yLlxuICAgICAqIEBwYXJhbSB0YWJHcm91cCBUYWIgZ3JvdXAgZGVzY3JpcHRvci5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY3JlYXRlVGFiR3JvdXBEZXNjcmlwdG9yKHRhYkdyb3VwOiBGaWVsZFRhYkdyb3VwRGVzY3JpcHRvcjxFZGl0b3JNb2RlbD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fY3VycmVudFRhYkdyb3VwID0gdGFiR3JvdXA7XG4gICAgICAgIHRoaXMuX3RhYnMucHVzaCh0YWJHcm91cCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgZGVmYXVsdCBmaWVsZCBncm91cC5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZURlZmF1bHRHcm91cCgpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVEZWZhdWx0VGFiR3JvdXAoKTtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUYWJHcm91cD8uZmllbGRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5hZGRGaWVsZEdyb3VwKEVkaXRvckRlc2NyaXB0b3JJbnN0LmRlZmF1bHRHcm91cE5hbWUsIG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBkZWZhdWx0IHRhYiBncm91cC5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZURlZmF1bHRUYWJHcm91cCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RhYnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmFkZFRhYkdyb3VwKEVkaXRvckRlc2NyaXB0b3JJbnN0LmRlZmF1bHRHcm91cE5hbWUsICdnZW5lcmFsLmdlbmVyYWwnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgY2FyZSBvZiBkaXNwbGF5aW5nIGNvcnJlY3QvbG9jYWxpemVkIGRhdGEgaW4gdGhlIGVkaXRvclxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBwcm9wZXJ0eSB0aGF0IHRlbGxzIHVzIHdoZXJlIG9uIHRoZSBtb2RlbCBhcmUgbG9jYWxpemF0aW9ucyBhY2Nlc3NpYmxlXG4gICAgICogQHBhcmFtIG1vZGVsIE1vZGVsIGZvciBsb2NhbGl6YXRpb25zXG4gICAgICogQHBhcmFtIGxvY2FsZVByb3BlcnR5IHByb3BlcnR5IGJ5IHdoaWNoIHdlIGZpbmQgdGhlIGxvY2FsZVxuICAgICAqL1xuICAgIHB1YmxpYyBsb2NhbGl6ZWQ8UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBFZGl0b3JNb2RlbCwgTG9jYWxpemF0aW9uTW9kZWwgPSBBcnJheUl0ZW1UeXBlPEVkaXRvck1vZGVsW1Byb3BlcnR5XT4+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIG1vZGVsOiBNb2RlbERlc2NyaXB0b3I8TG9jYWxpemF0aW9uTW9kZWw+LFxuICAgICAgICBsb2NhbGVQcm9wZXJ0eToga2V5b2YgTG9jYWxpemF0aW9uTW9kZWxcbiAgICApOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxpemVkVW5zYWZlKHByb3BlcnR5IGFzIHN0cmluZywgbW9kZWwsIGxvY2FsZVByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvY2FsaXplZFVuc2FmZTxMb2NhbGl6YXRpb25UeXBlPihwcm9wZXJ0eTogc3RyaW5nLCBtb2RlbDogTW9kZWxEZXNjcmlwdG9yPExvY2FsaXphdGlvblR5cGU+LCBsb2NhbGVQcm9wZXJ0eTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2xvY2FsaXphdGlvbkxvY2FsaXphdGlvblByb3BlcnR5ID0gcHJvcGVydHkgYXMgc3RyaW5nO1xuICAgICAgICB0aGlzLl9sb2NhbGl6YXRpb25Nb2RlbCA9IG1vZGVsO1xuICAgICAgICB0aGlzLl9sb2NhbGl6YXRpb25Mb2NhbGVQcm9wZXJ0eSA9IGxvY2FsZVByb3BlcnR5IGFzIHN0cmluZztcbiAgICAgICAgdGhpcy5faXNMb2NhbGl6ZWQgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZXh0RXZlbnQodHlwZTogRm9ybUV2ZW50VHlwZUVudW0sIGNvbXBvbmVudDogSUZvcm1FZGl0b3JDb21wb25lbnQ8YW55LCBhbnk+LCBkYXRhPzogRm9ybUV2ZW50RGF0YTxFZGl0b3JNb2RlbD4pIHtcbiAgICAgICAgdGhpcy5fZXZlbnRzU3ViamVjdC5uZXh0KHtcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICBmb3JtQ29tcG9uZW50OiBjb21wb25lbnQsXG4gICAgICAgICAgICBmb3JtOiBjb21wb25lbnQuZm9ybSBhcyBGb3JtR3JvdXAsXG4gICAgICAgICAgICBkYXRhOiBkYXRhXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZXZlbnRzJCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V2ZW50c1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxufVxuIl19