studiokit-scaffolding-js 7.0.14-alpha.1 → 7.1.1

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 (374) hide show
  1. package/lib/components/ActionList.d.ts +2 -2
  2. package/lib/components/ActionList.js +166 -87
  3. package/lib/components/AlertDialog.d.ts +3 -3
  4. package/lib/components/AlertDialog.js +133 -18
  5. package/lib/components/AlertWithIcon.js +93 -52
  6. package/lib/components/ConnectedModal.d.ts +1 -2
  7. package/lib/components/ConnectedModal.js +41 -35
  8. package/lib/components/Dropdowns/GroupsDropdown.d.ts +4 -4
  9. package/lib/components/Dropdowns/GroupsDropdown.js +69 -82
  10. package/lib/components/Dropdowns/ManagedNavDropdown.d.ts +2 -2
  11. package/lib/components/Dropdowns/ManagedNavDropdown.js +96 -108
  12. package/lib/components/Dropdowns/UserDropdown.js +109 -70
  13. package/lib/components/Dropdowns/index.js +27 -11
  14. package/lib/components/EntityOwnerList.d.ts +3 -3
  15. package/lib/components/EntityOwnerList.js +52 -60
  16. package/lib/components/Error.js +107 -27
  17. package/lib/components/ErrorBoundary.js +133 -94
  18. package/lib/components/ErrorMessage.d.ts +2 -2
  19. package/lib/components/ErrorMessage.js +44 -14
  20. package/lib/components/Forms/DateField.d.ts +2 -2
  21. package/lib/components/Forms/DateField.js +63 -95
  22. package/lib/components/Forms/TimeField.d.ts +2 -2
  23. package/lib/components/Forms/TimeField.js +84 -108
  24. package/lib/components/Forms/index.js +27 -13
  25. package/lib/components/Groups/CreateEditCopySaveButtons.d.ts +2 -2
  26. package/lib/components/Groups/CreateEditCopySaveButtons.js +102 -14
  27. package/lib/components/Groups/ExternalGroups/Attach.d.ts +6 -7
  28. package/lib/components/Groups/ExternalGroups/Attach.js +213 -188
  29. package/lib/components/Groups/ExternalGroups/Table.js +183 -76
  30. package/lib/components/Groups/GroupCreateOrEditCommonProps.js +5 -1
  31. package/lib/components/Groups/RosterSyncInfo.js +140 -49
  32. package/lib/components/HOC/AccessibleAppComponent.d.ts +2 -2
  33. package/lib/components/HOC/AccessibleAppComponent.js +96 -119
  34. package/lib/components/HOC/ActivityRequiredComponent.d.ts +14 -14
  35. package/lib/components/HOC/ActivityRequiredComponent.js +72 -86
  36. package/lib/components/HOC/AsyncComponent.d.ts +9 -9
  37. package/lib/components/HOC/AsyncComponent.js +53 -129
  38. package/lib/components/HOC/AuthenticatedComponent.d.ts +4 -4
  39. package/lib/components/HOC/AuthenticatedComponent.js +59 -96
  40. package/lib/components/HOC/CollectionComponent.d.ts +12 -12
  41. package/lib/components/HOC/CollectionComponent.js +161 -161
  42. package/lib/components/HOC/CollectionFirstItemComponent.d.ts +13 -13
  43. package/lib/components/HOC/CollectionFirstItemComponent.js +49 -91
  44. package/lib/components/HOC/CollectionItemComponent.d.ts +9 -9
  45. package/lib/components/HOC/CollectionItemComponent.js +159 -158
  46. package/lib/components/HOC/ConnectedModalComponent.d.ts +9 -9
  47. package/lib/components/HOC/ConnectedModalComponent.js +96 -126
  48. package/lib/components/HOC/DataDependentComponent.d.ts +3 -55
  49. package/lib/components/HOC/DataDependentComponent.js +30 -79
  50. package/lib/components/HOC/EntityComponent.d.ts +13 -13
  51. package/lib/components/HOC/EntityComponent.js +63 -101
  52. package/lib/components/HOC/FullscreenModalComponent.d.ts +9 -9
  53. package/lib/components/HOC/FullscreenModalComponent.js +145 -165
  54. package/lib/components/HOC/GroupActivityRequiredComponent.d.ts +2 -2
  55. package/lib/components/HOC/GroupActivityRequiredComponent.js +32 -31
  56. package/lib/components/HOC/GuidComponent.d.ts +1 -1
  57. package/lib/components/HOC/GuidComponent.js +25 -64
  58. package/lib/components/HOC/ModelContextDependencyVerifyComponent.d.ts +28 -29
  59. package/lib/components/HOC/ModelContextDependencyVerifyComponent.js +36 -59
  60. package/lib/components/HOC/ModelErrorRedirectComponent.d.ts +10 -10
  61. package/lib/components/HOC/ModelErrorRedirectComponent.js +40 -83
  62. package/lib/components/HOC/SearchPersistorComponent.d.ts +4 -4
  63. package/lib/components/HOC/SearchPersistorComponent.js +243 -216
  64. package/lib/components/HOC/UnauthenticatedComponent.d.ts +12 -12
  65. package/lib/components/HOC/UnauthenticatedComponent.js +37 -82
  66. package/lib/components/HOC/UserComponent.d.ts +1 -1
  67. package/lib/components/HOC/UserComponent.js +12 -11
  68. package/lib/components/Icons/IconAlphaList.js +34 -20
  69. package/lib/components/Icons/IconExternalUser.js +34 -20
  70. package/lib/components/Icons/IconImpersonation.js +34 -20
  71. package/lib/components/Icons/IconStopImpersonating.js +34 -20
  72. package/lib/components/Icons/IconTable.js +35 -21
  73. package/lib/components/Icons/IconTableDeleteCol.js +34 -20
  74. package/lib/components/Icons/IconTableDeleteRow.js +34 -20
  75. package/lib/components/Icons/IconTableInsertCol.js +34 -20
  76. package/lib/components/Icons/IconTableInsertRow.js +34 -20
  77. package/lib/components/Impersonation/Button.d.ts +2 -2
  78. package/lib/components/Impersonation/Button.js +76 -56
  79. package/lib/components/Impersonation/Link.d.ts +2 -2
  80. package/lib/components/Impersonation/Link.js +76 -53
  81. package/lib/components/Impersonation/UserDetail.d.ts +2 -2
  82. package/lib/components/Impersonation/UserDetail.js +64 -15
  83. package/lib/components/Loading.js +27 -21
  84. package/lib/components/LockDownBrowser/Check.js +194 -107
  85. package/lib/components/LockDownBrowser/ExitButton.js +27 -14
  86. package/lib/components/LockDownBrowser/Launch.js +70 -85
  87. package/lib/components/Lti/Confirm.js +152 -33
  88. package/lib/components/Lti/CreateNonLtiGroupAlertDialog.d.ts +4 -2
  89. package/lib/components/Lti/CreateNonLtiGroupAlertDialog.js +170 -78
  90. package/lib/components/Lti/Launch.js +105 -49
  91. package/lib/components/Lti/LaunchGroup.js +85 -39
  92. package/lib/components/ManageTable.d.ts +1 -2
  93. package/lib/components/ManageTable.js +309 -104
  94. package/lib/components/ManageTableNoDataComponent.js +42 -22
  95. package/lib/components/NewVersionAlert.d.ts +2 -2
  96. package/lib/components/NewVersionAlert.js +82 -91
  97. package/lib/components/NotFound.js +87 -28
  98. package/lib/components/Notifications.d.ts +4 -4
  99. package/lib/components/Notifications.js +187 -169
  100. package/lib/components/PaginationNextButton.js +33 -21
  101. package/lib/components/PaginationPreviousButton.js +33 -21
  102. package/lib/components/Quill/CustomToolbar.d.ts +2 -2
  103. package/lib/components/Quill/CustomToolbar.js +432 -257
  104. package/lib/components/Quill/Formats/Image.d.ts +10 -25
  105. package/lib/components/Quill/Formats/Image.js +76 -82
  106. package/lib/components/Quill/Formats/List.d.ts +6 -3
  107. package/lib/components/Quill/Formats/List.js +50 -72
  108. package/lib/components/Quill/Formats/Video.d.ts +2 -1
  109. package/lib/components/Quill/Formats/Video.js +29 -43
  110. package/lib/components/Quill/ImageDropModule.d.ts +1 -1
  111. package/lib/components/Quill/ImageDropModule.js +142 -115
  112. package/lib/components/Quill/ImageWarning.d.ts +2 -2
  113. package/lib/components/Quill/ImageWarning.js +45 -32
  114. package/lib/components/Quill/ImageWithAltTextModal.d.ts +0 -1
  115. package/lib/components/Quill/ImageWithAltTextModal.js +425 -141
  116. package/lib/components/Quill/Specs/CustomImageSpec.d.ts +1 -1
  117. package/lib/components/Quill/Specs/CustomImageSpec.js +37 -45
  118. package/lib/components/Quill/Specs/CustomVideoSpec.d.ts +1 -1
  119. package/lib/components/Quill/Specs/CustomVideoSpec.js +27 -36
  120. package/lib/components/Quill/TableModule/Blots/BaseTableBlot.d.ts +2 -1
  121. package/lib/components/Quill/TableModule/Blots/BaseTableBlot.js +100 -116
  122. package/lib/components/Quill/TableModule/Blots/TableBlot.js +53 -66
  123. package/lib/components/Quill/TableModule/Blots/TableBodyBlot.js +54 -67
  124. package/lib/components/Quill/TableModule/Blots/TableCellBlot.d.ts +1 -1
  125. package/lib/components/Quill/TableModule/Blots/TableCellBlot.js +225 -241
  126. package/lib/components/Quill/TableModule/Blots/TableContainer.js +82 -99
  127. package/lib/components/Quill/TableModule/Blots/TableRowBlot.js +76 -87
  128. package/lib/components/Quill/TableModule/constants.js +45 -41
  129. package/lib/components/Quill/TableModule/index.css +25 -25
  130. package/lib/components/Quill/TableModule/index.d.ts +14 -5
  131. package/lib/components/Quill/TableModule/index.js +373 -313
  132. package/lib/components/Quill/TableModule/utils.js +45 -45
  133. package/lib/components/Quill/accessibilityFix.d.ts +0 -1
  134. package/lib/components/Quill/accessibilityFix.js +222 -238
  135. package/lib/components/Quill/index.js +36 -32
  136. package/lib/components/RefreshIndicator/Bordered.js +48 -32
  137. package/lib/components/RefreshIndicator/Inline.js +48 -33
  138. package/lib/components/RefreshIndicator/index.d.ts +2 -2
  139. package/lib/components/RefreshIndicator/index.js +263 -113
  140. package/lib/components/SearchControls.js +216 -31
  141. package/lib/components/SentryRoute.js +10 -23
  142. package/lib/components/Tables/RoleFilter.d.ts +3 -4
  143. package/lib/components/Tables/RoleFilter.js +71 -46
  144. package/lib/components/Tables/TextFilter.d.ts +2 -3
  145. package/lib/components/Tables/TextFilter.js +62 -20
  146. package/lib/components/UserRoles/Add.d.ts +3 -3
  147. package/lib/components/UserRoles/Add.js +199 -161
  148. package/lib/components/UserRoles/Context.js +8 -6
  149. package/lib/components/UserRoles/RoleCell.js +181 -100
  150. package/lib/components/UserRoles/Select.js +168 -54
  151. package/lib/components/UserRoles/Table.js +221 -102
  152. package/lib/components/UserRoles/index.d.ts +6 -6
  153. package/lib/components/UserRoles/index.js +535 -464
  154. package/lib/config/eslint/index.d.ts +2 -0
  155. package/lib/config/eslint/index.js +36 -0
  156. package/lib/config/eslint/lib/order.d.ts +3 -0
  157. package/lib/config/eslint/lib/order.js +30 -0
  158. package/lib/config/eslint/lib/prettier.d.ts +3 -0
  159. package/lib/config/eslint/lib/prettier.js +23 -0
  160. package/lib/config/eslint/lib/typescript.d.ts +2 -0
  161. package/lib/config/eslint/lib/typescript.js +98 -0
  162. package/lib/config/eslint/react.d.ts +2 -0
  163. package/lib/config/eslint/react.js +30 -0
  164. package/lib/constants/baseActivity.js +30 -26
  165. package/lib/constants/baseRole.js +14 -10
  166. package/lib/constants/configuration.d.ts +1 -1
  167. package/lib/constants/configuration.js +43 -39
  168. package/lib/constants/externalProviderType.js +10 -6
  169. package/lib/constants/fetchErrorData.js +15 -11
  170. package/lib/constants/index.js +137 -23
  171. package/lib/constants/lockDownBrowser.js +28 -24
  172. package/lib/constants/mockData.d.ts +4 -6
  173. package/lib/constants/mockData.js +383 -324
  174. package/lib/constants/modelStatus.js +15 -11
  175. package/lib/constants/notificationType.js +12 -8
  176. package/lib/constants/operatingSystem.js +12 -8
  177. package/lib/constants/shard.js +11 -7
  178. package/lib/constants/table.js +21 -21
  179. package/lib/constants/tier.js +12 -8
  180. package/lib/constants/userRole.d.ts +1 -2
  181. package/lib/constants/userRole.js +15 -17
  182. package/lib/css/components/_buttons.css +11 -3
  183. package/lib/css/components/_quill.css +3 -3
  184. package/lib/css/components/_tables.css +6 -5
  185. package/lib/css/utils/_display.css +12 -19
  186. package/lib/css/utils/_general.css +1 -1
  187. package/lib/css/utils/_text.css +2 -1
  188. package/lib/css/variables.css +0 -4
  189. package/lib/endpointMappings.js +197 -193
  190. package/lib/hooks/useCollection.js +83 -65
  191. package/lib/hooks/useCollectionConfiguration.d.ts +0 -1
  192. package/lib/hooks/useCollectionConfiguration.js +179 -82
  193. package/lib/hooks/useCollectionItem.js +155 -58
  194. package/lib/hooks/useEventCalback.d.ts +14 -0
  195. package/lib/hooks/useEventCalback.js +51 -0
  196. package/lib/hooks/useGuid.js +19 -8
  197. package/lib/hooks/usePrevious.d.ts +24 -1
  198. package/lib/hooks/usePrevious.js +82 -12
  199. package/lib/index.js +156 -36
  200. package/lib/redux/actionCreator.d.ts +6 -6
  201. package/lib/redux/actionCreator.js +51 -40
  202. package/lib/redux/actions/AuthAction.js +44 -31
  203. package/lib/redux/actions/ModalAction.d.ts +1 -1
  204. package/lib/redux/actions/ModalAction.js +10 -6
  205. package/lib/redux/actions/ModelAction.d.ts +1 -1
  206. package/lib/redux/actions/ModelAction.js +77 -49
  207. package/lib/redux/actions/NotificationAction.js +10 -6
  208. package/lib/redux/actions/SearchAction.js +9 -5
  209. package/lib/redux/actions/index.js +60 -16
  210. package/lib/redux/configureReducers.d.ts +2 -5
  211. package/lib/redux/configureReducers.js +61 -72
  212. package/lib/redux/configureStore.d.ts +2 -2
  213. package/lib/redux/configureStore.js +83 -115
  214. package/lib/redux/helpers.js +7 -2
  215. package/lib/redux/reducers/authReducer.js +50 -44
  216. package/lib/redux/reducers/index.js +41 -15
  217. package/lib/redux/reducers/modalsReducer.js +49 -52
  218. package/lib/redux/reducers/modelsReducer.d.ts +2 -2
  219. package/lib/redux/reducers/modelsReducer.js +136 -135
  220. package/lib/redux/reducers/notificationsReducer.js +26 -21
  221. package/lib/redux/reducers/searchReducer.js +18 -12
  222. package/lib/redux/sagas/appInsightsSaga.js +24 -62
  223. package/lib/redux/sagas/authSaga.js +287 -414
  224. package/lib/redux/sagas/caliperSaga.js +154 -248
  225. package/lib/redux/sagas/clockOffsetSaga.js +35 -76
  226. package/lib/redux/sagas/configurationSaga.js +13 -46
  227. package/lib/redux/sagas/downtimeApiErrorSaga.d.ts +0 -1
  228. package/lib/redux/sagas/downtimeApiErrorSaga.js +23 -64
  229. package/lib/redux/sagas/errorSaga.d.ts +0 -1
  230. package/lib/redux/sagas/errorSaga.js +29 -63
  231. package/lib/redux/sagas/googleAnalyticsSaga.js +29 -69
  232. package/lib/redux/sagas/identityProviderSaga.js +24 -69
  233. package/lib/redux/sagas/initialDataLoadSaga.js +38 -29
  234. package/lib/redux/sagas/lockDownBrowserErrorSaga.d.ts +0 -1
  235. package/lib/redux/sagas/lockDownBrowserErrorSaga.js +32 -81
  236. package/lib/redux/sagas/modelFetchSaga.js +331 -411
  237. package/lib/redux/sagas/noStoreSaga.d.ts +1 -1
  238. package/lib/redux/sagas/noStoreSaga.js +68 -101
  239. package/lib/redux/sagas/postLoginDataSaga.js +42 -74
  240. package/lib/redux/sagas/postLoginRedirectSaga.js +27 -68
  241. package/lib/redux/sagas/rootSaga.js +85 -137
  242. package/lib/redux/sagas/sentrySaga.js +29 -85
  243. package/lib/redux/sagas/userIdSaga.js +18 -54
  244. package/lib/services/codeProviderService.js +25 -29
  245. package/lib/services/dateService.js +12 -10
  246. package/lib/services/documentService.js +15 -10
  247. package/lib/services/fetchService.js +110 -144
  248. package/lib/services/persistenceService.d.ts +4 -4
  249. package/lib/services/persistenceService.js +45 -43
  250. package/lib/services/ticketProviderService.js +29 -33
  251. package/lib/services/tokenPersistenceService.js +13 -9
  252. package/lib/services/windowService.js +21 -17
  253. package/lib/startup.d.ts +1 -1
  254. package/lib/startup.js +115 -118
  255. package/lib/types/AppConfiguration.js +5 -1
  256. package/lib/types/Artifact.js +11 -7
  257. package/lib/types/BaseReduxState.js +5 -1
  258. package/lib/types/Client.js +5 -1
  259. package/lib/types/Collection.d.ts +3 -3
  260. package/lib/types/Collection.js +5 -1
  261. package/lib/types/Configuration.js +5 -1
  262. package/lib/types/DeepLinkingResponseRequest.js +5 -1
  263. package/lib/types/DeletableModel.js +5 -1
  264. package/lib/types/Event.js +5 -1
  265. package/lib/types/ExternalGroup.js +5 -1
  266. package/lib/types/ExternalProvider.js +5 -1
  267. package/lib/types/ExternalTerm.js +5 -1
  268. package/lib/types/Group.js +5 -1
  269. package/lib/types/IdentityProvider.js +5 -1
  270. package/lib/types/LtiLaunch.js +5 -1
  271. package/lib/types/NameOnlyEntity.js +5 -1
  272. package/lib/types/Notification.d.ts +2 -2
  273. package/lib/types/Notification.js +5 -1
  274. package/lib/types/OptionalRecord.d.ts +1 -1
  275. package/lib/types/OptionalRecord.js +5 -1
  276. package/lib/types/OwnerSchedule.d.ts +3 -1
  277. package/lib/types/OwnerSchedule.js +5 -1
  278. package/lib/types/PropertyOfType.d.ts +3 -3
  279. package/lib/types/PropertyOfType.js +5 -1
  280. package/lib/types/Quill.js +5 -1
  281. package/lib/types/RoleDescription.d.ts +0 -1
  282. package/lib/types/RoleDescription.js +5 -1
  283. package/lib/types/Search.js +5 -1
  284. package/lib/types/SimpleLocation.js +5 -1
  285. package/lib/types/UniTime.js +5 -1
  286. package/lib/types/User.js +5 -1
  287. package/lib/types/UserRole.js +5 -1
  288. package/lib/types/auth/AuthState.js +5 -1
  289. package/lib/types/auth/CasV1LoginRequestBody.js +5 -1
  290. package/lib/types/auth/ClientCredentials.js +5 -1
  291. package/lib/types/auth/CodeProviderService.js +5 -1
  292. package/lib/types/auth/LocalLoginRequestBody.js +5 -1
  293. package/lib/types/auth/TicketProviderService.js +5 -1
  294. package/lib/types/auth/TokenPersistenceService.js +5 -1
  295. package/lib/types/auth/index.js +82 -18
  296. package/lib/types/externals.d.js +2 -0
  297. package/lib/types/index.js +313 -39
  298. package/lib/types/net/EndpointConfig.js +5 -1
  299. package/lib/types/net/EndpointMapping.js +5 -1
  300. package/lib/types/net/EndpointMappings.js +5 -1
  301. package/lib/types/net/ErrorHandler.d.ts +1 -1
  302. package/lib/types/net/ErrorHandler.js +5 -1
  303. package/lib/types/net/FetchConfig.d.ts +1 -1
  304. package/lib/types/net/FetchConfig.js +5 -1
  305. package/lib/types/net/FetchErrorData.js +10 -6
  306. package/lib/types/net/FetchResult.d.ts +2 -2
  307. package/lib/types/net/FetchResult.js +5 -1
  308. package/lib/types/net/HTTPMethod.d.ts +1 -1
  309. package/lib/types/net/HTTPMethod.js +5 -1
  310. package/lib/types/net/HTTPStatusCode.js +16 -12
  311. package/lib/types/net/Metadata.js +5 -1
  312. package/lib/types/net/Model.js +5 -1
  313. package/lib/types/net/ModelCollection.js +5 -1
  314. package/lib/types/net/ModelsState.js +5 -1
  315. package/lib/types/net/OAuthToken.js +5 -1
  316. package/lib/types/net/OAuthTokenOrNull.d.ts +1 -1
  317. package/lib/types/net/OAuthTokenOrNull.js +5 -1
  318. package/lib/types/net/TokenAccessFunction.d.ts +1 -1
  319. package/lib/types/net/TokenAccessFunction.js +5 -1
  320. package/lib/types/net/index.js +181 -27
  321. package/lib/utils/baseActivity.d.ts +2 -2
  322. package/lib/utils/baseActivity.js +93 -91
  323. package/lib/utils/baseRole.js +37 -33
  324. package/lib/utils/collection.js +413 -291
  325. package/lib/utils/cookies.js +22 -37
  326. package/lib/utils/date.js +210 -210
  327. package/lib/utils/dom.js +145 -133
  328. package/lib/utils/domainIdentifier.js +9 -9
  329. package/lib/utils/entityUserRole.js +6 -2
  330. package/lib/utils/error.d.ts +1 -1
  331. package/lib/utils/error.js +18 -16
  332. package/lib/utils/events.js +37 -30
  333. package/lib/utils/externalGroup.js +25 -21
  334. package/lib/utils/externalProviders.js +8 -4
  335. package/lib/utils/externalTerms.js +9 -6
  336. package/lib/utils/fetch.d.ts +1 -1
  337. package/lib/utils/fetch.js +179 -176
  338. package/lib/utils/group.js +17 -9
  339. package/lib/utils/groupDates.d.ts +1 -1
  340. package/lib/utils/groupDates.js +43 -39
  341. package/lib/utils/groupRoles.js +28 -28
  342. package/lib/utils/lockDownBrowser.js +16 -12
  343. package/lib/utils/logger.js +30 -25
  344. package/lib/utils/lti.js +10 -5
  345. package/lib/utils/model.d.ts +2 -2
  346. package/lib/utils/model.js +35 -44
  347. package/lib/utils/number.js +13 -16
  348. package/lib/utils/promise.d.ts +6 -1
  349. package/lib/utils/promise.js +34 -15
  350. package/lib/utils/quill.js +60 -71
  351. package/lib/utils/route.d.ts +2 -2
  352. package/lib/utils/route.js +61 -60
  353. package/lib/utils/search.d.ts +1 -1
  354. package/lib/utils/search.js +78 -85
  355. package/lib/utils/shard.js +38 -41
  356. package/lib/utils/sort.d.ts +3 -3
  357. package/lib/utils/sort.js +62 -58
  358. package/lib/utils/string.js +14 -10
  359. package/lib/utils/table.d.ts +3 -3
  360. package/lib/utils/table.js +36 -33
  361. package/lib/utils/timezone.js +12 -26
  362. package/lib/utils/url.d.ts +2 -1
  363. package/lib/utils/url.js +139 -193
  364. package/lib/utils/user.js +59 -61
  365. package/lib/utils/userAgent.js +11 -11
  366. package/lib/utils/userRole.d.ts +3 -3
  367. package/lib/utils/userRole.js +46 -44
  368. package/package.json +90 -73
  369. package/lib/config/eslint/index.cjs +0 -21
  370. package/lib/config/eslint/lib/order.cjs +0 -22
  371. package/lib/config/eslint/lib/prettier.cjs +0 -18
  372. package/lib/config/eslint/lib/typescript.cjs +0 -86
  373. package/lib/config/eslint/react.cjs +0 -9
  374. package/lib/css/utils/_focus.css +0 -4
