beaker 2.5.1 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. checksums.yaml +8 -8
  2. data/HISTORY.md +184 -2
  3. data/acceptance/fixtures/README.md +3 -0
  4. data/acceptance/fixtures/module/Gemfile +12 -0
  5. data/acceptance/fixtures/module/README.md +79 -0
  6. data/acceptance/fixtures/module/Rakefile +18 -0
  7. data/acceptance/fixtures/module/lib/empty.txt +1 -0
  8. data/acceptance/fixtures/module/manifests/init.pp +41 -0
  9. data/acceptance/fixtures/module/metadata.json +14 -0
  10. data/acceptance/fixtures/module/spec/acceptance/demo_spec.rb +72 -0
  11. data/acceptance/fixtures/module/spec/acceptance/nodesets/centos-59-x64.yml +10 -0
  12. data/acceptance/fixtures/module/spec/acceptance/nodesets/centos-64-x64-pe.yml +12 -0
  13. data/acceptance/fixtures/module/spec/acceptance/nodesets/centos-64-x64.yml +10 -0
  14. data/acceptance/fixtures/module/spec/acceptance/nodesets/centos-65-x64.yml +10 -0
  15. data/acceptance/fixtures/module/spec/acceptance/nodesets/default.yml +10 -0
  16. data/acceptance/fixtures/module/spec/acceptance/nodesets/fedora-18-x64.yml +10 -0
  17. data/acceptance/fixtures/module/spec/acceptance/nodesets/internal-vpool.yml +17 -0
  18. data/acceptance/fixtures/module/spec/acceptance/nodesets/sles-11-x64.yml +10 -0
  19. data/acceptance/fixtures/module/spec/acceptance/nodesets/ubuntu-server-10044-x64.yml +10 -0
  20. data/acceptance/fixtures/module/spec/acceptance/nodesets/ubuntu-server-12042-x64.yml +10 -0
  21. data/acceptance/fixtures/module/spec/acceptance/nodesets/ubuntu-server-1404-x64.yml +11 -0
  22. data/acceptance/fixtures/module/spec/acceptance/nodesets/ubuntu-server-14042-x64.yml +16 -0
  23. data/acceptance/fixtures/module/spec/classes/init_spec.rb +7 -0
  24. data/acceptance/fixtures/module/spec/spec_helper.rb +1 -0
  25. data/acceptance/fixtures/module/spec/spec_helper_acceptance.rb +38 -0
  26. data/acceptance/fixtures/module/tests/init.pp +12 -0
  27. data/acceptance/fixtures/module/vendor/bundle/ruby/gems.txt +1 -0
  28. data/acceptance/pre_suite/README.md +7 -0
  29. data/acceptance/tests/base/README.md +4 -0
  30. data/acceptance/tests/base/host.rb +154 -0
  31. data/acceptance/tests/puppet/README.md +3 -0
  32. data/lib/beaker/answers/version20.rb +1 -1
  33. data/lib/beaker/answers/version28.rb +1 -1
  34. data/lib/beaker/answers/version30.rb +1 -1
  35. data/lib/beaker/dsl/helpers.rb +12 -2
  36. data/lib/beaker/dsl/install_utils.rb +16 -6
  37. data/lib/beaker/host.rb +79 -13
  38. data/lib/beaker/host/pswindows/exec.rb +4 -0
  39. data/lib/beaker/host/unix.rb +3 -12
  40. data/lib/beaker/host/windows.rb +2 -11
  41. data/lib/beaker/host/windows/file.rb +1 -1
  42. data/lib/beaker/host/windows/pkg.rb +1 -1
  43. data/lib/beaker/host_prebuilt_steps.rb +1 -1
  44. data/lib/beaker/hypervisor.rb +4 -2
  45. data/lib/beaker/hypervisor/{vcloud_pooled.rb → vmpooler.rb} +10 -14
  46. data/lib/beaker/options/presets.rb +1 -0
  47. data/lib/beaker/version.rb +1 -1
  48. data/spec/beaker/dsl/helpers_spec.rb +16 -0
  49. data/spec/beaker/dsl/install_utils_spec.rb +7 -6
  50. data/spec/beaker/host_spec.rb +13 -11
  51. data/spec/beaker/hypervisor/hypervisor_spec.rb +2 -2
  52. data/spec/beaker/hypervisor/{vcloud_pooled_spec.rb → vmpooler_spec.rb} +20 -20
  53. metadata +33 -4
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NTAxNmJlODdhMDI1ODUxMTExMDEzZDQ5ODllMjliZDdmZDVlODU4NQ==
4
+ Yjk0OGJjNzMzZmM2NTA1OWFlMDRlNzI3YmM0MTI5MjUxZGQwNTU5MA==
5
5
  data.tar.gz: !binary |-
