nlptoolkit-morphologicalanalysis 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +144 -0
  2. package/dist/Corpus/DisambiguatedWord.d.ts +20 -0
  3. package/dist/Corpus/DisambiguatedWord.js +38 -0
  4. package/dist/Corpus/DisambiguatedWord.js.map +1 -0
  5. package/dist/Corpus/DisambiguationCorpus.d.ts +4 -0
  6. package/dist/Corpus/DisambiguationCorpus.js +54 -0
  7. package/dist/Corpus/DisambiguationCorpus.js.map +1 -0
  8. package/dist/MorphologicalAnalysis/FiniteStateMachine.d.ts +63 -0
  9. package/dist/MorphologicalAnalysis/FiniteStateMachine.js +178 -0
  10. package/dist/MorphologicalAnalysis/FiniteStateMachine.js.map +1 -0
  11. package/dist/MorphologicalAnalysis/FsmMorphologicalAnalyzer.d.ts +399 -0
  12. package/dist/MorphologicalAnalysis/FsmMorphologicalAnalyzer.js +1255 -0
  13. package/dist/MorphologicalAnalysis/FsmMorphologicalAnalyzer.js.map +1 -0
  14. package/dist/MorphologicalAnalysis/FsmParse.d.ts +290 -0
  15. package/dist/MorphologicalAnalysis/FsmParse.js +684 -0
  16. package/dist/MorphologicalAnalysis/FsmParse.js.map +1 -0
  17. package/dist/MorphologicalAnalysis/FsmParseList.d.ts +96 -0
  18. package/dist/MorphologicalAnalysis/FsmParseList.js +242 -0
  19. package/dist/MorphologicalAnalysis/FsmParseList.js.map +1 -0
  20. package/dist/MorphologicalAnalysis/InflectionalGroup.d.ts +77 -0
  21. package/dist/MorphologicalAnalysis/InflectionalGroup.js +213 -0
  22. package/dist/MorphologicalAnalysis/InflectionalGroup.js.map +1 -0
  23. package/dist/MorphologicalAnalysis/MetamorphicParse.d.ts +63 -0
  24. package/dist/MorphologicalAnalysis/MetamorphicParse.js +592 -0
  25. package/dist/MorphologicalAnalysis/MetamorphicParse.js.map +1 -0
  26. package/dist/MorphologicalAnalysis/MorphologicalParse.d.ts +301 -0
  27. package/dist/MorphologicalAnalysis/MorphologicalParse.js +969 -0
  28. package/dist/MorphologicalAnalysis/MorphologicalParse.js.map +1 -0
  29. package/dist/MorphologicalAnalysis/MorphologicalTag.d.ts +510 -0
  30. package/dist/MorphologicalAnalysis/MorphologicalTag.js +525 -0
  31. package/dist/MorphologicalAnalysis/MorphologicalTag.js.map +1 -0
  32. package/dist/MorphologicalAnalysis/State.d.ts +40 -0
  33. package/dist/MorphologicalAnalysis/State.js +64 -0
  34. package/dist/MorphologicalAnalysis/State.js.map +1 -0
  35. package/dist/MorphologicalAnalysis/Transition.d.ts +159 -0
  36. package/dist/MorphologicalAnalysis/Transition.js +751 -0
  37. package/dist/MorphologicalAnalysis/Transition.js.map +1 -0
  38. package/index.js +12 -0
  39. package/package.json +30 -0
  40. package/penntreebank.txt +208431 -0
  41. package/source/Corpus/DisambiguatedWord.ts +29 -0
  42. package/source/Corpus/DisambiguationCorpus.ts +39 -0
  43. package/source/MorphologicalAnalysis/FiniteStateMachine.ts +165 -0
  44. package/source/MorphologicalAnalysis/FsmMorphologicalAnalyzer.ts +1256 -0
  45. package/source/MorphologicalAnalysis/FsmParse.ts +664 -0
  46. package/source/MorphologicalAnalysis/FsmParseList.ts +238 -0
  47. package/source/MorphologicalAnalysis/InflectionalGroup.ts +210 -0
  48. package/source/MorphologicalAnalysis/MetamorphicParse.ts +589 -0
  49. package/source/MorphologicalAnalysis/MorphologicalParse.ts +995 -0
  50. package/source/MorphologicalAnalysis/MorphologicalTag.ts +510 -0
  51. package/source/MorphologicalAnalysis/State.ts +59 -0
  52. package/source/MorphologicalAnalysis/Transition.ts +733 -0
  53. package/source/tsconfig.json +13 -0
  54. package/tests/DisambiguationCorpusTest.ts +12 -0
  55. package/tests/FiniteStateMachineTest.ts +87 -0
  56. package/tests/FsmMorphologicalAnalyzerTest.ts +204 -0
  57. package/tests/FsmParseListTest.ts +90 -0
  58. package/tests/FsmParseTest.ts +66 -0
  59. package/tests/InflectionalGroupTest.ts +84 -0
  60. package/tests/MorphologicalParseTest.ts +152 -0
  61. package/tests/TransitionTest.ts +174 -0
  62. package/tsconfig.json +15 -0
  63. package/turkish_dictionary.txt +62120 -0
  64. package/turkish_finite_state_machine.xml +1887 -0
  65. package/turkish_misspellings.txt +148932 -0
