write_xlsx 1.08.1 → 1.09.2

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 (79) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +10 -0
  3. data/Changes +17 -0
  4. data/README.md +1 -1
  5. data/examples/background.rb +19 -0
  6. data/examples/ignore_errors.rb +39 -0
  7. data/examples/keep_leading_zeros.rb +17 -0
  8. data/lib/write_xlsx/chart/axis.rb +3 -3
  9. data/lib/write_xlsx/chart/scatter.rb +0 -15
  10. data/lib/write_xlsx/chart/series.rb +1 -1
  11. data/lib/write_xlsx/chart.rb +28 -28
  12. data/lib/write_xlsx/chartsheet.rb +3 -3
  13. data/lib/write_xlsx/drawing.rb +39 -39
  14. data/lib/write_xlsx/format.rb +11 -179
  15. data/lib/write_xlsx/package/app.rb +2 -2
  16. data/lib/write_xlsx/package/button.rb +8 -8
  17. data/lib/write_xlsx/package/comments.rb +8 -8
  18. data/lib/write_xlsx/package/content_types.rb +18 -9
  19. data/lib/write_xlsx/package/core.rb +5 -5
  20. data/lib/write_xlsx/package/custom.rb +2 -2
  21. data/lib/write_xlsx/package/metadata.rb +159 -0
  22. data/lib/write_xlsx/package/packager.rb +21 -0
  23. data/lib/write_xlsx/package/shared_strings.rb +6 -6
  24. data/lib/write_xlsx/package/styles.rb +11 -11
  25. data/lib/write_xlsx/package/table.rb +23 -23
  26. data/lib/write_xlsx/package/theme.rb +1 -1
  27. data/lib/write_xlsx/package/vml.rb +43 -43
  28. data/lib/write_xlsx/shape.rb +17 -15
  29. data/lib/write_xlsx/sparkline.rb +340 -340
  30. data/lib/write_xlsx/utility.rb +4 -23
  31. data/lib/write_xlsx/version.rb +1 -1
  32. data/lib/write_xlsx/workbook.rb +171 -644
  33. data/lib/write_xlsx/worksheet/cell_data.rb +25 -3
  34. data/lib/write_xlsx/worksheet/data_validation.rb +20 -20
  35. data/lib/write_xlsx/worksheet/hyperlink.rb +4 -4
  36. data/lib/write_xlsx/worksheet/page_setup.rb +12 -12
  37. data/lib/write_xlsx/worksheet.rb +267 -4144
  38. data/test/perl_output/background.xlsx +0 -0
  39. data/test/perl_output/ignore_errors.xlsx +0 -0
  40. data/test/perl_output/keep_leading_zeros.xlsx +0 -0
  41. data/test/perl_output/multi_line.xlsx +0 -0
  42. data/test/regression/images/logo.gif +0 -0
  43. data/test/regression/images/logo.jpg +0 -0
  44. data/test/regression/images/red.gif +0 -0
  45. data/test/regression/test_background01.rb +23 -0
  46. data/test/regression/test_background02.rb +23 -0
  47. data/test/regression/test_background03.rb +24 -0
  48. data/test/regression/test_background04.rb +25 -0
  49. data/test/regression/test_background05.rb +25 -0
  50. data/test/regression/test_background06.rb +31 -0
  51. data/test/regression/test_background07.rb +37 -0
  52. data/test/regression/test_chart_axis47.rb +52 -0
  53. data/test/regression/test_chart_axis48.rb +53 -0
  54. data/test/regression/test_dynamic_array01.rb +25 -0
  55. data/test/regression/test_image56.rb +23 -0
  56. data/test/regression/test_image57.rb +23 -0
  57. data/test/regression/test_set_column10.rb +55 -0
  58. data/test/regression/test_set_column11.rb +48 -0
  59. data/test/regression/test_set_row01.rb +35 -0
  60. data/test/regression/test_set_row02.rb +35 -0
  61. data/test/regression/test_set_row03.rb +35 -0
  62. data/test/regression/test_set_row04.rb +35 -0
  63. data/test/regression/xlsx_files/background01.xlsx +0 -0
  64. data/test/regression/xlsx_files/background02.xlsx +0 -0
  65. data/test/regression/xlsx_files/background03.xlsx +0 -0
  66. data/test/regression/xlsx_files/background04.xlsx +0 -0
  67. data/test/regression/xlsx_files/background05.xlsx +0 -0
  68. data/test/regression/xlsx_files/background06.xlsx +0 -0
  69. data/test/regression/xlsx_files/background07.xlsx +0 -0
  70. data/test/regression/xlsx_files/chart_axis47.xlsx +0 -0
  71. data/test/regression/xlsx_files/chart_axis48.xlsx +0 -0
  72. data/test/regression/xlsx_files/dynamic_array01.xlsx +0 -0
  73. data/test/regression/xlsx_files/image56.xlsx +0 -0
  74. data/test/regression/xlsx_files/image57.xlsx +0 -0
  75. data/test/regression/xlsx_files/set_row01.xlsx +0 -0
  76. data/test/regression/xlsx_files/set_row03.xlsx +0 -0
  77. data/test/test_example_match.rb +73 -0
  78. data/test/worksheet/test_pixels_to_row_col.rb +46 -0
  79. metadata +86 -2
