@ak--47/dungeon-master 1.0.0 → 1.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 (103) hide show
  1. package/README.md +7 -7
  2. package/dungeons/technical/ad-spend-schema.json +128 -0
  3. package/dungeons/technical/ad-spend.js +116 -0
  4. package/dungeons/technical/anonymous-users-schema.json +91 -0
  5. package/dungeons/technical/anonymous-users.js +102 -0
  6. package/dungeons/technical/array-of-object-lookup-schema.json +191 -0
  7. package/dungeons/{array-of-object-lookup.js → technical/array-of-object-lookup.js} +11 -4
  8. package/dungeons/technical/experiments-schema.json +197 -0
  9. package/dungeons/technical/experiments.js +168 -0
  10. package/dungeons/technical/foobar-schema.json +362 -0
  11. package/dungeons/{foobar.js → technical/foobar.js} +2 -2
  12. package/dungeons/technical/group-analytics-schema.json +149 -0
  13. package/dungeons/technical/group-analytics.js +151 -0
  14. package/dungeons/technical/mirror-strategies-schema.json +84 -0
  15. package/dungeons/technical/mirror-strategies.js +126 -0
  16. package/dungeons/technical/nested-objects-schema.json +145 -0
  17. package/dungeons/technical/nested-objects.js +207 -0
  18. package/dungeons/technical/retention-cadence-schema.json +37 -0
  19. package/dungeons/{retention-cadence.js → technical/retention-cadence.js} +1 -1
  20. package/dungeons/technical/sanity-schema.json +185 -0
  21. package/dungeons/{sanity.js → technical/sanity.js} +3 -2
  22. package/dungeons/technical/scale-test-schema.json +70 -0
  23. package/dungeons/technical/scale-test.js +90 -0
  24. package/dungeons/technical/scd-schema.json +270 -0
  25. package/dungeons/{scd.js → technical/scd.js} +19 -10
  26. package/dungeons/technical/simple-schema.json +278 -0
  27. package/dungeons/{simple.js → technical/simple.js} +6 -6
  28. package/dungeons/technical/simplest-schema.json +635 -0
  29. package/dungeons/{simplest.js → technical/simplest.js} +6 -6
  30. package/dungeons/technical/text-generation-schema.json +1059 -0
  31. package/dungeons/{text-generation.js → technical/text-generation.js} +23 -9
  32. package/dungeons/vertical/community-schema.json +557 -0
  33. package/dungeons/vertical/community.js +788 -0
  34. package/dungeons/vertical/devtools-schema.json +580 -0
  35. package/dungeons/vertical/devtools.js +837 -0
  36. package/dungeons/vertical/ecommerce-schema.json +586 -0
  37. package/dungeons/{ecommerce.js → vertical/ecommerce.js} +34 -3
  38. package/dungeons/vertical/education-schema.json +697 -0
  39. package/dungeons/{education.js → vertical/education.js} +54 -36
  40. package/dungeons/vertical/fintech-schema.json +563 -0
  41. package/dungeons/{fintech.js → vertical/fintech.js} +91 -53
  42. package/dungeons/vertical/fitness-schema.json +508 -0
  43. package/dungeons/vertical/fitness.js +802 -0
  44. package/dungeons/vertical/food-delivery-schema.json +678 -0
  45. package/dungeons/{food.js → vertical/food-delivery.js} +51 -23
  46. package/dungeons/vertical/gaming-schema.json +394 -0
  47. package/dungeons/{gaming.js → vertical/gaming.js} +9 -7
  48. package/dungeons/vertical/healthcare-schema.json +527 -0
  49. package/dungeons/vertical/healthcare.js +769 -0
  50. package/dungeons/vertical/insurance-application-schema.json +466 -0
  51. package/dungeons/{insurance-application.js → vertical/insurance-application.js} +33 -29
  52. package/dungeons/vertical/logistics-schema.json +552 -0
  53. package/dungeons/vertical/logistics.js +793 -0
  54. package/dungeons/vertical/marketplace-schema.json +511 -0
  55. package/dungeons/vertical/marketplace.js +844 -0
  56. package/dungeons/vertical/media-schema.json +787 -0
  57. package/dungeons/{media.js → vertical/media.js} +94 -16
  58. package/dungeons/vertical/rpg-schema.json +654 -0
  59. package/dungeons/{rpg.js → vertical/rpg.js} +78 -57
  60. package/dungeons/vertical/sass-schema.json +653 -0
  61. package/dungeons/{sass.js → vertical/sass.js} +49 -23
  62. package/dungeons/vertical/social-schema.json +552 -0
  63. package/dungeons/{social.js → vertical/social.js} +60 -14
  64. package/dungeons/vertical/travel-schema.json +558 -0
  65. package/dungeons/vertical/travel.js +736 -0
  66. package/index.js +19 -15
  67. package/lib/core/config-validator.js +286 -1
  68. package/lib/core/context.js +7 -5
  69. package/lib/generators/adspend.js +3 -3
  70. package/lib/generators/events.js +141 -14
  71. package/lib/generators/funnels.js +67 -7
  72. package/lib/generators/text.js +2 -2
  73. package/lib/orchestrators/user-loop.js +441 -22
  74. package/lib/templates/soup-presets.js +2 -2
  75. package/lib/utils/utils.js +4 -5
  76. package/package.json +4 -3
  77. package/scripts/dungeon-to-json.mjs +163 -0
  78. package/scripts/extract-dungeon-schema.mjs +297 -0
  79. package/scripts/json-to-dungeon.mjs +200 -0
  80. package/scripts/run-dungeon.mjs +76 -0
  81. package/scripts/run-many.mjs +118 -0
  82. package/scripts/verify-runner.mjs +42 -0
  83. package/types.d.ts +313 -1
  84. package/dungeons/array-of-object-lookup-schema.json +0 -327
  85. package/dungeons/ecommerce-schema.json +0 -462
  86. package/dungeons/education-schema.json +0 -2409
  87. package/dungeons/fintech-schema.json +0 -14034
  88. package/dungeons/foobar-schema.json +0 -403
  89. package/dungeons/food-delivery-schema.json +0 -192
  90. package/dungeons/food-delivery.js +0 -602
  91. package/dungeons/food-schema.json +0 -1152
  92. package/dungeons/gaming-schema.json +0 -1270
  93. package/dungeons/insurance-application-schema.json +0 -204
  94. package/dungeons/media-schema.json +0 -906
  95. package/dungeons/retention-cadence-schema.json +0 -78
  96. package/dungeons/rpg-schema.json +0 -4526
  97. package/dungeons/sanity-schema.json +0 -255
  98. package/dungeons/sass-schema.json +0 -1291
  99. package/dungeons/scd-schema.json +0 -919
  100. package/dungeons/simple-schema.json +0 -608
  101. package/dungeons/simplest-schema.json +0 -1418
  102. package/dungeons/social-schema.json +0 -1118
  103. package/dungeons/text-generation-schema.json +0 -3096
