studiokit-scaffolding-js 7.0.12-next.1.4 → 7.0.12-next.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/lib/components/ActionList.js +170 -34
  2. package/lib/components/AlertDialog.js +133 -9
  3. package/lib/components/AlertWithIcon.js +92 -25
  4. package/lib/components/ConnectedModal.js +43 -13
  5. package/lib/components/Dropdowns/GroupsDropdown.js +69 -44
  6. package/lib/components/Dropdowns/ManagedNavDropdown.js +100 -67
  7. package/lib/components/Dropdowns/UserDropdown.js +111 -21
  8. package/lib/components/Dropdowns/index.js +27 -9
  9. package/lib/components/EntityOwnerList.js +52 -18
  10. package/lib/components/Error.js +106 -11
  11. package/lib/components/ErrorBoundary.js +134 -35
  12. package/lib/components/ErrorMessage.js +44 -9
  13. package/lib/components/Forms/DateField.js +61 -42
  14. package/lib/components/Forms/TimeField.js +81 -42
  15. package/lib/components/Forms/index.js +27 -4
  16. package/lib/components/Groups/CreateEditCopySaveButtons.js +114 -11
  17. package/lib/components/Groups/ExternalGroups/Attach.js +212 -148
  18. package/lib/components/Groups/ExternalGroups/Table.js +181 -45
  19. package/lib/components/Groups/GroupCreateOrEditCommonProps.js +5 -1
  20. package/lib/components/Groups/RosterSyncInfo.js +147 -20
  21. package/lib/components/HOC/AccessibleAppComponent.js +98 -73
  22. package/lib/components/HOC/ActivityRequiredComponent.js +92 -49
  23. package/lib/components/HOC/AsyncComponent.js +54 -39
  24. package/lib/components/HOC/AuthenticatedComponent.js +58 -38
  25. package/lib/components/HOC/CollectionComponent.js +170 -110
  26. package/lib/components/HOC/CollectionFirstItemComponent.js +51 -38
  27. package/lib/components/HOC/CollectionItemComponent.js +168 -106
  28. package/lib/components/HOC/ConnectedModalComponent.js +109 -80
  29. package/lib/components/HOC/DataDependentComponent.js +29 -21
  30. package/lib/components/HOC/EntityComponent.js +71 -57
  31. package/lib/components/HOC/FullscreenModalComponent.js +163 -123
  32. package/lib/components/HOC/GroupActivityRequiredComponent.js +45 -31
  33. package/lib/components/HOC/GuidComponent.js +29 -22
  34. package/lib/components/HOC/ModelContextDependencyVerifyComponent.js +41 -31
  35. package/lib/components/HOC/ModelErrorRedirectComponent.js +51 -47
  36. package/lib/components/HOC/SearchPersistorComponent.js +240 -166
  37. package/lib/components/HOC/UnauthenticatedComponent.js +37 -25
  38. package/lib/components/HOC/UserComponent.js +12 -7
  39. package/lib/components/Icons/IconAlphaList.js +33 -5
  40. package/lib/components/Icons/IconExternalUser.js +33 -5
  41. package/lib/components/Icons/IconImpersonation.js +33 -5
  42. package/lib/components/Icons/IconStopImpersonating.js +33 -5
  43. package/lib/components/Icons/IconTable.js +35 -7
  44. package/lib/components/Icons/IconTableDeleteCol.js +33 -5
  45. package/lib/components/Icons/IconTableDeleteRow.js +33 -5
  46. package/lib/components/Icons/IconTableInsertCol.js +33 -5
  47. package/lib/components/Icons/IconTableInsertRow.js +33 -5
  48. package/lib/components/Impersonation/Button.js +77 -13
  49. package/lib/components/Impersonation/Link.js +77 -13
  50. package/lib/components/Impersonation/UserDetail.js +66 -9
  51. package/lib/components/Loading.js +26 -4
  52. package/lib/components/LockDownBrowser/Check.js +194 -49
  53. package/lib/components/LockDownBrowser/ExitButton.js +26 -9
  54. package/lib/components/LockDownBrowser/Launch.js +70 -62
  55. package/lib/components/Lti/Confirm.js +152 -11
  56. package/lib/components/Lti/CreateNonLtiGroupAlertDialog.js +170 -33
  57. package/lib/components/Lti/Launch.js +105 -24
  58. package/lib/components/Lti/LaunchGroup.js +85 -13
  59. package/lib/components/ManageTable.js +309 -87
  60. package/lib/components/ManageTableNoDataComponent.js +42 -4
  61. package/lib/components/NewVersionAlert.js +82 -46
  62. package/lib/components/NotFound.js +86 -10
  63. package/lib/components/Notifications.js +185 -126
  64. package/lib/components/PaginationNextButton.js +33 -6
  65. package/lib/components/PaginationPreviousButton.js +33 -6
  66. package/lib/components/Quill/CustomToolbar.js +432 -218
  67. package/lib/components/Quill/Formats/Image.js +73 -63
  68. package/lib/components/Quill/Formats/List.js +45 -45
  69. package/lib/components/Quill/Formats/Video.js +28 -24
  70. package/lib/components/Quill/ImageDropModule.js +147 -117
  71. package/lib/components/Quill/ImageWarning.js +47 -9
  72. package/lib/components/Quill/ImageWithAltTextModal.js +425 -86
  73. package/lib/components/Quill/Specs/CustomImageSpec.js +42 -34
  74. package/lib/components/Quill/Specs/CustomVideoSpec.js +34 -28
  75. package/lib/components/Quill/TableModule/Blots/BaseTableBlot.js +98 -98
  76. package/lib/components/Quill/TableModule/Blots/TableBlot.js +52 -47
  77. package/lib/components/Quill/TableModule/Blots/TableBodyBlot.js +53 -48
  78. package/lib/components/Quill/TableModule/Blots/TableCellBlot.js +224 -221
  79. package/lib/components/Quill/TableModule/Blots/TableContainer.js +80 -83
  80. package/lib/components/Quill/TableModule/Blots/TableRowBlot.js +75 -70
  81. package/lib/components/Quill/TableModule/constants.js +45 -41
  82. package/lib/components/Quill/TableModule/index.js +362 -301
  83. package/lib/components/Quill/TableModule/utils.js +42 -38
  84. package/lib/components/Quill/accessibilityFix.js +234 -232
  85. package/lib/components/Quill/index.js +34 -28
  86. package/lib/components/RefreshIndicator/Bordered.js +47 -6
  87. package/lib/components/RefreshIndicator/Inline.js +47 -8
  88. package/lib/components/RefreshIndicator/index.js +263 -59
  89. package/lib/components/SearchControls.js +216 -11
  90. package/lib/components/SentryRoute.js +11 -6
  91. package/lib/components/Tables/RoleFilter.js +69 -32
  92. package/lib/components/Tables/TextFilter.js +62 -13
  93. package/lib/components/UserRoles/Add.js +199 -96
  94. package/lib/components/UserRoles/Context.js +11 -7
  95. package/lib/components/UserRoles/RoleCell.js +181 -72
  96. package/lib/components/UserRoles/Select.js +157 -17
  97. package/lib/components/UserRoles/Table.js +221 -80
  98. package/lib/components/UserRoles/index.js +534 -384
  99. package/lib/config/eslint/index.js +32 -28
  100. package/lib/config/eslint/lib/order.js +26 -27
  101. package/lib/config/eslint/lib/prettier.js +20 -18
  102. package/lib/config/eslint/lib/typescript.js +93 -112
  103. package/lib/config/eslint/react.js +24 -14
  104. package/lib/constants/baseActivity.js +30 -26
  105. package/lib/constants/baseRole.js +14 -10
  106. package/lib/constants/configuration.js +33 -29
  107. package/lib/constants/externalProviderType.js +10 -6
  108. package/lib/constants/fetchErrorData.js +15 -11
  109. package/lib/constants/index.js +137 -14
  110. package/lib/constants/lockDownBrowser.js +28 -24
  111. package/lib/constants/mockData.js +382 -297
  112. package/lib/constants/modelStatus.js +15 -11
  113. package/lib/constants/notificationType.js +12 -8
  114. package/lib/constants/operatingSystem.js +12 -8
  115. package/lib/constants/shard.js +11 -7
  116. package/lib/constants/table.js +21 -21
  117. package/lib/constants/tier.js +12 -8
  118. package/lib/constants/userRole.js +15 -5
  119. package/lib/endpointMappings.js +197 -181
  120. package/lib/hooks/useCollection.js +82 -62
  121. package/lib/hooks/useCollectionConfiguration.js +228 -83
  122. package/lib/hooks/useCollectionItem.js +154 -54
  123. package/lib/hooks/useGuid.js +20 -8
  124. package/lib/hooks/usePrevious.js +19 -13
  125. package/lib/index.js +157 -25
  126. package/lib/redux/actionCreator.js +50 -28
  127. package/lib/redux/actions/AuthAction.js +44 -31
  128. package/lib/redux/actions/ModalAction.js +10 -6
  129. package/lib/redux/actions/ModelAction.js +77 -39
  130. package/lib/redux/actions/NotificationAction.js +10 -6
  131. package/lib/redux/actions/SearchAction.js +9 -5
  132. package/lib/redux/actions/index.js +60 -7
  133. package/lib/redux/configureReducers.js +60 -49
  134. package/lib/redux/configureStore.js +83 -87
  135. package/lib/redux/helpers.js +6 -2
  136. package/lib/redux/reducers/authReducer.js +50 -43
  137. package/lib/redux/reducers/index.js +41 -13
  138. package/lib/redux/reducers/modalsReducer.js +47 -29
  139. package/lib/redux/reducers/modelsReducer.js +178 -173
  140. package/lib/redux/reducers/notificationsReducer.js +24 -18
  141. package/lib/redux/reducers/searchReducer.js +25 -19
  142. package/lib/redux/sagas/appInsightsSaga.js +22 -18
  143. package/lib/redux/sagas/authSaga.js +253 -218
  144. package/lib/redux/sagas/caliperSaga.js +159 -143
  145. package/lib/redux/sagas/clockOffsetSaga.js +34 -31
  146. package/lib/redux/sagas/configurationSaga.js +11 -7
  147. package/lib/redux/sagas/downtimeApiErrorSaga.js +20 -17
  148. package/lib/redux/sagas/errorSaga.js +27 -21
  149. package/lib/redux/sagas/googleAnalyticsSaga.js +28 -24
  150. package/lib/redux/sagas/identityProviderSaga.js +22 -18
  151. package/lib/redux/sagas/initialDataLoadSaga.js +37 -28
  152. package/lib/redux/sagas/lockDownBrowserErrorSaga.js +29 -20
  153. package/lib/redux/sagas/modelFetchSaga.js +355 -322
  154. package/lib/redux/sagas/noStoreSaga.js +61 -48
  155. package/lib/redux/sagas/postLoginDataSaga.js +45 -34
  156. package/lib/redux/sagas/postLoginRedirectSaga.js +27 -27
  157. package/lib/redux/sagas/rootSaga.js +82 -57
  158. package/lib/redux/sagas/sentrySaga.js +29 -25
  159. package/lib/redux/sagas/userIdSaga.js +16 -12
  160. package/lib/services/codeProviderService.js +25 -19
  161. package/lib/services/dateService.js +12 -7
  162. package/lib/services/documentService.js +17 -12
  163. package/lib/services/fetchService.js +129 -112
  164. package/lib/services/persistenceService.js +33 -29
  165. package/lib/services/ticketProviderService.js +29 -23
  166. package/lib/services/tokenPersistenceService.js +12 -8
  167. package/lib/services/windowService.js +18 -14
  168. package/lib/startup.js +132 -114
  169. package/lib/types/AppConfiguration.js +5 -1
  170. package/lib/types/Artifact.js +11 -7
  171. package/lib/types/BaseReduxState.js +5 -1
  172. package/lib/types/Client.js +5 -1
  173. package/lib/types/Collection.js +5 -1
  174. package/lib/types/Configuration.js +5 -1
  175. package/lib/types/DeepLinkingResponseRequest.js +5 -1
  176. package/lib/types/DeletableModel.js +5 -1
  177. package/lib/types/Event.js +5 -1
  178. package/lib/types/ExternalGroup.js +5 -1
  179. package/lib/types/ExternalProvider.js +5 -1
  180. package/lib/types/ExternalTerm.js +5 -1
  181. package/lib/types/Group.js +5 -1
  182. package/lib/types/IdentityProvider.js +5 -1
  183. package/lib/types/LtiLaunch.js +5 -1
  184. package/lib/types/NameOnlyEntity.js +5 -1
  185. package/lib/types/Notification.js +5 -1
  186. package/lib/types/OptionalRecord.js +5 -1
  187. package/lib/types/OwnerSchedule.js +5 -1
  188. package/lib/types/PropertyOfType.js +5 -1
  189. package/lib/types/Quill.js +5 -1
  190. package/lib/types/RoleDescription.js +5 -1
  191. package/lib/types/Search.js +5 -1
  192. package/lib/types/SimpleLocation.js +5 -1
  193. package/lib/types/UniTime.js +5 -1
  194. package/lib/types/User.js +5 -1
  195. package/lib/types/UserRole.js +5 -1
  196. package/lib/types/auth/AuthState.js +5 -1
  197. package/lib/types/auth/CasV1LoginRequestBody.js +5 -1
  198. package/lib/types/auth/ClientCredentials.js +5 -1
  199. package/lib/types/auth/CodeProviderService.js +5 -1
  200. package/lib/types/auth/LocalLoginRequestBody.js +5 -1
  201. package/lib/types/auth/TicketProviderService.js +5 -1
  202. package/lib/types/auth/TokenPersistenceService.js +5 -1
  203. package/lib/types/auth/index.js +82 -9
  204. package/lib/types/externals.d.js +2 -0
  205. package/lib/types/index.js +313 -30
  206. package/lib/types/net/EndpointConfig.js +5 -1
  207. package/lib/types/net/EndpointMapping.js +5 -1
  208. package/lib/types/net/EndpointMappings.js +5 -1
  209. package/lib/types/net/ErrorHandler.js +5 -1
  210. package/lib/types/net/FetchConfig.js +5 -1
  211. package/lib/types/net/FetchErrorData.js +10 -6
  212. package/lib/types/net/FetchResult.js +5 -1
  213. package/lib/types/net/HTTPMethod.js +5 -1
  214. package/lib/types/net/HTTPStatusCode.js +16 -12
  215. package/lib/types/net/Metadata.js +5 -1
  216. package/lib/types/net/Model.js +5 -1
  217. package/lib/types/net/ModelCollection.js +5 -1
  218. package/lib/types/net/ModelsState.js +5 -1
  219. package/lib/types/net/OAuthToken.js +5 -1
  220. package/lib/types/net/OAuthTokenOrNull.js +5 -1
  221. package/lib/types/net/TokenAccessFunction.js +5 -1
  222. package/lib/types/net/index.js +181 -18
  223. package/lib/utils/baseActivity.js +133 -123
  224. package/lib/utils/baseRole.js +37 -33
  225. package/lib/utils/collection.js +425 -298
  226. package/lib/utils/cookies.js +22 -19
  227. package/lib/utils/date.js +303 -279
  228. package/lib/utils/dom.js +176 -165
  229. package/lib/utils/domainIdentifier.js +9 -5
  230. package/lib/utils/entityUserRole.js +6 -2
  231. package/lib/utils/error.js +17 -15
  232. package/lib/utils/events.js +40 -31
  233. package/lib/utils/externalGroup.js +22 -18
  234. package/lib/utils/externalProviders.js +8 -4
  235. package/lib/utils/externalTerms.js +10 -3
  236. package/lib/utils/fetch.js +179 -180
  237. package/lib/utils/group.js +18 -7
  238. package/lib/utils/groupDates.js +37 -33
  239. package/lib/utils/groupRoles.js +25 -21
  240. package/lib/utils/lockDownBrowser.js +15 -11
  241. package/lib/utils/logger.js +26 -22
  242. package/lib/utils/lti.js +9 -4
  243. package/lib/utils/model.js +36 -41
  244. package/lib/utils/number.js +21 -18
  245. package/lib/utils/promise.js +28 -21
  246. package/lib/utils/quill.js +65 -62
  247. package/lib/utils/route.js +58 -55
  248. package/lib/utils/search.js +76 -80
  249. package/lib/utils/shard.js +37 -37
  250. package/lib/utils/sort.js +50 -42
  251. package/lib/utils/string.js +13 -8
  252. package/lib/utils/table.js +38 -33
  253. package/lib/utils/timezone.js +10 -6
  254. package/lib/utils/url.js +142 -142
  255. package/lib/utils/user.js +58 -55
  256. package/lib/utils/userAgent.js +10 -10
  257. package/lib/utils/userRole.js +57 -49
  258. package/package.json +17 -3
