qti 2.1.0 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (29) hide show
  1. checksums.yaml +5 -5
  2. data/lib/qti.rb +1 -0
  3. data/lib/qti/models/assessment_meta.rb +78 -3
  4. data/lib/qti/models/resource.rb +26 -2
  5. data/lib/qti/v1/models/assessment_item.rb +4 -0
  6. data/lib/qti/v1/models/interactions/base_fill_blank_interaction.rb +33 -1
  7. data/lib/qti/v1/models/interactions/canvas_multiple_dropdown.rb +2 -29
  8. data/lib/qti/v1/models/object_bank.rb +14 -0
  9. data/lib/qti/version.rb +1 -1
  10. data/spec/fixtures/items_1.2/canvas_multiple_fib_extra_brackets.xml +244 -0
  11. data/spec/fixtures/test_qti_1.2_canvas_extended_1/gba044ae1fc7cfd3dc413e0df695e0068/assessment_meta.xml +76 -0
  12. data/spec/fixtures/test_qti_1.2_canvas_extended_1/gba044ae1fc7cfd3dc413e0df695e0068/gba044ae1fc7cfd3dc413e0df695e0068.xml +17 -0
  13. data/spec/fixtures/test_qti_1.2_canvas_extended_1/imsmanifest.xml +39 -0
  14. data/spec/fixtures/test_qti_1.2_canvas_extended_2/gba044ae1fc7cfd3dc413e0df695e0068/assessment_meta.xml +76 -0
  15. data/spec/fixtures/test_qti_1.2_canvas_extended_2/gba044ae1fc7cfd3dc413e0df695e0068/gba044ae1fc7cfd3dc413e0df695e0068.xml +17 -0
  16. data/spec/fixtures/test_qti_1.2_canvas_extended_2/imsmanifest.xml +39 -0
  17. data/spec/fixtures/with_banks/g9a20cf3af178b54e4792cbe992f65790/assessment_meta.xml +69 -0
  18. data/spec/fixtures/with_banks/g9a20cf3af178b54e4792cbe992f65790/assessment_qti.xml +99 -0
  19. data/spec/fixtures/with_banks/imsmanifest.xml +54 -0
  20. data/spec/fixtures/with_banks/non_cc_assessments/g195e078fb6e3c4054e38e5c9226287ba.xml.qti +85 -0
  21. data/spec/fixtures/with_banks/non_cc_assessments/g9a20cf3af178b54e4792cbe992f65790.xml.qti +107 -0
  22. data/spec/fixtures/with_banks/non_cc_assessments/gab22de457404cb5cf022078f1e4da75e.xml.qti +59 -0
  23. data/spec/fixtures/with_banks/non_cc_assessments/gf3edf8167be16b3a65a00ca923132b07.xml.qti +145 -0
  24. data/spec/lib/qti/models/assessment_meta_spec.rb +104 -2
  25. data/spec/lib/qti/models/resource_spec.rb +14 -0
  26. data/spec/lib/qti/v1/models/interactions/base_fill_blank_interaction_spec.rb +146 -0
  27. data/spec/lib/qti/v1/models/interactions/canvas_multiple_dropdown_spec.rb +0 -27
  28. data/spec/lib/qti/v1/models/object_bank_spec.rb +39 -0
  29. metadata +36 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 8a14dae0c3cb4764523cd5eab9c47b5cc3d8c356
4
- data.tar.gz: 76484ab80219fcd84ed4e15c5b9ab0ad6200fb45
2
+ SHA256:
3
+ metadata.gz: 389c0151886a874c4a276fb6490ddf3658bb41fc7934f5b6d2fa5c31948cdf18
4
+ data.tar.gz: f7fbc1d8033133f1f4b47982b17700c050643466b4c7d8f4220d6887a83166e2
5
5
  SHA512:
6
- metadata.gz: 2a9fa91d5c0a6e5e1f85d052ebe0220ae24b30c4245a1697030ea1b827e56cf75f2cc4c1414dcaad04bdd8393fe90f877e33932d40a4d2f150c2b8594bf0b296
7
- data.tar.gz: f96a7d8d1b32a9a0c05e23a968a8332aac3d38299a29f83e4108ff6f8993c75e96871904096c650dd1f49b41eca2adf455ad360a281a06a4b81e5bad72f3eaeb
6
+ metadata.gz: 1f0e4942e4449058d181d0e005f8837a1b4e1bff002f28355ffd710b34932169cbdd04bbea4ff82fb44b2f1c54caf891a9ed41f15ca12798bd9a8369ae0387b8
7
+ data.tar.gz: 4b3cb74197f29a7b67f6014a6cc0ba479640fbb649003beffa4fc65aafed3cc6f99fb68fe4f6838edc434dbcb9f77418fd97fd5078cb04378aae4a461ef8d622
data/lib/qti.rb CHANGED
@@ -103,6 +103,7 @@ require 'qti/models/manifest'
103
103
  require 'qti/v1/models/assessment_item'
