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
package/lib/utils/date.js CHANGED
@@ -1,107 +1,114 @@
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.isDateTimeValid = exports.isTimeInputSupported = exports.isDateInputSupported = exports.getFormattedTimeZone = exports.getFullFormattedTimeZone = exports.getFormattedNumberedTimeWithoutZoneOrMeridian = exports.getFormattedNumberedTimeWithoutZone = exports.getFormattedNumberedTimeWithFullZone = exports.getFormattedNumberedTime = exports.getFormattedNumberedDateWithoutYear = exports.getFormattedNumberedDateForInput = exports.getFormattedNumberedDateWithFullYear = exports.getFormattedNumberedDate = exports.getFormattedSimplifiedDateWithYearIfNotCurrent = exports.getFormattedSimplifiedDateWithoutYear = exports.getFormattedSimplifiedDate = exports.getFormattedNumberedDateAndTimeWithoutYear = exports.getFormattedNumberedDateAndTime = exports.getFormattedFullDateWithWeek = exports.getFormattedFullDateAndTime = exports.isNowBeforeDate = exports.isNowAfterDate = exports.isNowEqualOrBeforeDate = exports.isNowEqualOrAfterDate = exports.getEndOfMinute = exports.getEndOfDay = exports.getDateMinusTime = exports.getLocalDateTimeFromUtc = exports.getLocalMomentFromUtc = exports.getZonedMomentFromLocalDateTime = exports.getZonedMomentFromUtcInDefaultZone = exports.getZonedMomentFromUtc = exports.getOffsetDate = exports.getServerNowUtc = exports.setClockOffset = void 0;
7
- var moment_timezone_1 = __importDefault(require("moment-timezone"));
8
- var moment_timezone_utils_1 = __importDefault(require("moment-timezone/moment-timezone-utils"));
9
- var timezone_1 = require("./timezone");
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.getDateMinusTime = void 0;
8
+ exports.getEndOfDay = getEndOfDay;
9
+ exports.getEndOfMinute = getEndOfMinute;
10
+ exports.getFormattedFullDateAndTime = getFormattedFullDateAndTime;
11
+ exports.getFormattedFullDateWithWeek = getFormattedFullDateWithWeek;
12
+ exports.getFormattedNumberedDate = getFormattedNumberedDate;
13
+ exports.getFormattedNumberedDateAndTime = getFormattedNumberedDateAndTime;
14
+ exports.getFormattedNumberedDateAndTimeWithoutYear = getFormattedNumberedDateAndTimeWithoutYear;
15
+ exports.getFormattedNumberedDateForInput = getFormattedNumberedDateForInput;
16
+ exports.getFormattedNumberedDateWithFullYear = getFormattedNumberedDateWithFullYear;
17
+ exports.getFormattedNumberedDateWithoutYear = getFormattedNumberedDateWithoutYear;
18
+ exports.getFormattedNumberedTime = getFormattedNumberedTime;
19
+ exports.getFormattedNumberedTimeWithFullZone = getFormattedNumberedTimeWithFullZone;
20
+ exports.getFormattedNumberedTimeWithoutZone = getFormattedNumberedTimeWithoutZone;
21
+ exports.getFormattedNumberedTimeWithoutZoneOrMeridian = getFormattedNumberedTimeWithoutZoneOrMeridian;
22
+ exports.getFormattedSimplifiedDate = getFormattedSimplifiedDate;
23
+ exports.getFormattedSimplifiedDateWithYearIfNotCurrent = getFormattedSimplifiedDateWithYearIfNotCurrent;
24
+ exports.getFormattedSimplifiedDateWithoutYear = getFormattedSimplifiedDateWithoutYear;
25
+ exports.getFormattedTimeZone = getFormattedTimeZone;
26
+ exports.getFullFormattedTimeZone = getFullFormattedTimeZone;
27
+ exports.isDateInputSupported = exports.getZonedMomentFromUtcInDefaultZone = exports.getZonedMomentFromUtc = exports.getZonedMomentFromLocalDateTime = exports.getServerNowUtc = exports.getOffsetDate = exports.getLocalMomentFromUtc = exports.getLocalDateTimeFromUtc = void 0;
28
+ exports.isDateTimeValid = isDateTimeValid;
29
+ exports.isNowAfterDate = isNowAfterDate;
30
+ exports.isNowBeforeDate = isNowBeforeDate;
31
+ exports.isNowEqualOrAfterDate = isNowEqualOrAfterDate;
32
+ exports.isNowEqualOrBeforeDate = isNowEqualOrBeforeDate;
33
+ exports.setClockOffset = exports.isTimeInputSupported = void 0;
34
+ var _momentTimezone = _interopRequireDefault(require("moment-timezone"));
35
+ var _momentTimezoneUtils = _interopRequireDefault(require("moment-timezone/moment-timezone-utils"));
36
+ var _timezone = require("./timezone");
10
37
  /**
11
38
  * This value is used by time-sensitive functions in this module and other date/time utils. Any time
12
39
  * a new Date object is constructed, it will use this value to adjust the time by this offset (to
13
40
  * make it consistent with a known time)
14
41
  */
15
- var clockOffset = 0;
42
+ let clockOffset = 0;
43
+
16
44
  /**
17
45
  * When a GroupAssessment comes in the door, it includes the current UTC datetime. This method is
18
46
  * used to update the difference between the (accurate) server time and the browser time
19
47
  */