@@ -117,8 +117,8 @@ module Writexlsx
117
117
  )
118
118
  elsif user_data[:total_string]
119
119
  total_label_only(
120
- @row2, col_num, col_data, user_data[:total_string], user_data[:format]
121
- )
120
+ @row2, col_num, col_data, user_data[:total_string], user_data[:format]
121
+ )
122
122
  end
123
123
 
124
124
  # Get the dxf format index.
@@ -181,7 +181,7 @@ module Writexlsx
181
181
  row1, row2 = row2, row1 if row1 > row2
182
182
  col1, col2 = col2, col1 if col1 > col2
183
183
 
184
- # The final hash contains the validation parameters.
184
+ # The final hash contains the validation parameters.
185
185
  param ||= {}
186
186
 
187
187
  # Turn on Excel's defaults.
@@ -208,17 +208,17 @@ module Writexlsx
208
208
  # List of valid input parameters.
209
209
  def valid_table_parameter
210
210
  [
211
- :autofilter,
212
- :banded_columns,
213
- :banded_rows,
214
- :columns,
215
- :data,
216
- :first_column,
217
- :header_row,
218
- :last_column,
219
- :name,
220
- :style,
221
- :total_row
211
+ :autofilter,
212
+ :banded_columns,
213
+ :banded_rows,
214
+ :columns,
215
+ :data,
216
+ :first_column,
217
+ :header_row,
218
+ :last_column,
219
+ :name,
220
+ :style,
221
+ :total_row
222
222
  ]
223
223
  end
224
224
 
@@ -331,12 +331,12 @@ module Writexlsx
331
331
  xmlns = "#{schema}spreadsheetml/2006/main"
332
332
 
333
333
  attributes = [
334
- ['xmlns', xmlns],
335
- ['id', id],
336
- ['name', @name],
337
- ['displayName', @name],
338
- ['ref', @range]
339
- ]
334
+ ['xmlns', xmlns],
335
+ ['id', id],
336
+ ['name', @name],
337
+ ['displayName', @name],
338
+ ['ref', @range]
339
+ ]
340
340
 
341
341
  unless ptrue?(@header_row_count)
342
342
  attributes << ['headerRowCount', 0]
@@ -378,9 +378,9 @@ module Writexlsx
378
378
  #
379
379
  def write_table_column(col_data)
380
380
  attributes = [
381
- ['id', col_data.id],
382
- ['name', col_data.name]
383
- ]
381
+ ['id', col_data.id],
382
+ ['name', col_data.name]
383
+ ]
384
384
 
