devise 2.2.3 → 2.2.4

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of devise might be problematic. Click here for more details.

Files changed (66) hide show
  1. checksums.yaml +15 -0
  2. data/.travis.yml +0 -7
  3. data/.yardopts +9 -0
  4. data/CHANGELOG.rdoc +18 -0
  5. data/Gemfile +4 -4
  6. data/Gemfile.lock +57 -57
  7. data/README.md +8 -4
  8. data/Rakefile +1 -0
  9. data/app/controllers/devise/confirmations_controller.rb +1 -1
  10. data/app/controllers/devise/passwords_controller.rb +5 -2
  11. data/app/controllers/devise/sessions_controller.rb +0 -1
  12. data/app/controllers/devise/unlocks_controller.rb +2 -2
  13. data/app/controllers/devise_controller.rb +9 -4
  14. data/app/views/devise/registrations/edit.html.erb +1 -1
  15. data/devise.gemspec +1 -0
  16. data/devise.png +0 -0
  17. data/gemfiles/Gemfile.rails-3.1.x +4 -4
  18. data/gemfiles/Gemfile.rails-3.1.x.lock +56 -56
  19. data/lib/devise.rb +18 -2
  20. data/lib/devise/mailers/helpers.rb +5 -4
  21. data/lib/devise/models/authenticatable.rb +24 -8
  22. data/lib/devise/models/confirmable.rb +23 -3
  23. data/lib/devise/models/database_authenticatable.rb +15 -0
  24. data/lib/devise/models/omniauthable.rb +2 -2
  25. data/lib/devise/models/recoverable.rb +1 -1
  26. data/lib/devise/models/timeoutable.rb +1 -1
  27. data/lib/devise/param_filter.rb +8 -8
  28. data/lib/devise/rails/routes.rb +22 -17
  29. data/lib/devise/rails/warden_compat.rb +0 -29
  30. data/lib/devise/strategies/authenticatable.rb +8 -5
  31. data/lib/devise/strategies/token_authenticatable.rb +38 -3
  32. data/lib/devise/version.rb +1 -1
  33. data/lib/generators/devise/views_generator.rb +8 -2
  34. data/lib/generators/templates/devise.rb +10 -4
  35. data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +1 -1
  36. data/test/controllers/passwords_controller_test.rb +32 -0
  37. data/test/failure_app_test.rb +3 -3
  38. data/test/generators/views_generator_test.rb +16 -1
  39. data/test/helpers/devise_helper_test.rb +1 -1
  40. data/test/integration/authenticatable_test.rb +72 -25
  41. data/test/integration/confirmable_test.rb +6 -6
  42. data/test/integration/database_authenticatable_test.rb +1 -1
  43. data/test/integration/http_authenticatable_test.rb +19 -1
  44. data/test/integration/lockable_test.rb +1 -1
  45. data/test/integration/omniauthable_test.rb +2 -2
  46. data/test/integration/recoverable_test.rb +2 -2
  47. data/test/integration/registerable_test.rb +4 -4
  48. data/test/integration/rememberable_test.rb +9 -9
  49. data/test/integration/timeoutable_test.rb +1 -1
  50. data/test/integration/token_authenticatable_test.rb +45 -1
  51. data/test/integration/trackable_test.rb +1 -1
  52. data/test/mailers/confirmation_instructions_test.rb +11 -2
  53. data/test/mailers/reset_password_instructions_test.rb +11 -2
  54. data/test/mailers/unlock_instructions_test.rb +11 -1
  55. data/test/models/authenticatable_test.rb +3 -3
  56. data/test/models/confirmable_test.rb +17 -0
  57. data/test/models/database_authenticatable_test.rb +32 -0
  58. data/test/models/lockable_test.rb +1 -1
  59. data/test/models/rememberable_test.rb +4 -3
  60. data/test/models/serializable_test.rb +6 -6
  61. data/test/models/validatable_test.rb +3 -3
  62. data/test/models_test.rb +6 -1
  63. data/test/rails_app/app/mailers/users/mailer.rb +5 -1
  64. data/test/rails_app/config/routes.rb +13 -13
  65. data/test/test_helper.rb +1 -1
  66. metadata +23 -28
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ OTViYjg5MzA0NjcxY2Q4OTljYWM5N2M0ZmY5YjhkMWM1Y2U0MjUyZQ==
5
+ data.tar.gz: !binary |-
6
+ OGIzMDNlZGZjYzA2ODQ5ZTA5NjM5YzcwYzhiOTdlN2QzN2JiMmVlZg==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ NDc4MDY5NDFlOTMwNGVlMWVkNGY0NjVlNzZjN2NiMGVmODYzY2M3MjI5OTMz
10
+ NTNhYjBkOTRhMDNlNWU1MTFhZWRlOGUyMWUzZDZlNDEzOTZkNGNiYzM3OTMx
11
+ ZTE1NjM0MjEzYWJhMjQ1YTYyM2UyZWQwZjkyNjFhZDg2OWZhMjE=
12
+ data.tar.gz: !binary |-
13
+ MWE3MWZiZjExYWViNjk3ZjEzZWIzMzEwMDFhY2MyNmU1MDlhNzY1MjZmYjZk
14
+ N2UxZjRlZGFjZjFiNzVjZDNjZTQxMjNiZTA3MDc4ODYzYzZiZTc0M2IzNDY4
15
+ ZGRkZDdjMTNkZThiOTI1NWYzZDgwOTkwMTJiZTIyMjIyYjJhYjk=
@@ -4,18 +4,11 @@ rvm:
4
4
  - 1.8.7
