@fluidframework/sequence 1.4.0-121020 → 2.0.0-dev-rc.1.0.0.224419
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/.eslintrc.js +9 -11
- package/.mocharc.js +12 -0
- package/CHANGELOG.md +449 -0
- package/README.md +364 -183
- package/api-extractor-lint.json +4 -0
- package/api-extractor.json +2 -2
- package/api-report/sequence.api.md +741 -0
- package/dist/{defaultMap.js → defaultMap.cjs} +29 -22
- package/dist/defaultMap.cjs.map +1 -0
- package/dist/defaultMap.d.ts +7 -6
- package/dist/defaultMap.d.ts.map +1 -1
- package/dist/defaultMapInterfaces.cjs +7 -0
- package/dist/defaultMapInterfaces.cjs.map +1 -0
- package/dist/defaultMapInterfaces.d.ts +44 -12
- package/dist/defaultMapInterfaces.d.ts.map +1 -1
- package/dist/index.cjs +60 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +14 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/intervalCollection.cjs +1159 -0
- package/dist/intervalCollection.cjs.map +1 -0
- package/dist/intervalCollection.d.ts +461 -162
- package/dist/intervalCollection.d.ts.map +1 -1
- package/dist/intervalIndex/endpointInRangeIndex.cjs +66 -0
- package/dist/intervalIndex/endpointInRangeIndex.cjs.map +1 -0
- package/dist/intervalIndex/endpointInRangeIndex.d.ts +34 -0
- package/dist/intervalIndex/endpointInRangeIndex.d.ts.map +1 -0
- package/dist/intervalIndex/endpointIndex.cjs +47 -0
- package/dist/intervalIndex/endpointIndex.cjs.map +1 -0
- package/dist/intervalIndex/endpointIndex.d.ts +38 -0
- package/dist/intervalIndex/endpointIndex.d.ts.map +1 -0
- package/dist/intervalIndex/idIntervalIndex.cjs +44 -0
- package/dist/intervalIndex/idIntervalIndex.cjs.map +1 -0
- package/dist/intervalIndex/idIntervalIndex.d.ts +18 -0
- package/dist/intervalIndex/idIntervalIndex.d.ts.map +1 -0
- package/dist/intervalIndex/index.cjs +24 -0
- package/dist/intervalIndex/index.cjs.map +1 -0
- package/dist/intervalIndex/index.d.ts +13 -0
- package/dist/intervalIndex/index.d.ts.map +1 -0
- package/dist/{defaultMapInterfaces.js → intervalIndex/intervalIndex.cjs} +1 -1
- package/dist/intervalIndex/intervalIndex.cjs.map +1 -0
- package/dist/intervalIndex/intervalIndex.d.ts +30 -0
- package/dist/intervalIndex/intervalIndex.d.ts.map +1 -0
- package/dist/intervalIndex/intervalIndexUtils.cjs +22 -0
- package/dist/intervalIndex/intervalIndexUtils.cjs.map +1 -0
- package/dist/intervalIndex/intervalIndexUtils.d.ts +17 -0
- package/dist/intervalIndex/intervalIndexUtils.d.ts.map +1 -0
- package/dist/intervalIndex/overlappingIntervalsIndex.cjs +116 -0
- package/dist/intervalIndex/overlappingIntervalsIndex.cjs.map +1 -0
- package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +44 -0
- package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -0
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.cjs +41 -0
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.cjs.map +1 -0
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +11 -0
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -0
- package/dist/intervalIndex/sequenceIntervalIndexes.cjs +7 -0
- package/dist/intervalIndex/sequenceIntervalIndexes.cjs.map +1 -0
- package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +35 -0
- package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -0
- package/dist/intervalIndex/startpointInRangeIndex.cjs +66 -0
- package/dist/intervalIndex/startpointInRangeIndex.cjs.map +1 -0
- package/dist/intervalIndex/startpointInRangeIndex.d.ts +34 -0
- package/dist/intervalIndex/startpointInRangeIndex.d.ts.map +1 -0
- package/dist/intervalTree.cjs +80 -0
- package/dist/intervalTree.cjs.map +1 -0
- package/dist/intervalTree.d.ts +24 -0
- package/dist/intervalTree.d.ts.map +1 -0
- package/dist/intervals/index.cjs +23 -0
- package/dist/intervals/index.cjs.map +1 -0
- package/dist/intervals/index.d.ts +8 -0
- package/dist/intervals/index.d.ts.map +1 -0
- package/dist/intervals/interval.cjs +181 -0
- package/dist/intervals/interval.cjs.map +1 -0
- package/dist/intervals/interval.d.ts +84 -0
- package/dist/intervals/interval.d.ts.map +1 -0
- package/dist/intervals/intervalUtils.cjs +83 -0
- package/dist/intervals/intervalUtils.cjs.map +1 -0
- package/dist/intervals/intervalUtils.d.ts +230 -0
- package/dist/intervals/intervalUtils.d.ts.map +1 -0
- package/dist/intervals/sequenceInterval.cjs +378 -0
- package/dist/intervals/sequenceInterval.cjs.map +1 -0
- package/dist/intervals/sequenceInterval.d.ts +137 -0
- package/dist/intervals/sequenceInterval.d.ts.map +1 -0
- package/dist/{localValues.js → localValues.cjs} +1 -1
- package/dist/localValues.cjs.map +1 -0
- package/dist/localValues.d.ts +2 -1
- package/dist/localValues.d.ts.map +1 -1
- package/dist/{packageVersion.js → packageVersion.cjs} +2 -2
- package/dist/packageVersion.cjs.map +1 -0
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.d.ts.map +1 -1
- package/dist/revertibles.cjs +425 -0
- package/dist/revertibles.cjs.map +1 -0
- package/dist/revertibles.d.ts +86 -0
- package/dist/revertibles.d.ts.map +1 -0
- package/dist/sequence-alpha.d.ts +1315 -0
- package/dist/sequence-beta.d.ts +244 -0
- package/dist/sequence-public.d.ts +244 -0
- package/dist/sequence-untrimmed.d.ts +1803 -0
- package/dist/{sequence.js → sequence.cjs} +226 -156
- package/dist/sequence.cjs.map +1 -0
- package/dist/sequence.d.ts +125 -48
- package/dist/sequence.d.ts.map +1 -1
- package/dist/{sequenceDeltaEvent.js → sequenceDeltaEvent.cjs} +18 -8
- package/dist/sequenceDeltaEvent.cjs.map +1 -0
- package/dist/sequenceDeltaEvent.d.ts +24 -7
- package/dist/sequenceDeltaEvent.d.ts.map +1 -1
- package/dist/sequenceFactory.cjs +55 -0
- package/dist/sequenceFactory.cjs.map +1 -0
- package/dist/sequenceFactory.d.ts +3 -89
- package/dist/sequenceFactory.d.ts.map +1 -1
- package/dist/{sharedIntervalCollection.js → sharedIntervalCollection.cjs} +17 -22
- package/dist/sharedIntervalCollection.cjs.map +1 -0
- package/dist/sharedIntervalCollection.d.ts +12 -12
- package/dist/sharedIntervalCollection.d.ts.map +1 -1
- package/dist/{sharedSequence.js → sharedSequence.cjs} +29 -22
- package/dist/sharedSequence.cjs.map +1 -0
- package/dist/sharedSequence.d.ts +14 -2
- package/dist/sharedSequence.d.ts.map +1 -1
- package/dist/sharedString.cjs +286 -0
- package/dist/sharedString.cjs.map +1 -0
- package/dist/sharedString.d.ts +58 -22
- package/dist/sharedString.d.ts.map +1 -1
- package/dist/tsdoc-metadata.json +11 -0
- package/lib/{defaultMap.d.ts → defaultMap.d.mts} +7 -6
- package/lib/defaultMap.d.mts.map +1 -0
- package/lib/{defaultMap.js → defaultMap.mjs} +28 -21
- package/lib/defaultMap.mjs.map +1 -0
- package/lib/{defaultMapInterfaces.d.ts → defaultMapInterfaces.d.mts} +44 -12
- package/lib/defaultMapInterfaces.d.mts.map +1 -0
- package/lib/defaultMapInterfaces.mjs +6 -0
- package/lib/defaultMapInterfaces.mjs.map +1 -0
- package/lib/index.d.mts +17 -0
- package/lib/index.d.mts.map +1 -0
- package/lib/index.mjs +16 -0
- package/lib/index.mjs.map +1 -0
- package/lib/intervalCollection.d.mts +569 -0
- package/lib/intervalCollection.d.mts.map +1 -0
- package/lib/intervalCollection.mjs +1144 -0
- package/lib/intervalCollection.mjs.map +1 -0
- package/lib/intervalIndex/endpointInRangeIndex.d.mts +34 -0
- package/lib/intervalIndex/endpointInRangeIndex.d.mts.map +1 -0
- package/lib/intervalIndex/endpointInRangeIndex.mjs +61 -0
- package/lib/intervalIndex/endpointInRangeIndex.mjs.map +1 -0
- package/lib/intervalIndex/endpointIndex.d.mts +38 -0
- package/lib/intervalIndex/endpointIndex.d.mts.map +1 -0
- package/lib/intervalIndex/endpointIndex.mjs +42 -0
- package/lib/intervalIndex/endpointIndex.mjs.map +1 -0
- package/lib/intervalIndex/idIntervalIndex.d.mts +18 -0
- package/lib/intervalIndex/idIntervalIndex.d.mts.map +1 -0
- package/lib/intervalIndex/idIntervalIndex.mjs +40 -0
- package/lib/intervalIndex/idIntervalIndex.mjs.map +1 -0
- package/lib/intervalIndex/index.d.mts +13 -0
- package/lib/intervalIndex/index.d.mts.map +1 -0
- package/lib/intervalIndex/index.mjs +11 -0
- package/lib/intervalIndex/index.mjs.map +1 -0
- package/lib/intervalIndex/intervalIndex.d.mts +30 -0
- package/lib/intervalIndex/intervalIndex.d.mts.map +1 -0
- package/lib/{defaultMapInterfaces.js → intervalIndex/intervalIndex.mjs} +1 -1
- package/lib/intervalIndex/intervalIndex.mjs.map +1 -0
- package/lib/intervalIndex/intervalIndexUtils.d.mts +17 -0
- package/lib/intervalIndex/intervalIndexUtils.d.mts.map +1 -0
- package/lib/intervalIndex/intervalIndexUtils.mjs +18 -0
- package/lib/intervalIndex/intervalIndexUtils.mjs.map +1 -0
- package/lib/intervalIndex/overlappingIntervalsIndex.d.mts +44 -0
- package/lib/intervalIndex/overlappingIntervalsIndex.d.mts.map +1 -0
- package/lib/intervalIndex/overlappingIntervalsIndex.mjs +111 -0
- package/lib/intervalIndex/overlappingIntervalsIndex.mjs.map +1 -0
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.mts +11 -0
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.mts.map +1 -0
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.mjs +37 -0
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.mjs.map +1 -0
- package/lib/intervalIndex/sequenceIntervalIndexes.d.mts +35 -0
- package/lib/intervalIndex/sequenceIntervalIndexes.d.mts.map +1 -0
- package/lib/intervalIndex/sequenceIntervalIndexes.mjs +6 -0
- package/lib/intervalIndex/sequenceIntervalIndexes.mjs.map +1 -0
- package/lib/intervalIndex/startpointInRangeIndex.d.mts +34 -0
- package/lib/intervalIndex/startpointInRangeIndex.d.mts.map +1 -0
- package/lib/intervalIndex/startpointInRangeIndex.mjs +61 -0
- package/lib/intervalIndex/startpointInRangeIndex.mjs.map +1 -0
- package/lib/intervalTree.d.mts +24 -0
- package/lib/intervalTree.d.mts.map +1 -0
- package/lib/intervalTree.mjs +76 -0
- package/lib/intervalTree.mjs.map +1 -0
- package/lib/intervals/index.d.mts +8 -0
- package/lib/intervals/index.d.mts.map +1 -0
- package/lib/intervals/index.mjs +8 -0
- package/lib/intervals/index.mjs.map +1 -0
- package/lib/intervals/interval.d.mts +84 -0
- package/lib/intervals/interval.d.mts.map +1 -0
- package/lib/intervals/interval.mjs +176 -0
- package/lib/intervals/interval.mjs.map +1 -0
- package/lib/intervals/intervalUtils.d.mts +230 -0
- package/lib/intervals/intervalUtils.d.mts.map +1 -0
- package/lib/intervals/intervalUtils.mjs +77 -0
- package/lib/intervals/intervalUtils.mjs.map +1 -0
- package/lib/intervals/sequenceInterval.d.mts +137 -0
- package/lib/intervals/sequenceInterval.d.mts.map +1 -0
- package/lib/intervals/sequenceInterval.mjs +370 -0
- package/lib/intervals/sequenceInterval.mjs.map +1 -0
- package/lib/{localValues.d.ts → localValues.d.mts} +3 -2
- package/lib/localValues.d.mts.map +1 -0
- package/lib/{localValues.js → localValues.mjs} +2 -2
- package/lib/localValues.mjs.map +1 -0
- package/lib/{packageVersion.d.ts → packageVersion.d.mts} +1 -1
- package/lib/{packageVersion.d.ts.map → packageVersion.d.mts.map} +1 -1
- package/lib/{packageVersion.js → packageVersion.mjs} +2 -2
- package/lib/packageVersion.mjs.map +1 -0
- package/lib/revertibles.d.mts +86 -0
- package/lib/revertibles.d.mts.map +1 -0
- package/lib/revertibles.mjs +416 -0
- package/lib/revertibles.mjs.map +1 -0
- package/lib/sequence-alpha.d.mts +1315 -0
- package/lib/sequence-beta.d.mts +244 -0
- package/lib/sequence-public.d.mts +244 -0
- package/lib/sequence-untrimmed.d.mts +1803 -0
- package/lib/{sequence.d.ts → sequence.d.mts} +127 -50
- package/lib/sequence.d.mts.map +1 -0
- package/lib/{sequence.js → sequence.mjs} +225 -152
- package/lib/sequence.mjs.map +1 -0
- package/lib/{sequenceDeltaEvent.d.ts → sequenceDeltaEvent.d.mts} +24 -7
- package/lib/sequenceDeltaEvent.d.mts.map +1 -0
- package/lib/{sequenceDeltaEvent.js → sequenceDeltaEvent.mjs} +20 -8
- package/lib/sequenceDeltaEvent.mjs.map +1 -0
- package/lib/sequenceFactory.d.mts +22 -0
- package/lib/sequenceFactory.d.mts.map +1 -0
- package/lib/sequenceFactory.mjs +51 -0
- package/lib/sequenceFactory.mjs.map +1 -0
- package/lib/{sharedIntervalCollection.d.ts → sharedIntervalCollection.d.mts} +12 -12
- package/lib/sharedIntervalCollection.d.mts.map +1 -0
- package/lib/{sharedIntervalCollection.js → sharedIntervalCollection.mjs} +16 -21
- package/lib/sharedIntervalCollection.mjs.map +1 -0
- package/lib/{sharedSequence.d.ts → sharedSequence.d.mts} +15 -3
- package/lib/sharedSequence.d.mts.map +1 -0
- package/lib/{sharedSequence.js → sharedSequence.mjs} +30 -23
- package/lib/sharedSequence.mjs.map +1 -0
- package/lib/{sharedString.d.ts → sharedString.d.mts} +60 -24
- package/lib/sharedString.d.mts.map +1 -0
- package/lib/sharedString.mjs +281 -0
- package/lib/sharedString.mjs.map +1 -0
- package/package.json +146 -75
- package/prettier.config.cjs +8 -0
- package/sequence.test-files.tar +0 -0
- package/src/defaultMap.ts +417 -403
- package/src/defaultMapInterfaces.ts +157 -117
- package/src/index.ts +86 -26
- package/src/intervalCollection.ts +2043 -1563
- package/src/intervalIndex/endpointInRangeIndex.ts +116 -0
- package/src/intervalIndex/endpointIndex.ts +91 -0
- package/src/intervalIndex/idIntervalIndex.ts +64 -0
- package/src/intervalIndex/index.ts +25 -0
- package/src/intervalIndex/intervalIndex.ts +32 -0
- package/src/intervalIndex/intervalIndexUtils.ts +27 -0
- package/src/intervalIndex/overlappingIntervalsIndex.ts +187 -0
- package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +80 -0
- package/src/intervalIndex/sequenceIntervalIndexes.ts +34 -0
- package/src/intervalIndex/startpointInRangeIndex.ts +114 -0
- package/src/intervalTree.ts +98 -0
- package/src/intervals/index.ts +25 -0
- package/src/intervals/interval.ts +238 -0
- package/src/intervals/intervalUtils.ts +288 -0
- package/src/intervals/sequenceInterval.ts +616 -0
- package/src/localValues.ts +68 -73
- package/src/packageVersion.ts +1 -1
- package/src/revertibles.ts +693 -0
- package/src/sequence.ts +845 -690
- package/src/sequenceDeltaEvent.ts +164 -131
- package/src/sequenceFactory.ts +58 -214
- package/src/sharedIntervalCollection.ts +161 -152
- package/src/sharedSequence.ts +181 -167
- package/src/sharedString.ts +390 -234
- package/tsc-multi.test.json +10 -0
- package/tsconfig.json +11 -13
- package/.editorconfig +0 -7
- package/.vscode/launch.json +0 -15
- package/dist/defaultMap.js.map +0 -1
- package/dist/defaultMapInterfaces.js.map +0 -1
- package/dist/index.js +0 -44
- package/dist/index.js.map +0 -1
- package/dist/intervalCollection.js +0 -1250
- package/dist/intervalCollection.js.map +0 -1
- package/dist/localValues.js.map +0 -1
- package/dist/packageVersion.js.map +0 -1
- package/dist/sequence.js.map +0 -1
- package/dist/sequenceDeltaEvent.js.map +0 -1
- package/dist/sequenceFactory.js +0 -192
- package/dist/sequenceFactory.js.map +0 -1
- package/dist/sharedIntervalCollection.js.map +0 -1
- package/dist/sharedNumberSequence.d.ts +0 -50
- package/dist/sharedNumberSequence.d.ts.map +0 -1
- package/dist/sharedNumberSequence.js +0 -61
- package/dist/sharedNumberSequence.js.map +0 -1
- package/dist/sharedObjectSequence.d.ts +0 -50
- package/dist/sharedObjectSequence.d.ts.map +0 -1
- package/dist/sharedObjectSequence.js +0 -61
- package/dist/sharedObjectSequence.js.map +0 -1
- package/dist/sharedSequence.js.map +0 -1
- package/dist/sharedString.js +0 -187
- package/dist/sharedString.js.map +0 -1
- package/dist/sparsematrix.d.ts +0 -139
- package/dist/sparsematrix.d.ts.map +0 -1
- package/dist/sparsematrix.js +0 -332
- package/dist/sparsematrix.js.map +0 -1
- package/lib/defaultMap.d.ts.map +0 -1
- package/lib/defaultMap.js.map +0 -1
- package/lib/defaultMapInterfaces.d.ts.map +0 -1
- package/lib/defaultMapInterfaces.js.map +0 -1
- package/lib/index.d.ts +0 -27
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js +0 -26
- package/lib/index.js.map +0 -1
- package/lib/intervalCollection.d.ts +0 -270
- package/lib/intervalCollection.d.ts.map +0 -1
- package/lib/intervalCollection.js +0 -1238
- package/lib/intervalCollection.js.map +0 -1
- package/lib/localValues.d.ts.map +0 -1
- package/lib/localValues.js.map +0 -1
- package/lib/packageVersion.js.map +0 -1
- package/lib/sequence.d.ts.map +0 -1
- package/lib/sequence.js.map +0 -1
- package/lib/sequenceDeltaEvent.d.ts.map +0 -1
- package/lib/sequenceDeltaEvent.js.map +0 -1
- package/lib/sequenceFactory.d.ts +0 -108
- package/lib/sequenceFactory.d.ts.map +0 -1
- package/lib/sequenceFactory.js +0 -186
- package/lib/sequenceFactory.js.map +0 -1
- package/lib/sharedIntervalCollection.d.ts.map +0 -1
- package/lib/sharedIntervalCollection.js.map +0 -1
- package/lib/sharedNumberSequence.d.ts +0 -50
- package/lib/sharedNumberSequence.d.ts.map +0 -1
- package/lib/sharedNumberSequence.js +0 -57
- package/lib/sharedNumberSequence.js.map +0 -1
- package/lib/sharedObjectSequence.d.ts +0 -50
- package/lib/sharedObjectSequence.d.ts.map +0 -1
- package/lib/sharedObjectSequence.js +0 -57
- package/lib/sharedObjectSequence.js.map +0 -1
- package/lib/sharedSequence.d.ts.map +0 -1
- package/lib/sharedSequence.js.map +0 -1
- package/lib/sharedString.d.ts.map +0 -1
- package/lib/sharedString.js +0 -183
- package/lib/sharedString.js.map +0 -1
- package/lib/sparsematrix.d.ts +0 -139
- package/lib/sparsematrix.d.ts.map +0 -1
- package/lib/sparsematrix.js +0 -323
- package/lib/sparsematrix.js.map +0 -1
- package/src/sharedNumberSequence.ts +0 -62
- package/src/sharedObjectSequence.ts +0 -62
- package/src/sparsematrix.ts +0 -421
- package/tsconfig.esnext.json +0 -7
package/src/sharedString.ts
CHANGED
|
@@ -4,17 +4,16 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
TextSegment,
|
|
7
|
+
IMergeTreeTextHelper,
|
|
8
|
+
IRelativePosition,
|
|
9
|
+
ISegment,
|
|
10
|
+
ISegmentAction,
|
|
11
|
+
Marker,
|
|
12
|
+
PropertySet,
|
|
13
|
+
ReferencePosition,
|
|
14
|
+
ReferenceType,
|
|
15
|
+
refHasTileLabel,
|
|
16
|
+
TextSegment,
|
|
18
17
|
} from "@fluidframework/merge-tree";
|
|
19
18
|
import { IFluidDataStoreRuntime, IChannelAttributes } from "@fluidframework/datastore-definitions";
|
|
20
19
|
import { SharedSegmentSequence } from "./sequence";
|
|
@@ -22,30 +21,34 @@ import { SharedStringFactory } from "./sequenceFactory";
|
|
|
22
21
|
|
|
23
22
|
/**
|
|
24
23
|
* Fluid object interface describing access methods on a SharedString
|
|
24
|
+
* @alpha
|
|
25
25
|
*/
|
|
26
26
|
export interface ISharedString extends SharedSegmentSequence<SharedStringSegment> {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
27
|
+
/**
|
|
28
|
+
* Inserts the text at the position.
|
|
29
|
+
* @param pos - The position to insert the text at
|
|
30
|
+
* @param text - The text to insert
|
|
31
|
+
* @param props - The properties of the text
|
|
32
|
+
*/
|
|
33
|
+
insertText(pos: number, text: string, props?: PropertySet): void;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Inserts a marker at the position.
|
|
37
|
+
* @param pos - The position to insert the marker at
|
|
38
|
+
* @param refType - The reference type of the marker
|
|
39
|
+
* @param props - The properties of the marker
|
|
40
|
+
*/
|
|
41
|
+
insertMarker(pos: number, refType: ReferenceType, props?: PropertySet): void;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* {@inheritDoc SharedSegmentSequence.posFromRelativePos}
|
|
45
|
+
*/
|
|
46
|
+
posFromRelativePos(relativePos: IRelativePosition): number;
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
+
/**
|
|
50
|
+
* @alpha
|
|
51
|
+
*/
|
|
49
52
|
export type SharedStringSegment = TextSegment | Marker;
|
|
50
53
|
|
|
51
54
|
/**
|
|
@@ -56,208 +59,361 @@ export type SharedStringSegment = TextSegment | Marker;
|
|
|
56
59
|
* In addition to text, a Shared String can also contain markers. Markers can be
|
|
57
60
|
* used to store metadata at positions within the text, like the details of an
|
|
58
61
|
* image or Fluid object that should be rendered with the text.
|
|
59
|
-
*
|
|
62
|
+
* @alpha
|
|
60
63
|
*/
|
|
61
|
-
export class SharedString
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
64
|
+
export class SharedString
|
|
65
|
+
extends SharedSegmentSequence<SharedStringSegment>
|
|
66
|
+
implements ISharedString
|
|
67
|
+
{
|
|
68
|
+
/**
|
|
69
|
+
* Create a new shared string.
|
|
70
|
+
* @param runtime - data store runtime the new shared string belongs to
|
|
71
|
+
* @param id - optional name of the shared string
|
|
72
|
+
* @returns newly create shared string (but not attached yet)
|
|
73
|
+
*/
|
|
74
|
+
public static create(runtime: IFluidDataStoreRuntime, id?: string) {
|
|
75
|
+
return runtime.createChannel(id, SharedStringFactory.Type) as SharedString;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Get a factory for SharedString to register with the data store.
|
|
80
|
+
* @returns a factory that creates and load SharedString
|
|
81
|
+
*/
|
|
82
|
+
public static getFactory() {
|
|
83
|
+
return new SharedStringFactory();
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
public get ISharedString(): ISharedString {
|
|
87
|
+
return this;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
private readonly mergeTreeTextHelper: IMergeTreeTextHelper;
|
|
91
|
+
|
|
92
|
+
constructor(
|
|
93
|
+
document: IFluidDataStoreRuntime,
|
|
94
|
+
public id: string,
|
|
95
|
+
attributes: IChannelAttributes,
|
|
96
|
+
) {
|
|
97
|
+
super(document, id, attributes, SharedStringFactory.segmentFromSpec as any);
|
|
98
|
+
this.mergeTreeTextHelper = this.client.createTextHelper();
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Inserts a marker at a relative position.
|
|
103
|
+
* @param relativePos1 - The relative position to insert the marker at
|
|
104
|
+
* @param refType - The reference type of the marker
|
|
105
|
+
* @param props - The properties of the marker
|
|
106
|
+
*/
|
|
107
|
+
public insertMarkerRelative(
|
|
108
|
+
relativePos1: IRelativePosition,
|
|
109
|
+
refType: ReferenceType,
|
|
110
|
+
props?: PropertySet,
|
|
111
|
+
): void {
|
|
112
|
+
const segment = new Marker(refType);
|
|
113
|
+
if (props) {
|
|
114
|
+
segment.addProperties(props);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const pos = this.posFromRelativePos(relativePos1);
|
|
118
|
+
this.guardReentrancy(() => this.client.insertSegmentLocal(pos, segment));
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* {@inheritDoc ISharedString.insertMarker}
|
|
123
|
+
*/
|
|
124
|
+
public insertMarker(pos: number, refType: ReferenceType, props?: PropertySet): void {
|
|
125
|
+
const segment = new Marker(refType);
|
|
126
|
+
if (props) {
|
|
127
|
+
segment.addProperties(props);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
this.guardReentrancy(() => this.client.insertSegmentLocal(pos, segment));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Inserts the text at the position.
|
|
135
|
+
* @param relativePos1 - The relative position to insert the text at
|
|
136
|
+
* @param text - The text to insert
|
|
137
|
+
* @param props - The properties of text
|
|
138
|
+
*/
|
|
139
|
+
public insertTextRelative(
|
|
140
|
+
relativePos1: IRelativePosition,
|
|
141
|
+
text: string,
|
|
142
|
+
props?: PropertySet,
|
|
143
|
+
): void {
|
|
144
|
+
const segment = new TextSegment(text);
|
|
145
|
+
if (props) {
|
|
146
|
+
segment.addProperties(props);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const pos = this.posFromRelativePos(relativePos1);
|
|
150
|
+
this.guardReentrancy(() => this.client.insertSegmentLocal(pos, segment));
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* {@inheritDoc ISharedString.insertText}
|
|
155
|
+
*/
|
|
156
|
+
public insertText(pos: number, text: string, props?: PropertySet): void {
|
|
157
|
+
const segment = new TextSegment(text);
|
|
158
|
+
if (props) {
|
|
159
|
+
segment.addProperties(props);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
this.guardReentrancy(() => this.client.insertSegmentLocal(pos, segment));
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Replaces a range with the provided text.
|
|
167
|
+
* @param start - The inclusive start of the range to replace
|
|
168
|
+
* @param end - The exclusive end of the range to replace
|
|
169
|
+
* @param text - The text to replace the range with
|
|
170
|
+
* @param props - Optional. The properties of the replacement text
|
|
171
|
+
*/
|
|
172
|
+
public replaceText(start: number, end: number, text: string, props?: PropertySet): void {
|
|
173
|
+
this.replaceRange(start, end, TextSegment.make(text, props));
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Removes the text in the given range.
|
|
178
|
+
* @param start - The inclusive start of the range to remove
|
|
179
|
+
* @param end - The exclusive end of the range to replace
|
|
180
|
+
* @returns the message sent.
|
|
181
|
+
*/
|
|
182
|
+
public removeText(start: number, end: number): void {
|
|
183
|
+
this.removeRange(start, end);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Annotates the marker with the provided properties.
|
|
188
|
+
* @param marker - The marker to annotate
|
|
189
|
+
* @param props - The properties to annotate the marker with
|
|
190
|
+
*/
|
|
191
|
+
public annotateMarker(marker: Marker, props: PropertySet) {
|
|
192
|
+
this.guardReentrancy(() => this.client.annotateMarker(marker, props));
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Finds the nearest reference with ReferenceType.Tile to `startPos` in the direction dictated by `tilePrecedesPos`.
|
|
197
|
+
* Note that Markers receive `ReferenceType.Tile` by default.
|
|
198
|
+
* @deprecated Use `searchForMarker` instead.
|
|
199
|
+
* @param startPos - Position at which to start the search
|
|
200
|
+
* @param clientId - clientId dictating the perspective to search from
|
|
201
|
+
* @param tileLabel - Label of the tile to search for
|
|
202
|
+
* @param preceding - Whether the desired tile comes before (true) or after (false) `startPos`
|
|
203
|
+
*/
|
|
204
|
+
public findTile(
|
|
205
|
+
startPos: number | undefined,
|
|
206
|
+
tileLabel: string,
|
|
207
|
+
preceding = true,
|
|
208
|
+
):
|
|
209
|
+
| {
|
|
210
|
+
tile: ReferencePosition;
|
|
211
|
+
pos: number;
|
|
212
|
+
}
|
|
213
|
+
| undefined {
|
|
214
|
+
return this.client.findTile(startPos ?? 0, tileLabel, preceding);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Searches a string for the nearest marker in either direction to a given start position.
|
|
219
|
+
* The search will include the start position, so markers at the start position are valid
|
|
220
|
+
* results of the search.
|
|
221
|
+
* @param startPos - Position at which to start the search
|
|
222
|
+
* @param markerLabel - Label of the marker to search for
|
|
223
|
+
* @param forwards - Whether the desired marker comes before (false) or after (true) `startPos`
|
|
224
|
+
*/
|
|
225
|
+
public searchForMarker(
|
|
226
|
+
startPos: number,
|
|
227
|
+
markerLabel: string,
|
|
228
|
+
forwards = true,
|
|
229
|
+
): Marker | undefined {
|
|
230
|
+
return this.client.searchForMarker(startPos, markerLabel, forwards);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Retrieve text from the SharedString in string format.
|
|
235
|
+
* @param start - The starting index of the text to retrieve, or 0 if omitted.
|
|
236
|
+
* @param end - The ending index of the text to retrieve, or the end of the string if omitted
|
|
237
|
+
* @returns The requested text content as a string.
|
|
238
|
+
*/
|
|
239
|
+
public getText(start?: number, end?: number) {
|
|
240
|
+
const segmentWindow = this.client.getCollabWindow();
|
|
241
|
+
return this.mergeTreeTextHelper.getText(
|
|
242
|
+
segmentWindow.currentSeq,
|
|
243
|
+
segmentWindow.clientId,
|
|
244
|
+
"",
|
|
245
|
+
start,
|
|
246
|
+
end,
|
|
247
|
+
);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Adds spaces for markers and handles, so that position calculations account for them.
|
|
252
|
+
*/
|
|
253
|
+
public getTextWithPlaceholders(start?: number, end?: number) {
|
|
254
|
+
const segmentWindow = this.client.getCollabWindow();
|
|
255
|
+
return this.mergeTreeTextHelper.getText(
|
|
256
|
+
segmentWindow.currentSeq,
|
|
257
|
+
segmentWindow.clientId,
|
|
258
|
+
" ",
|
|
259
|
+
start,
|
|
260
|
+
end,
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
public getTextRangeWithMarkers(start: number, end: number) {
|
|
265
|
+
const segmentWindow = this.client.getCollabWindow();
|
|
266
|
+
return this.mergeTreeTextHelper.getText(
|
|
267
|
+
segmentWindow.currentSeq,
|
|
268
|
+
segmentWindow.clientId,
|
|
269
|
+
"*",
|
|
270
|
+
start,
|
|
271
|
+
end,
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Looks up and returns a `Marker` using its id. Returns `undefined` if there is no marker with the provided
|
|
277
|
+
* id in this `SharedString`.
|
|
278
|
+
*/
|
|
279
|
+
public getMarkerFromId(id: string): ISegment | undefined {
|
|
280
|
+
return this.client.getMarkerFromId(id);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Revert an op
|
|
285
|
+
*/
|
|
286
|
+
protected rollback(content: any, localOpMetadata: unknown): void {
|
|
287
|
+
if (this.client.rollback !== undefined) {
|
|
288
|
+
this.client.rollback(content, localOpMetadata);
|
|
289
|
+
} else {
|
|
290
|
+
super.rollback(content, localOpMetadata);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
interface ITextAndMarkerAccumulator {
|
|
296
|
+
parallelText: string[];
|
|
297
|
+
parallelMarkers: Marker[];
|
|
298
|
+
parallelMarkerLabel: string;
|
|
299
|
+
placeholder?: string;
|
|
300
|
+
tagsInProgress: string[];
|
|
301
|
+
textSegment: TextSegment;
|
|
263
302
|
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Splits the text into regions ending with markers with the given `label`.
|
|
306
|
+
* @param sharedString - String to retrieve text and markers from
|
|
307
|
+
* @param label - label to split on
|
|
308
|
+
* @returns Two parallel lists of text and markers, split by markers with the provided `label`.
|
|
309
|
+
* For example:
|
|
310
|
+
* ```typescript
|
|
311
|
+
* // Say sharedstring has contents "hello<paragraph marker 1>world<paragraph marker 2>missing".
|
|
312
|
+
* const { parallelText, parallelMarkers } = getTextAndMarkers(sharedString, "paragraph");
|
|
313
|
+
* // parallelText === ["hello", "world"]
|
|
314
|
+
* // parallelMarkers === [<paragraph marker 1 object>, <paragraph marker 2 object>]
|
|
315
|
+
* // Note parallelText does not include "missing".
|
|
316
|
+
* ```
|
|
317
|
+
* @internal
|
|
318
|
+
*/
|
|
319
|
+
export function getTextAndMarkers(
|
|
320
|
+
sharedString: SharedString,
|
|
321
|
+
label: string,
|
|
322
|
+
start?: number,
|
|
323
|
+
end?: number,
|
|
324
|
+
): {
|
|
325
|
+
parallelText: string[];
|
|
326
|
+
parallelMarkers: Marker[];
|
|
327
|
+
} {
|
|
328
|
+
const accum: ITextAndMarkerAccumulator = {
|
|
329
|
+
parallelMarkerLabel: label,
|
|
330
|
+
parallelMarkers: [],
|
|
331
|
+
parallelText: [],
|
|
332
|
+
tagsInProgress: [],
|
|
333
|
+
textSegment: new TextSegment(""),
|
|
334
|
+
};
|
|
335
|
+
|
|
336
|
+
sharedString.walkSegments(gatherTextAndMarkers, start, end, accum);
|
|
337
|
+
return { parallelText: accum.parallelText, parallelMarkers: accum.parallelMarkers };
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
const gatherTextAndMarkers: ISegmentAction<ITextAndMarkerAccumulator> = (
|
|
341
|
+
segment: ISegment,
|
|
342
|
+
pos: number,
|
|
343
|
+
refSeq: number,
|
|
344
|
+
clientId: number,
|
|
345
|
+
start: number,
|
|
346
|
+
end: number,
|
|
347
|
+
accumText: ITextAndMarkerAccumulator,
|
|
348
|
+
) => {
|
|
349
|
+
const { placeholder, tagsInProgress, textSegment } = accumText;
|
|
350
|
+
if (TextSegment.is(segment)) {
|
|
351
|
+
let beginTags = "";
|
|
352
|
+
let endTags = "";
|
|
353
|
+
// TODO: let clients pass in function to get tag
|
|
354
|
+
const tags = [] as string[];
|
|
355
|
+
const initTags = [] as string[];
|
|
356
|
+
|
|
357
|
+
if (segment.properties?.["font-weight"]) {
|
|
358
|
+
tags.push("b");
|
|
359
|
+
}
|
|
360
|
+
if (segment.properties?.["text-decoration"]) {
|
|
361
|
+
tags.push("u");
|
|
362
|
+
}
|
|
363
|
+
const remTags = [] as string[];
|
|
364
|
+
if (tags.length > 0) {
|
|
365
|
+
for (const tag of tags) {
|
|
366
|
+
if (!tagsInProgress.includes(tag)) {
|
|
367
|
+
beginTags += `<${tag}>`;
|
|
368
|
+
initTags.push(tag);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
for (const accumTag of tagsInProgress) {
|
|
372
|
+
if (!tags.includes(accumTag)) {
|
|
373
|
+
endTags += `</${accumTag}>`;
|
|
374
|
+
remTags.push(accumTag);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
for (const initTag of initTags.reverse()) {
|
|
378
|
+
tagsInProgress.push(initTag);
|
|
379
|
+
}
|
|
380
|
+
} else {
|
|
381
|
+
for (const accumTag of tagsInProgress) {
|
|
382
|
+
endTags += `</${accumTag}>`;
|
|
383
|
+
remTags.push(accumTag);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
for (const remTag of remTags) {
|
|
387
|
+
const remdex = tagsInProgress.indexOf(remTag);
|
|
388
|
+
if (remdex >= 0) {
|
|
389
|
+
tagsInProgress.splice(remdex, 1);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
textSegment.text += endTags;
|
|
393
|
+
textSegment.text += beginTags;
|
|
394
|
+
if (start <= 0 && end >= segment.text.length) {
|
|
395
|
+
textSegment.text += segment.text;
|
|
396
|
+
} else {
|
|
397
|
+
const seglen = segment.text.length;
|
|
398
|
+
const _start = start < 0 ? 0 : start;
|
|
399
|
+
const _end = end >= seglen ? undefined : end;
|
|
400
|
+
textSegment.text += segment.text.substring(_start, _end);
|
|
401
|
+
}
|
|
402
|
+
} else {
|
|
403
|
+
if (placeholder && placeholder.length > 0) {
|
|
404
|
+
const placeholderText =
|
|
405
|
+
// eslint-disable-next-line @typescript-eslint/no-base-to-string
|
|
406
|
+
placeholder === "*" ? `\n${segment}` : placeholder.repeat(segment.cachedLength);
|
|
407
|
+
textSegment.text += placeholderText;
|
|
408
|
+
} else {
|
|
409
|
+
const marker = segment as Marker;
|
|
410
|
+
if (refHasTileLabel(marker, accumText.parallelMarkerLabel)) {
|
|
411
|
+
accumText.parallelMarkers.push(marker);
|
|
412
|
+
accumText.parallelText.push(textSegment.text);
|
|
413
|
+
textSegment.text = "";
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
return true;
|
|
419
|
+
};
|