385
385
  if ptrue?(col_data.total_string)
386
386
  attributes << [:totalsRowLabel, col_data.total_string]
@@ -36,7 +36,7 @@ module Writexlsx
36
36
  #
37
37
  def write_theme_file
38
38
  theme =
39
- %Q{<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
39
+ %Q{<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
40
40
  <a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme"><a:themeElements><a:clrScheme name="Office"><a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1><a:lt1><a:sysClr val="window" lastClr="FFFFFF"/></a:lt1><a:dk2><a:srgbClr val="1F497D"/></a:dk2><a:lt2><a:srgbClr val="EEECE1"/></a:lt2><a:accent1><a:srgbClr val="4F81BD"/></a:accent1><a:accent2><a:srgbClr val="C0504D"/></a:accent2><a:accent3><a:srgbClr val="9BBB59"/></a:accent3><a:accent4><a:srgbClr val="8064A2"/></a:accent4><a:accent5><a:srgbClr val="4BACC6"/></a:accent5><a:accent6><a:srgbClr val="F79646"/></a:accent6><a:hlink><a:srgbClr val="0000FF"/></a:hlink><a:folHlink><a:srgbClr val="800080"/></a:folHlink></a:clrScheme><a:fontScheme name="Office"><a:majorFont><a:latin typeface="Cambria"/><a:ea typeface=""/><a:cs typeface=""/><a:font script="Jpan" typeface="MS Pゴシック"/><a:font script="Hang" typeface="맑은 고딕"/><a:font script="Hans" typeface="宋体"/><a:font script="Hant" typeface="新細明體"/><a:font script="Arab" typeface="Times New Roman"/><a:font script="Hebr" typeface="Times New Roman"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="MoolBoran"/><a:font script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Times New Roman"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:majorFont><a:minorFont><a:latin typeface="Calibri"/><a:ea typeface=""/><a:cs typeface=""/><a:font script="Jpan" typeface="MS Pゴシック"/><a:font script="Hang" typeface="맑은 고딕"/><a:font script="Hans" typeface="宋体"/><a:font script="Hant" typeface="新細明體"/><a:font script="Arab" typeface="Arial"/><a:font script="Hebr" typeface="Arial"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="DaunPenh"/><a:font script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Arial"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:minorFont></a:fontScheme><a:fmtScheme name="Office"><a:fillStyleLst><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="50000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="35000"><a:schemeClr val="phClr"><a:tint val="37000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="15000"/><a:satMod val="350000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="1"/></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:shade val="51000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs pos="80000"><a:schemeClr val="phClr"><a:shade val="93000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="94000"/><a:satMod val="135000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="0"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w="9525" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"><a:shade val="95000"/><a:satMod val="105000"/></a:schemeClr></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln></a:lnStyleLst><a:effectStyleLst><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="38000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst><a:scene3d><a:camera prst="orthographicFront"><a:rot lat="0" lon="0" rev="0"/></a:camera><a:lightRig rig="threePt" dir="t"><a:rot lat="0" lon="0" rev="1200000"/></a:lightRig></a:scene3d><a:sp3d><a:bevelT w="63500" h="25400"/></a:sp3d></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="40000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="40000"><a:schemeClr val="phClr"><a:tint val="45000"/><a:shade val="99000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="20000"/><a:satMod val="255000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="-80000" r="50000" b="180000"/></a:path></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="80000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="30000"/><a:satMod val="200000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="50000" r="50000" b="50000"/></a:path></a:gradFill></a:bgFillStyleLst></a:fmtScheme></a:themeElements><a:objectDefaults/><a:extraClrSchemeLst/></a:theme>}
41
41
  @writer.write(theme)
42
42
  end
@@ -37,8 +37,8 @@ module Writexlsx
37
37
  end
38
38
  unless comments_data.empty?
39
39
  write_shape_type_and_shape(
40
- comments_data,
41
- vml_shape_id, z_index) do
40
+ comments_data,
41
+ vml_shape_id, z_index) do
42
42
  write_comment_shapetype