@@ -0,0 +1,589 @@
1
+ import {MorphologicalTag} from "./MorphologicalTag";
2
+ import {Word} from "nlptoolkit-dictionary/dist/Dictionary/Word";
3
+ import {MorphologicalParse} from "./MorphologicalParse";
4
+
5
+ export class MetamorphicParse {
6
+
7
+ static metaMorphemes = ["Ar", "Ar", "CA", "CA",
8
+ "CA", "cAsHnA", "CH", "CHk",
9
+ "DA", "DAn", "DH", "DHk",
10
+ "DHkCA", "DHr", "DHr", "DHr",
11
+ "H", "Hl", "Hm", "Hn",
12
+ "Hn", "Hn", "HmHz", "HncH",
13
+ "HnHz", "Hr", "Hr", "Hs",
14
+ "Ht", "Hyor", "Hz", "k",
15
+ "ki", "kü", "lAn", "lAr",
16
+ "lArDHr", "lArH", "lArH'", "lAs",
17
+ "lH", "lHk", "lHm", "m",
18
+ "mA", "mA", "mAcA", "mAdAn",
19
+ "mAk", "mAksHzHn", "mAktA", "mAlH",
20
+ "mAzlHk", "mHs", "n", "n",
21
+ "nA", "ncA", "nDA", "nDAn",
22
+ "nH", "nHn", "nHz", "nlAr",
23
+ "SA", "SAl", "sH", "SH",
24
+ "SH", "SHn", "SHnHz", "SHnlAr",
25
+ "SHz", "ŞAr", "t", "yA",
26
+ "yA", "yAbil", "yAcAk", "yAcAk",
27
+ "yAdur", "yAgel", "yAlH", "yAmA",
28
+ "yAmAdAn", "yAn", "yArAk", "yAsH",
29
+ "yDH", "yH", "yHcH", "yHm",
30
+ "yHn", "yHncA", "yHp", "yHs",
31
+ "yHver", "yHz", "yken", "ylA",
32
+ "ymHs", "ysA", "z", "zsHn",
33
+ "zsHnHz", "zlAr", "yAkal", "yAkoy",
34
+ "yAgor"];
35
+
36
+ static morphotacticTags = [
37
+ /**
38
+ * Aorist Tense : Her hafta sonunda futbol oynarlar.
39
+ */
40
+ MorphologicalTag.AORIST,
41
+ /**
42
+ * Causative Form : Pişirmek
43
+ */
44
+ MorphologicalTag.CAUSATIVE,
45
+ /**
46
+ * As if : Yaşarmışcasına
47
+ */
48
+ MorphologicalTag.ASIF,
49
+ /**
50
+ * -LY : Akıllıca
51
+ */
52
+ MorphologicalTag.LY,
53
+ /**
54
+ * Equative : Öylece
55
+ */
56
+ MorphologicalTag.EQUATIVE,
57
+ /**
58
+ * As if
59
+ */
60
+ MorphologicalTag.ASIF,
61
+ /**
62
+ * Agent : Toplayıcı
63
+ */
64
+ MorphologicalTag.AGENT,
65
+ /**
66
+ * Dimension : Küçücük
67
+ */
68
+ MorphologicalTag.DIMENSION,
69
+ /**
70
+ * Locative : Aşağıda
71
+ */
72
+ MorphologicalTag.LOCATIVE,
73
+ /**
74
+ * Ablative : Okuldan
75
+ */
76
+ MorphologicalTag.ABLATIVE,
77
+ /**
78
+ * Past tense : Yaşandı
79
+ */
80
+ MorphologicalTag.PASTTENSE,
81
+ /**
82
+ * Past participle : Kırılmış
83
+ */
84
+ MorphologicalTag.PASTPARTICIPLE,
85
+ /**
86
+ * As long as : Yaşadıkça
87
+ */
88
+ MorphologicalTag.ASLONGAS,
89
+ /**
90
+ * Copula : Mavidir
91
+ */
92
+ MorphologicalTag.COPULA,
93
+ /**
94
+ * Since : Yıllardır
95
+ */
96
+ MorphologicalTag.SINCE,
97
+ /**
98
+ * Causitive
99
+ */
100
+ MorphologicalTag.CAUSATIVE,
101
+ /**
102
+ * 3rd person singular possessive : Onun
103
+ */
104
+ MorphologicalTag.P3SG,
105
+ /**
106
+ * Passive : Açıldı
107
+ */
108
+ MorphologicalTag.PASSIVE,
109
+ /**
110
+ * 1st person singular possessive : Benim
111
+ */
112
+ MorphologicalTag.P1SG,
113
+ /**
114
+ * Reflexive : Kendi
115
+ */
116
+ MorphologicalTag.REFLEXIVE,
117
+ /**
118
+ * Passive
119
+ */
120
+ MorphologicalTag.PASSIVE,
121
+ /**
122
+ * 2nd person singular possessive :Senin
123
+ */
124
+ MorphologicalTag.P2SG,
125
+ /**
126
+ * 1st person plural possessive : Bizim
127
+ */
128
+ MorphologicalTag.P1PL,
129
+ /**
130
+ * Ordinal Number : Altıncı
131
+ */
132
+ MorphologicalTag.ORDINAL,
133
+ /**
134
+ * 2nd person plural possessive : Sizin
135
+ */
136
+ MorphologicalTag.P2PL,
137
+ /**
138
+ * Aorist
139
+ */
140
+ MorphologicalTag.AORIST,
141
+ /**
142
+ * Causitive
143
+ */
144
+ MorphologicalTag.CAUSATIVE,
145
+ /**
146
+ * Reciprocal verb : Görüşmek
147
+ */
148
+ MorphologicalTag.RECIPROCAL,
149
+ /**
150
+ * Causitive
151
+ */
152
+ MorphologicalTag.CAUSATIVE,
153
+ /**
154
+ * Progressive1 : Görüyor
155
+ */
156
+ MorphologicalTag.PROGRESSIVE1,
157
+ /**
158
+ * 1st person plural agreement : Biz gideriz
159
+ */
160
+ MorphologicalTag.A1PL,
161
+ /**
162
+ * 1st person plural agreement
163
+ */
164
+ MorphologicalTag.A1PL,
165
+ /**
166
+ * Relative : Gelenin
167
+ */
168
+ MorphologicalTag.RELATIVE,
169
+ /**
170
+ * Relative
171
+ */
172
+ MorphologicalTag.RELATIVE,
173
+ /**
174
+ * Acquire : Kazanılan
175
+ */
176
+ MorphologicalTag.ACQUIRE,
177
+ /**
178
+ * 3rd person plural agreement : Onlar giderler
179
+ */
180
+ MorphologicalTag.A3PL,
181
+ /**
182
+ * Since
183
+ */
184
+ MorphologicalTag.SINCE,
185
+ /**
186
+ * 3rd person plural possessive : Onların
187
+ */
188
+ MorphologicalTag.P3PL,
189
+ /**
190
+ * 3rd person plural possessive
191
+ */
192
+ MorphologicalTag.P3PL,
193
+ /**
194
+ * Become : Abideleş
195
+ */
196
+ MorphologicalTag.BECOME,
197
+ /**
198
+ * With : Kalemle
199
+ */
200
+ MorphologicalTag.WITH,
201
+ /**
202
+ * Ness : Ağırbaşlılık
203
+ */
204
+ MorphologicalTag.NESS,
205
+ /**
206
+ * 1st person plural agreement
207
+ */
208
+ MorphologicalTag.A1PL,
209
+ /**
210
+ * 1st person singular agreement : Ben giderim
211
+ */
212
+ MorphologicalTag.A1SG,
213
+ /**
214
+ * Infinitive2 : Yapma
215
+ */
216
+ MorphologicalTag.INFINITIVE2,
217
+ /**
218
+ * Negative : Yapama
219
+ */
220
+ MorphologicalTag.NEGATIVE,
221
+ /**
222
+ * Act of : Aldatmaca
223
+ */
224
+ MorphologicalTag.ACTOF,
225
+ /**
226
+ * Without having done so : Çaktırmadan
227
+ */
228
+ MorphologicalTag.WITHOUTHAVINGDONESO,
229
+ /**
230
+ * Infinitive : Yapmak
231
+ */
232
+ MorphologicalTag.INFINITIVE,
233
+ /**
234
+ * Without having done so
235
+ */
236
+ MorphologicalTag.WITHOUTHAVINGDONESO,
237
+ /**
238
+ * Progressive2 : Görmekte
239
+ */
240
+ MorphologicalTag.PROGRESSIVE2,
241
+ /**
242
+ * Necessity : Yapmalı
243
+ */
244
+ MorphologicalTag.NECESSITY,
245
+ /**
246
+ * Notable state : Anlaşılmazlık
247
+ */
248
+ MorphologicalTag.NOTABLESTATE,
249
+ /**
250
+ * Narrative Narrative Past Tense : Oluşmuş
251
+ */
252
+ MorphologicalTag.NARRATIVE,
253
+ /**
254
+ * 2nd person singuular agreement : Sen gelirsin
255
+ */
256
+ MorphologicalTag.A2SG,
257
+ /**
258
+ * Passive
259
+ */
260
+ MorphologicalTag.PASSIVE,
261
+ /**
262
+ * Dative case : Bana
263
+ */
264
+ MorphologicalTag.DATIVE,
265
+ /**
266
+ * Equative
267
+ */
268
+ MorphologicalTag.EQUATIVE,
269
+ /**
270
+ * Locative
271
+ */
272
+ MorphologicalTag.LOCATIVE,
273
+ /**
274
+ * Ablative
275
+ */
276
+ MorphologicalTag.ABLATIVE,
277
+ /**
278
+ * Accusatıve : Beni
279
+ */
280
+ MorphologicalTag.ACCUSATIVE,
281
+ /**
282
+ * Genitive : Benim
283
+ */
284
+ MorphologicalTag.GENITIVE,
285
+ /**
286
+ * 2nd person plural agreement : Siz gelirsiniz
287
+ */
288
+ MorphologicalTag.A2PL,
289
+ /**
290
+ * 3rd person plural agreement
291
+ */
292
+ MorphologicalTag.A3PL,
293
+ /**
294
+ * Desire/Past Auxiliary : Çıkarsa
295
+ */
296
+ MorphologicalTag.DESIRE,
297
+ /**
298
+ * Related to : Davranışsal
299
+ */
300
+ MorphologicalTag.RELATED,
301
+ /**
302
+ * 3rd person singular possessive
303
+ */
304
+ MorphologicalTag.P3SG,
305
+ /**
306
+ * Just like : Destansı
307
+ */
308
+ MorphologicalTag.JUSTLIKE,
309
+ /**
310
+ * Almost : Dikensi
311
+ */
312
+ MorphologicalTag.ALMOST,
313
+ /**
314
+ * 2nd person singular agreement
315
+ */
316
+ MorphologicalTag.A2SG,
317
+ /**
318
+ * 2nd person plural agreement
319
+ */
320
+ MorphologicalTag.A2PL,
321
+ /**
322
+ * 3rd person plural agreement
323
+ */
324
+ MorphologicalTag.A3PL,
325
+ /**
326
+ * Without : Dikişsiz
327
+ */
328
+ MorphologicalTag.WITHOUT,
329
+ /**
330
+ * Distributive : altışar
331
+ */
332
+ MorphologicalTag.DISTRIBUTIVE,
333
+ /**
334
+ * Causitive form
335
+ */
336
+ MorphologicalTag.CAUSATIVE,
337
+ /**
338
+ * Dative case
339
+ */
340
+ MorphologicalTag.DATIVE,
341
+ /**
342
+ * Optative : Doğanaya
343
+ */
344
+ MorphologicalTag.OPTATIVE,
345
+ /**
346
+ * Ability, possibility : Olabilir
347
+ */
348
+ MorphologicalTag.ABLE,
349
+ /**
350
+ * Future participle : Gülecek
351
+ */
352
+ MorphologicalTag.FUTUREPARTICIPLE,
353
+ /**
354
+ * Future : Yağacak
355
+ */
356
+ MorphologicalTag.FUTURE,
357
+ /**
358
+ * Continuous : Yapadur
359
+ */
360
+ MorphologicalTag.REPEAT,
361
+ /**
362
+ * Ever since : Çıkagel
363
+ */
364
+ MorphologicalTag.EVERSINCE,
365
+ /**
366
+ * Since doing so : Amasyalı
367
+ */
368
+ MorphologicalTag.SINCEDOINGSO,
369
+ /**
370
+ * Not able state : Anlaşılmazlık
371
+ */
372
+ MorphologicalTag.NOTABLESTATE,
373
+ /**
374
+ * Wıthout beıng able to have done so: kararlamadan
375
+ */
376
+ MorphologicalTag.WITHOUTBEINGABLETOHAVEDONESO,
377
+ /**
378
+ * Present participle : Sarılan
379
+ */
380
+ MorphologicalTag.PRESENTPARTICIPLE,
381
+ /**
382
+ * By doing so : Zıplayarak
383
+ */
384
+ MorphologicalTag.BYDOINGSO,
385
+ /**
386
+ * Projection : Öpülesi
387
+ */
388
+ MorphologicalTag.FEELLIKE,
389
+ /**
390
+ * Past tense : Gitti
391
+ */
392
+ MorphologicalTag.PASTTENSE,
393
+ /**
394
+ * Accusative
395
+ */
396
+ MorphologicalTag.ACCUSATIVE,
397
+ /**
398
+ * Agent
399
+ */
400
+ MorphologicalTag.AGENT,
401
+ /**
402
+ * 1st person singular agreement
403
+ */
404
+ MorphologicalTag.A1SG,
405
+ /**
406
+ * 2nd person plural agreement
407
+ */
408
+ MorphologicalTag.A2PL,
409
+ /**
410
+ * When : Okuyunca
411
+ */
412
+ MorphologicalTag.WHEN,
413
+ /**
414
+ * After doing so : Yapıp
415
+ */
416
+ MorphologicalTag.AFTERDOINGSO,
417
+ /**
418
+ * Infinitive : Yapış
419
+ */
420
+ MorphologicalTag.INFINITIVE3,
421
+ /**
422
+ * Hastility : Yapıver
423
+ */
424
+ MorphologicalTag.HASTILY,
425
+ /**
426
+ * 1st person plural agreement
427
+ */
428
+ MorphologicalTag.A1PL,
429
+ /**
430
+ * While : Gelirken
431
+ */
432
+ MorphologicalTag.WHILE,
433
+ /**
434
+ * Instrumental : Kışın, arabayla
435
+ */
436
+ MorphologicalTag.INSTRUMENTAL,
437
+ /**
438
+ * Narrative
439
+ */
440
+ MorphologicalTag.NARRATIVE,
441
+ /**
442
+ * Conditional : Gelirse
443
+ */
444
+ MorphologicalTag.CONDITIONAL,
445
+ /**
446
+ * 3rd person singuular agreement : O gelir
447
+ */
448
+ MorphologicalTag.A3SG,
449
+ /**
450
+ * 2nd person singuular agreement
451
+ */
452
+ MorphologicalTag.A2SG,
453
+ /**
454
+ * 2nd person plural agreement
455
+ */
456
+ MorphologicalTag.A2PL,
457
+ /**
458
+ * 3rd person plural agreement
459
+ */
460
+ MorphologicalTag.A3PL,
461
+ /**
462
+ * Stay : Bakakal
463
+ */
464
+ MorphologicalTag.STAY,
465
+ /**
466
+ * Start : Alıkoy
467
+ */
468
+ MorphologicalTag.START,
469
+ /**
470
+ * Repeat : Yapagör
471
+ */
472
+ MorphologicalTag.REPEAT
473
+ ]
474
+
475
+ private metaMorphemeList: Array<string>
476
+ private readonly root: Word
477
+
478
+ /**
479
+ * The getMetaMorphemeTag method takes a String tag as an input and takes the first char of the tag. If first char
480
+ * is a punctuation it gets a substring from the tag. And gets the meta morphemes of this tag then adds to the
481
+ * result {@link Array}.
482
+ *
483
+ * @param tag String to get meta morphemes from.
484
+ * @param parse MorphologicalParse type input.
485
+ * @return ArrayList type result which holds meta morphemes.
486
+ */
487
+ static getMetaMorphemeTag(tag: string, parse?: MorphologicalParse): Array<MorphologicalTag>{
488
+ let result = new Array<MorphologicalTag>();
489
+ let s = tag.charAt(0);
490
+ if (Word.isPunctuation(s)) {
491
+ tag = tag.substring(1);
492
+ }
493
+ for (let j = 0; j < this.metaMorphemes.length; j++) {
494
+ if (tag.toLowerCase() == this.metaMorphemes[j].toLowerCase()) {
495
+ if (parse != undefined){
496
+ if (parse.containsTag(this.morphotacticTags[j])){
497
+ result.push(this.morphotacticTags[j]);
498
+ }
499
+ } else {
500
+ result.push(this.morphotacticTags[j]);
501
+ }
502
+ }
503
+ }
504
+ return result;
505
+ }
506
+
507
+ /**
508
+ * The getter method for Private Word root.
509
+ *
510
+ * @return Word type root.
511
+ */
512
+ getWord(): Word{
513
+ return this.root
514
+ }
515
+
516
+ /**
517
+ * A constructor of {@link MetamorphicParse} class which creates an {@link ArrayList} metaMorphemeList which has split words
518
+ * according to +.
519
+ *
520
+ * @param parse String to parse.
521
+ */
522
+ constructor(parse: string) {
523
+ if (parse == "+") {
524
+ this.root = new Word("+");
525
+ } else {
526
+ let words = parse.split("\\+");
527
+ this.root = new Word(words[0]);
528
+ for (let i = 1; i < words.length; i++)
529
+ this.metaMorphemeList.push(words[i]);
530
+ }
531
+ }
532
+
533
+ /**
534
+ * The size method returns the size of the metaMorphemeList.
535
+ *
536
+ * @return the size of the metaMorphemeList.
537
+ */
538
+ size(): number{
539
+ return this.metaMorphemeList.length + 1
540
+ }
541
+
542
+ /**
543
+ * The addMetaMorphemeList method splits input String by + and add to the metaMorphemeList.
544
+ *
545
+ * @param newTacticSet String to add the metaMorphemeList.
546
+ */
547
+ addMetamorphemeList(newTacticSet: string){
548
+ let tactics = newTacticSet.split("\\+");
549
+ for (let tactic of tactics){
550
+ this.metaMorphemeList.push(tactic)
551
+ }
552
+ }
553
+
554
+ /**
555
+ * The removeMetaMorphemeFromIndex method removes the meta morpheme at given index from metaMorphemeList.
556
+ *
557
+ * @param index to remove from metaMorphemeList.
558
+ */
559
+ removeMetaMorphemeFromIndex(index: number){
560
+ this.metaMorphemeList.splice(index, this.metaMorphemeList.length - index)
561
+ }
562
+
563
+ /**
564
+ * The getMetaMorpheme method gets the meta morpheme at given index.
565
+ *
566
+ * @param index is used to get the meta morpheme.
567
+ * @return metaMorphemeList's corresponding meta morpheme.
568
+ */
569
+ getMetaMorpheme(index: number): string{
570
+ if (index == 0) {
571
+ return this.root.getName();
572
+ } else {
573
+ return this.metaMorphemeList[index - 1];
574
+ }
575
+ }
576
+
577
+ /**
578
+ * Overridden toString method to return resulting meta morphemes in metaMorphemeList.
579
+ *
580
+ * @return String result.
581
+ */
582
+ toString(): string{
583
+ let result = this.root.getName();
584
+ for (let metaMorpheme of this.metaMorphemeList) {
585
+ result = result + "+" + metaMorpheme;
586
+ }
587
+ return result;
588
+ }
589
+ }