mastercard_masterpass_merchant 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +24 -0
  3. data/README.md +74 -0
  4. data/lib/mastercard_masterpass_merchant.rb +182 -0
  5. data/lib/mastercard_masterpass_merchant/api/checkout_api.rb +41 -0
  6. data/lib/mastercard_masterpass_merchant/api/decryption_api.rb +40 -0
  7. data/lib/mastercard_masterpass_merchant/api/express_checkout_api.rb +42 -0
  8. data/lib/mastercard_masterpass_merchant/api/merchant_initialization_api.rb +40 -0
  9. data/lib/mastercard_masterpass_merchant/api/postback_api.rb +39 -0
  10. data/lib/mastercard_masterpass_merchant/api/precheckout_data_api.rb +42 -0
  11. data/lib/mastercard_masterpass_merchant/api/session_key_signing_api.rb +40 -0
  12. data/lib/mastercard_masterpass_merchant/api/shopping_cart_api.rb +40 -0
  13. data/lib/mastercard_masterpass_merchant/models/acceptance_option.rb +177 -0
  14. data/lib/mastercard_masterpass_merchant/models/address.rb +243 -0
  15. data/lib/mastercard_masterpass_merchant/models/address_extension_point.rb +176 -0
  16. data/lib/mastercard_masterpass_merchant/models/authentication_options.rb +265 -0
  17. data/lib/mastercard_masterpass_merchant/models/base_card.rb +221 -0
  18. data/lib/mastercard_masterpass_merchant/models/brands.rb +165 -0
  19. data/lib/mastercard_masterpass_merchant/models/card.rb +244 -0
  20. data/lib/mastercard_masterpass_merchant/models/card_extension.rb +189 -0
  21. data/lib/mastercard_masterpass_merchant/models/card_type.rb +174 -0
  22. data/lib/mastercard_masterpass_merchant/models/card_types.rb +166 -0
  23. data/lib/mastercard_masterpass_merchant/models/checkout.rb +259 -0
  24. data/lib/mastercard_masterpass_merchant/models/checkout_dsrp.rb +210 -0
  25. data/lib/mastercard_masterpass_merchant/models/checkout_extension.rb +259 -0
  26. data/lib/mastercard_masterpass_merchant/models/contact.rb +275 -0
  27. data/lib/mastercard_masterpass_merchant/models/date_of_birth.rb +199 -0
  28. data/lib/mastercard_masterpass_merchant/models/decryption_request.rb +199 -0
  29. data/lib/mastercard_masterpass_merchant/models/decryption_response.rb +165 -0
  30. data/lib/mastercard_masterpass_merchant/models/detail.rb +176 -0
  31. data/lib/mastercard_masterpass_merchant/models/details.rb +176 -0
  32. data/lib/mastercard_masterpass_merchant/models/dsrp.rb +199 -0
  33. data/lib/mastercard_masterpass_merchant/models/dsrp_extension.rb +189 -0
  34. data/lib/mastercard_masterpass_merchant/models/dsrp_options.rb +188 -0
  35. data/lib/mastercard_masterpass_merchant/models/error.rb +222 -0
  36. data/lib/mastercard_masterpass_merchant/models/errors.rb +174 -0
  37. data/lib/mastercard_masterpass_merchant/models/express_checkout_request.rb +276 -0
  38. data/lib/mastercard_masterpass_merchant/models/express_checkout_response.rb +201 -0
  39. data/lib/mastercard_masterpass_merchant/models/extension_point.rb +163 -0
  40. data/lib/mastercard_masterpass_merchant/models/installment.rb +221 -0
  41. data/lib/mastercard_masterpass_merchant/models/installment_option.rb +198 -0
  42. data/lib/mastercard_masterpass_merchant/models/installment_options.rb +166 -0
  43. data/lib/mastercard_masterpass_merchant/models/installments.rb +176 -0
  44. data/lib/mastercard_masterpass_merchant/models/issuers.rb +165 -0
  45. data/lib/mastercard_masterpass_merchant/models/merchant_initialization_extension.rb +201 -0
  46. data/lib/mastercard_masterpass_merchant/models/merchant_initialization_request.rb +199 -0
  47. data/lib/mastercard_masterpass_merchant/models/merchant_initialization_response.rb +177 -0
  48. data/lib/mastercard_masterpass_merchant/models/merchant_initialization_response_extension.rb +165 -0
  49. data/lib/mastercard_masterpass_merchant/models/merchant_transaction.rb +274 -0
  50. data/lib/mastercard_masterpass_merchant/models/merchant_transactions.rb +176 -0
  51. data/lib/mastercard_masterpass_merchant/models/option.rb +197 -0
  52. data/lib/mastercard_masterpass_merchant/models/pairing_data_type.rb +186 -0
  53. data/lib/mastercard_masterpass_merchant/models/pairing_data_types.rb +188 -0
  54. data/lib/mastercard_masterpass_merchant/models/payment_acceptance.rb +166 -0
  55. data/lib/mastercard_masterpass_merchant/models/payment_acceptance_types_extension.rb +166 -0
  56. data/lib/mastercard_masterpass_merchant/models/payment_options_extensions.rb +178 -0
  57. data/lib/mastercard_masterpass_merchant/models/precheckout_card.rb +288 -0
  58. data/lib/mastercard_masterpass_merchant/models/precheckout_cards.rb +188 -0
  59. data/lib/mastercard_masterpass_merchant/models/precheckout_data.rb +259 -0
  60. data/lib/mastercard_masterpass_merchant/models/precheckout_data_request.rb +178 -0
  61. data/lib/mastercard_masterpass_merchant/models/precheckout_data_response.rb +211 -0
  62. data/lib/mastercard_masterpass_merchant/models/precheckout_reward_program.rb +243 -0
  63. data/lib/mastercard_masterpass_merchant/models/precheckout_shipping_address.rb +298 -0
  64. data/lib/mastercard_masterpass_merchant/models/precheckout_shipping_addresses.rb +188 -0
  65. data/lib/mastercard_masterpass_merchant/models/private_data.rb +177 -0
  66. data/lib/mastercard_masterpass_merchant/models/private_datas.rb +166 -0
  67. data/lib/mastercard_masterpass_merchant/models/reward_program.rb +221 -0
  68. data/lib/mastercard_masterpass_merchant/models/reward_programs.rb +188 -0
  69. data/lib/mastercard_masterpass_merchant/models/risk_decisioning.rb +178 -0
  70. data/lib/mastercard_masterpass_merchant/models/session_key_signing_request.rb +199 -0
  71. data/lib/mastercard_masterpass_merchant/models/session_key_signing_response.rb +210 -0
  72. data/lib/mastercard_masterpass_merchant/models/shipping_address.rb +265 -0
  73. data/lib/mastercard_masterpass_merchant/models/shopping_cart.rb +210 -0
  74. data/lib/mastercard_masterpass_merchant/models/shopping_cart_item.rb +210 -0
  75. data/lib/mastercard_masterpass_merchant/models/shopping_cart_request.rb +189 -0
  76. data/lib/mastercard_masterpass_merchant/models/shopping_cart_request_extension_point.rb +165 -0
  77. data/lib/mastercard_masterpass_merchant/models/shopping_cart_response.rb +177 -0
  78. data/lib/mastercard_masterpass_merchant/models/tokenization.rb +188 -0
  79. data/lib/mastercard_masterpass_merchant/models/types.rb +174 -0
  80. data/lib/mastercard_masterpass_merchant/models/wallet.rb +177 -0
  81. data/lib/mastercard_masterpass_merchant/tracker/sdk_api_tracker.rb +57 -0
  82. data/lib/mastercard_masterpass_merchant/version.rb +3 -0
  83. metadata +240 -0