@@ -1,278 +1,390 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.cleanupCollectionGuidKey = exports.handleCollectionParamsChange = exports.handleCollectionItemParamsChange = exports.initializeCollection = exports.initializeCollectionItem = exports.deleteCollectionItem = exports.deleteItemFromCollection = exports.updateCollectionItem = exports.updateItemInCollection = exports.createCollectionItem = exports.createItemInCollection = exports.loadCollectionItem = exports.loadCollection = exports.stopCollectionPeriodicLoad = exports.selectCollectionFromState = exports.selectCollectionItemFromState = void 0;
7
- var lodash_1 = require("lodash");
8
- var memoize_one_1 = __importDefault(require("memoize-one"));
9
- var constants_1 = require("../constants");
10
- var actionCreator_1 = require("../redux/actionCreator");
11
- var route_1 = require("./route");
12
- //#region Redux Methods
13
- var getPathParams = memoize_one_1.default(function (pathParams, routeMatchParams, modelName) {
14
- return pathParams || route_1.getPathParamsFromRouteMatchParams(routeMatchParams, modelName);
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
15
6
  });
7
+ exports.cleanupCollectionGuidKey = cleanupCollectionGuidKey;
8
+ exports.createCollectionItem = createCollectionItem;
9
+ exports.createItemInCollection = createItemInCollection;
10
+ exports.deleteCollectionItem = deleteCollectionItem;
11
+ exports.deleteItemFromCollection = deleteItemFromCollection;
12
+ exports.handleCollectionItemParamsChange = handleCollectionItemParamsChange;
13
+ exports.handleCollectionParamsChange = handleCollectionParamsChange;
14
+ exports.initializeCollection = initializeCollection;
15
+ exports.initializeCollectionItem = initializeCollectionItem;
16
+ exports.loadCollection = loadCollection;
17
+ exports.loadCollectionItem = loadCollectionItem;
18
+ exports.selectCollectionFromState = selectCollectionFromState;
19
+ exports.selectCollectionItemFromState = selectCollectionItemFromState;
20
+ exports.stopCollectionPeriodicLoad = stopCollectionPeriodicLoad;
21
+ exports.updateCollectionItem = updateCollectionItem;
22
+ exports.updateItemInCollection = updateItemInCollection;
23
+ var _lodash = require("lodash");
24
+ var _memoizeOne = _interopRequireDefault(require("memoize-one"));
25
+ var _constants = require("../constants");
26
+ var _actionCreator = require("../redux/actionCreator");
27
+ var _route = require("./route");
28
+ //#region Redux Methods
29
+
30
+ const getPathParams = (0, _memoizeOne.default)((pathParams, routeMatchParams, modelName) => pathParams || (0, _route.getPathParamsFromRouteMatchParams)(routeMatchParams, modelName));
31
+
32
+ // Provide a stable object reference for empty collections
33
+ const DEFAULT_MODEL = Object.freeze({});
16
34
  function selectCollectionItemFromState(params) {
17
- var guid = params.guid, modelName = params.modelName, pathParams = params.pathParams, routeMatchParams = params.routeMatchParams, state = params.state;
18
- var modelNameLevelCount = route_1.getMinRequiredPathParamsCount(modelName);
19
- var p = getPathParams(pathParams, routeMatchParams, modelName);
20
- var reduxModelName = route_1.getReduxModelName(p, modelName);
21
- var model = {};
22
- // find `model` using `guid` as its key, to match new item created in `create()`
23
- if (p.length === modelNameLevelCount) {
24
- var collection = (lodash_1.get(state.models, reduxModelName) || {});
25
- if (Object.prototype.hasOwnProperty.call(collection, guid)) {
26
- model = collection[guid];
27
- }
28
- else {
29
- var modelByGuid = lodash_1.find(lodash_1.values(collection), function (m) { return m && m.guid && m.guid === guid; });
30
- model = modelByGuid || model;
31
- }
35
+ const {
36
+ guid,
37
+ modelName,
38
+ pathParams,
39
+ routeMatchParams,
40
+ state
41
+ } = params;
42
+ const modelNameLevelCount = (0, _route.getMinRequiredPathParamsCount)(modelName);
43
+ const p = getPathParams(pathParams, routeMatchParams, modelName);
44
+ const reduxModelName = (0, _route.getReduxModelName)(p, modelName);
45
+ let model = DEFAULT_MODEL;
46
+ // find `model` using `guid` as its key, to match new item created in `create()`
47
+ if (p.length === modelNameLevelCount) {
48
+ const collection = (0, _lodash.get)(state.models, reduxModelName) || {};
49
+ if (Object.prototype.hasOwnProperty.call(collection, guid)) {
50
+ model = collection[guid];
51
+ } else {
52
+ const modelByGuid = (0, _lodash.find)((0, _lodash.values)(collection), m => !!m && 'guid' in m && m.guid === guid);
53
+ model = modelByGuid || model;
32
54
  }
33
- else {
34
- // find `model` using pathParams
35
- var reduxModel = (lodash_1.get(state.models, reduxModelName) || {});
36
- model = (Object.keys(reduxModel).length > 0 ? reduxModel : {});
37
- }
38
- return {
39
- modelName: modelName,
40
- pathParams: p,
41
- model: model,
42
- isCollectionItem: true
43
- };
55
+ } else {
56
+ // find `model` using pathParams
57
+ const reduxModel = (0, _lodash.get)(state.models, reduxModelName) || {};
58
+ model = Object.keys(reduxModel).length > 0 ? reduxModel : DEFAULT_MODEL;
59
+ }
60
+ return {
61
+ modelName,
62
+ pathParams: p,
63
+ model,
64
+ isCollectionItem: true
65
+ };
44
66
  }
45
- exports.selectCollectionItemFromState = selectCollectionItemFromState;
46
67
  function selectCollectionFromState(params) {
47
- var modelName = params.modelName, pathParams = params.pathParams, routeMatchParams = params.routeMatchParams, state = params.state;
48
- var p = getPathParams(pathParams, routeMatchParams, modelName);
49
- var reduxModelName = route_1.getReduxModelName(p, modelName);
50
- var model = lodash_1.get(state.models, reduxModelName);
51
- model = model && Object.keys(model).length > 0 ? model : {};
52
- return {
53
- modelName: modelName,
54
- pathParams: p,
55
- model: model,
56
- isCollectionItem: false
57
- };
68
+ const {
69
+ modelName,
70
+ pathParams,
71
+ routeMatchParams,
72
+ state
73
+ } = params;
74
+ const p = getPathParams(pathParams, routeMatchParams, modelName);
75
+ const reduxModelName = (0, _route.getReduxModelName)(p, modelName);
76
+ let model = (0, _lodash.get)(state.models, reduxModelName);
77
+ model = model && Object.keys(model).length > 0 ? model : DEFAULT_MODEL;
78
+ return {
79
+ modelName,
80
+ pathParams: p,
81
+ model,
82
+ isCollectionItem: false
83
+ };
58
84
  }
59
- exports.selectCollectionFromState = selectCollectionFromState;
85
+
60
86
  //#endregion Redux Methods
87
+
61
88
  //#region Collection/Item CRUD Methods
89
+
62
90
  //#region Load
91
+
63
92
  function stopCollectionPeriodicLoad(taskId) {
64
- actionCreator_1.dispatchPeriodicModelFetchTerminateAction({
65
- taskId: taskId
66
- });
93
+ (0, _actionCreator.dispatchPeriodicModelFetchTerminateAction)({
94
+ taskId
95
+ });
67
96
  }
68
- exports.stopCollectionPeriodicLoad = stopCollectionPeriodicLoad;
69
- function loadCollection(config, params) {
70
- if (params === void 0) { params = {}; }
71
- var modelName = config.modelName, isInitialized = config.isInitialized, configPathParams = config.pathParams, configQueryParams = config.queryParams, changeModelStatus = config.changeModelStatus;
72
- var id = params.id, pathParams = params.pathParams, queryParams = params.queryParams, period = params.period, taskId = params.taskId, replaceValue = params.replaceValue;
73
- var p = lodash_1.concat([], pathParams || configPathParams, id ? [id] : []);
74
- if (p.length !== route_1.getMinRequiredPathParamsCount(modelName) + (id ? 1 : 0)) {
75
- throw new Error('pathParams length does not match length of path components');
76
- }
77
- if (isInitialized) {
78
- changeModelStatus(constants_1.MODEL_STATUS.LOADING, id);
79
- }
80
- if (!period) {
81
- actionCreator_1.dispatchModelFetchRequest({
82
- modelName: modelName,
83
- method: 'GET',
84
- pathParams: p,
85
- queryParams: queryParams || configQueryParams,
86
- replaceValue: replaceValue
87
- });
88
- }
89
- else {
90
- if (!taskId)
91
- throw new Error('taskId is required for periodic data requests');
92
- actionCreator_1.dispatchPeriodicModelFetchRequest({
93
- modelName: modelName,
94
- method: 'GET',
95
- pathParams: p,
96
- queryParams: queryParams || configQueryParams,
97
- period: period,
98
- taskId: taskId,
99
- replaceValue: replaceValue
100
- });
101
- }
97
+ function loadCollection(config) {
98
+ let params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
99
+ const {
100
+ modelName,
101
+ isInitialized,
102
+ pathParams: configPathParams,
103
+ queryParams: configQueryParams,
104
+ changeModelStatus
105
+ } = config;
106
+ const {
107
+ id,
108
+ pathParams,
109
+ queryParams,
110
+ period,
111
+ taskId,
112
+ replaceValue
113
+ } = params;
114
+ const p = (0, _lodash.concat)([], pathParams || configPathParams, id ? [id] : []);
115
+ if (p.length !== (0, _route.getMinRequiredPathParamsCount)(modelName) + (id ? 1 : 0)) {
116
+ throw new Error('pathParams length does not match length of path components');
117
+ }
118
+ if (isInitialized) {
119
+ changeModelStatus(_constants.MODEL_STATUS.LOADING, id);
120
+ }
121
+ if (!period) {
122
+ (0, _actionCreator.dispatchModelFetchRequest)({
123
+ modelName,
124
+ method: 'GET',
125
+ pathParams: p,
126
+ queryParams: queryParams || configQueryParams,
127
+ replaceValue
128
+ });
129
+ } else {
130
+ if (!taskId) throw new Error('taskId is required for periodic data requests');
131
+ (0, _actionCreator.dispatchPeriodicModelFetchRequest)({
132
+ modelName,
133
+ method: 'GET',
134
+ pathParams: p,
135
+ queryParams: queryParams || configQueryParams,
136
+ period,
137
+ taskId,
138
+ replaceValue
139
+ });
140
+ }
102
141
  }
103
- exports.loadCollection = loadCollection;
104
- function loadCollectionItem(config, params) {
105
- if (params === void 0) { params = {}; }
106
- var modelName = config.modelName, isInitialized = config.isInitialized, configPathParams = config.pathParams, configQueryParams = config.queryParams, changeModelStatus = config.changeModelStatus;
107
- var pathParams = params.pathParams, queryParams = params.queryParams, period = params.period, taskId = params.taskId, replaceValue = params.replaceValue;
108
- var p = pathParams || configPathParams;
109
- if (p && p.length < route_1.getMinRequiredPathParamsCount(modelName) + 1) {
110
- throw new Error('pathParams length does not match length of path components');
111
- }
112
- if (isInitialized) {
113
- changeModelStatus(constants_1.MODEL_STATUS.LOADING);
114
- }
115
- if (!period) {
116
- actionCreator_1.dispatchModelFetchRequest({
117
- modelName: modelName,
118
- method: 'GET',
119
- pathParams: p,
120
- queryParams: queryParams || configQueryParams,
121
- replaceValue: replaceValue
122
- });
123
- }
124
- else {
125
- if (!taskId)
126
- throw new Error('taskId is required for periodic data requests');
127
- actionCreator_1.dispatchPeriodicModelFetchRequest({
128
- modelName: modelName,
129
- method: 'GET',
130
- pathParams: p,
131
- queryParams: queryParams || configQueryParams,
132
- period: period,
133
- taskId: taskId,
134
- replaceValue: replaceValue
135
- });
136
- }
142
+ function loadCollectionItem(config) {
143
+ let params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
144
+ const {
145
+ modelName,
146
+ isInitialized,
147
+ pathParams: configPathParams,
148
+ queryParams: configQueryParams,
149
+ changeModelStatus
150
+ } = config;
151
+ const {
152
+ pathParams,
153
+ queryParams,
154
+ period,
155
+ taskId,
156
+ replaceValue
157
+ } = params;
158
+ const p = pathParams || configPathParams;
159
+ if (p.length < (0, _route.getMinRequiredPathParamsCount)(modelName) + 1) {
160
+ throw new Error('pathParams length does not match length of path components');
161
+ }
162
+ if (isInitialized) {
163
+ changeModelStatus(_constants.MODEL_STATUS.LOADING);
164
+ }
165
+ if (!period) {
166
+ (0, _actionCreator.dispatchModelFetchRequest)({
167
+ modelName,
168
+ method: 'GET',
169
+ pathParams: p,
170
+ queryParams: queryParams || configQueryParams,
171
+ replaceValue
172
+ });
173
+ } else {
174
+ if (!taskId) throw new Error('taskId is required for periodic data requests');
175
+ (0, _actionCreator.dispatchPeriodicModelFetchRequest)({
176
+ modelName,
177
+ method: 'GET',
178
+ pathParams: p,
179
+ queryParams: queryParams || configQueryParams,
180
+ period,
181
+ taskId,
182
+ replaceValue
183
+ });
184
+ }
137
185
  }
138
- exports.loadCollectionItem = loadCollectionItem;
186
+
139
187
  //#endregion Load
188
+
140
189
  //#region Create
190
+
141
191
  function createItemInCollection(config, params) {
142
- var guid = config.guid, modelName = config.modelName, pathParams = config.pathParams, configQueryParams = config.queryParams, changeModelStatus = config.changeModelStatus;
143
- var body = params.body, contentType = params.contentType, queryParams = params.queryParams;
144
- if (pathParams && pathParams.length < route_1.getMinRequiredPathParamsCount(modelName)) {
145
- throw new Error('pathParams length does not match length of path components');
146
- }
147
- changeModelStatus(constants_1.MODEL_STATUS.CREATING, guid);
148
- actionCreator_1.dispatchModelFetchRequest({
149
- modelName: modelName,
150
- guid: guid,
151
- method: 'POST',
152
- body: body,
153
- pathParams: pathParams,
154
- contentType: contentType,
155
- queryParams: queryParams || configQueryParams
156
- });
192
+ const {
193
+ guid,
194
+ modelName,
195
+ pathParams,
196
+ queryParams: configQueryParams,
197
+ changeModelStatus
198
+ } = config;
199
+ const {
200
+ body,
201
+ contentType,
202
+ queryParams
203
+ } = params;
204
+ if (pathParams.length < (0, _route.getMinRequiredPathParamsCount)(modelName)) {
205
+ throw new Error('pathParams length does not match length of path components');
206
+ }
207
+ changeModelStatus(_constants.MODEL_STATUS.CREATING, guid);
208
+ (0, _actionCreator.dispatchModelFetchRequest)({
209
+ modelName,
210
+ guid,
211
+ method: 'POST',
212
+ body,
213
+ pathParams,
214
+ contentType,
215
+ queryParams: queryParams || configQueryParams
216
+ });
157
217
  }
158
- exports.createItemInCollection = createItemInCollection;
159
218
  function createCollectionItem(model, config, params) {
160
- if (model.id) {
161
- throw new Error('model already exists');
162
- }
163
- var guid = config.guid, modelName = config.modelName, pathParams = config.pathParams, configQueryParams = config.queryParams, changeModelStatus = config.changeModelStatus;
164
- var body = params.body, contentType = params.contentType, queryParams = params.queryParams;
165
- if (pathParams && pathParams.length < route_1.getMinRequiredPathParamsCount(modelName)) {
166
- throw new Error('pathParams length does not match length of path components');
167
- }
168
- changeModelStatus(constants_1.MODEL_STATUS.CREATING);
169
- actionCreator_1.dispatchModelFetchRequest({
170
- modelName: modelName,
171
- guid: guid,
172
- method: 'POST',
173
- body: body,
174
- pathParams: pathParams,
175
- contentType: contentType,
176
- queryParams: queryParams || configQueryParams
177
- });
219
+ if (model.id) {
220
+ throw new Error('model already exists');
221
+ }
222
+ const {
223
+ guid,
224
+ modelName,
225
+ pathParams,
226
+ queryParams: configQueryParams,
227
+ changeModelStatus
228
+ } = config;
229
+ const {
230
+ body,
231
+ contentType,
232
+ queryParams
233
+ } = params;
234
+ if (pathParams.length < (0, _route.getMinRequiredPathParamsCount)(modelName)) {
235
+ throw new Error('pathParams length does not match length of path components');
236
+ }
237
+ changeModelStatus(_constants.MODEL_STATUS.CREATING);
238
+ (0, _actionCreator.dispatchModelFetchRequest)({
239
+ modelName,
240
+ guid,
241
+ method: 'POST',
242
+ body,
243
+ pathParams,
244
+ contentType,
245
+ queryParams: queryParams || configQueryParams
246
+ });
178
247
  }
179
- exports.createCollectionItem = createCollectionItem;
248
+
180
249
  //#endregion Create
250
+
181
251
  //#region Update
252
+
182
253
  function updateItemInCollection(config, params) {
183
- var id = params.id, body = params.body, contentType = params.contentType, method = params.method, queryParams = params.queryParams;
184
- if (!id) {
185
- throw new Error("'id' is required");
186
- }
187
- if (!body) {
188
- throw new Error("'body' is required");
189
- }
190
- var modelName = config.modelName, configPathParams = config.pathParams, configQueryParams = config.queryParams, changeModelStatus = config.changeModelStatus;
191
- var pathParams = lodash_1.concat([], configPathParams, [id]);
192
- if (pathParams.length !== route_1.getMinRequiredPathParamsCount(modelName) + 1) {
193
- throw new Error('pathParams+id length does not match length of path components');
194
- }
195
- var m = method || 'PUT';
196
- changeModelStatus(constants_1.MODEL_STATUS.UPDATING, id);
197
- actionCreator_1.dispatchModelFetchRequest({
198
- modelName: modelName,
199
- method: m,
200
- pathParams: pathParams,
201
- queryParams: queryParams || configQueryParams,
202
- body: body,
203
- contentType: contentType
204
- });
254
+ const {
255
+ id,
256
+ body,
257
+ contentType,
258
+ method,
259
+ queryParams
260
+ } = params;
261
+ if (!id) {
262
+ throw new Error(`'id' is required`);
263
+ }
264
+ if (!body) {
265
+ throw new Error(`'body' is required`);
266
+ }
267
+ const {
268
+ modelName,
269
+ pathParams: configPathParams,
270
+ queryParams: configQueryParams,
271
+ changeModelStatus
272
+ } = config;
273
+ const pathParams = (0, _lodash.concat)([], configPathParams, [id]);
274
+ if (pathParams.length !== (0, _route.getMinRequiredPathParamsCount)(modelName) + 1) {
275
+ throw new Error('pathParams+id length does not match length of path components');
276
+ }
277
+ const m = method || 'PUT';
278
+ changeModelStatus(_constants.MODEL_STATUS.UPDATING, id);
279
+ (0, _actionCreator.dispatchModelFetchRequest)({
280
+ modelName,
281
+ method: m,
282
+ pathParams,
283
+ queryParams: queryParams || configQueryParams,
284
+ body,
285
+ contentType
286
+ });
205
287
  }
206
- exports.updateItemInCollection = updateItemInCollection;
207
288
  function updateCollectionItem(model, config, params) {
208
- if (!model.id) {
209
- throw new Error('model does not exist');
210
- }
211
- var body = params.body, contentType = params.contentType, method = params.method, queryParams = params.queryParams;
212
- if (!body) {
213
- throw new Error("'body' is required");
214
- }
215
- var modelName = config.modelName, pathParams = config.pathParams, configQueryParams = config.queryParams, changeModelStatus = config.changeModelStatus;
216
- if (pathParams && pathParams.length < route_1.getMinRequiredPathParamsCount(modelName) + 1) {
217
- throw new Error('pathParams length does not match length of path components');
218
- }
219
- var m = method || 'PUT';
220
- changeModelStatus(constants_1.MODEL_STATUS.UPDATING);
221
- actionCreator_1.dispatchModelFetchRequest({
222
- modelName: modelName,
223
- method: m,
224
- pathParams: pathParams,
225
- body: body,
226
- contentType: contentType,
227
- queryParams: queryParams || configQueryParams
228
- });
289
+ if (!model.id) {
290
+ throw new Error('model does not exist');
291
+ }
292
+ const {
293
+ body,
294
+ contentType,
295
+ method,
296
+ queryParams
297
+ } = params;
298
+ if (!body) {
299
+ throw new Error(`'body' is required`);
300
+ }
301
+ const {
302
+ modelName,
303
+ pathParams,
304
+ queryParams: configQueryParams,
305
+ changeModelStatus
306
+ } = config;
307
+ if (pathParams.length < (0, _route.getMinRequiredPathParamsCount)(modelName) + 1) {
308
+ throw new Error('pathParams length does not match length of path components');
309
+ }
310
+ const m = method || 'PUT';
311
+ changeModelStatus(_constants.MODEL_STATUS.UPDATING);
312
+ (0, _actionCreator.dispatchModelFetchRequest)({
313
+ modelName,
314
+ method: m,
315
+ pathParams,
316
+ body,
317
+ contentType,
318
+ queryParams: queryParams || configQueryParams
319
+ });
229
320
  }
230
- exports.updateCollectionItem = updateCollectionItem;
321
+
231
322
  //#endregion Update
323
+
232
324
  //#region Delete
325
+
233
326
  function deleteItemFromCollection(config, params) {
234
- var id = params.id, body = params.body, queryParams = params.queryParams;
235
- if (!id) {
236
- throw new Error("'id' is required");
237
- }
238
- var modelName = config.modelName, pathParams = config.pathParams, configQueryParams = config.queryParams, changeModelStatus = config.changeModelStatus;
239
- var p = lodash_1.concat([], pathParams, [id]);
240
- if (p.length !== route_1.getMinRequiredPathParamsCount(modelName) + 1) {
241
- throw new Error('pathParams+id length does not match length of path components');
242
- }
243
- changeModelStatus(constants_1.MODEL_STATUS.DELETING, id);
244
- actionCreator_1.dispatchModelFetchRequest({
245
- modelName: modelName,
246
- method: 'DELETE',
247
- pathParams: p,
248
- queryParams: queryParams || configQueryParams,
249
- body: body
250
- });
327
+ const {
328
+ id,
329
+ body,
330
+ queryParams
331
+ } = params;
332
+ if (!id) {
333
+ throw new Error(`'id' is required`);
334
+ }
335
+ const {
336
+ modelName,
337
+ pathParams,
338
+ queryParams: configQueryParams,
339
+ changeModelStatus
340
+ } = config;
341
+ const p = (0, _lodash.concat)([], pathParams, [id]);
342
+ if (p.length !== (0, _route.getMinRequiredPathParamsCount)(modelName) + 1) {
343
+ throw new Error('pathParams+id length does not match length of path components');
344
+ }
345
+ changeModelStatus(_constants.MODEL_STATUS.DELETING, id);
346
+ (0, _actionCreator.dispatchModelFetchRequest)({
347
+ modelName,
348
+ method: 'DELETE',
349
+ pathParams: p,
350
+ queryParams: queryParams || configQueryParams,
351
+ body
352
+ });
251
353
  }
252
- exports.deleteItemFromCollection = deleteItemFromCollection;
253
- function deleteCollectionItem(model, config, params) {
254
- if (params === void 0) { params = {}; }
255
- if (!model.id) {
256
- throw new Error('model does not exist');
257
- }
258
- var body = params.body, queryParams = params.queryParams;
259
- var modelName = config.modelName, pathParams = config.pathParams, configQueryParams = config.queryParams, changeModelStatus = config.changeModelStatus;
260
- if (pathParams && pathParams.length < route_1.getMinRequiredPathParamsCount(modelName) + 1) {
261
- throw new Error('pathParams length does not match length of path components');
262
- }
263
- changeModelStatus(constants_1.MODEL_STATUS.DELETING);
264
- actionCreator_1.dispatchModelFetchRequest({
265
- modelName: modelName,
266
- method: 'DELETE',
267
- pathParams: pathParams,
268
- body: body,
269
- queryParams: queryParams || configQueryParams
270
- });
354
+ function deleteCollectionItem(model, config) {
355
+ let params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
356
+ if (!model.id) {
357
+ throw new Error('model does not exist');
358
+ }
359
+ const {
360
+ body,
361
+ queryParams
362
+ } = params;
363
+ const {
364
+ modelName,
365
+ pathParams,
366
+ queryParams: configQueryParams,
367
+ changeModelStatus
368
+ } = config;
369
+ if (pathParams.length < (0, _route.getMinRequiredPathParamsCount)(modelName) + 1) {
370
+ throw new Error('pathParams length does not match length of path components');
371
+ }
372
+ changeModelStatus(_constants.MODEL_STATUS.DELETING);
373
+ (0, _actionCreator.dispatchModelFetchRequest)({
374
+ modelName,
375
+ method: 'DELETE',
376
+ pathParams,
377
+ body,
378
+ queryParams: queryParams || configQueryParams
379
+ });
271
380
  }
272
- exports.deleteCollectionItem = deleteCollectionItem;
381
+
273
382
  //#endregion Delete
383
+
274
384
  //#endregion Collection/Item CRUD Methods
385
+
275
386
  //#region Helper Methods
387
+
276
388
  /**
277
389
  * Automatically call `load`, or `changeModelStatus` to `READY`.
278
390
  *
@@ -282,17 +394,19 @@ exports.deleteCollectionItem = deleteCollectionItem;
282
394
  * * auto load is disabled.
283
395
  */
284
396
  function initializeCollectionItem(model, load, config) {
285
- var modelName = config.modelName, pathParams = config.pathParams, disableAutoLoad = config.disableAutoLoad, changeModelStatus = config.changeModelStatus;
286
- if (pathParams.length === route_1.getMinRequiredPathParamsCount(modelName) + 1 &&
287
- !disableAutoLoad &&
288
- (!model._metadata || model._metadata.isFetching === false)) {
289
- load();
290
- }
291
- else {
292
- changeModelStatus(constants_1.MODEL_STATUS.READY);
293
- }
397
+ const {
398
+ modelName,
399
+ pathParams,
400
+ disableAutoLoad,
401
+ changeModelStatus
402
+ } = config;
403
+ if (pathParams.length === (0, _route.getMinRequiredPathParamsCount)(modelName) + 1 && !disableAutoLoad && (!model._metadata || !model._metadata.isFetching)) {
404
+ load();
405
+ } else {
406
+ changeModelStatus(_constants.MODEL_STATUS.READY);
407
+ }
294
408
  }
295
- exports.initializeCollectionItem = initializeCollectionItem;
409
+
296
410
  /**
297
411
  * Automatically call `load`, or `changeModelStatus` to `READY`.
298
412
  *
@@ -301,62 +415,70 @@ exports.initializeCollectionItem = initializeCollectionItem;
301
415
  * * auto load is disabled.
302
416
  */
303
417
  function initializeCollection(model, load, config) {
304
- var disableAutoLoad = config.disableAutoLoad, changeModelStatus = config.changeModelStatus;
305
- if (!disableAutoLoad && (!model._metadata || !model._metadata.isFetching)) {
306
- load();
307
- }
308
- else if (disableAutoLoad) {
309
- changeModelStatus(constants_1.MODEL_STATUS.READY);
310
- }
418
+ const {
419
+ disableAutoLoad,
420
+ changeModelStatus
421
+ } = config;
422
+ if (!disableAutoLoad && (!model._metadata || !model._metadata.isFetching)) {
423
+ load();
424
+ } else if (disableAutoLoad) {
425
+ changeModelStatus(_constants.MODEL_STATUS.READY);
426
+ }
311
427
  }
312
- exports.initializeCollection = initializeCollection;
428
+
313
429
  /**
314
430
  * When `pathParams` or `queryParams` change, call `load`
315
431
  */
316
432
  function handleCollectionItemParamsChange(modelName, prevModelName, pathParams, prevPathParams, queryParams, prevQueryParams, load) {
317
- if (modelName !== prevModelName ||
318
- (pathParams.length === route_1.getMinRequiredPathParamsCount(modelName) + 1 && !lodash_1.isEqual(prevPathParams, pathParams)) ||
319
- !lodash_1.isEqual(prevQueryParams, queryParams)) {
320
- load({ pathParams: pathParams, queryParams: queryParams });
321
- }
433
+ if (modelName !== prevModelName || pathParams.length === (0, _route.getMinRequiredPathParamsCount)(modelName) + 1 && !(0, _lodash.isEqual)(prevPathParams, pathParams) || !(0, _lodash.isEqual)(prevQueryParams, queryParams)) {
434
+ load({
435
+ pathParams,
436
+ queryParams
437
+ });
438
+ }
322
439
  }
323
- exports.handleCollectionItemParamsChange = handleCollectionItemParamsChange;
440
+
324
441
  /**
325
442
  * When `pathParams` or `queryParams` change, call `load`
326
443
  */
327
444
  function handleCollectionParamsChange(modelName, prevModelName, pathParams, prevPathParams, queryParams, prevQueryParams, load) {
328
- if (modelName !== prevModelName ||
329
- (pathParams.length > 0 && !lodash_1.isEqual(prevPathParams, pathParams)) ||
330
- !lodash_1.isEqual(prevQueryParams, queryParams)) {
331
- load({ pathParams: pathParams, queryParams: queryParams });
332
- }
445
+ if (modelName !== prevModelName || pathParams.length > 0 && !(0, _lodash.isEqual)(prevPathParams, pathParams) || !(0, _lodash.isEqual)(prevQueryParams, queryParams)) {
446
+ load({
447
+ pathParams,
448
+ queryParams
449
+ });
450
+ }
333
451
  }
334
- exports.handleCollectionParamsChange = handleCollectionParamsChange;
452
+
335
453
  /**
336
454
  * Delete the guid in the model
337
455
  */
338
456
  function cleanupCollectionGuidKey(model, config) {
339
- var guid = config.guid, modelName = config.modelName, pathParams = config.pathParams;
340
- if (lodash_1.includes(Object.keys(model), guid)) {
341
- var modelNames = modelName.split('.');
342
- var tempPathParams_1 = pathParams.slice();
343
- // should include the guid at the end
344
- tempPathParams_1.push(guid);
345
- if (modelNames.length === tempPathParams_1.length) {
346
- var path_1 = '';
347
- modelNames.forEach(function (m, i) {
348
- if (i === 0) {
349
- path_1 += m + "." + tempPathParams_1[i];
350
- }
351
- else {
352
- path_1 += "." + m + "." + tempPathParams_1[i];
353
- }
354
- });
355
- actionCreator_1.dispatchModelRemoveKeyAction({
356
- modelPath: path_1
357
- });
457
+ const {
458
+ guid,
459
+ modelName,
460
+ pathParams
461
+ } = config;
462
+ if ((0, _lodash.includes)(Object.keys(model), guid)) {
463
+ const modelNames = modelName.split('.');
464
+ const tempPathParams = pathParams.slice();
465
+ // should include the guid at the end
466
+ tempPathParams.push(guid);
467
+ if (modelNames.length === tempPathParams.length) {
468
+ let path = '';
469
+ modelNames.forEach((m, i) => {
470
+ if (i === 0) {
471
+ path += `${m}.${tempPathParams[i]}`;
472
+ } else {
473
+ path += `.${m}.${tempPathParams[i]}`;
358
474
  }
475
+ });
476
+ (0, _actionCreator.dispatchModelRemoveKeyAction)({
477
+ modelPath: path
478
+ });
359
479
  }
480
+ }
360
481
  }
361
- exports.cleanupCollectionGuidKey = cleanupCollectionGuidKey;
482
+
362
483
  //#endregion Helper Methods
484
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwicmVxdWlyZSIsIl9tZW1vaXplT25lIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9jb25zdGFudHMiLCJfYWN0aW9uQ3JlYXRvciIsIl9yb3V0ZSIsImdldFBhdGhQYXJhbXMiLCJtZW1vaXplT25lIiwicGF0aFBhcmFtcyIsInJvdXRlTWF0Y2hQYXJhbXMiLCJtb2RlbE5hbWUiLCJnZXRQYXRoUGFyYW1zRnJvbVJvdXRlTWF0Y2hQYXJhbXMiLCJERUZBVUxUX01PREVMIiwiT2JqZWN0IiwiZnJlZXplIiwic2VsZWN0Q29sbGVjdGlvbkl0ZW1Gcm9tU3RhdGUiLCJwYXJhbXMiLCJndWlkIiwic3RhdGUiLCJtb2RlbE5hbWVMZXZlbENvdW50IiwiZ2V0TWluUmVxdWlyZWRQYXRoUGFyYW1zQ291bnQiLCJwIiwicmVkdXhNb2RlbE5hbWUiLCJnZXRSZWR1eE1vZGVsTmFtZSIsIm1vZGVsIiwibGVuZ3RoIiwiY29sbGVjdGlvbiIsImdldCIsIm1vZGVscyIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIm1vZGVsQnlHdWlkIiwiZmluZCIsInZhbHVlcyIsIm0iLCJyZWR1eE1vZGVsIiwia2V5cyIsImlzQ29sbGVjdGlvbkl0ZW0iLCJzZWxlY3RDb2xsZWN0aW9uRnJvbVN0YXRlIiwic3RvcENvbGxlY3Rpb25QZXJpb2RpY0xvYWQiLCJ0YXNrSWQiLCJkaXNwYXRjaFBlcmlvZGljTW9kZWxGZXRjaFRlcm1pbmF0ZUFjdGlvbiIsImxvYWRDb2xsZWN0aW9uIiwiY29uZmlnIiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwiaXNJbml0aWFsaXplZCIsImNvbmZpZ1BhdGhQYXJhbXMiLCJxdWVyeVBhcmFtcyIsImNvbmZpZ1F1ZXJ5UGFyYW1zIiwiY2hhbmdlTW9kZWxTdGF0dXMiLCJpZCIsInBlcmlvZCIsInJlcGxhY2VWYWx1ZSIsImNvbmNhdCIsIkVycm9yIiwiTU9ERUxfU1RBVFVTIiwiTE9BRElORyIsImRpc3BhdGNoTW9kZWxGZXRjaFJlcXVlc3QiLCJtZXRob2QiLCJkaXNwYXRjaFBlcmlvZGljTW9kZWxGZXRjaFJlcXVlc3QiLCJsb2FkQ29sbGVjdGlvbkl0ZW0iLCJjcmVhdGVJdGVtSW5Db2xsZWN0aW9uIiwiYm9keSIsImNvbnRlbnRUeXBlIiwiQ1JFQVRJTkciLCJjcmVhdGVDb2xsZWN0aW9uSXRlbSIsInVwZGF0ZUl0ZW1JbkNvbGxlY3Rpb24iLCJVUERBVElORyIsInVwZGF0ZUNvbGxlY3Rpb25JdGVtIiwiZGVsZXRlSXRlbUZyb21Db2xsZWN0aW9uIiwiREVMRVRJTkciLCJkZWxldGVDb2xsZWN0aW9uSXRlbSIsImluaXRpYWxpemVDb2xsZWN0aW9uSXRlbSIsImxvYWQiLCJkaXNhYmxlQXV0b0xvYWQiLCJfbWV0YWRhdGEiLCJpc0ZldGNoaW5nIiwiUkVBRFkiLCJpbml0aWFsaXplQ29sbGVjdGlvbiIsImhhbmRsZUNvbGxlY3Rpb25JdGVtUGFyYW1zQ2hhbmdlIiwicHJldk1vZGVsTmFtZSIsInByZXZQYXRoUGFyYW1zIiwicHJldlF1ZXJ5UGFyYW1zIiwiaXNFcXVhbCIsImhhbmRsZUNvbGxlY3Rpb25QYXJhbXNDaGFuZ2UiLCJjbGVhbnVwQ29sbGVjdGlvbkd1aWRLZXkiLCJpbmNsdWRlcyIsIm1vZGVsTmFtZXMiLCJzcGxpdCIsInRlbXBQYXRoUGFyYW1zIiwic2xpY2UiLCJwdXNoIiwicGF0aCIsImZvckVhY2giLCJpIiwiZGlzcGF0Y2hNb2RlbFJlbW92ZUtleUFjdGlvbiIsIm1vZGVsUGF0aCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9jb2xsZWN0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbmNhdCwgRGljdGlvbmFyeSwgZmluZCwgZ2V0LCBpbmNsdWRlcywgaXNFcXVhbCwgdmFsdWVzIH0gZnJvbSAnbG9kYXNoJ1xuaW1wb3J0IG1lbW9pemVPbmUgZnJvbSAnbWVtb2l6ZS1vbmUnXG5pbXBvcnQgeyBNT0RFTF9TVEFUVVMgfSBmcm9tICcuLi9jb25zdGFudHMnXG5pbXBvcnQge1xuXHRkaXNwYXRjaE1vZGVsRmV0Y2hSZXF1ZXN0LFxuXHRkaXNwYXRjaE1vZGVsUmVtb3ZlS2V5QWN0aW9uLFxuXHRkaXNwYXRjaFBlcmlvZGljTW9kZWxGZXRjaFJlcXVlc3QsXG5cdGRpc3BhdGNoUGVyaW9kaWNNb2RlbEZldGNoVGVybWluYXRlQWN0aW9uXG59IGZyb20gJy4uL3JlZHV4L2FjdGlvbkNyZWF0b3InXG5pbXBvcnQge1xuXHRDb2xsZWN0aW9uQ3JlYXRlUGFyYW1zLFxuXHRDb2xsZWN0aW9uRGVsZXRlUGFyYW1zLFxuXHRDb2xsZWN0aW9uSXRlbURlbGV0ZVBhcmFtcyxcblx0Q29sbGVjdGlvbkl0ZW1Mb2FkUGFyYW1zLFxuXHRDb2xsZWN0aW9uSXRlbVVwZGF0ZVBhcmFtcyxcblx0Q29sbGVjdGlvbkxvYWRQYXJhbXMsXG5cdENvbGxlY3Rpb25NZXRob2RDb25maWd1cmF0aW9uLFxuXHRDb2xsZWN0aW9uU2VsZWN0b3JNZXRob2RQYXJhbXMsXG5cdENvbGxlY3Rpb25TZWxlY3Rvck1ldGhvZFJlc3BvbnNlLFxuXHRDb2xsZWN0aW9uVXBkYXRlUGFyYW1zLFxuXHRNb2RlbCxcblx0TW9kZWxDb2xsZWN0aW9uXG59IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHsgZ2V0TWluUmVxdWlyZWRQYXRoUGFyYW1zQ291bnQsIGdldFBhdGhQYXJhbXNGcm9tUm91dGVNYXRjaFBhcmFtcywgZ2V0UmVkdXhNb2RlbE5hbWUgfSBmcm9tICcuL3JvdXRlJ1xuXG4vLyNyZWdpb24gUmVkdXggTWV0aG9kc1xuXG5jb25zdCBnZXRQYXRoUGFyYW1zID0gbWVtb2l6ZU9uZShcblx0KHBhdGhQYXJhbXM6IEFycmF5PHN0cmluZyB8IG51bWJlcj4gfCB1bmRlZmluZWQsIHJvdXRlTWF0Y2hQYXJhbXM6IERpY3Rpb25hcnk8c3RyaW5nPiwgbW9kZWxOYW1lOiBzdHJpbmcpID0+XG5cdFx0cGF0aFBhcmFtcyB8fCBnZXRQYXRoUGFyYW1zRnJvbVJvdXRlTWF0Y2hQYXJhbXMocm91dGVNYXRjaFBhcmFtcywgbW9kZWxOYW1lKVxuKVxuXG4vLyBQcm92aWRlIGEgc3RhYmxlIG9iamVjdCByZWZlcmVuY2UgZm9yIGVtcHR5IGNvbGxlY3Rpb25zXG5jb25zdCBERUZBVUxUX01PREVMID0gT2JqZWN0LmZyZWV6ZSh7fSlcbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RDb2xsZWN0aW9uSXRlbUZyb21TdGF0ZTxUTW9kZWwgZXh0ZW5kcyBNb2RlbD4oXG5cdHBhcmFtczogQ29sbGVjdGlvblNlbGVjdG9yTWV0aG9kUGFyYW1zXG4pOiBDb2xsZWN0aW9uU2VsZWN0b3JNZXRob2RSZXNwb25zZTxUTW9kZWw+IHtcblx0Y29uc3QgeyBndWlkLCBtb2RlbE5hbWUsIHBhdGhQYXJhbXMsIHJvdXRlTWF0Y2hQYXJhbXMsIHN0YXRlIH0gPSBwYXJhbXNcblx0Y29uc3QgbW9kZWxOYW1lTGV2ZWxDb3VudCA9IGdldE1pblJlcXVpcmVkUGF0aFBhcmFtc0NvdW50KG1vZGVsTmFtZSlcblx0Y29uc3QgcCA9IGdldFBhdGhQYXJhbXMocGF0aFBhcmFtcywgcm91dGVNYXRjaFBhcmFtcywgbW9kZWxOYW1lKVxuXHRjb25zdCByZWR1eE1vZGVsTmFtZSA9IGdldFJlZHV4TW9kZWxOYW1lKHAsIG1vZGVsTmFtZSlcblxuXHRsZXQgbW9kZWwgPSBERUZBVUxUX01PREVMIGFzIFRNb2RlbFxuXHQvLyBmaW5kIGBtb2RlbGAgdXNpbmcgYGd1aWRgIGFzIGl0cyBrZXksIHRvIG1hdGNoIG5ldyBpdGVtIGNyZWF0ZWQgaW4gYGNyZWF0ZSgpYFxuXHRpZiAocC5sZW5ndGggPT09IG1vZGVsTmFtZUxldmVsQ291bnQpIHtcblx0XHRjb25zdCBjb2xsZWN0aW9uID0gKGdldChzdGF0ZS5tb2RlbHMsIHJlZHV4TW9kZWxOYW1lKSB8fCB7fSkgYXMgTW9kZWxDb2xsZWN0aW9uPFRNb2RlbD5cblx0XHRpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbGxlY3Rpb24sIGd1aWQpKSB7XG5cdFx0XHRtb2RlbCA9IGNvbGxlY3Rpb25bZ3VpZF0gYXMgVE1vZGVsXG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG1vZGVsQnlHdWlkID0gZmluZCh2YWx1ZXMoY29sbGVjdGlvbiksIChtKTogbSBpcyBUTW9kZWwgPT4gISFtICYmICdndWlkJyBpbiBtICYmIG0uZ3VpZCA9PT0gZ3VpZClcblx0XHRcdG1vZGVsID0gbW9kZWxCeUd1aWQgfHwgbW9kZWxcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gZmluZCBgbW9kZWxgIHVzaW5nIHBhdGhQYXJhbXNcblx0XHRjb25zdCByZWR1eE1vZGVsID0gKGdldChzdGF0ZS5tb2RlbHMsIHJlZHV4TW9kZWxOYW1lKSB8fCB7fSkgYXMgVE1vZGVsXG5cdFx0bW9kZWwgPSAoT2JqZWN0LmtleXMocmVkdXhNb2RlbCkubGVuZ3RoID4gMCA/IHJlZHV4TW9kZWwgOiBERUZBVUxUX01PREVMKSBhcyBUTW9kZWxcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0bW9kZWxOYW1lLFxuXHRcdHBhdGhQYXJhbXM6IHAsXG5cdFx0bW9kZWwsXG5cdFx0aXNDb2xsZWN0aW9uSXRlbTogdHJ1ZVxuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RDb2xsZWN0aW9uRnJvbVN0YXRlPFRNb2RlbCBleHRlbmRzIE1vZGVsPihcblx0cGFyYW1zOiBDb2xsZWN0aW9uU2VsZWN0b3JNZXRob2RQYXJhbXNcbik6IENvbGxlY3Rpb25TZWxlY3Rvck1ldGhvZFJlc3BvbnNlPFRNb2RlbD4ge1xuXHRjb25zdCB7IG1vZGVsTmFtZSwgcGF0aFBhcmFtcywgcm91dGVNYXRjaFBhcmFtcywgc3RhdGUgfSA9IHBhcmFtc1xuXHRjb25zdCBwID0gZ2V0UGF0aFBhcmFtcyhwYXRoUGFyYW1zLCByb3V0ZU1hdGNoUGFyYW1zLCBtb2RlbE5hbWUpXG5cdGNvbnN0IHJlZHV4TW9kZWxOYW1lID0gZ2V0UmVkdXhNb2RlbE5hbWUocCwgbW9kZWxOYW1lKVxuXG5cdGxldCBtb2RlbCA9IGdldChzdGF0ZS5tb2RlbHMsIHJlZHV4TW9kZWxOYW1lKSBhcyBNb2RlbENvbGxlY3Rpb248VE1vZGVsPiB8IHVuZGVmaW5lZFxuXHRtb2RlbCA9IG1vZGVsICYmIE9iamVjdC5rZXlzKG1vZGVsKS5sZW5ndGggPiAwID8gbW9kZWwgOiAoREVGQVVMVF9NT0RFTCBhcyBNb2RlbENvbGxlY3Rpb248VE1vZGVsPilcblxuXHRyZXR1cm4ge1xuXHRcdG1vZGVsTmFtZSxcblx0XHRwYXRoUGFyYW1zOiBwLFxuXHRcdG1vZGVsLFxuXHRcdGlzQ29sbGVjdGlvbkl0ZW06IGZhbHNlXG5cdH1cbn1cblxuLy8jZW5kcmVnaW9uIFJlZHV4IE1ldGhvZHNcblxuLy8jcmVnaW9uIENvbGxlY3Rpb24vSXRlbSBDUlVEIE1ldGhvZHNcblxuLy8jcmVnaW9uIExvYWRcblxuZXhwb3J0IGZ1bmN0aW9uIHN0b3BDb2xsZWN0aW9uUGVyaW9kaWNMb2FkKHRhc2tJZDogc3RyaW5nKSB7XG5cdGRpc3BhdGNoUGVyaW9kaWNNb2RlbEZldGNoVGVybWluYXRlQWN0aW9uKHtcblx0XHR0YXNrSWRcblx0fSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRDb2xsZWN0aW9uKGNvbmZpZzogQ29sbGVjdGlvbk1ldGhvZENvbmZpZ3VyYXRpb24sIHBhcmFtczogQ29sbGVjdGlvbkxvYWRQYXJhbXMgPSB7fSkge1xuXHRjb25zdCB7XG5cdFx0bW9kZWxOYW1lLFxuXHRcdGlzSW5pdGlhbGl6ZWQsXG5cdFx0cGF0aFBhcmFtczogY29uZmlnUGF0aFBhcmFtcyxcblx0XHRxdWVyeVBhcmFtczogY29uZmlnUXVlcnlQYXJhbXMsXG5cdFx0Y2hhbmdlTW9kZWxTdGF0dXNcblx0fSA9IGNvbmZpZ1xuXHRjb25zdCB7IGlkLCBwYXRoUGFyYW1zLCBxdWVyeVBhcmFtcywgcGVyaW9kLCB0YXNrSWQsIHJlcGxhY2VWYWx1ZSB9ID0gcGFyYW1zXG5cdGNvbnN0IHAgPSBjb25jYXQoW10sIHBhdGhQYXJhbXMgfHwgY29uZmlnUGF0aFBhcmFtcywgaWQgPyBbaWRdIDogW10pXG5cdGlmIChwLmxlbmd0aCAhPT0gZ2V0TWluUmVxdWlyZWRQYXRoUGFyYW1zQ291bnQobW9kZWxOYW1lKSArIChpZCA/IDEgOiAwKSkge1xuXHRcdHRocm93IG5ldyBFcnJvcigncGF0aFBhcmFtcyBsZW5ndGggZG9lcyBub3QgbWF0Y2ggbGVuZ3RoIG9mIHBhdGggY29tcG9uZW50cycpXG5cdH1cblx0aWYgKGlzSW5pdGlhbGl6ZWQpIHtcblx0XHRjaGFuZ2VNb2RlbFN0YXR1cyhNT0RFTF9TVEFUVVMuTE9BRElORywgaWQpXG5cdH1cblx0aWYgKCFwZXJpb2QpIHtcblx0XHRkaXNwYXRjaE1vZGVsRmV0Y2hSZXF1ZXN0KHtcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdG1ldGhvZDogJ0dFVCcsXG5cdFx0XHRwYXRoUGFyYW1zOiBwLFxuXHRcdFx0cXVlcnlQYXJhbXM6IHF1ZXJ5UGFyYW1zIHx8IGNvbmZpZ1F1ZXJ5UGFyYW1zLFxuXHRcdFx0cmVwbGFjZVZhbHVlXG5cdFx0fSlcblx0fSBlbHNlIHtcblx0XHRpZiAoIXRhc2tJZCkgdGhyb3cgbmV3IEVycm9yKCd0YXNrSWQgaXMgcmVxdWlyZWQgZm9yIHBlcmlvZGljIGRhdGEgcmVxdWVzdHMnKVxuXHRcdGRpc3BhdGNoUGVyaW9kaWNNb2RlbEZldGNoUmVxdWVzdCh7XG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRtZXRob2Q6ICdHRVQnLFxuXHRcdFx0cGF0aFBhcmFtczogcCxcblx0XHRcdHF1ZXJ5UGFyYW1zOiBxdWVyeVBhcmFtcyB8fCBjb25maWdRdWVyeVBhcmFtcyxcblx0XHRcdHBlcmlvZCxcblx0XHRcdHRhc2tJZCxcblx0XHRcdHJlcGxhY2VWYWx1ZVxuXHRcdH0pXG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRDb2xsZWN0aW9uSXRlbShjb25maWc6IENvbGxlY3Rpb25NZXRob2RDb25maWd1cmF0aW9uLCBwYXJhbXM6IENvbGxlY3Rpb25JdGVtTG9hZFBhcmFtcyA9IHt9KSB7XG5cdGNvbnN0IHtcblx0XHRtb2RlbE5hbWUsXG5cdFx0aXNJbml0aWFsaXplZCxcblx0XHRwYXRoUGFyYW1zOiBjb25maWdQYXRoUGFyYW1zLFxuXHRcdHF1ZXJ5UGFyYW1zOiBjb25maWdRdWVyeVBhcmFtcyxcblx0XHRjaGFuZ2VNb2RlbFN0YXR1c1xuXHR9ID0gY29uZmlnXG5cdGNvbnN0IHsgcGF0aFBhcmFtcywgcXVlcnlQYXJhbXMsIHBlcmlvZCwgdGFza0lkLCByZXBsYWNlVmFsdWUgfSA9IHBhcmFtc1xuXHRjb25zdCBwID0gcGF0aFBhcmFtcyB8fCBjb25maWdQYXRoUGFyYW1zXG5cdGlmIChwLmxlbmd0aCA8IGdldE1pblJlcXVpcmVkUGF0aFBhcmFtc0NvdW50KG1vZGVsTmFtZSkgKyAxKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdwYXRoUGFyYW1zIGxlbmd0aCBkb2VzIG5vdCBtYXRjaCBsZW5ndGggb2YgcGF0aCBjb21wb25lbnRzJylcblx0fVxuXHRpZiAoaXNJbml0aWFsaXplZCkge1xuXHRcdGNoYW5nZU1vZGVsU3RhdHVzKE1PREVMX1NUQVRVUy5MT0FESU5HKVxuXHR9XG5cdGlmICghcGVyaW9kKSB7XG5cdFx0ZGlzcGF0Y2hNb2RlbEZldGNoUmVxdWVzdCh7XG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRtZXRob2Q6ICdHRVQnLFxuXHRcdFx0cGF0aFBhcmFtczogcCxcblx0XHRcdHF1ZXJ5UGFyYW1zOiBxdWVyeVBhcmFtcyB8fCBjb25maWdRdWVyeVBhcmFtcyxcblx0XHRcdHJlcGxhY2VWYWx1ZVxuXHRcdH0pXG5cdH0gZWxzZSB7XG5cdFx0aWYgKCF0YXNrSWQpIHRocm93IG5ldyBFcnJvcigndGFza0lkIGlzIHJlcXVpcmVkIGZvciBwZXJpb2RpYyBkYXRhIHJlcXVlc3RzJylcblx0XHRkaXNwYXRjaFBlcmlvZGljTW9kZWxGZXRjaFJlcXVlc3Qoe1xuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0bWV0aG9kOiAnR0VUJyxcblx0XHRcdHBhdGhQYXJhbXM6IHAsXG5cdFx0XHRxdWVyeVBhcmFtczogcXVlcnlQYXJhbXMgfHwgY29uZmlnUXVlcnlQYXJhbXMsXG5cdFx0XHRwZXJpb2QsXG5cdFx0XHR0YXNrSWQsXG5cdFx0XHRyZXBsYWNlVmFsdWVcblx0XHR9KVxuXHR9XG59XG5cbi8vI2VuZHJlZ2lvbiBMb2FkXG5cbi8vI3JlZ2lvbiBDcmVhdGVcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUl0ZW1JbkNvbGxlY3Rpb24oY29uZmlnOiBDb2xsZWN0aW9uTWV0aG9kQ29uZmlndXJhdGlvbiwgcGFyYW1zOiBDb2xsZWN0aW9uQ3JlYXRlUGFyYW1zKSB7XG5cdGNvbnN0IHsgZ3VpZCwgbW9kZWxOYW1lLCBwYXRoUGFyYW1zLCBxdWVyeVBhcmFtczogY29uZmlnUXVlcnlQYXJhbXMsIGNoYW5nZU1vZGVsU3RhdHVzIH0gPSBjb25maWdcblx0Y29uc3QgeyBib2R5LCBjb250ZW50VHlwZSwgcXVlcnlQYXJhbXMgfSA9IHBhcmFtc1xuXHRpZiAocGF0aFBhcmFtcy5sZW5ndGggPCBnZXRNaW5SZXF1aXJlZFBhdGhQYXJhbXNDb3VudChtb2RlbE5hbWUpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdwYXRoUGFyYW1zIGxlbmd0aCBkb2VzIG5vdCBtYXRjaCBsZW5ndGggb2YgcGF0aCBjb21wb25lbnRzJylcblx0fVxuXHRjaGFuZ2VNb2RlbFN0YXR1cyhNT0RFTF9TVEFUVVMuQ1JFQVRJTkcsIGd1aWQpXG5cdGRpc3BhdGNoTW9kZWxGZXRjaFJlcXVlc3Qoe1xuXHRcdG1vZGVsTmFtZSxcblx0XHRndWlkLFxuXHRcdG1ldGhvZDogJ1BPU1QnLFxuXHRcdGJvZHksXG5cdFx0cGF0aFBhcmFtcyxcblx0XHRjb250ZW50VHlwZSxcblx0XHRxdWVyeVBhcmFtczogcXVlcnlQYXJhbXMgfHwgY29uZmlnUXVlcnlQYXJhbXNcblx0fSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbGxlY3Rpb25JdGVtKFxuXHRtb2RlbDogTW9kZWwsXG5cdGNvbmZpZzogQ29sbGVjdGlvbk1ldGhvZENvbmZpZ3VyYXRpb24sXG5cdHBhcmFtczogQ29sbGVjdGlvbkNyZWF0ZVBhcmFtc1xuKSB7XG5cdGlmIChtb2RlbC5pZCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignbW9kZWwgYWxyZWFkeSBleGlzdHMnKVxuXHR9XG5cdGNvbnN0IHsgZ3VpZCwgbW9kZWxOYW1lLCBwYXRoUGFyYW1zLCBxdWVyeVBhcmFtczogY29uZmlnUXVlcnlQYXJhbXMsIGNoYW5nZU1vZGVsU3RhdHVzIH0gPSBjb25maWdcblx0Y29uc3QgeyBib2R5LCBjb250ZW50VHlwZSwgcXVlcnlQYXJhbXMgfSA9IHBhcmFtc1xuXHRpZiAocGF0aFBhcmFtcy5sZW5ndGggPCBnZXRNaW5SZXF1aXJlZFBhdGhQYXJhbXNDb3VudChtb2RlbE5hbWUpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdwYXRoUGFyYW1zIGxlbmd0aCBkb2VzIG5vdCBtYXRjaCBsZW5ndGggb2YgcGF0aCBjb21wb25lbnRzJylcblx0fVxuXHRjaGFuZ2VNb2RlbFN0YXR1cyhNT0RFTF9TVEFUVVMuQ1JFQVRJTkcpXG5cdGRpc3BhdGNoTW9kZWxGZXRjaFJlcXVlc3Qoe1xuXHRcdG1vZGVsTmFtZSxcblx0XHRndWlkLFxuXHRcdG1ldGhvZDogJ1BPU1QnLFxuXHRcdGJvZHksXG5cdFx0cGF0aFBhcmFtcyxcblx0XHRjb250ZW50VHlwZSxcblx0XHRxdWVyeVBhcmFtczogcXVlcnlQYXJhbXMgfHwgY29uZmlnUXVlcnlQYXJhbXNcblx0fSlcbn1cblxuLy8jZW5kcmVnaW9uIENyZWF0ZVxuXG4vLyNyZWdpb24gVXBkYXRlXG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVJdGVtSW5Db2xsZWN0aW9uKGNvbmZpZzogQ29sbGVjdGlvbk1ldGhvZENvbmZpZ3VyYXRpb24sIHBhcmFtczogQ29sbGVjdGlvblVwZGF0ZVBhcmFtcykge1xuXHRjb25zdCB7IGlkLCBib2R5LCBjb250ZW50VHlwZSwgbWV0aG9kLCBxdWVyeVBhcmFtcyB9ID0gcGFyYW1zXG5cdGlmICghaWQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYCdpZCcgaXMgcmVxdWlyZWRgKVxuXHR9XG5cdGlmICghYm9keSkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgJ2JvZHknIGlzIHJlcXVpcmVkYClcblx0fVxuXHRjb25zdCB7IG1vZGVsTmFtZSwgcGF0aFBhcmFtczogY29uZmlnUGF0aFBhcmFtcywgcXVlcnlQYXJhbXM6IGNvbmZpZ1F1ZXJ5UGFyYW1zLCBjaGFuZ2VNb2RlbFN0YXR1cyB9ID0gY29uZmlnXG5cdGNvbnN0IHBhdGhQYXJhbXMgPSBjb25jYXQoW10sIGNvbmZpZ1BhdGhQYXJhbXMsIFtpZF0pXG5cdGlmIChwYXRoUGFyYW1zLmxlbmd0aCAhPT0gZ2V0TWluUmVxdWlyZWRQYXRoUGFyYW1zQ291bnQobW9kZWxOYW1lKSArIDEpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ3BhdGhQYXJhbXMraWQgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGxlbmd0aCBvZiBwYXRoIGNvbXBvbmVudHMnKVxuXHR9XG5cdGNvbnN0IG0gPSBtZXRob2QgfHwgJ1BVVCdcblx0Y2hhbmdlTW9kZWxTdGF0dXMoTU9ERUxfU1RBVFVTLlVQREFUSU5HLCBpZClcblx0ZGlzcGF0Y2hNb2RlbEZldGNoUmVxdWVzdCh7XG5cdFx0bW9kZWxOYW1lLFxuXHRcdG1ldGhvZDogbSxcblx0XHRwYXRoUGFyYW1zLFxuXHRcdHF1ZXJ5UGFyYW1zOiBxdWVyeVBhcmFtcyB8fCBjb25maWdRdWVyeVBhcmFtcyxcblx0XHRib2R5LFxuXHRcdGNvbnRlbnRUeXBlXG5cdH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVDb2xsZWN0aW9uSXRlbShcblx0bW9kZWw6IE1vZGVsLFxuXHRjb25maWc6IENvbGxlY3Rpb25NZXRob2RDb25maWd1cmF0aW9uLFxuXHRwYXJhbXM6IENvbGxlY3Rpb25JdGVtVXBkYXRlUGFyYW1zXG4pIHtcblx0aWYgKCFtb2RlbC5pZCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignbW9kZWwgZG9lcyBub3QgZXhpc3QnKVxuXHR9XG5cdGNvbnN0IHsgYm9keSwgY29udGVudFR5cGUsIG1ldGhvZCwgcXVlcnlQYXJhbXMgfSA9IHBhcmFtc1xuXHRpZiAoIWJvZHkpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYCdib2R5JyBpcyByZXF1aXJlZGApXG5cdH1cblx0Y29uc3QgeyBtb2RlbE5hbWUsIHBhdGhQYXJhbXMsIHF1ZXJ5UGFyYW1zOiBjb25maWdRdWVyeVBhcmFtcywgY2hhbmdlTW9kZWxTdGF0dXMgfSA9IGNvbmZpZ1xuXHRpZiAocGF0aFBhcmFtcy5sZW5ndGggPCBnZXRNaW5SZXF1aXJlZFBhdGhQYXJhbXNDb3VudChtb2RlbE5hbWUpICsgMSkge1xuXHRcdHRocm93IG5ldyBFcnJvcigncGF0aFBhcmFtcyBsZW5ndGggZG9lcyBub3QgbWF0Y2ggbGVuZ3RoIG9mIHBhdGggY29tcG9uZW50cycpXG5cdH1cblx0Y29uc3QgbSA9IG1ldGhvZCB8fCAnUFVUJ1xuXHRjaGFuZ2VNb2RlbFN0YXR1cyhNT0RFTF9TVEFUVVMuVVBEQVRJTkcpXG5cdGRpc3BhdGNoTW9kZWxGZXRjaFJlcXVlc3Qoe1xuXHRcdG1vZGVsTmFtZSxcblx0XHRtZXRob2Q6IG0sXG5cdFx0cGF0aFBhcmFtcyxcblx0XHRib2R5LFxuXHRcdGNvbnRlbnRUeXBlLFxuXHRcdHF1ZXJ5UGFyYW1zOiBxdWVyeVBhcmFtcyB8fCBjb25maWdRdWVyeVBhcmFtc1xuXHR9KVxufVxuXG4vLyNlbmRyZWdpb24gVXBkYXRlXG5cbi8vI3JlZ2lvbiBEZWxldGVcblxuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZUl0ZW1Gcm9tQ29sbGVjdGlvbihjb25maWc6IENvbGxlY3Rpb25NZXRob2RDb25maWd1cmF0aW9uLCBwYXJhbXM6IENvbGxlY3Rpb25EZWxldGVQYXJhbXMpIHtcblx0Y29uc3QgeyBpZCwgYm9keSwgcXVlcnlQYXJhbXMgfSA9IHBhcmFtc1xuXHRpZiAoIWlkKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGAnaWQnIGlzIHJlcXVpcmVkYClcblx0fVxuXHRjb25zdCB7IG1vZGVsTmFtZSwgcGF0aFBhcmFtcywgcXVlcnlQYXJhbXM6IGNvbmZpZ1F1ZXJ5UGFyYW1zLCBjaGFuZ2VNb2RlbFN0YXR1cyB9ID0gY29uZmlnXG5cdGNvbnN0IHAgPSBjb25jYXQoW10sIHBhdGhQYXJhbXMsIFtpZF0pXG5cdGlmIChwLmxlbmd0aCAhPT0gZ2V0TWluUmVxdWlyZWRQYXRoUGFyYW1zQ291bnQobW9kZWxOYW1lKSArIDEpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ3BhdGhQYXJhbXMraWQgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGxlbmd0aCBvZiBwYXRoIGNvbXBvbmVudHMnKVxuXHR9XG5cdGNoYW5nZU1vZGVsU3RhdHVzKE1PREVMX1NUQVRVUy5ERUxFVElORywgaWQpXG5cdGRpc3BhdGNoTW9kZWxGZXRjaFJlcXVlc3Qoe1xuXHRcdG1vZGVsTmFtZSxcblx0XHRtZXRob2Q6ICdERUxFVEUnLFxuXHRcdHBhdGhQYXJhbXM6IHAsXG5cdFx0cXVlcnlQYXJhbXM6IHF1ZXJ5UGFyYW1zIHx8IGNvbmZpZ1F1ZXJ5UGFyYW1zLFxuXHRcdGJvZHlcblx0fSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZUNvbGxlY3Rpb25JdGVtKFxuXHRtb2RlbDogTW9kZWwsXG5cdGNvbmZpZzogQ29sbGVjdGlvbk1ldGhvZENvbmZpZ3VyYXRpb24sXG5cdHBhcmFtczogQ29sbGVjdGlvbkl0ZW1EZWxldGVQYXJhbXMgPSB7fVxuKSB7XG5cdGlmICghbW9kZWwuaWQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ21vZGVsIGRvZXMgbm90IGV4aXN0Jylcblx0fVxuXHRjb25zdCB7IGJvZHksIHF1ZXJ5UGFyYW1zIH0gPSBwYXJhbXNcblx0Y29uc3QgeyBtb2RlbE5hbWUsIHBhdGhQYXJhbXMsIHF1ZXJ5UGFyYW1zOiBjb25maWdRdWVyeVBhcmFtcywgY2hhbmdlTW9kZWxTdGF0dXMgfSA9IGNvbmZpZ1xuXHRpZiAocGF0aFBhcmFtcy5sZW5ndGggPCBnZXRNaW5SZXF1aXJlZFBhdGhQYXJhbXNDb3VudChtb2RlbE5hbWUpICsgMSkge1xuXHRcdHRocm93IG5ldyBFcnJvcigncGF0aFBhcmFtcyBsZW5ndGggZG9lcyBub3QgbWF0Y2ggbGVuZ3RoIG9mIHBhdGggY29tcG9uZW50cycpXG5cdH1cblx0Y2hhbmdlTW9kZWxTdGF0dXMoTU9ERUxfU1RBVFVTLkRFTEVUSU5HKVxuXHRkaXNwYXRjaE1vZGVsRmV0Y2hSZXF1ZXN0KHtcblx0XHRtb2RlbE5hbWUsXG5cdFx0bWV0aG9kOiAnREVMRVRFJyxcblx0XHRwYXRoUGFyYW1zLFxuXHRcdGJvZHksXG5cdFx0cXVlcnlQYXJhbXM6IHF1ZXJ5UGFyYW1zIHx8IGNvbmZpZ1F1ZXJ5UGFyYW1zXG5cdH0pXG59XG5cbi8vI2VuZHJlZ2lvbiBEZWxldGVcblxuLy8jZW5kcmVnaW9uIENvbGxlY3Rpb24vSXRlbSBDUlVEIE1ldGhvZHNcblxuLy8jcmVnaW9uIEhlbHBlciBNZXRob2RzXG5cbi8qKlxuICogQXV0b21hdGljYWxseSBjYWxsIGBsb2FkYCwgb3IgYGNoYW5nZU1vZGVsU3RhdHVzYCB0byBgUkVBRFlgLlxuICpcbiAqIERvZXMgTk9UIGF1dG9tYXRpY2FsbHkgbG9hZCBpZjpcbiAqICogcGF0aFBhcmFtcyBkb2VzIG5vdCBjb250YWluIGVub3VnaCBpdGVtcy5cbiAqICogbW9kZWwgaXMgYWxyZWFkeSBmZXRjaGluZy5cbiAqICogYXV0byBsb2FkIGlzIGRpc2FibGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZUNvbGxlY3Rpb25JdGVtKFxuXHRtb2RlbDogTW9kZWwsXG5cdGxvYWQ6IChwYXJhbXM/OiBDb2xsZWN0aW9uSXRlbUxvYWRQYXJhbXMpID0+IHZvaWQsXG5cdGNvbmZpZzogQ29sbGVjdGlvbk1ldGhvZENvbmZpZ3VyYXRpb25cbikge1xuXHRjb25zdCB7IG1vZGVsTmFtZSwgcGF0aFBhcmFtcywgZGlzYWJsZUF1dG9Mb2FkLCBjaGFuZ2VNb2RlbFN0YXR1cyB9ID0gY29uZmlnXG5cdGlmIChcblx0XHRwYXRoUGFyYW1zLmxlbmd0aCA9PT0gZ2V0TWluUmVxdWlyZWRQYXRoUGFyYW1zQ291bnQobW9kZWxOYW1lKSArIDEgJiZcblx0XHQhZGlzYWJsZUF1dG9Mb2FkICYmXG5cdFx0KCFtb2RlbC5fbWV0YWRhdGEgfHwgIW1vZGVsLl9tZXRhZGF0YS5pc0ZldGNoaW5nKVxuXHQpIHtcblx0XHRsb2FkKClcblx0fSBlbHNlIHtcblx0XHRjaGFuZ2VNb2RlbFN0YXR1cyhNT0RFTF9TVEFUVVMuUkVBRFkpXG5cdH1cbn1cblxuLyoqXG4gKiBBdXRvbWF0aWNhbGx5IGNhbGwgYGxvYWRgLCBvciBgY2hhbmdlTW9kZWxTdGF0dXNgIHRvIGBSRUFEWWAuXG4gKlxuICogRG9lcyBOT1QgYXV0b21hdGljYWxseSBsb2FkIGlmOlxuICogKiBtb2RlbCBpcyBhbHJlYWR5IGZldGNoaW5nLlxuICogKiBhdXRvIGxvYWQgaXMgZGlzYWJsZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplQ29sbGVjdGlvbihcblx0bW9kZWw6IE1vZGVsLFxuXHRsb2FkOiAocGFyYW1zPzogQ29sbGVjdGlvbkl0ZW1Mb2FkUGFyYW1zKSA9PiB2b2lkLFxuXHRjb25maWc6IENvbGxlY3Rpb25NZXRob2RDb25maWd1cmF0aW9uXG4pIHtcblx0Y29uc3QgeyBkaXNhYmxlQXV0b0xvYWQsIGNoYW5nZU1vZGVsU3RhdHVzIH0gPSBjb25maWdcblx0aWYgKCFkaXNhYmxlQXV0b0xvYWQgJiYgKCFtb2RlbC5fbWV0YWRhdGEgfHwgIW1vZGVsLl9tZXRhZGF0YS5pc0ZldGNoaW5nKSkge1xuXHRcdGxvYWQoKVxuXHR9IGVsc2UgaWYgKGRpc2FibGVBdXRvTG9hZCkge1xuXHRcdGNoYW5nZU1vZGVsU3RhdHVzKE1PREVMX1NUQVRVUy5SRUFEWSlcblx0fVxufVxuXG4vKipcbiAqIFdoZW4gYHBhdGhQYXJhbXNgIG9yIGBxdWVyeVBhcmFtc2AgY2hhbmdlLCBjYWxsIGBsb2FkYFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlQ29sbGVjdGlvbkl0ZW1QYXJhbXNDaGFuZ2UoXG5cdG1vZGVsTmFtZTogc3RyaW5nLFxuXHRwcmV2TW9kZWxOYW1lOiBzdHJpbmcsXG5cdHBhdGhQYXJhbXM6IEFycmF5PHN0cmluZyB8IG51bWJlcj4sXG5cdHByZXZQYXRoUGFyYW1zOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+IHwgdW5kZWZpbmVkLFxuXHRxdWVyeVBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj4gfCB1bmRlZmluZWQsXG5cdHByZXZRdWVyeVBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj4gfCB1bmRlZmluZWQsXG5cdGxvYWQ6IChwYXJhbXM/OiBDb2xsZWN0aW9uSXRlbUxvYWRQYXJhbXMpID0+IHZvaWRcbikge1xuXHRpZiAoXG5cdFx0bW9kZWxOYW1lICE9PSBwcmV2TW9kZWxOYW1lIHx8XG5cdFx0KHBhdGhQYXJhbXMubGVuZ3RoID09PSBnZXRNaW5SZXF1aXJlZFBhdGhQYXJhbXNDb3VudChtb2RlbE5hbWUpICsgMSAmJiAhaXNFcXVhbChwcmV2UGF0aFBhcmFtcywgcGF0aFBhcmFtcykpIHx8XG5cdFx0IWlzRXF1YWwocHJldlF1ZXJ5UGFyYW1zLCBxdWVyeVBhcmFtcylcblx0KSB7XG5cdFx0bG9hZCh7IHBhdGhQYXJhbXMsIHF1ZXJ5UGFyYW1zIH0pXG5cdH1cbn1cblxuLyoqXG4gKiBXaGVuIGBwYXRoUGFyYW1zYCBvciBgcXVlcnlQYXJhbXNgIGNoYW5nZSwgY2FsbCBgbG9hZGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZUNvbGxlY3Rpb25QYXJhbXNDaGFuZ2UoXG5cdG1vZGVsTmFtZTogc3RyaW5nLFxuXHRwcmV2TW9kZWxOYW1lOiBzdHJpbmcsXG5cdHBhdGhQYXJhbXM6IEFycmF5PHN0cmluZyB8IG51bWJlcj4sXG5cdHByZXZQYXRoUGFyYW1zOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+IHwgdW5kZWZpbmVkLFxuXHRxdWVyeVBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj4gfCB1bmRlZmluZWQsXG5cdHByZXZRdWVyeVBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj4gfCB1bmRlZmluZWQsXG5cdGxvYWQ6IChwYXJhbXM/OiBDb2xsZWN0aW9uTG9hZFBhcmFtcykgPT4gdm9pZFxuKSB7XG5cdGlmIChcblx0XHRtb2RlbE5hbWUgIT09IHByZXZNb2RlbE5hbWUgfHxcblx0XHQocGF0aFBhcmFtcy5sZW5ndGggPiAwICYmICFpc0VxdWFsKHByZXZQYXRoUGFyYW1zLCBwYXRoUGFyYW1zKSkgfHxcblx0XHQhaXNFcXVhbChwcmV2UXVlcnlQYXJhbXMsIHF1ZXJ5UGFyYW1zKVxuXHQpIHtcblx0XHRsb2FkKHsgcGF0aFBhcmFtcywgcXVlcnlQYXJhbXMgfSlcblx0fVxufVxuXG4vKipcbiAqIERlbGV0ZSB0aGUgZ3VpZCBpbiB0aGUgbW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFudXBDb2xsZWN0aW9uR3VpZEtleTxUTW9kZWwgZXh0ZW5kcyBNb2RlbD4oXG5cdG1vZGVsOiBNb2RlbENvbGxlY3Rpb248VE1vZGVsPixcblx0Y29uZmlnOiBDb2xsZWN0aW9uTWV0aG9kQ29uZmlndXJhdGlvblxuKSB7XG5cdGNvbnN0IHsgZ3VpZCwgbW9kZWxOYW1lLCBwYXRoUGFyYW1zIH0gPSBjb25maWdcblx0aWYgKGluY2x1ZGVzKE9iamVjdC5rZXlzKG1vZGVsKSwgZ3VpZCkpIHtcblx0XHRjb25zdCBtb2RlbE5hbWVzID0gbW9kZWxOYW1lLnNwbGl0KCcuJylcblx0XHRjb25zdCB0ZW1wUGF0aFBhcmFtcyA9IHBhdGhQYXJhbXMuc2xpY2UoKVxuXHRcdC8vIHNob3VsZCBpbmNsdWRlIHRoZSBndWlkIGF0IHRoZSBlbmRcblx0XHR0ZW1wUGF0aFBhcmFtcy5wdXNoKGd1aWQpXG5cdFx0aWYgKG1vZGVsTmFtZXMubGVuZ3RoID09PSB0ZW1wUGF0aFBhcmFtcy5sZW5ndGgpIHtcblx0XHRcdGxldCBwYXRoID0gJydcblx0XHRcdG1vZGVsTmFtZXMuZm9yRWFjaCgobSwgaSkgPT4ge1xuXHRcdFx0XHRpZiAoaSA9PT0gMCkge1xuXHRcdFx0XHRcdHBhdGggKz0gYCR7bX0uJHt0ZW1wUGF0aFBhcmFtc1tpXX1gXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cGF0aCArPSBgLiR7bX0uJHt0ZW1wUGF0aFBhcmFtc1tpXX1gXG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHRkaXNwYXRjaE1vZGVsUmVtb3ZlS2V5QWN0aW9uKHtcblx0XHRcdFx0bW9kZWxQYXRoOiBwYXRoXG5cdFx0XHR9KVxuXHRcdH1cblx0fVxufVxuXG4vLyNlbmRyZWdpb24gSGVscGVyIE1ldGhvZHNcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLFdBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLFVBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLGNBQUEsR0FBQUosT0FBQTtBQW9CQSxJQUFBSyxNQUFBLEdBQUFMLE9BQUE7QUFFQTs7QUFFQSxNQUFNTSxhQUFhLEdBQUcsSUFBQUMsbUJBQVUsRUFDL0IsQ0FBQ0MsVUFBOEMsRUFBRUMsZ0JBQW9DLEVBQUVDLFNBQWlCLEtBQ3ZHRixVQUFVLElBQUksSUFBQUcsd0NBQWlDLEVBQUNGLGdCQUFnQixFQUFFQyxTQUFTLENBQzdFLENBQUM7O0FBRUQ7QUFDQSxNQUFNRSxhQUFhLEdBQUdDLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLFNBQVNDLDZCQUE2QkEsQ0FDNUNDLE1BQXNDLEVBQ0s7RUFDM0MsTUFBTTtJQUFFQyxJQUFJO0lBQUVQLFNBQVM7SUFBRUYsVUFBVTtJQUFFQyxnQkFBZ0I7SUFBRVM7RUFBTSxDQUFDLEdBQUdGLE1BQU07RUFDdkUsTUFBTUcsbUJBQW1CLEdBQUcsSUFBQUMsb0NBQTZCLEVBQUNWLFNBQVMsQ0FBQztFQUNw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RUFDbERsQyxXQUFrRSxFQUNsRW1DLGVBQXNFLEVBQ3RFVCxJQUE2QyxFQUM1QztFQUNELElBQ0NqRSxTQUFTLEtBQUt3RSxhQUFhLElBQzFCMUUsVUFBVSxDQUFDaUIsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUE0RCxlQUFPLEVBQUNGLGNBQWMsRUFBRTNFLFVBQVUsQ0FBRSxJQUMvRCxDQUFDLElBQUE2RSxlQUFPLEVBQUNELGVBQWUsRUFBRW5DLFdBQVcsQ0FBQyxFQUNyQztJQUNEMEIsSUFBSSxDQUFDO01BQUVuRSxVQUFVO01BQUV5QztJQUFZLENBQUMsQ0FBQztFQUNsQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNPLFNBQVNzQyx3QkFBd0JBLENBQ3ZDL0QsS0FBOEIsRUFDOUJvQixNQUFxQyxFQUNwQztFQUNELE1BQU07SUFBRTNCLElBQUk7SUFBRVAsU0FBUztJQUFFRjtFQUFXLENBQUMsR0FBR29DLE1BQU07RUFDOUMsSUFBSSxJQUFBNEMsZ0JBQVEsRUFBQzNFLE1BQU0sQ0FBQ3dCLElBQUksQ0FBQ2IsS0FBSyxDQUFDLEVBQUVQLElBQUksQ0FBQyxFQUFFO0lBQ3ZDLE1BQU13RSxVQUFVLEdBQUcvRSxTQUFTLENBQUNnRixLQUFLLENBQUMsR0FBRyxDQUFDO0lBQ3ZDLE1BQU1DLGNBQWMsR0FBR25GLFVBQVUsQ0FBQ29GLEtBQUssQ0FBQyxDQUFDO0lBQ3pDO0lBQ0FELGNBQWMsQ0FBQ0UsSUFBSSxDQUFDNUUsSUFBSSxDQUFDO0lBQ3pCLElBQUl3RSxVQUFVLENBQUNoRSxNQUFNLEtBQUtrRSxjQUFjLENBQUNsRSxNQUFNLEVBQUU7TUFDaEQsSUFBSXFFLElBQUksR0FBRyxFQUFFO01BQ2JMLFVBQVUsQ0FBQ00sT0FBTyxDQUFDLENBQUM1RCxDQUFDLEVBQUU2RCxDQUFDLEtBQUs7UUFDNUIsSUFBSUEsQ0FBQyxLQUFLLENBQUMsRUFBRTtVQUNaRixJQUFJLElBQUksR0FBRzNELENBQUMsSUFBSXdELGNBQWMsQ0FBQ0ssQ0FBQyxDQUFDLEVBQUU7UUFDcEMsQ0FBQyxNQUFNO1VBQ05GLElBQUksSUFBSSxJQUFJM0QsQ0FBQyxJQUFJd0QsY0FBYyxDQUFDSyxDQUFDLENBQUMsRUFBRTtRQUNyQztNQUNELENBQUMsQ0FBQztNQUNGLElBQUFDLDJDQUE0QixFQUFDO1FBQzVCQyxTQUFTLEVBQUVKO01BQ1osQ0FBQyxDQUFDO0lBQ0g7RUFDRDtBQUNEOztBQUVBIiwiaWdub3JlTGlzdCI6W119