@@ -1,351 +1,436 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.badRequestFullErrorData = exports.badRequestErrorData = exports.unauthorizedErrorData = exports.forbiddenErrorData = exports.requestTimedOutErrorData = exports.internalServerErrorData = exports.defaultExternalTerms = exports.defaultExternalProviders = exports.defaultGroup = exports.defaultAdminUserRoles = exports.defaultGroupUserRoles = exports.defaultGroupGrader = exports.defaultExternalGroupLearner = exports.defaultGroupLearner = exports.defaultNamedGroupLearner = exports.defaultNamelessGroupLearner = exports.defaultGroupOwner = exports.defaultGroupOwnerUserInfo = exports.defaultNamedUserInfo = exports.defaultNamelessUserInfo = exports.defaultUser = exports.defaultDate = exports.currentDates = exports.pastDates = exports.defaultLocation = exports.defaultAppConfiguration = void 0;
4
- exports.mockHistory = mockHistory;
5
- exports.mockUser = mockUser;
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.internalServerErrorData = exports.forbiddenErrorData = exports.defaultUser = exports.defaultNamelessUserInfo = exports.defaultNamelessGroupLearner = exports.defaultNamedUserInfo = exports.defaultNamedGroupLearner = exports.defaultLocation = exports.defaultGroupUserRoles = exports.defaultGroupOwnerUserInfo = exports.defaultGroupOwner = exports.defaultGroupLearner = exports.defaultGroupGrader = exports.defaultGroup = exports.defaultExternalTerms = exports.defaultExternalProviders = exports.defaultExternalGroupLearner = exports.defaultDate = exports.defaultAppConfiguration = exports.defaultAdminUserRoles = exports.currentDates = exports.badRequestFullErrorData = exports.badRequestErrorData = void 0;
6
7
  exports.mockGroups = mockGroups;
7
- exports.mockSyncedGroups = mockSyncedGroups;
8
+ exports.mockHistory = mockHistory;
8
9
  exports.mockLtiGroups = mockLtiGroups;
9
- exports.mockTermGroups = mockTermGroups;
10
- exports.mockTermAndUniTimeGroups = mockTermAndUniTimeGroups;
11
- exports.mockPastGroups = mockPastGroups;
12
10
  exports.mockPastAndCurrentGroups = mockPastAndCurrentGroups;
13
- const lodash_1 = require("lodash");
14
- const externalProviderType_1 = require("../constants/externalProviderType");
15
- const types_1 = require("../types");
16
- const baseRole_1 = require("./baseRole");
17
- const tier_1 = require("./tier");
11
+ exports.mockPastGroups = mockPastGroups;
12
+ exports.mockSyncedGroups = mockSyncedGroups;
13
+ exports.mockTermAndUniTimeGroups = mockTermAndUniTimeGroups;
14
+ exports.mockTermGroups = mockTermGroups;
15
+ exports.mockUser = mockUser;
16
+ exports.unauthorizedErrorData = exports.requestTimedOutErrorData = exports.pastDates = void 0;
17
+ var _lodash = require("lodash");
18
+ var _externalProviderType = require("../constants/externalProviderType");
19
+ var _types = require("../types");
20
+ var _baseRole = require("./baseRole");
21
+ var _tier = require("./tier");
18
22
  //#region General