package/README.md CHANGED
@@ -44,16 +44,16 @@ the main export accepts multiple input formats. use whatever fits your workflow:
44
44
 
45
45
  ```javascript
46
46
  // load a dungeon file from disk
47
- const result = await DUNGEON_MASTER('./dungeons/simple.js');
47
+ const result = await DUNGEON_MASTER('./dungeons/technical/simple.js');
48
48
 
49
49
  // load a JSON dungeon (exported from the UI)
50
- const result = await DUNGEON_MASTER('./dungeons/simple-schema.json');
50
+ const result = await DUNGEON_MASTER('./dungeons/technical/simple-schema.json');
51
51
 
52
52
  // run multiple dungeons
53
53
  const results = await DUNGEON_MASTER([
54
- './dungeons/gaming.js',
55
- './dungeons/media.js',
56
- './dungeons/food-delivery.js'
54
+ './dungeons/vertical/gaming.js',
55
+ './dungeons/vertical/media.js',
56
+ './dungeons/vertical/food-delivery.js'
57
57
  ]);
58
58
 
59
59
  // pass raw javascript as a string
@@ -70,7 +70,7 @@ const result = await DUNGEON_MASTER(`
70
70
  `);
71
71
 
72
72
  // override any config when loading from files
73
- const result = await DUNGEON_MASTER('./dungeons/complex.js', {
73
+ const result = await DUNGEON_MASTER('./dungeons/vertical/fintech.js', {
74
74
  numUsers: 100, // shrink for testing
75
75
  writeToDisk: true,
76
76
  verbose: true
@@ -95,7 +95,7 @@ console.log(result.importResults);
95
95
 
96
96
  a dungeon is a javascript file that exports a configuration object. it defines your entire data model: events, funnels, user properties, group analytics, SCDs, and a hook function that engineers discoverable patterns into the data.
97
97
 
98
- see `dungeons/` for examples ranging from simple (5 events, no hooks) to complex (18 events, 8 funnels, 8 hooks with temporal windowing, closure state, and cross-table correlation).
98
+ see `dungeons/vertical/` for customer-facing story dungeons (18 events, 8 hooks) and `dungeons/technical/` for feature-testing dungeons (mirrors, groups, scale, anonymous users).
99
99
 
100
100
  ```javascript