43
43
  end
44
44
  end
@@ -84,9 +84,9 @@ module Writexlsx
84
84
  def xml_attributes
85
85
  schema = 'urn:schemas-microsoft-com:'
86
86
  [
87
- ['xmlns:v', "#{schema}vml"],
88
- ['xmlns:o', "#{schema}office:office"],
89
- ['xmlns:x', "#{schema}office:excel"]
87
+ ['xmlns:v', "#{schema}vml"],
88
+ ['xmlns:o', "#{schema}office:office"],
89
+ ['xmlns:x', "#{schema}office:excel"]
90
90
  ]
91
91
  end
92
92
 
@@ -95,8 +95,8 @@ module Writexlsx
95
95
  #
96
96
  def write_shapelayout(data_id)
97
97
  attributes = [
98
- ['v:ext', 'edit']
99
- ]
98
+ ['v:ext', 'edit']
99
+ ]
100
100
 
101
101
  @writer.tag_elements('o:shapelayout', attributes) do
102
102
  # Write the o:idmap element.
@@ -121,10 +121,10 @@ module Writexlsx
121
121
  #
122
122
  def write_comment_shapetype
123
123
  attributes = [
124
- ['id', '_x0000_t202'],
125
- ['coordsize', '21600,21600'],
126
- ['o:spt', 202],
127
- ['path', 'm,l,21600r21600,l21600,xe']
124
+ ['id', '_x0000_t202'],
125
+ ['coordsize', '21600,21600'],
126
+ ['o:spt', 202],
127
+ ['path', 'm,l,21600r21600,l21600,xe']
128
128
  ]
129
129
 
130
130
  @writer.tag_elements('v:shapetype', attributes) do
@@ -140,11 +140,11 @@ module Writexlsx
140
140
  #
141
141
  def write_button_shapetype
142
142
  attributes = [
143
- ['id', '_x0000_t201'],
144
- ['coordsize', '21600,21600'],
145
- ['o:spt', 201],
146
- ['path', 'm,l,21600r21600,l21600,xe']
147
- ]
143
+ ['id', '_x0000_t201'],
144
+ ['coordsize', '21600,21600'],
145
+ ['o:spt', 201],
146
+ ['path', 'm,l,21600r21600,l21600,xe']
147
+ ]
148
148
 
149
149
  @writer.tag_elements('v:shapetype', attributes) do
150
150
  # Write the v:stroke element.
@@ -169,14 +169,14 @@ module Writexlsx
169
169
  stroked = 'f'
170
170
 
171
171
  attributes = [
172
- ['id', id],
173
- ['coordsize', coordsize],
174
- ['o:spt', spt],
175
- ['o:preferrelative', o_preferrelative],
176
- ['path', path],
177
- ['filled', filled],
178
- ['stroked', stroked]
179
- ]
172
+ ['id', id],
173
+ ['coordsize', coordsize],
174
+ ['o:spt', spt],
175
+ ['o:preferrelative', o_preferrelative],
176
+ ['path', path],
177
+ ['filled', filled],
178
+ ['stroked', stroked]
179
+ ]
180
180
 
181
181
  @writer.tag_elements('v:shapetype', attributes) do
182
182
  # Write the v:stroke element.
@@ -198,12 +198,12 @@ module Writexlsx
198
198
  #
199
199
  def write_button_path
200
200
  attributes = [
201
- ['shadowok', 'f'],
202
- ['o:extrusionok', 'f'],
203
- ['strokeok', 'f'],
204
- ['fillok', 'f'],
205
- ['o:connecttype', 'rect']
206
- ]
201
+ ['shadowok', 'f'],
202
+ ['o:extrusionok', 'f'],
203
+ ['strokeok', 'f'],
204
+ ['fillok', 'f'],
205
+ ['o:connecttype', 'rect']
206
+ ]
207
207
  @writer.empty_tag('v:path', attributes)
