tesla_api 0.9.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +0 -2
  3. data/lib/tesla_api/vehicle.rb +32 -20
  4. data/lib/tesla_api/version.rb +1 -1
  5. data/spec/cassettes/vehicle-auto_conditioning_start.yml +130 -0
  6. data/spec/cassettes/vehicle-auto_conditioning_stop.yml +130 -0
  7. data/spec/cassettes/vehicle-charge_max_range-twice.yml +171 -0
  8. data/spec/cassettes/vehicle-charge_max_range.yml +130 -0
  9. data/spec/cassettes/vehicle-charge_port_door_open.yml +130 -0
  10. data/spec/cassettes/vehicle-charge_standard-twice.yml +171 -0
  11. data/spec/cassettes/vehicle-charge_standard.yml +130 -0
  12. data/spec/cassettes/vehicle-charge_start.yml +130 -0
  13. data/spec/cassettes/vehicle-charge_state.yml +130 -0
  14. data/spec/cassettes/vehicle-charge_stop.yml +130 -0
  15. data/spec/cassettes/vehicle-climate_state.yml +130 -0
  16. data/spec/cassettes/vehicle-door_lock.yml +130 -0
  17. data/spec/cassettes/vehicle-door_unlock.yml +130 -0
  18. data/spec/cassettes/vehicle-drive_state.yml +130 -0
  19. data/spec/cassettes/vehicle-flash_lights.yml +130 -0
  20. data/spec/cassettes/vehicle-gui_settings.yml +130 -0
  21. data/spec/cassettes/vehicle-honk_horn.yml +130 -0
  22. data/spec/cassettes/vehicle-mobile_enabled.yml +130 -0
  23. data/spec/cassettes/vehicle-open_frunk.yml +128 -0
  24. data/spec/cassettes/vehicle-open_trunk.yml +128 -0
  25. data/spec/cassettes/vehicle-remove_start_drive.yml +130 -0
  26. data/spec/cassettes/vehicle-set_charge_limit-1.yml +169 -0
  27. data/spec/cassettes/vehicle-set_charge_limit-100.yml +130 -0
  28. data/spec/cassettes/vehicle-set_charge_limit-50.yml +128 -0
  29. data/spec/cassettes/vehicle-set_charge_limit-90.yml +128 -0
  30. data/spec/cassettes/vehicle-set_temps-70-70.yml +130 -0
  31. data/spec/cassettes/vehicle-set_temps-75-65.yml +130 -0
  32. data/spec/cassettes/vehicle-sun_roof_control-close.yml +130 -0
  33. data/spec/cassettes/vehicle-sun_roof_control-comfort.yml +130 -0
  34. data/spec/cassettes/vehicle-sun_roof_control-open.yml +130 -0
  35. data/spec/cassettes/vehicle-sun_roof_control-vent.yml +130 -0
  36. data/spec/cassettes/vehicle-sun_roof_move-0.yml +130 -0
  37. data/spec/cassettes/vehicle-sun_roof_move-100.yml +130 -0
  38. data/spec/cassettes/vehicle-sun_roof_move-50.yml +130 -0
  39. data/spec/cassettes/vehicle-vehicle_state.yml +130 -0
  40. data/spec/cassettes/vehicle-wake_up.yml +130 -0
  41. data/spec/lib/tesla_api/vehicle_spec.rb +228 -0
  42. data/spec/spec_helper.rb +12 -4
  43. data/tesla_api.gemspec +2 -0
  44. metadata +102 -2