104
104
  require 'qti/v1/models/choices/logical_identifier_choice'
105
105
  require 'qti/v1/models/choices/fill_blank_choice'
106
+ require 'qti/v1/models/object_bank'
106
107
  require 'qti/v1/models/scoring_data'
107
108
  require 'qti/v1/models/stimulus_item'
108
109
  require 'qti/v1/models/question_group'
@@ -125,14 +125,84 @@ module Qti
125
125
  @doc.xpath('//xmlns:quiz/xmlns:assignment/xmlns:quiz_identifierref')&.first&.content
126
126
  end
127
127
 
128
+ def lock_at
129
+ tag_under_quiz('lock_at')
130
+ end
131
+
132
+ def unlock_at
133
+ tag_under_quiz('unlock_at')
134
+ end
135
+
136
+ def due_at
137
+ tag_under_quiz('due_at')
138
+ end
139
+
140
+ def access_code
141
+ code = sanitize_content!(tag_under_quiz('access_code'))
142
+ return nil if code.to_s.empty?
143
+ code
144
+ end
145
+
146
+ def ip_filter
147
+ tag_under_quiz('ip_filter')
148
+ end
149
+
150
+ def time_limit_raw
151
+ tag_under_quiz('time_limit')
152
+ end
153
+
154
+ def time_limit
155
+ return nil if time_limit_raw.nil?
156
+ time_limit_raw.to_i
157
+ end
158
+
159
+ def show_correct_answers_at
160
+ tag_under_quiz('show_correct_answers_at')
161
+ end
162
+
163
+ def hide_correct_answers_at
164
+ tag_under_quiz('hide_correct_answers_at')
165
+ end
166
+
167
+ def require_lockdown_browser
168
+ tag_under_quiz('require_lockdown_browser')
169
+ end
170
+
171
+ def require_lockdown_browser?
172
+ string_true?(require_lockdown_browser)
173
+ end
174
+
175
+ def require_lockdown_browser_for_results
176
+ tag_under_quiz('require_lockdown_browser_for_results')
177
+ end
178
+
179
+ def require_lockdown_browser_for_results?
180
+ string_true?(require_lockdown_browser_for_results)
181
+ end
182
+
183
+ def require_lockdown_browser_monitor
184
+ tag_under_quiz('require_lockdown_browser_monitor')
185
+ end
186
+
187
+ def require_lockdown_browser_monitor?
188
+ string_true?(require_lockdown_browser_monitor)
189
+ end
190
+
191
+ def lockdown_browser_monitor_data
192
+ tag_under_quiz('lockdown_browser_monitor_data')
193
+ end
194
+
128
195
  private
129
196
 
130
197
  def tag_under_quiz(tag)
131
- @doc.xpath("//xmlns:quiz/xmlns:#{tag}")&.first&.content
198
+ value = @doc.xpath("//xmlns:quiz/xmlns:#{tag}")&.first&.content
199
+ # If the tag is present but has no content, return nil
200
+ return nil if value.to_s.empty?
201
+ value
132
202
  end
133
203
 
134
204
  def string_true?(value)
135
- value&.casecmp('true')&.zero?
205
+ value&.casecmp('true')&.zero? || false
136
206
  end
137
207
  end
138
208
 
@@ -143,7 +213,12 @@ module Qti
143
213
  :could_be_locked?, :allowed_attempts, :one_question_at_a_time?,
144
214
  :cant_go_back?, :available?, :one_time_results?,
145
215
  :show_correct_answers_attempt?, :only_visible_to_overrides?,
146
- :module_locked?,
216
+ :module_locked?, :access_code, :ip_filter, :time_limit,
217
+ :show_correct_answers_at, :hide_correct_answers_at,
218
+ :lock_at, :unlock_at, :due_at, :require_lockdown_browser?,
219
+ :require_lockdown_browser_for_results?,
220
+ :require_lockdown_browser_monitor?,
221
+ :lockdown_browser_monitor_data,
147
222
  to: :@canvas_meta_data, prefix: :canvas, allow_nil: true
