image_size 2.0.1 → 2.1.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.
- checksums.yaml +4 -4
- data/.github/workflows/check.yml +40 -0
- data/.rubocop.yml +21 -4
- data/.rubocop_todo.yml +11 -8
- data/CHANGELOG.markdown +17 -0
- data/GPL +340 -0
- data/Gemfile +0 -4
- data/LICENSE.txt +56 -0
- data/README.markdown +6 -8
- data/image_size.gemspec +5 -7
- data/lib/image_size.rb +118 -31
- data/spec/image_size_spec.rb +5 -0
- data/spec/images/cur/32x256.cur +0 -0
- data/spec/images/ico/32x256.ico +0 -0
- data/spec/images/jp2/163x402.jp2 +0 -0
- data/spec/images/jp2/176x373.jpx +0 -0
- data/spec/images/jp2/224x293.j2c +0 -0
- data/spec/images/jpeg/436x429.jpeg +0 -0
- data/spec/images/jpeg/extraneous-bytes.436x429.jpeg +0 -0
- data/spec/images/mng/61x42.mng +0 -0
- data/spec/images/{apng → png}/192x110.apng +0 -0
- data/spec/images/pnm/22x25.pam +8 -0
- data/spec/images/pnm/22x25.pbm +0 -0
- data/spec/images/pnm/22x25.pgm +4 -0
- data/spec/images/pnm/22x25.ppm +4 -0
- data/spec/images/pnm/ascii.22x25.pbm +27 -0
- data/spec/images/pnm/ascii.22x25.pgm +28 -0
- data/spec/images/pnm/ascii.22x25.ppm +28 -0
- data/spec/images/tiff/big-endian.68x49.tiff +0 -0
- data/spec/images/tiff/little-endian.40x68.tiff +0 -0
- metadata +52 -32
- data/.travis.yml +0 -24
- data/spec/images/cur/50x256.cur +0 -0
- data/spec/images/ico/256x27.ico +0 -0
- data/spec/images/jpeg/320x240.jpeg +0 -0
- data/spec/images/jpeg/extraneous-bytes.320x240.jpeg +0 -0
- data/spec/images/mng/612x132.mng +0 -0
- data/spec/images/pbm/85x55.pbm +0 -0
- data/spec/images/pgm/90x55.pgm +0 -5
- data/spec/images/tiff/48x64.tiff +0 -0
data/Gemfile
CHANGED
data/LICENSE.txt
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
Ruby is copyrighted free software by Keisuke Minami <keisuke@rccn.com>.
|
2
|
+
You can redistribute it and/or modify it under either the terms of the GPL
|
3
|
+
version 2 (see the file GPL), or the conditions below:
|
4
|
+
|
5
|
+
1. You may make and give away verbatim copies of the source form of the
|
6
|
+
software without restriction, provided that you duplicate all of the
|
7
|
+
original copyright notices and associated disclaimers.
|
8
|
+
|
9
|
+
2. You may modify your copy of the software in any way, provided that
|
10
|
+
you do at least ONE of the following:
|
11
|
+
|
12
|
+
a) place your modifications in the Public Domain or otherwise
|
13
|
+
make them Freely Available, such as by posting said
|
14
|
+
modifications to Usenet or an equivalent medium, or by allowing
|
15
|
+
the author to include your modifications in the software.
|
16
|
+
|
17
|
+
b) use the modified software only within your corporation or
|
18
|
+
organization.
|
19
|
+
|
20
|
+
c) give non-standard binaries non-standard names, with
|
21
|
+
instructions on where to get the original software distribution.
|
22
|
+
|
23
|
+
d) make other distribution arrangements with the author.
|
24
|
+
|
25
|
+
3. You may distribute the software in object code or binary form,
|
26
|
+
provided that you do at least ONE of the following:
|
27
|
+
|
28
|
+
a) distribute the binaries and library files of the software,
|
29
|
+
together with instructions (in the manual page or equivalent)
|
30
|
+
on where to get the original distribution.
|
31
|
+
|
32
|
+
b) accompany the distribution with the machine-readable source of
|
33
|
+
the software.
|
34
|
+
|
35
|
+
c) give non-standard binaries non-standard names, with
|
36
|
+
instructions on where to get the original software distribution.
|
37
|
+
|
38
|
+
d) make other distribution arrangements with the author.
|
39
|
+
|
40
|
+
4. You may modify and include the part of the software into any other
|
41
|
+
software (possibly commercial). But some files in the distribution
|
42
|
+
are not written by the author, so that they are not under these terms.
|
43
|
+
|
44
|
+
For the list of those files and their copying conditions, see the
|
45
|
+
file LEGAL.
|
46
|
+
|
47
|
+
5. The scripts and library files supplied as input to or produced as
|
48
|
+
output from the software do not automatically fall under the
|
49
|
+
copyright of the software, but belong to whomever generated them,
|
50
|
+
and may be sold commercially, and may be aggregated with this
|
51
|
+
software.
|
52
|
+
|
53
|
+
6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
|
54
|
+
IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
55
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
56
|
+
PURPOSE.
|
data/README.markdown
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
[](https://rubygems.org/gems/image_size)
|
2
|
+
[](https://github.com/toy/image_size/actions/workflows/check.yml)
|
3
3
|
|
4
4
|
# image_size
|
5
5
|
|
6
6
|
measure image size using pure Ruby
|
7
|
-
formats: `apng`, `bmp`, `cur`, `gif`, `jpeg`, `
|
7
|
+
formats: `apng`, `bmp`, `cur`, `gif`, `ico`, `j2c`, `jp2`, `jpeg`, `jpx`, `mng`, `pam`, `pbm`, `pcx`, `pgm`, `png`, `ppm`, `psd`, `svg`, `swf`, `tiff`, `webp`, `xbm`, `xpm`
|
8
8
|
|
9
9
|
## Installation
|
10
10
|
|
@@ -85,9 +85,7 @@ end
|
|
85
85
|
|
86
86
|
## Licence
|
87
87
|
|
88
|
-
This code is free to use under the terms of the Ruby's licence.
|
88
|
+
This code is free to use under the terms of the [Ruby's licence](LICENSE.txt).
|
89
89
|
|
90
|
-
|
91
|
-
|
92
|
-
Original author: "Keisuke Minami": mailto:keisuke@rccn.com
|
93
|
-
Further development by Ivan Kuchin https://github.com/toy/image_size
|
90
|
+
Original author: Keisuke Minami <keisuke@rccn.com>.\
|
91
|
+
Further development 2010-2020 Ivan Kuchin https://github.com/toy/image_size
|
data/image_size.gemspec
CHANGED
@@ -2,15 +2,13 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = 'image_size'
|
5
|
-
s.version = '2.
|
5
|
+
s.version = '2.1.2'
|
6
6
|
s.summary = %q{Measure image size using pure Ruby}
|
7
|
-
s.description = %q{Measure following file dimensions: apng, bmp, cur, gif, jpeg,
|
8
|
-
s.homepage = "
|
7
|
+
s.description = %q{Measure following file dimensions: apng, bmp, cur, gif, ico, j2c, jp2, jpeg, jpx, mng, pam, pbm, pcx, pgm, png, ppm, psd, svg, swf, tiff, webp, xbm, xpm}
|
8
|
+
s.homepage = "https://github.com/toy/#{s.name}"
|
9
9
|
s.authors = ['Keisuke Minami', 'Ivan Kuchin']
|
10
10
|
s.license = 'Ruby'
|
11
11
|
|
12
|
-
s.rubyforge_project = s.name
|
13
|
-
|
14
12
|
s.metadata = {
|
15
13
|
'bug_tracker_uri' => "https://github.com/toy/#{s.name}/issues",
|
16
14
|
'changelog_uri' => "https://github.com/toy/#{s.name}/blob/master/CHANGELOG.markdown",
|
@@ -24,7 +22,7 @@ Gem::Specification.new do |s|
|
|
24
22
|
s.require_paths = %w[lib]
|
25
23
|
|
26
24
|
s.add_development_dependency 'rspec', '~> 3.0'
|
27
|
-
if RUBY_VERSION >= '2.
|
28
|
-
s.add_development_dependency 'rubocop', '~> 0
|
25
|
+
if RUBY_VERSION >= '2.4'
|
26
|
+
s.add_development_dependency 'rubocop', '~> 1.0'
|
29
27
|
end
|
30
28
|
end
|
data/lib/image_size.rb
CHANGED
@@ -17,6 +17,7 @@ class ImageSize
|
|
17
17
|
|
18
18
|
class ImageReader # :nodoc:
|
19
19
|
attr_reader :data
|
20
|
+
|
20
21
|
def initialize(data_or_io)
|
21
22
|
@io = if data_or_io.is_a?(String)
|
22
23
|
StringIO.new(data_or_io)
|
@@ -84,28 +85,28 @@ class ImageSize
|
|
84
85
|
private
|
85
86
|
|
86
87
|
SVG_R = /<svg\b([^>]*)>/.freeze
|
88
|
+
XML_R = /<\?xml|<!--/.freeze
|
87
89
|
def detect_format(ir)
|
88
90
|
head = ir[0, 1024]
|
89
91
|
case
|
90
|
-
when head[0, 6] =~ /GIF8[79]a/
|
91
|
-
when head[0, 8] == "\211PNG\r\n\032\n"
|
92
|
-
when head[0, 8] == "\212MNG\r\n\032\n"
|
93
|
-
when head[0, 2] == "\377\330"
|
94
|
-
when head[0, 2] == 'BM'
|
95
|
-
when head[0,
|
96
|
-
when head =~ /\#define\s+\S+\s+\d+/
|
97
|
-
when head[0, 4]
|
98
|
-
when head
|
99
|
-
when head
|
100
|
-
when head[0,
|
101
|
-
when head[0,
|
102
|
-
when head[
|
103
|
-
|
104
|
-
|
105
|
-
when head[0,
|
106
|
-
when head[0, 12]
|
107
|
-
when head[0, 4] == "\
|
108
|
-
when head[0, 4] == "\000\000\002\000" then :cur
|
92
|
+
when head[0, 6] =~ /GIF8[79]a/ then :gif
|
93
|
+
when head[0, 8] == "\211PNG\r\n\032\n" then detect_png_type(ir)
|
94
|
+
when head[0, 8] == "\212MNG\r\n\032\n" then :mng
|
95
|
+
when head[0, 2] == "\377\330" then :jpeg
|
96
|
+
when head[0, 2] == 'BM' then :bmp
|
97
|
+
when head[0, 3] =~ /P[1-6]\s|P7\n/ then detect_pnm_type(ir)
|
98
|
+
when head =~ /\#define\s+\S+\s+\d+/ then :xbm
|
99
|
+
when %W[II*\0 MM\0*].include?(head[0, 4]) then :tiff
|
100
|
+
when head =~ %r{/\* XPM \*/} then :xpm
|
101
|
+
when head[0, 4] == '8BPS' then :psd
|
102
|
+
when head[0, 3] =~ /[FC]WS/ then :swf
|
103
|
+
when head =~ SVG_R || (head =~ XML_R && ir[0, 4096][SVG_R]) then :svg
|
104
|
+
when head[0, 2] =~ /\n[\0-\5]/ then :pcx
|
105
|
+
when head[0, 12] =~ /RIFF(?m:....)WEBP/ then :webp
|
106
|
+
when head[0, 4] == "\0\0\1\0" then :ico
|
107
|
+
when head[0, 4] == "\0\0\2\0" then :cur
|
108
|
+
when head[0, 12] == "\0\0\0\fjP \r\n\207\n" then detect_jpeg2000_type(ir)
|
109
|
+
when head[0, 4] == "\377O\377Q" then :j2c
|
109
110
|
end
|
110
111
|
end
|
111
112
|
|
@@ -122,6 +123,26 @@ private
|
|
122
123
|
:png
|
123
124
|
end
|
124
125
|
|
126
|
+
def detect_pnm_type(ir)
|
127
|
+
case ir[0, 2]
|
128
|
+
when 'P1', 'P4' then :pbm
|
129
|
+
when 'P2', 'P5' then :pgm
|
130
|
+
when 'P3', 'P6' then :ppm
|
131
|
+
when 'P7' then :pam
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def detect_jpeg2000_type(ir)
|
136
|
+
return unless ir[16, 4] == 'ftyp'
|
137
|
+
|
138
|
+
# using xl-box would be weird, but doesn't seem to contradict specification
|
139
|
+
skip = ir[12, 4] == "\0\0\0\1" ? 16 : 8
|
140
|
+
case ir[12 + skip, 4]
|
141
|
+
when 'jp2 ' then :jp2
|
142
|
+
when 'jpx ' then :jpx
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
125
146
|
def size_of_gif(ir)
|
126
147
|
ir[6, 4].unpack('vv')
|
127
148
|
end
|
@@ -143,11 +164,11 @@ private
|
|
143
164
|
end
|
144
165
|
alias_method :size_of_apng, :size_of_png
|
145
166
|
|
146
|
-
JPEG_CODE_CHECK =
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
167
|
+
JPEG_CODE_CHECK = [
|
168
|
+
0xC0, 0xC1, 0xC2, 0xC3,
|
169
|
+
0xC5, 0xC6, 0xC7,
|
170
|
+
0xC9, 0xCA, 0xCB,
|
171
|
+
0xCD, 0xCE, 0xCF
|
151
172
|
].freeze
|
152
173
|
def size_of_jpeg(ir)
|
153
174
|
section_marker = "\xFF"
|
@@ -157,7 +178,7 @@ private
|
|
157
178
|
offset += 1 until section_marker != ir[offset + 1, 1]
|
158
179
|
raise FormatError, 'EOF in JPEG' if ir[offset, 1].nil?
|
159
180
|
|
160
|
-
_marker, code, length = ir[offset, 4].unpack('
|
181
|
+
_marker, code, length = ir[offset, 4].unpack('aCn')
|
161
182
|
offset += 4
|
162
183
|
|
163
184
|
if JPEG_CODE_CHECK.include?(code)
|
@@ -187,12 +208,38 @@ private
|
|
187
208
|
header = ir[0, 1024]
|
188
209
|
header.gsub!(/^\#[^\n\r]*/m, '')
|
189
210
|
header =~ /^(P[1-6])\s+?(\d+)\s+?(\d+)/m
|
190
|
-
case $1
|
191
|
-
when 'P1', 'P4' then @format = :pbm
|
192
|
-
when 'P2', 'P5' then @format = :pgm
|
193
|
-
end
|
194
211
|
[$2.to_i, $3.to_i]
|
195
212
|
end
|
213
|
+
alias_method :size_of_pbm, :size_of_ppm
|
214
|
+
alias_method :size_of_pgm, :size_of_ppm
|
215
|
+
|
216
|
+
def size_of_pam(ir)
|
217
|
+
width = height = nil
|
218
|
+
offset = 3
|
219
|
+
loop do
|
220
|
+
if ir[offset, 1] == '#'
|
221
|
+
offset += 1 until ["\n", '', nil].include?(ir[offset, 1])
|
222
|
+
offset += 1
|
223
|
+
else
|
224
|
+
chunk = ir[offset, 32]
|
225
|
+
case chunk
|
226
|
+
when /\AWIDTH (\d+)\n/
|
227
|
+
width = $1.to_i
|
228
|
+
when /\AHEIGHT (\d+)\n/
|
229
|
+
height = $1.to_i
|
230
|
+
when /\AENDHDR\n/
|
231
|
+
break
|
232
|
+
when /\A(?:DEPTH|MAXVAL) \d+\n/, /\ATUPLTYPE \S+\n/
|
233
|
+
# ignore
|
234
|
+
else
|
235
|
+
raise FormatError, "Unexpected data in PAM header: #{chunk.inspect}"
|
236
|
+
end
|
237
|
+
offset += $&.length
|
238
|
+
break if width && height
|
239
|
+
end
|
240
|
+
end
|
241
|
+
[width, height]
|
242
|
+
end
|
196
243
|
|
197
244
|
def size_of_xbm(ir)
|
198
245
|
ir[0, 1024] =~ /^\#define\s*\S*\s*(\d+)\s*\n\#define\s*\S*\s*(\d+)/mi
|
@@ -247,7 +294,7 @@ private
|
|
247
294
|
end
|
248
295
|
|
249
296
|
def size_of_pcx(ir)
|
250
|
-
parts = ir[4, 8].unpack('
|
297
|
+
parts = ir[4, 8].unpack('v4')
|
251
298
|
[parts[2] - parts[0] + 1, parts[3] - parts[1] + 1]
|
252
299
|
end
|
253
300
|
|
@@ -255,7 +302,7 @@ private
|
|
255
302
|
value_bit_length = ir[8, 1].unpack('B5').first.to_i(2)
|
256
303
|
bit_length = 5 + value_bit_length * 4
|
257
304
|
rect_bits = ir[8, bit_length / 8 + 1].unpack("B#{bit_length}").first
|
258
|
-
values = rect_bits.unpack(
|
305
|
+
values = rect_bits[5..-1].unpack("a#{value_bit_length}" * 4).map{ |bits| bits.to_i(2) }
|
259
306
|
x_min, x_max, y_min, y_max = values
|
260
307
|
[(x_max - x_min) / 20, (y_max - y_min) / 20]
|
261
308
|
end
|
@@ -299,4 +346,44 @@ private
|
|
299
346
|
[(w16 | w8 << 16) + 1, (h16 | h8 << 16) + 1]
|
300
347
|
end
|
301
348
|
end
|
349
|
+
|
350
|
+
def size_of_jp2(ir)
|
351
|
+
offset = 12
|
352
|
+
stop = nil
|
353
|
+
in_header = false
|
354
|
+
loop do
|
355
|
+
break if stop && offset >= stop
|
356
|
+
break if ir[offset, 4] == '' || ir[offset, 4].nil?
|
357
|
+
|
358
|
+
size = ir[offset, 4].unpack('N')[0]
|
359
|
+
type = ir[offset + 4, 4]
|
360
|
+
|
361
|
+
data_offset = 8
|
362
|
+
case size
|
363
|
+
when 1
|
364
|
+
size = ir[offset, 8].unpack('Q>')[0]
|
365
|
+
data_offset = 16
|
366
|
+
raise FormatError, "Unexpected xl-box size #{size}" if (1..15).include?(size)
|
367
|
+
when 2..7
|
368
|
+
raise FormatError, "Reserved box size #{size}"
|
369
|
+
end
|
370
|
+
|
371
|
+
if type == 'jp2h'
|
372
|
+
stop = offset + size unless size.zero?
|
373
|
+
offset += data_offset
|
374
|
+
in_header = true
|
375
|
+
elsif in_header && type == 'ihdr'
|
376
|
+
return ir[offset + data_offset, 8].unpack('NN').reverse
|
377
|
+
else
|
378
|
+
break if size.zero? # box to the end of file
|
379
|
+
|
380
|
+
offset += size
|
381
|
+
end
|
382
|
+
end
|
383
|
+
end
|
384
|
+
alias_method :size_of_jpx, :size_of_jp2
|
385
|
+
|
386
|
+
def size_of_j2c(ir)
|
387
|
+
ir[8, 8].unpack('NN')
|
388
|
+
end
|
302
389
|
end
|
data/spec/image_size_spec.rb
CHANGED
@@ -5,7 +5,12 @@ require 'image_size'
|
|
5
5
|
require 'tempfile'
|
6
6
|
|
7
7
|
describe ImageSize do
|
8
|
+
max_filesize = 16_384
|
9
|
+
|
8
10
|
(Dir['spec/images/*/*.*'] + [__FILE__]).each do |path|
|
11
|
+
filesize = File.size(path)
|
12
|
+
warn "#{path} is too big #{filesize} (max #{max_filesize})" if filesize > max_filesize
|
13
|
+
|
9
14
|
describe "for #{path}" do
|
10
15
|
let(:name){ File.basename(path) }
|
11
16
|
let(:attributes) do
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
File without changes
|
@@ -0,0 +1,8 @@
|
|
1
|
+
P7
|
2
|
+
WIDTH 22
|
3
|
+
HEIGHT 25
|
4
|
+
DEPTH 3
|
5
|
+
MAXVAL 255
|
6
|
+
TUPLTYPE RGB
|
7
|
+
ENDHDR
|
8
|
+
JMRGJONQVKNSRVZY^b{��|��osyz����Ǎ��v|�������UY_ORT�^_�ts�_b`FH�`aDGLHJPJMQfjnflplqu}�����u{�������nsw[`d]bgqv}aej>AFLLO�`c�ro�bdxORlsvZ_ccknS[^imrwz��������������ɑ��UY]���u{~��glosz~X^b�_^�li�lk���dimORWORWRUZY\a������������������UW\������]`ehmqOPU>AHfOR�lj�kjv}�KNSKOREILEIMTX[LQUAEJHJOZ]a_di���muz������=<BSUZrv|���}pt�jh�liPWZGJOIMPEILDHK=AE`eiuz~������}��������������XZ_MMR[^e�������ed�heHKPPSWFKNAFIMRV`hk���������nuxW\`V[_CHLu|����[^dBBGDHMBEJomr�hf�geJMSZ\aDILekn������dimPUYMNSBBGCDIFGLDEJ]`f���chlDGLT\^EMQ]MQ�ji�ecoehXadJMR���Y]a_afcdjORWKNTMTYJNRFFICCG]`d���z�==BFGLAEK�VX�ki�ec�nrLQWNSZdjmkqtBBHABGPX]^ltScgIMPCDHJJNQTX�����JKPPSX_^d�__�jf�ca�st�_bjX[jsw���^eh=@EIPUQX^RW\UY]JNR@AEegn���v{FFLmuy�]_�ec�gd�ca�zx�zx�po�cg~����y��YZ^CEIEGKSUZejnMRUZ]b���osxADIm[_�_`�ca�ec�db�st�|}�zy�vt�gh�ot�����Ϣ��ehlEGLX]`PRVX[_���dek7<@�RT�b_�a_�`^�ca�ux�{~�|z�yv�{w�rp�ii�����������ntwDDIgjn���`cjSSW�^^�gd�b`�`^�b`�yv�wx�xu�|x�yu�vs�vs�oo�ii�km������FHMimq���QX_x`d�fe�fb�da�b`�ca�wu�rp�vt�us�tr�vs�ts�sr�po�uv�ml�x|V[_gin���OU[�Z\�fc�ea�db�ca�b`�zx�tq�vt�us�wt�vs�wt�sq�rr�st�sq�giTX\SVZ���fbg�ce�eb�ca�ec�db�ec�yu�ur�sq�sr�vs�xu�xs�tq�xt�ws�xt�ihKMRchm���]NP�ge�eb�ca�db�ec�fd�zv�sq�rq�sr�rp�xu�so�rp�tq�qn�uq�bcHIN\bgo|�wQU�jh�fd�ca�b`�ca�ec�zy�xt�tr�vs�sr�sr�tq�sp�rp�kj�mk�^^HLPLOTfqv�UV�jf�ec�db�b`�cb�ca�ss�{w�us�tr�ur�wt�tq�qo�ro�lj�on�ZZ=BFNNTRZ_�YY�ie�db�db�`_�_^�`_�ij�~|�vs�ur�sq�pn�qo�ol�ji�mj�qn�Z]CFL]_dLIN�aa�fb�ca�cb�a`�__�]^x_^�{x�ws�wt�sp�pn�po�lknZ^�lk�pmxXYDINkrwkUX�mj�db�fdX[�Y\�`_�]]�gi�vs�us�xu�tr�nk�lj�nk�jj�mk�kjlPR?CGGIP�bb�pm�fd�da�Y\�]]�b_�`_�ru�ml�ur�wu�tr�pk�lg�oi�oj�pl�kiaMO;@EPGI�kj�he�fd�fc�b`�a^�b`�_^
|
Binary file
|
@@ -0,0 +1,4 @@
|
|
1
|
+
P5
|
2
|
+
22 25
|
3
|
+
255
|
4
|
+
MJQNU]��sÑ{��YRh�mLmGJMikp��z��r_aueALi�rXr^jZmz����ŗX�z�ky]k��hRRU\������W��`lPAT~|NNHHWPEJ]c�t��=Uv�s|VJLHG@dy�������ZM^��v|KSJEQg���t[ZG{�^BHEnx{M\Hj��hTNBDGE`�gGZLQ}yg_M�\adRNSMFC`�~=GE_yzPRipBBWj`LDJT��KS_n~w�i\q�d@OWVXMAg�zFtgz{w���j��ZEGUiQ]�sD_rwyx|���ss�ͩhG\R[�e;]wutw������u����sDj�cSm{vtv��������{w��Hl�We{zxvw����������~{Zi�Te{yxwv�����������qWV�ctywyxy�����������rMg�Qzywxyz�����������lIazY~zwvwy���������~�gKOo_yxvww~���������cANYe~xxutup�������w�cF_Jq{wxvtsd������x_�_HqZ�xzahvrm�����{�~VBIl�zweowu{{�������~Q?I||zzwuvt
|
@@ -0,0 +1,4 @@
|
|
1
|
+
P6
|
2
|
+
22 25
|
3
|
+
255
|
4
|
+
JMRGJONQVKNSRVZY^b{��|��osyz����Ǎ��v|�������UY_ORT�^_�ts�_b`FH�`aDGLHJPJMQfjnflplqu}�����u{�������nsw[`d]bgqv}aej>AFLLO�`c�ro�bdxORlsvZ_ccknS[^imrwz��������������ɑ��UY]���u{~��glosz~X^b�_^�li�lk���dimORWORWRUZY\a������������������UW\������]`ehmqOPU>AHfOR�lj�kjv}�KNSKOREILEIMTX[LQUAEJHJOZ]a_di���muz������=<BSUZrv|���}pt�jh�liPWZGJOIMPEILDHK=AE`eiuz~������}��������������XZ_MMR[^e�������ed�heHKPPSWFKNAFIMRV`hk���������nuxW\`V[_CHLu|����[^dBBGDHMBEJomr�hf�geJMSZ\aDILekn������dimPUYMNSBBGCDIFGLDEJ]`f���chlDGLT\^EMQ]MQ�ji�ecoehXadJMR���Y]a_afcdjORWKNTMTYJNRFFICCG]`d���z�==BFGLAEK�VX�ki�ec�nrLQWNSZdjmkqtBBHABGPX]^ltScgIMPCDHJJNQTX�����JKPPSX_^d�__�jf�ca�st�_bjX[jsw���^eh=@EIPUQX^RW\UY]JNR@AEegn���v{FFLmuy�]_�ec�gd�ca�zx�zx�po�cg~����y��YZ^CEIEGKSUZejnMRUZ]b���osxADIm[_�_`�ca�ec�db�st�|}�zy�vt�gh�ot�����Ϣ��ehlEGLX]`PRVX[_���dek7<@�RT�b_�a_�`^�ca�ux�{~�|z�yv�{w�rp�ii�����������ntwDDIgjn���`cjSSW�^^�gd�b`�`^�b`�yv�wx�xu�|x�yu�vs�vs�oo�ii�km������FHMimq���QX_x`d�fe�fb�da�b`�ca�wu�rp�vt�us�tr�vs�ts�sr�po�uv�ml�x|V[_gin���OU[�Z\�fc�ea�db�ca�b`�zx�tq�vt�us�wt�vs�wt�sq�rr�st�sq�giTX\SVZ���fbg�ce�eb�ca�ec�db�ec�yu�ur�sq�sr�vs�xu�xs�tq�xt�ws�xt�ihKMRchm���]NP�ge�eb�ca�db�ec�fd�zv�sq�rq�sr�rp�xu�so�rp�tq�qn�uq�bcHIN\bgo|�wQU�jh�fd�ca�b`�ca�ec�zy�xt�tr�vs�sr�sr�tq�sp�rp�kj�mk�^^HLPLOTfqv�UV�jf�ec�db�b`�cb�ca�ss�{w�us�tr�ur�wt�tq�qo�ro�lj�on�ZZ=BFNNTRZ_�YY�ie�db�db�`_�_^�`_�ij�~|�vs�ur�sq�pn�qo�ol�ji�mj�qn�Z]CFL]_dLIN�aa�fb�ca�cb�a`�__�]^x_^�{x�ws�wt�sp�pn�po�lknZ^�lk�pmxXYDINkrwkUX�mj�db�fdX[�Y\�`_�]]�gi�vs�us�xu�tr�nk�lj�nk�jj�mk�kjlPR?CGGIP�bb�pm�fd�da�Y\�]]�b_�`_�ru�ml�ur�wu�tr�pk�lg�oi�oj�pl�kiaMO;@EPGI�kj�he�fd�fc�b`�a^�b`�_^
|
@@ -0,0 +1,27 @@
|
|
1
|
+
P1
|
2
|
+
22 25
|
3
|
+
1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 1 1 1 1 1 1 1
|
4
|
+
1 1 1 1 1 1 0 0 1 0 0 0 0 1 0 1 1 1 1 1 1 1
|
5
|
+
1 1 1 1 1 1 0 0 0 0 0 0 1 0 1 0 1 1 1 1 1 0
|
6
|
+
1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 1 1 1 1 1 0 1
|
7
|
+
1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1 1 1 1 0
|
8
|
+
1 1 1 1 1 1 1 1 0 0 1 1 0 0 0 1 1 1 0 0 1 1
|
9
|
+
1 1 1 1 1 1 0 0 0 1 1 1 1 0 0 1 1 1 1 1 0 1
|
10
|
+
1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0
|
11
|
+
1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
|
12
|
+
1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
|
13
|
+
1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 0 0 0
|
14
|
+
0 1 0 1 1 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 1
|
15
|
+
1 0 0 0 1 1 0 0 0 1 1 1 1 1 0 1 1 1 1 1 0 1
|
16
|
+
0 0 1 0 0 0 1 0 0 0 1 1 1 1 0 1 1 1 1 1 1 1
|
17
|
+
0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1 1 0 1 1 0
|
18
|
+
0 0 1 0 1 0 0 0 1 0 1 1 1 1 0 1 1 0 1 0 1 1
|
19
|
+
1 0 0 1 0 1 0 0 1 0 0 1 1 1 0 1 1 1 0 1 1 0
|
20
|
+
0 0 0 0 0 0 0 1 0 0 0 1 1 1 1 1 1 0 1 0 0 1
|
21
|
+
1 0 1 1 0 1 0 1 0 1 0 1 1 1 1 1 0 1 1 1 0 1
|
22
|
+
0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 0 1 1 1
|
23
|
+
1 0 0 1 1 0 1 0 0 1 0 1 1 1 1 1 1 0 0 1 1 1
|
24
|
+
1 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1
|
25
|
+
1 0 0 0 0 1 0 1 1 0 1 1 1 1 1 0 1 0 1 1 1 1
|
26
|
+
1 0 1 0 0 0 1 0 1 1 1 1 1 1 1 1 0 1 1 1 0 0
|
27
|
+
1 0 0 1 0 0 1 0 1 0 1 1 1 1 1 1 1 1 0 1 1 0
|
@@ -0,0 +1,28 @@
|
|
1
|
+
P2
|
2
|
+
22 25
|
3
|
+
255
|
4
|
+
77 74 81 78 85 93 129 129 115 127 195 145 123 169 147 89 82 104 135 109 76 109
|
5
|
+
71 74 77 105 107 112 132 169 122 151 204 114 95 97 117 101 65 76 105 133 114 88
|
6
|
+
114 94 106 90 109 122 165 164 178 187 197 151 88 134 122 130 107 121 93 107 128 127
|
7
|
+
158 104 82 82 85 92 144 155 154 180 157 183 87 182 145 96 108 80 65 84 127 126
|
8
|
+
124 78 78 72 72 87 80 69 74 93 99 157 116 160 139 61 85 118 141 115 124 127
|
9
|
+
86 74 76 72 71 64 100 121 139 170 132 142 154 182 160 90 77 94 142 145 118 124
|
10
|
+
75 83 74 69 81 103 137 170 158 116 91 90 71 123 173 94 66 72 69 110 120 123
|
11
|
+
77 92 72 106 138 140 104 84 78 66 68 71 69 96 161 103 71 90 76 81 125 121
|
12
|
+
103 95 77 134 92 97 100 82 78 83 77 70 67 96 185 126 61 71 69 95 127 121
|
13
|
+
122 80 82 105 112 66 66 87 106 96 76 68 74 84 180 130 75 83 95 110 126 119
|
14
|
+
131 105 92 113 140 100 64 79 87 86 88 77 65 103 189 122 70 116 103 122 123 119
|
15
|
+
138 138 128 106 127 158 128 90 69 71 85 105 81 93 191 115 68 95 114 119 121 120
|
16
|
+
124 142 140 137 115 115 168 205 169 104 71 92 82 91 185 101 59 93 119 117 116 119
|
17
|
+
131 140 140 138 140 131 117 132 146 166 148 115 68 106 192 99 83 109 123 118 116 118
|
18
|
+
138 137 137 140 138 135 136 129 123 119 138 140 72 108 178 87 101 123 122 120 118 119
|
19
|
+
136 132 136 135 134 135 134 134 128 133 126 123 90 105 177 84 101 123 121 120 119 118
|
20
|
+
138 134 136 135 136 135 136 133 131 132 134 113 87 86 163 99 116 121 119 121 120 121
|
21
|
+
137 134 133 133 135 137 137 134 137 136 138 114 77 103 147 81 122 121 119 120 121 122
|
22
|
+
139 133 132 132 129 137 132 132 134 131 135 108 73 97 122 89 126 122 119 118 119 121
|
23
|
+
137 137 134 135 133 133 134 133 132 126 129 103 75 79 111 95 127 121 120 118 119 119
|
24
|
+
126 140 135 134 134 136 134 131 133 127 131 99 65 78 89 101 126 120 120 117 116 117
|
25
|
+
112 143 135 134 133 130 132 129 119 127 133 99 70 95 74 113 123 119 120 118 116 115
|
26
|
+
100 139 136 136 133 131 132 120 95 127 132 95 72 113 90 128 120 122 97 104 118 114
|
27
|
+
109 133 135 137 134 128 127 127 123 128 126 86 66 73 108 131 122 119 101 111 119 117
|
28
|
+
123 123 135 136 134 130 127 129 129 130 126 81 63 73 124 124 122 122 119 117 118 116
|