rubysl-rexml 1.0.0 → 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.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +3 -2
  3. data/lib/rexml/attlistdecl.rb +56 -56
  4. data/lib/rexml/attribute.rb +155 -149
  5. data/lib/rexml/cdata.rb +48 -48
  6. data/lib/rexml/child.rb +82 -82
  7. data/lib/rexml/comment.rb +59 -59
  8. data/lib/rexml/doctype.rb +22 -24
  9. data/lib/rexml/document.rb +185 -129
  10. data/lib/rexml/dtd/attlistdecl.rb +7 -7
  11. data/lib/rexml/dtd/dtd.rb +41 -41
  12. data/lib/rexml/dtd/elementdecl.rb +13 -13
  13. data/lib/rexml/dtd/entitydecl.rb +49 -49
  14. data/lib/rexml/dtd/notationdecl.rb +32 -32
  15. data/lib/rexml/element.rb +122 -107
  16. data/lib/rexml/encoding.rb +37 -58
  17. data/lib/rexml/entity.rb +144 -144
  18. data/lib/rexml/formatters/default.rb +6 -4
  19. data/lib/rexml/formatters/pretty.rb +11 -8
  20. data/lib/rexml/formatters/transitive.rb +4 -3
  21. data/lib/rexml/functions.rb +33 -21
  22. data/lib/rexml/instruction.rb +49 -49
  23. data/lib/rexml/light/node.rb +190 -191
  24. data/lib/rexml/namespace.rb +39 -39
  25. data/lib/rexml/node.rb +38 -38
  26. data/lib/rexml/output.rb +17 -12
  27. data/lib/rexml/parent.rb +26 -25
  28. data/lib/rexml/parseexception.rb +4 -4
  29. data/lib/rexml/parsers/baseparser.rb +90 -61
  30. data/lib/rexml/parsers/lightparser.rb +41 -43
  31. data/lib/rexml/parsers/pullparser.rb +1 -1
  32. data/lib/rexml/parsers/sax2parser.rb +233 -198
  33. data/lib/rexml/parsers/streamparser.rb +6 -2
  34. data/lib/rexml/parsers/treeparser.rb +9 -6
  35. data/lib/rexml/parsers/ultralightparser.rb +40 -40
  36. data/lib/rexml/parsers/xpathparser.rb +51 -52
  37. data/lib/rexml/quickpath.rb +247 -248
  38. data/lib/rexml/rexml.rb +9 -10
  39. data/lib/rexml/sax2listener.rb +92 -92
  40. data/lib/rexml/security.rb +27 -0
  41. data/lib/rexml/source.rb +95 -50
  42. data/lib/rexml/streamlistener.rb +90 -90
  43. data/lib/rexml/syncenumerator.rb +3 -4
  44. data/lib/rexml/text.rb +157 -76
  45. data/lib/rexml/validation/relaxng.rb +18 -18
  46. data/lib/rexml/validation/validation.rb +5 -5
  47. data/lib/rexml/xmldecl.rb +59 -63
  48. data/lib/rexml/xmltokens.rb +14 -14
  49. data/lib/rexml/xpath.rb +67 -53
  50. data/lib/rexml/xpath_parser.rb +49 -38
  51. data/lib/rubysl/rexml.rb +1 -0
  52. data/lib/rubysl/rexml/version.rb +1 -1
  53. data/rubysl-rexml.gemspec +3 -1
  54. metadata +19 -28
  55. data/lib/rexml/encodings/CP-1252.rb +0 -103
  56. data/lib/rexml/encodings/EUC-JP.rb +0 -35
  57. data/lib/rexml/encodings/ICONV.rb +0 -22
  58. data/lib/rexml/encodings/ISO-8859-1.rb +0 -7
  59. data/lib/rexml/encodings/ISO-8859-15.rb +0 -72
  60. data/lib/rexml/encodings/SHIFT-JIS.rb +0 -37
  61. data/lib/rexml/encodings/SHIFT_JIS.rb +0 -1
  62. data/lib/rexml/encodings/UNILE.rb +0 -34
  63. data/lib/rexml/encodings/US-ASCII.rb +0 -30
  64. data/lib/rexml/encodings/UTF-16.rb +0 -35
  65. data/lib/rexml/encodings/UTF-8.rb +0 -18
@@ -5,20 +5,30 @@ require 'rexml/syncenumerator'
5
5
  require 'rexml/parsers/xpathparser'
6
6
 
7
7
  class Object
8
+ # provides a unified +clone+ operation, for REXML::XPathParser
9
+ # to use across multiple Object types
8
10
  def dclone