5
5
  - 1.9.2
6
6
  - 1.9.3
7
- - ree
8
7
  env:
9
8
  - DEVISE_ORM=mongoid
10
9
  - DEVISE_ORM=active_record
11
10
  matrix:
12
11
  exclude:
13
- - rvm: ree
14
- env: DEVISE_ORM=mongoid
15
- gemfile: Gemfile
16
- - rvm: ree
17
- env: DEVISE_ORM=mongoid
18
- gemfile: gemfiles/Gemfile.rails-3.1.x
19
12
  - rvm: 1.8.7
20
13
  env: DEVISE_ORM=mongoid
21
14
  gemfile: Gemfile
@@ -0,0 +1,9 @@
1
+ --protected
2
+ --no-private
3
+ --embed-mixin ClassMethods
4
+ -
5
+ README.md
6
+ CHANGELOG.rdoc
7
+ CONTRIBUTING.md
8
+ MIT-LICENSE
9
+
@@ -1,5 +1,23 @@
1
+ == 2.2.4
2
+
3
+ * enhancements
4
+ * Add `destroy_with_password` to `DatabaseAuthenticatable`. Allows destroying a record when `:current_password` matches, similarly to how `update_with_password` works. (by @michiel3)
5
+ * Allow to override path after password resetting (by @worker8)
6
+ * Add `#skip_confirmation_notification!` method to `Confirmable`. Allows skipping confirmation email without auto-confirming. (by @gregates)
7
+ * allow_unconfirmed_access_for config from `:confirmable` module can be set to `nil` that means unconfirmed access for unlimited time. (by @nashby)
8
+ * Support Rails' token strategy on authentication (by @robhurring)
9
+ * Support explicitly setting the http authentication key via `config.http_authentication_key` (by @neo)
10
+
11
+ * bug fix
12
+ * Do not redirect when accessing devise API via JSON. (by @sebastianwr)
13
+ * Generating scoped devise views now uses the correct scoped shared links partial instead of the default devise one (by @nashby)
14
+ * Fix inheriting mailer templates from `Devise::Mailer`
15
+ * Fix a bug when procs are used as default mailer in Devise (by @tomasv)
16
+
1
17
  == 2.2.3
2
18
 
19
+ Security announcement: http://blog.plataformatec.com.br/2013/01/security-announcement-devise-v2-2-3-v2-1-3-v2-0-5-and-v1-5-3-released/
20
+
3
21
  * bug fix
4
22
  * Require string conversion for all values
5
23
 
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source "http://rubygems.org"
1
+ source "https://rubygems.org"
2
2
 
3
3
  gemspec
4
4
 
@@ -10,8 +10,8 @@ gem "rdoc"
10
10
  group :test do
11
11
  gem "omniauth-facebook"
12
12
  gem "omniauth-openid", "~> 1.0.1"
