logstash-filter-useragent 1.1.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 635e0d9c99d16e89f80e2636ff9fd490df621b4b
4
- data.tar.gz: a39b3167347dc9b389048584d6da3feb8b4658c3
3
+ metadata.gz: ddffeef64ae000e5b97809024ad24998c26332a6
4
+ data.tar.gz: fd389b27d85ce52bbae79719adfbcab77227d148
5
5
  SHA512:
6
- metadata.gz: 0667b4eb93b90c48c4466f1b2385907ecdeb21acec0fed7a3adaff3e2dd8d113ad9cfb857fc1957b0592202e9279e35f34d27832331125303369919965a21d37
7
- data.tar.gz: 493a091f47bff9eb965af0fc46e58b3936558c61bf2a2f7c5c400225fbc71e7ed833ed75fa05848da941e9514cba7d33080e33a8b1d4bb2b26ab6b33d0910085
6
+ metadata.gz: 93146ffee40b0608fd60e4e22cee78211537d6a3ee449f4d558ef0a21343119d73b788f49dba86dc58c4bb8e3f87934f146774cb53b8ecffba901a1a2f07455e
7
+ data.tar.gz: 5bbf9f638160972f0eff16b50fd0e0063277381f1f58e75e0e7be390dbeeb3f764b92067f4bb7cccc2a99cd83a6c7abc08390ae25d731438d3288e744040c6a0
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
 
3
3
  s.name = 'logstash-filter-useragent'
4
- s.version = '1.1.0'
4
+ s.version = '2.0.0'
5
5
  s.licenses = ['Apache License (2.0)']
6
6
  s.summary = "Parse user agent strings into structured data based on BrowserScope data"
7
7
  s.description = "This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not a stand-alone program"
@@ -20,7 +20,7 @@ Gem::Specification.new do |s|
20
20
  s.metadata = { "logstash_plugin" => "true", "logstash_group" => "filter" }
21
21
 
22
22
  # Gem dependencies
23
- s.add_runtime_dependency "logstash-core", '>= 1.4.0', '< 2.0.0'
23
+ s.add_runtime_dependency "logstash-core", "~> 2.0.0.snapshot"
24
24
 
25
25
  s.add_runtime_dependency 'user_agent_parser', ['>= 2.0.0']
26
26
  s.add_runtime_dependency 'lru_redux', "~> 1.1.0"
