pindo 4.9.3 → 4.9.4

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.
@@ -1,5 +1,3 @@
1
-
2
-
3
1
  require 'highline/import'
4
2
  require 'fileutils'
5
3
  require 'pindo/module/pgyer/pgyerhelper'
@@ -13,7 +11,21 @@ module Pindo
13
11
  self.summary = '修改pgyer中已经上传安装包的备注信息'
14
12
 
15
13
  self.description = <<-DESC
16
- 修改pgyer中已经上传安装包的备注信息,终端运行:pindo pgyer apptest
14
+ 修改pgyer中已经上传安装包的备注信息。
15
+
16
+ 支持功能:
17
+
18
+ * 修改版本备注
19
+ * 查看历史版本
20
+ * 选择指定版本
21
+
22
+ 使用示例:
23
+
24
+ $ pindo pgyer comment # 修改当前目录项目的最新版本备注
25
+
26
+ $ pindo pgyer comment --proj=demo # 修改指定项目的版本备注
27
+
28
+ $ pindo pgyer comment --list # 列出历史版本供选择修改
17
29
  DESC
18
30
 
19
31
  self.arguments = [
@@ -1,5 +1,3 @@
1
-
2
-
3
1
  require 'highline/import'
4
2
  require 'fileutils'
5
3
  require 'pindo/module/pgyer/pgyerhelper'
@@ -15,7 +13,21 @@ module Pindo
15
13
  self.summary = '从pgyer下载指定app的安装包'
16
14
 
17
15
  self.description = <<-DESC
18
- 从pgyer下载指定app的安装包。终端直接运行:pindo pgyer download
16
+ 从pgyer下载指定app的安装包。
17
+
18
+ 支持功能:
19
+
20
+ * 下载指定版本安装包
21
+ * 查看历史版本
22
+ * 显示下载进度
23
+
24
+ 使用示例:
25
+
26
+ $ pindo pgyer download # 下载当前目录项目的最新版本
27
+
28
+ $ pindo pgyer download --proj=demo # 下载指定项目的安装包
29
+
30
+ $ pindo pgyer download --list # 列出历史版本供选择下载
19
31
  DESC
20
32
 
21
33
  self.arguments = [
@@ -1,5 +1,3 @@
1
-
2
-
3
1
  require 'highline/import'
4
2
  require 'fileutils'
5
3
  require 'pindo/module/pgyer/pgyerhelper'
@@ -11,10 +9,22 @@ module Pindo
11
9
 
12
10
  class Login < Pgyer
13
11
 
14
- self.summary = '登录pgyer'
12
+ self.summary = '登录pgyer测试平台'
15
13
 
16
14
  self.description = <<-DESC
17
- 登录pgyer,终端运行:pindo pgyer login
15
+ 登录pgyer测试平台。
16
+
17
+ 支持功能:
18
+
19
+ * 账号密码登录
20
+ * 记住登录状态
21
+ * 强制重新登录
22
+
23
+ 使用示例:
24
+
25
+ $ pindo pgyer login # 登录pgyer
26
+
27
+ $ pindo pgyer login --force # 强制重新登录
18
28
  DESC
19
29
 
20
30
  self.arguments = [
@@ -1,5 +1,3 @@
1
-
2
-
3
1
  require 'highline/import'
4
2
  require 'fileutils'
5
3
  require 'pindo/module/pgyer/pgyerhelper'
@@ -10,10 +8,28 @@ module Pindo
10
8
  class Resign < Pgyer
11
9
 
12
10
 
13
- self.summary = '获取pgyer中指定app的测试链接和二维码'
11
+ self.summary = '重签名pgyer中的安装包'
14
12
 
15
13
  self.description = <<-DESC
16
- 获取pgyer中指定app的测试链接和二维码,终端运行:pindo pgyer resign
14
+ 重签名pgyer中的安装包。
15
+
16
+ 支持功能:
17
+
18
+ * 选择证书重签名
19
+ * 查看历史版本
20
+ * 发送测试信息
21
+
22
+ 使用示例:
23
+
24
+ $ pindo pgyer resign # 重签名当前项目最新版本
25
+
26
+ $ pindo pgyer resign --proj=demo # 重签名指定项目
27
+
28
+ $ pindo pgyer resign --list # 列出历史版本供选择
29
+
30
+ $ pindo pgyer resign --certid=xxx # 使用指定证书重签名
31
+
32
+ $ pindo pgyer resign --send # 重签名后发送测试信息
17
33
  DESC
18
34
 
19
35
  self.arguments = [
@@ -1,11 +1,9 @@
1
-
2
-
3
1
  require 'highline/import'
4
2
  require 'fileutils'
5
3
  require 'json'
6
4
  require 'faraday'
7
5
  require 'pindo/module/pgyer/pgyerhelper'
8
-
6
+ require 'pindo/module/build/buildhelper'
9
7
 
10
8
  module Pindo
11
9
  class Command
@@ -13,10 +11,32 @@ module Pindo
13
11
  class Upload < Pgyer
14
12
 
15
13
 
16
- self.summary = '上传ipa包到pgyer测试网站'
14
+ self.summary = '上传安装包到pgyer测试平台'
17
15
 
18
16
  self.description = <<-DESC
19
- 上传ipa包到pgyer。用法:例如:pindo pgyer upload path/to/demo.ipa
17
+ 上传安装包到pgyer测试平台。
18
+
19
+ 支持功能:
20
+
21
+ * 上传ipa/apk安装包
22
+ * 添加版本描述
23
+ * 上传附件
24
+ * 重签名
25
+ * 发送测试信息
26
+
27
+ 使用示例:
28
+
29
+ $ pindo pgyer upload path/to/app.ipa # 上传指定安装包
30
+
31
+ $ pindo pgyer upload --proj=demo # 上传到指定项目
32
+
33
+ $ pindo pgyer upload --desc="版本说明" # 添加版本描述
34
+
35
+ $ pindo pgyer upload --attach=file.zip # 上传附件
36
+
37
+ $ pindo pgyer upload --resign # 上传后重签名
38
+
39
+ $ pindo pgyer upload --send # 上传后发送企业微信测试信息
20
40
  DESC
21
41
 
22
42
  self.arguments = [
@@ -33,7 +53,7 @@ module Pindo
33
53
  ['--desc', '指定上传的备注信息: -pindo pgyer upload -desc="1.upload message"'],
34
54
  ['--resign', '上传到之后是否重签名,用法:pindo pgyer upload --resign'],
35
55
  ['--certid', '设置重签名的正式id,用法:pindo pgyer upload --certid=com.test.bundleid'],
36
-
56
+
37
57
  ].concat(super)
38
58
  end
39
59
 
@@ -85,9 +105,33 @@ module Pindo
85
105
  def run
86
106
 
87
107
  current_project_dir = Dir.pwd
108
+
88
109
  if @args_ipa_file.nil? || !File.exist?(@args_ipa_file)
89
- build_path = File.join(current_project_dir, "build", "*.{ipa,app,apk}")
90
- @args_ipa_file = Dir.glob(build_path).max_by {|f| File.mtime(f)}
110
+ # 获取build目录下的ipa文件
111
+ #
112
+ build_helper = Pindo::BuildHelper.share_instance
113
+ project_type = build_helper.project_type(current_project_dir)
114
+ case project_type
115
+ when :ios
116
+ build_path = File.join(current_project_dir, "build", "*.{ipa,app}")
117
+ @args_ipa_file = Dir.glob(build_path).max_by {|f| File.mtime(f)}
118
+ when :android
119
+ build_path = File.join(current_project_dir, "build", "*.{apk}")
120
+ @args_ipa_file = Dir.glob(build_path).max_by {|f| File.mtime(f)}
121
+ when :unity
122
+
123
+ if File.exist?(File.join(current_project_dir, "GoodPlatform/BaseiOS"))
124
+ build_path = File.join(current_project_dir, "GoodPlatform/BaseiOS/build", "*.{ipa,app}")
125
+ @args_ipa_file = Dir.glob(build_path).max_by {|f| File.mtime(f)}
126
+ else
127
+ build_path = File.join(current_project_dir, "GoodPlatform/iOS/build", "*.{ipa,app}")
128
+ @args_ipa_file = Dir.glob(build_path).max_by {|f| File.mtime(f)}
129
+ end
130
+ else
131
+ raise Informative, "当前目录不是工程目录,不能编译"
132
+ end
133
+
134
+
91
135
  if @args_ipa_file.nil?
92
136
  build_path = File.join(current_project_dir, "*.{ipa,app,apk}")
93
137
  @args_ipa_file = Dir.glob(build_path).max_by {|f| File.mtime(f)}
@@ -106,7 +106,6 @@ module Pindo
106
106
  proj_name = @args_proj_name
107
107
  app_info_obj = PgyerHelper.share_instace.prepare_upload(working_directory:Dir.pwd, proj_name:proj_name)
108
108
  end
109
- puts app_info_obj
110
109
 
111
110
  mainapp_bundleid= nil
112
111
  if @args_deploy_flag
data/lib/pindo/version.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Pindo
2
2
 
3
- VERSION = "4.9.3"
3
+ VERSION = "4.9.4"
4
4
 
5
5
  class VersionCheck
6
6
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pindo
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.9.3
4
+ version: 4.9.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - wade
@@ -274,15 +274,10 @@ files:
274
274
  - lib/pindo/command/deploy/updateconfig.rb
275
275
  - lib/pindo/command/deploy/uploadipa.rb
276
276
  - lib/pindo/command/dev.rb
277
- - lib/pindo/command/dev/applovin.rb
278
277
  - lib/pindo/command/dev/autobuild.rb
279
- - lib/pindo/command/dev/autoresign.rb
280
278
  - lib/pindo/command/dev/build.rb
281
- - lib/pindo/command/dev/confusecode.rb
282
- - lib/pindo/command/dev/confuseproj.rb
283
- - lib/pindo/command/dev/createbuild.rb
284
279
  - lib/pindo/command/dev/debug.rb
285
- - lib/pindo/command/dev/pgyercert.rb
280
+ - lib/pindo/command/dev/repoinit.rb
286
281
  - lib/pindo/command/dev/tag.rb
287
282
  - lib/pindo/command/env.rb
288
283
  - lib/pindo/command/env/dreamstudio.rb
@@ -1,223 +0,0 @@
1
-
2
-
3
- require 'highline/import'
4
- require 'fileutils'
5
- require 'json'
6
- require 'faraday'
7
- require 'xcodeproj'
8
-
9
- module Pindo
10
- class Command
11
- class Dev < Command
12
- class Applovin < Dev
13
-
14
- self.summary = '接入applovin max广告平台时更新Xcode中info.plist'
15
-
16
- self.description = <<-DESC
17
- 接入applovin max广告平台时更新Xcode中info.plist,用法:在工程目录下执行 pindo utils applovin
18
- DESC
19
-
20
- self.arguments = [
21
- ]
22
-
23
- def self.options
24
- [
25
- ['--appstore', 'appstore模式,一般不用'],
26
- ['--install', '是否运行applovin脚本'],
27
- ['--upload', '保存ids, 留作applovin网络不好情况使用'],
28
- ].concat(super)
29
- end
30
-
31
- def initialize(argv)
32
-
33
- @args_appstore_flag = argv.flag?('appstore', false)
34
- @args_install_flag = argv.flag?('install', false)
35
- @args_upload_flag = argv.flag?('upload', false)
36
-
37
- super(argv)
38
- @additional_args = argv.remainder!
39
- end
40
-
41
- def validate!
42
- super
43
- end
44
-
45
- def run
46
-
47
- skadnetwork_id_array = []
48
-
49
- Funlog.instance.fancyinfo_start("正在请求applovin数据...")
50
-
51
- applovin_res_json = req_applovin_json
52
- # puts JSON.pretty_generate(applovin_res_json)
53
-
54
- if !applovin_res_json.nil? && !applovin_res_json["skadnetwork_ids"].nil?
55
- applovin_res_json["skadnetwork_ids"].each do |network_id|
56
- skadnetwork_id_array << network_id["skadnetwork_id"]
57
- end
58
- end
59
-
60
- applovin_media_res_json = req_applovin_mediia_json
61
- # puts JSON.pretty_generate(applovin_media_res_json)
62
- if !applovin_media_res_json.nil? && !applovin_media_res_json["mediationSKAdnetworkIdsSpecs"].nil?
63
- applovin_media_res_json["mediationSKAdnetworkIdsSpecs"].each do |media_item|
64
- skadnetwork_id_array = skadnetwork_id_array + media_item["skAdnetworkIds"]
65
- end
66
- end
67
-
68
- skadnetwork_id_array = skadnetwork_id_array.uniq || []
69
-
70
- Funlog.instance.fancyinfo_success("请求applovin数据,获取到#{skadnetwork_id_array.size}条数据...")
71
-
72
- if !skadnetwork_id_array.nil? && skadnetwork_id_array.size > 50
73
- # puts "From Applovin SKAdNetworkItems Size: #{skadnetwork_id_array.size}"
74
- if @args_upload_flag
75
- applovin_config_file = File.join(pindo_single_config.pindo_common_configdir,"applovin_client_config.json")
76
- origin_json = {}
77
- if File.exist?(applovin_config_file)
78
- origin_json = JSON.parse(File.read(applovin_config_file))
79
- end
80
- origin_json["SKAdNetworkItems"] = skadnetwork_id_array
81
- File.write(applovin_config_file, JSON.pretty_generate(origin_json))
82
- git_addpush_repo(path:pindo_single_config.pindo_common_configdir, message:"Applovin SKAdNetworkItems", commit_file_params:["applovin_client_config.json"])
83
- end
84
- else
85
- Funlog.instance.fancyinfo_start("网络拉取applovin数据太少,从缓存中获取数据...")
86
- config_file = File.join(File::expand_path(Pindoconfig.instance.pindo_common_configdir), "applovin_client_config.json")
87
- config_json = JSON.parse(File.read(config_file))
88
- skadnetwork_id_array = skadnetwork_id_array + config_json["SKAdNetworkItems"]
89
- # puts "From Config SKAdNetworkItems Size: #{skadnetwork_id_array.size}"
90
- Funlog.instance.fancyinfo_success("网络拉取applovin数据太少,从缓存中获取到#{skadnetwork_id_array.size}条数据...")
91
- end
92
-
93
-
94
- Funlog.instance.fancyinfo_start("正在写入Xcode中...")
95
-
96
- skadnetwork_id_array = skadnetwork_id_array.uniq || []
97
-
98
- project_root_dir = Dir.pwd
99
- xcodeproj_file_name = Dir.glob(File.join(project_root_dir, "/*.xcodeproj")).max_by {|f| File.mtime(f)}
100
-
101
- plist_file_name = File.join(project_root_dir, "AppEntry/Info.plist")
102
- if !xcodeproj_file_name.nil?
103
- proj_name = File.basename(xcodeproj_file_name, ".xcodeproj")
104
- plist_file_name = get_applovin_infoplist(project_dir:project_root_dir, proj_name:proj_name)
105
- end
106
-
107
-
108
- info_plist_dict = {}
109
- if File.exist?(plist_file_name)
110
- info_plist_dict = Xcodeproj::Plist.read_from_path(plist_file_name)
111
- end
112
-
113
-
114
- info_plist_dict["NSAdvertisingAttributionReportEndpoint"] = info_plist_dict["NSAdvertisingAttributionReportEndpoint"] || "https://postbacks-app.com"
115
-
116
- if !info_plist_dict.has_key?("NSAppTransportSecurity")
117
- info_plist_dict["NSAppTransportSecurity"] = {}
118
- info_plist_dict["NSAppTransportSecurity"]["NSAllowsArbitraryLoads"] = true
119
- end
120
-
121
-
122
- if !skadnetwork_id_array.nil? && skadnetwork_id_array.size > 0
123
- info_plist_dict["SKAdNetworkItems"] = []
124
- skadnetwork_id_array.each do |network_id|
125
- item = {}
126
- item["SKAdNetworkIdentifier"] = network_id
127
- info_plist_dict["SKAdNetworkItems"] << item
128
- end
129
- end
130
-
131
- Xcodeproj::Plist.write_to_path(info_plist_dict, plist_file_name)
132
-
133
- Funlog.instance.fancyinfo_success("Xcode中applovin数据修改完成!")
134
-
135
- if @args_install_flag && !xcodeproj_file_name.nil? && File.exist?(xcodeproj_file_name)
136
-
137
- pindo_common_dir = pindo_single_config.pindo_common_configdir
138
-
139
- app_lovin_script = File.join(pindo_common_dir, "AppLovinQualityServiceSetup-ios-dev.rb")
140
- if @args_appstore_flag
141
- app_lovin_script = File.join(pindo_common_dir, "AppLovinQualityServiceSetup-ios.rb")
142
- end
143
-
144
- project_script_file = File.join(project_root_dir, "AppLovinQualityServiceSetup-ios.rb")
145
- FileUtils.cp_r(app_lovin_script, project_script_file)
146
- command = "ruby " + project_script_file
147
- # puts command
148
- system command
149
- end
150
-
151
-
152
- end
153
-
154
-
155
- def get_applovin_infoplist(project_dir:nil, proj_name:nil)
156
-
157
- info_plist_path = File.join(project_dir, "AppEntry/Info.plist")
158
- proj_fullname = File.join(project_dir, proj_name) + ".xcodeproj"
159
- if File.exist?(proj_fullname)
160
- project_obj = Xcodeproj::Project.open(proj_fullname)
161
- project_obj.targets.each do |target|
162
-
163
- if target.product_type.to_s.eql?("com.apple.product-type.application") then
164
- temp_info = target.build_configurations.first.build_settings['INFOPLIST_FILE']
165
- info_plist_path = File.join(project_dir, temp_info)
166
- end
167
- end
168
- end
169
-
170
- return info_plist_path
171
- end
172
-
173
-
174
- def req_applovin_json
175
-
176
- begin
177
- # https://dash.applovin.com/docs/v1/skadnetwork_ids.json
178
- applovin_url = "https://dash.applovin.com/docs/v1/skadnetwork_ids.json"
179
- con = Faraday.new
180
- res = con.get do |req|
181
- req.url applovin_url
182
- req.headers['Content-Type'] = 'application/json'
183
- end
184
-
185
- applovin_res_json = JSON.parse(res.body)
186
-
187
- return applovin_res_json
188
- rescue Exception => e
189
- return nil
190
- end
191
-
192
-
193
-
194
- end
195
-
196
- def req_applovin_mediia_json
197
-
198
-
199
- begin
200
- applovin_url = "https://dash.applovin.com/docs/v1/mediation_sk_adnetwork_ids"
201
- con = Faraday.new
202
- res = con.get do |req|
203
- req.url applovin_url
204
- req.headers['Content-Type'] = 'application/json'
205
- end
206
-
207
- applovin_res_json = JSON.parse(res.body)
208
- return applovin_res_json
209
- rescue Exception => e
210
- return nil
211
- end
212
- end
213
-
214
- end
215
- end
216
- end
217
- end
218
-
219
-
220
-
221
-
222
-
223
-
@@ -1,143 +0,0 @@
1
- require 'highline/import'
2
- require 'xcodeproj'
3
- require 'find'
4
- require 'fileutils'
5
- require 'pindo/base/executable'
6
-
7
- module Pindo
8
- class Command
9
- class Dev < Command
10
- class Autoresign < Dev
11
-
12
- include Appselect
13
-
14
- self.summary = '开发阶段ipa包重签名'
15
-
16
- self.description = <<-DESC
17
- 用最新的证书重签名ipa. 用法:pindo dev autoresign, 默认使用dev证书给当前目录下面的ipa重签名。
18
- 也可以加上可选参数,例如:pindo dev autoresign ~/Desktop/mydemo.ipa --adhoc --deploy --upload.
19
- DESC
20
-
21
- self.arguments = [
22
- CLAide::Argument.new('path/to/demo.ipa', true),
23
- ]
24
-
25
- def self.options
26
- [
27
- ['--ipa', '指定ipa的路径,用法:pindo dev autoresign --ipa=path/to/name.ipa'],
28
- ['--adhoc', '默认用dev证书,使用--adhoc设置使用adhoc证书编译, 用法:pindo dev autoresign --adhoc'],
29
- ['--deploy', '默认用开发的bundle id,使用--deploy设置使用发布bundle id来重签名, 用法:pindo dev autoresign --deploy'],
30
- ['--proj', '指定上传到pgyer对应的项目名称(大小写空格忽略),用法:pindo dev autoresign --proj=aichatv4'],
31
- ['--upload', '是否上传编译后的ipa, 用法:pindo dev autoresign --upload'],
32
- ['--send', '上传到之后是否发送测试信息,用法:pindo dev autoresign --send'],
33
- ].concat(super)
34
- end
35
-
36
-
37
- def initialize(argv)
38
-
39
- @args_ipa_file = argv.shift_argument
40
- @args_set_ipa_name = argv.option('ipa')
41
- @args_adhoc_flag = argv.flag?('adhoc', false)
42
- @args_deploy_flag = argv.flag?('deploy', false)
43
-
44
- @args_upload_flag = argv.flag?('upload', false)
45
- @args_send_flag = argv.flag?('send', false)
46
- @args_proj_name = argv.option('proj')
47
-
48
- if @args_send_flag
49
- @args_upload_flag = true
50
- end
51
-
52
- super
53
- @additional_args = argv.remainder!
54
- end
55
-
56
-
57
- def run
58
-
59
- ipa_file_name = @args_ipa_file
60
- if !@args_set_ipa_name.nil?
61
- ipa_file_name = @args_set_ipa_name
62
- end
63
-
64
- if !ipa_file_name.nil? && File.exist?(ipa_file_name)
65
- else
66
- current_dir = Dir.pwd
67
- # File.basename(f).include?("_resigned") ? Time.local(0, 0, 0) : File.mtime(f)
68
- ipa_file_name = Dir.glob(File.join(current_dir, "/*.ipa")).max_by {|f| File.basename(f).include?("_resigned") ? Time.local(0, 1, 1) : File.mtime(f)}
69
- end
70
-
71
- if !ipa_file_name.nil? && File.exist?(ipa_file_name)
72
- puts
73
- puts "正在重签名的ipa: #{ipa_file_name}"
74
- puts "时间: #{File.mtime(ipa_file_name)}"
75
- puts
76
- else
77
- return
78
- end
79
-
80
-
81
- mainapp_bundleid = nil
82
-
83
- if @args_deploy_flag
84
- mainapp_bundleid = get_selected_deploy_bundleid()
85
- else
86
- mainapp_bundleid = get_selected_dev_bundleid()
87
- end
88
- puts "mainapp_bundleid: #{mainapp_bundleid}"
89
-
90
- args_temp = []
91
- args_temp << mainapp_bundleid
92
-
93
- Pindo::Command::Deploy::Pullconfig::run(args_temp)
94
-
95
- app_info_obj = nil
96
- if @args_upload_flag
97
- proj_name = @args_proj_name
98
- app_info_obj = PgyerHelper.share_instace.prepare_upload(working_directory:Dir.pwd, proj_name:proj_name)
99
- end
100
-
101
- args_temp = []
102
- if @args_adhoc_flag
103
- args_temp << "--adhoc"
104
- else
105
- args_temp << "--dev"
106
- end
107
-
108
- if !ipa_file_name.nil?
109
-
110
- args_temp << "--ipa=#{ipa_file_name}"
111
- Pindo::Command::Deploy::Resign::run(args_temp)
112
-
113
-
114
- ipa_file_name = File::expand_path(ipa_file_name)
115
- ipa_base_name = File.basename(ipa_file_name, ".ipa")
116
- ipa_dir = File.dirname(ipa_file_name)
117
- ipa_file_upload = File.join(ipa_dir, ipa_base_name + "_resigned.ipa")
118
-
119
- if !ipa_file_upload.nil? && !app_info_obj.nil?
120
- description = "测试包重签名"
121
- result_data = PgyerHelper.share_instace.start_upload(app_info_obj:app_info_obj, ipa_file_upload:ipa_file_upload, description:nil)
122
- if !result_data.nil? && !result_data["data"].nil? && !result_data["data"]["id"].nil?
123
- msg_data = PgyerHelper.share_instace.make_msg_data(app_info_obj:app_info_obj, app_version_info_obj:result_data["data"])
124
- PgyerHelper.share_instace.print_app_version_info(msg_data:msg_data)
125
- if @args_send_flag
126
- PgyerHelper.share_instace.send_apptest_wechat_msg(msg_data:msg_data)
127
- end
128
- end
129
- end
130
-
131
- end
132
-
133
-
134
-
135
- #
136
- end
137
-
138
-
139
- end
140
- end
141
- end
142
- end
143
-