sass-embedded 1.79.3-riscv64-linux-gnu → 1.79.5-riscv64-linux-gnu

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/exe/sass +1 -9
  3. data/ext/sass/cli.rb +7 -0
  4. data/ext/sass/dart-sass/src/sass.snapshot +0 -0
  5. data/ext/sass/embedded_sass_pb.rb +1 -1
  6. data/lib/sass/compiler/connection.rb +1 -9
  7. data/lib/sass/compiler/host/protofier.rb +17 -55
  8. data/lib/sass/elf.rb +4 -4
  9. data/lib/sass/embedded/version.rb +1 -1
  10. data/lib/sass/value/color/channel.rb +79 -0
  11. data/lib/sass/value/color/conversions.rb +473 -0
  12. data/lib/sass/value/color/gamut_map_method/clip.rb +45 -0
  13. data/lib/sass/value/color/gamut_map_method/local_minde.rb +94 -0
  14. data/lib/sass/value/color/gamut_map_method.rb +45 -0
  15. data/lib/sass/value/color/interpolation_method.rb +51 -0
  16. data/lib/sass/value/color/space/a98_rgb.rb +57 -0
  17. data/lib/sass/value/color/space/display_p3.rb +57 -0
  18. data/lib/sass/value/color/space/hsl.rb +65 -0
  19. data/lib/sass/value/color/space/hwb.rb +70 -0
  20. data/lib/sass/value/color/space/lab.rb +77 -0
  21. data/lib/sass/value/color/space/lch.rb +53 -0
  22. data/lib/sass/value/color/space/lms.rb +129 -0
  23. data/lib/sass/value/color/space/oklab.rb +66 -0
  24. data/lib/sass/value/color/space/oklch.rb +54 -0
  25. data/lib/sass/value/color/space/prophoto_rgb.rb +59 -0
  26. data/lib/sass/value/color/space/rec2020.rb +69 -0
  27. data/lib/sass/value/color/space/rgb.rb +52 -0
  28. data/lib/sass/value/color/space/srgb.rb +140 -0
  29. data/lib/sass/value/color/space/srgb_linear.rb +72 -0
  30. data/lib/sass/value/color/space/utils.rb +86 -0
  31. data/lib/sass/value/color/space/xyz_d50.rb +100 -0
  32. data/lib/sass/value/color/space/xyz_d65.rb +57 -0
  33. data/lib/sass/value/color/space.rb +198 -0
  34. data/lib/sass/value/color.rb +537 -162
  35. data/lib/sass/value/fuzzy_math.rb +23 -19
  36. data/lib/sass/value/number.rb +1 -1
  37. data/lib/sass/value/string.rb +1 -1
  38. metadata +29 -5
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sass
4
+ module Value
5
+ class Color
6
+ module Space
7
+ # @see https://github.com/sass/dart-sass/blob/main/lib/src/value/color/space/prophoto_rgb.dart
8
+ class ProphotoRgb
9
+ include Space
10
+
11
+ def bounded?
12
+ true
13
+ end
14
+
15
+ def initialize
16
+ super('prophoto-rgb', Utils::RGB_CHANNELS)
17
+ end
18
+
19
+ def to_linear(channel)
20
+ abs = channel.abs
21
+ abs <= 16 / 512.0 ? channel / 16.0 : (channel <=> 0) * (abs**1.8)
22
+ end
23
+
24
+ def from_linear(channel)
25
+ abs = channel.abs
26
+ abs >= 1 / 512.0 ? (channel <=> 0) * (abs**(1 / 1.8)) : 16 * channel
27
+ end
28
+
29
+ private
30
+
31
+ def transformation_matrix(dest)
32
+ case dest
33
+ when A98_RGB
34
+ Conversions::LINEAR_PROPHOTO_RGB_TO_LINEAR_A98_RGB
35
+ when DISPLAY_P3
36
+ Conversions::LINEAR_PROPHOTO_RGB_TO_LINEAR_DISPLAY_P3
37
+ when LMS
38
+ Conversions::LINEAR_PROPHOTO_RGB_TO_LMS
39
+ when REC2020
40
+ Conversions::LINEAR_PROPHOTO_RGB_TO_LINEAR_REC2020
41
+ when RGB, SRGB, SRGB_LINEAR
42
+ Conversions::LINEAR_PROPHOTO_RGB_TO_LINEAR_SRGB
43
+ when XYZ_D50
44
+ Conversions::LINEAR_PROPHOTO_RGB_TO_XYZ_D50
45
+ when XYZ_D65
46
+ Conversions::LINEAR_PROPHOTO_RGB_TO_XYZ_D65
47
+ else
48
+ super
49
+ end
50
+ end
51
+ end
52
+
53
+ private_constant :ProphotoRgb
54
+
55
+ PROPHOTO_RGB = ProphotoRgb.new
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sass
4
+ module Value
5
+ class Color
6
+ module Space
7
+ # @see https://github.com/sass/dart-sass/blob/main/lib/src/value/color/space/rec2020.dart
8
+ class Rec2020
9
+ include Space
10
+
11
+ # A constant used in the rec2020 gamma encoding/decoding functions.
12
+ ALPHA = 1.09929682680944
13
+
14
+ private_constant :ALPHA
15
+
16
+ # A constant used in the rec2020 gamma encoding/decoding functions.
17
+ BETA = 0.018053968510807
18
+
19
+ private_constant :BETA
20
+
21
+ def bounded?
22
+ true
23
+ end
24
+
25
+ def initialize
26
+ super('rec2020', Utils::RGB_CHANNELS)
27
+ end
28
+
29
+ def to_linear(channel)
30
+ abs = channel.abs
31
+ abs < BETA * 4.5 ? channel / 4.5 : (channel <=> 0) * (((abs + ALPHA - 1) / ALPHA)**(1 / 0.45))
32
+ end
33
+
34
+ def from_linear(channel)
35
+ abs = channel.abs
36
+ abs > BETA ? (channel <=> 0) * ((ALPHA * (abs**0.45)) - (ALPHA - 1)) : 4.5 * channel
37
+ end
38
+
39
+ private
40
+
41
+ def transformation_matrix(dest)
42
+ case dest
43
+ when A98_RGB
44
+ Conversions::LINEAR_REC2020_TO_LINEAR_A98_RGB
45
+ when DISPLAY_P3
46
+ Conversions::LINEAR_REC2020_TO_LINEAR_DISPLAY_P3
47
+ when LMS
48
+ Conversions::LINEAR_REC2020_TO_LMS
49
+ when PROPHOTO_RGB
50
+ Conversions::LINEAR_REC2020_TO_LINEAR_PROPHOTO_RGB
51
+ when RGB, SRGB, SRGB_LINEAR
52
+ Conversions::LINEAR_REC2020_TO_LINEAR_SRGB
53
+ when XYZ_D50
54
+ Conversions::LINEAR_REC2020_TO_XYZ_D50
55
+ when XYZ_D65
56
+ Conversions::LINEAR_REC2020_TO_XYZ_D65
57
+ else
58
+ super
59
+ end
60
+ end
61
+ end
62
+
63
+ private_constant :Rec2020
64
+
65
+ REC2020 = Rec2020.new
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sass
4
+ module Value
5
+ class Color
6
+ module Space
7
+ # @see https://github.com/sass/dart-sass/blob/main/lib/src/value/color/space/rgb.dart
8
+ class Rgb
9
+ include Space
10
+
11
+ def bounded?
12
+ true
13
+ end
14
+
15
+ def legacy?
16
+ true
17
+ end
18
+
19
+ def initialize
20
+ super('rgb', [
21
+ LinearChannel.new('red', 0, 255, lower_clamped: true, upper_clamped: true).freeze,
22
+ LinearChannel.new('green', 0, 255, lower_clamped: true, upper_clamped: true).freeze,
23
+ LinearChannel.new('blue', 0, 255, lower_clamped: true, upper_clamped: true).freeze
24
+ ].freeze)
25
+ end
26
+
27
+ def convert(dest, red, green, blue, alpha)
28
+ SRGB.convert(
29
+ dest,
30
+ red.nil? ? nil : red / 255.0,
31
+ green.nil? ? nil : green / 255.0,
32
+ blue.nil? ? nil : blue / 255.0,
33
+ alpha
34
+ )
35
+ end
36
+
37
+ def to_linear(channel)
38
+ Utils.srgb_and_display_p3_to_linear(channel / 255.0)
39
+ end
40
+
41
+ def from_linear(channel)
42
+ Utils.srgb_and_display_p3_from_linear(channel) * 255
43
+ end
44
+ end
45
+
46
+ private_constant :Rgb
47
+
48
+ RGB = Rgb.new
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,140 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sass
4
+ module Value
5
+ class Color
6
+ module Space
7
+ # @see https://github.com/sass/dart-sass/blob/main/lib/src/value/color/space/srgb.dart
8
+ class Srgb
9
+ include Space
10
+
11
+ def bounded?
12
+ true
13
+ end
14
+
15
+ def initialize
16
+ super('srgb', Utils::RGB_CHANNELS)
17
+ end
18
+
19
+ def convert(dest, red, green, blue, alpha,
20
+ missing_lightness: false,
21
+ missing_chroma: false,
22
+ missing_hue: false)
23
+ case dest
24
+ when HSL, HWB
25
+ red = 0 if red.nil?
26
+ green = 0 if green.nil?
27
+ blue = 0 if blue.nil?
28
+
29
+ min, max = [red, green, blue].minmax
30
+ delta = max - min
31
+
32
+ hue = if max == min
33
+ 0.0
34
+ elsif max == red
35
+ (60.0 * (green - blue) / delta) + 360
36
+ elsif max == green
37
+ (60.0 * (blue - red) / delta) + 120
38
+ else # max == blue
39
+ (60.0 * (red - green) / delta) + 240
40
+ end
41
+
42
+ if dest == HSL
43
+ lightness = (min + max) / 2.0
44
+
45
+ saturation = if [0, 1].include?(lightness)
46
+ 0.0
47
+ else
48
+ 100.0 * (max - lightness) / [lightness, 1 - lightness].min
49
+ end
50
+ if saturation.negative?
51
+ hue += 180
52
+ saturation = saturation.abs
53
+ end
54
+
55
+ Color.send(
56
+ :for_space_internal,
57
+ dest,
58
+ missing_hue || FuzzyMath.equals(saturation, 0) ? nil : hue % 360,
59
+ missing_chroma ? nil : saturation,
60
+ missing_lightness ? nil : lightness * 100,
61
+ alpha
62
+ )
63
+ else
64
+ whiteness = min * 100
65
+ blackness = 100 - (max * 100)
66
+
67
+ Color.send(
68
+ :for_space_internal,
69
+ dest,
70
+ missing_hue || FuzzyMath.greater_than_or_equals(whiteness + blackness, 100) ? nil : hue % 360,
71
+ whiteness,
72
+ blackness,
73
+ alpha
74
+ )
75
+ end
76
+ when RGB
77
+ Color.send(
78
+ :_for_space,
79
+ dest,
80
+ red.nil? ? nil : red * 255,
81
+ green.nil? ? nil : green * 255,
82
+ blue.nil? ? nil : blue * 255,
83
+ alpha
84
+ )
85
+ when SRGB_LINEAR
86
+ Color.send(
87
+ :_for_space,
88
+ dest,
89
+ red.nil? ? nil : to_linear(red),
90
+ green.nil? ? nil : to_linear(green),
91
+ blue.nil? ? nil : to_linear(blue),
92
+ alpha
93
+ )
94
+ else
95
+ convert_linear(dest, red, green, blue, alpha,
96
+ missing_lightness:,
97
+ missing_chroma:,
98
+ missing_hue:)
99
+ end
100
+ end
101
+
102
+ def to_linear(channel)
103
+ Utils.srgb_and_display_p3_to_linear(channel)
104
+ end
105
+
106
+ def from_linear(channel)
107
+ Utils.srgb_and_display_p3_from_linear(channel)
108
+ end
109
+
110
+ private
111
+
112
+ def transformation_matrix(dest)
113
+ case dest
114
+ when A98_RGB
115
+ Conversions::LINEAR_SRGB_TO_LINEAR_A98_RGB
116
+ when DISPLAY_P3
117
+ Conversions::LINEAR_SRGB_TO_LINEAR_DISPLAY_P3
118
+ when LMS
119
+ Conversions::LINEAR_SRGB_TO_LMS
120
+ when PROPHOTO_RGB
121
+ Conversions::LINEAR_SRGB_TO_LINEAR_PROPHOTO_RGB
122
+ when REC2020
123
+ Conversions::LINEAR_SRGB_TO_LINEAR_REC2020
124
+ when XYZ_D50
125
+ Conversions::LINEAR_SRGB_TO_XYZ_D50
126
+ when XYZ_D65
127
+ Conversions::LINEAR_SRGB_TO_XYZ_D65
128
+ else
129
+ super
130
+ end
131
+ end
132
+ end
133
+
134
+ private_constant :Srgb
135
+
136
+ SRGB = Srgb.new
137
+ end
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sass
4
+ module Value
5
+ class Color
6
+ module Space
7
+ # @see https://github.com/sass/dart-sass/blob/main/lib/src/value/color/space/srgb_linear.dart
8
+ class SrgbLinear
9
+ include Space
10
+
11
+ def bounded?
12
+ true
13
+ end
14
+
15
+ def initialize
16
+ super('srgb-linear', Utils::RGB_CHANNELS)
17
+ end
18
+
19
+ def convert(dest, red, green, blue, alpha)
20
+ case dest
21
+ when HSL, HWB, RGB, SRGB
22
+ SRGB.convert(
23
+ dest,
24
+ red.nil? ? nil : Utils.srgb_and_display_p3_from_linear(red),
25
+ green.nil? ? nil : Utils.srgb_and_display_p3_from_linear(green),
26
+ blue.nil? ? nil : Utils.srgb_and_display_p3_from_linear(blue),
27
+ alpha
28
+ )
29
+ else
30
+ super
31
+ end
32
+ end
33
+
34
+ def to_linear(channel)
35
+ channel
36
+ end
37
+
38
+ def from_linear(channel)
39
+ channel
40
+ end
41
+
42
+ private
43
+
44
+ def transformation_matrix(dest)
45
+ case dest
46
+ when A98_RGB
47
+ Conversions::LINEAR_SRGB_TO_LINEAR_A98_RGB
48
+ when DISPLAY_P3
49
+ Conversions::LINEAR_SRGB_TO_LINEAR_DISPLAY_P3
50
+ when PROPHOTO_RGB
51
+ Conversions::LINEAR_SRGB_TO_LINEAR_PROPHOTO_RGB
52
+ when REC2020
53
+ Conversions::LINEAR_SRGB_TO_LINEAR_REC2020
54
+ when XYZ_D65
55
+ Conversions::LINEAR_SRGB_TO_XYZ_D65
56
+ when XYZ_D50
57
+ Conversions::LINEAR_SRGB_TO_XYZ_D50
58
+ when LMS
59
+ Conversions::LINEAR_SRGB_TO_LMS
60
+ else
61
+ super
62
+ end
63
+ end
64
+ end
65
+
66
+ private_constant :SrgbLinear
67
+
68
+ SRGB_LINEAR = SrgbLinear.new
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sass
4
+ module Value
5
+ class Color
6
+ module Space
7
+ # @see https://github.com/sass/dart-sass/blob/main/lib/src/value/color/space/utils.dart
8
+ module Utils
9
+ module_function
10
+
11
+ # A constant used to convert Lab to/from XYZ.
12
+ LAB_KAPPA = Rational(24_389, 27) # 29^3/3^3
13
+
14
+ # A constant used to convert Lab to/from XYZ.
15
+ LAB_EPSILON = Rational(216, 24_389) # 6^3/29^3
16
+
17
+ # The hue channel shared across all polar color spaces.
18
+ HUE_CHANNEL = ColorChannel.new('hue', polar_angle: true, associated_unit: 'deg').freeze
19
+
20
+ # The color channels shared across all RGB color spaces (except the legacy RGB space).
21
+ RGB_CHANNELS = [
22
+ LinearChannel.new('red', 0, 1).freeze,
23
+ LinearChannel.new('green', 0, 1).freeze,
24
+ LinearChannel.new('blue', 0, 1).freeze
25
+ ].freeze
26
+
27
+ # The color channels shared across both XYZ color spaces.
28
+ XYZ_CHANNELS = [
29
+ LinearChannel.new('x', 0, 1).freeze,
30
+ LinearChannel.new('y', 0, 1).freeze,
31
+ LinearChannel.new('z', 0, 1).freeze
32
+ ].freeze
33
+
34
+ # The algorithm for converting a single `srgb` or `display-p3` channel to
35
+ # linear-light form.
36
+ # @param [Numeric]
37
+ # @return [Numeric]
38
+ def srgb_and_display_p3_to_linear(channel)
39
+ abs = channel.abs
40
+ abs <= 0.04045 ? channel / 12.92 : (channel <=> 0) * (((abs + 0.055) / 1.055)**2.4)
41
+ end
42
+
43
+ # The algorithm for converting a single `srgb` or `display-p3` channel to
44
+ # gamma-corrected form.
45
+ # @param [Numeric]
46
+ # @return [Numeric]
47
+ def srgb_and_display_p3_from_linear(channel)
48
+ abs = channel.abs
49
+ abs <= 0.0031308 ? channel * 12.92 : (channel <=> 0) * ((1.055 * (abs**(1 / 2.4))) - 0.055)
50
+ end
51
+
52
+ # Converts a Lab or OKLab color to LCH or OKLCH, respectively.
53
+ #
54
+ # The [missing_chroma] and [missing_hue] arguments indicate whether this came
55
+ # from a color that was missing its chroma or hue channels, respectively.
56
+ # @param dest [Space]
57
+ # @param lightness [Numeric]
58
+ # @param a [Numeric]
59
+ # @param b [Numeric]
60
+ # @param alpha [Numeric]
61
+ # @return [Color]
62
+ def lab_to_lch(dest, lightness, a, b, alpha, # rubocop:disable Naming/MethodParameterName
63
+ missing_chroma: false, missing_hue: false)
64
+ chroma = Math.sqrt(((a.nil? ? 0 : a)**2) + ((b.nil? ? 0 : b)**2))
65
+ hue = if missing_hue || FuzzyMath.equals(chroma, 0)
66
+ nil
67
+ else
68
+ Math.atan2(b.nil? ? 0 : b, a.nil? ? 0 : a) * 180 / Math::PI
69
+ end
70
+
71
+ Color.send(
72
+ :for_space_internal,
73
+ dest,
74
+ lightness,
75
+ missing_chroma ? nil : chroma,
76
+ hue.nil? || hue >= 0 ? hue : hue + 360,
77
+ alpha
78
+ )
79
+ end
80
+ end
81
+
82
+ private_constant :Utils
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sass
4
+ module Value
5
+ class Color
6
+ module Space
7
+ # @see https://github.com/sass/dart-sass/blob/main/lib/src/value/color/space/xyz_d50.dart
8
+ class XyzD50
9
+ include Space
10
+
11
+ def bounded?
12
+ false
13
+ end
14
+
15
+ def initialize
16
+ super('xyz-d50', Utils::XYZ_CHANNELS)
17
+ end
18
+
19
+ def convert(dest, x, y, z, alpha, # rubocop:disable Naming/MethodParameterName
20
+ missing_lightness: false,
21
+ missing_chroma: false,
22
+ missing_hue: false,
23
+ missing_a: false,
24
+ missing_b: false)
25
+ case dest
26
+ when LAB, LCH
27
+ f0 = _convert_component_to_lab_f((x.nil? ? 0 : x) / Conversions::D50[0])
28
+ f1 = _convert_component_to_lab_f((y.nil? ? 0 : y) / Conversions::D50[1])
29
+ f2 = _convert_component_to_lab_f((z.nil? ? 0 : z) / Conversions::D50[2])
30
+ lightness = missing_lightness ? nil : (116 * f1) - 16
31
+ a = 500 * (f0 - f1)
32
+ b = 200 * (f1 - f2)
33
+
34
+ if dest == LAB
35
+ Color.send(:_for_space,
36
+ dest,
37
+ lightness,
38
+ missing_a ? nil : a,
39
+ missing_b ? nil : b,
40
+ alpha)
41
+ else
42
+ Utils.lab_to_lch(dest, lightness, a, b, alpha, missing_chroma:, missing_hue:)
43
+ end
44
+ else
45
+ convert_linear(dest, x, y, z, alpha,
46
+ missing_lightness:,
47
+ missing_chroma:,
48
+ missing_hue:,
49
+ missing_a:,
50
+ missing_b:)
51
+ end
52
+ end
53
+
54
+ def to_linear(channel)
55
+ channel
56
+ end
57
+
58
+ def from_linear(channel)
59
+ channel
60
+ end
61
+
62
+ private
63
+
64
+ def _convert_component_to_lab_f(component)
65
+ if component > Utils::LAB_EPSILON
66
+ Math.cbrt(component)
67
+ else
68
+ ((Utils::LAB_KAPPA * component) + 16) / 116.0
69
+ end
70
+ end
71
+
72
+ def transformation_matrix(dest)
73
+ case dest
74
+ when A98_RGB
75
+ Conversions::XYZ_D50_TO_LINEAR_A98_RGB
76
+ when DISPLAY_P3
77
+ Conversions::XYZ_D50_TO_LINEAR_DISPLAY_P3
78
+ when LMS
79
+ Conversions::XYZ_D50_TO_LMS
80
+ when PROPHOTO_RGB
81
+ Conversions::XYZ_D50_TO_LINEAR_PROPHOTO_RGB
82
+ when REC2020
83
+ Conversions::XYZ_D50_TO_LINEAR_REC2020
84
+ when RGB, SRGB, SRGB_LINEAR
85
+ Conversions::XYZ_D50_TO_LINEAR_SRGB
86
+ when XYZ_D65
87
+ Conversions::XYZ_D50_TO_XYZ_D65
88
+ else
89
+ super
90
+ end
91
+ end
92
+ end
93
+
94
+ private_constant :XyzD50
95
+
96
+ XYZ_D50 = XyzD50.new
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sass
4
+ module Value
5
+ class Color
6
+ module Space
7
+ # @see https://github.com/sass/dart-sass/blob/main/lib/src/value/color/space/xyz_d65.dart
8
+ class XyzD65
9
+ include Space
10
+
11
+ def bounded?
12
+ false
13
+ end
14
+
15
+ def initialize
16
+ super('xyz', Utils::XYZ_CHANNELS)
17
+ end
18
+
19
+ def to_linear(channel)
20
+ channel
21
+ end
22
+
23
+ def from_linear(channel)
24
+ channel
25
+ end
26
+
27
+ private
28
+
29
+ def transformation_matrix(dest)
30
+ case dest
31
+ when A98_RGB
32
+ Conversions::XYZ_D65_TO_LINEAR_A98_RGB
33
+ when DISPLAY_P3
34
+ Conversions::XYZ_D65_TO_LINEAR_DISPLAY_P3
35
+ when LMS
36
+ Conversions::XYZ_D65_TO_LMS
37
+ when PROPHOTO_RGB
38
+ Conversions::XYZ_D65_TO_LINEAR_PROPHOTO_RGB
39
+ when REC2020
40
+ Conversions::XYZ_D65_TO_LINEAR_REC2020
41
+ when RGB, SRGB, SRGB_LINEAR
42
+ Conversions::XYZ_D65_TO_LINEAR_SRGB
43
+ when XYZ_D50
44
+ Conversions::XYZ_D65_TO_XYZ_D50
45
+ else
46
+ super
47
+ end
48
+ end
49
+ end
50
+
51
+ private_constant :XyzD65
52
+
53
+ XYZ_D65 = XyzD65.new
54
+ end
55
+ end
56
+ end
57
+ end