101
101
  // dungeons/my-app.js
@@ -0,0 +1,128 @@
1
+ {
2
+ "events": [
3
+ {
4
+ "event": "sign up",
5
+ "isFirstEvent": true,
6
+ "properties": {
7
+ "method": [
8
+ "email",
9
+ "google",
10
+ "facebook",
11
+ "github"
12
+ ]
13
+ }
14
+ },
15
+ {
16
+ "event": "page view",
17
+ "weight": 10,
18
+ "properties": {
19
+ "page": [
20
+ "/",
21
+ "/pricing",
22
+ "/features",
23
+ "/docs",
24
+ "/blog",
25
+ "/signup"
26
+ ]
27
+ }
28
+ },
29
+ {
30
+ "event": "purchase",
31
+ "weight": 2,
32
+ "properties": {
33
+ "amount": {
34
+ "$range": [
35
+ 108,
36
+ 392
37
+ ]
38
+ },
39
+ "currency": [
40
+ "USD",
41
+ "EUR",
42
+ "GBP"
43
+ ],
44
+ "item_count": {
45
+ "$range": [
46
+ 2,
47
+ 7
48
+ ]
49
+ }
50
+ }
51
+ },
52
+ {
53
+ "event": "ad click",
54
+ "weight": 6,
55
+ "properties": {
56
+ "partner": [
57
+ "google",
58
+ "facebook",
59
+ "linkedin",
60
+ "twitter",
61
+ "bing",
62
+ "tiktok"
63
+ ],
64
+ "ad_format": [
65
+ "banner",
66
+ "video",
67
+ "carousel",
68
+ "native",
69
+ "search"
70
+ ],
71
+ "placement": [
72
+ "feed",
73
+ "sidebar",
74
+ "header",
75
+ "interstitial"
76
+ ]
77
+ }
78
+ },
79
+ {
80
+ "event": "search",
81
+ "weight": 5,
82
+ "properties": {
83
+ "query_length": {
84
+ "$range": [
85
+ 3,
86
+ 28
87
+ ]
88
+ },
89
+ "results_count": {
90
+ "$range": [
91
+ 21,
92
+ 79
93
+ ]
94
+ }
95
+ }
96
+ },
97
+ {
98
+ "event": "share",
99
+ "weight": 3,
100
+ "properties": {
101
+ "platform": [
102
+ "twitter",
103
+ "facebook",
104
+ "linkedin",
105
+ "email"
106
+ ],
107
+ "content_type": [
108
+ "product",
109
+ "page",
110
+ "deal"
111
+ ]
112
+ }
113
+ }
114
+ ],
115
+ "userProps": {
116
+ "plan": [
117
+ "free",
118
+ "starter",
119
+ "pro",
120
+ "enterprise"
121
+ ],
122
+ "signup_source": [
123
+ "referral",
124
+ "paid",
125
+ "organic"
126
+ ]
127
+ }
128
+ }
@@ -0,0 +1,116 @@
1
+ import Chance from 'chance';
2
+ let chance = new Chance();
3
+ import dayjs from "dayjs";
4
+ import utc from "dayjs/plugin/utc.js";
5
+ dayjs.extend(utc);
6
+ import { uid, comma } from 'ak-tools';
7
+ import { weighNumRange, date, integer, weighChoices } from "../../lib/utils/utils.js";
8
+
9
+ /**
10
+ * ═══════════════════════════════════════════════════════════════
11
+ * TECHNICAL TEST: Ad Spend & Campaign Attribution
12
+ * ═══════════════════════════════════════════════════════════════
13
+ *
14
+ * Tests Mixpanel ad spend data generation and campaign attribution.
15
+ * - 1,000 users, 50K events, 90 days
16
+ * - hasAdSpend: true — generates cost, CPC, CTR, impressions, clicks
17
+ * - hasCampaigns: true — adds UTM parameters to events
18
+ * - hasBrowser: true — required for campaign tracking
19
+ * - 6 events: signup, page view, purchase, ad click, search, share
20
+ *
21
+ * No hooks. Focus is on verifying ad spend event structure
22
+ * and campaign attribution properties flow through correctly.
23
+ */
24
+
25
+ /** @type {import('../../types').Dungeon} */
26
+ const config = {
27
+ seed: "ad spend test",
28
+ name: "ad-spend",
29
+ numDays: 90,
30
+ numEvents: 50_000,
31
+ numUsers: 1_000,
32
+ format: 'json',
33
+ region: "US",
34
+ hasAnonIds: true,
35
+ hasSessionIds: true,
36
+ hasAdSpend: true,
37
+ hasLocation: false,
38
+ hasAndroidDevices: false,
39
+ hasIOSDevices: false,
40
+ hasDesktopDevices: true,
41
+ hasBrowser: true,
42
+ hasCampaigns: true,
43
+ isAnonymous: false,
44
+ alsoInferFunnels: false,
45
+ concurrency: 1,
46
+ batchSize: 500_000,
47
+ writeToDisk: false,
48
+
49
+ events: [
50
+ {
51
+ event: "sign up",
52
+ weight: 1,
53
+ isFirstEvent: true,
54
+ properties: {
55
+ method: ["email", "google", "facebook", "github"],
56
+ }
57
+ },
58
+ {
59
+ event: "page view",
60
+ weight: 10,
61
+ properties: {
62
+ page: ["/", "/pricing", "/features", "/docs", "/blog", "/signup"],
63
+ }
64
+ },
65
+ {
66
+ event: "purchase",
67
+ weight: 2,
68
+ properties: {
69
+ amount: weighNumRange(10, 500, .25),
70
+ currency: ["USD", "EUR", "GBP"],
71
+ item_count: weighNumRange(1, 8),
72
+ }
73
+ },
74
+ {
75
+ event: "ad click",
76
+ weight: 6,
77
+ properties: {
78
+ partner: ["google", "facebook", "linkedin", "twitter", "bing", "tiktok"],
79
+ ad_format: ["banner", "video", "carousel", "native", "search"],
80
+ placement: ["feed", "sidebar", "header", "interstitial"],
81
+ }
82
+ },
83
+ {
84
+ event: "search",
85
+ weight: 5,
86
+ properties: {
87
+ query_length: weighNumRange(1, 30),
88
+ results_count: weighNumRange(0, 100, .25),
89
+ }
90
+ },
91
+ {
92
+ event: "share",
93
+ weight: 3,
94
+ properties: {
95
+ platform: ["twitter", "facebook", "linkedin", "email"],
96
+ content_type: ["product", "page", "deal"],
97
+ }
98
+ },
99
+ ],
100
+ funnels: [],
101
+ superProps: {},
102
+ userProps: {
103
+ plan: ["free", "starter", "pro", "enterprise"],
104
+ signup_source: ["organic", "organic", "organic", "paid", "paid", "referral"],
105
+ },
106
+ scdProps: {},
107
+ mirrorProps: {},
108
+ groupKeys: [],
109
+ groupProps: {},
110
+ lookupTables: [],
111
+ hook: function (record, type, meta) {
112
+ return record;
113
+ }
114
+ };
115
+
116
+ export default config;
@@ -0,0 +1,91 @@
1
+ {
2
+ "events": [
3
+ {
4
+ "event": "page view",
5
+ "weight": 10,
6
+ "properties": {
7
+ "page": [
8
+ "/features",
9
+ "/docs",
10
+ "/pricing",
11
+ "/blog"
12
+ ],
13
+ "referrer": [
14
+ "direct",
15
+ "google",
16
+ "twitter",
17
+ "linkedin"
18
+ ]
19
+ }
20
+ },
21
+ {
22
+ "event": "signup",
23
+ "isFirstEvent": true,
24
+ "properties": {
25
+ "method": [
26
+ "email",
27
+ "google",
28
+ "github",
29
+ "sso"
30
+ ]
31
+ }
32
+ },
33
+ {
34
+ "event": "feature used",
35
+ "weight": 7,
36
+ "properties": {
37
+ "feature": [
38
+ "dashboard",
39
+ "reports",
40
+ "settings",
41
+ "export",
42
+ "import",
43
+ "search"
44
+ ]
45
+ }
46
+ },
47
+ {
48
+ "event": "purchase",
49
+ "weight": 2,
50
+ "properties": {
51
+ "amount": {
52
+ "$range": [
53
+ 108,
54
+ 392
55
+ ]
56
+ },
57
+ "plan": [
58
+ "monthly",
59
+ "annual"
60
+ ]
61
+ }
62
+ },
63
+ {
64
+ "event": "button click",
65
+ "weight": 8,
66
+ "properties": {
67
+ "button": [
68
+ "cta",
69
+ "nav",
70
+ "menu",
71
+ "submit",
72
+ "cancel",
73
+ "back"
74
+ ],
75
+ "location": [
76
+ "header",
77
+ "body",
78
+ "footer",
79
+ "sidebar"
80
+ ]
81
+ }
82
+ }
83
+ ],
84
+ "userProps": {
85
+ "plan": [
86
+ "free",
87
+ "pro",
88
+ "enterprise"
89
+ ]
90
+ }
91
+ }
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Anonymous Users — tests anonymous user mode, anonIds, and identity merge.
3
+ *
4
+ * Exercises: isAnonymous mode, hasAnonIds for anonymous-to-identified
5
+ * user flows, long 180-day timespan for tail behavior.
6
+ *
7
+ * - 1000 users, 50K events, 180 days
8
+ * - isAnonymous: true, hasAnonIds: true
9
+ * - Simple events with signup as isFirstEvent (identity resolution point)
10
+ * - No hooks, minimal config
11
+ */
12
+
13
+ import Chance from 'chance';
14
+ let chance = new Chance();
15
+ import { weighNumRange, weighChoices } from "../../lib/utils/utils.js";
16
+
17
+ /** @type {import('../../types').Dungeon} */
18
+ const config = {
19
+ token: "",
20
+ seed: "anonymous-users",
21
+ numDays: 180,
22
+ numEvents: 50_000,
23
+ numUsers: 1_000,
24
+ format: "json",
25
+ region: "US",
26
+ isAnonymous: true,
27
+ hasAnonIds: true,
28
+ hasSessionIds: true,
29
+ hasAdSpend: false,
30
+ hasLocation: false,
31
+ hasAndroidDevices: true,
32
+ hasIOSDevices: true,
33
+ hasDesktopDevices: true,
34
+ hasBrowser: true,
35
+ hasCampaigns: false,
36
+ alsoInferFunnels: false,
37
+ concurrency: 1,
38
+ batchSize: 2_500_000,
39
+ writeToDisk: false,
40
+
41
+ events: [
42
+ {
43
+ event: "page view",
44
+ weight: 10,
45
+ properties: {
46
+ page: ["/", "/", "/features", "/pricing", "/docs", "/blog"],
47
+ referrer: weighChoices(["direct", "direct", "direct", "google", "google", "twitter", "linkedin"]),
48
+ }
49
+ },
50
+ {
51
+ event: "signup",
52
+ weight: 1,
53
+ isFirstEvent: true,
54
+ properties: {
55
+ method: ["email", "google", "github", "sso"],
56
+ }
57
+ },
58
+ {
59
+ event: "feature used",
60
+ weight: 7,
61
+ properties: {
62
+ feature: ["dashboard", "reports", "settings", "export", "import", "search"],
63
+ }
64
+ },
65
+ {
66
+ event: "purchase",
67
+ weight: 2,
68
+ properties: {
69
+ amount: weighNumRange(10, 500, .25),
70
+ plan: ["monthly", "annual"],
71
+ }
72
+ },
73
+ {
74
+ event: "button click",
75
+ weight: 8,
76
+ properties: {
77
+ button: ["cta", "nav", "menu", "submit", "cancel", "back"],
78
+ location: ["header", "body", "footer", "sidebar"],
79
+ }
80
+ },
81
+ ],
82
+
83
+ funnels: [],
84
+
85
+ superProps: {},
86
+
87
+ userProps: {
88
+ plan: weighChoices(["free", "free", "free", "pro", "pro", "enterprise"]),
89
+ },
90
+
91
+ scdProps: {},
92
+ mirrorProps: {},
93
+ groupKeys: [],
94
+ groupProps: {},
95
+ lookupTables: [],
96
+
97
+ hook: function (record, type, meta) {
98
+ return record;
99
+ }
100
+ };
101
+
102
+ export default config;
@@ -0,0 +1,191 @@
1
+ {
2
+ "events": [
3
+ {
4
+ "event": "checkout",
5
+ "weight": 2,
6
+ "properties": {
7
+ "currency": [
8
+ "USD",
9
+ "CAD",
10
+ "EUR",
11
+ "BTC",
12
+ "ETH",
13
+ "JPY"
14
+ ],
15
+ "coupon": [
16
+ "none",
17
+ "10%OFF",
18
+ "20%OFF",
19
+ "30%OFF",
20
+ "40%OFF",
21
+ "50%OFF"
22
+ ],
23
+ "cart": {
24
+ "$type": "object[]",
25
+ "$keys": [
26
+ "product_id",
27
+ "product_url"
28
+ ]
29
+ },
30
+ "discount_applied": [
31
+ false
32
+ ],
33
+ "discount_percent": [
34
+ 0
35
+ ],
36
+ "user_segment": [
37
+ "regular"
38
+ ]
39
+ }
40
+ },
41
+ {
42
+ "event": "add to cart",
43
+ "weight": 4,
44
+ "properties": {
45
+ "item": {
46
+ "$type": "object[]",
47
+ "$keys": [
48
+ "product_id",
49
+ "product_url"
50
+ ]
51
+ },
52
+ "user_segment": [
53
+ "regular"
54
+ ]
55
+ }
56
+ },
57
+ {
58
+ "event": "view item",
59
+ "weight": 8,
60
+ "properties": {
61
+ "item": {
62
+ "$type": "object[]",
63
+ "$keys": [
64
+ "product_id",
65
+ "product_url"
66
+ ]
67
+ },
68
+ "user_segment": [
69
+ "regular"
70
+ ]
71
+ }
72
+ },
73
+ {
74
+ "event": "save item",
75
+ "weight": 5,
76
+ "properties": {
77
+ "item": {
78
+ "$type": "object[]",
79
+ "$keys": [
80
+ "product_id",
81
+ "product_url"
82
+ ]
83
+ },
84
+ "save_context": [
85
+ "weekday_intent"
86
+ ],
87
+ "user_segment": [
88
+ "regular"
89
+ ]
90
+ }
91
+ }
92
+ ],
93
+ "superProps": {
94
+ "theme": [
95
+ "dark",
96
+ "light",
97
+ "custom"
98
+ ]
99
+ },
100
+ "userProps": {
101
+ "spiritAnimal": [
102
+ "duck",
103
+ "dog",
104
+ "otter",
105
+ "penguin",
106
+ "cat",
107
+ "elephant",
108
+ "lion",
109
+ "cheetah",
110
+ "giraffe",
111
+ "zebra",
112
+ "rhino",
113
+ "hippo",
114
+ "whale",
115
+ "dolphin",
116
+ "shark",
117
+ "octopus",
118
+ "squid",
119
+ "jellyfish",
120
+ "starfish",
121
+ "seahorse",
122
+ "crab",
123
+ "lobster",
124
+ "shrimp",
125
+ "clam",
126
+ "snail",
127
+ "slug",
128
+ "butterfly",
129
+ "moth",
130
+ "bee",
131
+ "wasp",
132
+ "ant",
133
+ "beetle",
134
+ "ladybug",
135
+ "caterpillar",
136
+ "centipede",
137
+ "millipede",
138
+ "scorpion",
139
+ "spider",
140
+ "tarantula",
141
+ "tick",
142
+ "mite",
143
+ "mosquito",
144
+ "fly",
145
+ "dragonfly",
146
+ "damselfly",
147
+ "grasshopper",
148
+ "cricket",
149
+ "locust",
150
+ "mantis",
151
+ "cockroach",
152
+ "termite",
153
+ "praying mantis",
154
+ "walking stick",
155
+ "stick bug",
156
+ "leaf insect",
157
+ "lacewing",
158
+ "aphid",
159
+ "cicada",
160
+ "thrips",
161
+ "psyllid",
162
+ "scale insect",
163
+ "whitefly",
164
+ "mealybug",
165
+ "planthopper",
166
+ "leafhopper",
167
+ "treehopper",
168
+ "flea",
169
+ "louse",
170
+ "bedbug",
171
+ "flea beetle",
172
+ "weevil",
173
+ "longhorn beetle",
174
+ "leaf beetle",
175
+ "tiger beetle",
176
+ "ground beetle",
177
+ "lady beetle",
178
+ "firefly",
179
+ "click beetle",
180
+ "rove beetle",
181
+ "scarab beetle",
182
+ "dung beetle",
183
+ "stag beetle",
184
+ "rhinoceros beetle",
185
+ "hercules beetle",
186
+ "goliath beetle",
187
+ "jewel beetle",
188
+ "tortoise beetle"
189
+ ]
190
+ }
191
+ }