marsdate 1.1.7 → 2.0.1

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.
@@ -0,0 +1,124 @@
1
+ #!/usr/bin/env ruby
2
+ # Tests for MarsDateTime::TimeScale (NASA/Allison / Mars24).
3
+ # Run: ruby test/timescale_test.rb
4
+
5
+ require 'minitest/autorun'
6
+ require_relative '../lib/marsdate/timescale'
7
+ require 'date'
8
+
9
+ class TimeScaleTest < Minitest::Test
10
+ TS = MarsDateTime::TimeScale
11
+
12
+ def test_tai_utc_table
13
+ assert_in_delta 10.0, TS.tai_utc(Date.new(1972, 1, 1)), 1e-9
14
+ assert_in_delta 32.0, TS.tai_utc(Date.new(1999, 6, 1)), 1e-9
15
+ assert_in_delta 32.0, TS.tai_utc(Date.new(2000, 1, 6)), 1e-9
16
+ assert_in_delta 37.0, TS.tai_utc(Date.new(2017, 1, 1)), 1e-9
17
+ assert_in_delta 37.0, TS.tai_utc(Date.new(2026, 8, 13)), 1e-9
18
+ assert_in_delta 64.184, TS.tt_utc(Date.new(2000, 1, 6)), 1e-9
19
+ assert_in_delta 69.184, TS.tt_utc(Date.new(2017, 1, 1)), 1e-9
20
+ end
21
+
22
+ def test_mars24_2000_jan_6
23
+ # Mars24 worked example: 2000-01-06 00:00:00 UTC → MST 23:59:39
24
+ dt = DateTime.new(2000, 1, 6, 0, 0, 0)
25
+ assert_in_delta 2_451_549.5, TS.jd_ut(dt), 1e-9
26
+ assert_in_delta 2_451_549.500742407, TS.jd_tt(dt), 2e-6
27
+ h, m, s = TS.mtc_hms(dt)
28
+ hours = hms_to_hours(h, m, s)
29
+ assert_in_delta hms_to_hours(23, 59, 39), hours, 1.5 / 3600.0
30
+ assert_equal 23, h
31
+ assert_equal 59, m
32
+ end
33
+
34
+ def test_offset_independent
35
+ utc = DateTime.new(2000, 1, 1, 12, 0, 0)
36
+ est = utc.new_offset(Rational(-5, 24))
37
+ assert_in_delta TS.msd(utc), TS.msd(est), 1e-12
38
+ assert_in_delta TS.mtc_hours(utc), TS.mtc_hours(est), 1e-12
39
+ end
40
+
41
+ def test_wikipedia_2026_aug_12
42
+ # Wikipedia Timekeeping_on_Mars snapshot: 12 Aug 2026 00:25:08 UTC
43
+ # JDTT = 2461264.51825, MSD = 54251.08514, MTC = 02:02:36
44
+ dt = DateTime.new(2026, 8, 12, 0, 25, 8)
45
+ assert_in_delta 2_461_264.51825, TS.jd_tt(dt), 5e-5
46
+ assert_in_delta 54_251.08514, TS.msd(dt), 5e-5
47
+ h, m, s = TS.mtc_hms(dt)
48
+ assert_in_delta hms_to_hours(2, 2, 36), hms_to_hours(h, m, s), 2.0 / 3600.0
49
+ end
50
+
51
+ def test_mxt_vs_mtc
52
+ dt = DateTime.new(2000, 1, 6, 0, 0, 0)
53
+ frac = TS.sol_fraction(dt)
54
+ assert_operator frac, :>=, 0
55
+ assert_operator frac, :<, 1
56
+ si = TS.mxt_si_seconds(dt)
57
+ assert_in_delta frac * TS::SOL_SI_SECONDS, si, 1e-6
58
+ mtc_h = TS.mtc_hours(dt)
59
+ mxt_h = si / 3600.0
60
+ assert_in_delta mtc_h * TS::SOL_DAYS, mxt_h, 1e-6
61
+ assert_includes 88_775.0..88_776.0, TS::SOL_SI_SECONDS
62
+ end
63
+
64
+ def test_mtc_rounding_stays_below_24_hours
65
+ h, m, s = TS.hours_to_hms(24.0.prev_float, limit: 24)
66
+
67
+ assert_equal [23, 59], [h, m]
68
+ assert_operator s, :<, 60
69
+ end
70
+
71
+ def test_ls_j2000_region
72
+ dt = DateTime.new(2000, 1, 6, 0, 0, 0)
73
+ ls = TS.ls_deg(TS.jd_tt(dt))
74
+ assert_in_delta 277.19, ls, 0.05
75
+ end
76
+
77
+ def test_earth_from_msd_round_trip
78
+ dt = DateTime.new(2000, 1, 6, 0, 0, 0)
79
+ back = TS.earth_from_msd(TS.msd(dt))
80
+ assert_in_delta 0, (back - dt).to_f, 1e-9
81
+
82
+ dt = DateTime.new(2026, 8, 13, 0, 6, 56)
83
+ back = TS.earth_from_msd(TS.msd(dt))
84
+ assert_in_delta 0, (back - dt).to_f, 1e-8
85
+ end
86
+
87
+ def test_year1_caption_treats_tt_as_ut
88
+ r = TS.epoch_report
89
+ assert_match(/no year-1/, r[:caveat])
90
+ assert_equal(-665773, r[:epoch_msd])
91
+ cap = r[:epoch_earth_if_tt_were_ut]
92
+ assert_equal 1, cap.year
93
+ assert_equal 1, cap.month
94
+ assert_equal 23, cap.day
95
+ assert_equal 13, cap.hour
96
+ assert_equal 40, cap.min
97
+ eq = r[:ls0_earth_if_tt_were_ut]
98
+ assert_equal 1, eq.year
99
+ assert_equal 1, eq.month
100
+ assert_equal 24, eq.day
101
+ assert_equal 5, eq.hour
102
+ assert_equal 53, eq.min
103
+ end
104
+
105
+ def test_year1_equinox_sol
106
+ hint = DateTime.new(1, 1, 22, 12, 0, 0)
107
+ eq = TS.vernal_equinox_jd_tt(hint.ajd.to_f)
108
+ ls = TS.ls_deg(eq)
109
+ dist = [ls, (ls - 360).abs].min
110
+ assert_operator dist, :<, 0.01, "year-1 Ls=0 search: Ls=#{ls} at JD_TT=#{eq}"
111
+ m = TS.msd(jd_tt: eq)
112
+ assert_operator m, :<, 0, "year-1 MSD should be before 1873 (got #{m})"
113
+ frac = m % 1.0
114
+ frac += 1 if frac < 0
115
+ assert_operator frac, :>=, 0
116
+ assert_operator frac, :<, 1
117
+ end
118
+
119
+ private
120
+
121
+ def hms_to_hours(h, m, s)
122
+ h + m / 60.0 + s / 3600.0
123
+ end
124
+ end
metadata CHANGED
@@ -1,15 +1,42 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: marsdate
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.7
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hal Fulton
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2019-10-31 00:00:00.000000000 Z
12
- dependencies: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: minitest
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '6.0'
19
+ type: :development
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '6.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: rake
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '13.4'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '13.4'
13
40
  description: |2