20
- var setClockOffset = function (offset) {
21
- clockOffset = offset;
48
+ const setClockOffset = function (offset) {
49
+ clockOffset = offset;
22
50
  };
23
- exports.setClockOffset = setClockOffset;
51
+
24
52
  /**
25
53
  * Get the current UTC time, calibrated to the API server's clock
26
54
  */
27
- var getServerNowUtc = function () {
28
- return new Date(Date.now() + clockOffset);
55
+ exports.setClockOffset = setClockOffset;
56
+ const getServerNowUtc = function () {
57
+ return new Date(Date.now() + clockOffset);
29
58
  };
30
- exports.getServerNowUtc = getServerNowUtc;
59
+
31
60
  /**
32
61
  * Return the provided date, offset by the clockOffset
33
62
  */
34
- var getOffsetDate = function (date) {
35
- return new Date(date.getTime() + clockOffset);
63
+ exports.getServerNowUtc = getServerNowUtc;
64
+ const getOffsetDate = date => {
65
+ return new Date(date.getTime() + clockOffset);
36
66
  };
37
67
  exports.getOffsetDate = getOffsetDate;
38
- var getZonedMomentFromUtc = function (dateTimeUtc, timeZoneId) {
39
- if (dateTimeUtc === void 0) { dateTimeUtc = exports.getServerNowUtc().toISOString(); }
40
- if (timeZoneId === void 0) { timeZoneId = timezone_1.guessTimeZoneId(); }
41
- return moment_timezone_1.default.utc(dateTimeUtc).tz(timeZoneId);
68
+ const getZonedMomentFromUtc = function () {
69
+ let dateTimeUtc = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getServerNowUtc().toISOString();
70
+ let timeZoneId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (0, _timezone.guessTimeZoneId)();
71
+ return _momentTimezone.default.utc(dateTimeUtc).tz(timeZoneId);
42
72
  };
43
73
  exports.getZonedMomentFromUtc = getZonedMomentFromUtc;
44
- var getZonedMomentFromUtcInDefaultZone = function (dateTimeUtc) {
45
- if (dateTimeUtc === void 0) { dateTimeUtc = exports.getServerNowUtc().toISOString(); }
46
- var timeZoneId = timezone_1.getDefaultTimeZoneId();
47
- return exports.getZonedMomentFromUtc(dateTimeUtc, timeZoneId);
74
+ const getZonedMomentFromUtcInDefaultZone = function () {
75
+ let dateTimeUtc = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getServerNowUtc().toISOString();
76
+ const timeZoneId = (0, _timezone.getDefaultTimeZoneId)();
77
+ return getZonedMomentFromUtc(dateTimeUtc, timeZoneId);
48
78
  };
49
79
  exports.getZonedMomentFromUtcInDefaultZone = getZonedMomentFromUtcInDefaultZone;
50
- var getZonedMomentFromLocalDateTime = function (localDateTime, timeZoneId) {
51
- if (timeZoneId === void 0) { timeZoneId = timezone_1.guessTimeZoneId(); }
52
- var localMoment = moment_timezone_1.default(localDateTime);
53
- var zonedMoment = moment_timezone_1.default.tz([
54
- localMoment.year(),
55
- localMoment.month(),
56
- localMoment.date(),
57
- localMoment.hour(),
58
- localMoment.minute(),
59
- localMoment.second(),
60
- localMoment.millisecond()
61
- ], timeZoneId);
62
- return zonedMoment;
80
+ const getZonedMomentFromLocalDateTime = function (localDateTime) {
81
+ let timeZoneId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (0, _timezone.guessTimeZoneId)();
82
+ const localMoment = (0, _momentTimezone.default)(localDateTime);
83
+ const zonedMoment = _momentTimezone.default.tz([localMoment.year(), localMoment.month(), localMoment.date(), localMoment.hour(), localMoment.minute(), localMoment.second(), localMoment.millisecond()], timeZoneId);
84
+ return zonedMoment;
63
85
  };
64
86
  exports.getZonedMomentFromLocalDateTime = getZonedMomentFromLocalDateTime;
65
- var getLocalMomentFromUtc = function (dateTimeUtc, timeZoneId) {
66
- if (dateTimeUtc === void 0) { dateTimeUtc = exports.getServerNowUtc().toISOString(); }
67
- if (timeZoneId === void 0) { timeZoneId = timezone_1.guessTimeZoneId(); }
68
- var zonedMoment = exports.getZonedMomentFromUtc(dateTimeUtc, timeZoneId);
69
- var localMoment = moment_timezone_1.default([
70
- zonedMoment.year(),
71
- zonedMoment.month(),
72
- zonedMoment.date(),
73
- zonedMoment.hour(),
74
- zonedMoment.minute(),
75
- zonedMoment.second(),
76
- zonedMoment.millisecond()
77
- ]);
78
- return localMoment;
87
+ const getLocalMomentFromUtc = function () {
88
+ let dateTimeUtc = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getServerNowUtc().toISOString();
89
+ let timeZoneId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (0, _timezone.guessTimeZoneId)();
90
+ const zonedMoment = getZonedMomentFromUtc(dateTimeUtc, timeZoneId);
91
+ const localMoment = (0, _momentTimezone.default)([zonedMoment.year(), zonedMoment.month(), zonedMoment.date(), zonedMoment.hour(), zonedMoment.minute(), zonedMoment.second(), zonedMoment.millisecond()]);
92
+ return localMoment;
79
93
  };
80
94
  exports.getLocalMomentFromUtc = getLocalMomentFromUtc;
81
- var getLocalDateTimeFromUtc = function (dateTimeUtc) {
82
- return exports.getLocalMomentFromUtc(dateTimeUtc).toDate();
95
+ const getLocalDateTimeFromUtc = dateTimeUtc => {
96
+ return getLocalMomentFromUtc(dateTimeUtc).toDate();
83
97
  };
84
98
  exports.getLocalDateTimeFromUtc = getLocalDateTimeFromUtc;
85
- var getDateMinusTime = function (dateTime) {
86
- return new Date(dateTime.getFullYear(), dateTime.getMonth(), dateTime.getDate());
99
+ const getDateMinusTime = dateTime => {
100
+ return new Date(dateTime.getFullYear(), dateTime.getMonth(), dateTime.getDate());
87
101
  };
88
102
  exports.getDateMinusTime = getDateMinusTime;
89
103
  function getEndOfDay(dateTimeUtc) {
90
- return moment_timezone_1.default(dateTimeUtc)
91
- .startOf('day')
92
- .add(1, 'days')
93
- .subtract(3, 'milliseconds') // must be minus 3 for SQL date
94
- .toDate();
104
+ return (0, _momentTimezone.default)(dateTimeUtc).startOf('day').add(1, 'days').subtract(3, 'milliseconds') // must be minus 3 for SQL date
105
+ .toDate();
95
106
  }
96
- exports.getEndOfDay = getEndOfDay;
97
107
  function getEndOfMinute(dateTimeUtc) {
98
- return moment_timezone_1.default(dateTimeUtc)
99
- .startOf('minute')
100
- .add(1, 'minute')
101
- .subtract(3, 'milliseconds') // must be minus 3 for SQL date
102
- .toDate();
108
+ return (0, _momentTimezone.default)(dateTimeUtc).startOf('minute').add(1, 'minute').subtract(3, 'milliseconds') // must be minus 3 for SQL date
109
+ .toDate();
103
110
  }
104
- exports.getEndOfMinute = getEndOfMinute;
111
+
105
112
  /**
106
113
  * Is the current time, "now", **after or equal to** the given date.
107
114
  *
@@ -110,16 +117,16 @@ exports.getEndOfMinute = getEndOfMinute;
110
117
  *
111
118
  * @returns Whether or not "now" is **after or equal to** `dateTimeUtc`
112
119
  */
113
- function isNowEqualOrAfterDate(dateTimeUtc, nowUtc) {
114
- if (nowUtc === void 0) { nowUtc = exports.getServerNowUtc().toISOString(); }
115
- if (!dateTimeUtc) {
116
- return false;
117
- }
118
- var adjustedDateTimeMoment = exports.getLocalMomentFromUtc(dateTimeUtc);
119
- var currentMoment = exports.getLocalMomentFromUtc(nowUtc);
120
- return currentMoment.isSameOrAfter(adjustedDateTimeMoment);
120
+ function isNowEqualOrAfterDate(dateTimeUtc) {
121
+ let nowUtc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getServerNowUtc().toISOString();
122
+ if (!dateTimeUtc) {
123
+ return false;
124
+ }
125
+ const adjustedDateTimeMoment = getLocalMomentFromUtc(dateTimeUtc);
126
+ const currentMoment = getLocalMomentFromUtc(nowUtc);
127
+ return currentMoment.isSameOrAfter(adjustedDateTimeMoment);
121
128
  }
122
- exports.isNowEqualOrAfterDate = isNowEqualOrAfterDate;
129
+
123
130
  /**
124
131
  * Is the current time, "now", **before or equal to** the given date.
125
132
  *
@@ -128,16 +135,16 @@ exports.isNowEqualOrAfterDate = isNowEqualOrAfterDate;
128
135
  *
129
136
  * @returns Whether or not "now" is **before or equal to** `dateTimeUtc`.
130
137
  */
131
- function isNowEqualOrBeforeDate(dateTimeUtc, nowUtc) {
132
- if (nowUtc === void 0) { nowUtc = exports.getServerNowUtc().toISOString(); }
133
- if (!dateTimeUtc) {
134
- return false;
135
- }
136
- var adjustedDateTimeMoment = exports.getLocalMomentFromUtc(dateTimeUtc);
137
- var currentMoment = exports.getLocalMomentFromUtc(nowUtc);
138
- return currentMoment.isSameOrBefore(adjustedDateTimeMoment);
138
+ function isNowEqualOrBeforeDate(dateTimeUtc) {
139
+ let nowUtc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getServerNowUtc().toISOString();
140
+ if (!dateTimeUtc) {
141
+ return false;
142
+ }
143
+ const adjustedDateTimeMoment = getLocalMomentFromUtc(dateTimeUtc);
144
+ const currentMoment = getLocalMomentFromUtc(nowUtc);
145
+ return currentMoment.isSameOrBefore(adjustedDateTimeMoment);
139
146
  }
140
- exports.isNowEqualOrBeforeDate = isNowEqualOrBeforeDate;
147
+
141
148
  /**
142
149
  * Is the current time, "now", **after** the given date.
143
150
  *
@@ -146,16 +153,16 @@ exports.isNowEqualOrBeforeDate = isNowEqualOrBeforeDate;
146
153
  *
147
154
  * @returns Whether or not "now" is **after** `dateTimeUtc`.
148
155
  */
149
- function isNowAfterDate(dateTimeUtc, nowUtc) {
150
- if (nowUtc === void 0) { nowUtc = exports.getServerNowUtc().toISOString(); }
151
- if (!dateTimeUtc) {
152
- return false;
153
- }
154
- var adjustedDateTimeMoment = exports.getLocalMomentFromUtc(dateTimeUtc);
155
- var currentMoment = exports.getLocalMomentFromUtc(nowUtc);
156
- return currentMoment > adjustedDateTimeMoment;
156
+ function isNowAfterDate(dateTimeUtc) {
157
+ let nowUtc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getServerNowUtc().toISOString();
158
+ if (!dateTimeUtc) {
159
+ return false;
160
+ }
161
+ const adjustedDateTimeMoment = getLocalMomentFromUtc(dateTimeUtc);
162
+ const currentMoment = getLocalMomentFromUtc(nowUtc);
163
+ return currentMoment > adjustedDateTimeMoment;
157
164
  }
158
- exports.isNowAfterDate = isNowAfterDate;
165
+
159
166
  /**
160
167
  * Is the current time, "now", **before** the given date.
161
168
  *
@@ -164,164 +171,162 @@ exports.isNowAfterDate = isNowAfterDate;
164
171
  *
165
172
  * @returns Whether or not "now" is **before** `dateTimeUtc`.
166
173
  */
167
- function isNowBeforeDate(dateTimeUtc, nowUtc) {
168
- if (nowUtc === void 0) { nowUtc = exports.getServerNowUtc().toISOString(); }
169
- if (!dateTimeUtc) {
170
- return false;
171
- }
172
- var adjustedDateTimeMoment = exports.getLocalMomentFromUtc(dateTimeUtc);
173
- var currentMoment = exports.getLocalMomentFromUtc(nowUtc);
174
- return currentMoment < adjustedDateTimeMoment;
174
+ function isNowBeforeDate(dateTimeUtc) {
175
+ let nowUtc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getServerNowUtc().toISOString();
176
+ if (!dateTimeUtc) {
177
+ return false;
178
+ }
179
+ const adjustedDateTimeMoment = getLocalMomentFromUtc(dateTimeUtc);
180
+ const currentMoment = getLocalMomentFromUtc(nowUtc);
181
+ return currentMoment < adjustedDateTimeMoment;
175
182
  }
176
- exports.isNowBeforeDate = isNowBeforeDate;
183
+
177
184
  /**
178
185
  * Returns a date and time string with full date, e.g. `March 5, 2018 @ 4:05 PM EDT`
179
186
  * @param dateTimeUtc A UTC date time string
180
187
  * @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
181
188
  */
182
- function getFormattedFullDateAndTime(dateTimeUtc, withTimeZone) {
183
- if (withTimeZone === void 0) { withTimeZone = true; }
184
- return applyFormat(dateTimeUtc, "MMMM D, YYYY @ h:mm\u00A0A" + (withTimeZone ? ' z' : ''));
189
+ function getFormattedFullDateAndTime(dateTimeUtc) {
190
+ let withTimeZone = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
191
+ return applyFormat(dateTimeUtc, `MMMM D, YYYY @ h:mm\u00a0A${withTimeZone ? ' z' : ''}`);
185
192
  }
186
- exports.getFormattedFullDateAndTime = getFormattedFullDateAndTime;
193
+
187
194
  /**
188
195
  * Returns a date and time string with day of week and American slash dates, e.g. `Mon, 3/5/2018 @ 4:05 PM EDT`
189
196
  * @param dateTimeUtc A UTC date time string
190
197
  * @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
191
198
  */
192
- function getFormattedFullDateWithWeek(dateTimeUtc, withTimeZone) {
193
- if (withTimeZone === void 0) { withTimeZone = true; }
194
- return applyFormat(dateTimeUtc, "ddd, M/D/YYYY @ h:mm\u00A0A" + (withTimeZone ? ' z' : ''));
199
+ function getFormattedFullDateWithWeek(dateTimeUtc) {
200
+ let withTimeZone = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
201
+ return applyFormat(dateTimeUtc, `ddd, M/D/YYYY @ h:mm\u00a0A${withTimeZone ? ' z' : ''}`);
195
202
  }
196
- exports.getFormattedFullDateWithWeek = getFormattedFullDateWithWeek;
203
+
197
204
  /**
198
205
  * Returns a date and time string with American slash dates, and no leading zeroes, e.g. `3/5/18 4:05 PM EDT`
199
206
  * @param dateTimeUtc A UTC date time string
200
207
  * @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
201
208
  */
202
- function getFormattedNumberedDateAndTime(dateTimeUtc, withTimeZone) {
203
- if (withTimeZone === void 0) { withTimeZone = true; }
204
- return applyFormat(dateTimeUtc, "M/D/YY h:mm\u00A0A" + (withTimeZone ? ' z' : ''));
209
+ function getFormattedNumberedDateAndTime(dateTimeUtc) {
210
+ let withTimeZone = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
211
+ return applyFormat(dateTimeUtc, `M/D/YY h:mm\u00a0A${withTimeZone ? ' z' : ''}`);
205
212
  }
206
- exports.getFormattedNumberedDateAndTime = getFormattedNumberedDateAndTime;
213
+
207
214
  /**
208
215
  * Returns a date and time string with American slash dates, no leading zeroes, and no year, e.g. `3/5 4:05 PM EDT`
209
216
  * @param dateTimeUtc A UTC date time string
210
217
  * @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
211
218
  */
212
- function getFormattedNumberedDateAndTimeWithoutYear(dateTimeUtc, withTimeZone) {
213
- if (withTimeZone === void 0) { withTimeZone = true; }
214
- return applyFormat(dateTimeUtc, "M/D h:mm\u00A0A" + (withTimeZone ? ' z' : ''));
219
+ function getFormattedNumberedDateAndTimeWithoutYear(dateTimeUtc) {
220
+ let withTimeZone = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
221
+ return applyFormat(dateTimeUtc, `M/D h:mm\u00a0A${withTimeZone ? ' z' : ''}`);
215
222
  }
216
- exports.getFormattedNumberedDateAndTimeWithoutYear = getFormattedNumberedDateAndTimeWithoutYear;
223
+
217
224
  /**
218
225
  * Returns a date string with short month and full year, e.g. `Mar 5, 2018`
219
226
  * @param dateTimeUtc A UTC date time string
220
227
  */
221
228
  function getFormattedSimplifiedDate(dateTimeUtc) {
222
- return applyFormat(dateTimeUtc, 'MMM D, YYYY');
229
+ return applyFormat(dateTimeUtc, 'MMM D, YYYY');
223
230
  }
224
- exports.getFormattedSimplifiedDate = getFormattedSimplifiedDate;
231
+
225
232
  /**
226
233
  * Returns a date string with short month and no year, e.g. `Mar 5`
227
234
  * @param dateTimeUtc A UTC date time string
228
235
  */
229
236
  function getFormattedSimplifiedDateWithoutYear(dateTimeUtc) {
230
- return applyFormat(dateTimeUtc, 'MMM D');
237
+ return applyFormat(dateTimeUtc, 'MMM D');
231
238
  }
232
- exports.getFormattedSimplifiedDateWithoutYear = getFormattedSimplifiedDateWithoutYear;
239
+
233
240
  /**
234
241
  * Returns a date string as either 'MMM D, YYYY' or 'MMM D' if the date's year is the same as the current year
235
242
  * @param dateTimeUtc A UTC date time string
236
243
  * @param nowUtc (optional) A UTC date time string of "now". Used for testing.
237
244
  */
238
- function getFormattedSimplifiedDateWithYearIfNotCurrent(dateTimeUtc, nowUtc) {
239
- if (nowUtc === void 0) { nowUtc = exports.getServerNowUtc().toISOString(); }
240
- var nowUtcMoment = moment_timezone_1.default(nowUtc);
241
- var dateTimeMoment = moment_timezone_1.default(dateTimeUtc);
242
- return Math.abs(nowUtcMoment.year() - dateTimeMoment.year()) === 0
243
- ? getFormattedSimplifiedDateWithoutYear(dateTimeUtc)
244
- : getFormattedSimplifiedDate(dateTimeUtc);
245
+ function getFormattedSimplifiedDateWithYearIfNotCurrent(dateTimeUtc) {
246
+ let nowUtc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getServerNowUtc().toISOString();
247
+ const nowUtcMoment = (0, _momentTimezone.default)(nowUtc);
248
+ const dateTimeMoment = (0, _momentTimezone.default)(dateTimeUtc);
249
+ return Math.abs(nowUtcMoment.year() - dateTimeMoment.year()) === 0 ? getFormattedSimplifiedDateWithoutYear(dateTimeUtc) : getFormattedSimplifiedDate(dateTimeUtc);
245
250
  }
246
- exports.getFormattedSimplifiedDateWithYearIfNotCurrent = getFormattedSimplifiedDateWithYearIfNotCurrent;
251
+
247
252
  /**
248
253
  * Returns a date string with American slash dates, no leading zeroes, and short year, e.g. `3/5/18`
249
254
  * @param dateTimeUtc A UTC date time string
250
255
  */
251
256
  function getFormattedNumberedDate(dateTimeUtc) {
252
- return applyFormat(dateTimeUtc, 'M/D/YY');
257
+ return applyFormat(dateTimeUtc, 'M/D/YY');
253
258
  }
254
- exports.getFormattedNumberedDate = getFormattedNumberedDate;
259
+
255
260
  /**
256
261
  * Returns a date string with American slash dates, no leading zeroes, and full year, e.g. `3/5/2018`
257
262
  * @param dateTimeUtc A UTC date time string
258
263
  */
259
264
  function getFormattedNumberedDateWithFullYear(dateTimeUtc) {
260
- return applyFormat(dateTimeUtc, 'M/D/YYYY');
265
+ return applyFormat(dateTimeUtc, 'M/D/YYYY');
261
266
  }
262
- exports.getFormattedNumberedDateWithFullYear = getFormattedNumberedDateWithFullYear;
267
+
263
268
  /**
264
269
  * Returns a date string for use in HTML inputs, e.g. `2018-03-05`
265
270
  * @param dateTimeUtc A UTC date time string
266
271
  */
267
272
  function getFormattedNumberedDateForInput(dateTimeUtc) {
268
- return applyFormat(dateTimeUtc, 'YYYY-MM-DD');
273
+ return applyFormat(dateTimeUtc, 'YYYY-MM-DD');
269
274
  }
270
- exports.getFormattedNumberedDateForInput = getFormattedNumberedDateForInput;
275
+
271
276
  /**
272
277
  * Returns a date string with American slash dates and no year and no leading zeroes, e.g. `3/5`
273
278
  * @param dateTimeUtc A UTC date time string
274
279
  */
275
280
  function getFormattedNumberedDateWithoutYear(dateTimeUtc) {
276
- return applyFormat(dateTimeUtc, 'M/D');
281
+ return applyFormat(dateTimeUtc, 'M/D');
277
282
  }
278
- exports.getFormattedNumberedDateWithoutYear = getFormattedNumberedDateWithoutYear;
283
+
279
284
  /**
280
285
  * Returns a time string, e.g. `4:05 PM EDT`
281
286
  * @param dateTimeUtc A UTC date time string
282
287
  * @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
283
288
  */
284
- function getFormattedNumberedTime(dateTimeUtc, withTimeZone) {
285
- if (withTimeZone === void 0) { withTimeZone = true; }
286
- return applyFormat(dateTimeUtc, "h:mm\u00A0A" + (withTimeZone ? ' z' : ''));
289
+ function getFormattedNumberedTime(dateTimeUtc) {
290
+ let withTimeZone = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
291
+ return applyFormat(dateTimeUtc, `h:mm\u00a0A${withTimeZone ? ' z' : ''}`);
287
292
  }
288
- exports.getFormattedNumberedTime = getFormattedNumberedTime;
293
+
289
294
  /**
290
295
  * Returns a time string with possibly full time zone name, e.g. `4:05 PM EDT` or `4:05 PM CST (Asia/Taipei)`
291
296
  * @param dateTimeUtc A UTC date time string
292
297
  * @param showEasternZoneId (optional) Whether or not to include the timeZoneId in the result for EST/EDT. Defaults to `false`.
293
298
  * @param timeZoneId (optional) A time zone Id. Defaults to the current time zone id, using `guessTimeZoneId()`.
294
299
  */
295
- function getFormattedNumberedTimeWithFullZone(dateTimeUtc, showEasternZoneId, timeZoneId) {
296
- if (showEasternZoneId === void 0) { showEasternZoneId = false; }
297
- if (timeZoneId === void 0) { timeZoneId = timezone_1.guessTimeZoneId(); }
298
- var zonedMoment = exports.getZonedMomentFromUtc(dateTimeUtc, timeZoneId);
299
- var time = applyFormat(dateTimeUtc, 'h:mm\u00a0A', timeZoneId);
300
- var timezoneAbbreviation = zonedMoment ? zonedMoment.zoneAbbr() : '';
301
- return (timezoneAbbreviation === 'EDT' || timezoneAbbreviation === 'EST') && !showEasternZoneId
302
- ? // Don't show the full zone name if in EDT or EST, unless told to
303
- time + " " + timezoneAbbreviation
304
- : // If not EDT or EST, show the zone name, replacing underscores with spaces
305
- // Ex: "Asia/Taipei"
306
- time + " " + timezoneAbbreviation + " (" + timeZoneId.replace('_', ' ') + ")";
300
+ function getFormattedNumberedTimeWithFullZone(dateTimeUtc) {
301
+ let showEasternZoneId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
302
+ let timeZoneId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : (0, _timezone.guessTimeZoneId)();
303
+ const zonedMoment = getZonedMomentFromUtc(dateTimeUtc, timeZoneId);
304
+ const time = applyFormat(dateTimeUtc, 'h:mm\u00a0A', timeZoneId);
305
+ const timezoneAbbreviation = zonedMoment.zoneAbbr();
306
+ return (timezoneAbbreviation === 'EDT' || timezoneAbbreviation === 'EST') && !showEasternZoneId ?
307
+ // Don't show the full zone name if in EDT or EST, unless told to
308
+ `${time} ${timezoneAbbreviation}` :
309
+ // If not EDT or EST, show the zone name, replacing underscores with spaces
310
+ // Ex: "Asia/Taipei"
311
+ `${time} ${timezoneAbbreviation} (${timeZoneId.replace('_', ' ')})`;
307
312
  }
308
- exports.getFormattedNumberedTimeWithFullZone = getFormattedNumberedTimeWithFullZone;
313
+
309
314
  /**
310
315
  * Returns a time string without time zone, e.g. `4:05 PM`
311
316
  * @param dateTimeUtc A UTC date time string
312
317
  */
313
318
  function getFormattedNumberedTimeWithoutZone(dateTimeUtc) {
314
- return applyFormat(dateTimeUtc, 'h:mm\u00a0A');
319
+ return applyFormat(dateTimeUtc, 'h:mm\u00a0A');
315
320
  }
316
- exports.getFormattedNumberedTimeWithoutZone = getFormattedNumberedTimeWithoutZone;
321
+
317
322
  /**
318
323
  * Returns a time string without time zone, in 24 hr time, e.g. `16:05`
319
324
  * @param dateTimeUtc A UTC date time string
320
325
  */
321
326
  function getFormattedNumberedTimeWithoutZoneOrMeridian(dateTimeUtc) {
322
- return applyFormat(dateTimeUtc, 'HH:mm');
327
+ return applyFormat(dateTimeUtc, 'HH:mm');
323
328
  }
324
- exports.getFormattedNumberedTimeWithoutZoneOrMeridian = getFormattedNumberedTimeWithoutZoneOrMeridian;
329
+
325
330
  /**
326
331
  * Returns a full formatted time zone string for the given `timeZoneId`.
327
332
  *
@@ -333,69 +338,64 @@ exports.getFormattedNumberedTimeWithoutZoneOrMeridian = getFormattedNumberedTime
333
338
  * @param showEasternZoneId (optional) Whether or not to include the timeZoneId in the result for EST/EDT. Defaults to `false`.
334
339
  * @param nowUtc (optional) The current time, "now", as an ISO date string.
335
340
  */
336
- function getFullFormattedTimeZone(timeZoneId, showEasternZoneId, nowUtc) {
337
- if (timeZoneId === void 0) { timeZoneId = timezone_1.guessTimeZoneId(); }
338
- if (showEasternZoneId === void 0) { showEasternZoneId = false; }
339
- if (nowUtc === void 0) { nowUtc = exports.getServerNowUtc().toISOString(); }
340
- var zone = moment_timezone_1.default.tz.zone(timeZoneId);
341
- if (!zone)
342
- return '';
343
- var zonedMoment = exports.getZonedMomentFromUtc(nowUtc, timeZoneId);
344
- // filter the zone data down to just recent years, instead of the default of 1900 to 2038
345
- var filteredZone = moment_timezone_utils_1.default.tz.filterYears(zone, zonedMoment.year() - 1, zonedMoment.year() + 1);
346
- // find all unique abbreviations for the zone, combined into a string
347
- var abbreviations = filteredZone.abbrs
348
- // filter out non-alpha abbreviations
349
- .filter(function (abbr) { return /[a-zA-Z]+/g.test(abbr); })
350
- .reduce(function (uniqueAbbrs, abbr) {
351
- if (!uniqueAbbrs.includes(abbr)) {
352
- uniqueAbbrs.push(abbr);
353
- }
354
- return uniqueAbbrs;
355
- }, []);
356
- var abbreviationsString = abbreviations.length > 0 ? abbreviations.join('/') : null;
357
- var readableZoneId = timeZoneId.replace('_', ' ');
358
- return !abbreviationsString
359
- ? readableZoneId
360
- : abbreviationsString === 'EST/EDT' && !showEasternZoneId
361
- ? // Don't show the zoneId if in Eastern, unless told to
362
- abbreviationsString
363
- : // Show the combined abbreviations plus the friendly zoneId
364
- abbreviationsString + " (" + readableZoneId + ")";
341
+ function getFullFormattedTimeZone() {
342
+ let timeZoneId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : (0, _timezone.guessTimeZoneId)();
343
+ let showEasternZoneId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
344
+ let nowUtc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : getServerNowUtc().toISOString();
345
+ const zone = _momentTimezone.default.tz.zone(timeZoneId);
346
+ if (!zone) return '';
347
+ const zonedMoment = getZonedMomentFromUtc(nowUtc, timeZoneId);
348
+ // filter the zone data down to just recent years, instead of the default of 1900 to 2038
349
+ const filteredZone = _momentTimezoneUtils.default.tz.filterYears(zone, zonedMoment.year() - 1, zonedMoment.year() + 1);
350
+ // find all unique abbreviations for the zone, combined into a string
351
+ const abbreviations = filteredZone.abbrs
352
+ // filter out non-alpha abbreviations
353
+ .filter(abbr => /[a-zA-Z]+/g.test(abbr)).reduce((uniqueAbbrs, abbr) => {
354
+ if (!uniqueAbbrs.includes(abbr)) {
355
+ uniqueAbbrs.push(abbr);
356
+ }
357
+ return uniqueAbbrs;
358
+ }, []);
359
+ const abbreviationsString = abbreviations.length > 0 ? abbreviations.join('/') : null;
360
+ const readableZoneId = timeZoneId.replace('_', ' ');
361
+ return !abbreviationsString ? readableZoneId : abbreviationsString === 'EST/EDT' && !showEasternZoneId ?
362
+ // Don't show the zoneId if in Eastern, unless told to
363
+ abbreviationsString :
364
+ // Show the combined abbreviations plus the friendly zoneId
365
+ `${abbreviationsString} (${readableZoneId})`;
365
366
  }
366
- exports.getFullFormattedTimeZone = getFullFormattedTimeZone;
367
+
367
368
  /**
368
369
  * Returns the basic time zone abbreviation for the given date, e.g. `EDT`.
369
370
  *
370
371
  * @param dateTimeUtc The date to format.
371
372
  */
372
373
  function getFormattedTimeZone(dateTimeUtc) {
373
- return applyFormat(dateTimeUtc, 'z');
374
+ return applyFormat(dateTimeUtc, 'z');
374
375
  }
375
- exports.getFormattedTimeZone = getFormattedTimeZone;
376
+
376
377
  /**
377
378
  * Formats a date using the given format. Parses the date as UTC, then converts to the current time zone, then formats.
378
379
  * @param {*} dateTimeUtc The date to format. Any valid input for `moment.utc(...)`
379
380
  * @param {*} format The format to use
380
381
  */
381
- function applyFormat(dateTimeUtc, format, timeZoneId) {
382
- if (timeZoneId === void 0) { timeZoneId = timezone_1.guessTimeZoneId(); }
383
- return exports.getZonedMomentFromUtc(dateTimeUtc, timeZoneId).format(format);
382
+ function applyFormat(dateTimeUtc, format) {
383
+ let timeZoneId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : (0, _timezone.guessTimeZoneId)();
384
+ return getZonedMomentFromUtc(dateTimeUtc, timeZoneId).format(format);
384
385
  }
385
- var isInputTypeSupported = function (type) {
386
- try {
387
- var test_1 = document.createElement('input');
388
- test_1.type = type;
389
- var isSupported = test_1.type === type;
390
- return isSupported;
391
- }
392
- catch (e) {
393
- return false;
394
- }
386
+ const isInputTypeSupported = type => {
387
+ try {
388
+ const test = document.createElement('input');
389
+ test.type = type;
390
+ const isSupported = test.type === type;
391
+ return isSupported;
392
+ } catch {
393
+ return false;
394
+ }
395
395
  };
396
- exports.isDateInputSupported = isInputTypeSupported('date');
397
- exports.isTimeInputSupported = isInputTypeSupported('time');
396
+ const isDateInputSupported = exports.isDateInputSupported = isInputTypeSupported('date');
397
+ const isTimeInputSupported = exports.isTimeInputSupported = isInputTypeSupported('time');
398
398
  function isDateTimeValid(dateTime) {
399
- return !!dateTime && moment_timezone_1.default(dateTime).isValid();
399
+ return !!dateTime && (0, _momentTimezone.default)(dateTime).isValid();
400
400
  }
401
- exports.isDateTimeValid = isDateTimeValid;
401
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9tZW50VGltZXpvbmUiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9tb21lbnRUaW1lem9uZVV0aWxzIiwiX3RpbWV6b25lIiwiY2xvY2tPZmZzZXQiLCJzZXRDbG9ja09mZnNldCIsIm9mZnNldCIsImV4cG9ydHMiLCJnZXRTZXJ2ZXJOb3dVdGMiLCJEYXRlIiwibm93IiwiZ2V0T2Zmc2V0RGF0ZSIsImRhdGUiLCJnZXRUaW1lIiwiZ2V0Wm9uZWRNb21lbnRGcm9tVXRjIiwiZGF0ZVRpbWVVdGMiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJ0b0lTT1N0cmluZyIsInRpbWVab25lSWQiLCJndWVzc1RpbWVab25lSWQiLCJtb21lbnQiLCJ1dGMiLCJ0eiIsImdldFpvbmVkTW9tZW50RnJvbVV0Y0luRGVmYXVsdFpvbmUiLCJnZXREZWZhdWx0VGltZVpvbmVJZCIsImdldFpvbmVkTW9tZW50RnJvbUxvY2FsRGF0ZVRpbWUiLCJsb2NhbERhdGVUaW1lIiwibG9jYWxNb21lbnQiLCJ6b25lZE1vbWVudCIsInllYXIiLCJtb250aCIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJtaWxsaXNlY29uZCIsImdldExvY2FsTW9tZW50RnJvbVV0YyIsImdldExvY2FsRGF0ZVRpbWVGcm9tVXRjIiwidG9EYXRlIiwiZ2V0RGF0ZU1pbnVzVGltZSIsImRhdGVUaW1lIiwiZ2V0RnVsbFllYXIiLCJnZXRNb250aCIsImdldERhdGUiLCJnZXRFbmRPZkRheSIsInN0YXJ0T2YiLCJhZGQiLCJzdWJ0cmFjdCIsImdldEVuZE9mTWludXRlIiwiaXNOb3dFcXVhbE9yQWZ0ZXJEYXRlIiwibm93VXRjIiwiYWRqdXN0ZWREYXRlVGltZU1vbWVudCIsImN1cnJlbnRNb21lbnQiLCJpc1NhbWVPckFmdGVyIiwiaXNOb3dFcXVhbE9yQmVmb3JlRGF0ZSIsImlzU2FtZU9yQmVmb3JlIiwiaXNOb3dBZnRlckRhdGUiLCJpc05vd0JlZm9yZURhdGUiLCJnZXRGb3JtYXR0ZWRGdWxsRGF0ZUFuZFRpbWUiLCJ3aXRoVGltZVpvbmUiLCJhcHBseUZvcm1hdCIsImdldEZvcm1hdHRlZEZ1bGxEYXRlV2l0aFdlZWsiLCJnZXRGb3JtYXR0ZWROdW1iZXJlZERhdGVBbmRUaW1lIiwiZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlQW5kVGltZVdpdGhvdXRZZWFyIiwiZ2V0Rm9ybWF0dGVkU2ltcGxpZmllZERhdGUiLCJnZXRGb3JtYXR0ZWRTaW1wbGlmaWVkRGF0ZVdpdGhvdXRZZWFyIiwiZ2V0Rm9ybWF0dGVkU2ltcGxpZmllZERhdGVXaXRoWWVhcklmTm90Q3VycmVudCIsIm5vd1V0Y01vbWVudCIsImRhdGVUaW1lTW9tZW50IiwiTWF0aCIsImFicyIsImdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZSIsImdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZVdpdGhGdWxsWWVhciIsImdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZUZvcklucHV0IiwiZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlV2l0aG91dFllYXIiLCJnZXRGb3JtYXR0ZWROdW1iZXJlZFRpbWUiLCJnZXRGb3JtYXR0ZWROdW1iZXJlZFRpbWVXaXRoRnVsbFpvbmUiLCJzaG93RWFzdGVyblpvbmVJZCIsInRpbWUiLCJ0aW1lem9uZUFiYnJldmlhdGlvbiIsInpvbmVBYmJyIiwicmVwbGFjZSIsImdldEZvcm1hdHRlZE51bWJlcmVkVGltZVdpdGhvdXRab25lIiwiZ2V0Rm9ybWF0dGVkTnVtYmVyZWRUaW1lV2l0aG91dFpvbmVPck1lcmlkaWFuIiwiZ2V0RnVsbEZvcm1hdHRlZFRpbWVab25lIiwiem9uZSIsImZpbHRlcmVkWm9uZSIsIm1vbWVudFV0aWxzIiwiZmlsdGVyWWVhcnMiLCJhYmJyZXZpYXRpb25zIiwiYWJicnMiLCJmaWx0ZXIiLCJhYmJyIiwidGVzdCIsInJlZHVjZSIsInVuaXF1ZUFiYnJzIiwiaW5jbHVkZXMiLCJwdXNoIiwiYWJicmV2aWF0aW9uc1N0cmluZyIsImpvaW4iLCJyZWFkYWJsZVpvbmVJZCIsImdldEZvcm1hdHRlZFRpbWVab25lIiwiZm9ybWF0IiwiaXNJbnB1dFR5cGVTdXBwb3J0ZWQiLCJ0eXBlIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiaXNTdXBwb3J0ZWQiLCJpc0RhdGVJbnB1dFN1cHBvcnRlZCIsImlzVGltZUlucHV0U3VwcG9ydGVkIiwiaXNEYXRlVGltZVZhbGlkIiwiaXNWYWxpZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9kYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50LXRpbWV6b25lJ1xuaW1wb3J0IG1vbWVudFV0aWxzIGZyb20gJ21vbWVudC10aW1lem9uZS9tb21lbnQtdGltZXpvbmUtdXRpbHMnXG5pbXBvcnQgeyBnZXREZWZhdWx0VGltZVpvbmVJZCwgZ3Vlc3NUaW1lWm9uZUlkIH0gZnJvbSAnLi90aW1lem9uZSdcblxuLyoqXG4gKiBUaGlzIHZhbHVlIGlzIHVzZWQgYnkgdGltZS1zZW5zaXRpdmUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIGFuZCBvdGhlciBkYXRlL3RpbWUgdXRpbHMuIEFueSB0aW1lXG4gKiBhIG5ldyBEYXRlIG9iamVjdCBpcyBjb25zdHJ1Y3RlZCwgaXQgd2lsbCB1c2UgdGhpcyB2YWx1ZSB0byBhZGp1c3QgdGhlIHRpbWUgYnkgdGhpcyBvZmZzZXQgKHRvXG4gKiBtYWtlIGl0IGNvbnNpc3RlbnQgd2l0aCBhIGtub3duIHRpbWUpXG4gKi9cbmxldCBjbG9ja09mZnNldCA9IDBcblxuLyoqXG4gKiBXaGVuIGEgR3JvdXBBc3Nlc3NtZW50IGNvbWVzIGluIHRoZSBkb29yLCBpdCBpbmNsdWRlcyB0aGUgY3VycmVudCBVVEMgZGF0ZXRpbWUuIFRoaXMgbWV0aG9kIGlzXG4gKiB1c2VkIHRvIHVwZGF0ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSAoYWNjdXJhdGUpIHNlcnZlciB0aW1lIGFuZCB0aGUgYnJvd3NlciB0aW1lXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRDbG9ja09mZnNldCA9IGZ1bmN0aW9uIChvZmZzZXQ6IG51bWJlcikge1xuXHRjbG9ja09mZnNldCA9IG9mZnNldFxufVxuXG4vKipcbiAqIEdldCB0aGUgY3VycmVudCBVVEMgdGltZSwgY2FsaWJyYXRlZCB0byB0aGUgQVBJIHNlcnZlcidzIGNsb2NrXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRTZXJ2ZXJOb3dVdGMgPSBmdW5jdGlvbiAoKSB7XG5cdHJldHVybiBuZXcgRGF0ZShEYXRlLm5vdygpICsgY2xvY2tPZmZzZXQpXG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBwcm92aWRlZCBkYXRlLCBvZmZzZXQgYnkgdGhlIGNsb2NrT2Zmc2V0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRPZmZzZXREYXRlID0gKGRhdGU6IERhdGUpID0+IHtcblx0cmV0dXJuIG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpICsgY2xvY2tPZmZzZXQpXG59XG5cbmV4cG9ydCBjb25zdCBnZXRab25lZE1vbWVudEZyb21VdGMgPSAoXG5cdGRhdGVUaW1lVXRjID0gZ2V0U2VydmVyTm93VXRjKCkudG9JU09TdHJpbmcoKSxcblx0dGltZVpvbmVJZCA9IGd1ZXNzVGltZVpvbmVJZCgpXG4pID0+IHtcblx0cmV0dXJuIG1vbWVudC51dGMoZGF0ZVRpbWVVdGMpLnR6KHRpbWVab25lSWQpXG59XG5cbmV4cG9ydCBjb25zdCBnZXRab25lZE1vbWVudEZyb21VdGNJbkRlZmF1bHRab25lID0gKGRhdGVUaW1lVXRjID0gZ2V0U2VydmVyTm93VXRjKCkudG9JU09TdHJpbmcoKSkgPT4ge1xuXHRjb25zdCB0aW1lWm9uZUlkID0gZ2V0RGVmYXVsdFRpbWVab25lSWQoKVxuXHRyZXR1cm4gZ2V0Wm9uZWRNb21lbnRGcm9tVXRjKGRhdGVUaW1lVXRjLCB0aW1lWm9uZUlkKVxufVxuXG5leHBvcnQgY29uc3QgZ2V0Wm9uZWRNb21lbnRGcm9tTG9jYWxEYXRlVGltZSA9IChsb2NhbERhdGVUaW1lOiBEYXRlIHwgc3RyaW5nLCB0aW1lWm9uZUlkID0gZ3Vlc3NUaW1lWm9uZUlkKCkpID0+IHtcblx0Y29uc3QgbG9jYWxNb21lbnQgPSBtb21lbnQobG9jYWxEYXRlVGltZSlcblx0Y29uc3Qgem9uZWRNb21lbnQgPSBtb21lbnQudHooXG5cdFx0W1xuXHRcdFx0bG9jYWxNb21lbnQueWVhcigpLFxuXHRcdFx0bG9jYWxNb21lbnQubW9udGgoKSxcblx0XHRcdGxvY2FsTW9tZW50LmRhdGUoKSxcblx0XHRcdGxvY2FsTW9tZW50LmhvdXIoKSxcblx0XHRcdGxvY2FsTW9tZW50Lm1pbnV0ZSgpLFxuXHRcdFx0bG9jYWxNb21lbnQuc2Vjb25kKCksXG5cdFx0XHRsb2NhbE1vbWVudC5taWxsaXNlY29uZCgpXG5cdFx0XSxcblx0XHR0aW1lWm9uZUlkXG5cdClcblx0cmV0dXJuIHpvbmVkTW9tZW50XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2NhbE1vbWVudEZyb21VdGMgPSAoXG5cdGRhdGVUaW1lVXRjID0gZ2V0U2VydmVyTm93VXRjKCkudG9JU09TdHJpbmcoKSxcblx0dGltZVpvbmVJZCA9IGd1ZXNzVGltZVpvbmVJZCgpXG4pID0+IHtcblx0Y29uc3Qgem9uZWRNb21lbnQgPSBnZXRab25lZE1vbWVudEZyb21VdGMoZGF0ZVRpbWVVdGMsIHRpbWVab25lSWQpXG5cdGNvbnN0IGxvY2FsTW9tZW50ID0gbW9tZW50KFtcblx0XHR6b25lZE1vbWVudC55ZWFyKCksXG5cdFx0em9uZWRNb21lbnQubW9udGgoKSxcblx0XHR6b25lZE1vbWVudC5kYXRlKCksXG5cdFx0em9uZWRNb21lbnQuaG91cigpLFxuXHRcdHpvbmVkTW9tZW50Lm1pbnV0ZSgpLFxuXHRcdHpvbmVkTW9tZW50LnNlY29uZCgpLFxuXHRcdHpvbmVkTW9tZW50Lm1pbGxpc2Vjb25kKClcblx0XSlcblx0cmV0dXJuIGxvY2FsTW9tZW50XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2NhbERhdGVUaW1lRnJvbVV0YyA9IChkYXRlVGltZVV0Yzogc3RyaW5nKSA9PiB7XG5cdHJldHVybiBnZXRMb2NhbE1vbWVudEZyb21VdGMoZGF0ZVRpbWVVdGMpLnRvRGF0ZSgpXG59XG5cbmV4cG9ydCBjb25zdCBnZXREYXRlTWludXNUaW1lID0gKGRhdGVUaW1lOiBEYXRlKSA9PiB7XG5cdHJldHVybiBuZXcgRGF0ZShkYXRlVGltZS5nZXRGdWxsWWVhcigpLCBkYXRlVGltZS5nZXRNb250aCgpLCBkYXRlVGltZS5nZXREYXRlKCkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbmRPZkRheShkYXRlVGltZVV0Yzogc3RyaW5nKSB7XG5cdHJldHVybiBtb21lbnQoZGF0ZVRpbWVVdGMpXG5cdFx0LnN0YXJ0T2YoJ2RheScpXG5cdFx0LmFkZCgxLCAnZGF5cycpXG5cdFx0LnN1YnRyYWN0KDMsICdtaWxsaXNlY29uZHMnKSAvLyBtdXN0IGJlIG1pbnVzIDMgZm9yIFNRTCBkYXRlXG5cdFx0LnRvRGF0ZSgpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbmRPZk1pbnV0ZShkYXRlVGltZVV0Yzogc3RyaW5nKSB7XG5cdHJldHVybiBtb21lbnQoZGF0ZVRpbWVVdGMpXG5cdFx0LnN0YXJ0T2YoJ21pbnV0ZScpXG5cdFx0LmFkZCgxLCAnbWludXRlJylcblx0XHQuc3VidHJhY3QoMywgJ21pbGxpc2Vjb25kcycpIC8vIG11c3QgYmUgbWludXMgMyBmb3IgU1FMIGRhdGVcblx0XHQudG9EYXRlKClcbn1cblxuLyoqXG4gKiBJcyB0aGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCAqKmFmdGVyIG9yIGVxdWFsIHRvKiogdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHBhcmFtIGRhdGVUaW1lVXRjIFRoZSBkYXRlIHRvIGNvbXBhcmUgdGhlIGN1cnJlbnQgdGltZSwgXCJub3dcIiwgYXMgYW4gSVNPIGRhdGUgc3RyaW5nLlxuICogQHBhcmFtIG5vd1V0YyBPcHRpb25hbC4gVGhlIGN1cnJlbnQgdGltZSwgXCJub3dcIiwgYXMgYW4gSVNPIGRhdGUgc3RyaW5nLlxuICpcbiAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IFwibm93XCIgaXMgKiphZnRlciBvciBlcXVhbCB0byoqIGBkYXRlVGltZVV0Y2BcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTm93RXF1YWxPckFmdGVyRGF0ZShkYXRlVGltZVV0Yz86IHN0cmluZywgbm93VXRjID0gZ2V0U2VydmVyTm93VXRjKCkudG9JU09TdHJpbmcoKSkge1xuXHRpZiAoIWRhdGVUaW1lVXRjKSB7XG5cdFx0cmV0dXJuIGZhbHNlXG5cdH1cblx0Y29uc3QgYWRqdXN0ZWREYXRlVGltZU1vbWVudCA9IGdldExvY2FsTW9tZW50RnJvbVV0YyhkYXRlVGltZVV0Yylcblx0Y29uc3QgY3VycmVudE1vbWVudCA9IGdldExvY2FsTW9tZW50RnJvbVV0Yyhub3dVdGMpXG5cdHJldHVybiBjdXJyZW50TW9tZW50LmlzU2FtZU9yQWZ0ZXIoYWRqdXN0ZWREYXRlVGltZU1vbWVudClcbn1cblxuLyoqXG4gKiBJcyB0aGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCAqKmJlZm9yZSBvciBlcXVhbCB0byoqIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBUaGUgZGF0ZSB0byBjb21wYXJlIHRoZSBjdXJyZW50IHRpbWUsIFwibm93XCIsIGFzIGFuIElTTyBkYXRlIHN0cmluZy5cbiAqIEBwYXJhbSBub3dVdGMgT3B0aW9uYWwuIFRoZSBjdXJyZW50IHRpbWUsIFwibm93XCIsIGFzIGFuIElTTyBkYXRlIHN0cmluZy5cbiAqXG4gKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCBcIm5vd1wiIGlzICoqYmVmb3JlIG9yIGVxdWFsIHRvKiogYGRhdGVUaW1lVXRjYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTm93RXF1YWxPckJlZm9yZURhdGUoZGF0ZVRpbWVVdGM/OiBzdHJpbmcsIG5vd1V0YyA9IGdldFNlcnZlck5vd1V0YygpLnRvSVNPU3RyaW5nKCkpIHtcblx0aWYgKCFkYXRlVGltZVV0Yykge1xuXHRcdHJldHVybiBmYWxzZVxuXHR9XG5cdGNvbnN0IGFkanVzdGVkRGF0ZVRpbWVNb21lbnQgPSBnZXRMb2NhbE1vbWVudEZyb21VdGMoZGF0ZVRpbWVVdGMpXG5cdGNvbnN0IGN1cnJlbnRNb21lbnQgPSBnZXRMb2NhbE1vbWVudEZyb21VdGMobm93VXRjKVxuXHRyZXR1cm4gY3VycmVudE1vbWVudC5pc1NhbWVPckJlZm9yZShhZGp1c3RlZERhdGVUaW1lTW9tZW50KVxufVxuXG4vKipcbiAqIElzIHRoZSBjdXJyZW50IHRpbWUsIFwibm93XCIsICoqYWZ0ZXIqKiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgVGhlIGRhdGUgdG8gY29tcGFyZSB0aGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCBhcyBhbiBJU08gZGF0ZSBzdHJpbmcuXG4gKiBAcGFyYW0gbm93VXRjIE9wdGlvbmFsLiBUaGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCBhcyBhbiBJU08gZGF0ZSBzdHJpbmcuXG4gKlxuICogQHJldHVybnMgV2hldGhlciBvciBub3QgXCJub3dcIiBpcyAqKmFmdGVyKiogYGRhdGVUaW1lVXRjYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTm93QWZ0ZXJEYXRlKGRhdGVUaW1lVXRjPzogc3RyaW5nLCBub3dVdGMgPSBnZXRTZXJ2ZXJOb3dVdGMoKS50b0lTT1N0cmluZygpKSB7XG5cdGlmICghZGF0ZVRpbWVVdGMpIHtcblx0XHRyZXR1cm4gZmFsc2Vcblx0fVxuXHRjb25zdCBhZGp1c3RlZERhdGVUaW1lTW9tZW50ID0gZ2V0TG9jYWxNb21lbnRGcm9tVXRjKGRhdGVUaW1lVXRjKVxuXHRjb25zdCBjdXJyZW50TW9tZW50ID0gZ2V0TG9jYWxNb21lbnRGcm9tVXRjKG5vd1V0Yylcblx0cmV0dXJuIGN1cnJlbnRNb21lbnQgPiBhZGp1c3RlZERhdGVUaW1lTW9tZW50XG59XG5cbi8qKlxuICogSXMgdGhlIGN1cnJlbnQgdGltZSwgXCJub3dcIiwgKipiZWZvcmUqKiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgVGhlIGRhdGUgdG8gY29tcGFyZSB0aGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCBhcyBhbiBJU08gZGF0ZSBzdHJpbmcuXG4gKiBAcGFyYW0gbm93VXRjIE9wdGlvbmFsLiBUaGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCBhcyBhbiBJU08gZGF0ZSBzdHJpbmcuXG4gKlxuICogQHJldHVybnMgV2hldGhlciBvciBub3QgXCJub3dcIiBpcyAqKmJlZm9yZSoqIGBkYXRlVGltZVV0Y2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc05vd0JlZm9yZURhdGUoZGF0ZVRpbWVVdGM/OiBzdHJpbmcsIG5vd1V0YyA9IGdldFNlcnZlck5vd1V0YygpLnRvSVNPU3RyaW5nKCkpIHtcblx0aWYgKCFkYXRlVGltZVV0Yykge1xuXHRcdHJldHVybiBmYWxzZVxuXHR9XG5cdGNvbnN0IGFkanVzdGVkRGF0ZVRpbWVNb21lbnQgPSBnZXRMb2NhbE1vbWVudEZyb21VdGMoZGF0ZVRpbWVVdGMpXG5cdGNvbnN0IGN1cnJlbnRNb21lbnQgPSBnZXRMb2NhbE1vbWVudEZyb21VdGMobm93VXRjKVxuXHRyZXR1cm4gY3VycmVudE1vbWVudCA8IGFkanVzdGVkRGF0ZVRpbWVNb21lbnRcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGF0ZSBhbmQgdGltZSBzdHJpbmcgd2l0aCBmdWxsIGRhdGUsIGUuZy4gYE1hcmNoIDUsIDIwMTggQCA0OjA1IFBNIEVEVGBcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXG4gKiBAcGFyYW0gd2l0aFRpbWVab25lIChvcHRpb25hbCkgV2hldGhlciB0byBpbmNsdWRlIHRoZSB0aW1lIHpvbmUgYWJicmV2aWF0aW9uLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRGdWxsRGF0ZUFuZFRpbWUoZGF0ZVRpbWVVdGM6IHN0cmluZywgd2l0aFRpbWVab25lID0gdHJ1ZSkge1xuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsIGBNTU1NIEQsIFlZWVkgQCBoOm1tXFx1MDBhMEEke3dpdGhUaW1lWm9uZSA/ICcgeicgOiAnJ31gKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBkYXRlIGFuZCB0aW1lIHN0cmluZyB3aXRoIGRheSBvZiB3ZWVrIGFuZCBBbWVyaWNhbiBzbGFzaCBkYXRlcywgZS5nLiBgTW9uLCAzLzUvMjAxOCBAIDQ6MDUgUE0gRURUYFxuICogQHBhcmFtIGRhdGVUaW1lVXRjIEEgVVRDIGRhdGUgdGltZSBzdHJpbmdcbiAqIEBwYXJhbSB3aXRoVGltZVpvbmUgKG9wdGlvbmFsKSBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHRpbWUgem9uZSBhYmJyZXZpYXRpb24uIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdHRlZEZ1bGxEYXRlV2l0aFdlZWsoZGF0ZVRpbWVVdGM6IHN0cmluZywgd2l0aFRpbWVab25lID0gdHJ1ZSkge1xuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsIGBkZGQsIE0vRC9ZWVlZIEAgaDptbVxcdTAwYTBBJHt3aXRoVGltZVpvbmUgPyAnIHonIDogJyd9YClcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGF0ZSBhbmQgdGltZSBzdHJpbmcgd2l0aCBBbWVyaWNhbiBzbGFzaCBkYXRlcywgYW5kIG5vIGxlYWRpbmcgemVyb2VzLCBlLmcuIGAzLzUvMTggNDowNSBQTSBFRFRgXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICogQHBhcmFtIHdpdGhUaW1lWm9uZSAob3B0aW9uYWwpIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgdGltZSB6b25lIGFiYnJldmlhdGlvbi4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlQW5kVGltZShkYXRlVGltZVV0Yzogc3RyaW5nLCB3aXRoVGltZVpvbmUgPSB0cnVlKSB7XG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgYE0vRC9ZWSBoOm1tXFx1MDBhMEEke3dpdGhUaW1lWm9uZSA/ICcgeicgOiAnJ31gKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBkYXRlIGFuZCB0aW1lIHN0cmluZyB3aXRoIEFtZXJpY2FuIHNsYXNoIGRhdGVzLCBubyBsZWFkaW5nIHplcm9lcywgYW5kIG5vIHllYXIsIGUuZy4gYDMvNSA0OjA1IFBNIEVEVGBcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXG4gKiBAcGFyYW0gd2l0aFRpbWVab25lIChvcHRpb25hbCkgV2hldGhlciB0byBpbmNsdWRlIHRoZSB0aW1lIHpvbmUgYWJicmV2aWF0aW9uLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWROdW1iZXJlZERhdGVBbmRUaW1lV2l0aG91dFllYXIoZGF0ZVRpbWVVdGM6IHN0cmluZywgd2l0aFRpbWVab25lID0gdHJ1ZSkge1xuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsIGBNL0QgaDptbVxcdTAwYTBBJHt3aXRoVGltZVpvbmUgPyAnIHonIDogJyd9YClcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGF0ZSBzdHJpbmcgd2l0aCBzaG9ydCBtb250aCBhbmQgZnVsbCB5ZWFyLCBlLmcuIGBNYXIgNSwgMjAxOGBcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRTaW1wbGlmaWVkRGF0ZShkYXRlVGltZVV0Yzogc3RyaW5nKSB7XG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgJ01NTSBELCBZWVlZJylcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGF0ZSBzdHJpbmcgd2l0aCBzaG9ydCBtb250aCBhbmQgbm8geWVhciwgZS5nLiBgTWFyIDVgXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkU2ltcGxpZmllZERhdGVXaXRob3V0WWVhcihkYXRlVGltZVV0Yzogc3RyaW5nKSB7XG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgJ01NTSBEJylcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGF0ZSBzdHJpbmcgYXMgZWl0aGVyICdNTU0gRCwgWVlZWScgb3IgJ01NTSBEJyBpZiB0aGUgZGF0ZSdzIHllYXIgaXMgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgeWVhclxuICogQHBhcmFtIGRhdGVUaW1lVXRjIEEgVVRDIGRhdGUgdGltZSBzdHJpbmdcbiAqIEBwYXJhbSBub3dVdGMgKG9wdGlvbmFsKSBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nIG9mIFwibm93XCIuIFVzZWQgZm9yIHRlc3RpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRTaW1wbGlmaWVkRGF0ZVdpdGhZZWFySWZOb3RDdXJyZW50KFxuXHRkYXRlVGltZVV0Yzogc3RyaW5nLFxuXHRub3dVdGMgPSBnZXRTZXJ2ZXJOb3dVdGMoKS50b0lTT1N0cmluZygpXG4pIHtcblx0Y29uc3Qgbm93VXRjTW9tZW50ID0gbW9tZW50KG5vd1V0Yylcblx0Y29uc3QgZGF0ZVRpbWVNb21lbnQgPSBtb21lbnQoZGF0ZVRpbWVVdGMpXG5cdHJldHVybiBNYXRoLmFicyhub3dVdGNNb21lbnQueWVhcigpIC0gZGF0ZVRpbWVNb21lbnQueWVhcigpKSA9PT0gMFxuXHRcdD8gZ2V0Rm9ybWF0dGVkU2ltcGxpZmllZERhdGVXaXRob3V0WWVhcihkYXRlVGltZVV0Yylcblx0XHQ6IGdldEZvcm1hdHRlZFNpbXBsaWZpZWREYXRlKGRhdGVUaW1lVXRjKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBkYXRlIHN0cmluZyB3aXRoIEFtZXJpY2FuIHNsYXNoIGRhdGVzLCBubyBsZWFkaW5nIHplcm9lcywgYW5kIHNob3J0IHllYXIsIGUuZy4gYDMvNS8xOGBcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWROdW1iZXJlZERhdGUoZGF0ZVRpbWVVdGM6IHN0cmluZykge1xuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsICdNL0QvWVknKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBkYXRlIHN0cmluZyB3aXRoIEFtZXJpY2FuIHNsYXNoIGRhdGVzLCBubyBsZWFkaW5nIHplcm9lcywgYW5kIGZ1bGwgeWVhciwgZS5nLiBgMy81LzIwMThgXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlV2l0aEZ1bGxZZWFyKGRhdGVUaW1lVXRjOiBzdHJpbmcpIHtcblx0cmV0dXJuIGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCAnTS9EL1lZWVknKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBkYXRlIHN0cmluZyBmb3IgdXNlIGluIEhUTUwgaW5wdXRzLCBlLmcuIGAyMDE4LTAzLTA1YFxuICogQHBhcmFtIGRhdGVUaW1lVXRjIEEgVVRDIGRhdGUgdGltZSBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZUZvcklucHV0KGRhdGVUaW1lVXRjOiBzdHJpbmcpIHtcblx0cmV0dXJuIGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCAnWVlZWS1NTS1ERCcpXG59XG5cbi8qKlxuICogUmV0dXJucyBhIGRhdGUgc3RyaW5nIHdpdGggQW1lcmljYW4gc2xhc2ggZGF0ZXMgYW5kIG5vIHllYXIgYW5kIG5vIGxlYWRpbmcgemVyb2VzLCBlLmcuIGAzLzVgXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlV2l0aG91dFllYXIoZGF0ZVRpbWVVdGM6IHN0cmluZykge1xuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsICdNL0QnKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSB0aW1lIHN0cmluZywgZS5nLiBgNDowNSBQTSBFRFRgXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICogQHBhcmFtIHdpdGhUaW1lWm9uZSAob3B0aW9uYWwpIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgdGltZSB6b25lIGFiYnJldmlhdGlvbi4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWRUaW1lKGRhdGVUaW1lVXRjOiBzdHJpbmcsIHdpdGhUaW1lWm9uZSA9IHRydWUpIHtcblx0cmV0dXJuIGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCBgaDptbVxcdTAwYTBBJHt3aXRoVGltZVpvbmUgPyAnIHonIDogJyd9YClcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgdGltZSBzdHJpbmcgd2l0aCBwb3NzaWJseSBmdWxsIHRpbWUgem9uZSBuYW1lLCBlLmcuIGA0OjA1IFBNIEVEVGAgb3IgYDQ6MDUgUE0gQ1NUIChBc2lhL1RhaXBlaSlgXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICogQHBhcmFtIHNob3dFYXN0ZXJuWm9uZUlkIChvcHRpb25hbCkgV2hldGhlciBvciBub3QgdG8gaW5jbHVkZSB0aGUgdGltZVpvbmVJZCBpbiB0aGUgcmVzdWx0IGZvciBFU1QvRURULiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICogQHBhcmFtIHRpbWVab25lSWQgKG9wdGlvbmFsKSBBIHRpbWUgem9uZSBJZC4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdGltZSB6b25lIGlkLCB1c2luZyBgZ3Vlc3NUaW1lWm9uZUlkKClgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWRUaW1lV2l0aEZ1bGxab25lKFxuXHRkYXRlVGltZVV0Yzogc3RyaW5nLFxuXHRzaG93RWFzdGVyblpvbmVJZCA9IGZhbHNlLFxuXHR0aW1lWm9uZUlkID0gZ3Vlc3NUaW1lWm9uZUlkKClcbikge1xuXHRjb25zdCB6b25lZE1vbWVudCA9IGdldFpvbmVkTW9tZW50RnJvbVV0YyhkYXRlVGltZVV0YywgdGltZVpvbmVJZClcblx0Y29uc3QgdGltZSA9IGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCAnaDptbVxcdTAwYTBBJywgdGltZVpvbmVJZClcblx0Y29uc3QgdGltZXpvbmVBYmJyZXZpYXRpb24gPSB6b25lZE1vbWVudC56b25lQWJicigpXG5cdHJldHVybiAodGltZXpvbmVBYmJyZXZpYXRpb24gPT09ICdFRFQnIHx8IHRpbWV6b25lQWJicmV2aWF0aW9uID09PSAnRVNUJykgJiYgIXNob3dFYXN0ZXJuWm9uZUlkXG5cdFx0PyAvLyBEb24ndCBzaG93IHRoZSBmdWxsIHpvbmUgbmFtZSBpZiBpbiBFRFQgb3IgRVNULCB1bmxlc3MgdG9sZCB0b1xuXHRcdFx0YCR7dGltZX0gJHt0aW1lem9uZUFiYnJldmlhdGlvbn1gXG5cdFx0OiAvLyBJZiBub3QgRURUIG9yIEVTVCwgc2hvdyB0aGUgem9uZSBuYW1lLCByZXBsYWNpbmcgdW5kZXJzY29yZXMgd2l0aCBzcGFjZXNcblx0XHRcdC8vIEV4OiBcIkFzaWEvVGFpcGVpXCJcblx0XHRcdGAke3RpbWV9ICR7dGltZXpvbmVBYmJyZXZpYXRpb259ICgke3RpbWVab25lSWQucmVwbGFjZSgnXycsICcgJyl9KWBcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgdGltZSBzdHJpbmcgd2l0aG91dCB0aW1lIHpvbmUsIGUuZy4gYDQ6MDUgUE1gXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWRUaW1lV2l0aG91dFpvbmUoZGF0ZVRpbWVVdGM6IHN0cmluZykge1xuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsICdoOm1tXFx1MDBhMEEnKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSB0aW1lIHN0cmluZyB3aXRob3V0IHRpbWUgem9uZSwgaW4gMjQgaHIgdGltZSwgZS5nLiBgMTY6MDVgXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWRUaW1lV2l0aG91dFpvbmVPck1lcmlkaWFuKGRhdGVUaW1lVXRjOiBzdHJpbmcpIHtcblx0cmV0dXJuIGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCAnSEg6bW0nKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdWxsIGZvcm1hdHRlZCB0aW1lIHpvbmUgc3RyaW5nIGZvciB0aGUgZ2l2ZW4gYHRpbWVab25lSWRgLlxuICpcbiAqIENvbWJpbmVzIGFsbCBwb3NzaWJsZSBhYmJyZXZpYXRpb25zIGZvciB0aGUgem9uZSBhbmQgdGhlIHRpbWVab25lSWQsIGUuZy4gYEVTVC9FRFRgLCBgUFNUL1BEVCAoQW1lcmljYS9Mb3MgQW5nZWxlcylgIG9yIGBDU1QgKEFzaWEvVGFpcGVpKWBcbiAqXG4gKiBJZiBhYmJyZXZpYXRpb25zIGFyZSBub3QgYWxwaGEgY2hhcmFjdGVycywgZS5nLiBgLTA0YCwgdGhlbiBvbmx5IHRoZSB0aW1lWm9uZUlkIGlzIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSB0aW1lWm9uZUlkIChvcHRpb25hbCkgQSB0aW1lIHpvbmUgSWQuIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHRpbWUgem9uZSBpZCwgdXNpbmcgYGd1ZXNzVGltZVpvbmVJZCgpYC5cbiAqIEBwYXJhbSBzaG93RWFzdGVyblpvbmVJZCAob3B0aW9uYWwpIFdoZXRoZXIgb3Igbm90IHRvIGluY2x1ZGUgdGhlIHRpbWVab25lSWQgaW4gdGhlIHJlc3VsdCBmb3IgRVNUL0VEVC4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAqIEBwYXJhbSBub3dVdGMgKG9wdGlvbmFsKSBUaGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCBhcyBhbiBJU08gZGF0ZSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGdWxsRm9ybWF0dGVkVGltZVpvbmUoXG5cdHRpbWVab25lSWQgPSBndWVzc1RpbWVab25lSWQoKSxcblx0c2hvd0Vhc3Rlcm5ab25lSWQgPSBmYWxzZSxcblx0bm93VXRjID0gZ2V0U2VydmVyTm93VXRjKCkudG9JU09TdHJpbmcoKVxuKSB7XG5cdGNvbnN0IHpvbmUgPSBtb21lbnQudHouem9uZSh0aW1lWm9uZUlkKVxuXHRpZiAoIXpvbmUpIHJldHVybiAnJ1xuXG5cdGNvbnN0IHpvbmVkTW9tZW50ID0gZ2V0Wm9uZWRNb21lbnRGcm9tVXRjKG5vd1V0YywgdGltZVpvbmVJZClcblx0Ly8gZmlsdGVyIHRoZSB6b25lIGRhdGEgZG93biB0byBqdXN0IHJlY2VudCB5ZWFycywgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBvZiAxOTAwIHRvIDIwMzhcblx0Y29uc3QgZmlsdGVyZWRab25lID0gbW9tZW50VXRpbHMudHouZmlsdGVyWWVhcnMoem9uZSwgem9uZWRNb21lbnQueWVhcigpIC0gMSwgem9uZWRNb21lbnQueWVhcigpICsgMSlcblx0Ly8gZmluZCBhbGwgdW5pcXVlIGFiYnJldmlhdGlvbnMgZm9yIHRoZSB6b25lLCBjb21iaW5lZCBpbnRvIGEgc3RyaW5nXG5cdGNvbnN0IGFiYnJldmlhdGlvbnMgPSBmaWx0ZXJlZFpvbmUuYWJicnNcblx0XHQvLyBmaWx0ZXIgb3V0IG5vbi1hbHBoYSBhYmJyZXZpYXRpb25zXG5cdFx0LmZpbHRlcihhYmJyID0+IC9bYS16QS1aXSsvZy50ZXN0KGFiYnIpKVxuXHRcdC5yZWR1Y2UoKHVuaXF1ZUFiYnJzOiBzdHJpbmdbXSwgYWJicikgPT4ge1xuXHRcdFx0aWYgKCF1bmlxdWVBYmJycy5pbmNsdWRlcyhhYmJyKSkge1xuXHRcdFx0XHR1bmlxdWVBYmJycy5wdXNoKGFiYnIpXG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdW5pcXVlQWJicnNcblx0XHR9LCBbXSlcblx0Y29uc3QgYWJicmV2aWF0aW9uc1N0cmluZyA9IGFiYnJldmlhdGlvbnMubGVuZ3RoID4gMCA/IGFiYnJldmlhdGlvbnMuam9pbignLycpIDogbnVsbFxuXHRjb25zdCByZWFkYWJsZVpvbmVJZCA9IHRpbWVab25lSWQucmVwbGFjZSgnXycsICcgJylcblx0cmV0dXJuICFhYmJyZXZpYXRpb25zU3RyaW5nXG5cdFx0PyByZWFkYWJsZVpvbmVJZFxuXHRcdDogYWJicmV2aWF0aW9uc1N0cmluZyA9PT0gJ0VTVC9FRFQnICYmICFzaG93RWFzdGVyblpvbmVJZFxuXHRcdFx0PyAvLyBEb24ndCBzaG93IHRoZSB6b25lSWQgaWYgaW4gRWFzdGVybiwgdW5sZXNzIHRvbGQgdG9cblx0XHRcdFx0YWJicmV2aWF0aW9uc1N0cmluZ1xuXHRcdFx0OiAvLyBTaG93IHRoZSBjb21iaW5lZCBhYmJyZXZpYXRpb25zIHBsdXMgdGhlIGZyaWVuZGx5IHpvbmVJZFxuXHRcdFx0XHRgJHthYmJyZXZpYXRpb25zU3RyaW5nfSAoJHtyZWFkYWJsZVpvbmVJZH0pYFxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGJhc2ljIHRpbWUgem9uZSBhYmJyZXZpYXRpb24gZm9yIHRoZSBnaXZlbiBkYXRlLCBlLmcuIGBFRFRgLlxuICpcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBUaGUgZGF0ZSB0byBmb3JtYXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRUaW1lWm9uZShkYXRlVGltZVV0Yzogc3RyaW5nKSB7XG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgJ3onKVxufVxuXG4vKipcbiAqIEZvcm1hdHMgYSBkYXRlIHVzaW5nIHRoZSBnaXZlbiBmb3JtYXQuIFBhcnNlcyB0aGUgZGF0ZSBhcyBVVEMsIHRoZW4gY29udmVydHMgdG8gdGhlIGN1cnJlbnQgdGltZSB6b25lLCB0aGVuIGZvcm1hdHMuXG4gKiBAcGFyYW0geyp9IGRhdGVUaW1lVXRjIFRoZSBkYXRlIHRvIGZvcm1hdC4gQW55IHZhbGlkIGlucHV0IGZvciBgbW9tZW50LnV0YyguLi4pYFxuICogQHBhcmFtIHsqfSBmb3JtYXQgVGhlIGZvcm1hdCB0byB1c2VcbiAqL1xuZnVuY3Rpb24gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGM6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcsIHRpbWVab25lSWQgPSBndWVzc1RpbWVab25lSWQoKSkge1xuXHRyZXR1cm4gZ2V0Wm9uZWRNb21lbnRGcm9tVXRjKGRhdGVUaW1lVXRjLCB0aW1lWm9uZUlkKS5mb3JtYXQoZm9ybWF0KVxufVxuXG5jb25zdCBpc0lucHV0VHlwZVN1cHBvcnRlZCA9ICh0eXBlOiBzdHJpbmcpID0+IHtcblx0dHJ5IHtcblx0XHRjb25zdCB0ZXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKVxuXHRcdHRlc3QudHlwZSA9IHR5cGVcblx0XHRjb25zdCBpc1N1cHBvcnRlZCA9IHRlc3QudHlwZSA9PT0gdHlwZVxuXHRcdHJldHVybiBpc1N1cHBvcnRlZFxuXHR9IGNhdGNoIHtcblx0XHRyZXR1cm4gZmFsc2Vcblx0fVxufVxuXG5leHBvcnQgY29uc3QgaXNEYXRlSW5wdXRTdXBwb3J0ZWQgPSBpc0lucHV0VHlwZVN1cHBvcnRlZCgnZGF0ZScpXG5cbmV4cG9ydCBjb25zdCBpc1RpbWVJbnB1dFN1cHBvcnRlZCA9IGlzSW5wdXRUeXBlU3VwcG9ydGVkKCd0aW1lJylcblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0ZVRpbWVWYWxpZChkYXRlVGltZTogc3RyaW5nIHwgRGF0ZSkge1xuXHRyZXR1cm4gISFkYXRlVGltZSAmJiBtb21lbnQoZGF0ZVRpbWUpLmlzVmFsaWQoKVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFBQSxlQUFBLEdBQUFDLHNCQUFBLENBQUFD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LEdBQUd5RSxhQUFhLENBQUNVLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJO0VBQ3JGLE1BQU1DLGNBQWMsR0FBR2pGLFVBQVUsQ0FBQzhELE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO0VBQ25ELE9BQU8sQ0FBQ2lCLG1CQUFtQixHQUN4QkUsY0FBYyxHQUNkRixtQkFBbUIsS0FBSyxTQUFTLElBQUksQ0FBQ3JCLGlCQUFpQjtFQUN0RDtFQUNEcUIsbUJBQW1CO0VBQ2xCO0VBQ0QsR0FBR0EsbUJBQW1CLEtBQUtFLGNBQWMsR0FBRztBQUNoRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0Msb0JBQW9CQSxDQUFDdkYsV0FBbUIsRUFBRTtFQUN6RCxPQUFPOEMsV0FBVyxDQUFDOUMsV0FBVyxFQUFFLEdBQUcsQ0FBQztBQUNyQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzhDLFdBQVdBLENBQUM5QyxXQUFtQixFQUFFd0YsTUFBYyxFQUFrQztFQUFBLElBQWhDbkYsVUFBVSxHQUFBSixTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBRyxJQUFBSyx5QkFBZSxFQUFDLENBQUM7RUFDdkYsT0FBT1AscUJBQXFCLENBQUNDLFdBQVcsRUFBRUssVUFBVSxDQUFDLENBQUNtRixNQUFNLENBQUNBLE1BQU0sQ0FBQztBQUNyRTtBQUVBLE1BQU1DLG9CQUFvQixHQUFJQyxJQUFZLElBQUs7RUFDOUMsSUFBSTtJQUNILE1BQU1YLElBQUksR0FBR1ksUUFBUSxDQUFDQyxhQUFhLENBQUMsT0FBTyxDQUFDO0lBQzVDYixJQUFJLENBQUNXLElBQUksR0FBR0EsSUFBSTtJQUNoQixNQUFNRyxXQUFXLEdBQUdkLElBQUksQ0FBQ1csSUFBSSxLQUFLQSxJQUFJO0lBQ3RDLE9BQU9HLFdBQVc7RUFDbkIsQ0FBQyxDQUFDLE1BQU07SUFDUCxPQUFPLEtBQUs7RUFDYjtBQUNELENBQUM7QUFFTSxNQUFNQyxvQkFBb0IsR0FBQXRHLE9BQUEsQ0FBQXNHLG9CQUFBLEdBQUdMLG9CQUFvQixDQUFDLE1BQU0sQ0FBQztBQUV6RCxNQUFNTSxvQkFBb0IsR0FBQXZHLE9BQUEsQ0FBQXVHLG9CQUFBLEdBQUdOLG9CQUFvQixDQUFDLE1BQU0sQ0FBQztBQUV6RCxTQUFTTyxlQUFlQSxDQUFDdEUsUUFBdUIsRUFBRTtFQUN4RCxPQUFPLENBQUMsQ0FBQ0EsUUFBUSxJQUFJLElBQUFuQix1QkFBTSxFQUFDbUIsUUFBUSxDQUFDLENBQUN1RSxPQUFPLENBQUMsQ0FBQztBQUNoRCIsImlnbm9yZUxpc3QiOltdfQ==