@@ -0,0 +1,275 @@
1
+ require 'date'
2
+ require 'roxml'
3
+ require_relative '../../mastercard_masterpass_merchant/models/date_of_birth'
4
+ require_relative '../../mastercard_masterpass_merchant/models/extension_point'
5
+
6
+
7
+ module MastercardMasterpassMerchant
8
+ # This class contains methods to get consumer contact information.
9
+ class Contact
10
+ include ROXML
11
+
12
+ xml_name "Contact"
13
+
14
+ # @!attribute first_name
15
+ # @return [String] the contact first name.
16
+ xml_accessor :first_name, :from =>"FirstName"
17
+
18
+ # @!attribute middle_name
19
+ # @return [String] the contact middle name or initial.
20
+ xml_accessor :middle_name, :from =>"MiddleName"
21
+
22
+ # @!attribute last_name
23
+ # @return [String] the contact surname.
24
+ xml_accessor :last_name, :from =>"LastName"
25
+
26
+ # @!attribute gender
27
+ # @return [String] the contact Gender (M or F). NOTE: This field may only be requested from a MasterPass wallet if it is required by law in a region. Merchants and service providers seeking to use this field must work with the local MasterPass representative to get the necessary clearances before requesting these data elements.
28
+ xml_accessor :gender, :from =>"Gender"
29
+
30
+ # @!attribute date_of_birth
31
+ # @return [DateOfBirth] the contact DOB - YYYY/MM/DD. NOTE: This field may only be requested from a MasterPass wallet if it is required by law in a region. Merchants and service providers seeking to use this field must work with the local MasterPass representative to get the necessary clearances before requesting these data elements.
32
+ xml_accessor :date_of_birth, :from =>"DateOfBirth",:as => DateOfBirth
33
+
34
+ # @!attribute national_id
35
+ # @return [String] the contact National Identification. NOTE: This field may only be requested from a MasterPass wallet if it is required by law in a region. Merchants and service providers seeking to use this field must work with the local MasterPass representative to get the necessary clearances before requesting these data elements.
36
+ xml_accessor :national_id, :from =>"NationalID"
37
+
38
+ # @!attribute country
39
+ # @return [String] the contact country of residence.
40
+ xml_accessor :country, :from =>"Country"
41
+
42
+ # @!attribute email_address
43
+ # @return [String] the contact email aAddress.
44
+ xml_accessor :email_address, :from =>"EmailAddress"
45
+
46
+ # @!attribute phone_number
47
+ # @return [String] the contact phone.
48
+ xml_accessor :phone_number, :from =>"PhoneNumber"
49
+
50
+ # @!attribute extension_point
51
+ # @return [ExtensionPoint] the ExtensionPoint for future enhancement.
52
+ xml_accessor :extension_point, :from =>"ExtensionPoint",:as => ExtensionPoint
53
+
54
+
55
+ # Attribute mapping from ruby-style variable name to JSON key.
56
+ def self.attribute_map
57
+ {
58
+ :first_name => :FirstName ,
59
+ :middle_name => :MiddleName ,
60
+ :last_name => :LastName ,
61
+ :gender => :Gender ,
62
+ :date_of_birth => :DateOfBirth ,
63
+ :national_id => :NationalID ,
64
+ :country => :Country ,
65
+ :email_address => :EmailAddress ,
66
+ :phone_number => :PhoneNumber ,
67
+ :extension_point => :ExtensionPoint
68
+
69
+ }
70
+ end
71
+
72
+ def initialize(attributes = {})
73
+ return unless attributes.is_a?(Hash)
74
+
75
+ # convert string to symbol for hash key
76
+ attributes = attributes.inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo}
77
+
78
+
79
+ if attributes.has_key?(:FirstName) || attributes.has_key?(:first_name)
80
+ self.first_name = attributes[:FirstName] || attributes[:first_name]
81
+ end
82
+
83
+ if attributes.has_key?(:MiddleName) || attributes.has_key?(:middle_name)
84
+ self.middle_name = attributes[:MiddleName] || attributes[:middle_name]
85
+ end
86
+
87
+ if attributes.has_key?(:LastName) || attributes.has_key?(:last_name)
88
+ self.last_name = attributes[:LastName] || attributes[:last_name]
89
+ end
90
+
91
+ if attributes.has_key?(:Gender) || attributes.has_key?(:gender)
92
+ self.gender = attributes[:Gender] || attributes[:gender]
93
+ end
94
+
95
+ if attributes.has_key?(:DateOfBirth) || attributes.has_key?(:date_of_birth)
96
+ self.date_of_birth = attributes[:DateOfBirth] || attributes[:date_of_birth]
97
+ end
98
+
99
+ if attributes.has_key?(:NationalID) || attributes.has_key?(:national_id)
100
+ self.national_id = attributes[:NationalID] || attributes[:national_id]
101
+ end
102
+
103
+ if attributes.has_key?(:Country) || attributes.has_key?(:country)
104
+ self.country = attributes[:Country] || attributes[:country]
105
+ end
106
+
107
+ if attributes.has_key?(:EmailAddress) || attributes.has_key?(:email_address)
108
+ self.email_address = attributes[:EmailAddress] || attributes[:email_address]
109
+ end
110
+
111
+ if attributes.has_key?(:PhoneNumber) || attributes.has_key?(:phone_number)
112
+ self.phone_number = attributes[:PhoneNumber] || attributes[:phone_number]
113
+ end
114
+
115
+ if attributes.has_key?(:ExtensionPoint) || attributes.has_key?(:extension_point)
116
+ self.extension_point = attributes[:ExtensionPoint] || attributes[:extension_point]
117
+ end
118
+
119
+ end
120
+
121
+
122
+
123
+
124
+ # Custom attribute writer method checking allowed values (enum).
125
+ def gender=(gender)
126
+ allowed_values = ["M", "F"]
127
+ if gender && !allowed_values.include?(gender)
128
+ fail "invalid value for 'gender', must be one of #{allowed_values}"
129
+ end
130
+ @gender = gender
131
+ end
132
+
133
+ # Check equality by comparing each attribute.
134
+ def ==(o)
135
+ return true if self.equal?(o)
136
+ self.class == o.class &&
137
+ first_name == o.first_name &&
138
+ middle_name == o.middle_name &&
139
+ last_name == o.last_name &&
140
+ gender == o.gender &&
141
+ date_of_birth == o.date_of_birth &&
142
+ national_id == o.national_id &&
143
+ country == o.country &&
144
+ email_address == o.email_address &&
145
+ phone_number == o.phone_number &&
146
+ extension_point == o.extension_point
147
+ end
148
+
149
+ # @see the `==` method
150
+ def eql?(o)
151
+ self == o
152
+ end
153
+
154
+ # Calculate hash code according to all attributes.
155
+ def hash
156
+ [first_name, middle_name, last_name, gender, date_of_birth, national_id, country, email_address, phone_number, extension_point].hash
157
+ end
158
+
159
+ # build the object from hash
160
+ def build_from_hash(attributes)
161
+ return nil unless attributes.is_a?(Hash)
162
+ self.class.datatype_map.each_pair do |key, type|
163
+ if type =~ /^Array<(.*)>/i
164
+ if attributes[self.class.attribute_map[key]].is_a?(Array)
165
+ self.send("#{key}=", attributes[self.class.attribute_map[key]].map{ |v| _deserialize($1, v) } )
166
+ else
167
+ #TODO show warning in debug mode
168
+ end
169
+ elsif !attributes[self.class.attribute_map[key]].nil?
170
+ self.send("#{key}=", _deserialize(type, attributes[self.class.attribute_map[key]]))
171
+ else
172
+ # data not found in attributes(hash), not an issue as the data can be optional
173
+ end
174
+ end
175
+
176
+ self
177
+ end
178
+
179
+ def _deserialize(type, value)
180
+ case type.to_sym
181
+ when :DateTime
182
+ DateTime.parse(value)
183
+ when :Date
184
+ Date.parse(value)
185
+ when :String
186
+ value.to_s
187
+ when :Integer
188
+ value.to_i
189
+ when :Float
190
+ value.to_f
191
+ when :BOOLEAN
192
+ if value =~ /^(true|t|yes|y|1)$/i
193
+ true
194
+ else
195
+ false
196
+ end
197
+ when /\AArray<(?<inner_type>.+)>\z/
198
+ inner_type = Regexp.last_match[:inner_type]
199
+ value.map { |v| _deserialize(inner_type, v) }
200
+ when /\AHash<(?<k_type>.+), (?<v_type>.+)>\z/
201
+ k_type = Regexp.last_match[:k_type]
202
+ v_type = Regexp.last_match[:v_type]
203
+ {}.tap do |hash|
204
+ value.each do |k, v|
205
+ hash[_deserialize(k_type, k)] = _deserialize(v_type, v)
206
+ end
207
+ end
208
+ else # model
209
+ _model = MastercardMasterpassMerchant.const_get(type).new
210
+ _model.build_from_hash(value)
211
+ end
212
+ end
213
+
214
+ def to_s
215
+ to_hash.to_s
216
+ end
217
+
218
+ # to_body is an alias to to_body (backward compatibility))
219
+ def to_body
220
+ to_hash
221
+ end
222
+
223
+ # return the object in the form of hash
224
+ def to_hash
225
+ hash = {}
226
+ self.class.attribute_map.each_pair do |attr, param|
227
+ value = self.send(attr)
228
+ next if value.nil?
229
+ hash[param] = _to_hash(value)
230
+ end
231
+ hash
232
+ end
233
+
234
+ # Method to output non-array value in the form of hash
235
+ # For object, use to_hash. Otherwise, just return the value
236
+ def _to_hash(value)
237
+ if value.is_a?(Array)
238
+ value.compact.map{ |v| _to_hash(v) }
239
+ elsif value.is_a?(Hash)
240
+ {}.tap do |hash|
241
+ value.each { |k, v| hash[k] = _to_hash(v) }
242
+ end
243
+ elsif value.respond_to? :to_hash
244
+ value.to_hash
245
+ else
246
+ value
247
+ end
248
+ end
249
+
250
+
251
+ private
252
+ def after_parse
253
+ self.send(:remove_instance_variable, :@roxml_references) if defined? self.roxml_references
254
+ end
255
+
256
+ # Attribute datatype mapping.
257
+ def self.datatype_map
258
+ {
259
+ :first_name => 'String',
260
+ :middle_name => 'String',
261
+ :last_name => 'String',
262
+ :gender => 'String',
263
+ :date_of_birth => 'DateOfBirth',
264
+ :national_id => 'String',
265
+ :country => 'String',
266
+ :email_address => 'String',
267
+ :phone_number => 'String',
268
+ :extension_point => 'ExtensionPoint'
269
+
270
+ }
271
+ end
272
+ end
273
+
274
+
275
+ end
@@ -0,0 +1,199 @@
1
+ require 'date'
2
+ require 'roxml'
3
+ require_relative '../../mastercard_masterpass_merchant/models/extension_point'
4
+
5
+
6
+ module MastercardMasterpassMerchant
7
+ # This class contains methods related to date of birth.
8
+ class DateOfBirth
9
+ include ROXML
10
+
11
+ xml_name "DateOfBirth"
12
+
13
+ # @!attribute year
14
+ # @return [Integer] the contact DOB Year.
15
+ xml_accessor :year, :from =>"Year"
16
+
17
+ # @!attribute month
18
+ # @return [Integer] the contact DOB Month.
19
+ xml_accessor :month, :from =>"Month"
20
+
21
+ # @!attribute day
22
+ # @return [Integer] the contact DOB Day.
23
+ xml_accessor :day, :from =>"Day"
24
+
25
+ # @!attribute extension_point
26
+ # @return [ExtensionPoint] the ExtensionPoint for future enhancement.
27
+ xml_accessor :extension_point, :from =>"ExtensionPoint",:as => ExtensionPoint
28
+
29
+
30
+ # Attribute mapping from ruby-style variable name to JSON key.
31
+ def self.attribute_map
32
+ {
33
+ :year => :Year ,
34
+ :month => :Month ,
35
+ :day => :Day ,
36
+ :extension_point => :ExtensionPoint
37
+
38
+ }
39
+ end
40
+
41
+ def initialize(attributes = {})
42
+ return unless attributes.is_a?(Hash)
43
+
44
+ # convert string to symbol for hash key
45
+ attributes = attributes.inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo}
46
+
47
+
48
+ if attributes.has_key?(:Year) || attributes.has_key?(:year)
49
+ self.year = attributes[:Year] || attributes[:year]
50
+ end
51
+
52
+ if attributes.has_key?(:Month) || attributes.has_key?(:month)
53
+ self.month = attributes[:Month] || attributes[:month]
54
+ end
55
+
56
+ if attributes.has_key?(:Day) || attributes.has_key?(:day)
57
+ self.day = attributes[:Day] || attributes[:day]
58
+ end
59
+
60
+ if attributes.has_key?(:ExtensionPoint) || attributes.has_key?(:extension_point)
61
+ self.extension_point = attributes[:ExtensionPoint] || attributes[:extension_point]
62
+ end
63
+
64
+ end
65
+
66
+
67
+
68
+
69
+ # Check equality by comparing each attribute.
70
+ def ==(o)
71
+ return true if self.equal?(o)
72
+ self.class == o.class &&
73
+ year == o.year &&
74
+ month == o.month &&
75
+ day == o.day &&
76
+ extension_point == o.extension_point
77
+ end
78
+
79
+ # @see the `==` method
80
+ def eql?(o)
81
+ self == o
82
+ end
83
+
84
+ # Calculate hash code according to all attributes.
85
+ def hash
86
+ [year, month, day, extension_point].hash
87
+ end
88
+
89
+ # build the object from hash
90
+ def build_from_hash(attributes)
91
+ return nil unless attributes.is_a?(Hash)
92
+ self.class.datatype_map.each_pair do |key, type|
93
+ if type =~ /^Array<(.*)>/i
94
+ if attributes[self.class.attribute_map[key]].is_a?(Array)
95
+ self.send("#{key}=", attributes[self.class.attribute_map[key]].map{ |v| _deserialize($1, v) } )
96
+ else
97
+ #TODO show warning in debug mode
98
+ end
99
+ elsif !attributes[self.class.attribute_map[key]].nil?
100
+ self.send("#{key}=", _deserialize(type, attributes[self.class.attribute_map[key]]))
101
+ else
102
+ # data not found in attributes(hash), not an issue as the data can be optional
103
+ end
104
+ end
105
+
106
+ self
107
+ end
108
+
109
+ def _deserialize(type, value)
110
+ case type.to_sym
111
+ when :DateTime
112
+ DateTime.parse(value)
113
+ when :Date
114
+ Date.parse(value)
115
+ when :String
116
+ value.to_s
117
+ when :Integer
118
+ value.to_i
119
+ when :Float
120
+ value.to_f
121
+ when :BOOLEAN
122
+ if value =~ /^(true|t|yes|y|1)$/i
123
+ true
124
+ else
125
+ false
126
+ end
127
+ when /\AArray<(?<inner_type>.+)>\z/
128
+ inner_type = Regexp.last_match[:inner_type]
129
+ value.map { |v| _deserialize(inner_type, v) }
130
+ when /\AHash<(?<k_type>.+), (?<v_type>.+)>\z/
131
+ k_type = Regexp.last_match[:k_type]
132
+ v_type = Regexp.last_match[:v_type]
133
+ {}.tap do |hash|
134
+ value.each do |k, v|
135
+ hash[_deserialize(k_type, k)] = _deserialize(v_type, v)
136
+ end
137
+ end
138
+ else # model
139
+ _model = MastercardMasterpassMerchant.const_get(type).new
140
+ _model.build_from_hash(value)
141
+ end
142
+ end
143
+
144
+ def to_s
145
+ to_hash.to_s
146
+ end
147
+
148
+ # to_body is an alias to to_body (backward compatibility))
149
+ def to_body
150
+ to_hash
151
+ end
152
+
153
+ # return the object in the form of hash
154
+ def to_hash
155
+ hash = {}
156
+ self.class.attribute_map.each_pair do |attr, param|
157
+ value = self.send(attr)
158
+ next if value.nil?
159
+ hash[param] = _to_hash(value)
160
+ end
161
+ hash
162
+ end
163
+
164
+ # Method to output non-array value in the form of hash
165
+ # For object, use to_hash. Otherwise, just return the value
166
+ def _to_hash(value)
167
+ if value.is_a?(Array)
168
+ value.compact.map{ |v| _to_hash(v) }
169
+ elsif value.is_a?(Hash)
170
+ {}.tap do |hash|
171
+ value.each { |k, v| hash[k] = _to_hash(v) }
172
+ end
173
+ elsif value.respond_to? :to_hash
174
+ value.to_hash
175
+ else
176
+ value
177
+ end
178
+ end
179
+
180
+
181
+ private
182
+ def after_parse
183
+ self.send(:remove_instance_variable, :@roxml_references) if defined? self.roxml_references
184
+ end
185
+
186
+ # Attribute datatype mapping.
187
+ def self.datatype_map
188
+ {
189
+ :year => 'Integer',
190
+ :month => 'Integer',
191
+ :day => 'Integer',
192
+ :extension_point => 'ExtensionPoint'
193
+
194
+ }
195
+ end
196
+ end
197
+
198
+
199
+ end