13
- gem "webrat", "0.7.2", :require => false
14
- gem "mocha", "0.10.0", :require => false
13
+ gem "webrat", "0.7.3", :require => false
14
+ gem "mocha", "~> 0.13.1", :require => false
15
15
  end
16
16
 
17
17
  platforms :jruby do
@@ -29,4 +29,4 @@ platforms :mri_19 do
29
29
  group :mongoid do
30
30
  gem "mongoid", "~> 3.0"
31
31
  end
32
- end
32
+ end
@@ -1,74 +1,74 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- devise (2.2.2)
4
+ devise (2.2.4)
5
5
  bcrypt-ruby (~> 3.0)
6
6
  orm_adapter (~> 0.1)
7
7
  railties (~> 3.1)
8
8
  warden (~> 1.2.1)
9
9
 
10
10
  GEM
11
- remote: http://rubygems.org/
11
+ remote: https://rubygems.org/
12
12
  specs:
13
- actionmailer (3.2.11)
14
- actionpack (= 3.2.11)
15
- mail (~> 2.4.4)
16
- actionpack (3.2.11)
17
- activemodel (= 3.2.11)
18
- activesupport (= 3.2.11)
13
+ actionmailer (3.2.13)
14
+ actionpack (= 3.2.13)
15
+ mail (~> 2.5.3)
16
+ actionpack (3.2.13)
17
+ activemodel (= 3.2.13)
18
+ activesupport (= 3.2.13)
19
19
  builder (~> 3.0.0)
20
20
  erubis (~> 2.7.0)
21
21
  journey (~> 1.0.4)
22
- rack (~> 1.4.0)
22
+ rack (~> 1.4.5)
23
23
  rack-cache (~> 1.2)
24
24
  rack-test (~> 0.6.1)
25
25
  sprockets (~> 2.2.1)
26
- activemodel (3.2.11)
27
- activesupport (= 3.2.11)
26
+ activemodel (3.2.13)
27
+ activesupport (= 3.2.13)
28
28
  builder (~> 3.0.0)
29
- activerecord (3.2.11)
30
- activemodel (= 3.2.11)
31
- activesupport (= 3.2.11)
29
+ activerecord (3.2.13)
30
+ activemodel (= 3.2.13)
31
+ activesupport (= 3.2.13)
32
32
  arel (~> 3.0.2)
33
33
  tzinfo (~> 0.3.29)
34
- activeresource (3.2.11)
35
- activemodel (= 3.2.11)
36
- activesupport (= 3.2.11)
37
- activesupport (3.2.11)
38
- i18n (~> 0.6)
34
+ activeresource (3.2.13)
35
+ activemodel (= 3.2.13)
36
+ activesupport (= 3.2.13)
37
+ activesupport (3.2.13)
38
+ i18n (= 0.6.1)
39
39
  multi_json (~> 1.0)
40
40
  arel (3.0.2)
41
41
  bcrypt-ruby (3.0.1)
42
42
  builder (3.0.4)
43
43
  erubis (2.7.0)
44
- faraday (0.8.4)
44
+ faraday (0.8.7)
45
45
  multipart-post (~> 1.1)
46
46
  hashie (1.2.0)
47
- hike (1.2.1)
47
+ hike (1.2.2)
48
48
  httpauth (0.2.0)
49
49
  i18n (0.6.1)
50
50
  journey (1.0.4)
51
- json (1.7.6)
52
- jwt (0.1.5)
53
- multi_json (>= 1.0)
54
- mail (2.4.4)
51
+ json (1.7.7)
52
+ jwt (0.1.8)
53
+ multi_json (>= 1.5)
54
+ mail (2.5.3)
55
55
  i18n (>= 0.4.0)
56
56
  mime-types (~> 1.16)
57
57
  treetop (~> 1.4.8)
58
58
  metaclass (0.0.1)
59
- mime-types (1.19)
60
- mocha (0.10.0)
59
+ mime-types (1.22)
60
+ mocha (0.13.3)
61
61
  metaclass (~> 0.0.1)
62
- mongoid (3.0.16)
63
- activemodel (~> 3.1)
64
- moped (~> 1.1)
62
+ mongoid (3.1.2)
63
+ activemodel (~> 3.2)
64
+ moped (~> 1.4.2)
65
65
  origin (~> 1.0)
