@kaspernj/api-maker 1.0.446 → 1.0.448

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 (357) hide show
  1. package/{.eslintrc.cjs → .eslintrc.js} +4 -0
  2. package/README.md +35 -0
  3. package/android/build.gradle +43 -0
  4. package/android/src/main/AndroidManifest.xml +2 -0
  5. package/android/src/main/java/expo/modules/api_maker/ApiMakerModule.kt +50 -0
  6. package/android/src/main/java/expo/modules/api_maker/ApiMakerView.kt +30 -0
  7. package/build/api.js +120 -0
  8. package/build/attribute-not-loaded-error.js +2 -0
  9. package/build/base-component.js +5 -0
  10. package/build/base-error.js +33 -0
  11. package/build/base-model/attribute.js +25 -0
  12. package/build/base-model/column.js +11 -0
  13. package/build/base-model/reflection.js +14 -0
  14. package/build/base-model/scope.js +11 -0
  15. package/build/base-model.js +828 -0
  16. package/build/bootstrap/attribute-row/index.js +105 -0
  17. package/build/bootstrap/attribute-rows.js +31 -0
  18. package/build/bootstrap/card.js +138 -0
  19. package/build/bootstrap/checkbox.js +97 -0
  20. package/build/bootstrap/checkboxes.js +183 -0
  21. package/build/bootstrap/index.js +2 -0
  22. package/build/bootstrap/input.js +128 -0
  23. package/build/bootstrap/invalid-feedback.js +27 -0
  24. package/build/bootstrap/paginate.js +150 -0
  25. package/build/bootstrap/radio-buttons.js +72 -0
  26. package/build/bootstrap/select.js +88 -0
  27. package/build/bootstrap/sort-link.js +130 -0
  28. package/build/cable-connection-pool.js +128 -0
  29. package/build/cable-subscription-pool.js +207 -0
  30. package/build/cable-subscription.js +21 -0
  31. package/build/cache-key-generator.js +81 -0
  32. package/build/can-can.js +134 -0
  33. package/build/channels-consumer.js +3 -0
  34. package/build/collection-loader.js +48 -0
  35. package/build/collection.js +279 -0
  36. package/build/command-submit-data.js +81 -0
  37. package/build/commands-pool.js +195 -0
  38. package/build/compose.js +9 -0
  39. package/build/config.js +53 -0
  40. package/build/custom-error.js +5 -0
  41. package/build/data-set-to-attributes.js +10 -0
  42. package/build/deserializer.js +56 -0
  43. package/build/destroy-error.js +5 -0
  44. package/build/devise.js +109 -0
  45. package/build/draggable-sort/controller.js +136 -0
  46. package/build/draggable-sort/index.js +114 -0
  47. package/build/draggable-sort/item.js +188 -0
  48. package/build/error-logger.js +101 -0
  49. package/build/error-messages.js +13 -0
  50. package/build/event-connection.js +32 -0
  51. package/build/event-model-class.js +24 -0
  52. package/build/events.js +5 -0
  53. package/build/form.js +83 -0
  54. package/build/index.js +3 -0
  55. package/build/inputs/attachment.js +121 -0
  56. package/build/inputs/auto-submit.js +36 -0
  57. package/build/inputs/checkbox.js +145 -0
  58. package/build/inputs/checkboxes.js +111 -0
  59. package/build/inputs/id-for-component.js +15 -0
  60. package/build/inputs/input-wrapper.js +18 -0
  61. package/build/inputs/input.js +230 -0
  62. package/build/inputs/money.js +179 -0
  63. package/build/inputs/name-for-component.js +13 -0
  64. package/build/inputs/select.js +92 -0
  65. package/build/instance-of-class-name.js +23 -0
  66. package/build/key-value-store.js +53 -0
  67. package/build/link.js +68 -0
  68. package/build/logger.js +30 -0
  69. package/build/modal.js +37 -0
  70. package/build/model-class-require.js +13 -0
  71. package/build/model-events.js +30 -0
  72. package/build/model-name.js +28 -0
  73. package/build/model-prop-type.js +101 -0
  74. package/build/model-recipes-loader.js +32 -0
  75. package/build/model-recipes-model-loader.js +357 -0
  76. package/build/models-response-reader.js +40 -0
  77. package/build/models.js +8 -0
  78. package/build/money-formatter.js +77 -0
  79. package/build/not-loaded-error.js +2 -0
  80. package/build/params.js +60 -0
  81. package/build/preloaded.js +38 -0
  82. package/build/resize-observer.js +11 -0
  83. package/build/result.js +13 -0
  84. package/build/router/route.js +262 -0
  85. package/build/router/switch.js +72 -0
  86. package/build/router.js +57 -0
  87. package/build/routes-native.js +202 -0
  88. package/build/routes.js +50 -0
  89. package/build/run-last.js +35 -0
  90. package/build/serializer.js +63 -0
  91. package/build/services.js +20 -0
  92. package/build/session-status-updater.js +126 -0
  93. package/build/source-maps-loader.js +171 -0
  94. package/build/super-admin/config-reader.js +84 -0
  95. package/build/super-admin/edit-page/edit-attribute-checkbox.js +85 -0
  96. package/build/super-admin/edit-page/edit-attribute-content.js +54 -0
  97. package/build/super-admin/edit-page/edit-attribute-input.js +79 -0
  98. package/build/super-admin/edit-page/edit-attribute.js +76 -0
  99. package/build/super-admin/edit-page.js +120 -0
  100. package/build/super-admin/has-edit-config.js +12 -0
  101. package/build/super-admin/index-page.js +24 -0
  102. package/build/super-admin/index.js +180 -0
  103. package/build/super-admin/layout/header/index.js +151 -0
  104. package/build/super-admin/layout/index.js +109 -0
  105. package/build/super-admin/layout/menu/index.js +93 -0
  106. package/build/super-admin/layout/menu/menu-content.js +40 -0
  107. package/build/super-admin/layout/menu/menu-item.js +83 -0
  108. package/build/super-admin/layout/no-access.js +25 -0
  109. package/build/super-admin/model-class-table.js +61 -0
  110. package/build/super-admin/models.js +8 -0
  111. package/build/super-admin/show-nav.js +49 -0
  112. package/build/super-admin/show-page/belongs-to-attribute-row.js +28 -0
  113. package/build/super-admin/show-page/index.js +141 -0
  114. package/build/super-admin/show-reflection-actions.js +47 -0
  115. package/build/super-admin/show-reflection-link.js +46 -0
  116. package/build/super-admin/show-reflection-page.js +47 -0
  117. package/build/table/column-content.js +112 -0
  118. package/build/table/column-identifier.js +18 -0
  119. package/build/table/column-visible.js +7 -0
  120. package/build/table/components/column.js +20 -0
  121. package/build/table/components/flat-list.js +20 -0
  122. package/build/table/components/header.js +25 -0
  123. package/build/table/components/row.js +25 -0
  124. package/build/table/filters/attribute-element.js +43 -0
  125. package/build/table/filters/filter-form.js +392 -0
  126. package/build/table/filters/filter.js +89 -0
  127. package/build/table/filters/index.js +182 -0
  128. package/build/table/filters/load-search-modal.js +174 -0
  129. package/build/table/filters/reflection-element.js +36 -0
  130. package/build/table/filters/save-search-modal.js +86 -0
  131. package/build/table/filters/scope-element.js +41 -0
  132. package/build/table/header-column-content.js +67 -0
  133. package/build/table/header-column.js +144 -0
  134. package/build/table/header-select.js +104 -0
  135. package/build/table/model-callback-args.js +10 -0
  136. package/build/table/model-column.js +87 -0
  137. package/build/table/model-row.js +179 -0
  138. package/build/table/select-calculator.js +63 -0
  139. package/build/table/settings/column-row.js +97 -0
  140. package/build/table/settings/download-action.js +78 -0
  141. package/build/table/settings/index.js +92 -0
  142. package/build/table/table-settings.js +219 -0
  143. package/build/table/table.js +972 -0
  144. package/build/table/use-sorting.js +34 -0
  145. package/build/table/widths.js +75 -0
  146. package/build/table/worker-plugins-check-all-checkbox.js +125 -0
  147. package/build/table/worker-plugins-checkbox.js +115 -0
  148. package/build/translated-attributes.js +10 -0
  149. package/build/translated-collections.js +11 -0
  150. package/build/updated-attribute.js +76 -0
  151. package/build/url-encode.js +15 -0
  152. package/build/use-breakpoint.js +44 -0
  153. package/build/use-can-can.js +55 -0
  154. package/build/use-collection.js +225 -0
  155. package/build/use-created-event.js +52 -0
  156. package/build/use-current-user.js +73 -0
  157. package/build/use-destroyed-event.js +60 -0
  158. package/build/use-event-emitter.js +13 -0
  159. package/build/use-event-listener.js +16 -0
  160. package/build/use-input.js +140 -0
  161. package/build/use-model-event.js +60 -0
  162. package/build/use-model.js +169 -0
  163. package/build/use-resize-observer.js +23 -0
  164. package/build/use-router.js +102 -0
  165. package/build/use-screen-layout.js +39 -0
  166. package/build/use-updated-event.js +60 -0
  167. package/build/use-validation-errors.js +30 -0
  168. package/build/utils/card.js +51 -0
  169. package/build/utils/checkbox.js +48 -0
  170. package/build/utils/default-style.js +18 -0
  171. package/build/utils/modal.js +61 -0
  172. package/build/utils/text.js +18 -0
  173. package/build/validation-error.js +28 -0
  174. package/build/validation-errors.js +98 -0
  175. package/build/with-collection.js +13 -0
  176. package/build/with-current-user.js +9 -0
  177. package/build/with-model.js +14 -0
  178. package/build/with-router.js +21 -0
  179. package/expo-module.config.json +17 -0
  180. package/ios/ApiMaker.podspec +29 -0
  181. package/ios/ApiMakerModule.swift +48 -0
  182. package/ios/ApiMakerView.swift +38 -0
  183. package/package.json +35 -16
  184. package/src/{api.mjs → api.js} +5 -5
  185. package/src/{base-error.mjs → base-error.js} +1 -1
  186. package/src/base-model/{attribute.mjs → attribute.js} +1 -1
  187. package/src/base-model/{reflection.mjs → reflection.js} +1 -1
  188. package/src/{base-model.mjs → base-model.js} +14 -14
  189. package/src/bootstrap/attribute-row/index.jsx +2 -2
  190. package/src/bootstrap/attribute-rows.jsx +1 -1
  191. package/src/bootstrap/card.jsx +1 -1
  192. package/src/bootstrap/checkbox.jsx +1 -1
  193. package/src/bootstrap/checkboxes.jsx +1 -1
  194. package/src/bootstrap/input.jsx +1 -1
  195. package/src/bootstrap/paginate.jsx +2 -2
  196. package/src/bootstrap/sort-link.jsx +3 -3
  197. package/src/{cable-connection-pool.mjs → cable-connection-pool.js} +3 -3
  198. package/src/{cable-subscription-pool.mjs → cable-subscription-pool.js} +4 -4
  199. package/src/{cable-subscription.mjs → cable-subscription.js} +1 -1
  200. package/src/{can-can.mjs → can-can.js} +1 -1
  201. package/src/collection-loader.jsx +2 -2
  202. package/src/{collection.mjs → collection.js} +3 -3
  203. package/src/{commands-pool.mjs → commands-pool.js} +11 -11
  204. package/src/{custom-error.mjs → custom-error.js} +1 -1
  205. package/src/{deserializer.mjs → deserializer.js} +2 -2
  206. package/src/{destroy-error.mjs → destroy-error.js} +1 -1
  207. package/src/{devise.mjs → devise.js} +5 -9
  208. package/src/draggable-sort/index.jsx +3 -3
  209. package/src/draggable-sort/item.jsx +2 -2
  210. package/src/{error-logger.mjs → error-logger.js} +1 -1
  211. package/src/event-connection.jsx +1 -1
  212. package/src/event-model-class.jsx +1 -1
  213. package/src/form.jsx +1 -1
  214. package/src/index.js +3 -0
  215. package/src/inputs/attachment.jsx +2 -2
  216. package/src/inputs/checkbox.jsx +7 -6
  217. package/src/inputs/checkboxes.jsx +1 -1
  218. package/src/inputs/input-wrapper.jsx +1 -1
  219. package/src/inputs/input.jsx +8 -7
  220. package/src/inputs/money.jsx +3 -3
  221. package/src/inputs/select.jsx +1 -1
  222. package/src/{key-value-store.mjs → key-value-store.js} +1 -1
  223. package/src/link.jsx +2 -2
  224. package/src/modal.jsx +1 -1
  225. package/src/{model-class-require.mjs → model-class-require.js} +4 -2
  226. package/src/{model-events.mjs → model-events.js} +1 -1
  227. package/src/{model-name.mjs → model-name.js} +1 -1
  228. package/src/{model-recipes-loader.mjs → model-recipes-loader.js} +1 -1
  229. package/src/{model-recipes-model-loader.mjs → model-recipes-model-loader.js} +2 -2
  230. package/src/{models-response-reader.mjs → models-response-reader.js} +2 -2
  231. package/src/models.js +7 -0
  232. package/src/{models.mjs.erb → models.js.erb} +1 -1
  233. package/src/{params.mjs → params.js} +2 -2
  234. package/src/{preloaded.mjs → preloaded.js} +1 -1
  235. package/src/resize-observer.jsx +1 -1
  236. package/src/router/route.jsx +1 -1
  237. package/src/router/switch.jsx +1 -1
  238. package/src/router.jsx +1 -1
  239. package/src/{routes-native.mjs → routes-native.js} +1 -1
  240. package/src/{services.mjs → services.js} +1 -1
  241. package/src/{session-status-updater.mjs → session-status-updater.js} +3 -3
  242. package/src/{source-maps-loader.mjs → source-maps-loader.js} +1 -1
  243. package/src/super-admin/edit-page/edit-attribute-checkbox.jsx +1 -1
  244. package/src/super-admin/edit-page/edit-attribute-content.jsx +1 -1
  245. package/src/super-admin/edit-page/edit-attribute-input.jsx +1 -1
  246. package/src/super-admin/edit-page/edit-attribute.jsx +1 -1
  247. package/src/super-admin/edit-page.jsx +2 -2
  248. package/src/super-admin/has-edit-config.js +1 -1
  249. package/src/super-admin/index-page.jsx +1 -1
  250. package/src/super-admin/index.jsx +7 -7
  251. package/src/super-admin/layout/header/index.jsx +2 -2
  252. package/src/super-admin/layout/index.jsx +3 -3
  253. package/src/super-admin/layout/menu/index.jsx +3 -3
  254. package/src/super-admin/layout/menu/menu-content.jsx +2 -2
  255. package/src/super-admin/layout/menu/{menu-item/index.jsx → menu-item.jsx} +5 -6
  256. package/src/super-admin/layout/no-access.jsx +2 -2
  257. package/src/super-admin/model-class-table.jsx +3 -3
  258. package/src/super-admin/models.js +1 -1
  259. package/src/super-admin/show-nav.jsx +2 -2
  260. package/src/super-admin/show-page/belongs-to-attribute-row.jsx +1 -1
  261. package/src/super-admin/show-page/index.jsx +2 -2
  262. package/src/super-admin/show-reflection-actions.jsx +1 -1
  263. package/src/super-admin/show-reflection-link.jsx +1 -1
  264. package/src/super-admin/show-reflection-page.jsx +1 -1
  265. package/src/table/column-content.jsx +1 -1
  266. package/src/table/filters/filter-form.jsx +1 -1
  267. package/src/table/filters/index.jsx +5 -3
  268. package/src/table/filters/load-search-modal.jsx +6 -4
  269. package/src/table/filters/save-search-modal.jsx +4 -4
  270. package/src/table/header-select.jsx +1 -1
  271. package/src/table/model-column.jsx +1 -1
  272. package/src/table/model-row.jsx +2 -2
  273. package/src/table/{select-calculator.mjs → select-calculator.js} +1 -1
  274. package/src/table/settings/column-row.jsx +2 -2
  275. package/src/table/settings/download-action.jsx +3 -3
  276. package/src/table/settings/index.jsx +3 -3
  277. package/src/table/table-settings.js +5 -4
  278. package/src/table/table.jsx +8 -8
  279. package/src/table/{use-sorting.mjs → use-sorting.js} +1 -1
  280. package/src/table/worker-plugins-check-all-checkbox.jsx +2 -2
  281. package/src/table/worker-plugins-checkbox.jsx +2 -2
  282. package/src/{translated-collections.mjs → translated-collections.js} +1 -1
  283. package/src/updated-attribute.jsx +1 -1
  284. package/src/{use-breakpoint.mjs → use-breakpoint.js} +2 -2
  285. package/src/use-can-can.js +55 -0
  286. package/src/{use-collection.mjs → use-collection.js} +4 -4
  287. package/src/{use-created-event.mjs → use-created-event.js} +2 -2
  288. package/src/{use-current-user.mjs → use-current-user.js} +6 -5
  289. package/src/{use-destroyed-event.mjs → use-destroyed-event.js} +2 -2
  290. package/src/{use-input.mjs → use-input.js} +5 -5
  291. package/src/use-model-event.js +2 -2
  292. package/src/{use-model.mjs → use-model.js} +4 -4
  293. package/src/{use-resize-observer.mjs → use-resize-observer.js} +1 -1
  294. package/src/use-router.jsx +2 -2
  295. package/src/{use-updated-event.mjs → use-updated-event.js} +2 -2
  296. package/src/{use-validation-errors.mjs → use-validation-errors.js} +3 -3
  297. package/src/utils/checkbox.jsx +2 -2
  298. package/src/{validation-error.mjs → validation-error.js} +1 -1
  299. package/src/{validation-errors.mjs → validation-errors.js} +1 -1
  300. package/src/with-current-user.jsx +1 -1
  301. package/src/with-model.jsx +1 -1
  302. package/__tests__/base-model.test.mjs +0 -71
  303. package/__tests__/cable-connection-pool.test.mjs +0 -227
  304. package/__tests__/cable-subscription-pool.test.mjs +0 -27
  305. package/__tests__/can-can.test.mjs +0 -34
  306. package/__tests__/collection.test.mjs +0 -51
  307. package/__tests__/custom-error.test.mjs +0 -13
  308. package/__tests__/model-name.test.mjs +0 -34
  309. package/__tests__/model-prop-type.test.mjs +0 -113
  310. package/__tests__/params.test.mjs +0 -40
  311. package/__tests__/routes-native.test.mjs +0 -104
  312. package/__tests__/routes.test.mjs +0 -47
  313. package/__tests__/serializer.test.mjs +0 -30
  314. package/__tests__/support/task.mjs +0 -27
  315. package/__tests__/support/user.mjs +0 -32
  316. package/index.js +0 -1
  317. package/jest.config.js +0 -9
  318. package/src/event-created.jsx +0 -12
  319. package/src/event-destroyed.jsx +0 -25
  320. package/src/event-emitter-listener.jsx +0 -10
  321. package/src/event-listener.jsx +0 -25
  322. package/src/event-updated.jsx +0 -27
  323. package/src/super-admin/layout/menu/menu-item/style.scss +0 -10
  324. package/src/use-can-can.mjs +0 -48
  325. package/src/with-can-can.jsx +0 -12
  326. package/webpack.config.js +0 -15
  327. /package/src/{attribute-not-loaded-error.mjs → attribute-not-loaded-error.js} +0 -0
  328. /package/src/base-model/{column.mjs → column.js} +0 -0
  329. /package/src/base-model/{scope.mjs → scope.js} +0 -0
  330. /package/src/{cache-key-generator.mjs → cache-key-generator.js} +0 -0
  331. /package/src/{channels-consumer.mjs → channels-consumer.js} +0 -0
  332. /package/src/{command-submit-data.mjs → command-submit-data.js} +0 -0
  333. /package/src/{config.mjs → config.js} +0 -0
  334. /package/src/{data-set-to-attributes.mjs → data-set-to-attributes.js} +0 -0
  335. /package/src/draggable-sort/{controller.mjs → controller.js} +0 -0
  336. /package/src/{error-messages.mjs → error-messages.js} +0 -0
  337. /package/src/{events.mjs → events.js} +0 -0
  338. /package/src/inputs/{auto-submit.mjs → auto-submit.js} +0 -0
  339. /package/src/inputs/{id-for-component.mjs → id-for-component.js} +0 -0
  340. /package/src/inputs/{name-for-component.mjs → name-for-component.js} +0 -0
  341. /package/src/{instance-of-class-name.mjs → instance-of-class-name.js} +0 -0
  342. /package/src/{logger.mjs → logger.js} +0 -0
  343. /package/src/{model-prop-type.mjs → model-prop-type.js} +0 -0
  344. /package/src/{money-formatter.mjs → money-formatter.js} +0 -0
  345. /package/src/{not-loaded-error.mjs → not-loaded-error.js} +0 -0
  346. /package/src/{result.mjs → result.js} +0 -0
  347. /package/src/{routes.mjs → routes.js} +0 -0
  348. /package/src/{run-last.mjs → run-last.js} +0 -0
  349. /package/src/{serializer.mjs → serializer.js} +0 -0
  350. /package/src/table/{column-identifier.mjs → column-identifier.js} +0 -0
  351. /package/src/table/{column-visible.mjs → column-visible.js} +0 -0
  352. /package/src/table/{model-callback-args.mjs → model-callback-args.js} +0 -0
  353. /package/src/{translated-collections-data.mjs.erb → translated-collections-data.js.erb} +0 -0
  354. /package/src/{url-encode.mjs → url-encode.js} +0 -0
  355. /package/src/{use-event-emitter.mjs → use-event-emitter.js} +0 -0
  356. /package/src/{use-event-listener.mjs → use-event-listener.js} +0 -0
  357. /package/src/{use-screen-layout.mjs → use-screen-layout.js} +0 -0