9
11
  clone
10
12
  end
11
13
  end
12
14
  class Symbol
15
+ # provides a unified +clone+ operation, for REXML::XPathParser
16
+ # to use across multiple Object types
13
17
  def dclone ; self ; end
14
18
  end
15
19
  class Fixnum
20
+ # provides a unified +clone+ operation, for REXML::XPathParser
21
+ # to use across multiple Object types
16
22
  def dclone ; self ; end
17
23
  end
18
24
  class Float
25
+ # provides a unified +clone+ operation, for REXML::XPathParser
26
+ # to use across multiple Object types
19
27
  def dclone ; self ; end
20
28
  end
21
29
  class Array
30
+ # provides a unified +clone+ operation, for REXML::XPathParser
31
+ # to use across multiple Object+ types
22
32
  def dclone
23
33
  klone = self.clone
24
34
  klone.clear
@@ -88,7 +98,7 @@ module REXML
88
98
 
89
99
  case path[0]
90
100
  when :document
91
- # do nothing
101
+ # do nothing
92
102
  return first( path[1..-1], node )
93
103
  when :child
94
104
  for c in node.children
@@ -123,7 +133,7 @@ module REXML
123
133
  end
124
134
 
125
135
 
126
- def match( path_stack, nodeset )
136
+ def match( path_stack, nodeset )
127
137
  #puts "MATCH: path_stack = #{path_stack.inspect}"
128
138
  #puts "MATCH: nodeset = #{nodeset.inspect}"
129
139
  r = expr( path_stack, nodeset )
@@ -136,7 +146,7 @@ module REXML
136
146
 
137
147
  # Returns a String namespace for a node, given a prefix
138
148
  # The rules are:
139
- #
149
+ #
140
150
  # 1. Use the supplied namespace mapping first.
141
151
  # 2. If no mapping was supplied, use the context node to look up the namespace
142
152
  def get_namespace( node, prefix )
@@ -187,8 +197,8 @@ module REXML
187
197
  #puts "node.namespace == #{ns.inspect} => #{node.namespace == ns}"
188
198
  end
189
199
  end