66
66
  tzinfo (~> 0.3.22)
67
- moped (1.3.2)
68
- multi_json (1.5.0)
69
- multipart-post (1.1.5)
70
- nokogiri (1.5.5)
71
- oauth2 (0.8.0)
67
+ moped (1.4.5)
68
+ multi_json (1.7.2)
69
+ multipart-post (1.2.0)
70
+ nokogiri (1.5.9)
71
+ oauth2 (0.8.1)
72
72
  faraday (~> 0.8)
73
73
  httpauth (~> 0.1)
74
74
  jwt (~> 0.1.4)
@@ -88,50 +88,50 @@ GEM
88
88
  origin (1.0.11)
89
89
  orm_adapter (0.4.0)
90
90
  polyglot (0.3.3)
91
- rack (1.4.3)
91
+ rack (1.4.5)
92
92
  rack-cache (1.2)
93
93
  rack (>= 0.4)
94
94
  rack-openid (1.3.1)
95
95
  rack (>= 1.1.0)
96
96
  ruby-openid (>= 2.1.8)
97
- rack-ssl (1.3.2)
97
+ rack-ssl (1.3.3)
98
98
  rack
99
99
  rack-test (0.6.2)
100
100
  rack (>= 1.0)
101
- rails (3.2.11)
102
- actionmailer (= 3.2.11)
103
- actionpack (= 3.2.11)
104
- activerecord (= 3.2.11)
105
- activeresource (= 3.2.11)
106
- activesupport (= 3.2.11)
101
+ rails (3.2.13)
102
+ actionmailer (= 3.2.13)
103
+ actionpack (= 3.2.13)
104
+ activerecord (= 3.2.13)
105
+ activeresource (= 3.2.13)
106
+ activesupport (= 3.2.13)
107
107
  bundler (~> 1.0)
108
- railties (= 3.2.11)
109
- railties (3.2.11)
110
- actionpack (= 3.2.11)
111
- activesupport (= 3.2.11)
108
+ railties (= 3.2.13)
109
+ railties (3.2.13)
110
+ actionpack (= 3.2.13)
111
+ activesupport (= 3.2.13)
112
112
  rack-ssl (~> 1.3.2)
113
113
  rake (>= 0.8.7)
114
114
  rdoc (~> 3.4)
115
115
  thor (>= 0.14.6, < 2.0)
116
- rake (10.0.3)
117
- rdoc (3.12)
116
+ rake (10.0.4)
117
+ rdoc (3.12.2)
118
118
  json (~> 1.4)
119
- ruby-openid (2.2.2)
119
+ ruby-openid (2.2.3)
120
120
  sprockets (2.2.2)
121
121
  hike (~> 1.2)
122
122
  multi_json (~> 1.0)
123
123
  rack (~> 1.0)
124
124
  tilt (~> 1.1, != 1.3.0)
125
- sqlite3 (1.3.6)
126
- thor (0.16.0)
127
- tilt (1.3.3)
125
+ sqlite3 (1.3.7)
126
+ thor (0.18.1)
127
+ tilt (1.3.7)
128
128
  treetop (1.4.12)
129
129
  polyglot
130
130
  polyglot (>= 0.3.1)
131
- tzinfo (0.3.35)
131
+ tzinfo (0.3.37)
132
132
  warden (1.2.1)
133
133
  rack (>= 1.0)
134
- webrat (0.7.2)
134
+ webrat (0.7.3)
135
135
  nokogiri (>= 1.2.0)
136
136
  rack (>= 1.0)
137
137
  rack-test (>= 0.5.3)
@@ -144,7 +144,7 @@ DEPENDENCIES
144
144
  activerecord-jdbcsqlite3-adapter
145
145
  devise!
146
146
  jruby-openssl
147
- mocha (= 0.10.0)
147
+ mocha (~> 0.13.1)
148
148
  mongoid (~> 3.0)
149
149
  omniauth (~> 1.0.0)
150
150
  omniauth-facebook
@@ -153,4 +153,4 @@ DEPENDENCIES
153
153
  rails (~> 3.2.6)
