studiokit-scaffolding-js 7.0.12-next.1.3 → 7.0.12-next.2.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.
- package/lib/components/ActionList.js +164 -37
- package/lib/components/AlertDialog.js +128 -12
- package/lib/components/AlertWithIcon.js +88 -29
- package/lib/components/ConnectedModal.js +35 -12
- package/lib/components/Dropdowns/GroupsDropdown.js +63 -45
- package/lib/components/Dropdowns/ManagedNavDropdown.js +92 -67
- package/lib/components/Dropdowns/UserDropdown.js +105 -24
- package/lib/components/Dropdowns/index.js +4 -10
- package/lib/components/EntityOwnerList.js +47 -21
- package/lib/components/Error.js +101 -12
- package/lib/components/ErrorBoundary.js +127 -38
- package/lib/components/ErrorMessage.js +39 -12
- package/lib/components/Forms/DateField.js +56 -45
- package/lib/components/Forms/TimeField.js +76 -45
- package/lib/components/Forms/index.js +3 -5
- package/lib/components/Groups/CreateEditCopySaveButtons.js +109 -14
- package/lib/components/Groups/ExternalGroups/Attach.js +206 -151
- package/lib/components/Groups/ExternalGroups/Table.js +176 -48
- package/lib/components/Groups/GroupCreateOrEditCommonProps.js +2 -2
- package/lib/components/Groups/RosterSyncInfo.js +142 -23
- package/lib/components/HOC/AccessibleAppComponent.js +88 -72
- package/lib/components/HOC/ActivityRequiredComponent.js +68 -33
- package/lib/components/HOC/AsyncComponent.js +49 -41
- package/lib/components/HOC/AuthenticatedComponent.js +55 -44
- package/lib/components/HOC/CollectionComponent.js +154 -104
- package/lib/components/HOC/CollectionFirstItemComponent.js +45 -40
- package/lib/components/HOC/CollectionItemComponent.js +152 -100
- package/lib/components/HOC/ConnectedModalComponent.js +87 -69
- package/lib/components/HOC/DataDependentComponent.js +26 -27
- package/lib/components/HOC/EntityComponent.js +57 -53
- package/lib/components/HOC/FullscreenModalComponent.js +139 -108
- package/lib/components/HOC/GroupActivityRequiredComponent.js +27 -20
- package/lib/components/HOC/GuidComponent.js +20 -20
- package/lib/components/HOC/ModelContextDependencyVerifyComponent.js +32 -29
- package/lib/components/HOC/ModelErrorRedirectComponent.js +37 -39
- package/lib/components/HOC/SearchPersistorComponent.js +237 -173
- package/lib/components/HOC/UnauthenticatedComponent.js +32 -30
- package/lib/components/HOC/UserComponent.js +6 -8
- package/lib/components/Icons/IconAlphaList.js +28 -8
- package/lib/components/Icons/IconExternalUser.js +28 -8
- package/lib/components/Icons/IconImpersonation.js +28 -8
- package/lib/components/Icons/IconStopImpersonating.js +28 -8
- package/lib/components/Icons/IconTable.js +29 -9
- package/lib/components/Icons/IconTableDeleteCol.js +28 -8
- package/lib/components/Icons/IconTableDeleteRow.js +28 -8
- package/lib/components/Icons/IconTableInsertCol.js +28 -8
- package/lib/components/Icons/IconTableInsertRow.js +28 -8
- package/lib/components/Impersonation/Button.js +71 -16
- package/lib/components/Impersonation/Link.js +72 -16
- package/lib/components/Impersonation/UserDetail.js +60 -11
- package/lib/components/Loading.js +23 -8
- package/lib/components/LockDownBrowser/Check.js +188 -51
- package/lib/components/LockDownBrowser/ExitButton.js +22 -13
- package/lib/components/LockDownBrowser/Launch.js +64 -64
- package/lib/components/Lti/Confirm.js +147 -14
- package/lib/components/Lti/CreateNonLtiGroupAlertDialog.js +165 -36
- package/lib/components/Lti/Launch.js +99 -25
- package/lib/components/Lti/LaunchGroup.js +81 -16
- package/lib/components/ManageTable.js +304 -90
- package/lib/components/ManageTableNoDataComponent.js +38 -7
- package/lib/components/NewVersionAlert.js +76 -49
- package/lib/components/NotFound.js +81 -11
- package/lib/components/Notifications.js +179 -129
- package/lib/components/PaginationNextButton.js +28 -9
- package/lib/components/PaginationPreviousButton.js +28 -9
- package/lib/components/Quill/CustomToolbar.js +427 -222
- package/lib/components/Quill/Formats/Image.js +67 -67
- package/lib/components/Quill/Formats/List.js +38 -47
- package/lib/components/Quill/Formats/Video.js +23 -26
- package/lib/components/Quill/ImageDropModule.js +136 -114
- package/lib/components/Quill/ImageWarning.js +41 -12
- package/lib/components/Quill/ImageWithAltTextModal.js +420 -89
- package/lib/components/Quill/Specs/CustomImageSpec.js +32 -31
- package/lib/components/Quill/Specs/CustomVideoSpec.js +22 -23
- package/lib/components/Quill/TableModule/Blots/BaseTableBlot.js +89 -97
- package/lib/components/Quill/TableModule/Blots/TableBlot.js +47 -50
- package/lib/components/Quill/TableModule/Blots/TableBodyBlot.js +48 -51
- package/lib/components/Quill/TableModule/Blots/TableCellBlot.js +219 -224
- package/lib/components/Quill/TableModule/Blots/TableContainer.js +75 -86
- package/lib/components/Quill/TableModule/Blots/TableRowBlot.js +70 -73
- package/lib/components/Quill/TableModule/constants.js +40 -42
- package/lib/components/Quill/TableModule/index.js +357 -305
- package/lib/components/Quill/TableModule/utils.js +39 -48
- package/lib/components/Quill/accessibilityFix.js +219 -223
- package/lib/components/Quill/index.js +30 -33
- package/lib/components/RefreshIndicator/Bordered.js +44 -10
- package/lib/components/RefreshIndicator/Inline.js +43 -12
- package/lib/components/RefreshIndicator/index.js +257 -62
- package/lib/components/SearchControls.js +211 -14
- package/lib/components/SentryRoute.js +5 -7
- package/lib/components/Tables/RoleFilter.js +66 -38
- package/lib/components/Tables/TextFilter.js +58 -18
- package/lib/components/UserRoles/Add.js +193 -99
- package/lib/components/UserRoles/Context.js +3 -6
- package/lib/components/UserRoles/RoleCell.js +176 -75
- package/lib/components/UserRoles/Select.js +151 -20
- package/lib/components/UserRoles/Table.js +215 -82
- package/lib/components/UserRoles/index.js +526 -386
- package/lib/config/eslint/index.js +26 -29
- package/lib/config/eslint/lib/order.js +21 -28
- package/lib/config/eslint/lib/prettier.js +15 -19
- package/lib/config/eslint/lib/typescript.js +87 -113
- package/lib/config/eslint/react.js +18 -15
- package/lib/constants/baseActivity.js +26 -28
- package/lib/constants/baseRole.js +10 -12
- package/lib/constants/configuration.js +43 -55
- package/lib/constants/externalProviderType.js +6 -8
- package/lib/constants/fetchErrorData.js +10 -12
- package/lib/constants/index.js +13 -15
- package/lib/constants/lockDownBrowser.js +23 -25
- package/lib/constants/mockData.js +370 -300
- package/lib/constants/modelStatus.js +11 -13
- package/lib/constants/notificationType.js +8 -10
- package/lib/constants/operatingSystem.js +8 -10
- package/lib/constants/shard.js +7 -9
- package/lib/constants/table.js +18 -22
- package/lib/constants/tier.js +8 -10
- package/lib/constants/userRole.js +11 -8
- package/lib/endpointMappings.js +191 -182
- package/lib/hooks/useCollection.js +79 -65
- package/lib/hooks/useCollectionConfiguration.js +220 -80
- package/lib/hooks/useCollectionItem.js +151 -57
- package/lib/hooks/useGuid.js +16 -9
- package/lib/hooks/usePrevious.js +14 -13
- package/lib/index.js +11 -26
- package/lib/redux/actionCreator.js +44 -35
- package/lib/redux/actions/AuthAction.js +45 -32
- package/lib/redux/actions/ModalAction.js +6 -8
- package/lib/redux/actions/ModelAction.js +95 -43
- package/lib/redux/actions/NotificationAction.js +6 -8
- package/lib/redux/actions/SearchAction.js +5 -7
- package/lib/redux/actions/index.js +6 -8
- package/lib/redux/configureReducers.js +48 -46
- package/lib/redux/configureStore.js +77 -91
- package/lib/redux/helpers.js +2 -5
- package/lib/redux/reducers/authReducer.js +44 -43
- package/lib/redux/reducers/index.js +7 -14
- package/lib/redux/reducers/modalsReducer.js +43 -31
- package/lib/redux/reducers/modelsReducer.js +131 -137
- package/lib/redux/reducers/notificationsReducer.js +20 -20
- package/lib/redux/reducers/searchReducer.js +13 -13
- package/lib/redux/sagas/appInsightsSaga.js +19 -21
- package/lib/redux/sagas/authSaga.js +248 -234
- package/lib/redux/sagas/caliperSaga.js +142 -131
- package/lib/redux/sagas/clockOffsetSaga.js +29 -32
- package/lib/redux/sagas/configurationSaga.js +8 -10
- package/lib/redux/sagas/downtimeApiErrorSaga.js +16 -19
- package/lib/redux/sagas/errorSaga.js +23 -24
- package/lib/redux/sagas/googleAnalyticsSaga.js +24 -27
- package/lib/redux/sagas/identityProviderSaga.js +19 -21
- package/lib/redux/sagas/initialDataLoadSaga.js +34 -31
- package/lib/redux/sagas/lockDownBrowserErrorSaga.js +25 -22
- package/lib/redux/sagas/modelFetchSaga.js +302 -286
- package/lib/redux/sagas/noStoreSaga.js +60 -61
- package/lib/redux/sagas/postLoginDataSaga.js +37 -32
- package/lib/redux/sagas/postLoginRedirectSaga.js +22 -27
- package/lib/redux/sagas/rootSaga.js +77 -60
- package/lib/redux/sagas/sentrySaga.js +25 -28
- package/lib/redux/sagas/userIdSaga.js +13 -15
- package/lib/services/codeProviderService.js +21 -21
- package/lib/services/dateService.js +6 -8
- package/lib/services/documentService.js +10 -11
- package/lib/services/fetchService.js +103 -95
- package/lib/services/persistenceService.js +27 -30
- package/lib/services/ticketProviderService.js +25 -25
- package/lib/services/tokenPersistenceService.js +8 -10
- package/lib/services/windowService.js +14 -16
- package/lib/startup.js +110 -101
- package/lib/types/AppConfiguration.js +2 -2
- package/lib/types/Artifact.js +7 -9
- package/lib/types/BaseReduxState.js +2 -2
- package/lib/types/Client.js +2 -2
- package/lib/types/Collection.js +2 -2
- package/lib/types/Configuration.js +2 -2
- package/lib/types/DeepLinkingResponseRequest.js +2 -2
- package/lib/types/DeletableModel.js +2 -2
- package/lib/types/Event.js +2 -2
- package/lib/types/ExternalGroup.js +2 -2
- package/lib/types/ExternalProvider.js +2 -2
- package/lib/types/ExternalTerm.js +2 -2
- package/lib/types/Group.js +2 -2
- package/lib/types/IdentityProvider.js +2 -2
- package/lib/types/LtiLaunch.js +2 -2
- package/lib/types/NameOnlyEntity.js +2 -2
- package/lib/types/Notification.js +2 -2
- package/lib/types/OptionalRecord.js +2 -2
- package/lib/types/OwnerSchedule.js +2 -2
- package/lib/types/PropertyOfType.js +2 -2
- package/lib/types/Quill.js +2 -2
- package/lib/types/RoleDescription.js +2 -2
- package/lib/types/Search.js +2 -2
- package/lib/types/SimpleLocation.js +2 -2
- package/lib/types/UniTime.js +2 -2
- package/lib/types/User.js +2 -2
- package/lib/types/UserRole.js +2 -2
- package/lib/types/auth/AuthState.js +2 -2
- package/lib/types/auth/CasV1LoginRequestBody.js +2 -2
- package/lib/types/auth/ClientCredentials.js +2 -2
- package/lib/types/auth/CodeProviderService.js +2 -2
- package/lib/types/auth/LocalLoginRequestBody.js +2 -2
- package/lib/types/auth/TicketProviderService.js +2 -2
- package/lib/types/auth/TokenPersistenceService.js +2 -2
- package/lib/types/auth/index.js +8 -10
- package/lib/types/externals.d.js +2 -0
- package/lib/types/index.js +29 -31
- package/lib/types/net/EndpointConfig.js +2 -2
- package/lib/types/net/EndpointMapping.js +2 -2
- package/lib/types/net/EndpointMappings.js +2 -2
- package/lib/types/net/ErrorHandler.js +2 -2
- package/lib/types/net/FetchConfig.js +2 -2
- package/lib/types/net/FetchErrorData.js +6 -8
- package/lib/types/net/FetchResult.js +2 -2
- package/lib/types/net/HTTPMethod.js +2 -2
- package/lib/types/net/HTTPStatusCode.js +12 -14
- package/lib/types/net/Metadata.js +2 -2
- package/lib/types/net/Model.js +2 -2
- package/lib/types/net/ModelCollection.js +2 -2
- package/lib/types/net/ModelsState.js +2 -2
- package/lib/types/net/OAuthToken.js +2 -2
- package/lib/types/net/OAuthTokenOrNull.js +2 -2
- package/lib/types/net/TokenAccessFunction.js +2 -2
- package/lib/types/net/index.js +17 -19
- package/lib/utils/baseActivity.js +83 -85
- package/lib/utils/baseRole.js +32 -36
- package/lib/utils/collection.js +403 -297
- package/lib/utils/cookies.js +19 -23
- package/lib/utils/date.js +188 -205
- package/lib/utils/dom.js +130 -131
- package/lib/utils/domainIdentifier.js +4 -8
- package/lib/utils/entityUserRole.js +2 -5
- package/lib/utils/error.js +14 -19
- package/lib/utils/events.js +32 -31
- package/lib/utils/externalGroup.js +20 -25
- package/lib/utils/externalProviders.js +4 -7
- package/lib/utils/externalTerms.js +6 -6
- package/lib/utils/fetch.js +168 -176
- package/lib/utils/group.js +14 -11
- package/lib/utils/groupDates.js +38 -46
- package/lib/utils/groupRoles.js +23 -32
- package/lib/utils/lockDownBrowser.js +12 -15
- package/lib/utils/logger.js +23 -28
- package/lib/utils/lti.js +4 -7
- package/lib/utils/model.js +28 -43
- package/lib/utils/number.js +9 -13
- package/lib/utils/promise.js +23 -26
- package/lib/utils/quill.js +55 -60
- package/lib/utils/route.js +52 -60
- package/lib/utils/search.js +72 -87
- package/lib/utils/shard.js +33 -42
- package/lib/utils/sort.js +47 -50
- package/lib/utils/string.js +10 -12
- package/lib/utils/table.js +29 -33
- package/lib/utils/timezone.js +7 -12
- package/lib/utils/url.js +130 -144
- package/lib/utils/user.js +54 -64
- package/lib/utils/userAgent.js +7 -14
- package/lib/utils/userRole.js +36 -39
- package/package.json +17 -3
|
@@ -1,158 +1,213 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
(userInfo.id === owner.id && canConnectOwnExternalGroups))
|
|
36
|
-
? selectedExternalGroups.filter(seg => seg.userId === owner.id)
|
|
37
|
-
: undefined
|
|
38
|
-
};
|
|
39
|
-
(0, lodash_1.set)(ownersInitialScheduleData, [owner.userId], ownerData);
|
|
40
|
-
});
|
|
41
|
-
this.setState({
|
|
42
|
-
ownerSchedules: ownersInitialScheduleData,
|
|
43
|
-
isUniTimeScheduleLoadingDone: false
|
|
44
|
-
}, () => (0, lodash_1.forEach)(ownersInitialScheduleData, (ownerSchedule, userId) => {
|
|
45
|
-
this.getOwnerUniTimeGroups(ownerSchedule, userId, externalTermId);
|
|
46
|
-
}));
|
|
47
|
-
};
|
|
48
|
-
this.handleSelectExternalGroups = (event) => {
|
|
49
|
-
const externalId = event.target.value;
|
|
50
|
-
const checked = event.target.checked;
|
|
51
|
-
const { originalConnectedExternalGroups, selectedExternalGroups } = this.props;
|
|
52
|
-
const allOwnerExternalGroups = (0, lodash_1.map)(this.state.ownerSchedules, os => os.externalGroups).reduce((a, b) => (a || []).concat(b || []));
|
|
53
|
-
const selectedExternalGroupsCopy = selectedExternalGroups.slice();
|
|
54
|
-
if (checked) {
|
|
55
|
-
const originalConnectedExternalGroup = originalConnectedExternalGroups.find(oeg => oeg.externalId === externalId);
|
|
56
|
-
const selectedExternalGroup = originalConnectedExternalGroup
|
|
57
|
-
? originalConnectedExternalGroup
|
|
58
|
-
: allOwnerExternalGroups === null || allOwnerExternalGroups === void 0 ? void 0 : allOwnerExternalGroups.find(ao => ao.externalId === externalId);
|
|
59
|
-
if (selectedExternalGroup) {
|
|
60
|
-
selectedExternalGroupsCopy.push(selectedExternalGroup);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
(0, lodash_1.remove)(selectedExternalGroupsCopy, seg => seg.externalId === externalId);
|
|
65
|
-
}
|
|
66
|
-
this.props.handleSelectedExternalGroups(selectedExternalGroupsCopy);
|
|
67
|
-
};
|
|
68
|
-
this.getOwnerUniTimeGroups = (ownerSchedule, userId, externalTermId) => {
|
|
69
|
-
if ((0, shard_1.isPurdueShard)() && ownerSchedule.status === constants_1.MODEL_STATUS.UNINITIALIZED && !ownerSchedule.externalGroups) {
|
|
70
|
-
(0, noStoreSaga_1.registerNoStoreActionHook)(ownerSchedule.hookId, (data) => {
|
|
71
|
-
(0, noStoreSaga_1.unregisterNoStoreActionHook)(ownerSchedule.hookId);
|
|
72
|
-
if (!data || (0, fetch_1.isFetchErrorData)(data)) {
|
|
73
|
-
this.setState({ isShowingErrorAlert: true, isUniTimeScheduleLoadingDone: true });
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
this.setUserUniTimeGroups(userId, data.externalGroups);
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
(0, actionCreator_1.dispatchModelFetchRequest)({
|
|
80
|
-
modelName: 'uniTimeInstructorSchedule',
|
|
81
|
-
queryParams: {
|
|
82
|
-
externalTermId,
|
|
83
|
-
userId
|
|
84
|
-
},
|
|
85
|
-
noStore: true,
|
|
86
|
-
guid: ownerSchedule.hookId
|
|
87
|
-
});
|
|
88
|
-
}
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
import { every, forEach, map, orderBy, remove, set, some } from 'lodash';
|
|
3
|
+
import React, { Component } from 'react';
|
|
4
|
+
import { FormCheck, FormGroup } from 'react-bootstrap';
|
|
5
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
6
|
+
import { BASE_ROLE, MODEL_STATUS } from '../../../constants';
|
|
7
|
+
import { dispatchModelFetchRequest } from '../../../redux/actionCreator';
|
|
8
|
+
import { registerNoStoreActionHook, unregisterNoStoreActionHook } from '../../../redux/sagas/noStoreSaga';
|
|
9
|
+
import { isFetchErrorData } from '../../../utils/fetch';
|
|
10
|
+
import { getModelArray } from '../../../utils/model';
|
|
11
|
+
import { isPurdueShard } from '../../../utils/shard';
|
|
12
|
+
import { displayName } from '../../../utils/user';
|
|
13
|
+
import { AlertWithIcon } from '../../AlertWithIcon';
|
|
14
|
+
import { Loading } from '../../Loading';
|
|
15
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
16
|
+
export class ExternalGroupsAttach extends Component {
|
|
17
|
+
constructor(props) {
|
|
18
|
+
super(props);
|
|
19
|
+
_defineProperty(this, "setOwnerSchedules", (groupUserRoles, externalTermId, selectedExternalGroups) => {
|
|
20
|
+
const {
|
|
21
|
+
canConnectAnyExternalGroups,
|
|
22
|
+
canConnectOwnExternalGroups,
|
|
23
|
+
userInfo
|
|
24
|
+
} = this.props;
|
|
25
|
+
const owners = groupUserRoles.filter(groupUserRole => {
|
|
26
|
+
return groupUserRole.role === BASE_ROLE.GROUP_OWNER;
|
|
27
|
+
});
|
|
28
|
+
const ownersInitialScheduleData = {};
|
|
29
|
+
owners.forEach(owner => {
|
|
30
|
+
const ownerData = {
|
|
31
|
+
hookId: uuidv4(),
|
|
32
|
+
status: canConnectAnyExternalGroups || userInfo.id === owner.id && canConnectOwnExternalGroups ? MODEL_STATUS.UNINITIALIZED : MODEL_STATUS.READY,
|
|
33
|
+
owner,
|
|
34
|
+
externalGroups: !(canConnectAnyExternalGroups || userInfo.id === owner.id && canConnectOwnExternalGroups) ? selectedExternalGroups.filter(seg => seg.userId === owner.id) : undefined
|
|
89
35
|
};
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
36
|
+
set(ownersInitialScheduleData, [owner.userId], ownerData);
|
|
37
|
+
});
|
|
38
|
+
this.setState({
|
|
39
|
+
ownerSchedules: ownersInitialScheduleData,
|
|
40
|
+
isUniTimeScheduleLoadingDone: false
|
|
41
|
+
}, () => forEach(ownersInitialScheduleData, (ownerSchedule, userId) => {
|
|
42
|
+
this.getOwnerUniTimeGroups(ownerSchedule, userId, externalTermId);
|
|
43
|
+
}));
|
|
44
|
+
});
|
|
45
|
+
_defineProperty(this, "handleSelectExternalGroups", event => {
|
|
46
|
+
const externalId = event.target.value;
|
|
47
|
+
const checked = event.target.checked;
|
|
48
|
+
const {
|
|
49
|
+
originalConnectedExternalGroups,
|
|
50
|
+
selectedExternalGroups
|
|
51
|
+
} = this.props;
|
|
52
|
+
const allOwnerExternalGroups = map(this.state.ownerSchedules, os => os.externalGroups).reduce((a, b) => (a || []).concat(b || []));
|
|
53
|
+
const selectedExternalGroupsCopy = selectedExternalGroups.slice();
|
|
54
|
+
if (checked) {
|
|
55
|
+
const originalConnectedExternalGroup = originalConnectedExternalGroups.find(oeg => oeg.externalId === externalId);
|
|
56
|
+
const selectedExternalGroup = originalConnectedExternalGroup ? originalConnectedExternalGroup : allOwnerExternalGroups?.find(ao => ao.externalId === externalId);
|
|
57
|
+
if (selectedExternalGroup) {
|
|
58
|
+
selectedExternalGroupsCopy.push(selectedExternalGroup);
|
|
59
|
+
}
|
|
60
|
+
} else {
|
|
61
|
+
remove(selectedExternalGroupsCopy, seg => seg.externalId === externalId);
|
|
62
|
+
}
|
|
63
|
+
this.props.handleSelectedExternalGroups(selectedExternalGroupsCopy);
|
|
64
|
+
});
|
|
65
|
+
_defineProperty(this, "getOwnerUniTimeGroups", (ownerSchedule, userId, externalTermId) => {
|
|
66
|
+
if (isPurdueShard() && ownerSchedule.status === MODEL_STATUS.UNINITIALIZED && !ownerSchedule.externalGroups) {
|
|
67
|
+
registerNoStoreActionHook(ownerSchedule.hookId, data => {
|
|
68
|
+
unregisterNoStoreActionHook(ownerSchedule.hookId);
|
|
69
|
+
if (!data || isFetchErrorData(data)) {
|
|
96
70
|
this.setState({
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
});
|
|
100
|
-
};
|
|
101
|
-
this.displayOwnerSchedules = (ownerSchedules) => {
|
|
102
|
-
return (0, lodash_1.map)(ownerSchedules, os => {
|
|
103
|
-
if (!!os.externalGroups && os.externalGroups.length > 0) {
|
|
104
|
-
return ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("h4", { children: (0, user_1.displayName)(os.owner) }), this.displayUniTimeGroups(os.externalGroups)] }, os.hookId));
|
|
105
|
-
}
|
|
106
|
-
});
|
|
107
|
-
};
|
|
108
|
-
this.displayUniTimeGroups = (externalGroups) => {
|
|
109
|
-
const { selectedExternalGroups, canConnectAnyExternalGroups, canConnectOwnExternalGroups, userInfo, disabled } = this.props;
|
|
110
|
-
return (0, lodash_1.orderBy)(externalGroups, ['description']).map((eg, index) => {
|
|
111
|
-
const isConnected = selectedExternalGroups.some(seg => seg.externalId === eg.externalId &&
|
|
112
|
-
seg.externalProviderId === eg.externalProviderId &&
|
|
113
|
-
seg.userId === eg.userId);
|
|
114
|
-
if (canConnectAnyExternalGroups ||
|
|
115
|
-
(userInfo.id === eg.userId && canConnectOwnExternalGroups) ||
|
|
116
|
-
isConnected) {
|
|
117
|
-
return ((0, jsx_runtime_1.jsx)(react_bootstrap_1.FormCheck, { id: `external-group-${eg.id}`, type: "checkbox", onChange: this.handleSelectExternalGroups, value: eg.externalId, checked: isConnected, disabled: (userInfo.id !== eg.userId && !canConnectAnyExternalGroups) || disabled, label: `${eg.name} ${eg.description ? `(${eg.description})` : ''}` }, index));
|
|
118
|
-
}
|
|
119
|
-
return null;
|
|
71
|
+
isShowingErrorAlert: true,
|
|
72
|
+
isUniTimeScheduleLoadingDone: true
|
|
120
73
|
});
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
isUniTimeScheduleLoadingDone: false,
|
|
125
|
-
isShowingErrorAlert: false
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
componentDidMount() {
|
|
129
|
-
const { groupUserRoles, externalTermId, selectedExternalGroups } = this.props;
|
|
130
|
-
this.setOwnerSchedules((0, model_1.getModelArray)(groupUserRoles), externalTermId, selectedExternalGroups);
|
|
131
|
-
}
|
|
132
|
-
componentWillUnmount() {
|
|
133
|
-
const { ownerSchedules } = this.state;
|
|
134
|
-
(0, lodash_1.forEach)(ownerSchedules, os => {
|
|
135
|
-
(0, noStoreSaga_1.unregisterNoStoreActionHook)(os.hookId);
|
|
74
|
+
} else {
|
|
75
|
+
this.setUserUniTimeGroups(userId, data.externalGroups);
|
|
76
|
+
}
|
|
136
77
|
});
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
78
|
+
dispatchModelFetchRequest({
|
|
79
|
+
modelName: 'uniTimeInstructorSchedule',
|
|
80
|
+
queryParams: {
|
|
81
|
+
externalTermId,
|
|
82
|
+
userId
|
|
83
|
+
},
|
|
84
|
+
noStore: true,
|
|
85
|
+
guid: ownerSchedule.hookId
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
_defineProperty(this, "setUserUniTimeGroups", (userId, externalGroups) => {
|
|
90
|
+
// Setting the user's course sections load status to be ready
|
|
91
|
+
const ownerSchedules = this.state.ownerSchedules || {};
|
|
92
|
+
ownerSchedules[userId].status = MODEL_STATUS.READY;
|
|
93
|
+
ownerSchedules[userId].externalGroups = externalGroups;
|
|
94
|
+
const isUniTimeScheduleLoadingDone = every(ownerSchedules, os => os.status === MODEL_STATUS.READY);
|
|
95
|
+
this.setState({
|
|
96
|
+
ownerSchedules,
|
|
97
|
+
isUniTimeScheduleLoadingDone
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
_defineProperty(this, "displayOwnerSchedules", ownerSchedules => {
|
|
101
|
+
return map(ownerSchedules, os => {
|
|
102
|
+
if (!!os.externalGroups && os.externalGroups.length > 0) {
|
|
103
|
+
return /*#__PURE__*/_jsxs("div", {
|
|
104
|
+
children: [/*#__PURE__*/_jsx("h4", {
|
|
105
|
+
children: displayName(os.owner)
|
|
106
|
+
}), this.displayUniTimeGroups(os.externalGroups)]
|
|
107
|
+
}, os.hookId);
|
|
145
108
|
}
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
_defineProperty(this, "displayUniTimeGroups", externalGroups => {
|
|
112
|
+
const {
|
|
113
|
+
selectedExternalGroups,
|
|
114
|
+
canConnectAnyExternalGroups,
|
|
115
|
+
canConnectOwnExternalGroups,
|
|
116
|
+
userInfo,
|
|
117
|
+
disabled
|
|
118
|
+
} = this.props;
|
|
119
|
+
return orderBy(externalGroups, ['description']).map((eg, index) => {
|
|
120
|
+
const isConnected = selectedExternalGroups.some(seg => seg.externalId === eg.externalId && seg.externalProviderId === eg.externalProviderId && seg.userId === eg.userId);
|
|
121
|
+
if (canConnectAnyExternalGroups || userInfo.id === eg.userId && canConnectOwnExternalGroups || isConnected) {
|
|
122
|
+
return /*#__PURE__*/_jsx(FormCheck, {
|
|
123
|
+
id: `external-group-${eg.id}`,
|
|
124
|
+
type: "checkbox",
|
|
125
|
+
onChange: this.handleSelectExternalGroups,
|
|
126
|
+
value: eg.externalId,
|
|
127
|
+
checked: isConnected,
|
|
128
|
+
disabled: userInfo.id !== eg.userId && !canConnectAnyExternalGroups || disabled,
|
|
129
|
+
label: `${eg.name} ${eg.description ? `(${eg.description})` : ''}`
|
|
130
|
+
}, index);
|
|
131
|
+
}
|
|
132
|
+
return null;
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
this.state = {
|
|
136
|
+
ownerSchedules: undefined,
|
|
137
|
+
isUniTimeScheduleLoadingDone: false,
|
|
138
|
+
isShowingErrorAlert: false
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
componentDidMount() {
|
|
142
|
+
const {
|
|
143
|
+
groupUserRoles,
|
|
144
|
+
externalTermId,
|
|
145
|
+
selectedExternalGroups
|
|
146
|
+
} = this.props;
|
|
147
|
+
this.setOwnerSchedules(getModelArray(groupUserRoles), externalTermId, selectedExternalGroups);
|
|
148
|
+
}
|
|
149
|
+
componentWillUnmount() {
|
|
150
|
+
const {
|
|
151
|
+
ownerSchedules
|
|
152
|
+
} = this.state;
|
|
153
|
+
forEach(ownerSchedules, os => {
|
|
154
|
+
unregisterNoStoreActionHook(os.hookId);
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
componentDidUpdate(prevProps) {
|
|
158
|
+
const {
|
|
159
|
+
externalTermId: prevExternalTermId,
|
|
160
|
+
groupUserRoles: prevGroupUserRoles
|
|
161
|
+
} = prevProps;
|
|
162
|
+
const {
|
|
163
|
+
externalTermId,
|
|
164
|
+
groupUserRoles,
|
|
165
|
+
selectedExternalGroups
|
|
166
|
+
} = this.props;
|
|
167
|
+
// Assumes group user roles are changing one at a time. Can be made fancier if the need arises
|
|
168
|
+
if (prevExternalTermId !== externalTermId || Object.keys(prevGroupUserRoles).length !== Object.keys(groupUserRoles).length) {
|
|
169
|
+
this.setOwnerSchedules(getModelArray(groupUserRoles), externalTermId, selectedExternalGroups);
|
|
146
170
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
}
|
|
171
|
+
}
|
|
172
|
+
render() {
|
|
173
|
+
const {
|
|
174
|
+
disabledInfoMessage
|
|
175
|
+
} = this.props;
|
|
176
|
+
const {
|
|
177
|
+
ownerSchedules,
|
|
178
|
+
isUniTimeScheduleLoadingDone,
|
|
179
|
+
isShowingErrorAlert
|
|
180
|
+
} = this.state;
|
|
181
|
+
const hasAnyExternalGroups = some(ownerSchedules, os => !!os.externalGroups && os.externalGroups.length > 0);
|
|
182
|
+
return /*#__PURE__*/_jsxs("div", {
|
|
183
|
+
children: [!isUniTimeScheduleLoadingDone && /*#__PURE__*/_jsx(Loading, {}), isUniTimeScheduleLoadingDone && /*#__PURE__*/_jsxs("div", {
|
|
184
|
+
children: [!hasAnyExternalGroups && /*#__PURE__*/_jsx(AlertWithIcon, {
|
|
185
|
+
variant: "info",
|
|
186
|
+
children: /*#__PURE__*/_jsx("p", {
|
|
187
|
+
children: "No course sections eligible for roster sync."
|
|
188
|
+
})
|
|
189
|
+
}), !!disabledInfoMessage && hasAnyExternalGroups && /*#__PURE__*/_jsx(AlertWithIcon, {
|
|
190
|
+
variant: "info",
|
|
191
|
+
children: /*#__PURE__*/_jsx("p", {
|
|
192
|
+
children: disabledInfoMessage
|
|
193
|
+
})
|
|
194
|
+
}), isShowingErrorAlert && /*#__PURE__*/_jsx(AlertWithIcon, {
|
|
195
|
+
variant: "warning",
|
|
196
|
+
onClose: () => {
|
|
197
|
+
this.setState({
|
|
198
|
+
isShowingErrorAlert: false
|
|
199
|
+
});
|
|
200
|
+
},
|
|
201
|
+
children: /*#__PURE__*/_jsx("p", {
|
|
202
|
+
className: "ma0",
|
|
203
|
+
children: "Oops! Something went wrong while loading. Please try again."
|
|
204
|
+
})
|
|
205
|
+
}), ' ', hasAnyExternalGroups && !!ownerSchedules && /*#__PURE__*/_jsx(FormGroup, {
|
|
206
|
+
className: "ml4 f6",
|
|
207
|
+
children: this.displayOwnerSchedules(ownerSchedules)
|
|
208
|
+
})]
|
|
209
|
+
})]
|
|
210
|
+
});
|
|
211
|
+
}
|
|
157
212
|
}
|
|
158
|
-
exports.ExternalGroupsAttach = ExternalGroupsAttach;
|
|
213
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJldmVyeSIsImZvckVhY2giLCJtYXAiLCJvcmRlckJ5IiwicmVtb3ZlIiwic2V0Iiwic29tZSIsIlJlYWN0IiwiQ29tcG9uZW50IiwiRm9ybUNoZWNrIiwiRm9ybUdyb3VwIiwidjQiLCJ1dWlkdjQiLCJCQVNFX1JPTEUiLCJNT0RFTF9TVEFUVVMiLCJkaXNwYXRjaE1vZGVsRmV0Y2hSZXF1ZXN0IiwicmVnaXN0ZXJOb1N0b3JlQWN0aW9uSG9vayIsInVucmVnaXN0ZXJOb1N0b3JlQWN0aW9uSG9vayIsImlzRmV0Y2hFcnJvckRhdGEiLCJnZXRNb2RlbEFycmF5IiwiaXNQdXJkdWVTaGFyZCIsImRpc3BsYXlOYW1lIiwiQWxlcnRXaXRoSWNvbiIsIkxvYWRpbmciLCJqc3giLCJfanN4IiwianN4cyIsIl9qc3hzIiwiRXh0ZXJuYWxHcm91cHNBdHRhY2giLCJjb25zdHJ1Y3RvciIsInByb3BzIiwiX2RlZmluZVByb3BlcnR5IiwiZ3JvdXBVc2VyUm9sZXMiLCJleHRlcm5hbFRlcm1JZCIsInNlbGVjdGVkRXh0ZXJuYWxHcm91cHMiLCJjYW5Db25uZWN0QW55RXh0ZXJuYWxHcm91cHMiLCJjYW5Db25uZWN0T3duRXh0ZXJuYWxHcm91cHMiLCJ1c2VySW5mbyIsIm93bmVycyIsImZpbHRlciIsImdyb3VwVXNlclJvbGUiLCJyb2xlIiwiR1JPVVBfT1dORVIiLCJvd25lcnNJbml0aWFsU2NoZWR1bGVEYXRhIiwib3duZXIiLCJvd25lckRhdGEiLCJob29rSWQiLCJzdGF0dXMiLCJpZCIsIlVOSU5JVElBTElaRUQiLCJSRUFEWSIsImV4dGVybmFsR3JvdXBzIiwic2VnIiwidXNlcklkIiwidW5kZWZpbmVkIiwic2V0U3RhdGUiLCJvd25lclNjaGVkdWxlcyIsImlzVW5pVGltZVNjaGVkdWxlTG9hZGluZ0RvbmUiLCJvd25lclNjaGVkdWxlIiwiZ2V0T3duZXJVbmlUaW1lR3JvdXBzIiwiZXZlbnQiLCJleHRlcm5hbElkIiwidGFyZ2V0IiwidmFsdWUiLCJjaGVja2VkIiwib3JpZ2luYWxDb25uZWN0ZWRFeHRlcm5hbEdyb3VwcyIsImFsbE93bmVyRXh0ZXJuYWxHcm91cHMiLCJzdGF0ZSIsIm9zIiwicmVkdWNlIiwiYSIsImIiLCJjb25jYXQiLCJzZWxlY3RlZEV4dGVybmFsR3JvdXBzQ29weSIsInNsaWNlIiwib3JpZ2luYWxDb25uZWN0ZWRFeHRlcm5hbEdyb3VwIiwiZmluZCIsIm9lZyIsInNlbGVjdGVkRXh0ZXJuYWxHcm91cCIsImFvIiwicHVzaCIsImhhbmRsZVNlbGVjdGVkRXh0ZXJuYWxHcm91cHMiLCJkYXRhIiwiaXNTaG93aW5nRXJyb3JBbGVydCIsInNldFVzZXJVbmlUaW1lR3JvdXBzIiwibW9kZWxOYW1lIiwicXVlcnlQYXJhbXMiLCJub1N0b3JlIiwiZ3VpZCIsImxlbmd0aCIsImNoaWxkcmVuIiwiZGlzcGxheVVuaVRpbWVHcm91cHMiLCJkaXNhYmxlZCIsImVnIiwiaW5kZXgiLCJpc0Nvbm5lY3RlZCIsImV4dGVybmFsUHJvdmlkZXJJZCIsInR5cGUiLCJvbkNoYW5nZSIsImhhbmRsZVNlbGVjdEV4dGVybmFsR3JvdXBzIiwibGFiZWwiLCJuYW1lIiwiZGVzY3JpcHRpb24iLCJjb21wb25lbnREaWRNb3VudCIsInNldE93bmVyU2NoZWR1bGVzIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJjb21wb25lbnREaWRVcGRhdGUiLCJwcmV2UHJvcHMiLCJwcmV2RXh0ZXJuYWxUZXJtSWQiLCJwcmV2R3JvdXBVc2VyUm9sZXMiLCJPYmplY3QiLCJrZXlzIiwicmVuZGVyIiwiZGlzYWJsZWRJbmZvTWVzc2FnZSIsImhhc0FueUV4dGVybmFsR3JvdXBzIiwidmFyaWFudCIsIm9uQ2xvc2UiLCJjbGFzc05hbWUiLCJkaXNwbGF5T3duZXJTY2hlZHVsZXMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9Hcm91cHMvRXh0ZXJuYWxHcm91cHMvQXR0YWNoLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaWN0aW9uYXJ5LCBldmVyeSwgZm9yRWFjaCwgbWFwLCBvcmRlckJ5LCByZW1vdmUsIHNldCwgc29tZSB9IGZyb20gJ2xvZGFzaCdcbmltcG9ydCBSZWFjdCwgeyBDaGFuZ2VFdmVudCwgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBGb3JtQ2hlY2ssIEZvcm1Hcm91cCB9IGZyb20gJ3JlYWN0LWJvb3RzdHJhcCdcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnXG5pbXBvcnQgeyBCQVNFX1JPTEUsIE1PREVMX1NUQVRVUyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cydcbmltcG9ydCB7IGRpc3BhdGNoTW9kZWxGZXRjaFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi9yZWR1eC9hY3Rpb25DcmVhdG9yJ1xuaW1wb3J0IHsgcmVnaXN0ZXJOb1N0b3JlQWN0aW9uSG9vaywgdW5yZWdpc3Rlck5vU3RvcmVBY3Rpb25Ib29rIH0gZnJvbSAnLi4vLi4vLi4vcmVkdXgvc2FnYXMvbm9TdG9yZVNhZ2EnXG5pbXBvcnQge1xuXHRFeHRlcm5hbEdyb3VwLFxuXHRGZXRjaEVycm9yRGF0YSxcblx0R3JvdXBVc2VyUm9sZSxcblx0SW5zdHJ1Y3RvclNjaGVkdWxlLFxuXHRMdGlMYXVuY2gsXG5cdE1vZGVsQ29sbGVjdGlvbixcblx0T3duZXJTY2hlZHVsZSxcblx0VW5pVGltZUdyb3VwLFxuXHRVc2VySW5mb1xufSBmcm9tICcuLi8uLi8uLi90eXBlcydcbmltcG9ydCB7IGlzRmV0Y2hFcnJvckRhdGEgfSBmcm9tICcuLi8uLi8uLi91dGlscy9mZXRjaCdcbmltcG9ydCB7IGdldE1vZGVsQXJyYXkgfSBmcm9tICcuLi8uLi8uLi91dGlscy9tb2RlbCdcbmltcG9ydCB7IGlzUHVyZHVlU2hhcmQgfSBmcm9tICcuLi8uLi8uLi91dGlscy9zaGFyZCdcbmltcG9ydCB7IGRpc3BsYXlOYW1lIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvdXNlcidcbmltcG9ydCB7IEFsZXJ0V2l0aEljb24gfSBmcm9tICcuLi8uLi9BbGVydFdpdGhJY29uJ1xuaW1wb3J0IHsgTG9hZGluZyB9IGZyb20gJy4uLy4uL0xvYWRpbmcnXG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZXJuYWxHcm91cHNBdHRhY2hQcm9wcyB7XG5cdHVzZXJJbmZvOiBVc2VySW5mb1xuXHRjYW5SZWFkRXh0ZXJuYWxHcm91cHM6IGJvb2xlYW5cblx0Y2FuQ29ubmVjdEFueUV4dGVybmFsR3JvdXBzOiBib29sZWFuXG5cdGNhbkNvbm5lY3RPd25FeHRlcm5hbEdyb3VwczogYm9vbGVhblxuXHRvcmlnaW5hbENvbm5lY3RlZEV4dGVybmFsR3JvdXBzOiBBcnJheTxFeHRlcm5hbEdyb3VwIHwgTHRpTGF1bmNoPlxuXHRzZWxlY3RlZEV4dGVybmFsR3JvdXBzOiBBcnJheTxFeHRlcm5hbEdyb3VwIHwgTHRpTGF1bmNoIHwgVW5pVGltZUdyb3VwPlxuXHRleHRlcm5hbFRlcm1JZDogbnVtYmVyXG5cdGhhbmRsZVNlbGVjdGVkRXh0ZXJuYWxHcm91cHM6IChleHRlcm5hbEdyb3VwczogQXJyYXk8RXh0ZXJuYWxHcm91cCB8IEx0aUxhdW5jaCB8IFVuaVRpbWVHcm91cD4pID0+IHZvaWRcblx0Z3JvdXBVc2VyUm9sZXM6IE1vZGVsQ29sbGVjdGlvbjxHcm91cFVzZXJSb2xlPlxuXHRkaXNhYmxlZD86IGJvb2xlYW5cblx0ZGlzYWJsZWRJbmZvTWVzc2FnZT86IHN0cmluZyB8IFJlYWN0LkpTWC5FbGVtZW50XG59XG5cbmludGVyZmFjZSBFeHRlcm5hbEdyb3Vwc0F0dGFjaFN0YXRlIHtcblx0b3duZXJTY2hlZHVsZXM/OiBEaWN0aW9uYXJ5PE93bmVyU2NoZWR1bGU+XG5cdGlzVW5pVGltZVNjaGVkdWxlTG9hZGluZ0RvbmU6IGJvb2xlYW5cblx0aXNTaG93aW5nRXJyb3JBbGVydDogYm9vbGVhblxufVxuXG5leHBvcnQgY2xhc3MgRXh0ZXJuYWxHcm91cHNBdHRhY2ggZXh0ZW5kcyBDb21wb25lbnQ8RXh0ZXJuYWxHcm91cHNBdHRhY2hQcm9wcywgRXh0ZXJuYWxHcm91cHNBdHRhY2hTdGF0ZT4ge1xuXHRjb25zdHJ1Y3Rvcihwcm9wczogRXh0ZXJuYWxHcm91cHNBdHRhY2hQcm9wcykge1xuXHRcdHN1cGVyKHByb3BzKVxuXHRcdHRoaXMuc3RhdGUgPSB7XG5cdFx0XHRvd25lclNjaGVkdWxlczogdW5kZWZpbmVkLFxuXHRcdFx0aXNVbmlUaW1lU2NoZWR1bGVMb2FkaW5nRG9uZTogZmFsc2UsXG5cdFx0XHRpc1Nob3dpbmdFcnJvckFsZXJ0OiBmYWxzZVxuXHRcdH1cblx0fVxuXG5cdGNvbXBvbmVudERpZE1vdW50KCkge1xuXHRcdGNvbnN0IHsgZ3JvdXBVc2VyUm9sZXMsIGV4dGVybmFsVGVybUlkLCBzZWxlY3RlZEV4dGVybmFsR3JvdXBzIH0gPSB0aGlzLnByb3BzXG5cdFx0dGhpcy5zZXRPd25lclNjaGVkdWxlcyhnZXRNb2RlbEFycmF5KGdyb3VwVXNlclJvbGVzKSwgZXh0ZXJuYWxUZXJtSWQsIHNlbGVjdGVkRXh0ZXJuYWxHcm91cHMpXG5cdH1cblxuXHRjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcblx0XHRjb25zdCB7IG93bmVyU2NoZWR1bGVzIH0gPSB0aGlzLnN0YXRlXG5cdFx0Zm9yRWFjaChvd25lclNjaGVkdWxlcywgb3MgPT4ge1xuXHRcdFx0dW5yZWdpc3Rlck5vU3RvcmVBY3Rpb25Ib29rKG9zLmhvb2tJZClcblx0XHR9KVxuXHR9XG5cblx0Y29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wczogUmVhZG9ubHk8RXh0ZXJuYWxHcm91cHNBdHRhY2hQcm9wcz4pIHtcblx0XHRjb25zdCB7IGV4dGVybmFsVGVybUlkOiBwcmV2RXh0ZXJuYWxUZXJtSWQsIGdyb3VwVXNlclJvbGVzOiBwcmV2R3JvdXBVc2VyUm9sZXMgfSA9IHByZXZQcm9wc1xuXHRcdGNvbnN0IHsgZXh0ZXJuYWxUZXJtSWQsIGdyb3VwVXNlclJvbGVzLCBzZWxlY3RlZEV4dGVybmFsR3JvdXBzIH0gPSB0aGlzLnByb3BzXG5cdFx0Ly8gQXNzdW1lcyBncm91cCB1c2VyIHJvbGVzIGFyZSBjaGFuZ2luZyBvbmUgYXQgYSB0aW1lLiBDYW4gYmUgbWFkZSBmYW5jaWVyIGlmIHRoZSBuZWVkIGFyaXNlc1xuXHRcdGlmIChcblx0XHRcdHByZXZFeHRlcm5hbFRlcm1JZCAhPT0gZXh0ZXJuYWxUZXJtSWQgfHxcblx0XHRcdE9iamVjdC5rZXlzKHByZXZHcm91cFVzZXJSb2xlcykubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhncm91cFVzZXJSb2xlcykubGVuZ3RoXG5cdFx0KSB7XG5cdFx0XHR0aGlzLnNldE93bmVyU2NoZWR1bGVzKGdldE1vZGVsQXJyYXkoZ3JvdXBVc2VyUm9sZXMpLCBleHRlcm5hbFRlcm1JZCwgc2VsZWN0ZWRFeHRlcm5hbEdyb3Vwcylcblx0XHR9XG5cdH1cblxuXHRzZXRPd25lclNjaGVkdWxlcyA9IChcblx0XHRncm91cFVzZXJSb2xlczogR3JvdXBVc2VyUm9sZVtdLFxuXHRcdGV4dGVybmFsVGVybUlkOiBudW1iZXIsXG5cdFx0c2VsZWN0ZWRFeHRlcm5hbEdyb3VwczogQXJyYXk8RXh0ZXJuYWxHcm91cCB8IEx0aUxhdW5jaCB8IFVuaVRpbWVHcm91cD5cblx0KSA9PiB7XG5cdFx0Y29uc3QgeyBjYW5Db25uZWN0QW55RXh0ZXJuYWxHcm91cHMsIGNhbkNvbm5lY3RPd25FeHRlcm5hbEdyb3VwcywgdXNlckluZm8gfSA9IHRoaXMucHJvcHNcblx0XHRjb25zdCBvd25lcnMgPSBncm91cFVzZXJSb2xlcy5maWx0ZXIoZ3JvdXBVc2VyUm9sZSA9PiB7XG5cdFx0XHRyZXR1cm4gZ3JvdXBVc2VyUm9sZS5yb2xlID09PSBCQVNFX1JPTEUuR1JPVVBfT1dORVJcblx0XHR9KVxuXG5cdFx0Y29uc3Qgb3duZXJzSW5pdGlhbFNjaGVkdWxlRGF0YTogRGljdGlvbmFyeTxPd25lclNjaGVkdWxlPiA9IHt9XG5cdFx0b3duZXJzLmZvckVhY2gob3duZXIgPT4ge1xuXHRcdFx0Y29uc3Qgb3duZXJEYXRhOiBPd25lclNjaGVkdWxlID0ge1xuXHRcdFx0XHRob29rSWQ6IHV1aWR2NCgpLFxuXHRcdFx0XHRzdGF0dXM6XG5cdFx0XHRcdFx0Y2FuQ29ubmVjdEFueUV4dGVybmFsR3JvdXBzIHx8ICh1c2VySW5mby5pZCA9PT0gb3duZXIuaWQgJiYgY2FuQ29ubmVjdE93bkV4dGVybmFsR3JvdXBzKVxuXHRcdFx0XHRcdFx0PyBNT0RFTF9TVEFUVVMuVU5JTklUSUFMSVpFRFxuXHRcdFx0XHRcdFx0OiBNT0RFTF9TVEFUVVMuUkVBRFksXG5cdFx0XHRcdG93bmVyLFxuXHRcdFx0XHRleHRlcm5hbEdyb3VwczogIShcblx0XHRcdFx0XHRjYW5Db25uZWN0QW55RXh0ZXJuYWxHcm91cHMgfHxcblx0XHRcdFx0XHQodXNlckluZm8uaWQgPT09IG93bmVyLmlkICYmIGNhbkNvbm5lY3RPd25FeHRlcm5hbEdyb3Vwcylcblx0XHRcdFx0KVxuXHRcdFx0XHRcdD8gc2VsZWN0ZWRFeHRlcm5hbEdyb3Vwcy5maWx0ZXIoc2VnID0+IHNlZy51c2VySWQgPT09IG93bmVyLmlkKVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkXG5cdFx0XHR9XG5cdFx0XHRzZXQob3duZXJzSW5pdGlhbFNjaGVkdWxlRGF0YSwgW293bmVyLnVzZXJJZF0sIG93bmVyRGF0YSlcblx0XHR9KVxuXHRcdHRoaXMuc2V0U3RhdGUoXG5cdFx0XHR7XG5cdFx0XHRcdG93bmVyU2NoZWR1bGVzOiBvd25lcnNJbml0aWFsU2NoZWR1bGVEYXRhLFxuXHRcdFx0XHRpc1VuaVRpbWVTY2hlZHVsZUxvYWRpbmdEb25lOiBmYWxzZVxuXHRcdFx0fSxcblx0XHRcdCgpID0+XG5cdFx0XHRcdGZvckVhY2gob3duZXJzSW5pdGlhbFNjaGVkdWxlRGF0YSwgKG93bmVyU2NoZWR1bGUsIHVzZXJJZCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuZ2V0T3duZXJVbmlUaW1lR3JvdXBzKG93bmVyU2NoZWR1bGUsIHVzZXJJZCwgZXh0ZXJuYWxUZXJtSWQpXG5cdFx0XHRcdH0pXG5cdFx0KVxuXHR9XG5cblx0aGFuZGxlU2VsZWN0RXh0ZXJuYWxHcm91cHMgPSAoZXZlbnQ6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG5cdFx0Y29uc3QgZXh0ZXJuYWxJZCA9IGV2ZW50LnRhcmdldC52YWx1ZVxuXHRcdGNvbnN0IGNoZWNrZWQgPSBldmVudC50YXJnZXQuY2hlY2tlZFxuXHRcdGNvbnN0IHsgb3JpZ2luYWxDb25uZWN0ZWRFeHRlcm5hbEdyb3Vwcywgc2VsZWN0ZWRFeHRlcm5hbEdyb3VwcyB9ID0gdGhpcy5wcm9wc1xuXG5cdFx0Y29uc3QgYWxsT3duZXJFeHRlcm5hbEdyb3VwcyA9IG1hcCh0aGlzLnN0YXRlLm93bmVyU2NoZWR1bGVzLCBvcyA9PiBvcy5leHRlcm5hbEdyb3VwcykucmVkdWNlKChhLCBiKSA9PlxuXHRcdFx0KGEgfHwgW10pLmNvbmNhdChiIHx8IFtdKVxuXHRcdClcblx0XHRjb25zdCBzZWxlY3RlZEV4dGVybmFsR3JvdXBzQ29weSA9IHNlbGVjdGVkRXh0ZXJuYWxHcm91cHMuc2xpY2UoKVxuXG5cdFx0aWYgKGNoZWNrZWQpIHtcblx0XHRcdGNvbnN0IG9yaWdpbmFsQ29ubmVjdGVkRXh0ZXJuYWxHcm91cCA9IG9yaWdpbmFsQ29ubmVjdGVkRXh0ZXJuYWxHcm91cHMuZmluZChcblx0XHRcdFx0b2VnID0+IG9lZy5leHRlcm5hbElkID09PSBleHRlcm5hbElkXG5cdFx0XHQpXG5cdFx0XHRjb25zdCBzZWxlY3RlZEV4dGVybmFsR3JvdXAgPSBvcmlnaW5hbENvbm5lY3RlZEV4dGVybmFsR3JvdXBcblx0XHRcdFx0PyBvcmlnaW5hbENvbm5lY3RlZEV4dGVybmFsR3JvdXBcblx0XHRcdFx0OiBhbGxPd25lckV4dGVybmFsR3JvdXBzPy5maW5kKGFvID0+IGFvLmV4dGVybmFsSWQgPT09IGV4dGVybmFsSWQpXG5cblx0XHRcdGlmIChzZWxlY3RlZEV4dGVybmFsR3JvdXApIHtcblx0XHRcdFx0c2VsZWN0ZWRFeHRlcm5hbEdyb3Vwc0NvcHkucHVzaChzZWxlY3RlZEV4dGVybmFsR3JvdXApXG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlbW92ZShzZWxlY3RlZEV4dGVybmFsR3JvdXBzQ29weSwgc2VnID0+IHNlZy5leHRlcm5hbElkID09PSBleHRlcm5hbElkKVxuXHRcdH1cblxuXHRcdHRoaXMucHJvcHMuaGFuZGxlU2VsZWN0ZWRFeHRlcm5hbEdyb3VwcyhzZWxlY3RlZEV4dGVybmFsR3JvdXBzQ29weSlcblx0fVxuXG5cdGdldE93bmVyVW5pVGltZUdyb3VwcyA9IChvd25lclNjaGVkdWxlOiBPd25lclNjaGVkdWxlLCB1c2VySWQ6IHN0cmluZywgZXh0ZXJuYWxUZXJtSWQ6IG51bWJlcikgPT4ge1xuXHRcdGlmIChpc1B1cmR1ZVNoYXJkKCkgJiYgb3duZXJTY2hlZHVsZS5zdGF0dXMgPT09IE1PREVMX1NUQVRVUy5VTklOSVRJQUxJWkVEICYmICFvd25lclNjaGVkdWxlLmV4dGVybmFsR3JvdXBzKSB7XG5cdFx0XHRyZWdpc3Rlck5vU3RvcmVBY3Rpb25Ib29rKG93bmVyU2NoZWR1bGUuaG9va0lkLCAoZGF0YTogSW5zdHJ1Y3RvclNjaGVkdWxlIHwgRmV0Y2hFcnJvckRhdGEgfCBudWxsKSA9PiB7XG5cdFx0XHRcdHVucmVnaXN0ZXJOb1N0b3JlQWN0aW9uSG9vayhvd25lclNjaGVkdWxlLmhvb2tJZClcblx0XHRcdFx0aWYgKCFkYXRhIHx8IGlzRmV0Y2hFcnJvckRhdGEoZGF0YSkpIHtcblx0XHRcdFx0XHR0aGlzLnNldFN0YXRlKHsgaXNTaG93aW5nRXJyb3JBbGVydDogdHJ1ZSwgaXNVbmlUaW1lU2NoZWR1bGVMb2FkaW5nRG9uZTogdHJ1ZSB9KVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuc2V0VXNlclVuaVRpbWVHcm91cHModXNlcklkLCBkYXRhLmV4dGVybmFsR3JvdXBzKVxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0ZGlzcGF0Y2hNb2RlbEZldGNoUmVxdWVzdCh7XG5cdFx0XHRcdG1vZGVsTmFtZTogJ3VuaVRpbWVJbnN0cnVjdG9yU2NoZWR1bGUnLFxuXHRcdFx0XHRxdWVyeVBhcmFtczoge1xuXHRcdFx0XHRcdGV4dGVybmFsVGVybUlkLFxuXHRcdFx0XHRcdHVzZXJJZFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRub1N0b3JlOiB0cnVlLFxuXHRcdFx0XHRndWlkOiBvd25lclNjaGVkdWxlLmhvb2tJZFxuXHRcdFx0fSlcblx0XHR9XG5cdH1cblxuXHRzZXRVc2VyVW5pVGltZUdyb3VwcyA9ICh1c2VySWQ6IHN0cmluZywgZXh0ZXJuYWxHcm91cHM6IFVuaVRpbWVHcm91cFtdKSA9PiB7XG5cdFx0Ly8gU2V0dGluZyB0aGUgdXNlcidzIGNvdXJzZSBzZWN0aW9ucyBsb2FkIHN0YXR1cyB0byBiZSByZWFkeVxuXHRcdGNvbnN0IG93bmVyU2NoZWR1bGVzID0gdGhpcy5zdGF0ZS5vd25lclNjaGVkdWxlcyB8fCB7fVxuXHRcdG93bmVyU2NoZWR1bGVzW3VzZXJJZF0uc3RhdHVzID0gTU9ERUxfU1RBVFVTLlJFQURZXG5cdFx0b3duZXJTY2hlZHVsZXNbdXNlcklkXS5leHRlcm5hbEdyb3VwcyA9IGV4dGVybmFsR3JvdXBzXG5cblx0XHRjb25zdCBpc1VuaVRpbWVTY2hlZHVsZUxvYWRpbmdEb25lID0gZXZlcnkob3duZXJTY2hlZHVsZXMsIG9zID0+IG9zLnN0YXR1cyA9PT0gTU9ERUxfU1RBVFVTLlJFQURZKVxuXG5cdFx0dGhpcy5zZXRTdGF0ZSh7XG5cdFx0XHRvd25lclNjaGVkdWxlcyxcblx0XHRcdGlzVW5pVGltZVNjaGVkdWxlTG9hZGluZ0RvbmVcblx0XHR9KVxuXHR9XG5cblx0ZGlzcGxheU93bmVyU2NoZWR1bGVzID0gKG93bmVyU2NoZWR1bGVzOiBEaWN0aW9uYXJ5PE93bmVyU2NoZWR1bGU+KSA9PiB7XG5cdFx0cmV0dXJuIG1hcChvd25lclNjaGVkdWxlcywgb3MgPT4ge1xuXHRcdFx0aWYgKCEhb3MuZXh0ZXJuYWxHcm91cHMgJiYgb3MuZXh0ZXJuYWxHcm91cHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdDxkaXYga2V5PXtvcy5ob29rSWR9PlxuXHRcdFx0XHRcdFx0PGg0PntkaXNwbGF5TmFtZShvcy5vd25lcil9PC9oND5cblx0XHRcdFx0XHRcdHt0aGlzLmRpc3BsYXlVbmlUaW1lR3JvdXBzKG9zLmV4dGVybmFsR3JvdXBzKX1cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0KVxuXHRcdFx0fVxuXHRcdH0pXG5cdH1cblxuXHRkaXNwbGF5VW5pVGltZUdyb3VwcyA9IChleHRlcm5hbEdyb3VwczogQXJyYXk8RXh0ZXJuYWxHcm91cCB8IEx0aUxhdW5jaCB8IFVuaVRpbWVHcm91cD4pID0+IHtcblx0XHRjb25zdCB7IHNlbGVjdGVkRXh0ZXJuYWxHcm91cHMsIGNhbkNvbm5lY3RBbnlFeHRlcm5hbEdyb3VwcywgY2FuQ29ubmVjdE93bkV4dGVybmFsR3JvdXBzLCB1c2VySW5mbywgZGlzYWJsZWQgfSA9XG5cdFx0XHR0aGlzLnByb3BzXG5cblx0XHRyZXR1cm4gb3JkZXJCeShleHRlcm5hbEdyb3VwcywgWydkZXNjcmlwdGlvbiddKS5tYXAoKGVnLCBpbmRleCkgPT4ge1xuXHRcdFx0Y29uc3QgaXNDb25uZWN0ZWQgPSBzZWxlY3RlZEV4dGVybmFsR3JvdXBzLnNvbWUoXG5cdFx0XHRcdHNlZyA9PlxuXHRcdFx0XHRcdHNlZy5leHRlcm5hbElkID09PSBlZy5leHRlcm5hbElkICYmXG5cdFx0XHRcdFx0c2VnLmV4dGVybmFsUHJvdmlkZXJJZCA9PT0gZWcuZXh0ZXJuYWxQcm92aWRlcklkICYmXG5cdFx0XHRcdFx0c2VnLnVzZXJJZCA9PT0gZWcudXNlcklkXG5cdFx0XHQpXG5cblx0XHRcdGlmIChcblx0XHRcdFx0Y2FuQ29ubmVjdEFueUV4dGVybmFsR3JvdXBzIHx8XG5cdFx0XHRcdCh1c2VySW5mby5pZCA9PT0gZWcudXNlcklkICYmIGNhbkNvbm5lY3RPd25FeHRlcm5hbEdyb3VwcykgfHxcblx0XHRcdFx0aXNDb25uZWN0ZWRcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdDxGb3JtQ2hlY2tcblx0XHRcdFx0XHRcdGlkPXtgZXh0ZXJuYWwtZ3JvdXAtJHtlZy5pZH1gfVxuXHRcdFx0XHRcdFx0dHlwZT1cImNoZWNrYm94XCJcblx0XHRcdFx0XHRcdGtleT17aW5kZXh9XG5cdFx0XHRcdFx0XHRvbkNoYW5nZT17dGhpcy5oYW5kbGVTZWxlY3RFeHRlcm5hbEdyb3Vwc31cblx0XHRcdFx0XHRcdHZhbHVlPXtlZy5leHRlcm5hbElkfVxuXHRcdFx0XHRcdFx0Y2hlY2tlZD17aXNDb25uZWN0ZWR9XG5cdFx0XHRcdFx0XHRkaXNhYmxlZD17KHVzZXJJbmZvLmlkICE9PSBlZy51c2VySWQgJiYgIWNhbkNvbm5lY3RBbnlFeHRlcm5hbEdyb3VwcykgfHwgZGlzYWJsZWR9XG5cdFx0XHRcdFx0XHRsYWJlbD17YCR7ZWcubmFtZX0gJHtlZy5kZXNjcmlwdGlvbiA/IGAoJHtlZy5kZXNjcmlwdGlvbn0pYCA6ICcnfWB9XG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0KVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG51bGxcblx0XHR9KVxuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdGNvbnN0IHsgZGlzYWJsZWRJbmZvTWVzc2FnZSB9ID0gdGhpcy5wcm9wc1xuXHRcdGNvbnN0IHsgb3duZXJTY2hlZHVsZXMsIGlzVW5pVGltZVNjaGVkdWxlTG9hZGluZ0RvbmUsIGlzU2hvd2luZ0Vycm9yQWxlcnQgfSA9IHRoaXMuc3RhdGVcblx0XHRjb25zdCBoYXNBbnlFeHRlcm5hbEdyb3VwcyA9IHNvbWUob3duZXJTY2hlZHVsZXMsIG9zID0+ICEhb3MuZXh0ZXJuYWxHcm91cHMgJiYgb3MuZXh0ZXJuYWxHcm91cHMubGVuZ3RoID4gMClcblxuXHRcdHJldHVybiAoXG5cdFx0XHQ8ZGl2PlxuXHRcdFx0XHR7IWlzVW5pVGltZVNjaGVkdWxlTG9hZGluZ0RvbmUgJiYgPExvYWRpbmcgLz59XG5cdFx0XHRcdHtpc1VuaVRpbWVTY2hlZHVsZUxvYWRpbmdEb25lICYmIChcblx0XHRcdFx0XHQ8ZGl2PlxuXHRcdFx0XHRcdFx0eyFoYXNBbnlFeHRlcm5hbEdyb3VwcyAmJiAoXG5cdFx0XHRcdFx0XHRcdDxBbGVydFdpdGhJY29uIHZhcmlhbnQ9XCJpbmZvXCI+XG5cdFx0XHRcdFx0XHRcdFx0PHA+Tm8gY291cnNlIHNlY3Rpb25zIGVsaWdpYmxlIGZvciByb3N0ZXIgc3luYy48L3A+XG5cdFx0XHRcdFx0XHRcdDwvQWxlcnRXaXRoSWNvbj5cblx0XHRcdFx0XHRcdCl9XG5cdFx0XHRcdFx0XHR7ISFkaXNhYmxlZEluZm9NZXNzYWdlICYmIGhhc0FueUV4dGVybmFsR3JvdXBzICYmIChcblx0XHRcdFx0XHRcdFx0PEFsZXJ0V2l0aEljb24gdmFyaWFudD1cImluZm9cIj5cblx0XHRcdFx0XHRcdFx0XHQ8cD57ZGlzYWJsZWRJbmZvTWVzc2FnZX08L3A+XG5cdFx0XHRcdFx0XHRcdDwvQWxlcnRXaXRoSWNvbj5cblx0XHRcdFx0XHRcdCl9XG5cdFx0XHRcdFx0XHR7aXNTaG93aW5nRXJyb3JBbGVydCAmJiAoXG5cdFx0XHRcdFx0XHRcdDxBbGVydFdpdGhJY29uXG5cdFx0XHRcdFx0XHRcdFx0dmFyaWFudD1cIndhcm5pbmdcIlxuXHRcdFx0XHRcdFx0XHRcdG9uQ2xvc2U9eygpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuc2V0U3RhdGUoe1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpc1Nob3dpbmdFcnJvckFsZXJ0OiBmYWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHR9fT5cblx0XHRcdFx0XHRcdFx0XHQ8cCBjbGFzc05hbWU9XCJtYTBcIj5Pb3BzISBTb21ldGhpbmcgd2VudCB3cm9uZyB3aGlsZSBsb2FkaW5nLiBQbGVhc2UgdHJ5IGFnYWluLjwvcD5cblx0XHRcdFx0XHRcdFx0PC9BbGVydFdpdGhJY29uPlxuXHRcdFx0XHRcdFx0KX17JyAnfVxuXHRcdFx0XHRcdFx0e2hhc0FueUV4dGVybmFsR3JvdXBzICYmICEhb3duZXJTY2hlZHVsZXMgJiYgKFxuXHRcdFx0XHRcdFx0XHQ8Rm9ybUdyb3VwIGNsYXNzTmFtZT1cIm1sNCBmNlwiPnt0aGlzLmRpc3BsYXlPd25lclNjaGVkdWxlcyhvd25lclNjaGVkdWxlcyl9PC9Gb3JtR3JvdXA+XG5cdFx0XHRcdFx0XHQpfVxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQpfVxuXHRcdFx0PC9kaXY+XG5cdFx0KVxuXHR9XG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxTQUFxQkEsS0FBSyxFQUFFQyxPQUFPLEVBQUVDLEdBQUcsRUFBRUMsT0FBTyxFQUFFQyxNQUFNLEVBQUVDLEdBQUcsRUFBRUMsSUFBSSxRQUFRLFFBQVE7QUFDcEYsT0FBT0MsS0FBSyxJQUFpQkMsU0FBUyxRQUFRLE9BQU87QUFDckQsU0FBU0MsU0FBUyxFQUFFQyxTQUFTLFFBQVEsaUJBQWlCO0FBQ3RELFNBQVNDLEVBQUUsSUFBSUMsTUFBTSxRQUFRLE1BQU07QUFDbkMsU0FBU0MsU0FBUyxFQUFFQyxZQUFZLFFBQVEsb0JBQW9CO0FBQzVELFNBQVNDLHlCQUF5QixRQUFRLDhCQUE4QjtBQUN4RSxTQUFTQyx5QkFBeUIsRUFBRUMsMkJBQTJCLFFBQVEsa0NBQWtDO0FBWXpHLFNBQVNDLGdCQUFnQixRQUFRLHNCQUFzQjtBQUN2RCxTQUFTQyxhQUFhLFFBQVEsc0JBQXNCO0FBQ3BELFNBQVNDLGFBQWEsUUFBUSxzQkFBc0I7QUFDcEQsU0FBU0MsV0FBVyxRQUFRLHFCQUFxQjtBQUNqRCxTQUFTQyxhQUFhLFFBQVEscUJBQXFCO0FBQ25ELFNBQVNDLE9BQU8sUUFBUSxlQUFlO0FBQUEsU0FBQUMsR0FBQSxJQUFBQyxJQUFBLEVBQUFDLElBQUEsSUFBQUMsS0FBQTtBQXNCdkMsT0FBTyxNQUFNQyxvQkFBb0IsU0FBU3BCLFNBQVMsQ0FBdUQ7RUFDekdxQixXQUFXQSxDQUFDQyxLQUFnQyxFQUFFO0lBQzdDLEtBQUssQ0FBQ0EsS0FBSyxDQUFDO0lBQUFDLGVBQUEsNEJBZ0NPLENBQ25CQyxjQUErQixFQUMvQkMsY0FBc0IsRUFDdEJDLHNC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QixjQUFjO01BQUVDLDRCQUE0QjtNQUFFMEI7SUFBb0IsQ0FBQyxHQUFHLElBQUksQ0FBQ2hCLEtBQUs7SUFDeEYsTUFBTStDLG9CQUFvQixHQUFHNUcsSUFBSSxDQUFDa0QsY0FBYyxFQUFFWSxFQUFFLElBQUksQ0FBQyxDQUFDQSxFQUFFLENBQUNqQixjQUFjLElBQUlpQixFQUFFLENBQUNqQixjQUFjLENBQUNzQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRTVHLG9CQUNDOUQsS0FBQTtNQUFBK0QsUUFBQSxHQUNFLENBQUNqQyw0QkFBNEIsaUJBQUloQyxJQUFBLENBQUNGLE9BQU8sSUFBRSxDQUFDLEVBQzVDa0MsNEJBQTRCLGlCQUM1QjlCLEtBQUE7UUFBQStELFFBQUEsR0FDRSxDQUFDd0Isb0JBQW9CLGlCQUNyQnpGLElBQUEsQ0FBQ0gsYUFBYTtVQUFDNkYsT0FBTyxFQUFDLE1BQU07VUFBQXpCLFFBQUEsZUFDNUJqRSxJQUFBO1lBQUFpRSxRQUFBLEVBQUc7VUFBNEMsQ0FBRztRQUFDLENBQ3JDLENBQ2YsRUFDQSxDQUFDLENBQUN1QixtQkFBbUIsSUFBSUMsb0JBQW9CLGlCQUM3Q3pGLElBQUEsQ0FBQ0gsYUFBYTtVQUFDNkYsT0FBTyxFQUFDLE1BQU07VUFBQXpCLFFBQUEsZUFDNUJqRSxJQUFBO1lBQUFpRSxRQUFBLEVBQUl1QjtVQUFtQixDQUFJO1FBQUMsQ0FDZCxDQUNmLEVBQ0E5QixtQkFBbUIsaUJBQ25CMUQsSUFBQSxDQUFDSCxhQUFhO1VBQ2I2RixPQUFPLEVBQUMsU0FBUztVQUNqQkMsT0FBTyxFQUFFQSxDQUFBLEtBQU07WUFDZCxJQUFJLENBQUM3RCxRQUFRLENBQUM7Y0FDYjRCLG1CQUFtQixFQUFFO1lBQ3RCLENBQUMsQ0FBQztVQUNILENBQUU7VUFBQU8sUUFBQSxlQUNGakUsSUFBQTtZQUFHNEYsU0FBUyxFQUFDLEtBQUs7WUFBQTNCLFFBQUEsRUFBQztVQUEyRCxDQUFHO1FBQUMsQ0FDcEUsQ0FDZixFQUFFLEdBQUcsRUFDTHdCLG9CQUFvQixJQUFJLENBQUMsQ0FBQzFELGNBQWMsaUJBQ3hDL0IsSUFBQSxDQUFDZixTQUFTO1VBQUMyRyxTQUFTLEVBQUMsUUFBUTtVQUFBM0IsUUFBQSxFQUFFLElBQUksQ0FBQzRCLHFCQUFxQixDQUFDOUQsY0FBYztRQUFDLENBQVksQ0FDckY7TUFBQSxDQUNHLENBQ0w7SUFBQSxDQUNHLENBQUM7RUFFUjtBQUNEIiwiaWdub3JlTGlzdCI6W119
|