leanplum_api 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +22 -0
- data/README.md +133 -0
- data/Rakefile +11 -0
- data/lib/leanplum_api.rb +15 -0
- data/lib/leanplum_api/api.rb +251 -0
- data/lib/leanplum_api/configuration.rb +45 -0
- data/lib/leanplum_api/content_read_only.rb +15 -0
- data/lib/leanplum_api/data_export.rb +15 -0
- data/lib/leanplum_api/development.rb +14 -0
- data/lib/leanplum_api/exception.rb +4 -0
- data/lib/leanplum_api/http.rb +68 -0
- data/lib/leanplum_api/logger.rb +23 -0
- data/lib/leanplum_api/version.rb +3 -0
- data/spec/api_spec.rb +230 -0
- data/spec/configuration_spec.rb +26 -0
- data/spec/fixtures/vcr/export_data.yml +40 -0
- data/spec/fixtures/vcr/export_data_dates.yml +40 -0
- data/spec/fixtures/vcr/export_user.yml +40 -0
- data/spec/fixtures/vcr/get_ab_test.yml +40 -0
- data/spec/fixtures/vcr/get_ab_tests.yml +40 -0
- data/spec/fixtures/vcr/get_export_results.yml +40 -0
- data/spec/fixtures/vcr/get_messages.yml +41 -0
- data/spec/fixtures/vcr/get_vars.yml +40 -0
- data/spec/fixtures/vcr/reset_anomalous_user.yml +43 -0
- data/spec/fixtures/vcr/set_user_attributes.yml +43 -0
- data/spec/fixtures/vcr/track_events.yml +45 -0
- data/spec/fixtures/vcr/track_events_and_attributes.yml +46 -0
- data/spec/fixtures/vcr/track_events_anomaly_overrider.yml +86 -0
- data/spec/http_spec.rb +23 -0
- data/spec/spec_helper.rb +45 -0
- metadata +211 -0
@@ -0,0 +1,40 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://www.leanplum.com/api?action=exportData&apiVersion=1.0.6&appId=<LEANPLUM_APP_ID>&clientKey=<LEANPLUM_DATA_EXPORT_KEY>&devMode=false&startDate=20150804&startTime=1438660800
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.9.2
|
12
|
+
Accept-Encoding:
|
13
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
14
|
+
Accept:
|
15
|
+
- "*/*"
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 404
|
19
|
+
message: Not Found
|
20
|
+
headers:
|
21
|
+
Access-Control-Allow-Origin:
|
22
|
+
- "*"
|
23
|
+
Content-Type:
|
24
|
+
- application/json
|
25
|
+
Date:
|
26
|
+
- Wed, 04 Nov 2015 20:50:06 GMT
|
27
|
+
Server:
|
28
|
+
- Google Frontend
|
29
|
+
Cache-Control:
|
30
|
+
- private
|
31
|
+
Alt-Svc:
|
32
|
+
- quic=":443"; p="1"; ma=604800
|
33
|
+
Transfer-Encoding:
|
34
|
+
- chunked
|
35
|
+
body:
|
36
|
+
encoding: UTF-8
|
37
|
+
string: '{"response":[{"error":{"message":"No matching data found."},"success":false}]}'
|
38
|
+
http_version:
|
39
|
+
recorded_at: Wed, 12 Aug 2015 00:00:00 GMT
|
40
|
+
recorded_with: VCR 2.9.3
|
@@ -0,0 +1,40 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://www.leanplum.com/api?action=exportData&apiVersion=1.0.6&appId=<LEANPLUM_APP_ID>&clientKey=<LEANPLUM_DATA_EXPORT_KEY>&devMode=false&endDate=20150906&startDate=20150905
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.9.2
|
12
|
+
Accept-Encoding:
|
13
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
14
|
+
Accept:
|
15
|
+
- "*/*"
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 404
|
19
|
+
message: Not Found
|
20
|
+
headers:
|
21
|
+
Access-Control-Allow-Origin:
|
22
|
+
- "*"
|
23
|
+
Content-Type:
|
24
|
+
- application/json
|
25
|
+
Date:
|
26
|
+
- Wed, 04 Nov 2015 20:50:07 GMT
|
27
|
+
Server:
|
28
|
+
- Google Frontend
|
29
|
+
Cache-Control:
|
30
|
+
- private
|
31
|
+
Alt-Svc:
|
32
|
+
- quic=":443"; p="1"; ma=604800
|
33
|
+
Transfer-Encoding:
|
34
|
+
- chunked
|
35
|
+
body:
|
36
|
+
encoding: UTF-8
|
37
|
+
string: '{"response":[{"error":{"message":"No matching data found."},"success":false}]}'
|
38
|
+
http_version:
|
39
|
+
recorded_at: Wed, 12 Aug 2015 00:00:00 GMT
|
40
|
+
recorded_with: VCR 2.9.3
|
@@ -0,0 +1,40 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://www.leanplum.com/api?action=exportUser&apiVersion=1.0.6&appId=<LEANPLUM_APP_ID>&clientKey=<LEANPLUM_DATA_EXPORT_KEY>&devMode=false&userId=123456
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.9.2
|
12
|
+
Accept-Encoding:
|
13
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
14
|
+
Accept:
|
15
|
+
- "*/*"
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
Access-Control-Allow-Origin:
|
22
|
+
- "*"
|
23
|
+
Content-Type:
|
24
|
+
- application/json
|
25
|
+
Date:
|
26
|
+
- Wed, 04 Nov 2015 20:50:03 GMT
|
27
|
+
Server:
|
28
|
+
- Google Frontend
|
29
|
+
Cache-Control:
|
30
|
+
- private
|
31
|
+
Alt-Svc:
|
32
|
+
- quic=":443"; p="1"; ma=604800
|
33
|
+
Transfer-Encoding:
|
34
|
+
- chunked
|
35
|
+
body:
|
36
|
+
encoding: UTF-8
|
37
|
+
string: '{"response":[{"events":{},"states":{},"success":true,"userAttributes":{"first_name":"Mike","create_date":"2010-01-01","email":"still_tippin@test.com","last_name":"Jones","gender":"m"}}]}'
|
38
|
+
http_version:
|
39
|
+
recorded_at: Wed, 12 Aug 2015 00:00:00 GMT
|
40
|
+
recorded_with: VCR 2.9.3
|
@@ -0,0 +1,40 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://www.leanplum.com/api?action=getAbTests&apiVersion=1.0.6&appId=<LEANPLUM_APP_ID>&clientKey=<LEANPLUM_CONTENT_READ_ONLY_KEY>&devMode=false&recent=1
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.9.2
|
12
|
+
Accept-Encoding:
|
13
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
14
|
+
Accept:
|
15
|
+
- "*/*"
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
Access-Control-Allow-Origin:
|
22
|
+
- "*"
|
23
|
+
Content-Type:
|
24
|
+
- application/json
|
25
|
+
Date:
|
26
|
+
- Wed, 04 Nov 2015 20:50:09 GMT
|
27
|
+
Server:
|
28
|
+
- Google Frontend
|
29
|
+
Cache-Control:
|
30
|
+
- private
|
31
|
+
Alt-Svc:
|
32
|
+
- quic=":443"; p="1"; ma=604800
|
33
|
+
Transfer-Encoding:
|
34
|
+
- chunked
|
35
|
+
body:
|
36
|
+
encoding: UTF-8
|
37
|
+
string: '{"response":[{"abTests":[],"success":true}]}'
|
38
|
+
http_version:
|
39
|
+
recorded_at: Wed, 12 Aug 2015 00:00:00 GMT
|
40
|
+
recorded_with: VCR 2.9.3
|
@@ -0,0 +1,40 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://www.leanplum.com/api?action=getAbTests&apiVersion=1.0.6&appId=<LEANPLUM_APP_ID>&clientKey=<LEANPLUM_CONTENT_READ_ONLY_KEY>&devMode=false&recent=false
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.9.2
|
12
|
+
Accept-Encoding:
|
13
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
14
|
+
Accept:
|
15
|
+
- "*/*"
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
Access-Control-Allow-Origin:
|
22
|
+
- "*"
|
23
|
+
Content-Type:
|
24
|
+
- application/json
|
25
|
+
Date:
|
26
|
+
- Wed, 04 Nov 2015 20:50:08 GMT
|
27
|
+
Server:
|
28
|
+
- Google Frontend
|
29
|
+
Cache-Control:
|
30
|
+
- private
|
31
|
+
Alt-Svc:
|
32
|
+
- quic=":443"; p="1"; ma=604800
|
33
|
+
Transfer-Encoding:
|
34
|
+
- chunked
|
35
|
+
body:
|
36
|
+
encoding: UTF-8
|
37
|
+
string: '{"response":[{"abTests":[],"success":true}]}'
|
38
|
+
http_version:
|
39
|
+
recorded_at: Wed, 12 Aug 2015 00:00:00 GMT
|
40
|
+
recorded_with: VCR 2.9.3
|
@@ -0,0 +1,40 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://www.leanplum.com/api?action=getExportResults&apiVersion=1.0.6&appId=<LEANPLUM_APP_ID>&clientKey=<LEANPLUM_DATA_EXPORT_KEY>&devMode=false&jobId=export_4727756026281984_2904941266315269120
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.9.2
|
12
|
+
Accept-Encoding:
|
13
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
14
|
+
Accept:
|
15
|
+
- "*/*"
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
Access-Control-Allow-Origin:
|
22
|
+
- "*"
|
23
|
+
Content-Type:
|
24
|
+
- application/json
|
25
|
+
Date:
|
26
|
+
- Wed, 04 Nov 2015 20:50:07 GMT
|
27
|
+
Server:
|
28
|
+
- Google Frontend
|
29
|
+
Cache-Control:
|
30
|
+
- private
|
31
|
+
Alt-Svc:
|
32
|
+
- quic=":443"; p="1"; ma=604800
|
33
|
+
Transfer-Encoding:
|
34
|
+
- chunked
|
35
|
+
body:
|
36
|
+
encoding: UTF-8
|
37
|
+
string: '{"response":[{"files":["https:\/\/leanplum_export.storage.googleapis.com\/export-4727756026281984-d5969d55-f242-48a6-85a3-165af08e2306-output-0"],"jobId":"export_4727756026281984_2904941266315269120","numBytes":36590,"state":"FINISHED","success":true,"numSessions":101}]}'
|
38
|
+
http_version:
|
39
|
+
recorded_at: Wed, 12 Aug 2015 00:00:00 GMT
|
40
|
+
recorded_with: VCR 2.9.3
|
@@ -0,0 +1,41 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://www.leanplum.com/api?action=getMessages&apiVersion=1.0.6&appId=<LEANPLUM_APP_ID>&clientKey=<LEANPLUM_CONTENT_READ_ONLY_KEY>&devMode=false&recent=false
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.9.2
|
12
|
+
Accept-Encoding:
|
13
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
14
|
+
Accept:
|
15
|
+
- "*/*"
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
Access-Control-Allow-Origin:
|
22
|
+
- "*"
|
23
|
+
Content-Type:
|
24
|
+
- application/json
|
25
|
+
Date:
|
26
|
+
- Wed, 04 Nov 2015 20:50:09 GMT
|
27
|
+
Server:
|
28
|
+
- Google Frontend
|
29
|
+
Cache-Control:
|
30
|
+
- private
|
31
|
+
Alt-Svc:
|
32
|
+
- quic=":443"; p="1"; ma=604800
|
33
|
+
Transfer-Encoding:
|
34
|
+
- chunked
|
35
|
+
body:
|
36
|
+
encoding: UTF-8
|
37
|
+
string: '{"response":[{"success":true,"messages":[{"id":5670583287676928,"created":1.440091595799E9,"name":"New
|
38
|
+
Message","active":false,"messageType":"Push Notification"}]}]}'
|
39
|
+
http_version:
|
40
|
+
recorded_at: Wed, 12 Aug 2015 00:00:00 GMT
|
41
|
+
recorded_with: VCR 2.9.3
|
@@ -0,0 +1,40 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://www.leanplum.com/api?action=getVars&apiVersion=1.0.6&appId=<LEANPLUM_APP_ID>&clientKey=<LEANPLUM_PRODUCTION_KEY>&devMode=false&userId=123456
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.9.2
|
12
|
+
Accept-Encoding:
|
13
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
14
|
+
Accept:
|
15
|
+
- "*/*"
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
Access-Control-Allow-Origin:
|
22
|
+
- "*"
|
23
|
+
Content-Type:
|
24
|
+
- application/json
|
25
|
+
Date:
|
26
|
+
- Wed, 04 Nov 2015 20:50:09 GMT
|
27
|
+
Server:
|
28
|
+
- Google Frontend
|
29
|
+
Cache-Control:
|
30
|
+
- private
|
31
|
+
Alt-Svc:
|
32
|
+
- quic=":443"; p="1"; ma=604800
|
33
|
+
Transfer-Encoding:
|
34
|
+
- chunked
|
35
|
+
body:
|
36
|
+
encoding: UTF-8
|
37
|
+
string: '{"response":[{"vars":{"test_var":1},"interfaceRules":[],"variants":[{"id":5}],"regions":{},"success":true,"messages":{},"interfaceEvents":[]}]}'
|
38
|
+
http_version:
|
39
|
+
recorded_at: Wed, 12 Aug 2015 00:00:00 GMT
|
40
|
+
recorded_with: VCR 2.9.3
|
@@ -0,0 +1,43 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://www.leanplum.com/api?action=multi&apiVersion=1.0.6&appId=<LEANPLUM_APP_ID>&clientKey=<LEANPLUM_DEVELOPMENT_KEY>&devMode=false&time=1439337600
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: '{"data":[{"action":"setUserAttributes","resetAnomalies":true,"userId":123456}]}'
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.9.2
|
12
|
+
Content-Type:
|
13
|
+
- application/json
|
14
|
+
Accept-Encoding:
|
15
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
16
|
+
Accept:
|
17
|
+
- "*/*"
|
18
|
+
response:
|
19
|
+
status:
|
20
|
+
code: 200
|
21
|
+
message: OK
|
22
|
+
headers:
|
23
|
+
Access-Control-Allow-Origin:
|
24
|
+
- "*"
|
25
|
+
Content-Type:
|
26
|
+
- application/json
|
27
|
+
Date:
|
28
|
+
- Thu, 05 Nov 2015 07:49:48 GMT
|
29
|
+
Server:
|
30
|
+
- Google Frontend
|
31
|
+
Cache-Control:
|
32
|
+
- private
|
33
|
+
Alt-Svc:
|
34
|
+
- quic=":443"; p="1"; ma=604800
|
35
|
+
Transfer-Encoding:
|
36
|
+
- chunked
|
37
|
+
body:
|
38
|
+
encoding: UTF-8
|
39
|
+
string: '{"response":[{"success":true,"warning":{"message":"Anomaly detected:
|
40
|
+
time skew. User will be excluded from analytics."}}]}'
|
41
|
+
http_version:
|
42
|
+
recorded_at: Wed, 12 Aug 2015 00:00:00 GMT
|
43
|
+
recorded_with: VCR 2.9.3
|
@@ -0,0 +1,43 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://www.leanplum.com/api?action=multi&apiVersion=1.0.6&appId=<LEANPLUM_APP_ID>&clientKey=<LEANPLUM_PRODUCTION_KEY>&devMode=false&time=1439337600
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: '{"data":[{"userId":123456,"action":"setUserAttributes","userAttributes":{"first_name":"Mike","last_name":"Jones","gender":"m","email":"still_tippin@test.com","create_date":"2010-01-01"}}]}'
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.9.2
|
12
|
+
Content-Type:
|
13
|
+
- application/json
|
14
|
+
Accept-Encoding:
|
15
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
16
|
+
Accept:
|
17
|
+
- "*/*"
|
18
|
+
response:
|
19
|
+
status:
|
20
|
+
code: 200
|
21
|
+
message: OK
|
22
|
+
headers:
|
23
|
+
Access-Control-Allow-Origin:
|
24
|
+
- "*"
|
25
|
+
Content-Type:
|
26
|
+
- application/json
|
27
|
+
Date:
|
28
|
+
- Wed, 04 Nov 2015 20:50:02 GMT
|
29
|
+
Server:
|
30
|
+
- Google Frontend
|
31
|
+
Cache-Control:
|
32
|
+
- private
|
33
|
+
Alt-Svc:
|
34
|
+
- quic=":443"; p="1"; ma=604800
|
35
|
+
Transfer-Encoding:
|
36
|
+
- chunked
|
37
|
+
body:
|
38
|
+
encoding: UTF-8
|
39
|
+
string: '{"response":[{"success":true,"warning":{"message":"Anomaly detected:
|
40
|
+
time skew. User will be excluded from analytics."}}]}'
|
41
|
+
http_version:
|
42
|
+
recorded_at: Wed, 12 Aug 2015 00:00:00 GMT
|
43
|
+
recorded_with: VCR 2.9.3
|
@@ -0,0 +1,45 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://www.leanplum.com/api?action=multi&apiVersion=1.0.6&appId=<LEANPLUM_APP_ID>&clientKey=<LEANPLUM_PRODUCTION_KEY>&devMode=false&time=1439337600
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: '{"data":[{"userId":12345,"time":"1439337600","action":"track","event":"purchase","params":{"params":{"some_timestamp":"2015-05-01
|
9
|
+
01:02:03"}}},{"userId":54321,"time":"1439337000","action":"track","event":"purchase_page_view"}]}'
|
10
|
+
headers:
|
11
|
+
User-Agent:
|
12
|
+
- Faraday v0.9.2
|
13
|
+
Content-Type:
|
14
|
+
- application/json
|
15
|
+
Accept-Encoding:
|
16
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
17
|
+
Accept:
|
18
|
+
- "*/*"
|
19
|
+
response:
|
20
|
+
status:
|
21
|
+
code: 200
|
22
|
+
message: OK
|
23
|
+
headers:
|
24
|
+
Access-Control-Allow-Origin:
|
25
|
+
- "*"
|
26
|
+
Content-Type:
|
27
|
+
- application/json
|
28
|
+
Date:
|
29
|
+
- Wed, 04 Nov 2015 21:50:11 GMT
|
30
|
+
Server:
|
31
|
+
- Google Frontend
|
32
|
+
Cache-Control:
|
33
|
+
- private
|
34
|
+
Alt-Svc:
|
35
|
+
- quic=":443"; p="1"; ma=604800
|
36
|
+
Transfer-Encoding:
|
37
|
+
- chunked
|
38
|
+
body:
|
39
|
+
encoding: UTF-8
|
40
|
+
string: '{"response":[{"isOffline":true,"success":true,"warning":{"message":"Anomaly
|
41
|
+
detected: time skew. User will be excluded from analytics."}},{"success":true,"warning":{"message":"Anomaly
|
42
|
+
detected: time skew. User will be excluded from analytics."}}]}'
|
43
|
+
http_version:
|
44
|
+
recorded_at: Wed, 12 Aug 2015 00:00:00 GMT
|
45
|
+
recorded_with: VCR 2.9.3
|