@@ -0,0 +1,130 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://owner-api.teslamotors.com/oauth/token
6
+ body:
7
+ encoding: UTF-8
8
+ string: grant_type=password&client_id=<TESLA_CLIENT_ID>&client_secret=<TESLA_CLIENT_SECRET>&email=<TESLA_EMAIL>&password=<TESLA_PASS>
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Server:
22
+ - nginx
23
+ Date:
24
+ - Wed, 17 Dec 2014 01:38:03 GMT
25
+ Content-Type:
26
+ - application/json; charset=utf-8
27
+ Transfer-Encoding:
28
+ - chunked
29
+ Connection:
30
+ - keep-alive
31
+ Status:
32
+ - 200 OK
33
+ Cache-Control:
34
+ - no-store
35
+ Pragma:
36
+ - no-cache
37
+ X-Ua-Compatible:
38
+ - IE=Edge,chrome=1
39
+ X-Request-Id:
40
+ - 37a528ec5d1196e53807fb17abeece6e
41
+ X-Runtime:
42
+ - '1.329704'
43
+ body:
44
+ encoding: UTF-8
45
+ string: '{"access_token":"75d223b8157db1dc22897bd03056dc6987703dbd3a440067b75282a0b2211dd4","token_type":"bearer","expires_in":7776000}'
46
+ http_version:
47
+ recorded_at: Wed, 17 Dec 2014 01:38:05 GMT
48
+ - request:
49
+ method: get
50
+ uri: https://owner-api.teslamotors.com/api/1/vehicles
51
+ body:
52
+ encoding: US-ASCII
53
+ string: ''
54
+ headers:
55
+ Authorization:
56
+ - Bearer 75d223b8157db1dc22897bd03056dc6987703dbd3a440067b75282a0b2211dd4
57
+ response:
58
+ status:
59
+ code: 200
60
+ message: OK
61
+ headers:
62
+ Server:
63
+ - nginx
64
+ Date:
65
+ - Wed, 17 Dec 2014 01:38:04 GMT
66
+ Content-Type:
67
+ - application/json; charset=utf-8
68
+ Content-Length:
69
+ - '446'
70
+ Connection:
71
+ - keep-alive
72
+ Status:
73
+ - 200 OK
74
+ X-Ua-Compatible:
75
+ - IE=Edge,chrome=1
76
+ Etag:
77
+ - '"c52908b8db9336f89e7a1602f3b2a458"'
78
+ Cache-Control:
79
+ - max-age=0, private, must-revalidate
80
+ X-Request-Id:
81
+ - 40789ea7d352c4be1c1e65d537c91cdb
82
+ X-Runtime:
83
+ - '0.293284'
84
+ body:
85
+ encoding: UTF-8
86
+ string: '{"response":[{"color":null,"display_name":"Nikola","id":1514029006966957156,"option_codes":"MS01,RENA,TM00,DRLH,PF00,BT85,PBCW,RFPO,WT19,IBMB,IDPB,TR00,SU01,SC01,TP01,AU01,CH00,HP00,PA00,PS00,AD02,X020,X025,X001,X003,X007,X011,X013,COUS","vehicle_id":490215852,"vin":"5YJSA1CN5CFP01657","tokens":["b1278e37b13e8df2","b2fd1ad42f706a73"],"state":"online","remote_start_enabled":true,"calendar_enabled":true,"notifications_enabled":true}],"count":1}'
87
+ http_version:
88
+ recorded_at: Wed, 17 Dec 2014 01:38:05 GMT
89
+ - request:
90
+ method: post
91
+ uri: https://owner-api.teslamotors.com/api/1/vehicles/1514029006966957156/command/sun_roof_control
92
+ body:
93
+ encoding: UTF-8
94
+ string: state=close
95
+ headers:
96
+ Authorization:
97
+ - Bearer 75d223b8157db1dc22897bd03056dc6987703dbd3a440067b75282a0b2211dd4
98
+ response:
99
+ status:
100
+ code: 200
101
+ message: OK
102
+ headers:
103
+ Server:
104
+ - nginx
105
+ Date:
106
+ - Wed, 17 Dec 2014 01:38:04 GMT
107
+ Content-Type:
108
+ - application/json; charset=utf-8
109
+ Content-Length:
110
+ - '40'
111
+ Connection:
112
+ - keep-alive
113
+ Status:
114
+ - 200 OK
115
+ X-Ua-Compatible:
116
+ - IE=Edge,chrome=1
117
+ Etag:
118
+ - '"f67eec105dd6522783a1f1bacc52723a"'
119
+ Cache-Control:
120
+ - max-age=0, private, must-revalidate
121
+ X-Request-Id:
122
+ - eb4260d20a22ce25e909b1cd034ad67d
123
+ X-Runtime:
124
+ - '0.201775'
125
+ body:
126
+ encoding: UTF-8
127
+ string: '{"response":{"reason":"","result":true}}'
128
+ http_version:
129
+ recorded_at: Wed, 17 Dec 2014 01:38:06 GMT
130
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,130 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://owner-api.teslamotors.com/oauth/token
6
+ body:
7
+ encoding: UTF-8
8
+ string: grant_type=password&client_id=<TESLA_CLIENT_ID>&client_secret=<TESLA_CLIENT_SECRET>&email=<TESLA_EMAIL>&password=<TESLA_PASS>
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Server:
22
+ - nginx
23
+ Date:
24
+ - Wed, 17 Dec 2014 01:38:51 GMT
25
+ Content-Type:
26
+ - application/json; charset=utf-8
27
+ Transfer-Encoding:
28
+ - chunked
29
+ Connection:
30
+ - keep-alive
31
+ Status:
32
+ - 200 OK
33
+ Cache-Control:
34
+ - no-store
35
+ Pragma:
36
+ - no-cache
37
+ X-Ua-Compatible:
38
+ - IE=Edge,chrome=1
39
+ X-Request-Id:
40
+ - 12b0aba8309866e30530a78509372916
41
+ X-Runtime:
42
+ - '0.628918'
43
+ body:
44
+ encoding: UTF-8
45
+ string: '{"access_token":"7479ba220bc87989e331317e4fe0826162c4a486d8b720b2b1b91fdf940b1671","token_type":"bearer","expires_in":7776000}'
46
+ http_version:
47
+ recorded_at: Wed, 17 Dec 2014 01:38:53 GMT
48
+ - request:
49
+ method: get
50
+ uri: https://owner-api.teslamotors.com/api/1/vehicles
51
+ body:
52
+ encoding: US-ASCII
53
+ string: ''
54
+ headers:
55
+ Authorization:
56
+ - Bearer 7479ba220bc87989e331317e4fe0826162c4a486d8b720b2b1b91fdf940b1671
57
+ response:
58
+ status:
59
+ code: 200
60
+ message: OK
61
+ headers:
62
+ Server:
63
+ - nginx
64
+ Date:
65
+ - Wed, 17 Dec 2014 01:38:52 GMT
66
+ Content-Type:
67
+ - application/json; charset=utf-8
68
+ Content-Length:
69
+ - '446'
70
+ Connection:
71
+ - keep-alive
72
+ Status:
73
+ - 200 OK
74
+ X-Ua-Compatible:
75
+ - IE=Edge,chrome=1
76
+ Etag:
77
+ - '"c52908b8db9336f89e7a1602f3b2a458"'
78
+ Cache-Control:
79
+ - max-age=0, private, must-revalidate
80
+ X-Request-Id:
81
+ - 77fbac9eddfa2d00da94d232272c9ff4
82
+ X-Runtime:
83
+ - '0.109701'
84
+ body:
85
+ encoding: UTF-8
86
+ string: '{"response":[{"color":null,"display_name":"Nikola","id":1514029006966957156,"option_codes":"MS01,RENA,TM00,DRLH,PF00,BT85,PBCW,RFPO,WT19,IBMB,IDPB,TR00,SU01,SC01,TP01,AU01,CH00,HP00,PA00,PS00,AD02,X020,X025,X001,X003,X007,X011,X013,COUS","vehicle_id":490215852,"vin":"5YJSA1CN5CFP01657","tokens":["b1278e37b13e8df2","b2fd1ad42f706a73"],"state":"online","remote_start_enabled":true,"calendar_enabled":true,"notifications_enabled":true}],"count":1}'
87
+ http_version:
88
+ recorded_at: Wed, 17 Dec 2014 01:38:54 GMT
89
+ - request:
90
+ method: post
91
+ uri: https://owner-api.teslamotors.com/api/1/vehicles/1514029006966957156/command/sun_roof_control
92
+ body:
93
+ encoding: UTF-8
94
+ string: state=comfort
95
+ headers:
96
+ Authorization:
97
+ - Bearer 7479ba220bc87989e331317e4fe0826162c4a486d8b720b2b1b91fdf940b1671
98
+ response:
99
+ status:
100
+ code: 200
101
+ message: OK
102
+ headers:
103
+ Server:
104
+ - nginx
105
+ Date:
106
+ - Wed, 17 Dec 2014 01:38:53 GMT
107
+ Content-Type:
108
+ - application/json; charset=utf-8
109
+ Content-Length:
110
+ - '40'
111
+ Connection:
112
+ - keep-alive
113
+ Status:
114
+ - 200 OK
115
+ X-Ua-Compatible:
116
+ - IE=Edge,chrome=1
117
+ Etag:
118
+ - '"f67eec105dd6522783a1f1bacc52723a"'
119
+ Cache-Control:
120
+ - max-age=0, private, must-revalidate
121
+ X-Request-Id:
122
+ - 990fdfa3928222ce8e13cd13bdcfd393
123
+ X-Runtime:
124
+ - '0.210502'
125
+ body:
126
+ encoding: UTF-8
127
+ string: '{"response":{"reason":"","result":true}}'
128
+ http_version:
129
+ recorded_at: Wed, 17 Dec 2014 01:38:55 GMT
130
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,130 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://owner-api.teslamotors.com/oauth/token
6
+ body:
7
+ encoding: UTF-8
8
+ string: grant_type=password&client_id=<TESLA_CLIENT_ID>&client_secret=<TESLA_CLIENT_SECRET>&email=<TESLA_EMAIL>&password=<TESLA_PASS>
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Server:
22
+ - nginx
23
+ Date:
24
+ - Wed, 17 Dec 2014 01:37:32 GMT
25
+ Content-Type:
26
+ - application/json; charset=utf-8
27
+ Transfer-Encoding:
28
+ - chunked
29
+ Connection:
30
+ - keep-alive
31
+ Status:
32
+ - 200 OK
33
+ Cache-Control:
34
+ - no-store
35
+ Pragma:
36
+ - no-cache
37
+ X-Ua-Compatible:
38
+ - IE=Edge,chrome=1
39
+ X-Request-Id:
40
+ - 2a472a2d92b75a359e54d320c448e342
41
+ X-Runtime:
42
+ - '0.489640'
43
+ body:
44
+ encoding: UTF-8
45
+ string: '{"access_token":"176193015e95404364d9ec03d9939d589ba7b8f9d60d4561adc302895800f7af","token_type":"bearer","expires_in":7776000}'
46
+ http_version:
47
+ recorded_at: Wed, 17 Dec 2014 01:37:34 GMT
48
+ - request:
49
+ method: get
50
+ uri: https://owner-api.teslamotors.com/api/1/vehicles
51
+ body:
52
+ encoding: US-ASCII
53
+ string: ''
54
+ headers:
55
+ Authorization:
56
+ - Bearer 176193015e95404364d9ec03d9939d589ba7b8f9d60d4561adc302895800f7af
57
+ response:
58
+ status:
59
+ code: 200
60
+ message: OK
61
+ headers:
62
+ Server:
63
+ - nginx
64
+ Date:
65
+ - Wed, 17 Dec 2014 01:37:33 GMT
66
+ Content-Type:
67
+ - application/json; charset=utf-8
68
+ Content-Length:
69
+ - '446'
70
+ Connection:
71
+ - keep-alive
72
+ Status:
73
+ - 200 OK
74
+ X-Ua-Compatible:
75
+ - IE=Edge,chrome=1
76
+ Etag:
77
+ - '"c52908b8db9336f89e7a1602f3b2a458"'
78
+ Cache-Control:
79
+ - max-age=0, private, must-revalidate
80
+ X-Request-Id:
81
+ - d4764fa01664a9cdba0ae55d93bff5ff
82
+ X-Runtime:
83
+ - '0.166348'
84
+ body:
85
+ encoding: UTF-8
86
+ string: '{"response":[{"color":null,"display_name":"Nikola","id":1514029006966957156,"option_codes":"MS01,RENA,TM00,DRLH,PF00,BT85,PBCW,RFPO,WT19,IBMB,IDPB,TR00,SU01,SC01,TP01,AU01,CH00,HP00,PA00,PS00,AD02,X020,X025,X001,X003,X007,X011,X013,COUS","vehicle_id":490215852,"vin":"5YJSA1CN5CFP01657","tokens":["b1278e37b13e8df2","b2fd1ad42f706a73"],"state":"online","remote_start_enabled":true,"calendar_enabled":true,"notifications_enabled":true}],"count":1}'
87
+ http_version:
88
+ recorded_at: Wed, 17 Dec 2014 01:37:35 GMT
89
+ - request:
90
+ method: post
91
+ uri: https://owner-api.teslamotors.com/api/1/vehicles/1514029006966957156/command/sun_roof_control
92
+ body:
93
+ encoding: UTF-8
94
+ string: state=open
95
+ headers:
96
+ Authorization:
97
+ - Bearer 176193015e95404364d9ec03d9939d589ba7b8f9d60d4561adc302895800f7af
98
+ response:
99
+ status:
100
+ code: 200
101
+ message: OK
102
+ headers:
103
+ Server:
104
+ - nginx
105
+ Date:
106
+ - Wed, 17 Dec 2014 01:37:34 GMT
107
+ Content-Type:
108
+ - application/json; charset=utf-8
109
+ Content-Length:
110
+ - '40'
111
+ Connection:
112
+ - keep-alive
113
+ Status:
114
+ - 200 OK
115
+ X-Ua-Compatible:
116
+ - IE=Edge,chrome=1
117
+ Etag:
118
+ - '"f67eec105dd6522783a1f1bacc52723a"'
119
+ Cache-Control:
120
+ - max-age=0, private, must-revalidate
121
+ X-Request-Id:
122
+ - 62d71473830c3e1ac22485d57ecfa6e7
123
+ X-Runtime:
124
+ - '0.597655'
125
+ body:
126
+ encoding: UTF-8
127
+ string: '{"response":{"reason":"","result":true}}'
128
+ http_version:
129
+ recorded_at: Wed, 17 Dec 2014 01:37:36 GMT
130
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,130 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://owner-api.teslamotors.com/oauth/token
6
+ body:
7
+ encoding: UTF-8
8
+ string: grant_type=password&client_id=<TESLA_CLIENT_ID>&client_secret=<TESLA_CLIENT_SECRET>&email=<TESLA_EMAIL>&password=<TESLA_PASS>
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Server:
22
+ - nginx
23
+ Date:
24
+ - Wed, 17 Dec 2014 01:38:28 GMT
25
+ Content-Type:
26
+ - application/json; charset=utf-8
27
+ Transfer-Encoding:
28
+ - chunked
29
+ Connection:
30
+ - keep-alive
31
+ Status:
32
+ - 200 OK
33
+ Cache-Control:
34
+ - no-store
35
+ Pragma:
36
+ - no-cache
37
+ X-Ua-Compatible:
38
+ - IE=Edge,chrome=1
39
+ X-Request-Id:
40
+ - f32877a3d636f564fcc3dfa3c5ebb704
41
+ X-Runtime:
42
+ - '0.446893'
43
+ body:
44
+ encoding: UTF-8
45
+ string: '{"access_token":"4aa8a5d21af55946a667c552c040ad37c1302ef7412d6ad4f91a5b998098e223","token_type":"bearer","expires_in":7776000}'
46
+ http_version:
47
+ recorded_at: Wed, 17 Dec 2014 01:38:30 GMT
48
+ - request:
49
+ method: get
50
+ uri: https://owner-api.teslamotors.com/api/1/vehicles
51
+ body:
52
+ encoding: US-ASCII
53
+ string: ''
54
+ headers:
55
+ Authorization:
56
+ - Bearer 4aa8a5d21af55946a667c552c040ad37c1302ef7412d6ad4f91a5b998098e223
57
+ response:
58
+ status:
59
+ code: 200
60
+ message: OK
61
+ headers:
62
+ Server:
63
+ - nginx
64
+ Date:
65
+ - Wed, 17 Dec 2014 01:38:29 GMT
66
+ Content-Type:
67
+ - application/json; charset=utf-8
68
+ Content-Length:
69
+ - '446'
70
+ Connection:
71
+ - keep-alive
72
+ Status:
73
+ - 200 OK
74
+ X-Ua-Compatible:
75
+ - IE=Edge,chrome=1
76
+ Etag:
77
+ - '"c52908b8db9336f89e7a1602f3b2a458"'
78
+ Cache-Control:
79
+ - max-age=0, private, must-revalidate
80
+ X-Request-Id:
81
+ - 21c90f55aa97906ceb9ee6d760db95a2
82
+ X-Runtime:
83
+ - '0.049677'
84
+ body:
85
+ encoding: UTF-8
86
+ string: '{"response":[{"color":null,"display_name":"Nikola","id":1514029006966957156,"option_codes":"MS01,RENA,TM00,DRLH,PF00,BT85,PBCW,RFPO,WT19,IBMB,IDPB,TR00,SU01,SC01,TP01,AU01,CH00,HP00,PA00,PS00,AD02,X020,X025,X001,X003,X007,X011,X013,COUS","vehicle_id":490215852,"vin":"5YJSA1CN5CFP01657","tokens":["b1278e37b13e8df2","b2fd1ad42f706a73"],"state":"online","remote_start_enabled":true,"calendar_enabled":true,"notifications_enabled":true}],"count":1}'
87
+ http_version:
88
+ recorded_at: Wed, 17 Dec 2014 01:38:30 GMT
89
+ - request:
90
+ method: post
91
+ uri: https://owner-api.teslamotors.com/api/1/vehicles/1514029006966957156/command/sun_roof_control
92
+ body:
93
+ encoding: UTF-8
94
+ string: state=vent
95
+ headers:
96
+ Authorization:
97
+ - Bearer 4aa8a5d21af55946a667c552c040ad37c1302ef7412d6ad4f91a5b998098e223
98
+ response:
99
+ status:
100
+ code: 200
101
+ message: OK
102
+ headers:
103
+ Server:
104
+ - nginx
105
+ Date:
106
+ - Wed, 17 Dec 2014 01:38:29 GMT
107
+ Content-Type:
108
+ - application/json; charset=utf-8
109
+ Content-Length:
110
+ - '40'
111
+ Connection:
112
+ - keep-alive
113
+ Status:
114
+ - 200 OK
115
+ X-Ua-Compatible:
116
+ - IE=Edge,chrome=1
117
+ Etag:
118
+ - '"f67eec105dd6522783a1f1bacc52723a"'
119
+ Cache-Control:
120
+ - max-age=0, private, must-revalidate
121
+ X-Request-Id:
122
+ - 97f6146c763f378f02bfa9cd458f8811
123
+ X-Runtime:
124
+ - '0.224517'
125
+ body:
126
+ encoding: UTF-8
127
+ string: '{"response":{"reason":"","result":true}}'
128
+ http_version:
129
+ recorded_at: Wed, 17 Dec 2014 01:38:31 GMT
130
+ recorded_with: VCR 2.9.3