6
- YjU0MTg3ZTI3ZmFiMGNlYTdjOTFjZmJhYTUzOWI0NDkzODk0OTAzOA==
6
+ Mjk2ZDUyY2JkY2MzZTc2Yjg2YTcwYWNkN2RjZThjMmVjZWY0ZGU0Zg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- YjU5NTJkOTRlYTg5NGRjMjgzMDU3N2RkNzUxMDM1YmY5MjFlNDBjNDc3ZjM4
10
- NWVkMTg2ZmU2ZmUzZTU3MGU4ZDU5YjhjYjRjNmQzOGVlNzMxYTdkODBhMDFj
11
- YTY3OTEyNzdiZjM5MjEwMWU5M2RmOWFkZGUzMGFiMDA4YzFjMjA=
9
+ MTAwMDc2MTllMzg1NTU5ODQ0ODUxY2U3N2I5NGRiMTA3MGE3ZDQ4ZDFlMTQ1
10
+ Y2JmNTY0N2MxNmI0ZjUzYjE2ZDhkNTdhYWNmZDIxOWViMWYxNWNiZDlkN2Qx
11
+ YWQxMjVlNGZjZDA0OGEwODZjYmY0NjM3YjAwYzI2MDUyYTI4NWU=
12
12
  data.tar.gz: !binary |-
13
- MWY1N2ZmYzBiNGFlMjQyOTdlOTUyMTIwOTU3NDE4NTMxNWI1ZTJkMTEwOWVm
14
- MjllNzM3ODUxMDUyMWZkMzAwYWM2OTFmNTgzZjI4NThmOGM4YTI5NDBmOGMw
15
- ODNhY2M4ZGM3ZDEwNTBhZmZmNzBlOWMyYmE5MWM1MWYwY2MwZDY=
13
+ MjZmZWZkYjYyMTkzN2Y1MmJiNmJiNjYxMDQ5ZWZjZTljNjFmNDU3N2M3MmIy
14
+ NGE4ZDAzYWNlZmIwNWVlMDQ4ODEzN2EyYTI5ZTEwOGU1N2NkMzRlNzk3ZjRj
15
+ YmE0YzU4NDAxMDFhNzM4ZjY2YTVlZWYyNjExMmMxYzU2MDg2YWE=
data/HISTORY.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # default - History
2
2
  ## Tags