148
223
 
149
224
  alias canvas_instructions canvas_description
@@ -73,6 +73,12 @@ module Qti
73
73
  rsc.href
74
74
  end
75
75
 
76
+ def load_asset_resource(rsc_path)
77
+ doc = Nokogiri.XML(File.read(rsc_path), rsc_path.to_s, &:noblanks)
78
+ raise ArgumentError unless doc
79
+ doc
80
+ end
81
+
76
82
  def identifier_list(rsc_type)
77
83
  RESOURCE_QTI_TYPES.map do |v|
78
84
  xmlns_resource_list("[#{rtype_predicate(v, rsc_type)}]").map { |r| r[:identifier] }
@@ -91,8 +97,26 @@ module Qti
91
97
  id_list
92
98
  end
93
99
 
94
- def question_bank_identifiers
95
- identifier_list('/question-bank')
100
+ def associated_content_list
101
+ predicate = rtype_predicate('associatedcontent', 'learning-application-resource')
102
+ xmlns_resource_list("[#{predicate}]").map { |r| r[:identifier] }
103
+ end
104
+
105
+ def load_associated_content
106
+ @_load_associated_content ||= associated_content_list.map do |ident|
107
+ rsc = resource_for(ident)
108
+ rsc_path = remap_href_path(asset_resource_for(rsc))
109
+ doc = load_asset_resource(rsc_path)
110
+
111
+ # There are other types, but all we support right now are object banks...
112
+ Qti::V1::Models::ObjectBank.from_path!(rsc_path, @package_root, rsc) unless doc.search('objectbank').empty?
113
+ end.reject(&:nil?)
114
+ end
115
+
116
+ def objectbanks
117
+ load_associated_content.select do |c|
118
+ c.class == Qti::V1::Models::ObjectBank
119
+ end
96
120
  end
97
121
 
98
122
  def item_resources_v2
@@ -85,6 +85,10 @@ module Qti
85
85
  def feedback
86
86
  @feedback ||= interaction_model.canvas_item_feedback
87
87
  end
88
+
89
+ def answer_feedback
90
+ @answer_feedback ||= interaction_model.answer_feedback
91
+ end
88
92
  end
89
93
  end
90
94
  end
@@ -7,7 +7,7 @@ module Qti
7
7
 
8
8
  def canvas_stem_items(item_prompt)
9
9
  item_prompt.split(CANVAS_REGEX).map.with_index do |stem_item, index|
10
- if stem_item.match CANVAS_REGEX
10
+ if canvas_fib_response_ids.include?(stem_item)
11
11
  # Strip the brackets before searching
12
12
  stem_blank(index, canvas_blank_id(stem_item[1..-2]))
13
13
  else
@@ -43,6 +43,38 @@ module Qti
43
43
  end
44
44
  blank_id
45
45
  end
46
+
47
+ def canvas_fib_responses
48
+ @base_canvas_blanks ||= node.xpath('.//xmlns:response_lid').map do |resp|
49
+ index = 0
50
+ {
51
+ id: resp[:ident],
52
+ choices:
53
+ resp.xpath('.//xmlns:response_label').map do |bnode|
54
+ canvas_blank_choice(bnode, index += 1)
55
+ end
56
+ }
57
+ end
58
+ @base_canvas_blanks
59
+ end
60
+
61
+ def canvas_fib_response_ids
62
+ @canvas_fib_response_ids ||= canvas_fib_responses.map { |b| "[#{b[:id].sub(/^response_/, '')}]" }
63
+ end
64
+
65
+ private
66
+
67
+ def canvas_blank_choice(bnode, index)
68
+ bnode_id = bnode[:ident]
69
+ choice = {
70
+ id: bnode_id,
71
+ position: index + 1,
72
+ item_body: bnode.at_xpath('.//xmlns:mattext').text
73
+ }
74
+ @blank_choices ||= {}
75
+ @blank_choices[bnode_id] = choice
76
+ choice
77
+ end
46
78
  end
47
79
  end
48
80
  end
@@ -14,19 +14,6 @@ module Qti
14
14
  canvas_stem_items(node.at_xpath('.//xmlns:presentation/xmlns:material/xmlns:mattext').text)
15
15
  end
16
16
 
