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,319 +1,371 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.TableModule = void 0;
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
4
2
|
/* eslint-disable @typescript-eslint/no-unnecessary-condition */
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const Delta =
|
|
17
|
-
const Scroll =
|
|
18
|
-
class TableModule {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
3
|
+
import { merge } from 'lodash';
|
|
4
|
+
import { Quill } from 'react-quill';
|
|
5
|
+
import { getLogger } from '../../../utils/logger';
|
|
6
|
+
import { BaseTableBlot } from './Blots/BaseTableBlot';
|
|
7
|
+
import { TableBlot } from './Blots/TableBlot';
|
|
8
|
+
import { TableBodyBlot } from './Blots/TableBodyBlot';
|
|
9
|
+
import { TableCellBlot } from './Blots/TableCellBlot';
|
|
10
|
+
import { TableContainerBlot } from './Blots/TableContainer';
|
|
11
|
+
import { TableRowBlot } from './Blots/TableRowBlot';
|
|
12
|
+
import { ATTRIBUTE, KEY, TABLE_ACTION, TAG_NAME } from './constants';
|
|
13
|
+
import { isLineAfterTable, isLineBeforeTable, isLineInTableCell, rangeRemovalWillDeleteCellWithoutRow } from './utils';
|
|
14
|
+
const Delta = Quill.import('delta');
|
|
15
|
+
const Scroll = Quill.import('blots/scroll');
|
|
16
|
+
export class TableModule {
|
|
17
|
+
static register() {
|
|
18
|
+
Quill.register(BaseTableBlot);
|
|
19
|
+
Quill.register(TableCellBlot);
|
|
20
|
+
Quill.register(TableRowBlot);
|
|
21
|
+
Quill.register(TableBodyBlot);
|
|
22
|
+
Quill.register(TableBlot);
|
|
23
|
+
Quill.register(TableContainerBlot);
|
|
24
|
+
}
|
|
25
|
+
constructor(quill, options) {
|
|
26
|
+
_defineProperty(this, "quill", void 0);
|
|
27
|
+
_defineProperty(this, "options", void 0);
|
|
28
|
+
_defineProperty(this, "tableToolbarControls", []);
|
|
29
|
+
//#region Helpers
|
|
30
|
+
_defineProperty(this, "showOrHideToolbarControls", () => {
|
|
31
|
+
const selectedCell = this.getSelectedCell();
|
|
32
|
+
if (selectedCell) {
|
|
33
|
+
this.tableToolbarControls.forEach(domNode => {
|
|
34
|
+
domNode.classList.remove('dn');
|
|
35
|
+
});
|
|
36
|
+
} else {
|
|
37
|
+
this.tableToolbarControls.forEach(domNode => {
|
|
38
|
+
domNode.classList.add('dn');
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
_defineProperty(this, "handleBackspace", (range, context) => {
|
|
43
|
+
if (range.index === 0 || this.quill.getLength() <= 1) return true;
|
|
44
|
+
const [line] = this.quill.getLine(range.index);
|
|
45
|
+
if (context.offset === 0 && isLineAfterTable(line)) {
|
|
46
|
+
getLogger().debug('prevent backspace after table', {
|
|
47
|
+
range,
|
|
48
|
+
context,
|
|
49
|
+
line
|
|
50
|
+
});
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
// if inside a TableCellBlot and at the start of the cell
|
|
54
|
+
// prevent "backspace" from removing previous cell
|
|
55
|
+
// or items before the table if in the first cell
|
|
56
|
+
if (
|
|
57
|
+
// in a cell
|
|
58
|
+
isLineInTableCell(line) &&
|
|
59
|
+
// at the start of the cell
|
|
60
|
+
context.offset === 0 && !line.prev && (
|
|
61
|
+
// there is a cell before this one in the row
|
|
62
|
+
line.parent.prev && line.parent.prev instanceof TableCellBlot ||
|
|
63
|
+
// or the cell is at the start of a row
|
|
64
|
+
!line.parent.prev)) {
|
|
65
|
+
getLogger().debug('prevent cell backspace', {
|
|
66
|
+
range,
|
|
67
|
+
context,
|
|
68
|
+
line
|
|
69
|
+
});
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
return true;
|
|
73
|
+
});
|
|
74
|
+
_defineProperty(this, "handleDelete", (range, context) => {
|
|
75
|
+
const length = /^[\uD800-\uDBFF][\uDC00-\uDFFF]/.test(context.suffix) ? 2 : 1;
|
|
76
|
+
if (range.index >= this.quill.getLength() - length) return true;
|
|
77
|
+
const [line] = this.quill.getLine(range.index);
|
|
78
|
+
if (context.offset === line.length() - 1 && isLineBeforeTable(line)) {
|
|
79
|
+
getLogger().debug('prevent delete before table', {
|
|
80
|
+
range,
|
|
81
|
+
context,
|
|
82
|
+
line
|
|
83
|
+
});
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
// if inside a TableCellBlot and at the end of the cell
|
|
87
|
+
// prevent "delete" from removing the next cell
|
|
88
|
+
// or items after the table if in the last cell
|
|
89
|
+
if (
|
|
90
|
+
// in a cell
|
|
91
|
+
isLineInTableCell(line) &&
|
|
92
|
+
// at the end of the cell
|
|
93
|
+
!line.next && context.offset === line.length() - 1 && (
|
|
94
|
+
// there is a cell after this one in the row
|
|
95
|
+
line.parent.next && line.parent.next instanceof TableCellBlot ||
|
|
96
|
+
// or the cell is at the start of a row
|
|
97
|
+
!line.parent.next)) {
|
|
98
|
+
getLogger().debug('prevent cell delete', {
|
|
99
|
+
range,
|
|
100
|
+
context,
|
|
101
|
+
line
|
|
102
|
+
});
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
return true;
|
|
106
|
+
});
|
|
107
|
+
_defineProperty(this, "handleDeleteRange", range => {
|
|
108
|
+
const lines = this.quill.getLines(range);
|
|
109
|
+
getLogger().debug('handleDeleteRange', {
|
|
110
|
+
range,
|
|
111
|
+
lines
|
|
112
|
+
});
|
|
113
|
+
const willDeleteCellWithoutRow = rangeRemovalWillDeleteCellWithoutRow(this.quill, range);
|
|
114
|
+
if (willDeleteCellWithoutRow) {
|
|
115
|
+
getLogger().debug('prevent delete cell out of row');
|
|
116
|
+
}
|
|
117
|
+
return !willDeleteCellWithoutRow;
|
|
118
|
+
});
|
|
119
|
+
this.quill = quill;
|
|
120
|
+
this.options = options;
|
|
121
|
+
|
|
122
|
+
// Define Toolbar Handler
|
|
123
|
+
const toolbar = quill.getModule('toolbar');
|
|
124
|
+
if (toolbar) {
|
|
125
|
+
toolbar.addHandler('table', action => {
|
|
126
|
+
this.tableHandler(action);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
// by default, hide all table controls
|
|
130
|
+
toolbar.controls.forEach(control => {
|
|
131
|
+
const [name, domNode] = control;
|
|
132
|
+
if (name === 'table' && domNode.tagName === 'BUTTON') {
|
|
133
|
+
this.tableToolbarControls.push(domNode);
|
|
134
|
+
domNode.classList.add('dn');
|
|
135
|
+
}
|
|
136
|
+
});
|
|
26
137
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
const [line] = this.quill.getLine(range.index);
|
|
47
|
-
if (context.offset === 0 && (0, utils_1.isLineAfterTable)(line)) {
|
|
48
|
-
(0, logger_1.getLogger)().debug('prevent backspace after table', { range, context, line });
|
|
49
|
-
return false;
|
|
50
|
-
}
|
|
51
|
-
// if inside a TableCellBlot and at the start of the cell
|
|
52
|
-
// prevent "backspace" from removing previous cell
|
|
53
|
-
// or items before the table if in the first cell
|
|
54
|
-
if (
|
|
55
|
-
// in a cell
|
|
56
|
-
(0, utils_1.isLineInTableCell)(line) &&
|
|
57
|
-
// at the start of the cell
|
|
58
|
-
context.offset === 0 &&
|
|
59
|
-
!line.prev &&
|
|
60
|
-
// there is a cell before this one in the row
|
|
61
|
-
((line.parent.prev && line.parent.prev instanceof TableCellBlot_1.TableCellBlot) ||
|
|
62
|
-
// or the cell is at the start of a row
|
|
63
|
-
!line.parent.prev)) {
|
|
64
|
-
(0, logger_1.getLogger)().debug('prevent cell backspace', { range, context, line });
|
|
65
|
-
return false;
|
|
66
|
-
}
|
|
67
|
-
return true;
|
|
68
|
-
};
|
|
69
|
-
this.handleDelete = (range, context) => {
|
|
70
|
-
const length = /^[\uD800-\uDBFF][\uDC00-\uDFFF]/.test(context.suffix) ? 2 : 1;
|
|
71
|
-
if (range.index >= this.quill.getLength() - length)
|
|
72
|
-
return true;
|
|
73
|
-
const [line] = this.quill.getLine(range.index);
|
|
74
|
-
if (context.offset === line.length() - 1 && (0, utils_1.isLineBeforeTable)(line)) {
|
|
75
|
-
(0, logger_1.getLogger)().debug('prevent delete before table', { range, context, line });
|
|
76
|
-
return false;
|
|
77
|
-
}
|
|
78
|
-
// if inside a TableCellBlot and at the end of the cell
|
|
79
|
-
// prevent "delete" from removing the next cell
|
|
80
|
-
// or items after the table if in the last cell
|
|
81
|
-
if (
|
|
82
|
-
// in a cell
|
|
83
|
-
(0, utils_1.isLineInTableCell)(line) &&
|
|
84
|
-
// at the end of the cell
|
|
85
|
-
!line.next &&
|
|
86
|
-
context.offset === line.length() - 1 &&
|
|
87
|
-
// there is a cell after this one in the row
|
|
88
|
-
((line.parent.next && line.parent.next instanceof TableCellBlot_1.TableCellBlot) ||
|
|
89
|
-
// or the cell is at the start of a row
|
|
90
|
-
!line.parent.next)) {
|
|
91
|
-
(0, logger_1.getLogger)().debug('prevent cell delete', { range, context, line });
|
|
92
|
-
return false;
|
|
93
|
-
}
|
|
94
|
-
return true;
|
|
95
|
-
};
|
|
96
|
-
this.handleDeleteRange = (range) => {
|
|
97
|
-
const lines = this.quill.getLines(range);
|
|
98
|
-
(0, logger_1.getLogger)().debug('handleDeleteRange', { range, lines });
|
|
99
|
-
const willDeleteCellWithoutRow = (0, utils_1.rangeRemovalWillDeleteCellWithoutRow)(this.quill, range);
|
|
100
|
-
if (willDeleteCellWithoutRow) {
|
|
101
|
-
(0, logger_1.getLogger)().debug('prevent delete cell out of row');
|
|
102
|
-
}
|
|
103
|
-
return !willDeleteCellWithoutRow;
|
|
138
|
+
this.quill.on('editor-change', this.showOrHideToolbarControls);
|
|
139
|
+
this.quill.on('selection-change', this.showOrHideToolbarControls);
|
|
140
|
+
|
|
141
|
+
// Define Clipboard Matchers
|
|
142
|
+
// When HTML is loaded or pasted into Quill, the matchers
|
|
143
|
+
// will find the given HTML Tag and allow the delta for the element's
|
|
144
|
+
// content to be modified.
|
|
145
|
+
const clipboard = quill.getModule('clipboard');
|
|
146
|
+
if (clipboard) {
|
|
147
|
+
clipboard.addMatcher(TAG_NAME.TD, function (node, delta) {
|
|
148
|
+
getLogger().debug(`${TAG_NAME.TD} matched`, {
|
|
149
|
+
node,
|
|
150
|
+
delta
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
// load the table cell attribute to use as the delta operation attributes
|
|
154
|
+
const dataValue = node.getAttribute(ATTRIBUTE.DATA_VALUE);
|
|
155
|
+
const defaultAttributes = {
|
|
156
|
+
td: dataValue
|
|
104
157
|
};
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
this.tableHandler(action);
|
|
112
|
-
});
|
|
113
|
-
// by default, hide all table controls
|
|
114
|
-
toolbar.controls.forEach((control) => {
|
|
115
|
-
const [name, domNode] = control;
|
|
116
|
-
if (name === 'table' && domNode.tagName === 'BUTTON') {
|
|
117
|
-
this.tableToolbarControls.push(domNode);
|
|
118
|
-
domNode.classList.add('dn');
|
|
119
|
-
}
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
this.quill.on('editor-change', this.showOrHideToolbarControls);
|
|
123
|
-
this.quill.on('selection-change', this.showOrHideToolbarControls);
|
|
124
|
-
// Define Clipboard Matchers
|
|
125
|
-
// When HTML is loaded or pasted into Quill, the matchers
|
|
126
|
-
// will find the given HTML Tag and allow the delta for the element's
|
|
127
|
-
// content to be modified.
|
|
128
|
-
const clipboard = quill.getModule('clipboard');
|
|
129
|
-
if (clipboard) {
|
|
130
|
-
clipboard.addMatcher(constants_1.TAG_NAME.TD, function (node, delta) {
|
|
131
|
-
(0, logger_1.getLogger)().debug(`${constants_1.TAG_NAME.TD} matched`, { node, delta });
|
|
132
|
-
// load the table cell attribute to use as the delta operation attributes
|
|
133
|
-
const dataValue = node.getAttribute(constants_1.ATTRIBUTE.DATA_VALUE);
|
|
134
|
-
const defaultAttributes = {
|
|
135
|
-
td: dataValue
|
|
136
|
-
};
|
|
137
|
-
// handle empty cells, insert a single block / paragraph
|
|
138
|
-
if (delta.length() === 0) {
|
|
139
|
-
const updatedDelta = new Delta().insert('\n', defaultAttributes);
|
|
140
|
-
(0, logger_1.getLogger)().debug(`${constants_1.TAG_NAME.TD} matched - final delta (empty cell)`, updatedDelta);
|
|
141
|
-
return updatedDelta;
|
|
142
|
-
}
|
|
143
|
-
// for each operation inside the cell's delta, add the table cell attributes
|
|
144
|
-
const updatedDelta = delta.reduce((newDelta, op) => {
|
|
145
|
-
newDelta.insert(op.insert, (0, lodash_1.merge)({}, op.attributes, defaultAttributes));
|
|
146
|
-
return newDelta;
|
|
147
|
-
}, new Delta());
|
|
148
|
-
(0, logger_1.getLogger)().debug(`${constants_1.TAG_NAME.TD} matched - final delta`, updatedDelta);
|
|
149
|
-
return updatedDelta;
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
// Override "backspace" and "delete" actions that would delete or combine a table cell
|
|
153
|
-
const keyboard = quill.getModule('keyboard');
|
|
154
|
-
if (keyboard) {
|
|
155
|
-
keyboard.addBinding({ key: constants_1.KEY.BACKSPACE, altKey: null, ctrlKey: null, metaKey: null, shiftKey: null }, { collapsed: true, offset: 0 }, this.handleBackspace);
|
|
156
|
-
// move binding to first position
|
|
157
|
-
const backspaceOtherBinding = keyboard.bindings[constants_1.KEY.BACKSPACE].pop();
|
|
158
|
-
keyboard.bindings[constants_1.KEY.BACKSPACE].splice(0, 0, backspaceOtherBinding);
|
|
159
|
-
keyboard.addBinding({ key: constants_1.KEY.BACKSPACE }, { collapsed: false }, this.handleDeleteRange);
|
|
160
|
-
// move binding to first position
|
|
161
|
-
const backspaceRangeBinding = keyboard.bindings[constants_1.KEY.BACKSPACE].pop();
|
|
162
|
-
keyboard.bindings[constants_1.KEY.BACKSPACE].splice(0, 0, backspaceRangeBinding);
|
|
163
|
-
keyboard.addBinding({ key: constants_1.KEY.BACKSPACE }, { collapsed: true }, this.handleBackspace);
|
|
164
|
-
// move binding to first position
|
|
165
|
-
const backspaceBinding = keyboard.bindings[constants_1.KEY.BACKSPACE].pop();
|
|
166
|
-
keyboard.bindings[constants_1.KEY.BACKSPACE].splice(0, 0, backspaceBinding);
|
|
167
|
-
keyboard.addBinding({ key: constants_1.KEY.DELETE }, { collapsed: false }, this.handleDeleteRange);
|
|
168
|
-
// move binding to first position
|
|
169
|
-
const deleteRangeBinding = keyboard.bindings[constants_1.KEY.DELETE].pop();
|
|
170
|
-
keyboard.bindings[constants_1.KEY.DELETE].splice(0, 0, deleteRangeBinding);
|
|
171
|
-
keyboard.addBinding({ key: constants_1.KEY.DELETE }, { collapsed: true, altKey: true }, this.handleDelete);
|
|
172
|
-
// move binding to first position
|
|
173
|
-
const deleteWithAltBinding = keyboard.bindings[constants_1.KEY.DELETE].pop();
|
|
174
|
-
keyboard.bindings[constants_1.KEY.DELETE].splice(0, 0, deleteWithAltBinding);
|
|
175
|
-
keyboard.addBinding({ key: constants_1.KEY.DELETE }, { collapsed: true }, this.handleDelete);
|
|
176
|
-
// move binding to first position
|
|
177
|
-
const deleteBinding = keyboard.bindings[constants_1.KEY.DELETE].pop();
|
|
178
|
-
keyboard.bindings[constants_1.KEY.DELETE].splice(0, 0, deleteBinding);
|
|
158
|
+
|
|
159
|
+
// handle empty cells, insert a single block / paragraph
|
|
160
|
+
if (delta.length() === 0) {
|
|
161
|
+
const updatedDelta = new Delta().insert('\n', defaultAttributes);
|
|
162
|
+
getLogger().debug(`${TAG_NAME.TD} matched - final delta (empty cell)`, updatedDelta);
|
|
163
|
+
return updatedDelta;
|
|
179
164
|
}
|
|
165
|
+
|
|
166
|
+
// for each operation inside the cell's delta, add the table cell attributes
|
|
167
|
+
const updatedDelta = delta.reduce((newDelta, op) => {
|
|
168
|
+
newDelta.insert(op.insert, merge({}, op.attributes, defaultAttributes));
|
|
169
|
+
return newDelta;
|
|
170
|
+
}, new Delta());
|
|
171
|
+
getLogger().debug(`${TAG_NAME.TD} matched - final delta`, updatedDelta);
|
|
172
|
+
return updatedDelta;
|
|
173
|
+
});
|
|
180
174
|
}
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
175
|
+
|
|
176
|
+
// Override "backspace" and "delete" actions that would delete or combine a table cell
|
|
177
|
+
const keyboard = quill.getModule('keyboard');
|
|
178
|
+
if (keyboard) {
|
|
179
|
+
keyboard.addBinding({
|
|
180
|
+
key: KEY.BACKSPACE,
|
|
181
|
+
altKey: null,
|
|
182
|
+
ctrlKey: null,
|
|
183
|
+
metaKey: null,
|
|
184
|
+
shiftKey: null
|
|
185
|
+
}, {
|
|
186
|
+
collapsed: true,
|
|
187
|
+
offset: 0
|
|
188
|
+
}, this.handleBackspace);
|
|
189
|
+
// move binding to first position
|
|
190
|
+
const backspaceOtherBinding = keyboard.bindings[KEY.BACKSPACE].pop();
|
|
191
|
+
keyboard.bindings[KEY.BACKSPACE].splice(0, 0, backspaceOtherBinding);
|
|
192
|
+
keyboard.addBinding({
|
|
193
|
+
key: KEY.BACKSPACE
|
|
194
|
+
}, {
|
|
195
|
+
collapsed: false
|
|
196
|
+
}, this.handleDeleteRange);
|
|
197
|
+
// move binding to first position
|
|
198
|
+
const backspaceRangeBinding = keyboard.bindings[KEY.BACKSPACE].pop();
|
|
199
|
+
keyboard.bindings[KEY.BACKSPACE].splice(0, 0, backspaceRangeBinding);
|
|
200
|
+
keyboard.addBinding({
|
|
201
|
+
key: KEY.BACKSPACE
|
|
202
|
+
}, {
|
|
203
|
+
collapsed: true
|
|
204
|
+
}, this.handleBackspace);
|
|
205
|
+
// move binding to first position
|
|
206
|
+
const backspaceBinding = keyboard.bindings[KEY.BACKSPACE].pop();
|
|
207
|
+
keyboard.bindings[KEY.BACKSPACE].splice(0, 0, backspaceBinding);
|
|
208
|
+
keyboard.addBinding({
|
|
209
|
+
key: KEY.DELETE
|
|
210
|
+
}, {
|
|
211
|
+
collapsed: false
|
|
212
|
+
}, this.handleDeleteRange);
|
|
213
|
+
// move binding to first position
|
|
214
|
+
const deleteRangeBinding = keyboard.bindings[KEY.DELETE].pop();
|
|
215
|
+
keyboard.bindings[KEY.DELETE].splice(0, 0, deleteRangeBinding);
|
|
216
|
+
keyboard.addBinding({
|
|
217
|
+
key: KEY.DELETE
|
|
218
|
+
}, {
|
|
219
|
+
collapsed: true,
|
|
220
|
+
altKey: true
|
|
221
|
+
}, this.handleDelete);
|
|
222
|
+
// move binding to first position
|
|
223
|
+
const deleteWithAltBinding = keyboard.bindings[KEY.DELETE].pop();
|
|
224
|
+
keyboard.bindings[KEY.DELETE].splice(0, 0, deleteWithAltBinding);
|
|
225
|
+
keyboard.addBinding({
|
|
226
|
+
key: KEY.DELETE
|
|
227
|
+
}, {
|
|
228
|
+
collapsed: true
|
|
229
|
+
}, this.handleDelete);
|
|
230
|
+
// move binding to first position
|
|
231
|
+
const deleteBinding = keyboard.bindings[KEY.DELETE].pop();
|
|
232
|
+
keyboard.bindings[KEY.DELETE].splice(0, 0, deleteBinding);
|
|
195
233
|
}
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
234
|
+
}
|
|
235
|
+
getSelectedCell() {
|
|
236
|
+
const selection = this.quill.getSelection();
|
|
237
|
+
if (!selection) {
|
|
238
|
+
return null;
|
|
199
239
|
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
// require a selection range
|
|
205
|
-
const range = this.quill.getSelection();
|
|
206
|
-
if (!range)
|
|
207
|
-
return;
|
|
208
|
-
if (action.includes(constants_1.TABLE_ACTION.NEW_TABLE)) {
|
|
209
|
-
this.addNewTable(action, range);
|
|
210
|
-
return;
|
|
211
|
-
}
|
|
212
|
-
// require a selected cell
|
|
213
|
-
const selectedCell = this.getSelectedCell();
|
|
214
|
-
if (!selectedCell)
|
|
215
|
-
return;
|
|
216
|
-
switch (action) {
|
|
217
|
-
case constants_1.TABLE_ACTION.INSERT_COL:
|
|
218
|
-
this.insertCol(selectedCell);
|
|
219
|
-
break;
|
|
220
|
-
case constants_1.TABLE_ACTION.INSERT_ROW:
|
|
221
|
-
this.insertRow(selectedCell);
|
|
222
|
-
break;
|
|
223
|
-
case constants_1.TABLE_ACTION.DELETE_COL:
|
|
224
|
-
this.deleteCol(selectedCell);
|
|
225
|
-
break;
|
|
226
|
-
case constants_1.TABLE_ACTION.DELETE_ROW:
|
|
227
|
-
this.deleteRow(selectedCell);
|
|
228
|
-
break;
|
|
229
|
-
}
|
|
240
|
+
const leaf = this.quill.getLeaf(selection.index);
|
|
241
|
+
let blot = leaf[0];
|
|
242
|
+
while (blot && !(blot instanceof TableCellBlot) && blot.parent) {
|
|
243
|
+
blot = blot.parent;
|
|
230
244
|
}
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
// e.g. "new-table-2-2"
|
|
234
|
-
const sizes = action.replace(constants_1.TABLE_ACTION.NEW_TABLE, '').split('_');
|
|
235
|
-
const rows = parseInt(sizes[0]);
|
|
236
|
-
const cols = parseInt(sizes[1]);
|
|
237
|
-
const tableContainer = TableContainer_1.TableContainerBlot.createWithChildren(rows, cols);
|
|
238
|
-
// insert the table into the top level scroll element
|
|
239
|
-
// before the current leaf's top level branch
|
|
240
|
-
// PREVENT NESTED TABLES
|
|
241
|
-
let topBranch = null;
|
|
242
|
-
const leaf = this.quill.getLeaf(index);
|
|
243
|
-
let blot = leaf[0];
|
|
244
|
-
while (blot && blot.parent && !(blot instanceof Scroll)) {
|
|
245
|
-
topBranch = blot;
|
|
246
|
-
blot = blot.parent;
|
|
247
|
-
}
|
|
248
|
-
if (!blot || !(blot instanceof Scroll))
|
|
249
|
-
return;
|
|
250
|
-
blot.insertBefore(tableContainer, topBranch || undefined);
|
|
251
|
-
this.quill.setSelection(tableContainer.offset(this.quill.scroll), 0, 'user');
|
|
245
|
+
if (blot instanceof TableCellBlot) {
|
|
246
|
+
return blot;
|
|
252
247
|
}
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
});
|
|
248
|
+
return null;
|
|
249
|
+
}
|
|
250
|
+
getSelectedTable() {
|
|
251
|
+
return this.getSelectedCell()?.table();
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
//#endregion Helpers
|
|
255
|
+
|
|
256
|
+
//#region Table Handler
|
|
257
|
+
|
|
258
|
+
tableHandler(action) {
|
|
259
|
+
getLogger().debug('tableHandler', action);
|
|
260
|
+
|
|
261
|
+
// require a selection range
|
|
262
|
+
const range = this.quill.getSelection();
|
|
263
|
+
if (!range) return;
|
|
264
|
+
if (action.includes(TABLE_ACTION.NEW_TABLE)) {
|
|
265
|
+
this.addNewTable(action, range);
|
|
266
|
+
return;
|
|
273
267
|
}
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
268
|
+
|
|
269
|
+
// require a selected cell
|
|
270
|
+
const selectedCell = this.getSelectedCell();
|
|
271
|
+
if (!selectedCell) return;
|
|
272
|
+
switch (action) {
|
|
273
|
+
case TABLE_ACTION.INSERT_COL:
|
|
274
|
+
this.insertCol(selectedCell);
|
|
275
|
+
break;
|
|
276
|
+
case TABLE_ACTION.INSERT_ROW:
|
|
277
|
+
this.insertRow(selectedCell);
|
|
278
|
+
break;
|
|
279
|
+
case TABLE_ACTION.DELETE_COL:
|
|
280
|
+
this.deleteCol(selectedCell);
|
|
281
|
+
break;
|
|
282
|
+
case TABLE_ACTION.DELETE_ROW:
|
|
283
|
+
this.deleteRow(selectedCell);
|
|
284
|
+
break;
|
|
289
285
|
}
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
286
|
+
}
|
|
287
|
+
addNewTable(action, range) {
|
|
288
|
+
const {
|
|
289
|
+
index
|
|
290
|
+
} = range;
|
|
291
|
+
|
|
292
|
+
// e.g. "new-table-2-2"
|
|
293
|
+
const sizes = action.replace(TABLE_ACTION.NEW_TABLE, '').split('_');
|
|
294
|
+
const rows = parseInt(sizes[0]);
|
|
295
|
+
const cols = parseInt(sizes[1]);
|
|
296
|
+
const tableContainer = TableContainerBlot.createWithChildren(rows, cols);
|
|
297
|
+
|
|
298
|
+
// insert the table into the top level scroll element
|
|
299
|
+
// before the current leaf's top level branch
|
|
300
|
+
// PREVENT NESTED TABLES
|
|
301
|
+
let topBranch = null;
|
|
302
|
+
const leaf = this.quill.getLeaf(index);
|
|
303
|
+
let blot = leaf[0];
|
|
304
|
+
while (blot && blot.parent && !(blot instanceof Scroll)) {
|
|
305
|
+
topBranch = blot;
|
|
306
|
+
blot = blot.parent;
|
|
302
307
|
}
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
308
|
+
if (!blot || !(blot instanceof Scroll)) return;
|
|
309
|
+
blot.insertBefore(tableContainer, topBranch || undefined);
|
|
310
|
+
this.quill.setSelection(tableContainer.offset(this.quill.scroll), 0, 'user');
|
|
311
|
+
}
|
|
312
|
+
insertCol(selectedCell) {
|
|
313
|
+
const selectedCellColumn = selectedCell.column();
|
|
314
|
+
const tableId = selectedCell.tableId();
|
|
315
|
+
const tableBody = selectedCell.row()?.tableBody();
|
|
316
|
+
if (!tableBody) return;
|
|
317
|
+
tableBody.children.forEach(child => {
|
|
318
|
+
const tableRow = child;
|
|
319
|
+
const rowId = tableRow.id();
|
|
320
|
+
const tableCell = TableCellBlot.createWithChildren(tableId, rowId);
|
|
321
|
+
const cells = tableRow.children.map(c => c);
|
|
322
|
+
const nextColumnCell = cells.length > selectedCellColumn - 1 ? cells[selectedCellColumn] : undefined;
|
|
323
|
+
if (nextColumnCell) {
|
|
324
|
+
tableRow.insertBefore(tableCell, nextColumnCell);
|
|
325
|
+
} else {
|
|
326
|
+
tableRow.appendChild(tableCell);
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
insertRow(selectedCell) {
|
|
331
|
+
const currentRow = selectedCell.row();
|
|
332
|
+
if (!currentRow) return;
|
|
333
|
+
const nextRow = currentRow.next;
|
|
334
|
+
const tableBody = currentRow.tableBody();
|
|
335
|
+
if (!tableBody) return;
|
|
336
|
+
const newRow = TableRowBlot.createFromReference(currentRow);
|
|
337
|
+
if (nextRow) {
|
|
338
|
+
tableBody.insertBefore(newRow, nextRow);
|
|
339
|
+
} else {
|
|
340
|
+
tableBody.appendChild(newRow);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
deleteCol(selectedCell) {
|
|
344
|
+
const selectedCellColumn = selectedCell.column();
|
|
345
|
+
const tableBody = selectedCell.row()?.tableBody();
|
|
346
|
+
if (!tableBody) return;
|
|
347
|
+
tableBody.children.forEach(c => {
|
|
348
|
+
const tableRow = c;
|
|
349
|
+
const cells = tableRow.children.map(c => c);
|
|
350
|
+
const cell = cells[selectedCellColumn - 1];
|
|
351
|
+
cell?.remove();
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
deleteRow(selectedCell) {
|
|
355
|
+
const selectedRow = selectedCell.row();
|
|
356
|
+
if (!selectedRow) return;
|
|
357
|
+
const cellOffset = selectedCell.offset(); // offset inside row
|
|
358
|
+
const tableBody = selectedRow.tableBody();
|
|
359
|
+
const rowToSelectAfter = selectedRow.next || selectedRow.prev;
|
|
360
|
+
// delete the row
|
|
361
|
+
selectedRow.remove();
|
|
362
|
+
// focus the next row or prev row if possible
|
|
363
|
+
if (tableBody && tableBody.children.length > 0 && rowToSelectAfter) {
|
|
364
|
+
const index = rowToSelectAfter.offset(this.quill.scroll);
|
|
365
|
+
this.quill.setSelection(index + cellOffset, 0);
|
|
317
366
|
}
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
//#endregion Table Handler
|
|
318
370
|
}
|
|
319
|
-
exports.TableModule = TableModule;
|
|
371
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtZXJnZSIsIlF1aWxsIiwiZ2V0TG9nZ2VyIiwiQmFzZVRhYmxlQmxvdCIsIlRhYmxlQmxvdCIsIlRhYmxlQm9keUJsb3QiLCJUYWJsZUNlbGxCbG90IiwiVGFibGVDb250YWluZXJCbG90IiwiVGFibGVSb3dCbG90IiwiQVRUUklCVVRFIiwiS0VZIiwiVEFCTEVfQUNUSU9OIiwiVEFHX05BTUUiLCJpc0xpbmVBZnRlclRhYmxlIiwiaXNMaW5lQmVmb3JlVGFibGUiLCJpc0xpbmVJblRhYmxlQ2VsbCIsInJhbmdlUmVtb3ZhbFdpbGxEZWxldGVDZWxsV2l0aG91dFJvdyIsIkRlbHRhIiwiaW1wb3J0IiwiU2Nyb2xsIiwiVGFibGVNb2R1bGUiLCJyZWdpc3RlciIsImNvbnN0cnVjdG9yIiwicXVpbGwiLCJvcHRpb25zIiwiX2RlZmluZVByb3BlcnR5Iiwic2VsZWN0ZWRDZWxsIiwiZ2V0U2VsZWN0ZWRDZWxsIiwidGFibGVUb29sYmFyQ29udHJvbHMiLCJmb3JFYWNoIiwiZG9tTm9kZSIsImNsYXNzTGlzdCIsInJlbW92ZSIsImFkZCIsInJhbmdlIiwiY29udGV4dCIsImluZGV4IiwiZ2V0TGVuZ3RoIiwibGluZSIsImdldExpbmUiLCJvZmZzZXQiLCJkZWJ1ZyIsInByZXYiLCJwYXJlbnQiLCJsZW5ndGgiLCJ0ZXN0Iiwic3VmZml4IiwibmV4dCIsImxpbmVzIiwiZ2V0TGluZXMiLCJ3aWxsRGVsZXRlQ2VsbFdpdGhvdXRSb3ciLCJ0b29sYmFyIiwiZ2V0TW9kdWxlIiwiYWRkSGFuZGxlciIsImFjdGlvbiIsInRhYmxlSGFuZGxlciIsImNvbnRyb2xzIiwiY29udHJvbCIsIm5hbWUiLCJ0YWdOYW1lIiwicHVzaCIsIm9uIiwic2hvd09ySGlkZVRvb2xiYXJDb250cm9scyIsImNsaXBib2FyZCIsImFkZE1hdGNoZXIiLCJURCIsIm5vZGUiLCJkZWx0YSIsImRhdGFWYWx1ZSIsImdldEF0dHJpYnV0ZSIsIkRBVEFfVkFMVUUiLCJkZWZhdWx0QXR0cmlidXRlcyIsInRkIiwidXBkYXRlZERlbHRhIiwiaW5zZXJ0IiwicmVkdWNlIiwibmV3RGVsdGEiLCJvcCIsImF0dHJpYnV0ZXMiLCJrZXlib2FyZCIsImFkZEJpbmRpbmciLCJrZXkiLCJCQUNLU1BBQ0UiLCJhbHRLZXkiLCJjdHJsS2V5IiwibWV0YUtleSIsInNoaWZ0S2V5IiwiY29sbGFwc2VkIiwiaGFuZGxlQmFja3NwYWNlIiwiYmFja3NwYWNlT3RoZXJCaW5kaW5nIiwiYmluZGluZ3MiLCJwb3AiLCJzcGxpY2UiLCJoYW5kbGVEZWxldGVSYW5nZSIsImJhY2tzcGFjZVJhbmdlQmluZGluZyIsImJhY2tzcGFjZUJpbmRpbmciLCJERUxFVEUiLCJkZWxldGVSYW5nZUJpbmRpbmciLCJoYW5kbGVEZWxldGUiLCJkZWxldGVXaXRoQWx0QmluZGluZyIsImRlbGV0ZUJpbmRpbmciLCJzZWxlY3Rpb24iLCJnZXRTZWxlY3Rpb24iLCJsZWFmIiwiZ2V0TGVhZiIsImJsb3QiLCJnZXRTZWxlY3RlZFRhYmxlIiwidGFibGUiLCJpbmNsdWRlcyIsIk5FV19UQUJMRSIsImFkZE5ld1RhYmxlIiwiSU5TRVJUX0NPTCIsImluc2VydENvbCIsIklOU0VSVF9ST1ciLCJpbnNlcnRSb3ciLCJERUxFVEVfQ09MIiwiZGVsZXRlQ29sIiwiREVMRVRFX1JPVyIsImRlbGV0ZVJvdyIsInNpemVzIiwicmVwbGFjZSIsInNwbGl0Iiwicm93cyIsInBhcnNlSW50IiwiY29scyIsInRhYmxlQ29udGFpbmVyIiwiY3JlYXRlV2l0aENoaWxkcmVuIiwidG9wQnJhbmNoIiwiaW5zZXJ0QmVmb3JlIiwidW5kZWZpbmVkIiwic2V0U2VsZWN0aW9uIiwic2Nyb2xsIiwic2VsZWN0ZWRDZWxsQ29sdW1uIiwiY29sdW1uIiwidGFibGVJZCIsInRhYmxlQm9keSIsInJvdyIsImNoaWxkcmVuIiwiY2hpbGQiLCJ0YWJsZVJvdyIsInJvd0lkIiwiaWQiLCJ0YWJsZUNlbGwiLCJjZWxscyIsIm1hcCIsImMiLCJuZXh0Q29sdW1uQ2VsbCIsImFwcGVuZENoaWxkIiwiY3VycmVudFJvdyIsIm5leHRSb3ciLCJuZXdSb3ciLCJjcmVhdGVGcm9tUmVmZXJlbmNlIiwiY2VsbCIsInNlbGVjdGVkUm93IiwiY2VsbE9mZnNldCIsInJvd1RvU2VsZWN0QWZ0ZXIiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9RdWlsbC9UYWJsZU1vZHVsZS9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uICovXG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gJ2xvZGFzaCdcbmltcG9ydCBQYXJjaG1lbnRUeXBlIGZyb20gJ3BhcmNobWVudCdcbmltcG9ydCB7IEJsb3QgfSBmcm9tICdwYXJjaG1lbnQvZGlzdC9zcmMvYmxvdC9hYnN0cmFjdC9ibG90J1xuaW1wb3J0IHsgQ2xpcGJvYXJkU3RhdGljLCBEZWx0YVN0YXRpYywgUmFuZ2VTdGF0aWMsIFN0cmluZ01hcCB9IGZyb20gJ3F1aWxsJ1xuaW1wb3J0IHsgUXVpbGwgfSBmcm9tICdyZWFjdC1xdWlsbCdcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2xvZ2dlcidcbmltcG9ydCB7IEJhc2VUYWJsZUJsb3QgfSBmcm9tICcuL0Jsb3RzL0Jhc2VUYWJsZUJsb3QnXG5pbXBvcnQgeyBUYWJsZUJsb3QgfSBmcm9tICcuL0Jsb3RzL1RhYmxlQmxvdCdcbmltcG9ydCB7IFRhYmxlQm9keUJsb3QgfSBmcm9tICcuL0Jsb3RzL1RhYmxlQm9keUJsb3QnXG5pbXBvcnQgeyBUYWJsZUNlbGxCbG90IH0gZnJvbSAnLi9CbG90cy9UYWJsZUNlbGxCbG90J1xuaW1wb3J0IHsgVGFibGVDb250YWluZXJCbG90IH0gZnJvbSAnLi9CbG90cy9UYWJsZUNvbnRhaW5lcidcbmltcG9ydCB7IFRhYmxlUm93QmxvdCB9IGZyb20gJy4vQmxvdHMvVGFibGVSb3dCbG90J1xuaW1wb3J0IHsgQVRUUklCVVRFLCBLRVksIFRBQkxFX0FDVElPTiwgVEFHX05BTUUgfSBmcm9tICcuL2NvbnN0YW50cydcbmltcG9ydCB7IGlzTGluZUFmdGVyVGFibGUsIGlzTGluZUJlZm9yZVRhYmxlLCBpc0xpbmVJblRhYmxlQ2VsbCwgcmFuZ2VSZW1vdmFsV2lsbERlbGV0ZUNlbGxXaXRob3V0Um93IH0gZnJvbSAnLi91dGlscydcblxuY29uc3QgRGVsdGEgPSBRdWlsbC5pbXBvcnQoJ2RlbHRhJylcbmNvbnN0IFNjcm9sbCA9IFF1aWxsLmltcG9ydCgnYmxvdHMvc2Nyb2xsJykgYXMgdHlwZW9mIFBhcmNobWVudFR5cGUuU2Nyb2xsXG5cbmludGVyZmFjZSBDb250ZXh0IHtcblx0Y29sbGFwc2VkOiBib29sZWFuXG5cdGVtcHR5OiBib29sZWFuXG5cdGZvcm1hdDogU3RyaW5nTWFwXG5cdG9mZnNldDogbnVtYmVyXG5cdHByZWZpeDogc3RyaW5nXG5cdHN1ZmZpeDogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZU1vZHVsZSB7XG5cdHN0YXRpYyByZWdpc3RlcigpIHtcblx0XHRRdWlsbC5yZWdpc3RlcihCYXNlVGFibGVCbG90KVxuXHRcdFF1aWxsLnJlZ2lzdGVyKFRhYmxlQ2VsbEJsb3QpXG5cdFx0UXVpbGwucmVnaXN0ZXIoVGFibGVSb3dCbG90KVxuXHRcdFF1aWxsLnJlZ2lzdGVyKFRhYmxlQm9keUJsb3QpXG5cdFx0UXVpbGwucmVnaXN0ZXIoVGFibGVCbG90KVxuXHRcdFF1aWxsLnJlZ2lzdGVyKFRhYmxlQ29udGFpbmVyQmxvdClcblx0fVxuXG5cdHF1aWxsOiBRdWlsbFxuXHRvcHRpb25zOiBhbnlcblx0dGFibGVUb29sYmFyQ29udHJvbHM6IEhUTUxFbGVtZW50W10gPSBbXVxuXG5cdGNvbnN0cnVjdG9yKHF1aWxsOiBRdWlsbCwgb3B0aW9uczogYW55KSB7XG5cdFx0dGhpcy5xdWlsbCA9IHF1aWxsXG5cdFx0dGhpcy5vcHRpb25zID0gb3B0aW9uc1xuXG5cdFx0Ly8gRGVmaW5lIFRvb2xiYXIgSGFuZGxlclxuXHRcdGNvbnN0IHRvb2xiYXIgPSBxdWlsbC5nZXRNb2R1bGUoJ3Rvb2xiYXInKVxuXHRcdGlmICh0b29sYmFyKSB7XG5cdFx0XHR0b29sYmFyLmFkZEhhbmRsZXIoJ3RhYmxlJywgKGFjdGlvbjogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdHRoaXMudGFibGVIYW5kbGVyKGFjdGlvbilcblx0XHRcdH0pXG5cblx0XHRcdC8vIGJ5IGRlZmF1bHQsIGhpZGUgYWxsIHRhYmxlIGNvbnRyb2xzXG5cdFx0XHR0b29sYmFyLmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2w6IFtzdHJpbmcsIEhUTUxFbGVtZW50XSkgPT4ge1xuXHRcdFx0XHRjb25zdCBbbmFtZSwgZG9tTm9kZV0gPSBjb250cm9sXG5cdFx0XHRcdGlmIChuYW1lID09PSAndGFibGUnICYmIGRvbU5vZGUudGFnTmFtZSA9PT0gJ0JVVFRPTicpIHtcblx0XHRcdFx0XHR0aGlzLnRhYmxlVG9vbGJhckNvbnRyb2xzLnB1c2goZG9tTm9kZSlcblx0XHRcdFx0XHRkb21Ob2RlLmNsYXNzTGlzdC5hZGQoJ2RuJylcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHR9XG5cblx0XHR0aGlzLnF1aWxsLm9uKCdlZGl0b3ItY2hhbmdlJywgdGhpcy5zaG93T3JIaWRlVG9vbGJhckNvbnRyb2xzKVxuXHRcdHRoaXMucXVpbGwub24oJ3NlbGVjdGlvbi1jaGFuZ2UnLCB0aGlzLnNob3dPckhpZGVUb29sYmFyQ29udHJvbHMpXG5cblx0XHQvLyBEZWZpbmUgQ2xpcGJvYXJkIE1hdGNoZXJzXG5cdFx0Ly8gV2hlbiBIVE1MIGlzIGxvYWRlZCBvciBwYXN0ZWQgaW50byBRdWlsbCwgdGhlIG1hdGNoZXJzXG5cdFx0Ly8gd2lsbCBmaW5kIHRoZSBnaXZlbiBIVE1MIFRhZyBhbmQgYWxsb3cgdGhlIGRlbHRhIGZvciB0aGUgZWxlbWVudCdzXG5cdFx0Ly8gY29udGVudCB0byBiZSBtb2RpZmllZC5cblx0XHRjb25zdCBjbGlwYm9hcmQgPSBxdWlsbC5nZXRNb2R1bGUoJ2NsaXBib2FyZCcpIGFzIENsaXBib2FyZFN0YXRpYyB8IHVuZGVmaW5lZFxuXHRcdGlmIChjbGlwYm9hcmQpIHtcblx0XHRcdGNsaXBib2FyZC5hZGRNYXRjaGVyKFRBR19OQU1FLlRELCBmdW5jdGlvbiAobm9kZTogSFRNTFRhYmxlQ2VsbEVsZW1lbnQsIGRlbHRhOiBEZWx0YVN0YXRpYykge1xuXHRcdFx0XHRnZXRMb2dnZXIoKS5kZWJ1ZyhgJHtUQUdfTkFNRS5URH0gbWF0Y2hlZGAsIHsgbm9kZSwgZGVsdGEgfSlcblxuXHRcdFx0XHQvLyBsb2FkIHRoZSB0YWJsZSBjZWxsIGF0dHJpYnV0ZSB0byB1c2UgYXMgdGhlIGRlbHRhIG9wZXJhdGlvbiBhdHRyaWJ1dGVzXG5cdFx0XHRcdGNvbnN0IGRhdGFWYWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKEFUVFJJQlVURS5EQVRBX1ZBTFVFKVxuXHRcdFx0XHRjb25zdCBkZWZhdWx0QXR0cmlidXRlcyA9IHtcblx0XHRcdFx0XHR0ZDogZGF0YVZhbHVlXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBoYW5kbGUgZW1wdHkgY2VsbHMsIGluc2VydCBhIHNpbmdsZSBibG9jayAvIHBhcmFncmFwaFxuXHRcdFx0XHRpZiAoZGVsdGEubGVuZ3RoKCkgPT09IDApIHtcblx0XHRcdFx0XHRjb25zdCB1cGRhdGVkRGVsdGEgPSAobmV3IERlbHRhKCkgYXMgRGVsdGFTdGF0aWMpLmluc2VydCgnXFxuJywgZGVmYXVsdEF0dHJpYnV0ZXMpXG5cdFx0XHRcdFx0Z2V0TG9nZ2VyKCkuZGVidWcoYCR7VEFHX05BTUUuVER9IG1hdGNoZWQgLSBmaW5hbCBkZWx0YSAoZW1wdHkgY2VsbClgLCB1cGRhdGVkRGVsdGEpXG5cdFx0XHRcdFx0cmV0dXJuIHVwZGF0ZWREZWx0YVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gZm9yIGVhY2ggb3BlcmF0aW9uIGluc2lkZSB0aGUgY2VsbCdzIGRlbHRhLCBhZGQgdGhlIHRhYmxlIGNlbGwgYXR0cmlidXRlc1xuXHRcdFx0XHRjb25zdCB1cGRhdGVkRGVsdGEgPSBkZWx0YS5yZWR1Y2UoKG5ld0RlbHRhLCBvcCkgPT4ge1xuXHRcdFx0XHRcdG5ld0RlbHRhLmluc2VydChvcC5pbnNlcnQsIG1lcmdlKHt9LCBvcC5hdHRyaWJ1dGVzLCBkZWZhdWx0QXR0cmlidXRlcykpXG5cdFx0XHRcdFx0cmV0dXJuIG5ld0RlbHRhXG5cdFx0XHRcdH0sIG5ldyBEZWx0YSgpIGFzIERlbHRhU3RhdGljKVxuXG5cdFx0XHRcdGdldExvZ2dlcigpLmRlYnVnKGAke1RBR19OQU1FLlREfSBtYXRjaGVkIC0gZmluYWwgZGVsdGFgLCB1cGRhdGVkRGVsdGEpXG5cblx0XHRcdFx0cmV0dXJuIHVwZGF0ZWREZWx0YVxuXHRcdFx0fSlcblx0XHR9XG5cblx0XHQvLyBPdmVycmlkZSBcImJhY2tzcGFjZVwiIGFuZCBcImRlbGV0ZVwiIGFjdGlvbnMgdGhhdCB3b3VsZCBkZWxldGUgb3IgY29tYmluZSBhIHRhYmxlIGNlbGxcblx0XHRjb25zdCBrZXlib2FyZCA9IHF1aWxsLmdldE1vZHVsZSgna2V5Ym9hcmQnKVxuXHRcdGlmIChrZXlib2FyZCkge1xuXHRcdFx0a2V5Ym9hcmQuYWRkQmluZGluZyhcblx0XHRcdFx0eyBrZXk6IEtFWS5CQUNLU1BBQ0UsIGFsdEtleTogbnVsbCwgY3RybEtleTogbnVsbCwgbWV0YUtleTogbnVsbCwgc2hpZnRLZXk6IG51bGwgfSxcblx0XHRcdFx0eyBjb2xsYXBzZWQ6IHRydWUsIG9mZnNldDogMCB9LFxuXHRcdFx0XHR0aGlzLmhhbmRsZUJhY2tzcGFjZVxuXHRcdFx0KVxuXHRcdFx0Ly8gbW92ZSBiaW5kaW5nIHRvIGZpcnN0IHBvc2l0aW9uXG5cdFx0XHRjb25zdCBiYWNrc3BhY2VPdGhlckJpbmRpbmcgPSBrZXlib2FyZC5iaW5kaW5nc1tLRVkuQkFDS1NQQUNFXS5wb3AoKVxuXHRcdFx0a2V5Ym9hcmQuYmluZGluZ3NbS0VZLkJBQ0tTUEFDRV0uc3BsaWNlKDAsIDAsIGJhY2tzcGFjZU90aGVyQmluZGluZylcblxuXHRcdFx0a2V5Ym9hcmQuYWRkQmluZGluZyh7IGtleTogS0VZLkJBQ0tTUEFDRSB9LCB7IGNvbGxhcHNlZDogZmFsc2UgfSwgdGhpcy5oYW5kbGVEZWxldGVSYW5nZSlcblx0XHRcdC8vIG1vdmUgYmluZGluZyB0byBmaXJzdCBwb3NpdGlvblxuXHRcdFx0Y29uc3QgYmFja3NwYWNlUmFuZ2VCaW5kaW5nID0ga2V5Ym9hcmQuYmluZGluZ3NbS0VZLkJBQ0tTUEFDRV0ucG9wKClcblx0XHRcdGtleWJvYXJkLmJpbmRpbmdzW0tFWS5CQUNLU1BBQ0VdLnNwbGljZSgwLCAwLCBiYWNrc3BhY2VSYW5nZUJpbmRpbmcpXG5cblx0XHRcdGtleWJvYXJkLmFkZEJpbmRpbmcoeyBrZXk6IEtFWS5CQUNLU1BBQ0UgfSwgeyBjb2xsYXBzZWQ6IHRydWUgfSwgdGhpcy5oYW5kbGVCYWNrc3BhY2UpXG5cdFx0XHQvLyBtb3ZlIGJpbmRpbmcgdG8gZmlyc3QgcG9zaXRpb25cblx0XHRcdGNvbnN0IGJhY2tzcGFjZUJpbmRpbmcgPSBrZXlib2FyZC5iaW5kaW5nc1tLRVkuQkFDS1NQQUNFXS5wb3AoKVxuXHRcdFx0a2V5Ym9hcmQuYmluZGluZ3NbS0VZLkJBQ0tTUEFDRV0uc3BsaWNlKDAsIDAsIGJhY2tzcGFjZUJpbmRpbmcpXG5cblx0XHRcdGtleWJvYXJkLmFkZEJpbmRpbmcoeyBrZXk6IEtFWS5ERUxFVEUgfSwgeyBjb2xsYXBzZWQ6IGZhbHNlIH0sIHRoaXMuaGFuZGxlRGVsZXRlUmFuZ2UpXG5cdFx0XHQvLyBtb3ZlIGJpbmRpbmcgdG8gZmlyc3QgcG9zaXRpb25cblx0XHRcdGNvbnN0IGRlbGV0ZVJhbmdlQmluZGluZyA9IGtleWJvYXJkLmJpbmRpbmdzW0tFWS5ERUxFVEVdLnBvcCgpXG5cdFx0XHRrZXlib2FyZC5iaW5kaW5nc1tLRVkuREVMRVRFXS5zcGxpY2UoMCwgMCwgZGVsZXRlUmFuZ2VCaW5kaW5nKVxuXG5cdFx0XHRrZXlib2FyZC5hZGRCaW5kaW5nKHsga2V5OiBLRVkuREVMRVRFIH0sIHsgY29sbGFwc2VkOiB0cnVlLCBhbHRLZXk6IHRydWUgfSwgdGhpcy5oYW5kbGVEZWxldGUpXG5cdFx0XHQvLyBtb3ZlIGJpbmRpbmcgdG8gZmlyc3QgcG9zaXRpb25cblx0XHRcdGNvbnN0IGRlbGV0ZVdpdGhBbHRCaW5kaW5nID0ga2V5Ym9hcmQuYmluZGluZ3NbS0VZLkRFTEVURV0ucG9wKClcblx0XHRcdGtleWJvYXJkLmJpbmRpbmdzW0tFWS5ERUxFVEVdLnNwbGljZSgwLCAwLCBkZWxldGVXaXRoQWx0QmluZGluZylcblxuXHRcdFx0a2V5Ym9hcmQuYWRkQmluZGluZyh7IGtleTogS0VZLkRFTEVURSB9LCB7IGNvbGxhcHNlZDogdHJ1ZSB9LCB0aGlzLmhhbmRsZURlbGV0ZSlcblx0XHRcdC8vIG1vdmUgYmluZGluZyB0byBmaXJzdCBwb3NpdGlvblxuXHRcdFx0Y29uc3QgZGVsZXRlQmluZGluZyA9IGtleWJvYXJkLmJpbmRpbmdzW0tFWS5ERUxFVEVdLnBvcCgpXG5cdFx0XHRrZXlib2FyZC5iaW5kaW5nc1tLRVkuREVMRVRFXS5zcGxpY2UoMCwgMCwgZGVsZXRlQmluZGluZylcblx0XHR9XG5cdH1cblxuXHQvLyNyZWdpb24gSGVscGVyc1xuXG5cdHNob3dPckhpZGVUb29sYmFyQ29udHJvbHMgPSAoKSA9PiB7XG5cdFx0Y29uc3Qgc2VsZWN0ZWRDZWxsID0gdGhpcy5nZXRTZWxlY3RlZENlbGwoKVxuXHRcdGlmIChzZWxlY3RlZENlbGwpIHtcblx0XHRcdHRoaXMudGFibGVUb29sYmFyQ29udHJvbHMuZm9yRWFjaChkb21Ob2RlID0+IHtcblx0XHRcdFx0ZG9tTm9kZS5jbGFzc0xpc3QucmVtb3ZlKCdkbicpXG5cdFx0XHR9KVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnRhYmxlVG9vbGJhckNvbnRyb2xzLmZvckVhY2goZG9tTm9kZSA9PiB7XG5cdFx0XHRcdGRvbU5vZGUuY2xhc3NMaXN0LmFkZCgnZG4nKVxuXHRcdFx0fSlcblx0XHR9XG5cdH1cblxuXHRoYW5kbGVCYWNrc3BhY2UgPSAocmFuZ2U6IFJhbmdlU3RhdGljLCBjb250ZXh0OiBDb250ZXh0KSA9PiB7XG5cdFx0aWYgKHJhbmdlLmluZGV4ID09PSAwIHx8IHRoaXMucXVpbGwuZ2V0TGVuZ3RoKCkgPD0gMSkgcmV0dXJuIHRydWVcblx0XHRjb25zdCBbbGluZV06IFtCbG90LCBudW1iZXJdID0gdGhpcy5xdWlsbC5nZXRMaW5lKHJhbmdlLmluZGV4KVxuXHRcdGlmIChjb250ZXh0Lm9mZnNldCA9PT0gMCAmJiBpc0xpbmVBZnRlclRhYmxlKGxpbmUpKSB7XG5cdFx0XHRnZXRMb2dnZXIoKS5kZWJ1ZygncHJldmVudCBiYWNrc3BhY2UgYWZ0ZXIgdGFibGUnLCB7IHJhbmdlLCBjb250ZXh0LCBsaW5lIH0pXG5cdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHR9XG5cdFx0Ly8gaWYgaW5zaWRlIGEgVGFibGVDZWxsQmxvdCBhbmQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjZWxsXG5cdFx0Ly8gcHJldmVudCBcImJhY2tzcGFjZVwiIGZyb20gcmVtb3ZpbmcgcHJldmlvdXMgY2VsbFxuXHRcdC8vIG9yIGl0ZW1zIGJlZm9yZSB0aGUgdGFibGUgaWYgaW4gdGhlIGZpcnN0IGNlbGxcblx0XHRpZiAoXG5cdFx0XHQvLyBpbiBhIGNlbGxcblx0XHRcdGlzTGluZUluVGFibGVDZWxsKGxpbmUpICYmXG5cdFx0XHQvLyBhdCB0aGUgc3RhcnQgb2YgdGhlIGNlbGxcblx0XHRcdGNvbnRleHQub2Zmc2V0ID09PSAwICYmXG5cdFx0XHQhbGluZS5wcmV2ICYmXG5cdFx0XHQvLyB0aGVyZSBpcyBhIGNlbGwgYmVmb3JlIHRoaXMgb25lIGluIHRoZSByb3dcblx0XHRcdCgobGluZS5wYXJlbnQucHJldiAmJiBsaW5lLnBhcmVudC5wcmV2IGluc3RhbmNlb2YgVGFibGVDZWxsQmxvdCkgfHxcblx0XHRcdFx0Ly8gb3IgdGhlIGNlbGwgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgcm93XG5cdFx0XHRcdCFsaW5lLnBhcmVudC5wcmV2KVxuXHRcdCkge1xuXHRcdFx0Z2V0TG9nZ2VyKCkuZGVidWcoJ3ByZXZlbnQgY2VsbCBiYWNrc3BhY2UnLCB7IHJhbmdlLCBjb250ZXh0LCBsaW5lIH0pXG5cdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHR9XG5cdFx0cmV0dXJuIHRydWVcblx0fVxuXG5cdGhhbmRsZURlbGV0ZSA9IChyYW5nZTogUmFuZ2VTdGF0aWMsIGNvbnRleHQ6IENvbnRleHQpID0+IHtcblx0XHRjb25zdCBsZW5ndGggPSAvXltcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl0vLnRlc3QoY29udGV4dC5zdWZmaXgpID8gMiA6IDFcblx0XHRpZiAocmFuZ2UuaW5kZXggPj0gdGhpcy5xdWlsbC5nZXRMZW5ndGgoKSAtIGxlbmd0aCkgcmV0dXJuIHRydWVcblx0XHRjb25zdCBbbGluZV06IFtCbG90LCBudW1iZXJdID0gdGhpcy5xdWlsbC5nZXRMaW5lKHJhbmdlLmluZGV4KVxuXHRcdGlmIChjb250ZXh0Lm9mZnNldCA9PT0gbGluZS5sZW5ndGgoKSAtIDEgJiYgaXNMaW5lQmVmb3JlVGFibGUobGluZSkpIHtcblx0XHRcdGdldExvZ2dlcigpLmRlYnVnKCdwcmV2ZW50IGRlbGV0ZSBiZWZvcmUgdGFibGUnLCB7IHJhbmdlLCBjb250ZXh0LCBsaW5lIH0pXG5cdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHR9XG5cdFx0Ly8gaWYgaW5zaWRlIGEgVGFibGVDZWxsQmxvdCBhbmQgYXQgdGhlIGVuZCBvZiB0aGUgY2VsbFxuXHRcdC8vIHByZXZlbnQgXCJkZWxldGVcIiBmcm9tIHJlbW92aW5nIHRoZSBuZXh0IGNlbGxcblx0XHQvLyBvciBpdGVtcyBhZnRlciB0aGUgdGFibGUgaWYgaW4gdGhlIGxhc3QgY2VsbFxuXHRcdGlmIChcblx0XHRcdC8vIGluIGEgY2VsbFxuXHRcdFx0aXNMaW5lSW5UYWJsZUNlbGwobGluZSkgJiZcblx0XHRcdC8vIGF0IHRoZSBlbmQgb2YgdGhlIGNlbGxcblx0XHRcdCFsaW5lLm5leHQgJiZcblx0XHRcdGNvbnRleHQub2Zmc2V0ID09PSBsaW5lLmxlbmd0aCgpIC0gMSAmJlxuXHRcdFx0Ly8gdGhlcmUgaXMgYSBjZWxsIGFmdGVyIHRoaXMgb25lIGluIHRoZSByb3dcblx0XHRcdCgobGluZS5wYXJlbnQubmV4dCAmJiBsaW5lLnBhcmVudC5uZXh0IGluc3RhbmNlb2YgVGFibGVDZWxsQmxvdCkgfHxcblx0XHRcdFx0Ly8gb3IgdGhlIGNlbGwgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgcm93XG5cdFx0XHRcdCFsaW5lLnBhcmVudC5uZXh0KVxuXHRcdCkge1xuXHRcdFx0Z2V0TG9nZ2VyKCkuZGVidWcoJ3ByZXZlbnQgY2VsbCBkZWxldGUnLCB7IHJhbmdlLCBjb250ZXh0LCBsaW5lIH0pXG5cdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHR9XG5cdFx0cmV0dXJuIHRydWVcblx0fVxuXG5cdGhhbmRsZURlbGV0ZVJhbmdlID0gKHJhbmdlOiBSYW5nZVN0YXRpYykgPT4ge1xuXHRcdGNvbnN0IGxpbmVzID0gdGhpcy5xdWlsbC5nZXRMaW5lcyhyYW5nZSlcblx0XHRnZXRMb2dnZXIoKS5kZWJ1ZygnaGFuZGxlRGVsZXRlUmFuZ2UnLCB7IHJhbmdlLCBsaW5lcyB9KVxuXHRcdGNvbnN0IHdpbGxEZWxldGVDZWxsV2l0aG91dFJvdyA9IHJhbmdlUmVtb3ZhbFdpbGxEZWxldGVDZWxsV2l0aG91dFJvdyh0aGlzLnF1aWxsLCByYW5nZSlcblx0XHRpZiAod2lsbERlbGV0ZUNlbGxXaXRob3V0Um93KSB7XG5cdFx0XHRnZXRMb2dnZXIoKS5kZWJ1ZygncHJldmVudCBkZWxldGUgY2VsbCBvdXQgb2Ygcm93Jylcblx0XHR9XG5cdFx0cmV0dXJuICF3aWxsRGVsZXRlQ2VsbFdpdGhvdXRSb3dcblx0fVxuXG5cdGdldFNlbGVjdGVkQ2VsbCgpIHtcblx0XHRjb25zdCBzZWxlY3Rpb24gPSB0aGlzLnF1aWxsLmdldFNlbGVjdGlvbigpXG5cdFx0aWYgKCFzZWxlY3Rpb24pIHtcblx0XHRcdHJldHVybiBudWxsXG5cdFx0fVxuXHRcdGNvbnN0IGxlYWYgPSB0aGlzLnF1aWxsLmdldExlYWYoc2VsZWN0aW9uLmluZGV4KVxuXHRcdGxldCBibG90OiBCbG90IHwgbnVsbCA9IGxlYWZbMF1cblx0XHR3aGlsZSAoYmxvdCAmJiAhKGJsb3QgaW5zdGFuY2VvZiBUYWJsZUNlbGxCbG90KSAmJiBibG90LnBhcmVudCkge1xuXHRcdFx0YmxvdCA9IGJsb3QucGFyZW50XG5cdFx0fVxuXHRcdGlmIChibG90IGluc3RhbmNlb2YgVGFibGVDZWxsQmxvdCkge1xuXHRcdFx0cmV0dXJuIGJsb3Rcblx0XHR9XG5cdFx0cmV0dXJuIG51bGxcblx0fVxuXG5cdGdldFNlbGVjdGVkVGFibGUoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0U2VsZWN0ZWRDZWxsKCk/LnRhYmxlKClcblx0fVxuXG5cdC8vI2VuZHJlZ2lvbiBIZWxwZXJzXG5cblx0Ly8jcmVnaW9uIFRhYmxlIEhhbmRsZXJcblxuXHR0YWJsZUhhbmRsZXIoYWN0aW9uOiBzdHJpbmcpIHtcblx0XHRnZXRMb2dnZXIoKS5kZWJ1ZygndGFibGVIYW5kbGVyJywgYWN0aW9uKVxuXG5cdFx0Ly8gcmVxdWlyZSBhIHNlbGVjdGlvbiByYW5nZVxuXHRcdGNvbnN0IHJhbmdlID0gdGhpcy5xdWlsbC5nZXRTZWxlY3Rpb24oKVxuXHRcdGlmICghcmFuZ2UpIHJldHVyblxuXG5cdFx0aWYgKGFjdGlvbi5pbmNsdWRlcyhUQUJMRV9BQ1RJT04uTkVXX1RBQkxFKSkge1xuXHRcdFx0dGhpcy5hZGROZXdUYWJsZShhY3Rpb24sIHJhbmdlKVxuXHRcdFx0cmV0dXJuXG5cdFx0fVxuXG5cdFx0Ly8gcmVxdWlyZSBhIHNlbGVjdGVkIGNlbGxcblx0XHRjb25zdCBzZWxlY3RlZENlbGwgPSB0aGlzLmdldFNlbGVjdGVkQ2VsbCgpXG5cdFx0aWYgKCFzZWxlY3RlZENlbGwpIHJldHVyblxuXG5cdFx0c3dpdGNoIChhY3Rpb24pIHtcblx0XHRcdGNhc2UgVEFCTEVfQUNUSU9OLklOU0VSVF9DT0w6XG5cdFx0XHRcdHRoaXMuaW5zZXJ0Q29sKHNlbGVjdGVkQ2VsbClcblx0XHRcdFx0YnJlYWtcblx0XHRcdGNhc2UgVEFCTEVfQUNUSU9OLklOU0VSVF9ST1c6XG5cdFx0XHRcdHRoaXMuaW5zZXJ0Um93KHNlbGVjdGVkQ2VsbClcblx0XHRcdFx0YnJlYWtcblx0XHRcdGNhc2UgVEFCTEVfQUNUSU9OLkRFTEVURV9DT0w6XG5cdFx0XHRcdHRoaXMuZGVsZXRlQ29sKHNlbGVjdGVkQ2VsbClcblx0XHRcdFx0YnJlYWtcblx0XHRcdGNhc2UgVEFCTEVfQUNUSU9OLkRFTEVURV9ST1c6XG5cdFx0XHRcdHRoaXMuZGVsZXRlUm93KHNlbGVjdGVkQ2VsbClcblx0XHRcdFx0YnJlYWtcblx0XHR9XG5cdH1cblxuXHRhZGROZXdUYWJsZShhY3Rpb246IHN0cmluZywgcmFuZ2U6IFJhbmdlU3RhdGljKSB7XG5cdFx0Y29uc3QgeyBpbmRleCB9ID0gcmFuZ2VcblxuXHRcdC8vIGUuZy4gXCJuZXctdGFibGUtMi0yXCJcblx0XHRjb25zdCBzaXplcyA9IGFjdGlvbi5yZXBsYWNlKFRBQkxFX0FDVElPTi5ORVdfVEFCTEUsICcnKS5zcGxpdCgnXycpXG5cdFx0Y29uc3Qgcm93cyA9IHBhcnNlSW50KHNpemVzWzBdKVxuXHRcdGNvbnN0IGNvbHMgPSBwYXJzZUludChzaXplc1sxXSlcblx0XHRjb25zdCB0YWJsZUNvbnRhaW5lciA9IFRhYmxlQ29udGFpbmVyQmxvdC5jcmVhdGVXaXRoQ2hpbGRyZW4ocm93cywgY29scylcblxuXHRcdC8vIGluc2VydCB0aGUgdGFibGUgaW50byB0aGUgdG9wIGxldmVsIHNjcm9sbCBlbGVtZW50XG5cdFx0Ly8gYmVmb3JlIHRoZSBjdXJyZW50IGxlYWYncyB0b3AgbGV2ZWwgYnJhbmNoXG5cdFx0Ly8gUFJFVkVOVCBORVNURUQgVEFCTEVTXG5cdFx0bGV0IHRvcEJyYW5jaCA9IG51bGxcblx0XHRjb25zdCBsZWFmID0gdGhpcy5xdWlsbC5nZXRMZWFmKGluZGV4KVxuXHRcdGxldCBibG90OiBCbG90IHwgbnVsbCA9IGxlYWZbMF1cblx0XHR3aGlsZSAoYmxvdCAmJiBibG90LnBhcmVudCAmJiAhKGJsb3QgaW5zdGFuY2VvZiBTY3JvbGwpKSB7XG5cdFx0XHR0b3BCcmFuY2ggPSBibG90XG5cdFx0XHRibG90ID0gYmxvdC5wYXJlbnRcblx0XHR9XG5cblx0XHRpZiAoIWJsb3QgfHwgIShibG90IGluc3RhbmNlb2YgU2Nyb2xsKSkgcmV0dXJuXG5cblx0XHRibG90Lmluc2VydEJlZm9yZSh0YWJsZUNvbnRhaW5lciwgdG9wQnJhbmNoIHx8IHVuZGVmaW5lZClcblx0XHR0aGlzLnF1aWxsLnNldFNlbGVjdGlvbih0YWJsZUNvbnRhaW5lci5vZmZzZXQodGhpcy5xdWlsbC5zY3JvbGwpLCAwLCAndXNlcicpXG5cdH1cblxuXHRpbnNlcnRDb2woc2VsZWN0ZWRDZWxsOiBUYWJsZUNlbGxCbG90KSB7XG5cdFx0Y29uc3Qgc2VsZWN0ZWRDZWxsQ29sdW1uID0gc2VsZWN0ZWRDZWxsLmNvbHVtbigpXG5cdFx0Y29uc3QgdGFibGVJZCA9IHNlbGVjdGVkQ2VsbC50YWJsZUlkKClcblx0XHRjb25zdCB0YWJsZUJvZHkgPSBzZWxlY3RlZENlbGwucm93KCk/LnRhYmxlQm9keSgpXG5cdFx0aWYgKCF0YWJsZUJvZHkpIHJldHVyblxuXHRcdHRhYmxlQm9keS5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcblx0XHRcdGNvbnN0IHRhYmxlUm93ID0gY2hpbGQgYXMgVGFibGVSb3dCbG90XG5cdFx0XHRjb25zdCByb3dJZCA9IHRhYmxlUm93LmlkKClcblx0XHRcdGNvbnN0IHRhYmxlQ2VsbCA9IFRhYmxlQ2VsbEJsb3QuY3JlYXRlV2l0aENoaWxkcmVuKHRhYmxlSWQsIHJvd0lkKVxuXHRcdFx0Y29uc3QgY2VsbHM6IEJsb3RbXSA9IHRhYmxlUm93LmNoaWxkcmVuLm1hcChjID0+IGMpXG5cdFx0XHRjb25zdCBuZXh0Q29sdW1uQ2VsbCA9IGNlbGxzLmxlbmd0aCA+IHNlbGVjdGVkQ2VsbENvbHVtbiAtIDEgPyBjZWxsc1tzZWxlY3RlZENlbGxDb2x1bW5dIDogdW5kZWZpbmVkXG5cdFx0XHRpZiAobmV4dENvbHVtbkNlbGwpIHtcblx0XHRcdFx0dGFibGVSb3cuaW5zZXJ0QmVmb3JlKHRhYmxlQ2VsbCwgbmV4dENvbHVtbkNlbGwpXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0YWJsZVJvdy5hcHBlbmRDaGlsZCh0YWJsZUNlbGwpXG5cdFx0XHR9XG5cdFx0fSlcblx0fVxuXG5cdGluc2VydFJvdyhzZWxlY3RlZENlbGw6IFRhYmxlQ2VsbEJsb3QpIHtcblx0XHRjb25zdCBjdXJyZW50Um93ID0gc2VsZWN0ZWRDZWxsLnJvdygpXG5cdFx0aWYgKCFjdXJyZW50Um93KSByZXR1cm5cblx0XHRjb25zdCBuZXh0Um93ID0gY3VycmVudFJvdy5uZXh0XG5cdFx0Y29uc3QgdGFibGVCb2R5ID0gY3VycmVudFJvdy50YWJsZUJvZHkoKVxuXHRcdGlmICghdGFibGVCb2R5KSByZXR1cm5cblx0XHRjb25zdCBuZXdSb3cgPSBUYWJsZVJvd0Jsb3QuY3JlYXRlRnJvbVJlZmVyZW5jZShjdXJyZW50Um93KVxuXHRcdGlmIChuZXh0Um93KSB7XG5cdFx0XHR0YWJsZUJvZHkuaW5zZXJ0QmVmb3JlKG5ld1JvdywgbmV4dFJvdylcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGFibGVCb2R5LmFwcGVuZENoaWxkKG5ld1Jvdylcblx0XHR9XG5cdH1cblxuXHRkZWxldGVDb2woc2VsZWN0ZWRDZWxsOiBUYWJsZUNlbGxCbG90KSB7XG5cdFx0Y29uc3Qgc2VsZWN0ZWRDZWxsQ29sdW1uID0gc2VsZWN0ZWRDZWxsLmNvbHVtbigpXG5cdFx0Y29uc3QgdGFibGVCb2R5ID0gc2VsZWN0ZWRDZWxsLnJvdygpPy50YWJsZUJvZHkoKVxuXHRcdGlmICghdGFibGVCb2R5KSByZXR1cm5cblx0XHR0YWJsZUJvZHkuY2hpbGRyZW4uZm9yRWFjaChjID0+IHtcblx0XHRcdGNvbnN0IHRhYmxlUm93ID0gYyBhcyBUYWJsZVJvd0Jsb3Rcblx0XHRcdGNvbnN0IGNlbGxzID0gdGFibGVSb3cuY2hpbGRyZW4ubWFwKGMgPT4gYylcblx0XHRcdGNvbnN0IGNlbGwgPSBjZWxsc1tzZWxlY3RlZENlbGxDb2x1bW4gLSAxXVxuXHRcdFx0Y2VsbD8ucmVtb3ZlKClcblx0XHR9KVxuXHR9XG5cblx0ZGVsZXRlUm93KHNlbGVjdGVkQ2VsbDogVGFibGVDZWxsQmxvdCkge1xuXHRcdGNvbnN0IHNlbGVjdGVkUm93ID0gc2VsZWN0ZWRDZWxsLnJvdygpXG5cdFx0aWYgKCFzZWxlY3RlZFJvdykgcmV0dXJuXG5cdFx0Y29uc3QgY2VsbE9mZnNldCA9IHNlbGVjdGVkQ2VsbC5vZmZzZXQoKSAvLyBvZmZzZXQgaW5zaWRlIHJvd1xuXHRcdGNvbnN0IHRhYmxlQm9keSA9IHNlbGVjdGVkUm93LnRhYmxlQm9keSgpXG5cdFx0Y29uc3Qgcm93VG9TZWxlY3RBZnRlciA9IHNlbGVjdGVkUm93Lm5leHQgfHwgc2VsZWN0ZWRSb3cucHJldlxuXHRcdC8vIGRlbGV0ZSB0aGUgcm93XG5cdFx0c2VsZWN0ZWRSb3cucmVtb3ZlKClcblx0XHQvLyBmb2N1cyB0aGUgbmV4dCByb3cgb3IgcHJldiByb3cgaWYgcG9zc2libGVcblx0XHRpZiAodGFibGVCb2R5ICYmIHRhYmxlQm9keS5jaGlsZHJlbi5sZW5ndGggPiAwICYmIHJvd1RvU2VsZWN0QWZ0ZXIpIHtcblx0XHRcdGNvbnN0IGluZGV4ID0gcm93VG9TZWxlY3RBZnRlci5vZmZzZXQodGhpcy5xdWlsbC5zY3JvbGwpXG5cdFx0XHR0aGlzLnF1aWxsLnNldFNlbGVjdGlvbihpbmRleCArIGNlbGxPZmZzZXQsIDApXG5cdFx0fVxuXHR9XG5cblx0Ly8jZW5kcmVnaW9uIFRhYmxlIEhhbmRsZXJcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0EsU0FBU0EsS0FBSyxRQUFRLFFBQVE7QUFJOUIsU0FBU0MsS0FBSyxRQUFRLGFBQWE7QUFDbkMsU0FBU0MsU0FBUyxRQUFRLHVCQUF1QjtBQUNqRCxTQUFTQyxhQUFhLFFBQVEsdUJBQXVCO0FBQ3JELFNBQVNDLFNBQVMsUUFBUSxtQkFBbUI7QUFDN0MsU0FBU0MsYUFBYSxRQUFRLHVCQUF1QjtBQUNyRCxTQUFTQyxhQUFhLFFBQVEsdUJBQXVCO0FBQ3JELFNBQVNDLGtCQUFrQixRQUFRLHdCQUF3QjtBQUMzRCxTQUFTQyxZQUFZLFFBQVEsc0JBQXNCO0FBQ25ELFNBQVNDLFNBQVMsRUFBRUMsR0FBRyxFQUFFQyxZQUFZLEVBQUVDLFFBQVEsUUFBUSxhQUFhO0FBQ3BFLFNBQVNDLGdCQUFnQixFQUFFQyxpQkFBaUIsRUFBRUMsaUJBQWlCLEVBQUVDLG9DQUFvQyxRQUFRLFNBQVM7QUFFdEgsTUFBTUMsS0FBSyxHQUFHaEIsS0FBSyxDQUFDaUIsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNuQyxNQUFNQyxNQUFNLEdBQUdsQixLQUFLLENBQUNpQixNQUFNLENBQUMsY0FBYyxDQUFnQztBQVcxRSxPQUFPLE1BQU1FLFdBQVcsQ0FBQztFQUN4QixPQUFPQyxRQUFRQSxDQUFBLEVBQUc7SUFDakJwQixLQUFLLENBQUNvQixRQUFRLENBQUNsQixhQUFhLENBQUM7SUFDN0JGLEtBQUssQ0FBQ29CLFFBQVEsQ0FBQ2YsYUFBYSxDQUFDO0lBQzdCTCxLQUFLLENBQUNvQixRQUFRLENBQUNiLFlBQVksQ0FBQztJQUM1QlAsS0FBSyxDQUFDb0IsUUFBUSxDQUFDaEIsYUFBYSxDQUFDO0lBQzdCSixLQUFLLENBQUNvQixRQUFRLENBQUNqQixTQUFTLENBQUM7SUFDekJILEtBQUssQ0FBQ29CLFFBQVEsQ0FBQ2Qsa0JBQWtCLENBQUM7RUFDbkM7RUFNQWUsV0FBV0EsQ0FBQ0MsS0FBWSxFQUFFQyxPQUFZLEVBQUU7SUFBQUMsZUFBQTtJQUFBQSxlQUFBO0lBQUFBLGVBQUEsK0JBRkYsRUFBRTtJQW1HeEM7SUFBQUEsZUFBQSxvQ0FFNEIsTUFBTTtNQUNqQyxNQUFNQyxZQUFZLEdBQUcsSUFBSSxDQUFDQyxlQUFlLENBQUMsQ0FBQztNQUMzQyxJQUFJRCxZQUFZLEVBQUU7UUFDakIsSUFBSSxDQUFDRSxvQkFBb0IsQ0FBQ0MsT0FBTyxDQUFDQyxPQUFPLElBQUk7VUFDNUNBLE9BQU8sQ0FBQ0MsU0FBUyxDQUFDQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQy9CLENBQUMsQ0FBQztNQUNILENBQUMsTUFBTTtRQUNOLElBQUksQ0FBQ0osb0JBQW9CLENBQUNDLE9BQU8sQ0FBQ0MsT0FBTyxJQUFJO1VBQzVDQSxPQUFPLENBQUNDLFNBQVMsQ0FBQ0UsR0FBRyxDQUFDLElBQUksQ0FBQztRQUM1QixDQUFDLENBQUM7TUFDSDtJQUNELENBQUM7SUFBQVIsZUFBQSwwQkFFaUIsQ0FBQ1MsS0FBa0IsRUFBRUMsT0FBZ0IsS0FBSztNQUMzRCxJQUFJRCxLQUFLLENBQUNFLEtBQUssS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDYixLQUFLLENBQUNjLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sSUFBSTtNQUNqRSxNQUFNLENBQUNDLElBQUksQ0FBaUIsR0FBRyxJQUFJLENBQUNmLEtBQUssQ0FBQ2dCLE9BQU8sQ0FBQ0wsS0FBSyxDQUFDRSxLQUFLLENBQUM7TUFDOUQsSUFBSUQsT0FBTyxDQUFDSyxNQUFNLEtBQUssQ0FBQyxJQUFJM0IsZ0JBQWdCLENBQUN5QixJQUFJLENBQUMsRUFBRTtRQUNuRHBDLFNBQVMsQ0FBQyxDQUFDLENBQUN1QyxLQUFLLENBQUMsK0JBQStCLEVBQUU7VUFBRVAsS0FBSztVQUFFQyxPQUFPO1VBQUVHO1FBQUssQ0FBQyxDQUFDO1FBQzVFLE9BQU8sS0FBSztNQUNiO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQztNQUNBdkIsaUJBQWlCLENBQUN1QixJQUFJLENBQUM7TUFDdkI7TUFDQUgsT0FBTyxDQUFDSyxNQUFNLEtBQUssQ0FBQyxJQUNwQixDQUFDRixJQUFJLENBQUNJLElBQUk7TUFDVjtNQUNFSixJQUFJLENBQUNLLE1BQU0sQ0FBQ0QsSUFBSSxJQUFJSixJQUFJLENBQUNLLE1BQU0sQ0FBQ0QsSUFBSSxZQUFZcEMsYUFBYTtNQUM5RDtNQUNBLENBQUNnQyxJQUFJLENBQUNLLE1BQU0sQ0FBQ0QsSUFBSSxDQUFDLEVBQ2xCO1FBQ0R4QyxTQUFTLENBQUMsQ0FBQyxDQUFDdUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFO1VBQUVQLEtBQUs7VUFBRUMsT0FBTztVQUFFRztRQUFLLENBQUMsQ0FBQztRQUNyRSxPQUFPLEtBQUs7TUFDYjtNQUNBLE9BQU8sSUFBSTtJQUNaLENBQUM7SUFBQWIsZUFBQSx1QkFFYyxDQUFDUyxLQUFrQixFQUFFQyxPQUFnQixLQUFLO01BQ3hELE1BQU1TLE1BQU0sR0FBRyxpQ0FBaUMsQ0FBQ0MsSUFBSSxDQUFDVixPQUFPLENBQUNXLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO01BQzdFLElBQUlaLEtBQUssQ0FBQ0UsS0FBSyxJQUFJLElBQUksQ0FBQ2IsS0FBSyxDQUFDYyxTQUFTLENBQUMsQ0FBQyxHQUFHTyxNQUFNLEVBQUUsT0FBTyxJQUFJO01BQy9ELE1BQU0sQ0FBQ04sSUFBSSxDQUFpQixHQUFHLElBQUksQ0FBQ2YsS0FBSyxDQUFDZ0IsT0FBTyxDQUFDTCxLQUFLLENBQUNFLEtBQUssQ0FBQztNQUM5RCxJQUFJRCxPQUFPLENBQUNLLE1BQU0sS0FBS0YsSUFBSSxDQUFDTSxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSTlCLGlCQUFpQixDQUFDd0IsSUFBSSxDQUFDLEVBQUU7UUFDcEVwQyxTQUFTLENBQUMsQ0FBQyxDQUFDdUMsS0FBSyxDQUFDLDZCQUE2QixFQUFFO1VBQUVQLEtBQUs7VUFBRUMsT0FBTztVQUFFRztRQUFLLENBQUMsQ0FBQztRQUMxRSxPQUFPLEtBQUs7TUFDYjtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0M7TUFDQXZCLGlCQUFpQixDQUFDdUIsSUFBSSxDQUFDO01BQ3ZCO01BQ0EsQ0FBQ0EsSUFBSSxDQUFDUyxJQUFJLElBQ1ZaLE9BQU8sQ0FBQ0ssTUFBTSxLQUFLRixJQUFJLENBQUNNLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQztNQUNwQztNQUNFTixJQUFJLENBQUNLLE1BQU0sQ0FBQ0ksSUFBSSxJQUFJVCxJQUFJLENBQUNLLE1BQU0sQ0FBQ0ksSUFBSSxZQUFZekMsYUFBYTtNQUM5RDtNQUNBLENBQUNnQyxJQUFJLENBQUNLLE1BQU0sQ0FBQ0ksSUFBSSxDQUFDLEVBQ2xCO1FBQ0Q3QyxTQUFTLENBQUMsQ0FBQyxDQUFDdUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFO1VBQUVQLEtBQUs7VUFBRUMsT0FBTztVQUFFRztRQUFLLENBQUMsQ0FBQztRQUNsRSxPQUFPLEtBQUs7TUFDYjtNQUNBLE9BQU8sSUFBSTtJQUNaLENBQUM7SUFBQWIsZUFBQSw0QkFFb0JTLEtBQWtCLElBQUs7TUFDM0MsTUFBTWMsS0FBSyxHQUFHLElBQUksQ0FBQ3pCLEtBQUssQ0FBQzBCLFFBQVEsQ0FBQ2YsS0FBSyxDQUFDO01BQ3hDaEMsU0FBUyxDQUFDLENBQUMsQ0FBQ3VDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRTtRQUFFUCxLQUFLO1FBQUVjO01BQU0sQ0FBQyxDQUFDO01BQ3hELE1BQU1FLHdCQUF3QixHQUFHbEMsb0NBQW9DLENBQUMsSUFBSSxDQUFDTyxLQUFLLEVBQUVXLEtBQUssQ0FBQztNQUN4RixJQUFJZ0Isd0JBQXdCLEVBQUU7UUFDN0JoRCxTQUFTLENBQUMsQ0FBQyxDQUFDdUMsS0FBSyxDQUFDLGdDQUFnQyxDQUFDO01BQ3BEO01BQ0EsT0FBTyxDQUFDUyx3QkFBd0I7SUFDakMsQ0FBQztJQTlLQSxJQUFJLENBQUMzQixLQUFLLEdBQUdBLEtBQUs7SUFDbEIsSUFBSSxDQUFDQyxPQUFPLEdBQUdBLE9BQU87O0lBRXRCO0lBQ0EsTUFBTTJCLE9BQU8sR0FBRzVCLEtBQUssQ0FBQzZCLFNBQVMsQ0FBQyxTQUFTLENBQUM7SUFDMUMsSUFBSUQsT0FBTyxFQUFFO01BQ1pBLE9BQU8sQ0FBQ0UsVUFBVSxDQUFDLE9BQU8sRUFBR0MsTUFBYyxJQUFLO1FBQy9DLElBQUksQ0FBQ0MsWUFBWSxDQUFDRCxNQUFNLENBQUM7TUFDMUIsQ0FBQyxDQUFDOztNQUVGO01BQ0FILE9BQU8sQ0FBQ0ssUUFBUSxDQUFDM0IsT0FBTyxDQUFFNEIsT0FBOEIsSUFBSztRQUM1RCxNQUFNLENBQUNDLElBQUksRUFBRTVCLE9BQU8sQ0FBQyxHQUFHMkIsT0FBTztRQUMvQixJQUFJQyxJQUFJLEtBQUssT0FBTyxJQUFJNUIsT0FBTyxDQUFDNkIsT0FBTyxLQUFLLFFBQVEsRUFBRTtVQUNyRCxJQUFJLENBQUMvQixvQkFBb0IsQ0FBQ2dDLElBQUksQ0FBQzlCLE9BQU8sQ0FBQztVQUN2Q0EsT0FBTyxDQUFDQyxTQUFTLENBQUNFLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDNUI7TUFDRCxDQUFDLENBQUM7SUFDSDtJQUVBLElBQUksQ0FBQ1YsS0FBSyxDQUFDc0MsRUFBRSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUNDLHlCQUF5QixDQUFDO0lBQzlELElBQUksQ0FBQ3ZDLEtBQUssQ0FBQ3NDLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUNDLHlCQUF5QixDQUFDOztJQUVqRTtJQUNBO0lBQ0E7SUFDQTtJQUNBLE1BQU1DLFNBQVMsR0FBR3hDLEtBQUssQ0FBQzZCLFNBQVMsQ0FBQyxXQUFXLENBQWdDO0lBQzdFLElBQUlXLFNBQVMsRUFBRTtNQUNkQSxTQUFTLENBQUNDLFVBQVUsQ0FBQ3BELFFBQVEsQ0FBQ3FELEVBQUUsRUFBRSxVQUFVQyxJQUEwQixFQUFFQyxLQUFrQixFQUFFO1FBQzNGakUsU0FBUyxDQUFDLENBQUMsQ0FBQ3VDLEtBQUssQ0FBQyxHQUFHN0IsUUFBUSxDQUFDcUQsRUFBRSxVQUFVLEVBQUU7VUFBRUMsSUFBSTtVQUFFQztRQUFNLENBQUMsQ0FBQzs7UUFFNUQ7UUFDQSxNQUFNQyxTQUFTLEdBQUdGLElBQUksQ0FBQ0csWUFBWSxDQUFDNUQsU0FBUyxDQUFDNkQsVUFBVSxDQUFDO1FBQ3pELE1BQU1DLGlCQUFpQixHQUFHO1VBQ3pCQyxFQUFFLEVBQUVKO1FBQ0wsQ0FBQzs7UUFFRDtRQUNBLElBQUlELEtBQUssQ0FBQ3ZCLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFO1VBQ3pCLE1BQU02QixZQUFZLEdBQUksSUFBSXhELEtBQUssQ0FBQyxDQUFDLENBQWlCeUQsTUFBTSxDQUFDLElBQUksRUFBRUgsaUJBQWlCLENBQUM7VUFDakZyRSxTQUFTLENBQUMsQ0FBQyxDQUFDdUMsS0FBSyxDQUFDLEdBQUc3QixRQUFRLENBQUNxRCxFQUFFLHFDQUFxQyxFQUFFUSxZQUFZLENBQUM7VUFDcEYsT0FBT0EsWUFBWTtRQUNwQjs7UUFFQTtRQUNBLE1BQU1BLFlBQVksR0FBR04sS0FBSyxDQUFDUSxNQUFNLENBQUMsQ0FBQ0MsUUFBUSxFQUFFQyxFQUFFLEtBQUs7VUFDbkRELFFBQVEsQ0FBQ0YsTUFBTSxDQUFDRyxFQUFFLENBQUNILE1BQU0sRUFBRTFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTZFLEVBQUUsQ0FBQ0MsVUFBVSxFQUFFUCxpQkFBaUIsQ0FBQyxDQUFDO1VBQ3ZFLE9BQU9LLFFBQVE7UUFDaEIsQ0FBQyxFQUFFLElBQUkzRCxLQUFLLENBQUMsQ0FBZ0IsQ0FBQztRQUU5QmYsU0FBUyxDQUFDLENBQUMsQ0FBQ3VDLEtBQUssQ0FBQyxHQUFHN0IsUUFBUSxDQUFDcUQsRUFBRSx3QkFBd0IsRUFBRVEsWUFBWSxDQUFDO1FBRXZFLE9BQU9BLFlBQVk7TUFDcEIsQ0FBQyxDQUFDO0lBQ0g7O0lBRUE7SUFDQSxNQUFNTSxRQUFRLEdBQUd4RCxLQUFLLENBQUM2QixTQUFTLENBQUMsVUFBVSxDQUFDO0lBQzVDLElBQUkyQixRQUFRLEVBQUU7TUFDYkEsUUFBUSxDQUFDQyxVQUFVLENBQ2xCO1FBQUVDLEdBQUcsRUFBRXZFLEdBQUcsQ0FBQ3dFLFNBQVM7UUFBRUMsTUFBTSxFQUFFLElBQUk7UUFBRUMsT0FBTyxFQUFFLElBQUk7UUFBRUMsT0FBTyxFQUFFLElBQUk7UUFBRUMsUUFBUSxFQUFFO01BQUssQ0FBQyxFQUNsRjtRQUFFQyxTQUFTLEVBQUUsSUFBSTtRQUFFL0MsTUFBTSxFQUFFO01BQUUsQ0FBQyxFQUM5QixJQUFJLENBQUNnRCxlQUNOLENBQUM7TUFDRDtNQUNBLE1BQU1DLHFCQUFxQixHQUFHVixRQUFRLENBQUNXLFFBQVEsQ0FBQ2hGLEdBQUcsQ0FBQ3dFLFNBQVMsQ0FBQyxDQUFDUyxHQUFHLENBQUMsQ0FBQztNQUNwRVosUUFBUSxDQUFDVyxRQUFRLENBQUNoRixHQUFHLENBQUN3RSxTQUFTLENBQUMsQ0FBQ1UsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUVILHFCQUFxQixDQUFDO01BRXBFVixRQUFRLENBQUNDLFVBQVUsQ0FBQztRQUFFQyxHQUFHLEVBQUV2RSxHQUFHLENBQUN3RTtNQUFVLENBQUMsRUFBRTtRQUFFSyxTQUFTLEVBQUU7TUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDTSxpQkFBaUIsQ0FBQztNQUN6RjtNQUNBLE1BQU1DLHFCQUFxQixHQUFHZixRQUFRLENBQUNXLFFBQVEsQ0FBQ2hGLEdBQUcsQ0FBQ3dFLFNBQVMsQ0FBQyxDQUFDUyxHQUFHLENBQUMsQ0FBQztNQUNwRVosUUFBUSxDQUFDVyxRQUFRLENBQUNoRixHQUFHLENBQUN3RSxTQUFTLENBQUMsQ0FBQ1UsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUVFLHFCQUFxQixDQUFDO01BRXBFZixRQUFRLENBQUNDLFVBQVUsQ0FBQztRQUFFQyxHQUFHLEVBQUV2RSxHQUFHLENBQUN3RTtNQUFVLENBQUMsRUFBRTtRQUFFSyxTQUFTLEVBQUU7TUFBSyxDQUFDLEVBQUUsSUFBSSxDQUFDQyxlQUFlLENBQUM7TUFDdEY7TUFDQSxNQUFNTyxnQkFBZ0IsR0FBR2hCLFFBQVEsQ0FBQ1csUUFBUSxDQUFDaEYsR0FBRyxDQUFDd0UsU0FBUyxDQUFDLENBQUNTLEdBQUcsQ0FBQyxDQUFDO01BQy9EWixRQUFRLENBQUNXLFFBQVEsQ0FBQ2hGLEdBQUcsQ0FBQ3dFLFNBQVMsQ0FBQyxDQUFDVSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRUcsZ0JBQWdCLENBQUM7TUFFL0RoQixRQUFRLENBQUNDLFVBQVUsQ0FBQztRQUFFQyxHQUFHLEVBQUV2RSxHQUFHLENBQUNzRjtNQUFPLENBQUMsRUFBRTtRQUFFVCxTQUFTLEVBQUU7TUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDTSxpQkFBaUIsQ0FBQztNQUN0RjtNQUNBLE1BQU1JLGtCQUFrQixHQUFHbEIsUUFBUSxDQUFDVyxRQUFRLENBQUNoRixHQUFHLENBQUNzRixNQUFNLENBQUMsQ0FBQ0wsR0FBRyxDQUFDLENBQUM7TUFDOURaLFFBQVEsQ0FBQ1csUUFBUSxDQUFDaEYsR0FBRyxDQUFDc0YsTUFBTSxDQUFDLENBQUNKLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFSyxrQkFBa0IsQ0FBQztNQUU5RGxCLFFBQVEsQ0FBQ0MsVUFBVSxDQUFDO1FBQUVDLEdBQUcsRUFBRXZFLEdBQUcsQ0FBQ3NGO01BQU8sQ0FBQyxFQUFFO1FBQUVULFNBQVMsRUFBRSxJQUFJO1FBQUVKLE1BQU0sRUFBRTtNQUFLLENBQUMsRUFBRSxJQUFJLENBQUNlLFlBQVksQ0FBQztNQUM5RjtNQUNBLE1BQU1DLG9CQUFvQixHQUFHcEIsUUFBUSxDQUFDVyxRQUFRLENBQUNoRixHQUFHLENBQUNzRixNQUFNLENBQUMsQ0FBQ0wsR0FBRyxDQUFDLENBQUM7TUFDaEVaLFFBQVEsQ0FBQ1csUUFBUSxDQUFDaEYsR0FBRyxDQUFDc0YsTUFBTSxDQUFDLENBQUNKLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFTyxvQkFBb0IsQ0FBQztNQUVoRXBCLFFBQVEsQ0FBQ0MsVUFBVSxDQUFDO1FBQUVDLEdBQUcsRUFBRXZFLEdBQUcsQ0FBQ3NGO01BQU8sQ0FBQyxFQUFFO1FBQUVULFNBQVMsRUFBRTtNQUFLLENBQUMsRUFBRSxJQUFJLENBQUNXLFlBQVksQ0FBQztNQUNoRjtNQUNBLE1BQU1FLGFBQWEsR0FBR3JCLFFBQVEsQ0FBQ1csUUFBUSxDQUFDaEYsR0FBRyxDQUFDc0YsTUFBTSxDQUFDLENBQUNMLEdBQUcsQ0FBQyxDQUFDO01BQ3pEWixRQUFRLENBQUNXLFFBQVEsQ0FBQ2hGLEdBQUcsQ0FBQ3NGLE1BQU0sQ0FBQyxDQUFDSixNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRVEsYUFBYSxDQUFDO0lBQzFEO0VBQ0Q7RUFrRkF6RSxlQUFlQSxDQUFBLEVBQUc7SUFDakIsTUFBTTBFLFNBQVMsR0FBRyxJQUFJLENBQUM5RSxLQUFLLENBQUMrRSxZQUFZLENBQUMsQ0FBQztJQUMzQyxJQUFJLENBQUNELFNBQVMsRUFBRTtNQUNmLE9BQU8sSUFBSTtJQUNaO0lBQ0EsTUFBTUUsSUFBSSxHQUFHLElBQUksQ0FBQ2hGLEtBQUssQ0FBQ2lGLE9BQU8sQ0FBQ0gsU0FBUyxDQUFDakUsS0FBSyxDQUFDO0lBQ2hELElBQUlxRSxJQUFpQixHQUFHRixJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQy9CLE9BQU9FLElBQUksSUFBSSxFQUFFQSxJQUFJLFlBQVluRyxhQUFhLENBQUMsSUFBSW1HLElBQUksQ0FBQzlELE1BQU0sRUFBRTtNQUMvRDhELElBQUksR0FBR0EsSUFBSSxDQUFDOUQsTUFBTTtJQUNuQjtJQUNBLElBQUk4RCxJQUFJLFlBQVluRyxhQUFhLEVBQUU7TUFDbEMsT0FBT21HLElBQUk7SUFDWjtJQUNBLE9BQU8sSUFBSTtFQUNaO0VBRUFDLGdCQUFnQkEsQ0FBQSxFQUFHO0lBQ2xCLE9BQU8sSUFBSSxDQUFDL0UsZUFBZSxDQUFDLENBQUMsRUFBRWdGLEtBQUssQ0FBQyxDQUFDO0VBQ3ZDOztFQUVBOztFQUVBOztFQUVBcEQsWUFBWUEsQ0FBQ0QsTUFBYyxFQUFFO0lBQzVCcEQsU0FBUyxDQUFDLENBQUMsQ0FBQ3VDLEtBQUssQ0FBQyxjQUFjLEVBQUVhLE1BQU0sQ0FBQzs7SUFFekM7SUFDQSxNQUFNcEIsS0FBSyxHQUFHLElBQUksQ0FBQ1gsS0FBSyxDQUFDK0UsWUFBWSxDQUFDLENBQUM7SUFDdkMsSUFBSSxDQUFDcEUsS0FBSyxFQUFFO0lBRVosSUFBSW9CLE1BQU0sQ0FBQ3NELFFBQVEsQ0FBQ2pHLFlBQVksQ0FBQ2tHLFNBQVMsQ0FBQyxFQUFFO01BQzVDLElBQUksQ0FBQ0MsV0FBVyxDQUFDeEQsTUFBTSxFQUFFcEIsS0FBSyxDQUFDO01BQy9CO0lBQ0Q7O0lBRUE7SUFDQSxNQUFNUixZQUFZLEdBQUcsSUFBSSxDQUFDQyxlQUFlLENBQUMsQ0FBQztJQUMzQyxJQUFJLENBQUNELFlBQVksRUFBRTtJQUVuQixRQUFRNEIsTUFBTTtNQUNiLEtBQUszQyxZQUFZLENBQUNvRyxVQUFVO1FBQzNCLElBQUksQ0FBQ0MsU0FBUyxDQUFDdEYsWUFBWSxDQUFDO1FBQzVCO01BQ0QsS0FBS2YsWUFBWSxDQUFDc0csVUFBVTtRQUMzQixJQUFJLENBQUNDLFNBQVMsQ0FBQ3hGLFlBQVksQ0FBQztRQUM1QjtNQUNELEtBQUtmLFlBQVksQ0FBQ3dHLFVBQVU7UUFDM0IsSUFBSSxDQUFDQyxTQUFTLENBQUMxRixZQUFZLENBQUM7UUFDNUI7TUFDRCxLQUFLZixZQUFZLENBQUMwRyxVQUFVO1FBQzNCLElBQUksQ0FBQ0MsU0FBUyxDQUFDNUYsWUFBWSxDQUFDO1FBQzVCO0lBQ0Y7RUFDRDtFQUVBb0YsV0FBV0EsQ0FBQ3hELE1BQWMsRUFBRXBCLEtBQWtCLEVBQUU7SUFDL0MsTUFBTTtNQUFFRTtJQUFNLENBQUMsR0FBR0YsS0FBSzs7SUFFdkI7SUFDQSxNQUFNcUYsS0FBSyxHQUFHakUsTUFBTSxDQUFDa0UsT0FBTyxDQUFDN0csWUFBWSxDQUFDa0csU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDWSxLQUFLLENBQUMsR0FBRyxDQUFDO0lBQ25FLE1BQU1DLElBQUksR0FBR0MsUUFBUSxDQUFDSixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsTUFBTUssSUFBSSxHQUFHRCxRQUFRLENBQUNKLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixNQUFNTSxjQUFjLEdBQUd0SCxrQkFBa0IsQ0FBQ3VILGtCQUFrQixDQUFDSixJQUFJLEVBQUVFLElBQUksQ0FBQzs7SUFFeEU7SUFDQTtJQUNBO0lBQ0EsSUFBSUcsU0FBUyxHQUFHLElBQUk7SUFDcEIsTUFBTXhCLElBQUksR0FBRyxJQUFJLENBQUNoRixLQUFLLENBQUNpRixPQUFPLENBQUNwRSxLQUFLLENBQUM7SUFDdEMsSUFBSXFFLElBQWlCLEdBQUdGLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDL0IsT0FBT0UsSUFBSSxJQUFJQSxJQUFJLENBQUM5RCxNQUFNLElBQUksRUFBRThELElBQUksWUFBWXRGLE1BQU0sQ0FBQyxFQUFFO01BQ3hENEcsU0FBUyxHQUFHdEIsSUFBSTtNQUNoQkEsSUFBSSxHQUFHQSxJQUFJLENBQUM5RCxNQUFNO0lBQ25CO0lBRUEsSUFBSSxDQUFDOEQsSUFBSSxJQUFJLEVBQUVBLElBQUksWUFBWXRGLE1BQU0sQ0FBQyxFQUFFO0lBRXhDc0YsSUFBSSxDQUFDdUIsWUFBWSxDQUFDSCxjQUFjLEVBQUVFLFNBQVMsSUFBSUUsU0FBUyxDQUFDO0lBQ3pELElBQUksQ0FBQzFHLEtBQUssQ0FBQzJHLFlBQVksQ0FBQ0wsY0FBYyxDQUFDckYsTUFBTSxDQUFDLElBQUksQ0FBQ2pCLEtBQUssQ0FBQzRHLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUM7RUFDN0U7RUFFQW5CLFNBQVNBLENBQUN0RixZQUEyQixFQUFFO0lBQ3RDLE1BQU0wRyxrQkFBa0IsR0FBRzFHLFlBQVksQ0FBQzJHLE1BQU0sQ0FBQyxDQUFDO0lBQ2hELE1BQU1DLE9BQU8sR0FBRzVHLFlBQVksQ0FBQzRHLE9BQU8sQ0FBQyxDQUFDO0lBQ3RDLE1BQU1DLFNBQVMsR0FBRzdHLFlBQVksQ0FBQzhHLEdBQUcsQ0FBQyxDQUFDLEVBQUVELFNBQVMsQ0FBQyxDQUFDO0lBQ2pELElBQUksQ0FBQ0EsU0FBUyxFQUFFO0lBQ2hCQSxTQUFTLENBQUNFLFFBQVEsQ0FBQzVHLE9BQU8sQ0FBQzZHLEtBQUssSUFBSTtNQUNuQyxNQUFNQyxRQUFRLEdBQUdELEtBQXFCO01BQ3RDLE1BQU1FLEtBQUssR0FBR0QsUUFBUSxDQUFDRSxFQUFFLENBQUMsQ0FBQztNQUMzQixNQUFNQyxTQUFTLEdBQUd4SSxhQUFhLENBQUN3SCxrQkFBa0IsQ0FBQ1EsT0FBTyxFQUFFTSxLQUFLLENBQUM7TUFDbEUsTUFBTUcsS0FBYSxHQUFHSixRQUFRLENBQUNGLFFBQVEsQ0FBQ08sR0FBRyxDQUFDQyxDQUFDLElBQUlBLENBQUMsQ0FBQztNQUNuRCxNQUFNQyxjQUFjLEdBQUdILEtBQUssQ0FBQ25HLE1BQU0sR0FBR3dGLGtCQUFrQixHQUFHLENBQUMsR0FBR1csS0FBSyxDQUFDWCxrQkFBa0IsQ0FBQyxHQUFHSCxTQUFTO01BQ3BHLElBQUlpQixjQUFjLEVBQUU7UUFDbkJQLFFBQVEsQ0FBQ1gsWUFBWSxDQUFDYyxTQUFTLEVBQUVJLGNBQWMsQ0FBQztNQUNqRCxDQUFDLE1BQU07UUFDTlAsUUFBUSxDQUFDUSxXQUFXLENBQUNMLFNBQVMsQ0FBQztNQUNoQztJQUNELENBQUMsQ0FBQztFQUNIO0VBRUE1QixTQUFTQSxDQUFDeEYsWUFBMkIsRUFBRTtJQUN0QyxNQUFNMEgsVUFBVSxHQUFHMUgsWUFBWSxDQUFDOEcsR0FBRyxDQUFDLENBQUM7SUFDckMsSUFBSSxDQUFDWSxVQUFVLEVBQUU7SUFDakIsTUFBTUMsT0FBTyxHQUFHRCxVQUFVLENBQUNyRyxJQUFJO0lBQy9CLE1BQU13RixTQUFTLEdBQUdhLFVBQVUsQ0FBQ2IsU0FBUyxDQUFDLENBQUM7SUFDeEMsSUFBSSxDQUFDQSxTQUFTLEVBQUU7SUFDaEIsTUFBTWUsTUFBTSxHQUFHOUksWUFBWSxDQUFDK0ksbUJBQW1CLENBQUNILFVBQVUsQ0FBQztJQUMzRCxJQUFJQyxPQUFPLEVBQUU7TUFDWmQsU0FBUyxDQUFDUCxZQUFZLENBQUNzQixNQUFNLEVBQUVELE9BQU8sQ0FBQztJQUN4QyxDQUFDLE1BQU07TUFDTmQsU0FBUyxDQUFDWSxXQUFXLENBQUNHLE1BQU0sQ0FBQztJQUM5QjtFQUNEO0VBRUFsQyxTQUFTQSxDQUFDMUYsWUFBMkIsRUFBRTtJQUN0QyxNQUFNMEcsa0JBQWtCLEdBQUcxRyxZQUFZLENBQUMyRyxNQUFNLENBQUMsQ0FBQztJQUNoRCxNQUFNRSxTQUFTLEdBQUc3RyxZQUFZLENBQUM4RyxHQUFHLENBQUMsQ0FBQyxFQUFFRCxTQUFTLENBQUMsQ0FBQztJQUNqRCxJQUFJLENBQUNBLFNBQVMsRUFBRTtJQUNoQkEsU0FBUyxDQUFDRSxRQUFRLENBQUM1RyxPQUFPLENBQUNvSCxDQUFDLElBQUk7TUFDL0IsTUFBTU4sUUFBUSxHQUFHTSxDQUFpQjtNQUNsQyxNQUFNRixLQUFLLEdBQUdKLFFBQVEsQ0FBQ0YsUUFBUSxDQUFDTyxHQUFHLENBQUNDLENBQUMsSUFBSUEsQ0FBQyxDQUFDO01BQzNDLE1BQU1PLElBQUksR0FBR1QsS0FBSyxDQUFDWCxrQkFBa0IsR0FBRyxDQUFDLENBQUM7TUFDMUNvQixJQUFJLEVBQUV4SCxNQUFNLENBQUMsQ0FBQztJQUNmLENBQUMsQ0FBQztFQUNIO0VBRUFzRixTQUFTQSxDQUFDNUYsWUFBMkIsRUFBRTtJQUN0QyxNQUFNK0gsV0FBVyxHQUFHL0gsWUFBWSxDQUFDOEcsR0FBRyxDQUFDLENBQUM7SUFDdEMsSUFBSSxDQUFDaUIsV0FBVyxFQUFFO0lBQ2xCLE1BQU1DLFVBQVUsR0FBR2hJLFlBQVksQ0FBQ2MsTUFBTSxDQUFDLENBQUMsRUFBQztJQUN6QyxNQUFNK0YsU0FBUyxHQUFHa0IsV0FBVyxDQUFDbEIsU0FBUyxDQUFDLENBQUM7SUFDekMsTUFBTW9CLGdCQUFnQixHQUFHRixXQUFXLENBQUMxRyxJQUFJLElBQUkwRyxXQUFXLENBQUMvRyxJQUFJO0lBQzdEO0lBQ0ErRyxXQUFXLENBQUN6SCxNQUFNLENBQUMsQ0FBQztJQUNwQjtJQUNBLElBQUl1RyxTQUFTLElBQUlBLFNBQVMsQ0FBQ0UsUUFBUSxDQUFDN0YsTUFBTSxHQUFHLENBQUMsSUFBSStHLGdCQUFnQixFQUFFO01BQ25FLE1BQU12SCxLQUFLLEdBQUd1SCxnQkFBZ0IsQ0FBQ25ILE1BQU0sQ0FBQyxJQUFJLENBQUNqQixLQUFLLENBQUM0RyxNQUFNLENBQUM7TUFDeEQsSUFBSSxDQUFDNUcsS0FBSyxDQUFDMkcsWUFBWSxDQUFDOUYsS0FBSyxHQUFHc0gsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUMvQztFQUNEOztFQUVBO0FBQ0QiLCJpZ25vcmVMaXN0IjpbXX0=
|