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