14
41
  This is a library for handling dates and times on Mars
15
42
  for the Martian Common Era calendar (created by Hal Fulton).
@@ -20,15 +47,27 @@ executables:
20
47
  extensions: []
21
48
  extra_rdoc_files: []
22
49
  files:
50
+ - CHANGELOG.md
51
+ - LICENSE.txt
52
+ - README.md
23
53
  - bin/marsdate
24
54
  - lib/marsdate.rb
25
- - test/spec/marsdate_spec.rb
55
+ - lib/marsdate/calendar.rb
56
+ - lib/marsdate/timescale.rb
57
+ - lib/marsdate/version.rb
58
+ - marsdate.gemspec
59
+ - test/calendar_test.rb
60
+ - test/cli_test.rb
26
61
  - test/test.rb
62
+ - test/timescale_test.rb
27
63
  homepage: https://github.com/Hal9000/marsdate
28
64
  licenses:
29
- - Ruby
30
- metadata: {}
31
- post_install_message:
65
+ - MIT
66
+ metadata:
67
+ bug_tracker_uri: https://github.com/Hal9000/marsdate/issues
68
+ changelog_uri: https://github.com/Hal9000/marsdate/blob/master/CHANGELOG.md
69
+ source_code_uri: https://github.com/Hal9000/marsdate
70
+ post_install_message: "\n Success! Run executable 'marsdate' for help.\n "
32
71
  rdoc_options: []