19
- exports.defaultAppConfiguration = {
20
- NODE_ENV: 'test',
21
- APP_NAME: 'StudioKit',
22
- TIER: tier_1.TIER.LOCAL,
23
- API_BASE_URL: '',
24
- ROOT_DOMAIN: 'studiokit.org',
25
- CLIENT_ID: 'web',
26
- CLIENT_SECRET: '****',
27
- IS_DOWNTIME: false,
28
- LMS_NAME: 'Brightspace',
29
- GRADABLE_DESCRIPTOR: 'assessment'
23
+
24
+ const defaultAppConfiguration = exports.defaultAppConfiguration = {
25
+ NODE_ENV: 'test',
26
+ APP_NAME: 'StudioKit',
27
+ TIER: _tier.TIER.LOCAL,
28
+ API_BASE_URL: '',
29
+ ROOT_DOMAIN: 'studiokit.org',
30
+ CLIENT_ID: 'web',
31
+ CLIENT_SECRET: '****',
32
+ IS_DOWNTIME: false,
33
+ LMS_NAME: 'Brightspace',
34
+ GRADABLE_DESCRIPTOR: 'assessment'
30
35
  };
31
- exports.defaultLocation = {
32
- hash: '',
33
- host: 'purdue.dev.studiokit.org',
34
- hostname: 'purdue.dev.studiokit.org',
35
- href: 'https://purdue.dev.studiokit.org/',
36
- pathname: '/',
37
- port: '',
38
- protocol: 'https:',
39
- search: ''
36
+ const defaultLocation = exports.defaultLocation = {
37
+ hash: '',
38
+ host: 'purdue.dev.studiokit.org',
39
+ hostname: 'purdue.dev.studiokit.org',
40
+ href: 'https://purdue.dev.studiokit.org/',
41
+ pathname: '/',
42
+ port: '',
43
+ protocol: 'https:',
44
+ search: ''
40
45
  };
41
46
  function mockHistory() {
42
- return {
43
- length: 0,
44
- scrollRestoration: 'auto',
45
- state: {},
46
- back: jest.fn(),
47
- forward: jest.fn(),
48
- go: jest.fn(),
49
- pushState: jest.fn(),
50
- replaceState: jest.fn()
51
- };
47
+ return {
48
+ length: 0,
49
+ scrollRestoration: 'auto',
50
+ state: {},
51
+ back: jest.fn(),
52
+ forward: jest.fn(),
53
+ go: jest.fn(),
54
+ pushState: jest.fn(),
55
+ replaceState: jest.fn()
56
+ };
52
57
  }
58
+
53
59
  //#endregion General
60
+
54
61
  //#region Dates
62
+
55
63
  /** 5/15/18 - 8/14/18 */
56
- exports.pastDates = {
57
- startDate: '2018-05-15T04:00:00.000Z',
58
- endDate: '2018-08-15T03:59:59.999Z'
64
+ const pastDates = exports.pastDates = {
65
+ startDate: '2018-05-15T04:00:00.000Z',
66
+ endDate: '2018-08-15T03:59:59.999Z'
59
67
  };
68
+
60
69
  /** 8/15/18 - 12/31/18: */
61
- exports.currentDates = {
62
- startDate: '2018-08-15T04:00:00.000Z',
63
- endDate: '2019-01-01T04:59:59.999Z'
70
+ const currentDates = exports.currentDates = {
71
+ startDate: '2018-08-15T04:00:00.000Z',
72
+ endDate: '2019-01-01T04:59:59.999Z'
64
73
  };
65
- /**
66
- * The default date and time for all tests. Used by the 'mockdate' package. One month into `currentDates`.
74
+
75
+ /**
76
+ * The default date and time for all tests. Used by the 'mockdate' package. One month into `currentDates`.
67
77
  */
68
- exports.defaultDate = '2018-09-15T04:00:00.000Z';
78
+ const defaultDate = exports.defaultDate = '2018-09-15T04:00:00.000Z';
79
+
69
80
  //#endregion Dates
81
+
70
82
  //#region Users
71
- exports.defaultUser = {
72
- userInfo: {
73
- id: '1',
74
- firstName: null,
75
- lastName: null,
76
- email: null,
77
- uid: null,
78
- activities: [],
79
- roles: [],
80
- dateDemoGenerationSucceeded: null,
81
- dateStored: exports.defaultDate,
82
- dateLastUpdated: exports.defaultDate,
83
- isImpersonated: false,
84
- careerAccountAlias: null,
85
- employeeNumber: null,
86
- userName: 'test',
87
- puid: null,
88
- lockDownBrowserTestLaunchUrl: null
89
- }
83
+
84
+ const defaultUser = exports.defaultUser = {
85
+ userInfo: {
86
+ id: '1',
87
+ firstName: null,
88
+ lastName: null,
89
+ email: null,
90
+ uid: null,
91
+ activities: [],
92
+ roles: [],
93
+ dateDemoGenerationSucceeded: null,
94
+ dateStored: defaultDate,
95
+ dateLastUpdated: defaultDate,
96
+ isImpersonated: false,
97
+ careerAccountAlias: null,
98
+ employeeNumber: null,
99
+ userName: 'test',
100
+ puid: null,
101
+ lockDownBrowserTestLaunchUrl: null
102
+ }
90
103
  };
91
- exports.defaultNamelessUserInfo = Object.assign(Object.assign({}, exports.defaultUser.userInfo), {
104
+ const defaultNamelessUserInfo = exports.defaultNamelessUserInfo = {
105
+ ...defaultUser.userInfo,
106
+ ...{
92
107
  email: 'nicki@minaj.superbass',
93
108
  uid: 'nm-nameless'
94
- });
95
- exports.defaultNamedUserInfo = Object.assign(Object.assign({}, exports.defaultUser.userInfo), {
109
+ }
110
+ };
111
+ const defaultNamedUserInfo = exports.defaultNamedUserInfo = {
112
+ ...defaultUser.userInfo,
113
+ ...{
96
114
  firstName: 'Nicki',
97
115
  lastName: 'Minaj',
98
116
  uid: 'nm-named'
99
- });
100
- function mockUser(activities = []) {
101
- return (0, lodash_1.merge)({ userInfo: { activities } }, exports.defaultUser);
117
+ }
118
+ };
119
+ function mockUser() {
120
+ let activities = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
121
+ return (0, _lodash.merge)({
122
+ userInfo: {
123
+ activities
124
+ }
125
+ }, defaultUser);
102
126
  }
103
- exports.defaultGroupOwnerUserInfo = Object.assign(Object.assign({}, exports.defaultUser.userInfo), { id: '2', firstName: 'Jane', lastName: 'Doe', email: 'jane@gmail.com' });
104
- exports.defaultGroupOwner = {
105
- id: '1',
106
- userId: '2',
107
- firstName: 'Jane',
108
- lastName: 'Doe',
109
- email: 'jane@gmail.com',
110
- uid: 'jane',
111
- entityId: 1,
112
- role: baseRole_1.BASE_ROLE.GROUP_OWNER,
113
- isExternal: false
127
+ const defaultGroupOwnerUserInfo = exports.defaultGroupOwnerUserInfo = {
128
+ ...defaultUser.userInfo,
129
+ id: '2',
130
+ firstName: 'Jane',
131
+ lastName: 'Doe',
132
+ email: 'jane@gmail.com'
114
133
  };
115
- exports.defaultNamelessGroupLearner = {
116
- id: '2',
117
- userId: '3',
118
- firstName: null,
119
- lastName: null,
120
- email: 'nicki@minaj.superbass',
121
- uid: 'nm-nameless',
122
- entityId: 1,
123
- role: baseRole_1.BASE_ROLE.GROUP_LEARNER,
124
- isExternal: false
134
+ const defaultGroupOwner = exports.defaultGroupOwner = {
135
+ id: '1',
136
+ userId: '2',
137
+ firstName: 'Jane',
138
+ lastName: 'Doe',
139
+ email: 'jane@gmail.com',
140
+ uid: 'jane',
141
+ entityId: 1,
142
+ role: _baseRole.BASE_ROLE.GROUP_OWNER,
143
+ isExternal: false
125
144
  };
126
- exports.defaultNamedGroupLearner = {
127
- id: '3',
128
- userId: '4',
129
- firstName: 'Nicki',
130
- lastName: 'Minaj',
131
- email: null,
132
- uid: 'nm-named',
133
- entityId: 1,
134
- role: baseRole_1.BASE_ROLE.GROUP_LEARNER,
135
- isExternal: false
145
+ const defaultNamelessGroupLearner = exports.defaultNamelessGroupLearner = {
146
+ id: '2',
147
+ userId: '3',
148
+ firstName: null,
149
+ lastName: null,
150
+ email: 'nicki@minaj.superbass',
151
+ uid: 'nm-nameless',
152
+ entityId: 1,
153
+ role: _baseRole.BASE_ROLE.GROUP_LEARNER,
154
+ isExternal: false
136
155
  };
137
- exports.defaultGroupLearner = {
138
- id: '4',
139
- userId: '5',
140
- firstName: 'Joe',
141
- lastName: 'Schmoe',
142
- email: 'nope@gmail.com',
143
- uid: 'nope',
144
- entityId: 1,
145
- role: baseRole_1.BASE_ROLE.GROUP_LEARNER,
146
- isExternal: false
156
+ const defaultNamedGroupLearner = exports.defaultNamedGroupLearner = {
157
+ id: '3',
158
+ userId: '4',
159
+ firstName: 'Nicki',
160
+ lastName: 'Minaj',
161
+ email: null,
162
+ uid: 'nm-named',
163
+ entityId: 1,
164
+ role: _baseRole.BASE_ROLE.GROUP_LEARNER,
165
+ isExternal: false
147
166
  };
148
- exports.defaultExternalGroupLearner = {
149
- id: '5',
150
- userId: '6',
151
- firstName: 'Bob',
152
- lastName: 'Loblaw',
153
- email: 'bobloblaw@lawblog.com',
154
- uid: 'bobloblaw',
155
- entityId: 1,
156
- role: baseRole_1.BASE_ROLE.GROUP_LEARNER,
157
- isExternal: true
167
+ const defaultGroupLearner = exports.defaultGroupLearner = {
168
+ id: '4',
169
+ userId: '5',
170
+ firstName: 'Joe',
171
+ lastName: 'Schmoe',
172
+ email: 'nope@gmail.com',
173
+ uid: 'nope',
174
+ entityId: 1,
175
+ role: _baseRole.BASE_ROLE.GROUP_LEARNER,
176
+ isExternal: false
158
177
  };
159
- exports.defaultGroupGrader = {
160
- id: '6',
161
- userId: '7',
162
- firstName: 'Grader',
163
- lastName: 'McGradeface',
164
- email: 'grader@gmail.com',
165
- uid: 'grader',
166
- entityId: 1,
167
- role: baseRole_1.BASE_ROLE.GROUP_GRADER,
168
- isExternal: false
178
+ const defaultExternalGroupLearner = exports.defaultExternalGroupLearner = {
179
+ id: '5',
180
+ userId: '6',
181
+ firstName: 'Bob',
182
+ lastName: 'Loblaw',
183
+ email: 'bobloblaw@lawblog.com',
184
+ uid: 'bobloblaw',
185
+ entityId: 1,
186
+ role: _baseRole.BASE_ROLE.GROUP_LEARNER,
187
+ isExternal: true
169
188
  };
170
- exports.defaultGroupUserRoles = [exports.defaultGroupOwner, exports.defaultGroupLearner, exports.defaultExternalGroupLearner];
171
- exports.defaultAdminUserRoles = [
172
- {
173
- id: '1',
174
- firstName: 'Joe',
175
- lastName: 'Schmo',
176
- email: null,
177
- uid: null,
178
- role: baseRole_1.BASE_ROLE.ADMIN
179
- },
180
- {
181
- id: '2',
182
- firstName: null,
183
- lastName: null,
184
- email: 'carlysimon@clouds.in.coffee',
185
- uid: 'carlysimon',
186
- role: baseRole_1.BASE_ROLE.ADMIN
187
- }
188
- ];
189
+ const defaultGroupGrader = exports.defaultGroupGrader = {
190
+ id: '6',
191
+ userId: '7',
192
+ firstName: 'Grader',
193
+ lastName: 'McGradeface',
194
+ email: 'grader@gmail.com',
195
+ uid: 'grader',
196
+ entityId: 1,
197
+ role: _baseRole.BASE_ROLE.GROUP_GRADER,
198
+ isExternal: false
199
+ };
200
+ const defaultGroupUserRoles = exports.defaultGroupUserRoles = [defaultGroupOwner, defaultGroupLearner, defaultExternalGroupLearner];
201
+ const defaultAdminUserRoles = exports.defaultAdminUserRoles = [{
202
+ id: '1',
203
+ firstName: 'Joe',
204
+ lastName: 'Schmo',
205
+ email: null,
206
+ uid: null,
207
+ role: _baseRole.BASE_ROLE.ADMIN
208
+ }, {
209
+ id: '2',
210
+ firstName: null,
211
+ lastName: null,
212
+ email: 'carlysimon@clouds.in.coffee',
213
+ uid: 'carlysimon',
214
+ role: _baseRole.BASE_ROLE.ADMIN
215
+ }];
216
+
189
217
  //#endregion Users
218
+
190
219
  //#region Groups
191
- exports.defaultGroup = {
192
- roles: [],
193
- activities: [],
194
- owners: [
195
- {
196
- id: '1',
197
- entityId: 1,
198
- firstName: 'Instructor',
199
- lastName: 'McInstructor',
200
- email: null,
201
- uid: null
202
- }
203
- ],
204
- graders: [],
205
- id: 1,
206
- name: 'McGroup',
207
- externalTermId: null,
208
- startDate: exports.currentDates.startDate,
209
- endDate: exports.currentDates.endDate,
210
- isDeleted: false,
211
- isRosterSyncEnabled: false,
212
- externalGroups: []
220
+
221
+ const defaultGroup = exports.defaultGroup = {
222
+ roles: [],
223
+ activities: [],
224
+ owners: [{
225
+ id: '1',
226
+ entityId: 1,
227
+ firstName: 'Instructor',
228
+ lastName: 'McInstructor',
229
+ email: null,
230
+ uid: null
231
+ }],
232
+ graders: [],
233
+ id: 1,
234
+ name: 'McGroup',
235
+ externalTermId: null,
236
+ startDate: currentDates.startDate,
237
+ endDate: currentDates.endDate,
238
+ isDeleted: false,
239
+ isRosterSyncEnabled: false,
240
+ externalGroups: []
213
241
  };
214
- function mockGroups(activities = [], roles = []) {
215
- return { '1': (0, lodash_1.merge)({ activities, roles }, exports.defaultGroup) };
242
+ function mockGroups() {
243
+ let activities = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
244
+ let roles = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
245
+ return {
246
+ '1': (0, _lodash.merge)({
247
+ activities,
248
+ roles
249
+ }, defaultGroup)
250
+ };
216
251
  }
217
- function mockSyncedGroups(activities = [], roles = []) {
218
- const rosterSyncEnabledGroup = (0, lodash_1.merge)({ activities, roles }, exports.defaultGroup);
219
- rosterSyncEnabledGroup.isRosterSyncEnabled = true;
220
- return { '1': rosterSyncEnabledGroup };
252
+ function mockSyncedGroups() {
253
+ let activities = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
254
+ let roles = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
255
+ const rosterSyncEnabledGroup = (0, _lodash.merge)({
256
+ activities,
257
+ roles
258
+ }, defaultGroup);
259
+ rosterSyncEnabledGroup.isRosterSyncEnabled = true;
260
+ return {
261
+ '1': rosterSyncEnabledGroup
262
+ };
221
263
  }
222
- function mockLtiGroups(activities = [], roles = []) {
223
- const ltiGroup = (0, lodash_1.merge)({ activities, roles }, exports.defaultGroup);
224
- ltiGroup.isRosterSyncEnabled = true;
225
- ltiGroup.externalGroups = [
226
- {
227
- id: 1,
228
- externalProviderId: 2,
229
- groupId: 1,
230
- userId: '1',
231
- name: 'LTI ExternalGroup',
232
- description: 'LTI 101',
233
- gradesUrl: 'www.lti.org',
234
- rosterUrl: null,
235
- isAutoGradePushEnabled: false,
236
- externalId: '1',
237
- typename: 'ExternalGroup'
238
- }
239
- ];
240
- return { '1': ltiGroup };
264
+ function mockLtiGroups() {
265
+ let activities = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
266
+ let roles = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
267
+ const ltiGroup = (0, _lodash.merge)({
268
+ activities,
269
+ roles
270
+ }, defaultGroup);
271
+ ltiGroup.isRosterSyncEnabled = true;
272
+ ltiGroup.externalGroups = [{
273
+ id: 1,
274
+ externalProviderId: 2,
275
+ groupId: 1,
276
+ userId: '1',
277
+ name: 'LTI ExternalGroup',
278
+ description: 'LTI 101',
279
+ gradesUrl: 'www.lti.org',
280
+ rosterUrl: null,
281
+ isAutoGradePushEnabled: false,
282
+ externalId: '1',
283
+ typename: 'ExternalGroup'
284
+ }];
285
+ return {
286
+ '1': ltiGroup
287
+ };
241
288
  }
242
- function mockTermGroups(activities = [], roles = []) {
243
- const group = (0, lodash_1.merge)({ activities, roles }, exports.defaultGroup);
244
- group.startDate = null;
245
- group.endDate = null;
246
- group.externalTermId = 1;
247
- return { '1': group };
289
+ function mockTermGroups() {
290
+ let activities = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
291
+ let roles = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
292
+ const group = (0, _lodash.merge)({
293
+ activities,
294
+ roles
295
+ }, defaultGroup);
296
+ group.startDate = null;
297
+ group.endDate = null;
298
+ group.externalTermId = 1;
299
+ return {
300
+ '1': group
301
+ };
248
302
  }
249
- function mockTermAndUniTimeGroups(activities = [], roles = []) {
250
- const group = (0, lodash_1.merge)({ activities, roles }, exports.defaultGroup);
251
- group.startDate = null;
252
- group.endDate = null;
253
- group.externalTermId = 1;
254
- group.externalGroups = [
255
- {
256
- id: 1,
257
- externalProviderId: 1,
258
- groupId: 1,
259
- userId: '1',
260
- name: 'UniTime ExternalGroup',
261
- description: 'UniTime 101',
262
- gradesUrl: null,
263
- rosterUrl: null,
264
- isAutoGradePushEnabled: false,
265
- externalId: '1',
266
- typename: 'ExternalGroup'
267
- }
268
- ];
269
- return { '1': group };
303
+ function mockTermAndUniTimeGroups() {
304
+ let activities = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
305
+ let roles = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
306
+ const group = (0, _lodash.merge)({
307
+ activities,
308
+ roles
309
+ }, defaultGroup);
310
+ group.startDate = null;
311
+ group.endDate = null;
312
+ group.externalTermId = 1;
313
+ group.externalGroups = [{
314
+ id: 1,
315
+ externalProviderId: 1,
316
+ groupId: 1,
317
+ userId: '1',
318
+ name: 'UniTime ExternalGroup',
319
+ description: 'UniTime 101',
320
+ gradesUrl: null,
321
+ rosterUrl: null,
322
+ isAutoGradePushEnabled: false,
323
+ externalId: '1',
324
+ typename: 'ExternalGroup'
325
+ }];
326
+ return {
327
+ '1': group
328
+ };
270
329
  }
271
- function mockPastGroups(activities = [], roles = []) {
272
- const pastGroup = (0, lodash_1.merge)({ activities, roles }, exports.defaultGroup, exports.pastDates);
273
- return { '1': pastGroup };
330
+ function mockPastGroups() {
331
+ let activities = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
332
+ let roles = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
333
+ const pastGroup = (0, _lodash.merge)({
334
+ activities,
335
+ roles
336
+ }, defaultGroup, pastDates);
337
+ return {
338
+ '1': pastGroup
339
+ };
274
340
  }
275
- function mockPastAndCurrentGroups(activities = [], roles = []) {
276
- const pastGroup = (0, lodash_1.merge)({ activities, roles }, exports.defaultGroup, exports.pastDates);
277
- const currentGroup = (0, lodash_1.merge)({ activities, roles }, exports.defaultGroup, {
278
- id: '2'
279
- }, exports.currentDates);
280
- return { '1': pastGroup, '2': currentGroup };
341
+ function mockPastAndCurrentGroups() {
342
+ let activities = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
343
+ let roles = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
344
+ const pastGroup = (0, _lodash.merge)({
345
+ activities,
346
+ roles
347
+ }, defaultGroup, pastDates);
348
+ const currentGroup = (0, _lodash.merge)({
349
+ activities,
350
+ roles
351
+ }, defaultGroup, {
352
+ id: '2'
353
+ }, currentDates);
354
+ return {
355
+ '1': pastGroup,
356
+ '2': currentGroup
357
+ };
281
358
  }
359
+
282
360
  //#endregion Groups
361
+
283
362
  //#region ExternalTerms + ExternalProviders
284
- exports.defaultExternalProviders = {
285
- '1': {
286
- id: 1,
287
- typename: externalProviderType_1.EXTERNAL_PROVIDER_TYPE.UNITIME,
288
- termSyncEnabled: true,
289
- rosterSyncEnabled: true,
290
- gradePushEnabled: false,
291
- shouldDisplayCreateNonLtiGroupAlert: false
292
- },
293
- '2': {
294
- id: 2,
295
- typename: externalProviderType_1.EXTERNAL_PROVIDER_TYPE.LTI,
296
- termSyncEnabled: false,
297
- rosterSyncEnabled: false,
298
- gradePushEnabled: true,
299
- shouldDisplayCreateNonLtiGroupAlert: true
300
- }
363
+
364
+ const defaultExternalProviders = exports.defaultExternalProviders = {
365
+ '1': {
366
+ id: 1,
367
+ typename: _externalProviderType.EXTERNAL_PROVIDER_TYPE.UNITIME,
368
+ termSyncEnabled: true,
369
+ rosterSyncEnabled: true,
370
+ gradePushEnabled: false,
371
+ shouldDisplayCreateNonLtiGroupAlert: false
372
+ },
373
+ '2': {
374
+ id: 2,
375
+ typename: _externalProviderType.EXTERNAL_PROVIDER_TYPE.LTI,
376
+ termSyncEnabled: false,
377
+ rosterSyncEnabled: false,
378
+ gradePushEnabled: true,
379
+ shouldDisplayCreateNonLtiGroupAlert: true
380
+ }
301
381
  };
302
- exports.defaultExternalTerms = {
303
- '1': {
304
- id: 1,
305
- externalProviderId: 1,
306
- externalId: 'foo',
307
- name: 'UniTime Fall Term',
308
- startDate: exports.currentDates.startDate,
309
- endDate: exports.currentDates.endDate
310
- }
382
+ const defaultExternalTerms = exports.defaultExternalTerms = {
383
+ '1': {
384
+ id: 1,
385
+ externalProviderId: 1,
386
+ externalId: 'foo',
387
+ name: 'UniTime Fall Term',
388
+ startDate: currentDates.startDate,
389
+ endDate: currentDates.endDate
390
+ }
311
391
  };
392
+
312
393
  //#endregion ExternalTerms + ExternalProviders
394
+
313
395
  //#region FetchErrorData
314
- exports.internalServerErrorData = {
315
- status: types_1.HTTP_STATUS_CODE.INTERNAL_SERVER_ERROR,
316
- title: 'Error',
317
- detail: 'An error has occurred.'
396
+
397
+ const internalServerErrorData = exports.internalServerErrorData = {
398
+ status: _types.HTTP_STATUS_CODE.INTERNAL_SERVER_ERROR,
399
+ title: 'Error',
400
+ detail: 'An error has occurred.'
318
401
  };
319
- exports.requestTimedOutErrorData = {
320
- status: types_1.HTTP_STATUS_CODE.REQUEST_TIMEOUT,
321
- title: 'Request Timeout',
322
- detail: null
402
+ const requestTimedOutErrorData = exports.requestTimedOutErrorData = {
403
+ status: _types.HTTP_STATUS_CODE.REQUEST_TIMEOUT,
404
+ title: 'Request Timeout',
405
+ detail: null
323
406
  };
324
- exports.forbiddenErrorData = {
325
- status: types_1.HTTP_STATUS_CODE.FORBIDDEN,
326
- title: 'Forbidden',
327
- detail: 'Your request has been denied. You do not have access.'
407
+ const forbiddenErrorData = exports.forbiddenErrorData = {
408
+ status: _types.HTTP_STATUS_CODE.FORBIDDEN,
409
+ title: 'Forbidden',
410
+ detail: 'Your request has been denied. You do not have access.'
328
411
  };
329
- exports.unauthorizedErrorData = {
330
- status: types_1.HTTP_STATUS_CODE.UNAUTHORIZED,
331
- title: 'Unauthorized',
332
- detail: 'Your request is unauthorized. You must authenticate.'
412
+ const unauthorizedErrorData = exports.unauthorizedErrorData = {
413
+ status: _types.HTTP_STATUS_CODE.UNAUTHORIZED,
414
+ title: 'Unauthorized',
415
+ detail: 'Your request is unauthorized. You must authenticate.'
333
416
  };
334
- exports.badRequestErrorData = {
335
- status: types_1.HTTP_STATUS_CODE.BAD_REQUEST,
336
- title: 'Bad Request',
337
- detail: 'Reasons'
417
+ const badRequestErrorData = exports.badRequestErrorData = {
418
+ status: _types.HTTP_STATUS_CODE.BAD_REQUEST,
419
+ title: 'Bad Request',
420
+ detail: 'Reasons'
338
421
  };
339
- exports.badRequestFullErrorData = {
340
- status: types_1.HTTP_STATUS_CODE.BAD_REQUEST,
341
- title: 'Bad Request',
342
- detail: 'Reasons',
343
- // include all optional properties
344
- type: 'https://tools.ietf.org/html/rfc7231#section-6.5.1',
345
- instance: 'instance',
346
- traceId: '00-3914b43b452b94e3ff4c327922880a03-4cfed6fe42afdd8f-00',
347
- errors: {
348
- password: ['The Password must be at least 6 characters long.']
349
- }
422
+ const badRequestFullErrorData = exports.badRequestFullErrorData = {
423
+ status: _types.HTTP_STATUS_CODE.BAD_REQUEST,
424
+ title: 'Bad Request',
425
+ detail: 'Reasons',
426
+ // include all optional properties
427
+ type: 'https://tools.ietf.org/html/rfc7231#section-6.5.1',
428
+ instance: 'instance',
429
+ traceId: '00-3914b43b452b94e3ff4c327922880a03-4cfed6fe42afdd8f-00',
430
+ errors: {
431
+ password: ['The Password must be at least 6 characters long.']
432
+ }
350
433
  };
434
+
351
435
  //#endregion FetchErrorData
436
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwicmVxdWlyZSIsIl9leHRlcm5hbFByb3ZpZGVyVHlwZSIsIl90eXBlcyIsIl9iYXNlUm9sZSIsIl90aWVyIiwiZGVmYXVsdEFwcENvbmZpZ3VyYXRpb24iLCJleHBvcnRzIiwiTk9ERV9FTlYiLCJBUFBfTkFNRSIsIlRJRVIiLCJMT0NBTCIsIkFQSV9CQVNFX1VSTCIsIlJPT1RfRE9NQUlOIiwiQ0xJRU5UX0lEIiwiQ0xJRU5UX1NFQ1JFVCIsIklTX0RPV05USU1FIiwiTE1TX05BTUUiLCJHUkFEQUJMRV9ERVNDUklQVE9SIiwiZGVmYXVsdExvY2F0aW9uIiwiaGFzaCIsImhvc3QiLCJob3N0bmFtZSIsImhyZWYiLCJwYXRobmFtZSIsInBvcnQiLCJwcm90b2NvbCIsInNlYXJjaCIsIm1vY2tIaXN0b3J5IiwibGVuZ3RoIiwic2Nyb2xsUmVzdG9yYXRpb24iLCJzdGF0ZSIsImJhY2siLCJqZXN0IiwiZm4iLCJmb3J3YXJkIiwiZ28iLCJwdXNoU3RhdGUiLCJyZXBsYWNlU3RhdGUiLCJwYXN0RGF0ZXMiLCJzdGFydERhdGUiLCJlbmREYXRlIiwiY3VycmVudERhdGVzIiwiZGVmYXVsdERhdGUiLCJkZWZhdWx0VXNlciIsInVzZXJJbmZvIiwiaWQiLCJmaXJzdE5hbWUiLCJsYXN0TmFtZSIsImVtYWlsIiwidWlkIiwiYWN0aXZpdGllcyIsInJvbGVzIiwiZGF0ZURlbW9HZW5lcmF0aW9uU3VjY2VlZGVkIiwiZGF0ZVN0b3JlZCIsImRhdGVMYXN0VXBkYXRlZCIsImlzSW1wZXJzb25hdGVkIiwiY2FyZWVyQWNjb3VudEFsaWFzIiwiZW1wbG95ZWVOdW1iZXIiLCJ1c2VyTmFtZSIsInB1aWQiLCJsb2NrRG93bkJyb3dzZXJUZXN0TGF1bmNoVXJsIiwiZGVmYXVsdE5hbWVsZXNzVXNlckluZm8iLCJkZWZhdWx0TmFtZWRVc2VySW5mbyIsIm1vY2tVc2VyIiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwibWVyZ2UiLCJkZWZhdWx0R3JvdXBPd25lclVzZXJJbmZvIiwiZGVmYXVsdEdyb3VwT3duZXIiLCJ1c2VySWQiLCJlbnRpdHlJZCIsInJvbGUiLCJCQVNFX1JPTEUiLCJHUk9VUF9PV05FUiIsImlzRXh0ZXJuYWwiLCJkZWZhdWx0TmFtZWxlc3NHcm91cExlYXJuZXIiLCJHUk9VUF9MRUFSTkVSIiwiZGVmYXVsdE5hbWVkR3JvdXBMZWFybmVyIiwiZGVmYXVsdEdyb3VwTGVhcm5lciIsImRlZmF1bHRFeHRlcm5hbEdyb3VwTGVhcm5lciIsImRlZmF1bHRHcm91cEdyYWRlciIsIkdST1VQX0dSQURFUiIsImRlZmF1bHRHcm91cFVzZXJSb2xlcyIsImRlZmF1bHRBZG1pblVzZXJSb2xlcyIsIkFETUlOIiwiZGVmYXVsdEdyb3VwIiwib3duZXJzIiwiZ3JhZGVycyIsIm5hbWUiLCJleHRlcm5hbFRlcm1JZCIsImlzRGVsZXRlZCIsImlzUm9zdGVyU3luY0VuYWJsZWQiLCJleHRlcm5hbEdyb3VwcyIsIm1vY2tHcm91cHMiLCJtb2NrU3luY2VkR3JvdXBzIiwicm9zdGVyU3luY0VuYWJsZWRHcm91cCIsIm1vY2tMdGlHcm91cHMiLCJsdGlHcm91cCIsImV4dGVybmFsUHJvdmlkZXJJZCIsImdyb3VwSWQiLCJkZXNjcmlwdGlvbiIsImdyYWRlc1VybCIsInJvc3RlclVybCIsImlzQXV0b0dyYWRlUHVzaEVuYWJsZWQiLCJleHRlcm5hbElkIiwidHlwZW5hbWUiLCJtb2NrVGVybUdyb3VwcyIsImdyb3VwIiwibW9ja1Rlcm1BbmRVbmlUaW1lR3JvdXBzIiwibW9ja1Bhc3RHcm91cHMiLCJwYXN0R3JvdXAiLCJtb2NrUGFzdEFuZEN1cnJlbnRHcm91cHMiLCJjdXJyZW50R3JvdXAiLCJkZWZhdWx0RXh0ZXJuYWxQcm92aWRlcnMiLCJFWFRFUk5BTF9QUk9WSURFUl9UWVBFIiwiVU5JVElNRSIsInRlcm1TeW5jRW5hYmxlZCIsInJvc3RlclN5bmNFbmFibGVkIiwiZ3JhZGVQdXNoRW5hYmxlZCIsInNob3VsZERpc3BsYXlDcmVhdGVOb25MdGlHcm91cEFsZXJ0IiwiTFRJIiwiZGVmYXVsdEV4dGVybmFsVGVybXMiLCJpbnRlcm5hbFNlcnZlckVycm9yRGF0YSIsInN0YXR1cyIsIkhUVFBfU1RBVFVTX0NPREUiLCJJTlRFUk5BTF9TRVJWRVJfRVJST1IiLCJ0aXRsZSIsImRldGFpbCIsInJlcXVlc3RUaW1lZE91dEVycm9yRGF0YSIsIlJFUVVFU1RfVElNRU9VVCIsImZvcmJpZGRlbkVycm9yRGF0YSIsIkZPUkJJRERFTiIsInVuYXV0aG9yaXplZEVycm9yRGF0YSIsIlVOQVVUSE9SSVpFRCIsImJhZFJlcXVlc3RFcnJvckRhdGEiLCJCQURfUkVRVUVTVCIsImJhZFJlcXVlc3RGdWxsRXJyb3JEYXRhIiwidHlwZSIsImluc3RhbmNlIiwidHJhY2VJZCIsImVycm9ycyIsInBhc3N3b3JkIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0YW50cy9tb2NrRGF0YS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtZXJnZSB9IGZyb20gJ2xvZGFzaCdcclxuaW1wb3J0IHsgRVhURVJOQUxfUFJPVklERVJfVFlQRSB9IGZyb20gJy4uL2NvbnN0YW50cy9leHRlcm5hbFByb3ZpZGVyVHlwZSdcclxuaW1wb3J0IHtcclxuXHRBcHBDb25maWd1cmF0aW9uLFxyXG5cdEV4dGVybmFsUHJvdmlkZXIsXHJcblx0RXh0ZXJuYWxUZXJtLFxyXG5cdEZldGNoRXJyb3JEYXRhLFxyXG5cdEdyb3VwLFxyXG5cdEdyb3VwVXNlclJvbGUsXHJcblx0SFRUUF9TVEFUVVNfQ09ERSxcclxuXHRNb2RlbENvbGxlY3Rpb24sXHJcblx0U2ltcGxlTG9jYXRpb24sXHJcblx0VXNlckluZm8sXHJcblx0VXNlclJvbGVcclxufSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IHsgQkFTRV9ST0xFIH0gZnJvbSAnLi9iYXNlUm9sZSdcclxuaW1wb3J0IHsgVElFUiB9IGZyb20gJy4vdGllcidcclxuXHJcbi8vI3JlZ2lvbiBHZW5lcmFsXHJcblxyXG5leHBvcnQgY29uc3QgZGVmYXVsdEFwcENvbmZpZ3VyYXRpb246IEFwcENvbmZpZ3VyYXRpb24gPSB7XHJcblx0Tk9ERV9FTlY6ICd0ZXN0JyxcclxuXHRBUFBfTkFNRTogJ1N0dWRpb0tpdCcsXHJcblx0VElFUjogVElFUi5MT0NBTCxcclxuXHRBUElfQkFTRV9VUkw6ICcnLFxyXG5cdFJPT1RfRE9NQUlOOiAnc3R1ZGlva2l0Lm9yZycsXHJcblx0Q0xJRU5UX0lEOiAnd2ViJyxcclxuXHRDTElFTlRfU0VDUkVUOiAnKioqKicsXHJcblx0SVNfRE9XTlRJTUU6IGZhbHNlLFxyXG5cdExNU19OQU1FOiAnQnJpZ2h0c3BhY2UnLFxyXG5cdEdSQURBQkxFX0RFU0NSSVBUT1I6ICdhc3Nlc3NtZW50J1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZGVmYXVsdExvY2F0aW9uOiBTaW1wbGVMb2NhdGlvbiA9IHtcclxuXHRoYXNoOiAnJyxcclxuXHRob3N0OiAncHVyZHVlLmRldi5zdHVkaW9raXQub3JnJyxcclxuXHRob3N0bmFtZTogJ3B1cmR1ZS5kZXYuc3R1ZGlva2l0Lm9yZycsXHJcblx0aHJlZjogJ2h0dHBzOi8vcHVyZHVlLmRldi5zdHVkaW9raXQub3JnLycsXHJcblx0cGF0aG5hbWU6ICcvJyxcclxuXHRwb3J0OiAnJyxcclxuXHRwcm90b2NvbDogJ2h0dHBzOicsXHJcblx0c2VhcmNoOiAnJ1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbW9ja0hpc3RvcnkoKTogSGlzdG9yeSB7XHJcblx0cmV0dXJuIHtcclxuXHRcdGxlbmd0aDogMCxcclxuXHRcdHNjcm9sbFJlc3RvcmF0aW9uOiAnYXV0bycsXHJcblx0XHRzdGF0ZToge30sXHJcblx0XHRiYWNrOiBqZXN0LmZuKCksXHJcblx0XHRmb3J3YXJkOiBqZXN0LmZuKCksXHJcblx0XHRnbzogamVzdC5mbigpLFxyXG5cdFx0cHVzaFN0YXRlOiBqZXN0LmZuKCksXHJcblx0XHRyZXBsYWNlU3RhdGU6IGplc3QuZm4oKVxyXG5cdH1cclxufVxyXG5cclxuLy8jZW5kcmVnaW9uIEdlbmVyYWxcclxuXHJcbi8vI3JlZ2lvbiBEYXRlc1xyXG5cclxuLyoqIDUvMTUvMTggLSA4LzE0LzE4ICovXHJcbmV4cG9ydCBjb25zdCBwYXN0RGF0ZXMgPSB7XHJcblx0c3RhcnREYXRlOiAnMjAxOC0wNS0xNVQwNDowMDowMC4wMDBaJyxcclxuXHRlbmREYXRlOiAnMjAxOC0wOC0xNVQwMzo1OTo1OS45OTlaJ1xyXG59XHJcblxyXG4vKiogOC8xNS8xOCAtIDEyLzMxLzE4OiAqL1xyXG5leHBvcnQgY29uc3QgY3VycmVudERhdGVzID0ge1xyXG5cdHN0YXJ0RGF0ZTogJzIwMTgtMDgtMTVUMDQ6MDA6MDAuMDAwWicsXHJcblx0ZW5kRGF0ZTogJzIwMTktMDEtMDFUMDQ6NTk6NTkuOTk5WidcclxufVxyXG5cclxuLyoqXHJcbiAqIFRoZSBkZWZhdWx0IGRhdGUgYW5kIHRpbWUgZm9yIGFsbCB0ZXN0cy4gVXNlZCBieSB0aGUgJ21vY2tkYXRlJyBwYWNrYWdlLiBPbmUgbW9udGggaW50byBgY3VycmVudERhdGVzYC5cclxuICovXHJcbmV4cG9ydCBjb25zdCBkZWZhdWx0RGF0ZSA9ICcyMDE4LTA5LTE1VDA0OjAwOjAwLjAwMFonXHJcblxyXG4vLyNlbmRyZWdpb24gRGF0ZXNcclxuXHJcbi8vI3JlZ2lvbiBVc2Vyc1xyXG5cclxuZXhwb3J0IGNvbnN0IGRlZmF1bHRVc2VyID0ge1xyXG5cdHVzZXJJbmZvOiB7XHJcblx0XHRpZDogJzEnLFxyXG5cdFx0Zmlyc3ROYW1lOiBudWxsLFxyXG5cdFx0bGFzdE5hbWU6IG51bGwsXHJcblx0XHRlbWFpbDogbnVsbCxcclxuXHRcdHVpZDogbnVsbCxcclxuXHRcdGFjdGl2aXRpZXM6IFtdLFxyXG5cdFx0cm9sZXM6IFtdLFxyXG5cdFx0ZGF0ZURlbW9HZW5lcmF0aW9uU3VjY2VlZGVkOiBudWxsLFxyXG5cdFx0ZGF0ZVN0b3JlZDogZGVmYXVsdERhdGUsXHJcblx0XHRkYXRlTGFzdFVwZGF0ZWQ6IGRlZmF1bHREYXRlLFxyXG5cdFx0aXNJbXBlcnNvbmF0ZWQ6IGZhbHNlLFxyXG5cdFx0Y2FyZWVyQWNjb3VudEFsaWFzOiBudWxsLFxyXG5cdFx0ZW1wbG95ZWVOdW1iZXI6IG51bGwsXHJcblx0XHR1c2VyTmFtZTogJ3Rlc3QnLFxyXG5cdFx0cHVpZDogbnVsbCxcclxuXHRcdGxvY2tEb3duQnJvd3NlclRlc3RMYXVuY2hVcmw6IG51bGxcclxuXHR9IGFzIFVzZXJJbmZvXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBkZWZhdWx0TmFtZWxlc3NVc2VySW5mbyA9IHtcclxuXHQuLi5kZWZhdWx0VXNlci51c2VySW5mbyxcclxuXHQuLi57XHJcblx0XHRlbWFpbDogJ25pY2tpQG1pbmFqLnN1cGVyYmFzcycsXHJcblx0XHR1aWQ6ICdubS1uYW1lbGVzcydcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBkZWZhdWx0TmFtZWRVc2VySW5mbyA9IHtcclxuXHQuLi5kZWZhdWx0VXNlci51c2VySW5mbyxcclxuXHQuLi57XHJcblx0XHRmaXJzdE5hbWU6ICdOaWNraScsXHJcblx0XHRsYXN0TmFtZTogJ01pbmFqJyxcclxuXHRcdHVpZDogJ25tLW5hbWVkJ1xyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG1vY2tVc2VyKGFjdGl2aXRpZXM6IHN0cmluZ1tdID0gW10pOiB7IHVzZXJJbmZvOiBVc2VySW5mbyB9IHtcclxuXHRyZXR1cm4gbWVyZ2UoeyB1c2VySW5mbzogeyBhY3Rpdml0aWVzIH0gfSwgZGVmYXVsdFVzZXIpXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBkZWZhdWx0R3JvdXBPd25lclVzZXJJbmZvOiBVc2VySW5mbyA9IHtcclxuXHQuLi5kZWZhdWx0VXNlci51c2VySW5mbyxcclxuXHRpZDogJzInLFxyXG5cdGZpcnN0TmFtZTogJ0phbmUnLFxyXG5cdGxhc3ROYW1lOiAnRG9lJyxcclxuXHRlbWFpbDogJ2phbmVAZ21haWwuY29tJ1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZGVmYXVsdEdyb3VwT3duZXI6IEdyb3VwVXNlclJvbGUgPSB7XHJcblx0aWQ6ICcxJyxcclxuXHR1c2VySWQ6ICcyJyxcclxuXHRmaXJzdE5hbWU6ICdKYW5lJyxcclxuXHRsYXN0TmFtZTogJ0RvZScsXHJcblx0ZW1haWw6ICdqYW5lQGdtYWlsLmNvbScsXHJcblx0dWlkOiAnamFuZScsXHJcblx0ZW50aXR5SWQ6IDEsXHJcblx0cm9sZTogQkFTRV9ST0xFLkdST1VQX09XTkVSLFxyXG5cdGlzRXh0ZXJuYWw6IGZhbHNlXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBkZWZhdWx0TmFtZWxlc3NHcm91cExlYXJuZXI6IEdyb3VwVXNlclJvbGUgPSB7XHJcblx0aWQ6ICcyJyxcclxuXHR1c2VySWQ6ICczJyxcclxuXHRmaXJzdE5hbWU6IG51bGwsXHJcblx0bGFzdE5hbWU6IG51bGwsXHJcblx0ZW1haWw6ICduaWNraUBtaW5hai5zdXBlcmJhc3MnLFxyXG5cdHVpZDogJ25tLW5hbWVsZXNzJyxcclxuXHRlbnRpdHlJZDogMSxcclxuXHRyb2xlOiBCQVNFX1JPTEUuR1JPVVBfTEVBUk5FUixcclxuXHRpc0V4dGVybmFsOiBmYWxzZVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZGVmYXVsdE5hbWVkR3JvdXBMZWFybmVyOiBHcm91cFVzZXJSb2xlID0ge1xyXG5cdGlkOiAnMycsXHJcblx0dXNlcklkOiAnNCcsXHJcblx0Zmlyc3ROYW1lOiAnTmlja2knLFxyXG5cdGxhc3ROYW1lOiAnTWluYWonLFxyXG5cdGVtYWlsOiBudWxsLFxyXG5cdHVpZDogJ25tLW5hbWVkJyxcclxuXHRlbnRpdHlJZDogMSxcclxuXHRyb2xlOiBCQVNFX1JPTEUuR1JPVVBfTEVBUk5FUixcclxuXHRpc0V4dGVybmFsOiBmYWxzZVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZGVmYXVsdEdyb3VwTGVhcm5lcjogR3JvdXBVc2VyUm9sZSA9IHtcclxuXHRpZDogJzQnLFxyXG5cdHVzZXJJZDogJzUnLFxyXG5cdGZpcnN0TmFtZTogJ0pvZScsXHJcblx0bGFzdE5hbWU6ICdTY2htb2UnLFxyXG5cdGVtYWlsOiAnbm9wZUBnbWFpbC5jb20nLFxyXG5cdHVpZDogJ25vcGUnLFxyXG5cdGVudGl0eUlkOiAxLFxyXG5cdHJvbGU6IEJBU0VfUk9MRS5HUk9VUF9MRUFSTkVSLFxyXG5cdGlzRXh0ZXJuYWw6IGZhbHNlXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBkZWZhdWx0RXh0ZXJuYWxHcm91cExlYXJuZXI6IEdyb3VwVXNlclJvbGUgPSB7XHJcblx0aWQ6ICc1JyxcclxuXHR1c2VySWQ6ICc2JyxcclxuXHRmaXJzdE5hbWU6ICdCb2InLFxyXG5cdGxhc3ROYW1lOiAnTG9ibGF3JyxcclxuXHRlbWFpbDogJ2JvYmxvYmxhd0BsYXdibG9nLmNvbScsXHJcblx0dWlkOiAnYm9ibG9ibGF3JyxcclxuXHRlbnRpdHlJZDogMSxcclxuXHRyb2xlOiBCQVNFX1JPTEUuR1JPVVBfTEVBUk5FUixcclxuXHRpc0V4dGVybmFsOiB0cnVlXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBkZWZhdWx0R3JvdXBHcmFkZXI6IEdyb3VwVXNlclJvbGUgPSB7XHJcblx0aWQ6ICc2JyxcclxuXHR1c2VySWQ6ICc3JyxcclxuXHRmaXJzdE5hbWU6ICdHcmFkZXInLFxyXG5cdGxhc3ROYW1lOiAnTWNHcmFkZWZhY2UnLFxyXG5cdGVtYWlsOiAnZ3JhZGVyQGdtYWlsLmNvbScsXHJcblx0dWlkOiAnZ3JhZGVyJyxcclxuXHRlbnRpdHlJZDogMSxcclxuXHRyb2xlOiBCQVNFX1JPTEUuR1JPVVBfR1JBREVSLFxyXG5cdGlzRXh0ZXJuYWw6IGZhbHNlXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBkZWZhdWx0R3JvdXBVc2VyUm9sZXMgPSBbZGVmYXVsdEdyb3VwT3duZXIsIGRlZmF1bHRHcm91cExlYXJuZXIsIGRlZmF1bHRFeHRlcm5hbEdyb3VwTGVhcm5lcl1cclxuXHJcbmV4cG9ydCBjb25zdCBkZWZhdWx0QWRtaW5Vc2VyUm9sZXM6IFVzZXJSb2xlW10gPSBbXHJcblx0e1xyXG5cdFx0aWQ6ICcxJyxcclxuXHRcdGZpcnN0TmFtZTogJ0pvZScsXHJcblx0XHRsYXN0TmFtZTogJ1NjaG1vJyxcclxuXHRcdGVtYWlsOiBudWxsLFxyXG5cdFx0dWlkOiBudWxsLFxyXG5cdFx0cm9sZTogQkFTRV9ST0xFLkFETUlOXHJcblx0fSxcclxuXHR7XHJcblx0XHRpZDogJzInLFxyXG5cdFx0Zmlyc3ROYW1lOiBudWxsLFxyXG5cdFx0bGFzdE5hbWU6IG51bGwsXHJcblx0XHRlbWFpbDogJ2Nhcmx5c2ltb25AY2xvdWRzLmluLmNvZmZlZScsXHJcblx0XHR1aWQ6ICdjYXJseXNpbW9uJyxcclxuXHRcdHJvbGU6IEJBU0VfUk9MRS5BRE1JTlxyXG5cdH1cclxuXVxyXG5cclxuLy8jZW5kcmVnaW9uIFVzZXJzXHJcblxyXG4vLyNyZWdpb24gR3JvdXBzXHJcblxyXG5leHBvcnQgY29uc3QgZGVmYXVsdEdyb3VwOiBHcm91cCA9IHtcclxuXHRyb2xlczogW10sXHJcblx0YWN0aXZpdGllczogW10sXHJcblx0b3duZXJzOiBbXHJcblx0XHR7XHJcblx0XHRcdGlkOiAnMScsXHJcblx0XHRcdGVudGl0eUlkOiAxLFxyXG5cdFx0XHRmaXJzdE5hbWU6ICdJbnN0cnVjdG9yJyxcclxuXHRcdFx0bGFzdE5hbWU6ICdNY0luc3RydWN0b3InLFxyXG5cdFx0XHRlbWFpbDogbnVsbCxcclxuXHRcdFx0dWlkOiBudWxsXHJcblx0XHR9XHJcblx0XSxcclxuXHRncmFkZXJzOiBbXSxcclxuXHRpZDogMSxcclxuXHRuYW1lOiAnTWNHcm91cCcsXHJcblx0ZXh0ZXJuYWxUZXJtSWQ6IG51bGwsXHJcblx0c3RhcnREYXRlOiBjdXJyZW50RGF0ZXMuc3RhcnREYXRlLFxyXG5cdGVuZERhdGU6IGN1cnJlbnREYXRlcy5lbmREYXRlLFxyXG5cdGlzRGVsZXRlZDogZmFsc2UsXHJcblx0aXNSb3N0ZXJTeW5jRW5hYmxlZDogZmFsc2UsXHJcblx0ZXh0ZXJuYWxHcm91cHM6IFtdXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBtb2NrR3JvdXBzKGFjdGl2aXRpZXM6IHN0cmluZ1tdID0gW10sIHJvbGVzOiBzdHJpbmdbXSA9IFtdKTogTW9kZWxDb2xsZWN0aW9uPEdyb3VwPiB7XHJcblx0cmV0dXJuIHsgJzEnOiBtZXJnZSh7IGFjdGl2aXRpZXMsIHJvbGVzIH0sIGRlZmF1bHRHcm91cCkgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbW9ja1N5bmNlZEdyb3VwcyhhY3Rpdml0aWVzOiBzdHJpbmdbXSA9IFtdLCByb2xlczogc3RyaW5nW10gPSBbXSk6IE1vZGVsQ29sbGVjdGlvbjxHcm91cD4ge1xyXG5cdGNvbnN0IHJvc3RlclN5bmNFbmFibGVkR3JvdXA6IEdyb3VwID0gbWVyZ2UoeyBhY3Rpdml0aWVzLCByb2xlcyB9LCBkZWZhdWx0R3JvdXApXHJcblx0cm9zdGVyU3luY0VuYWJsZWRHcm91cC5pc1Jvc3RlclN5bmNFbmFibGVkID0gdHJ1ZVxyXG5cdHJldHVybiB7ICcxJzogcm9zdGVyU3luY0VuYWJsZWRHcm91cCB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBtb2NrTHRpR3JvdXBzKGFjdGl2aXRpZXM6IHN0cmluZ1tdID0gW10sIHJvbGVzOiBzdHJpbmdbXSA9IFtdKTogTW9kZWxDb2xsZWN0aW9uPEdyb3VwPiB7XHJcblx0Y29uc3QgbHRpR3JvdXA6IEdyb3VwID0gbWVyZ2UoeyBhY3Rpdml0aWVzLCByb2xlcyB9LCBkZWZhdWx0R3JvdXApXHJcblx0bHRpR3JvdXAuaXNSb3N0ZXJTeW5jRW5hYmxlZCA9IHRydWVcclxuXHRsdGlHcm91cC5leHRlcm5hbEdyb3VwcyA9IFtcclxuXHRcdHtcclxuXHRcdFx0aWQ6IDEsXHJcblx0XHRcdGV4dGVybmFsUHJvdmlkZXJJZDogMixcclxuXHRcdFx0Z3JvdXBJZDogMSxcclxuXHRcdFx0dXNlcklkOiAnMScsXHJcblx0XHRcdG5hbWU6ICdMVEkgRXh0ZXJuYWxHcm91cCcsXHJcblx0XHRcdGRlc2NyaXB0aW9uOiAnTFRJIDEwMScsXHJcblx0XHRcdGdyYWRlc1VybDogJ3d3dy5sdGkub3JnJyxcclxuXHRcdFx0cm9zdGVyVXJsOiBudWxsLFxyXG5cdFx0XHRpc0F1dG9HcmFkZVB1c2hFbmFibGVkOiBmYWxzZSxcclxuXHRcdFx0ZXh0ZXJuYWxJZDogJzEnLFxyXG5cdFx0XHR0eXBlbmFtZTogJ0V4dGVybmFsR3JvdXAnXHJcblx0XHR9XHJcblx0XVxyXG5cdHJldHVybiB7ICcxJzogbHRpR3JvdXAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbW9ja1Rlcm1Hcm91cHMoYWN0aXZpdGllczogc3RyaW5nW10gPSBbXSwgcm9sZXM6IHN0cmluZ1tdID0gW10pOiBNb2RlbENvbGxlY3Rpb248R3JvdXA+IHtcclxuXHRjb25zdCBncm91cDogR3JvdXAgPSBtZXJnZSh7IGFjdGl2aXRpZXMsIHJvbGVzIH0sIGRlZmF1bHRHcm91cClcclxuXHRncm91cC5zdGFydERhdGUgPSBudWxsXHJcblx0Z3JvdXAuZW5kRGF0ZSA9IG51bGxcclxuXHRncm91cC5leHRlcm5hbFRlcm1JZCA9IDFcclxuXHRyZXR1cm4geyAnMSc6IGdyb3VwIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG1vY2tUZXJtQW5kVW5pVGltZUdyb3VwcyhhY3Rpdml0aWVzOiBzdHJpbmdbXSA9IFtdLCByb2xlczogc3RyaW5nW10gPSBbXSk6IE1vZGVsQ29sbGVjdGlvbjxHcm91cD4ge1xyXG5cdGNvbnN0IGdyb3VwOiBHcm91cCA9IG1lcmdlKHsgYWN0aXZpdGllcywgcm9sZXMgfSwgZGVmYXVsdEdyb3VwKVxyXG5cdGdyb3VwLnN0YXJ0RGF0ZSA9IG51bGxcclxuXHRncm91cC5lbmREYXRlID0gbnVsbFxyXG5cdGdyb3VwLmV4dGVybmFsVGVybUlkID0gMVxyXG5cdGdyb3VwLmV4dGVybmFsR3JvdXBzID0gW1xyXG5cdFx0e1xyXG5cdFx0XHRpZDogMSxcclxuXHRcdFx0ZXh0ZXJuYWxQcm92aWRlcklkOiAxLFxyXG5cdFx0XHRncm91cElkOiAxLFxyXG5cdFx0XHR1c2VySWQ6ICcxJyxcclxuXHRcdFx0bmFtZTogJ1VuaVRpbWUgRXh0ZXJuYWxHcm91cCcsXHJcblx0XHRcdGRlc2NyaXB0aW9uOiAnVW5pVGltZSAxMDEnLFxyXG5cdFx0XHRncmFkZXNVcmw6IG51bGwsXHJcblx0XHRcdHJvc3RlclVybDogbnVsbCxcclxuXHRcdFx0aXNBdXRvR3JhZGVQdXNoRW5hYmxlZDogZmFsc2UsXHJcblx0XHRcdGV4dGVybmFsSWQ6ICcxJyxcclxuXHRcdFx0dHlwZW5hbWU6ICdFeHRlcm5hbEdyb3VwJ1xyXG5cdFx0fVxyXG5cdF1cclxuXHRyZXR1cm4geyAnMSc6IGdyb3VwIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG1vY2tQYXN0R3JvdXBzKGFjdGl2aXRpZXM6IHN0cmluZ1tdID0gW10sIHJvbGVzOiBzdHJpbmdbXSA9IFtdKTogTW9kZWxDb2xsZWN0aW9uPEdyb3VwPiB7XHJcblx0Y29uc3QgcGFzdEdyb3VwOiBHcm91cCA9IG1lcmdlKHsgYWN0aXZpdGllcywgcm9sZXMgfSwgZGVmYXVsdEdyb3VwLCBwYXN0RGF0ZXMpXHJcblx0cmV0dXJuIHsgJzEnOiBwYXN0R3JvdXAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbW9ja1Bhc3RBbmRDdXJyZW50R3JvdXBzKGFjdGl2aXRpZXM6IHN0cmluZ1tdID0gW10sIHJvbGVzOiBzdHJpbmdbXSA9IFtdKTogTW9kZWxDb2xsZWN0aW9uPEdyb3VwPiB7XHJcblx0Y29uc3QgcGFzdEdyb3VwOiBHcm91cCA9IG1lcmdlKHsgYWN0aXZpdGllcywgcm9sZXMgfSwgZGVmYXVsdEdyb3VwLCBwYXN0RGF0ZXMpXHJcblx0Y29uc3QgY3VycmVudEdyb3VwOiBHcm91cCA9IG1lcmdlKFxyXG5cdFx0eyBhY3Rpdml0aWVzLCByb2xlcyB9LFxyXG5cdFx0ZGVmYXVsdEdyb3VwLFxyXG5cdFx0e1xyXG5cdFx0XHRpZDogJzInXHJcblx0XHR9LFxyXG5cdFx0Y3VycmVudERhdGVzXHJcblx0KVxyXG5cdHJldHVybiB7ICcxJzogcGFzdEdyb3VwLCAnMic6IGN1cnJlbnRHcm91cCB9XHJcbn1cclxuXHJcbi8vI2VuZHJlZ2lvbiBHcm91cHNcclxuXHJcbi8vI3JlZ2lvbiBFeHRlcm5hbFRlcm1zICsgRXh0ZXJuYWxQcm92aWRlcnNcclxuXHJcbmV4cG9ydCBjb25zdCBkZWZhdWx0RXh0ZXJuYWxQcm92aWRlcnM6IE1vZGVsQ29sbGVjdGlvbjxFeHRlcm5hbFByb3ZpZGVyPiA9IHtcclxuXHQnMSc6IHtcclxuXHRcdGlkOiAxLFxyXG5cdFx0dHlwZW5hbWU6IEVYVEVSTkFMX1BST1ZJREVSX1RZUEUuVU5JVElNRSxcclxuXHRcdHRlcm1TeW5jRW5hYmxlZDogdHJ1ZSxcclxuXHRcdHJvc3RlclN5bmNFbmFibGVkOiB0cnVlLFxyXG5cdFx0Z3JhZGVQdXNoRW5hYmxlZDogZmFsc2UsXHJcblx0XHRzaG91bGREaXNwbGF5Q3JlYXRlTm9uTHRpR3JvdXBBbGVydDogZmFsc2VcclxuXHR9LFxyXG5cdCcyJzoge1xyXG5cdFx0aWQ6IDIsXHJcblx0XHR0eXBlbmFtZTogRVhURVJOQUxfUFJPVklERVJfVFlQRS5MVEksXHJcblx0XHR0ZXJtU3luY0VuYWJsZWQ6IGZhbHNlLFxyXG5cdFx0cm9zdGVyU3luY0VuYWJsZWQ6IGZhbHNlLFxyXG5cdFx0Z3JhZGVQdXNoRW5hYmxlZDogdHJ1ZSxcclxuXHRcdHNob3VsZERpc3BsYXlDcmVhdGVOb25MdGlHcm91cEFsZXJ0OiB0cnVlXHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZGVmYXVsdEV4dGVybmFsVGVybXM6IE1vZGVsQ29sbGVjdGlvbjxFeHRlcm5hbFRlcm0+ID0ge1xyXG5cdCcxJzoge1xyXG5cdFx0aWQ6IDEsXHJcblx0XHRleHRlcm5hbFByb3ZpZGVySWQ6IDEsXHJcblx0XHRleHRlcm5hbElkOiAnZm9vJyxcclxuXHRcdG5hbWU6ICdVbmlUaW1lIEZhbGwgVGVybScsXHJcblx0XHRzdGFydERhdGU6IGN1cnJlbnREYXRlcy5zdGFydERhdGUsXHJcblx0XHRlbmREYXRlOiBjdXJyZW50RGF0ZXMuZW5kRGF0ZVxyXG5cdH1cclxufVxyXG5cclxuLy8jZW5kcmVnaW9uIEV4dGVybmFsVGVybXMgKyBFeHRlcm5hbFByb3ZpZGVyc1xyXG5cclxuLy8jcmVnaW9uIEZldGNoRXJyb3JEYXRhXHJcblxyXG5leHBvcnQgY29uc3QgaW50ZXJuYWxTZXJ2ZXJFcnJvckRhdGE6IEZldGNoRXJyb3JEYXRhID0ge1xyXG5cdHN0YXR1czogSFRUUF9TVEFUVVNfQ09ERS5JTlRFUk5BTF9TRVJWRVJfRVJST1IsXHJcblx0dGl0bGU6ICdFcnJvcicsXHJcblx0ZGV0YWlsOiAnQW4gZXJyb3IgaGFzIG9jY3VycmVkLidcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHJlcXVlc3RUaW1lZE91dEVycm9yRGF0YTogRmV0Y2hFcnJvckRhdGEgPSB7XHJcblx0c3RhdHVzOiBIVFRQX1NUQVRVU19DT0RFLlJFUVVFU1RfVElNRU9VVCxcclxuXHR0aXRsZTogJ1JlcXVlc3QgVGltZW91dCcsXHJcblx0ZGV0YWlsOiBudWxsXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBmb3JiaWRkZW5FcnJvckRhdGE6IEZldGNoRXJyb3JEYXRhID0ge1xyXG5cdHN0YXR1czogSFRUUF9TVEFUVVNfQ09ERS5GT1JCSURERU4sXHJcblx0dGl0bGU6ICdGb3JiaWRkZW4nLFxyXG5cdGRldGFpbDogJ1lvdXIgcmVxdWVzdCBoYXMgYmVlbiBkZW5pZWQuIFlvdSBkbyBub3QgaGF2ZSBhY2Nlc3MuJ1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgdW5hdXRob3JpemVkRXJyb3JEYXRhOiBGZXRjaEVycm9yRGF0YSA9IHtcclxuXHRzdGF0dXM6IEhUVFBfU1RBVFVTX0NPREUuVU5BVVRIT1JJWkVELFxyXG5cdHRpdGxlOiAnVW5hdXRob3JpemVkJyxcclxuXHRkZXRhaWw6ICdZb3VyIHJlcXVlc3QgaXMgdW5hdXRob3JpemVkLiBZb3UgbXVzdCBhdXRoZW50aWNhdGUuJ1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgYmFkUmVxdWVzdEVycm9yRGF0YTogRmV0Y2hFcnJvckRhdGEgPSB7XHJcblx0c3RhdHVzOiBIVFRQX1NUQVRVU19DT0RFLkJBRF9SRVFVRVNULFxyXG5cdHRpdGxlOiAnQmFkIFJlcXVlc3QnLFxyXG5cdGRldGFpbDogJ1JlYXNvbnMnXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBiYWRSZXF1ZXN0RnVsbEVycm9yRGF0YTogRmV0Y2hFcnJvckRhdGEgPSB7XHJcblx0c3RhdHVzOiBIVFRQX1NUQVRVU19DT0RFLkJBRF9SRVFVRVNULFxyXG5cdHRpdGxlOiAnQmFkIFJlcXVlc3QnLFxyXG5cdGRldGFpbDogJ1JlYXNvbnMnLFxyXG5cdC8vIGluY2x1ZGUgYWxsIG9wdGlvbmFsIHByb3BlcnRpZXNcclxuXHR0eXBlOiAnaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjUuMScsXHJcblx0aW5zdGFuY2U6ICdpbnN0YW5jZScsXHJcblx0dHJhY2VJZDogJzAwLTM5MTRiNDNiNDUyYjk0ZTNmZjRjMzI3OTIyODgwYTAzLTRjZmVkNmZlNDJhZmRkOGYtMDAnLFxyXG5cdGVycm9yczoge1xyXG5cdFx0cGFzc3dvcmQ6IFsnVGhlIFBhc3N3b3JkIG11c3QgYmUgYXQgbGVhc3QgNiBjaGFyYWN0ZXJzIGxvbmcuJ11cclxuXHR9XHJcbn1cclxuXHJcbi8vI2VuZHJlZ2lvbiBGZXRjaEVycm9yRGF0YVxyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxxQkFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsTUFBQSxHQUFBRixPQUFBO0FBYUEsSUFBQUcsU0FBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksS0FBQSxHQUFBSixPQUFBO0FBRUE7O0FBRU8sTUFBTUssdUJBQXlDLEdBQUFDLE9BQUEsQ0FBQUQsdUJBQUEsR0FBRztFQUN4REUsUUFBUSxFQUFFLE1BQU07RUFDaEJDLFFBQVEsRUFBRSxXQUFXO0VBQ3JCQyxJQUFJLEVBQUVB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