154
154
  rdoc
155
155
  sqlite3
156
- webrat (= 0.7.2)
156
+ webrat (= 0.7.3)
data/README.md CHANGED
@@ -1,8 +1,10 @@
1
- ## Devise
1
+ ![Devise Logo](https://raw.github.com/plataformatec/devise/master/devise.png)
2
+
3
+ By [Plataformatec](http://plataformatec.com.br/).
2
4
 
3
- [![Build Status](https://secure.travis-ci.org/plataformatec/devise.png?branch=master)](http://travis-ci.org/plataformatec/devise)
4
- [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/plataformatec/devise)
5
5
  [![Gem Version](https://fury-badge.herokuapp.com/rb/devise.png)](http://badge.fury.io/rb/devise)
6
+ [![Build Status](https://api.travis-ci.org/plataformatec/devise.png?branch=master)](http://travis-ci.org/plataformatec/devise)
7
+ [![Code Climate](https://codeclimate.com/github/plataformatec/devise.png)](https://codeclimate.com/github/plataformatec/devise)
6
8
 
7
9
  This README is [also available in a friendly navigable format](http://devise.plataformatec.com.br/).
8
10
 
@@ -13,7 +15,7 @@ Devise is a flexible authentication solution for Rails based on Warden. It:
13
15
  * Allows you to have multiple roles (or models/scopes) signed in at the same time;
14
16
  * Is based on a modularity concept: use just what you really need.
15
17
 
16
- It's composed of 12 modules:
18
+ It's composed of 11 modules:
17
19
 
18
20
  * [Database Authenticatable](http://rubydoc.info/github/plataformatec/devise/master/Devise/Models/DatabaseAuthenticatable): encrypts and stores a password in the database to validate the authenticity of a user while signing in. The authentication can be done both through POST requests or HTTP Basic Authentication.
19
21
  * [Token Authenticatable](http://rubydoc.info/github/plataformatec/devise/master/Devise/Models/TokenAuthenticatable): signs in a user based on an authentication token (also known as "single access token"). The token can be given both through query string or HTTP Basic Authentication.
@@ -394,3 +396,5 @@ https://github.com/plataformatec/devise/contributors
394
396
  ## License
395
397
 
396
398
  MIT License. Copyright 2009-2013 Plataformatec. http://plataformatec.com.br
399
+
400
+ You are not granted rights or licenses to the trademarks of the Plataformatec, including without limitation the Devise name or logo.
data/Rakefile CHANGED
@@ -22,6 +22,7 @@ Rake::TestTask.new(:test) do |t|
22
22
  t.libs << 'test'
23
23
  t.pattern = 'test/**/*_test.rb'
24
24
  t.verbose = true
25
+ t.warning = false
25
26
  end
26
27
 
27
28
  desc 'Generate documentation for Devise.'
@@ -32,7 +32,7 @@ class Devise::ConfirmationsController < DeviseController
32
32
 
33
33
  # The path used after resending confirmation instructions.
34
34
  def after_resending_confirmation_instructions_path_for(resource_name)
35
- new_session_path(resource_name)
35
+ new_session_path(resource_name) if is_navigational_format?
36
36
  end
37
37
 
38
38
  # The path used after confirmation.
@@ -34,17 +34,20 @@ class Devise::PasswordsController < DeviseController
34
34
  flash_message = resource.active_for_authentication? ? :updated : :updated_not_active
35
35
  set_flash_message(:notice, flash_message) if is_navigational_format?
36
36
  sign_in(resource_name, resource)
37
- respond_with resource, :location => after_sign_in_path_for(resource)
37
+ respond_with resource, :location => after_resetting_password_path_for(resource)
38
38
  else
39
39
  respond_with resource
40
40
  end
41
41
  end
42
42
 
43
43
  protected
44
+ def after_resetting_password_path_for(resource)
45
+ after_sign_in_path_for(resource)
46
+ end
44
47
 
45
48
  # The path used after sending reset password instructions
46
49
  def after_sending_reset_password_instructions_path_for(resource_name)
47
- new_session_path(resource_name)
50
+ new_session_path(resource_name) if is_navigational_format?
48
51
  end
49
52
 
50
53
  # Check if a reset_password_token is provided in the request
@@ -45,4 +45,3 @@ class Devise::SessionsController < DeviseController
45
45
  { :scope => resource_name, :recall => "#{controller_path}#new" }
46
46
  end
47
47
  end
48
-
@@ -33,12 +33,12 @@ class Devise::UnlocksController < DeviseController
33
33
 
34
34
  # The path used after sending unlock password instructions
35
35
  def after_sending_unlock_instructions_path_for(resource)
36
- new_session_path(resource)
36
+ new_session_path(resource) if is_navigational_format?
37
37
  end
38
38
 
39
39
  # The path used after unlocking the resource
40
40
  def after_unlock_path_for(resource)
41
- new_session_path(resource)
41
+ new_session_path(resource) if is_navigational_format?
42
42
  end
43
43
 
44
44
  end
@@ -67,7 +67,7 @@ This may happen for two reasons:
67
67
  1) You forgot to wrap your route inside the scope block. For example:
68
68
 
69
69
  devise_scope :user do
70
- match "/some/route" => "some_devise_controller"
70
+ get "/some/route" => "some_devise_controller"
71
71
  end
72
72
 
73
73
  2) You are testing a Devise controller bypassing the router.
@@ -163,13 +163,18 @@ MESSAGE
163
163
  #
164
164
  # Please refer to README or en.yml locale file to check what messages are
165
165
  # available.
166
- def set_flash_message(key, kind, options={})
166
+ def set_flash_message(key, kind, options = {})
167
+ message = find_message(kind, options)
168
+ flash[key] = message if message.present?
169
+ end
170
+
171
+ # Get message for given
172
+ def find_message(kind, options = {})
167
173
  options[:scope] = "devise.#{controller_name}"
168
174
  options[:default] = Array(options[:default]).unshift(kind.to_sym)
169
175
  options[:resource_name] = resource_name
170
176
  options = devise_i18n_options(options) if respond_to?(:devise_i18n_options, true)
171
- message = I18n.t("#{options[:resource_name]}.#{kind}", options)
172
- flash[key] = message if message.present?
177
+ I18n.t("#{options[:resource_name]}.#{kind}", options)
173
178
  end
174
179
 
175
180
  def clean_up_passwords(object)
@@ -24,6 +24,6 @@
24
24
 
25
25
  <h3>Cancel my account</h3>
26
26
 
27
- <p>Unhappy? <%= button_to "Cancel my account", registration_path(resource_name), :data => { :confirm => "Are you sure?" }, :method => :delete %>.</p>
27
+ <p>Unhappy? <%= button_to "Cancel my account", registration_path(resource_name), :data => { :confirm => "Are you sure?" }, :method => :delete %></p>
28
28
 
29
29
  <%= link_to "Back", :back %>
@@ -6,6 +6,7 @@ Gem::Specification.new do |s|
6
6
  s.name = "devise"
7
7
  s.version = Devise::VERSION.dup
8
8
  s.platform = Gem::Platform::RUBY
9
+ s.licenses = ["MIT"]
9
10
  s.summary = "Flexible authentication solution for Rails with Warden"
10
11
  s.email = "contact@plataformatec.com.br"
11
12
  s.homepage = "http://github.com/plataformatec/devise"
Binary file
@@ -1,4 +1,4 @@
1
- source "http://rubygems.org"
1
+ source "https://rubygems.org"
2
2
 
3
3
  gem "devise", :path => ".."
4
4
 
@@ -10,8 +10,8 @@ gem "rdoc"
10
10
  group :test do
11
11
  gem "omniauth-facebook"
12
12
  gem "omniauth-openid", "~> 1.0.1"
13
- gem "webrat", "0.7.2", :require => false
14
- gem "mocha", "0.10.0", :require => false
13
+ gem "webrat", "0.7.3", :require => false
14
+ gem "mocha", "~> 0.13.1", :require => false
15
15
 
16
16
  platforms :mri_18 do
17
17
  gem "ruby-debug", ">= 0.10.3"
@@ -32,4 +32,4 @@ platforms :mri_19 do
32
32
  group :mongoid do
33
33
  gem "mongoid", "~> 3.0"
34
34
  end
35
- end
35
+ end