33
72
  require_paths:
34
73
  - lib
@@ -36,15 +75,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
36
75
  requirements:
37
76
  - - ">="
38
77
  - !ruby/object:Gem::Version
39
- version: '0'
78
+ version: '2.7'
40
79
  required_rubygems_version: !ruby/object:Gem::Requirement
41
80
  requirements:
42
81
  - - ">="
43
82
  - !ruby/object:Gem::Version
44
83
  version: '0'
45
84
  requirements: []
46
- rubygems_version: 3.0.4
47
- signing_key:
85
+ rubygems_version: 3.6.9
48
86
  specification_version: 4
49
87
  summary: Date/time library for Mars
50
88
  test_files: []
@@ -1,382 +0,0 @@
1
- $: << "lib"
2
- require 'marsdate'
3
-
4
- require 'rubygems'
5
- require 'minitest'
6
- require 'minitest/spec'
7
- require 'minitest/autorun'
8
-
9
- require 'pp'
10
-
11
- def my_assert(expr)
12
- if !expr && block_given?
13
- puts "\n--- DEBUG: "
14
- yield
15
- end
16
- assert(expr)
17
- end
18
-
19
- def my_assert_equal(e1, e2)
20
- if e1 != e2 && block_given?
21
- puts "\n--- DEBUG: "
22
- yield
23
- end
24
- assert_equal(e1, e2)
25
- end
26
-
27
- ## experimenting...
28
-
29
- describe "Mars date 1/1/1" do
30
- md = MarsDateTime.new(1,1,1)
31
- it "should compute backwards to same result" do
32
- assert_equal([1,1,1,0,0,0],md.ymshms)
33
- end
34
- it "should be a Sunday" do
35
- assert_equal(0,md.dow)
36
- end
37
- end
38
-
39
- describe "Mars date 2/3/4" do
40
- md = MarsDateTime.new(2,3,4)
41
- it "should compute backwards to same result" do
42
- assert_equal([2,3,4,0,0,0],md.ymshms)
43
- end
44
- end
45
-
46
- describe "Mars date 5/4/24" do
47
- md = MarsDateTime.new(5,4,24)
48
- it "should compute backwards to same result" do
49
- assert_equal([5,4,24,0,0,0],md.ymshms)
50
- end
51
- end
52
-
53
- describe "Mars date 1054/20/20" do
54
- md = MarsDateTime.new(1054,20,20)
55
- it "should compute backwards to same result" do
56
- assert_equal([1054,20,20,0,0,0],md.ymshms)
57
- end
58
- end
59
-
60
- describe "Earth date 1/1/22" do
61
- ed = DateTime.new(1,1,22)
62
- md = MarsDateTime.new(ed)
63
- it "should be approximately M-date 1/1/1" do
64
- assert_equal([1,1,1],md.ymshms[0..2])
65
- end
66
- it "should yield a Martian Sunday" do
67
- assert_equal(md.day_of_week,"Sunday")
68
- end
69
- end
70
-
71
- describe "Earth date May 23, 1961" do
72
- e = DateTime.new(1961,5,23)
73
- m = MarsDateTime.new(e)
74
- it "should yield a Martian Thursday" do
75
- assert_equal(m.day_of_week,"Thursday")
76
- end
77
- end
78
-
79
- describe "Earth date May 24, 1961" do
80
- e = DateTime.new(1961,5,24)
81
- m = MarsDateTime.new(e)
82
- it "should yield a Martian Friday" do
83
- assert_equal(m.day_of_week,"Friday")
84
- end
85
- end
86
-
87
- describe "A Martian date/time (y,m,s,h,m,s)" do
88
- m = MarsDateTime.new(1043,2,15,12,34,45)
89
- it "should set all its accessors properly" do
90
- assert_equal(1043,m.myear)
91
- assert_equal(2,m.month)
92
- assert_equal(15,m.sol)
93
- assert_equal(12,m.hr)
94
- assert_equal(34,m.min)
95
- assert_equal(45,m.sec)
96
- assert_equal(4,m.dow)
97
- assert_equal("Thursday",m.day_of_week)
98
- assert_equal(43,m.year_sol)
99
- assert_equal(696715,m.epoch_sol)
100
- end
101
- end
102
-
103
- describe "The 2007 Martian equinox" do
104
- e = DateTime.new(2007,12,9,17,20,0).new_offset(-5)
105
- m = MarsDateTime.new(e)
106
- m11 = MarsDateTime.new(1068,1,1)
107
- it "should fall on or near 1/1 (MCE)" do
108
- diff = (m11-m).abs
109
- flag = diff < 1.0
110
- assert(flag, "Difference: #{diff}")
111
- end
112
- end
113
-
114
- describe "Constructing without parameters" do
115
- m = MarsDateTime.new
116
- e = DateTime.now
117
- m2e = m.earth_date
118
- it "should default to today" do
119
- diff = (e-m2e).abs # m - e doesn't work!
120
- assert(diff < 1.0)
121
- end
122
- end
123
-
124
- describe "Constructing with a DateTime" do
125
- it "should convert from Gregorian to MCE" do
126
- e = DateTime.new(1902,8,12,7,0,0)
127
- m = MarsDateTime.new(e)
128
- diff = (m.earth_date - e).abs # days as a float
129
- x = assert(diff < 1.0)
130
- end
131
- end
132
-
133
- describe "A Martian date/time (933,1,2)" do
134
- m = MarsDateTime.new(933,1,2)
135
- it "should set the three obvious accessors properly" do
136
- assert_equal(933,m.myear)
137
- assert_equal(1,m.month)
138
- assert_equal(2,m.sol)
139
- end
140
- end
141
-
142
- describe "A Martian date/time (933,1,1)" do
143
- m = MarsDateTime.new(933,1,1)
144
- it "should set the three obvious accessors properly" do
145
- assert_equal(933,m.myear)
146
- assert_equal(1,m.month)
147
- assert_equal(1,m.sol)
148
- end
149
- end
150
-
151
- describe "The Martian date 24/25" do
152
- describe "in a leap year" do
153
- year = 1067
154
- it "should exist" do
155
- assert( MarsDateTime.leap?(year) )
156
- MarsDateTime.new(year,24,25) # may raise exception - no #wont_raise
157
- end
158
- end
159
- describe "in a non-leap year" do
160
- year = 1066
161
- it "should not exist" do
162
- assert( ! MarsDateTime.leap?(year) )
163
- lambda { MarsDateTime.new(year,24,25) }.must_raise(RuntimeError)
164
- end
165
- end
166
- end
167
-
168
- describe "The earth_date convertor" do
169
- m = MarsDateTime.new(1,1,1)
170
- it "should convert to a Gregorian date" do
171
- e = m.earth_date
172
- assert_equal(1,e.year)
173
- assert_equal(1,e.month)
174
- assert((e.day-22).abs <= 1, "e - 22 = #{e.day - 22}")
175
- end
176
- end
177
-
178
- describe "An Earthly date" do
179
- e1 = DateTime.new(1961,5,31)
180
- it "should (approximately) make the conversion roundtrip" do
181
- m1 = MarsDateTime.new(e1)
182
- e2 = m1.earth_date
183
- diff = e2 - e1
184
- assert(diff.abs <= 0.01, "Difference = #{diff}")
185
- end
186
- end
187
-
188
- describe "A Martian date" do
189
- m1 = MarsDateTime.new(1067,1,1)
190
- it "should (approximately) make the conversion roundtrip" do
191
- e1 = m1.earth_date
192
- m2 = MarsDateTime.new(e1)
193
- diff = m2 - m1
194
- assert(diff.abs < 0.01)
195
- end
196
- end
197
-
198
- describe "An arbitrary Martian date" do
199
- m1 = MarsDateTime.new(1069,15,24)
200
- m2 = MarsDateTime.new(933,6,4)
201
- m3 = MarsDateTime.new(1055,14,1)
202
- it "should format well with strftime" do
203
- assert_equal("Mon",m1.strftime("%a"))
204
- assert_equal("Monday",m1.strftime("%A"))
205
- assert_equal("Aug",m1.strftime("%b"))
206
- assert_equal("M-August",m1.strftime("%B"))
207
- assert_equal("24",m1.strftime("%d"))
208
- assert_equal("24",m1.strftime("%e"))
209
- assert_equal("1069-15-24",m1.strftime("%F"))
210
- assert_equal("416",m1.strftime("%j"))
211
- assert_equal("15",m1.strftime("%m"))
212
- assert_equal("0",m1.strftime("%s"))
213
- assert_equal("2",m1.strftime("%u"))
214
- assert_equal("60",m1.strftime("%U"))
215
- assert_equal("1",m1.strftime("%w"))
216
- assert_equal("1069/15/24",m1.strftime("%x"))
217
- assert_equal("1069",m1.strftime("%Y"))
218
- assert_equal("\n",m1.strftime("%n"))
219
- assert_equal("\t",m1.strftime("%t"))
220
- assert_equal("%",m1.strftime("%%"))
221
-
222
- assert_equal("Wed",m2.strftime("%a"))
223
- assert_equal("Wednesday",m2.strftime("%A"))
224
- assert_equal("Leo",m2.strftime("%b"))
225
- assert_equal("Leo",m2.strftime("%B"))
226
- assert_equal("04",m2.strftime("%d"))
227
- assert_equal(" 4",m2.strftime("%e"))
228
- assert_equal("933-06-04",m2.strftime("%F"))
229
- assert_equal("144",m2.strftime("%j"))
230
- assert_equal("06",m2.strftime("%m"))
231
- assert_equal("0",m2.strftime("%s"))
232
- assert_equal("4",m2.strftime("%u"))
233
- assert_equal("21",m2.strftime("%U"))
234
- assert_equal("3",m2.strftime("%w"))
235
- assert_equal("933/06/04",m2.strftime("%x"))
236
- assert_equal("933",m2.strftime("%Y"))
237
-
238
- assert_equal("Sag",m3.strftime("%b"))
239
- assert_equal("Sagittarius",m3.strftime("%B"))
240
- end
241
- end
242
-
243
- describe "An Earthly date with h:m:s" do
244
- e1 = DateTime.new(1976,7,4,16,30,0) # July 4, 1976 16:30
245
- m1 = MarsDateTime.new(e1)
246
- it "should make the conversion roundtrip" do
247
- 30.times do
248
- m1 = MarsDateTime.new(e1)
249
- e2 = m1.earth_date
250
- diff = e2 - e1
251
- assert(diff.abs <= 0.01) { STDERR.puts " diff = #{diff}" }
252
- e1 += 1
253
- end
254
- end
255
- end
256
-
257
- describe "Martian dates" do
258
- m1 = MarsDateTime.new(1068,14,22)
259
- m2 = MarsDateTime.new(1068,14,21)
260
- e1 = DateTime.new(2002,4,19)
261
- e2 = DateTime.new(2012,9,29)
262
- it "should compare with each other" do
263
- assert(m1 > m2)
264
- assert(m2 < m1)
265
- end
266
- it "should compare with Earth dates" do
267
- assert(m1 > e1)
268
- assert(m2 < e2)
269
- end
270
- it "should honor equality (within roundoff)" do
271
- assert(m1 == m1)
272
- assert(m1 != m2)
273
- end
274
- end
275
-
276
- describe "The 'now' and 'today' class methods" do
277
- t1 = MarsDateTime.now
278
- t0 = MarsDateTime.today
279
- it "should be less than a day apart" do
280
- diff = t1 - t0
281
- assert(diff < 1.0)
282
- end
283
- end
284
-
285
- describe "In M-year 1043, each month" do
286
- md = (1..24).to_a.map {|mm| MarsDateTime.new(1043,mm,1) }
287
- it "should start on a Thursday" do
288
- md.each {|m| assert(m.day_of_week == "Thursday") }
289
- end
290
- end
291
-
292
- describe "Converting 1961/5/31 to Martian" do
293
- e = DateTime.new(1961,5,31)
294
- m = MarsDateTime.new(e)
295
- it "should yield Friday M-April 9, 1043 MCE" do
296
- assert(m.year == 1043, "bad year: #{m.year}")
297
- assert(m.month == 7, "bad month: #{m.month}")
298
- assert(m.sol == 9, "bad sol: #{m.sol}")
299
- end
300
- it "should give a Martian Saturday" do
301
- assert(m.day_of_week == "Friday", "got: #{m.day_of_week}")
302
- end
303
- end
304
-
305
- describe "The 1609 Martian equinox" do
306
- e = DateTime.new(1609,3,12).new_offset(-5)
307
- m = MarsDateTime.new(e)
308
- m11 = MarsDateTime.new(856,1,1)
309
- it "should fall on or near 1/1 (MCE)" do
310
- diff = (m11-m).abs
311
- assert(diff < 1.0, "Difference = #{diff}")
312
- end
313
- end
314
-
315
- describe "The 1902 Martian equinox" do
316
- e = DateTime.new(1902,8,12,7,0,0).new_offset(-5)
317
- m = MarsDateTime.new(e)
318
- m11 = MarsDateTime.new(1012,1,1)
319
- it "should fall on or near 1/1 (MCE)" do
320
- diff = (m11-m).abs
321
- assert(diff < 1.0, "Difference: #{diff}")
322
- end
323
- end
324
-
325
- describe "A Martian date" do
326
- puts "***** Entering problem test..."
327
- m = MarsDateTime.new(1068,1,1)
328
- p m
329
- describe "plus 7 days" do
330
- m2 = m + 7
331
- p m2
332
- it "should be the same day of the week" do
333
- assert_equal(m.day_of_week, m2.day_of_week)
334
- end
335
- end
336
- describe "plus 14 days" do
337
- m3 = m + 14
338
- p m3
339
- it "should be the same day of the week" do
340
- assert_equal(m.day_of_week, m3.day_of_week)
341
- end
342
- end
343
- describe "plus 21 days" do
344
- m4 = m + 21
345
- p m4
346
- it "should be the same day of the week" do
347
- assert_equal(m.day_of_week, m4.day_of_week)
348
- end
349
- end
350
- puts "***** Exiting problem test"
351
- end
352
-
353
- describe "Martian April 1, 1043" do
354
- m = MarsDateTime.new(1043,7,1)
355
- it "should be a Thursday" do
356
- assert_equal(m.day_of_week,"Thursday")
357
- end
358
- end
359
-
360
- describe "A Martian date" do
361
- md = MarsDateTime.new(1062,20,20)
362
- m2 = MarsDateTime.new(1062,20,17)
363
- it "should allow subtraction of another date" do
364
- m = md - m2
365
- assert( (m - 3.0) < 0.01) # sols
366
- end
367
- it "should allow subtraction of an Earth date" do
368
- e = DateTime.new(1998, 3, 12, 16, 45, 0)
369
- m = md - e
370
- assert( (m - 3.0) < 0.01) # sols
371
- end
372
- it "should allow subtraction of a Fixnum" do
373
- m = md - 3 # sols
374
- assert( (m - m2) < 0.01)
375
- end
376
- it "should allow subtraction of a Float" do
377
- m = md - 3.0 # sols
378
- assert( (m - m2) < 0.01)
379
- end
380
- end
381
-
382
-