208
208
  end
209
209
 
@@ -216,10 +216,10 @@ module Writexlsx
216
216
  connecttype = 'rect'
217
217
 
218
218
  attributes = [
219
- ['o:extrusionok', extrusionok],
220
- ['gradientshapeok', gradientshapeok],
221
- ['o:connecttype', connecttype]
222
- ]
219
+ ['o:extrusionok', extrusionok],
220
+ ['gradientshapeok', gradientshapeok],
221
+ ['o:connecttype', connecttype]
222
+ ]
223
223
 
224
224
  @writer.empty_tag('v:path', attributes)
225
225
  end
@@ -229,9 +229,9 @@ module Writexlsx
229
229
  #
230
230
  def write_shapetype_lock
231
231
  attributes = [
232
- ['v:ext', 'edit'],
233
- ['shapetype', 't']
234
- ]
232
+ ['v:ext', 'edit'],
233
+ ['shapetype', 't']
234
+ ]
235
235
  @writer.empty_tag('o:lock', attributes)
236
236
  end
237
237
 
@@ -240,9 +240,9 @@ module Writexlsx
240
240
  #
241
241
  def write_rotation_lock
242
242
  attributes = [
243
- ['v:ext', 'edit'],
244
- ['rotation', 't']
245
- ]
243
+ ['v:ext', 'edit'],
244
+ ['rotation', 't']
245
+ ]
246
246
  @writer.empty_tag('o:lock', attributes)
247
247
  end
248
248
 
@@ -254,9 +254,9 @@ module Writexlsx
254
254
  aspectratio = 't'
255
255
 
256
256
  attributes = [
257
- ['v:ext', ext],
258
- ['aspectratio', aspectratio]
259
- ]
257
+ ['v:ext', ext],
258
+ ['aspectratio', aspectratio]
259
+ ]
260
260
 
261
261
  @writer.empty_tag('o:lock', attributes)
262
262
  end
@@ -154,15 +154,17 @@ module Writexlsx
154
154
  # EMUs per point. Therefore, 12,700 * 3 /4 = 9,525 EMUs per pixel.
155
155
  #
156
156
  def calc_position_emus(worksheet)
157
- c_start, r_start, xx1, yy1, c_end, r_end, xx2, yy2, x_abslt, y_abslt =
158
- worksheet.position_object_pixels(
159
- @column_start,
160
- @row_start,
161
- @x_offset,
162
- @y_offset,
163
- @width * @scale_x,
164
- @height * @scale_y
165
- )
157
+ c_start, r_start,
158
+ xx1, yy1, c_end, r_end,
159
+ xx2, yy2, x_abslt, y_abslt =
160
+ worksheet.position_object_pixels(
161
+ @column_start,
162
+ @row_start,
163
+ @x_offset,
164
+ @y_offset,
165
+ @width * @scale_x,
166
+ @height * @scale_y
167
+ )
166
168
 
167
169
  # Now that x2/y2 have been calculated with a potentially negative
168
170
  # width/height we use the absolute value and convert to EMUs.
@@ -297,12 +299,12 @@ module Writexlsx
297
299
 
298
300
  def dimensions
299
301
  [
300
- @column_start, @row_start,
301
- @x1, @y1,
302
- @column_end, @row_end,
303
- @x2, @y2,
304
- @x_abs, @y_abs,
305
- @width_emu, @height_emu
302
+ @column_start, @row_start,
303
+ @x1, @y1,
304
+ @column_end, @row_end,
305
+ @x2, @y2,
306
+ @x_abs, @y_abs,
307
+ @width_emu, @height_emu
306
308
  ]
307
309
  end
308
310
  end