@@ -0,0 +1,1335 @@
1
+ user_agent_parsers:
2
+ #### SPECIAL CASES TOP ####
3
+
4
+ # HbbTV standard defines what features the browser should understand.
5
+ # but it's like targeting "HTML5 browsers", effective browser support depends on the model
6
+ # See os_parsers if you want to target a specific TV
7
+ - regex: '(HbbTV)/(\d+)\.(\d+)\.(\d+) \('
8
+
9
+ # must go before Firefox to catch Chimera/SeaMonkey/Camino
10
+ - regex: '(Chimera|SeaMonkey|Camino)/(\d+)\.(\d+)\.?([ab]?\d+[a-z]*)?'
11
+
12
+ # Firefox
13
+ - regex: '(Pale[Mm]oon)/(\d+)\.(\d+)\.?(\d+)?'
14
+ family_replacement: 'Pale Moon (Firefox Variant)'
15
+ - regex: '(Fennec)/(\d+)\.(\d+)\.?([ab]?\d+[a-z]*)'
16
+ family_replacement: 'Firefox Mobile'
17
+ - regex: '(Fennec)/(\d+)\.(\d+)(pre)'
18
+ family_replacement: 'Firefox Mobile'
19
+ - regex: '(Fennec)/(\d+)\.(\d+)'
20
+ family_replacement: 'Firefox Mobile'
21
+ - regex: 'Mobile.*(Firefox)/(\d+)\.(\d+)'
22
+ family_replacement: 'Firefox Mobile'
23
+ - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)\.(\d+(?:pre)?)'
24
+ family_replacement: 'Firefox ($1)'
25
+ - regex: '(Firefox)/(\d+)\.(\d+)(a\d+[a-z]*)'
26
+ family_replacement: 'Firefox Alpha'
27
+ - regex: '(Firefox)/(\d+)\.(\d+)(b\d+[a-z]*)'
28
+ family_replacement: 'Firefox Beta'
29
+ - regex: '(Firefox)-(?:\d+\.\d+)?/(\d+)\.(\d+)(a\d+[a-z]*)'
30
+ family_replacement: 'Firefox Alpha'
31
+ - regex: '(Firefox)-(?:\d+\.\d+)?/(\d+)\.(\d+)(b\d+[a-z]*)'
32
+ family_replacement: 'Firefox Beta'
33
+ - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)([ab]\d+[a-z]*)?'
34
+ family_replacement: 'Firefox ($1)'
35
+ - regex: '(Firefox).*Tablet browser (\d+)\.(\d+)\.(\d+)'
36
+ family_replacement: 'MicroB'
37
+ - regex: '(MozillaDeveloperPreview)/(\d+)\.(\d+)([ab]\d+[a-z]*)?'
38
+
39
+ # e.g.: Flock/2.0b2
40
+ - regex: '(Flock)/(\d+)\.(\d+)(b\d+?)'
41
+
42
+ # RockMelt
43
+ - regex: '(RockMelt)/(\d+)\.(\d+)\.(\d+)'
44
+
45
+ # e.g.: Fennec/0.9pre
46
+ - regex: '(Navigator)/(\d+)\.(\d+)\.(\d+)'
47
+ family_replacement: 'Netscape'
48
+
49
+ - regex: '(Navigator)/(\d+)\.(\d+)([ab]\d+)'
50
+ family_replacement: 'Netscape'
51
+
52
+ - regex: '(Netscape6)/(\d+)\.(\d+)\.?([ab]?\d+)?'
53
+ family_replacement: 'Netscape'
54
+
55
+ - regex: '(MyIBrow)/(\d+)\.(\d+)'
56
+ family_replacement: 'My Internet Browser'
57
+
58
+ # Opera will stop at 9.80 and hide the real version in the Version string.
59
+ # see: http://dev.opera.com/articles/view/opera-ua-string-changes/
60
+ - regex: '(Opera Tablet).*Version/(\d+)\.(\d+)(?:\.(\d+))?'
61
+ - regex: '(Opera)/.+Opera Mobi.+Version/(\d+)\.(\d+)'
62
+ family_replacement: 'Opera Mobile'
63
+ - regex: '(Opera)/(\d+)\.(\d+).+Opera Mobi'
64
+ family_replacement: 'Opera Mobile'
65
+ - regex: 'Opera Mobi.+(Opera)(?:/|\s+)(\d+)\.(\d+)'
66
+ family_replacement: 'Opera Mobile'
67
+ - regex: 'Opera Mobi'
68
+ family_replacement: 'Opera Mobile'
69
+ - regex: '(Opera Mini)(?:/att)?/(\d+)\.(\d+)'
70
+ - regex: '(Opera)/9.80.*Version/(\d+)\.(\d+)(?:\.(\d+))?'
71
+
72
+ # Opera 14 for Android uses a WebKit render engine.
73
+ - regex: '(?:Mobile Safari).*(OPR)/(\d+)\.(\d+)\.(\d+)'
74
+ family_replacement: 'Opera Mobile'
75
+
76
+ # Opera 15 for Desktop is similar to Chrome but includes an "OPR" Version string.
77
+ - regex: '(?:Chrome).*(OPR)/(\d+)\.(\d+)\.(\d+)'
78
+ family_replacement: 'Opera'
79
+
80
+ # Palm WebOS looks a lot like Safari.
81
+ - regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+))?'
82
+ family_replacement: 'webOS Browser'
83
+
84
+ # LuaKit has no version info.
85
+ # http://luakit.org/projects/luakit/
86
+ - regex: '(luakit)'
87
+ family_replacement: 'LuaKit'
88
+
89
+ # Snowshoe
90
+ - regex: '(Snowshoe)/(\d+)\.(\d+).(\d+)'
91
+
92
+ # Lightning (for Thunderbird)
93
+ # http://www.mozilla.org/projects/calendar/lightning/
94
+ - regex: '(Lightning)/(\d+)\.(\d+)\.?((?:[ab]?\d+[a-z]*)|(?:\d*))'
95
+
96
+ # Swiftfox
97
+ - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+(?:pre)?) \(Swiftfox\)'
98
+ family_replacement: 'Swiftfox'
99
+ - regex: '(Firefox)/(\d+)\.(\d+)([ab]\d+[a-z]*)? \(Swiftfox\)'
100
+ family_replacement: 'Swiftfox'
101
+
102
+ # Rekonq
103
+ - regex: '(rekonq)/(\d+)\.(\d+)\.?(\d+)? Safari'
104
+ family_replacement: 'Rekonq'
105
+ - regex: 'rekonq'
106
+ family_replacement: 'Rekonq'
107
+
108
+ # Conkeror lowercase/uppercase
109
+ # http://conkeror.org/
110
+ - regex: '(conkeror|Conkeror)/(\d+)\.(\d+)\.?(\d+)?'
111
+ family_replacement: 'Conkeror'
112
+
113
+ # catches lower case konqueror
114
+ - regex: '(konqueror)/(\d+)\.(\d+)\.(\d+)'
115
+ family_replacement: 'Konqueror'
116
+
117
+ - regex: '(WeTab)-Browser'
118
+
119
+ - regex: '(Comodo_Dragon)/(\d+)\.(\d+)\.(\d+)'
120
+ family_replacement: 'Comodo Dragon'
121
+
122
+ # Bots
123
+ - regex: '(YottaaMonitor|BrowserMob|HttpMonitor|YandexBot|Slurp|BingPreview|PagePeeker|ThumbShotsBot|WebThumb|URL2PNG|ZooShot|GomezA|Catchpoint bot|Willow Internet Crawler|Google SketchUp|Read%20Later)'
124
+
125
+ - regex: '(Symphony) (\d+).(\d+)'
126
+
127
+ - regex: '(Minimo)'
128
+
129
+ - regex: 'PLAYSTATION 3.+WebKit'
130
+ family_replacement: 'NetFront NX'
131
+ - regex: 'PLAYSTATION 3'
132
+ family_replacement: 'NetFront'
133
+ - regex: '(PlayStation Portable)'
134
+ family_replacement: 'NetFront'
135
+ - regex: '(PlayStation Vita)'
136
+ family_replacement: 'NetFront NX'
137
+
138
+ - regex: 'AppleWebKit.+ (NX)/(\d+)\.(\d+)\.(\d+)'
139
+ family_replacement: 'NetFront NX'
140
+ - regex: '(Nintendo 3DS)'
141
+ family_replacement: 'NetFront NX'
142
+
143
+ # Amazon Silk, should go before Safari and Chrome Mobile
144
+ - regex: '(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+))?'
145
+ family_replacement: 'Amazon Silk'
146
+
147
+
148
+ # @ref: http://www.puffinbrowser.com
149
+ - regex: '(Puffin)/(\d+)\.(\d+)(?:\.(\d+))?'
150
+
151
+ # Chrome Mobile
152
+ - regex: '(CrMo)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
153
+ family_replacement: 'Chrome Mobile'
154
+ - regex: '(CriOS)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
155
+ family_replacement: 'Chrome Mobile iOS'
156
+ - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+) Mobile'
157
+ family_replacement: 'Chrome Mobile'
158
+
159
+ # Chrome Frame must come before MSIE.
160
+ - regex: '(chromeframe)/(\d+)\.(\d+)\.(\d+)'
161
+ family_replacement: 'Chrome Frame'
162
+
163
+ # UC Browser
164
+ - regex: '(UCBrowser)[ /](\d+)\.(\d+)\.(\d+)'
165
+ family_replacement: 'UC Browser'
166
+ - regex: '(UC Browser)[ /](\d+)\.(\d+)\.(\d+)'
167
+ - regex: '(UC Browser|UCBrowser|UCWEB)(\d+)\.(\d+)\.(\d+)'
168
+ family_replacement: 'UC Browser'
169
+
170
+ # Tizen Browser (second case included in browser/major.minor regex)
171
+ - regex: '(SLP Browser)/(\d+)\.(\d+)'
172
+ family_replacement: 'Tizen Browser'
173
+
174
+ # Sogou Explorer 2.X
175
+ - regex: '(SE 2\.X) MetaSr (\d+)\.(\d+)'
176
+ family_replacement: 'Sogou Explorer'
177
+
178
+ # Baidu Browsers (desktop spoofs chrome & IE, explorer is mobile)
179
+ - regex: '(baidubrowser)[/\s](\d+)'
180
+ family_replacement: 'Baidu Browser'
181
+ - regex: '(FlyFlow)/(\d+)\.(\d+)'
182
+ family_replacement: 'Baidu Explorer'
183
+
184
+ # QQ Browsers
185
+ - regex: '(MQQBrowser/Mini)(?:(\d+)(?:\.(\d+)(?:\.(\d+))?)?)?'
186
+ family_replacement: 'QQ Browser Mini'
187
+ - regex: '(MQQBrowser)(?:/(\d+)(?:\.(\d+)(?:\.(\d+))?)?)?'
188
+ family_replacement: 'QQ Browser Mobile'
189
+ - regex: '(QQBrowser)(?:/(\d+)(?:\.(\d+)\.(\d+)(?:\.(\d+))?)?)?'
190
+ family_replacement: 'QQ Browser'
191
+
192
+ # Pingdom
193
+ - regex: '(Pingdom.com_bot_version_)(\d+)\.(\d+)'
194
+ family_replacement: 'PingdomBot'
195
+
196
+ # Facebook
197
+ - regex: '(facebookexternalhit)/(\d+)\.(\d+)'
198
+ family_replacement: 'FacebookBot'
199
+
200
+ # LinkedIn
201
+ - regex: '(LinkedInBot)/(\d+)\.(\d+)'
202
+ family_replacement: 'LinkedInBot'
203
+
204
+ # Twitterbot
205
+ - regex: '(Twitterbot)/(\d+)\.(\d+)'
206
+ family_replacement: 'TwitterBot'
207
+
208
+ # Google Plus
209
+ - regex: 'Google.*/\+/web/snippet'
210
+ family_replacement: 'GooglePlusBot'
211
+
212
+ # Rackspace Monitoring
213
+ - regex: '(Rackspace Monitoring)/(\d+)\.(\d+)'
214
+ family_replacement: 'RackspaceBot'
215
+
216
+ # PyAMF
217
+ - regex: '(PyAMF)/(\d+)\.(\d+)\.(\d+)'
218
+
219
+ # Yandex Browser
220
+ - regex: '(YaBrowser)/(\d+)\.(\d+)\.(\d+)'
221
+ family_replacement: 'Yandex Browser'
222
+
223
+ # Mail.ru Amigo/Internet Browser (Chromium-based)
224
+ - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+).* MRCHROME'
225
+ family_replacement: 'Mail.ru Chromium Browser'
226
+
227
+ # AOL Browser (IE-based)
228
+ - regex: '(AOL) (\d+)\.(\d+); AOLBuild (\d+)'
229
+
230
+ #### END SPECIAL CASES TOP ####
231
+
232
+ #### MAIN CASES - this catches > 50% of all browsers ####
233
+
234
+ # Browser/major_version.minor_version.beta_version
235
+ - regex: '(AdobeAIR|FireWeb|Jasmine|ANTGalio|Midori|Fresco|Lobo|PaleMoon|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Epiphany|Shiira|Sunrise|Flock|Netscape|Lunascape|WebPilot|NetFront|Netfront|Konqueror|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|Opera Mini|iCab|NetNewsWire|ThunderBrowse|Iris|UP\.Browser|Bunjalloo|Google Earth|Raven for Mac|Openwave)/(\d+)\.(\d+)\.(\d+)'
236
+
237
+ # Outlook 2007
238
+ - regex: 'MSOffice 12'
239
+ family_replacement: 'Outlook'
240
+ v1_replacement: '2007'
241
+
242
+ # Outlook 2010
243
+ - regex: 'MSOffice 14'
244
+ family_replacement: 'Outlook'
245
+ v1_replacement: '2010'
246
+
247
+ # Outlook 2013
248
+ - regex: 'Microsoft Outlook 15\.\d+\.\d+'
249
+ family_replacement: 'Outlook'
250
+ v1_replacement: '2013'
251
+
252
+ # Apple Air Mail
253
+ - regex: '(Airmail) (\d+)\.(\d+)(?:\.(\d+))?'
254
+
255
+ # Thunderbird
256
+ - regex: '(Thunderbird)/(\d+)\.(\d+)\.(\d+(?:pre)?)'
257
+ family_replacement: 'Thunderbird'
258
+
259
+ # Chrome/Chromium/major_version.minor_version.beta_version
260
+ - regex: '(Chromium|Chrome)/(\d+)\.(\d+)\.(\d+)'
261
+
262
+ # Dolphin Browser
263
+ # @ref: http://www.dolphin.com
264
+ - regex: '\b(Dolphin)(?: |HDCN/|/INT\-)(\d+)\.(\d+)\.?(\d+)?'
265
+
266
+ # Browser/major_version.minor_version
267
+ - regex: '(bingbot|Bolt|Jasmine|IceCat|Skyfire|Midori|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Chrome|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera Mini|Opera|NetFront|Netfront|Konqueror|Googlebot|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|iCab|NetNewsWire|Space Bison|Stainless|Orca|Dolfin|BOLT|Minimo|Tizen Browser|Polaris|Abrowser|Planetweb|ICE Browser|mDolphin)/(\d+)\.(\d+)\.?(\d+)?'
268
+
269
+ # Chrome/Chromium/major_version.minor_version
270
+ - regex: '(Chromium|Chrome)/(\d+)\.(\d+)'
271
+
272
+ ##########
273
+ # IE Mobile needs to happen before Android to catch cases such as:
274
+ # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920)...
275
+ # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920; ANZ821)...
276
+ # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920; Orange)...
277
+ # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920; Vodafone)...
278
+ ##########
279
+
280
+ # IE Mobile
281
+ - regex: '(IEMobile)[ /](\d+)\.(\d+)'
282
+ family_replacement: 'IE Mobile'
283
+
284
+ # Browser major_version.minor_version.beta_version (space instead of slash)
285
+ - regex: '(iRider|Crazy Browser|SkipStone|iCab|Lunascape|Sleipnir|Maemo Browser) (\d+)\.(\d+)\.(\d+)'
286
+ # Browser major_version.minor_version (space instead of slash)
287
+ - regex: '(iCab|Lunascape|Opera|Android|Jasmine|Polaris) (\d+)\.(\d+)\.?(\d+)?'
288
+
289
+ # Kindle WebKit
290
+ - regex: '(Kindle)/(\d+)\.(\d+)'
291
+
292
+ # weird android UAs
293
+ - regex: '(Android) Donut'
294
+ v1_replacement: '1'
295
+ v2_replacement: '2'
296
+
297
+ - regex: '(Android) Eclair'
298
+ v1_replacement: '2'
299
+ v2_replacement: '1'
300
+
301
+ - regex: '(Android) Froyo'
302
+ v1_replacement: '2'
303
+ v2_replacement: '2'
304
+
305
+ - regex: '(Android) Gingerbread'
306
+ v1_replacement: '2'
307
+ v2_replacement: '3'
308
+
309
+ - regex: '(Android) Honeycomb'
310
+ v1_replacement: '3'
311
+
312
+ # desktop mode
313
+ # http://www.anandtech.com/show/3982/windows-phone-7-review
314
+ - regex: '(MSIE) (\d+)\.(\d+).*XBLWP7'
315
+ family_replacement: 'IE Large Screen'
316
+
317
+ #### END MAIN CASES ####
318
+
319
+ #### SPECIAL CASES ####
320
+ - regex: '(Obigo)InternetBrowser'
321
+ - regex: '(Obigo)\-Browser'
322
+ - regex: '(Obigo|OBIGO)[^\d]*(\d+)(?:.(\d+))?'
323
+ family_replacement: 'Obigo'
324
+
325
+ - regex: '(MAXTHON|Maxthon) (\d+)\.(\d+)'
326
+ family_replacement: 'Maxthon'
327
+ - regex: '(Maxthon|MyIE2|Uzbl|Shiira)'
328
+ v1_replacement: '0'
329
+
330
+ - regex: '(BrowseX) \((\d+)\.(\d+)\.(\d+)'
331
+
332
+ - regex: '(NCSA_Mosaic)/(\d+)\.(\d+)'
333
+ family_replacement: 'NCSA Mosaic'
334
+
335
+ # Polaris/d.d is above
336
+ - regex: '(POLARIS)/(\d+)\.(\d+)'
337
+ family_replacement: 'Polaris'
338
+ - regex: '(Embider)/(\d+)\.(\d+)'
339
+ family_replacement: 'Polaris'
340
+
341
+ - regex: '(BonEcho)/(\d+)\.(\d+)\.?([ab]?\d+)?'
342
+ family_replacement: 'Bon Echo'
343
+
344
+ # @note: iOS / OSX Applications
345
+ - regex: '(CFNetwork)(?:/(\d+)\.(\d+)\.?(\d+)?)?'
346
+ family_replacement: 'CFNetwork'
347
+
348
+ - regex: '(iPod).+Version/(\d+)\.(\d+)\.(\d+)'
349
+ family_replacement: 'Mobile Safari'
350
+ - regex: '(iPod).*Version/(\d+)\.(\d+)'
351
+ family_replacement: 'Mobile Safari'
352
+ - regex: '(iPhone).*Version/(\d+)\.(\d+)\.(\d+)'
353
+ family_replacement: 'Mobile Safari'
354
+ - regex: '(iPhone).*Version/(\d+)\.(\d+)'
355
+ family_replacement: 'Mobile Safari'
356
+ - regex: '(iPad).*Version/(\d+)\.(\d+)\.(\d+)'
357
+ family_replacement: 'Mobile Safari'
358
+ - regex: '(iPad).*Version/(\d+)\.(\d+)'
359
+ family_replacement: 'Mobile Safari'
360
+ - regex: '(iPod|iPhone|iPad);.*CPU.*OS (\d+)_(\d+)(?:_(\d+))?.*Mobile'
361
+ family_replacement: 'Mobile Safari'
362
+ - regex: '(iPod|iPhone|iPad)'
363
+ family_replacement: 'Mobile Safari'
364
+
365
+ - regex: '(AvantGo) (\d+).(\d+)'
366
+
367
+ - regex: '(OneBrowser)/(\d+).(\d+)'
368
+ family_replacement: 'ONE Browser'
369
+
370
+ - regex: '(Avant)'
371
+ v1_replacement: '1'
372
+
373
+ # This is the Tesla Model S (see similar entry in device parsers)
374
+ - regex: '(QtCarBrowser)'
375
+ v1_replacement: '1'
376
+
377
+ - regex: '^(iBrowser/Mini)(\d+).(\d+)'
378
+ family_replacement: 'iBrowser Mini'
379
+ - regex: '^(iBrowser|iRAPP)/(\d+).(\d+)'
380
+
381
+ # nokia browsers
382
+ # based on: http://www.developer.nokia.com/Community/Wiki/User-Agent_headers_for_Nokia_devices
383
+ - regex: '^(Nokia)'
384
+ family_replacement: 'Nokia Services (WAP) Browser'
385
+ - regex: '(NokiaBrowser)/(\d+)\.(\d+).(\d+)\.(\d+)'
386
+ family_replacement: 'Nokia Browser'
387
+ - regex: '(NokiaBrowser)/(\d+)\.(\d+).(\d+)'
388
+ family_replacement: 'Nokia Browser'
389
+ - regex: '(NokiaBrowser)/(\d+)\.(\d+)'
390
+ family_replacement: 'Nokia Browser'
391
+ - regex: '(BrowserNG)/(\d+)\.(\d+).(\d+)'
392
+ family_replacement: 'Nokia Browser'
393
+ - regex: '(Series60)/5\.0'
394
+ family_replacement: 'Nokia Browser'
395
+ v1_replacement: '7'
396
+ v2_replacement: '0'
397
+ - regex: '(Series60)/(\d+)\.(\d+)'
398
+ family_replacement: 'Nokia OSS Browser'
399
+ - regex: '(S40OviBrowser)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
400
+ family_replacement: 'Ovi Browser'
401
+ - regex: '(Nokia)[EN]?(\d+)'
402
+
403
+ # BlackBerry devices
404
+ - regex: '(BB10);'
405
+ family_replacement: 'BlackBerry WebKit'
406
+ - regex: '(PlayBook).+RIM Tablet OS (\d+)\.(\d+)\.(\d+)'
407
+ family_replacement: 'BlackBerry WebKit'
408
+ - regex: '(Black[bB]erry).+Version/(\d+)\.(\d+)\.(\d+)'
409
+ family_replacement: 'BlackBerry WebKit'
410
+ - regex: '(Black[bB]erry)\s?(\d+)'
411
+ family_replacement: 'BlackBerry'
412
+
413
+ - regex: '(OmniWeb)/v(\d+)\.(\d+)'
414
+
415
+ - regex: '(Blazer)/(\d+)\.(\d+)'
416
+ family_replacement: 'Palm Blazer'
417
+
418
+ - regex: '(Pre)/(\d+)\.(\d+)'
419
+ family_replacement: 'Palm Pre'
420
+
421
+ # fork of Links
422
+ - regex: '(ELinks)/(\d+)\.(\d+)'
423
+ - regex: '(ELinks) \((\d+)\.(\d+)'
424
+ - regex: '(Links) \((\d+)\.(\d+)'
425
+
426
+ - regex: '(QtWeb) Internet Browser/(\d+)\.(\d+)'
427
+
428
+ #- regex: '\(iPad;.+(Version)/(\d+)\.(\d+)(?:\.(\d+))?.*Safari/'
429
+ # family_replacement: 'iPad'
430
+
431
+ # Phantomjs, should go before Safari
432
+ - regex: '(PhantomJS)/(\d+)\.(\d+)\.(\d+)'
433
+
434
+ # WebKit Nightly
435
+ - regex: '(AppleWebKit)/(\d+)\.?(\d+)?\+ .* Safari'
436
+ family_replacement: 'WebKit Nightly'
437
+
438
+ # Safari
439
+ - regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+))?.*Safari/'
440
+ family_replacement: 'Safari'
441
+ # Safari didn't provide "Version/d.d.d" prior to 3.0
442
+ - regex: '(Safari)/\d+'
443
+
444
+ - regex: '(OLPC)/Update(\d+)\.(\d+)'
445
+
446
+ - regex: '(OLPC)/Update()\.(\d+)'
447
+ v1_replacement: '0'
448
+
449
+ - regex: '(SEMC\-Browser)/(\d+)\.(\d+)'
450
+
451
+ - regex: '(Teleca)'
452
+ family_replacement: 'Teleca Browser'
453
+
454
+ - regex: '(Phantom)/V(\d+)\.(\d+)'
455
+ family_replacement: 'Phantom Browser'
456
+
457
+ - regex: 'Trident(.*)rv.(\d+)\.(\d+)'
458
+ family_replacement: 'IE'
459
+
460
+ # Espial
461
+ - regex: '(Espial)/(\d+)(?:\.(\d+))?(?:\.(\d+))?'
462
+
463
+ # Apple Mail
464
+
465
+ # apple mail - not directly detectable, have it after Safari stuff
466
+ - regex: '(AppleWebKit)/(\d+)\.(\d+)\.(\d+)'
467
+ family_replacement: 'AppleMail'
468
+
469
+ # AFTER THE EDGE CASES ABOVE!
470
+ # AFTER IE11
471
+ # BEFORE all other IE
472
+ - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+)'
473
+ - regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*)?'
474
+
475
+ - regex: '([MS]?IE) (\d+)\.(\d+)'
476
+ family_replacement: 'IE'
477
+
478
+ - regex: '(python-requests)/(\d+)\.(\d+)'
479
+ family_replacement: 'Python Requests'
480
+
481
+ os_parsers:
482
+ ##########
483
+ # HbbTV vendors
484
+ ##########
485
+
486
+ # starts with the easy one : Panasonic seems consistent across years, hope it will continue
487
+ #HbbTV/1.1.1 (;Panasonic;VIERA 2011;f.532;0071-0802 2000-0000;)
488
+ #HbbTV/1.1.1 (;Panasonic;VIERA 2012;1.261;0071-3103 2000-0000;)
489
+ #HbbTV/1.2.1 (;Panasonic;VIERA 2013;3.672;4101-0003 0002-0000;)
490
+ #- regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Panasonic);VIERA ([0-9]{4});'
491
+
492
+ # Sony is consistent too but do not place year like the other
493
+ # Opera/9.80 (Linux armv7l; HbbTV/1.1.1 (; Sony; KDL32W650A; PKG3.211EUA; 2013;); ) Presto/2.12.362 Version/12.11
494
+ # Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Sony; KDL40HX751; PKG1.902EUA; 2012;);; en) Presto/2.10.250 Version/11.60
495
+ # Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Sony; KDL22EX320; PKG4.017EUA; 2011;);; en) Presto/2.7.61 Version/11.00
496
+ #- regex: 'HbbTV/\d+\.\d+\.\d+ \(; (Sony);.*;.*; ([0-9]{4});\)'
497
+
498
+
499
+ # LG is consistent too, but we need to add manually the year model
500
+ #Mozilla/5.0 (Unknown; Linux armv7l) AppleWebKit/537.1+ (KHTML, like Gecko) Safari/537.1+ HbbTV/1.1.1 ( ;LGE ;NetCast 4.0 ;03.20.30 ;1.0M ;)
501
+ #Mozilla/5.0 (DirectFB; Linux armv7l) AppleWebKit/534.26+ (KHTML, like Gecko) Version/5.0 Safari/534.26+ HbbTV/1.1.1 ( ;LGE ;NetCast 3.0 ;1.0 ;1.0M ;)
502
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \( ;(LG)E ;NetCast 4.0'
503
+ os_v1_replacement: '2013'
504
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \( ;(LG)E ;NetCast 3.0'
505
+ os_v1_replacement: '2012'
506
+
507
+ # Samsung is on its way of normalizing their user-agent
508
+ # HbbTV/1.1.1 (;Samsung;SmartTV2013;T-FXPDEUC-1102.2;;) WebKit
509
+ # HbbTV/1.1.1 (;Samsung;SmartTV2013;T-MST12DEUC-1102.1;;) WebKit
510
+ # HbbTV/1.1.1 (;Samsung;SmartTV2012;;;) WebKit
511
+ # HbbTV/1.1.1 (;;;;;) Maple_2011
512
+ - regex: 'HbbTV/1.1.1 \(;;;;;\) Maple_2011'
513
+ os_replacement: 'Samsung'
514
+ os_v1_replacement: '2011'
515
+ # manage the two models of 2013
516
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.*FXPDEUC'
517
+ os_v2_replacement: 'UE40F7000'
518
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.*MST12DEUC'
519
+ os_v2_replacement: 'UE32F4500'
520
+ # generic Samsung (works starting in 2012)
521
+ #- regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});'
522
+
523
+ # Philips : not found any other way than a manual mapping
524
+ # Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/4.1.3 PHILIPSTV/1.1.1; en) Presto/2.10.250 Version/11.60
525
+ # Opera/9.80 (Linux mips ; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/3.2.1; en) Presto/2.6.33 Version/10.70
526
+ - regex: 'HbbTV/1.1.1 \(; (Philips);.*NETTV/4'
527
+ os_v1_replacement: '2013'
528
+ - regex: 'HbbTV/1.1.1 \(; (Philips);.*NETTV/3'
529
+ os_v1_replacement: '2012'
530
+ - regex: 'HbbTV/1.1.1 \(; (Philips);.*NETTV/2'
531
+ os_v1_replacement: '2011'
532
+
533
+ # the HbbTV emulator developers use HbbTV/1.1.1 (;;;;;) firetv-firefox-plugin 1.1.20
534
+ - regex: 'HbbTV/\d+\.\d+\.\d+.*(firetv)-firefox-plugin (\d+).(\d+).(\d+)'
535
+ os_replacement: 'FireHbbTV'
536
+
537
+ # generic HbbTV, hoping to catch manufacturer name (always after 2nd comma) and the first string that looks like a 2011-2019 year
538
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \(.*; ?([a-zA-Z]+) ?;.*(201[1-9]).*\)'
539
+
540
+ ##########
541
+ # @note: Windows Phone needs to come before Windows NT 6.1 *and* before Android to catch cases such as:
542
+ # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920)...
543
+ # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920; ANZ821)...
544
+ # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920; Orange)...
545
+ # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920; Vodafone)...
546
+ ##########
547
+
548
+ - regex: '(Windows Phone) (?:OS[ /])?(\d+)\.(\d+)'
549
+
550
+ ##########
551
+ # Android
552
+ # can actually detect rooted android os. do we care?
553
+ ##########
554
+ - regex: '(Android)[ \-/](\d+)\.(\d+)(?:[.\-]([a-z0-9]+))?'
555
+
556
+ - regex: '(Android) Donut'
557
+ os_v1_replacement: '1'
558
+ os_v2_replacement: '2'
559
+
560
+ - regex: '(Android) Eclair'
561
+ os_v1_replacement: '2'
562
+ os_v2_replacement: '1'
563
+
564
+ - regex: '(Android) Froyo'
565
+ os_v1_replacement: '2'
566
+ os_v2_replacement: '2'
567
+
568
+ - regex: '(Android) Gingerbread'
569
+ os_v1_replacement: '2'
570
+ os_v2_replacement: '3'
571
+
572
+ - regex: '(Android) Honeycomb'
573
+ os_v1_replacement: '3'
574
+
575
+ # UCWEB
576
+ - regex: '^UCWEB.*; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]+))?;'
577
+ os_replacement: 'Android'
578
+ - regex: '^UCWEB.*; (iPad OS|iPh OS) (\d+)_(\d+)(?:_(\d+))?;'
579
+ os_replacement: 'iOS'
580
+ - regex: '^UCWEB.*; (wds) (\d+)\.(\d+)(?:\.(\d+))?;'
581
+ os_replacement: 'Windows Phone'
582
+ # JUC
583
+ - regex: '^(JUC).*; ?U; ?(?:Android)?(\d+)\.(\d+)(?:[\.\-]([a-z0-9]+))?'
584
+ os_replacement: 'Android'
585
+
586
+ ##########
587
+ # Kindle Android
588
+ ##########
589
+ - regex: '(Silk-Accelerated=[a-z]{4,5})'
590
+ os_replacement: 'Android'
591
+
592
+ ##########
593
+ # Windows
594
+ # http://en.wikipedia.org/wiki/Windows_NT#Releases
595
+ # possibility of false positive when different marketing names share same NT kernel
596
+ # e.g. windows server 2003 and windows xp
597
+ # lots of ua strings have Windows NT 4.1 !?!?!?!? !?!? !? !????!?! !!! ??? !?!?! ?
598
+ # (very) roughly ordered in terms of frequency of occurence of regex (win xp currently most frequent, etc)
599
+ ##########
600
+
601
+ # ie mobile desktop mode
602
+ # spoofs nt 6.1. must come before windows 7
603
+ - regex: '(XBLWP7)'
604
+ os_replacement: 'Windows Phone'
605
+
606
+ # @note: This needs to come before Windows NT 6.1
607
+ - regex: '(Windows ?Mobile)'
608
+ os_replacement: 'Windows Mobile'
609
+
610
+ - regex: '(Windows (?:NT 5\.2|NT 5\.1))'
611
+ os_replacement: 'Windows XP'
612
+
613
+ - regex: '(Windows NT 6\.1)'
614
+ os_replacement: 'Windows 7'
615
+
616
+ - regex: '(Windows NT 6\.0)'
617
+ os_replacement: 'Windows Vista'
618
+
619
+ - regex: '(Win 9x 4\.90)'
620
+ os_replacement: 'Windows ME'
621
+
622
+ - regex: '(Windows 98|Windows XP|Windows ME|Windows 95|Windows CE|Windows 7|Windows NT 4\.0|Windows Vista|Windows 2000|Windows 3.1)'
623
+
624
+ - regex: '(Windows NT 6\.2; ARM;)'
625
+ os_replacement: 'Windows RT'
626
+ - regex: '(Windows NT 6\.2)'
627
+ os_replacement: 'Windows 8'
628
+
629
+ - regex: '(Windows NT 6\.3; ARM;)'
630
+ os_replacement: 'Windows RT 8.1'
631
+ - regex: '(Windows NT 6\.3)'
632
+ os_replacement: 'Windows 8.1'
633
+
634
+ - regex: '(Windows NT 5\.0)'
635
+ os_replacement: 'Windows 2000'
636
+
637
+ - regex: '(WinNT4.0)'
638
+ os_replacement: 'Windows NT 4.0'
639
+
640
+ - regex: '(Windows ?CE)'
641
+ os_replacement: 'Windows CE'
642
+
643
+ - regex: 'Win ?(95|98|3.1|NT|ME|2000)'
644
+ os_replacement: 'Windows $1'
645
+
646
+ - regex: 'Win16'
647
+ os_replacement: 'Windows 3.1'
648
+
649
+ - regex: 'Win32'
650
+ os_replacement: 'Windows 95'
651
+
652
+ ##########
653
+ # Tizen OS from Samsung
654
+ # spoofs Android so pushing it above
655
+ ##########
656
+ - regex: '(Tizen)/(\d+)\.(\d+)'
657
+
658
+ ##########
659
+ # Mac OS
660
+ # @ref: http://en.wikipedia.org/wiki/Mac_OS_X#Versions
661
+ # @ref: http://www.puredarwin.org/curious/versions
662
+ ##########
663
+ - regex: '(Mac OS X) (\d+)[_.](\d+)(?:[_.](\d+))?'
664
+ # Leopard
665
+ - regex: ' (Dar)(win)/(9).(\d+).*\((?:i386|x86_64|Power Macintosh)\)'
666
+ os_replacement: 'Mac OS X'
667
+ os_v1_replacement: '10'
668
+ os_v2_replacement: '5'
669
+ # Snow Leopard
670
+ - regex: ' (Dar)(win)/(10).(\d+).*\((?:i386|x86_64)\)'
671
+ os_replacement: 'Mac OS X'
672
+ os_v1_replacement: '10'
673
+ os_v2_replacement: '6'
674
+ # Lion
675
+ - regex: ' (Dar)(win)/(11).(\d+).*\((?:i386|x86_64)\)'
676
+ os_replacement: 'Mac OS X'
677
+ os_v1_replacement: '10'
678
+ os_v2_replacement: '7'
679
+ # Mountain Lion
680
+ - regex: ' (Dar)(win)/(12).(\d+).*\((?:i386|x86_64)\)'
681
+ os_replacement: 'Mac OS X'
682
+ os_v1_replacement: '10'
683
+ os_v2_replacement: '8'
684
+ # Mavericks
685
+ - regex: ' (Dar)(win)/(13).(\d+).*\((?:i386|x86_64)\)'
686
+ os_replacement: 'Mac OS X'
687
+ os_v1_replacement: '10'
688
+ os_v2_replacement: '9'
689
+
690
+ # IE on Mac doesn't specify version number
691
+ - regex: 'Mac_PowerPC'
692
+ os_replacement: 'Mac OS'
693
+
694
+ # builds before tiger don't seem to specify version?
695
+
696
+ # ios devices spoof (mac os x), so including intel/ppc prefixes
697
+ - regex: '(?:PPC|Intel) (Mac OS X)'
698
+
699
+ ##########
700
+ # iOS
701
+ # http://en.wikipedia.org/wiki/IOS_version_history
702
+ ##########
703
+ - regex: '(CPU OS|iPhone OS|CPU iPhone) +(\d+)[_\.](\d+)(?:[_\.](\d+))?'
704
+ os_replacement: 'iOS'
705
+
706
+ # remaining cases are mostly only opera uas, so catch opera as to not catch iphone spoofs
707
+ - regex: '(iPhone|iPad|iPod); Opera'
708
+ os_replacement: 'iOS'
709
+
710
+ # few more stragglers
711
+ - regex: '(iPhone|iPad|iPod).*Mac OS X.*Version/(\d+)\.(\d+)'
712
+ os_replacement: 'iOS'
713
+
714
+ - regex: '(AppleTV)/(\d+)\.(\d+)'
715
+ os_replacement: 'ATV OS X'
716
+
717
+ # CFNetwork/Darwin - The specific CFNetwork or Darwin version determines
718
+ # whether the os maps to Mac OS, or iOS, or just Darwin.
719
+ # See: http://user-agents.me/cfnetwork-version-list
720
+ - regex: '(CFNetwork)/(5)48\.0\.3.* Darwin/11\.0\.0'
721
+ os_replacement: 'iOS'
722
+ - regex: '(CFNetwork)/(5)48\.(0)\.4.* Darwin/(1)1\.0\.0'
723
+ os_replacement: 'iOS'
724
+ - regex: '(CFNetwork)/(5)48\.(1)\.4'
725
+ os_replacement: 'iOS'
726
+ - regex: '(CFNetwork)/(4)85\.1(3)\.9'
727
+ os_replacement: 'iOS'
728
+ - regex: '(CFNetwork)/(6)09\.(1)\.4'
729
+ os_replacement: 'iOS'
730
+ - regex: '(CFNetwork)/(6)(0)9'
731
+ os_replacement: 'iOS'
732
+ - regex: '(CFNetwork)/6(7)2\.(1)\.13'
733
+ os_replacement: 'iOS'
734
+ - regex: '(CFNetwork)/6(7)2\.(1)\.(1)4'
735
+ os_replacement: 'iOS'
736
+ - regex: '(CF)(Network)/6(7)(2)\.1\.15'
737
+ os_replacement: 'iOS'
738
+ os_v1_replacement: '7'
739
+ os_v2_replacement: '1'
740
+ - regex: '(CFNetwork)/6(7)2\.(0)\.(?:2|8)'
741
+ os_replacement: 'iOS'
742
+ - regex: '(CFNetwork)/709\.1'
743
+ os_replacement: 'iOS'
744
+ os_v1_replacement: '8'
745
+ os_v2_replacement: '0.b5'
746
+
747
+ ##########
748
+ # CFNetwork iOS Apps
749
+ # @ref: https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history
750
+ ##########
751
+ - regex: 'CFNetwork/.* Darwin/(9)\.\d+'
752
+ os_replacement: 'iOS'
753
+ os_v1_replacement: '1'
754
+ - regex: 'CFNetwork/.* Darwin/(10)\.\d+'
755
+ os_replacement: 'iOS'
756
+ os_v1_replacement: '4'
757
+ - regex: 'CFNetwork/.* Darwin/(11)\.\d+'
758
+ os_replacement: 'iOS'
759
+ os_v1_replacement: '5'
760
+ - regex: 'CFNetwork/.* Darwin/(13)\.\d+'
761
+ os_replacement: 'iOS'
762
+ os_v1_replacement: '6'
763
+ - regex: 'CFNetwork/6.* Darwin/(14)\.\d+'
764
+ os_replacement: 'iOS'
765
+ os_v1_replacement: '7'
766
+ - regex: 'CFNetwork/7.* Darwin/(14)\.\d+'
767
+ os_replacement: 'iOS'
768
+ os_v1_replacement: '8'
769
+ os_v2_replacement: '0'
770
+ # iOS Apps
771
+ - regex: '\b(iOS[ /]|iPhone(?:/| v|[ _]OS[/,]|; | OS : |\d,\d/|\d,\d; )|iPad/)(\d{1,2})[_\.](\d{1,2})(?:[_\.](\d+))?'
772
+ os_replacement: 'iOS'
773
+
774
+ ##########
775
+ # Chrome OS
776
+ # if version 0.0.0, probably this stuff:
777
+ # http://code.google.com/p/chromium-os/issues/detail?id=11573
778
+ # http://code.google.com/p/chromium-os/issues/detail?id=13790
779
+ ##########
780
+ - regex: '(CrOS) [a-z0-9_]+ (\d+)\.(\d+)(?:\.(\d+))?'
781
+ os_replacement: 'Chrome OS'
782
+
783
+ ##########
784
+ # Linux distros
785
+ ##########
786
+ - regex: '([Dd]ebian)'
787
+ os_replacement: 'Debian'
788
+ - regex: '(Linux Mint)(?:/(\d+))?'
789
+ - regex: '(Mandriva)(?: Linux)?/(?:[\d.-]+m[a-z]{2}(\d+).(\d))?'
790
+
791
+ ##########
792
+ # Symbian + Symbian OS
793
+ # http://en.wikipedia.org/wiki/History_of_Symbian
794
+ ##########
795
+ - regex: '(Symbian[Oo][Ss])[/ ](\d+)\.(\d+)'
796
+ os_replacement: 'Symbian OS'
797
+ - regex: '(Symbian/3).+NokiaBrowser/7\.3'
798
+ os_replacement: 'Symbian^3 Anna'
799
+ - regex: '(Symbian/3).+NokiaBrowser/7\.4'
800
+ os_replacement: 'Symbian^3 Belle'
801
+ - regex: '(Symbian/3)'
802
+ os_replacement: 'Symbian^3'
803
+ - regex: '\b(Series 60|SymbOS|S60Version|S60V\d|S60\b)'
804
+ os_replacement: 'Symbian OS'
805
+ - regex: '(MeeGo)'
806
+ - regex: 'Symbian [Oo][Ss]'
807
+ os_replacement: 'Symbian OS'
808
+ - regex: 'Series40;'
809
+ os_replacement: 'Nokia Series 40'
810
+ - regex: 'Series30Plus;'
811
+ os_replacement: 'Nokia Series 30 Plus'
812
+
813
+ ##########
814
+ # BlackBerry devices
815
+ ##########
816
+ - regex: '(BB10);.+Version/(\d+)\.(\d+)\.(\d+)'
817
+ os_replacement: 'BlackBerry OS'
818
+ - regex: '(Black[Bb]erry)[0-9a-z]+/(\d+)\.(\d+)\.(\d+)(?:\.(\d+))?'
819
+ os_replacement: 'BlackBerry OS'
820
+ - regex: '(Black[Bb]erry).+Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+))?'
821
+ os_replacement: 'BlackBerry OS'
822
+ - regex: '(RIM Tablet OS) (\d+)\.(\d+)\.(\d+)'
823
+ os_replacement: 'BlackBerry Tablet OS'
824
+ - regex: '(Play[Bb]ook)'
825
+ os_replacement: 'BlackBerry Tablet OS'
826
+ - regex: '(Black[Bb]erry)'
827
+ os_replacement: 'BlackBerry OS'
828
+
829
+ ##########
830
+ # Firefox OS
831
+ ##########
832
+ - regex: '\((?:Mobile|Tablet);.+Firefox/\d+\.\d+'
833
+ os_replacement: 'Firefox OS'
834
+
835
+ ##########
836
+ # BREW
837
+ # yes, Brew is lower-cased for Brew MP
838
+ ##########
839
+ - regex: '(BREW)[ /](\d+)\.(\d+)\.(\d+)'
840
+ - regex: '(BREW);'
841
+ - regex: '(Brew MP|BMP)[ /](\d+)\.(\d+)\.(\d+)'
842
+ os_replacement: 'Brew MP'
843
+ - regex: 'BMP;'
844
+ os_replacement: 'Brew MP'
845
+
846
+ ##########
847
+ # Google TV
848
+ ##########
849
+ - regex: '(GoogleTV)(?: (\d+)\.(\d+)(?:\.(\d+))?|/[\da-z]+)'
850
+
851
+ - regex: '(WebTV)/(\d+).(\d+)'
852
+
853
+ ##########
854
+ # Misc mobile
855
+ ##########
856
+ - regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+))?'
857
+ os_replacement: 'webOS'
858
+ - regex: '(VRE);'
859
+
860
+ ##########
861
+ # Generic patterns
862
+ # since the majority of os cases are very specific, these go last
863
+ ##########
864
+ - regex: '(Fedora|Red Hat|PCLinuxOS|Puppy|Ubuntu|Kindle|Bada|Lubuntu|BackTrack|Slackware|(?:Free|Open|Net|\b)BSD)[/ ](\d+)\.(\d+)(?:\.(\d+)(?:\.(\d+))?)?'
865
+
866
+ # Gentoo Linux + Kernel Version
867
+ - regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+))?.*gentoo'
868
+ os_replacement: 'Gentoo'
869
+
870
+ # Opera Mini Bada
871
+ - regex: '\((Bada);'
872
+
873
+ # just os
874
+ - regex: '(Windows|Android|WeTab|Maemo)'
875
+ - regex: '(Ubuntu|Kubuntu|Arch Linux|CentOS|Slackware|Gentoo|openSUSE|SUSE|Red Hat|Fedora|PCLinuxOS|Gentoo|Mageia|(?:Free|Open|Net|\b)BSD)'
876
+ # Linux + Kernel Version
877
+ - regex: '(Linux)(?:[ /](\d+)\.(\d+)(?:\.(\d+))?)?'
878
+ - regex: 'SunOS'
879
+ os_replacement: 'Solaris'
880
+
881
+ device_parsers:
882
+ ##########
883
+ # incomplete!
884
+ # multiple replacement placeholds i.e. ($1) ($2) help solve problem of single device with multiple representations in ua
885
+ # e.g. HTC Dream S should parse to the same device as HTC_DreamS
886
+ ##########
887
+
888
+ ##########
889
+ # incomplete!
890
+ # HTC
891
+ # http://en.wikipedia.org/wiki/List_of_HTC_phones
892
+ # this is quickly getting unwieldy
893
+ ##########
894
+ # example: Mozilla/5.0 (Linux; U; Android 2.3.2; fr-fr; HTC HD2 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
895
+ - regex: 'HTC ([A-Z][a-z0-9]+) Build'
896
+ device_replacement: 'HTC $1'
897
+ # example: Mozilla/5.0 (Linux; U; Android 2.1; es-es; HTC Legend 1.23.161.1 Build/ERD79) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17,gzip
898
+ - regex: 'HTC ([A-Z][a-z0-9 ]+) \d+\.\d+\.\d+\.\d+'
899
+ device_replacement: 'HTC $1'
900
+ # example: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; HTC_Touch_Diamond2_T5353; Windows Phone 6.5.3.5)
901
+ - regex: 'HTC_Touch_([A-Za-z0-9]+)'
902
+ device_replacement: 'HTC Touch ($1)'
903
+ # should come after HTC_Touch
904
+ - regex: 'USCCHTC(\d+)'
905
+ device_replacement: 'HTC $1 (US Cellular)'
906
+ - regex: 'Sprint APA(9292)'
907
+ device_replacement: 'HTC $1 (Sprint)'
908
+ - regex: 'HTC ([A-Za-z0-9]+ [A-Z])'
909
+ device_replacement: 'HTC $1'
910
+ - regex: 'HTC[-_/\s]([A-Za-z0-9]+)'
911
+ device_replacement: 'HTC $1'
912
+ - regex: '(ADR[A-Za-z0-9]+)'
913
+ device_replacement: 'HTC $1'
914
+ - regex: '(HTC)'
915
+
916
+ # Tesla Model S
917
+ - regex: '(QtCarBrowser)'
918
+ device_replacement: 'Tesla Model S'
919
+
920
+ # Samsung
921
+ - regex: '(SamsungSGHi560)'
922
+ device_replacement: 'Samsung SGHi560'
923
+
924
+ - regex: '(SCH-[A-Za-z0-9_-]+)'
925
+ device_replacement: 'Samsung $1'
926
+
927
+ - regex: '(SGH-[A-Za-z0-9_-]+)'
928
+ device_replacement: 'Samsung $1'
929
+
930
+ - regex: '(GT-[A-Za-z0-9_-]+)'
931
+ device_replacement: 'Samsung $1'
932
+
933
+ - regex: '(SM-[A-Za-z0-9_-]+)'
934
+ device_replacement: 'Samsung $1'
935
+
936
+ - regex: '(SPH-[A-Za-z0-9_-]+)'
937
+ device_replacement: 'Samsung $1'
938
+
939
+ - regex: 'SAMSUNG-([A-Za-z0-9_-]+)'
940
+ device_replacement: 'Samsung $1'
941
+
942
+ - regex: 'SAMSUNG ([A-Za-z0-9_-]+)'
943
+ device_replacement: 'Samsung $1'
944
+
945
+
946
+ #########
947
+ # Ericsson - must come before nokia since they also use symbian
948
+ #########
949
+ - regex: 'SonyEricsson([A-Za-z0-9]+)/'
950
+ device_replacement: 'Ericsson $1'
951
+
952
+ ##########
953
+ # PlayStation
954
+ # The Vita spoofs the Kindle
955
+ ##########
956
+ - regex: 'PLAYSTATION 3'
957
+ device_replacement: 'PlayStation 3'
958
+ - regex: '(PlayStation (:?Portable|Vita))'
959
+ - regex: '(PlayStation (:?\d+))'
960
+
961
+ ##########
962
+ # incomplete!
963
+ # Kindle
964
+ # http://amazonsilk.wordpress.com/useful-bits/silk-user-agent/
965
+ ##########
966
+ - regex: '(KFOT Build)'
967
+ device_replacement: 'Kindle Fire'
968
+ - regex: '(KFTT Build)'
969
+ device_replacement: 'Kindle Fire HD'
970
+ - regex: '(KFJWI Build)'
971
+ device_replacement: 'Kindle Fire HD 8.9" WiFi'
972
+ - regex: '(KFJWA Build)'
973
+ device_replacement: 'Kindle Fire HD 8.9" 4G'
974
+ - regex: '(KFSOWI Build)'
975
+ device_replacement: 'Kindle Fire HD 7" WiFi'
976
+ - regex: '(KFTHWI Build)'
977
+ device_replacement: 'Kindle Fire HDX 7" WiFi'
978
+ - regex: '(KFTHWA Build)'
979
+ device_replacement: 'Kindle Fire HDX 7" 4G'
980
+ - regex: '(KFAPWI Build)'
981
+ device_replacement: 'Kindle Fire HDX 8.9" WiFi'
982
+ - regex: '(KFAPWA Build)'
983
+ device_replacement: 'Kindle Fire HDX 8.9" 4G'
984
+ - regex: '(Kindle Fire)'
985
+ - regex: '(Kindle)'
986
+ - regex: '(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+))?'
987
+ device_replacement: 'Kindle Fire'
988
+
989
+
990
+
991
+ ##########
992
+ # NOKIA
993
+ # nokia NokiaN8-00 comes before iphone. sometimes spoofs iphone
994
+ ##########
995
+ - regex: 'NokiaN([0-9]+)'
996
+ device_replacement: 'Nokia N$1'
997
+ - regex: 'NOKIA([A-Za-z0-9\v-]+)'
998
+ device_replacement: 'Nokia $1'
999
+ - regex: 'Nokia([A-Za-z0-9\v-]+)'
1000
+ device_replacement: 'Nokia $1'
1001
+ - regex: 'NOKIA ([A-Za-z0-9\-]+)'
1002
+ device_replacement: 'Nokia $1'
1003
+ - regex: 'Nokia ([A-Za-z0-9\-]+)'
1004
+ device_replacement: 'Nokia $1'
1005
+ - regex: 'Lumia ([A-Za-z0-9\-]+)'
1006
+ device_replacement: 'Lumia $1'
1007
+ - regex: 'Symbian'
1008
+ device_replacement: 'Nokia'
1009
+
1010
+ ##########
1011
+ # BlackBerry
1012
+ # http://www.useragentstring.com/pages/BlackBerry/
1013
+ ##########
1014
+ - regex: 'BB10; ([A-Za-z0-9\- ]+)\)'
1015
+ device_replacement: 'BlackBerry $1'
1016
+ - regex: '(PlayBook).+RIM Tablet OS'
1017
+ device_replacement: 'BlackBerry Playbook'
1018
+ - regex: 'Black[Bb]erry ([0-9]+);'
1019
+ device_replacement: 'BlackBerry $1'
1020
+ - regex: 'Black[Bb]erry([0-9]+)'
1021
+ device_replacement: 'BlackBerry $1'
1022
+ - regex: 'Black[Bb]erry;'
1023
+ device_replacement: 'BlackBerry'
1024
+
1025
+ ##########
1026
+ # PALM / HP
1027
+ ##########
1028
+ # some palm devices must come before iphone. sometimes spoofs iphone in ua
1029
+ - regex: '(Pre)/(\d+)\.(\d+)'
1030
+ device_replacement: 'Palm Pre'
1031
+ - regex: '(Pixi)/(\d+)\.(\d+)'
1032
+ device_replacement: 'Palm Pixi'
1033
+ - regex: '(Touch[Pp]ad)/(\d+)\.(\d+)'
1034
+ device_replacement: 'HP TouchPad'
1035
+ - regex: 'HPiPAQ([A-Za-z0-9]+)/(\d+).(\d+)'
1036
+ device_replacement: 'HP iPAQ $1'
1037
+ - regex: 'Palm([A-Za-z0-9]+)'
1038
+ device_replacement: 'Palm $1'
1039
+ - regex: 'Treo([A-Za-z0-9]+)'
1040
+ device_replacement: 'Palm Treo $1'
1041
+ - regex: 'webOS.*(P160UNA)/(\d+).(\d+)'
1042
+ device_replacement: 'HP Veer'
1043
+
1044
+ ##########
1045
+ # AppleTV
1046
+ # No built in browser that I can tell
1047
+ # Stack Overflow indicated iTunes-AppleTV/4.1 as a known UA for app available and I'm seeing it in live traffic
1048
+ ##########
1049
+ - regex: '(AppleTV)'
1050
+ device_replacement: 'AppleTV'
1051
+
1052
+ ##########
1053
+ # Catch the google mobile crawler before checking for iPhones.
1054
+ ##########
1055
+
1056
+ - regex: 'AdsBot-Google-Mobile'
1057
+ device_replacement: 'Spider'
1058
+
1059
+ - regex: 'Googlebot-Mobile/(\d+).(\d+)'
1060
+ device_replacement: 'Spider'
1061
+
1062
+ - regex: 'Googlebot/\d+.\d+'
1063
+ device_replacement: 'Spider'
1064
+
1065
+ - regex: 'NING/(\d+).(\d+)'
1066
+ device_replacement: 'Spider'
1067
+
1068
+ - regex: 'MsnBot-Media /(\d+).(\d+)'
1069
+ device_replacement: 'Spider'
1070
+
1071
+ ##########
1072
+ # complete but probably catches spoofs
1073
+ # iSTUFF
1074
+ ##########
1075
+ # ipad and ipod must be parsed before iphone
1076
+ # cannot determine specific device type from ua string. (3g, 3gs, 4, etc)
1077
+ - regex: '(iPad) Simulator;'
1078
+ - regex: '(iPad);'
1079
+ - regex: '(iPod) touch;'
1080
+ - regex: '(iPod);'
1081
+ - regex: '(iPhone) Simulator;'
1082
+ - regex: '(iPhone);'
1083
+
1084
+ ##########
1085
+ # Acer
1086
+ ##########
1087
+ - regex: 'acer_([A-Za-z0-9]+)_'
1088
+ device_replacement: 'Acer $1'
1089
+ - regex: 'acer_([A-Za-z0-9]+)_'
1090
+ device_replacement: 'Acer $1'
1091
+
1092
+ ##########
1093
+ # Alcatel
1094
+ ##########
1095
+ - regex: 'ALCATEL-([A-Za-z0-9]+)'
1096
+ device_replacement: 'Alcatel $1'
1097
+ - regex: 'Alcatel-([A-Za-z0-9]+)'
1098
+ device_replacement: 'Alcatel $1'
1099
+ - regex: 'ALCATEL_ONE_TOUCH_([A-Za-z0-9]+)'
1100
+ device_replacement: 'Alcatel ONE TOUCH $1'
1101
+ - regex: 'ALCATEL (ONE TOUCH [A-Za-z0-9]+)'
1102
+ device_replacement: 'Alcatel $1'
1103
+ - regex: 'ALCATEL (one touch [A-Za-z0-9]+)'
1104
+ device_replacement: 'Alcatel $1'
1105
+ - regex: 'ALCATEL ([A-Za-z0-9]+)'
1106
+ device_replacement: 'Alcatel $1'
1107
+ ##########
1108
+ # Amoi
1109
+ ##########
1110
+ - regex: 'Amoi\-([A-Za-z0-9]+)'
1111
+ device_replacement: 'Amoi $1'
1112
+ - regex: 'AMOI\-([A-Za-z0-9]+)'
1113
+ device_replacement: 'Amoi $1'
1114
+
1115
+ ##########
1116
+ # Amoi
1117
+ ##########
1118
+ - regex: 'Asus\-([A-Za-z0-9]+)'
1119
+ device_replacement: 'Asus $1'
1120
+ - regex: 'ASUS\-([A-Za-z0-9]+)'
1121
+ device_replacement: 'Asus $1'
1122
+
1123
+ ##########
1124
+ # Bird
1125
+ ##########
1126
+ - regex: 'BIRD\-([A-Za-z0-9]+)'
1127
+ device_replacement: 'Bird $1'
1128
+ - regex: 'BIRD\.([A-Za-z0-9]+)'
1129
+ device_replacement: 'Bird $1'
1130
+ - regex: 'BIRD ([A-Za-z0-9]+)'
1131
+ device_replacement: 'Bird $1'
1132
+
1133
+ ##########
1134
+ # Dell
1135
+ ##########
1136
+ - regex: 'Dell ([A-Za-z0-9]+)'
1137
+ device_replacement: 'Dell $1'
1138
+
1139
+ ##########
1140
+ # DoCoMo
1141
+ ##########
1142
+ - regex: 'DoCoMo/2\.0 ([A-Za-z0-9]+)'
1143
+ device_replacement: 'DoCoMo $1'
1144
+ - regex: '([A-Za-z0-9]+)_W\;FOMA'
1145
+ device_replacement: 'DoCoMo $1'
1146
+ - regex: '([A-Za-z0-9]+)\;FOMA'
1147
+ device_replacement: 'DoCoMo $1'
1148
+
1149
+ ##########
1150
+ # Huawei
1151
+ ##########
1152
+ - regex: 'Huawei([A-Za-z0-9]+)'
1153
+ device_replacement: 'Huawei $1'
1154
+ - regex: 'HUAWEI-([A-Za-z0-9]+)'
1155
+ device_replacement: 'Huawei $1'
1156
+ - regex: 'vodafone([A-Za-z0-9]+)'
1157
+ device_replacement: 'Huawei Vodafone $1'
1158
+
1159
+ ##########
1160
+ # i-mate
1161
+ ##########
1162
+ - regex: 'i\-mate ([A-Za-z0-9]+)'
1163
+ device_replacement: 'i-mate $1'
1164
+
1165
+ ##########
1166
+ # kyocera
1167
+ ##########
1168
+ - regex: 'Kyocera\-([A-Za-z0-9]+)'
1169
+ device_replacement: 'Kyocera $1'
1170
+ - regex: 'KWC\-([A-Za-z0-9]+)'
1171
+ device_replacement: 'Kyocera $1'
1172
+
1173
+ ##########
1174
+ # lenovo
1175
+ ##########
1176
+ - regex: 'Lenovo\-([A-Za-z0-9]+)'
1177
+ device_replacement: 'Lenovo $1'
1178
+ - regex: 'Lenovo_([A-Za-z0-9]+)'
1179
+ device_replacement: 'Lenovo $1'
1180
+
1181
+ ##########
1182
+ # HbbTV (European and Australian standard)
1183
+ # written before the LG regexes, as LG is making HbbTV too
1184
+ ##########
1185
+ - regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+'
1186
+
1187
+ ##########
1188
+ # lg
1189
+ ##########
1190
+ - regex: 'LG/([A-Za-z0-9]+)'
1191
+ device_replacement: 'LG $1'
1192
+ - regex: 'LG-LG([A-Za-z0-9]+)'
1193
+ device_replacement: 'LG $1'
1194
+ - regex: 'LGE-LG([A-Za-z0-9]+)'
1195
+ device_replacement: 'LG $1'
1196
+ - regex: 'LGE VX([A-Za-z0-9]+)'
1197
+ device_replacement: 'LG $1'
1198
+ - regex: 'LG ([A-Za-z0-9]+)'
1199
+ device_replacement: 'LG $1'
1200
+ - regex: 'LGE LG\-AX([A-Za-z0-9]+)'
1201
+ device_replacement: 'LG $1'
1202
+ - regex: 'LG\-([A-Za-z0-9]+)'
1203
+ device_replacement: 'LG $1'
1204
+ - regex: 'LGE\-([A-Za-z0-9]+)'
1205
+ device_replacement: 'LG $1'
1206
+ - regex: 'LG([A-Za-z0-9]+)'
1207
+ device_replacement: 'LG $1'
1208
+
1209
+ ##########
1210
+ # kin
1211
+ ##########
1212
+ - regex: '(KIN)\.One (\d+)\.(\d+)'
1213
+ device_replacement: 'Microsoft $1'
1214
+ - regex: '(KIN)\.Two (\d+)\.(\d+)'
1215
+ device_replacement: 'Microsoft $1'
1216
+
1217
+ ##########
1218
+ # motorola
1219
+ ##########
1220
+ - regex: '(Motorola)\-([A-Za-z0-9]+)'
1221
+ - regex: 'MOTO\-([A-Za-z0-9]+)'
1222
+ device_replacement: 'Motorola $1'
1223
+ - regex: 'MOT\-([A-Za-z0-9]+)'
1224
+ device_replacement: 'Motorola $1'
1225
+ - regex: ' (DROID RAZR [A-Za-z0-9 ]+) '
1226
+ device_replacement: 'Motorola $1'
1227
+ - regex: ' (DROID[2 ][A-Za-z0-9 ]+) '
1228
+ device_replacement: 'Motorola $1'
1229
+ - regex: ' (Droid2| )'
1230
+ device_replacement: 'Motorola $1'
1231
+ - regex: ' (DROID2| )'
1232
+ device_replacement: 'Motorola $1'
1233
+
1234
+ ##########
1235
+ # nintendo
1236
+ ##########
1237
+ - regex: '(Nintendo WiiU)'
1238
+ device_replacement: 'Nintendo Wii U'
1239
+ - regex: 'Nintendo (DS|3DS|DSi|Wii);'
1240
+ device_replacement: 'Nintendo $1'
1241
+
1242
+ ##########
1243
+ # pantech
1244
+ ##########
1245
+ - regex: 'Pantech([A-Za-z0-9]+)'
1246
+ device_replacement: 'Pantech $1'
1247
+
1248
+ ##########
1249
+ # philips
1250
+ ##########
1251
+ - regex: 'Philips([A-Za-z0-9]+)'
1252
+ device_replacement: 'Philips $1'
1253
+ - regex: 'Philips ([A-Za-z0-9]+)'
1254
+ device_replacement: 'Philips $1'
1255
+
1256
+ ##########
1257
+ # Samsung
1258
+ ##########
1259
+ - regex: 'SAMSUNG-([A-Za-z0-9\-]+)'
1260
+ device_replacement: 'Samsung $1'
1261
+ - regex: 'SAMSUNG\; ([A-Za-z0-9\-]+)'
1262
+ device_replacement: 'Samsung $1'
1263
+
1264
+ ##########
1265
+ # ZTE
1266
+ ##########
1267
+ - regex: 'ZTE-([A-Za-z0-9\-]+)'
1268
+ device_replacement: 'ZTE $1'
1269
+ - regex: 'ZTE ([A-Za-z0-9\-]+)'
1270
+ device_replacement: 'ZTE $1'
1271
+ - regex: 'ZTE_([A-Za-z0-9\-]+)'
1272
+ device_replacement: 'ZTE $1'
1273
+
1274
+ ##########
1275
+ # Sega
1276
+ ##########
1277
+ - regex: 'Dreamcast'
1278
+ device_replacement: 'Sega Dreamcast'
1279
+
1280
+ ##########
1281
+ # Softbank
1282
+ ##########
1283
+ - regex: 'Softbank/1\.0/([A-Za-z0-9]+)'
1284
+ device_replacement: 'Softbank $1'
1285
+ - regex: 'Softbank/2\.0/([A-Za-z0-9]+)'
1286
+ device_replacement: 'Softbank $1'
1287
+
1288
+ ##########
1289
+ # SONY #
1290
+ ##########
1291
+ - regex: 'Sony([^ ]+) '
1292
+ device_replacement: 'Sony $1'
1293
+
1294
+ ##########
1295
+ # WebTV
1296
+ ##########
1297
+ - regex: '(WebTV)/(\d+).(\d+)'
1298
+
1299
+ #########
1300
+ # Android General Device Matching (far from perfect)
1301
+ #########
1302
+ - regex: 'Android[\- ][\d]+\.[\d]+\.[\d]+; [^;]+; ([A-Za-z0-9 _-]+) '
1303
+ - regex: 'Android[\- ][\d]+\.[\d]+; [^;]+; ([A-Za-z0-9 _-]+) '
1304
+ - regex: 'Android[\- ][\d]+\.[\d]+; [^;]+; WOWMobile ([A-Za-z0-9 _-]+) '
1305
+ - regex: 'Android[\- ][\d]+\.[\d]+\-update1; [^;]+; ([A-Za-z0-9 _-]+) '
1306
+ - regex: 'Android[\- ][\d]+\.[\d]+\.[\d]+;[^;]+;([A-Za-z0-9 _-]+) '
1307
+ - regex: 'Android[\- ][\d]+\.[\d]+\.[\d]+; ([A-Za-z0-9 _-]+) '
1308
+ - regex: 'Android[\- ][\d]+\.[\d]+; ([A-Za-z0-9 _-]+) '
1309
+ - regex: 'Android[\- ][\d]+\.[\d]+\.[\d]+; [^;]+; ([A-Za-z0-9\.\/_-]+) '
1310
+ - regex: 'Android[\- ][\d]+\.[\d]+; [^;]+; ([A-Za-z0-9\.\/_-]+) '
1311
+
1312
+ ##########
1313
+ # Generic Smart Phone
1314
+ ##########
1315
+ - regex: '(hiptop|avantgo|plucker|xiino|blazer|elaine|up.browser|up.link|mmp|smartphone|midp|wap|vodafone|o2|pocket|mobile|pda)'
1316
+ device_replacement: "Generic Smartphone"
1317
+
1318
+ ##########
1319
+ # Generic Feature Phone
1320
+ ##########
1321
+ - regex: '^(1207|3gso|4thp|501i|502i|503i|504i|505i|506i|6310|6590|770s|802s|a wa|acer|acs\-|airn|alav|asus|attw|au\-m|aur |aus |abac|acoo|aiko|alco|alca|amoi|anex|anny|anyw|aptu|arch|argo|bell|bird|bw\-n|bw\-u|beck|benq|bilb|blac|c55/|cdm\-|chtm|capi|comp|cond|craw|dall|dbte|dc\-s|dica|ds\-d|ds12|dait|devi|dmob|doco|dopo|el49|erk0|esl8|ez40|ez60|ez70|ezos|ezze|elai|emul|eric|ezwa|fake|fly\-|fly_|g\-mo|g1 u|g560|gf\-5|grun|gene|go.w|good|grad|hcit|hd\-m|hd\-p|hd\-t|hei\-|hp i|hpip|hs\-c|htc |htc\-|htca|htcg)'
1322
+ device_replacement: 'Generic Feature Phone'
1323
+ - regex: '^(htcp|htcs|htct|htc_|haie|hita|huaw|hutc|i\-20|i\-go|i\-ma|i230|iac|iac\-|iac/|ig01|im1k|inno|iris|jata|java|kddi|kgt|kgt/|kpt |kwc\-|klon|lexi|lg g|lg\-a|lg\-b|lg\-c|lg\-d|lg\-f|lg\-g|lg\-k|lg\-l|lg\-m|lg\-o|lg\-p|lg\-s|lg\-t|lg\-u|lg\-w|lg/k|lg/l|lg/u|lg50|lg54|lge\-|lge/|lynx|leno|m1\-w|m3ga|m50/|maui|mc01|mc21|mcca|medi|meri|mio8|mioa|mo01|mo02|mode|modo|mot |mot\-|mt50|mtp1|mtv |mate|maxo|merc|mits|mobi|motv|mozz|n100|n101|n102|n202|n203|n300|n302|n500|n502|n505|n700|n701|n710|nec\-|nem\-|newg|neon)'
1324
+ device_replacement: 'Generic Feature Phone'
1325
+ - regex: '^(netf|noki|nzph|o2 x|o2\-x|opwv|owg1|opti|oran|ot\-s|p800|pand|pg\-1|pg\-2|pg\-3|pg\-6|pg\-8|pg\-c|pg13|phil|pn\-2|pt\-g|palm|pana|pire|pock|pose|psio|qa\-a|qc\-2|qc\-3|qc\-5|qc\-7|qc07|qc12|qc21|qc32|qc60|qci\-|qwap|qtek|r380|r600|raks|rim9|rove|s55/|sage|sams|sc01|sch\-|scp\-|sdk/|se47|sec\-|sec0|sec1|semc|sgh\-|shar|sie\-|sk\-0|sl45|slid|smb3|smt5|sp01|sph\-|spv |spv\-|sy01|samm|sany|sava|scoo|send|siem|smar|smit|soft|sony|t\-mo|t218|t250|t600|t610|t618|tcl\-|tdg\-|telm|tim\-|ts70|tsm\-|tsm3|tsm5|tx\-9|tagt)'
1326
+ device_replacement: 'Generic Feature Phone'
1327
+ - regex: '^(talk|teli|topl|tosh|up.b|upg1|utst|v400|v750|veri|vk\-v|vk40|vk50|vk52|vk53|vm40|vx98|virg|vite|voda|vulc|w3c |w3c\-|wapj|wapp|wapu|wapm|wig |wapi|wapr|wapv|wapy|wapa|waps|wapt|winc|winw|wonu|x700|xda2|xdag|yas\-|your|zte\-|zeto|aste|audi|avan|blaz|brew|brvw|bumb|ccwa|cell|cldc|cmd\-|dang|eml2|fetc|hipt|http|ibro|idea|ikom|ipaq|jbro|jemu|jigs|keji|kyoc|kyok|libw|m\-cr|midp|mmef|moto|mwbp|mywa|newt|nok6|o2im|pant|pdxg|play|pluc|port|prox|rozo|sama|seri|smal|symb|treo|upsi|vx52|vx53|vx60|vx61|vx70|vx80|vx81|vx83|vx85|wap\-|webc|whit|wmlb|xda\-|xda_)'
1328
+ device_replacement: 'Generic Feature Phone'
1329
+
1330
+ ##########
1331
+ # Spiders (this is hack...)
1332
+ ##########
1333
+ - regex: '(bingbot|bot|borg|google(^tv)|yahoo|slurp|msnbot|msrbot|openbot|archiver|netresearch|lycos|scooter|altavista|teoma|gigabot|baiduspider|blitzbot|oegp|charlotte|furlbot|http%20client|polybot|htdig|ichiro|mogimogi|larbin|pompos|scrubby|searchsight|seekbot|semanticdiscovery|silk|snappy|speedy|spider|voila|vortex|voyager|zao|zeal|fast\-webcrawler|converacrawler|dataparksearch|findlinks|crawler|Netvibes|Sogou Pic Spider|ICC\-Crawler|Innovazion Crawler|Daumoa|EtaoSpider|A6\-Indexer|YisouSpider|Riddler|DBot|wsr\-agent|Xenu|SeznamBot|PaperLiBot|SputnikBot|CCBot|ProoXiBot|Scrapy|Genieo|Screaming Frog|YahooCacheSystem|CiBra|Nutch)'
1334
+ device_replacement: 'Spider'
1335
+