190
- !(node.node_type == :element and
191
- node.name == name and
200
+ !(node.node_type == :element and
201
+ node.name == name and
192
202
  node.namespace == ns )
193
203
  end
194
204
  node_types = ELEMENTS
@@ -205,7 +215,7 @@ module REXML
205
215
  when :processing_instruction
206
216
  target = path_stack.shift
207
217
  nodeset.delete_if do |node|
208
- (node.node_type != :processing_instruction) or
218
+ (node.node_type != :processing_instruction) or
209
219
  ( target!='' and ( node.target != target ) )
210
220
  end
211
221
 
@@ -222,7 +232,7 @@ module REXML
222
232
  when :child
223
233
  new_nodeset = []
224
234
  nt = nil
225
- for node in nodeset
235
+ nodeset.each do |node|
226
236
  nt = node.node_type
227
237
  new_nodeset += node.children if nt == :element or nt == :document
228
238
  end
@@ -231,7 +241,7 @@ module REXML
231
241
 
232
242
  when :literal
233
243
  return path_stack.shift
234
-
244
+
235
245
  when :attribute
236
246
  new_nodeset = []
237
247
  case path_stack.shift
@@ -266,7 +276,7 @@ module REXML
266
276
 
267
277
  when :ancestor
268
278
  new_nodeset = []
269
- for node in nodeset
279
+ nodeset.each do |node|
270
280
  while node.parent
271
281
  node = node.parent
272
282
  new_nodeset << node unless new_nodeset.include? node
@@ -277,7 +287,7 @@ module REXML
277
287
 
278
288
  when :ancestor_or_self
279
289
  new_nodeset = []
280
- for node in nodeset
290
+ nodeset.each do |node|
281
291
  if node.node_type == :element
282
292
  new_nodeset << node
283
293
  while ( node.parent )
@@ -341,7 +351,7 @@ module REXML
341
351
  when :descendant
342
352
  results = []
343
353
  nt = nil
344
- for node in nodeset
354
+ nodeset.each do |node|
345
355
  nt = node.node_type
346
356
  results += expr( path_stack.dclone.unshift( :descendant_or_self ),
347
357
  node.children ) if nt == :element or nt == :document
@@ -376,7 +386,7 @@ module REXML
376
386
 
377
387
  when :preceding
378
388
  new_nodeset = []
379
- for node in nodeset
389
+ nodeset.each do |node|
380
390
  new_nodeset += preceding( node )
381
391
  end
382
392
  #puts "NEW NODESET => #{new_nodeset.inspect}"
@@ -385,7 +395,7 @@ module REXML
385
395
 
386
396
  when :following
387
397
  new_nodeset = []
388
- for node in nodeset
398
+ nodeset.each do |node|
389
399
  new_nodeset += following( node )
390
400
  end
391
401
  nodeset = new_nodeset
@@ -395,7 +405,7 @@ module REXML
395
405
  #puts "In :namespace"
396
406
  new_nodeset = []
397
407
  prefix = path_stack.shift
398
- for node in nodeset
408
+ nodeset.each do |node|
399
409
  if (node.node_type == :element or node.node_type == :attribute)
400
410
  if @namespaces
401
411
  namespaces = @namespaces
@@ -419,10 +429,10 @@ module REXML
419
429
  return @variables[ var_name ]
420
430
 
421
431
  # :and, :or, :eq, :neq, :lt, :lteq, :gt, :gteq
422
- # TODO: Special case for :or and :and -- not evaluate the right
423
- # operand if the left alone determines result (i.e. is true for
424
- # :or and false for :and).
425
- when :eq, :neq, :lt, :lteq, :gt, :gteq, :and, :or
432
+ # TODO: Special case for :or and :and -- not evaluate the right
433
+ # operand if the left alone determines result (i.e. is true for
434
+ # :or and false for :and).
435
+ when :eq, :neq, :lt, :lteq, :gt, :gteq, :or
426
436
  left = expr( path_stack.shift, nodeset.dup, context )
427
437
  #puts "LEFT => #{left.inspect} (#{left.class.name})"
428
438
  right = expr( path_stack.shift, nodeset.dup, context )
@@ -434,7 +444,8 @@ module REXML
434
444
  when :and
435
445
  left = expr( path_stack.shift, nodeset.dup, context )
436
446
  #puts "LEFT => #{left.inspect} (#{left.class.name})"
437
- if left == false || left.nil? || !left.inject(false) {|a,b| a | b}
447
+ return [] unless left
448
+ if left.respond_to?(:inject) and !left.inject(false) {|a,b| a | b}
438
449
  return []
439
450
  end
440
451
  right = expr( path_stack.shift, nodeset.dup, context )
@@ -481,23 +492,23 @@ module REXML
481
492
  when :function
482
493
  func_name = path_stack.shift.tr('-','_')
483
494
  arguments = path_stack.shift
484
- #puts "FUNCTION 0: #{func_name}(#{arguments.collect{|a|a.inspect}.join(', ')})"
495
+ #puts "FUNCTION 0: #{func_name}(#{arguments.collect{|a|a.inspect}.join(', ')})"
485
496
  subcontext = context ? nil : { :size => nodeset.size }
486
497
 
487
498
  res = []
488
499
  cont = context
489
- nodeset.each_with_index { |n, i|
500
+ nodeset.each_with_index { |n, i|
490
501
  if subcontext
491
502
  subcontext[:node] = n
492
503
  subcontext[:index] = i
493
504
  cont = subcontext
494
505
  end
495
506
  arg_clone = arguments.dclone
496
- args = arg_clone.collect { |arg|
507
+ args = arg_clone.collect { |arg|
497
508
  #puts "FUNCTION 1: Calling expr( #{arg.inspect}, [#{n.inspect}] )"
498
- expr( arg, [n], cont )
509
+ expr( arg, [n], cont )
499
510
  }
500
- #puts "FUNCTION 2: #{func_name}(#{args.collect{|a|a.inspect}.join(', ')})"
511
+ #puts "FUNCTION 2: #{func_name}(#{args.collect{|a|a.inspect}.join(', ')})"
501
512
  Functions.context = cont
502
513
  res << Functions.send( func_name, *args )
503
514
  #puts "FUNCTION 3: #{res[-1].inspect}"
@@ -515,10 +526,10 @@ module REXML
515
526
  # FIXME
516
527
  # The next two methods are BAD MOJO!
517
528
  # This is my achilles heel. If anybody thinks of a better
518
- # way of doing this, be my guest. This really sucks, but
529
+ # way of doing this, be my guest. This really sucks, but
519
530
  # it is a wonder it works at all.
520
531
  # ########################################################
521
-
532
+
522
533
  def descendant_or_self( path_stack, nodeset )
523
534
  rs = []
524
535
  #puts "#"*80
@@ -547,7 +558,7 @@ module REXML
547
558
  # Reorders an array of nodes so that they are in document order
548
559
  # It tries to do this efficiently.
549
560
  #
550
- # FIXME: I need to get rid of this, but the issue is that most of the XPath
561
+ # FIXME: I need to get rid of this, but the issue is that most of the XPath
551
562
  # interpreter functions as a filter, which means that we lose context going
552
563
  # in and out of function calls. If I knew what the index of the nodes was,
553
564
  # I wouldn't have to do this. Maybe add a document IDX for each node?
@@ -555,7 +566,7 @@ module REXML
555
566
  def document_order( array_of_nodes )
556
567
  new_arry = []
557
568
  array_of_nodes.each { |node|
558
- node_idx = []
569
+ node_idx = []
559
570
  np = node.node_type == :attribute ? node.element : node
560
571
  while np.parent and np.parent.node_type == :element
561
572
  node_idx << np.parent.index( np )
@@ -579,7 +590,7 @@ module REXML
579
590
 
580
591
  # Builds a nodeset of all of the preceding nodes of the supplied node,
581
592
  # in reverse document order
582
- # preceding:: includes every element in the document that precedes this node,
593
+ # preceding:: includes every element in the document that precedes this node,
583
594
  # except for ancestors
584
595
  def preceding( node )
585
596
  #puts "IN PRECEDING"
@@ -609,9 +620,9 @@ module REXML
609
620
  #puts "NODE: #{node.inspect}"
610
621
  #puts "PREVIOUS NODE: #{node.previous_sibling_node.inspect}"
611
622
  #puts "PARENT NODE: #{node.parent}"
612
- psn = node.previous_sibling_node
623
+ psn = node.previous_sibling_node
613
624
  if psn.nil?
614
- if node.parent.nil? or node.parent.class == Document
625
+ if node.parent.nil? or node.parent.class == Document
615
626
  return nil
616
627
  end
617
628
  return node.parent
@@ -647,9 +658,9 @@ module REXML
647
658
  end
648
659
 
649
660
  def next_sibling_node(node)
650
- psn = node.next_sibling_node
661
+ psn = node.next_sibling_node
651
662
  while psn.nil?
652
- if node.parent.nil? or node.parent.class == Document
663
+ if node.parent.nil? or node.parent.class == Document
653
664
  return nil
654
665
  end
655
666
  node = node.parent
@@ -675,7 +686,7 @@ module REXML
675
686
  def equality_relational_compare( set1, op, set2 )
676
687
  #puts "EQ_REL_COMP(#{set1.inspect} #{op.inspect} #{set2.inspect})"
677
688
  if set1.kind_of? Array and set2.kind_of? Array
678
- #puts "#{set1.size} & #{set2.size}"
689
+ #puts "#{set1.size} & #{set2.size}"
679
690
  if set1.size == 1 and set2.size == 1
680
691
  set1 = set1[0]
681
692
  set2 = set2[0]
@@ -686,7 +697,7 @@ module REXML
686
697
  return rv
687
698
  else
688
699
  res = []
689
- enum = SyncEnumerator.new( set1, set2 ).each { |i1, i2|
700
+ SyncEnumerator.new( set1, set2 ).each { |i1, i2|
690
701
  #puts "i1 = #{i1.inspect} (#{i1.class.name})"
691
702
  #puts "i2 = #{i2.inspect} (#{i2.class.name})"
692
703
  i1 = norm( i1 )
@@ -696,7 +707,7 @@ module REXML
696
707
  return res
697
708
  end
698
709
  end
699
- #puts "EQ_REL_COMP: #{set1.inspect} (#{set1.class.name}), #{op}, #{set2.inspect} (#{set2.class.name})"
710
+ #puts "EQ_REL_COMP: #{set1.inspect} (#{set1.class.name}), #{op}, #{set2.inspect} (#{set2.class.name})"
700
711
  #puts "COMPARING VALUES"
701
712
  # If one is nodeset and other is number, compare number to each item
702
713
  # in nodeset s.t. number op number(string(item))
@@ -705,7 +716,7 @@ module REXML
705
716
  # If one is nodeset and other is boolean, compare boolean to each item
706
717
  # in nodeset s.t. boolean op boolean(item)
707
718
  if set1.kind_of? Array or set2.kind_of? Array
708
- #puts "ISA ARRAY"
719
+ #puts "ISA ARRAY"
709
720
  if set1.kind_of? Array
710
721
  a = set1
711
722
  b = set2
@@ -724,7 +735,7 @@ module REXML
724
735
  #puts "B = #{b.inspect}"
725
736
  return a.collect {|v| compare( Functions::number(v), op, b )}
726
737
  else
727
- #puts "Functions::string( #{b}(#{b.class.name}) ) = #{Functions::string(b)}"
738
+ #puts "Functions::string( #{b}(#{b.class.name}) ) = #{Functions::string(b)}"
728
739
  b = Functions::string( b )
729
740
  return a.collect { |v| compare( Functions::string(v), op, b ) }
730
741
  end
data/lib/rubysl/rexml.rb CHANGED
@@ -1 +1,2 @@
1
+ require "rexml/rexml"
1
2
  require "rubysl/rexml/version"
@@ -1,5 +1,5 @@
1
1
  module RubySL
2
2
  module REXML
3
- VERSION = "1.0.0"
3
+ VERSION = "2.0.1"
4
4
  end
5
5
  end
data/rubysl-rexml.gemspec CHANGED
@@ -16,8 +16,10 @@ Gem::Specification.new do |spec|
16
16
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
17
17
  spec.require_paths = ["lib"]
18
18
 
19
+ spec.required_ruby_version = "~> 2.0"
20
+
19
21
  spec.add_development_dependency "bundler", "~> 1.3"
20
22
  spec.add_development_dependency "rake", "~> 10.0"
21
23
  spec.add_development_dependency "mspec", "~> 1.5"
22
- spec.add_development_dependency "rubysl-prettyprint", "~> 1.0"
24
+ spec.add_development_dependency "rubysl-prettyprint", "~> 2.0"
23
25
  end
metadata CHANGED
@@ -1,71 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubysl-rexml
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Shirai
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-26 00:00:00.000000000 Z
11
+ date: 2013-10-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.3'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.3'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '10.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '10.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: mspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '1.5'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.5'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rubysl-prettyprint
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ~>
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '1.0'
61
+ version: '2.0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ~>
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '1.0'
68
+ version: '2.0'
69
69
  description: Ruby standard library rexml.
70
70
  email:
71
71
  - brixen@gmail.com
@@ -73,8 +73,8 @@ executables: []
73
73
  extensions: []
74
74
  extra_rdoc_files: []
75
75
  files:
76
- - .gitignore
77
- - .travis.yml
76
+ - ".gitignore"
77
+ - ".travis.yml"
78
78
  - Gemfile
79
79
  - LICENSE
80
80
  - README.md
@@ -93,17 +93,6 @@ files:
93
93
  - lib/rexml/dtd/notationdecl.rb
94
94
  - lib/rexml/element.rb
95
95
  - lib/rexml/encoding.rb
96
- - lib/rexml/encodings/CP-1252.rb
97
- - lib/rexml/encodings/EUC-JP.rb
98
- - lib/rexml/encodings/ICONV.rb
99
- - lib/rexml/encodings/ISO-8859-1.rb
100
- - lib/rexml/encodings/ISO-8859-15.rb
101
- - lib/rexml/encodings/SHIFT-JIS.rb
102
- - lib/rexml/encodings/SHIFT_JIS.rb
103
- - lib/rexml/encodings/UNILE.rb
104
- - lib/rexml/encodings/US-ASCII.rb
105
- - lib/rexml/encodings/UTF-16.rb
106
- - lib/rexml/encodings/UTF-8.rb
107
96
  - lib/rexml/entity.rb
108
97
  - lib/rexml/formatters/default.rb
109
98
  - lib/rexml/formatters/pretty.rb
@@ -127,6 +116,7 @@ files:
127
116
  - lib/rexml/quickpath.rb
128
117
  - lib/rexml/rexml.rb
129
118
  - lib/rexml/sax2listener.rb
119
+ - lib/rexml/security.rb
130
120
  - lib/rexml/source.rb
131
121
  - lib/rexml/streamlistener.rb
132
122
  - lib/rexml/syncenumerator.rb
@@ -260,12 +250,12 @@ require_paths:
260
250
  - lib
261
251
  required_ruby_version: !ruby/object:Gem::Requirement
262
252
  requirements:
263
- - - '>='
253
+ - - "~>"
264
254
  - !ruby/object:Gem::Version
265
- version: '0'
255
+ version: '2.0'
266
256
  required_rubygems_version: !ruby/object:Gem::Requirement
267
257
  requirements:
268
- - - '>='
258
+ - - ">="
269
259
  - !ruby/object:Gem::Version
270
260
  version: '0'
271
261
  requirements: []
@@ -383,3 +373,4 @@ test_files:
383
373
  - spec/text/value_spec.rb
384
374
  - spec/text/wrap_spec.rb
385
375
  - spec/text/write_with_substitution_spec.rb
376
+ has_rdoc: