fireinc-pdf-reader 0.11.0.alpha

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. data/CHANGELOG +168 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README.rdoc +137 -0
  4. data/Rakefile +34 -0
  5. data/TODO +45 -0
  6. data/bin/pdf_list_callbacks +15 -0
  7. data/bin/pdf_object +48 -0
  8. data/bin/pdf_text +15 -0
  9. data/examples/callbacks.rb +21 -0
  10. data/examples/extract_bates.rb +49 -0
  11. data/examples/extract_images.rb +108 -0
  12. data/examples/hash.rb +12 -0
  13. data/examples/metadata.rb +25 -0
  14. data/examples/page_counter_improved.rb +23 -0
  15. data/examples/page_counter_naive.rb +24 -0
  16. data/examples/rspec.rb +57 -0
  17. data/examples/text.rb +40 -0
  18. data/examples/version.rb +25 -0
  19. data/lib/pdf/hash.rb +15 -0
  20. data/lib/pdf/reader/abstract_strategy.rb +81 -0
  21. data/lib/pdf/reader/buffer.rb +346 -0
  22. data/lib/pdf/reader/cmap.rb +138 -0
  23. data/lib/pdf/reader/encoding.rb +190 -0
  24. data/lib/pdf/reader/encodings/mac_expert.txt +159 -0
  25. data/lib/pdf/reader/encodings/mac_roman.txt +128 -0
  26. data/lib/pdf/reader/encodings/pdf_doc.txt +40 -0
  27. data/lib/pdf/reader/encodings/standard.txt +47 -0
  28. data/lib/pdf/reader/encodings/symbol.txt +154 -0
  29. data/lib/pdf/reader/encodings/win_ansi.txt +29 -0
  30. data/lib/pdf/reader/encodings/zapf_dingbats.txt +201 -0
  31. data/lib/pdf/reader/error.rb +53 -0
  32. data/lib/pdf/reader/filter.rb +219 -0
  33. data/lib/pdf/reader/font.rb +133 -0
  34. data/lib/pdf/reader/form_xobject.rb +83 -0
  35. data/lib/pdf/reader/glyphlist.txt +4322 -0
  36. data/lib/pdf/reader/lzw.rb +123 -0
  37. data/lib/pdf/reader/metadata_strategy.rb +56 -0
  38. data/lib/pdf/reader/object_cache.rb +85 -0
  39. data/lib/pdf/reader/object_hash.rb +289 -0
  40. data/lib/pdf/reader/object_stream.rb +51 -0
  41. data/lib/pdf/reader/page.rb +185 -0
  42. data/lib/pdf/reader/page_text_receiver.rb +278 -0
  43. data/lib/pdf/reader/pages_strategy.rb +475 -0
  44. data/lib/pdf/reader/parser.rb +225 -0
  45. data/lib/pdf/reader/print_receiver.rb +18 -0
  46. data/lib/pdf/reader/reference.rb +66 -0
  47. data/lib/pdf/reader/register_receiver.rb +95 -0
  48. data/lib/pdf/reader/stream.rb +69 -0
  49. data/lib/pdf/reader/text_receiver.rb +264 -0
  50. data/lib/pdf/reader/token.rb +41 -0
  51. data/lib/pdf/reader/xref.rb +220 -0
  52. data/lib/pdf/reader.rb +296 -0
  53. data/lib/pdf-reader.rb +1 -0
  54. metadata +211 -0
@@ -0,0 +1,138 @@
1
+ ################################################################################
2
+ #
3
+ # Copyright (C) 2008 James Healy (jimmy@deefa.com)
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining
6
+ # a copy of this software and associated documentation files (the
7
+ # "Software"), to deal in the Software without restriction, including
8
+ # without limitation the rights to use, copy, modify, merge, publish,
9
+ # distribute, sublicense, and/or sell copies of the Software, and to
10
+ # permit persons to whom the Software is furnished to do so, subject to
11
+ # the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be
14
+ # included in all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
+ #
24
+ ################################################################################
25
+
26
+ class PDF::Reader
27
+ class CMap # :nodoc:
28
+
29
+ def initialize(data)
30
+ @map = {}
31
+ process_data(data)
32
+ end
33
+
34
+ def process_data(data)
35
+ mode = nil
36
+ instructions = ""
37
+
38
+ data.each_line do |l|
39
+ if l.include?("beginbfchar")
40
+ mode = :char
41
+ elsif l.include?("endbfchar")
42
+ process_bfchar_instructions(instructions)
43
+ instructions = ""
44
+ mode = nil
45
+ elsif l.include?("beginbfrange")
46
+ mode = :range
47
+ elsif l.include?("endbfrange")
48
+ process_bfrange_instructions(instructions)
49
+ instructions = ""
50
+ mode = nil
51
+ elsif mode == :char || mode == :range
52
+ instructions << l
53
+ end
54
+ end
55
+ end
56
+
57
+ def size
58
+ @map.size
59
+ end
60
+
61
+ def decode(c)
62
+ # TODO: implement the conversion
63
+ return c unless c.class == Fixnum
64
+ @map[c]
65
+ end
66
+
67
+ private
68
+
69
+ def build_parser(instructions)
70
+ buffer = Buffer.new(StringIO.new(instructions))
71
+ Parser.new(buffer)
72
+ end
73
+
74
+ def str_to_int(str)
75
+ return nil if str.nil? || str.size == 0 || str.size >= 3
76
+
77
+ if str.size == 1
78
+ str.unpack("C*")[0]
79
+ else
80
+ str.unpack("n*")[0]
81
+ end
82
+ end
83
+
84
+ def process_bfchar_instructions(instructions)
85
+ parser = build_parser(instructions)
86
+ find = str_to_int(parser.parse_token)
87
+ replace = str_to_int(parser.parse_token)
88
+ while find && replace
89
+ @map[find] = replace
90
+ find = str_to_int(parser.parse_token)
91
+ replace = str_to_int(parser.parse_token)
92
+ end
93
+ end
94
+
95
+ def process_bfrange_instructions(instructions)
96
+ parser = build_parser(instructions)
97
+ start = parser.parse_token
98
+ finish = parser.parse_token
99
+ to = parser.parse_token
100
+ while start && finish && to
101
+ if start.kind_of?(String) && finish.kind_of?(String) && to.kind_of?(String)
102
+ bfrange_type_one(start, finish, to)
103
+ elsif start.kind_of?(String) && finish.kind_of?(String) && to.kind_of?(Array)
104
+ bfrange_type_two(start, finish, to)
105
+ else
106
+ raise "invalid bfrange section"
107
+ end
108
+ start = parser.parse_token
109
+ finish = parser.parse_token
110
+ to = parser.parse_token
111
+ end
112
+ end
113
+
114
+ def bfrange_type_one(start_code, end_code, dst)
115
+ start_code = str_to_int(start_code)
116
+ end_code = str_to_int(end_code)
117
+ dst = str_to_int(dst)
118
+
119
+ # add all values in the range to our mapping
120
+ (start_code..end_code).each_with_index do |val, idx|
121
+ @map[val] = dst + idx
122
+ # ensure a single range does not exceed 255 chars
123
+ raise PDF::Reader::MalformedPDFError, "a CMap bfrange cann't exceed 255 chars" if idx > 255
124
+ end
125
+ end
126
+
127
+ def bfrange_type_two(start_code, end_code, dst)
128
+ start_code = str_to_int(start_code)
129
+ end_code = str_to_int(end_code)
130
+ from_range = (start_code..end_code)
131
+
132
+ # add all values in the range to our mapping
133
+ from_range.each_with_index do |val, idx|
134
+ @map[val] = str_to_int(dst[idx])
135
+ end
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,190 @@
1
+ ################################################################################
2
+ #
3
+ # Copyright (C) 2008 James Healy (jimmy@deefa.com)
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining
6
+ # a copy of this software and associated documentation files (the
7
+ # "Software"), to deal in the Software without restriction, including
8
+ # without limitation the rights to use, copy, modify, merge, publish,
9
+ # distribute, sublicense, and/or sell copies of the Software, and to
10
+ # permit persons to whom the Software is furnished to do so, subject to
11
+ # the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be
14
+ # included in all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
+ #
24
+ ################################################################################
25
+
26
+ class PDF::Reader
27
+ class Encoding # :nodoc:
28
+ CONTROL_CHARS = [0,1,2,3,4,5,6,7,8,11,12,14,15,16,17,18,19,20,21,22,23,
29
+ 24,25,26,27,28,29,30,31]
30
+ UNKNOWN_CHAR = 0x25AF # ▯
31
+
32
+ attr_reader :unpack
33
+
34
+ def initialize(enc)
35
+ if enc.kind_of?(Hash)
36
+ self.differences = enc[:Differences] if enc[:Differences]
37
+ enc = enc[:Encoding] || enc[:BaseEncoding]
38
+ elsif enc != nil
39
+ enc = enc.to_sym
40
+ else
41
+ enc = nil
42
+ end
43
+
44
+ @to_unicode_required = unicode_required?(enc)
45
+ @unpack = get_unpack(enc)
46
+ @map_file = get_mapping_file(enc)
47
+ load_mapping(@map_file) if @map_file
48
+ end
49
+
50
+ def to_unicode_required?
51
+ @to_unicode_required
52
+ end
53
+
54
+ # set the differences table for this encoding. should be an array in the following format:
55
+ #
56
+ # [25, :A, 26, :B]
57
+ #
58
+ # The array alternates between a decimal byte number and a glyph name to map to that byte
59
+ #
60
+ # To save space the following array is also valid and equivalent to the previous one
61
+ #
62
+ # [25, :A, :B]
63
+ def differences=(diff)
64
+ raise ArgumentError, "diff must be an array" unless diff.kind_of?(Array)
65
+
66
+ @differences = {}
67
+ byte = 0
68
+ diff.each do |val|
69
+ if val.kind_of?(Numeric)
70
+ byte = val.to_i
71
+ else
72
+ @differences[byte] = val
73
+ byte += 1
74
+ end
75
+ end
76
+ @differences
77
+ end
78
+
79
+ def differences
80
+ @differences ||= {}
81
+ end
82
+
83
+ # convert the specified string to utf8
84
+ #
85
+ # * unpack raw bytes into codepoints
86
+ # * replace any that have entries in the differences table with a glyph name
87
+ # * convert codepoints from source encoding to Unicode codepoints
88
+ # * convert any glyph names to Unicode codepoints
89
+ # * replace characters that didn't convert to Unicode nicely with something
90
+ # valid
91
+ # * pack the final array of Unicode codepoints into a utf-8 string
92
+ # * mark the string as utf-8 if we're running on a M17N aware VM
93
+ #
94
+ def to_utf8(str, tounicode = nil)
95
+ ret = str.unpack(unpack).map { |c|
96
+ differences[c] || c
97
+ }.map { |num|
98
+ original_codepoint_to_unicode(num, tounicode)
99
+ }.map { |c|
100
+ glyphnames[c] || c
101
+ }.map { |c|
102
+ if c.nil? || !c.is_a?(Fixnum)
103
+ PDF::Reader::Encoding::UNKNOWN_CHAR
104
+ else
105
+ c
106
+ end
107
+ }.pack("U*")
108
+
109
+ ret.force_encoding("UTF-8") if ret.respond_to?(:force_encoding)
110
+
111
+ ret
112
+ end
113
+
114
+ private
115
+
116
+ def original_codepoint_to_unicode(cp, tounicode = nil)
117
+ if tounicode && (code = tounicode.decode(cp))
118
+ code
119
+ elsif to_unicode_required? && (tounicode.nil? || tounicode.decode(cp).nil?)
120
+ PDF::Reader::Encoding::UNKNOWN_CHAR
121
+ elsif mapping[cp]
122
+ mapping[cp]
123
+ elsif PDF::Reader::Encoding::CONTROL_CHARS.include?(cp)
124
+ PDF::Reader::Encoding::UNKNOWN_CHAR
125
+ else
126
+ cp
127
+ end
128
+ end
129
+
130
+ def get_unpack(enc)
131
+ case enc
132
+ when :"Identity-H", :"Identity-V", :UTF16Encoding
133
+ "n*"
134
+ else
135
+ "C*"
136
+ end
137
+ end
138
+
139
+ def get_mapping_file(enc)
140
+ return File.dirname(__FILE__) + "/encodings/standard.txt" if enc.nil?
141
+ files = {
142
+ :"Identity-H" => nil,
143
+ :"Identity-V" => nil,
144
+ :MacRomanEncoding => File.dirname(__FILE__) + "/encodings/mac_roman.txt",
145
+ :MacExpertEncoding => File.dirname(__FILE__) + "/encodings/mac_expert.txt",
146
+ :PDFDocEncoding => File.dirname(__FILE__) + "/encodings/pdf_doc.txt",
147
+ :StandardEncoding => File.dirname(__FILE__) + "/encodings/standard.txt",
148
+ :SymbolEncoding => File.dirname(__FILE__) + "/encodings/symbol.txt",
149
+ :UTF16Encoding => nil,
150
+ :WinAnsiEncoding => File.dirname(__FILE__) + "/encodings/win_ansi.txt",
151
+ :ZapfDingbatsEncoding => File.dirname(__FILE__) + "/encodings/zapf_dingbats.txt"
152
+ }
153
+
154
+ if files.has_key?(enc)
155
+ files[enc]
156
+ else
157
+ raise UnsupportedFeatureError, "#{enc} is not currently a supported encoding"
158
+ end
159
+ end
160
+
161
+ def unicode_required?(enc)
162
+ enc == :"Identity-H" or enc == :"Identity-V"
163
+ end
164
+
165
+ def mapping
166
+ @mapping ||= {}
167
+ end
168
+
169
+ def has_mapping?
170
+ mapping.size > 0
171
+ end
172
+
173
+ def glyphnames
174
+ @glyphnames ||= PDF::Reader::Font.glyphnames
175
+ end
176
+
177
+ def load_mapping(file)
178
+ return if has_mapping?
179
+
180
+ RUBY_VERSION >= "1.9" ? mode = "r:BINARY" : mode = "r"
181
+ File.open(file, mode) do |f|
182
+ f.each do |l|
183
+ m, single_byte, unicode = *l.match(/([0-9A-Za-z]+);([0-9A-F]{4})/)
184
+ mapping["0x#{single_byte}".hex] = "0x#{unicode}".hex if single_byte
185
+ end
186
+ end
187
+ end
188
+
189
+ end
190
+ end
@@ -0,0 +1,159 @@
1
+ 21;F721
2
+ 22;F6F8 # Hungarumlautsmall
3
+ 23;F7A2
4
+ 24;F724
5
+ 25;F6E4
6
+ 26;F726
7
+ 27;F7B4
8
+ 28;207D
9
+ 29;F07E
10
+ 2A;2025
11
+ 2B;2024
12
+ 2F;2044
13
+ 30;F730
14
+ 31;F731
15
+ 32;F732
16
+ 33;F733
17
+ 34;F734
18
+ 35;F735
19
+ 36;F736
20
+ 37;F737
21
+ 38;F738
22
+ 39;F739
23
+ 3D;F6DE
24
+ 3F;F73F
25
+ 44;F7F0
26
+ 47;00BC
27
+ 48;00BD
28
+ 49;00BE
29
+ 4A;215B
30
+ 4B;215C
31
+ 4C;215D
32
+ 4D;215E
33
+ 4E;2153
34
+ 4F;2154
35
+ 56;FB00
36
+ 57;FB01
37
+ 58;FB02
38
+ 59;FB03
39
+ 5A;FB04
40
+ 5B;208D
41
+ 5D;208E
42
+ 5E;F6F6
43
+ 5F;F6E5
44
+ 60;F760
45
+ 61;F761
46
+ 62;F762
47
+ 63;F763
48
+ 64;F764
49
+ 65;F765
50
+ 66;F766
51
+ 67;F767
52
+ 68;F768
53
+ 69;F769
54
+ 6A;F76A
55
+ 6B;F76B
56
+ 6C;F76C
57
+ 6D;F76D
58
+ 6E;F76E
59
+ 6F;F76F
60
+ 70;F770
61
+ 71;F771
62
+ 72;F772
63
+ 73;F773
64
+ 74;F774
65
+ 75;F775
66
+ 76;F776
67
+ 77;F777
68
+ 78;F778
69
+ 79;F779
70
+ 7A;F77A
71
+ 7B;20A1
72
+ 7C;F6DC
73
+ 7D;F6DD
74
+ 7E;F6FE
75
+ 81;F6E9
76
+ 82;F6E0
77
+ 87;F7E1 # Acircumflexsmall
78
+ 88;F7E0
79
+ 89;F7E2 # Acutesmall
80
+ 8A;F7E4
81
+ 8B;F7E3
82
+ 8C;F7E5
83
+ 8D;F7E7
84
+ 8E;F7E9
85
+ 8F;F7E8
86
+ 90;F7E4
87
+ 91;F7EB
88
+ 92;F7ED
89
+ 93;F7EC
90
+ 94;F7EE
91
+ 95;F7EF
92
+ 96;F7F1
93
+ 97;F7F3
94
+ 98;F7F2
95
+ 99;F7F4
96
+ 9A;F7F6
97
+ 9B;F7F5
98
+ 9C;F7FA
99
+ 9D;F7F9
100
+ 9E;F7FB
101
+ 9F;F7FC
102
+ A1;2078
103
+ A2;2084
104
+ A3;2083
105
+ A4;2086
106
+ A5;2088
107
+ A6;2087
108
+ A7;F6FD
109
+ A9;F6DF
110
+ AA;2082
111
+ AC;F7A8
112
+ AE;F6F5
113
+ AF;F6F0
114
+ B0;2085
115
+ B2;F6E1
116
+ B3;F6E7
117
+ B4;F7FD
118
+ B6;F6E3
119
+ B9;F7FE
120
+ BB;2089
121
+ BC;2080
122
+ BD;F6FF
123
+ BE;F7E6 # AEsmall
124
+ BF;F7F8
125
+ C0;F7BF
126
+ C1;2081
127
+ C2;F6F9
128
+ C9;F7B8
129
+ CF;F6FA
130
+ D0;2012
131
+ D1;F6E6
132
+ D6;F7A1
133
+ D8;F7FF
134
+ DA;00B9
135
+ DB;00B2
136
+ DC;00B3
137
+ DD;2074
138
+ DE;2075
139
+ DF;2076
140
+ E0;2077
141
+ E1;2079
142
+ E2;2070
143
+ E4;F6EC
144
+ E5;F6F1
145
+ E6;F6F3
146
+ E9;F6ED
147
+ EA;F6F2
148
+ EB;F6EB
149
+ F1;F6EE
150
+ F2;F6FB
151
+ F3;F6F4
152
+ F4;F7AF
153
+ F5;F6EF
154
+ F6;207F
155
+ F7;F6EF
156
+ F8;F6E2
157
+ F9;F6E8
158
+ FA;F6F7
159
+ FB;F6FC
@@ -0,0 +1,128 @@
1
+ 80;00C4
2
+ 81;00C5
3
+ 82;00C7
4
+ 83;00C9
5
+ 84;00D1
6
+ 85;00D6
7
+ 86;00DC
8
+ 87;00E1
9
+ 88;00E0
10
+ 89;00E2
11
+ 8A;00E4
12
+ 8B;00E3
13
+ 8C;00E5
14
+ 8D;00E7
15
+ 8E;00E9
16
+ 8F;00E8
17
+ 90;00EA
18
+ 91;00EB
19
+ 92;00ED
20
+ 93;00EC
21
+ 94;00EE
22
+ 95;00EF
23
+ 96;00F1
24
+ 97;00F3
25
+ 98;00F2
26
+ 99;00F4
27
+ 9A;00F6
28
+ 9B;00F5
29
+ 9C;00FA
30
+ 9D;00F9
31
+ 9E;00FB
32
+ 9F;00FC
33
+ A0;2020
34
+ A1;00B0
35
+ A2;00A2
36
+ A3;00A3
37
+ A4;00A7
38
+ A5;2022
39
+ A6;00B6
40
+ A7;00DF
41
+ A8;00AE
42
+ A9;00A9
43
+ AA;2122
44
+ AB;00B4
45
+ AC;00A8
46
+ AD;2260
47
+ AE;00C6
48
+ AF;00D8
49
+ B0;221E
50
+ B1;00B1
51
+ B2;2264
52
+ B3;2265
53
+ B4;00A5
54
+ B5;00B5
55
+ B6;2202
56
+ B7;2211
57
+ B8;220F
58
+ B9;03C0
59
+ BA;222B
60
+ BB;00AA
61
+ BC;00BA
62
+ BD;03A9
63
+ BE;00E6
64
+ BF;00F8
65
+ C0;00BF
66
+ C1;00A1
67
+ C2;00AC
68
+ C3;221A
69
+ C4;0192
70
+ C5;2248
71
+ C6;2206
72
+ C7;00AB
73
+ C8;00BB
74
+ C9;2026
75
+ CA;00A0
76
+ CB;00C0
77
+ CC;00C3
78
+ CD;00D5
79
+ CE;0152
80
+ CF;0153
81
+ D0;2013
82
+ D1;2014
83
+ D2;201C
84
+ D3;201D
85
+ D4;2018
86
+ D5;2019
87
+ D6;00F7
88
+ D7;25CA
89
+ D8;00FF
90
+ D9;0178
91
+ DA;2044
92
+ DB;20AC
93
+ DC;2039
94
+ DD;203A
95
+ DE;FB01
96
+ DF;FB02
97
+ E0;2021
98
+ E1;00B7
99
+ E2;201A
100
+ E3;201E
101
+ E4;2030
102
+ E5;00C2
103
+ E6;00CA
104
+ E7;00C1
105
+ E8;00CB
106
+ E9;00C8
107
+ EA;00CD
108
+ EB;00CE
109
+ EC;00CF
110
+ ED;00CC
111
+ EE;00D3
112
+ EF;00D4
113
+ F0;F8FF
114
+ F1;00D2
115
+ F2;00DA
116
+ F3;00D8
117
+ F4;00D9
118
+ F5;0131
119
+ F6;02C6
120
+ F7;02DC
121
+ F8;00AF
122
+ F9;02D8
123
+ FA;02D9
124
+ FB;02DA
125
+ FC;00B8
126
+ FD;02DD
127
+ FE;02DB
128
+ FF;02C7
@@ -0,0 +1,40 @@
1
+ 18;02D8
2
+ 19;02C7
3
+ 1A;02C6
4
+ 1B;02D9
5
+ 1C;02DD
6
+ 1D;02DB
7
+ 1E;02DA
8
+ 1F;02DC
9
+ 80;2022
10
+ 81;2020
11
+ 82;2021
12
+ 83;2026
13
+ 84;2014
14
+ 85;2013
15
+ 86;0192
16
+ 87;2044
17
+ 88;2039
18
+ 89;203A
19
+ 8A;2212
20
+ 8B;2030
21
+ 8C;201E
22
+ 8D;201C
23
+ 8E;201D
24
+ 8F;2018
25
+ 90;2019
26
+ 91;201A
27
+ 92;2122
28
+ 93;FB01
29
+ 94;FB02
30
+ 95;0141
31
+ 96;0152
32
+ 97;0160
33
+ 98;0178
34
+ 99;017D
35
+ 9A;0131
36
+ 9B;0142
37
+ 9C;0153
38
+ 9D;0161
39
+ 9E;017E
40
+ A0;20AC
@@ -0,0 +1,47 @@
1
+ 27;2019
2
+ 60;2018
3
+ A4;2044
4
+ A6;0192
5
+ A8;00A4
6
+ A9;0027
7
+ AA;201C
8
+ AC;2039
9
+ AD;203A
10
+ AE;FB01
11
+ AF;FB02
12
+ B1;2013
13
+ B2;2020
14
+ B3;2021
15
+ B4;00B7
16
+ B7;2022
17
+ B8;201A
18
+ B9;201E
19
+ BA;201D
20
+ BC;2026
21
+ BD;2030
22
+ C1;0060
23
+ C2;00B4
24
+ C3;02C6
25
+ C4;02DC
26
+ C5;00AF
27
+ C6;02D8
28
+ C7;02D9
29
+ C8;00A8
30
+ CA;02DA
31
+ CB;00B8
32
+ CD;02DD
33
+ CE;02DB
34
+ CF;02C7
35
+ D0;2014
36
+ E1;00C6
37
+ E3;00AA
38
+ E8;0141
39
+ E9;00D8
40
+ EA;0152
41
+ EB;00BA
42
+ F1;00E6
43
+ F5;0131
44
+ F8;0142
45
+ F9;00F8
46
+ FA;0153
47
+ FB;00DF