3
- * [LATEST - 4 Mar, 2015 (958ab02d)](#LATEST)
3
+ * [LATEST - 12 Mar, 2015 (b63d3d11)](#LATEST)
4
+ * [beaker2.5.1 - 4 Mar, 2015 (009c2c63)](#beaker2.5.1)
4
5
  * [beaker2.5.0 - 23 Feb, 2015 (c421cf95)](#beaker2.5.0)
5
6
  * [beaker2.4.1 - 13 Feb, 2015 (84400ed1)](#beaker2.4.1)
6
7
  * [beaker2.4.0 - 13 Feb, 2015 (bc5a6676)](#beaker2.4.0)
@@ -72,7 +73,188 @@
72
73
  * [pe1.2 - 6 Sep, 2011 (ba3dadd2)](#pe1.2)
73
74
 
74
75
  ## Details
75
- ### <a name = "LATEST">LATEST - 4 Mar, 2015 (958ab02d)
76
+ ### <a name = "LATEST">LATEST - 12 Mar, 2015 (b63d3d11)
77
+
78
+ * (GEM) update beaker version to 2.6.0 (b63d3d11)
79
+
80
+ * Merge pull request #741 from anodelman/maint (d797fe23)
81
+
82
+
83
+ ```
84
+ Merge pull request #741 from anodelman/maint
85
+
86
+ (BKR-8) PE 3.8 on Sles11 can't find puppet in path after install...
87
+ ```
88
+ * (BKR-8) PE 3.8 on Sles11 can't find puppet in path after install... (d53d1db9)
89
+
90
+
91
+ ```
92
+ (BKR-8) PE 3.8 on Sles11 can't find puppet in path after install...
93
+
94
+ ... completes successfully.
95
+
96
+ - add the ~/.ssh/environment to a /etc/profile.d/beaker_env.sh script
97
+ - ensure that beaker_env.sh is kept up to date and correct with state of
98
+ current env
99
+ ```
100
+ * Merge pull request #666 from petems/MAINT-fix_mkdir_bug (9d59deab)
101
+
102
+
103
+ ```
104
+ Merge pull request #666 from petems/MAINT-fix_mkdir_bug
105
+
106
+ (MAINT) Fix mkdir bug on PSWindows and fix test
107
+ ```
108
+ * Merge pull request #738 from demophoon/fix/master/qeng-1970-custom-answers-windows-guard (80de6cbe)
109
+
110
+
111
+ ```
112
+ Merge pull request #738 from demophoon/fix/master/qeng-1970-custom-answers-windows-guard
113
+
114
+ (QENG-1970) Guard against merging custom answers on Windows
115
+ ```
116
+ * Merge pull request #739 from kevpl/qeng1969_aio_pathsupdate (c066aef1)
117
+
118
+
119
+ ```
120
+ Merge pull request #739 from kevpl/qeng1969_aio_pathsupdate
121
+
122
+ (QENG-1969) fixed PE privatebindir default
123
+ ```
124
+ * Merge pull request #730 from anodelman/acceptance (2ba9cd51)
125
+
126
+
127
+ ```
128
+ Merge pull request #730 from anodelman/acceptance
129
+
130
+ (QENG-1869) create beaker host.rb acceptance tests
131
+ ```
132
+ * Merge pull request #740 from anodelman/maint (24c90744)
133
+
134
+
135
+ ```
136
+ Merge pull request #740 from anodelman/maint
137
+
138
+ (gh-702) sshd restart doesn't work with some el6...
139
+ ```
140
+ * (gh-702) sshd restart doesn't work with some el6... (f3b9035f)
141
+
142
+
143
+ ```
144
+ (gh-702) sshd restart doesn't work with some el6...
145
+
146
+ ... variants especially centos - with vagrant provisioner
147
+
148
+ For centos6 & vagrant, this pull fixed it: https://github.com/puppetlabs/beaker/pull/545
149
+ & fixing https://github.com/puppetlabs/beaker/issues/656 re-broke it by undoing pull 545
150
+
151
+ - Instead of service sshd restart, service sshd reload fixes the issue.
152
+ Even systemctl takes reload.
153
+ ```
154
+ * (QENG-1969) fixed PE privatebindir default (768b1ed0)
155
+
156
+ * (QENG-1970) Guard against merging custom answers on Windows (5c7e31c2)
157
+
158
+
159
+ ```
160
+ (QENG-1970) Guard against merging custom answers on Windows
161
+
162
+ Before this commit Beaker would attempt to merge custom answers on
163
+ platforms where answers are not used. This commit guards against merging
164
+ custom answers unless there are already answers specified.
165
+ ```
166
+ * Merge pull request #736 from kevpl/qeng1946_aio_pathsupdate (7d0cccf2)
167
+
168
+
169
+ ```
170
+ Merge pull request #736 from kevpl/qeng1946_aio_pathsupdate
171
+
172
+ (QENG-1946) removed paths from AIO host defaults in windows & unix
173
+ ```
174
+ * Merge pull request #735 from Iristyle/ticket/master/QENG-1955-Windows-File-exist-failures-on-Windows-2003 (a42d8ab5)
175
+
176
+
177
+ ```
178
+ Merge pull request #735 from Iristyle/ticket/master/QENG-1955-Windows-File-exist-failures-on-Windows-2003
179
+
180
+ (QENG-1955) Windows::File.file_exist? fails on 2003
181
+ ```
182
+ * (QENG-1955) Windows::File.file_exist? fails on 2003 (f21d2226)
183
+
184
+
185
+ ```
186
+ (QENG-1955) Windows::File.file_exist? fails on 2003
187
+
188
+ - In 9c32cac7a7a5bf52f21b628b14ddba9bfc44510c a change was
189
+ introduced to add a new Windows::File.file_exist? method
190
+ that relied on using test -e. The code assumes that the
191
+ path does not contain spaces and does not need to be
192
+ quoted.
193
+
194
+ Unfortunately, this assumption is incorrect and causes
195
+ pre-suites to fail because this test is performed on
196
+ Puppets :vardir. On Windows, Puppets :vardir is always
197
+ rooted at %ALLUSERSPROFILE%\PuppetLabs
198
+
199
+ When running on Windows 2008 or higher, the
200
+ %ALLUSERSPROFILE% directory is C:\ProgramData\
201
+
202
+ However, on Windows 2003, the path structure is different
203
+ and that directory is located at
204
+ C:\Documents and Settings\All Users\Application Data
205
+
206
+ With an unquoted path passed to test -e a failure is
207
+ generated, which breaks Windows pre-suites on 2003.
208
+ ```
209
+ * (QENG-1946) removed paths from AIO host defaults in windows & unix (0b7afd49)
210
+
211
+ * Merge pull request #729 from sschneid/rename_vcloudpooled_vmpooler (6cd29bbf)
212
+
213
+
214
+ ```
215
+ Merge pull request #729 from sschneid/rename_vcloudpooled_vmpooler
216
+
217
+ (maint) VcloudPooled -> Vmpooler
218
+ ```
219
+ * (maint) VcloudPooled -> Vmpooler (e1723437)
220
+
221
+
222
+ ```
223
+ (maint) VcloudPooled -> Vmpooler
224
+
225
+ This PR renames the 'VcloudPooled' hypervisor to 'Vmpooler', and
226
+ includes a few fixups as ride-alongs:
227
+
228
+ - resourcepool, folder, datastore not needed for Vmpooler
229
+ - small syntax/wording changes
230
+ ```
231
+ * (QENG-1869) create beaker host.rb acceptance tests (3474a114)
232
+
233
+
234
+ ```
235
+ (QENG-1869) create beaker host.rb acceptance tests
236
+
237
+ - tests that exercise basic host.rb functionality
238
+ ```
239
+ * (MAINT) Fixing mkdir_p POSH command (f57354de)
240
+
241
+
242
+ ```
243
+ (MAINT) Fixing mkdir_p POSH command
244
+
245
+ Test was set to test for the wrong command:
246
+
247
+
248
+ ruby
249
+ .with("if not exist test\\test\\test (md )")
250
+
251
+
252
+
253
+ So the directory would never get made, as the `md` bit was empty. Fixed spec and code to create command
254
+ ```
255
+ ### <a name = "beaker2.5.1">beaker2.5.1 - 4 Mar, 2015 (009c2c63)
256
+
257
+ * (HISTORY) update beaker history for gem release 2.5.1 (009c2c63)
76
258
 
77
259
  * (GEM) update beaker version to 2.5.1 (958ab02d)
78
260
 
@@ -0,0 +1,3 @@
1
+ # Beaker Acceptance Tests: fixtures
2
+
3
+ Any files needed to execute Beaker acceptance tests.
@@ -0,0 +1,12 @@
1
+ source 'https://rubygems.org'
2
+
3
+ puppetversion = ENV.key?('PUPPET_VERSION') ? "= #{ENV['PUPPET_VERSION']}" : ['>= 3.3']
4
+ gem 'puppet', puppetversion
5
+ gem 'puppetlabs_spec_helper', '>= 0.1.0'
6
+ gem 'puppet-lint', '>= 0.3.2'
7
+ gem 'facter', '>= 1.7.0'
8
+
9
+ group :system_tests do
10
+ gem 'beaker-rspec', :require => false
11
+ gem 'serverspec', :require => false
12
+ end
@@ -0,0 +1,79 @@
1
+ # demo
2
+
3
+ #### Table of Contents
4
+
5
+ 1. [Overview](#overview)
6
+ 2. [Module Description - What the module does and why it is useful](#module-description)
7
+ 3. [Setup - The basics of getting started with demo](#setup)
8
+ * [What demo affects](#what-demo-affects)
9
+ * [Setup requirements](#setup-requirements)
10
+ * [Beginning with demo](#beginning-with-demo)
11
+ 4. [Usage - Configuration options and additional functionality](#usage)
12
+ 5. [Reference - An under-the-hood peek at what the module is doing and how](#reference)
13
+ 5. [Limitations - OS compatibility, etc.](#limitations)
14
+ 6. [Development - Guide for contributing to the module](#development)
15
+
16
+ ## Overview
17
+
18
+ A one-maybe-two sentence summary of what the module does/what problem it solves.
19
+ This is your 30 second elevator pitch for your module. Consider including
20
+ OS/Puppet version it works with.
21
+
22
+ ## Module Description
23
+
24
+ If applicable, this section should have a brief description of the technology
25
+ the module integrates with and what that integration enables. This section
26
+ should answer the questions: "What does this module *do*?" and "Why would I use
27
+ it?"
28
+
29
+ If your module has a range of functionality (installation, configuration,
30
+ management, etc.) this is the time to mention it.
31
+
32
+ ## Setup
33
+
34
+ ### What demo affects
35
+
36
+ * A list of files, packages, services, or operations that the module will alter,
37
+ impact, or execute on the system it's installed on.
38
+ * This is a great place to stick any warnings.
39
+ * Can be in list or paragraph form.
40
+
41
+ ### Setup Requirements **OPTIONAL**
42
+
43
+ If your module requires anything extra before setting up (pluginsync enabled,
44
+ etc.), mention it here.
45
+
46
+ ### Beginning with demo
47
+
48
+ The very basic steps needed for a user to get the module up and running.
49
+
50
+ If your most recent release breaks compatibility or requires particular steps
51
+ for upgrading, you may wish to include an additional section here: Upgrading
52
+ (For an example, see http://forge.puppetlabs.com/puppetlabs/firewall).
53
+
54
+ ## Usage
55
+
56
+ Put the classes, types, and resources for customizing, configuring, and doing
57
+ the fancy stuff with your module here.
58
+
59
+ ## Reference
60
+
61
+ Here, list the classes, types, providers, facts, etc contained in your module.
62
+ This section should include all of the under-the-hood workings of your module so
63
+ people know what the module is touching on their system but don't need to mess
64
+ with things. (We are working on automating this section!)
65
+
66
+ ## Limitations
67
+
68
+ This is where you list OS compatibility, version compatibility, etc.
69
+
70
+ ## Development
71
+
72
+ Since your module is awesome, other users will want to play with it. Let them
73
+ know what the ground rules for contributing are.
74
+
75
+ ## Release Notes/Contributors/Etc **Optional**
76
+
77
+ If you aren't using changelog, put your release notes here (though you should
78
+ consider using changelog). You may also add any additional sections you feel are
79
+ necessary or important to include here. Please use the `## ` header.
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require 'puppetlabs_spec_helper/rake_tasks'
3
+ require 'puppet-lint/tasks/puppet-lint'
4
+ PuppetLint.configuration.send('disable_80chars')
5
+ PuppetLint.configuration.ignore_paths = ["spec/**/*.pp", "pkg/**/*.pp"]
6
+
7
+ desc "Validate manifests, templates, and ruby files"
8
+ task :validate do
9
+ Dir['manifests/**/*.pp'].each do |manifest|
10
+ sh "puppet parser validate --noop #{manifest}"
11
+ end
12
+ Dir['spec/**/*.rb','lib/**/*.rb'].each do |ruby_file|
13
+ sh "ruby -c #{ruby_file}" unless ruby_file =~ /spec\/fixtures/
14
+ end
15
+ Dir['templates/**/*.erb'].each do |template|
16
+ sh "erb -P -x -T '-' #{template} | ruby -c"
17
+ end
18
+ end
@@ -0,0 +1 @@
1
+ this is where module code would live
@@ -0,0 +1,41 @@
1
+ # == Class: demo
2
+ #
3
+ # Full description of class demo here.
4
+ #
5
+ # === Parameters
6
+ #
7
+ # Document parameters here.
8
+ #
9
+ # [*sample_parameter*]
10
+ # Explanation of what this parameter affects and what it defaults to.
11
+ # e.g. "Specify one or more upstream ntp servers as an array."
12
+ #
13
+ # === Variables
14
+ #
15
+ # Here you should define a list of variables that this module would require.
16
+ #
17
+ # [*sample_variable*]
18
+ # Explanation of how this variable affects the funtion of this class and if
19
+ # it has a default. e.g. "The parameter enc_ntp_servers must be set by the
20
+ # External Node Classifier as a comma separated list of hostnames." (Note,
21
+ # global variables should be avoided in favor of class parameters as
22
+ # of Puppet 2.6.)
23
+ #
24
+ # === Examples
25
+ #
26
+ # class { 'demo':
27
+ # servers => [ 'pool.ntp.org', 'ntp.local.company.com' ],
28
+ # }
29
+ #
30
+ # === Authors
31
+ #
32
+ # Author Name <author@domain.com>
33
+ #
34
+ # === Copyright
35
+ #
36
+ # Copyright 2015 Your name here, unless otherwise noted.
37
+ #
38
+ class demo {
39
+
40
+
41
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "user-demo",
3
+ "version": "0.0.1",
4
+ "author": "alice.nodelman",
5
+ "summary": "For use in testing beaker.",
6
+ "license": "Apache 2.0",
7
+ "source": "no_source",
8
+ "project_page": "no_page",
9
+ "issues_url": "no_url",
10
+ "dependencies": [
11
+ {"name":"puppetlabs-stdlib","version_requirement":">= 1.0.0"}
12
+ ]
13
+ }
14
+
@@ -0,0 +1,72 @@
1
+ require 'spec_helper_acceptance'
2
+
3
+ describe "my tests" do
4
+
5
+ # an example using the beaker DSL
6
+ # use http://www.rubydoc.info/github/puppetlabs/beaker/Beaker/DSL
7
+ it "should say hello!" do
8
+ result = shell( 'echo hello' )
9
+ expect(result.stdout).to match(/hello/)
10
+ end
11
+
12
+ # an example using Serverspec
13
+ # use http://serverspec.org/resource_types.html
14
+ describe package('puppet') do
15
+ it { should be_installed }
16
+ end
17
+
18
+ it "can create and confirm a file" do
19
+ shell( 'rm -f demo.txt' )
20
+ create_remote_file(default, 'demo.txt', 'foo\nfoo\nfoo\n')
21
+ shell( 'grep foo demo.txt' )
22
+ shell( 'grep bar demo.txt', :acceptable_exit_codes => [1] )
23
+ end
24
+
25
+ it "should be able to apply manifests" do
26
+ manifest_1 = "user {'foo':
27
+ ensure => present,}"
28
+ manifest_2 = "user {'foo':
29
+ ensure => absent,}"
30
+ manifest_3 = "user {'root':
31
+ ensure => present,}"
32
+ apply_manifest( manifest_1, :expect_changes => true )
33
+ apply_manifest( manifest_2, :expect_changes => true )
34
+ apply_manifest( manifest_3 )
35
+ end
36
+
37
+ describe service('sshd') do
38
+ it { should be_running }
39
+ end
40
+
41
+ describe user('root') do
42
+ it { should exist }
43
+ end
44
+
45
+ describe user('foo') do
46
+ it { should_not exist }
47
+ end
48
+
49
+ context "can use both serverspec and Beaker DSL" do
50
+
51
+ it "can create a file" do
52
+ shell( 'rm -f /tmp/demo.txt' )
53
+ manifest = "file {'demofile':
54
+ path => '/tmp/demo.txt',
55
+ ensure => present,
56
+ mode => 0640,
57
+ content => \"this is my file.\",
58
+ }"
59
+ apply_manifest(manifest, :expect_changes => true)
60
+ end
61
+
62
+ describe file('/tmp/demo.txt') do
63
+ it { should be_file }
64
+ end
65
+
66
+ describe file('/tmp/demo.txt') do
67
+ it { should contain 'this is my file.' }
68
+ end
69
+ end
70
+
71
+
72
+ end