17
- def blanks
18
- @blanks = node.xpath('.//xmlns:response_lid').map do |resp|
19
- index = 0
20
- {
21
- id: resp[:ident],
22
- choices:
23
- resp.xpath('.//xmlns:response_label').map do |bnode|
24
- blank_choice(bnode, index += 1)
25
- end
26
- }
27
- end
28
- end
29
-
30
17
  def scoring_data_structs
31
18
  answers.map do |answer|
32
19
  ScoringData.new(
@@ -42,12 +29,12 @@ module Qti
42
29
  end
43
30
 
44
31
  def text_for_entry(entry_id)
45
- blanks
32
+ canvas_fib_responses
46
33
  @blank_choices[entry_id][:item_body]
47
34
  end
48
35
 
49
36
  def position_for_entry(entry_id)
50
- blanks
37
+ canvas_fib_responses
51
38
  @blank_choices[entry_id][:position]
52
39
  end
53
40
 
@@ -63,20 +50,6 @@ module Qti
63
50
  }
64
51
  end
65
52
  end
66
-
67
- private
68
-
69
- def blank_choice(bnode, index)
70
- bnode_id = bnode[:ident]
71
- choice = {
72
- id: bnode_id,
73
- position: index + 1,
74
- item_body: bnode.at_xpath('.//xmlns:mattext').text
75
- }
76
- @blank_choices ||= {}
77
- @blank_choices[bnode_id] = choice
78
- choice
79
- end
80
53
  end
81
54
  end
82
55
  end
@@ -0,0 +1,14 @@
1
+ module Qti
2
+ module V1
3
+ module Models
4
+ class ObjectBank < Qti::V1::Models::Assessment
5
+ # use assessment_items / create_assessment_item from Assessment for bank items
6
+ def title
7
+ @title ||= xpath_with_single_check(
8
+ './/xmlns:qtimetadatafield/xmlns:fieldlabel[text()="bank_title"]/../xmlns:fieldentry'
9
+ )&.content || File.basename(@path, '.xml')
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -1,3 +1,3 @@
1
1
  module Qti
2
- VERSION = '2.1.0'.freeze
2
+ VERSION = '2.5.0'.freeze
3
3
  end
