apphx 2.0.0 → 2.1.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 (51) hide show
  1. package/README.md +11 -9
  2. package/dist/cli.js +41 -11
  3. package/dist/cli.js.map +1 -1
  4. package/dist/config.js +4 -2
  5. package/dist/config.js.map +1 -1
  6. package/dist/integrations.js +177 -91
  7. package/dist/integrations.js.map +1 -1
  8. package/dist/notify.js +267 -0
  9. package/dist/notify.js.map +1 -0
  10. package/dist/policy.js +3 -16
  11. package/dist/policy.js.map +1 -1
  12. package/dist/runner.js +119 -20
  13. package/dist/runner.js.map +1 -1
  14. package/dist/schemas.js +57 -2
  15. package/dist/schemas.js.map +1 -1
  16. package/dist/vendor/obfuscator/dist/config.js +119 -6
  17. package/dist/vendor/obfuscator/dist/config.js.map +1 -1
  18. package/dist/vendor/obfuscator/dist/dfa.js +528 -0
  19. package/dist/vendor/obfuscator/dist/dfa.js.map +1 -0
  20. package/dist/vendor/obfuscator/dist/flutter.js +3266 -0
  21. package/dist/vendor/obfuscator/dist/flutter.js.map +1 -0
  22. package/dist/vendor/obfuscator/dist/image-utils.js +335 -0
  23. package/dist/vendor/obfuscator/dist/image-utils.js.map +1 -0
  24. package/dist/vendor/obfuscator/dist/junk.js +1501 -0
  25. package/dist/vendor/obfuscator/dist/junk.js.map +1 -0
  26. package/dist/vendor/obfuscator/dist/lexicon-data.js +972 -0
  27. package/dist/vendor/obfuscator/dist/lexicon-data.js.map +1 -0
  28. package/dist/vendor/obfuscator/dist/obfuscate.js +51 -2
  29. package/dist/vendor/obfuscator/dist/obfuscate.js.map +1 -1
  30. package/dist/vendor/obfuscator/dist/objc-symbols.js +1819 -0
  31. package/dist/vendor/obfuscator/dist/objc-symbols.js.map +1 -0
  32. package/dist/vendor/obfuscator/dist/project-identity.js +852 -0
  33. package/dist/vendor/obfuscator/dist/project-identity.js.map +1 -0
  34. package/dist/vendor/obfuscator/dist/string-encrypt.js +330 -0
  35. package/dist/vendor/obfuscator/dist/string-encrypt.js.map +1 -0
  36. package/examples/android-java.factory.json +40 -5
  37. package/examples/expo.factory.json +68 -5
  38. package/examples/flutter.factory.json +40 -4
  39. package/examples/luggage.json +1 -0
  40. package/examples/multi-role-agents.md +129 -0
  41. package/examples/mygo.factory.json +54 -4
  42. package/examples/queue-loop-demo.md +146 -0
  43. package/examples/react-native.factory.json +58 -5
  44. package/examples/roles.example.json +31 -0
  45. package/examples/swift.factory.json +60 -5
  46. package/examples/uni-app.factory.json +58 -5
  47. package/package.json +1 -1
  48. package/skills/apphx/SKILL.md +39 -4
  49. package/skills/apphx/resources/requirement.json +1 -0
  50. package/skills/apphx-obfuscator/LICENSE +21 -0
  51. package/skills/apphx-obfuscator/SKILL.md +72 -0
@@ -0,0 +1,3266 @@
1
+ import { deriveHash, deriveUuid, escapeRegExp, seededRandom, writeIfChanged } from "./common.js";
2
+ import { readFileSync, renameSync, writeFileSync } from "node:fs";
3
+ import { createHash } from "node:crypto";
4
+ // src/flutter.ts
5
+ const ALL_FEATURES = {
6
+ variable: true,
7
+ className: true,
8
+ method: true,
9
+ resourceName: true,
10
+ resourceHash: true,
11
+ deleteNotes: true,
12
+ uuid: true
13
+ };
14
+ function normalizeFlutterOptions(options = {}) {
15
+ return {
16
+ prefixWord: options.prefixWord ?? "",
17
+ missAlgorithmType: options.missAlgorithmType ?? 0,
18
+ classWhiteList: options.classWhiteList ?? [],
19
+ methodWhiteList: options.methodWhiteList ?? [],
20
+ variableWhiteList: options.variableWhiteList ?? [],
21
+ features: {
22
+ ...ALL_FEATURES,
23
+ ...options.features ?? {}
24
+ }
25
+ };
26
+ }
27
+ const FLUTTER_MUST_WHITE_CLASSES = ["MyApp"];
28
+ const FLUTTER_IGNORE_METHODS = [
29
+ "main",
30
+ "build",
31
+ "initState",
32
+ "dispose",
33
+ "didUpdateWidget",
34
+ "reassemble",
35
+ "setState",
36
+ "deactivate",
37
+ "activate",
38
+ "didChangeDependencies",
39
+ "debugFillProperties"
40
+ ];
41
+ const FLUTTER_IGNORE_VARIABLES = [
42
+ "value",
43
+ "size",
44
+ "width",
45
+ "height",
46
+ "length",
47
+ "r",
48
+ "msg",
49
+ "realUri",
50
+ "data",
51
+ "file",
52
+ "status",
53
+ "controller",
54
+ "key"
55
+ ];
56
+ const FLUTTER_CONSTANT_KEYWORDS = [
57
+ "static",
58
+ "const",
59
+ "final",
60
+ "var",
61
+ "late"
62
+ ];
63
+ const FLUTTER_BASIC_DATA_TYPES = [
64
+ "Number",
65
+ "int",
66
+ "double",
67
+ "num",
68
+ "String",
69
+ "Boolean",
70
+ "bool",
71
+ "List",
72
+ "Map",
73
+ "symbol",
74
+ "abs",
75
+ "ceil",
76
+ "floor",
77
+ "void"
78
+ ];
79
+ const FLUTTER_BASIC_CONTROL_TYPES = [
80
+ "Widget",
81
+ "MaterialApp",
82
+ "MaterialColor",
83
+ "MaterialButton",
84
+ "RawMaterialButton",
85
+ "MaterialPageRoute",
86
+ "MaterialAccentColor",
87
+ "MergeableMaterialItem",
88
+ "AppBar",
89
+ "BottomAppBar",
90
+ "BottomNavigationBarItem",
91
+ "SnackBar",
92
+ "ScrollbarPainter",
93
+ "FlexileSpaceBar",
94
+ "ButtonBar",
95
+ "SnackBarAction",
96
+ "TabBar",
97
+ "AlertDialog",
98
+ "Dialog",
99
+ "AboutDialog",
100
+ "SimpleDialog",
101
+ "Scaffold",
102
+ "ScaffoldState",
103
+ "ScrollView",
104
+ "Scrollable",
105
+ "SingleChildScrollView",
106
+ "ScrollNotfication",
107
+ "NotificationListener",
108
+ "ScrollbarPainter",
109
+ "ScrollMetrics",
110
+ "ScrollPhysics",
111
+ "BoxScrollView",
112
+ "CustomScrollView",
113
+ "NestedScrollView",
114
+ "GridTile",
115
+ "GridView",
116
+ "GridPaper",
117
+ "SliverGrid",
118
+ "GridTileBar",
119
+ "AnimatedList",
120
+ "ListView",
121
+ "ListBody",
122
+ "ExpansionPanelList",
123
+ "PageView",
124
+ "Align",
125
+ "Stack",
126
+ "IndexdStack",
127
+ "Row",
128
+ "Column",
129
+ "Container",
130
+ "Center",
131
+ "ConstrainedBox",
132
+ "OverflowBox",
133
+ "DecoratedBox",
134
+ "RendorDecoratedBox",
135
+ "FittedBox",
136
+ "LimitedBox",
137
+ "RotatedBox",
138
+ "SizedBox",
139
+ "SizeOverflowBox",
140
+ "UnconstrainedBox",
141
+ "Expanded",
142
+ "Padding",
143
+ "SliverPadding",
144
+ "AnimatedPadding",
145
+ "Table",
146
+ "Card",
147
+ "TextField",
148
+ "Checkbox",
149
+ "CheckboxListTile",
150
+ "FlatButton",
151
+ "RaisedButton",
152
+ "IconButton",
153
+ "PopupMenuButton",
154
+ "FloatingActionButton",
155
+ "RawMaterialButton",
156
+ "DropdownButton",
157
+ "OutlineButton",
158
+ "Text",
159
+ "RichText",
160
+ "Radio",
161
+ "RadioListTile",
162
+ "Slider",
163
+ "SliderTheme",
164
+ "SliderThemeData",
165
+ "Switch",
166
+ "SwitchListTile",
167
+ "AnimatedSwitcher",
168
+ "AssetImage",
169
+ "DecorationImage",
170
+ "ExactAssetImage",
171
+ "FadeInImage",
172
+ "FileImage",
173
+ "NetworkImage",
174
+ "RawImage",
175
+ "MemoryImage",
176
+ "ImageImageIcon",
177
+ "IconTheme",
178
+ "IconData",
179
+ "IconThemeData",
180
+ "Canvas",
181
+ "PainterSketch",
182
+ "PainterPath",
183
+ "CircleProgressBarPainter",
184
+ "BottomNavigationBarItem",
185
+ "BottomNavigationBar",
186
+ "Tab",
187
+ "CheckedPopupMenuItem",
188
+ "DropdownMenuItem",
189
+ "PopupMenuBottom",
190
+ "PopupMenuDivider",
191
+ "PopopMenuEntry",
192
+ "PopupMenuItem",
193
+ "DayPicker",
194
+ "MonthPicker",
195
+ "YearPicker",
196
+ "ShowdatePicker",
197
+ "CityPicker",
198
+ "Chip",
199
+ "ChipTheme",
200
+ "ChipThemeData",
201
+ "ChoiceChip",
202
+ "FilterChip",
203
+ "InputChip",
204
+ "RawChip",
205
+ "ClipOval",
206
+ "ClipRect",
207
+ "ClipRRect",
208
+ "ClipPath",
209
+ "CustomClipper",
210
+ "BorderRadius",
211
+ "CircularPercentIndicator",
212
+ "LinearProgressIndicator",
213
+ "NestedScrollViewRefreshIndicator",
214
+ "SwipeRefreshLayout",
215
+ "BoxDecoration",
216
+ "ShapeDecoration",
217
+ "InkDecoration",
218
+ "FlutterLogoDecoration",
219
+ "InputDecoration",
220
+ "TextDecoration",
221
+ "RoundedRectangleBorder",
222
+ "BoxShape",
223
+ "CircleBorder",
224
+ "CupertinoApp",
225
+ "CupertinoButton",
226
+ "CupertinoColors",
227
+ "CupertinoIcons",
228
+ "CupertinoNavigationBar",
229
+ "CupertinoPageRoute",
230
+ "CupertinoPageScaffold",
231
+ "CupertinoPicker",
232
+ "CupertinoPopupSurface",
233
+ "CupertinoScrollbar",
234
+ "CupertinoSlider",
235
+ "CupertinoSegmentedControl",
236
+ "CupertinoSliverNavigationBar",
237
+ "CupertinoSwitch",
238
+ "CupertinoTabBar",
239
+ "CupertinoTabScafold",
240
+ "CupertinoTabView",
241
+ "CupertinoTimerPicker",
242
+ "SliverAppBar",
243
+ "SliverFixedExtentList",
244
+ "SliverList",
245
+ "SliverGrid",
246
+ "SliverPersistentHeader",
247
+ "SliverFixedExtentList",
248
+ "SliverToBoxAdapter",
249
+ "Localizations",
250
+ "Semantics",
251
+ "Label",
252
+ "Positioned",
253
+ "Ink",
254
+ "InkWell",
255
+ "ViewController",
256
+ "Drawer",
257
+ "Divider",
258
+ "GestureDetector",
259
+ "FocusScope",
260
+ "WillPopScope",
261
+ "SafeArea",
262
+ "Transform"
263
+ ];
264
+ const MUST_WHITE_CLASS_SET = new Set(FLUTTER_MUST_WHITE_CLASSES);
265
+ const IGNORE_METHOD_SET = new Set(FLUTTER_IGNORE_METHODS);
266
+ const IGNORE_VARIABLE_SET = new Set(FLUTTER_IGNORE_VARIABLES);
267
+ const CONSTANT_KEYWORD_SET = new Set(FLUTTER_CONSTANT_KEYWORDS);
268
+ const BASIC_DATA_SET = new Set(FLUTTER_BASIC_DATA_TYPES);
269
+ const BASIC_CONTROL_SET = new Set(FLUTTER_BASIC_CONTROL_TYPES);
270
+ const PUNCTUATION_EXCEPT_UNDERSCORE = /* @__PURE__ */ new Set("!\"#$%&'()*+,-./:;<=>?@[\\]^`{|}~");
271
+ const UPPER_AND_LOWER = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
272
+ const LEXICON = [
273
+ "sideroblast",
274
+ "siderochrome",
275
+ "siderocyte",
276
+ "siderography",
277
+ "siderolite",
278
+ "siderophilin",
279
+ "sideroscope",
280
+ "siderosis",
281
+ "siderostat",
282
+ "sidesaddle",
283
+ "sideseat",
284
+ "sideshow",
285
+ "sideslip",
286
+ "sidesman",
287
+ "sidespin",
288
+ "sidesplitter",
289
+ "sidesplitting",
290
+ "sidestep",
291
+ "sidestream",
292
+ "sidestroke",
293
+ "sideswipe",
294
+ "sidetone",
295
+ "sidetrack",
296
+ "sidewalk",
297
+ "sideward",
298
+ "sidewards",
299
+ "sideway",
300
+ "sideways",
301
+ "sidewipe",
302
+ "sidewise",
303
+ "sidi",
304
+ "siding",
305
+ "sidle",
306
+ "sidon",
307
+ "sidonian",
308
+ "sidra",
309
+ "siege",
310
+ "siegfried",
311
+ "siena",
312
+ "sienese",
313
+ "sienna",
314
+ "sierozem",
315
+ "sierra",
316
+ "sierran",
317
+ "siesta",
318
+ "sieur",
319
+ "sieva",
320
+ "sieve",
321
+ "sievert",
322
+ "sifaka",
323
+ "siff",
324
+ "siffleur",
325
+ "siffleuse",
326
+ "sift",
327
+ "sifter",
328
+ "sig",
329
+ "sigh",
330
+ "sight",
331
+ "sighthole",
332
+ "sightless",
333
+ "sightline",
334
+ "sightly",
335
+ "sightproof",
336
+ "sightsee",
337
+ "sightseeing",
338
+ "sightseer",
339
+ "sightsinging",
340
+ "sightworthy",
341
+ "sigil",
342
+ "sigillographer",
343
+ "sigillography",
344
+ "sigillum",
345
+ "sigint",
346
+ "sigla",
347
+ "siglos",
348
+ "sigmate",
349
+ "sigmatropic",
350
+ "sigmoid",
351
+ "sigmoidectomy",
352
+ "sigmoiditis",
353
+ "sigmoidoscope",
354
+ "sigmoidostomy",
355
+ "sign",
356
+ "signable",
357
+ "signaler",
358
+ "signaling",
359
+ "signalise",
360
+ "signality",
361
+ "signalize",
362
+ "signalled",
363
+ "signally",
364
+ "signalman",
365
+ "signalment",
366
+ "signans",
367
+ "signary",
368
+ "signatary",
369
+ "signatory",
370
+ "signatum",
371
+ "signatureless",
372
+ "signboard",
373
+ "signed",
374
+ "signee",
375
+ "signet",
376
+ "signifiable",
377
+ "signifiant",
378
+ "significance",
379
+ "significancy",
380
+ "significans",
381
+ "significant",
382
+ "significantly",
383
+ "signification",
384
+ "significative",
385
+ "significatory",
386
+ "significs",
387
+ "signify",
388
+ "signior",
389
+ "signiory",
390
+ "signman",
391
+ "signor",
392
+ "signore",
393
+ "signori",
394
+ "signorina",
395
+ "signorine",
396
+ "signorini",
397
+ "signorino",
398
+ "signory",
399
+ "signpost",
400
+ "signwriter",
401
+ "sigri",
402
+ "sigrid",
403
+ "sigurd",
404
+ "sihanouk",
405
+ "sijo",
406
+ "sika",
407
+ "siker",
408
+ "sikh",
409
+ "sikkim",
410
+ "sikkimese",
411
+ "silage",
412
+ "silane",
413
+ "silanization",
414
+ "silanize",
415
+ "silas",
416
+ "silastic",
417
+ "silbador",
418
+ "silbo",
419
+ "sild",
420
+ "sile",
421
+ "silence",
422
+ "silencer",
423
+ "silent",
424
+ "silentious",
425
+ "silently",
426
+ "silenus",
427
+ "silesia",
428
+ "silex",
429
+ "silhouette",
430
+ "silica",
431
+ "silicate",
432
+ "siliceous",
433
+ "silicic",
434
+ "silicicolous",
435
+ "silicide",
436
+ "silicidize",
437
+ "silicification",
438
+ "silicify",
439
+ "silicious",
440
+ "silicium",
441
+ "silicize",
442
+ "silicle",
443
+ "silicomanganese",
444
+ "silicon",
445
+ "silicone",
446
+ "silicosis",
447
+ "silicothermic",
448
+ "silicula",
449
+ "silicular",
450
+ "silicule",
451
+ "siliqua",
452
+ "silique",
453
+ "silk",
454
+ "silkaline",
455
+ "silken",
456
+ "silkgrower",
457
+ "silkiness",
458
+ "silklike",
459
+ "silkman",
460
+ "silkoline",
461
+ "silkscreen",
462
+ "silkweed",
463
+ "silkworm",
464
+ "silky",
465
+ "sill",
466
+ "sillabub",
467
+ "sillar",
468
+ "siller",
469
+ "sillibub",
470
+ "sillily",
471
+ "sillimanite",
472
+ "silliness",
473
+ "sillographer",
474
+ "silly",
475
+ "silo",
476
+ "siloam",
477
+ "siloxane",
478
+ "silphid",
479
+ "silt",
480
+ "siltstone",
481
+ "silty",
482
+ "silundum",
483
+ "silures",
484
+ "silurid",
485
+ "siluroid",
486
+ "silva",
487
+ "silvan",
488
+ "silvana",
489
+ "silvanus",
490
+ "silver",
491
+ "silverback",
492
+ "silverbeater",
493
+ "silverberry",
494
+ "silverfish",
495
+ "silvering",
496
+ "silverless",
497
+ "silverly",
498
+ "silvern",
499
+ "silverpoint",
500
+ "silverside",
501
+ "silversides",
502
+ "silversmith",
503
+ "silvertail",
504
+ "silverware",
505
+ "silverweed",
506
+ "silvery",
507
+ "silvester",
508
+ "silvical",
509
+ "silvichemical",
510
+ "silvicide",
511
+ "silvicolous",
512
+ "silvics",
513
+ "silviculture",
514
+ "sima",
515
+ "simar",
516
+ "simazine",
517
+ "simba",
518
+ "simbirsk",
519
+ "simd",
520
+ "simferopol",
521
+ "simian",
522
+ "similar",
523
+ "similarity",
524
+ "similarly",
525
+ "simile",
526
+ "similitude",
527
+ "similize",
528
+ "simious",
529
+ "simitar",
530
+ "simla",
531
+ "simmer",
532
+ "simoleon",
533
+ "simoniac",
534
+ "simoniacal",
535
+ "simonist",
536
+ "simonize",
537
+ "simonstown",
538
+ "simony",
539
+ "simoom",
540
+ "simp",
541
+ "simpai",
542
+ "simpatico",
543
+ "simper",
544
+ "simperingly",
545
+ "simple",
546
+ "simplehearted",
547
+ "simpleminded",
548
+ "simpleness",
549
+ "simpleton",
550
+ "simplex",
551
+ "simplicidentate",
552
+ "simplicist",
553
+ "simpliciter",
554
+ "simplicity",
555
+ "simplification",
556
+ "simplify",
557
+ "simplism",
558
+ "simplist",
559
+ "simplistic",
560
+ "simply",
561
+ "simsim",
562
+ "simtel",
563
+ "simul",
564
+ "simulacra",
565
+ "simulacre",
566
+ "simulacrum",
567
+ "simuland",
568
+ "simulant",
569
+ "simular",
570
+ "simulate",
571
+ "simulation",
572
+ "simulative",
573
+ "simulator",
574
+ "simulcast",
575
+ "simulfix",
576
+ "simultaneity",
577
+ "simultaneous",
578
+ "simultaneously",
579
+ "sin",
580
+ "sina",
581
+ "sinaean",
582
+ "sinai",
583
+ "sinaic",
584
+ "sinaitic",
585
+ "sinal",
586
+ "sinanthropus",
587
+ "sinapin",
588
+ "sinapine",
589
+ "sinapism",
590
+ "sinarquist",
591
+ "sinbad",
592
+ "since",
593
+ "sincere",
594
+ "sincerely",
595
+ "sincerity",
596
+ "sincipital",
597
+ "sinciput",
598
+ "sinclair",
599
+ "sindolor",
600
+ "sindon",
601
+ "sindonology",
602
+ "sine",
603
+ "sinecure",
604
+ "sinecurist",
605
+ "sinew",
606
+ "sinewy",
607
+ "sinfonia",
608
+ "sinful",
609
+ "sinfully",
610
+ "sing",
611
+ "singapore",
612
+ "singaporean",
613
+ "singaradja",
614
+ "singe",
615
+ "singer",
616
+ "singhalese",
617
+ "singing",
618
+ "single",
619
+ "singlechip",
620
+ "singlehanded",
621
+ "singleness",
622
+ "singlestick",
623
+ "singlet",
624
+ "singleton",
625
+ "singletree",
626
+ "singly",
627
+ "singsong",
628
+ "singspiel",
629
+ "singular",
630
+ "singularism",
631
+ "singularity",
632
+ "singularize",
633
+ "singularly",
634
+ "singulative",
635
+ "singultation",
636
+ "singultus",
637
+ "sinhala",
638
+ "sinhalese",
639
+ "sinhalite",
640
+ "sinic",
641
+ "sinicism",
642
+ "sinicize",
643
+ "sinify",
644
+ "sining",
645
+ "sinister",
646
+ "sinisterly",
647
+ "sinistrad",
648
+ "sinistral",
649
+ "sinistrocular",
650
+ "sinistrorse",
651
+ "sinitic",
652
+ "sink",
653
+ "sinkable",
654
+ "sinkage",
655
+ "sinker",
656
+ "sinkful",
657
+ "sinkhole",
658
+ "sinkiang",
659
+ "sinking",
660
+ "sinless",
661
+ "sinlessly",
662
+ "sinneh",
663
+ "sinner",
664
+ "sinnerite",
665
+ "sinnet",
666
+ "sinoatrial",
667
+ "sinogram",
668
+ "sinography",
669
+ "sinoite",
670
+ "sinological",
671
+ "sinologist",
672
+ "sinologue",
673
+ "sinology",
674
+ "sinophile",
675
+ "sinophobia",
676
+ "sinopis",
677
+ "sinopite",
678
+ "sinople",
679
+ "sinpo",
680
+ "sins",
681
+ "sinsemilla",
682
+ "sinsyne",
683
+ "sinter",
684
+ "sintering",
685
+ "sintra",
686
+ "sinuate",
687
+ "sinuation",
688
+ "sinuatrial",
689
+ "sinuiju",
690
+ "sinuosity",
691
+ "sinuous",
692
+ "sinus",
693
+ "sinusitis",
694
+ "sinusoid",
695
+ "sinusoidal",
696
+ "siogon",
697
+ "sion",
698
+ "siouan",
699
+ "sioux",
700
+ "siphon",
701
+ "siphonaceous",
702
+ "siphonage",
703
+ "siphonal",
704
+ "siphonate",
705
+ "siphonein",
706
+ "siphonet",
707
+ "siphonic",
708
+ "siphonophore",
709
+ "siphonostele",
710
+ "siphunculate",
711
+ "siphunculated",
712
+ "sippet",
713
+ "sipunculan",
714
+ "siquis",
715
+ "sir",
716
+ "sirach",
717
+ "siracusa",
718
+ "siratro",
719
+ "sircar",
720
+ "sirdar",
721
+ "sire",
722
+ "siree",
723
+ "siren",
724
+ "sirena",
725
+ "sirenian",
726
+ "siret",
727
+ "sirgang",
728
+ "sirian",
729
+ "siriasis",
730
+ "sirius",
731
+ "sirloin",
732
+ "sirocco",
733
+ "sirrah",
734
+ "sirree",
735
+ "sirtaki",
736
+ "sirup",
737
+ "sirupy",
738
+ "sirvente",
739
+ "sirventes",
740
+ "sis",
741
+ "sisal",
742
+ "siscowet",
743
+ "sisera",
744
+ "siskin",
745
+ "sismogram",
746
+ "sismograph",
747
+ "sismographic",
748
+ "sissified",
749
+ "sissy",
750
+ "sistan",
751
+ "sister",
752
+ "sisterhood",
753
+ "sisterless",
754
+ "sisterly",
755
+ "sistern",
756
+ "sistership",
757
+ "sistine",
758
+ "sistroid",
759
+ "sistrum",
760
+ "sisyphean",
761
+ "sisyphus",
762
+ "sit",
763
+ "sitar",
764
+ "sitcom",
765
+ "site",
766
+ "sitebuilder",
767
+ "sitfast",
768
+ "sith",
769
+ "sitology",
770
+ "sitomania",
771
+ "sitophobia",
772
+ "sitosterol",
773
+ "sitotoxin",
774
+ "sitrep",
775
+ "sitsang",
776
+ "sittable",
777
+ "sittang",
778
+ "sitten",
779
+ "sitter",
780
+ "sitting",
781
+ "sittoung",
782
+ "sittwe",
783
+ "situate",
784
+ "situated",
785
+ "situation",
786
+ "situla",
787
+ "situp",
788
+ "situs",
789
+ "sitzkrieg",
790
+ "sitzkrleg",
791
+ "sitzmark",
792
+ "siu",
793
+ "siva",
794
+ "sivaite",
795
+ "sivan",
796
+ "siwan",
797
+ "six",
798
+ "sixain",
799
+ "sixer",
800
+ "sixern",
801
+ "sixfold",
802
+ "sixpence",
803
+ "sixpenny",
804
+ "sixpennyworth",
805
+ "sixscore",
806
+ "sixte",
807
+ "sixteen",
808
+ "sixteenmo",
809
+ "sixteenth",
810
+ "sixteenthly",
811
+ "sixth",
812
+ "sixthly",
813
+ "sixtieth",
814
+ "sixtine",
815
+ "sixty",
816
+ "sixtyfold",
817
+ "sizable",
818
+ "sizar",
819
+ "size",
820
+ "sizeable",
821
+ "sized",
822
+ "sizer",
823
+ "sizing",
824
+ "sizy",
825
+ "sizz",
826
+ "sizzard",
827
+ "sizzle",
828
+ "sizzler",
829
+ "sjaa",
830
+ "sjab",
831
+ "sjaelland",
832
+ "sjambok",
833
+ "sjc",
834
+ "sjd",
835
+ "skagerrak",
836
+ "skald",
837
+ "skandalon",
838
+ "skat",
839
+ "skate",
840
+ "skatebarrow",
841
+ "skateboard",
842
+ "skatemobile",
843
+ "skatepark",
844
+ "skater",
845
+ "skating",
846
+ "skatol",
847
+ "skatole",
848
+ "skean",
849
+ "sked",
850
+ "skedaddle",
851
+ "skee",
852
+ "skeeler",
853
+ "skeesicks",
854
+ "skeet",
855
+ "skeeter",
856
+ "skeetshoot",
857
+ "skegger",
858
+ "skein",
859
+ "skelecton",
860
+ "skeletal",
861
+ "skeletogenous",
862
+ "skeleton",
863
+ "skeletonize",
864
+ "skeletonless",
865
+ "skeletony",
866
+ "skellum",
867
+ "skelp",
868
+ "skelter",
869
+ "skeltonics",
870
+ "sken",
871
+ "skene",
872
+ "skep",
873
+ "skepsis",
874
+ "skeptic",
875
+ "skeptical",
876
+ "skeptically",
877
+ "skepticism",
878
+ "skepticize",
879
+ "skerrick",
880
+ "skerry",
881
+ "sket",
882
+ "sketch",
883
+ "sketchbook",
884
+ "sketchily",
885
+ "sketchpad",
886
+ "sketchy",
887
+ "skete",
888
+ "skew",
889
+ "skewback",
890
+ "skewbald",
891
+ "skewer",
892
+ "skewwhiff",
893
+ "skfros",
894
+ "ski",
895
+ "skiagram",
896
+ "skiagraph",
897
+ "skiagraphy",
898
+ "skiamachy",
899
+ "skiametry",
900
+ "skiascope",
901
+ "skiascopy",
902
+ "skibby",
903
+ "skibob",
904
+ "skibobber",
905
+ "skibobbing",
906
+ "skice",
907
+ "skid",
908
+ "skidder",
909
+ "skiddoo",
910
+ "skiddy",
911
+ "skidoo",
912
+ "skidproof",
913
+ "skier",
914
+ "skiey",
915
+ "skiff",
916
+ "skiffle",
917
+ "skiing",
918
+ "skijoring",
919
+ "skikda",
920
+ "skilful",
921
+ "skill",
922
+ "skilled",
923
+ "skillet",
924
+ "skillful",
925
+ "skillfully",
926
+ "skillion",
927
+ "skilly",
928
+ "skim",
929
+ "skimboard",
930
+ "skimeister",
931
+ "skimmer",
932
+ "skimming",
933
+ "skimo",
934
+ "skimobile",
935
+ "skimp",
936
+ "skimpily",
937
+ "skimpy",
938
+ "skin",
939
+ "skinbound",
940
+ "skinch",
941
+ "skinflint",
942
+ "skinfold",
943
+ "skinful",
944
+ "skinhead",
945
+ "skink",
946
+ "skinner",
947
+ "skinnerian",
948
+ "skinniness",
949
+ "skinny",
950
+ "skinpopping",
951
+ "skint",
952
+ "skintight",
953
+ "skiogram",
954
+ "skiograph",
955
+ "skip",
956
+ "skipjack",
957
+ "skiplane",
958
+ "skippable",
959
+ "skipper",
960
+ "skippet",
961
+ "skippingly",
962
+ "skippy",
963
+ "skirl",
964
+ "skirmish",
965
+ "skirmisher",
966
+ "skirr",
967
+ "skirret",
968
+ "skirt",
969
+ "skirting",
970
+ "skiscooter",
971
+ "skish",
972
+ "skit",
973
+ "skite",
974
+ "skitter",
975
+ "skittish",
976
+ "skittle",
977
+ "skive",
978
+ "skiver",
979
+ "skivey",
980
+ "skivvy",
981
+ "skiwear",
982
+ "sklodowskite",
983
+ "skoal",
984
+ "skokiaan",
985
+ "skolly",
986
+ "skoob",
987
+ "skookum",
988
+ "skopje",
989
+ "skoplje",
990
+ "skosh",
991
+ "skotophile",
992
+ "skua",
993
+ "skulduggery",
994
+ "skulk",
995
+ "skulker",
996
+ "skull",
997
+ "skullcap",
998
+ "skullduggery",
999
+ "skullfish",
1000
+ "skullguard",
1001
+ "skunk",
1002
+ "skunkery",
1003
+ "skupshtina",
1004
+ "skurfing",
1005
+ "skutari",
1006
+ "skutterudite",
1007
+ "sky",
1008
+ "skyborne",
1009
+ "skybridge",
1010
+ "skycap",
1011
+ "skycoach",
1012
+ "skydive",
1013
+ "skyer",
1014
+ "skyey",
1015
+ "skyful",
1016
+ "skyish",
1017
+ "skyjack",
1018
+ "skyjacking",
1019
+ "skylab",
1020
+ "skylark",
1021
+ "skylarker",
1022
+ "skylarking",
1023
+ "skyless",
1024
+ "skylight",
1025
+ "skyline",
1026
+ "skylit",
1027
+ "skylon",
1028
+ "skylounge",
1029
+ "skymark",
1030
+ "skymotel",
1031
+ "skyphone",
1032
+ "skyphos",
1033
+ "skyport",
1034
+ "skyrocket",
1035
+ "skysail",
1036
+ "skyscape",
1037
+ "skyscrape",
1038
+ "skyscraper",
1039
+ "skyscraping",
1040
+ "skysweeper",
1041
+ "skytrooper",
1042
+ "skytroops",
1043
+ "skywalk",
1044
+ "skyward",
1045
+ "skywards",
1046
+ "skywatch",
1047
+ "skyway",
1048
+ "skywriting",
1049
+ "sla",
1050
+ "slab",
1051
+ "slabber",
1052
+ "slabby",
1053
+ "slablike",
1054
+ "slabstone",
1055
+ "slack",
1056
+ "slackage",
1057
+ "slacken",
1058
+ "slacker",
1059
+ "sladang",
1060
+ "slade",
1061
+ "slag",
1062
+ "slagging",
1063
+ "slaggy",
1064
+ "slagheap",
1065
+ "slain",
1066
+ "slaister",
1067
+ "slake",
1068
+ "slakeless",
1069
+ "slaky",
1070
+ "slalom",
1071
+ "slam",
1072
+ "slammer",
1073
+ "slan",
1074
+ "slanchways",
1075
+ "slanchwise",
1076
+ "slander",
1077
+ "slanderella",
1078
+ "slanderer",
1079
+ "slanderous",
1080
+ "slanderously",
1081
+ "slang",
1082
+ "slangster",
1083
+ "slanguage",
1084
+ "slangy",
1085
+ "slank",
1086
+ "slant",
1087
+ "slantendicular",
1088
+ "slantindicular",
1089
+ "slantingways",
1090
+ "slantingwise",
1091
+ "slantways",
1092
+ "slantwise",
1093
+ "slap",
1094
+ "slapdab",
1095
+ "slapdash",
1096
+ "slapdashery",
1097
+ "slaphappy",
1098
+ "slapjack",
1099
+ "slapman",
1100
+ "slapping",
1101
+ "slapstick",
1102
+ "slash",
1103
+ "slashing",
1104
+ "slat",
1105
+ "slatch",
1106
+ "slate",
1107
+ "slater",
1108
+ "slather",
1109
+ "slating",
1110
+ "slatted",
1111
+ "slatter",
1112
+ "slattern",
1113
+ "slatternly",
1114
+ "slaty",
1115
+ "slaughter",
1116
+ "slaughterhouse",
1117
+ "slaughterous",
1118
+ "slav",
1119
+ "slavdom",
1120
+ "slave",
1121
+ "slaveholder",
1122
+ "slaveholding",
1123
+ "slaveocracy",
1124
+ "slaver",
1125
+ "slavery",
1126
+ "slavey",
1127
+ "slavic",
1128
+ "slavicist",
1129
+ "slavicize",
1130
+ "slavikite",
1131
+ "slavish",
1132
+ "slavishly",
1133
+ "slavism",
1134
+ "slavist",
1135
+ "slavocracy",
1136
+ "slavonia",
1137
+ "slavonian",
1138
+ "slavonic",
1139
+ "slavonize",
1140
+ "slavophil",
1141
+ "slavophile",
1142
+ "slavophobe",
1143
+ "slavophobist",
1144
+ "slaw",
1145
+ "slay",
1146
+ "sldram",
1147
+ "sleave",
1148
+ "sleazy",
1149
+ "sled",
1150
+ "sledding",
1151
+ "sledge",
1152
+ "sledgehammer",
1153
+ "sledgemeter",
1154
+ "sleek",
1155
+ "sleekly",
1156
+ "sleep",
1157
+ "sleepcoat",
1158
+ "sleeper",
1159
+ "sleepful",
1160
+ "sleepily",
1161
+ "sleepiness",
1162
+ "sleeping",
1163
+ "sleepless",
1164
+ "sleepwalker",
1165
+ "sleepwalking",
1166
+ "sleepwear",
1167
+ "sleepy",
1168
+ "sleepyhead",
1169
+ "sleet",
1170
+ "sleety",
1171
+ "sleeve",
1172
+ "sleeveboard",
1173
+ "sleeveen",
1174
+ "sleeveless",
1175
+ "sleevelet",
1176
+ "sleigh",
1177
+ "sleighing",
1178
+ "sleight",
1179
+ "slender",
1180
+ "slenderize",
1181
+ "slenderly",
1182
+ "slentando",
1183
+ "slept",
1184
+ "sleugh",
1185
+ "sleuth",
1186
+ "sleuthhound",
1187
+ "slew",
1188
+ "sley",
1189
+ "slezsko",
1190
+ "slic",
1191
+ "slice",
1192
+ "sliceable",
1193
+ "slicer",
1194
+ "slick",
1195
+ "slicken",
1196
+ "slickenside",
1197
+ "slicker",
1198
+ "slickness",
1199
+ "slickrock",
1200
+ "slickster",
1201
+ "slid",
1202
+ "slidden",
1203
+ "slide",
1204
+ "slideway",
1205
+ "sliding",
1206
+ "slight",
1207
+ "slighting",
1208
+ "slightingly",
1209
+ "slightly",
1210
+ "slightness",
1211
+ "slily",
1212
+ "slim",
1213
+ "slime",
1214
+ "slimicide",
1215
+ "sliminess",
1216
+ "slimline",
1217
+ "slimly",
1218
+ "slimmer",
1219
+ "slimming",
1220
+ "slimmish",
1221
+ "slimnastics",
1222
+ "slimsy",
1223
+ "slimy",
1224
+ "sling",
1225
+ "slingback",
1226
+ "slinger",
1227
+ "slingman",
1228
+ "slingshop",
1229
+ "slingshot",
1230
+ "slink",
1231
+ "slinkingly",
1232
+ "slinkskin",
1233
+ "slinkweed",
1234
+ "slinky",
1235
+ "slip",
1236
+ "slipcase",
1237
+ "slipcover",
1238
+ "slipform",
1239
+ "sliphorn",
1240
+ "slipknot",
1241
+ "slipover",
1242
+ "slippage",
1243
+ "slipper",
1244
+ "slipperwort",
1245
+ "slippery",
1246
+ "slippy",
1247
+ "sliprail",
1248
+ "slipsheet",
1249
+ "slipshod",
1250
+ "slipslop",
1251
+ "slipsole",
1252
+ "slipstick",
1253
+ "slipstone",
1254
+ "slipstream",
1255
+ "slipt",
1256
+ "slipup",
1257
+ "slipware",
1258
+ "slipway",
1259
+ "slit",
1260
+ "slither",
1261
+ "slithery",
1262
+ "sliver",
1263
+ "slivovitz",
1264
+ "sloak",
1265
+ "sloat",
1266
+ "slob",
1267
+ "slobber",
1268
+ "slobbery",
1269
+ "sloe",
1270
+ "slog",
1271
+ "slogan",
1272
+ "sloganeer",
1273
+ "slogger",
1274
+ "slogging",
1275
+ "sloid",
1276
+ "slojd",
1277
+ "sloop",
1278
+ "sloot",
1279
+ "slop",
1280
+ "slope",
1281
+ "slopehead",
1282
+ "slopewash",
1283
+ "sloping",
1284
+ "sloppy",
1285
+ "slopseller",
1286
+ "slopshop",
1287
+ "slopwork",
1288
+ "slopy",
1289
+ "slosh",
1290
+ "sloshy",
1291
+ "slotback",
1292
+ "slote",
1293
+ "sloth",
1294
+ "slothful",
1295
+ "slothfully",
1296
+ "slothfulness",
1297
+ "slotware",
1298
+ "slouch",
1299
+ "slouching",
1300
+ "slouchy",
1301
+ "slough",
1302
+ "sloughy",
1303
+ "slovak",
1304
+ "slovakian",
1305
+ "sloven",
1306
+ "slovene",
1307
+ "slovenia",
1308
+ "slovenian",
1309
+ "slovenly",
1310
+ "slovenry",
1311
+ "slovensko",
1312
+ "slow",
1313
+ "slowdown",
1314
+ "slower",
1315
+ "slowgoing",
1316
+ "slowhound",
1317
+ "slowish",
1318
+ "slowly",
1319
+ "slowness",
1320
+ "slowpaced",
1321
+ "slowpoke",
1322
+ "slowup",
1323
+ "slowworm",
1324
+ "sloyd",
1325
+ "slp",
1326
+ "slub",
1327
+ "slubber",
1328
+ "slubberdegullion",
1329
+ "slubbing",
1330
+ "sludge",
1331
+ "sludgeworm",
1332
+ "sludgy",
1333
+ "slue",
1334
+ "slug",
1335
+ "slugabed",
1336
+ "slugfest",
1337
+ "sluggard",
1338
+ "sluggardly",
1339
+ "slugger",
1340
+ "slugging",
1341
+ "sluggish",
1342
+ "sluice",
1343
+ "sluiceway",
1344
+ "sluit",
1345
+ "slum",
1346
+ "slumber",
1347
+ "slumbercoach",
1348
+ "slumberland",
1349
+ "slumberous",
1350
+ "slumbery",
1351
+ "slumbrous",
1352
+ "slumdweller",
1353
+ "slumgum",
1354
+ "slumland",
1355
+ "slumlord",
1356
+ "slummer",
1357
+ "slummock",
1358
+ "slummy",
1359
+ "slump",
1360
+ "slung",
1361
+ "slungshot",
1362
+ "slunk",
1363
+ "slup",
1364
+ "slur",
1365
+ "slurp",
1366
+ "slurry",
1367
+ "slurvian",
1368
+ "slush",
1369
+ "slushy",
1370
+ "slut",
1371
+ "sluttery",
1372
+ "sluttish",
1373
+ "slv",
1374
+ "sly",
1375
+ "slyboots",
1376
+ "slyly",
1377
+ "slype",
1378
+ "smack",
1379
+ "smacker",
1380
+ "smackeroo",
1381
+ "smackhead",
1382
+ "smacking",
1383
+ "smacksman",
1384
+ "small",
1385
+ "smallage",
1386
+ "smallboy",
1387
+ "smallclothes",
1388
+ "smallholder",
1389
+ "smallholding",
1390
+ "smallish",
1391
+ "smallmouth",
1392
+ "smallness",
1393
+ "smallpox",
1394
+ "smallshot",
1395
+ "smallsword",
1396
+ "smallwares",
1397
+ "smally",
1398
+ "smalt",
1399
+ "smalti",
1400
+ "smaltine",
1401
+ "smaltite",
1402
+ "smalto",
1403
+ "smaragd",
1404
+ "smaragdine",
1405
+ "smaragdite",
1406
+ "smarm",
1407
+ "smarmy",
1408
+ "smartdrive",
1409
+ "smarten",
1410
+ "smartless",
1411
+ "smartly",
1412
+ "smartness",
1413
+ "smartweed",
1414
+ "smarty",
1415
+ "smash",
1416
+ "smashed",
1417
+ "smasher",
1418
+ "smasheroo",
1419
+ "smashing",
1420
+ "smashup",
1421
+ "smatter",
1422
+ "smattering",
1423
+ "smattery",
1424
+ "smaze",
1425
+ "smb",
1426
+ "smd",
1427
+ "smds",
1428
+ "smear",
1429
+ "smearcase",
1430
+ "smeary",
1431
+ "smeech",
1432
+ "smegma",
1433
+ "smell",
1434
+ "smellage",
1435
+ "smeller",
1436
+ "smellie",
1437
+ "smelly",
1438
+ "smelt",
1439
+ "smelter",
1440
+ "smeltery",
1441
+ "smelting",
1442
+ "smerrebrxd",
1443
+ "smew",
1444
+ "smf",
1445
+ "smg",
1446
+ "smice",
1447
+ "smidgen",
1448
+ "smidgeon",
1449
+ "smiercase",
1450
+ "smilacaceous",
1451
+ "smile",
1452
+ "smileless",
1453
+ "smiley",
1454
+ "smiling",
1455
+ "smilingly",
1456
+ "smilodon",
1457
+ "smirch",
1458
+ "smirk",
1459
+ "smirky",
1460
+ "smirnoff",
1461
+ "smitch",
1462
+ "smite",
1463
+ "smith",
1464
+ "smithcraft",
1465
+ "smithereen",
1466
+ "smithereens",
1467
+ "smithery",
1468
+ "smithiantha",
1469
+ "smithite",
1470
+ "smithsonite",
1471
+ "smithwork",
1472
+ "smithy",
1473
+ "smitten",
1474
+ "smitty",
1475
+ "smock",
1476
+ "smocking",
1477
+ "smog",
1478
+ "smogbound",
1479
+ "smoggy",
1480
+ "smogout",
1481
+ "smokable",
1482
+ "smokables",
1483
+ "smoke",
1484
+ "smokeable",
1485
+ "smokebell",
1486
+ "smokebox",
1487
+ "smokechaser",
1488
+ "smokehouse",
1489
+ "smokeless",
1490
+ "smokemeter",
1491
+ "smokepot",
1492
+ "smokeproof",
1493
+ "smokery",
1494
+ "smokestack",
1495
+ "smoketight",
1496
+ "smokey",
1497
+ "smokily",
1498
+ "smoking",
1499
+ "smoko",
1500
+ "smoky",
1501
+ "smolder",
1502
+ "smolensk",
1503
+ "smolt",
1504
+ "smon",
1505
+ "smooch",
1506
+ "smoodge",
1507
+ "smooth",
1508
+ "smoothbore",
1509
+ "smoothen",
1510
+ "smoother",
1511
+ "smoothhound",
1512
+ "smoothie",
1513
+ "smoothly",
1514
+ "smoothness",
1515
+ "smoothy",
1516
+ "smorgasbord",
1517
+ "smorzando",
1518
+ "smote",
1519
+ "smother",
1520
+ "smotheration",
1521
+ "smothery",
1522
+ "smouch",
1523
+ "smoulder",
1524
+ "smriti",
1525
+ "smsa",
1526
+ "smtpd",
1527
+ "smudge",
1528
+ "smudgily",
1529
+ "smudginess",
1530
+ "smudgy",
1531
+ "smug",
1532
+ "smuggle",
1533
+ "smuggler",
1534
+ "smuggling",
1535
+ "smugness",
1536
+ "smut",
1537
+ "smutch",
1538
+ "smuttily",
1539
+ "smuttiness",
1540
+ "smutty",
1541
+ "smyrna",
1542
+ "smyrniot",
1543
+ "smythite",
1544
+ "snack",
1545
+ "snackery",
1546
+ "snacketeria",
1547
+ "snackette",
1548
+ "snaffle",
1549
+ "snafu",
1550
+ "snag",
1551
+ "snagged",
1552
+ "snaggletooth",
1553
+ "snaggletoothed",
1554
+ "snaggy",
1555
+ "snail",
1556
+ "snailery",
1557
+ "snailfish",
1558
+ "snaillike",
1559
+ "snake",
1560
+ "snakebird",
1561
+ "snakebite",
1562
+ "snakefly",
1563
+ "snakehead",
1564
+ "snakeless",
1565
+ "snakelet",
1566
+ "snakelike",
1567
+ "snakemouth",
1568
+ "snakeroot",
1569
+ "snakeskin",
1570
+ "snakestone",
1571
+ "snakewood",
1572
+ "snakey",
1573
+ "snakish",
1574
+ "snaky",
1575
+ "snallygaster",
1576
+ "snap",
1577
+ "snapback",
1578
+ "snapbolt",
1579
+ "snapdragon",
1580
+ "snaphance",
1581
+ "snaphaunce",
1582
+ "snapper",
1583
+ "snappish",
1584
+ "snappy",
1585
+ "snapshoot",
1586
+ "snare",
1587
+ "snark",
1588
+ "snarl",
1589
+ "snarler",
1590
+ "snarlingly",
1591
+ "snarly",
1592
+ "snash",
1593
+ "snatch",
1594
+ "snatchback",
1595
+ "snatchy",
1596
+ "snath",
1597
+ "snathe",
1598
+ "snax",
1599
+ "snazzy",
1600
+ "sncc",
1601
+ "sncf",
1602
+ "snead",
1603
+ "sneak",
1604
+ "sneaker",
1605
+ "sneaking",
1606
+ "sneakingly",
1607
+ "sneaksby",
1608
+ "sneaky",
1609
+ "sned",
1610
+ "sneer",
1611
+ "sneering",
1612
+ "sneeringly",
1613
+ "sneery",
1614
+ "sneesh",
1615
+ "sneeshing",
1616
+ "sneeze",
1617
+ "sneezes",
1618
+ "sneezy",
1619
+ "snell",
1620
+ "snelskrif",
1621
+ "snib",
1622
+ "snick",
1623
+ "snicker",
1624
+ "snickersnee",
1625
+ "snicket",
1626
+ "snide",
1627
+ "snidesman",
1628
+ "sniff",
1629
+ "sniffable",
1630
+ "sniffer",
1631
+ "sniffish",
1632
+ "sniffle",
1633
+ "sniffy",
1634
+ "snift",
1635
+ "snifter",
1636
+ "snifty",
1637
+ "snig",
1638
+ "sniggle",
1639
+ "snip",
1640
+ "snipe",
1641
+ "snipehunt",
1642
+ "snipehunter",
1643
+ "sniper",
1644
+ "sniperscope",
1645
+ "snipey",
1646
+ "snippers",
1647
+ "snippersnapper",
1648
+ "snippet",
1649
+ "snippety",
1650
+ "snipping",
1651
+ "snippy",
1652
+ "snit",
1653
+ "snitch",
1654
+ "snivel",
1655
+ "sniveler",
1656
+ "sniveller",
1657
+ "snmp",
1658
+ "snob",
1659
+ "snobbery",
1660
+ "snobbish",
1661
+ "snobbishness",
1662
+ "snobbism",
1663
+ "snobby",
1664
+ "snobism",
1665
+ "snobling",
1666
+ "snobol",
1667
+ "snockered",
1668
+ "snoek",
1669
+ "snofari",
1670
+ "snog",
1671
+ "snollygoster",
1672
+ "snood",
1673
+ "snook",
1674
+ "snooker",
1675
+ "snoop",
1676
+ "snooper",
1677
+ "snooperscope",
1678
+ "snoopery",
1679
+ "snoopy",
1680
+ "snoot",
1681
+ "snootful",
1682
+ "snooty",
1683
+ "snooze",
1684
+ "snopes",
1685
+ "snopesian",
1686
+ "snore",
1687
+ "snorer",
1688
+ "snort",
1689
+ "snorter",
1690
+ "snorty",
1691
+ "snot",
1692
+ "snotnose",
1693
+ "snotty",
1694
+ "snottynose",
1695
+ "snout",
1696
+ "snovian",
1697
+ "snow",
1698
+ "snowball",
1699
+ "snowbank",
1700
+ "snowbell",
1701
+ "snowberry",
1702
+ "snowbird",
1703
+ "snowblink",
1704
+ "snowbound",
1705
+ "snowbreak",
1706
+ "snowbrush",
1707
+ "snowbush",
1708
+ "snowcap",
1709
+ "snowcapped",
1710
+ "snowcat",
1711
+ "snowcem",
1712
+ "snowcraft",
1713
+ "snowcreep",
1714
+ "snowdon",
1715
+ "snowdrift",
1716
+ "snowdrop",
1717
+ "snowfall",
1718
+ "snowfield",
1719
+ "snowflake",
1720
+ "snowhole",
1721
+ "snowhouse",
1722
+ "snowmaking",
1723
+ "snowman",
1724
+ "snowmelt",
1725
+ "snowmobile",
1726
+ "snowmobilist",
1727
+ "snowpack",
1728
+ "snowplow",
1729
+ "snowscape",
1730
+ "snowshed",
1731
+ "snowshoe",
1732
+ "snowslide",
1733
+ "snowslip",
1734
+ "snowstorm",
1735
+ "snowsuit",
1736
+ "snowswept",
1737
+ "snowwhite",
1738
+ "snowy",
1739
+ "snr",
1740
+ "snub",
1741
+ "snubber",
1742
+ "snubbingly",
1743
+ "snubby",
1744
+ "snuck",
1745
+ "snuff",
1746
+ "snuffbox",
1747
+ "snuffcolored",
1748
+ "snuffcoloured",
1749
+ "snuffer",
1750
+ "snuffers",
1751
+ "snuffle",
1752
+ "snuffless",
1753
+ "snuffling",
1754
+ "snuffy",
1755
+ "snug",
1756
+ "snuggery",
1757
+ "snuggies",
1758
+ "snuggish",
1759
+ "snuggle",
1760
+ "snugly",
1761
+ "snurfing",
1762
+ "snuzzle",
1763
+ "snye",
1764
+ "soak",
1765
+ "soakage",
1766
+ "soaked",
1767
+ "soaker",
1768
+ "soapbark",
1769
+ "soapberry",
1770
+ "soapbox",
1771
+ "soapboxer",
1772
+ "soaper",
1773
+ "soapery",
1774
+ "soapie",
1775
+ "soapmaking",
1776
+ "soapolallie",
1777
+ "soaprock",
1778
+ "soapstone",
1779
+ "soapsuds",
1780
+ "soapwort",
1781
+ "soapy",
1782
+ "soar",
1783
+ "soarable",
1784
+ "soaraway",
1785
+ "soaring",
1786
+ "soave",
1787
+ "soavemente",
1788
+ "sob",
1789
+ "sobbing",
1790
+ "sobby",
1791
+ "sobeit",
1792
+ "sober",
1793
+ "soberano",
1794
+ "sobering",
1795
+ "soberize",
1796
+ "soberly",
1797
+ "soberminded",
1798
+ "sobersides",
1799
+ "sobranje",
1800
+ "sobriety",
1801
+ "sobriquet",
1802
+ "socage",
1803
+ "soccage",
1804
+ "soccer",
1805
+ "sochi",
1806
+ "sociability",
1807
+ "sociable",
1808
+ "sociably",
1809
+ "social",
1810
+ "socialise",
1811
+ "socialism",
1812
+ "socialist",
1813
+ "socialistic",
1814
+ "socialistically",
1815
+ "socialite",
1816
+ "sociality",
1817
+ "socialization",
1818
+ "socialize",
1819
+ "socializee",
1820
+ "socially",
1821
+ "societal",
1822
+ "society",
1823
+ "socinian",
1824
+ "socinianism",
1825
+ "sociobiology",
1826
+ "sociocentric",
1827
+ "sociocentrism",
1828
+ "sociocracy",
1829
+ "sociocultural",
1830
+ "socioecology",
1831
+ "socioeconomic",
1832
+ "sociogenetic",
1833
+ "sociogenic",
1834
+ "sociogenous",
1835
+ "sociogeny",
1836
+ "sociogram",
1837
+ "sociogroup",
1838
+ "sociolect",
1839
+ "sociolinguistics",
1840
+ "sociologese",
1841
+ "sociological",
1842
+ "sociologically",
1843
+ "sociologise",
1844
+ "sociologism",
1845
+ "sociologist",
1846
+ "sociologize",
1847
+ "sociology",
1848
+ "sociometry",
1849
+ "sociopath",
1850
+ "sociopathic",
1851
+ "sociopolitical",
1852
+ "socioreligious",
1853
+ "sociosexual",
1854
+ "sociotechnological",
1855
+ "socius",
1856
+ "sock",
1857
+ "sockdolager",
1858
+ "socker",
1859
+ "sockeroo",
1860
+ "socket",
1861
+ "sockeye",
1862
+ "socko",
1863
+ "socle",
1864
+ "socman",
1865
+ "socotra",
1866
+ "socratic",
1867
+ "socratism",
1868
+ "socred",
1869
+ "sod",
1870
+ "soda",
1871
+ "sodalist",
1872
+ "sodalite",
1873
+ "sodality",
1874
+ "sodamide",
1875
+ "sodar",
1876
+ "sodden",
1877
+ "soddish",
1878
+ "soddy",
1879
+ "sodic",
1880
+ "sodium",
1881
+ "sodom",
1882
+ "sodomist",
1883
+ "sodomite",
1884
+ "sodomize",
1885
+ "sodomy",
1886
+ "sodwork",
1887
+ "soed",
1888
+ "soekarno",
1889
+ "soemba",
1890
+ "soembawa",
1891
+ "soerabaja",
1892
+ "soerakarta",
1893
+ "soever",
1894
+ "sof",
1895
+ "sofa",
1896
+ "sofar",
1897
+ "soffit",
1898
+ "sofia",
1899
+ "soft",
1900
+ "softback",
1901
+ "softball",
1902
+ "softbank",
1903
+ "softboard",
1904
+ "softbound",
1905
+ "soften",
1906
+ "softening",
1907
+ "softgoods",
1908
+ "softhead",
1909
+ "softheaded",
1910
+ "softhearted",
1911
+ "softish",
1912
+ "softland",
1913
+ "softly",
1914
+ "softness",
1915
+ "softpanel",
1916
+ "softwood",
1917
+ "softy",
1918
+ "sogat",
1919
+ "soggy",
1920
+ "soho",
1921
+ "soigne",
1922
+ "soignee",
1923
+ "soil",
1924
+ "soilage",
1925
+ "soilborne",
1926
+ "soilless",
1927
+ "soily",
1928
+ "soiree",
1929
+ "soja",
1930
+ "sojourn",
1931
+ "sojourner",
1932
+ "soke",
1933
+ "sokeman",
1934
+ "sokol",
1935
+ "sokotra",
1936
+ "sol",
1937
+ "solace",
1938
+ "solaceful",
1939
+ "solacet",
1940
+ "solan",
1941
+ "solanaceous",
1942
+ "solander",
1943
+ "solanine",
1944
+ "solano",
1945
+ "solanum",
1946
+ "solar",
1947
+ "solaria",
1948
+ "solarimeter",
1949
+ "solaris",
1950
+ "solarise",
1951
+ "solarism",
1952
+ "solarium",
1953
+ "solarization",
1954
+ "solarize",
1955
+ "solarometer",
1956
+ "solate",
1957
+ "solatia",
1958
+ "solatium",
1959
+ "sold",
1960
+ "soldan",
1961
+ "soldanella",
1962
+ "solder",
1963
+ "solderability",
1964
+ "solderable",
1965
+ "soldi",
1966
+ "soldier",
1967
+ "soldierlike",
1968
+ "soldierly",
1969
+ "soldiership",
1970
+ "soldiery",
1971
+ "soldo",
1972
+ "sole",
1973
+ "solebar",
1974
+ "solecism",
1975
+ "solecist",
1976
+ "solecistic",
1977
+ "solecize",
1978
+ "soleiform",
1979
+ "solely",
1980
+ "solemn",
1981
+ "solemnify",
1982
+ "solemnise",
1983
+ "solemnity",
1984
+ "solemnization",
1985
+ "solemnize",
1986
+ "solemnly",
1987
+ "solemnness",
1988
+ "solen",
1989
+ "solenocyte",
1990
+ "solenodon",
1991
+ "solenoglyph",
1992
+ "solenoid",
1993
+ "soleplate",
1994
+ "soleprint",
1995
+ "soleus",
1996
+ "solfatara",
1997
+ "solfege",
1998
+ "solfeggio",
1999
+ "solgel",
2000
+ "soli",
2001
+ "solicit",
2002
+ "solicitant",
2003
+ "solicitation",
2004
+ "solicitor",
2005
+ "solicitorship",
2006
+ "solicitous",
2007
+ "solicitously",
2008
+ "solicitude",
2009
+ "solicitudinous",
2010
+ "solid",
2011
+ "solidago",
2012
+ "solidaric",
2013
+ "solidarist",
2014
+ "solidarity",
2015
+ "solidarize",
2016
+ "solidary",
2017
+ "solidi",
2018
+ "solidification",
2019
+ "solidify",
2020
+ "solidity",
2021
+ "solidly",
2022
+ "solidness",
2023
+ "solidungulate",
2024
+ "solidus",
2025
+ "solifidian",
2026
+ "solifidianism",
2027
+ "soliflucted",
2028
+ "solifluction",
2029
+ "solifluxion",
2030
+ "soligenous",
2031
+ "soliloquise",
2032
+ "soliloquist",
2033
+ "soliloquize",
2034
+ "soliloquy",
2035
+ "solingen",
2036
+ "solion",
2037
+ "soliped",
2038
+ "solipsism",
2039
+ "solitaire",
2040
+ "solitarily",
2041
+ "solitary",
2042
+ "solitude",
2043
+ "solitudinarian",
2044
+ "soljanka",
2045
+ "solleret",
2046
+ "sollicker",
2047
+ "solmisation",
2048
+ "solmizate",
2049
+ "solmization",
2050
+ "soln",
2051
+ "solo",
2052
+ "solodize",
2053
+ "soloist",
2054
+ "soloistic",
2055
+ "solon",
2056
+ "solonchak",
2057
+ "solonetz",
2058
+ "solstice",
2059
+ "solstitial",
2060
+ "solubilisation",
2061
+ "solubilise",
2062
+ "solubility",
2063
+ "solubilization",
2064
+ "solubilize",
2065
+ "solubilizer",
2066
+ "soluble",
2067
+ "solunar",
2068
+ "solus",
2069
+ "solute",
2070
+ "solutionist",
2071
+ "solutizer",
2072
+ "solutrean",
2073
+ "solvability",
2074
+ "solvable",
2075
+ "solvate",
2076
+ "solve",
2077
+ "solvency",
2078
+ "solvend",
2079
+ "solvent",
2080
+ "solvolysis",
2081
+ "solyanka",
2082
+ "soma",
2083
+ "somal",
2084
+ "somali",
2085
+ "somaliland",
2086
+ "somaplasm",
2087
+ "somascope",
2088
+ "somasteroid",
2089
+ "somatic",
2090
+ "somatization",
2091
+ "somatocoel",
2092
+ "somatogamy",
2093
+ "somatogenetic",
2094
+ "somatogenic",
2095
+ "somatological",
2096
+ "somatology",
2097
+ "somatomedin",
2098
+ "somatoplasm",
2099
+ "somatopleure",
2100
+ "somatopsychic",
2101
+ "somatosensory",
2102
+ "somatostatin",
2103
+ "somatotherapy",
2104
+ "somatotonic",
2105
+ "somatotopic",
2106
+ "somatotopical",
2107
+ "somatotroph",
2108
+ "somatotrophic",
2109
+ "somatotrophin",
2110
+ "somatotropin",
2111
+ "somatotype",
2112
+ "somber",
2113
+ "somberly",
2114
+ "sombre",
2115
+ "sombrero",
2116
+ "sombrous",
2117
+ "some",
2118
+ "somebody",
2119
+ "someday",
2120
+ "somedeal",
2121
+ "somehow",
2122
+ "someone",
2123
+ "someplace",
2124
+ "somersault",
2125
+ "somerset",
2126
+ "somersetshire",
2127
+ "somerville",
2128
+ "somesthetic",
2129
+ "somesuch",
2130
+ "something",
2131
+ "sometime",
2132
+ "sometimes",
2133
+ "sometimey",
2134
+ "someway",
2135
+ "someways",
2136
+ "somewhat",
2137
+ "somewhere",
2138
+ "somewhile",
2139
+ "somewhither",
2140
+ "somewhy",
2141
+ "somewise",
2142
+ "somite",
2143
+ "sommelier",
2144
+ "somnambulance",
2145
+ "somnambulant",
2146
+ "somnambular",
2147
+ "somnambulary",
2148
+ "somnambulate",
2149
+ "somnambule",
2150
+ "somnambulic",
2151
+ "somnambulism",
2152
+ "somnambulist",
2153
+ "somnial",
2154
+ "somnifacient",
2155
+ "somniferous",
2156
+ "somnific",
2157
+ "somniloquence",
2158
+ "somniloquism",
2159
+ "somniloquist",
2160
+ "somniloquous",
2161
+ "somniloquy",
2162
+ "somnivolency",
2163
+ "somnolence",
2164
+ "somnolency",
2165
+ "somnolent",
2166
+ "somnus",
2167
+ "sompa",
2168
+ "son",
2169
+ "sonable",
2170
+ "sonagram",
2171
+ "sonagraph",
2172
+ "sonal",
2173
+ "sonance",
2174
+ "sonant",
2175
+ "sonantize",
2176
+ "sonar",
2177
+ "sonarman",
2178
+ "sonata",
2179
+ "sonatina",
2180
+ "sonation",
2181
+ "sondage",
2182
+ "sonderclass",
2183
+ "sonderkommando",
2184
+ "sone",
2185
+ "sonet",
2186
+ "song",
2187
+ "songbird",
2188
+ "songbook",
2189
+ "songcraft",
2190
+ "songfest",
2191
+ "songful",
2192
+ "songkhla",
2193
+ "songkok",
2194
+ "songless",
2195
+ "songlet",
2196
+ "songlike",
2197
+ "songman",
2198
+ "songsmith",
2199
+ "songster",
2200
+ "songstress",
2201
+ "sonic",
2202
+ "sonicate",
2203
+ "sonication",
2204
+ "sonicguide",
2205
+ "sonifer",
2206
+ "soniferous",
2207
+ "sonifier",
2208
+ "sonless",
2209
+ "sonlike",
2210
+ "sonly",
2211
+ "sonnet",
2212
+ "sonneteer",
2213
+ "sonnetist",
2214
+ "sonnetize",
2215
+ "sonny",
2216
+ "sonobuoy",
2217
+ "sonochemical",
2218
+ "sonochemistry",
2219
+ "sonofabitch",
2220
+ "sonofer",
2221
+ "sonograph",
2222
+ "sonography",
2223
+ "sonoluminescence",
2224
+ "sonolyse",
2225
+ "sonolysis",
2226
+ "sonolyze",
2227
+ "sonometer",
2228
+ "sonorant",
2229
+ "sonorific",
2230
+ "sonority",
2231
+ "sonorization",
2232
+ "sonorize",
2233
+ "sonorous",
2234
+ "sonorously",
2235
+ "sonorousness",
2236
+ "sonovox",
2237
+ "sonship",
2238
+ "sonsie",
2239
+ "sonsy",
2240
+ "sonuvabitch",
2241
+ "sony",
2242
+ "sonya",
2243
+ "soochong",
2244
+ "soochow",
2245
+ "soodling",
2246
+ "sooey",
2247
+ "soogan",
2248
+ "soogee",
2249
+ "sook",
2250
+ "sool",
2251
+ "soon",
2252
+ "soot",
2253
+ "sootfall",
2254
+ "sooth",
2255
+ "soothe",
2256
+ "soother",
2257
+ "soothing",
2258
+ "soothingly",
2259
+ "soothly",
2260
+ "soothsay",
2261
+ "soothsayer",
2262
+ "soothsaying",
2263
+ "sootily",
2264
+ "sootiness",
2265
+ "sootlike",
2266
+ "sooty",
2267
+ "sop",
2268
+ "sopaipilla",
2269
+ "sopapilla",
2270
+ "soper",
2271
+ "soph",
2272
+ "sophi",
2273
+ "sophic",
2274
+ "sophism",
2275
+ "sophist",
2276
+ "sophister",
2277
+ "sophistic",
2278
+ "sophistical",
2279
+ "sophisticate",
2280
+ "sophisticated",
2281
+ "sophistication",
2282
+ "sophisticator",
2283
+ "sophistry",
2284
+ "sophoclean",
2285
+ "sophomore",
2286
+ "sophomoric",
2287
+ "sophomorical",
2288
+ "sophonias",
2289
+ "sopite",
2290
+ "sopor",
2291
+ "soporiferous",
2292
+ "soporific",
2293
+ "soporose",
2294
+ "soporous",
2295
+ "sopot",
2296
+ "sopped",
2297
+ "sopping",
2298
+ "soppy",
2299
+ "soprani",
2300
+ "sopranino",
2301
+ "sopranist",
2302
+ "soprano",
2303
+ "soqotra",
2304
+ "sora",
2305
+ "sorb",
2306
+ "sorbefacient",
2307
+ "sorbent",
2308
+ "sorbian",
2309
+ "sorbitol",
2310
+ "sorbo",
2311
+ "sorbol",
2312
+ "sorbonne",
2313
+ "sorbonnist",
2314
+ "sorbose",
2315
+ "sorcerer",
2316
+ "sorceress",
2317
+ "sorcerize",
2318
+ "sorcery",
2319
+ "sordamente",
2320
+ "sordid",
2321
+ "sordidly",
2322
+ "sore",
2323
+ "soredial",
2324
+ "soredium",
2325
+ "sorefalcon",
2326
+ "sorehawk",
2327
+ "sorehead",
2328
+ "sorel",
2329
+ "sorely",
2330
+ "soreness",
2331
+ "sorgho",
2332
+ "sorghum",
2333
+ "sorgo",
2334
+ "sori",
2335
+ "sorites",
2336
+ "sorn",
2337
+ "soroban",
2338
+ "soroptimist",
2339
+ "sororal",
2340
+ "sororate",
2341
+ "sororial",
2342
+ "sororicide",
2343
+ "sorority",
2344
+ "sororize",
2345
+ "sorosilicate",
2346
+ "sorosis",
2347
+ "sorption",
2348
+ "sorrel",
2349
+ "sorrily",
2350
+ "sorriness",
2351
+ "sorrow",
2352
+ "sorrowful",
2353
+ "sorrowfully",
2354
+ "sorry",
2355
+ "sort",
2356
+ "sorta",
2357
+ "sortable",
2358
+ "sortation",
2359
+ "sorter",
2360
+ "sortes",
2361
+ "sortie",
2362
+ "sortilege",
2363
+ "sortita",
2364
+ "sortition",
2365
+ "sorus",
2366
+ "sos",
2367
+ "sostenuto",
2368
+ "sot",
2369
+ "soterial",
2370
+ "soteriology",
2371
+ "sothiac",
2372
+ "sothiacal",
2373
+ "sothic",
2374
+ "sothis",
2375
+ "sotol",
2376
+ "sots",
2377
+ "sotted",
2378
+ "sottish",
2379
+ "sou",
2380
+ "souari",
2381
+ "soubise",
2382
+ "soubresaut",
2383
+ "soubrette",
2384
+ "soubriquet",
2385
+ "soucar",
2386
+ "souchong",
2387
+ "soudan",
2388
+ "soudanese",
2389
+ "souffle",
2390
+ "sough",
2391
+ "sought",
2392
+ "soul",
2393
+ "soulful",
2394
+ "soulless",
2395
+ "sound",
2396
+ "soundboard",
2397
+ "sounder",
2398
+ "soundex",
2399
+ "soundful",
2400
+ "sounding",
2401
+ "soundless",
2402
+ "soundlessly",
2403
+ "soundly",
2404
+ "soundness",
2405
+ "soundproof",
2406
+ "soundrec",
2407
+ "soundscape",
2408
+ "soundscriber",
2409
+ "soupcon",
2410
+ "soupfin",
2411
+ "soupiness",
2412
+ "soupy",
2413
+ "sour",
2414
+ "sourball",
2415
+ "sourcebook",
2416
+ "sourcrout",
2417
+ "sourdine",
2418
+ "sourdough",
2419
+ "sourish",
2420
+ "sourkrout",
2421
+ "sourly",
2422
+ "sourness",
2423
+ "sourpuss",
2424
+ "soursop",
2425
+ "sousaphone",
2426
+ "souse",
2427
+ "souslik",
2428
+ "sousse",
2429
+ "soutache",
2430
+ "soutane",
2431
+ "soutar",
2432
+ "souteneur",
2433
+ "souter",
2434
+ "souterrain",
2435
+ "south",
2436
+ "southabout",
2437
+ "southampton",
2438
+ "southbound",
2439
+ "southdown",
2440
+ "southeast",
2441
+ "southeaster",
2442
+ "southeasterly",
2443
+ "southeastern",
2444
+ "southeasternmost",
2445
+ "southeastward",
2446
+ "southeastwards",
2447
+ "souther",
2448
+ "southerly",
2449
+ "southern",
2450
+ "southerner",
2451
+ "southernization",
2452
+ "southernly",
2453
+ "southernmost",
2454
+ "southernwood",
2455
+ "southing",
2456
+ "southland",
2457
+ "southmost",
2458
+ "southpaw",
2459
+ "southron",
2460
+ "southward",
2461
+ "southwardly",
2462
+ "southwards",
2463
+ "southwest",
2464
+ "southwester",
2465
+ "southwesterly",
2466
+ "southwestern",
2467
+ "southwesternmost",
2468
+ "southwestward",
2469
+ "southwestwards",
2470
+ "southwide",
2471
+ "souvenir",
2472
+ "souvlaki",
2473
+ "souwester",
2474
+ "souzalite",
2475
+ "sov",
2476
+ "sovereign",
2477
+ "sovereignty",
2478
+ "soviet",
2479
+ "sovietise",
2480
+ "sovietism",
2481
+ "sovietist",
2482
+ "sovietization",
2483
+ "sovietize",
2484
+ "sovietologist",
2485
+ "sovietology",
2486
+ "sovkhoz",
2487
+ "sovnarkhoz",
2488
+ "sovprene",
2489
+ "sovran",
2490
+ "sovranty",
2491
+ "sow",
2492
+ "sowback",
2493
+ "sowbelly",
2494
+ "sowbread",
2495
+ "sowbug",
2496
+ "sowcar",
2497
+ "sowens",
2498
+ "sower",
2499
+ "soweto",
2500
+ "sown",
2501
+ "sowntown",
2502
+ "soy",
2503
+ "soya",
2504
+ "soyaburger",
2505
+ "soybean",
2506
+ "soymilk",
2507
+ "sozin",
2508
+ "sozzled",
2509
+ "spa",
2510
+ "space",
2511
+ "spacearium",
2512
+ "spaceband",
2513
+ "spacebar",
2514
+ "spacecraft",
2515
+ "spacefarer",
2516
+ "spaceflight",
2517
+ "spaceless",
2518
+ "spacelift",
2519
+ "spaceman",
2520
+ "spacemark",
2521
+ "spaceplane",
2522
+ "spaceport",
2523
+ "spacer",
2524
+ "spaceship",
2525
+ "spacesickness",
2526
+ "spacewalk",
2527
+ "spaceward",
2528
+ "spaceway",
2529
+ "spacewoman",
2530
+ "spaceworthy",
2531
+ "spacial",
2532
+ "spacing",
2533
+ "spacious",
2534
+ "spaciously",
2535
+ "spacistor",
2536
+ "spackle",
2537
+ "spadable",
2538
+ "spade",
2539
+ "spadebone",
2540
+ "spadefoot",
2541
+ "spadeful",
2542
+ "spadework",
2543
+ "spadger",
2544
+ "spadices",
2545
+ "spadicose",
2546
+ "spadille",
2547
+ "spadish",
2548
+ "spadix",
2549
+ "spado",
2550
+ "spae",
2551
+ "spaeman",
2552
+ "spaetzle",
2553
+ "spaewife",
2554
+ "spag",
2555
+ "spaggers",
2556
+ "spaghetti",
2557
+ "spaghettini",
2558
+ "spagyric",
2559
+ "spahee",
2560
+ "spahi",
2561
+ "spain",
2562
+ "spaish",
2563
+ "spait",
2564
+ "spake",
2565
+ "spalato",
2566
+ "spall",
2567
+ "spallation",
2568
+ "spalpeen",
2569
+ "span",
2570
+ "spanaemia",
2571
+ "spancel",
2572
+ "spandrel",
2573
+ "spandril",
2574
+ "spandy",
2575
+ "spang",
2576
+ "spangle",
2577
+ "spanglish",
2578
+ "spaniard",
2579
+ "spaniel",
2580
+ "spanish",
2581
+ "spank",
2582
+ "spanker",
2583
+ "spanking",
2584
+ "spanless",
2585
+ "spanned",
2586
+ "spanner",
2587
+ "spanning",
2588
+ "spanrail",
2589
+ "spanwise",
2590
+ "spanworm",
2591
+ "spar",
2592
+ "sparable",
2593
+ "sparaxis",
2594
+ "spare",
2595
+ "sparely",
2596
+ "spareness",
2597
+ "sparerib",
2598
+ "sparganosis",
2599
+ "sparganum",
2600
+ "sparge",
2601
+ "sparid",
2602
+ "sparing",
2603
+ "sparingly",
2604
+ "spark",
2605
+ "sparkish",
2606
+ "sparkle",
2607
+ "sparkler",
2608
+ "sparkless",
2609
+ "sparklet",
2610
+ "sparkling",
2611
+ "sparklingly",
2612
+ "sparkplug",
2613
+ "sparkproof",
2614
+ "sparmate",
2615
+ "sparrow",
2616
+ "sparrowgrass",
2617
+ "sparry",
2618
+ "sparse",
2619
+ "sparsely",
2620
+ "sparseness",
2621
+ "sparsity",
2622
+ "sparta",
2623
+ "spartacist",
2624
+ "spartacus",
2625
+ "spartan",
2626
+ "spartanism",
2627
+ "spartanize",
2628
+ "sparteine",
2629
+ "spasm",
2630
+ "spasmic",
2631
+ "spasmodic",
2632
+ "spasmodical",
2633
+ "spasmodically",
2634
+ "spasmodism",
2635
+ "spasmodist",
2636
+ "spasmogen",
2637
+ "spasmogenic",
2638
+ "spasmolysis",
2639
+ "spasmolytic",
2640
+ "spasmophilia",
2641
+ "spastic",
2642
+ "spat",
2643
+ "spatchcock",
2644
+ "spate",
2645
+ "spathal",
2646
+ "spathe",
2647
+ "spathic",
2648
+ "spathiform",
2649
+ "spathulate",
2650
+ "spatial",
2651
+ "spatiality",
2652
+ "spatiography",
2653
+ "spatioperceptual",
2654
+ "spatiotemporal",
2655
+ "spatted",
2656
+ "spatter",
2657
+ "spatterdash",
2658
+ "spatterdock",
2659
+ "spatterware",
2660
+ "spatula",
2661
+ "spatulate",
2662
+ "spatuliform",
2663
+ "spatzle",
2664
+ "spavin",
2665
+ "spavined",
2666
+ "spawn",
2667
+ "spawny",
2668
+ "spay",
2669
+ "spaz",
2670
+ "spc",
2671
+ "spca",
2672
+ "spcc"
2673
+ ];
2674
+ /** Python `str.capitalize`: uppercase first char, lowercase the rest. */
2675
+ function capitalize(value) {
2676
+ return value.length === 0 ? value : value[0].toUpperCase() + value.slice(1).toLowerCase();
2677
+ }
2678
+ /** Python `str.islower` on a single character. */
2679
+ function isLowerChar(char) {
2680
+ return char >= "a" && char <= "z";
2681
+ }
2682
+ /** `re.sub('[A-Z]', lambda x: '_' + x.group(0), name).split('_')`. */
2683
+ function splitCamel(name) {
2684
+ return name.replace(/[A-Z]/g, (ch) => `_${ch}`).split("_");
2685
+ }
2686
+ /** Random string of the given length over the 52-letter alphabet. */
2687
+ function randomString(length, rng) {
2688
+ let out = "";
2689
+ for (let index = 0; index < length; index += 1) out += UPPER_AND_LOWER[Math.floor(rng() * 52)];
2690
+ return out;
2691
+ }
2692
+ /** True when the value contains at least one digit. */
2693
+ function isNumberString(value) {
2694
+ return /[0-9]/.test(value);
2695
+ }
2696
+ /** True when the value contains any ASCII punctuation except '_'. */
2697
+ function hasSpecialString(value) {
2698
+ for (const char of value) if (PUNCTUATION_EXCEPT_UNDERSCORE.has(char)) return true;
2699
+ return false;
2700
+ }
2701
+ /** UTF-8 md5 hex digest (node:crypto createHash). */
2702
+ function md5Hex(value) {
2703
+ return createHash("md5").update(value, "utf8").digest("hex");
2704
+ }
2705
+ /** MD5 of the first 8096 bytes of a file. */
2706
+ function getFileMd5Value(buffer) {
2707
+ return createHash("md5").update(buffer.subarray(0, 8096)).digest("hex");
2708
+ }
2709
+ /** Draw a cleaned word from the lexicon pool. */
2710
+ function lexiconWord(rng) {
2711
+ const index = Math.min(LEXICON.length - 1, Math.floor(rng() * LEXICON.length));
2712
+ let word = LEXICON[index] ?? "";
2713
+ if (word === "virtual") word = "virtualObj";
2714
+ return word === "" ? "word" : word;
2715
+ }
2716
+ function randomInt(rng, min, max) {
2717
+ return min + Math.floor(rng() * (max - min + 1));
2718
+ }
2719
+ /** Whole-word swap of one identifier using `\b\w+\b` (matching the original `re.sub`). */
2720
+ function replaceWord(text, name, obscured) {
2721
+ if (!name) return text;
2722
+ return text.replace(new RegExp(`\\b${escapeRegExp(name)}\\b`, "g"), () => obscured);
2723
+ }
2724
+ /** Generate an obscured class name via the my-rule algorithm. */
2725
+ function obscureClassNameByMyRule(name, _prefixWord, rng) {
2726
+ let parts = splitCamel(name);
2727
+ const firstKeyWord = capitalize(lexiconWord(rng));
2728
+ let lastKeyWord;
2729
+ if (parts.length > 0 && parts[0].length === 0) while (parts.length > 0 && parts[0].length === 0) parts = parts.slice(1);
2730
+ if (parts.length > 0) lastKeyWord = capitalize(parts[parts.length - 1]);
2731
+ else lastKeyWord = capitalize(lexiconWord(rng));
2732
+ const add = [firstKeyWord];
2733
+ let addCount = parts.length - 2;
2734
+ if (addCount <= 0) addCount = 1;
2735
+ for (let index = 0; index < addCount + randomInt(rng, 0, 1); index += 1) add.push(capitalize(lexiconWord(rng)));
2736
+ add.push(lastKeyWord);
2737
+ let result = add.join("");
2738
+ if (name.startsWith("_")) result = `_${result}`;
2739
+ return result;
2740
+ }
2741
+ /** Generate an obscured method name via the my-rule algorithm (dead branch omitted). */
2742
+ function obscureMethodNameByMyRule(name, prefixWord, rng) {
2743
+ const parts = splitCamel(name);
2744
+ let firstKeyWord = lexiconWord(rng);
2745
+ if (prefixWord.length > 0 && !prefixWord.endsWith("_")) firstKeyWord = capitalize(firstKeyWord);
2746
+ else if (name.startsWith("_")) capitalize(lexiconWord(rng));
2747
+ const kept = parts.filter((item) => item.length > 2);
2748
+ let lastKeyWord;
2749
+ if (kept.length > 0) lastKeyWord = kept[kept.length - 1];
2750
+ else lastKeyWord = capitalize(lexiconWord(rng));
2751
+ let result = firstKeyWord + capitalize(lexiconWord(rng)) + capitalize(lastKeyWord);
2752
+ if (name.startsWith("_")) result = `_${result}`;
2753
+ return result;
2754
+ }
2755
+ /** Generate an obscured variable/constant name via the my-rule algorithm. */
2756
+ function obscureVariableNameByMyRule(name, prefixWord, rng) {
2757
+ const parts = splitCamel(name);
2758
+ let firstKeyWord = lexiconWord(rng);
2759
+ if (prefixWord.length > 0 && !prefixWord.endsWith("_")) firstKeyWord = capitalize(firstKeyWord);
2760
+ else if (name.startsWith("_")) capitalize(lexiconWord(rng));
2761
+ let lastKeyWord;
2762
+ if (parts.length > 0) lastKeyWord = capitalize(parts[parts.length - 1]);
2763
+ else lastKeyWord = capitalize(lexiconWord(rng));
2764
+ let result = firstKeyWord + lastKeyWord;
2765
+ if (name.startsWith("_")) result = `_${result}`;
2766
+ return result;
2767
+ }
2768
+ /** Generate an obscured resource name via the my-rule algorithm. */
2769
+ function obscureResourceNameByMyRule(name, _prefixWord, rng) {
2770
+ let parts = splitCamel(name);
2771
+ const firstKeyWord = lexiconWord(rng);
2772
+ let lastKeyWord;
2773
+ if (parts.length > 0 && parts[0].length === 0) while (parts.length > 0 && parts[0].length === 0) parts = parts.slice(1);
2774
+ if (parts.length > 0) lastKeyWord = capitalize(parts[parts.length - 1]);
2775
+ else lastKeyWord = capitalize(lexiconWord(rng));
2776
+ const add = [firstKeyWord];
2777
+ let addCount = parts.length - 2;
2778
+ if (addCount <= 0) addCount = 1;
2779
+ for (let index = 0; index < addCount; index += 1) add.push(capitalize(lexiconWord(rng)));
2780
+ add.push(lastKeyWord);
2781
+ let result = add.join("");
2782
+ if (name.startsWith("_")) result = `_${result}`;
2783
+ return result;
2784
+ }
2785
+ function prefixHashReturn(prefix, name) {
2786
+ if (prefix.endsWith("#")) return (prefix.split("#")[0] ?? "") + name;
2787
+ }
2788
+ function finishGenerated(prefix, name, obscured) {
2789
+ if (prefix.length > 0 && name.includes("_")) {
2790
+ if (prefix.endsWith("_") && name.startsWith("_")) return (prefix.split("_")[0] ?? "") + obscured;
2791
+ return prefix + obscured;
2792
+ }
2793
+ const first = obscured[0] ?? "";
2794
+ const rest = obscured.slice(1);
2795
+ return prefix + (isLowerChar(name[0] ?? "") ? first.toLowerCase() : first.toUpperCase()) + rest;
2796
+ }
2797
+ /** Generate an obscured class name (whitelist/prefix/algorithm selection). */
2798
+ function generateClassName(name, prefixWord, rng, options) {
2799
+ if (MUST_WHITE_CLASS_SET.has(name) || options.classWhiteList.includes(name)) return name;
2800
+ const hashed = prefixHashReturn(prefixWord, name);
2801
+ if (hashed !== void 0) return hashed;
2802
+ return finishGenerated(prefixWord, name, options.missAlgorithmType === 3 ? randomString(name.length * 2, rng) : obscureClassNameByMyRule(name, prefixWord, rng));
2803
+ }
2804
+ /** Generate an obscured method name (whitelist/prefix/algorithm selection). */
2805
+ function generateMethodName(name, prefixWord, rng, options) {
2806
+ if (IGNORE_METHOD_SET.has(name) || options.methodWhiteList.includes(name)) return name;
2807
+ const hashed = prefixHashReturn(prefixWord, name);
2808
+ if (hashed !== void 0) return hashed;
2809
+ return finishGenerated(prefixWord, name, options.missAlgorithmType === 3 ? randomString(name.length * 2, rng) : obscureMethodNameByMyRule(name, prefixWord, rng));
2810
+ }
2811
+ /** Generate an obscured variable/constant name (whitelist/prefix/algorithm selection). */
2812
+ function generateVariableName(name, prefixWord, rng, options) {
2813
+ if (IGNORE_VARIABLE_SET.has(name) || options.variableWhiteList.includes(name)) return name;
2814
+ const hashed = prefixHashReturn(prefixWord, name);
2815
+ if (hashed !== void 0) return hashed;
2816
+ return finishGenerated(prefixWord, name, options.missAlgorithmType === 3 ? randomString(name.length * 2, rng) : obscureVariableNameByMyRule(name, prefixWord, rng));
2817
+ }
2818
+ /** Generate an obscured resource name (prefix/algorithm selection). */
2819
+ function generateResourceName(name, prefixWord, rng, options) {
2820
+ const hashed = prefixHashReturn(prefixWord, name);
2821
+ if (hashed !== void 0) return hashed;
2822
+ return finishGenerated(prefixWord, name, options.missAlgorithmType === 3 ? randomString(name.length * 2, rng) : obscureResourceNameByMyRule(name, prefixWord, rng));
2823
+ }
2824
+ /** Class declaration analysis: a `class ` line returns the second token. */
2825
+ function analyzeDartClassLine(line) {
2826
+ if (!line.startsWith("class ")) return void 0;
2827
+ const name = line.split(/\s+/).filter(Boolean)[1];
2828
+ return name ? { name } : void 0;
2829
+ }
2830
+ /** Method declaration analysis: a return-typed method declaration line. */
2831
+ function analyzeDartMethodLine(line) {
2832
+ const tokens = line.trim().split(/\s+/).filter(Boolean);
2833
+ if (tokens.length <= 1) return void 0;
2834
+ const returnWord = tokens[0];
2835
+ if (!BASIC_DATA_SET.has(returnWord) && !BASIC_CONTROL_SET.has(returnWord)) return void 0;
2836
+ if (line.split("(").length - 1 !== 1 || line.split(")").length - 1 !== 1) return void 0;
2837
+ if (line.endsWith(";")) return void 0;
2838
+ const open = line.indexOf("(");
2839
+ if (open < 0) return void 0;
2840
+ const methodTokens = line.slice(2, open).split(/\s+/).filter(Boolean);
2841
+ const name = methodTokens[methodTokens.length - 1];
2842
+ if (!name || hasSpecialString(name)) return void 0;
2843
+ if (IGNORE_METHOD_SET.has(name)) return void 0;
2844
+ if (name.startsWith("did") && name.endsWith("State")) return void 0;
2845
+ return { name };
2846
+ }
2847
+ /** Variable declaration analysis: variable / const-constructor declarations. */
2848
+ function analyzeDartVariableLine(line) {
2849
+ if (line.startsWith("//")) return void 0;
2850
+ const noSpace = line.trim();
2851
+ if (noSpace.length === 0) return void 0;
2852
+ if (noSpace.startsWith("const ") && noSpace.endsWith(");")) {
2853
+ const names = [...noSpace.matchAll(/this\.(\w+)/g)].map((match) => match[1]);
2854
+ return names.length > 0 ? {
2855
+ kind: "constructor",
2856
+ names
2857
+ } : void 0;
2858
+ }
2859
+ if (!line.startsWith(" ")) return void 0;
2860
+ if (!line.endsWith(";")) return void 0;
2861
+ const tokens = noSpace.split(/\s+/).filter(Boolean);
2862
+ let name;
2863
+ if (!line.includes("=") || line.includes("=>") || line.includes("==")) {
2864
+ if (tokens.length < 2 || tokens.length > 3) return void 0;
2865
+ const first = tokens[0];
2866
+ if (!CONSTANT_KEYWORD_SET.has(first) && !BASIC_DATA_SET.has(first) && !BASIC_CONTROL_SET.has(first)) return void 0;
2867
+ name = tokens[tokens.length - 1];
2868
+ if (name !== void 0 && name.includes(";")) name = name.slice(0, name.indexOf(";"));
2869
+ if (name !== void 0 && (name.includes("({") || name.includes("("))) name = void 0;
2870
+ if (name !== void 0 && (name.includes("})") || name.includes(")"))) name = void 0;
2871
+ } else {
2872
+ if (!line.includes("=")) return void 0;
2873
+ const eq = line.indexOf("=");
2874
+ if (line[eq - 1] !== " " || line[eq + 1] !== " ") return void 0;
2875
+ const lhsTokens = noSpace.split("=")[0].trim().split(/\s+/).filter(Boolean);
2876
+ if (lhsTokens.length <= 1) return void 0;
2877
+ name = lhsTokens[lhsTokens.length - 1];
2878
+ }
2879
+ if (!name) return void 0;
2880
+ return {
2881
+ kind: "declaration",
2882
+ name
2883
+ };
2884
+ }
2885
+ /** Replace a class name on a line: plain `\b\w+\b` swap. */
2886
+ function replaceClassNameInLine(line, name, obscured) {
2887
+ return replaceWord(line, name, obscured);
2888
+ }
2889
+ /** Replace a method name on a line, protecting `"name"` string literals. */
2890
+ function replaceMethodNameInLine(line, name, obscured) {
2891
+ const mark = "$Z-F-J$";
2892
+ let work = line;
2893
+ if (work.includes(`"${name}"`)) work = work.split(`"${name}"`).join(mark);
2894
+ let result = replaceWord(work, name, obscured);
2895
+ if (result.includes(mark)) result = result.split(mark).join(`"${name}"`);
2896
+ return result;
2897
+ }
2898
+ /** Replace a variable/constant name on a line, protecting string/literal/call/regex forms. */
2899
+ function replaceVariableNameInLine(line, name, obscured) {
2900
+ if (line.startsWith("import")) return line;
2901
+ const mark = "$Z-F-J$";
2902
+ const single = `'${name}'`;
2903
+ const call = `${name}(`;
2904
+ const slash = `/${name}/`;
2905
+ let work = line;
2906
+ const hadDouble = work.includes(`"${name}"`);
2907
+ const hadSingle = work.includes(single);
2908
+ const hadCall = work.includes(call);
2909
+ const hadSlash = work.includes(slash);
2910
+ if (hadDouble) work = work.split(`"${name}"`).join(mark);
2911
+ if (hadSingle) work = work.split(single).join(md5Hex(single));
2912
+ if (hadCall) work = work.split(call).join(md5Hex(call));
2913
+ if (hadSlash) work = work.split(slash).join(md5Hex(slash));
2914
+ let result = replaceWord(work, name, obscured);
2915
+ if (result.includes(mark)) result = result.split(mark).join(`"${name}"`);
2916
+ if (hadSingle) result = result.split(md5Hex(single)).join(single);
2917
+ if (hadCall) result = result.split(md5Hex(call)).join(call);
2918
+ if (hadSlash) result = result.split(md5Hex(slash)).join(slash);
2919
+ return result;
2920
+ }
2921
+ /** Delete Dart comments from a single line (trailing newline already removed). */
2922
+ function deleteNotesInLine(line, inBlock) {
2923
+ let noNotes = null;
2924
+ const stripped = line.trim();
2925
+ if (stripped.includes("//")) {
2926
+ const ds = line.indexOf("//");
2927
+ if (line.includes("\"") && line.split("\"").length - 1 === 2) {
2928
+ const start = line.indexOf("\"");
2929
+ noNotes = ds > line.indexOf("\"", start + 1) ? line.slice(0, ds) : line;
2930
+ } else if (line.includes("'") && line.split("'").length - 1 === 2) {
2931
+ const start = line.indexOf("'");
2932
+ noNotes = ds > line.indexOf("'", start + 1) ? line.slice(0, ds) : line;
2933
+ } else noNotes = line.slice(0, ds);
2934
+ } else if (stripped.includes("/*") && !stripped.includes("*/")) {
2935
+ noNotes = line.slice(0, line.indexOf("/*"));
2936
+ inBlock = true;
2937
+ } else if (!stripped.includes("/*") && stripped.includes("*/")) {
2938
+ noNotes = line.slice(line.indexOf("*/") + 2);
2939
+ inBlock = false;
2940
+ } else if (stripped.includes("/*") && stripped.includes("*/")) {
2941
+ const start = line.indexOf("/*");
2942
+ const end = line.indexOf("*/") + 2;
2943
+ const mark = line.slice(start, end);
2944
+ noNotes = line.split(mark).join("");
2945
+ } else if (inBlock && !stripped.includes("/*") && !stripped.includes("*/")) noNotes = null;
2946
+ else noNotes = line;
2947
+ if (noNotes !== null) {
2948
+ if (noNotes.replace(/ /g, "") === "") return {
2949
+ text: null,
2950
+ inBlock
2951
+ };
2952
+ return {
2953
+ text: noNotes,
2954
+ inBlock
2955
+ };
2956
+ }
2957
+ return {
2958
+ text: null,
2959
+ inBlock
2960
+ };
2961
+ }
2962
+ /** Python file-iteration semantics: each yielded line plus whether it carried a trailing newline. */
2963
+ function pythonLines(source) {
2964
+ if (source === "") return [];
2965
+ const parts = source.split("\n");
2966
+ const result = [];
2967
+ for (let index = 0; index < parts.length; index += 1) result.push({
2968
+ text: parts[index],
2969
+ hasNewline: index < parts.length - 1
2970
+ });
2971
+ if (result[result.length - 1].text === "" && !result[result.length - 1].hasNewline) result.pop();
2972
+ return result;
2973
+ }
2974
+ /** Delete Dart comments from a whole source file. */
2975
+ function deleteDartComments(source) {
2976
+ const out = [];
2977
+ let inBlock = false;
2978
+ for (const { text, hasNewline } of pythonLines(source)) {
2979
+ const result = deleteNotesInLine(text, inBlock);
2980
+ inBlock = result.inBlock;
2981
+ if (result.text !== null && result.text.length > 0) out.push(result.text + (hasNewline ? "\n" : ""));
2982
+ }
2983
+ return out.join("");
2984
+ }
2985
+ const FLUTTER_IMAGE_EXTENSIONS = /* @__PURE__ */ new Set([
2986
+ "jpg",
2987
+ "jpeg",
2988
+ "png",
2989
+ "webp",
2990
+ "gif"
2991
+ ]);
2992
+ const FLUTTER_AUDIO_EXTENSIONS = /* @__PURE__ */ new Set([
2993
+ "pcm",
2994
+ "wav",
2995
+ "mp3",
2996
+ "amr",
2997
+ "aac",
2998
+ "caf"
2999
+ ]);
3000
+ const FLUTTER_VIDEO_EXTENSIONS = /* @__PURE__ */ new Set([
3001
+ "mp4",
3002
+ "mkv",
3003
+ "avi",
3004
+ "wmv",
3005
+ "iso",
3006
+ "rmvb"
3007
+ ]);
3008
+ function fileExtension(relative) {
3009
+ const base = relative.slice(relative.lastIndexOf("/") + 1);
3010
+ const dot = base.lastIndexOf(".");
3011
+ return dot < 1 ? "" : base.slice(dot + 1).toLowerCase();
3012
+ }
3013
+ function basename(relative) {
3014
+ return relative.slice(relative.lastIndexOf("/") + 1);
3015
+ }
3016
+ /** True for image files (extension paths only). */
3017
+ function isFlutterImage(relative) {
3018
+ return FLUTTER_IMAGE_EXTENSIONS.has(fileExtension(relative));
3019
+ }
3020
+ /** True for audio files (by extension). */
3021
+ function isFlutterAudio(relative) {
3022
+ return FLUTTER_AUDIO_EXTENSIONS.has(fileExtension(relative));
3023
+ }
3024
+ /** True for video files (by extension). */
3025
+ function isFlutterVideo(relative) {
3026
+ return FLUTTER_VIDEO_EXTENSIONS.has(fileExtension(relative));
3027
+ }
3028
+ const IGNORE_IMAGE_PATHS = [
3029
+ "/build/",
3030
+ "/ios/Runner/",
3031
+ "/.",
3032
+ "/android/app/"
3033
+ ];
3034
+ /** True for image paths that should be ignored. */
3035
+ function isIgnoreImgPath(relative) {
3036
+ return IGNORE_IMAGE_PATHS.some((item) => relative.includes(item));
3037
+ }
3038
+ const MUST_IGNORE_PATHS = [
3039
+ "/.git/",
3040
+ "/Pods/",
3041
+ "/README.md",
3042
+ "/Podfile.lock",
3043
+ ".json",
3044
+ "/.DS_Store",
3045
+ "/.svn/"
3046
+ ];
3047
+ /** True for project-relative paths that must be ignored. */
3048
+ function mustIgnorePath(relative) {
3049
+ const withSlash = `/${relative}`;
3050
+ return MUST_IGNORE_PATHS.some((item) => withSlash.includes(item) || relative.includes(item));
3051
+ }
3052
+ const DART_RESOURCE_PATTERNS = (name) => [
3053
+ `/${name}.`,
3054
+ `'${name}.`,
3055
+ `"${name}.`,
3056
+ ` ${name}.`,
3057
+ `'${name}.',`,
3058
+ `"${name}.",`
3059
+ ];
3060
+ const YAML_RESOURCE_PATTERNS = (name) => [
3061
+ `/${name}.`,
3062
+ `-${name}.`,
3063
+ ` ${name}.`
3064
+ ];
3065
+ /** Rewrite resource references in a Dart source file. */
3066
+ function rewriteDartResourceReferences(source, map) {
3067
+ return source.split("\n").map((line) => {
3068
+ let result = line;
3069
+ for (const [name, obscured] of map) for (const pattern of DART_RESOURCE_PATTERNS(name)) if (result.includes(pattern)) {
3070
+ result = result.split(pattern).join(pattern.replace(name, obscured));
3071
+ break;
3072
+ }
3073
+ return result;
3074
+ }).join("\n");
3075
+ }
3076
+ /** Rewrite resource references in a YAML file. */
3077
+ function rewriteYamlResourceReferences(source, map) {
3078
+ return source.split("\n").map((line) => {
3079
+ let result = line;
3080
+ for (const [name, obscured] of map) for (const pattern of YAML_RESOURCE_PATTERNS(name)) if (result.includes(pattern)) {
3081
+ result = result.split(pattern).join(pattern.replace(name, obscured));
3082
+ break;
3083
+ }
3084
+ return result;
3085
+ }).join("\n");
3086
+ }
3087
+ const HASH_PAD_CHARS = "#&";
3088
+ /** First hash-pad character: always '#'. */
3089
+ function firstRandomCode() {
3090
+ return "#";
3091
+ }
3092
+ /** Hash-pad string: '#' + (length + 1) chars from '#&'. */
3093
+ function randomCodeString(length, rng) {
3094
+ let final = HASH_PAD_CHARS[Math.floor(rng() * 2)];
3095
+ for (let index = 0; index < length; index += 1) final += HASH_PAD_CHARS[Math.floor(rng() * 2)];
3096
+ return firstRandomCode() + final;
3097
+ }
3098
+ /** Deterministic `#&` suffix appended to a resource payload to change its md5. */
3099
+ function perturbResourceHash(buffer, seed, salt) {
3100
+ const rng = seededRandom(deriveHash(seed, "flutter-resource-hash", salt));
3101
+ return Buffer.concat([buffer, Buffer.from(randomCodeString(4, rng), "latin1")]);
3102
+ }
3103
+ /** True for a 24-char uppercase Xcode UUID with no `/* ="._{}`. */
3104
+ function isXcodeUuid(token) {
3105
+ if (token.length !== 24) return false;
3106
+ if (!/[A-Z]/.test(token) || token !== token.toUpperCase()) return false;
3107
+ return !/[\/\* ="._{}]/.test(token);
3108
+ }
3109
+ /** Remap project.pbxproj UUIDs, pure over a source string. */
3110
+ function remapPbxprojUuids(source, seed) {
3111
+ const map = /* @__PURE__ */ new Map();
3112
+ for (const line of source.split("\n")) {
3113
+ let token = line.replace(/\s+/g, "");
3114
+ if (token.length >= 24) token = token.slice(0, 24);
3115
+ if (isXcodeUuid(token) && !map.has(token)) map.set(token, deriveUuid(seed, token));
3116
+ }
3117
+ if (map.size === 0) return source;
3118
+ let result = source;
3119
+ for (const [oldUuid, newUuid] of map) result = result.split(oldUuid).join(newUuid);
3120
+ return result;
3121
+ }
3122
+ function dartFiles(files) {
3123
+ return files.filter((entry) => entry.relative.endsWith(".dart") && !mustIgnorePath(entry.relative));
3124
+ }
3125
+ function splitLines(source) {
3126
+ return source.split("\n");
3127
+ }
3128
+ /**
3129
+ * Discovery + whole-word rewrite for one symbol kind over all dart files. Mirrors the
3130
+ * original `save_*_name` collision handling: generate once, and regenerate exactly once
3131
+ * when the result was already used; ignored/whitelisted names return unchanged and do not
3132
+ * advance the random stream.
3133
+ */
3134
+ function runSymbolPass(files, rng, analyze, generate, rewrite, changedPaths) {
3135
+ const entries = dartFiles(files);
3136
+ const map = /* @__PURE__ */ new Map();
3137
+ const used = [];
3138
+ for (const entry of entries) {
3139
+ const source = readFileSync(entry.absolute, "utf8");
3140
+ for (const line of splitLines(source)) for (const name of analyze(line)) {
3141
+ if (map.has(name)) continue;
3142
+ let obscured = generate(name, rng);
3143
+ if (obscured === name) continue;
3144
+ if (used.includes(obscured)) obscured = generate(name, rng);
3145
+ used.push(obscured);
3146
+ map.set(name, obscured);
3147
+ }
3148
+ }
3149
+ if (map.size === 0) return 0;
3150
+ let changed = 0;
3151
+ for (const entry of entries) {
3152
+ const before = readFileSync(entry.absolute, "utf8");
3153
+ const after = splitLines(before).map((line) => rewrite(line, map)).join("\n");
3154
+ if (after !== before && writeIfChanged(entry, after)) {
3155
+ changed += 1;
3156
+ changedPaths.add(entry.relative);
3157
+ }
3158
+ }
3159
+ return changed;
3160
+ }
3161
+ /**
3162
+ * In-place Flutter obfuscation over an already-walked project, following the original
3163
+ * `flutter_obscure_main` order: variable -> class -> method -> resource hash -> resource
3164
+ * name -> delete notes -> uuid. Each symbol pass discovers declarations across all dart
3165
+ * files first (deterministically, sorted by relative path) and then rewrites every
3166
+ * occurrence using the original whole-word rules.
3167
+ */
3168
+ function renameFlutterSymbols(files, options, seed) {
3169
+ const opts = normalizeFlutterOptions(options);
3170
+ const rng = seededRandom(deriveHash(seed, "flutter"));
3171
+ const sorted = [...files].sort((a, b) => a.relative < b.relative ? -1 : a.relative > b.relative ? 1 : 0);
3172
+ const changedPaths = /* @__PURE__ */ new Set();
3173
+ let unsupported = 0;
3174
+ if (opts.features.variable) runSymbolPass(sorted, rng, (line) => {
3175
+ const match = analyzeDartVariableLine(line);
3176
+ if (!match) return [];
3177
+ return match.kind === "constructor" ? match.names : [match.name];
3178
+ }, (name, r) => generateVariableName(name, opts.prefixWord, r, opts), (line, map) => {
3179
+ let result = line;
3180
+ for (const [name, obscured] of map) result = replaceVariableNameInLine(result, name, obscured);
3181
+ return result;
3182
+ }, changedPaths);
3183
+ if (opts.features.className) runSymbolPass(sorted, rng, (line) => {
3184
+ const match = analyzeDartClassLine(line);
3185
+ return match ? [match.name] : [];
3186
+ }, (name, r) => generateClassName(name, opts.prefixWord, r, opts), (line, map) => {
3187
+ let result = line;
3188
+ for (const [name, obscured] of map) result = replaceClassNameInLine(result, name, obscured);
3189
+ return result;
3190
+ }, changedPaths);
3191
+ if (opts.features.method) runSymbolPass(sorted, rng, (line) => {
3192
+ const match = analyzeDartMethodLine(line);
3193
+ return match ? [match.name] : [];
3194
+ }, (name, r) => generateMethodName(name, opts.prefixWord, r, opts), (line, map) => {
3195
+ let result = line;
3196
+ for (const [name, obscured] of map) result = replaceMethodNameInLine(result, name, obscured);
3197
+ return result;
3198
+ }, changedPaths);
3199
+ if (opts.features.resourceHash) for (const entry of sorted) {
3200
+ if (!isFlutterImage(entry.relative) && !isFlutterAudio(entry.relative) && !isFlutterVideo(entry.relative)) continue;
3201
+ if (mustIgnorePath(entry.relative)) continue;
3202
+ const before = readFileSync(entry.absolute);
3203
+ const after = perturbResourceHash(before, seed, entry.relative);
3204
+ if (after.equals(before)) continue;
3205
+ writeFileSync(entry.absolute, after);
3206
+ changedPaths.add(entry.relative);
3207
+ }
3208
+ if (opts.features.resourceName) {
3209
+ const nameMap = /* @__PURE__ */ new Map();
3210
+ const used = [];
3211
+ const renames = /* @__PURE__ */ new Map();
3212
+ for (const entry of sorted) {
3213
+ if (!isFlutterImage(entry.relative) || isIgnoreImgPath(entry.relative)) continue;
3214
+ const base = basename(entry.relative);
3215
+ const dot = base.indexOf(".");
3216
+ const resourceName = dot < 0 ? base : base.slice(0, dot);
3217
+ const resourceType = dot < 0 ? "" : base.slice(base.lastIndexOf(".") + 1);
3218
+ if (isNumberString(resourceName)) continue;
3219
+ if (!nameMap.has(resourceName)) {
3220
+ let obscured = generateResourceName(resourceName, opts.prefixWord, rng, opts);
3221
+ if (used.includes(obscured)) obscured = generateResourceName(resourceName, opts.prefixWord, rng, opts);
3222
+ used.push(obscured);
3223
+ nameMap.set(resourceName, obscured);
3224
+ }
3225
+ const obscured = nameMap.get(resourceName);
3226
+ const oldPath = entry.absolute;
3227
+ const newPath = oldPath.split(`${resourceName}.${resourceType}`).join(`${obscured}.${resourceType}`);
3228
+ if (newPath !== oldPath) renames.set(oldPath, newPath);
3229
+ }
3230
+ for (const entry of sorted) if (entry.relative.endsWith(".dart")) {
3231
+ if (entry.relative.includes("/.")) continue;
3232
+ const before = readFileSync(entry.absolute, "utf8");
3233
+ const after = rewriteDartResourceReferences(before, nameMap);
3234
+ if (after !== before && writeIfChanged(entry, after)) changedPaths.add(entry.relative);
3235
+ } else if (entry.relative.endsWith(".yaml")) {
3236
+ const before = readFileSync(entry.absolute, "utf8");
3237
+ const after = rewriteYamlResourceReferences(before, nameMap);
3238
+ if (after !== before && writeIfChanged(entry, after)) changedPaths.add(entry.relative);
3239
+ }
3240
+ for (const [from, to] of renames) try {
3241
+ renameSync(from, to);
3242
+ changedPaths.add(to);
3243
+ } catch {
3244
+ unsupported += 1;
3245
+ }
3246
+ }
3247
+ if (opts.features.deleteNotes) for (const entry of dartFiles(sorted)) {
3248
+ const before = readFileSync(entry.absolute, "utf8");
3249
+ const after = deleteDartComments(before);
3250
+ if (after !== before && writeIfChanged(entry, after)) changedPaths.add(entry.relative);
3251
+ }
3252
+ if (opts.features.uuid) for (const entry of sorted) {
3253
+ if (!entry.relative.endsWith("project.pbxproj")) continue;
3254
+ const before = readFileSync(entry.absolute, "utf8");
3255
+ const after = remapPbxprojUuids(before, seed);
3256
+ if (after !== before && writeIfChanged(entry, after)) changedPaths.add(entry.relative);
3257
+ }
3258
+ return {
3259
+ changed: changedPaths.size,
3260
+ changedPaths: [...changedPaths].sort(),
3261
+ unsupported
3262
+ };
3263
+ }
3264
+ export { FLUTTER_BASIC_CONTROL_TYPES, FLUTTER_BASIC_DATA_TYPES, FLUTTER_CONSTANT_KEYWORDS, FLUTTER_IGNORE_METHODS, FLUTTER_IGNORE_VARIABLES, FLUTTER_MUST_WHITE_CLASSES, analyzeDartClassLine, analyzeDartMethodLine, analyzeDartVariableLine, capitalize, deleteDartComments, deleteNotesInLine, firstRandomCode, generateClassName, generateMethodName, generateResourceName, generateVariableName, getFileMd5Value, hasSpecialString, isFlutterAudio, isFlutterImage, isFlutterVideo, isIgnoreImgPath, isNumberString, isXcodeUuid, lexiconWord, md5Hex, mustIgnorePath, normalizeFlutterOptions, obscureClassNameByMyRule, obscureMethodNameByMyRule, obscureResourceNameByMyRule, obscureVariableNameByMyRule, perturbResourceHash, randomCodeString, randomString, remapPbxprojUuids, renameFlutterSymbols, replaceClassNameInLine, replaceMethodNameInLine, replaceVariableNameInLine, rewriteDartResourceReferences, rewriteYamlResourceReferences, splitCamel };
3265
+
3266
+ //# sourceMappingURL=flutter.js.map