@@ -0,0 +1,972 @@
1
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
2
+ import { digg, digs } from "diggerize";
3
+ import React, { createContext, useContext, useMemo, useRef } from "react";
4
+ import { Animated, Pressable, View } from "react-native";
5
+ import BaseComponent from "../base-component";
6
+ import Card from "../bootstrap/card";
7
+ import classNames from "classnames";
8
+ import Collection from "../collection";
9
+ import columnVisible from "./column-visible";
10
+ import debounce from "debounce";
11
+ import DraggableSort from "../draggable-sort/index";
12
+ import EventEmitter from "events";
13
+ import Filters from "./filters";
14
+ import FlatList from "./components/flat-list";
15
+ import FontAwesomeIcon from "react-native-vector-icons/FontAwesome";
16
+ import { Form } from "../form";
17
+ import Header from "./components/header";
18
+ import HeaderColumn from "./header-column";
19
+ import HeaderSelect from "./header-select";
20
+ import * as inflection from "inflection";
21
+ import memo from "set-state-compare/src/memo";
22
+ import modelClassRequire from "../model-class-require";
23
+ import ModelRow from "./model-row";
24
+ import Paginate from "../bootstrap/paginate";
25
+ import Params from "../params";
26
+ import PropTypes from "prop-types";
27
+ import Row from "./components/row";
28
+ import selectCalculator from "./select-calculator";
29
+ import Select from "../inputs/select";
30
+ import Settings from "./settings/index";
31
+ import { shapeComponent } from "set-state-compare/src/shape-component";
32
+ import TableSettings from "./table-settings";
33
+ import Text from "../utils/text";
34
+ import uniqunize from "uniqunize";
35
+ import useBreakpoint from "../use-breakpoint";
36
+ import useCollection from "../use-collection";
37
+ import useI18n from "i18n-on-steroids/src/use-i18n";
38
+ import useEventEmitter from "../use-event-emitter";
39
+ import useModelEvent from "../use-model-event";
40
+ import useQueryParams from "on-location-changed/src/use-query-params";
41
+ import Widths from "./widths";
42
+ const paginationOptions = [30, 60, 90, ["All", "all"]];
43
+ const WorkerPluginsCheckAllCheckbox = /*#__PURE__*/React.lazy(() => import("./worker-plugins-check-all-checkbox"));
44
+ const TableContext = /*#__PURE__*/createContext();
45
+ const ListHeaderComponent = memo(shapeComponent(class ListHeaderComponent extends BaseComponent {
46
+ setup() {
47
+ this.useStates({
48
+ lastUpdate: new Date()
49
+ });
50
+ }
51
+ render() {
52
+ const {
53
+ mdUp
54
+ } = useBreakpoint();
55
+ const tableContextValue = useContext(TableContext);
56
+ const table = tableContextValue.table;
57
+ const {
58
+ collection,
59
+ events,
60
+ queryWithoutPagination,
61
+ t
62
+ } = table.tt;
63
+ const {
64
+ query
65
+ } = digs(collection, "query");
66
+ useEventEmitter(events, "columnVisibilityUpdated", this.tt.onColumnVisibilityUpdated);
67
+ return /*#__PURE__*/React.createElement(Row, {
68
+ dataSet: {
69
+ class: "api-maker/table/header-row"
70
+ },
71
+ style: table.styleForRowHeader()
72
+ }, table.p.workplace && table.s.currentWorkplace && /*#__PURE__*/React.createElement(Header, {
73
+ style: table.styleForHeader({
74
+ style: {
75
+ width: mdUp ? 41 : undefined
76
+ }
77
+ })
78
+ }, /*#__PURE__*/React.createElement(WorkerPluginsCheckAllCheckbox, {
79
+ currentWorkplace: table.s.currentWorkplace,
80
+ query: queryWithoutPagination,
81
+ style: {
82
+ marginHorizontal: "auto"
83
+ }
84
+ }), !mdUp && /*#__PURE__*/React.createElement(Text, {
85
+ style: {
86
+ marginLeft: 3
87
+ }
88
+ }, t(".select_all_found", {
89
+ defaultValue: "Select all found"
90
+ }))), !mdUp && /*#__PURE__*/React.createElement(Header, {
91
+ style: table.styleForHeader({
92
+ style: {}
93
+ })
94
+ }, /*#__PURE__*/React.createElement(HeaderSelect, {
95
+ preparedColumns: table.s.preparedColumns,
96
+ query: query,
97
+ table: table
98
+ })), mdUp && /*#__PURE__*/React.createElement(React.Fragment, null, table.headersContentFromColumns(), /*#__PURE__*/React.createElement(Header, {
99
+ style: table.styleForHeader({
100
+ style: {},
101
+ type: "actions"
102
+ })
103
+ })));
104
+ }
105
+ onColumnVisibilityUpdated = () => this.setState({
106
+ lastUpdate: new Date()
107
+ });
108
+ }));
109
+ export default memo(shapeComponent(class ApiMakerTable extends BaseComponent {
110
+ static defaultProps = {
111
+ card: true,
112
+ currentUser: null,
113
+ destroyEnabled: true,
114
+ filterCard: true,
115
+ filterSubmitButton: true,
116
+ noRecordsAvailableContent: undefined,
117
+ noRecordsFoundContent: undefined,
118
+ preloads: [],
119
+ select: {},
120
+ styleUI: true,
121
+ workplace: false
122
+ };
123
+ static propTypes = {
124
+ abilities: PropTypes.object,
125
+ actionsContent: PropTypes.func,
126
+ appHistory: PropTypes.object,
127
+ card: PropTypes.bool.isRequired,
128
+ className: PropTypes.string,
129
+ collection: PropTypes.instanceOf(Collection),
130
+ columns: PropTypes.oneOfType([PropTypes.array, PropTypes.func]),
131
+ controls: PropTypes.func,
132
+ currentUser: PropTypes.object,
133
+ defaultDateFormatName: PropTypes.string,
134
+ defaultDateTimeFormatName: PropTypes.string,
135
+ defaultParams: PropTypes.object,
136
+ destroyEnabled: PropTypes.bool.isRequired,
137
+ destroyMessage: PropTypes.string,
138
+ editModelPath: PropTypes.func,
139
+ filterCard: PropTypes.bool.isRequired,
140
+ filterContent: PropTypes.func,
141
+ filterSubmitLabel: PropTypes.node,
142
+ groupBy: PropTypes.array,
143
+ header: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),
144
+ identifier: PropTypes.string,
145
+ modelClass: PropTypes.func.isRequired,
146
+ noRecordsAvailableContent: PropTypes.func,
147
+ noRecordsFoundContent: PropTypes.func,
148
+ onModelsLoaded: PropTypes.func,
149
+ paginateContent: PropTypes.func,
150
+ paginationComponent: PropTypes.func,
151
+ preloads: PropTypes.array.isRequired,
152
+ queryMethod: PropTypes.func,
153
+ queryName: PropTypes.string,
154
+ select: PropTypes.object,
155
+ selectColumns: PropTypes.object,
156
+ styles: PropTypes.object,
157
+ styleUI: PropTypes.bool.isRequired,
158
+ viewModelPath: PropTypes.func,
159
+ workplace: PropTypes.bool.isRequired
160
+ };
161
+ draggableSortEvents = new EventEmitter();
162
+ events = new EventEmitter();
163
+ tableSettings = null;
164
+ setup() {
165
+ const {
166
+ t
167
+ } = useI18n({
168
+ namespace: "js.api_maker.table"
169
+ });
170
+ const {
171
+ name: breakpoint,
172
+ mdUp
173
+ } = useBreakpoint();
174
+ const queryParams = useQueryParams();
175
+ this.setInstance({
176
+ breakpoint,
177
+ filterFormRef: useRef(),
178
+ mdUp,
179
+ t
180
+ });
181
+ const collectionKey = digg(this.p.modelClass.modelClassData(), "collectionKey");
182
+ let queryName = this.props.queryName;
183
+ if (!queryName) queryName = collectionKey;
184
+ const querySName = `${queryName}_s`;
185
+ this.useStates({
186
+ columns: () => this.columnsAsArray(),
187
+ currentWorkplace: undefined,
188
+ currentWorkplaceCount: null,
189
+ filterForm: null,
190
+ columnsToShow: null,
191
+ draggedColumn: null,
192
+ identifier: () => this.props.identifier || `${collectionKey}-default`,
193
+ lastUpdate: () => new Date(),
194
+ preload: undefined,
195
+ preparedColumns: undefined,
196
+ queryName,
197
+ queryQName: () => `${queryName}_q`,
198
+ queryPageName: () => `${queryName}_page`,
199
+ querySName,
200
+ resizing: false,
201
+ showFilters: () => Boolean(queryParams[querySName]),
202
+ showSettings: false,
203
+ tableSetting: undefined,
204
+ tableSettingLoaded: false,
205
+ tableSettingFullCacheKey: undefined,
206
+ width: undefined,
207
+ widths: null
208
+ });
209
+ this.tableContextValue = useMemo(() => ({
210
+ cacheKey: this.s.tableSettingFullCacheKey,
211
+ lastUpdate: this.s.lastUpdate,
212
+ resizing: this.s.resizing,
213
+ table: this
214
+ }), [this.s.lastUpdate, this.s.resizing, this.s.tableSettingFullCacheKey]);
215
+ useMemo(() => {
216
+ if (this.props.workplace) {
217
+ this.loadCurrentWorkplace().then(() => {
218
+ this.loadCurrentWorkplaceCount();
219
+ });
220
+ }
221
+ }, [this.p.currentUser?.id()]);
222
+ useMemo(() => {
223
+ if (!this.tt.tableSettings && this.s.width) {
224
+ this.loadTableSetting();
225
+ }
226
+ }, [this.p.currentUser?.id(), this.s.width]);
227
+ useModelEvent(this.s.currentWorkplace, "workplace_links_created", this.tt.onLinksCreated);
228
+ useModelEvent(this.s.currentWorkplace, "workplace_links_destroyed", this.tt.onLinksDestroyed);
229
+ let collectionReady = true;
230
+ let select;
231
+ if (!this.s.preparedColumns) {
232
+ collectionReady = false;
233
+ }
234
+ if (collectionReady) {
235
+ select = selectCalculator({
236
+ table: this
237
+ });
238
+ }
239
+ this.collection = useCollection({
240
+ abilities: this.abilitiesToLoad(),
241
+ defaultParams: this.props.defaultParams,
242
+ collection: this.props.collection,
243
+ groupBy: this.props.groupBy,
244
+ ifCondition: collectionReady,
245
+ modelClass: this.props.modelClass,
246
+ onModelsLoaded: this.props.onModelsLoaded,
247
+ noRecordsAvailableContent: this.props.noRecordsAvailableContent,
248
+ noRecordsFoundContent: this.props.noRecordsFoundContent,
249
+ pagination: true,
250
+ preloads: this.state.preload,
251
+ queryMethod: this.props.queryMethod,
252
+ queryName,
253
+ select,
254
+ selectColumns: this.props.selectColumns
255
+ });
256
+ this.queryWithoutPagination = useMemo(() => this.collection?.query?.clone()?.except("page"), [this.collection.query]);
257
+ useEventEmitter(this.tt.draggableSortEvents, "onDragStart", this.tt.onDragStart);
258
+ useEventEmitter(this.tt.draggableSortEvents, "onDragEndAnimation", this.tt.onDragEndAnimation);
259
+ useEventEmitter(this.tt.events, "columnVisibilityUpdated", this.tt.onColumnVisibilityUpdated);
260
+ }
261
+ onColumnVisibilityUpdated = () => this.setState({
262
+ columnsToShow: this.getColumnsToShow(this.s.columns),
263
+ lastUpdate: new Date()
264
+ });
265
+ onDragStart = ({
266
+ item
267
+ }) => item.animatedZIndex.setValue(9999);
268
+ onDragEndAnimation = ({
269
+ item
270
+ }) => item.animatedZIndex.setValue(0);
271
+ async loadCurrentWorkplace() {
272
+ const Workplace = modelClassRequire("Workplace");
273
+ const result = await Workplace.current();
274
+ const currentWorkplace = digg(result, "current", 0);
275
+ this.setState({
276
+ currentWorkplace
277
+ });
278
+ }
279
+ async loadCurrentWorkplaceCount() {
280
+ const WorkplaceLink = modelClassRequire("WorkplaceLink");
281
+ const currentWorkplaceCount = await WorkplaceLink.ransack({
282
+ resource_type_eq: this.p.modelClass.modelClassData().name,
283
+ workplace_id_eq: this.s.currentWorkplace.id()
284
+ }).count();
285
+ this.setState({
286
+ currentWorkplaceCount
287
+ });
288
+ }
289
+ getColumnsToShow(columns) {
290
+ return columns.filter(({
291
+ column,
292
+ tableSettingColumn
293
+ }) => columnVisible(column, tableSettingColumn)).sort((a, b) => a.tableSettingColumn.position() - b.tableSettingColumn.position());
294
+ }
295
+ async loadTableSetting() {
296
+ this.tableSettings = new TableSettings({
297
+ table: this
298
+ });
299
+ const tableSetting = await this.tableSettings.loadExistingOrCreateTableSettings();
300
+ const {
301
+ columns,
302
+ preload
303
+ } = this.tableSettings.preparedColumns(tableSetting);
304
+ const {
305
+ width
306
+ } = this.s;
307
+ const widths = new Widths({
308
+ columns,
309
+ table: this,
310
+ width
311
+ });
312
+ const columnsToShow = this.getColumnsToShow(columns);
313
+ this.setState({
314
+ columns,
315
+ columnsToShow,
316
+ preparedColumns: columns,
317
+ preload: this.mergedPreloads(preload),
318
+ tableSetting,
319
+ tableSettingLoaded: true,
320
+ tableSettingFullCacheKey: tableSetting.fullCacheKey(),
321
+ widths
322
+ });
323
+ }
324
+ updateSettingsFullCacheKey = () => this.setState({
325
+ tableSettingFullCacheKey: this.state.tableSetting.fullCacheKey()
326
+ });
327
+ columnsAsArray = () => {
328
+ if (typeof this.props.columns == "function") {
329
+ return this.props.columns();
330
+ }
331
+ return this.props.columns;
332
+ };
333
+ mergedPreloads(preload) {
334
+ const {
335
+ preloads
336
+ } = this.props;
337
+ let mergedPreloads = [];
338
+ if (preloads) mergedPreloads = mergedPreloads.concat(preloads);
339
+ if (preload) mergedPreloads = mergedPreloads.concat(preload);
340
+ return uniqunize(mergedPreloads);
341
+ }
342
+ render() {
343
+ const {
344
+ modelClass,
345
+ noRecordsAvailableContent,
346
+ noRecordsFoundContent
347
+ } = this.p;
348
+ const {
349
+ collection,
350
+ currentUser
351
+ } = this.props;
352
+ const {
353
+ queryName,
354
+ querySName,
355
+ showFilters
356
+ } = this.s;
357
+ const {
358
+ models,
359
+ overallCount,
360
+ qParams,
361
+ query,
362
+ result,
363
+ showNoRecordsAvailableContent,
364
+ showNoRecordsFoundContent
365
+ } = digs(this.collection, "models", "overallCount", "qParams", "query", "result", "showNoRecordsAvailableContent", "showNoRecordsFoundContent");
366
+ if (collection && collection.args.modelClass.modelClassData().name != modelClass.modelClassData().name) {
367
+ throw new Error(`Model class from collection '${collection.args.modelClass.modelClassData().name}' ` + `didn't match model class on table: '${modelClass.modelClassData().name}'`);
368
+ }
369
+ return /*#__PURE__*/React.createElement(View, {
370
+ dataSet: {
371
+ class: this.className()
372
+ },
373
+ onLayout: this.tt.onContainerLayout,
374
+ style: this.props.styles?.container
375
+ }, showNoRecordsAvailableContent && /*#__PURE__*/React.createElement("div", {
376
+ className: "live-table--no-records-available-content"
377
+ }, noRecordsAvailableContent({
378
+ models,
379
+ qParams,
380
+ overallCount
381
+ })), showNoRecordsFoundContent && /*#__PURE__*/React.createElement("div", {
382
+ className: "live-table--no-records-found-content"
383
+ }, noRecordsFoundContent({
384
+ models,
385
+ qParams,
386
+ overallCount
387
+ })), showFilters && /*#__PURE__*/React.createElement(Filters, {
388
+ currentUser: currentUser,
389
+ modelClass: modelClass,
390
+ queryName: queryName,
391
+ querySName: querySName
392
+ }), qParams && query && result && models && !showNoRecordsAvailableContent && !showNoRecordsFoundContent && this.cardOrTable());
393
+ }
394
+ abilitiesToLoad() {
395
+ const abilitiesToLoad = {};
396
+ const {
397
+ abilities,
398
+ modelClass
399
+ } = this.props;
400
+ const ownAbilities = [];
401
+ if (this.props.destroyEnabled) ownAbilities.push("destroy");
402
+ if (this.props.editModelPath) ownAbilities.push("edit");
403
+ if (this.props.viewModelPath) ownAbilities.push("show");
404
+ if (ownAbilities.length > 0) {
405
+ const modelClassName = digg(modelClass.modelClassData(), "name");
406
+ abilitiesToLoad[modelClassName] = ownAbilities;
407
+ }
408
+ if (abilities) {
409
+ for (const modelName in abilities) {
410
+ if (!(modelName in abilitiesToLoad)) {
411
+ abilitiesToLoad[modelName] = [];
412
+ }
413
+ for (const ability of abilities[modelName]) {
414
+ abilitiesToLoad[modelName].push(ability);
415
+ }
416
+ }
417
+ }
418
+ return abilitiesToLoad;
419
+ }
420
+ cardOrTable() {
421
+ const {
422
+ abilities,
423
+ actionsContent,
424
+ appHistory,
425
+ card,
426
+ className,
427
+ collection,
428
+ columns,
429
+ controls,
430
+ currentUser,
431
+ defaultDateFormatName,
432
+ defaultDateTimeFormatName,
433
+ defaultParams,
434
+ destroyEnabled,
435
+ destroyMessage,
436
+ editModelPath,
437
+ filterCard,
438
+ filterContent,
439
+ filterSubmitButton,
440
+ filterSubmitLabel,
441
+ groupBy,
442
+ header,
443
+ identifier,
444
+ modelClass,
445
+ noRecordsAvailableContent,
446
+ noRecordsFoundContent,
447
+ onModelsLoaded,
448
+ paginateContent,
449
+ paginationComponent,
450
+ preloads,
451
+ queryMethod,
452
+ queryName,
453
+ select,
454
+ selectColumns,
455
+ styleUI,
456
+ viewModelPath,
457
+ workplace,
458
+ ...restProps
459
+ } = this.props;
460
+ const {
461
+ models,
462
+ qParams,
463
+ query,
464
+ result
465
+ } = digs(this.collection, "models", "qParams", "query", "result");
466
+ let headerContent, PaginationComponent;
467
+ if (typeof header == "function") {
468
+ headerContent = header({
469
+ models,
470
+ qParams,
471
+ query,
472
+ result
473
+ });
474
+ } else if (header) {
475
+ headerContent = header;
476
+ } else {
477
+ headerContent = modelClass.modelName().human({
478
+ count: 2
479
+ });
480
+ }
481
+ if (!paginateContent) {
482
+ if (paginationComponent) {
483
+ PaginationComponent = paginationComponent;
484
+ } else {
485
+ PaginationComponent = Paginate;
486
+ }
487
+ }
488
+ const flatListStyle = {
489
+ overflowX: "auto"
490
+ };
491
+ if (styleUI) {
492
+ flatListStyle.border = "1px solid #dbdbdb";
493
+ flatListStyle.borderRadius = 5;
494
+ }
495
+ const flatList = /*#__PURE__*/React.createElement(TableContext.Provider, {
496
+ value: this.tt.tableContextValue
497
+ }, /*#__PURE__*/React.createElement(FlatList, _extends({
498
+ data: models,
499
+ dataSet: {
500
+ class: classNames("api-maker--table", className),
501
+ cacheKey: this.s.tableSettingFullCacheKey,
502
+ lastUpdate: this.s.lastUpdate
503
+ },
504
+ extraData: this.s.lastUpdate,
505
+ keyExtractor: this.tt.keyExtrator,
506
+ ListHeaderComponent: ListHeaderComponent,
507
+ renderItem: this.tt.renderItem,
508
+ showsHorizontalScrollIndicator: true,
509
+ style: flatListStyle
510
+ }, restProps)));
511
+ return /*#__PURE__*/React.createElement(React.Fragment, null, filterContent && filterCard && /*#__PURE__*/React.createElement(Card, {
512
+ className: "live-table--filter-card mb-4"
513
+ }, this.filterForm()), filterContent && !filterCard && this.filterForm(), card && /*#__PURE__*/React.createElement(Card, _extends({
514
+ className: classNames("live-table--table-card", "mb-4", className),
515
+ controls: this.tableControls(),
516
+ header: headerContent,
517
+ footer: this.tableFooter()
518
+ }, restProps), flatList), !card && flatList, result && PaginationComponent && /*#__PURE__*/React.createElement(PaginationComponent, {
519
+ result: result
520
+ }), result && paginateContent && paginateContent({
521
+ result
522
+ }));
523
+ }
524
+ onContainerLayout = e => {
525
+ const {
526
+ width
527
+ } = e.nativeEvent.layout;
528
+ const {
529
+ widths
530
+ } = this.s;
531
+ this.setState({
532
+ width
533
+ });
534
+ if (widths) widths.tableWidth = width;
535
+ };
536
+ onLinksCreated = ({
537
+ args
538
+ }) => {
539
+ const modelClassName = this.p.modelClass.modelClassData().name;
540
+ if (args.created[modelClassName]) {
541
+ const amountCreated = args.created[modelClassName].length;
542
+ this.setState(prevState => ({
543
+ currentWorkplaceCount: prevState.currentWorkplaceCount + amountCreated
544
+ }));
545
+ }
546
+ };
547
+ onLinksDestroyed = ({
548
+ args
549
+ }) => {
550
+ const modelClassName = this.p.modelClass.modelClassData().name;
551
+ if (args.destroyed[modelClassName]) {
552
+ const amountDestroyed = args.destroyed[modelClassName].length;
553
+ this.setState(prevState => ({
554
+ currentWorkplaceCount: prevState.currentWorkplaceCount - amountDestroyed
555
+ }));
556
+ }
557
+ };
558
+ keyExtrator = model => `${this.s.tableSettingFullCacheKey}-${model.id()}`;
559
+ filterForm = () => {
560
+ const {
561
+ filterFormRef,
562
+ submitFilter,
563
+ submitFilterDebounce
564
+ } = this.tt;
565
+ const {
566
+ filterContent,
567
+ filterSubmitButton
568
+ } = this.p;
569
+ const {
570
+ queryQName
571
+ } = this.s;
572
+ const {
573
+ filterSubmitLabel
574
+ } = this.props;
575
+ const {
576
+ qParams
577
+ } = digs(this.collection, "qParams");
578
+ return /*#__PURE__*/React.createElement(Form, {
579
+ className: "live-table--filter-form",
580
+ formRef: filterFormRef,
581
+ onSubmit: this.tt.onFilterFormSubmit,
582
+ setForm: this.setStates.filterForm
583
+ }, "s" in qParams && /*#__PURE__*/React.createElement("input", {
584
+ name: "s",
585
+ type: "hidden",
586
+ value: qParams.s
587
+ }), filterContent({
588
+ onFilterChanged: submitFilter,
589
+ onFilterChangedWithDelay: submitFilterDebounce,
590
+ qParams,
591
+ queryQName
592
+ }), filterSubmitButton && /*#__PURE__*/React.createElement("input", {
593
+ className: "btn btn-primary live-table--submit-filter-button",
594
+ type: "submit",
595
+ style: {
596
+ marginTop: "8px"
597
+ },
598
+ value: filterSubmitLabel || this.t(".filter", {
599
+ defaultValue: "Filter"
600
+ })
601
+ }));
602
+ };
603
+ onFilterClicked = e => {
604
+ e.preventDefault();
605
+ this.setState({
606
+ showFilters: !this.state.showFilters
607
+ });
608
+ };
609
+ onPerPageChanged = e => {
610
+ const {
611
+ queryName
612
+ } = this.s;
613
+ const newPerPageValue = digg(e, "target", "value");
614
+ const perKey = `${queryName}_per`;
615
+ const paramsChange = {};
616
+ paramsChange[perKey] = newPerPageValue;
617
+ Params.changeParams(paramsChange);
618
+ };
619
+ renderItem = ({
620
+ index,
621
+ item: model
622
+ }) => {
623
+ if (!this.s.tableSettingLoaded) {
624
+ return /*#__PURE__*/React.createElement(View, null, /*#__PURE__*/React.createElement(Text, null, this.t(".loading_dot_dot_dot", {
625
+ defaultValue: "Loading..."
626
+ })));
627
+ }
628
+ return /*#__PURE__*/React.createElement(ModelRow, {
629
+ cacheKey: model.cacheKey(),
630
+ columns: this.s.columnsToShow,
631
+ columnWidths: this.columnWidths(),
632
+ events: this.tt.events,
633
+ index: index,
634
+ key: model.id(),
635
+ model: model,
636
+ table: this,
637
+ tableSettingFullCacheKey: this.s.tableSettingFullCacheKey
638
+ });
639
+ };
640
+ styleForColumn = ({
641
+ column,
642
+ columnIndex,
643
+ even,
644
+ style,
645
+ type
646
+ }) => {
647
+ const {
648
+ styleUI
649
+ } = this.p;
650
+ const defaultStyle = {
651
+ justifyContent: "center",
652
+ padding: 8,
653
+ overflow: "hidden"
654
+ };
655
+ if (styleUI) {
656
+ Object.assign(defaultStyle, {
657
+ backgroundColor: even ? "#f5f5f5" : "#fff"
658
+ });
659
+ }
660
+ if (type == "actions") {
661
+ defaultStyle.flexDirection = "row";
662
+ defaultStyle.alignItems = "center";
663
+ if (this.tt.mdUp) {
664
+ defaultStyle.marginLeft = "auto";
665
+ } else {
666
+ defaultStyle.marginRight = "auto";
667
+ }
668
+ } else if (this.tt.mdUp && styleUI) {
669
+ defaultStyle.borderRight = "1px solid #dbdbdb";
670
+ }
671
+ const actualStyle = Object.assign(defaultStyle, style);
672
+ return actualStyle;
673
+ };
674
+ styleForHeader = ({
675
+ column,
676
+ columnIndex,
677
+ style,
678
+ type
679
+ }) => {
680
+ const {
681
+ mdUp
682
+ } = this.tt;
683
+ const defaultStyle = {
684
+ flexDirection: "row",
685
+ alignItems: "center",
686
+ padding: 8
687
+ };
688
+ if (type != "actions" && mdUp && this.p.styleUI) {
689
+ defaultStyle.borderRight = "1px solid #dbdbdb";
690
+ }
691
+ const actualStyle = Object.assign(defaultStyle, style);
692
+ return actualStyle;
693
+ };
694
+ styleForHeaderText() {
695
+ const actualStyle = {
696
+ fontWeight: "bold"
697
+ };
698
+ return actualStyle;
699
+ }
700
+ styleForRow = ({
701
+ even
702
+ } = {}) => {
703
+ const actualStyle = {
704
+ flex: 1,
705
+ alignItems: "stretch"
706
+ };
707
+ if (even && this.p.styleUI) {
708
+ actualStyle.backgroundColor = "#f5f5f5";
709
+ }
710
+ return actualStyle;
711
+ };
712
+ styleForRowHeader = () => {
713
+ const actualStyle = {
714
+ flex: 1,
715
+ alignItems: "stretch"
716
+ };
717
+ return actualStyle;
718
+ };
719
+ tableControls() {
720
+ const {
721
+ controls
722
+ } = this.props;
723
+ const {
724
+ showSettings
725
+ } = this.s;
726
+ const {
727
+ models,
728
+ qParams,
729
+ query,
730
+ result
731
+ } = digs(this.collection, "models", "qParams", "query", "result");
732
+ return /*#__PURE__*/React.createElement(View, {
733
+ style: {
734
+ flexDirection: "row"
735
+ }
736
+ }, controls && controls({
737
+ models,
738
+ qParams,
739
+ query,
740
+ result
741
+ }), /*#__PURE__*/React.createElement(Pressable, {
742
+ dataSet: {
743
+ class: "filter-button"
744
+ },
745
+ onPress: this.tt.onFilterClicked
746
+ }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
747
+ name: "search",
748
+ size: 20
749
+ })), /*#__PURE__*/React.createElement(View, {
750
+ style: {
751
+ position: "relative"
752
+ }
753
+ }, showSettings && /*#__PURE__*/React.createElement(Settings, {
754
+ onRequestClose: this.tt.onRequestCloseSettings,
755
+ table: this
756
+ }), /*#__PURE__*/React.createElement(Pressable, {
757
+ dataSet: {
758
+ class: "settings-button"
759
+ },
760
+ onPress: this.tt.onSettingsClicked
761
+ }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
762
+ name: "gear",
763
+ size: 20
764
+ }))));
765
+ }
766
+ tableFooter() {
767
+ const {
768
+ result
769
+ } = digs(this.collection, "result");
770
+ const currentPage = result.currentPage();
771
+ const totalCount = result.totalCount();
772
+ const perPage = result.perPage();
773
+ const to = Math.min(currentPage * perPage, totalCount);
774
+ const defaultValue = "Showing %{from} to %{to} out of %{total_count} total.";
775
+ let from = (currentPage - 1) * perPage + 1;
776
+ if (to === 0) from = 0;
777
+ return /*#__PURE__*/React.createElement(View, {
778
+ style: {
779
+ flexDirection: "row",
780
+ justifyContent: "space-between",
781
+ marginTop: 10
782
+ }
783
+ }, /*#__PURE__*/React.createElement(View, {
784
+ dataSet: {
785
+ class: "showing-counts"
786
+ },
787
+ style: {
788
+ flexDirection: "row"
789
+ }
790
+ }, /*#__PURE__*/React.createElement(Text, null, this.t(".showing_from_to_out_of_total", {
791
+ defaultValue,
792
+ from,
793
+ to,
794
+ total_count: totalCount
795
+ })), this.p.workplace && this.s.currentWorkplaceCount !== null && /*#__PURE__*/React.createElement(Text, {
796
+ style: {
797
+ marginLeft: 3
798
+ }
799
+ }, this.t(".x_selected", {
800
+ defaultValue: "%{selected} selected.",
801
+ selected: this.s.currentWorkplaceCount
802
+ }))), /*#__PURE__*/React.createElement(View, null, /*#__PURE__*/React.createElement(Select, {
803
+ className: "per-page-select",
804
+ defaultValue: perPage,
805
+ onChange: this.tt.onPerPageChanged,
806
+ options: paginationOptions
807
+ })));
808
+ }
809
+ className() {
810
+ const classNames = ["api-maker--table"];
811
+ if (this.props.className) {
812
+ classNames.push(this.props.className);
813
+ }
814
+ return classNames.join(" ");
815
+ }
816
+ columnProps(column) {
817
+ const props = {};
818
+ if (column.textCenter) {
819
+ props.style ||= {};
820
+ props.style.textAlign = "center";
821
+ }
822
+ if (column.textRight) {
823
+ props.style ||= {};
824
+ props.style.textAlign = "right";
825
+ }
826
+ return props;
827
+ }
828
+ headerProps(column) {
829
+ const props = {};
830
+ if (column.textCenter) {
831
+ props.style ||= {};
832
+ props.style.justifyContent = "center";
833
+ }
834
+ if (column.textRight) {
835
+ props.style ||= {};
836
+ props.style.justifyContent = "end";
837
+ }
838
+ return props;
839
+ }
840
+ columnWidths() {
841
+ const columnWidths = {};
842
+ for (const column of this.s.preparedColumns) {
843
+ columnWidths[column.tableSettingColumn.identifier()] = column.width;
844
+ }
845
+ return columnWidths;
846
+ }
847
+ headersContentFromColumns = () => {
848
+ return /*#__PURE__*/React.createElement(DraggableSort, {
849
+ data: this.s.columnsToShow,
850
+ events: this.tt.draggableSortEvents,
851
+ horizontal: true,
852
+ keyExtractor: this.tt.dragListkeyExtractor,
853
+ onItemMoved: this.tt.onItemMoved,
854
+ onReordered: this.tt.onReordered,
855
+ renderItem: this.tt.dragListRenderItemContent
856
+ });
857
+ };
858
+ dragListCacheKeyExtractor = item => `${item.tableSettingColumn.identifier()}-${this.s.resizing}`;
859
+ dragListkeyExtractor = item => item.tableSettingColumn.identifier();
860
+ onItemMoved = ({
861
+ animationArgs,
862
+ itemIndex,
863
+ x,
864
+ y
865
+ }) => {
866
+ const animatedPosition = digg(this, "s", "columnsToShow", itemIndex, "animatedPosition");
867
+ if (animationArgs) {
868
+ Animated.timing(animatedPosition, animationArgs).start();
869
+ } else {
870
+ animatedPosition.setValue({
871
+ x,
872
+ y
873
+ });
874
+ }
875
+ };
876
+ onReordered = async ({
877
+ fromItem,
878
+ fromPosition,
879
+ toItem,
880
+ toPosition
881
+ }) => {
882
+ if (fromPosition == toPosition) return; // Only do requests and queries if changed
883
+
884
+ const TableSettingColumn = fromItem.tableSettingColumn.constructor;
885
+ const toColumn = await TableSettingColumn.find(toItem.tableSettingColumn.id()); // Need to load latest position because ActsAsList might have changed it
886
+
887
+ await fromItem.tableSettingColumn.update({
888
+ position: toColumn.position()
889
+ });
890
+ };
891
+ dragListRenderItemContent = ({
892
+ isActive,
893
+ item,
894
+ touchProps
895
+ }) => {
896
+ const {
897
+ animatedWidth,
898
+ animatedZIndex,
899
+ column,
900
+ tableSettingColumn
901
+ } = item;
902
+ return /*#__PURE__*/React.createElement(HeaderColumn, {
903
+ active: isActive,
904
+ animatedWidth: animatedWidth,
905
+ animatedZIndex: animatedZIndex,
906
+ column: column,
907
+ key: tableSettingColumn.identifier(),
908
+ resizing: this.s.resizing,
909
+ table: this,
910
+ tableSettingColumn: tableSettingColumn,
911
+ touchProps: touchProps,
912
+ widths: this.s.widths
913
+ });
914
+ };
915
+ headerClassNameForColumn(column) {
916
+ const classNames = [];
917
+ if (column.commonProps && column.commonProps.className) classNames.push(column.commonProps.className);
918
+ if (column.headerProps && column.headerProps.className) classNames.push(column.headerProps.className);
919
+ return classNames;
920
+ }
921
+ headerLabelForColumn(column) {
922
+ const {
923
+ modelClass
924
+ } = this.p;
925
+ if ("label" in column) {
926
+ if (typeof column.label == "function") {
927
+ return column.label();
928
+ } else {
929
+ return column.label;
930
+ }
931
+ }
932
+ let currentModelClass = modelClass;
933
+
934
+ // Calculate current model class through path
935
+ if (column.path) {
936
+ for (const pathPart of column.path) {
937
+ const relationships = digg(currentModelClass.modelClassData(), "relationships");
938
+ const relationship = relationships.find(relationshipInArray => relationshipInArray.name == inflection.underscore(pathPart));
939
+ currentModelClass = modelClassRequire(digg(relationship, "resource_name"));
940
+ }
941
+ }
942
+ if (column.attribute) return currentModelClass.humanAttributeName(column.attribute);
943
+ throw new Error("No 'label' or 'attribute' was given");
944
+ }
945
+ onFilterFormSubmit = () => this.submitFilter();
946
+ onRequestCloseSettings = () => this.setState({
947
+ showSettings: false
948
+ });
949
+ onSettingsClicked = e => {
950
+ e.preventDefault();
951
+ this.setState({
952
+ showSettings: !this.s.showSettings
953
+ });
954
+ };
955
+ submitFilter = () => {
956
+ const filterForm = digg(this.tt.filterFormRef, "current");
957
+ const {
958
+ appHistory
959
+ } = this.props;
960
+ const qParams = Params.serializeForm(filterForm);
961
+ const {
962
+ queryQName
963
+ } = this.s;
964
+ const changeParamsParams = {};
965
+ changeParamsParams[queryQName] = JSON.stringify(qParams);
966
+ Params.changeParams(changeParamsParams, {
967
+ appHistory
968
+ });
969
+ };
970
+ submitFilterDebounce = debounce(this.tt.submitFilter);
971
+ }));
972
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkaWdnIiwiZGlncyIsIlJlYWN0IiwiY3JlYXRlQ29udGV4dCIsInVzZUNvbnRleHQiLCJ1c2VNZW1vIiwidXNlUmVmIiwiQW5pbWF0ZWQiLCJQcmVzc2FibGUiLCJWaWV3IiwiQmFzZUNvbXBvbmVudCIsIkNhcmQiLCJjbGFzc05hbWVzIiwiQ29sbGVjdGlvbiIsImNvbHVtblZpc2libGUiLCJkZWJvdW5jZSIsIkRyYWdnYWJsZVNvcnQiLCJFdmVudEVtaXR0ZXIiLCJGaWx0ZXJzIiwiRmxhdExpc3QiLCJGb250QXdlc29tZUljb24iLCJGb3JtIiwiSGVhZGVyIiwiSGVhZGVyQ29sdW1uIiwiSGVhZGVyU2VsZWN0IiwiaW5mbGVjdGlvbiIsIm1lbW8iLCJtb2RlbENsYXNzUmVxdWlyZSIsIk1vZGVsUm93IiwiUGFnaW5hdGUiLCJQYXJhbXMiLCJQcm9wVHlwZXMiLCJSb3ciLCJzZWxlY3RDYWxjdWxhdG9yIiwiU2VsZWN0IiwiU2V0dGluZ3MiLCJzaGFwZUNvbXBvbmVudCIsIlRhYmxlU2V0dGluZ3MiLCJUZXh0IiwidW5pcXVuaXplIiwidXNlQnJlYWtwb2ludCIsInVzZUNvbGxlY3Rpb24iLCJ1c2VJMThuIiwidXNlRXZlbnRFbWl0dGVyIiwidXNlTW9kZWxFdmVudCIsInVzZVF1ZXJ5UGFyYW1zIiwiV2lkdGhzIiwicGFnaW5hdGlvbk9wdGlvbnMiLCJXb3JrZXJQbHVnaW5zQ2hlY2tBbGxDaGVja2JveCIsImxhenkiLCJUYWJsZUNvbnRleHQiLCJMaXN0SGVhZGVyQ29tcG9uZW50Iiwic2V0dXAiLCJ1c2VTdGF0ZXMiLCJsYXN0VXBkYXRlIiwiRGF0ZSIsInJlbmRlciIsIm1kVXAiLCJ0YWJsZUNvbnRleHRWYWx1ZSIsInRhYmxlIiwiY29sbGVjdGlvbiIsImV2ZW50cyIsInF1ZXJ5V2l0aG91dFBhZ2luYXRpb24iLCJ0IiwidHQiLCJxdWVyeSIsIm9uQ29sdW1uVmlzaWJpbGl0eVVwZGF0ZWQiLCJjcmVhdGVFbGVtZW50IiwiZGF0YVNldCIsImNsYXNzIiwic3R5bGUiLCJzdHlsZUZvclJvd0hlYWRlciIsInAiLCJ3b3JrcGxhY2UiLCJzIiwiY3VycmVudFdvcmtwbGFjZSIsInN0eWxlRm9ySGVhZGVyIiwid2lkdGgiLCJ1bmRlZmluZWQiLCJtYXJnaW5Ib3Jpem9udGFsIiwibWFyZ2luTGVmdCIsImRlZmF1bHRWYWx1ZSIsInByZXBhcmVkQ29sdW1ucyIsIkZyYWdtZW50IiwiaGVhZGVyc0NvbnRlbnRGcm9tQ29sdW1ucyIsInR5cGUiLCJzZXRTdGF0ZSIsIkFwaU1ha2VyVGFibGUiLCJkZWZhdWx0UHJvcHMiLCJjYXJkIiwiY3VycmVudFVzZXIiLCJkZXN0cm95RW5hYmxlZCIsImZpbHRlckNhcmQiLCJmaWx0ZXJTdWJtaXRCdXR0b24iLCJub1JlY29yZHNBdmFpbGFibGVDb250ZW50Iiwibm9SZWNvcmRzRm91bmRDb250ZW50IiwicHJlbG9hZHMiLCJzZWxlY3QiLCJzdHlsZVVJIiwicHJvcFR5cGVzIiwiYWJpbGl0aWVzIiwib2JqZWN0IiwiYWN0aW9uc0NvbnRlbnQiLCJmdW5jIiwiYXBwSGlzdG9yeSIsImJvb2wiLCJpc1JlcXVpcmVkIiwiY2xhc3NOYW1lIiwic3RyaW5nIiwiaW5zdGFuY2VPZiIsImNvbHVtbnMiLCJvbmVPZlR5cGUiLCJhcnJheSIsImNvbnRyb2xzIiwiZGVmYXVsdERhdGVGb3JtYXROYW1lIiwiZGVmYXVsdERhdGVUaW1lRm9ybWF0TmFtZSIsImRlZmF1bHRQYXJhbXMiLCJkZXN0cm95TWVzc2FnZSIsImVkaXRNb2RlbFBhdGgiLCJmaWx0ZXJDb250ZW50IiwiZmlsdGVyU3VibWl0TGFiZWwiLCJub2RlIiwiZ3JvdXBCeSIsImhlYWRlciIsImlkZW50aWZpZXIiLCJtb2RlbENsYXNzIiwib25Nb2RlbHNMb2FkZWQiLCJwYWdpbmF0ZUNvbnRlbnQiLCJwYWdpbmF0aW9uQ29tcG9uZW50IiwicXVlcnlNZXRob2QiLCJxdWVyeU5hbWUiLCJzZWxlY3RDb2x1bW5zIiwic3R5bGVzIiwidmlld01vZGVsUGF0aCIsImRyYWdnYWJsZVNvcnRFdmVudHMiLCJ0YWJsZVNldHRpbmdzIiwibmFtZXNwYWNlIiwibmFtZSIsImJyZWFrcG9pbnQiLCJxdWVyeVBhcmFtcyIsInNldEluc3RhbmNlIiwiZmlsdGVyRm9ybVJlZiIsImNvbGxlY3Rpb25LZXkiLCJtb2RlbENsYXNzRGF0YSIsInByb3BzIiwicXVlcnlTTmFtZSIsImNvbHVtbnNBc0FycmF5IiwiY3VycmVudFdvcmtwbGFjZUNvdW50IiwiZmlsdGVyRm9ybSIsImNvbHVtbnNUb1Nob3ciLCJkcmFnZ2VkQ29sdW1uIiwicHJlbG9hZCIsInF1ZXJ5UU5hbWUiLCJxdWVyeVBhZ2VOYW1lIiwicmVzaXppbmciLCJzaG93RmlsdGVycyIsIkJvb2xlYW4iLCJzaG93U2V0dGluZ3MiLCJ0YWJsZVNldHRpbmciLCJ0YWJsZVNldHRpbmdMb2FkZWQiLCJ0YWJsZVNldHRpbmdGdWxsQ2FjaGVLZXkiLCJ3aWR0aHMiLCJjYWNoZUtleSIsImxvYWRDdXJyZW50V29ya3BsYWNlIiwidGhlbiIsImxvYWRDdXJyZW50V29ya3BsYWNlQ291bnQiLCJpZCIsImxvYWRUYWJsZVNldHRpbmciLCJvbkxpbmtzQ3JlYXRlZCIsIm9uTGlua3NEZXN0cm95ZWQiLCJjb2xsZWN0aW9uUmVhZHkiLCJhYmlsaXRpZXNUb0xvYWQiLCJpZkNvbmRpdGlvbiIsInBhZ2luYXRpb24iLCJzdGF0ZSIsImNsb25lIiwiZXhjZXB0Iiwib25EcmFnU3RhcnQiLCJvbkRyYWdFbmRBbmltYXRpb24iLCJnZXRDb2x1bW5zVG9TaG93IiwiaXRlbSIsImFuaW1hdGVkWkluZGV4Iiwic2V0VmFsdWUiLCJXb3JrcGxhY2UiLCJyZXN1bHQiLCJjdXJyZW50IiwiV29ya3BsYWNlTGluayIsInJhbnNhY2siLCJyZXNvdXJjZV90eXBlX2VxIiwid29ya3BsYWNlX2lkX2VxIiwiY291bnQiLCJmaWx0ZXIiLCJjb2x1bW4iLCJ0YWJsZVNldHRpbmdDb2x1bW4iLCJzb3J0IiwiYSIsImIiLCJwb3NpdGlvbiIsImxvYWRFeGlzdGluZ09yQ3JlYXRlVGFibGVTZXR0aW5ncyIsIm1lcmdlZFByZWxvYWRzIiwiZnVsbENhY2hlS2V5IiwidXBkYXRlU2V0dGluZ3NGdWxsQ2FjaGVLZXkiLCJjb25jYXQiLCJtb2RlbHMiLCJvdmVyYWxsQ291bnQiLCJxUGFyYW1zIiwic2hvd05vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQiLCJzaG93Tm9SZWNvcmRzRm91bmRDb250ZW50IiwiYXJncyIsIkVycm9yIiwib25MYXlvdXQiLCJvbkNvbnRhaW5lckxheW91dCIsImNvbnRhaW5lciIsImNhcmRPclRhYmxlIiwib3duQWJpbGl0aWVzIiwicHVzaCIsImxlbmd0aCIsIm1vZGVsQ2xhc3NOYW1lIiwibW9kZWxOYW1lIiwiYWJpbGl0eSIsInJlc3RQcm9wcyIsImhlYWRlckNvbnRlbnQiLCJQYWdpbmF0aW9uQ29tcG9uZW50IiwiaHVtYW4iLCJmbGF0TGlzdFN0eWxlIiwib3ZlcmZsb3dYIiwiYm9yZGVyIiwiYm9yZGVyUmFkaXVzIiwiZmxhdExpc3QiLCJQcm92aWRlciIsInZhbHVlIiwiX2V4dGVuZHMiLCJkYXRhIiwiZXh0cmFEYXRhIiwia2V5RXh0cmFjdG9yIiwia2V5RXh0cmF0b3IiLCJyZW5kZXJJdGVtIiwic2hvd3NIb3Jpem9udGFsU2Nyb2xsSW5kaWNhdG9yIiwidGFibGVDb250cm9scyIsImZvb3RlciIsInRhYmxlRm9vdGVyIiwiZSIsIm5hdGl2ZUV2ZW50IiwibGF5b3V0IiwidGFibGVXaWR0aCIsImNyZWF0ZWQiLCJhbW91bnRDcmVhdGVkIiwicHJldlN0YXRlIiwiZGVzdHJveWVkIiwiYW1vdW50RGVzdHJveWVkIiwibW9kZWwiLCJzdWJtaXRGaWx0ZXIiLCJzdWJtaXRGaWx0ZXJEZWJvdW5jZSIsImZvcm1SZWYiLCJvblN1Ym1pdCIsIm9uRmlsdGVyRm9ybVN1Ym1pdCIsInNldEZvcm0iLCJzZXRTdGF0ZXMiLCJvbkZpbHRlckNoYW5nZWQiLCJvbkZpbHRlckNoYW5nZWRXaXRoRGVsYXkiLCJtYXJnaW5Ub3AiLCJvbkZpbHRlckNsaWNrZWQiLCJwcmV2ZW50RGVmYXVsdCIsIm9uUGVyUGFnZUNoYW5nZWQiLCJuZXdQZXJQYWdlVmFsdWUiLCJwZXJLZXkiLCJwYXJhbXNDaGFuZ2UiLCJjaGFuZ2VQYXJhbXMiLCJpbmRleCIsImNvbHVtbldpZHRocyIsImtleSIsInN0eWxlRm9yQ29sdW1uIiwiY29sdW1uSW5kZXgiLCJldmVuIiwiZGVmYXVsdFN0eWxlIiwianVzdGlmeUNvbnRlbnQiLCJwYWRkaW5nIiwib3ZlcmZsb3ciLCJPYmplY3QiLCJhc3NpZ24iLCJiYWNrZ3JvdW5kQ29sb3IiLCJmbGV4RGlyZWN0aW9uIiwiYWxpZ25JdGVtcyIsIm1hcmdpblJpZ2h0IiwiYm9yZGVyUmlnaHQiLCJhY3R1YWxTdHlsZSIsInN0eWxlRm9ySGVhZGVyVGV4dCIsImZvbnRXZWlnaHQiLCJzdHlsZUZvclJvdyIsImZsZXgiLCJvblByZXNzIiwic2l6ZSIsIm9uUmVxdWVzdENsb3NlIiwib25SZXF1ZXN0Q2xvc2VTZXR0aW5ncyIsIm9uU2V0dGluZ3NDbGlja2VkIiwiY3VycmVudFBhZ2UiLCJ0b3RhbENvdW50IiwicGVyUGFnZSIsInRvIiwiTWF0aCIsIm1pbiIsImZyb20iLCJ0b3RhbF9jb3VudCIsInNlbGVjdGVkIiwib25DaGFuZ2UiLCJvcHRpb25zIiwiam9pbiIsImNvbHVtblByb3BzIiwidGV4dENlbnRlciIsInRleHRBbGlnbiIsInRleHRSaWdodCIsImhlYWRlclByb3BzIiwiaG9yaXpvbnRhbCIsImRyYWdMaXN0a2V5RXh0cmFjdG9yIiwib25JdGVtTW92ZWQiLCJvblJlb3JkZXJlZCIsImRyYWdMaXN0UmVuZGVySXRlbUNvbnRlbnQiLCJkcmFnTGlzdENhY2hlS2V5RXh0cmFjdG9yIiwiYW5pbWF0aW9uQXJncyIsIml0ZW1JbmRleCIsIngiLCJ5IiwiYW5pbWF0ZWRQb3NpdGlvbiIsInRpbWluZyIsInN0YXJ0IiwiZnJvbUl0ZW0iLCJmcm9tUG9zaXRpb24iLCJ0b0l0ZW0iLCJ0b1Bvc2l0aW9uIiwiVGFibGVTZXR0aW5nQ29sdW1uIiwiY29uc3RydWN0b3IiLCJ0b0NvbHVtbiIsImZpbmQiLCJ1cGRhdGUiLCJpc0FjdGl2ZSIsInRvdWNoUHJvcHMiLCJhbmltYXRlZFdpZHRoIiwiYWN0aXZlIiwiaGVhZGVyQ2xhc3NOYW1lRm9yQ29sdW1uIiwiY29tbW9uUHJvcHMiLCJoZWFkZXJMYWJlbEZvckNvbHVtbiIsImxhYmVsIiwiY3VycmVudE1vZGVsQ2xhc3MiLCJwYXRoIiwicGF0aFBhcnQiLCJyZWxhdGlvbnNoaXBzIiwicmVsYXRpb25zaGlwIiwicmVsYXRpb25zaGlwSW5BcnJheSIsInVuZGVyc2NvcmUiLCJhdHRyaWJ1dGUiLCJodW1hbkF0dHJpYnV0ZU5hbWUiLCJzZXJpYWxpemVGb3JtIiwiY2hhbmdlUGFyYW1zUGFyYW1zIiwiSlNPTiIsInN0cmluZ2lmeSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YWJsZS90YWJsZS5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtkaWdnLCBkaWdzfSBmcm9tIFwiZGlnZ2VyaXplXCJcbmltcG9ydCBSZWFjdCwge2NyZWF0ZUNvbnRleHQsIHVzZUNvbnRleHQsIHVzZU1lbW8sIHVzZVJlZn0gZnJvbSBcInJlYWN0XCJcbmltcG9ydCB7QW5pbWF0ZWQsIFByZXNzYWJsZSwgVmlld30gZnJvbSBcInJlYWN0LW5hdGl2ZVwiXG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tIFwiLi4vYmFzZS1jb21wb25lbnRcIlxuaW1wb3J0IENhcmQgZnJvbSBcIi4uL2Jvb3RzdHJhcC9jYXJkXCJcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gXCJjbGFzc25hbWVzXCJcbmltcG9ydCBDb2xsZWN0aW9uIGZyb20gXCIuLi9jb2xsZWN0aW9uXCJcbmltcG9ydCBjb2x1bW5WaXNpYmxlIGZyb20gXCIuL2NvbHVtbi12aXNpYmxlXCJcbmltcG9ydCBkZWJvdW5jZSBmcm9tIFwiZGVib3VuY2VcIlxuaW1wb3J0IERyYWdnYWJsZVNvcnQgZnJvbSBcIi4uL2RyYWdnYWJsZS1zb3J0L2luZGV4XCJcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcImV2ZW50c1wiXG5pbXBvcnQgRmlsdGVycyBmcm9tIFwiLi9maWx0ZXJzXCJcbmltcG9ydCBGbGF0TGlzdCBmcm9tIFwiLi9jb21wb25lbnRzL2ZsYXQtbGlzdFwiXG5pbXBvcnQgRm9udEF3ZXNvbWVJY29uIGZyb20gXCJyZWFjdC1uYXRpdmUtdmVjdG9yLWljb25zL0ZvbnRBd2Vzb21lXCJcbmltcG9ydCB7Rm9ybX0gZnJvbSBcIi4uL2Zvcm1cIlxuaW1wb3J0IEhlYWRlciBmcm9tIFwiLi9jb21wb25lbnRzL2hlYWRlclwiXG5pbXBvcnQgSGVhZGVyQ29sdW1uIGZyb20gXCIuL2hlYWRlci1jb2x1bW5cIlxuaW1wb3J0IEhlYWRlclNlbGVjdCBmcm9tIFwiLi9oZWFkZXItc2VsZWN0XCJcbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuaW1wb3J0IG1lbW8gZnJvbSBcInNldC1zdGF0ZS1jb21wYXJlL3NyYy9tZW1vXCJcbmltcG9ydCBtb2RlbENsYXNzUmVxdWlyZSBmcm9tIFwiLi4vbW9kZWwtY2xhc3MtcmVxdWlyZVwiXG5pbXBvcnQgTW9kZWxSb3cgZnJvbSBcIi4vbW9kZWwtcm93XCJcbmltcG9ydCBQYWdpbmF0ZSBmcm9tIFwiLi4vYm9vdHN0cmFwL3BhZ2luYXRlXCJcbmltcG9ydCBQYXJhbXMgZnJvbSBcIi4uL3BhcmFtc1wiXG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCJcbmltcG9ydCBSb3cgZnJvbSBcIi4vY29tcG9uZW50cy9yb3dcIlxuaW1wb3J0IHNlbGVjdENhbGN1bGF0b3IgZnJvbSBcIi4vc2VsZWN0LWNhbGN1bGF0b3JcIlxuaW1wb3J0IFNlbGVjdCBmcm9tIFwiLi4vaW5wdXRzL3NlbGVjdFwiXG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4vc2V0dGluZ3MvaW5kZXhcIlxuaW1wb3J0IHtzaGFwZUNvbXBvbmVudH0gZnJvbSBcInNldC1zdGF0ZS1jb21wYXJlL3NyYy9zaGFwZS1jb21wb25lbnRcIlxuaW1wb3J0IFRhYmxlU2V0dGluZ3MgZnJvbSBcIi4vdGFibGUtc2V0dGluZ3NcIlxuaW1wb3J0IFRleHQgZnJvbSBcIi4uL3V0aWxzL3RleHRcIlxuaW1wb3J0IHVuaXF1bml6ZSBmcm9tIFwidW5pcXVuaXplXCJcbmltcG9ydCB1c2VCcmVha3BvaW50IGZyb20gXCIuLi91c2UtYnJlYWtwb2ludFwiXG5pbXBvcnQgdXNlQ29sbGVjdGlvbiBmcm9tIFwiLi4vdXNlLWNvbGxlY3Rpb25cIlxuaW1wb3J0IHVzZUkxOG4gZnJvbSBcImkxOG4tb24tc3Rlcm9pZHMvc3JjL3VzZS1pMThuXCJcbmltcG9ydCB1c2VFdmVudEVtaXR0ZXIgZnJvbSBcIi4uL3VzZS1ldmVudC1lbWl0dGVyXCJcbmltcG9ydCB1c2VNb2RlbEV2ZW50IGZyb20gXCIuLi91c2UtbW9kZWwtZXZlbnRcIlxuaW1wb3J0IHVzZVF1ZXJ5UGFyYW1zIGZyb20gXCJvbi1sb2NhdGlvbi1jaGFuZ2VkL3NyYy91c2UtcXVlcnktcGFyYW1zXCJcbmltcG9ydCBXaWR0aHMgZnJvbSBcIi4vd2lkdGhzXCJcblxuY29uc3QgcGFnaW5hdGlvbk9wdGlvbnMgPSBbMzAsIDYwLCA5MCwgW1wiQWxsXCIsIFwiYWxsXCJdXVxuY29uc3QgV29ya2VyUGx1Z2luc0NoZWNrQWxsQ2hlY2tib3ggPSBSZWFjdC5sYXp5KCgpID0+IGltcG9ydChcIi4vd29ya2VyLXBsdWdpbnMtY2hlY2stYWxsLWNoZWNrYm94XCIpKVxuY29uc3QgVGFibGVDb250ZXh0ID0gY3JlYXRlQ29udGV4dCgpXG5cbmNvbnN0IExpc3RIZWFkZXJDb21wb25lbnQgPSBtZW1vKHNoYXBlQ29tcG9uZW50KGNsYXNzIExpc3RIZWFkZXJDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgc2V0dXAoKSB7XG4gICAgdGhpcy51c2VTdGF0ZXMoe1xuICAgICAgbGFzdFVwZGF0ZTogbmV3IERhdGUoKVxuICAgIH0pXG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge21kVXB9ID0gdXNlQnJlYWtwb2ludCgpXG4gICAgY29uc3QgdGFibGVDb250ZXh0VmFsdWUgPSB1c2VDb250ZXh0KFRhYmxlQ29udGV4dClcbiAgICBjb25zdCB0YWJsZSA9IHRhYmxlQ29udGV4dFZhbHVlLnRhYmxlXG4gICAgY29uc3Qge2NvbGxlY3Rpb24sIGV2ZW50cywgcXVlcnlXaXRob3V0UGFnaW5hdGlvbiwgdH0gPSB0YWJsZS50dFxuICAgIGNvbnN0IHtxdWVyeX0gPSBkaWdzKGNvbGxlY3Rpb24sIFwicXVlcnlcIilcblxuICAgIHVzZUV2ZW50RW1pdHRlcihldmVudHMsIFwiY29sdW1uVmlzaWJpbGl0eVVwZGF0ZWRcIiwgdGhpcy50dC5vbkNvbHVtblZpc2liaWxpdHlVcGRhdGVkKVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxSb3cgZGF0YVNldD17e2NsYXNzOiBcImFwaS1tYWtlci90YWJsZS9oZWFkZXItcm93XCJ9fSBzdHlsZT17dGFibGUuc3R5bGVGb3JSb3dIZWFkZXIoKX0+XG4gICAgICAgIHt0YWJsZS5wLndvcmtwbGFjZSAmJiB0YWJsZS5zLmN1cnJlbnRXb3JrcGxhY2UgJiZcbiAgICAgICAgICA8SGVhZGVyIHN0eWxlPXt0YWJsZS5zdHlsZUZvckhlYWRlcih7c3R5bGU6IHt3aWR0aDogbWRVcCA/IDQxIDogdW5kZWZpbmVkfX0pfT5cbiAgICAgICAgICAgIDxXb3JrZXJQbHVnaW5zQ2hlY2tBbGxDaGVja2JveFxuICAgICAgICAgICAgICBjdXJyZW50V29ya3BsYWNlPXt0YWJsZS5zLmN1cnJlbnRXb3JrcGxhY2V9XG4gICAgICAgICAgICAgIHF1ZXJ5PXtxdWVyeVdpdGhvdXRQYWdpbmF0aW9ufVxuICAgICAgICAgICAgICBzdHlsZT17e21hcmdpbkhvcml6b250YWw6IFwiYXV0b1wifX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB7IW1kVXAgJiZcbiAgICAgICAgICAgICAgPFRleHQgc3R5bGU9e3ttYXJnaW5MZWZ0OiAzfX0+XG4gICAgICAgICAgICAgICAge3QoXCIuc2VsZWN0X2FsbF9mb3VuZFwiLCB7ZGVmYXVsdFZhbHVlOiBcIlNlbGVjdCBhbGwgZm91bmRcIn0pfVxuICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9IZWFkZXI+XG4gICAgICAgIH1cbiAgICAgICAgeyFtZFVwICYmXG4gICAgICAgICAgPEhlYWRlciBzdHlsZT17dGFibGUuc3R5bGVGb3JIZWFkZXIoe3N0eWxlOiB7fX0pfT5cbiAgICAgICAgICAgIDxIZWFkZXJTZWxlY3QgcHJlcGFyZWRDb2x1bW5zPXt0YWJsZS5zLnByZXBhcmVkQ29sdW1uc30gcXVlcnk9e3F1ZXJ5fSB0YWJsZT17dGFibGV9IC8+XG4gICAgICAgICAgPC9IZWFkZXI+XG4gICAgICAgIH1cbiAgICAgICAge21kVXAgJiZcbiAgICAgICAgICA8PlxuICAgICAgICAgICAge3RhYmxlLmhlYWRlcnNDb250ZW50RnJvbUNvbHVtbnMoKX1cbiAgICAgICAgICAgIDxIZWFkZXIgc3R5bGU9e3RhYmxlLnN0eWxlRm9ySGVhZGVyKHtzdHlsZToge30sIHR5cGU6IFwiYWN0aW9uc1wifSl9IC8+XG4gICAgICAgICAgPC8+XG4gICAgICAgIH1cbiAgICAgIDwvUm93PlxuICAgIClcbiAgfVxuXG4gIG9uQ29sdW1uVmlzaWJpbGl0eVVwZGF0ZWQgPSAoKSA9PiB0aGlzLnNldFN0YXRlKHtsYXN0VXBkYXRlOiBuZXcgRGF0ZSgpfSlcbn0pKVxuXG5leHBvcnQgZGVmYXVsdCBtZW1vKHNoYXBlQ29tcG9uZW50KGNsYXNzIEFwaU1ha2VyVGFibGUgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICBjYXJkOiB0cnVlLFxuICAgIGN1cnJlbnRVc2VyOiBudWxsLFxuICAgIGRlc3Ryb3lFbmFibGVkOiB0cnVlLFxuICAgIGZpbHRlckNhcmQ6IHRydWUsXG4gICAgZmlsdGVyU3VibWl0QnV0dG9uOiB0cnVlLFxuICAgIG5vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQ6IHVuZGVmaW5lZCxcbiAgICBub1JlY29yZHNGb3VuZENvbnRlbnQ6IHVuZGVmaW5lZCxcbiAgICBwcmVsb2FkczogW10sXG4gICAgc2VsZWN0OiB7fSxcbiAgICBzdHlsZVVJOiB0cnVlLFxuICAgIHdvcmtwbGFjZTogZmFsc2VcbiAgfVxuXG4gIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgYWJpbGl0aWVzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGFjdGlvbnNDb250ZW50OiBQcm9wVHlwZXMuZnVuYyxcbiAgICBhcHBIaXN0b3J5OiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGNhcmQ6IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWQsXG4gICAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGNvbGxlY3Rpb246IFByb3BUeXBlcy5pbnN0YW5jZU9mKENvbGxlY3Rpb24pLFxuICAgIGNvbHVtbnM6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5hcnJheSwgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgICBjb250cm9sczogUHJvcFR5cGVzLmZ1bmMsXG4gICAgY3VycmVudFVzZXI6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgZGVmYXVsdERhdGVGb3JtYXROYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGRlZmF1bHREYXRlVGltZUZvcm1hdE5hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgZGVmYXVsdFBhcmFtczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBkZXN0cm95RW5hYmxlZDogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgICBkZXN0cm95TWVzc2FnZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBlZGl0TW9kZWxQYXRoOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBmaWx0ZXJDYXJkOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICAgIGZpbHRlckNvbnRlbnQ6IFByb3BUeXBlcy5mdW5jLFxuICAgIGZpbHRlclN1Ym1pdExhYmVsOiBQcm9wVHlwZXMubm9kZSxcbiAgICBncm91cEJ5OiBQcm9wVHlwZXMuYXJyYXksXG4gICAgaGVhZGVyOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZnVuYywgUHJvcFR5cGVzLnN0cmluZ10pLFxuICAgIGlkZW50aWZpZXI6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgbW9kZWxDbGFzczogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBub1JlY29yZHNBdmFpbGFibGVDb250ZW50OiBQcm9wVHlwZXMuZnVuYyxcbiAgICBub1JlY29yZHNGb3VuZENvbnRlbnQ6IFByb3BUeXBlcy5mdW5jLFxuICAgIG9uTW9kZWxzTG9hZGVkOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBwYWdpbmF0ZUNvbnRlbnQ6IFByb3BUeXBlcy5mdW5jLFxuICAgIHBhZ2luYXRpb25Db21wb25lbnQ6IFByb3BUeXBlcy5mdW5jLFxuICAgIHByZWxvYWRzOiBQcm9wVHlwZXMuYXJyYXkuaXNSZXF1aXJlZCxcbiAgICBxdWVyeU1ldGhvZDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgcXVlcnlOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIHNlbGVjdDogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBzZWxlY3RDb2x1bW5zOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIHN0eWxlczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBzdHlsZVVJOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICAgIHZpZXdNb2RlbFBhdGg6IFByb3BUeXBlcy5mdW5jLFxuICAgIHdvcmtwbGFjZTogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZFxuICB9XG5cbiAgZHJhZ2dhYmxlU29ydEV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuICBldmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKClcbiAgdGFibGVTZXR0aW5ncyA9IG51bGxcblxuICBzZXR1cCgpIHtcbiAgICBjb25zdCB7dH0gPSB1c2VJMThuKHtuYW1lc3BhY2U6IFwianMuYXBpX21ha2VyLnRhYmxlXCJ9KVxuICAgIGNvbnN0IHtuYW1lOiBicmVha3BvaW50LCBtZFVwfSA9IHVzZUJyZWFrcG9pbnQoKVxuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gdXNlUXVlcnlQYXJhbXMoKVxuXG4gICAgdGhpcy5zZXRJbnN0YW5jZSh7XG4gICAgICBicmVha3BvaW50LFxuICAgICAgZmlsdGVyRm9ybVJlZjogdXNlUmVmKCksXG4gICAgICBtZFVwLFxuICAgICAgdFxuICAgIH0pXG5cbiAgICBjb25zdCBjb2xsZWN0aW9uS2V5ID0gZGlnZyh0aGlzLnAubW9kZWxDbGFzcy5tb2RlbENsYXNzRGF0YSgpLCBcImNvbGxlY3Rpb25LZXlcIilcbiAgICBsZXQgcXVlcnlOYW1lID0gdGhpcy5wcm9wcy5xdWVyeU5hbWVcblxuICAgIGlmICghcXVlcnlOYW1lKSBxdWVyeU5hbWUgPSBjb2xsZWN0aW9uS2V5XG5cbiAgICBjb25zdCBxdWVyeVNOYW1lID0gYCR7cXVlcnlOYW1lfV9zYFxuXG4gICAgdGhpcy51c2VTdGF0ZXMoe1xuICAgICAgY29sdW1uczogKCkgPT4gdGhpcy5jb2x1bW5zQXNBcnJheSgpLFxuICAgICAgY3VycmVudFdvcmtwbGFjZTogdW5kZWZpbmVkLFxuICAgICAgY3VycmVudFdvcmtwbGFjZUNvdW50OiBudWxsLFxuICAgICAgZmlsdGVyRm9ybTogbnVsbCxcbiAgICAgIGNvbHVtbnNUb1Nob3c6IG51bGwsXG4gICAgICBkcmFnZ2VkQ29sdW1uOiBudWxsLFxuICAgICAgaWRlbnRpZmllcjogKCkgPT4gdGhpcy5wcm9wcy5pZGVudGlmaWVyIHx8IGAke2NvbGxlY3Rpb25LZXl9LWRlZmF1bHRgLFxuICAgICAgbGFzdFVwZGF0ZTogKCkgPT4gbmV3IERhdGUoKSxcbiAgICAgIHByZWxvYWQ6IHVuZGVmaW5lZCxcbiAgICAgIHByZXBhcmVkQ29sdW1uczogdW5kZWZpbmVkLFxuICAgICAgcXVlcnlOYW1lLFxuICAgICAgcXVlcnlRTmFtZTogKCkgPT4gYCR7cXVlcnlOYW1lfV9xYCxcbiAgICAgIHF1ZXJ5UGFnZU5hbWU6ICgpID0+IGAke3F1ZXJ5TmFtZX1fcGFnZWAsXG4gICAgICBxdWVyeVNOYW1lLFxuICAgICAgcmVzaXppbmc6IGZhbHNlLFxuICAgICAgc2hvd0ZpbHRlcnM6ICgpID0+IEJvb2xlYW4ocXVlcnlQYXJhbXNbcXVlcnlTTmFtZV0pLFxuICAgICAgc2hvd1NldHRpbmdzOiBmYWxzZSxcbiAgICAgIHRhYmxlU2V0dGluZzogdW5kZWZpbmVkLFxuICAgICAgdGFibGVTZXR0aW5nTG9hZGVkOiBmYWxzZSxcbiAgICAgIHRhYmxlU2V0dGluZ0Z1bGxDYWNoZUtleTogdW5kZWZpbmVkLFxuICAgICAgd2lkdGg6IHVuZGVmaW5lZCxcbiAgICAgIHdpZHRoczogbnVsbFxuICAgIH0pXG5cbiAgICB0aGlzLnRhYmxlQ29udGV4dFZhbHVlID0gdXNlTWVtbyhcbiAgICAgICgpID0+ICh7XG4gICAgICAgIGNhY2hlS2V5OiB0aGlzLnMudGFibGVTZXR0aW5nRnVsbENhY2hlS2V5LFxuICAgICAgICBsYXN0VXBkYXRlOiB0aGlzLnMubGFzdFVwZGF0ZSxcbiAgICAgICAgcmVzaXppbmc6IHRoaXMucy5yZXNpemluZyxcbiAgICAgICAgdGFibGU6IHRoaXNcbiAgICAgIH0pLFxuICAgICAgW3RoaXMucy5sYXN0VXBkYXRlLCB0aGlzLnMucmVzaXppbmcsIHRoaXMucy50YWJsZVNldHRpbmdGdWxsQ2FjaGVLZXldXG4gICAgKVxuXG4gICAgdXNlTWVtbygoKSA9PiB7XG4gICAgICBpZiAodGhpcy5wcm9wcy53b3JrcGxhY2UpIHtcbiAgICAgICAgdGhpcy5sb2FkQ3VycmVudFdvcmtwbGFjZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMubG9hZEN1cnJlbnRXb3JrcGxhY2VDb3VudCgpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSwgW3RoaXMucC5jdXJyZW50VXNlcj8uaWQoKV0pXG5cbiAgICB1c2VNZW1vKCgpID0+IHtcbiAgICAgIGlmICghdGhpcy50dC50YWJsZVNldHRpbmdzICYmIHRoaXMucy53aWR0aCkge1xuICAgICAgICB0aGlzLmxvYWRUYWJsZVNldHRpbmcoKVxuICAgICAgfVxuICAgIH0sIFt0aGlzLnAuY3VycmVudFVzZXI/LmlkKCksIHRoaXMucy53aWR0aF0pXG5cbiAgICB1c2VNb2RlbEV2ZW50KHRoaXMucy5jdXJyZW50V29ya3BsYWNlLCBcIndvcmtwbGFjZV9saW5rc19jcmVhdGVkXCIsIHRoaXMudHQub25MaW5rc0NyZWF0ZWQpXG4gICAgdXNlTW9kZWxFdmVudCh0aGlzLnMuY3VycmVudFdvcmtwbGFjZSwgXCJ3b3JrcGxhY2VfbGlua3NfZGVzdHJveWVkXCIsIHRoaXMudHQub25MaW5rc0Rlc3Ryb3llZClcblxuICAgIGxldCBjb2xsZWN0aW9uUmVhZHkgPSB0cnVlXG4gICAgbGV0IHNlbGVjdFxuXG4gICAgaWYgKCF0aGlzLnMucHJlcGFyZWRDb2x1bW5zKSB7XG4gICAgICBjb2xsZWN0aW9uUmVhZHkgPSBmYWxzZVxuICAgIH1cblxuICAgIGlmIChjb2xsZWN0aW9uUmVhZHkpIHtcbiAgICAgIHNlbGVjdCA9IHNlbGVjdENhbGN1bGF0b3Ioe3RhYmxlOiB0aGlzfSlcbiAgICB9XG5cbiAgICB0aGlzLmNvbGxlY3Rpb24gPSB1c2VDb2xsZWN0aW9uKHtcbiAgICAgIGFiaWxpdGllczogdGhpcy5hYmlsaXRpZXNUb0xvYWQoKSxcbiAgICAgIGRlZmF1bHRQYXJhbXM6IHRoaXMucHJvcHMuZGVmYXVsdFBhcmFtcyxcbiAgICAgIGNvbGxlY3Rpb246IHRoaXMucHJvcHMuY29sbGVjdGlvbixcbiAgICAgIGdyb3VwQnk6IHRoaXMucHJvcHMuZ3JvdXBCeSxcbiAgICAgIGlmQ29uZGl0aW9uOiBjb2xsZWN0aW9uUmVhZHksXG4gICAgICBtb2RlbENsYXNzOiB0aGlzLnByb3BzLm1vZGVsQ2xhc3MsXG4gICAgICBvbk1vZGVsc0xvYWRlZDogdGhpcy5wcm9wcy5vbk1vZGVsc0xvYWRlZCxcbiAgICAgIG5vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQ6IHRoaXMucHJvcHMubm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudCxcbiAgICAgIG5vUmVjb3Jkc0ZvdW5kQ29udGVudDogdGhpcy5wcm9wcy5ub1JlY29yZHNGb3VuZENvbnRlbnQsXG4gICAgICBwYWdpbmF0aW9uOiB0cnVlLFxuICAgICAgcHJlbG9hZHM6IHRoaXMuc3RhdGUucHJlbG9hZCxcbiAgICAgIHF1ZXJ5TWV0aG9kOiB0aGlzLnByb3BzLnF1ZXJ5TWV0aG9kLFxuICAgICAgcXVlcnlOYW1lLFxuICAgICAgc2VsZWN0LFxuICAgICAgc2VsZWN0Q29sdW1uczogdGhpcy5wcm9wcy5zZWxlY3RDb2x1bW5zXG4gICAgfSlcbiAgICB0aGlzLnF1ZXJ5V2l0aG91dFBhZ2luYXRpb24gPSB1c2VNZW1vKFxuICAgICAgKCkgPT4gdGhpcy5jb2xsZWN0aW9uPy5xdWVyeT8uY2xvbmUoKT8uZXhjZXB0KFwicGFnZVwiKSxcbiAgICAgIFt0aGlzLmNvbGxlY3Rpb24ucXVlcnldXG4gICAgKVxuXG4gICAgdXNlRXZlbnRFbWl0dGVyKHRoaXMudHQuZHJhZ2dhYmxlU29ydEV2ZW50cywgXCJvbkRyYWdTdGFydFwiLCB0aGlzLnR0Lm9uRHJhZ1N0YXJ0KVxuICAgIHVzZUV2ZW50RW1pdHRlcih0aGlzLnR0LmRyYWdnYWJsZVNvcnRFdmVudHMsIFwib25EcmFnRW5kQW5pbWF0aW9uXCIsIHRoaXMudHQub25EcmFnRW5kQW5pbWF0aW9uKVxuICAgIHVzZUV2ZW50RW1pdHRlcih0aGlzLnR0LmV2ZW50cywgXCJjb2x1bW5WaXNpYmlsaXR5VXBkYXRlZFwiLCB0aGlzLnR0Lm9uQ29sdW1uVmlzaWJpbGl0eVVwZGF0ZWQpXG4gIH1cblxuICBvbkNvbHVtblZpc2liaWxpdHlVcGRhdGVkID0gKCkgPT4gdGhpcy5zZXRTdGF0ZSh7Y29sdW1uc1RvU2hvdzogdGhpcy5nZXRDb2x1bW5zVG9TaG93KHRoaXMucy5jb2x1bW5zKSwgbGFzdFVwZGF0ZTogbmV3IERhdGUoKX0pXG4gIG9uRHJhZ1N0YXJ0ID0gKHtpdGVtfSkgPT4gaXRlbS5hbmltYXRlZFpJbmRleC5zZXRWYWx1ZSg5OTk5KVxuICBvbkRyYWdFbmRBbmltYXRpb24gPSAoe2l0ZW19KSA9PiBpdGVtLmFuaW1hdGVkWkluZGV4LnNldFZhbHVlKDApXG5cbiAgYXN5bmMgbG9hZEN1cnJlbnRXb3JrcGxhY2UoKSB7XG4gICAgY29uc3QgV29ya3BsYWNlID0gbW9kZWxDbGFzc1JlcXVpcmUoXCJXb3JrcGxhY2VcIilcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBXb3JrcGxhY2UuY3VycmVudCgpXG4gICAgY29uc3QgY3VycmVudFdvcmtwbGFjZSA9IGRpZ2cocmVzdWx0LCBcImN1cnJlbnRcIiwgMClcblxuICAgIHRoaXMuc2V0U3RhdGUoe2N1cnJlbnRXb3JrcGxhY2V9KVxuICB9XG5cbiAgYXN5bmMgbG9hZEN1cnJlbnRXb3JrcGxhY2VDb3VudCgpIHtcbiAgICBjb25zdCBXb3JrcGxhY2VMaW5rID0gbW9kZWxDbGFzc1JlcXVpcmUoXCJXb3JrcGxhY2VMaW5rXCIpXG4gICAgY29uc3QgY3VycmVudFdvcmtwbGFjZUNvdW50ID0gYXdhaXQgV29ya3BsYWNlTGlua1xuICAgICAgLnJhbnNhY2soe1xuICAgICAgICByZXNvdXJjZV90eXBlX2VxOiB0aGlzLnAubW9kZWxDbGFzcy5tb2RlbENsYXNzRGF0YSgpLm5hbWUsXG4gICAgICAgIHdvcmtwbGFjZV9pZF9lcTogdGhpcy5zLmN1cnJlbnRXb3JrcGxhY2UuaWQoKVxuICAgICAgfSlcbiAgICAgIC5jb3VudCgpXG5cbiAgICB0aGlzLnNldFN0YXRlKHtjdXJyZW50V29ya3BsYWNlQ291bnR9KVxuICB9XG5cbiAgZ2V0Q29sdW1uc1RvU2hvdyhjb2x1bW5zKSB7XG4gICAgcmV0dXJuIGNvbHVtbnNcbiAgICAgIC5maWx0ZXIoKHtjb2x1bW4sIHRhYmxlU2V0dGluZ0NvbHVtbn0pID0+IGNvbHVtblZpc2libGUoY29sdW1uLCB0YWJsZVNldHRpbmdDb2x1bW4pKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEudGFibGVTZXR0aW5nQ29sdW1uLnBvc2l0aW9uKCkgLSBiLnRhYmxlU2V0dGluZ0NvbHVtbi5wb3NpdGlvbigpKVxuICB9XG5cbiAgYXN5bmMgbG9hZFRhYmxlU2V0dGluZygpIHtcbiAgICB0aGlzLnRhYmxlU2V0dGluZ3MgPSBuZXcgVGFibGVTZXR0aW5ncyh7dGFibGU6IHRoaXN9KVxuXG4gICAgY29uc3QgdGFibGVTZXR0aW5nID0gYXdhaXQgdGhpcy50YWJsZVNldHRpbmdzLmxvYWRFeGlzdGluZ09yQ3JlYXRlVGFibGVTZXR0aW5ncygpXG4gICAgY29uc3Qge2NvbHVtbnMsIHByZWxvYWR9ID0gdGhpcy50YWJsZVNldHRpbmdzLnByZXBhcmVkQ29sdW1ucyh0YWJsZVNldHRpbmcpXG4gICAgY29uc3Qge3dpZHRofSA9IHRoaXMuc1xuICAgIGNvbnN0IHdpZHRocyA9IG5ldyBXaWR0aHMoe2NvbHVtbnMsIHRhYmxlOiB0aGlzLCB3aWR0aH0pXG4gICAgY29uc3QgY29sdW1uc1RvU2hvdyA9IHRoaXMuZ2V0Q29sdW1uc1RvU2hvdyhjb2x1bW5zKVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBjb2x1bW5zLFxuICAgICAgY29sdW1uc1RvU2hvdyxcbiAgICAgIHByZXBhcmVkQ29sdW1uczogY29sdW1ucyxcbiAgICAgIHByZWxvYWQ6IHRoaXMubWVyZ2VkUHJlbG9hZHMocHJlbG9hZCksXG4gICAgICB0YWJsZVNldHRpbmcsXG4gICAgICB0YWJsZVNldHRpbmdMb2FkZWQ6IHRydWUsXG4gICAgICB0YWJsZVNldHRpbmdGdWxsQ2FjaGVLZXk6IHRhYmxlU2V0dGluZy5mdWxsQ2FjaGVLZXkoKSxcbiAgICAgIHdpZHRoc1xuICAgIH0pXG4gIH1cblxuICB1cGRhdGVTZXR0aW5nc0Z1bGxDYWNoZUtleSA9ICgpID0+IHRoaXMuc2V0U3RhdGUoe3RhYmxlU2V0dGluZ0Z1bGxDYWNoZUtleTogdGhpcy5zdGF0ZS50YWJsZVNldHRpbmcuZnVsbENhY2hlS2V5KCl9KVxuXG4gIGNvbHVtbnNBc0FycmF5ID0gKCkgPT4ge1xuICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5jb2x1bW5zID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY29sdW1ucygpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucHJvcHMuY29sdW1uc1xuICB9XG5cbiAgbWVyZ2VkUHJlbG9hZHMocHJlbG9hZCkge1xuICAgIGNvbnN0IHtwcmVsb2Fkc30gPSB0aGlzLnByb3BzXG4gICAgbGV0IG1lcmdlZFByZWxvYWRzID0gW11cblxuICAgIGlmIChwcmVsb2FkcykgbWVyZ2VkUHJlbG9hZHMgPSBtZXJnZWRQcmVsb2Fkcy5jb25jYXQocHJlbG9hZHMpXG4gICAgaWYgKHByZWxvYWQpIG1lcmdlZFByZWxvYWRzID0gbWVyZ2VkUHJlbG9hZHMuY29uY2F0KHByZWxvYWQpXG5cbiAgICByZXR1cm4gdW5pcXVuaXplKG1lcmdlZFByZWxvYWRzKVxuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7bW9kZWxDbGFzcywgbm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudCwgbm9SZWNvcmRzRm91bmRDb250ZW50fSA9IHRoaXMucFxuICAgIGNvbnN0IHtjb2xsZWN0aW9uLCBjdXJyZW50VXNlcn0gPSB0aGlzLnByb3BzXG4gICAgY29uc3Qge3F1ZXJ5TmFtZSwgcXVlcnlTTmFtZSwgc2hvd0ZpbHRlcnN9ID0gdGhpcy5zXG4gICAgY29uc3Qge1xuICAgICAgbW9kZWxzLFxuICAgICAgb3ZlcmFsbENvdW50LFxuICAgICAgcVBhcmFtcyxcbiAgICAgIHF1ZXJ5LFxuICAgICAgcmVzdWx0LFxuICAgICAgc2hvd05vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQsXG4gICAgICBzaG93Tm9SZWNvcmRzRm91bmRDb250ZW50XG4gICAgfSA9IGRpZ3MoXG4gICAgICB0aGlzLmNvbGxlY3Rpb24sXG4gICAgICBcIm1vZGVsc1wiLFxuICAgICAgXCJvdmVyYWxsQ291bnRcIixcbiAgICAgIFwicVBhcmFtc1wiLFxuICAgICAgXCJxdWVyeVwiLFxuICAgICAgXCJyZXN1bHRcIixcbiAgICAgIFwic2hvd05vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnRcIixcbiAgICAgIFwic2hvd05vUmVjb3Jkc0ZvdW5kQ29udGVudFwiXG4gICAgKVxuXG4gICAgaWYgKGNvbGxlY3Rpb24gJiYgY29sbGVjdGlvbi5hcmdzLm1vZGVsQ2xhc3MubW9kZWxDbGFzc0RhdGEoKS5uYW1lICE9IG1vZGVsQ2xhc3MubW9kZWxDbGFzc0RhdGEoKS5uYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBNb2RlbCBjbGFzcyBmcm9tIGNvbGxlY3Rpb24gJyR7Y29sbGVjdGlvbi5hcmdzLm1vZGVsQ2xhc3MubW9kZWxDbGFzc0RhdGEoKS5uYW1lfScgYCArXG4gICAgICAgIGBkaWRuJ3QgbWF0Y2ggbW9kZWwgY2xhc3Mgb24gdGFibGU6ICcke21vZGVsQ2xhc3MubW9kZWxDbGFzc0RhdGEoKS5uYW1lfSdgXG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxWaWV3IGRhdGFTZXQ9e3tjbGFzczogdGhpcy5jbGFzc05hbWUoKX19IG9uTGF5b3V0PXt0aGlzLnR0Lm9uQ29udGFpbmVyTGF5b3V0fSBzdHlsZT17dGhpcy5wcm9wcy5zdHlsZXM/LmNvbnRhaW5lcn0+XG4gICAgICAgIHtzaG93Tm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudCAmJlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibGl2ZS10YWJsZS0tbm8tcmVjb3Jkcy1hdmFpbGFibGUtY29udGVudFwiPlxuICAgICAgICAgICAge25vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQoe21vZGVscywgcVBhcmFtcywgb3ZlcmFsbENvdW50fSl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAge3Nob3dOb1JlY29yZHNGb3VuZENvbnRlbnQgJiZcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImxpdmUtdGFibGUtLW5vLXJlY29yZHMtZm91bmQtY29udGVudFwiPlxuICAgICAgICAgICAge25vUmVjb3Jkc0ZvdW5kQ29udGVudCh7bW9kZWxzLCBxUGFyYW1zLCBvdmVyYWxsQ291bnR9KX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICB7c2hvd0ZpbHRlcnMgJiZcbiAgICAgICAgICA8RmlsdGVycyBjdXJyZW50VXNlcj17Y3VycmVudFVzZXJ9IG1vZGVsQ2xhc3M9e21vZGVsQ2xhc3N9IHF1ZXJ5TmFtZT17cXVlcnlOYW1lfSBxdWVyeVNOYW1lPXtxdWVyeVNOYW1lfSAvPlxuICAgICAgICB9XG4gICAgICAgIHtxUGFyYW1zICYmIHF1ZXJ5ICYmIHJlc3VsdCAmJiBtb2RlbHMgJiYgIXNob3dOb1JlY29yZHNBdmFpbGFibGVDb250ZW50ICYmICFzaG93Tm9SZWNvcmRzRm91bmRDb250ZW50ICYmXG4gICAgICAgICAgdGhpcy5jYXJkT3JUYWJsZSgpXG4gICAgICAgIH1cbiAgICAgIDwvVmlldz5cbiAgICApXG4gIH1cblxuICBhYmlsaXRpZXNUb0xvYWQgKCkge1xuICAgIGNvbnN0IGFiaWxpdGllc1RvTG9hZCA9IHt9XG4gICAgY29uc3Qge2FiaWxpdGllcywgbW9kZWxDbGFzc30gPSB0aGlzLnByb3BzXG4gICAgY29uc3Qgb3duQWJpbGl0aWVzID0gW11cblxuICAgIGlmICh0aGlzLnByb3BzLmRlc3Ryb3lFbmFibGVkKSBvd25BYmlsaXRpZXMucHVzaChcImRlc3Ryb3lcIilcbiAgICBpZiAodGhpcy5wcm9wcy5lZGl0TW9kZWxQYXRoKSBvd25BYmlsaXRpZXMucHVzaChcImVkaXRcIilcbiAgICBpZiAodGhpcy5wcm9wcy52aWV3TW9kZWxQYXRoKSBvd25BYmlsaXRpZXMucHVzaChcInNob3dcIilcblxuICAgIGlmIChvd25BYmlsaXRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbW9kZWxDbGFzc05hbWUgPSBkaWdnKG1vZGVsQ2xhc3MubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpXG5cbiAgICAgIGFiaWxpdGllc1RvTG9hZFttb2RlbENsYXNzTmFtZV0gPSBvd25BYmlsaXRpZXNcbiAgICB9XG5cbiAgICBpZiAoYWJpbGl0aWVzKSB7XG4gICAgICBmb3IgKGNvbnN0IG1vZGVsTmFtZSBpbiBhYmlsaXRpZXMpIHtcbiAgICAgICAgaWYgKCEobW9kZWxOYW1lIGluIGFiaWxpdGllc1RvTG9hZCkpIHtcbiAgICAgICAgICBhYmlsaXRpZXNUb0xvYWRbbW9kZWxOYW1lXSA9IFtdXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGFiaWxpdHkgb2YgYWJpbGl0aWVzW21vZGVsTmFtZV0pIHtcbiAgICAgICAgICBhYmlsaXRpZXNUb0xvYWRbbW9kZWxOYW1lXS5wdXNoKGFiaWxpdHkpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWJpbGl0aWVzVG9Mb2FkXG4gIH1cblxuICBjYXJkT3JUYWJsZSAoKSB7XG4gICAgY29uc3Qge1xuICAgICAgYWJpbGl0aWVzLFxuICAgICAgYWN0aW9uc0NvbnRlbnQsXG4gICAgICBhcHBIaXN0b3J5LFxuICAgICAgY2FyZCxcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIGNvbGxlY3Rpb24sXG4gICAgICBjb2x1bW5zLFxuICAgICAgY29udHJvbHMsXG4gICAgICBjdXJyZW50VXNlcixcbiAgICAgIGRlZmF1bHREYXRlRm9ybWF0TmFtZSxcbiAgICAgIGRlZmF1bHREYXRlVGltZUZvcm1hdE5hbWUsXG4gICAgICBkZWZhdWx0UGFyYW1zLFxuICAgICAgZGVzdHJveUVuYWJsZWQsXG4gICAgICBkZXN0cm95TWVzc2FnZSxcbiAgICAgIGVkaXRNb2RlbFBhdGgsXG4gICAgICBmaWx0ZXJDYXJkLFxuICAgICAgZmlsdGVyQ29udGVudCxcbiAgICAgIGZpbHRlclN1Ym1pdEJ1dHRvbixcbiAgICAgIGZpbHRlclN1Ym1pdExhYmVsLFxuICAgICAgZ3JvdXBCeSxcbiAgICAgIGhlYWRlcixcbiAgICAgIGlkZW50aWZpZXIsXG4gICAgICBtb2RlbENsYXNzLFxuICAgICAgbm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudCxcbiAgICAgIG5vUmVjb3Jkc0ZvdW5kQ29udGVudCxcbiAgICAgIG9uTW9kZWxzTG9hZGVkLFxuICAgICAgcGFnaW5hdGVDb250ZW50LFxuICAgICAgcGFnaW5hdGlvbkNvbXBvbmVudCxcbiAgICAgIHByZWxvYWRzLFxuICAgICAgcXVlcnlNZXRob2QsXG4gICAgICBxdWVyeU5hbWUsXG4gICAgICBzZWxlY3QsXG4gICAgICBzZWxlY3RDb2x1bW5zLFxuICAgICAgc3R5bGVVSSxcbiAgICAgIHZpZXdNb2RlbFBhdGgsXG4gICAgICB3b3JrcGxhY2UsXG4gICAgICAuLi5yZXN0UHJvcHNcbiAgICB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHttb2RlbHMsIHFQYXJhbXMsIHF1ZXJ5LCByZXN1bHR9ID0gZGlncyh0aGlzLmNvbGxlY3Rpb24sIFwibW9kZWxzXCIsIFwicVBhcmFtc1wiLCBcInF1ZXJ5XCIsIFwicmVzdWx0XCIpXG5cbiAgICBsZXQgaGVhZGVyQ29udGVudCwgUGFnaW5hdGlvbkNvbXBvbmVudFxuXG4gICAgaWYgKHR5cGVvZiBoZWFkZXIgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBoZWFkZXJDb250ZW50ID0gaGVhZGVyKHttb2RlbHMsIHFQYXJhbXMsIHF1ZXJ5LCByZXN1bHR9KVxuICAgIH0gZWxzZSBpZiAoaGVhZGVyKSB7XG4gICAgICBoZWFkZXJDb250ZW50ID0gaGVhZGVyXG4gICAgfSBlbHNlIHtcbiAgICAgIGhlYWRlckNvbnRlbnQgPSBtb2RlbENsYXNzLm1vZGVsTmFtZSgpLmh1bWFuKHtjb3VudDogMn0pXG4gICAgfVxuXG4gICAgaWYgKCFwYWdpbmF0ZUNvbnRlbnQpIHtcbiAgICAgIGlmIChwYWdpbmF0aW9uQ29tcG9uZW50KSB7XG4gICAgICAgIFBhZ2luYXRpb25Db21wb25lbnQgPSBwYWdpbmF0aW9uQ29tcG9uZW50XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBQYWdpbmF0aW9uQ29tcG9uZW50ID0gUGFnaW5hdGVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBmbGF0TGlzdFN0eWxlID0ge1xuICAgICAgb3ZlcmZsb3dYOiBcImF1dG9cIlxuICAgIH1cblxuICAgIGlmIChzdHlsZVVJKSB7XG4gICAgICBmbGF0TGlzdFN0eWxlLmJvcmRlciA9IFwiMXB4IHNvbGlkICNkYmRiZGJcIlxuICAgICAgZmxhdExpc3RTdHlsZS5ib3JkZXJSYWRpdXMgPSA1XG4gICAgfVxuXG4gICAgY29uc3QgZmxhdExpc3QgPSAoXG4gICAgICA8VGFibGVDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXt0aGlzLnR0LnRhYmxlQ29udGV4dFZhbHVlfT5cbiAgICAgICAgPEZsYXRMaXN0XG4gICAgICAgICAgZGF0YT17bW9kZWxzfVxuICAgICAgICAgIGRhdGFTZXQ9e3tcbiAgICAgICAgICAgIGNsYXNzOiBjbGFzc05hbWVzKFwiYXBpLW1ha2VyLS10YWJsZVwiLCBjbGFzc05hbWUpLFxuICAgICAgICAgICAgY2FjaGVLZXk6IHRoaXMucy50YWJsZVNldHRpbmdGdWxsQ2FjaGVLZXksXG4gICAgICAgICAgICBsYXN0VXBkYXRlOiB0aGlzLnMubGFzdFVwZGF0ZVxuICAgICAgICAgIH19XG4gICAgICAgICAgZXh0cmFEYXRhPXt0aGlzLnMubGFzdFVwZGF0ZX1cbiAgICAgICAgICBrZXlFeHRyYWN0b3I9e3RoaXMudHQua2V5RXh0cmF0b3J9XG4gICAgICAgICAgTGlzdEhlYWRlckNvbXBvbmVudD17TGlzdEhlYWRlckNvbXBvbmVudH1cbiAgICAgICAgICByZW5kZXJJdGVtPXt0aGlzLnR0LnJlbmRlckl0ZW19XG4gICAgICAgICAgc2hvd3NIb3Jpem9udGFsU2Nyb2xsSW5kaWNhdG9yXG4gICAgICAgICAgc3R5bGU9e2ZsYXRMaXN0U3R5bGV9XG4gICAgICAgICAgey4uLnJlc3RQcm9wc31cbiAgICAgICAgLz5cbiAgICAgIDwvVGFibGVDb250ZXh0LlByb3ZpZGVyPlxuICAgIClcblxuICAgIHJldHVybiAoXG4gICAgICA8PlxuICAgICAgICB7ZmlsdGVyQ29udGVudCAmJiBmaWx0ZXJDYXJkICYmXG4gICAgICAgICAgPENhcmQgY2xhc3NOYW1lPVwibGl2ZS10YWJsZS0tZmlsdGVyLWNhcmQgbWItNFwiPlxuICAgICAgICAgICAge3RoaXMuZmlsdGVyRm9ybSgpfVxuICAgICAgICAgIDwvQ2FyZD5cbiAgICAgICAgfVxuICAgICAgICB7ZmlsdGVyQ29udGVudCAmJiAhZmlsdGVyQ2FyZCAmJlxuICAgICAgICAgIHRoaXMuZmlsdGVyRm9ybSgpXG4gICAgICAgIH1cbiAgICAgICAge2NhcmQgJiZcbiAgICAgICAgICA8Q2FyZFxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKFwibGl2ZS10YWJsZS0tdGFibGUtY2FyZFwiLCBcIm1iLTRcIiwgY2xhc3NOYW1lKX1cbiAgICAgICAgICAgIGNvbnRyb2xzPXt0aGlzLnRhYmxlQ29udHJvbHMoKX1cbiAgICAgICAgICAgIGhlYWRlcj17aGVhZGVyQ29udGVudH1cbiAgICAgICAgICAgIGZvb3Rlcj17dGhpcy50YWJsZUZvb3RlcigpfVxuICAgICAgICAgICAgey4uLnJlc3RQcm9wc31cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7ZmxhdExpc3R9XG4gICAgICAgICAgPC9DYXJkPlxuICAgICAgICB9XG4gICAgICAgIHshY2FyZCAmJiBmbGF0TGlzdH1cbiAgICAgICAge3Jlc3VsdCAmJiBQYWdpbmF0aW9uQ29tcG9uZW50ICYmXG4gICAgICAgICAgPFBhZ2luYXRpb25Db21wb25lbnQgcmVzdWx0PXtyZXN1bHR9IC8+XG4gICAgICAgIH1cbiAgICAgICAge3Jlc3VsdCAmJiBwYWdpbmF0ZUNvbnRlbnQgJiZcbiAgICAgICAgICBwYWdpbmF0ZUNvbnRlbnQoe3Jlc3VsdH0pXG4gICAgICAgIH1cbiAgICAgIDwvPlxuICAgIClcbiAgfVxuXG4gIG9uQ29udGFpbmVyTGF5b3V0ID0gKGUpID0+IHtcbiAgICBjb25zdCB7d2lkdGh9ID0gZS5uYXRpdmVFdmVudC5sYXlvdXRcbiAgICBjb25zdCB7d2lkdGhzfSA9IHRoaXMuc1xuXG4gICAgdGhpcy5zZXRTdGF0ZSh7d2lkdGh9KVxuICAgIGlmICh3aWR0aHMpIHdpZHRocy50YWJsZVdpZHRoID0gd2lkdGhcbiAgfVxuXG4gIG9uTGlua3NDcmVhdGVkID0gKHthcmdzfSkgPT4ge1xuICAgIGNvbnN0IG1vZGVsQ2xhc3NOYW1lID0gdGhpcy5wLm1vZGVsQ2xhc3MubW9kZWxDbGFzc0RhdGEoKS5uYW1lXG5cbiAgICBpZiAoYXJncy5jcmVhdGVkW21vZGVsQ2xhc3NOYW1lXSkge1xuICAgICAgY29uc3QgYW1vdW50Q3JlYXRlZCA9IGFyZ3MuY3JlYXRlZFttb2RlbENsYXNzTmFtZV0ubGVuZ3RoXG5cbiAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4gKHtcbiAgICAgICAgY3VycmVudFdvcmtwbGFjZUNvdW50OiBwcmV2U3RhdGUuY3VycmVudFdvcmtwbGFjZUNvdW50ICsgYW1vdW50Q3JlYXRlZFxuICAgICAgfSkpXG4gICAgfVxuICB9XG5cbiAgb25MaW5rc0Rlc3Ryb3llZCA9ICh7YXJnc30pID0+IHtcbiAgICBjb25zdCBtb2RlbENsYXNzTmFtZSA9IHRoaXMucC5tb2RlbENsYXNzLm1vZGVsQ2xhc3NEYXRhKCkubmFtZVxuXG4gICAgaWYgKGFyZ3MuZGVzdHJveWVkW21vZGVsQ2xhc3NOYW1lXSkge1xuICAgICAgY29uc3QgYW1vdW50RGVzdHJveWVkID0gYXJncy5kZXN0cm95ZWRbbW9kZWxDbGFzc05hbWVdLmxlbmd0aFxuXG4gICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+ICh7XG4gICAgICAgIGN1cnJlbnRXb3JrcGxhY2VDb3VudDogcHJldlN0YXRlLmN1cnJlbnRXb3JrcGxhY2VDb3VudCAtIGFtb3VudERlc3Ryb3llZFxuICAgICAgfSkpXG4gICAgfVxuICB9XG5cbiAga2V5RXh0cmF0b3IgPSAobW9kZWwpID0+IGAke3RoaXMucy50YWJsZVNldHRpbmdGdWxsQ2FjaGVLZXl9LSR7bW9kZWwuaWQoKX1gXG5cbiAgZmlsdGVyRm9ybSA9ICgpID0+IHtcbiAgICBjb25zdCB7ZmlsdGVyRm9ybVJlZiwgc3VibWl0RmlsdGVyLCBzdWJtaXRGaWx0ZXJEZWJvdW5jZX0gPSB0aGlzLnR0XG4gICAgY29uc3Qge2ZpbHRlckNvbnRlbnQsIGZpbHRlclN1Ym1pdEJ1dHRvbn0gPSB0aGlzLnBcbiAgICBjb25zdCB7cXVlcnlRTmFtZX0gPSB0aGlzLnNcbiAgICBjb25zdCB7ZmlsdGVyU3VibWl0TGFiZWx9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHtxUGFyYW1zfSA9IGRpZ3ModGhpcy5jb2xsZWN0aW9uLCBcInFQYXJhbXNcIilcblxuICAgIHJldHVybiAoXG4gICAgICA8Rm9ybSBjbGFzc05hbWU9XCJsaXZlLXRhYmxlLS1maWx0ZXItZm9ybVwiIGZvcm1SZWY9e2ZpbHRlckZvcm1SZWZ9IG9uU3VibWl0PXt0aGlzLnR0Lm9uRmlsdGVyRm9ybVN1Ym1pdH0gc2V0Rm9ybT17dGhpcy5zZXRTdGF0ZXMuZmlsdGVyRm9ybX0+XG4gICAgICAgIHtcInNcIiBpbiBxUGFyYW1zICYmXG4gICAgICAgICAgPGlucHV0IG5hbWU9XCJzXCIgdHlwZT1cImhpZGRlblwiIHZhbHVlPXtxUGFyYW1zLnN9IC8+XG4gICAgICAgIH1cbiAgICAgICAge2ZpbHRlckNvbnRlbnQoe1xuICAgICAgICAgIG9uRmlsdGVyQ2hhbmdlZDogc3VibWl0RmlsdGVyLFxuICAgICAgICAgIG9uRmlsdGVyQ2hhbmdlZFdpdGhEZWxheTogc3VibWl0RmlsdGVyRGVib3VuY2UsXG4gICAgICAgICAgcVBhcmFtcyxcbiAgICAgICAgICBxdWVyeVFOYW1lXG4gICAgICAgIH0pfVxuICAgICAgICB7ZmlsdGVyU3VibWl0QnV0dG9uICYmXG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJidG4gYnRuLXByaW1hcnkgbGl2ZS10YWJsZS0tc3VibWl0LWZpbHRlci1idXR0b25cIlxuICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICBzdHlsZT17e21hcmdpblRvcDogXCI4cHhcIn19XG4gICAgICAgICAgICB2YWx1ZT17ZmlsdGVyU3VibWl0TGFiZWwgfHwgdGhpcy50KFwiLmZpbHRlclwiLCB7ZGVmYXVsdFZhbHVlOiBcIkZpbHRlclwifSl9XG4gICAgICAgICAgLz5cbiAgICAgICAgfVxuICAgICAgPC9Gb3JtPlxuICAgIClcbiAgfVxuXG4gIG9uRmlsdGVyQ2xpY2tlZCA9IChlKSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgdGhpcy5zZXRTdGF0ZSh7c2hvd0ZpbHRlcnM6ICF0aGlzLnN0YXRlLnNob3dGaWx0ZXJzfSlcbiAgfVxuXG4gIG9uUGVyUGFnZUNoYW5nZWQgPSAoZSkgPT4ge1xuICAgIGNvbnN0IHtxdWVyeU5hbWV9ID0gdGhpcy5zXG4gICAgY29uc3QgbmV3UGVyUGFnZVZhbHVlID0gZGlnZyhlLCBcInRhcmdldFwiLCBcInZhbHVlXCIpXG4gICAgY29uc3QgcGVyS2V5ID0gYCR7cXVlcnlOYW1lfV9wZXJgXG4gICAgY29uc3QgcGFyYW1zQ2hhbmdlID0ge31cblxuICAgIHBhcmFtc0NoYW5nZVtwZXJLZXldID0gbmV3UGVyUGFnZVZhbHVlXG5cbiAgICBQYXJhbXMuY2hhbmdlUGFyYW1zKHBhcmFtc0NoYW5nZSlcbiAgfVxuXG4gIHJlbmRlckl0ZW0gPSAoe2luZGV4LCBpdGVtOiBtb2RlbH0pID0+IHtcbiAgICBpZiAoIXRoaXMucy50YWJsZVNldHRpbmdMb2FkZWQpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxWaWV3PlxuICAgICAgICAgIDxUZXh0PlxuICAgICAgICAgICAge3RoaXMudChcIi5sb2FkaW5nX2RvdF9kb3RfZG90XCIsIHtkZWZhdWx0VmFsdWU6IFwiTG9hZGluZy4uLlwifSl9XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICA8L1ZpZXc+XG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxNb2RlbFJvd1xuICAgICAgICBjYWNoZUtleT17bW9kZWwuY2FjaGVLZXkoKX1cbiAgICAgICAgY29sdW1ucz17dGhpcy5zLmNvbHVtbnNUb1Nob3d9XG4gICAgICAgIGNvbHVtbldpZHRocz17dGhpcy5jb2x1bW5XaWR0aHMoKX1cbiAgICAgICAgZXZlbnRzPXt0aGlzLnR0LmV2ZW50c31cbiAgICAgICAgaW5kZXg9e2luZGV4fVxuICAgICAgICBrZXk9e21vZGVsLmlkKCl9XG4gICAgICAgIG1vZGVsPXttb2RlbH1cbiAgICAgICAgdGFibGU9e3RoaXN9XG4gICAgICAgIHRhYmxlU2V0dGluZ0Z1bGxDYWNoZUtleT17dGhpcy5zLnRhYmxlU2V0dGluZ0Z1bGxDYWNoZUtleX1cbiAgICAgIC8+XG4gICAgKVxuICB9XG5cbiAgc3R5bGVGb3JDb2x1bW4gPSAoe2NvbHVtbiwgY29sdW1uSW5kZXgsIGV2ZW4sIHN0eWxlLCB0eXBlfSkgPT4ge1xuICAgIGNvbnN0IHtzdHlsZVVJfSA9IHRoaXMucFxuICAgIGNvbnN0IGRlZmF1bHRTdHlsZSA9IHtcbiAgICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgICAgcGFkZGluZzogOCxcbiAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiXG4gICAgfVxuXG4gICAgaWYgKHN0eWxlVUkpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oZGVmYXVsdFN0eWxlLCB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogZXZlbiA/IFwiI2Y1ZjVmNVwiIDogXCIjZmZmXCJcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT0gXCJhY3Rpb25zXCIpIHtcbiAgICAgIGRlZmF1bHRTdHlsZS5mbGV4RGlyZWN0aW9uID0gXCJyb3dcIlxuICAgICAgZGVmYXVsdFN0eWxlLmFsaWduSXRlbXMgPSBcImNlbnRlclwiXG5cbiAgICAgIGlmICh0aGlzLnR0Lm1kVXApIHtcbiAgICAgICAgZGVmYXVsdFN0eWxlLm1hcmdpbkxlZnQgPSBcImF1dG9cIlxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmYXVsdFN0eWxlLm1hcmdpblJpZ2h0ID0gXCJhdXRvXCJcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMudHQubWRVcCAmJiBzdHlsZVVJKSB7XG4gICAgICBkZWZhdWx0U3R5bGUuYm9yZGVyUmlnaHQgPSBcIjFweCBzb2xpZCAjZGJkYmRiXCJcbiAgICB9XG5cbiAgICBjb25zdCBhY3R1YWxTdHlsZSA9IE9iamVjdC5hc3NpZ24oXG4gICAgICBkZWZhdWx0U3R5bGUsXG4gICAgICBzdHlsZVxuICAgIClcblxuICAgIHJldHVybiBhY3R1YWxTdHlsZVxuICB9XG5cbiAgc3R5bGVGb3JIZWFkZXIgPSAoe2NvbHVtbiwgY29sdW1uSW5kZXgsIHN0eWxlLCB0eXBlfSkgPT4ge1xuICAgIGNvbnN0IHttZFVwfSA9IHRoaXMudHRcbiAgICBjb25zdCBkZWZhdWx0U3R5bGUgPSB7XG4gICAgICBmbGV4RGlyZWN0aW9uOiBcInJvd1wiLFxuICAgICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbiAgICAgIHBhZGRpbmc6IDhcbiAgICB9XG5cbiAgICBpZiAodHlwZSAhPSBcImFjdGlvbnNcIiAmJiBtZFVwICYmIHRoaXMucC5zdHlsZVVJKSB7XG4gICAgICBkZWZhdWx0U3R5bGUuYm9yZGVyUmlnaHQgPSBcIjFweCBzb2xpZCAjZGJkYmRiXCJcbiAgICB9XG5cbiAgICBjb25zdCBhY3R1YWxTdHlsZSA9IE9iamVjdC5hc3NpZ24oXG4gICAgICBkZWZhdWx0U3R5bGUsXG4gICAgICBzdHlsZVxuICAgIClcblxuICAgIHJldHVybiBhY3R1YWxTdHlsZVxuICB9XG5cbiAgc3R5bGVGb3JIZWFkZXJUZXh0KCkge1xuICAgIGNvbnN0IGFjdHVhbFN0eWxlID0ge2ZvbnRXZWlnaHQ6IFwiYm9sZFwifVxuXG4gICAgcmV0dXJuIGFjdHVhbFN0eWxlXG4gIH1cblxuICBzdHlsZUZvclJvdyA9ICh7ZXZlbn0gPSB7fSkgPT4ge1xuICAgIGNvbnN0IGFjdHVhbFN0eWxlID0ge1xuICAgICAgZmxleDogMSxcbiAgICAgIGFsaWduSXRlbXM6IFwic3RyZXRjaFwiXG4gICAgfVxuXG4gICAgaWYgKGV2ZW4gJiYgdGhpcy5wLnN0eWxlVUkpIHtcbiAgICAgIGFjdHVhbFN0eWxlLmJhY2tncm91bmRDb2xvciA9IFwiI2Y1ZjVmNVwiXG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdHVhbFN0eWxlXG4gIH1cblxuICBzdHlsZUZvclJvd0hlYWRlciA9ICgpID0+IHtcbiAgICBjb25zdCBhY3R1YWxTdHlsZSA9IHtcbiAgICAgIGZsZXg6IDEsXG4gICAgICBhbGlnbkl0ZW1zOiBcInN0cmV0Y2hcIlxuICAgIH1cblxuICAgIHJldHVybiBhY3R1YWxTdHlsZVxuICB9XG5cbiAgdGFibGVDb250cm9scygpIHtcbiAgICBjb25zdCB7Y29udHJvbHN9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHtzaG93U2V0dGluZ3N9ID0gdGhpcy5zXG4gICAgY29uc3Qge21vZGVscywgcVBhcmFtcywgcXVlcnksIHJlc3VsdH0gPSBkaWdzKHRoaXMuY29sbGVjdGlvbiwgXCJtb2RlbHNcIiwgXCJxUGFyYW1zXCIsIFwicXVlcnlcIiwgXCJyZXN1bHRcIilcblxuICAgIHJldHVybiAoXG4gICAgICA8VmlldyBzdHlsZT17e2ZsZXhEaXJlY3Rpb246IFwicm93XCJ9fT5cbiAgICAgICAge2NvbnRyb2xzICYmIGNvbnRyb2xzKHttb2RlbHMsIHFQYXJhbXMsIHF1ZXJ5LCByZXN1bHR9KX1cbiAgICAgICAgPFByZXNzYWJsZSBkYXRhU2V0PXt7Y2xhc3M6IFwiZmlsdGVyLWJ1dHRvblwifX0gb25QcmVzcz17dGhpcy50dC5vbkZpbHRlckNsaWNrZWR9PlxuICAgICAgICAgIDxGb250QXdlc29tZUljb24gbmFtZT1cInNlYXJjaFwiIHNpemU9ezIwfSAvPlxuICAgICAgICA8L1ByZXNzYWJsZT5cbiAgICAgICAgPFZpZXcgc3R5bGU9e3twb3NpdGlvbjogXCJyZWxhdGl2ZVwifX0+XG4gICAgICAgICAge3Nob3dTZXR0aW5ncyAmJlxuICAgICAgICAgICAgPFNldHRpbmdzIG9uUmVxdWVzdENsb3NlPXt0aGlzLnR0Lm9uUmVxdWVzdENsb3NlU2V0dGluZ3N9IHRhYmxlPXt0aGlzfSAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8UHJlc3NhYmxlIGRhdGFTZXQ9e3tjbGFzczogXCJzZXR0aW5ncy1idXR0b25cIn19IG9uUHJlc3M9e3RoaXMudHQub25TZXR0aW5nc0NsaWNrZWR9PlxuICAgICAgICAgICAgPEZvbnRBd2Vzb21lSWNvbiBuYW1lPVwiZ2VhclwiIHNpemU9ezIwfSAvPlxuICAgICAgICAgIDwvUHJlc3NhYmxlPlxuICAgICAgICA8L1ZpZXc+XG4gICAgICA8L1ZpZXc+XG4gICAgKVxuICB9XG5cbiAgdGFibGVGb290ZXIoKSB7XG4gICAgY29uc3Qge3Jlc3VsdH0gPSBkaWdzKHRoaXMuY29sbGVjdGlvbiwgXCJyZXN1bHRcIilcbiAgICBjb25zdCBjdXJyZW50UGFnZSA9IHJlc3VsdC5jdXJyZW50UGFnZSgpXG4gICAgY29uc3QgdG90YWxDb3VudCA9IHJlc3VsdC50b3RhbENvdW50KClcbiAgICBjb25zdCBwZXJQYWdlID0gcmVzdWx0LnBlclBhZ2UoKVxuICAgIGNvbnN0IHRvID0gTWF0aC5taW4oY3VycmVudFBhZ2UgKiBwZXJQYWdlLCB0b3RhbENvdW50KVxuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IFwiU2hvd2luZyAle2Zyb219IHRvICV7dG99IG91dCBvZiAle3RvdGFsX2NvdW50fSB0b3RhbC5cIlxuICAgIGxldCBmcm9tID0gKChjdXJyZW50UGFnZSAtIDEpICogcGVyUGFnZSkgKyAxXG5cbiAgICBpZiAodG8gPT09IDApIGZyb20gPSAwXG5cbiAgICByZXR1cm4gKFxuICAgICAgPFZpZXcgc3R5bGU9e3tmbGV4RGlyZWN0aW9uOiBcInJvd1wiLCBqdXN0aWZ5Q29udGVudDogXCJzcGFjZS1iZXR3ZWVuXCIsIG1hcmdpblRvcDogMTB9fT5cbiAgICAgICAgPFZpZXcgZGF0YVNldD17e2NsYXNzOiBcInNob3dpbmctY291bnRzXCJ9fSBzdHlsZT17e2ZsZXhEaXJlY3Rpb246IFwicm93XCJ9fT5cbiAgICAgICAgICA8VGV4dD5cbiAgICAgICAgICAgIHt0aGlzLnQoXCIuc2hvd2luZ19mcm9tX3RvX291dF9vZl90b3RhbFwiLCB7ZGVmYXVsdFZhbHVlLCBmcm9tLCB0bywgdG90YWxfY291bnQ6IHRvdGFsQ291bnR9KX1cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAge3RoaXMucC53b3JrcGxhY2UgJiYgdGhpcy5zLmN1cnJlbnRXb3JrcGxhY2VDb3VudCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgPFRleHQgc3R5bGU9e3ttYXJnaW5MZWZ0OiAzfX0+XG4gICAgICAgICAgICAgIHt0aGlzLnQoXCIueF9zZWxlY3RlZFwiLCB7ZGVmYXVsdFZhbHVlOiBcIiV7c2VsZWN0ZWR9IHNlbGVjdGVkLlwiLCBzZWxlY3RlZDogdGhpcy5zLmN1cnJlbnRXb3JrcGxhY2VDb3VudH0pfVxuICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9WaWV3PlxuICAgICAgICA8Vmlldz5cbiAgICAgICAgICA8U2VsZWN0XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJwZXItcGFnZS1zZWxlY3RcIlxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlPXtwZXJQYWdlfVxuICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMudHQub25QZXJQYWdlQ2hhbmdlZH1cbiAgICAgICAgICAgIG9wdGlvbnM9e3BhZ2luYXRpb25PcHRpb25zfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvVmlldz5cbiAgICAgIDwvVmlldz5cbiAgICApXG4gIH1cblxuICBjbGFzc05hbWUoKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lcyA9IFtcImFwaS1tYWtlci0tdGFibGVcIl1cblxuICAgIGlmICh0aGlzLnByb3BzLmNsYXNzTmFtZSkge1xuICAgICAgY2xhc3NOYW1lcy5wdXNoKHRoaXMucHJvcHMuY2xhc3NOYW1lKVxuICAgIH1cblxuICAgIHJldHVybiBjbGFzc05hbWVzLmpvaW4oXCIgXCIpXG4gIH1cblxuICBjb2x1bW5Qcm9wcyhjb2x1bW4pIHtcbiAgICBjb25zdCBwcm9wcyA9IHt9XG5cbiAgICBpZiAoY29sdW1uLnRleHRDZW50ZXIpIHtcbiAgICAgIHByb3BzLnN0eWxlIHx8PSB7fVxuICAgICAgcHJvcHMuc3R5bGUudGV4dEFsaWduID0gXCJjZW50ZXJcIlxuICAgIH1cblxuICAgIGlmIChjb2x1bW4udGV4dFJpZ2h0KSB7XG4gICAgICBwcm9wcy5zdHlsZSB8fD0ge31cbiAgICAgIHByb3BzLnN0eWxlLnRleHRBbGlnbiA9IFwicmlnaHRcIlxuICAgIH1cblxuICAgIHJldHVybiBwcm9wc1xuICB9XG5cbiAgaGVhZGVyUHJvcHMoY29sdW1uKSB7XG4gICAgY29uc3QgcHJvcHMgPSB7fVxuXG4gICAgaWYgKGNvbHVtbi50ZXh0Q2VudGVyKSB7XG4gICAgICBwcm9wcy5zdHlsZSB8fD0ge31cbiAgICAgIHByb3BzLnN0eWxlLmp1c3RpZnlDb250ZW50ID0gXCJjZW50ZXJcIlxuICAgIH1cblxuICAgIGlmIChjb2x1bW4udGV4dFJpZ2h0KSB7XG4gICAgICBwcm9wcy5zdHlsZSB8fD0ge31cbiAgICAgIHByb3BzLnN0eWxlLmp1c3RpZnlDb250ZW50ID0gXCJlbmRcIlxuICAgIH1cblxuICAgIHJldHVybiBwcm9wc1xuICB9XG5cbiAgY29sdW1uV2lkdGhzKCkge1xuICAgIGNvbnN0IGNvbHVtbldpZHRocyA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiB0aGlzLnMucHJlcGFyZWRDb2x1bW5zKSB7XG4gICAgICBjb2x1bW5XaWR0aHNbY29sdW1uLnRhYmxlU2V0dGluZ0NvbHVtbi5pZGVudGlmaWVyKCldID0gY29sdW1uLndpZHRoXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbHVtbldpZHRoc1xuICB9XG5cbiAgaGVhZGVyc0NvbnRlbnRGcm9tQ29sdW1ucyA9ICgpID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgPERyYWdnYWJsZVNvcnRcbiAgICAgICAgZGF0YT17dGhpcy5zLmNvbHVtbnNUb1Nob3d9XG4gICAgICAgIGV2ZW50cz17dGhpcy50dC5kcmFnZ2FibGVTb3J0RXZlbnRzfVxuICAgICAgICBob3Jpem9udGFsXG4gICAgICAgIGtleUV4dHJhY3Rvcj17dGhpcy50dC5kcmFnTGlzdGtleUV4dHJhY3Rvcn1cbiAgICAgICAgb25JdGVtTW92ZWQ9e3RoaXMudHQub25JdGVtTW92ZWR9XG4gICAgICAgIG9uUmVvcmRlcmVkPXt0aGlzLnR0Lm9uUmVvcmRlcmVkfVxuICAgICAgICByZW5kZXJJdGVtPXt0aGlzLnR0LmRyYWdMaXN0UmVuZGVySXRlbUNvbnRlbnR9XG4gICAgICAvPlxuICAgIClcbiAgfVxuXG4gIGRyYWdMaXN0Q2FjaGVLZXlFeHRyYWN0b3IgPSAoaXRlbSkgPT4gYCR7aXRlbS50YWJsZVNldHRpbmdDb2x1bW4uaWRlbnRpZmllcigpfS0ke3RoaXMucy5yZXNpemluZ31gXG4gIGRyYWdMaXN0a2V5RXh0cmFjdG9yID0gKGl0ZW0pID0+IGl0ZW0udGFibGVTZXR0aW5nQ29sdW1uLmlkZW50aWZpZXIoKVxuXG4gIG9uSXRlbU1vdmVkID0gKHthbmltYXRpb25BcmdzLCBpdGVtSW5kZXgsIHgsIHl9KSA9PiB7XG4gICAgY29uc3QgYW5pbWF0ZWRQb3NpdGlvbiA9IGRpZ2codGhpcywgXCJzXCIsIFwiY29sdW1uc1RvU2hvd1wiLCBpdGVtSW5kZXgsIFwiYW5pbWF0ZWRQb3NpdGlvblwiKVxuXG4gICAgaWYgKGFuaW1hdGlvbkFyZ3MpIHtcbiAgICAgIEFuaW1hdGVkLnRpbWluZyhhbmltYXRlZFBvc2l0aW9uLCBhbmltYXRpb25BcmdzKS5zdGFydCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFuaW1hdGVkUG9zaXRpb24uc2V0VmFsdWUoe3gsIHl9KVxuICAgIH1cbiAgfVxuXG4gIG9uUmVvcmRlcmVkID0gYXN5bmMgKHtmcm9tSXRlbSwgZnJvbVBvc2l0aW9uLCB0b0l0ZW0sIHRvUG9zaXRpb259KSA9PiB7XG4gICAgaWYgKGZyb21Qb3NpdGlvbiA9PSB0b1Bvc2l0aW9uKSByZXR1cm4gLy8gT25seSBkbyByZXF1ZXN0cyBhbmQgcXVlcmllcyBpZiBjaGFuZ2VkXG5cbiAgICBjb25zdCBUYWJsZVNldHRpbmdDb2x1bW4gPSBmcm9tSXRlbS50YWJsZVNldHRpbmdDb2x1bW4uY29uc3RydWN0b3JcbiAgICBjb25zdCB0b0NvbHVtbiA9IGF3YWl0IFRhYmxlU2V0dGluZ0NvbHVtbi5maW5kKHRvSXRlbS50YWJsZVNldHRpbmdDb2x1bW4uaWQoKSkgLy8gTmVlZCB0byBsb2FkIGxhdGVzdCBwb3NpdGlvbiBiZWNhdXNlIEFjdHNBc0xpc3QgbWlnaHQgaGF2ZSBjaGFuZ2VkIGl0XG5cbiAgICBhd2FpdCBmcm9tSXRlbS50YWJsZVNldHRpbmdDb2x1bW4udXBkYXRlKHtwb3NpdGlvbjogdG9Db2x1bW4ucG9zaXRpb24oKX0pXG4gIH1cblxuICBkcmFnTGlzdFJlbmRlckl0ZW1Db250ZW50ID0gKHtpc0FjdGl2ZSwgaXRlbSwgdG91Y2hQcm9wc30pID0+IHtcbiAgICBjb25zdCB7YW5pbWF0ZWRXaWR0aCwgYW5pbWF0ZWRaSW5kZXgsIGNvbHVtbiwgdGFibGVTZXR0aW5nQ29sdW1ufSA9IGl0ZW1cblxuICAgIHJldHVybiAoXG4gICAgICA8SGVhZGVyQ29sdW1uXG4gICAgICAgIGFjdGl2ZT17aXNBY3RpdmV9XG4gICAgICAgIGFuaW1hdGVkV2lkdGg9e2FuaW1hdGVkV2lkdGh9XG4gICAgICAgIGFuaW1hdGVkWkluZGV4PXthbmltYXRlZFpJbmRleH1cbiAgICAgICAgY29sdW1uPXtjb2x1bW59XG4gICAgICAgIGtleT17dGFibGVTZXR0aW5nQ29sdW1uLmlkZW50aWZpZXIoKX1cbiAgICAgICAgcmVzaXppbmc9e3RoaXMucy5yZXNpemluZ31cbiAgICAgICAgdGFibGU9e3RoaXN9XG4gICAgICAgIHRhYmxlU2V0dGluZ0NvbHVtbj17dGFibGVTZXR0aW5nQ29sdW1ufVxuICAgICAgICB0b3VjaFByb3BzPXt0b3VjaFByb3BzfVxuICAgICAgICB3aWR0aHM9e3RoaXMucy53aWR0aHN9XG4gICAgICAvPlxuICAgIClcbiAgfVxuXG4gIGhlYWRlckNsYXNzTmFtZUZvckNvbHVtbihjb2x1bW4pIHtcbiAgICBjb25zdCBjbGFzc05hbWVzID0gW11cblxuICAgIGlmIChjb2x1bW4uY29tbW9uUHJvcHMgJiYgY29sdW1uLmNvbW1vblByb3BzLmNsYXNzTmFtZSkgY2xhc3NOYW1lcy5wdXNoKGNvbHVtbi5jb21tb25Qcm9wcy5jbGFzc05hbWUpXG4gICAgaWYgKGNvbHVtbi5oZWFkZXJQcm9wcyAmJiBjb2x1bW4uaGVhZGVyUHJvcHMuY2xhc3NOYW1lKSBjbGFzc05hbWVzLnB1c2goY29sdW1uLmhlYWRlclByb3BzLmNsYXNzTmFtZSlcblxuICAgIHJldHVybiBjbGFzc05hbWVzXG4gIH1cblxuICBoZWFkZXJMYWJlbEZvckNvbHVtbihjb2x1bW4pIHtcbiAgICBjb25zdCB7bW9kZWxDbGFzc30gPSB0aGlzLnBcblxuICAgIGlmIChcImxhYmVsXCIgaW4gY29sdW1uKSB7XG4gICAgICBpZiAodHlwZW9mIGNvbHVtbi5sYWJlbCA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGNvbHVtbi5sYWJlbCgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY29sdW1uLmxhYmVsXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGN1cnJlbnRNb2RlbENsYXNzID0gbW9kZWxDbGFzc1xuXG4gICAgLy8gQ2FsY3VsYXRlIGN1cnJlbnQgbW9kZWwgY2xhc3MgdGhyb3VnaCBwYXRoXG4gICAgaWYgKGNvbHVtbi5wYXRoKSB7XG4gICAgICBmb3IgKGNvbnN0IHBhdGhQYXJ0IG9mIGNvbHVtbi5wYXRoKSB7XG4gICAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcHMgPSBkaWdnKGN1cnJlbnRNb2RlbENsYXNzLm1vZGVsQ2xhc3NEYXRhKCksIFwicmVsYXRpb25zaGlwc1wiKVxuICAgICAgICBjb25zdCByZWxhdGlvbnNoaXAgPSByZWxhdGlvbnNoaXBzLmZpbmQoKHJlbGF0aW9uc2hpcEluQXJyYXkpID0+IHJlbGF0aW9uc2hpcEluQXJyYXkubmFtZSA9PSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUocGF0aFBhcnQpKVxuXG4gICAgICAgIGN1cnJlbnRNb2RlbENsYXNzID0gbW9kZWxDbGFzc1JlcXVpcmUoZGlnZyhyZWxhdGlvbnNoaXAsIFwicmVzb3VyY2VfbmFtZVwiKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29sdW1uLmF0dHJpYnV0ZSkgcmV0dXJuIGN1cnJlbnRNb2RlbENsYXNzLmh1bWFuQXR0cmlidXRlTmFtZShjb2x1bW4uYXR0cmlidXRlKVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gJ2xhYmVsJyBvciAnYXR0cmlidXRlJyB3YXMgZ2l2ZW5cIilcbiAgfVxuXG4gIG9uRmlsdGVyRm9ybVN1Ym1pdCA9ICgpID0+IHRoaXMuc3VibWl0RmlsdGVyKClcbiAgb25SZXF1ZXN0Q2xvc2VTZXR0aW5ncyA9ICgpID0+IHRoaXMuc2V0U3RhdGUoe3Nob3dTZXR0aW5nczogZmFsc2V9KVxuXG4gIG9uU2V0dGluZ3NDbGlja2VkID0gKGUpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KClcblxuICAgIHRoaXMuc2V0U3RhdGUoe3Nob3dTZXR0aW5nczogIXRoaXMucy5zaG93U2V0dGluZ3N9KVxuICB9XG5cbiAgc3VibWl0RmlsdGVyID0gKCkgPT4ge1xuICAgIGNvbnN0IGZpbHRlckZvcm0gPSBkaWdnKHRoaXMudHQuZmlsdGVyRm9ybVJlZiwgXCJjdXJyZW50XCIpXG4gICAgY29uc3Qge2FwcEhpc3Rvcnl9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHFQYXJhbXMgPSBQYXJhbXMuc2VyaWFsaXplRm9ybShmaWx0ZXJGb3JtKVxuICAgIGNvbnN0IHtxdWVyeVFOYW1lfSA9IHRoaXMuc1xuICAgIGNvbnN0IGNoYW5nZVBhcmFtc1BhcmFtcyA9IHt9XG5cbiAgICBjaGFuZ2VQYXJhbXNQYXJhbXNbcXVlcnlRTmFtZV0gPSBKU09OLnN0cmluZ2lmeShxUGFyYW1zKVxuXG4gICAgUGFyYW1zLmNoYW5nZVBhcmFtcyhjaGFuZ2VQYXJhbXNQYXJhbXMsIHthcHBIaXN0b3J5fSlcbiAgfVxuXG4gIHN1Ym1pdEZpbHRlckRlYm91bmNlID0gZGVib3VuY2UodGhpcy50dC5zdWJtaXRGaWx0ZXIpXG59KSlcbiJdLCJtYXBwaW5ncyI6IjtBQUFBLFNBQVFBLElBQUksRUFBRUMsSUFBSSxRQUFPLFdBQVc7QUFDcEMsT0FBT0MsS0FBSyxJQUFHQyxhQUFhLEVBQUVDLFVBQVUsRUFBRUMsT0FBTyxFQUFFQyxNQUFNLFFBQU8sT0FBTztBQUN2RSxTQUFRQyxRQUFRLEVBQUVDLFNBQVMsRUFBRUMsSUFBSSxRQUFPLGNBQWM7QUFDdEQsT0FBT0MsYUFBYSxNQUFNLG1CQUFtQjtBQUM3QyxPQUFPQyxJQUFJLE1BQU0sbUJBQW1CO0FBQ3BDLE9BQU9DLFVBQVUsTUFBTSxZQUFZO0FBQ25DLE9BQU9DLFVBQVUsTUFBTSxlQUFlO0FBQ3RDLE9BQU9DLGFBQWEsTUFBTSxrQkFBa0I7QUFDNUMsT0FBT0MsUUFBUSxNQUFNLFVBQVU7QUFDL0IsT0FBT0MsYUFBYSxNQUFNLHlCQUF5QjtBQUNuRCxPQUFPQyxZQUFZLE1BQU0sUUFBUTtBQUNqQyxPQUFPQyxPQUFPLE1BQU0sV0FBVztBQUMvQixPQUFPQyxRQUFRLE1BQU0sd0JBQXdCO0FBQzdDLE9BQU9DLGVBQWUsTUFBTSx1Q0FBdUM7QUFDbkUsU0FBUUMsSUFBSSxRQUFPLFNBQVM7QUFDNUIsT0FBT0MsTUFBTSxNQUFNLHFCQUFxQjtBQUN4QyxPQUFPQyxZQUFZLE1BQU0saUJBQWlCO0FBQzFDLE9BQU9DLFlBQVksTUFBTSxpQkFBaUI7QUFDMUMsT0FBTyxLQUFLQyxVQUFVLE1BQU0sWUFBWTtBQUN4QyxPQUFPQyxJQUFJLE1BQU0sNEJBQTRCO0FBQzdDLE9BQU9DLGlCQUFpQixNQUFNLHdCQUF3QjtBQUN0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