@@ -0,0 +1,244 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <questestinterop xmlns="http://www.imsglobal.org/xsd/ims_qtiasiv1p2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.imsglobal.org/xsd/ims_qtiasiv1p2 http://www.imsglobal.org/xsd/ims_qtiasiv1p2p1.xsd">
3
+ <item ident="gdc445634f8b3e063eb009700326194e9" title="L2Q2RUnit8q1">
4
+ <itemmetadata>
5
+ <qtimetadata>
6
+ <qtimetadatafield>
7
+ <fieldlabel>question_type</fieldlabel>
8
+ <fieldentry>multiple_dropdowns_question</fieldentry>
9
+ </qtimetadatafield>
10
+ <qtimetadatafield>
11
+ <fieldlabel>points_possible</fieldlabel>
12
+ <fieldentry>7.0</fieldentry>
13
+ </qtimetadatafield>
14
+ <qtimetadatafield>
15
+ <fieldlabel>original_answer_ids</fieldlabel>
16
+ <fieldentry>8464,265,3002,1356,5614,4002,8630,7844,3602,9525,8390,8745,3760,7542,1523,3317,6768,5823,2492,4494,6742,794,4259,4851,8574</fieldentry>
17
+ </qtimetadatafield>
18
+ <qtimetadatafield>
19
+ <fieldlabel>assessment_question_identifierref</fieldlabel>
20
+ <fieldentry>gf47b767d37e06559ff801f2d253307ba</fieldentry>
21
+ </qtimetadatafield>
22
+ </qtimetadata>
23
+ </itemmetadata>
24
+ <presentation>
25
+ <material>
26
+ <mattext texttype="text/html">&lt;div&gt;
27
+ &lt;p&gt;&lt;strong&gt;&lt;span data-contrast="none"&gt;LOREM &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
28
+ &lt;p&gt;&lt;strong&gt;&lt;span data-contrast="none"&gt;Lorem ipsum dolor sit amet consecteur&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span data-contrast="none"&gt;to&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span data-contrast="none"&gt;? Write the letter of the correct paragraph&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
29
+ &lt;p&gt; &lt;/p&gt;
30
+ &lt;p&gt;&lt;span data-contrast="none"&gt;&lt;strong&gt;A.&lt;/strong&gt; Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in. &lt;/span&gt;&lt;/p&gt;
31
+ &lt;p&gt;&lt;span data-contrast="none"&gt;&lt;strong&gt;B&lt;/strong&gt;. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in. &lt;/span&gt;&lt;/p&gt;
32
+ &lt;p&gt;&lt;span data-contrast="none"&gt;&lt;strong&gt;C&lt;/strong&gt;. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. &lt;/span&gt;&lt;/p&gt;
33
+ &lt;p&gt;&lt;span data-contrast="none"&gt;&lt;strong&gt;D&lt;/strong&gt;. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt. &lt;/span&gt;&lt;/p&gt;
34
+ &lt;p&gt;&lt;span data-contrast="none"&gt;&lt;strong&gt;E&lt;/strong&gt;. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in. &lt;/span&gt;&lt;/p&gt;
35
+ &lt;p&gt;&lt;span data-ccp-props='{"201341983":0,"335559739":160,"335559740":240}'&gt; &lt;/span&gt;&lt;span data-contrast="none"&gt;1&lt;/span&gt;&lt;span data-contrast="none"&gt;. L&lt;/span&gt;&lt;i&gt;&lt;span data-contrast="none"&gt;orem&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span data-contrast="none"&gt; impsum dolor / &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span data-contrast="none"&gt;ppl&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span data-contrast="none"&gt; sit amet consectetur &lt;/span&gt;&lt;/i&gt;&lt;span data-contrast="auto"&gt; &lt;/span&gt;&lt;span data-ccp-props='{"134233117":true,"134233118":true,"201341983":0,"335559685":1080,"335559739":160,"335559740":240,"335559991":1080}'&gt; &lt;/span&gt;&lt;/p&gt;
36
+ &lt;p&gt;&lt;span data-contrast="auto"&gt; &lt;/span&gt;&lt;span data-contrast="none"&gt;This note refers to paragraph &lt;/span&gt;&lt;strong&gt;&lt;span data-contrast="none"&gt;[1]&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span data-contrast="auto"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;span data-ccp-props='{"134233117":true,"134233118":true,"201341983":0,"335559685":1080,"335559739":160,"335559740":240}'&gt; &lt;/span&gt;&lt;/p&gt;
37
+ &lt;p&gt;&lt;span data-contrast="none"&gt;2&lt;/span&gt;&lt;span data-contrast="none"&gt;. L&lt;/span&gt;&lt;i&gt;&lt;span data-contrast="none"&gt;orem&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span data-contrast="none"&gt; ipsum dolor sit amet / &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span data-contrast="none"&gt;ppl&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span data-contrast="none"&gt; consectetur adipiscing&lt;/span&gt;&lt;/i&gt;&lt;span data-contrast="auto"&gt; &lt;/span&gt;&lt;span data-ccp-props='{"134233117":true,"134233118":true,"201341983":0,"335559739":160,"335559740":240}'&gt; &lt;/span&gt;&lt;/p&gt;
38
+ &lt;p&gt;&lt;span data-contrast="auto"&gt; &lt;/span&gt;&lt;span data-contrast="none"&gt;This note refers to paragraph &lt;/span&gt; &lt;strong&gt;&lt;span data-contrast="none"&gt;[2]&lt;/span&gt;&lt;/strong&gt;&lt;span data-ccp-props='{"134233117":true,"134233118":true,"201341983":0,"335559685":1080,"335559739":160,"335559740":240}'&gt; &lt;/span&gt;&lt;/p&gt;
39
+ &lt;p&gt;&lt;span data-contrast="none"&gt;3&lt;/span&gt;&lt;span data-contrast="none"&gt;. &lt;/span&gt;&lt;i&gt;&lt;span data-contrast="none"&gt;Lorem&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span data-contrast="none"&gt; ipsum dolor sit amet&lt;/span&gt;&lt;/i&gt;&lt;span data-contrast="auto"&gt; &lt;/span&gt;&lt;span data-ccp-props='{"134233117":true,"134233118":true,"201341983":0,"335559685":1080,"335559739":160,"335559740":240,"335559991":1080}'&gt; &lt;/span&gt;&lt;/p&gt;
40
+ &lt;p&gt;&lt;span data-contrast="auto"&gt; &lt;/span&gt;&lt;span data-contrast="none"&gt;This note refers to paragraph &lt;/span&gt;&lt;strong&gt;&lt;span data-contrast="none"&gt;[3]&lt;/span&gt;&lt;/strong&gt;&lt;span data-contrast="auto"&gt; &lt;/span&gt;&lt;span data-ccp-props='{"134233117":true,"134233118":true,"201341983":0,"335559685":1080,"335559739":160,"335559740":240}'&gt; &lt;/span&gt;&lt;/p&gt;
41
+ &lt;p&gt;&lt;span data-contrast="none"&gt;4&lt;/span&gt;&lt;span data-contrast="none"&gt;. L&lt;/span&gt;&lt;i&gt;&lt;span data-contrast="none"&gt;orem&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span data-contrast="none"&gt; ipsum dolor sit amet consectetur&lt;/span&gt;&lt;/i&gt;&lt;span data-contrast="auto"&gt; &lt;/span&gt;&lt;span data-ccp-props='{"134233117":true,"134233118":true,"201341983":0,"335559739":160,"335559740":240}'&gt; &lt;/span&gt;&lt;/p&gt;
42
+ &lt;p&gt;&lt;span data-contrast="auto"&gt; &lt;/span&gt;&lt;span data-contrast="none"&gt;This note refers to paragraph  &lt;/span&gt;&lt;strong&gt;&lt;span data-contrast="none"&gt;[4]&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
43
+ &lt;p&gt;&lt;span data-contrast="none"&gt;5&lt;/span&gt;&lt;span data-contrast="none"&gt;. L&lt;/span&gt;&lt;i&gt;&lt;span data-contrast="none"&gt;irst&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span data-contrast="none"&gt; orem ipsum dolor sit &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span data-contrast="none"&gt;ppl&lt;/span&gt;&lt;/i&gt;&lt;span data-contrast="auto"&gt; &lt;/span&gt;&lt;span data-ccp-props='{"134233117":true,"134233118":true,"201341983":0,"335559739":160,"335559740":240}'&gt; &lt;/span&gt;&lt;/p&gt;
44
+ &lt;p&gt;&lt;span data-contrast="auto"&gt; &lt;/span&gt;&lt;span data-contrast="none"&gt;This note refers to paragraph &lt;/span&gt;&lt;strong&gt;&lt;span data-contrast="none"&gt;[5]&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
45
+ &lt;/div&gt;</mattext>
46
+ </material>
47
+ <response_lid ident="response_1">
48
+ <material>
49
+ <mattext>1</mattext>
50
+ </material>
51
+ <render_choice>
52
+ <response_label ident="8464">
53
+ <material>
54
+ <mattext texttype="text/plain">A</mattext>
55
+ </material>
56
+ </response_label>
57
+ <response_label ident="265">
58
+ <material>
59
+ <mattext texttype="text/plain">B</mattext>
60
+ </material>
61
+ </response_label>
62
+ <response_label ident="3002">
63
+ <material>
64
+ <mattext texttype="text/plain">C</mattext>
65
+ </material>
66
+ </response_label>
67
+ <response_label ident="1356">
68
+ <material>
69
+ <mattext texttype="text/plain">D</mattext>
70
+ </material>
71
+ </response_label>
72
+ <response_label ident="5614">
73
+ <material>
74
+ <mattext texttype="text/plain">E</mattext>
75
+ </material>
76
+ </response_label>
77
+ </render_choice>
78
+ </response_lid>
79
+ <response_lid ident="response_2">
80
+ <material>
81
+ <mattext>2</mattext>
82
+ </material>
83
+ <render_choice>
84
+ <response_label ident="4002">
85
+ <material>
86
+ <mattext texttype="text/plain">A</mattext>
87
+ </material>
88
+ </response_label>
89
+ <response_label ident="8630">
90
+ <material>
91
+ <mattext texttype="text/plain">B</mattext>
92
+ </material>
93
+ </response_label>
94
+ <response_label ident="7844">
95
+ <material>
96
+ <mattext texttype="text/plain">C</mattext>
97
+ </material>
98
+ </response_label>
99
+ <response_label ident="3602">
100
+ <material>
101
+ <mattext texttype="text/plain">D</mattext>
102
+ </material>
103
+ </response_label>
104
+ <response_label ident="9525">
105
+ <material>
106
+ <mattext texttype="text/plain">E</mattext>
107
+ </material>
108
+ </response_label>
109
+ </render_choice>
110
+ </response_lid>
111
+ <response_lid ident="response_3">
112
+ <material>
113
+ <mattext>3</mattext>
114
+ </material>
115
+ <render_choice>
116
+ <response_label ident="8390">
117
+ <material>
118
+ <mattext texttype="text/plain">A</mattext>
119
+ </material>
120
+ </response_label>
121
+ <response_label ident="8745">
122
+ <material>
123
+ <mattext texttype="text/plain">B</mattext>
124
+ </material>
125
+ </response_label>
126
+ <response_label ident="3760">
127
+ <material>
128
+ <mattext texttype="text/plain">C</mattext>
129
+ </material>
130
+ </response_label>
131
+ <response_label ident="7542">
132
+ <material>
133
+ <mattext texttype="text/plain">D</mattext>
134
+ </material>
135
+ </response_label>
136
+ <response_label ident="1523">
137
+ <material>
138
+ <mattext texttype="text/plain">E</mattext>
139
+ </material>
140
+ </response_label>
141
+ </render_choice>
142
+ </response_lid>
143
+ <response_lid ident="response_4">
144
+ <material>
145
+ <mattext>4</mattext>
146
+ </material>
147
+ <render_choice>
148
+ <response_label ident="3317">
149
+ <material>
150
+ <mattext texttype="text/plain">A</mattext>
151
+ </material>
152
+ </response_label>
153
+ <response_label ident="6768">
154
+ <material>
155
+ <mattext texttype="text/plain">B</mattext>
156
+ </material>
157
+ </response_label>
158
+ <response_label ident="5823">
159
+ <material>
160
+ <mattext texttype="text/plain">C</mattext>
161
+ </material>
162
+ </response_label>
163
+ <response_label ident="2492">
164
+ <material>
165
+ <mattext texttype="text/plain">D</mattext>
166
+ </material>
167
+ </response_label>
168
+ <response_label ident="4494">
169
+ <material>
170
+ <mattext texttype="text/plain">E</mattext>
171
+ </material>
172
+ </response_label>
173
+ </render_choice>
174
+ </response_lid>
175
+ <response_lid ident="response_5">
176
+ <material>
177
+ <mattext>5</mattext>
178
+ </material>
179
+ <render_choice>
180
+ <response_label ident="6742">
181
+ <material>
182
+ <mattext texttype="text/plain">A</mattext>
183
+ </material>
184
+ </response_label>
185
+ <response_label ident="794">
186
+ <material>
187
+ <mattext texttype="text/plain">B</mattext>
188
+ </material>
189
+ </response_label>
190
+ <response_label ident="4259">
191
+ <material>
192
+ <mattext texttype="text/plain">C</mattext>
193
+ </material>
194
+ </response_label>
195
+ <response_label ident="4851">
196
+ <material>
197
+ <mattext texttype="text/plain">D</mattext>
198
+ </material>
199
+ </response_label>
200
+ <response_label ident="8574">
201
+ <material>
202
+ <mattext texttype="text/plain">E</mattext>
203
+ </material>
204
+ </response_label>
205
+ </render_choice>
206
+ </response_lid>
207
+ </presentation>
208
+ <resprocessing>
209
+ <outcomes>
210
+ <decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
211
+ </outcomes>
212
+ <respcondition>
213
+ <conditionvar>
214
+ <varequal respident="response_1">1356</varequal>
215
+ </conditionvar>
216
+ <setvar varname="SCORE" action="Add">20.00</setvar>
217
+ </respcondition>
218
+ <respcondition>
219
+ <conditionvar>
220
+ <varequal respident="response_2">9525</varequal>
221
+ </conditionvar>
222
+ <setvar varname="SCORE" action="Add">20.00</setvar>
223
+ </respcondition>
224
+ <respcondition>
225
+ <conditionvar>
226
+ <varequal respident="response_3">8745</varequal>
227
+ </conditionvar>
228
+ <setvar varname="SCORE" action="Add">20.00</setvar>
229
+ </respcondition>
230
+ <respcondition>
231
+ <conditionvar>
232
+ <varequal respident="response_4">5823</varequal>
233
+ </conditionvar>
234
+ <setvar varname="SCORE" action="Add">20.00</setvar>
235
+ </respcondition>
236
+ <respcondition>
237
+ <conditionvar>
238
+ <varequal respident="response_5">6742</varequal>
239
+ </conditionvar>
240
+ <setvar varname="SCORE" action="Add">20.00</setvar>
241
+ </respcondition>
242
+ </resprocessing>
243
+ </item>
244
+ </questestinterop>