[roll] Update third-party dart packages
Updated:
Change-Id: Ifb65f1bb7f5338d1b7b5f82a0a75383ec2a0d740
diff --git a/image/BUILD.gn b/image/BUILD.gn
index fc13501..e41201b 100644
--- a/image/BUILD.gn
+++ b/image/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for image-2.0.8
+# This file is generated by importer.py for image-2.0.9
import("//build/dart/dart_library.gni")
diff --git a/image/CHANGELOG.md b/image/CHANGELOG.md
index 9ed3af9..1c6fcc4 100755
--- a/image/CHANGELOG.md
+++ b/image/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 2.0.9 - May 10, 2019
+
+- Use strict dartanalysys settings and clean up code.
+
## 2.0.8 - May 8, 2019
- Add ability to quantize an image to any number of colors.
diff --git a/image/analysis_options.yaml b/image/analysis_options.yaml
index 0ecbeea..2ac3347 100755
--- a/image/analysis_options.yaml
+++ b/image/analysis_options.yaml
@@ -1 +1,10 @@
+include: package:pedantic/analysis_options.yaml
+
+linter:
+ rules:
+ - camel_case_types
+
analyzer:
+ strong-mode:
+ implicit-casts: false
+ implicit-dynamic: false
diff --git a/image/example/image_isolate.dart b/image/example/image_isolate.dart
index 8070694..e899166 100755
--- a/image/example/image_isolate.dart
+++ b/image/example/image_isolate.dart
@@ -27,7 +27,7 @@
new DecodeParam(new File('test.webp'), receivePort.sendPort));
// Get the processed image from the isolate.
- Image image = await receivePort.first;
+ Image image = await receivePort.first as Image;
new File('thumbnail.png').writeAsBytesSync(encodePng(image));
}
diff --git a/image/lib/image.dart b/image/lib/image.dart
index b8ccc4f..b564728 100755
--- a/image/lib/image.dart
+++ b/image/lib/image.dart
@@ -1,7 +1,5 @@
-/**
- * The image library aims to provide server-side programs the ability to load,
- * manipulate, and save various image file formats.
- */
+/// The image library aims to provide server-side programs the ability to load,
+/// manipulate, and save various image file formats.
library image;
export 'src/draw/draw_char.dart';
@@ -52,7 +50,8 @@
export 'src/formats/exr/exr_image.dart';
export 'src/formats/exr/exr_part.dart' hide InternalExrPart;
export 'src/formats/exr/exr_piz_compressor.dart' hide InternalExrPizCompressor;
-export 'src/formats/exr/exr_pxr24_compressor.dart' hide InternalExrPxr24Compressor;
+export 'src/formats/exr/exr_pxr24_compressor.dart'
+ hide InternalExrPxr24Compressor;
export 'src/formats/exr/exr_rle_compressor.dart' hide InternalExrRleCompressor;
export 'src/formats/exr/exr_wavelet.dart';
export 'src/formats/exr/exr_zip_compressor.dart' hide InternalExrZipCompressor;
@@ -141,6 +140,7 @@
export 'src/transform/copy_into.dart';
export 'src/transform/copy_rectify.dart';
export 'src/transform/copy_resize.dart';
+export 'src/transform/copy_resize_crop_square.dart';
export 'src/transform/copy_rotate.dart';
export 'src/transform/flip.dart';
export 'src/transform/trim.dart';
diff --git a/image/lib/src/animation.dart b/image/lib/src/animation.dart
index 05a51ed..091d459 100755
--- a/image/lib/src/animation.dart
+++ b/image/lib/src/animation.dart
@@ -2,98 +2,84 @@
import 'image.dart';
-/**
- * Stores multiple images, most often as the frames of an animation.
- *
- * Some formats, such as [TiffDecoder], support multiple images that are not
- * to be interpreted as animation, but rather multiple pages of a document.
- * The [Animation] container is still used to store the images for these files.
- * The [frameType] property is used to differentiate multi-page documents from
- * multi-frame animations, where it is set to [PAGE] for documents and
- * [ANIMATION] for animated frames.
- *
- * All [Decoder] classes support decoding to an [Animation], where the
- * [Animation] will only contain a single frame for single image formats
- * such as JPEG, or if the file doesn't contain any animation such as a single
- * image GIF. If you want to generically support both animated and non-animated
- * files, you can always decode to an animation and if the animation has only
- * a single frame, then it's a non-animated image.
- *
- * In some cases, the frames of the animation may only provide a portion of the
- * canvas, such as the case of animations encoding only the changing pixels
- * from one frame to the next. The [width] and [height] and [backgroundColor]
- * properties of the [Animation] provide information about the canvas that
- * contains the animation, and the [Image] frames provide information about
- * how to draw the particular frame, such as the area of the canvas to draw
- * into, and if the canvas should be cleared prior to drawing the frame.
- */
+/// Stores multiple images, most often as the frames of an animation.
+///
+/// Some formats, such as [TiffDecoder], support multiple images that are not
+/// to be interpreted as animation, but rather multiple pages of a document.
+/// The [Animation] container is still used to store the images for these files.
+/// The [frameType] property is used to differentiate multi-page documents from
+/// multi-frame animations, where it is set to [PAGE] for documents and
+/// [ANIMATION] for animated frames.
+///
+/// All [Decoder] classes support decoding to an [Animation], where the
+/// [Animation] will only contain a single frame for single image formats
+/// such as JPEG, or if the file doesn't contain any animation such as a single
+/// image GIF. If you want to generically support both animated and non-animated
+/// files, you can always decode to an animation and if the animation has only
+/// a single frame, then it's a non-animated image.
+///
+/// In some cases, the frames of the animation may only provide a portion of the
+/// canvas, such as the case of animations encoding only the changing pixels
+/// from one frame to the next. The [width] and [height] and [backgroundColor]
+/// properties of the [Animation] provide information about the canvas that
+/// contains the animation, and the [Image] frames provide information about
+/// how to draw the particular frame, such as the area of the canvas to draw
+/// into, and if the canvas should be cleared prior to drawing the frame.
class Animation extends IterableBase<Image> {
/// The frames of this document are to be interpreted as animation.
static const int ANIMATION = 0;
+
/// The frames of this document are to be interpreted as pages of a document.
static const int PAGE = 1;
/// The canvas width for containing the animation.
int width;
+
/// The canvas height for containing the animation.
int height;
+
/// The suggested background color to clear the canvas with.
int backgroundColor = 0xffffffff;
+
/// The frames of the animation.
List<Image> frames = [];
+
/// How many times should the animation loop (0 means forever)?
int loopCount = 0;
+
/// How should the frames be interpreted? If [ANIMATION], the frames
/// are part of an animated sequence. If [PAGE], the frames are the pages
/// of a document.
int frameType = ANIMATION;
- /**
- * How many frames are in the animation?
- */
+ /// How many frames are in the animation?
int get numFrames => frames.length;
- /**
- * How many frames are in the animation?
- */
+ /// How many frames are in the animation?
int get length => frames.length;
- /**
- * Get the frame at the given [index].
- */
- Image operator[](int index) => frames[index];
+ /// Get the frame at the given [index].
+ Image operator [](int index) => frames[index];
- /**
- * Add a frame to the animation.
- */
+ /// Add a frame to the animation.
void addFrame(Image image) {
frames.add(image);
}
- /**
- * The first frame of the animation.
- */
+ /// The first frame of the animation.
Image get first => frames.first;
- /**
- * The last frame of the animation.
- */
+ /// The last frame of the animation.
Image get last => frames.last;
- /**
- * Is the animation empty (no frames)?
- */
+ /// Is the animation empty (no frames)?
bool get isEmpty => frames.isEmpty;
- /**
- * Returns true if there is at least one frame in the animation.
- */
+ /// Returns true if there is at least one frame in the animation.
bool get isNotEmpty => frames.isNotEmpty;
- /**
- * Get the iterator for looping over the animation. This allows the
- * Animation to be used in for-each loops:
- * for (AnimationFrame frame in animation) { ... }
- */
+ /// Get the iterator for looping over the animation. This allows the
+ /// Animation to be used in for-each loops:
+ /// for (AnimationFrame frame in animation) { ... }
Iterator<Image> get iterator => frames.iterator;
}
diff --git a/image/lib/src/bitmap_font.dart b/image/lib/src/bitmap_font.dart
index 4360e83..e7e85a3 100755
--- a/image/lib/src/bitmap_font.dart
+++ b/image/lib/src/bitmap_font.dart
@@ -1,31 +1,22 @@
import 'package:archive/archive.dart';
-import 'package:xml/xml.dart' as XML;
+import 'package:xml/xml.dart';
import 'image.dart';
import 'image_exception.dart';
import 'formats/png_decoder.dart';
-/**
- * Decode a [BitmapFont] from the contents of a zip file that stores the
- * .fnt font definition and associated PNG images.
- */
-BitmapFont readFontZip(List<int> bytes) =>
- new BitmapFont.fromZip(bytes);
+/// Decode a [BitmapFont] from the contents of a zip file that stores the
+/// .fnt font definition and associated PNG images.
+BitmapFont readFontZip(List<int> bytes) => new BitmapFont.fromZip(bytes);
-
-/**
- * Decode a [BitmapFont] from the contents of [font] definition (.fnt) file,
- * and an [Image] that stores the font [map].
- */
+/// Decode a [BitmapFont] from the contents of [font] definition (.fnt) file,
+/// and an [Image] that stores the font [map].
BitmapFont readFont(String font, Image map) =>
new BitmapFont.fromFnt(font, map);
-
-/**
- * A bitmap font that can be used with [drawString] and [drawChar] functions.
- * You can generate a font files from a program
- * like: http://kvazars.com/littera
- */
+/// A bitmap font that can be used with [drawString] and [drawChar] functions.
+/// You can generate a font files from a program
+/// like: http://kvazars.com/littera
class BitmapFont {
String face = '';
int size = 0;
@@ -49,31 +40,28 @@
Map<int, BitmapFontCharacter> characters = {};
Map<int, Map<int, int>> kernings = {};
- /**
- * Decode a [BitmapFont] from the contents of [font] definition (.fnt) file,
- * and an [Image] that stores the font [map].
- */
+ /// Decode a [BitmapFont] from the contents of [font] definition (.fnt) file,
+ /// and an [Image] that stores the font [map].
BitmapFont.fromFnt(String fnt, Image page) {
- Map<int, Image> fontPages = { 0: page };
+ Map<int, Image> fontPages = {0: page};
- XML.XmlDocument xml;
+ XmlDocument doc;
if (fnt.startsWith('<font>')) {
- xml = XML.parse(fnt);
- if (xml == null) {
+ doc = parse(fnt);
+ if (doc == null) {
throw new ImageException('Invalid font XML');
}
} else {
- xml = _parseTextFnt(fnt);
+ doc = _parseTextFnt(fnt);
}
- _parseFnt(xml, fontPages);
+ _parseFnt(doc, fontPages);
}
- /**
- * Decode a [BitmapFont] from the contents of a zip file that stores the
- * .fnt font definition and associated PNG images.
- */
+ /// Decode a [BitmapFont] from the contents of a zip file that stores the
+ /// .fnt font definition and associated PNG images.
+ ///
BitmapFont.fromZip(List<int> fileData) {
Archive arc = ZipDecoder().decodeBytes(fileData);
@@ -89,11 +77,11 @@
throw new ImageException('Invalid font archive');
}
- String font_str = String.fromCharCodes(font_file.content);
- XML.XmlDocument xml;
+ String font_str = String.fromCharCodes(font_file.content as List<int>);
+ XmlDocument xml;
if (font_str.startsWith('<font>')) {
- xml = XML.parse(font_str);
+ xml = parse(font_str);
if (xml == null) {
throw new ImageException('Invalid font XML');
}
@@ -104,10 +92,8 @@
_parseFnt(xml, {}, arc);
}
- /**
- * Get the amount the writer x position should advance after drawing the
- * character [ch].
- */
+ /// Get the amount the writer x position should advance after drawing the
+ /// character [ch].
int characterXAdvance(String ch) {
if (ch.isEmpty) {
return 0;
@@ -119,13 +105,12 @@
return characters[c].xadvance;
}
+ Iterable<XmlElement> _childElements(XmlNode n) => n.children
+ .where((c) => c is XmlElement)
+ .map((c) => c as XmlElement);
- Iterable<XML.XmlElement> _childElements(XML.XmlNode n) =>
- n.children.where((c) => c is XML.XmlElement).map((c) => c as XML.XmlElement);
-
-
- void _parseFnt(XML.XmlDocument xml, Map<int, Image> fontPages,
- [Archive arc]) {
+ void _parseFnt(XmlDocument xml, Map<int, Image> fontPages,
+ [Archive arc]) {
if (xml.children.length != 1) {
throw new ImageException('Invalid font XML');
}
@@ -135,7 +120,7 @@
for (var c in _childElements(font)) {
String name = c.name.toString();
if (name == 'info') {
- for (XML.XmlAttribute a in c.attributes) {
+ for (XmlAttribute a in c.attributes) {
switch (a.name.toString()) {
case 'face':
face = a.value;
@@ -184,7 +169,7 @@
}
}
} else if (name == 'common') {
- for (XML.XmlAttribute a in c.attributes) {
+ for (XmlAttribute a in c.attributes) {
switch (a.name.toString()) {
case 'lineHeight':
lineHeight = int.parse(a.value);
@@ -219,10 +204,10 @@
ArchiveFile imageFile = _findFile(arc, filename);
if (imageFile == null) {
throw new ImageException('Font zip missing font page image '
- '$filename');
+ '$filename');
}
- Image image = PngDecoder().decodeImage(imageFile.content);
+ Image image = PngDecoder().decodeImage(imageFile.content as List<int>);
fontPages[id] = image;
}
@@ -262,8 +247,8 @@
Image fontImage = fontPages[page];
- BitmapFontCharacter ch = BitmapFontCharacter(id, width, height,
- xoffset, yoffset, xadvance, page, chnl);
+ BitmapFontCharacter ch = BitmapFontCharacter(
+ id, width, height, xoffset, yoffset, xadvance, page, chnl);
characters[id] = ch;
@@ -281,13 +266,13 @@
}
}
- XML.XmlDocument _parseTextFnt(String content) {
- var children = <XML.XmlNode>[];
- var pageList = <XML.XmlNode>[];
- var charList = <XML.XmlNode>[];
- var kerningList = <XML.XmlNode>[];
- var charsAttrs;
- var kerningsAttrs;
+ XmlDocument _parseTextFnt(String content) {
+ var children = <XmlNode>[];
+ var pageList = <XmlNode>[];
+ var charList = <XmlNode>[];
+ var kerningList = <XmlNode>[];
+ List<XmlAttribute> charsAttrs;
+ List<XmlAttribute> kerningsAttrs;
List<String> lines = content.split('\n');
@@ -300,17 +285,17 @@
switch (tk[0]) {
case 'info':
var attrs = _parseParameters(tk);
- var info = XML.XmlElement(new XML.XmlName('info'), attrs, []);
+ var info = XmlElement(new XmlName('info'), attrs, []);
children.add(info);
break;
case 'common':
var attrs = _parseParameters(tk);
- var node = XML.XmlElement(new XML.XmlName('common'), attrs, []);
+ var node = XmlElement(new XmlName('common'), attrs, []);
children.add(node);
break;
case 'page':
var attrs = _parseParameters(tk);
- var page = XML.XmlElement(new XML.XmlName('page'), attrs, []);
+ var page = XmlElement(new XmlName('page'), attrs, []);
pageList.add(page);
break;
case 'chars':
@@ -318,7 +303,7 @@
break;
case 'char':
var attrs = _parseParameters(tk);
- var node = XML.XmlElement(new XML.XmlName('char'), attrs, []);
+ var node = XmlElement(new XmlName('char'), attrs, []);
charList.add(node);
break;
case 'kernings':
@@ -326,37 +311,36 @@
break;
case 'kerning':
var attrs = _parseParameters(tk);
- var node = XML.XmlElement(new XML.XmlName('kerning'), attrs, []);
+ var node = XmlElement(new XmlName('kerning'), attrs, []);
kerningList.add(node);
break;
}
}
if (charsAttrs != null || charList.isNotEmpty) {
- var node = XML.XmlElement(new XML.XmlName('chars'), charsAttrs,
- charList);
+ var node = XmlElement(new XmlName('chars'), charsAttrs, charList);
children.add(node);
}
if (kerningsAttrs != null || kerningList.isNotEmpty) {
- var node = XML.XmlElement(new XML.XmlName('kernings'), kerningsAttrs,
- kerningList);
+ var node = XmlElement(
+ new XmlName('kernings'), kerningsAttrs, kerningList);
children.add(node);
}
if (pageList.isNotEmpty) {
- var pages = XML.XmlElement(new XML.XmlName('pages'), [], pageList);
+ var pages = XmlElement(new XmlName('pages'), [], pageList);
children.add(pages);
}
- var xml = XML.XmlElement(new XML.XmlName('font'), [], children);
- var doc = XML.XmlDocument([xml]);
+ var xml = XmlElement(new XmlName('font'), [], children);
+ var doc = XmlDocument([xml]);
return doc;
}
- List<XML.XmlAttribute> _parseParameters(List<String> tk) {
- var params = <XML.XmlAttribute>[];
+ List<XmlAttribute> _parseParameters(List<String> tk) {
+ var params = <XmlAttribute>[];
for (int ti = 1; ti < tk.length; ++ti) {
if (tk[ti].isEmpty) {
continue;
@@ -369,7 +353,7 @@
// Remove all " characters
atk[1] = atk[1].replaceAll('"', '');
- var a = XML.XmlAttribute(new XML.XmlName(atk[0]), atk[1]);
+ var a = XmlAttribute(new XmlName(atk[0]), atk[1]);
params.add(a);
}
return params;
@@ -385,9 +369,7 @@
}
}
-/**
- * A single character in a [BitmapFont].
- */
+/// A single character in a [BitmapFont].
class BitmapFontCharacter {
final int id;
final int width;
@@ -399,17 +381,23 @@
final int channel;
final Image image;
- BitmapFontCharacter(this.id, int width, int height,
- this.xoffset, this.yoffset, this.xadvance, this.page,
- this.channel) :
- this.width = width,
- this.height = height,
- image = Image(width, height);
+ BitmapFontCharacter(this.id, int width, int height, this.xoffset,
+ this.yoffset, this.xadvance, this.page, this.channel)
+ : this.width = width,
+ this.height = height,
+ image = Image(width, height);
String toString() {
- Map x = {'id': id, 'width': width, 'height': height, 'xoffset': xoffset,
- 'yoffset': yoffset, 'xadvance': xadvance, 'page': page,
- 'channel': channel};
+ Map<String, int> x = {
+ 'id': id,
+ 'width': width,
+ 'height': height,
+ 'xoffset': xoffset,
+ 'yoffset': yoffset,
+ 'xadvance': xadvance,
+ 'page': page,
+ 'channel': channel
+ };
return 'Character $x';
}
}
diff --git a/image/lib/src/color.dart b/image/lib/src/color.dart
index 233daa1..981fd31 100755
--- a/image/lib/src/color.dart
+++ b/image/lib/src/color.dart
@@ -1,188 +1,141 @@
-import 'dart:math' as Math;
+import 'dart:math';
import 'image_exception.dart';
import 'internal/clamp.dart';
-/**
- * Image pixel colors are instantiated as an int object rather than an instance
- * of the Color class in order to reduce object allocations. Image pixels are
- * stored in 32-bit RGBA format (8 bits per channel). Internally in dart, this
- * will be stored in a "small integer" on 64-bit machines, or a
- * "medium integer" on 32-bit machines. In Javascript, this will be stored
- * in a 64-bit double.
- *
- * The Color class is used as a namespace for color operations, in an attempt
- * to create a cleaner API for color operations.
- */
+/// Image pixel colors are instantiated as an int object rather than an instance
+/// of the Color class in order to reduce object allocations. Image pixels are
+/// stored in 32-bit RGBA format (8 bits per channel). Internally in dart, this
+/// will be stored in a "small integer" on 64-bit machines, or a
+/// "medium integer" on 32-bit machines. In Javascript, this will be stored
+/// in a 64-bit double.
+///
+/// The Color class is used as a namespace for color operations, in an attempt
+/// to create a cleaner API for color operations.
class Color {
- /**
- * Create a color value from RGB values in the range [0, 255].
- */
+ /// Create a color value from RGB values in the range [0, 255].
static int fromRgb(int red, int green, int blue) {
return getColor(red, green, blue);
}
- /**
- * Create a color value from RGBA values in the range [0, 255].
- */
+ /// Create a color value from RGBA values in the range [0, 255].
static int fromRgba(int red, int green, int blue, int alpha) {
return getColor(red, green, blue, alpha);
}
- /**
- * Create a color value from HSL values in the range [0, 1].
- */
+ /// Create a color value from HSL values in the range [0, 1].
static int fromHsl(num hue, num saturation, num lightness) {
var rgb = hslToRGB(hue, saturation, lightness);
return getColor(rgb[0], rgb[1], rgb[2]);
}
- /**
- * Create a color value from HSV values in the range [0, 1].
- */
+ /// Create a color value from HSV values in the range [0, 1].
static int fromHsv(num hue, num saturation, num value) {
var rgb = hsvToRGB(hue, saturation, value);
return getColor(rgb[0], rgb[1], rgb[2]);
}
- /**
- * Create a color value from XYZ values.
- */
+ /// Create a color value from XYZ values.
static int fromXyz(num x, num y, num z) {
var rgb = xyzToRGB(x, y, z);
return getColor(rgb[0], rgb[1], rgb[2]);
}
- /**
- * Create a color value from CIE-L*ab values.
- */
+ /// Create a color value from CIE-L*ab values.
static int fromLab(num L, num a, num b) {
var rgb = labToRGB(L, a, b);
return getColor(rgb[0], rgb[1], rgb[2]);
}
- /**
- * Compare colors from a 3 or 4 dimensional color space
- */
- static double distance(List<double> c1, List<double> c2, bool compareAlpha) {
- double d1 = c1[0] - c2[0];
- double d2 = c1[1] - c2[1];
- double d3 = c1[2] - c2[2];
+ /// Compare colors from a 3 or 4 dimensional color space
+ static num distance(List<num> c1, List<num> c2, bool compareAlpha) {
+ num d1 = c1[0] - c2[0];
+ num d2 = c1[1] - c2[1];
+ num d3 = c1[2] - c2[2];
if (compareAlpha) {
- double dA = c1[3] - c2[3];
- return Math.sqrt(
- Math.max(d1*d1, (d1-dA)*(d1-dA)) +
- Math.max(d2*d2, (d2-dA)*(d2-dA)) +
- Math.max(d3*d3, (d3-dA)*(d3-dA))
- );
+ num dA = c1[3] - c2[3];
+ return sqrt(max(d1 * d1, (d1 - dA) * (d1 - dA)) +
+ max(d2 * d2, (d2 - dA) * (d2 - dA)) +
+ max(d3 * d3, (d3 - dA) * (d3 - dA)));
} else {
- return Math.sqrt(
- d1*d1 +
- d2*d2 +
- d3*d3);
+ return sqrt(d1 * d1 + d2 * d2 + d3 * d3);
}
}
}
-
/// Blue channel of a color.
const int BLUE = 0;
+
/// Green channel of a color.
const int GREEN = 1;
+
/// Red channel of a color.
const int RED = 2;
+
/// Alpha channel of a color.
const int ALPHA = 3;
+
/// Luminance of a color.
const int LUMINANCE = 4;
-/**
- * Get the color with the given [r], [g], [b], and [a] components.
- *
- * The channel order of a uint32 encoded color is RGBA, to be consistent
- * with the image data of a canvas html element.
- */
+/// Get the color with the given [r], [g], [b], and [a] components.
+///
+/// The channel order of a uint32 encoded color is RGBA, to be consistent
+/// with the image data of a canvas html element.
int getColor(int r, int g, int b, [int a = 255]) =>
(clamp255(a) << 24) |
(clamp255(r) << 16) |
(clamp255(g) << 8) |
(clamp255(b));
-/**
- * Get the [channel] from the [color].
- */
-int getChannel(int color, int channel) =>
- channel == RED ? getRed(color) :
- channel == GREEN ? getGreen(color) :
- channel == BLUE ? getBlue(color) :
- getAlpha(color);
+/// Get the [channel] from the [color].
+int getChannel(int color, int channel) => channel == RED
+ ? getRed(color)
+ : channel == GREEN
+ ? getGreen(color)
+ : channel == BLUE ? getBlue(color) : getAlpha(color);
-/**
- * Returns a new color, where the given [color]'s [channel] has been
- * replaced with the given [value].
- */
-int setChannel(int color, int channel, int value) =>
- channel == RED ? setRed(color, value) :
- channel == GREEN ? setGreen(color, value) :
- channel == BLUE ? setBlue(color, value) :
- setAlpha(color, value);
+/// Returns a new color, where the given [color]'s [channel] has been
+/// replaced with the given [value].
+int setChannel(int color, int channel, int value) => channel == RED
+ ? setRed(color, value)
+ : channel == GREEN
+ ? setGreen(color, value)
+ : channel == BLUE ? setBlue(color, value) : setAlpha(color, value);
-/**
- * Get the blue channel from the [color].
- */
-int getBlue(int color) =>
- (color) & 0xff;
+/// Get the blue channel from the [color].
+int getBlue(int color) => (color) & 0xff;
-/**
- * Returns a new color where the blue channel of [color] has been replaced
- * by [value].
- */
-int setBlue(int color, int value) =>
- (color & 0xffffff00) | (clamp255(value));
+/// Returns a new color where the blue channel of [color] has been replaced
+/// by [value].
+int setBlue(int color, int value) => (color & 0xffffff00) | (clamp255(value));
-/**
- * Get the green channel from the [color].
- */
-int getGreen(int color) =>
- (color >> 8) & 0xff;
+/// Get the green channel from the [color].
+int getGreen(int color) => (color >> 8) & 0xff;
-/**
- * Returns a new color where the green channel of [color] has been replaced
- * by [value].
- */
+/// Returns a new color where the green channel of [color] has been replaced
+/// by [value].
int setGreen(int color, int value) =>
(color & 0xffff00ff) | (clamp255(value) << 8);
-/**
- * Get the red channel from the [color].
- */
-int getRed(int color) =>
- (color >> 16) & 0xff;
+/// Get the red channel from the [color].
+int getRed(int color) => (color >> 16) & 0xff;
-/**
- * Returns a new color where the red channel of [color] has been replaced
- * by [value].
- */
+/// Returns a new color where the red channel of [color] has been replaced
+/// by [value].
int setRed(int color, int value) =>
(color & 0xff00ffff) | (clamp255(value) << 16);
-/**
- * Get the alpha channel from the [color].
- */
-int getAlpha(int color) =>
- (color >> 24) & 0xff;
+/// Get the alpha channel from the [color].
+int getAlpha(int color) => (color >> 24) & 0xff;
-/**
- * Returns a new color where the alpha channel of [color] has been replaced
- * by [value].
- */
+/// Returns a new color where the alpha channel of [color] has been replaced
+/// by [value].
int setAlpha(int color, int value) =>
(color & 0x00ffffff) | (clamp255(value) << 24);
-/**
- * Returns a new color of [src] alpha-blended onto [dst]. The opacity of [src]
- * is additionally scaled by [fraction] / 255.
- */
+/// Returns a new color of [src] alpha-blended onto [dst]. The opacity of [src]
+/// is additionally scaled by [fraction] / 255.
int alphaBlendColors(int dst, int src, [int fraction = 0xff]) {
double a = (getAlpha(src) / 255.0);
if (fraction != 0xff) {
@@ -202,9 +155,7 @@
return getColor(sr + dr, sg + dg, sb + db, sa + da);
}
-/**
- * Returns the luminance (grayscale) value of the [color].
- */
+/// Returns the luminance (grayscale) value of the [color].
int getLuminance(int color) {
int r = getRed(color);
int g = getGreen(color);
@@ -212,17 +163,13 @@
return (0.299 * r + 0.587 * g + 0.114 * b).round();
}
-/**
- * Returns the luminance (grayscale) value of the color.
- */
+/// Returns the luminance (grayscale) value of the color.
int getLuminanceRGB(int r, int g, int b) =>
- (0.299 * r + 0.587 * g + 0.114 * b).round();
+ (0.299 * r + 0.587 * g + 0.114 * b).round();
-/**
- * Convert an HSL color to RGB, where h is specified in normalized degrees
- * [0, 1] (where 1 is 360-degrees); s and l are in the range [0, 1].
- * Returns a list [r, g, b] with values in the range [0, 255].
- */
+/// Convert an HSL color to RGB, where h is specified in normalized degrees
+/// [0, 1] (where 1 is 360-degrees); s and l are in the range [0, 1].
+/// Returns a list [r, g, b] with values in the range [0, 255].
List<int> hslToRGB(num hue, num saturation, num lightness) {
if (saturation == 0) {
int gray = (lightness * 255.0).toInt();
@@ -243,14 +190,14 @@
return q;
}
if (t < 2.0 / 3.0) {
- return p + (q - p) * (2.0/3.0 - t) * 6.0;
+ return p + (q - p) * (2.0 / 3.0 - t) * 6.0;
}
return p;
}
var q = lightness < 0.5
- ? lightness * (1.0 + saturation)
- : lightness + saturation - lightness * saturation;
+ ? lightness * (1.0 + saturation)
+ : lightness + saturation - lightness * saturation;
var p = 2.0 * lightness - q;
var r = hue2rgb(p, q, hue + 1.0 / 3.0);
@@ -260,78 +207,85 @@
return [(r * 255.0).round(), (g * 255.0).round(), (b * 255.0).round()];
}
-/**
- * Convert an HSV color to RGB, where h is specified in normalized degrees
- * [0, 1] (where 1 is 360-degrees); s and l are in the range [0, 1].
- * Returns a list [r, g, b] with values in the range [0, 255].
- */
+/// Convert an HSV color to RGB, where h is specified in normalized degrees
+/// [0, 1] (where 1 is 360-degrees); s and l are in the range [0, 1].
+/// Returns a list [r, g, b] with values in the range [0, 255].
List<int> hsvToRGB(num hue, num saturation, num brightness) {
if (saturation == 0) {
var gray = (brightness * 255.0).round();
return [gray, gray, gray];
}
- double h = (hue - hue.floor()) * 6.0;
- double f = h - h.floor();
- double p = brightness * (1.0 - saturation);
- double q = brightness * (1.0 - saturation * f);
- double t = brightness * (1.0 - (saturation * (1.0 - f)));
+ num h = (hue - hue.floor()) * 6.0;
+ num f = h - h.floor();
+ num p = brightness * (1.0 - saturation);
+ num q = brightness * (1.0 - saturation * f);
+ num t = brightness * (1.0 - (saturation * (1.0 - f)));
switch (h.toInt()) {
case 0:
- return [(brightness * 255.0).round(),
- (t * 255.0).round(),
- (p * 255.0).round()];
+ return [
+ (brightness * 255.0).round(),
+ (t * 255.0).round(),
+ (p * 255.0).round()
+ ];
case 1:
- return [(q * 255.0).round(),
- (brightness * 255.0).round(),
- (p * 255.0).round()];
+ return [
+ (q * 255.0).round(),
+ (brightness * 255.0).round(),
+ (p * 255.0).round()
+ ];
case 2:
- return [(p * 255.0).round(),
- (brightness * 255.0).round(),
- (t * 255.0).round()];
+ return [
+ (p * 255.0).round(),
+ (brightness * 255.0).round(),
+ (t * 255.0).round()
+ ];
case 3:
- return [(p * 255.0).round(),
- (q * 255.0).round(),
- (brightness * 255.0).round()];
+ return [
+ (p * 255.0).round(),
+ (q * 255.0).round(),
+ (brightness * 255.0).round()
+ ];
case 4:
- return [(t * 255.0).round(),
- (p * 255.0).round(),
- (brightness * 255.0).round()];
+ return [
+ (t * 255.0).round(),
+ (p * 255.0).round(),
+ (brightness * 255.0).round()
+ ];
case 5:
- return [(brightness * 255.0).round(),
- (p * 255.0).round(),
- (q * 255.0).round()];
+ return [
+ (brightness * 255.0).round(),
+ (p * 255.0).round(),
+ (q * 255.0).round()
+ ];
default:
throw new ImageException('invalid hue');
}
}
-/**
- * Convert an RGB color to HSL, where r, g and b are in the range [0, 255].
- * Returns a list [h, s, l] with values in the range [0, 1].
- */
-List<double> rgbToHSL(num r, num g, num b) {
+/// Convert an RGB color to HSL, where r, g and b are in the range [0, 255].
+/// Returns a list [h, s, l] with values in the range [0, 1].
+List<num> rgbToHSL(num r, num g, num b) {
r /= 255.0;
g /= 255.0;
b /= 255.0;
- var max = Math.max(r, Math.max(g, b));
- var min = Math.min(r, Math.min(g, b));
- var h;
- var s;
- var l = (max + min) / 2.0;
+ var mx = max(r, max(g, b));
+ var mn = min(r, min(g, b));
+ num h;
+ var l = (mx + mn) / 2.0;
- if (max == min){
+ if (mx == mn) {
return [0.0, 0.0, l];
}
- var d = max - min;
+ var d = mx - mn;
- s = l > 0.5 ? d / (2.0 - max - min) : d / (max + min);
+ var s = l > 0.5 ? d / (2.0 - mx - mn) : d / (mx + mn);
- if (max == r) {
+ if (mx == r) {
h = (g - b) / d + (g < b ? 6.0 : 0.0);
- } else if (max == g) {
+ } else if (mx == g) {
h = (b - r) / d + 2.0;
} else {
h = (r - g) / d + 4.0;
@@ -342,25 +296,23 @@
return [h, s, l];
}
-/**
- * Convert a CIE-L*ab color to XYZ.
- */
+/// Convert a CIE-L*ab color to XYZ.
List<int> labToXYZ(num l, num a, num b) {
- var y = (l + 16.0) / 116.0;
- var x = y + (a / 500.0);
- var z = y - (b / 200.0);
- if (Math.pow(x, 3) > 0.008856) {
- x = Math.pow(x, 3);
+ num y = (l + 16.0) / 116.0;
+ num x = y + (a / 500.0);
+ num z = y - (b / 200.0);
+ if (pow(x, 3) > 0.008856) {
+ x = pow(x, 3);
} else {
x = (x - 16.0 / 116) / 7.787;
}
- if (Math.pow(y, 3) > 0.008856) {
- y = Math.pow(y, 3);
+ if (pow(y, 3) > 0.008856) {
+ y = pow(y, 3);
} else {
y = (y - 16.0 / 116.0) / 7.787;
}
- if (Math.pow(z, 3) > 0.008856) {
- z = Math.pow(z, 3);
+ if (pow(z, 3) > 0.008856) {
+ z = pow(z, 3);
} else {
z = (z - 16.0 / 116.0) / 7.787;
}
@@ -368,79 +320,76 @@
return [(x * 95.047).toInt(), (y * 100.0).toInt(), (z * 108.883).toInt()];
}
-/**
- * Convert an XYZ color to RGB.
- */
+/// Convert an XYZ color to RGB.
List<int> xyzToRGB(num x, num y, num z) {
- var b, g, r;
x /= 100;
y /= 100;
z /= 100;
- r = (3.2406 * x) + (-1.5372 * y) + (-0.4986 * z);
- g = (-0.9689 * x) + (1.8758 * y) + (0.0415 * z);
- b = (0.0557 * x) + (-0.2040 * y) + (1.0570 * z);
+ num r = (3.2406 * x) + (-1.5372 * y) + (-0.4986 * z);
+ num g = (-0.9689 * x) + (1.8758 * y) + (0.0415 * z);
+ num b = (0.0557 * x) + (-0.2040 * y) + (1.0570 * z);
if (r > 0.0031308) {
- r = (1.055 * Math.pow(r, 0.4166666667)) - 0.055;
+ r = (1.055 * pow(r, 0.4166666667)) - 0.055;
} else {
r *= 12.92;
}
if (g > 0.0031308) {
- g = (1.055 * Math.pow(g, 0.4166666667)) - 0.055;
+ g = (1.055 * pow(g, 0.4166666667)) - 0.055;
} else {
g *= 12.92;
}
if (b > 0.0031308) {
- b = (1.055 * Math.pow(b, 0.4166666667)) - 0.055;
+ b = (1.055 * pow(b, 0.4166666667)) - 0.055;
} else {
b *= 12.92;
}
- return [(r * 255).toInt().clamp(0, 255),
- (g * 255).toInt().clamp(0, 255),
- (b * 255).toInt().clamp(0, 255)];
+ return [
+ (r * 255).clamp(0, 255).toInt(),
+ (g * 255).clamp(0, 255).toInt(),
+ (b * 255).clamp(0, 255).toInt()
+ ];
}
-/**
- * Convert a CMYK color to RGB, where c, m, y, k values are in the range
- * [0, 255]. Returns a list [r, g, b] with values in the range [0, 255].
- */
+/// Convert a CMYK color to RGB, where c, m, y, k values are in the range
+/// [0, 255]. Returns a list [r, g, b] with values in the range [0, 255].
List<int> cmykToRGB(num c, num m, num y, num k) {
c /= 255.0;
m /= 255.0;
y /= 255.0;
k /= 255.0;
- return [(255.0 * (1.0 - c) * (1.0 - k)).round(),
- (255.0 * (1.0 - m) * (1.0 - k)).round(),
- (255.0 * (1.0 - y) * (1.0 - k)).round()];
+ return [
+ (255.0 * (1.0 - c) * (1.0 - k)).round(),
+ (255.0 * (1.0 - m) * (1.0 - k)).round(),
+ (255.0 * (1.0 - y) * (1.0 - k)).round()
+ ];
}
-/**
- * Convert a CIE-L*ab color to RGB.
- */
+/// Convert a CIE-L*ab color to RGB.
List<int> labToRGB(num l, num a, num b) {
- const double ref_x = 95.047;
- const double ref_y = 100.000;
- const double ref_z = 108.883;
+ const num ref_x = 95.047;
+ const num ref_y = 100.000;
+ const num ref_z = 108.883;
- double y = (l + 16.0) / 116.0;
- double x = a / 500.0 + y;
- double z = y - b / 200.0;
+ num y = (l + 16.0) / 116.0;
+ num x = a / 500.0 + y;
+ num z = y - b / 200.0;
- double y3 = Math.pow(y, 3);
+ num y3 = pow(y, 3);
if (y3 > 0.008856) {
y = y3;
} else {
y = (y - 16 / 116) / 7.787;
}
- double x3 = Math.pow(x, 3);
+ num x3 = pow(x, 3);
if (x3 > 0.008856) {
x = x3;
} else {
x = (x - 16 / 116) / 7.787;
}
- double z3 = Math.pow(z, 3);
+ num z3 = pow(z, 3);
if (z3 > 0.008856) {
z = z3;
} else {
@@ -456,112 +405,142 @@
z /= 100.0;
// xyz to rgb
- double R = x * 3.2406 + y * (-1.5372) + z * (-0.4986);
- double G = x * (-0.9689) + y * 1.8758 + z * 0.0415;
- double B = x * 0.0557 + y * (-0.2040) + z * 1.0570;
+ num R = x * 3.2406 + y * (-1.5372) + z * (-0.4986);
+ num G = x * (-0.9689) + y * 1.8758 + z * 0.0415;
+ num B = x * 0.0557 + y * (-0.2040) + z * 1.0570;
if (R > 0.0031308) {
- R = 1.055 * (Math.pow(R, 1.0 / 2.4)) - 0.055;
+ R = 1.055 * (pow(R, 1.0 / 2.4)) - 0.055;
} else {
R = 12.92 * R;
}
if (G > 0.0031308) {
- G = 1.055 * (Math.pow(G, 1.0 / 2.4)) - 0.055;
+ G = 1.055 * (pow(G, 1.0 / 2.4)) - 0.055;
} else {
G = 12.92 * G;
}
if (B > 0.0031308) {
- B = 1.055 * (Math.pow(B, 1.0 / 2.4)) - 0.055;
+ B = 1.055 * (pow(B, 1.0 / 2.4)) - 0.055;
} else {
B = 12.92 * B;
}
- return [(R * 255.0).toInt().clamp(0, 255),
- (G * 255.0).toInt().clamp(0, 255),
- (B * 255.0).toInt().clamp(0, 255)];
+ return [
+ (R * 255.0).clamp(0, 255).toInt(),
+ (G * 255.0).clamp(0, 255).toInt(),
+ (B * 255.0).clamp(0, 255).toInt()
+ ];
}
-/**
- * Convert a RGB color to XYZ.
- */
-List<double> rgbToXYZ(num r, num g, num b) {
+/// Convert a RGB color to XYZ.
+List<num> rgbToXYZ(num r, num g, num b) {
r = r / 255.0;
g = g / 255.0;
b = b / 255.0;
- if ( r > 0.04045 ) r = Math.pow((r + 0.055) / 1.055, 2.4);
- else r = r / 12.92;
- if ( g > 0.04045 ) g = Math.pow((g + 0.055) / 1.055, 2.4);
- else g = g / 12.92;
- if ( b > 0.04045 ) b = Math.pow((b + 0.055) / 1.055, 2.4);
- else b = b / 12.92;
+ if (r > 0.04045) {
+ r = pow((r + 0.055) / 1.055, 2.4);
+ } else {
+ r = r / 12.92;
+ }
+ if (g > 0.04045) {
+ g = pow((g + 0.055) / 1.055, 2.4);
+ } else {
+ g = g / 12.92;
+ }
+ if (b > 0.04045) {
+ b = pow((b + 0.055) / 1.055, 2.4);
+ } else {
+ b = b / 12.92;
+ }
r = r * 100.0;
g = g * 100.0;
b = b * 100.0;
- return [r * 0.4124 + g * 0.3576 + b * 0.1805,
- r * 0.2126 + g * 0.7152 + b * 0.0722,
- r * 0.0193 + g * 0.1192 + b * 0.9505];
+ return [
+ r * 0.4124 + g * 0.3576 + b * 0.1805,
+ r * 0.2126 + g * 0.7152 + b * 0.0722,
+ r * 0.0193 + g * 0.1192 + b * 0.9505
+ ];
}
-/**
- * Convert a XYZ color to CIE-L*ab.
- */
-List<double> xyzToLab(num x, num y, num z) {
+/// Convert a XYZ color to CIE-L*ab.
+List<num> xyzToLab(num x, num y, num z) {
x = x / 95.047;
y = y / 100.0;
z = z / 108.883;
- if (x > 0.008856) x = Math.pow(x, 1/3.0);
- else x = (7.787 * x) + (16 / 116.0);
- if (y > 0.008856) y = Math.pow(y, 1/3.0);
- else y = (7.787 * y) + (16 / 116.0);
- if (z > 0.008856) z = Math.pow(z, 1/3.0);
- else z = (7.787 * z) + (16 / 116.0);
+ if (x > 0.008856) {
+ x = pow(x, 1 / 3.0);
+ } else {
+ x = (7.787 * x) + (16 / 116.0);
+ }
+ if (y > 0.008856) {
+ y = pow(y, 1 / 3.0);
+ } else {
+ y = (7.787 * y) + (16 / 116.0);
+ }
+ if (z > 0.008856) {
+ z = pow(z, 1 / 3.0);
+ } else {
+ z = (7.787 * z) + (16 / 116.0);
+ }
- return [(116.0 * y) - 16,
- 500.0 * (x - y),
- 200.0 * (y - z)];
+ return [(116.0 * y) - 16, 500.0 * (x - y), 200.0 * (y - z)];
}
-/**
- * Convert a RGB color to CIE-L*ab.
- */
-List<double> rgbToLab(num r, num g, num b) {
+/// Convert a RGB color to CIE-L*ab.
+List<num> rgbToLab(num r, num g, num b) {
r = r / 255.0;
g = g / 255.0;
b = b / 255.0;
- if ( r > 0.04045 ) r = Math.pow((r + 0.055) / 1.055, 2.4);
- else r = r / 12.92;
- if ( g > 0.04045 ) g = Math.pow((g + 0.055) / 1.055, 2.4);
- else g = g / 12.92;
- if ( b > 0.04045 ) b = Math.pow((b + 0.055) / 1.055, 2.4);
- else b = b / 12.92;
+ if (r > 0.04045) {
+ r = pow((r + 0.055) / 1.055, 2.4);
+ } else {
+ r = r / 12.92;
+ }
+ if (g > 0.04045) {
+ g = pow((g + 0.055) / 1.055, 2.4);
+ } else {
+ g = g / 12.92;
+ }
+ if (b > 0.04045) {
+ b = pow((b + 0.055) / 1.055, 2.4);
+ } else {
+ b = b / 12.92;
+ }
r = r * 100.0;
g = g * 100.0;
b = b * 100.0;
- double x = r * 0.4124 + g * 0.3576 + b * 0.1805;
- double y = r * 0.2126 + g * 0.7152 + b * 0.0722;
- double z = r * 0.0193 + g * 0.1192 + b * 0.9505;
+ num x = r * 0.4124 + g * 0.3576 + b * 0.1805;
+ num y = r * 0.2126 + g * 0.7152 + b * 0.0722;
+ num z = r * 0.0193 + g * 0.1192 + b * 0.9505;
x = x / 95.047;
y = y / 100.0;
z = z / 108.883;
- if (x > 0.008856) x = Math.pow(x, 1/3.0);
- else x = (7.787 * x) + (16 / 116.0);
- if (y > 0.008856) y = Math.pow(y, 1/3.0);
- else y = (7.787 * y) + (16 / 116.0);
- if (z > 0.008856) z = Math.pow(z, 1/3.0);
- else z = (7.787 * z) + (16 / 116.0);
+ if (x > 0.008856) {
+ x = pow(x, 1 / 3.0);
+ } else {
+ x = (7.787 * x) + (16 / 116.0);
+ }
+ if (y > 0.008856) {
+ y = pow(y, 1 / 3.0);
+ } else {
+ y = (7.787 * y) + (16 / 116.0);
+ }
+ if (z > 0.008856) {
+ z = pow(z, 1 / 3.0);
+ } else {
+ z = (7.787 * z) + (16 / 116.0);
+ }
- return [(116.0 * y) - 16,
- 500.0 * (x - y),
- 200.0 * (y - z)];
+ return [(116.0 * y) - 16, 500.0 * (x - y), 200.0 * (y - z)];
}
diff --git a/image/lib/src/draw/draw_char.dart b/image/lib/src/draw/draw_char.dart
index d8f76dd..50acdda 100755
--- a/image/lib/src/draw/draw_char.dart
+++ b/image/lib/src/draw/draw_char.dart
@@ -2,12 +2,10 @@
import '../bitmap_font.dart';
import 'draw_pixel.dart';
-/**
- * Draw a single character from [char] horizontally into [image] at position
- * [x],[y] with the given [color].
- */
+/// Draw a single character from [char] horizontally into [image] at position
+/// [x],[y] with the given [color].
Image drawChar(Image image, BitmapFont font, int x, int y, String char,
- {int color: 0xffffffff}) {
+ {int color = 0xffffffff}) {
int c = char.codeUnits[0];
if (!font.characters.containsKey(c)) {
return image;
diff --git a/image/lib/src/draw/draw_circle.dart b/image/lib/src/draw/draw_circle.dart
index d1418bf..510b837 100755
--- a/image/lib/src/draw/draw_circle.dart
+++ b/image/lib/src/draw/draw_circle.dart
@@ -1,13 +1,13 @@
import '../image.dart';
import 'draw_pixel.dart';
-/**
- * Draw a circle into the [image] with a center of [x0],[y0] and
- * the given [radius] and [color].
- */
+/// Draw a circle into the [image] with a center of [x0],[y0] and
+/// the given [radius] and [color].
Image drawCircle(Image image, int x0, int y0, int radius, int color) {
- if (radius < 0 || x0 - radius >= image.width ||
- y0 + radius < 0 || y0 - radius >= image.height) {
+ if (radius < 0 ||
+ x0 - radius >= image.width ||
+ y0 + radius < 0 ||
+ y0 - radius >= image.height) {
return image;
}
@@ -25,7 +25,7 @@
}
for (int f = 1 - radius, ddFx = 0, ddFy = -(radius << 1), x = 0, y = radius;
- x < y; ) {
+ x < y;) {
if (f >= 0) {
f += (ddFy += 2);
--y;
diff --git a/image/lib/src/draw/draw_image.dart b/image/lib/src/draw/draw_image.dart
index 5a07d2f..acf7326 100755
--- a/image/lib/src/draw/draw_image.dart
+++ b/image/lib/src/draw/draw_image.dart
@@ -1,23 +1,26 @@
import '../image.dart';
import 'draw_pixel.dart';
-/**
- * Draw the image [src] onto the image [dst].
- *
- * In other words, copyInto will take an rectangular area from src of
- * width [src_w] and height [src_h] at position ([src_x],[src_y]) and place it
- * in a rectangular area of [dst] of width [dst_w] and height [dst_h] at
- * position ([dst_x],[dst_y]).
- *
- * If the source and destination coordinates and width and heights differ,
- * appropriate stretching or shrinking of the image fragment will be performed.
- * The coordinates refer to the upper left corner. This function can be used to
- * copy regions within the same image (if [dst] is the same as [src])
- * but if the regions overlap the results will be unpredictable.
- */
+/// Draw the image [src] onto the image [dst].
+///
+/// In other words, copyInto will take an rectangular area from src of
+/// width [src_w] and height [src_h] at position ([src_x],[src_y]) and place it
+/// in a rectangular area of [dst] of width [dst_w] and height [dst_h] at
+/// position ([dst_x],[dst_y]).
+///
+/// If the source and destination coordinates and width and heights differ,
+/// appropriate stretching or shrinking of the image fragment will be performed.
+/// The coordinates refer to the upper left corner. This function can be used to
+/// copy regions within the same image (if [dst] is the same as [src])
+/// but if the regions overlap the results will be unpredictable.
Image drawImage(Image dst, Image src,
- {int dstX, int dstY, int srcX, int srcY,
- int srcW, int srcH, bool blend: true}) {
+ {int dstX,
+ int dstY,
+ int srcX,
+ int srcY,
+ int srcW,
+ int srcH,
+ bool blend = true}) {
if (dstX == null) {
dstX = 0;
}
diff --git a/image/lib/src/draw/draw_line.dart b/image/lib/src/draw/draw_line.dart
index 2f065c6..a4bc49c 100755
--- a/image/lib/src/draw/draw_line.dart
+++ b/image/lib/src/draw/draw_line.dart
@@ -1,17 +1,15 @@
-import 'dart:math' as Math;
+import 'dart:math';
import '../image.dart';
import '../util/clip_line.dart';
import 'draw_pixel.dart';
-/**
- * Draw a line into [image].
- *
- * If [antialias] is true then the line is drawn with smooth edges.
- * [thickness] determines how thick the line should be drawn, in pixels.
- */
+/// Draw a line into [image].
+///
+/// If [antialias] is true then the line is drawn with smooth edges.
+/// [thickness] determines how thick the line should be drawn, in pixels.
Image drawLine(Image image, int x1, int y1, int x2, int y2, int color,
- {bool antialias: false, num thickness: 1}) {
+ {bool antialias = false, num thickness = 1}) {
List<int> line = [x1, y1, x2, y2];
if (!clipLine(line, [0, 0, image.width - 1, image.height - 1])) {
return image;
@@ -63,7 +61,7 @@
dy = dy.abs();
if (dy <= dx) {
// More-or-less horizontal. use wid for vertical stroke
- double ac = Math.cos(Math.atan2(dy, dx));
+ double ac = cos(atan2(dy, dx));
int wid;
if (ac != 0) {
wid = thickness ~/ ac;
@@ -131,7 +129,7 @@
}
} else {
// More-or-less vertical. use wid for horizontal stroke
- double as = Math.sin(Math.atan2(dy, dx));
+ double as = sin(atan2(dy, dx));
int wid;
if (as != 0) {
wid = thickness ~/ as;
@@ -202,9 +200,9 @@
// Antialias Line
- double ag = (dy.abs() < dx.abs()) ?
- Math.cos(Math.atan2(dy, dx)) :
- Math.sin(Math.atan2(dy, dx));
+ double ag = (dy.abs() < dx.abs())
+ ? cos(atan2(dy, dx))
+ : sin(atan2(dy, dx));
int wid;
if (ag != 0.0) {
@@ -232,7 +230,7 @@
int inc = (dy * 65536) ~/ dx;
int frac = 0;
- for (int x = x1 ; x <= x2; x++) {
+ for (int x = x1; x <= x2; x++) {
int wstart = (y - wid ~/ 2);
for (int w = wstart; w < wstart + wid; w++) {
drawPixel(image, x, w, color, (frac >> 8) & 0xff);
@@ -264,7 +262,7 @@
int inc = (dx * 65536) ~/ dy;
int frac = 0;
- for (int y = y1 ; y <= y2; y++) {
+ for (int y = y1; y <= y2; y++) {
int wstart = (x - wid ~/ 2);
for (int w = wstart; w < wstart + wid; w++) {
drawPixel(image, w, y, color, (frac >> 8) & 0xff);
diff --git a/image/lib/src/draw/draw_pixel.dart b/image/lib/src/draw/draw_pixel.dart
index f551656..030f326 100755
--- a/image/lib/src/draw/draw_pixel.dart
+++ b/image/lib/src/draw/draw_pixel.dart
@@ -1,9 +1,7 @@
import '../color.dart';
import '../image.dart';
-/**
- * Draw a single pixel into the image, applying alpha and opacity blending.
- */
+/// Draw a single pixel into the image, applying alpha and opacity blending.
Image drawPixel(Image image, int x, int y, int color, [int opacity = 0xff]) {
if (image.boundsSafe(x, y)) {
int pi = y * image.width + x;
diff --git a/image/lib/src/draw/draw_rect.dart b/image/lib/src/draw/draw_rect.dart
index d4c1dbb..b6c239f 100755
--- a/image/lib/src/draw/draw_rect.dart
+++ b/image/lib/src/draw/draw_rect.dart
@@ -1,16 +1,14 @@
-import 'dart:math' as Math;
+import 'dart:math';
import '../image.dart';
import 'draw_line.dart';
-/**
- * Draw a rectangle in the image [dst] with the [color].
- */
+/// Draw a rectangle in the image [dst] with the [color].
Image drawRect(Image dst, int x1, int y1, int x2, int y2, int color) {
- int x0 = Math.min(x1, x2);
- int y0 = Math.min(y1, y2);
- x1 = Math.max(x1, x2);
- y1 = Math.max(y1, y2);
+ int x0 = min(x1, x2);
+ int y0 = min(y1, y2);
+ x1 = max(x1, x2);
+ y1 = max(y1, y2);
drawLine(dst, x0, y0, x1, y0, color);
drawLine(dst, x1, y0, x1, y1, color);
diff --git a/image/lib/src/draw/draw_string.dart b/image/lib/src/draw/draw_string.dart
index 6604f25..011ef3d 100755
--- a/image/lib/src/draw/draw_string.dart
+++ b/image/lib/src/draw/draw_string.dart
@@ -9,15 +9,13 @@
var _b_lut = Uint8List(256);
var _a_lut = Uint8List(256);
-/**
- * Draw a string horizontally into [image] horizontally into [image] at position
- * [x],[y] with the given [color].
- *
- * You can load your own font, or use one of the existing ones
- * such as: [arial_14], [arial_24], or [arial_48].
- */
+/// Draw a string horizontally into [image] horizontally into [image] at position
+/// [x],[y] with the given [color].
+///
+/// You can load your own font, or use one of the existing ones
+/// such as: [arial_14], [arial_24], or [arial_48].
Image drawString(Image image, BitmapFont font, int x, int y, String string,
- {int color = 0xffffffff}) {
+ {int color = 0xffffffff}) {
if (color != 0xffffffff) {
int ca = getAlpha(color);
if (ca == 0) {
@@ -51,10 +49,8 @@
for (int xi = x; xi < x2; ++xi) {
int p = ch.image[pi++];
if (color != 0xffffffff) {
- p = getColor(_r_lut[getRed(p)],
- _g_lut[getGreen(p)],
- _b_lut[getBlue(p)],
- _a_lut[getAlpha(p)]);
+ p = getColor(_r_lut[getRed(p)], _g_lut[getGreen(p)],
+ _b_lut[getBlue(p)], _a_lut[getAlpha(p)]);
}
drawPixel(image, xi + ch.xoffset, yi + ch.yoffset, p);
}
diff --git a/image/lib/src/draw/fill.dart b/image/lib/src/draw/fill.dart
index e9cd97a..41ded79 100755
--- a/image/lib/src/draw/fill.dart
+++ b/image/lib/src/draw/fill.dart
@@ -1,8 +1,6 @@
import '../image.dart';
-/**
- * Set all of the pixels of an [image] to the given [color].
- */
+/// Set all of the pixels of an [image] to the given [color].
Image fill(Image image, int color) {
return image.fill(color);
}
diff --git a/image/lib/src/draw/fill_flood.dart b/image/lib/src/draw/fill_flood.dart
index a613a02..4325d08 100755
--- a/image/lib/src/draw/fill_flood.dart
+++ b/image/lib/src/draw/fill_flood.dart
@@ -1,4 +1,3 @@
-import 'dart:math' as Math;
import 'dart:typed_data';
import '../color.dart';
@@ -7,19 +6,26 @@
typedef TestPixel = bool Function(int y, int x);
typedef MarkPixel = void Function(int y, int x);
-/**
- * Fill the 4-connected shape containing [x],[y] in the image [src] with the given [color]
- */
-
-Image fillFlood(Image src, int x, int y, int color, {num threshold=0.0, bool compareAlpha=false}) {
+/// Fill the 4-connected shape containing [x],[y] in the image [src] with the given [color]
+Image fillFlood(Image src, int x, int y, int color,
+ {num threshold = 0.0, bool compareAlpha = false}) {
int srcColor = src.getPixel(x, y);
- if (!compareAlpha) srcColor = setAlpha(srcColor, 0);
+ if (!compareAlpha) {
+ srcColor = setAlpha(srcColor, 0);
+ }
TestPixel array;
if (threshold > 0) {
- List<double> lab = rgbToLab(getRed(srcColor), getGreen(srcColor), getBlue(srcColor));
- if (compareAlpha) lab.add(getAlpha(srcColor).toDouble());
- array = (int y, int x) => _testPixelLabColorDistance(src, x, y, lab, threshold);
+ List<num> lab =
+ rgbToLab(getRed(srcColor), getGreen(srcColor), getBlue(srcColor));
+
+ if (compareAlpha) {
+ lab.add(getAlpha(srcColor).toDouble());
+ }
+
+ array =
+ (int y, int x) => _testPixelLabColorDistance(src, x, y, lab, threshold);
+
} else if (!compareAlpha) {
array = (int y, int x) => setAlpha(src.getPixel(x, y), 0) != srcColor;
} else {
@@ -31,24 +37,36 @@
return src;
}
-/**
- * Create a mask describing the 4-connected shape containing [x],[y] in the image [src]
- */
-
-Uint8List maskFlood(Image src, int x, int y, {num threshold=0.0, bool compareAlpha=false, int fillValue=255}) {
+/// Create a mask describing the 4-connected shape containing [x],[y] in the image [src]
+Uint8List maskFlood(Image src, int x, int y,
+ {num threshold = 0.0, bool compareAlpha = false, int fillValue = 255}) {
int srcColor = src.getPixel(x, y);
- if (!compareAlpha) srcColor = setAlpha(srcColor, 0);
+
+ if (!compareAlpha) {
+ srcColor = setAlpha(srcColor, 0);
+ }
+
Uint8List ret = Uint8List(src.width * src.height);
TestPixel array;
if (threshold > 0) {
- List<double> lab = rgbToLab(getRed(srcColor), getGreen(srcColor), getBlue(srcColor));
- if (compareAlpha) lab.add(getAlpha(srcColor).toDouble());
- array = (int y, int x) => ret[y * src.width + x] != 0 || _testPixelLabColorDistance(src, x, y, lab, threshold);
+ List<num> lab =
+ rgbToLab(getRed(srcColor), getGreen(srcColor), getBlue(srcColor));
+
+ if (compareAlpha) {
+ lab.add(getAlpha(srcColor).toDouble());
+ }
+
+ array = (int y, int x) =>
+ ret[y * src.width + x] != 0 ||
+ _testPixelLabColorDistance(src, x, y, lab, threshold);
} else if (!compareAlpha) {
- array = (int y, int x) => ret[y * src.width + x] != 0 || setAlpha(src.getPixel(x, y), 0) != srcColor;
+ array = (int y, int x) =>
+ ret[y * src.width + x] != 0 ||
+ setAlpha(src.getPixel(x, y), 0) != srcColor;
} else {
- array = (int y, int x) => ret[y * src.width + x] != 0 || src.getPixel(x, y) != srcColor;
+ array = (int y, int x) =>
+ ret[y * src.width + x] != 0 || src.getPixel(x, y) != srcColor;
}
MarkPixel mark = (int y, int x) => ret[y * src.width + x] = fillValue;
@@ -56,88 +74,130 @@
return ret;
}
-bool _testPixelLabColorDistance(Image src, int x, int y, List<double> refColor, num threshold) {
+bool _testPixelLabColorDistance(Image src, int x, int y, List<num> refColor,
+ num threshold) {
int pixel = src.getPixel(x, y);
bool compareAlpha = refColor.length > 3;
- List<double> pixelColor = rgbToLab(getRed(pixel), getGreen(pixel), getBlue(pixel));
- if (compareAlpha) pixelColor.add(getAlpha(pixel).toDouble());
+ var pixelColor = rgbToLab(getRed(pixel), getGreen(pixel), getBlue(pixel));
+ if (compareAlpha) {
+ pixelColor.add(getAlpha(pixel).toDouble());
+ }
+
return Color.distance(pixelColor, refColor, compareAlpha) > threshold;
}
-/**
- * Adam Milazzo (2015). A More Efficient Flood Fill.
- * http://www.adammil.net/blog/v126_A_More_Efficient_Flood_Fill.html
- */
-
+/// Adam Milazzo (2015). A More Efficient Flood Fill.
+/// http://www.adammil.net/blog/v126_A_More_Efficient_Flood_Fill.html
void _fill4(Image src, int x, int y, TestPixel array, MarkPixel mark) {
-
- // at this point, we know array(y,x) is clear, and we want to move as far as possible to the upper-left. moving
- // up is much more important than moving left, so we could try to make this smarter by sometimes moving to
- // the right if doing so would allow us to move further up, but it doesn't seem worth the complexity
- while(true)
- {
- int ox = x, oy = y;
- while (y != 0 && !array(y-1, x)) y--;
- while (x != 0 && !array(y, x-1)) x--;
- if (x == ox && y == oy) break;
+ // at this point, we know array(y,x) is clear, and we want to move as far as
+ // possible to the upper-left. moving up is much more important than moving
+ // left, so we could try to make this smarter by sometimes moving to the
+ // right if doing so would allow us to move further up, but it doesn't seem
+ // worth the complexity
+ while (true) {
+ int ox = x;
+ int oy = y;
+ while (y != 0 && !array(y - 1, x)) {
+ y--;
+ }
+ while (x != 0 && !array(y, x - 1)) {
+ x--;
+ }
+ if (x == ox && y == oy) {
+ break;
+ }
}
_fill4Core(src, x, y, array, mark);
}
void _fill4Core(Image src, int x, int y, TestPixel array, MarkPixel mark) {
- // at this point, we know that array(y,x) is clear, and array(y-1,x) and array(y,x-1) are set.
- // we'll begin scanning down and to the right, attempting to fill an entire rectangular block
- int lastRowLength = 0; // the number of cells that were clear in the last row we scanned
+ // at this point, we know that array(y,x) is clear, and array(y-1,x) and
+ // array(y,x-1) are set. We'll begin scanning down and to the right,
+ // attempting to fill an entire rectangular block
+
+ // the number of cells that were clear in the last row we scanned
+ int lastRowLength = 0;
do {
- int rowLength = 0, sx = x; // keep track of how long this row is. sx is the starting x for the main scan below
- // now we want to handle a case like |***|, where we fill 3 cells in the first row and then after we move to
- // the second row we find the first | **| cell is filled, ending our rectangular scan. rather than handling
- // this via the recursion below, we'll increase the starting value of 'x' and reduce the last row length to
- // match. then we'll continue trying to set the narrower rectangular block
- if (lastRowLength != 0 && array(y, x)) { // if this is not the first row and the leftmost cell is filled...
+ int rowLength = 0;
+ int sx = x;
+ // keep track of how long this row is. sx is the starting x for the main
+ // scan below now we want to handle a case like |***|, where we fill 3
+ // cells in the first row and then after we move to the second row we find
+ // the first | **| cell is filled, ending our rectangular scan. rather
+ // than handling this via the recursion below, we'll increase the starting
+ // value of 'x' and reduce the last row length to match. then we'll continue
+ // trying to set the narrower rectangular block
+ if (lastRowLength != 0 && array(y, x)) {
+ // if this is not the first row and the leftmost cell is filled...
do {
- if (--lastRowLength == 0) return; // shorten the row. if it's full, we're done
- } while (array(y, ++x)); // otherwise, update the starting point of the main scan to match
+ if (--lastRowLength == 0) {
+ return; // shorten the row. if it's full, we're done
+ }
+ // otherwise, update the starting point of the main scan to match
+ } while (array(y, ++x));
sx = x;
} else {
- // we also want to handle the opposite case, | **|, where we begin scanning a 2-wide rectangular block and
- // then find on the next row that it has |***| gotten wider on the left. again, we could handle this
+ // we also want to handle the opposite case, | **|, where we begin
+ // scanning a 2-wide rectangular block and then find on the next row that
+ // it has |***| gotten wider on the left. again, we could handle this
// with recursion but we'd prefer to adjust x and lastRowLength instead
- for (; x != 0 && !array(y, x-1); rowLength++, lastRowLength++) {
- mark(y, --x); // to avoid scanning the cells twice, we'll fill them and update rowLength here
- // if there's something above the new starting point, handle that recursively. this deals with cases
- // like |* **| when we begin filling from (2,0), move down to (2,1), and then move left to (0,1).
- // the |****| main scan assumes the portion of the previous row from x to x+lastRowLength has already
- // been filled. adjusting x and lastRowLength breaks that assumption in this case, so we must fix it
- if (y != 0 && !array(y-1, x)) _fill4(src, x, y-1, array, mark); // use _Fill since there may be more up and left
+ for (; x != 0 && !array(y, x - 1); rowLength++, lastRowLength++) {
+ mark(y, --x);
+ // to avoid scanning the cells twice, we'll fill them and update
+ // rowLength here if there's something above the new starting point,
+ // handle that recursively. this deals with cases like |* **| when we
+ // begin filling from (2,0), move down to (2,1), and then move left to
+ // (0,1). The |****| main scan assumes the portion of the previous row
+ // from x to x+lastRowLength has already been filled. adjusting x and
+ // lastRowLength breaks that assumption in this case, so we must fix it
+ if (y != 0 && !array(y - 1, x)) {
+ // use _Fill since there may be more up and left
+ _fill4(src, x, y - 1, array, mark);
+ }
}
}
- // now at this point we can begin to scan the current row in the rectangular block. the span of the previous
- // row from x (inclusive) to x+lastRowLength (exclusive) has already been filled, so we don't need to
+ // now at this point we can begin to scan the current row in the rectangular
+ // block. the span of the previous row from x (inclusive) to x+lastRowLength
+ // (exclusive) has already been filled, so we don't need to
// check it. so scan across to the right in the current row
- for (; sx < src.width && !array(y, sx); rowLength++, sx++) mark(y, sx);
- // now we've scanned this row. if the block is rectangular, then the previous row has already been scanned,
- // so we don't need to look upwards and we're going to scan the next row in the next iteration so we don't
- // need to look downwards. however, if the block is not rectangular, we may need to look upwards or rightwards
- // for some portion of the row. if this row was shorter than the last row, we may need to look rightwards near
- // the end, as in the case of |*****|, where the first row is 5 cells long and the second row is 3 cells long.
- // we must look to the right |*** *| of the single cell at the end of the second row, i.e. at (4,1)
+ for (; sx < src.width && !array(y, sx); rowLength++, sx++) {
+ mark(y, sx);
+ }
+ // now we've scanned this row. if the block is rectangular, then the
+ // previous row has already been scanned, so we don't need to look upwards
+ // and we're going to scan the next row in the next iteration so we don't
+ // need to look downwards. however, if the block is not rectangular, we may
+ // need to look upwards or rightwards for some portion of the row. if this
+ // row was shorter than the last row, we may need to look rightwards near
+ // the end, as in the case of |*****|, where the first row is 5 cells long
+ // and the second row is 3 cells long. We must look to the right |*** *|
+ // of the single cell at the end of the second row, i.e. at (4,1)
if (rowLength < lastRowLength) {
- for (int end=x+lastRowLength; ++sx < end; ) // 'end' is the end of the previous row, so scan the current row to
- { // there. any clear cells would have been connected to the previous
- if (!array(y, sx)) _fill4Core(src, sx, y, array, mark); // row. the cells up and left must be set so use FillCore
+ // 'end' is the end of the previous row, so scan the current row to
+ for (int end = x + lastRowLength; ++sx < end; ) {
+ // there. any clear cells would have been connected to the previous
+ if (!array(y, sx)) {
+ // row. the cells up and left must be set so use FillCore
+ _fill4Core(src, sx, y, array, mark);
+ }
}
}
- // alternately, if this row is longer than the previous row, as in the case |*** *| then we must look above
- // the end of the row, i.e at (4,0) |*****|
- else if (rowLength > lastRowLength && y != 0) // if this row is longer and we're not already at the top...
- {
- for (int ux=x+lastRowLength; ++ux<sx; ) { // sx is the end of the current row
- if (!array(y-1, ux)) _fill4(src, ux, y-1, array, mark); // since there may be clear cells up and left, use _Fill
+ // alternately, if this row is longer than the previous row, as in the case
+ // |*** *| then we must look above the end of the row, i.e at (4,0)
+ // |*****|
+ else if (rowLength > lastRowLength && y != 0) {
+ // if this row is longer and we're not already at the top...
+ for (int ux = x + lastRowLength; ++ux < sx;) {
+ // sx is the end of the current row
+ if (!array(y - 1, ux)) {
+ // since there may be clear cells up and left, use _Fill
+ _fill4(src, ux, y - 1, array, mark);
+ }
}
}
lastRowLength = rowLength; // record the new row length
- } while (lastRowLength != 0 && ++y < src.height); // if we get to a full row or to the bottom, we're done
+ // if we get to a full row or to the bottom, we're done
+ } while (lastRowLength != 0 && ++y < src.height);
}
diff --git a/image/lib/src/draw/fill_rect.dart b/image/lib/src/draw/fill_rect.dart
index d89cb96..e63f7fc 100755
--- a/image/lib/src/draw/fill_rect.dart
+++ b/image/lib/src/draw/fill_rect.dart
@@ -1,17 +1,15 @@
-import 'dart:math' as Math;
+import 'dart:math';
import '../image.dart';
import 'draw_pixel.dart';
-/**
- * Fill a rectangle in the image [src] with the given [color] with the corners
- * [x1],[y1] and [x2],[y2].
- */
+/// Fill a rectangle in the image [src] with the given [color] with the corners
+/// [x1],[y1] and [x2],[y2].
Image fillRect(Image src, int x1, int y1, int x2, int y2, int color) {
- int x0 = Math.min(x1, x2);
- int y0 = Math.min(y1, y2);
- x1 = Math.max(x1, x2);
- y1 = Math.max(y1, y2);
+ int x0 = min(x1, x2);
+ int y0 = min(y1, y2);
+ x1 = max(x1, x2);
+ y1 = max(y1, y2);
for (int sy = y0; sy <= y1; ++sy) {
for (int sx = x0; sx <= x1; ++sx) {
drawPixel(src, sx, sy, color);
diff --git a/image/lib/src/effects/drop_shadow.dart b/image/lib/src/effects/drop_shadow.dart
index f86b0d7..2a53dcb 100755
--- a/image/lib/src/effects/drop_shadow.dart
+++ b/image/lib/src/effects/drop_shadow.dart
@@ -5,11 +5,9 @@
import '../filter/scale_rgba.dart';
import '../transform/copy_into.dart';
-/**
- * Create a drop-shadow effect for the image.
- */
+/// Create a drop-shadow effect for the image.
Image dropShadow(Image src, int hShadow, int vShadow, int blur,
- {int shadowColor: 0xa0000000}) {
+ {int shadowColor = 0xa0000000}) {
if (blur < 0) {
blur = 0;
}
@@ -52,11 +50,10 @@
remapColors(dst, red: ALPHA, green: ALPHA, blue: ALPHA);
scaleRGBA(dst, getRed(shadowColor), getGreen(shadowColor),
- getBlue(shadowColor), getAlpha(shadowColor));
+ getBlue(shadowColor), getAlpha(shadowColor));
gaussianBlur(dst, blur);
-
copyInto(dst, src, dstX: imageOffsetX, dstY: imageOffsetY);
return dst;
diff --git a/image/lib/src/exif_data.dart b/image/lib/src/exif_data.dart
index 1b8cc10..6509020 100755
--- a/image/lib/src/exif_data.dart
+++ b/image/lib/src/exif_data.dart
@@ -1,8 +1,6 @@
import 'dart:typed_data';
-/**
- * Exif data stored with an image.
- */
+/// Exif data stored with an image.
class ExifData {
static const int CAMERA_MAKE = 0x010F; // string
static const int CAMERA_MODEL = 0x0110; // string
@@ -12,13 +10,12 @@
List<Uint8List> rawData;
Map<int, dynamic> data;
- ExifData()
- : data = Map<int, dynamic>();
+ ExifData() : data = Map<int, dynamic>();
ExifData.from(ExifData other)
- : data = (other == null) ?
- new Map<int, dynamic>() :
- new Map<int, dynamic>.from(other.data) {
+ : data = (other == null)
+ ? new Map<int, dynamic>()
+ : new Map<int, dynamic>.from(other.data) {
if (other != null && other.rawData != null) {
rawData = List<Uint8List>(other.rawData.length);
for (int i = 0; i < other.rawData.length; ++i) {
@@ -30,6 +27,6 @@
bool get hasRawData => rawData != null && rawData.isNotEmpty;
bool get hasOrientation => data.containsKey(ORIENTATION);
- int get orientation => data[ORIENTATION];
+ int get orientation => data[ORIENTATION] as int;
set orientation(int value) => data[ORIENTATION] = value;
}
diff --git a/image/lib/src/filter/adjust_color.dart b/image/lib/src/filter/adjust_color.dart
index dc6de6d..29730ff 100755
--- a/image/lib/src/filter/adjust_color.dart
+++ b/image/lib/src/filter/adjust_color.dart
@@ -1,65 +1,70 @@
-import 'dart:math' as Math;
+import 'dart:math';
import 'dart:typed_data';
import '../color.dart';
import '../image.dart';
import '../internal/clamp.dart';
-/**
- * Adjust the color of the [src] image using various color transformations.
- *
- * [blacks] defines the black level of the image, as a color.
- *
- * [whites] defines the white level of the image, as a color.
- *
- * [mids] defines the mid level of hte image, as a color.
- *
- * [contrast] increases (> 1) / decreases (< 1) the contrast of the image by
- * pushing colors away/toward neutral gray, where at 0.0 the image is entirely
- * neutral gray (0 contrast), 1.0, the image is not adjusted and > 1.0 the
- * image increases contrast.
- *
- * [saturation] increases (> 1) / decreases (< 1) the saturation of the image
- * by pushing colors away/toward their grayscale value, where 0.0 is grayscale
- * and 1.0 is the original image, and > 1.0 the image becomes more saturated.
- *
- * [brightness] is a constant scalar of the image colors. At 0 the image
- * is black, 1.0 unmodified, and > 1.0 the image becomes brighter.
- *
- * [gamma] is an exponential scalar of the image colors. At < 1.0 the image
- * becomes brighter, and > 1.0 the image becomes darker. A [gamma] of 1/2.2
- * will convert the image colors to linear color space.
- *
- * [exposure] is an exponential scalar of the image as rgb * pow(2, exposure).
- * At 0, the image is unmodified; as the exposure increases, the image
- * brightens.
- *
- * [hue] shifts the hue component of the image colors in degrees. A [hue] of
- * 0 will have no affect, and a [hue] of 45 will shift the hue of all colors
- * by 45 degrees.
- *
- * [amount] controls how much affect this filter has on the [src] image, where
- * 0.0 has no effect and 1.0 has full effect.
- */
-Image adjustColor(Image src, {int blacks, int whites, int mids,
- double contrast, double saturation, double brightness,
- double gamma, double exposure, double hue,
- double amount}) {
+/// Adjust the color of the [src] image using various color transformations.
+///
+/// [blacks] defines the black level of the image, as a color.
+///
+/// [whites] defines the white level of the image, as a color.
+///
+/// [mids] defines the mid level of hte image, as a color.
+///
+/// [contrast] increases (> 1) / decreases (< 1) the contrast of the image by
+/// pushing colors away/toward neutral gray, where at 0.0 the image is entirely
+/// neutral gray (0 contrast), 1.0, the image is not adjusted and > 1.0 the
+/// image increases contrast.
+///
+/// [saturation] increases (> 1) / decreases (< 1) the saturation of the image
+/// by pushing colors away/toward their grayscale value, where 0.0 is grayscale
+/// and 1.0 is the original image, and > 1.0 the image becomes more saturated.
+///
+/// [brightness] is a constant scalar of the image colors. At 0 the image
+/// is black, 1.0 unmodified, and > 1.0 the image becomes brighter.
+///
+/// [gamma] is an exponential scalar of the image colors. At < 1.0 the image
+/// becomes brighter, and > 1.0 the image becomes darker. A [gamma] of 1/2.2
+/// will convert the image colors to linear color space.
+///
+/// [exposure] is an exponential scalar of the image as rgb/// pow(2, exposure).
+/// At 0, the image is unmodified; as the exposure increases, the image
+/// brightens.
+///
+/// [hue] shifts the hue component of the image colors in degrees. A [hue] of
+/// 0 will have no affect, and a [hue] of 45 will shift the hue of all colors
+/// by 45 degrees.
+///
+/// [amount] controls how much affect this filter has on the [src] image, where
+/// 0.0 has no effect and 1.0 has full effect.
+Image adjustColor(Image src,
+ {int blacks,
+ int whites,
+ int mids,
+ num contrast,
+ num saturation,
+ num brightness,
+ num gamma,
+ num exposure,
+ num hue,
+ num amount}) {
if (amount == 0.0) {
return src;
}
- const double DEG_TO_RAD = 0.0174532925;
- const double avgLumR = 0.5;
- const double avgLumG = 0.5;
- const double avgLumB = 0.5;
- const double lumCoeffR = 0.2125;
- const double lumCoeffG = 0.7154;
- const double lumCoeffB = 0.0721;
+ const DEG_TO_RAD = 0.0174532925;
+ const avgLumR = 0.5;
+ const avgLumG = 0.5;
+ const avgLumB = 0.5;
+ const lumCoeffR = 0.2125;
+ const lumCoeffG = 0.7154;
+ const lumCoeffB = 0.0721;
- double br, bg, bb;
- double wr, wg, wb;
- double mr, mg, mb;
+ num br, bg, bb;
+ num wr, wg, wb;
+ num mr, mg, mb;
if (blacks != null || whites != null || mids != null) {
br = blacks != null ? getRed(blacks) / 255.0 : 0.0;
bg = blacks != null ? getGreen(blacks) / 255.0 : 0.0;
@@ -78,42 +83,42 @@
mb = 1.0 / (1.0 + 2.0 * (mb - 0.5));
}
- double invSaturation = saturation != null ? 1.0 - saturation : 0.0;
- double invContrast = contrast != null ? 1.0 - contrast : 0.0;
+ num invSaturation = saturation != null ? 1.0 - saturation : 0.0;
+ num invContrast = contrast != null ? 1.0 - contrast : 0.0;
if (exposure != null) {
- exposure = Math.pow(2.0, exposure);
+ exposure = pow(2.0, exposure);
}
- double hueR;
- double hueG;
- double hueB;
+ num hueR;
+ num hueG;
+ num hueB;
if (hue != null) {
hue *= DEG_TO_RAD;
- double s = Math.sin(hue);
- double c = Math.cos(hue);
+ var s = sin(hue);
+ var c = cos(hue);
hueR = (2.0 * c) / 3.0;
- hueG = (-Math.sqrt(3.0) * s - c) / 3.0;
- hueB = ((Math.sqrt(3.0) * s - c) + 1.0) / 3.0;
+ hueG = (-sqrt(3.0) * s - c) / 3.0;
+ hueB = ((sqrt(3.0) * s - c) + 1.0) / 3.0;
}
- double invAmount = amount != null ? 1.0 - amount : 0.0;
+ var invAmount = amount != null ? 1.0 - amount : 0.0;
Uint8List pixels = src.getBytes();
for (int i = 0, len = pixels.length; i < len; i += 4) {
- double or = pixels[i] / 255.0;
- double og = pixels[i + 1] / 255.0;
- double ob = pixels[i + 2] / 255.0;
+ num or = pixels[i] / 255.0;
+ num og = pixels[i + 1] / 255.0;
+ num ob = pixels[i + 2] / 255.0;
- double r = or;
- double g = og;
- double b = ob;
+ num r = or;
+ num g = og;
+ num b = ob;
if (br != null) {
- r = Math.pow((r + br) * wr, mr);
- g = Math.pow((g + bg) * wg, mg);
- b = Math.pow((b + bb) * wb, mb);
+ r = pow((r + br) * wr, mr);
+ g = pow((g + bg) * wg, mg);
+ b = pow((b + bb) * wb, mb);
}
if (brightness != null && brightness != 1.0) {
@@ -123,7 +128,7 @@
}
if (saturation != null) {
- double lum = r * lumCoeffR + g * lumCoeffG + b * lumCoeffB;
+ num lum = r * lumCoeffR + g * lumCoeffG + b * lumCoeffB;
r = lum * invSaturation + r * saturation;
g = lum * invSaturation + g * saturation;
@@ -137,9 +142,9 @@
}
if (gamma != null) {
- r = Math.pow(r, gamma);
- g = Math.pow(g, gamma);
- b = Math.pow(b, gamma);
+ r = pow(r, gamma);
+ g = pow(g, gamma);
+ b = pow(b, gamma);
}
if (exposure != null) {
@@ -149,9 +154,9 @@
}
if (hue != null && hue != 0.0) {
- double hr = r * hueR + g * hueG + b * hueB;
- double hg = r * hueB + g * hueR + b * hueG;
- double hb = r * hueG + g * hueB + b * hueR;
+ num hr = r * hueR + g * hueG + b * hueB;
+ num hg = r * hueB + g * hueR + b * hueG;
+ num hb = r * hueG + g * hueB + b * hueR;
r = hr;
g = hg;
diff --git a/image/lib/src/filter/brightness.dart b/image/lib/src/filter/brightness.dart
index 44f03ea..fa0683b 100755
--- a/image/lib/src/filter/brightness.dart
+++ b/image/lib/src/filter/brightness.dart
@@ -1,12 +1,9 @@
import '../image.dart';
import '../internal/clamp.dart';
-/**
- * Set the [brightness] level for the image [src].
- *
- * [brightness] is an offset that is added to the red, green, and blue channels
- * of every pixel.
- */
+/// Set the [brightness] level for the image [src].
+/// [brightness] is an offset that is added to the red, green, and blue channels
+/// of every pixel.
Image brightness(Image src, int brightness) {
if (src == null || brightness == 0) {
return src;
diff --git a/image/lib/src/filter/bump_to_normal.dart b/image/lib/src/filter/bump_to_normal.dart
index 41c5dcb..543a095 100755
--- a/image/lib/src/filter/bump_to_normal.dart
+++ b/image/lib/src/filter/bump_to_normal.dart
@@ -1,25 +1,25 @@
-import 'dart:math' as Math;
+import 'dart:math';
import '../color.dart';
import '../image.dart';
-/**
- * Generate a normal map from a heightfield bump image.
- *
- * The red channel of the [src] image is used as an input, 0 represents a low
- * height and 1 a high value. The optional [strength] parameter allows to set
- * the strength of the normal image.
- */
-Image bumpToNormal(Image src, {double strength: 2.0}) {
+/// Generate a normal map from a heightfield bump image.
+///
+/// The red channel of the [src] image is used as an input, 0 represents a low
+/// height and 1 a high value. The optional [strength] parameter allows to set
+/// the strength of the normal image.
+Image bumpToNormal(Image src, {double strength = 2.0}) {
Image dest = Image.from(src);
for (var y = 0; y < src.height; ++y) {
for (var x = 0; x < src.width; ++x) {
final height = getRed(src.getPixel(x, y)) / 255.0;
- var du = (height - getRed(src.getPixel(x < src.width - 1 ? x + 1 : x, y))
- / 255.0) * strength;
- var dv = (height - getRed(src.getPixel(x, y < src.height - 1 ? y + 1 : y))
- / 255.0) * strength;
+ var du = (height -
+ getRed(src.getPixel(x < src.width - 1 ? x + 1 : x, y)) / 255.0) *
+ strength;
+ var dv = (height -
+ getRed(src.getPixel(x, y < src.height - 1 ? y + 1 : y)) / 255.0) *
+ strength;
final z = du.abs() + dv.abs();
if (z > 1) {
@@ -27,13 +27,13 @@
dv /= z;
}
- final dw = Math.sqrt(1.0 - du * du - dv * dv);
+ final dw = sqrt(1.0 - du * du - dv * dv);
final nX = du * 0.5 + 0.5;
final nY = dv * 0.5 + 0.5;
final nZ = dw;
- dest.setPixelRGBA(x, y, (255 * nX).floor(), (255 * nY).floor(),
- (255 * nZ).floor());
+ dest.setPixelRGBA(
+ x, y, (255 * nX).floor(), (255 * nY).floor(), (255 * nZ).floor());
}
}
diff --git a/image/lib/src/filter/color_offset.dart b/image/lib/src/filter/color_offset.dart
index 606d7ba..52a511e 100755
--- a/image/lib/src/filter/color_offset.dart
+++ b/image/lib/src/filter/color_offset.dart
@@ -1,10 +1,8 @@
import '../image.dart';
import '../internal/clamp.dart';
-/**
- * Add the [red], [green], [blue] and [alpha] values to the [src] image
- * colors, a per-channel brightness.
- */
+/// Add the [red], [green], [blue] and [alpha] values to the [src] image
+/// colors, a per-channel brightness.
Image colorOffset(Image src, int red, int green, int blue, int alpha) {
var pixels = src.getBytes();
for (int i = 0, len = pixels.length; i < len; i += 4) {
diff --git a/image/lib/src/filter/contrast.dart b/image/lib/src/filter/contrast.dart
index 3188b1e..a7389f5 100755
--- a/image/lib/src/filter/contrast.dart
+++ b/image/lib/src/filter/contrast.dart
@@ -6,13 +6,11 @@
num _lastContrast;
Uint8List _contrast;
-/**
- * Set the [contrast] level for the image [src].
- *
- * [contrast] values below 100 will decrees the contrast of the image,
- * and values above 100 will increase the contrast. A contrast of of 100
- * will have no affect.
- */
+/// Set the [contrast] level for the image [src].
+///
+/// [contrast] values below 100 will decrees the contrast of the image,
+/// and values above 100 will increase the contrast. A contrast of of 100
+/// will have no affect.
Image contrast(Image src, num contrast) {
if (src == null || contrast == 100.0) {
return src;
diff --git a/image/lib/src/filter/convolution.dart b/image/lib/src/filter/convolution.dart
index 4008e7f..8b27a74 100755
--- a/image/lib/src/filter/convolution.dart
+++ b/image/lib/src/filter/convolution.dart
@@ -1,17 +1,15 @@
-import 'dart:math' as Math;
+import 'dart:math';
import '../color.dart';
import '../image.dart';
-/**
- * Apply a 3x3 convolution filter to the [src] image. [filter] should be a
- * list of 9 doubles.
- *
- * The rgb channels will be divided by [filterDiv] and add [offset], allowing
- * filters to normalize and offset the filtered pixel value.
- */
+/// Apply a 3x3 convolution filter to the [src] image. [filter] should be a
+/// list of 9 doubles.
+///
+/// The rgb channels will be divided by [filterDiv] and add [offset], allowing
+/// filters to normalize and offset the filtered pixel value.
Image convolution(Image src, List<num> filter,
- [num filterDiv = 1.0, num offset = 0.0]) {
+ [num filterDiv = 1.0, num offset = 0.0]) {
Image tmp = Image.from(src);
for (int y = 0; y < src.height; ++y) {
@@ -22,9 +20,9 @@
double b = 0.0;
int a = getAlpha(c);
for (int j = 0, fi = 0; j < 3; ++j) {
- int yv = Math.min(Math.max(y - 1 + j, 0), src.height - 1);
+ int yv = min(max(y - 1 + j, 0), src.height - 1);
for (int i = 0; i < 3; ++i, ++fi) {
- int xv = Math.min(Math.max(x - 1 + i, 0), src.width - 1);
+ int xv = min(max(x - 1 + i, 0), src.width - 1);
int c2 = tmp.getPixel(xv, yv);
r += getRed(c2) * filter[fi];
g += getGreen(c2) * filter[fi];
diff --git a/image/lib/src/filter/emboss.dart b/image/lib/src/filter/emboss.dart
index 1b5a355..a91b0a0 100755
--- a/image/lib/src/filter/emboss.dart
+++ b/image/lib/src/filter/emboss.dart
@@ -1,14 +1,19 @@
import '../image.dart';
import 'convolution.dart';
-/**
- * Apply an emboss convolution filter.
- */
+/// Apply an emboss convolution filter.
Image emboss(Image src) {
- const List<double> filter = const[
- 1.5, 0.0, 0.0,
- 0.0, 0.0, 0.0,
- 0.0, 0.0, -1.5];
+ const List<double> filter = const [
+ 1.5,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ -1.5
+ ];
return convolution(src, filter, 1, 127);
}
diff --git a/image/lib/src/filter/gaussian_blur.dart b/image/lib/src/filter/gaussian_blur.dart
index 5bc657d..a98633a 100755
--- a/image/lib/src/filter/gaussian_blur.dart
+++ b/image/lib/src/filter/gaussian_blur.dart
@@ -1,4 +1,4 @@
-import 'dart:math' as Math;
+import 'dart:math';
import '../image.dart';
import 'seperable_convolution.dart';
@@ -6,11 +6,9 @@
Map<int, SeperableKernel> _gaussianKernelCache = {};
-/**
- * Apply gaussian blur to the [src] image. [radius] determines how many pixels
- * away from the current pixel should contribute to the blur, where 0 is no
- * blur and the larger the radius, the stronger the blur.
- */
+/// Apply gaussian blur to the [src] image. [radius] determines how many pixels
+/// away from the current pixel should contribute to the blur, where 0 is no
+/// blur and the larger the radius, the stronger the blur.
Image gaussianBlur(Image src, int radius) {
if (radius <= 0) {
return src;
@@ -29,7 +27,7 @@
double sum = 0.0;
for (int x = -radius; x <= radius; ++x) {
- double c = Math.exp(-(x * x) / s);
+ double c = exp(-(x * x) / s);
sum += c;
kernel[x + radius] = c;
}
diff --git a/image/lib/src/filter/grayscale.dart b/image/lib/src/filter/grayscale.dart
index 5084469..b102245 100755
--- a/image/lib/src/filter/grayscale.dart
+++ b/image/lib/src/filter/grayscale.dart
@@ -1,9 +1,7 @@
import '../color.dart';
import '../image.dart';
-/**
- * Convert the image to grayscale.
- */
+/// Convert the image to grayscale.
Image grayscale(Image src) {
var p = src.getBytes();
for (int i = 0, len = p.length; i < len; i += 4) {
diff --git a/image/lib/src/filter/invert.dart b/image/lib/src/filter/invert.dart
index df64659..d0480cc 100755
--- a/image/lib/src/filter/invert.dart
+++ b/image/lib/src/filter/invert.dart
@@ -1,8 +1,6 @@
import '../image.dart';
-/**
- * Invert the colors of the [src] image.
- */
+/// Invert the colors of the [src] image.
Image invert(Image src) {
var p = src.getBytes();
for (int i = 0, len = p.length; i < len; i += 4) {
diff --git a/image/lib/src/filter/noise.dart b/image/lib/src/filter/noise.dart
index dd4d8ef..e97ab19 100755
--- a/image/lib/src/filter/noise.dart
+++ b/image/lib/src/filter/noise.dart
@@ -1,4 +1,4 @@
-import 'dart:math' as Math;
+import 'dart:math';
import '../color.dart';
import '../image.dart';
@@ -7,24 +7,26 @@
/// Gaussian noise type used by [noise].
const int NOISE_GAUSSIAN = 0;
+
/// Uniform noise type used by [noise].
const int NOISE_UNIFORM = 1;
+
/// Salt&Pepper noise type used by [noise].
const int NOISE_SALT_PEPPER = 2;
+
/// Poisson noise type used by [noise].
const int NOISE_POISSON = 3;
+
/// Rice noise type used by [noise].
const int NOISE_RICE = 4;
-/**
- * Add random noise to pixel values. [sigma] determines how strong the effect
- * should be. [type] should be one of the following: [NOISE_GAUSSIAN],
- * [NOISE_UNIFORM], [NOISE_SALT_PEPPER], [NOISE_POISSON], or [NOISE_RICE].
- */
-Image noise(Image image, double sigma, {int type: NOISE_GAUSSIAN,
- Math.Random random}) {
+/// Add random noise to pixel values. [sigma] determines how strong the effect
+/// should be. [type] should be one of the following: [NOISE_GAUSSIAN],
+/// [NOISE_UNIFORM], [NOISE_SALT_PEPPER], [NOISE_POISSON], or [NOISE_RICE].
+Image noise(Image image, double sigma,
+ {int type = NOISE_GAUSSIAN, Random random}) {
if (random == null) {
- random = Math.Random();
+ random = Random();
}
double nsigma = sigma;
@@ -57,7 +59,7 @@
image[i] = getColor(r, g, b, a);
}
break;
- case NOISE_UNIFORM :
+ case NOISE_UNIFORM:
for (int i = 0; i < len; ++i) {
int c = image[i];
int r = (getRed(c) + nsigma * crand(random)).toInt();
@@ -97,26 +99,26 @@
}
break;
case NOISE_RICE:
- double sqrt2 = Math.sqrt(2.0);
+ double sqrt2 = sqrt(2.0);
for (int i = 0; i < len; ++i) {
int c = image[i];
double val0 = getRed(c) / sqrt2;
double re = (val0 + nsigma * grand(random));
double im = (val0 + nsigma * grand(random));
- double val = Math.sqrt(re * re + im * im);
+ double val = sqrt(re * re + im * im);
int r = val.toInt();
val0 = getGreen(c) / sqrt2;
re = (val0 + nsigma * grand(random));
im = (val0 + nsigma * grand(random));
- val = Math.sqrt(re * re + im * im);
+ val = sqrt(re * re + im * im);
int g = val.toInt();
val0 = getBlue(c) / sqrt2;
re = (val0 + nsigma * grand(random));
im = (val0 + nsigma * grand(random));
- val = Math.sqrt(re * re + im * im);
+ val = sqrt(re * re + im * im);
int b = val.toInt();
int a = getAlpha(c);
diff --git a/image/lib/src/filter/normalize.dart b/image/lib/src/filter/normalize.dart
index 6bfeb1a..641a9fb 100755
--- a/image/lib/src/filter/normalize.dart
+++ b/image/lib/src/filter/normalize.dart
@@ -4,15 +4,13 @@
import '../draw/fill.dart';
import '../util/min_max.dart';
-/**
- * Linearly normalize the colors of the image. All color values will be mapped
- * to the range [minValue], [maxValue] inclusive.
- */
+/// Linearly normalize the colors of the image. All color values will be mapped
+/// to the range [minValue], [maxValue] inclusive.
Image normalize(Image src, int minValue, int maxValue) {
int A = minValue < maxValue ? minValue : maxValue;
int B = minValue < maxValue ? maxValue : minValue;
- List mM = minMax(src);
+ var mM = minMax(src);
int m = mM[0];
int M = mM[1];
diff --git a/image/lib/src/filter/pixelate.dart b/image/lib/src/filter/pixelate.dart
index 8eb5d2c..3192f11 100755
--- a/image/lib/src/filter/pixelate.dart
+++ b/image/lib/src/filter/pixelate.dart
@@ -4,19 +4,18 @@
/// Use the top-left pixel of a block for the block color, used by [pixelate].
const int PIXELATE_UPPERLEFT = 0;
+
/// Use the average of the pixels within a block for the block color, used by
/// [pixelate].
const int PIXELATE_AVERAGE = 1;
-/**
- * Pixelate the [src] image.
- *
- * [blockSize] determines the size of the pixelated blocks.
- * If [mode] is [PIXELATE_UPPERLEFT] then the upper-left corner of the block
- * will be used for the block color. Otherwise if [mode] is [PIXELATE_AVERAGE],
- * the average of all the pixels in the block will be used for the block color.
- */
-Image pixelate(Image src, int blockSize, {int mode: PIXELATE_UPPERLEFT}) {
+/// Pixelate the [src] image.
+///
+/// [blockSize] determines the size of the pixelated blocks.
+/// If [mode] is [PIXELATE_UPPERLEFT] then the upper-left corner of the block
+/// will be used for the block color. Otherwise if [mode] is [PIXELATE_AVERAGE],
+/// the average of all the pixels in the block will be used for the block color.
+Image pixelate(Image src, int blockSize, {int mode = PIXELATE_UPPERLEFT}) {
if (blockSize <= 1) {
return src;
}
diff --git a/image/lib/src/filter/quantize.dart b/image/lib/src/filter/quantize.dart
index 39278bc..e3455ad 100755
--- a/image/lib/src/filter/quantize.dart
+++ b/image/lib/src/filter/quantize.dart
@@ -3,16 +3,12 @@
import '../image.dart';
import '../util/neural_quantizer.dart';
-enum QuantizeMethod {
- neuralNet,
- octree
-}
+enum QuantizeMethod { neuralNet, octree }
-/**
- * Quantize the number of colors in image to 256.
- */
-Image quantize(Image src, {int numberOfColors=256,
- QuantizeMethod method=QuantizeMethod.neuralNet}) {
+/// Quantize the number of colors in image to 256.
+Image quantize(Image src,
+ {int numberOfColors = 256,
+ QuantizeMethod method = QuantizeMethod.neuralNet}) {
if (method == QuantizeMethod.octree || numberOfColors < 4) {
OctreeQuantizer oct = OctreeQuantizer(src, numberOfColors: numberOfColors);
for (int i = 0, len = src.length; i < len; ++i) {
diff --git a/image/lib/src/filter/remap_colors.dart b/image/lib/src/filter/remap_colors.dart
index a2261f2..efaef38 100755
--- a/image/lib/src/filter/remap_colors.dart
+++ b/image/lib/src/filter/remap_colors.dart
@@ -1,19 +1,13 @@
import '../color.dart';
import '../image.dart';
-/**
- * Remap the color channels of the image.
- * [red], [green], [blue] and [alpha] should be set to one of the following:
- * [RED], [GREEN], [BLUE] or [ALPHA]. For example,
- * remapColors(src, red: GREEN, green: RED);
- * will swap the red and green channels of the image.
- */
+/// Remap the color channels of the image.
+/// [red], [green], [blue] and [alpha] should be set to one of the following:
+/// [RED], [GREEN], [BLUE] or [ALPHA]. For example,
+/// remapColors(src, red: GREEN, green: RED);
+/// will swap the red and green channels of the image.
Image remapColors(Image src,
- {int red: RED,
- int green: GREEN,
- int blue: BLUE,
- int alpha: ALPHA}) {
-
+ {int red = RED, int green = GREEN, int blue = BLUE, int alpha = ALPHA}) {
List<int> l = [0, 0, 0, 0, 0];
var p = src.getBytes();
for (int i = 0, len = p.length; i < len; i += 4) {
@@ -21,7 +15,9 @@
l[1] = p[i + 1];
l[2] = p[i + 2];
l[3] = p[i + 3];
- if (red == LUMINANCE || green == LUMINANCE || blue == LUMINANCE ||
+ if (red == LUMINANCE ||
+ green == LUMINANCE ||
+ blue == LUMINANCE ||
alpha == LUMINANCE) {
l[4] = getLuminanceRGB(l[0], l[1], l[2]);
}
diff --git a/image/lib/src/filter/seperable_convolution.dart b/image/lib/src/filter/seperable_convolution.dart
index 6ff5a5a..048eb6f 100755
--- a/image/lib/src/filter/seperable_convolution.dart
+++ b/image/lib/src/filter/seperable_convolution.dart
@@ -1,12 +1,10 @@
import '../image.dart';
import 'seperable_kernel.dart';
-/**
- * Apply a generic seperable convolution filter the [src] image, using the
- * given [kernel].
- *
- * [gaussianBlur] is an example of such a filter.
- */
+/// Apply a generic seperable convolution filter the [src] image, using the
+/// given [kernel].
+///
+/// [gaussianBlur] is an example of such a filter.
Image seperableConvolution(Image src, SeperableKernel kernel) {
// Apply the filter horizontally
Image tmp = Image.from(src);
diff --git a/image/lib/src/filter/seperable_kernel.dart b/image/lib/src/filter/seperable_kernel.dart
index db0b39e..3bf3bfb 100755
--- a/image/lib/src/filter/seperable_kernel.dart
+++ b/image/lib/src/filter/seperable_kernel.dart
@@ -1,44 +1,32 @@
import '../color.dart';
import '../image.dart';
-/**
- * A kernel object to use with [seperableConvolution] filtering.
- */
+/// A kernel object to use with [seperableConvolution] filtering.
class SeperableKernel {
final List<double> coefficients;
final int size;
- /**
- * Create a seperable convolution kernel for the given [radius].
- */
- SeperableKernel(int radius) :
- coefficients = List<double>(2 * radius + 1),
- this.size = radius;
+ /// Create a seperable convolution kernel for the given [radius].
+ SeperableKernel(int radius)
+ : coefficients = List<double>(2 * radius + 1),
+ this.size = radius;
- /**
- * Get the number of coefficients in the kernel.
- */
+ /// Get the number of coefficients in the kernel.
int get length => coefficients.length;
- /**
- * Get a coefficient from the kernel.
- */
- double operator[](int index) => coefficients[index];
+ /// Get a coefficient from the kernel.
+ double operator [](int index) => coefficients[index];
- /**
- * Set a coefficient in the kernel.
- */
- void operator[]=(int index, double c) {
+ /// Set a coefficient in the kernel.
+ void operator []=(int index, double c) {
coefficients[index] = c;
}
- /**
- * Apply the kernel to the [src] image, storing the results in [dst],
- * for a single dimension. If [horizontal is true, the filter will be
- * applied to the horizontal axis, otherwise it will be appied to the
- * vertical axis.
- */
- void apply(Image src, Image dst, {bool horizontal: true}) {
+ /// Apply the kernel to the [src] image, storing the results in [dst],
+ /// for a single dimension. If [horizontal is true, the filter will be
+ /// applied to the horizontal axis, otherwise it will be appied to the
+ /// vertical axis.
+ void apply(Image src, Image dst, {bool horizontal = true}) {
if (horizontal) {
for (int y = 0; y < src.height; ++y) {
_applyCoeffsLine(src, dst, y, src.width, horizontal);
@@ -50,9 +38,7 @@
}
}
- /**
- * Scale all of the coefficients by [s].
- */
+ /// Scale all of the coefficients by [s].
void scaleCoefficients(double s) {
for (int i = 0; i < coefficients.length; ++i) {
coefficients[i] *= s;
@@ -69,8 +55,8 @@
return x;
}
- void _applyCoeffsLine(Image src, Image dst, int y, int width,
- bool horizontal) {
+ void _applyCoeffsLine(
+ Image src, Image dst, int y, int width, bool horizontal) {
for (int x = 0; x < width; x++) {
double r = 0.0;
double g = 0.0;
@@ -81,9 +67,7 @@
double coeff = coefficients[j2];
int gr = _reflect(width, x + j);
- int sc = (horizontal) ?
- src.getPixel(gr, y) :
- src.getPixel(y, gr);
+ int sc = (horizontal) ? src.getPixel(gr, y) : src.getPixel(y, gr);
r += coeff * getRed(sc);
g += coeff * getGreen(sc);
@@ -91,7 +75,8 @@
a += coeff * getAlpha(sc);
}
- int c = getColor((r > 255.0 ? 255.0 : r).toInt(),
+ int c = getColor(
+ (r > 255.0 ? 255.0 : r).toInt(),
(g > 255.0 ? 255.0 : g).toInt(),
(b > 255.0 ? 255.0 : b).toInt(),
(a > 255.0 ? 255.0 : a).toInt());
diff --git a/image/lib/src/filter/sepia.dart b/image/lib/src/filter/sepia.dart
index 1babf40..237049f 100755
--- a/image/lib/src/filter/sepia.dart
+++ b/image/lib/src/filter/sepia.dart
@@ -2,12 +2,10 @@
import '../image.dart';
import '../internal/clamp.dart';
-/**
- * Apply sepia tone to the image.
- *
- * [amount] controls the strength of the effect, in the range 0.0 - 1.0.
- */
-Image sepia(Image src, {num amount: 1.0}) {
+/// Apply sepia tone to the image.
+///
+/// [amount] controls the strength of the effect, in the range 0.0 - 1.0.
+Image sepia(Image src, {num amount = 1.0}) {
if (amount == 0) {
return src;
}
diff --git a/image/lib/src/filter/smooth.dart b/image/lib/src/filter/smooth.dart
index a3ad256..9ad01da 100755
--- a/image/lib/src/filter/smooth.dart
+++ b/image/lib/src/filter/smooth.dart
@@ -1,17 +1,12 @@
import '../image.dart';
import 'convolution.dart';
-/**
- * Apply a smoothing convolution filter to the [src] image.
- *
- * [w] is the weight of the current pixel being filtered. If it's greater than
- * 1.0, it will make the image sharper.
- */
+/// Apply a smoothing convolution filter to the [src] image.
+///
+/// [w] is the weight of the current pixel being filtered. If it's greater than
+/// 1.0, it will make the image sharper.
Image smooth(Image src, num w) {
- List<double> filter = [
- 1.0, 1.0, 1.0,
- 1.0, w.toDouble(), 1.0,
- 1.0, 1.0, 1.0];
+ List<double> filter = [1.0, 1.0, 1.0, 1.0, w.toDouble(), 1.0, 1.0, 1.0, 1.0];
return convolution(src, filter, w + 8, 0);
}
diff --git a/image/lib/src/filter/sobel.dart b/image/lib/src/filter/sobel.dart
index b5ac4e0..c694f82 100755
--- a/image/lib/src/filter/sobel.dart
+++ b/image/lib/src/filter/sobel.dart
@@ -1,15 +1,12 @@
-import 'dart:math' as Math;
+import 'dart:math';
import '../image.dart';
import '../internal/clamp.dart';
import 'grayscale.dart';
-
-/**
- * Apply Sobe edge detection filtering to the [src] Image.
- */
-Image sobel(Image src, {double amount: 1.0}) {
- double invAmount = 1.0 - amount;
+/// Apply Sobel edge detection filtering to the [src] Image.
+Image sobel(Image src, {num amount = 1.0}) {
+ num invAmount = 1.0 - amount;
Image orig = grayscale(new Image.from(src));
final List<int> origRGBA = orig.getBytes();
int rowSize = src.width * 4;
@@ -26,23 +23,25 @@
int t = pi - rowSize;
int tr = pi - rowSize + 4;
- double tlInt = tl < 0 ? 0.0 : origRGBA[tl] / 255.0;
- double tInt = t < 0 ? 0.0 : origRGBA[t] / 255.0;
- double trInt = tr < 0 ? 0.0 : origRGBA[tr] / 255.0;
- double lInt = l < 0 ? 0.0 : origRGBA[l] / 255.0;
- double rInt = r < rgbaLen ? origRGBA[r] / 255.0 : 0.0;
- double blInt = bl < rgbaLen ? origRGBA[bl] / 255.0 : 0.0;
- double bInt = b < rgbaLen ? origRGBA[b] / 255.0 : 0.0;
- double brInt = br < rgbaLen ? origRGBA[br] / 255.0 : 0.0;
+ num tlInt = tl < 0 ? 0.0 : origRGBA[tl] / 255.0;
+ num tInt = t < 0 ? 0.0 : origRGBA[t] / 255.0;
+ num trInt = tr < 0 ? 0.0 : origRGBA[tr] / 255.0;
+ num lInt = l < 0 ? 0.0 : origRGBA[l] / 255.0;
+ num rInt = r < rgbaLen ? origRGBA[r] / 255.0 : 0.0;
+ num blInt = bl < rgbaLen ? origRGBA[bl] / 255.0 : 0.0;
+ num bInt = b < rgbaLen ? origRGBA[b] / 255.0 : 0.0;
+ num brInt = br < rgbaLen ? origRGBA[br] / 255.0 : 0.0;
- double h = -tlInt - 2.0 * tInt - trInt + blInt + 2.0 * bInt + brInt;
- double v = -blInt - 2.0 * lInt - tlInt + brInt + 2.0 * rInt + trInt;
+ num h = -tlInt - 2.0 * tInt - trInt + blInt + 2.0 * bInt + brInt;
+ num v = -blInt - 2.0 * lInt - tlInt + brInt + 2.0 * rInt + trInt;
- int mag = clamp255((Math.sqrt(h * h + v * v) * 255.0).toInt());
+ int mag = clamp255((sqrt(h * h + v * v) * 255.0).toInt());
rgba[pi] = clamp255((mag * amount + rgba[pi] * invAmount).toInt());
- rgba[pi + 1] = clamp255((mag * amount + rgba[pi + 1] * invAmount).toInt());
- rgba[pi + 2] = clamp255((mag * amount + rgba[pi + 2] * invAmount).toInt());
+ rgba[pi + 1] =
+ clamp255((mag * amount + rgba[pi + 1] * invAmount).toInt());
+ rgba[pi + 2] =
+ clamp255((mag * amount + rgba[pi + 2] * invAmount).toInt());
}
}
diff --git a/image/lib/src/filter/vignette.dart b/image/lib/src/filter/vignette.dart
index 37e1e9d..66a9f89 100755
--- a/image/lib/src/filter/vignette.dart
+++ b/image/lib/src/filter/vignette.dart
@@ -1,9 +1,9 @@
-import 'dart:math' as Math;
+import 'dart:math';
import '../image.dart';
import '../internal/clamp.dart';
-double _smoothStep(double edge0, double edge1, double x) {
+num _smoothStep(num edge0, num edge1, num x) {
x = ((x - edge0) / (edge1 - edge0));
if (x < 0.0) {
x = 0.0;
@@ -14,18 +14,18 @@
return x * x * (3.0 - 2.0 * x);
}
-Image vignette(Image src, {double start: 0.3, double end: 0.75,
- double amount: 0.8}) {
+Image vignette(Image src,
+ {num start = 0.3, num end = 0.75, num amount = 0.8}) {
final int h = src.height - 1;
final int w = src.width - 1;
- double invAmt = 1.0 - amount;
+ num invAmt = 1.0 - amount;
var p = src.getBytes();
for (int y = 0, i = 0; y <= h; ++y) {
- double dy = 0.5 - (y / h);
+ num dy = 0.5 - (y / h);
for (int x = 0; x <= w; ++x, i += 4) {
- double dx = 0.5 - (x / w);
+ num dx = 0.5 - (x / w);
- double d = Math.sqrt(dx * dx + dy * dy);
+ num d = sqrt(dx * dx + dy * dy);
d = _smoothStep(end, start, d);
p[i] = clamp255((amount * p[i] * d + invAmt * p[i]).toInt());
diff --git a/image/lib/src/fonts/arial_14.dart b/image/lib/src/fonts/arial_14.dart
index 288ee3c..6dfcc55 100755
--- a/image/lib/src/fonts/arial_14.dart
+++ b/image/lib/src/fonts/arial_14.dart
@@ -1,32 +1,5775 @@
import '../bitmap_font.dart';
-/**
- * 14px Arial font for use with [drawString] and [drawChar].
- */
+/// 14px Arial font for use with [drawString] and [drawChar].
final BitmapFont arial_14 = BitmapFont.fromZip(_ARIAL_14);
const List<int> _ARIAL_14 = const [
- 80, 75, 3, 4, 20, 0, 0, 8, 8, 0, 184, 182, 42, 68, 36, 55, 216, 103, 135, 15, 0, 0, 133, 15, 0, 0, 12, 0, 0, 0, 97, 114, 105, 97, 108, 95, 49, 52, 46, 112,
- 110, 103, 117, 215, 119, 48, 27, 142, 223, 7, 240, 32, 86, 137, 86, 141, 146, 134, 106, 81, 212, 38, 20, 165, 182, 216, 171, 86, 218, 218, 148, 162, 21, 69,
- 80, 123, 212, 94, 169, 88, 21, 177, 171, 173, 61, 66, 17, 163, 95, 21, 171, 182, 47, 181, 66, 236, 189, 247, 168, 95, 239, 126, 207, 31, 207, 221, 115,
- 207, 221, 251, 222, 247, 254, 247, 115, 247, 249, 231, 21, 99, 168, 15, 3, 221, 0, 223, 0, 0, 0, 32, 45, 77, 53, 99, 0, 128, 2, 244, 119, 223, 166, 161, 250,
- 219, 236, 49, 18, 146, 0, 192, 77, 93, 45, 53, 101, 19, 223, 201, 45, 203, 4, 84, 33, 158, 1, 79, 15, 33, 191, 127, 235, 191, 9, 83, 229, 2, 170, 112, 69,
- 136, 2, 85, 50, 110, 117, 205, 93, 190, 253, 182, 89, 102, 165, 167, 195, 74, 223, 116, 114, 80, 250, 173, 172, 41, 147, 108, 170, 171, 186, 48, 205, 225,
- 96, 1, 86, 160, 145, 0, 150, 114, 25, 253, 98, 244, 127, 198, 144, 48, 218, 248, 83, 240, 159, 203, 51, 235, 179, 139, 35, 63, 230, 86, 197, 215, 136,
- 90, 201, 63, 231, 47, 112, 72, 180, 191, 213, 228, 159, 35, 217, 231, 11, 2, 129, 75, 179, 216, 81, 215, 133, 211, 163, 157, 227, 203, 235, 138, 214,
- 238, 11, 249, 177, 140, 242, 58, 84, 231, 112, 187, 164, 240, 192, 192, 192, 94, 213, 138, 80, 14, 169, 126, 69, 210, 43, 63, 73, 125, 247, 53, 97,
- 246, 192, 135, 226, 178, 133, 253, 160, 110, 201, 213, 110, 187, 196, 201, 62, 248, 15, 213, 9, 37, 164, 253, 224, 90, 183, 174, 235, 50, 96, 190, 239,
- 224, 122, 64, 52, 183, 149, 186, 223, 188, 229, 85, 71, 203, 146, 212, 217, 9, 199, 83, 131, 1, 87, 196, 159, 160, 43, 142, 1, 241, 246, 223, 55, 197, 97,
- 216, 160, 184, 95, 90, 96, 102, 162, 254, 217, 201, 215, 7, 130, 31, 24, 50, 118, 172, 94, 84, 216, 101, 139, 79, 156, 230, 174, 120, 230, 253, 50, 61, 55,
- 207, 209, 105, 2, 140, 127, 144, 38, 60, 80, 197, 226, 144, 142, 205, 44, 19, 101, 165, 164, 167, 3, 103, 239, 53, 234, 127, 20, 32, 9, 151, 61, 45, 220, 254,
- 15, 209, 158, 170, 179, 101, 218, 214, 241, 72, 189, 129, 229, 149, 4, 167, 41, 74, 63, 120, 170, 236, 134, 7, 222, 237, 173, 160, 68, 170, 252, 129, 129, 215,
- 63, 207, 225, 246, 150, 142, 194, 35, 184, 12, 239, 223, 170, 235, 220, 210, 229, 251, 248, 73, 167, 125, 250, 123, 114, 212, 57, 37, 117, 137, 120, 9, 222,
- 165, 150, 7, 237, 70, 147, 6, 175, 30, 239, 179, 217, 151, 37, 228, 223, 251, 0, 169, 108, 128, 64, 57, 151, 102, 31, 47, 162, 134, 244, 247, 215, 31, 245, 213, 177, 201, 237, 43, 194, 20, 247, 54, 47, 229, 29, 141, 187, 210, 208, 87, 252, 142, 154, 174, 116, 135, 235, 26, 99, 179, 38, 153, 215, 95, 75, 115, 220, 118, 110, 46, 53, 138, 108, 160, 109, 106, 113, 46, 174, 140, 231, 147, 181, 126, 60, 158, 162, 126, 213, 175, 61, 59, 150, 181, 122, 88, 247, 174, 195, 164, 245, 223, 85, 140, 118, 12, 237, 167, 151, 29, 187, 186, 66, 15, 38, 208, 182, 47, 139, 227, 115, 56, 225, 166, 132, 95, 99, 177, 47, 123, 127, 124, 154, 227, 22, 45, 191, 47, 121, 153, 66, 142, 4, 143, 217, 37, 219, 191, 117, 194, 49, 127, 32, 41, 165, 253, 233, 245, 29, 155, 126, 11, 99, 107, 1, 39, 42, 51, 183, 61, 192, 34, 78, 185, 215, 220, 125, 169, 125, 153, 237, 233, 7, 82, 247, 101, 138, 47, 253, 58, 59, 140, 89, 13, 26, 172, 192, 122, 98, 154, 113, 4, 190, 85, 251, 254, 113, 183, 119, 85, 41, 126, 83, 241, 85, 48, 47, 195, 30, 242, 112, 39, 57, 205, 11, 45, 70, 47, 22, 40, 115, 7, 127, 91, 55, 31, 34, 35, 231, 69, 88, 52, 48, 215, 38, 149, 139, 234, 142, 232, 139, 46, 141, 86, 48, 23, 205, 59, 34, 243, 135, 170, 2, 146, 161, 131, 35, 65, 202, 2, 242, 88, 93, 250, 196, 238, 55, 233, 64, 4, 195, 228, 230, 217, 51, 254, 230, 70, 87, 218, 213, 130, 53, 226, 229, 184, 100, 148, 232, 201, 29, 178, 104, 51, 71, 82, 137, 18, 5, 5, 253, 29, 165, 246, 82, 118, 133, 97, 159, 225, 83, 21, 66, 54, 66, 159, 212, 212, 45, 110, 64, 71, 1, 165, 132, 22, 96, 76, 38, 57, 34, 22, 12, 189, 134, 85, 14, 213, 123, 14, 98, 60, 253, 163, 143, 98, 236, 133, 246, 207, 246, 102, 224, 131, 201, 57, 47, 60, 189, 172, 198, 184, 60, 221, 148, 168, 204, 95, 233, 96, 24, 90, 47, 203, 5, 229, 204, 72, 35, 154, 24, 137, 134, 32, 66, 126, 175, 160, 254, 90, 156, 110, 54, 0, 100, 180, 27, 216, 43, 191, 101, 24, 132, 29, 72, 91, 122, 40, 51, 201, 191, 17, 112, 91, 250, 11, 223, 85, 41, 220, 12, 102, 103, 206, 77, 198, 158, 148, 69, 158, 207, 234, 156, 43, 167, 59, 20, 30, 94, 89, 246, 241, 78, 201, 60, 155, 190, 132, 166, 199, 223, 67, 17, 116, 151, 34, 193, 85, 203, 171, 142, 196, 1, 49, 164, 192, 206, 253, 250, 189, 65, 136, 65, 242, 108, 68, 93, 26, 165, 132, 17, 231, 163, 57, 187, 59, 248, 157, 212, 163, 69, 28, 147, 194, 169, 122, 1, 213, 122, 141, 174, 246, 45, 9, 26, 107, 223, 135, 141, 30, 140, 65, 83, 102, 100, 63, 107, 126, 232, 124, 30, 160, 32, 73, 77, 122, 172, 101, 233, 176, 103, 119, 101, 232, 132, 120, 49, 111, 64, 111, 65, 66, 130, 14, 148, 151, 4, 172, 229, 199, 32, 86, 171, 8, 195, 124, 83, 137, 79, 247, 246, 1, 97, 228, 98, 84, 203, 104, 199, 60, 199, 126, 226, 58, 115, 190, 41, 184, 195, 78, 62, 97, 101, 45, 70, 130, 214, 161, 234, 144, 165, 184, 176, 98, 87, 236, 134, 42, 206, 4, 83, 104, 20, 38, 112, 26, 48, 154, 63, 31, 43, 153, 12, 57, 32, 16, 90, 70, 31, 48, 68, 192, 24, 33, 241, 219, 64, 231, 228, 72, 183, 52, 13, 96, 1, 111, 230, 137, 63, 118, 133, 241, 180, 157, 30, 25, 179, 184, 19, 169, 178, 105, 163, 207, 153, 26, 221, 251, 150, 127, 125, 216, 202, 154, 236, 222, 175, 76, 108, 215, 75, 189, 216, 240, 223, 140, 134, 175, 5, 38, 58, 59, 116, 243, 59, 127, 112, 226, 126, 197, 162, 247, 118, 200, 65, 96, 27, 25, 90, 176, 180, 128, 100, 165, 25, 114, 194, 7, 155, 52, 179, 64, 35, 56, 116, 153, 250, 171, 149, 245, 42, 136, 198, 82, 162, 90, 169, 119, 2, 233, 88, 215, 255, 156, 9, 220, 229, 173, 182, 208, 156, 123, 159, 77, 95, 230, 2, 155, 208, 204, 214, 17, 94, 251, 68, 64, 2, 247, 111, 245, 77, 177, 164, 236, 207, 179, 160, 137, 27, 84, 171, 193, 40, 129, 110, 24, 218, 31, 21, 136, 17, 188, 226, 20, 170, 174, 112, 100, 175, 149, 142, 46, 75, 171, 67, 2, 168, 29, 62, 74, 100, 86, 236, 48, 103, 98, 137, 64, 186, 28, 136, 98, 159, 79, 3, 45, 70, 40, 182, 127, 42, 130, 35, 93, 58, 224,
- 215, 184, 208, 190, 255, 112, 11, 31, 69, 165, 160, 235, 46, 25, 242, 13, 175, 190, 95, 204, 47, 106, 196, 121, 102, 25, 156, 100, 64, 151, 95, 250, 203, 201, 104, 204, 215, 196, 151, 93, 116, 50, 70, 111, 143, 229, 137, 71, 31, 42, 144, 202, 207, 189, 118, 17, 94, 46, 252, 170, 152, 54, 100, 130, 93, 172, 206, 151, 2, 79, 20, 154, 43, 7, 26, 90, 164, 145, 140, 246, 246, 50, 20, 191, 190, 170, 234, 93, 20, 169, 252, 158, 57, 226, 203, 92, 148, 202, 62, 193, 68, 57, 239, 33, 143, 68, 145, 203, 90, 146, 219, 166, 106, 84, 122, 240, 51, 116, 20, 127, 188, 213, 80, 57, 128, 230, 35, 211, 46, 9, 141, 28, 98, 75, 89, 227, 97, 236, 156, 148, 210, 128, 81, 169, 45, 164, 243, 129, 45, 88, 213, 195, 222, 69, 238, 138, 56, 183, 209, 176, 208, 236, 148, 178, 149, 221, 63, 169, 81, 130, 186, 138, 229, 127, 148, 140, 251, 93, 21, 196, 30, 194, 203, 24, 213, 47, 193, 227, 88, 181, 140, 172, 151, 204, 85, 150, 83, 240, 147, 207, 34, 51, 124, 223, 137, 241, 230, 113, 245, 228, 115, 174, 196, 74, 6, 248, 124, 254, 65, 78, 207, 167, 220, 206, 83, 224, 202, 27, 251, 229, 208, 18, 114, 226, 44, 243, 79, 147, 81, 228, 160, 255, 74, 183, 253, 165, 72, 221, 197, 237, 25, 106, 203, 21, 100, 203, 54, 0, 164, 113, 108, 99, 203, 69, 69, 111, 207, 231, 77, 191, 110, 135, 72, 12, 27, 38, 144, 161, 26, 44, 106, 92, 105, 74, 93, 28, 233, 118, 117, 163, 236, 12, 164, 50, 63, 21, 77, 171, 142, 34, 43, 149, 10, 156, 69, 115, 91, 234, 171, 233, 245, 59, 27, 166, 21, 233, 102, 237, 68, 121, 185, 113, 251, 183, 132, 55, 252, 109, 133, 202, 171, 19, 154, 182, 165, 180, 129, 41, 199, 178, 3, 112, 174, 204, 68, 173, 238, 87, 148, 247, 173, 105, 221, 136, 159, 101, 186, 186, 15, 228, 37, 232, 110, 186, 22, 112, 111, 228, 9, 78, 32, 4, 157, 77, 40, 250, 169, 156, 163, 221, 67, 34, 239,
- 192, 210, 79, 37, 117, 104, 93, 198, 191, 217, 66, 54, 130, 198, 200, 227, 28, 133, 180, 77, 219, 129, 240, 130, 47, 38, 245, 144, 91, 183, 216, 44, 196, 154, 88, 209, 41, 100, 102, 40, 35, 90, 214, 224, 127, 133, 30, 202, 40, 22, 201, 23, 61, 131, 16, 65, 17, 200, 7, 70, 208, 164, 61, 75, 53, 168, 151, 201, 121, 227, 102, 155, 47, 39, 54, 36, 249, 44, 86, 149, 97, 45, 183, 221, 168, 126, 224, 88, 230, 82, 100, 112, 240, 201, 233, 18, 150, 41, 122, 117, 19, 171, 89, 205, 4, 13, 40, 20, 73, 120, 191, 207, 210, 227, 73, 176, 139, 40, 196, 160, 190, 16, 141, 190, 38, 17, 225, 153, 156, 49, 167, 39, 44, 78, 107, 20, 94, 206, 112, 242, 185, 78, 6, 165, 247, 143, 29, 92, 158, 218, 66, 45, 51, 65, 19, 173, 117, 48, 245, 166, 68, 254, 30, 18, 213, 2, 246, 45, 0, 36, 73, 23, 246, 18, 8, 42, 242, 50, 216, 46, 96, 7, 181, 73, 196, 206, 169, 28, 142, 30, 184, 50, 194, 120, 179, 21, 82, 74, 23, 131, 242, 102, 76, 209, 248, 50, 109, 129, 103, 112, 85, 90, 200, 24, 41, 75, 169, 61, 46, 92, 148, 59, 84, 141, 213, 169, 82, 225, 110, 87, 15, 249, 213, 38, 203, 76, 26, 164, 95, 125, 232, 217, 80, 193, 93, 53, 128, 189, 60, 89, 152, 98, 168, 116, 70, 184, 38, 166, 45, 143, 117, 176, 109, 245, 48, 83, 40, 60, 255, 197, 99, 86, 16, 245, 28, 33, 127, 108, 104, 238, 194, 67, 149, 42, 23, 60, 36, 85, 205, 236, 226, 247, 177, 38, 27, 165, 22, 59, 242, 193, 41, 163, 205, 15, 50, 36, 29, 130, 239, 19, 170, 81, 174, 222, 15, 221, 99, 89, 204, 171, 63, 94, 165, 201, 14, 224, 191, 208, 243, 49, 163, 90, 237, 230, 111, 147, 20, 246, 161, 76, 143, 87, 160, 28, 130, 63, 31, 117, 133, 91, 112, 63, 131, 124, 104, 137, 89, 156, 120, 70, 82, 22, 241, 124, 207, 191, 212, 22, 133, 11, 54, 4, 52, 14, 145, 63, 126, 62, 152, 227, 120, 108, 50, 243, 8, 68, 161, 211, 254, 72, 202, 56, 198, 205, 234, 19, 78, 243, 38, 189, 29, 15, 197, 221, 82, 90, 194, 106, 133, 106, 180, 195, 55, 81, 254, 163, 188, 145, 38, 134, 6, 179, 226, 43, 142, 92, 229, 137, 182, 58, 212, 237, 84, 35, 176, 116, 92, 189, 91, 120, 37, 78, 32, 121, 11, 230, 17, 22, 169, 21, 31, 74, 134, 41, 168, 11, 109, 114, 40, 249, 249, 210, 181, 167, 20, 205, 228, 45, 196, 193, 135, 38, 125, 67, 139, 129, 112, 9, 125, 243, 141, 68, 237, 149, 187, 250, 83, 63, 232, 19, 199, 239, 183, 2, 192, 14, 215, 70, 95, 3, 131, 27, 250, 101, 103, 199, 150, 93, 234, 12, 236, 154, 201, 160, 60, 40, 101, 144, 123, 88, 36, 237, 74, 161, 90, 198, 163, 34, 163, 123, 132, 57, 33, 103, 132, 131, 102, 138, 113, 15, 162, 104, 198, 52, 228, 67, 89, 117, 186, 19, 57, 140, 27, 174, 180, 36, 50, 200, 149, 144, 69, 185, 25, 67, 34, 92, 228, 75, 251, 76, 202, 200, 51, 250, 34, 230, 228, 135, 54, 135, 26, 199, 110, 76, 115, 41, 82, 58, 91, 72, 205, 117, 97, 136, 198, 15, 233, 135, 54, 21, 6, 182, 48, 83, 89, 31, 152, 36, 217, 240, 68, 133, 44, 149, 110, 133, 148, 251, 246, 197, 28, 155, 79, 148, 218, 45, 35, 46, 104, 136, 64, 144, 96, 200, 207, 168, 165, 10, 1, 57, 89, 187, 99, 165, 24, 141, 168, 234, 99, 91, 81, 19, 46, 125, 47, 81, 7, 182, 171, 56, 134, 48, 171, 39, 171, 205, 137, 192, 54, 114, 79, 43, 219, 248, 155, 21, 216, 211, 27, 131, 128, 16, 91, 9, 137, 11, 79, 218, 70, 201, 54, 65, 9, 63, 84, 105, 115, 226, 174, 234, 185, 251, 147, 175, 183, 51, 152, 103, 236, 77, 205, 33, 185, 11, 119, 204, 144, 143, 202, 39, 132, 7, 43, 227, 244, 124, 111, 58, 53, 244, 235, 232, 41, 170, 137, 60, 152, 226, 154, 143, 119, 89, 208, 72, 163, 57, 114, 250, 33, 160, 150, 67, 32, 27, 96, 218, 73, 156, 167, 176, 79, 223, 161, 2, 197, 207, 106, 199, 140, 222, 127, 176, 31, 215, 33, 26, 125, 219, 183, 39, 133, 181, 74, 96, 60, 235, 181, 5, 194, 93, 121, 237, 153, 81, 218, 215, 87, 22, 139, 175, 31, 150, 78, 43, 189, 138, 112, 248, 73, 152, 114, 111, 89, 249, 146, 109, 69, 246, 6, 47, 227, 199, 217, 25, 163, 206, 208, 63, 122, 54, 214, 147, 82, 30, 194, 88, 28, 222, 231, 194, 77, 237, 1, 104, 67, 68, 137, 239, 58, 128, 129, 162, 245, 143, 149, 219, 97, 149, 133, 104, 47, 57, 37, 85, 113, 42, 58, 50, 80, 148, 84, 78, 225, 104, 251, 19, 3, 44, 82, 56, 80, 198, 133, 17, 193, 221, 211, 226, 138, 82, 167, 118, 102, 107, 206, 37, 235, 53, 179, 232, 171, 176, 195, 63, 241, 208, 84, 185, 121, 224, 28, 234, 58, 205, 230, 55, 218, 227, 88, 26, 120, 51, 194, 26, 230, 184, 25, 87, 167, 207, 181, 42, 78, 238, 188, 154, 107, 103, 195, 157, 168, 91, 134, 127, 37, 236, 207, 160, 141, 48, 64, 109, 56, 3, 114, 107, 80, 167, 207, 162, 98, 94, 122, 77, 55, 149, 76, 164, 248, 196, 108, 141, 127, 39, 7, 231, 254, 196, 153, 247, 80, 166, 96, 96, 121, 176, 222, 215, 206, 223, 109, 229, 92, 142, 243, 208, 63, 176, 194, 170, 63, 135, 77, 208, 30, 203, 220, 178, 75, 226, 51, 182, 124, 253, 97, 145, 159, 102, 243, 78, 7, 115, 54, 161, 97, 126, 151, 1, 15, 185, 123, 125, 11, 1, 201, 185, 148, 60, 36, 108, 149, 25, 35, 151, 190, 5, 184, 116, 191, 16, 160, 63, 75, 47, 133, 196, 234, 170, 58, 213, 30, 133, 153, 192, 63, 43, 179, 227, 221, 138, 159, 176, 107, 109, 145, 136, 68, 143, 234, 30, 211, 65, 49, 151, 200, 176, 67, 70, 202, 106, 76, 23, 219, 195, 133, 115, 125, 70, 214, 69, 38, 65, 167, 204, 218, 217, 84, 228, 249, 228, 111, 248, 122, 109, 215, 0, 237, 138, 119, 154, 68, 113, 124, 175, 125, 8, 111, 206, 251, 37, 185, 58, 82, 179, 100, 188, 205, 247, 143, 141, 99, 210, 230, 46, 168, 176, 30, 42, 115, 244, 212, 191, 136, 22, 179, 119, 231, 105, 132, 147, 171, 88, 143, 32, 31, 131, 112, 106, 93, 255, 132, 80, 249, 229, 145, 42, 66, 167, 36, 126, 188, 60, 116, 196, 166, 110, 184, 213, 188, 213, 198, 140, 126, 217, 77, 10, 147, 93, 226, 111, 96, 177, 117, 13, 104, 108, 158, 44, 175, 115, 234, 4, 140, 172, 127, 134, 209, 65, 157, 135, 132,
- 184, 71, 78, 108, 253, 229, 219, 168, 244, 147, 166, 186, 79, 204, 188, 68, 184, 78, 181, 91, 10, 82, 168, 163, 184, 33, 98, 55, 94, 188, 238, 157, 164, 150, 238, 213, 75, 251, 103, 219, 91, 119, 214, 165, 154, 42, 113, 13, 88, 244, 130, 91, 214, 82, 67, 112, 92, 190, 249, 122, 238, 239, 83, 238, 228, 243, 36, 62, 15, 148, 28, 73, 30, 252, 154, 178, 97, 2, 236, 227, 220, 71, 243, 221, 86, 179, 44, 171, 86, 233, 210, 134, 96, 251, 46, 237, 244, 18, 28, 20, 120, 212, 57, 113, 237, 224, 48, 250, 0, 223, 173, 8, 227, 80, 15, 140, 76, 134, 61, 238, 120, 69, 162, 165, 10, 80, 41, 131, 219, 166, 132, 178, 37, 94, 126, 11, 148, 86, 106, 159, 251, 34, 100, 19, 168, 78, 186, 103, 122, 117, 84, 19, 231, 207, 18, 189, 232, 145, 151, 205, 15, 201, 90, 251, 102, 247, 69, 173, 21, 158, 105, 114, 77, 153, 107, 27, 242, 225, 226, 203, 27, 161, 51, 80, 236, 134, 25, 177, 69, 60, 242, 108, 125, 185, 113, 182, 173, 134, 75, 103, 90, 164, 86, 156, 61, 215, 222, 28, 131, 44, 51, 107, 230, 75, 92, 44, 61, 52, 47, 9, 206, 137, 127, 151, 54, 65, 22, 217, 175, 102, 180, 244, 249, 52, 23, 66, 237, 195, 2, 149, 159, 67, 39, 98, 209, 248, 42, 41, 60, 111, 144, 208, 222, 166, 140, 11, 18, 0, 91, 15, 61, 31, 56, 75, 140, 54, 110, 127, 100, 0, 156, 236, 14, 64, 18, 75, 179, 151, 50, 236, 62, 23, 197, 195, 101, 177, 38, 125, 94, 40, 113, 183, 158, 160, 172, 163, 249, 53, 45, 148, 131, 38, 12, 185, 153, 15, 84, 231, 188, 11, 92, 112, 228, 173, 208, 242, 68, 194, 225, 14, 194, 231, 235, 64, 80, 22, 142, 8, 93, 81, 203, 44, 224, 56, 54, 210, 29, 107, 146, 188, 45, 139, 197, 168, 23, 87, 225, 121, 77, 137, 21, 92, 139, 71, 177, 217, 19, 9, 178, 219, 82, 28, 231, 233, 191, 81, 240, 18, 165, 239, 25, 85, 171, 221, 145, 171, 156, 5, 67, 4, 78, 178, 204, 25, 250, 216, 151, 137, 52, 224, 82, 111, 215, 120, 79, 238, 186, 144, 87, 135, 101, 39, 92, 24, 25, 225, 103, 147, 49, 95, 32, 5, 96, 200, 9, 3, 238, 74, 115, 223, 68, 30, 89, 25, 177, 34, 107, 235, 174, 92, 28, 202, 127, 170, 223, 239, 115, 84, 168, 174, 147, 94, 53, 87, 68, 127, 220, 221, 82, 33, 23, 212, 132, 211, 26, 217, 72, 102, 89, 224, 213, 126, 182, 13, 4, 21, 240, 223, 243, 27, 5, 238, 82, 13, 222, 234, 170, 138, 2, 65, 47, 79, 77, 68, 160, 215, 188, 177, 79, 155, 113, 22, 204, 81, 225, 135, 182, 88, 182, 207, 121, 1, 8, 124, 21, 94, 80, 192, 63, 136, 103, 75, 251, 103, 135, 247, 63, 4, 218, 98, 28, 26, 207, 91, 197, 48, 115, 116, 146, 248, 174, 249, 235, 187, 88, 176, 119, 68, 204, 240, 120, 87, 79, 237, 48, 147, 27, 38, 144, 143, 210, 129, 164, 113, 26, 158, 221, 16, 244, 206, 128, 238, 205, 29, 204, 175, 185, 140, 112, 108, 200, 80, 82, 59, 240, 231, 244, 183, 78, 101, 51, 37, 85, 67, 171, 12, 11, 193, 39, 251, 219, 28, 185, 89, 236, 164, 11, 56, 170, 153, 154, 20, 108, 3, 91, 195, 2, 65, 15, 99, 54, 228, 69, 5, 117, 13, 177, 14, 100, 179, 68, 38, 198, 168, 145, 68, 170, 13, 102, 17, 242, 203, 114, 181, 193, 244, 201, 80, 102, 197, 63, 198, 213, 86, 134, 62, 161, 6, 130, 128, 240, 104, 87, 209, 192, 32, 101, 54, 10, 1, 10, 7, 134, 48, 20, 92, 176, 184, 45, 53, 144, 54, 207, 108, 217, 121, 245, 138, 227, 176, 239, 211, 161, 207, 97, 64, 199, 154, 214, 189, 157, 44, 64, 115, 254, 27, 134, 68, 237, 215, 53, 222, 92, 176, 36, 190, 152, 247, 190, 14, 104, 230, 55, 118, 238, 224, 146, 100, 11, 151, 192, 162, 243, 161, 93, 50, 226, 157, 163, 28, 99, 145, 49, 186, 6, 237, 244, 26, 122, 53, 129, 150, 192, 49, 143, 176, 19, 40, 94, 150, 117, 35, 224, 50, 125, 181, 47, 203, 62, 209, 201, 240, 228, 222, 60, 208, 122, 126, 175, 201, 243, 160, 254, 54, 218, 221, 43, 248, 84, 230, 73, 159, 236, 169, 234, 217, 25, 239, 2, 240, 169, 215, 117, 200, 166, 183, 207, 186, 96, 217, 140, 60, 159, 206, 150, 67, 10, 83, 221, 92, 90, 195, 191, 15, 182, 19, 90, 58, 52, 232, 121, 118, 89, 13, 70, 189, 172, 251, 160, 94, 145, 76, 77, 87, 160, 208, 135, 113, 21, 96, 103, 124, 15, 223, 239, 164, 113, 229, 6, 82, 49, 247, 11, 173, 76, 23, 234, 161, 77, 67, 1, 163, 52, 119, 126, 43, 145, 120, 22, 239, 63, 197, 246, 14, 10, 115, 115, 150, 131, 136, 250, 138, 243, 127, 91, 118, 187, 91, 206, 43, 220, 162, 222, 232, 57, 31, 114, 182, 167, 183, 130, 160, 208, 255, 74, 50, 184, 210, 210, 82, 235, 88, 124, 218, 99, 122, 253, 222, 57, 126, 109, 62, 80, 97, 179, 157, 246, 70, 229, 111, 227, 37, 74, 68, 127, 208, 177, 15, 135, 137, 147, 181, 145, 44, 216, 210, 191, 33, 75, 190, 249, 117, 101, 207, 131, 187, 82, 231, 217, 116, 87, 223, 133, 45, 71, 254, 7, 162, 231, 252, 35, 92, 253, 139, 151, 73, 79, 221, 223, 167, 152, 151, 236, 89, 229, 248, 142, 176, 21, 187, 207, 119, 116, 246, 218, 82, 202, 248, 78, 60, 254, 73, 228, 40, 108, 54, 248, 95, 106, 109, 93, 211, 60, 217, 15, 188, 117, 189, 91, 67, 52, 21, 153, 185, 162, 91, 10, 168, 174, 221, 186, 198, 65, 27, 141, 254, 95, 234, 174, 206, 126, 190, 38, 139, 19, 89, 249, 115, 26, 167, 50, 249, 151, 215, 0, 45, 117, 125, 181, 114, 21, 155, 176, 255, 0, 80, 75, 3, 4, 20, 0, 0, 8, 8, 0, 184, 182, 42, 68, 49, 191, 99, 158, 35, 6, 0, 0, 211, 60, 0, 0, 12, 0, 0, 0, 97, 114, 105, 97, 108, 95, 49, 52, 46, 102, 110, 116, 189, 91, 219, 110, 219, 72, 12, 125, 239, 87, 8, 122, 110, 55, 115, 191, 0, 78, 129, 190, 245, 15, 246, 113, 161, 181, 229, 68, 168, 35, 5, 177, 179, 155, 238, 215, 175, 102, 56, 78, 45, 59, 82, 73, 141, 45, 20, 72, 101, 199, 199, 103, 200, 33, 15, 41, 142, 178, 218, 118, 237, 225, 235, 167, 162, 88, 53, 237, 182, 43, 182, 213, 186, 190, 47, 191, 189, 52, 213, 174, 44, 246, 205, 127, 253, 11, 174, 202, 226, 239, 110, 183, 185, 47, 89, 89, 52, 135, 106, 215, 172, 227, 229, 250, 177, 122, 217, 215, 135, 251, 178, 44, 94, 219, 102, 221, 109,
- 234, 112, 185, 63, 188, 212, 135, 245, 227, 247, 30, 199, 250, 15, 237, 159, 186, 238, 240, 216, 191, 40, 139, 170, 138, 255, 61, 87, 155, 77, 211, 62, 220, 151, 226, 115, 252, 215, 127, 230, 185, 90, 199, 119, 216, 231, 30, 209, 189, 30, 118, 77, 91, 7, 138, 187, 184, 174, 117, 247, 244, 212, 181, 69, 120, 243, 123, 221, 60, 60, 246, 140, 220, 244, 75, 170, 246, 97, 113, 178, 199, 175, 171, 93, 253, 231, 125, 105, 29, 79, 47, 2, 187, 11, 84, 15, 245, 62, 145, 174, 127, 212, 155, 95, 223, 25, 127, 19, 174, 210, 117, 209, 128, 121, 219, 102, 215, 127, 105, 21, 204, 255, 139, 171, 63, 158, 219, 135, 4, 184, 123, 71, 172, 162, 221, 197, 186, 123, 109, 251, 149, 120, 94, 166, 175, 9, 111, 199, 175, 241, 182, 44, 222, 122, 243, 202, 226, 103, 252, 249, 111, 179, 9, 30, 232, 223, 125, 76, 203, 239, 151, 246, 214, 109, 183, 209, 121, 253, 226, 126, 30, 175, 123, 71, 191, 85, 155, 127, 170, 54, 236, 65, 90, 127, 114, 117, 187, 235, 63, 170, 97, 49, 3, 50, 23, 201, 56, 31, 103, 11, 191, 251, 144, 142, 207, 160, 243, 96, 27, 203, 52, 206, 162, 216, 98, 4, 5, 58, 143, 180, 142, 229, 89, 199, 25, 143, 124, 210, 45, 178, 119, 156, 137, 72, 167, 236, 25, 157, 166, 154, 167, 144, 124, 50, 242, 105, 53, 195, 157, 179, 236, 83, 145, 207, 200, 51, 62, 115, 194, 199, 174, 23, 156, 156, 233, 200, 103, 207, 147, 65, 80, 249, 36, 146, 207, 0, 159, 62, 227, 147, 39, 124, 242, 132, 239, 75, 54, 33, 72, 139, 99, 185, 14, 197, 230, 31, 168, 139, 115, 75, 57, 20, 228, 197, 159, 107, 103, 32, 33, 37, 32, 23, 56, 66, 14, 2, 19, 35, 117, 204, 163, 215, 204, 120, 206, 147, 92, 35, 171, 67, 110, 6, 114, 80, 24, 46, 230, 212, 135, 89, 132, 32, 49, 92, 178, 133, 52, 134, 171, 68, 120, 94, 35, 20, 113, 7, 53, 146, 15, 52, 134, 43, 141, 139, 24, 150, 89, 2, 57, 104, 12, 215, 114, 220, 190, 65, 14, 230, 22, 9, 110, 19, 161, 95, 40, 37, 82, 7, 99, 108, 102, 74, 96, 29, 10, 26, 195, 173, 65, 138, 204, 40, 97, 0, 96, 24, 69, 18, 25, 231, 150, 177, 80, 36, 145, 241, 54, 55, 7, 177, 132, 34, 117, 133, 102, 17, 3, 13, 164, 160, 224, 122, 98, 7, 113, 57, 225, 113, 132, 144, 131, 66, 156, 59, 212, 81, 235, 32, 146, 47, 221, 65, 200, 115, 62, 79, 237, 234, 145, 33, 106, 32, 7, 133, 114, 19, 132, 236, 154, 132, 233, 62, 226, 66, 100, 110, 228, 81, 155, 110, 36, 204, 212, 157, 196, 53, 249, 32, 5, 133, 117, 83, 33, 138, 219, 66, 142, 99, 76, 57, 232, 89, 174, 71, 145, 91, 104, 161, 210, 75, 198, 114, 155, 67, 92, 97, 178, 42, 241, 77, 180, 106, 184, 187, 37, 156, 202, 88, 80, 25, 121, 209, 170, 221, 42, 68, 65, 100, 164, 16, 185, 33, 138, 43, 188, 22, 68, 70, 74, 142, 85, 209, 241, 136, 193, 117, 219, 22, 84, 70, 42, 185, 84, 136, 130, 202, 200, 139, 222, 233, 102, 89, 232, 64, 103, 164, 209, 203, 4, 141, 75, 3, 11, 171, 23, 179, 80, 164, 17, 137, 93, 168, 84, 184, 164, 51, 222, 77, 184, 148, 95, 209, 165, 160, 51, 138, 57, 228, 22, 102, 54, 23, 14, 116, 70, 241, 108, 251, 176, 14, 5, 161, 81, 194, 45, 212, 62, 57, 80, 26, 165, 206, 43, 5, 151, 84, 66, 142, 27, 36, 56, 80, 26, 165, 53, 50, 72, 115, 45, 4, 161, 81, 198, 44, 228, 82, 207, 210, 228, 112, 161, 32, 149, 144, 132, 42, 127, 18, 164, 144, 73, 152, 58, 54, 117, 57, 11, 82, 100, 161, 193, 221, 218, 107, 216, 68, 205, 230, 216, 168, 232, 54, 74, 72, 11, 125, 209, 96, 132, 108, 39, 102, 62, 174, 0, 107, 72, 11, 45, 244, 184, 133, 238, 122, 6, 154, 52, 110, 70, 143, 239, 51, 59, 26, 5, 165, 73, 95, 140, 239, 79, 230, 233, 26, 147, 19, 184, 120, 81, 44, 77, 211, 245, 196, 100, 70, 97, 204, 67, 242, 65, 173, 215, 154, 47, 195, 231, 117, 226, 155, 170, 244, 99, 238, 148, 51, 182, 47, 133, 139, 153, 24, 147, 216, 17, 243, 230, 208, 37, 243, 172, 29, 119, 167, 24, 49, 207, 210, 189, 105, 210, 238, 57, 57, 110, 157, 190, 222, 88, 77, 65, 145, 215, 23, 242, 41, 62, 182, 110, 16, 43, 140, 158, 235, 74, 37, 62, 51, 206, 167, 174, 201, 7, 226, 105, 46, 238, 62, 213, 141, 206, 206, 68, 58, 203, 186, 152, 113, 113, 106, 246, 33, 171, 195, 145, 111, 98, 174, 125, 197, 100, 151, 80, 252, 12, 215, 51, 246, 143, 126, 210, 99, 146, 117, 220, 79, 181, 132, 40, 66, 142, 244, 167, 78, 103, 145, 10, 217, 102, 103, 158, 37, 75, 72, 64, 163, 166, 14, 91, 229, 8, 31, 155, 113, 50, 159, 60, 170, 39, 14, 91, 205, 245, 166, 35, 18, 90, 9, 99, 120, 238, 136, 210, 35, 243, 15, 170, 131, 177, 2, 89, 253, 50, 171, 59, 23, 41, 96, 46, 90, 236, 27, 17, 122, 40, 16, 198, 41, 228, 105, 114, 166, 192, 248, 228, 80, 231, 145, 124, 153, 10, 42, 161, 59, 51, 254, 220, 190, 147, 91, 164, 209, 59, 150, 25, 124, 202, 141, 240, 221, 170, 251, 4, 5, 181, 12, 123, 80, 39, 242, 248, 52, 75, 124, 216, 145, 118, 166, 160, 105, 158, 30, 174, 112, 203, 248, 83, 67, 188, 88, 97, 23, 178, 15, 242, 193, 74, 179, 204, 252, 85, 131, 96, 219, 139, 219, 135, 91, 249, 51, 61, 28, 51, 249, 244, 207, 53, 237, 75, 15, 199, 24, 185, 144, 125, 208, 17, 90, 43, 150, 225, 75, 122, 6, 253, 39, 35, 169, 25, 78, 204, 86, 119, 241, 73, 195, 120, 249, 163, 126, 105, 155, 246, 225, 215, 99, 135, 246, 248, 216, 97, 250, 77, 177, 109, 94, 246, 7, 88, 213, 190, 94, 119, 109, 58, 39, 173, 158, 0, 240, 133, 191, 91, 48, 129, 8, 181, 231, 136, 96, 40, 128, 71, 0, 130, 50, 30, 1, 202, 99, 214, 20, 86, 126, 68, 4, 58, 26, 226, 212, 10, 36, 194, 144, 17, 150, 140, 32, 91, 30, 31, 141, 248, 173, 119, 135, 8, 79, 69, 132, 135, 5, 126, 139, 8, 195, 184, 247, 29, 60, 245, 174, 64, 33, 12, 21, 129, 139, 220, 112, 98, 70, 139, 146, 83, 4, 46, 74, 6, 8, 67, 70, 88, 50, 194, 83, 17, 131, 29, 28, 135, 56, 246, 177, 179, 24, 6, 128, 219, 115, 71, 222, 115, 71, 222, 115, 71, 85, 171, 1, 192, 80, 1, 150, 10, 192, 228, 95, 88, 55, 109, 43, 20, 121, 43, 78, 17,
- 56, 199, 42, 242, 230, 157, 32, 180, 35, 35, 60, 21, 97, 200, 118, 88, 234, 110, 120, 75, 93, 148, 39, 155, 17, 31, 50, 167, 66, 200, 166, 199, 39, 77, 137, 44, 92, 209, 89, 52, 157, 197, 210, 89, 60, 25, 130, 20, 69, 51, 146, 88, 56, 132, 38, 35, 12, 21, 49, 72, 44, 28, 194, 83, 17, 134, 108, 135, 183, 84, 196, 48, 234, 145, 16, 141, 73, 95, 51, 22, 244, 56, 18, 174, 232, 16, 186, 245, 200, 112, 180, 228, 112, 180, 31, 135, 35, 67, 1, 12, 149, 66, 59, 34, 133, 246, 68, 0, 50, 22, 45, 57, 22, 237, 72, 44, 50, 28, 130, 234, 219, 65, 40, 34, 17, 138, 140, 176, 84, 4, 170, 219, 119, 158, 218, 159, 120, 114, 127, 226, 201, 50, 234, 201, 253, 137, 39, 203, 168, 39, 203, 168, 39, 135, 174, 39, 135, 174, 167, 203, 168, 167, 55, 15, 158, 174, 163, 3, 136, 160, 67, 36, 29, 66, 247, 24, 71, 109, 125, 252, 91, 188, 95, 46, 195, 68, 125, 76, 88, 154, 92, 15, 33, 6, 7, 113, 116, 22, 71, 103, 241, 116, 22, 79, 102, 9, 242, 67, 100, 25, 64, 62, 96, 89, 221, 29, 103, 99, 95, 63, 173, 238, 226, 31, 51, 255, 15, 80, 75, 1, 2, 20, 0, 20, 0, 0, 8, 8, 0, 184, 182, 42, 68, 36, 55,
- 216, 103, 135, 15, 0, 0, 133, 15, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 114, 105, 97, 108, 95, 49, 52, 46, 112, 110, 103,
- 80, 75, 1, 2, 20, 0, 20, 0, 0, 8, 8, 0, 184, 182, 42, 68, 49, 191, 99, 158, 35, 6, 0, 0, 211, 60, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 177, 15, 0, 0, 97, 114, 105, 97, 108, 95, 49, 52, 46, 102, 110, 116, 80, 75, 5, 6, 0, 0, 0, 0, 2, 0, 2, 0, 116, 0, 0, 0, 254, 21, 0, 0, 0, 0];
+ 80,
+ 75,
+ 3,
+ 4,
+ 20,
+ 0,
+ 0,
+ 8,
+ 8,
+ 0,
+ 184,
+ 182,
+ 42,
+ 68,
+ 36,
+ 55,
+ 216,
+ 103,
+ 135,
+ 15,
+ 0,
+ 0,
+ 133,
+ 15,
+ 0,
+ 0,
+ 12,
+ 0,
+ 0,
+ 0,
+ 97,
+ 114,
+ 105,
+ 97,
+ 108,
+ 95,
+ 49,
+ 52,
+ 46,
+ 112,
+ 110,
+ 103,
+ 117,
+ 215,
+ 119,
+ 48,
+ 27,
+ 142,
+ 223,
+ 7,
+ 240,
+ 32,
+ 86,
+ 137,
+ 86,
+ 141,
+ 146,
+ 134,
+ 106,
+ 81,
+ 212,
+ 38,
+ 20,
+ 165,
+ 182,
+ 216,
+ 171,
+ 86,
+ 218,
+ 218,
+ 148,
+ 162,
+ 21,
+ 69,
+ 80,
+ 123,
+ 212,
+ 94,
+ 169,
+ 88,
+ 21,
+ 177,
+ 171,
+ 173,
+ 61,
+ 66,
+ 17,
+ 163,
+ 95,
+ 21,
+ 171,
+ 182,
+ 47,
+ 181,
+ 66,
+ 236,
+ 189,
+ 247,
+ 168,
+ 95,
+ 239,
+ 126,
+ 207,
+ 31,
+ 207,
+ 221,
+ 115,
+ 207,
+ 221,
+ 251,
+ 222,
+ 247,
+ 254,
+ 247,
+ 115,
+ 247,
+ 249,
+ 231,
+ 21,
+ 99,
+ 168,
+ 15,
+ 3,
+ 221,
+ 0,
+ 223,
+ 0,
+ 0,
+ 0,
+ 32,
+ 45,
+ 77,
+ 53,
+ 99,
+ 0,
+ 128,
+ 2,
+ 244,
+ 119,
+ 223,
+ 166,
+ 161,
+ 250,
+ 219,
+ 236,
+ 49,
+ 18,
+ 146,
+ 0,
+ 192,
+ 77,
+ 93,
+ 45,
+ 53,
+ 101,
+ 19,
+ 223,
+ 201,
+ 45,
+ 203,
+ 4,
+ 84,
+ 33,
+ 158,
+ 1,
+ 79,
+ 15,
+ 33,
+ 191,
+ 127,
+ 235,
+ 191,
+ 9,
+ 83,
+ 229,
+ 2,
+ 170,
+ 112,
+ 69,
+ 136,
+ 2,
+ 85,
+ 50,
+ 110,
+ 117,
+ 205,
+ 93,
+ 190,
+ 253,
+ 182,
+ 89,
+ 102,
+ 165,
+ 167,
+ 195,
+ 74,
+ 223,
+ 116,
+ 114,
+ 80,
+ 250,
+ 173,
+ 172,
+ 41,
+ 147,
+ 108,
+ 170,
+ 171,
+ 186,
+ 48,
+ 205,
+ 225,
+ 96,
+ 1,
+ 86,
+ 160,
+ 145,
+ 0,
+ 150,
+ 114,
+ 25,
+ 253,
+ 98,
+ 244,
+ 127,
+ 198,
+ 144,
+ 48,
+ 218,
+ 248,
+ 83,
+ 240,
+ 159,
+ 203,
+ 51,
+ 235,
+ 179,
+ 139,
+ 35,
+ 63,
+ 230,
+ 86,
+ 197,
+ 215,
+ 136,
+ 90,
+ 201,
+ 63,
+ 231,
+ 47,
+ 112,
+ 72,
+ 180,
+ 191,
+ 213,
+ 228,
+ 159,
+ 35,
+ 217,
+ 231,
+ 11,
+ 2,
+ 129,
+ 75,
+ 179,
+ 216,
+ 81,
+ 215,
+ 133,
+ 211,
+ 163,
+ 157,
+ 227,
+ 203,
+ 235,
+ 138,
+ 214,
+ 238,
+ 11,
+ 249,
+ 177,
+ 140,
+ 242,
+ 58,
+ 84,
+ 231,
+ 112,
+ 187,
+ 164,
+ 240,
+ 192,
+ 192,
+ 192,
+ 94,
+ 213,
+ 138,
+ 80,
+ 14,
+ 169,
+ 126,
+ 69,
+ 210,
+ 43,
+ 63,
+ 73,
+ 125,
+ 247,
+ 53,
+ 97,
+ 246,
+ 192,
+ 135,
+ 226,
+ 178,
+ 133,
+ 253,
+ 160,
+ 110,
+ 201,
+ 213,
+ 110,
+ 187,
+ 196,
+ 201,
+ 62,
+ 248,
+ 15,
+ 213,
+ 9,
+ 37,
+ 164,
+ 253,
+ 224,
+ 90,
+ 183,
+ 174,
+ 235,
+ 50,
+ 96,
+ 190,
+ 239,
+ 224,
+ 122,
+ 64,
+ 52,
+ 183,
+ 149,
+ 186,
+ 223,
+ 188,
+ 229,
+ 85,
+ 71,
+ 203,
+ 146,
+ 212,
+ 217,
+ 9,
+ 199,
+ 83,
+ 131,
+ 1,
+ 87,
+ 196,
+ 159,
+ 160,
+ 43,
+ 142,
+ 1,
+ 241,
+ 246,
+ 223,
+ 55,
+ 197,
+ 97,
+ 216,
+ 160,
+ 184,
+ 95,
+ 90,
+ 96,
+ 102,
+ 162,
+ 254,
+ 217,
+ 201,
+ 215,
+ 7,
+ 130,
+ 31,
+ 24,
+ 50,
+ 118,
+ 172,
+ 94,
+ 84,
+ 216,
+ 101,
+ 139,
+ 79,
+ 156,
+ 230,
+ 174,
+ 120,
+ 230,
+ 253,
+ 50,
+ 61,
+ 55,
+ 207,
+ 209,
+ 105,
+ 2,
+ 140,
+ 127,
+ 144,
+ 38,
+ 60,
+ 80,
+ 197,
+ 226,
+ 144,
+ 142,
+ 205,
+ 44,
+ 19,
+ 101,
+ 165,
+ 164,
+ 167,
+ 3,
+ 103,
+ 239,
+ 53,
+ 234,
+ 127,
+ 20,
+ 32,
+ 9,
+ 151,
+ 61,
+ 45,
+ 220,
+ 254,
+ 15,
+ 209,
+ 158,
+ 170,
+ 179,
+ 101,
+ 218,
+ 214,
+ 241,
+ 72,
+ 189,
+ 129,
+ 229,
+ 149,
+ 4,
+ 167,
+ 41,
+ 74,
+ 63,
+ 120,
+ 170,
+ 236,
+ 134,
+ 7,
+ 222,
+ 237,
+ 173,
+ 160,
+ 68,
+ 170,
+ 252,
+ 129,
+ 129,
+ 215,
+ 63,
+ 207,
+ 225,
+ 246,
+ 150,
+ 142,
+ 194,
+ 35,
+ 184,
+ 12,
+ 239,
+ 223,
+ 170,
+ 235,
+ 220,
+ 210,
+ 229,
+ 251,
+ 248,
+ 73,
+ 167,
+ 125,
+ 250,
+ 123,
+ 114,
+ 212,
+ 57,
+ 37,
+ 117,
+ 137,
+ 120,
+ 9,
+ 222,
+ 165,
+ 150,
+ 7,
+ 237,
+ 70,
+ 147,
+ 6,
+ 175,
+ 30,
+ 239,
+ 179,
+ 217,
+ 151,
+ 37,
+ 228,
+ 223,
+ 251,
+ 0,
+ 169,
+ 108,
+ 128,
+ 64,
+ 57,
+ 151,
+ 102,
+ 31,
+ 47,
+ 162,
+ 134,
+ 244,
+ 247,
+ 215,
+ 31,
+ 245,
+ 213,
+ 177,
+ 201,
+ 237,
+ 43,
+ 194,
+ 20,
+ 247,
+ 54,
+ 47,
+ 229,
+ 29,
+ 141,
+ 187,
+ 210,
+ 208,
+ 87,
+ 252,
+ 142,
+ 154,
+ 174,
+ 116,
+ 135,
+ 235,
+ 26,
+ 99,
+ 179,
+ 38,
+ 153,
+ 215,
+ 95,
+ 75,
+ 115,
+ 220,
+ 118,
+ 110,
+ 46,
+ 53,
+ 138,
+ 108,
+ 160,
+ 109,
+ 106,
+ 113,
+ 46,
+ 174,
+ 140,
+ 231,
+ 147,
+ 181,
+ 126,
+ 60,
+ 158,
+ 162,
+ 126,
+ 213,
+ 175,
+ 61,
+ 59,
+ 150,
+ 181,
+ 122,
+ 88,
+ 247,
+ 174,
+ 195,
+ 164,
+ 245,
+ 223,
+ 85,
+ 140,
+ 118,
+ 12,
+ 237,
+ 167,
+ 151,
+ 29,
+ 187,
+ 186,
+ 66,
+ 15,
+ 38,
+ 208,
+ 182,
+ 47,
+ 139,
+ 227,
+ 115,
+ 56,
+ 225,
+ 166,
+ 132,
+ 95,
+ 99,
+ 177,
+ 47,
+ 123,
+ 127,
+ 124,
+ 154,
+ 227,
+ 22,
+ 45,
+ 191,
+ 47,
+ 121,
+ 153,
+ 66,
+ 142,
+ 4,
+ 143,
+ 217,
+ 37,
+ 219,
+ 191,
+ 117,
+ 194,
+ 49,
+ 127,
+ 32,
+ 41,
+ 165,
+ 253,
+ 233,
+ 245,
+ 29,
+ 155,
+ 126,
+ 11,
+ 99,
+ 107,
+ 1,
+ 39,
+ 42,
+ 51,
+ 183,
+ 61,
+ 192,
+ 34,
+ 78,
+ 185,
+ 215,
+ 220,
+ 125,
+ 169,
+ 125,
+ 153,
+ 237,
+ 233,
+ 7,
+ 82,
+ 247,
+ 101,
+ 138,
+ 47,
+ 253,
+ 58,
+ 59,
+ 140,
+ 89,
+ 13,
+ 26,
+ 172,
+ 192,
+ 122,
+ 98,
+ 154,
+ 113,
+ 4,
+ 190,
+ 85,
+ 251,
+ 254,
+ 113,
+ 183,
+ 119,
+ 85,
+ 41,
+ 126,
+ 83,
+ 241,
+ 85,
+ 48,
+ 47,
+ 195,
+ 30,
+ 242,
+ 112,
+ 39,
+ 57,
+ 205,
+ 11,
+ 45,
+ 70,
+ 47,
+ 22,
+ 40,
+ 115,
+ 7,
+ 127,
+ 91,
+ 55,
+ 31,
+ 34,
+ 35,
+ 231,
+ 69,
+ 88,
+ 52,
+ 48,
+ 215,
+ 38,
+ 149,
+ 139,
+ 234,
+ 142,
+ 232,
+ 139,
+ 46,
+ 141,
+ 86,
+ 48,
+ 23,
+ 205,
+ 59,
+ 34,
+ 243,
+ 135,
+ 170,
+ 2,
+ 146,
+ 161,
+ 131,
+ 35,
+ 65,
+ 202,
+ 2,
+ 242,
+ 88,
+ 93,
+ 250,
+ 196,
+ 238,
+ 55,
+ 233,
+ 64,
+ 4,
+ 195,
+ 228,
+ 230,
+ 217,
+ 51,
+ 254,
+ 230,
+ 70,
+ 87,
+ 218,
+ 213,
+ 130,
+ 53,
+ 226,
+ 229,
+ 184,
+ 100,
+ 148,
+ 232,
+ 201,
+ 29,
+ 178,
+ 104,
+ 51,
+ 71,
+ 82,
+ 137,
+ 18,
+ 5,
+ 5,
+ 253,
+ 29,
+ 165,
+ 246,
+ 82,
+ 118,
+ 133,
+ 97,
+ 159,
+ 225,
+ 83,
+ 21,
+ 66,
+ 54,
+ 66,
+ 159,
+ 212,
+ 212,
+ 45,
+ 110,
+ 64,
+ 71,
+ 1,
+ 165,
+ 132,
+ 22,
+ 96,
+ 76,
+ 38,
+ 57,
+ 34,
+ 22,
+ 12,
+ 189,
+ 134,
+ 85,
+ 14,
+ 213,
+ 123,
+ 14,
+ 98,
+ 60,
+ 253,
+ 163,
+ 143,
+ 98,
+ 236,
+ 133,
+ 246,
+ 207,
+ 246,
+ 102,
+ 224,
+ 131,
+ 201,
+ 57,
+ 47,
+ 60,
+ 189,
+ 172,
+ 198,
+ 184,
+ 60,
+ 221,
+ 148,
+ 168,
+ 204,
+ 95,
+ 233,
+ 96,
+ 24,
+ 90,
+ 47,
+ 203,
+ 5,
+ 229,
+ 204,
+ 72,
+ 35,
+ 154,
+ 24,
+ 137,
+ 134,
+ 32,
+ 66,
+ 126,
+ 175,
+ 160,
+ 254,
+ 90,
+ 156,
+ 110,
+ 54,
+ 0,
+ 100,
+ 180,
+ 27,
+ 216,
+ 43,
+ 191,
+ 101,
+ 24,
+ 132,
+ 29,
+ 72,
+ 91,
+ 122,
+ 40,
+ 51,
+ 201,
+ 191,
+ 17,
+ 112,
+ 91,
+ 250,
+ 11,
+ 223,
+ 85,
+ 41,
+ 220,
+ 12,
+ 102,
+ 103,
+ 206,
+ 77,
+ 198,
+ 158,
+ 148,
+ 69,
+ 158,
+ 207,
+ 234,
+ 156,
+ 43,
+ 167,
+ 59,
+ 20,
+ 30,
+ 94,
+ 89,
+ 246,
+ 241,
+ 78,
+ 201,
+ 60,
+ 155,
+ 190,
+ 132,
+ 166,
+ 199,
+ 223,
+ 67,
+ 17,
+ 116,
+ 151,
+ 34,
+ 193,
+ 85,
+ 203,
+ 171,
+ 142,
+ 196,
+ 1,
+ 49,
+ 164,
+ 192,
+ 206,
+ 253,
+ 250,
+ 189,
+ 65,
+ 136,
+ 65,
+ 242,
+ 108,
+ 68,
+ 93,
+ 26,
+ 165,
+ 132,
+ 17,
+ 231,
+ 163,
+ 57,
+ 187,
+ 59,
+ 248,
+ 157,
+ 212,
+ 163,
+ 69,
+ 28,
+ 147,
+ 194,
+ 169,
+ 122,
+ 1,
+ 213,
+ 122,
+ 141,
+ 174,
+ 246,
+ 45,
+ 9,
+ 26,
+ 107,
+ 223,
+ 135,
+ 141,
+ 30,
+ 140,
+ 65,
+ 83,
+ 102,
+ 100,
+ 63,
+ 107,
+ 126,
+ 232,
+ 124,
+ 30,
+ 160,
+ 32,
+ 73,
+ 77,
+ 122,
+ 172,
+ 101,
+ 233,
+ 176,
+ 103,
+ 119,
+ 101,
+ 232,
+ 132,
+ 120,
+ 49,
+ 111,
+ 64,
+ 111,
+ 65,
+ 66,
+ 130,
+ 14,
+ 148,
+ 151,
+ 4,
+ 172,
+ 229,
+ 199,
+ 32,
+ 86,
+ 171,
+ 8,
+ 195,
+ 124,
+ 83,
+ 137,
+ 79,
+ 247,
+ 246,
+ 1,
+ 97,
+ 228,
+ 98,
+ 84,
+ 203,
+ 104,
+ 199,
+ 60,
+ 199,
+ 126,
+ 226,
+ 58,
+ 115,
+ 190,
+ 41,
+ 184,
+ 195,
+ 78,
+ 62,
+ 97,
+ 101,
+ 45,
+ 70,
+ 130,
+ 214,
+ 161,
+ 234,
+ 144,
+ 165,
+ 184,
+ 176,
+ 98,
+ 87,
+ 236,
+ 134,
+ 42,
+ 206,
+ 4,
+ 83,
+ 104,
+ 20,
+ 38,
+ 112,
+ 26,
+ 48,
+ 154,
+ 63,
+ 31,
+ 43,
+ 153,
+ 12,
+ 57,
+ 32,
+ 16,
+ 90,
+ 70,
+ 31,
+ 48,
+ 68,
+ 192,
+ 24,
+ 33,
+ 241,
+ 219,
+ 64,
+ 231,
+ 228,
+ 72,
+ 183,
+ 52,
+ 13,
+ 96,
+ 1,
+ 111,
+ 230,
+ 137,
+ 63,
+ 118,
+ 133,
+ 241,
+ 180,
+ 157,
+ 30,
+ 25,
+ 179,
+ 184,
+ 19,
+ 169,
+ 178,
+ 105,
+ 163,
+ 207,
+ 153,
+ 26,
+ 221,
+ 251,
+ 150,
+ 127,
+ 125,
+ 216,
+ 202,
+ 154,
+ 236,
+ 222,
+ 175,
+ 76,
+ 108,
+ 215,
+ 75,
+ 189,
+ 216,
+ 240,
+ 223,
+ 140,
+ 134,
+ 175,
+ 5,
+ 38,
+ 58,
+ 59,
+ 116,
+ 243,
+ 59,
+ 127,
+ 112,
+ 226,
+ 126,
+ 197,
+ 162,
+ 247,
+ 118,
+ 200,
+ 65,
+ 96,
+ 27,
+ 25,
+ 90,
+ 176,
+ 180,
+ 128,
+ 100,
+ 165,
+ 25,
+ 114,
+ 194,
+ 7,
+ 155,
+ 52,
+ 179,
+ 64,
+ 35,
+ 56,
+ 116,
+ 153,
+ 250,
+ 171,
+ 149,
+ 245,
+ 42,
+ 136,
+ 198,
+ 82,
+ 162,
+ 90,
+ 169,
+ 119,
+ 2,
+ 233,
+ 88,
+ 215,
+ 255,
+ 156,
+ 9,
+ 220,
+ 229,
+ 173,
+ 182,
+ 208,
+ 156,
+ 123,
+ 159,
+ 77,
+ 95,
+ 230,
+ 2,
+ 155,
+ 208,
+ 204,
+ 214,
+ 17,
+ 94,
+ 251,
+ 68,
+ 64,
+ 2,
+ 247,
+ 111,
+ 245,
+ 77,
+ 177,
+ 164,
+ 236,
+ 207,
+ 179,
+ 160,
+ 137,
+ 27,
+ 84,
+ 171,
+ 193,
+ 40,
+ 129,
+ 110,
+ 24,
+ 218,
+ 31,
+ 21,
+ 136,
+ 17,
+ 188,
+ 226,
+ 20,
+ 170,
+ 174,
+ 112,
+ 100,
+ 175,
+ 149,
+ 142,
+ 46,
+ 75,
+ 171,
+ 67,
+ 2,
+ 168,
+ 29,
+ 62,
+ 74,
+ 100,
+ 86,
+ 236,
+ 48,
+ 103,
+ 98,
+ 137,
+ 64,
+ 186,
+ 28,
+ 136,
+ 98,
+ 159,
+ 79,
+ 3,
+ 45,
+ 70,
+ 40,
+ 182,
+ 127,
+ 42,
+ 130,
+ 35,
+ 93,
+ 58,
+ 224,
+ 215,
+ 184,
+ 208,
+ 190,
+ 255,
+ 112,
+ 11,
+ 31,
+ 69,
+ 165,
+ 160,
+ 235,
+ 46,
+ 25,
+ 242,
+ 13,
+ 175,
+ 190,
+ 95,
+ 204,
+ 47,
+ 106,
+ 196,
+ 121,
+ 102,
+ 25,
+ 156,
+ 100,
+ 64,
+ 151,
+ 95,
+ 250,
+ 203,
+ 201,
+ 104,
+ 204,
+ 215,
+ 196,
+ 151,
+ 93,
+ 116,
+ 50,
+ 70,
+ 111,
+ 143,
+ 229,
+ 137,
+ 71,
+ 31,
+ 42,
+ 144,
+ 202,
+ 207,
+ 189,
+ 118,
+ 17,
+ 94,
+ 46,
+ 252,
+ 170,
+ 152,
+ 54,
+ 100,
+ 130,
+ 93,
+ 172,
+ 206,
+ 151,
+ 2,
+ 79,
+ 20,
+ 154,
+ 43,
+ 7,
+ 26,
+ 90,
+ 164,
+ 145,
+ 140,
+ 246,
+ 246,
+ 50,
+ 20,
+ 191,
+ 190,
+ 170,
+ 234,
+ 93,
+ 20,
+ 169,
+ 252,
+ 158,
+ 57,
+ 226,
+ 203,
+ 92,
+ 148,
+ 202,
+ 62,
+ 193,
+ 68,
+ 57,
+ 239,
+ 33,
+ 143,
+ 68,
+ 145,
+ 203,
+ 90,
+ 146,
+ 219,
+ 166,
+ 106,
+ 84,
+ 122,
+ 240,
+ 51,
+ 116,
+ 20,
+ 127,
+ 188,
+ 213,
+ 80,
+ 57,
+ 128,
+ 230,
+ 35,
+ 211,
+ 46,
+ 9,
+ 141,
+ 28,
+ 98,
+ 75,
+ 89,
+ 227,
+ 97,
+ 236,
+ 156,
+ 148,
+ 210,
+ 128,
+ 81,
+ 169,
+ 45,
+ 164,
+ 243,
+ 129,
+ 45,
+ 88,
+ 213,
+ 195,
+ 222,
+ 69,
+ 238,
+ 138,
+ 56,
+ 183,
+ 209,
+ 176,
+ 208,
+ 236,
+ 148,
+ 178,
+ 149,
+ 221,
+ 63,
+ 169,
+ 81,
+ 130,
+ 186,
+ 138,
+ 229,
+ 127,
+ 148,
+ 140,
+ 251,
+ 93,
+ 21,
+ 196,
+ 30,
+ 194,
+ 203,
+ 24,
+ 213,
+ 47,
+ 193,
+ 227,
+ 88,
+ 181,
+ 140,
+ 172,
+ 151,
+ 204,
+ 85,
+ 150,
+ 83,
+ 240,
+ 147,
+ 207,
+ 34,
+ 51,
+ 124,
+ 223,
+ 137,
+ 241,
+ 230,
+ 113,
+ 245,
+ 228,
+ 115,
+ 174,
+ 196,
+ 74,
+ 6,
+ 248,
+ 124,
+ 254,
+ 65,
+ 78,
+ 207,
+ 167,
+ 220,
+ 206,
+ 83,
+ 224,
+ 202,
+ 27,
+ 251,
+ 229,
+ 208,
+ 18,
+ 114,
+ 226,
+ 44,
+ 243,
+ 79,
+ 147,
+ 81,
+ 228,
+ 160,
+ 255,
+ 74,
+ 183,
+ 253,
+ 165,
+ 72,
+ 221,
+ 197,
+ 237,
+ 25,
+ 106,
+ 203,
+ 21,
+ 100,
+ 203,
+ 54,
+ 0,
+ 164,
+ 113,
+ 108,
+ 99,
+ 203,
+ 69,
+ 69,
+ 111,
+ 207,
+ 231,
+ 77,
+ 191,
+ 110,
+ 135,
+ 72,
+ 12,
+ 27,
+ 38,
+ 144,
+ 161,
+ 26,
+ 44,
+ 106,
+ 92,
+ 105,
+ 74,
+ 93,
+ 28,
+ 233,
+ 118,
+ 117,
+ 163,
+ 236,
+ 12,
+ 164,
+ 50,
+ 63,
+ 21,
+ 77,
+ 171,
+ 142,
+ 34,
+ 43,
+ 149,
+ 10,
+ 156,
+ 69,
+ 115,
+ 91,
+ 234,
+ 171,
+ 233,
+ 245,
+ 59,
+ 27,
+ 166,
+ 21,
+ 233,
+ 102,
+ 237,
+ 68,
+ 121,
+ 185,
+ 113,
+ 251,
+ 183,
+ 132,
+ 55,
+ 252,
+ 109,
+ 133,
+ 202,
+ 171,
+ 19,
+ 154,
+ 182,
+ 165,
+ 180,
+ 129,
+ 41,
+ 199,
+ 178,
+ 3,
+ 112,
+ 174,
+ 204,
+ 68,
+ 173,
+ 238,
+ 87,
+ 148,
+ 247,
+ 173,
+ 105,
+ 221,
+ 136,
+ 159,
+ 101,
+ 186,
+ 186,
+ 15,
+ 228,
+ 37,
+ 232,
+ 110,
+ 186,
+ 22,
+ 112,
+ 111,
+ 228,
+ 9,
+ 78,
+ 32,
+ 4,
+ 157,
+ 77,
+ 40,
+ 250,
+ 169,
+ 156,
+ 163,
+ 221,
+ 67,
+ 34,
+ 239,
+ 192,
+ 210,
+ 79,
+ 37,
+ 117,
+ 104,
+ 93,
+ 198,
+ 191,
+ 217,
+ 66,
+ 54,
+ 130,
+ 198,
+ 200,
+ 227,
+ 28,
+ 133,
+ 180,
+ 77,
+ 219,
+ 129,
+ 240,
+ 130,
+ 47,
+ 38,
+ 245,
+ 144,
+ 91,
+ 183,
+ 216,
+ 44,
+ 196,
+ 154,
+ 88,
+ 209,
+ 41,
+ 100,
+ 102,
+ 40,
+ 35,
+ 90,
+ 214,
+ 224,
+ 127,
+ 133,
+ 30,
+ 202,
+ 40,
+ 22,
+ 201,
+ 23,
+ 61,
+ 131,
+ 16,
+ 65,
+ 17,
+ 200,
+ 7,
+ 70,
+ 208,
+ 164,
+ 61,
+ 75,
+ 53,
+ 168,
+ 151,
+ 201,
+ 121,
+ 227,
+ 102,
+ 155,
+ 47,
+ 39,
+ 54,
+ 36,
+ 249,
+ 44,
+ 86,
+ 149,
+ 97,
+ 45,
+ 183,
+ 221,
+ 168,
+ 126,
+ 224,
+ 88,
+ 230,
+ 82,
+ 100,
+ 112,
+ 240,
+ 201,
+ 233,
+ 18,
+ 150,
+ 41,
+ 122,
+ 117,
+ 19,
+ 171,
+ 89,
+ 205,
+ 4,
+ 13,
+ 40,
+ 20,
+ 73,
+ 120,
+ 191,
+ 207,
+ 210,
+ 227,
+ 73,
+ 176,
+ 139,
+ 40,
+ 196,
+ 160,
+ 190,
+ 16,
+ 141,
+ 190,
+ 38,
+ 17,
+ 225,
+ 153,
+ 156,
+ 49,
+ 167,
+ 39,
+ 44,
+ 78,
+ 107,
+ 20,
+ 94,
+ 206,
+ 112,
+ 242,
+ 185,
+ 78,
+ 6,
+ 165,
+ 247,
+ 143,
+ 29,
+ 92,
+ 158,
+ 218,
+ 66,
+ 45,
+ 51,
+ 65,
+ 19,
+ 173,
+ 117,
+ 48,
+ 245,
+ 166,
+ 68,
+ 254,
+ 30,
+ 18,
+ 213,
+ 2,
+ 246,
+ 45,
+ 0,
+ 36,
+ 73,
+ 23,
+ 246,
+ 18,
+ 8,
+ 42,
+ 242,
+ 50,
+ 216,
+ 46,
+ 96,
+ 7,
+ 181,
+ 73,
+ 196,
+ 206,
+ 169,
+ 28,
+ 142,
+ 30,
+ 184,
+ 50,
+ 194,
+ 120,
+ 179,
+ 21,
+ 82,
+ 74,
+ 23,
+ 131,
+ 242,
+ 102,
+ 76,
+ 209,
+ 248,
+ 50,
+ 109,
+ 129,
+ 103,
+ 112,
+ 85,
+ 90,
+ 200,
+ 24,
+ 41,
+ 75,
+ 169,
+ 61,
+ 46,
+ 92,
+ 148,
+ 59,
+ 84,
+ 141,
+ 213,
+ 169,
+ 82,
+ 225,
+ 110,
+ 87,
+ 15,
+ 249,
+ 213,
+ 38,
+ 203,
+ 76,
+ 26,
+ 164,
+ 95,
+ 125,
+ 232,
+ 217,
+ 80,
+ 193,
+ 93,
+ 53,
+ 128,
+ 189,
+ 60,
+ 89,
+ 152,
+ 98,
+ 168,
+ 116,
+ 70,
+ 184,
+ 38,
+ 166,
+ 45,
+ 143,
+ 117,
+ 176,
+ 109,
+ 245,
+ 48,
+ 83,
+ 40,
+ 60,
+ 255,
+ 197,
+ 99,
+ 86,
+ 16,
+ 245,
+ 28,
+ 33,
+ 127,
+ 108,
+ 104,
+ 238,
+ 194,
+ 67,
+ 149,
+ 42,
+ 23,
+ 60,
+ 36,
+ 85,
+ 205,
+ 236,
+ 226,
+ 247,
+ 177,
+ 38,
+ 27,
+ 165,
+ 22,
+ 59,
+ 242,
+ 193,
+ 41,
+ 163,
+ 205,
+ 15,
+ 50,
+ 36,
+ 29,
+ 130,
+ 239,
+ 19,
+ 170,
+ 81,
+ 174,
+ 222,
+ 15,
+ 221,
+ 99,
+ 89,
+ 204,
+ 171,
+ 63,
+ 94,
+ 165,
+ 201,
+ 14,
+ 224,
+ 191,
+ 208,
+ 243,
+ 49,
+ 163,
+ 90,
+ 237,
+ 230,
+ 111,
+ 147,
+ 20,
+ 246,
+ 161,
+ 76,
+ 143,
+ 87,
+ 160,
+ 28,
+ 130,
+ 63,
+ 31,
+ 117,
+ 133,
+ 91,
+ 112,
+ 63,
+ 131,
+ 124,
+ 104,
+ 137,
+ 89,
+ 156,
+ 120,
+ 70,
+ 82,
+ 22,
+ 241,
+ 124,
+ 207,
+ 191,
+ 212,
+ 22,
+ 133,
+ 11,
+ 54,
+ 4,
+ 52,
+ 14,
+ 145,
+ 63,
+ 126,
+ 62,
+ 152,
+ 227,
+ 120,
+ 108,
+ 50,
+ 243,
+ 8,
+ 68,
+ 161,
+ 211,
+ 254,
+ 72,
+ 202,
+ 56,
+ 198,
+ 205,
+ 234,
+ 19,
+ 78,
+ 243,
+ 38,
+ 189,
+ 29,
+ 15,
+ 197,
+ 221,
+ 82,
+ 90,
+ 194,
+ 106,
+ 133,
+ 106,
+ 180,
+ 195,
+ 55,
+ 81,
+ 254,
+ 163,
+ 188,
+ 145,
+ 38,
+ 134,
+ 6,
+ 179,
+ 226,
+ 43,
+ 142,
+ 92,
+ 229,
+ 137,
+ 182,
+ 58,
+ 212,
+ 237,
+ 84,
+ 35,
+ 176,
+ 116,
+ 92,
+ 189,
+ 91,
+ 120,
+ 37,
+ 78,
+ 32,
+ 121,
+ 11,
+ 230,
+ 17,
+ 22,
+ 169,
+ 21,
+ 31,
+ 74,
+ 134,
+ 41,
+ 168,
+ 11,
+ 109,
+ 114,
+ 40,
+ 249,
+ 249,
+ 210,
+ 181,
+ 167,
+ 20,
+ 205,
+ 228,
+ 45,
+ 196,
+ 193,
+ 135,
+ 38,
+ 125,
+ 67,
+ 139,
+ 129,
+ 112,
+ 9,
+ 125,
+ 243,
+ 141,
+ 68,
+ 237,
+ 149,
+ 187,
+ 250,
+ 83,
+ 63,
+ 232,
+ 19,
+ 199,
+ 239,
+ 183,
+ 2,
+ 192,
+ 14,
+ 215,
+ 70,
+ 95,
+ 3,
+ 131,
+ 27,
+ 250,
+ 101,
+ 103,
+ 199,
+ 150,
+ 93,
+ 234,
+ 12,
+ 236,
+ 154,
+ 201,
+ 160,
+ 60,
+ 40,
+ 101,
+ 144,
+ 123,
+ 88,
+ 36,
+ 237,
+ 74,
+ 161,
+ 90,
+ 198,
+ 163,
+ 34,
+ 163,
+ 123,
+ 132,
+ 57,
+ 33,
+ 103,
+ 132,
+ 131,
+ 102,
+ 138,
+ 113,
+ 15,
+ 162,
+ 104,
+ 198,
+ 52,
+ 228,
+ 67,
+ 89,
+ 117,
+ 186,
+ 19,
+ 57,
+ 140,
+ 27,
+ 174,
+ 180,
+ 36,
+ 50,
+ 200,
+ 149,
+ 144,
+ 69,
+ 185,
+ 25,
+ 67,
+ 34,
+ 92,
+ 228,
+ 75,
+ 251,
+ 76,
+ 202,
+ 200,
+ 51,
+ 250,
+ 34,
+ 230,
+ 228,
+ 135,
+ 54,
+ 135,
+ 26,
+ 199,
+ 110,
+ 76,
+ 115,
+ 41,
+ 82,
+ 58,
+ 91,
+ 72,
+ 205,
+ 117,
+ 97,
+ 136,
+ 198,
+ 15,
+ 233,
+ 135,
+ 54,
+ 21,
+ 6,
+ 182,
+ 48,
+ 83,
+ 89,
+ 31,
+ 152,
+ 36,
+ 217,
+ 240,
+ 68,
+ 133,
+ 44,
+ 149,
+ 110,
+ 133,
+ 148,
+ 251,
+ 246,
+ 197,
+ 28,
+ 155,
+ 79,
+ 148,
+ 218,
+ 45,
+ 35,
+ 46,
+ 104,
+ 136,
+ 64,
+ 144,
+ 96,
+ 200,
+ 207,
+ 168,
+ 165,
+ 10,
+ 1,
+ 57,
+ 89,
+ 187,
+ 99,
+ 165,
+ 24,
+ 141,
+ 168,
+ 234,
+ 99,
+ 91,
+ 81,
+ 19,
+ 46,
+ 125,
+ 47,
+ 81,
+ 7,
+ 182,
+ 171,
+ 56,
+ 134,
+ 48,
+ 171,
+ 39,
+ 171,
+ 205,
+ 137,
+ 192,
+ 54,
+ 114,
+ 79,
+ 43,
+ 219,
+ 248,
+ 155,
+ 21,
+ 216,
+ 211,
+ 27,
+ 131,
+ 128,
+ 16,
+ 91,
+ 9,
+ 137,
+ 11,
+ 79,
+ 218,
+ 70,
+ 201,
+ 54,
+ 65,
+ 9,
+ 63,
+ 84,
+ 105,
+ 115,
+ 226,
+ 174,
+ 234,
+ 185,
+ 251,
+ 147,
+ 175,
+ 183,
+ 51,
+ 152,
+ 103,
+ 236,
+ 77,
+ 205,
+ 33,
+ 185,
+ 11,
+ 119,
+ 204,
+ 144,
+ 143,
+ 202,
+ 39,
+ 132,
+ 7,
+ 43,
+ 227,
+ 244,
+ 124,
+ 111,
+ 58,
+ 53,
+ 244,
+ 235,
+ 232,
+ 41,
+ 170,
+ 137,
+ 60,
+ 152,
+ 226,
+ 154,
+ 143,
+ 119,
+ 89,
+ 208,
+ 72,
+ 163,
+ 57,
+ 114,
+ 250,
+ 33,
+ 160,
+ 150,
+ 67,
+ 32,
+ 27,
+ 96,
+ 218,
+ 73,
+ 156,
+ 167,
+ 176,
+ 79,
+ 223,
+ 161,
+ 2,
+ 197,
+ 207,
+ 106,
+ 199,
+ 140,
+ 222,
+ 127,
+ 176,
+ 31,
+ 215,
+ 33,
+ 26,
+ 125,
+ 219,
+ 183,
+ 39,
+ 133,
+ 181,
+ 74,
+ 96,
+ 60,
+ 235,
+ 181,
+ 5,
+ 194,
+ 93,
+ 121,
+ 237,
+ 153,
+ 81,
+ 218,
+ 215,
+ 87,
+ 22,
+ 139,
+ 175,
+ 31,
+ 150,
+ 78,
+ 43,
+ 189,
+ 138,
+ 112,
+ 248,
+ 73,
+ 152,
+ 114,
+ 111,
+ 89,
+ 249,
+ 146,
+ 109,
+ 69,
+ 246,
+ 6,
+ 47,
+ 227,
+ 199,
+ 217,
+ 25,
+ 163,
+ 206,
+ 208,
+ 63,
+ 122,
+ 54,
+ 214,
+ 147,
+ 82,
+ 30,
+ 194,
+ 88,
+ 28,
+ 222,
+ 231,
+ 194,
+ 77,
+ 237,
+ 1,
+ 104,
+ 67,
+ 68,
+ 137,
+ 239,
+ 58,
+ 128,
+ 129,
+ 162,
+ 245,
+ 143,
+ 149,
+ 219,
+ 97,
+ 149,
+ 133,
+ 104,
+ 47,
+ 57,
+ 37,
+ 85,
+ 113,
+ 42,
+ 58,
+ 50,
+ 80,
+ 148,
+ 84,
+ 78,
+ 225,
+ 104,
+ 251,
+ 19,
+ 3,
+ 44,
+ 82,
+ 56,
+ 80,
+ 198,
+ 133,
+ 17,
+ 193,
+ 221,
+ 211,
+ 226,
+ 138,
+ 82,
+ 167,
+ 118,
+ 102,
+ 107,
+ 206,
+ 37,
+ 235,
+ 53,
+ 179,
+ 232,
+ 171,
+ 176,
+ 195,
+ 63,
+ 241,
+ 208,
+ 84,
+ 185,
+ 121,
+ 224,
+ 28,
+ 234,
+ 58,
+ 205,
+ 230,
+ 55,
+ 218,
+ 227,
+ 88,
+ 26,
+ 120,
+ 51,
+ 194,
+ 26,
+ 230,
+ 184,
+ 25,
+ 87,
+ 167,
+ 207,
+ 181,
+ 42,
+ 78,
+ 238,
+ 188,
+ 154,
+ 107,
+ 103,
+ 195,
+ 157,
+ 168,
+ 91,
+ 134,
+ 127,
+ 37,
+ 236,
+ 207,
+ 160,
+ 141,
+ 48,
+ 64,
+ 109,
+ 56,
+ 3,
+ 114,
+ 107,
+ 80,
+ 167,
+ 207,
+ 162,
+ 98,
+ 94,
+ 122,
+ 77,
+ 55,
+ 149,
+ 76,
+ 164,
+ 248,
+ 196,
+ 108,
+ 141,
+ 127,
+ 39,
+ 7,
+ 231,
+ 254,
+ 196,
+ 153,
+ 247,
+ 80,
+ 166,
+ 96,
+ 96,
+ 121,
+ 176,
+ 222,
+ 215,
+ 206,
+ 223,
+ 109,
+ 229,
+ 92,
+ 142,
+ 243,
+ 208,
+ 63,
+ 176,
+ 194,
+ 170,
+ 63,
+ 135,
+ 77,
+ 208,
+ 30,
+ 203,
+ 220,
+ 178,
+ 75,
+ 226,
+ 51,
+ 182,
+ 124,
+ 253,
+ 97,
+ 145,
+ 159,
+ 102,
+ 243,
+ 78,
+ 7,
+ 115,
+ 54,
+ 161,
+ 97,
+ 126,
+ 151,
+ 1,
+ 15,
+ 185,
+ 123,
+ 125,
+ 11,
+ 1,
+ 201,
+ 185,
+ 148,
+ 60,
+ 36,
+ 108,
+ 149,
+ 25,
+ 35,
+ 151,
+ 190,
+ 5,
+ 184,
+ 116,
+ 191,
+ 16,
+ 160,
+ 63,
+ 75,
+ 47,
+ 133,
+ 196,
+ 234,
+ 170,
+ 58,
+ 213,
+ 30,
+ 133,
+ 153,
+ 192,
+ 63,
+ 43,
+ 179,
+ 227,
+ 221,
+ 138,
+ 159,
+ 176,
+ 107,
+ 109,
+ 145,
+ 136,
+ 68,
+ 143,
+ 234,
+ 30,
+ 211,
+ 65,
+ 49,
+ 151,
+ 200,
+ 176,
+ 67,
+ 70,
+ 202,
+ 106,
+ 76,
+ 23,
+ 219,
+ 195,
+ 133,
+ 115,
+ 125,
+ 70,
+ 214,
+ 69,
+ 38,
+ 65,
+ 167,
+ 204,
+ 218,
+ 217,
+ 84,
+ 228,
+ 249,
+ 228,
+ 111,
+ 248,
+ 122,
+ 109,
+ 215,
+ 0,
+ 237,
+ 138,
+ 119,
+ 154,
+ 68,
+ 113,
+ 124,
+ 175,
+ 125,
+ 8,
+ 111,
+ 206,
+ 251,
+ 37,
+ 185,
+ 58,
+ 82,
+ 179,
+ 100,
+ 188,
+ 205,
+ 247,
+ 143,
+ 141,
+ 99,
+ 210,
+ 230,
+ 46,
+ 168,
+ 176,
+ 30,
+ 42,
+ 115,
+ 244,
+ 212,
+ 191,
+ 136,
+ 22,
+ 179,
+ 119,
+ 231,
+ 105,
+ 132,
+ 147,
+ 171,
+ 88,
+ 143,
+ 32,
+ 31,
+ 131,
+ 112,
+ 106,
+ 93,
+ 255,
+ 132,
+ 80,
+ 249,
+ 229,
+ 145,
+ 42,
+ 66,
+ 167,
+ 36,
+ 126,
+ 188,
+ 60,
+ 116,
+ 196,
+ 166,
+ 110,
+ 184,
+ 213,
+ 188,
+ 213,
+ 198,
+ 140,
+ 126,
+ 217,
+ 77,
+ 10,
+ 147,
+ 93,
+ 226,
+ 111,
+ 96,
+ 177,
+ 117,
+ 13,
+ 104,
+ 108,
+ 158,
+ 44,
+ 175,
+ 115,
+ 234,
+ 4,
+ 140,
+ 172,
+ 127,
+ 134,
+ 209,
+ 65,
+ 157,
+ 135,
+ 132,
+ 184,
+ 71,
+ 78,
+ 108,
+ 253,
+ 229,
+ 219,
+ 168,
+ 244,
+ 147,
+ 166,
+ 186,
+ 79,
+ 204,
+ 188,
+ 68,
+ 184,
+ 78,
+ 181,
+ 91,
+ 10,
+ 82,
+ 168,
+ 163,
+ 184,
+ 33,
+ 98,
+ 55,
+ 94,
+ 188,
+ 238,
+ 157,
+ 164,
+ 150,
+ 238,
+ 213,
+ 75,
+ 251,
+ 103,
+ 219,
+ 91,
+ 119,
+ 214,
+ 165,
+ 154,
+ 42,
+ 113,
+ 13,
+ 88,
+ 244,
+ 130,
+ 91,
+ 214,
+ 82,
+ 67,
+ 112,
+ 92,
+ 190,
+ 249,
+ 122,
+ 238,
+ 239,
+ 83,
+ 238,
+ 228,
+ 243,
+ 36,
+ 62,
+ 15,
+ 148,
+ 28,
+ 73,
+ 30,
+ 252,
+ 154,
+ 178,
+ 97,
+ 2,
+ 236,
+ 227,
+ 220,
+ 71,
+ 243,
+ 221,
+ 86,
+ 179,
+ 44,
+ 171,
+ 86,
+ 233,
+ 210,
+ 134,
+ 96,
+ 251,
+ 46,
+ 237,
+ 244,
+ 18,
+ 28,
+ 20,
+ 120,
+ 212,
+ 57,
+ 113,
+ 237,
+ 224,
+ 48,
+ 250,
+ 0,
+ 223,
+ 173,
+ 8,
+ 227,
+ 80,
+ 15,
+ 140,
+ 76,
+ 134,
+ 61,
+ 238,
+ 120,
+ 69,
+ 162,
+ 165,
+ 10,
+ 80,
+ 41,
+ 131,
+ 219,
+ 166,
+ 132,
+ 178,
+ 37,
+ 94,
+ 126,
+ 11,
+ 148,
+ 86,
+ 106,
+ 159,
+ 251,
+ 34,
+ 100,
+ 19,
+ 168,
+ 78,
+ 186,
+ 103,
+ 122,
+ 117,
+ 84,
+ 19,
+ 231,
+ 207,
+ 18,
+ 189,
+ 232,
+ 145,
+ 151,
+ 205,
+ 15,
+ 201,
+ 90,
+ 251,
+ 102,
+ 247,
+ 69,
+ 173,
+ 21,
+ 158,
+ 105,
+ 114,
+ 77,
+ 153,
+ 107,
+ 27,
+ 242,
+ 225,
+ 226,
+ 203,
+ 27,
+ 161,
+ 51,
+ 80,
+ 236,
+ 134,
+ 25,
+ 177,
+ 69,
+ 60,
+ 242,
+ 108,
+ 125,
+ 185,
+ 113,
+ 182,
+ 173,
+ 134,
+ 75,
+ 103,
+ 90,
+ 164,
+ 86,
+ 156,
+ 61,
+ 215,
+ 222,
+ 28,
+ 131,
+ 44,
+ 51,
+ 107,
+ 230,
+ 75,
+ 92,
+ 44,
+ 61,
+ 52,
+ 47,
+ 9,
+ 206,
+ 137,
+ 127,
+ 151,
+ 54,
+ 65,
+ 22,
+ 217,
+ 175,
+ 102,
+ 180,
+ 244,
+ 249,
+ 52,
+ 23,
+ 66,
+ 237,
+ 195,
+ 2,
+ 149,
+ 159,
+ 67,
+ 39,
+ 98,
+ 209,
+ 248,
+ 42,
+ 41,
+ 60,
+ 111,
+ 144,
+ 208,
+ 222,
+ 166,
+ 140,
+ 11,
+ 18,
+ 0,
+ 91,
+ 15,
+ 61,
+ 31,
+ 56,
+ 75,
+ 140,
+ 54,
+ 110,
+ 127,
+ 100,
+ 0,
+ 156,
+ 236,
+ 14,
+ 64,
+ 18,
+ 75,
+ 179,
+ 151,
+ 50,
+ 236,
+ 62,
+ 23,
+ 197,
+ 195,
+ 101,
+ 177,
+ 38,
+ 125,
+ 94,
+ 40,
+ 113,
+ 183,
+ 158,
+ 160,
+ 172,
+ 163,
+ 249,
+ 53,
+ 45,
+ 148,
+ 131,
+ 38,
+ 12,
+ 185,
+ 153,
+ 15,
+ 84,
+ 231,
+ 188,
+ 11,
+ 92,
+ 112,
+ 228,
+ 173,
+ 208,
+ 242,
+ 68,
+ 194,
+ 225,
+ 14,
+ 194,
+ 231,
+ 235,
+ 64,
+ 80,
+ 22,
+ 142,
+ 8,
+ 93,
+ 81,
+ 203,
+ 44,
+ 224,
+ 56,
+ 54,
+ 210,
+ 29,
+ 107,
+ 146,
+ 188,
+ 45,
+ 139,
+ 197,
+ 168,
+ 23,
+ 87,
+ 225,
+ 121,
+ 77,
+ 137,
+ 21,
+ 92,
+ 139,
+ 71,
+ 177,
+ 217,
+ 19,
+ 9,
+ 178,
+ 219,
+ 82,
+ 28,
+ 231,
+ 233,
+ 191,
+ 81,
+ 240,
+ 18,
+ 165,
+ 239,
+ 25,
+ 85,
+ 171,
+ 221,
+ 145,
+ 171,
+ 156,
+ 5,
+ 67,
+ 4,
+ 78,
+ 178,
+ 204,
+ 25,
+ 250,
+ 216,
+ 151,
+ 137,
+ 52,
+ 224,
+ 82,
+ 111,
+ 215,
+ 120,
+ 79,
+ 238,
+ 186,
+ 144,
+ 87,
+ 135,
+ 101,
+ 39,
+ 92,
+ 24,
+ 25,
+ 225,
+ 103,
+ 147,
+ 49,
+ 95,
+ 32,
+ 5,
+ 96,
+ 200,
+ 9,
+ 3,
+ 238,
+ 74,
+ 115,
+ 223,
+ 68,
+ 30,
+ 89,
+ 25,
+ 177,
+ 34,
+ 107,
+ 235,
+ 174,
+ 92,
+ 28,
+ 202,
+ 127,
+ 170,
+ 223,
+ 239,
+ 115,
+ 84,
+ 168,
+ 174,
+ 147,
+ 94,
+ 53,
+ 87,
+ 68,
+ 127,
+ 220,
+ 221,
+ 82,
+ 33,
+ 23,
+ 212,
+ 132,
+ 211,
+ 26,
+ 217,
+ 72,
+ 102,
+ 89,
+ 224,
+ 213,
+ 126,
+ 182,
+ 13,
+ 4,
+ 21,
+ 240,
+ 223,
+ 243,
+ 27,
+ 5,
+ 238,
+ 82,
+ 13,
+ 222,
+ 234,
+ 170,
+ 138,
+ 2,
+ 65,
+ 47,
+ 79,
+ 77,
+ 68,
+ 160,
+ 215,
+ 188,
+ 177,
+ 79,
+ 155,
+ 113,
+ 22,
+ 204,
+ 81,
+ 225,
+ 135,
+ 182,
+ 88,
+ 182,
+ 207,
+ 121,
+ 1,
+ 8,
+ 124,
+ 21,
+ 94,
+ 80,
+ 192,
+ 63,
+ 136,
+ 103,
+ 75,
+ 251,
+ 103,
+ 135,
+ 247,
+ 63,
+ 4,
+ 218,
+ 98,
+ 28,
+ 26,
+ 207,
+ 91,
+ 197,
+ 48,
+ 115,
+ 116,
+ 146,
+ 248,
+ 174,
+ 249,
+ 235,
+ 187,
+ 88,
+ 176,
+ 119,
+ 68,
+ 204,
+ 240,
+ 120,
+ 87,
+ 79,
+ 237,
+ 48,
+ 147,
+ 27,
+ 38,
+ 144,
+ 143,
+ 210,
+ 129,
+ 164,
+ 113,
+ 26,
+ 158,
+ 221,
+ 16,
+ 244,
+ 206,
+ 128,
+ 238,
+ 205,
+ 29,
+ 204,
+ 175,
+ 185,
+ 140,
+ 112,
+ 108,
+ 200,
+ 80,
+ 82,
+ 59,
+ 240,
+ 231,
+ 244,
+ 183,
+ 78,
+ 101,
+ 51,
+ 37,
+ 85,
+ 67,
+ 171,
+ 12,
+ 11,
+ 193,
+ 39,
+ 251,
+ 219,
+ 28,
+ 185,
+ 89,
+ 236,
+ 164,
+ 11,
+ 56,
+ 170,
+ 153,
+ 154,
+ 20,
+ 108,
+ 3,
+ 91,
+ 195,
+ 2,
+ 65,
+ 15,
+ 99,
+ 54,
+ 228,
+ 69,
+ 5,
+ 117,
+ 13,
+ 177,
+ 14,
+ 100,
+ 179,
+ 68,
+ 38,
+ 198,
+ 168,
+ 145,
+ 68,
+ 170,
+ 13,
+ 102,
+ 17,
+ 242,
+ 203,
+ 114,
+ 181,
+ 193,
+ 244,
+ 201,
+ 80,
+ 102,
+ 197,
+ 63,
+ 198,
+ 213,
+ 86,
+ 134,
+ 62,
+ 161,
+ 6,
+ 130,
+ 128,
+ 240,
+ 104,
+ 87,
+ 209,
+ 192,
+ 32,
+ 101,
+ 54,
+ 10,
+ 1,
+ 10,
+ 7,
+ 134,
+ 48,
+ 20,
+ 92,
+ 176,
+ 184,
+ 45,
+ 53,
+ 144,
+ 54,
+ 207,
+ 108,
+ 217,
+ 121,
+ 245,
+ 138,
+ 227,
+ 176,
+ 239,
+ 211,
+ 161,
+ 207,
+ 97,
+ 64,
+ 199,
+ 154,
+ 214,
+ 189,
+ 157,
+ 44,
+ 64,
+ 115,
+ 254,
+ 27,
+ 134,
+ 68,
+ 237,
+ 215,
+ 53,
+ 222,
+ 92,
+ 176,
+ 36,
+ 190,
+ 152,
+ 247,
+ 190,
+ 14,
+ 104,
+ 230,
+ 55,
+ 118,
+ 238,
+ 224,
+ 146,
+ 100,
+ 11,
+ 151,
+ 192,
+ 162,
+ 243,
+ 161,
+ 93,
+ 50,
+ 226,
+ 157,
+ 163,
+ 28,
+ 99,
+ 145,
+ 49,
+ 186,
+ 6,
+ 237,
+ 244,
+ 26,
+ 122,
+ 53,
+ 129,
+ 150,
+ 192,
+ 49,
+ 143,
+ 176,
+ 19,
+ 40,
+ 94,
+ 150,
+ 117,
+ 35,
+ 224,
+ 50,
+ 125,
+ 181,
+ 47,
+ 203,
+ 62,
+ 209,
+ 201,
+ 240,
+ 228,
+ 222,
+ 60,
+ 208,
+ 122,
+ 126,
+ 175,
+ 201,
+ 243,
+ 160,
+ 254,
+ 54,
+ 218,
+ 221,
+ 43,
+ 248,
+ 84,
+ 230,
+ 73,
+ 159,
+ 236,
+ 169,
+ 234,
+ 217,
+ 25,
+ 239,
+ 2,
+ 240,
+ 169,
+ 215,
+ 117,
+ 200,
+ 166,
+ 183,
+ 207,
+ 186,
+ 96,
+ 217,
+ 140,
+ 60,
+ 159,
+ 206,
+ 150,
+ 67,
+ 10,
+ 83,
+ 221,
+ 92,
+ 90,
+ 195,
+ 191,
+ 15,
+ 182,
+ 19,
+ 90,
+ 58,
+ 52,
+ 232,
+ 121,
+ 118,
+ 89,
+ 13,
+ 70,
+ 189,
+ 172,
+ 251,
+ 160,
+ 94,
+ 145,
+ 76,
+ 77,
+ 87,
+ 160,
+ 208,
+ 135,
+ 113,
+ 21,
+ 96,
+ 103,
+ 124,
+ 15,
+ 223,
+ 239,
+ 164,
+ 113,
+ 229,
+ 6,
+ 82,
+ 49,
+ 247,
+ 11,
+ 173,
+ 76,
+ 23,
+ 234,
+ 161,
+ 77,
+ 67,
+ 1,
+ 163,
+ 52,
+ 119,
+ 126,
+ 43,
+ 145,
+ 120,
+ 22,
+ 239,
+ 63,
+ 197,
+ 246,
+ 14,
+ 10,
+ 115,
+ 115,
+ 150,
+ 131,
+ 136,
+ 250,
+ 138,
+ 243,
+ 127,
+ 91,
+ 118,
+ 187,
+ 91,
+ 206,
+ 43,
+ 220,
+ 162,
+ 222,
+ 232,
+ 57,
+ 31,
+ 114,
+ 182,
+ 167,
+ 183,
+ 130,
+ 160,
+ 208,
+ 255,
+ 74,
+ 50,
+ 184,
+ 210,
+ 210,
+ 82,
+ 235,
+ 88,
+ 124,
+ 218,
+ 99,
+ 122,
+ 253,
+ 222,
+ 57,
+ 126,
+ 109,
+ 62,
+ 80,
+ 97,
+ 179,
+ 157,
+ 246,
+ 70,
+ 229,
+ 111,
+ 227,
+ 37,
+ 74,
+ 68,
+ 127,
+ 208,
+ 177,
+ 15,
+ 135,
+ 137,
+ 147,
+ 181,
+ 145,
+ 44,
+ 216,
+ 210,
+ 191,
+ 33,
+ 75,
+ 190,
+ 249,
+ 117,
+ 101,
+ 207,
+ 131,
+ 187,
+ 82,
+ 231,
+ 217,
+ 116,
+ 87,
+ 223,
+ 133,
+ 45,
+ 71,
+ 254,
+ 7,
+ 162,
+ 231,
+ 252,
+ 35,
+ 92,
+ 253,
+ 139,
+ 151,
+ 73,
+ 79,
+ 221,
+ 223,
+ 167,
+ 152,
+ 151,
+ 236,
+ 89,
+ 229,
+ 248,
+ 142,
+ 176,
+ 21,
+ 187,
+ 207,
+ 119,
+ 116,
+ 246,
+ 218,
+ 82,
+ 202,
+ 248,
+ 78,
+ 60,
+ 254,
+ 73,
+ 228,
+ 40,
+ 108,
+ 54,
+ 248,
+ 95,
+ 106,
+ 109,
+ 93,
+ 211,
+ 60,
+ 217,
+ 15,
+ 188,
+ 117,
+ 189,
+ 91,
+ 67,
+ 52,
+ 21,
+ 153,
+ 185,
+ 162,
+ 91,
+ 10,
+ 168,
+ 174,
+ 221,
+ 186,
+ 198,
+ 65,
+ 27,
+ 141,
+ 254,
+ 95,
+ 234,
+ 174,
+ 206,
+ 126,
+ 190,
+ 38,
+ 139,
+ 19,
+ 89,
+ 249,
+ 115,
+ 26,
+ 167,
+ 50,
+ 249,
+ 151,
+ 215,
+ 0,
+ 45,
+ 117,
+ 125,
+ 181,
+ 114,
+ 21,
+ 155,
+ 176,
+ 255,
+ 0,
+ 80,
+ 75,
+ 3,
+ 4,
+ 20,
+ 0,
+ 0,
+ 8,
+ 8,
+ 0,
+ 184,
+ 182,
+ 42,
+ 68,
+ 49,
+ 191,
+ 99,
+ 158,
+ 35,
+ 6,
+ 0,
+ 0,
+ 211,
+ 60,
+ 0,
+ 0,
+ 12,
+ 0,
+ 0,
+ 0,
+ 97,
+ 114,
+ 105,
+ 97,
+ 108,
+ 95,
+ 49,
+ 52,
+ 46,
+ 102,
+ 110,
+ 116,
+ 189,
+ 91,
+ 219,
+ 110,
+ 219,
+ 72,
+ 12,
+ 125,
+ 239,
+ 87,
+ 8,
+ 122,
+ 110,
+ 55,
+ 115,
+ 191,
+ 0,
+ 78,
+ 129,
+ 190,
+ 245,
+ 15,
+ 246,
+ 113,
+ 161,
+ 181,
+ 229,
+ 68,
+ 168,
+ 35,
+ 5,
+ 177,
+ 179,
+ 155,
+ 238,
+ 215,
+ 175,
+ 102,
+ 56,
+ 78,
+ 45,
+ 59,
+ 82,
+ 73,
+ 141,
+ 45,
+ 20,
+ 72,
+ 101,
+ 199,
+ 199,
+ 103,
+ 200,
+ 33,
+ 15,
+ 41,
+ 142,
+ 178,
+ 218,
+ 118,
+ 237,
+ 225,
+ 235,
+ 167,
+ 162,
+ 88,
+ 53,
+ 237,
+ 182,
+ 43,
+ 182,
+ 213,
+ 186,
+ 190,
+ 47,
+ 191,
+ 189,
+ 52,
+ 213,
+ 174,
+ 44,
+ 246,
+ 205,
+ 127,
+ 253,
+ 11,
+ 174,
+ 202,
+ 226,
+ 239,
+ 110,
+ 183,
+ 185,
+ 47,
+ 89,
+ 89,
+ 52,
+ 135,
+ 106,
+ 215,
+ 172,
+ 227,
+ 229,
+ 250,
+ 177,
+ 122,
+ 217,
+ 215,
+ 135,
+ 251,
+ 178,
+ 44,
+ 94,
+ 219,
+ 102,
+ 221,
+ 109,
+ 234,
+ 112,
+ 185,
+ 63,
+ 188,
+ 212,
+ 135,
+ 245,
+ 227,
+ 247,
+ 30,
+ 199,
+ 250,
+ 15,
+ 237,
+ 159,
+ 186,
+ 238,
+ 240,
+ 216,
+ 191,
+ 40,
+ 139,
+ 170,
+ 138,
+ 255,
+ 61,
+ 87,
+ 155,
+ 77,
+ 211,
+ 62,
+ 220,
+ 151,
+ 226,
+ 115,
+ 252,
+ 215,
+ 127,
+ 230,
+ 185,
+ 90,
+ 199,
+ 119,
+ 216,
+ 231,
+ 30,
+ 209,
+ 189,
+ 30,
+ 118,
+ 77,
+ 91,
+ 7,
+ 138,
+ 187,
+ 184,
+ 174,
+ 117,
+ 247,
+ 244,
+ 212,
+ 181,
+ 69,
+ 120,
+ 243,
+ 123,
+ 221,
+ 60,
+ 60,
+ 246,
+ 140,
+ 220,
+ 244,
+ 75,
+ 170,
+ 246,
+ 97,
+ 113,
+ 178,
+ 199,
+ 175,
+ 171,
+ 93,
+ 253,
+ 231,
+ 125,
+ 105,
+ 29,
+ 79,
+ 47,
+ 2,
+ 187,
+ 11,
+ 84,
+ 15,
+ 245,
+ 62,
+ 145,
+ 174,
+ 127,
+ 212,
+ 155,
+ 95,
+ 223,
+ 25,
+ 127,
+ 19,
+ 174,
+ 210,
+ 117,
+ 209,
+ 128,
+ 121,
+ 219,
+ 102,
+ 215,
+ 127,
+ 105,
+ 21,
+ 204,
+ 255,
+ 139,
+ 171,
+ 63,
+ 158,
+ 219,
+ 135,
+ 4,
+ 184,
+ 123,
+ 71,
+ 172,
+ 162,
+ 221,
+ 197,
+ 186,
+ 123,
+ 109,
+ 251,
+ 149,
+ 120,
+ 94,
+ 166,
+ 175,
+ 9,
+ 111,
+ 199,
+ 175,
+ 241,
+ 182,
+ 44,
+ 222,
+ 122,
+ 243,
+ 202,
+ 226,
+ 103,
+ 252,
+ 249,
+ 111,
+ 179,
+ 9,
+ 30,
+ 232,
+ 223,
+ 125,
+ 76,
+ 203,
+ 239,
+ 151,
+ 246,
+ 214,
+ 109,
+ 183,
+ 209,
+ 121,
+ 253,
+ 226,
+ 126,
+ 30,
+ 175,
+ 123,
+ 71,
+ 191,
+ 85,
+ 155,
+ 127,
+ 170,
+ 54,
+ 236,
+ 65,
+ 90,
+ 127,
+ 114,
+ 117,
+ 187,
+ 235,
+ 63,
+ 170,
+ 97,
+ 49,
+ 3,
+ 50,
+ 23,
+ 201,
+ 56,
+ 31,
+ 103,
+ 11,
+ 191,
+ 251,
+ 144,
+ 142,
+ 207,
+ 160,
+ 243,
+ 96,
+ 27,
+ 203,
+ 52,
+ 206,
+ 162,
+ 216,
+ 98,
+ 4,
+ 5,
+ 58,
+ 143,
+ 180,
+ 142,
+ 229,
+ 89,
+ 199,
+ 25,
+ 143,
+ 124,
+ 210,
+ 45,
+ 178,
+ 119,
+ 156,
+ 137,
+ 72,
+ 167,
+ 236,
+ 25,
+ 157,
+ 166,
+ 154,
+ 167,
+ 144,
+ 124,
+ 50,
+ 242,
+ 105,
+ 53,
+ 195,
+ 157,
+ 179,
+ 236,
+ 83,
+ 145,
+ 207,
+ 200,
+ 51,
+ 62,
+ 115,
+ 194,
+ 199,
+ 174,
+ 23,
+ 156,
+ 156,
+ 233,
+ 200,
+ 103,
+ 207,
+ 147,
+ 65,
+ 80,
+ 249,
+ 36,
+ 146,
+ 207,
+ 0,
+ 159,
+ 62,
+ 227,
+ 147,
+ 39,
+ 124,
+ 242,
+ 132,
+ 239,
+ 75,
+ 54,
+ 33,
+ 72,
+ 139,
+ 99,
+ 185,
+ 14,
+ 197,
+ 230,
+ 31,
+ 168,
+ 139,
+ 115,
+ 75,
+ 57,
+ 20,
+ 228,
+ 197,
+ 159,
+ 107,
+ 103,
+ 32,
+ 33,
+ 37,
+ 32,
+ 23,
+ 56,
+ 66,
+ 14,
+ 2,
+ 19,
+ 35,
+ 117,
+ 204,
+ 163,
+ 215,
+ 204,
+ 120,
+ 206,
+ 147,
+ 92,
+ 35,
+ 171,
+ 67,
+ 110,
+ 6,
+ 114,
+ 80,
+ 24,
+ 46,
+ 230,
+ 212,
+ 135,
+ 89,
+ 132,
+ 32,
+ 49,
+ 92,
+ 178,
+ 133,
+ 52,
+ 134,
+ 171,
+ 68,
+ 120,
+ 94,
+ 35,
+ 20,
+ 113,
+ 7,
+ 53,
+ 146,
+ 15,
+ 52,
+ 134,
+ 43,
+ 141,
+ 139,
+ 24,
+ 150,
+ 89,
+ 2,
+ 57,
+ 104,
+ 12,
+ 215,
+ 114,
+ 220,
+ 190,
+ 65,
+ 14,
+ 230,
+ 22,
+ 9,
+ 110,
+ 19,
+ 161,
+ 95,
+ 40,
+ 37,
+ 82,
+ 7,
+ 99,
+ 108,
+ 102,
+ 74,
+ 96,
+ 29,
+ 10,
+ 26,
+ 195,
+ 173,
+ 65,
+ 138,
+ 204,
+ 40,
+ 97,
+ 0,
+ 96,
+ 24,
+ 69,
+ 18,
+ 25,
+ 231,
+ 150,
+ 177,
+ 80,
+ 36,
+ 145,
+ 241,
+ 54,
+ 55,
+ 7,
+ 177,
+ 132,
+ 34,
+ 117,
+ 133,
+ 102,
+ 17,
+ 3,
+ 13,
+ 164,
+ 160,
+ 224,
+ 122,
+ 98,
+ 7,
+ 113,
+ 57,
+ 225,
+ 113,
+ 132,
+ 144,
+ 131,
+ 66,
+ 156,
+ 59,
+ 212,
+ 81,
+ 235,
+ 32,
+ 146,
+ 47,
+ 221,
+ 65,
+ 200,
+ 115,
+ 62,
+ 79,
+ 237,
+ 234,
+ 145,
+ 33,
+ 106,
+ 32,
+ 7,
+ 133,
+ 114,
+ 19,
+ 132,
+ 236,
+ 154,
+ 132,
+ 233,
+ 62,
+ 226,
+ 66,
+ 100,
+ 110,
+ 228,
+ 81,
+ 155,
+ 110,
+ 36,
+ 204,
+ 212,
+ 157,
+ 196,
+ 53,
+ 249,
+ 32,
+ 5,
+ 133,
+ 117,
+ 83,
+ 33,
+ 138,
+ 219,
+ 66,
+ 142,
+ 99,
+ 76,
+ 57,
+ 232,
+ 89,
+ 174,
+ 71,
+ 145,
+ 91,
+ 104,
+ 161,
+ 210,
+ 75,
+ 198,
+ 114,
+ 155,
+ 67,
+ 92,
+ 97,
+ 178,
+ 42,
+ 241,
+ 77,
+ 180,
+ 106,
+ 184,
+ 187,
+ 37,
+ 156,
+ 202,
+ 88,
+ 80,
+ 25,
+ 121,
+ 209,
+ 170,
+ 221,
+ 42,
+ 68,
+ 65,
+ 100,
+ 164,
+ 16,
+ 185,
+ 33,
+ 138,
+ 43,
+ 188,
+ 22,
+ 68,
+ 70,
+ 74,
+ 142,
+ 85,
+ 209,
+ 241,
+ 136,
+ 193,
+ 117,
+ 219,
+ 22,
+ 84,
+ 70,
+ 42,
+ 185,
+ 84,
+ 136,
+ 130,
+ 202,
+ 200,
+ 139,
+ 222,
+ 233,
+ 102,
+ 89,
+ 232,
+ 64,
+ 103,
+ 164,
+ 209,
+ 203,
+ 4,
+ 141,
+ 75,
+ 3,
+ 11,
+ 171,
+ 23,
+ 179,
+ 80,
+ 164,
+ 17,
+ 137,
+ 93,
+ 168,
+ 84,
+ 184,
+ 164,
+ 51,
+ 222,
+ 77,
+ 184,
+ 148,
+ 95,
+ 209,
+ 165,
+ 160,
+ 51,
+ 138,
+ 57,
+ 228,
+ 22,
+ 102,
+ 54,
+ 23,
+ 14,
+ 116,
+ 70,
+ 241,
+ 108,
+ 251,
+ 176,
+ 14,
+ 5,
+ 161,
+ 81,
+ 194,
+ 45,
+ 212,
+ 62,
+ 57,
+ 80,
+ 26,
+ 165,
+ 206,
+ 43,
+ 5,
+ 151,
+ 84,
+ 66,
+ 142,
+ 27,
+ 36,
+ 56,
+ 80,
+ 26,
+ 165,
+ 53,
+ 50,
+ 72,
+ 115,
+ 45,
+ 4,
+ 161,
+ 81,
+ 198,
+ 44,
+ 228,
+ 82,
+ 207,
+ 210,
+ 228,
+ 112,
+ 161,
+ 32,
+ 149,
+ 144,
+ 132,
+ 42,
+ 127,
+ 18,
+ 164,
+ 144,
+ 73,
+ 152,
+ 58,
+ 54,
+ 117,
+ 57,
+ 11,
+ 82,
+ 100,
+ 161,
+ 193,
+ 221,
+ 218,
+ 107,
+ 216,
+ 68,
+ 205,
+ 230,
+ 216,
+ 168,
+ 232,
+ 54,
+ 74,
+ 72,
+ 11,
+ 125,
+ 209,
+ 96,
+ 132,
+ 108,
+ 39,
+ 102,
+ 62,
+ 174,
+ 0,
+ 107,
+ 72,
+ 11,
+ 45,
+ 244,
+ 184,
+ 133,
+ 238,
+ 122,
+ 6,
+ 154,
+ 52,
+ 110,
+ 70,
+ 143,
+ 239,
+ 51,
+ 59,
+ 26,
+ 5,
+ 165,
+ 73,
+ 95,
+ 140,
+ 239,
+ 79,
+ 230,
+ 233,
+ 26,
+ 147,
+ 19,
+ 184,
+ 120,
+ 81,
+ 44,
+ 77,
+ 211,
+ 245,
+ 196,
+ 100,
+ 70,
+ 97,
+ 204,
+ 67,
+ 242,
+ 65,
+ 173,
+ 215,
+ 154,
+ 47,
+ 195,
+ 231,
+ 117,
+ 226,
+ 155,
+ 170,
+ 244,
+ 99,
+ 238,
+ 148,
+ 51,
+ 182,
+ 47,
+ 133,
+ 139,
+ 153,
+ 24,
+ 147,
+ 216,
+ 17,
+ 243,
+ 230,
+ 208,
+ 37,
+ 243,
+ 172,
+ 29,
+ 119,
+ 167,
+ 24,
+ 49,
+ 207,
+ 210,
+ 189,
+ 105,
+ 210,
+ 238,
+ 57,
+ 57,
+ 110,
+ 157,
+ 190,
+ 222,
+ 88,
+ 77,
+ 65,
+ 145,
+ 215,
+ 23,
+ 242,
+ 41,
+ 62,
+ 182,
+ 110,
+ 16,
+ 43,
+ 140,
+ 158,
+ 235,
+ 74,
+ 37,
+ 62,
+ 51,
+ 206,
+ 167,
+ 174,
+ 201,
+ 7,
+ 226,
+ 105,
+ 46,
+ 238,
+ 62,
+ 213,
+ 141,
+ 206,
+ 206,
+ 68,
+ 58,
+ 203,
+ 186,
+ 152,
+ 113,
+ 113,
+ 106,
+ 246,
+ 33,
+ 171,
+ 195,
+ 145,
+ 111,
+ 98,
+ 174,
+ 125,
+ 197,
+ 100,
+ 151,
+ 80,
+ 252,
+ 12,
+ 215,
+ 51,
+ 246,
+ 143,
+ 126,
+ 210,
+ 99,
+ 146,
+ 117,
+ 220,
+ 79,
+ 181,
+ 132,
+ 40,
+ 66,
+ 142,
+ 244,
+ 167,
+ 78,
+ 103,
+ 145,
+ 10,
+ 217,
+ 102,
+ 103,
+ 158,
+ 37,
+ 75,
+ 72,
+ 64,
+ 163,
+ 166,
+ 14,
+ 91,
+ 229,
+ 8,
+ 31,
+ 155,
+ 113,
+ 50,
+ 159,
+ 60,
+ 170,
+ 39,
+ 14,
+ 91,
+ 205,
+ 245,
+ 166,
+ 35,
+ 18,
+ 90,
+ 9,
+ 99,
+ 120,
+ 238,
+ 136,
+ 210,
+ 35,
+ 243,
+ 15,
+ 170,
+ 131,
+ 177,
+ 2,
+ 89,
+ 253,
+ 50,
+ 171,
+ 59,
+ 23,
+ 41,
+ 96,
+ 46,
+ 90,
+ 236,
+ 27,
+ 17,
+ 122,
+ 40,
+ 16,
+ 198,
+ 41,
+ 228,
+ 105,
+ 114,
+ 166,
+ 192,
+ 248,
+ 228,
+ 80,
+ 231,
+ 145,
+ 124,
+ 153,
+ 10,
+ 42,
+ 161,
+ 59,
+ 51,
+ 254,
+ 220,
+ 190,
+ 147,
+ 91,
+ 164,
+ 209,
+ 59,
+ 150,
+ 25,
+ 124,
+ 202,
+ 141,
+ 240,
+ 221,
+ 170,
+ 251,
+ 4,
+ 5,
+ 181,
+ 12,
+ 123,
+ 80,
+ 39,
+ 242,
+ 248,
+ 52,
+ 75,
+ 124,
+ 216,
+ 145,
+ 118,
+ 166,
+ 160,
+ 105,
+ 158,
+ 30,
+ 174,
+ 112,
+ 203,
+ 248,
+ 83,
+ 67,
+ 188,
+ 88,
+ 97,
+ 23,
+ 178,
+ 15,
+ 242,
+ 193,
+ 74,
+ 179,
+ 204,
+ 252,
+ 85,
+ 131,
+ 96,
+ 219,
+ 139,
+ 219,
+ 135,
+ 91,
+ 249,
+ 51,
+ 61,
+ 28,
+ 51,
+ 249,
+ 244,
+ 207,
+ 53,
+ 237,
+ 75,
+ 15,
+ 199,
+ 24,
+ 185,
+ 144,
+ 125,
+ 208,
+ 17,
+ 90,
+ 43,
+ 150,
+ 225,
+ 75,
+ 122,
+ 6,
+ 253,
+ 39,
+ 35,
+ 169,
+ 25,
+ 78,
+ 204,
+ 86,
+ 119,
+ 241,
+ 73,
+ 195,
+ 120,
+ 249,
+ 163,
+ 126,
+ 105,
+ 155,
+ 246,
+ 225,
+ 215,
+ 99,
+ 135,
+ 246,
+ 248,
+ 216,
+ 97,
+ 250,
+ 77,
+ 177,
+ 109,
+ 94,
+ 246,
+ 7,
+ 88,
+ 213,
+ 190,
+ 94,
+ 119,
+ 109,
+ 58,
+ 39,
+ 173,
+ 158,
+ 0,
+ 240,
+ 133,
+ 191,
+ 91,
+ 48,
+ 129,
+ 8,
+ 181,
+ 231,
+ 136,
+ 96,
+ 40,
+ 128,
+ 71,
+ 0,
+ 130,
+ 50,
+ 30,
+ 1,
+ 202,
+ 99,
+ 214,
+ 20,
+ 86,
+ 126,
+ 68,
+ 4,
+ 58,
+ 26,
+ 226,
+ 212,
+ 10,
+ 36,
+ 194,
+ 144,
+ 17,
+ 150,
+ 140,
+ 32,
+ 91,
+ 30,
+ 31,
+ 141,
+ 248,
+ 173,
+ 119,
+ 135,
+ 8,
+ 79,
+ 69,
+ 132,
+ 135,
+ 5,
+ 126,
+ 139,
+ 8,
+ 195,
+ 184,
+ 247,
+ 29,
+ 60,
+ 245,
+ 174,
+ 64,
+ 33,
+ 12,
+ 21,
+ 129,
+ 139,
+ 220,
+ 112,
+ 98,
+ 70,
+ 139,
+ 146,
+ 83,
+ 4,
+ 46,
+ 74,
+ 6,
+ 8,
+ 67,
+ 70,
+ 88,
+ 50,
+ 194,
+ 83,
+ 17,
+ 131,
+ 29,
+ 28,
+ 135,
+ 56,
+ 246,
+ 177,
+ 179,
+ 24,
+ 6,
+ 128,
+ 219,
+ 115,
+ 71,
+ 222,
+ 115,
+ 71,
+ 222,
+ 115,
+ 71,
+ 85,
+ 171,
+ 1,
+ 192,
+ 80,
+ 1,
+ 150,
+ 10,
+ 192,
+ 228,
+ 95,
+ 88,
+ 55,
+ 109,
+ 43,
+ 20,
+ 121,
+ 43,
+ 78,
+ 17,
+ 56,
+ 199,
+ 42,
+ 242,
+ 230,
+ 157,
+ 32,
+ 180,
+ 35,
+ 35,
+ 60,
+ 21,
+ 97,
+ 200,
+ 118,
+ 88,
+ 234,
+ 110,
+ 120,
+ 75,
+ 93,
+ 148,
+ 39,
+ 155,
+ 17,
+ 31,
+ 50,
+ 167,
+ 66,
+ 200,
+ 166,
+ 199,
+ 39,
+ 77,
+ 137,
+ 44,
+ 92,
+ 209,
+ 89,
+ 52,
+ 157,
+ 197,
+ 210,
+ 89,
+ 60,
+ 25,
+ 130,
+ 20,
+ 69,
+ 51,
+ 146,
+ 88,
+ 56,
+ 132,
+ 38,
+ 35,
+ 12,
+ 21,
+ 49,
+ 72,
+ 44,
+ 28,
+ 194,
+ 83,
+ 17,
+ 134,
+ 108,
+ 135,
+ 183,
+ 84,
+ 196,
+ 48,
+ 234,
+ 145,
+ 16,
+ 141,
+ 73,
+ 95,
+ 51,
+ 22,
+ 244,
+ 56,
+ 18,
+ 174,
+ 232,
+ 16,
+ 186,
+ 245,
+ 200,
+ 112,
+ 180,
+ 228,
+ 112,
+ 180,
+ 31,
+ 135,
+ 35,
+ 67,
+ 1,
+ 12,
+ 149,
+ 66,
+ 59,
+ 34,
+ 133,
+ 246,
+ 68,
+ 0,
+ 50,
+ 22,
+ 45,
+ 57,
+ 22,
+ 237,
+ 72,
+ 44,
+ 50,
+ 28,
+ 130,
+ 234,
+ 219,
+ 65,
+ 40,
+ 34,
+ 17,
+ 138,
+ 140,
+ 176,
+ 84,
+ 4,
+ 170,
+ 219,
+ 119,
+ 158,
+ 218,
+ 159,
+ 120,
+ 114,
+ 127,
+ 226,
+ 201,
+ 50,
+ 234,
+ 201,
+ 253,
+ 137,
+ 39,
+ 203,
+ 168,
+ 39,
+ 203,
+ 168,
+ 39,
+ 135,
+ 174,
+ 39,
+ 135,
+ 174,
+ 167,
+ 203,
+ 168,
+ 167,
+ 55,
+ 15,
+ 158,
+ 174,
+ 163,
+ 3,
+ 136,
+ 160,
+ 67,
+ 36,
+ 29,
+ 66,
+ 247,
+ 24,
+ 71,
+ 109,
+ 125,
+ 252,
+ 91,
+ 188,
+ 95,
+ 46,
+ 195,
+ 68,
+ 125,
+ 76,
+ 88,
+ 154,
+ 92,
+ 15,
+ 33,
+ 6,
+ 7,
+ 113,
+ 116,
+ 22,
+ 71,
+ 103,
+ 241,
+ 116,
+ 22,
+ 79,
+ 102,
+ 9,
+ 242,
+ 67,
+ 100,
+ 25,
+ 64,
+ 62,
+ 96,
+ 89,
+ 221,
+ 29,
+ 103,
+ 99,
+ 95,
+ 63,
+ 173,
+ 238,
+ 226,
+ 31,
+ 51,
+ 255,
+ 15,
+ 80,
+ 75,
+ 1,
+ 2,
+ 20,
+ 0,
+ 20,
+ 0,
+ 0,
+ 8,
+ 8,
+ 0,
+ 184,
+ 182,
+ 42,
+ 68,
+ 36,
+ 55,
+ 216,
+ 103,
+ 135,
+ 15,
+ 0,
+ 0,
+ 133,
+ 15,
+ 0,
+ 0,
+ 12,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 97,
+ 114,
+ 105,
+ 97,
+ 108,
+ 95,
+ 49,
+ 52,
+ 46,
+ 112,
+ 110,
+ 103,
+ 80,
+ 75,
+ 1,
+ 2,
+ 20,
+ 0,
+ 20,
+ 0,
+ 0,
+ 8,
+ 8,
+ 0,
+ 184,
+ 182,
+ 42,
+ 68,
+ 49,
+ 191,
+ 99,
+ 158,
+ 35,
+ 6,
+ 0,
+ 0,
+ 211,
+ 60,
+ 0,
+ 0,
+ 12,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 177,
+ 15,
+ 0,
+ 0,
+ 97,
+ 114,
+ 105,
+ 97,
+ 108,
+ 95,
+ 49,
+ 52,
+ 46,
+ 102,
+ 110,
+ 116,
+ 80,
+ 75,
+ 5,
+ 6,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2,
+ 0,
+ 2,
+ 0,
+ 116,
+ 0,
+ 0,
+ 0,
+ 254,
+ 21,
+ 0,
+ 0,
+ 0,
+ 0
+];
diff --git a/image/lib/src/fonts/arial_24.dart b/image/lib/src/fonts/arial_24.dart
index b838e04..59bb07e 100755
--- a/image/lib/src/fonts/arial_24.dart
+++ b/image/lib/src/fonts/arial_24.dart
@@ -1,20 +1,9309 @@
import '../bitmap_font.dart';
-/**
- * 24px Arial font for use with [drawString] and [drawChar].
- */
+/// 24px Arial font for use with [drawString] and [drawChar].
final BitmapFont arial_24 = BitmapFont.fromZip(_ARIAL_24);
const List<int> _ARIAL_24 = const [
-80, 75, 3, 4, 20, 0, 0, 8, 8, 0, 131, 182, 42, 68, 22, 124, 124, 222, 0, 29, 0, 0, 62, 29, 0, 0, 12, 0, 0, 0, 97, 114, 105, 97, 108, 95, 50, 52, 46, 112, 110, 103, 141, 121, 103, 80, 19, 80, 179, 118, 18, 66, 143, 180, 208, 155, 128, 64, 164, 67, 232, 16, 122, 239, 85, 5, 68, 64, 122, 83, 58, 132, 158, 0, 130, 244, 142, 160, 16, 170, 2, 138, 72, 87, 164, 5, 165, 119, 4, 233, 66, 144, 222, 36, 116, 233, 215, 119, 190, 31, 223, 251, 235, 206, 61, 179, 115, 102, 127, 236, 236, 60, 115, 102, 207, 238, 179, 243, 196, 27, 27, 106, 221, 33, 99, 38, 3, 0, 0, 119, 116, 180, 213, 77, 1, 0, 48, 230, 159, 207, 66, 66, 244, 239, 86, 224, 212, 200, 0, 0, 216, 8, 117, 212, 85, 204, 145, 115, 123, 79, 18, 211, 75, 229, 234, 49, 16, 18, 52, 21, 109, 148, 42, 7, 248, 159, 189, 80, 38, 137, 81, 38, 129, 130, 56, 101, 192, 240, 191, 1, 163, 11, 81, 191, 2, 91, 10, 85, 79, 145, 206, 63, 31, 84, 43, 184, 120, 42, 107, 111, 79, 79, 83, 134, 135, 73, 184, 79, 86, 152, 148, 106, 38, 51, 75, 254, 239, 206, 120, 234, 219, 124, 191, 179, 37, 151, 235, 165, 219, 155, 51, 82, 165, 219, 107, 33, 177, 142, 219, 72, 254, 176, 135, 183, 75, 46, 156, 24, 73, 186, 5, 129, 136, 228, 149, 157, 144, 117, 89, 241, 144, 158, 139, 37, 23, 137, 133, 32, 141, 105, 194, 245, 217, 191, 65, 91, 30, 194, 163, 183, 29, 112, 219, 5, 201, 73, 249, 208, 253, 212, 72, 202, 222, 75, 73, 37, 100, 120, 251, 34, 233, 16, 95, 196, 6, 112, 145, 197, 230, 72, 242, 110, 151, 28, 241, 83, 202, 145, 174, 253, 254, 19, 85, 7, 195, 205, 215, 107, 30, 85, 3, 236, 172, 203, 45, 249, 163, 178, 55, 161, 206, 139, 46, 191, 123, 2, 194, 148, 76, 17, 101, 73, 60, 198, 97, 239, 62, 242, 213, 198, 126, 94, 49, 218, 189, 121, 23, 113, 239, 73, 208, 208, 10, 195, 179, 33, 214, 136, 189, 239, 44, 127, 31, 15, 68, 242, 209, 76, 231, 47, 237, 111, 96, 190, 194, 3, 143, 17, 57, 247, 207, 57, 90, 61, 114, 166, 200, 71, 149, 14, 170, 88, 44, 46, 153, 218, 203, 189, 63, 165, 167, 119, 12, 30, 60, 217, 96, 37, 88, 140, 28, 191, 100, 7, 189, 253, 230, 145, 121, 120, 67, 41, 7, 108, 85, 251, 148, 164, 224, 238, 23, 182, 16, 199, 18, 217, 208, 55, 44, 112, 166, 124, 233, 193, 199, 70, 32, 182, 159, 232, 179, 43, 237, 116, 199, 172, 255, 82, 252, 194, 205, 249, 244, 208, 24, 93, 206, 123, 47, 210, 16, 100, 68, 151, 76, 144, 186, 246, 197, 86, 34, 201, 169, 200, 191, 216, 199, 203, 118, 109, 152, 107, 17, 112, 233, 228, 179, 59, 72, 104, 75, 240, 71, 252, 254, 213, 167, 63, 27, 71, 65, 218, 27, 254, 113, 138, 181, 3, 231, 121, 227, 42, 133, 147, 75, 146, 243, 153, 191, 227, 162, 2, 18, 105, 148, 172, 130, 205, 235, 226, 244, 130, 89, 230, 37, 50, 10, 40, 214, 185, 153, 144, 2, 98, 97, 117, 198, 82, 45, 13, 188, 41, 141, 74, 103, 186, 37, 187, 125, 9, 97, 185, 159, 170, 199, 161, 199, 159, 190, 244, 38, 213, 181, 149, 31, 51, 172, 37, 230, 159, 213, 42, 218, 90, 138, 79, 41, 202, 252, 13, 110, 192, 87, 113, 144, 131, 66, 22, 25, 62, 106, 42, 176, 22, 132, 5, 70, 31, 14, 226, 4, 70, 99, 110, 182, 89, 247, 103, 10, 61, 18, 167, 220, 94, 133, 133, 185, 71, 138, 237, 228, 19, 222, 69, 136, 182, 71, 120, 177, 134, 210, 134, 197, 99, 103, 152, 196, 55, 28, 162, 66, 133, 181, 219, 185, 119, 114, 25, 35, 121, 73, 67, 207, 50, 158, 232, 47, 115, 79, 94, 216, 166, 27, 76, 202, 89, 214, 100, 168, 217, 124, 98, 95, 186, 124, 206, 153, 102, 114, 97, 231, 186, 204, 32, 68, 136, 161, 0, 214, 146, 251, 193, 229, 246, 181, 200, 14, 28, 84, 185, 231, 146, 40, 190, 233, 176, 213, 26, 47, 132, 122, 34, 35, 22, 217, 144, 81, 223, 162, 131, 203, 9, 153, 172, 210, 2, 191, 140, 67, 206, 66, 168, 184, 227, 80, 191, 20, 118, 156, 144, 35, 154, 98, 0, 184, 175, 216, 199, 40, 84, 247, 165, 189, 51, 68, 58, 37, 202, 78, 59, 210, 230, 95, 54, 116, 23, 179, 132, 221, 117, 160, 230, 185, 112, 66, 253, 156, 216, 145, 246, 8, 65, 14, 11, 241, 168, 247, 142, 146, 206, 0, 187, 117, 75, 105, 104, 10, 171, 5, 122, 202, 65, 146, 81, 122, 119, 206, 70, 66, 91, 26, 40, 179, 205, 24, 172, 182, 55, 168, 55, 16, 235, 199, 216, 14, 69, 250, 182, 70, 230, 96, 103, 131, 136, 49, 50, 99, 149, 52, 248, 6, 150, 136, 187, 73, 30, 140, 186, 104, 216, 142, 213, 67, 240, 99, 25, 204, 38, 74, 63, 180, 91, 70, 61, 248, 41, 184, 183, 55, 136, 0, 131, 210, 111, 2, 137, 177, 53, 166, 98, 49, 185, 66, 87, 156, 178, 78, 249, 213, 170, 77, 253, 101, 140, 3, 171, 54, 90, 82, 47, 223, 139, 160, 158, 47, 240, 87, 21, 208, 33, 7, 116, 169, 62, 240, 227, 193, 168, 88, 179, 212, 103, 63, 88, 239, 158, 205, 72, 166, 189, 4, 126, 225, 77, 94, 250, 4, 50, 138, 123, 130, 157, 229, 209, 193, 217, 158, 109, 188, 2, 25, 221, 163, 190, 10, 101, 198, 59, 222, 17, 4, 133, 138, 231, 236, 6, 83, 34, 201, 10, 142, 51, 69, 170, 226, 161, 125, 103, 140, 108, 112, 222, 87, 224, 55, 36, 44, 17, 47, 176, 153, 61, 143, 101, 210, 116, 8, 87, 71, 47, 161, 138, 72, 202, 240, 167, 223, 92, 32, 68, 111, 156, 92, 174, 94, 216, 205, 208, 168, 164, 223, 254, 17, 35, 117, 208, 142, 197, 197, 12, 10, 63, 188, 234, 111, 164, 199, 59, 230, 14, 174, 174, 13, 59, 24, 129, 63, 215, 2, 210, 126, 176, 56, 73, 208, 130, 248, 140, 107, 69, 180, 255, 82, 62, 92, 153, 6,
-124, 243, 31, 67, 113, 100, 13, 189, 211, 223, 188, 75, 160, 217, 55, 178,
-188, 232, 80, 66, 255, 197, 187, 157, 166, 158, 239, 114, 165, 165, 86, 10, 239, 223, 58, 93, 248, 18, 110, 85, 95, 32, 170, 27, 216, 170, 4, 118, 98, 0, 212, 248, 57, 128, 119, 185, 170, 166, 185, 68, 231, 212, 197, 8, 239, 65, 130, 236, 61, 217, 224, 17, 178, 142, 145, 138, 127, 218, 184, 106, 158, 173, 230, 43, 139, 222, 100, 59, 44, 234, 98, 205, 68, 152, 202, 205, 37, 152, 15, 217, 165, 254, 142, 95, 179, 115, 77, 225, 34, 162, 69, 123, 197, 197, 40, 117, 94, 150, 57, 245, 228, 229, 139, 168, 47, 61, 232, 37, 173, 90, 218, 246, 94, 23, 175, 79, 253, 125, 144, 87, 148, 111, 188, 186, 220, 31, 68, 29, 206, 203, 83, 210, 5, 12, 222, 56, 33, 128, 35, 122, 4, 112, 6, 107, 30, 242, 174, 185, 249, 177, 247, 110, 56, 8, 17, 215, 18, 56, 29, 80, 1, 63, 208, 104, 54, 173, 83, 156, 165, 224, 213, 71, 90, 164, 234, 142, 4, 212, 67, 54, 170, 237, 75, 232, 41, 23, 238, 3, 176, 109, 144, 187, 111, 222, 172, 16, 210, 216, 131, 238, 141, 90, 180, 28, 192, 47, 80, 48, 69, 111, 56, 158, 86, 41, 73, 56, 122, 28, 242, 214, 127, 146, 55, 82, 166, 234, 27, 27, 62, 12, 250, 134, 153, 67, 35, 32, 9, 80, 73, 50, 191, 54, 241, 11, 74, 57, 56, 189, 67, 136, 168, 92, 215, 114, 194, 238, 61, 20, 85, 186, 86, 246, 110, 190, 61, 110, 203, 162, 60, 230, 120, 54, 225, 108, 76, 108, 177, 141, 123, 158, 20, 40, 155, 238, 51, 230, 12, 182, 206, 40, 250, 45, 214, 180, 7, 81, 44, 200, 19, 97, 37, 1, 132, 37, 161, 211, 83, 67, 117, 166, 212, 58, 17, 12, 159, 76, 186, 197, 140, 61, 188, 7, 52, 72, 145, 86, 181, 201, 167, 16, 28, 233, 220, 74, 111, 46, 183, 109, 149, 22, 106, 100, 119, 188, 52, 38, 53, 13, 28, 92, 13, 36, 77, 60, 108, 29, 126, 239, 145, 254, 103, 147, 116, 105, 170, 84, 132, 158, 224, 203, 207, 208, 112, 170, 254, 56, 160, 156, 147, 230,
-165, 147, 24, 152, 145, 11, 212, 195, 85, 74, 92, 19, 185, 100, 210, 79, 16, 147, 42, 102, 118, 154, 126, 15, 250, 113, 5, 222, 167, 0, 12, 136, 110, 107, 82, 11, 126, 33, 154, 103, 94, 226, 85, 227, 89, 182, 126, 56, 212, 176, 114, 165, 211, 69, 60, 227, 146, 250, 126, 233, 173, 172, 63, 150, 239, 186, 10, 128, 48, 176, 38, 162, 163, 113, 31, 164, 227, 196, 228, 249, 178, 15, 118, 21, 145, 238, 101, 185, 184, 239, 251, 144, 34, 249, 125, 0, 2, 0, 163, 122, 156, 204, 179, 252, 218, 254, 251, 24, 29, 213, 120, 210, 206, 238, 97, 23, 227, 172, 233, 247, 140, 149, 233, 84, 224, 68, 123, 72, 132, 105, 69, 135, 10, 167, 217, 17, 131, 119, 3, 142, 9, 11, 101, 238, 229, 70, 189, 85, 241, 54, 5, 241, 72, 48, 61, 109, 243, 91, 81, 83, 246, 5, 71, 253, 130, 199, 149, 58, 9, 37, 27, 166, 241, 37, 0, 99, 14, 73, 78, 47, 93, 151, 57, 121, 38, 156, 112, 49, 210, 252, 123, 47, 95, 47, 148, 245, 56, 6, 8, 83, 255, 29, 111, 35, 197, 55, 112, 185, 148, 138, 203, 133, 92, 27, 1, 49, 99, 173, 163, 141, 235, 84, 46, 174, 238, 114, 80, 103, 23, 198, 146, 245, 126, 114, 132, 155, 220, 43, 49, 84, 224, 183, 162, 218, 63, 27, 217, 25, 215, 125, 22, 100, 34, 140, 90, 189, 132, 154, 69, 153, 194, 178, 13, 162, 190, 55, 134, 216, 76, 137, 209, 4, 72, 65, 190, 202, 11, 0, 196, 66, 39, 50, 192, 106, 138, 242, 109, 71, 124, 128, 85, 242, 126, 45, 203, 110, 250, 177, 137, 178, 40, 86, 5, 28, 38, 148, 39, 148, 201, 48, 169, 140, 42, 111, 156, 236, 222, 205, 125, 92, 87, 208, 122, 165, 63, 147, 39, 106, 215, 12, 103, 226, 100, 33, 72, 90, 146, 97, 39, 8, 245, 56, 71, 194, 219, 8, 240, 101, 187, 215, 58, 192, 151, 210, 110, 169, 0, 121, 191, 223, 187, 134, 248, 207, 38, 245, 223, 217, 66, 27, 137, 125, 61, 197, 174, 20, 69, 3, 247, 248, 205, 155, 23, 156, 6, 65, 151, 82, 114, 117, 182, 244, 118, 12, 234, 209, 250, 41, 83, 184, 84, 59, 105, 75, 108, 151, 5, 57, 242, 55, 63, 45, 73, 168, 163, 233, 238, 19, 97, 180, 202, 33, 3, 167, 204, 52, 180, 41, 119, 93, 196, 42, 74, 144, 138, 49, 99, 42, 76, 24, 16, 31, 162, 55, 149, 67, 199, 157, 89, 67, 247, 221, 90, 56, 201, 208, 54, 107, 199, 89, 232, 242, 139, 182, 246, 183, 59, 241, 37, 87, 38, 202, 239, 164, 53, 220, 78, 127, 156, 216, 149, 220, 220, 55, 34, 66, 206, 53, 188, 90, 191, 160, 176, 128, 200, 99, 135, 50, 185, 198, 234, 0, 199, 234, 195, 84, 50, 29, 80, 174, 234, 78, 46, 142, 138, 0, 106, 84, 57, 142, 218, 198, 116, 214, 246, 225, 197, 15, 228, 84, 34, 72, 169, 161, 143, 155, 202, 46, 211, 129, 82, 87, 121, 206, 213, 123, 119, 120, 235, 181, 168, 129, 228, 237, 199, 207, 24, 145, 127, 141, 35, 179, 77, 66, 247, 91, 2, 252, 111, 231, 18, 40, 48, 9, 187, 244, 176, 212, 231, 153, 143, 110, 243, 203, 102, 189, 177, 146, 205, 71, 254, 100, 23, 41, 4, 243, 122, 108, 242, 58, 193, 86, 116, 108, 130, 182, 173, 56, 235, 132, 217, 15, 159, 192, 152, 178, 205, 76, 151, 171, 125, 8, 130, 115, 204, 173, 74, 54, 14, 223, 110, 21, 203, 190, 250, 192, 233, 138, 223, 213, 225, 126, 111, 45, 254, 113, 175, 19, 72, 14, 233, 206, 197, 58, 190, 104, 250, 252, 129, 31, 171, 41, 158, 227, 118, 15, 93, 222, 159, 110, 199, 87, 122, 193, 139, 115, 27, 59, 110, 38, 180, 206, 184, 64, 0, 47, 237, 135, 124, 183, 206, 93, 95, 102, 157, 205, 28, 240, 28, 251, 109, 88, 164, 62, 168, 113, 248, 156, 10, 82, 13, 227, 117, 154, 231, 225, 255, 251, 214, 49, 192, 228, 116, 38, 109, 75, 138, 136, 190, 247, 39, 24, 97, 89, 95, 32, 120, 56, 196, 98, 173, 97, 104, 103, 236, 25, 213, 143, 37, 120, 80, 143, 137, 17, 92, 79, 254, 91, 125, 249, 151, 119, 32, 114, 190, 232, 56, 97, 87, 231, 7, 123, 39, 138, 244, 193, 8, 239, 176, 228, 171, 188, 125, 36, 165, 7, 206, 187, 44, 162, 247, 196, 14, 52, 34, 117, 122, 135, 107, 33, 46, 63, 44, 234, 8, 196, 26, 161, 199, 33, 101, 169, 242, 70, 21, 199, 167, 0, 68, 190, 206, 138, 161, 135, 67, 73, 128, 253, 80, 194, 118, 203, 197, 248, 230, 231, 57, 33, 144, 199, 64, 5, 44, 241, 27, 34, 65, 31, 92, 113, 119, 147, 73, 216, 7, 199, 236, 70, 211, 254, 86, 162, 40, 63, 63, 33, 96, 111, 223, 105, 115, 48, 216, 81, 142, 215, 127, 165, 78, 33, 109, 185, 5, 218, 152, 161, 166, 1, 123, 43, 239,
-238, 238, 227, 239, 80, 156, 175, 206, 120, 78, 21, 210, 177, 155, 18, 178, 181, 250, 75, 31, 84, 35, 110, 108, 194, 156, 192, 9, 214, 24, 140, 82, 120, 168, 220, 149, 153, 254, 128, 12, 65, 55, 100, 224, 79, 38, 189, 39, 59, 190, 83, 129, 73, 23, 113, 86, 114, 67, 109, 26, 102, 173, 221, 153, 29, 103, 188, 24, 64, 208, 168, 114, 106, 99, 51, 168, 189, 231, 211, 84, 55, 107, 234, 57, 14, 132, 230, 118, 232, 97, 134, 9, 230, 22, 16, 39, 134, 162, 104, 200, 180, 198, 235, 239, 52, 193, 61, 178, 217, 99, 231, 162, 41, 98, 142, 37, 58, 95, 252, 158, 187, 16, 205, 92, 82, 224, 220, 234, 100, 26, 186, 216, 11, 248, 100, 79, 159, 99, 51, 233, 252, 223, 3, 16, 26, 69, 229, 196, 78, 191, 180, 158, 93, 41, 27, 122, 166, 156, 21, 182, 165, 200, 72, 196, 146, 161, 203, 181, 55, 211, 43, 57, 104, 144, 110, 172, 198, 77, 52, 82, 166, 13, 41, 189, 219, 200, 118, 102, 100, 157, 156, 92, 236, 208, 185, 70, 31, 137, 226, 153, 151, 8, 208, 98, 202, 215, 131, 107, 126, 234, 87, 15, 90, 160, 89, 45, 47, 156, 135, 39, 176, 244, 97, 142, 90, 182, 169, 232, 233, 202, 251, 89, 7, 117, 150, 232, 101, 100, 220, 47, 139, 18, 15, 16, 166, 218, 81, 222, 242, 84, 105, 163, 79, 25, 143, 155, 209, 146, 135, 34, 126, 65, 46, 194, 14, 115, 220, 101, 157, 26, 95, 44, 40, 36, 84, 21, 86, 157, 77, 90, 102, 157, 235, 232, 163, 8, 231, 147, 197, 235, 232, 92, 190, 173, 231, 50, 121, 195, 224, 121, 85, 162, 111, 182, 134, 26, 44, 224, 50, 248, 141, 201, 122, 142, 34, 239, 230, 51, 102, 130, 10, 30, 34, 228, 118, 253, 2, 251, 218, 243, 91, 119, 101, 88, 93, 122, 20, 17, 87, 43, 20, 95, 134, 150, 201, 219, 151, 14, 117, 246, 33, 6, 42, 111, 55, 86, 25, 144, 119, 144, 79, 91, 132, 191, 78, 59, 89, 255, 45, 175, 61, 134, 214, 17, 31, 7, 200, 164, 208, 57, 166, 90, 188, 174, 116, 122, 71, 202, 100, 68, 191, 164, 181, 40, 207, 202, 232, 11, 255, 4, 66, 20, 168, 226, 170, 152, 12, 173, 239,
-216, 23, 163, 147, 39, 132, 15, 252, 2, 129, 247, 107, 168, 158, 87, 7, 17, 55, 137, 149, 191, 106, 134, 21, 228, 78, 19, 142, 190, 106, 204, 31, 39, 59, 213, 182, 148, 185, 165, 193, 119, 237, 38, 187, 74, 54, 177, 198, 222, 204, 126, 79, 72, 16, 22, 54, 149, 178, 252, 104, 42, 63, 160, 60, 93, 50, 78, 229, 77, 160, 122, 72, 209, 48, 88, 81, 8, 53, 38, 41, 24, 47, 174, 213, 116, 117, 230, 178, 106, 99, 169, 7, 78, 178,
-179, 39, 20, 43, 33, 75, 158, 107, 82, 101, 10, 152, 181, 210, 74, 138, 248, 167, 105, 185, 223, 13, 35, 198, 171, 23, 212, 29, 238, 158, 69, 210, 225, 87, 129, 255, 153, 60, 37, 223, 193, 199, 142, 46, 0, 140, 92, 124, 92, 238, 196, 168, 98, 27, 34, 78, 23, 106, 15, 196, 75, 144, 199, 94, 9, 244, 82, 103, 253, 56, 100, 83, 215, 138, 35, 139, 93, 29, 68, 195, 102, 60, 186, 168, 68, 95, 146, 49, 54, 136, 161, 49, 44, 156, 44, 196, 6, 134, 2, 134, 199, 121, 58, 187, 127, 226, 209, 61, 181, 119, 87, 118, 43, 60, 249, 123, 175, 139, 34, 230, 32, 30, 98, 162, 8, 230, 102, 79, 47, 16, 146, 153, 73, 43, 162, 110, 243, 31, 186, 18, 214, 123, 246, 70, 239, 82, 97, 212, 229, 90, 232, 225, 69, 180, 143, 62, 109, 170, 59, 64, 212, 255, 155, 123, 74, 1, 0, 37, 149, 187, 246, 7, 24, 103, 67, 234, 46, 118, 85, 243, 24, 219, 79, 182, 51, 212, 200, 211, 183, 137, 99, 156, 193, 43, 210, 4, 58, 142, 126, 36, 60, 102, 59, 152, 203, 135, 189, 42, 41, 146, 124, 20, 64, 205, 118, 232, 202, 181, 91, 171, 113, 20, 158, 26, 201, 192, 87, 187, 82, 128, 42, 247, 220, 84, 235, 6, 59, 54, 7, 156, 205, 104, 182, 137, 87, 204, 91, 250, 179, 206, 17, 100, 118, 74, 255, 17, 77, 177, 215, 31, 155, 197, 181, 58, 250, 255, 40, 39, 78, 131, 59, 27, 117, 42, 76, 153, 169, 52, 103, 60, 4, 255, 246, 50, 254, 181, 125, 71, 93, 3, 180, 209, 90, 250, 198, 116, 235, 113, 184, 16, 177, 86, 130, 189, 243, 58, 227, 175, 196, 20, 243, 6, 185, 171, 23, 88, 40, 33, 200, 224, 71, 88, 54, 74, 65, 89, 219, 7, 214, 34, 137, 171, 132, 227, 213, 17, 44, 46, 91, 207, 68, 64, 152, 63, 144, 10, 79, 79, 111, 226, 59, 17, 69, 95, 136, 203, 184, 93, 56, 140, 165, 5, 246, 173, 238, 141, 124, 169, 26, 53, 57, 237, 201, 25, 190, 63, 125, 71, 127, 149, 199, 53, 157, 71, 168, 222, 212, 23, 222, 234, 228, 156, 141, 130, 13, 247, 47, 66, 76, 38, 102, 197, 137, 243, 85, 158, 128, 168, 30, 138, 182, 30, 213, 163, 97, 96, 57, 203, 210, 140, 71, 232, 114, 155, 177, 116, 224, 97, 12, 181, 140, 131, 184, 186, 59, 42, 168, 43, 96, 17, 10, 130, 37, 68, 98, 36, 82, 120, 142, 96, 143, 132, 152, 211, 210, 238, 26, 141, 207, 170, 0, 246, 248, 78, 251, 161, 168, 114, 27, 126, 194, 134, 44, 213, 141, 203, 27, 253, 201, 98, 56, 57, 131, 76, 122, 245, 103, 176, 160, 208, 215, 81, 0, 255, 136, 121, 101, 50, 12, 149, 192, 60, 23, 20, 219, 248, 18, 148, 90, 61, 217, 70, 130, 139, 23, 200, 126, 169, 89, 238, 11, 182, 36, 73, 231, 47, 110, 126, 189, 231, 104, 209, 107, 201, 39, 226, 200, 246, 104, 184, 231, 61, 157, 54, 223, 242, 50, 179, 221, 29, 147, 247, 176, 240, 175, 137, 59, 88, 167, 217, 159, 33, 175, 48, 124, 161, 177, 237, 250, 189, 51, 226, 22, 213, 96, 33, 188, 90, 246, 164, 207, 90, 16, 190, 37, 58, 53, 84, 0, 159, 245, 98, 209, 255, 75, 134, 50, 41,
-253, 215, 16, 27, 206, 155, 187, 182, 16, 196, 19, 2, 94, 50, 52, 140, 251, 204, 197, 160, 137, 218, 210, 191, 109, 93, 64, 244, 186, 44, 211, 222, 235, 22, 40, 158, 238, 197, 113, 242, 151, 60, 79, 105, 235, 87, 217, 168, 96, 248, 7, 146, 39, 241, 153, 9, 101, 144, 31, 179, 118, 103, 234, 164, 157, 43, 41, 188, 236, 13, 166, 242, 132, 203, 6, 93, 118, 111, 23, 181, 73, 23, 39, 210, 234, 164, 161, 111, 84, 12, 242, 90, 236, 103, 100, 127, 144, 240, 121, 59, 213, 193, 159, 242, 225, 187, 72, 183, 165, 137, 48, 213, 167, 72, 178, 132, 104, 213, 61, 149, 173, 138, 201, 65, 44, 180, 83, 77, 222, 76, 209, 24, 140, 88, 134, 240, 16, 170, 207, 37, 185, 157, 108, 200, 141, 202, 148, 146, 202, 125, 86, 102, 226, 45, 29, 103, 175, 27, 43, 178, 81, 189, 18, 58, 185, 200, 115, 35, 243, 178, 102, 105, 2, 171, 67, 231, 52, 211, 28, 202, 235, 126, 125, 121, 121, 34, 77, 96, 84, 61, 233, 183, 209, 56, 126, 116, 195, 81, 240, 250, 170, 149, 15, 15, 22, 231, 62, 117, 145, 147, 143, 185, 167, 251, 46, 199, 1, 48, 107, 194, 175, 157, 179, 208, 70, 133, 252, 141, 93, 184, 115, 240, 240, 118, 213, 199, 66, 91, 220, 155, 120, 217, 98, 247, 218, 162, 180, 61, 39, 220, 148, 5, 249, 251, 88, 132, 129, 176, 9, 44, 69, 114, 46, 79, 35, 213, 157, 236, 141, 213, 29, 144, 77, 4, 254, 185, 66, 50, 59, 142, 247, 187, 220, 63, 146, 102, 12, 200, 0, 35, 210, 209, 57, 115, 88, 232, 151, 222, 95, 227, 59, 88, 97, 164, 123, 19, 52, 163, 178, 120, 149, 125, 196, 121, 104, 158, 188, 238, 243, 123, 160, 209, 39, 46, 194, 180, 74, 66, 132, 65, 87, 251, 221, 108, 211, 162, 7, 36, 95, 181, 15, 245, 9, 154, 67, 116, 40, 162, 248, 239, 146, 227, 179, 192, 99, 134, 135, 31, 215, 77, 177, 232, 180, 225, 78, 170, 176, 130, 72, 248, 191, 183, 207, 84, 205, 110, 70, 23, 45, 222, 95, 8, 133, 121, 82, 184, 93, 243, 86, 206, 189, 144, 55, 143, 169, 144, 137, 46, 63, 76, 73, 129, 111, 185, 246, 227, 192, 66, 244, 247, 211, 60, 134, 47, 72, 235, 84, 128, 117, 218, 56, 157, 48, 210, 106, 238, 111, 198, 95, 197, 169, 148, 209, 140, 98, 160, 164, 117, 55, 14, 131, 226, 180, 196, 174, 178, 251, 81, 210, 33, 116, 112, 213, 246, 39, 229, 115, 164, 28, 58, 116, 56, 82, 141, 133, 159, 55, 18, 94, 32, 132, 219, 101, 73, 233, 105, 165, 179, 57, 168, 135, 2, 108, 28, 124, 68, 102, 242, 34, 184, 219, 87, 180, 26, 243, 24, 132, 193, 74, 210, 172, 184, 104, 196, 139, 76, 29, 31, 132, 69, 126, 3, 6, 132, 244, 199, 194, 115, 163, 126, 162, 212, 60, 42, 100, 221, 41, 29, 70, 125, 29, 230, 13, 8, 172, 238, 164, 87, 112, 36, 57, 152, 33, 3, 7, 82, 135, 213, 38, 102, 123, 81, 52, 99, 116, 19, 75, 30, 32, 163, 76, 78, 247, 1, 160, 171, 169, 179, 246, 225, 187, 237, 245, 75, 118, 1, 74, 243, 193, 230, 106, 8, 226, 218, 210, 133, 182, 82, 191, 113, 202, 216, 91, 29, 246, 142, 118, 141, 40, 120, 9, 136, 72, 231, 9, 18, 1, 99, 36, 172, 252, 150, 117, 252, 71, 124, 176, 25, 127, 141, 28, 243, 13, 70, 54, 253, 100, 170, 45, 25, 57, 220, 143, 241, 248, 68, 116, 121, 250, 143, 55, 179, 222, 63, 242, 29, 151, 124, 168, 35, 171, 140, 42, 61, 238, 248, 181, 217, 10, 73, 14, 164, 134, 147, 233, 233, 238, 102, 248, 37, 103, 190, 61, 134, 2, 61, 210, 129, 24, 222, 158, 206, 192, 194, 164, 174, 45, 27, 48, 85, 196, 175, 32, 66, 101, 159, 129, 181, 240, 194, 31, 15, 198, 72, 247, 222, 174, 226, 162, 79, 86, 116, 142, 213, 208, 229, 26, 125, 200, 170, 67, 97, 125, 232, 225, 27, 154, 154, 105, 208, 231, 126, 130, 50, 159, 228, 238, 244, 214, 199, 36, 179, 109, 164, 14, 136, 189, 78, 236, 130, 8, 245, 90, 49, 203, 64, 147, 126, 18, 198, 190, 126, 150, 149, 231, 29, 149, 249, 86, 4, 23, 62, 235, 174, 81, 101, 227, 233, 225, 142, 49, 47, 108, 99, 163, 90, 223, 205, 175, 110, 128, 158, 48, 142, 145, 145, 229, 229, 137, 30, 100, 231, 171, 171, 28, 244, 28, 204, 72, 190, 37, 123, 115, 239, 248, 55, 196, 243, 154, 45, 251, 139, 150, 251, 83, 47, 235, 96, 50, 171, 164, 225, 122, 78, 38, 229, 168, 189, 56, 20, 132, 208, 143, 118, 226, 144, 53, 42, 239, 97, 177, 254, 152, 227, 76, 241, 74, 165, 60, 133, 198, 73, 148, 24, 29, 10, 38, 37, 191, 156, 140, 134, 157, 210, 230, 173, 200, 55, 142, 50, 118, 74, 88, 127, 127, 212, 183, 75, 126, 32, 28, 202, 137, 111, 240, 197, 197, 77, 202, 43, 155, 228, 139, 3, 66, 236, 8, 212, 24, 9, 77, 197, 75, 16, 68, 242, 244, 188, 214, 96, 77, 147, 145, 120, 31, 83, 162, 82, 213, 111, 14, 182, 144, 111, 1, 90, 233, 64, 41, 189, 88, 81, 69, 65, 90, 93, 54, 121, 119, 175, 208, 148, 231, 225, 52, 120, 127, 89, 179, 213, 146, 250, 14, 1, 162, 181, 251, 78, 45, 255, 62, 65, 76, 103, 119, 99, 14, 208, 25, 128, 169, 176, 145, 69, 243, 37, 138, 13, 3, 31, 248, 246, 90, 119, 48, 252, 65, 19, 63, 198, 146, 68, 157, 14, 96, 152, 89, 29, 54, 179, 124,
-212, 187, 133, 153, 69, 240, 207, 83, 177, 110, 228, 200, 35, 33, 44, 244, 245, 146, 242, 80, 183, 59, 227, 40, 106, 160, 34, 218, 56, 33, 108, 218, 238, 231, 196, 18, 169, 236, 115, 241, 177, 173, 207, 52, 84, 234, 228, 135, 140, 75, 179, 214, 32, 10, 76, 57, 17, 63, 206, 173, 28, 27, 31, 133, 53, 27, 205, 90, 253, 72, 111, 108, 201, 180, 81, 112, 148, 226, 41, 48, 19, 234, 242, 19, 101, 211, 201, 55, 239, 215, 86, 101, 167, 231, 85, 115, 62, 91, 52, 70, 73, 136, 9, 228, 3, 60, 226, 91, 113, 211, 10, 252, 204, 67, 106, 231, 12, 191, 136, 178, 183, 21, 140, 97, 155, 124, 124, 46, 177, 116, 183, 43, 189, 210, 19, 75, 126, 36, 106, 122, 65, 8, 163, 227, 232, 168, 188, 183, 250, 237, 57, 225, 211, 49, 241, 97, 152, 71, 7, 1, 126, 117, 216, 191, 14, 240, 43, 169, 221, 22, 209, 238, 67, 24, 234, 43, 246, 215, 173, 19, 224, 78, 56, 236, 69, 151, 161, 88, 130, 107, 33, 122, 175, 190, 47, 56, 90, 74, 163, 244, 197, 21, 162, 239, 213, 1, 212, 44, 113, 119, 253, 133, 133, 206, 224, 228, 35, 48, 0, 142, 47, 104, 216, 21, 171, 249, 227, 60, 186, 210, 31, 86, 151, 194, 63, 109, 133, 151, 72, 16, 207, 92, 61, 39, 90, 8, 140, 6, 218, 103, 8, 149, 137, 159, 31, 235, 75, 122, 209, 2, 136, 159, 83, 230, 128, 140, 130, 46, 129, 178, 67, 150, 131, 214, 246, 255, 26, 242, 140, 3, 148, 142, 211, 62, 233, 44, 127, 143, 26, 149, 39, 62, 153, 70, 173, 192, 130, 77, 190, 79, 242, 245, 77, 70, 247, 106, 192, 220, 3, 154, 124, 40, 185, 208, 219, 20, 182, 5, 130, 174, 203, 97, 138, 110, 198, 127, 20, 55, 223, 62, 92, 22, 15, 94, 239, 154, 72, 21, 104, 151, 197, 75, 120, 155, 112, 186, 117, 76, 3, 48, 99, 24, 178, 151, 175, 226, 126, 200, 98, 121, 130, 246, 127, 88, 183, 210, 34, 76, 122, 158, 142, 104, 171, 27, 98, 127, 86, 117, 143, 144, 25, 134, 137, 227, 213, 79, 108, 230, 88, 13, 21, 20, 177, 246, 52, 186, 8, 94, 0, 235, 137, 85, 172, 66, 163, 20, 99, 210, 193, 192, 155, 15, 88, 51, 41, 41, 232, 70, 190, 242, 160, 213, 122, 175, 162, 121, 150, 194, 105, 185, 22, 77, 221, 222, 190, 39, 191, 200, 45, 110, 151, 138, 108, 168, 68, 23, 149, 140, 157, 176, 160, 30, 243, 222, 233, 131, 17, 24, 177, 101, 43, 92, 245, 20, 153, 25, 123, 182, 187, 239, 168, 159, 140, 154, 68, 229, 191, 201, 136, 167, 209, 219, 211, 24, 12, 69, 115, 232, 212, 57, 31, 203, 43, 31, 189, 32, 176, 72, 113, 249, 8, 242, 46, 36, 223, 29, 108, 30, 59, 43, 70, 149, 27, 184, 153, 61, 205, 216, 98, 198, 251, 3, 88, 63, 103, 36, 16, 107, 80, 106, 113, 225, 84, 179, 111, 151, 68, 123, 188, 127, 58, 215, 178, 198, 62, 205, 101, 200, 14, 170, 42, 10, 227, 125, 125, 86, 42, 203, 162, 210, 52, 129, 250, 148, 201, 174, 72, 93, 185, 68, 254, 242, 93, 117, 111, 162, 41, 81, 201, 20, 237, 179, 70, 14, 39, 209, 15, 209, 241, 117, 201, 139, 155, 42, 55, 161, 3, 51, 106, 70, 68, 156, 238, 219, 98, 187, 33, 185, 15, 195, 70, 210, 87, 57, 218, 0, 200, 237, 180, 229, 30, 73, 199, 214, 150, 207, 93, 18, 231, 94, 208, 166, 244, 167, 87, 70, 89, 138, 34, 112, 142, 51, 133, 70, 155, 162, 156, 175, 208, 117, 72, 121, 7, 70, 213, 18, 177, 142, 1, 112, 193, 220, 159, 127, 4, 173, 37, 217, 57, 212, 108, 34, 227, 138, 187, 198, 100, 255, 200, 2, 217, 173, 143, 194, 191, 123, 125, 28, 53, 61, 204, 34, 70, 121, 208, 0, 143, 3, 112, 45, 28, 248, 112, 83, 218, 145, 224, 84, 87, 81, 132, 23, 209, 91, 151, 11, 146, 132, 79, 210, 234, 81, 51, 18, 142, 90, 201, 145, 239, 254, 120, 88, 191, 90, 118, 111, 162, 33, 62, 13, 51, 235, 153, 88, 245, 225, 181, 37, 69, 232, 92, 217, 0, 22, 212, 63, 42, 169, 105, 224, 220, 98, 122, 214, 153, 14, 90, 101, 110, 90, 50, 228, 215, 67, 204, 182, 165, 9, 236, 39, 193, 42, 137, 189, 42, 142, 46, 238, 216, 204, 215, 115, 251, 254, 72, 134, 210, 210, 149, 90, 163, 161, 107, 119, 9, 121, 242, 254, 33, 54, 185, 50, 204, 121, 44, 145, 120, 64, 8, 203, 65, 149, 16, 11, 101, 46, 199, 170, 163, 29, 168, 42, 218, 207, 182, 25, 13, 179, 143, 68, 234, 194, 75, 233, 144, 92, 139, 207, 236, 65, 181, 4, 117, 102, 80, 135, 141, 95, 73, 151, 78, 220, 112, 120, 5, 234, 183, 114, 31, 121, 226, 141, 209, 91, 229, 229, 127, 165, 167, 148, 92, 247, 99, 112, 147, 16, 59, 81, 14, 188, 143, 205, 211, 147, 119, 122, 188, 204, 33, 78, 200, 85, 100, 119, 236, 57, 243, 152, 122, 62, 43, 251, 116, 167, 8, 53, 107, 175, 204, 210, 186, 225, 137, 92, 135, 172, 238, 89, 0, 145, 86, 217, 166, 189, 174, 227, 108, 52, 216, 40, 229, 51, 158, 29, 133, 130, 146, 82, 185, 226, 47, 169, 247, 57, 55, 66, 72, 91, 123, 61, 92, 73, 7, 124, 63, 62, 70, 224, 178, 31, 72, 209, 99, 4, 103, 126, 222, 95, 11, 164, 148, 129, 246, 106, 209, 43, 186, 164, 211, 23, 55, 149, 224, 25, 3, 99, 67, 119, 63, 17, 97, 114, 239, 212, 187, 99, 39, 40, 31, 188, 252, 185, 180, 252, 211, 109, 108, 120, 236, 233, 134, 211, 71, 78, 37, 193, 132, 169, 229, 44, 131, 23, 216, 9, 221, 44, 149, 0, 122, 23, 74, 249, 116, 213, 102, 183, 134, 1, 201, 98, 163, 9, 1, 52, 44, 119, 248, 115, 8, 242, 104, 22, 155, 105, 46, 151, 19, 31, 77, 149, 127, 253, 254, 29, 12, 100, 196, 6, 248, 170, 165, 235, 149, 227, 24, 174, 226, 130, 129, 187, 142, 89, 89, 229, 63, 108, 90, 154, 239, 110, 155, 209, 203, 107, 143, 51, 107, 47, 44, 146, 3, 21, 102, 6, 177, 90, 105, 38, 254, 252, 171, 118, 248, 252, 228, 80, 153, 80, 84, 192, 66, 220, 129, 211, 162, 43, 187, 153, 177, 192, 130, 110, 8, 125, 228, 34, 81, 18, 221, 64, 73, 77, 53, 73, 151, 36, 203, 176, 249, 105, 144, 201, 135, 222, 155, 241, 132, 70, 176, 9, 86, 102, 35, 137, 124, 38, 83, 147, 51, 251, 169, 18, 245, 202, 65, 216, 117, 85, 184, 234, 210, 117, 45, 239, 131, 165, 64, 71, 60, 36, 239, 228, 167, 238, 94, 17, 235, 112, 72, 170, 129, 176, 107, 205, 253, 34, 173, 81, 48, 142, 94, 141, 3, 238, 139, 133, 102, 164, 22, 131, 62, 165, 18, 121, 135, 63, 66, 106, 103, 7, 209, 104, 123, 255, 219, 187, 104, 199, 198, 192, 130, 126, 69, 196, 117, 46,
-109, 207, 212, 53, 163, 217, 27, 216, 79, 211, 33, 23, 154, 10, 49, 16, 96, 121, 230, 211, 103, 245, 181, 195, 186, 18, 248, 252, 77, 23, 49, 158, 211, 13, 160, 121, 244, 111, 219, 159, 10, 101, 232, 157, 107, 243, 175, 168, 23, 20, 80, 65, 39, 36, 19, 190, 140, 73, 181, 185, 72, 229, 68, 28, 5, 107, 160, 80, 35, 192, 44, 50, 32, 15, 203, 126, 223, 18, 20, 101, 238, 108, 238, 170, 58, 108, 59, 19, 54, 217, 109, 105, 162, 253, 228, 200, 20, 234, 51, 178, 196, 84, 24, 213, 159, 143, 145, 56, 230, 238, 169, 90, 14, 254, 227, 216, 160, 180, 113, 221, 36, 144, 89, 221, 223, 172, 36, 152, 115, 91, 194, 64, 29, 73, 249, 25, 28, 15, 203, 90, 172, 34, 225, 32, 123, 132, 134, 125, 75, 127, 135, 122, 61, 110, 161, 10, 45, 139, 128, 60, 42, 56, 25, 146, 120, 170, 208, 161, 246, 54, 245, 241, 176, 167, 38, 40, 23, 35, 24, 238, 94, 55, 118, 121, 200, 133, 167, 109, 188, 100, 63, 236, 12, 227, 186, 63, 244, 126, 112, 0, 205, 60, 144, 107, 142, 226, 86, 194, 108, 151, 125, 236, 126, 39, 243, 62, 156, 84, 116, 133, 16, 83, 87, 159, 39, 35, 174, 37, 198, 112, 44, 215, 205, 163, 122, 126, 208, 23, 220, 148, 117, 255, 118, 207, 103, 150, 229, 12, 251, 87, 16, 87, 89, 167, 80, 107, 213, 11, 88, 93, 57, 30, 39, 153, 179, 223, 249, 71, 86, 33, 222, 58, 17, 220, 194, 98, 60, 97, 34, 149, 13, 225, 118, 171, 39, 206, 62, 167, 164, 191, 238, 74, 22, 149, 57, 118, 48, 43, 191, 241, 4, 220, 161, 87, 227, 221, 225, 118, 52, 204, 6, 25, 181, 117, 123, 5, 53, 84, 190, 100, 55, 214, 202, 75, 252, 232, 184, 72, 142, 42, 231, 158, 97, 48, 33, 105, 15, 208, 197, 155, 17, 56, 150, 254, 140, 28, 184, 232, 180, 129, 174, 92, 114, 23, 19, 234, 216, 146, 223, 166, 231, 226, 141, 44, 205, 34, 118, 41, 108, 121, 220, 81, 23, 251, 87, 110, 28, 16, 195, 165, 16, 73, 60, 45, 24, 102, 95, 130, 197, 236, 3, 48, 101, 195, 75, 168, 242, 207, 64, 12, 145, 145, 193, 185, 136, 148, 183, 29, 233, 226, 233, 80, 197, 189, 71, 77, 206, 254, 144, 74, 90, 235, 63, 155, 103, 73, 33, 159, 2, 162, 64, 138, 19, 47, 158, 70, 31, 3, 179, 185, 245, 102, 225, 57, 98, 130, 86, 84, 232, 175, 196, 62, 163, 205, 92, 198, 53, 84, 78, 141, 212, 97, 52, 192, 16, 125, 158, 209, 32, 71, 68, 178, 171, 193, 143, 131, 125, 155, 215, 1, 177, 117, 62, 82, 186, 244, 30, 71, 94, 121, 65, 50, 129, 252, 81, 193, 64, 228, 182, 113, 66, 164, 41, 192, 52, 12, 226, 173, 110, 215, 189, 118, 40, 113, 207, 88, 47, 217, 65, 237, 116, 240, 173, 79, 145, 103, 38, 38, 111, 63, 108, 215, 161, 181, 131, 161, 50, 117, 249, 31, 107, 34, 136, 237, 149, 89, 222, 18, 23, 127, 77, 156, 40, 184, 235, 45, 242, 157, 188, 169, 148, 200, 148, 194, 52, 85, 209, 121, 56, 136, 199, 225, 105, 77, 84, 24, 3, 170, 124, 40, 235, 80, 187, 85, 129, 102, 154, 33, 250, 59, 0, 73, 70, 145, 87, 103, 49, 64, 213, 156, 217, 1, 247, 241, 151, 183, 120, 85, 194, 142, 202, 134, 187, 241, 18, 215, 108, 111, 199, 159, 83, 206, 56, 69, 3, 23, 42, 26, 13, 227, 239, 47, 89, 147, 200, 82, 0, 175, 143, 90, 98, 64, 204, 157, 255, 170, 45, 152, 146, 99, 195, 133, 12, 249, 158, 78, 116, 109, 224, 72, 69, 128, 50, 63, 92, 208, 233, 128, 59, 58, 223, 0, 212, 103, 2, 70, 20, 99, 129, 107, 159, 223, 156, 66, 8, 17, 78, 237, 34, 141, 188, 143, 228, 39, 91, 152, 83, 182, 38, 104, 192, 167, 35, 34, 114, 87, 192, 194, 171, 158, 237, 176, 201, 223, 14, 154, 82, 89, 244, 49, 185, 172, 63, 89, 131, 58, 115, 195, 34, 43, 18, 39, 247, 63, 195, 172, 38, 213, 141, 171, 175, 89, 111, 239, 180, 35, 160, 250, 121, 252, 138, 31, 6, 253, 239, 225, 218, 156, 161, 170, 169, 79, 95, 109, 221, 147, 156, 253, 58, 191, 15, 194, 80, 201, 181, 74, 225, 182, 218,
-80, 48, 254, 168, 131, 84, 102, 153, 2, 162, 73, 243, 176, 169, 223, 195, 240, 82, 195, 91, 137, 156, 176, 125, 75, 25, 211, 215, 128, 194, 138, 138, 99, 33, 129, 56, 48, 99, 245, 221, 228, 148, 162, 15, 203, 206, 60, 69, 118, 3, 97, 208, 235, 150, 13, 178, 97, 213, 15, 82, 12, 176, 58, 33, 28, 163, 110, 189, 131, 38, 25, 184, 74, 118, 255, 101, 234, 186, 21, 22, 186, 220, 0, 91, 150, 110, 121, 170, 68, 244, 129, 189, 138, 211, 140, 110, 174, 122, 87, 160, 50, 117, 186, 115, 169, 48, 86, 44, 215, 80, 141, 255, 223, 78, 26, 253, 241, 119, 70, 227, 102, 196, 159, 36, 118, 137, 187, 239, 48, 44, 186, 206, 147, 56, 38, 74, 80, 101, 148, 139, 8, 29, 192, 227, 161, 46, 29, 170, 188, 58, 144, 227, 97, 218, 211, 210, 26, 105, 105, 18, 170, 172, 227, 243, 10, 8, 226, 36, 39, 34, 129, 71, 97, 240, 6, 216, 50, 100, 26, 241, 208, 163, 0, 68, 96, 103, 220, 190, 244, 50, 234, 170, 42, 98, 253, 148, 190, 62, 40, 211, 164, 60, 137, 10, 25, 229, 219, 244, 195, 90, 59, 196, 159, 216, 110, 218, 125, 247, 246, 212, 23, 167, 115, 144, 105, 32, 23, 7, 194, 72, 132, 90, 246, 15, 81, 228, 41, 153, 187, 30, 129, 70, 98, 183, 203, 71, 28, 244, 200, 78, 185, 108, 110, 59, 69, 223, 117, 119, 6, 189, 57, 179, 180, 84, 164, 11, 139, 200, 81, 78, 168, 168, 180, 26, 208, 93, 89, 214, 29, 34, 41, 156, 216, 24, 128, 169, 99, 131, 196, 82, 136, 165, 25, 96, 111, 226, 221, 146, 135, 1, 246, 51, 110, 211, 162, 88, 51, 243, 129, 103, 92, 160, 70, 251, 234, 177, 80, 220, 155, 236, 18, 183, 2, 178, 233, 200, 43, 215, 99, 161, 29, 62, 160, 164, 164, 211, 171, 122, 245, 152, 53, 206, 181, 21, 183, 252, 54, 99, 106, 55, 13, 217, 74, 7, 239, 161, 184, 19, 40, 119, 115, 0, 16, 89, 182, 186, 197, 47, 233, 122, 140, 184, 53, 174, 249, 18, 243, 162, 141, 221, 209, 186, 160, 176, 248, 27, 163, 253, 178, 34, 124, 84, 30, 57, 250, 103, 155, 53, 235, 112, 132, 250, 252, 91, 104, 176, 216, 41, 87, 162, 228, 223, 91, 156,
-165, 15, 107, 159, 40, 70, 183, 183, 248, 96, 190, 242, 17, 227, 205, 169, 212, 158, 255, 206, 31, 135, 95, 189, 87, 200, 77, 85, 219, 190, 15, 221, 167, 4, 60, 122, 10, 8, 129, 43, 222, 144, 94, 175, 161, 195, 237, 130, 179, 84, 194, 66, 155, 223, 98, 59, 17, 96, 191, 3, 90, 150, 252, 193, 64, 26, 214, 245, 70, 71, 65, 75, 217, 178, 85, 208, 12, 159, 172, 231, 232, 150, 222, 225, 17, 26, 246, 113, 223, 122, 24, 123, 171, 138, 170, 102, 59, 188, 246, 86, 202, 39, 190, 134, 232, 30, 61, 226, 50, 110, 160, 185, 46, 32, 226, 175, 209, 72, 242, 82, 195, 118, 230, 5, 248, 29, 57, 166, 200, 173, 174, 234, 206, 168, 178, 213, 122, 45, 9, 175, 232, 224, 231, 21, 46, 132, 189, 35, 106, 31, 85, 195, 15, 121, 158, 164, 139, 79, 217, 248, 27, 199, 33, 195, 40, 65, 143, 153, 10, 25, 211, 122, 253, 224, 76, 207, 190, 109, 61, 104, 127, 92, 186, 255, 128, 72, 100, 116, 192, 237, 255, 169, 103, 17, 149, 138, 79, 252, 4, 62, 185, 77, 110, 62, 154, 31, 178, 84, 228, 219, 94, 127, 134, 88, 170, 144, 195, 131, 245, 126, 244, 238, 127, 141, 243, 246, 226, 139, 246, 15, 255, 220, 118, 68, 129, 53, 251, 79, 116, 92, 81, 33, 115, 169, 244, 255, 87, 222, 184, 161, 125, 198, 197, 112, 149, 184, 156, 61, 243, 221, 84, 243, 19, 141, 177, 173, 172, 68, 113, 241, 240, 12, 10, 211, 224, 158, 150, 14, 191, 181, 151, 212, 200, 215, 44, 248, 127, 225, 247, 82, 58, 137, 39, 115, 171, 248, 250, 255, 75, 185, 67, 94, 202, 122, 7, 30, 153, 140, 248, 123, 204, 26, 106, 28, 89, 177, 249, 163, 202, 159, 69, 213, 53, 189, 224, 43, 103, 78, 145, 34, 148, 214, 163, 204, 159, 219, 191, 89, 199, 78, 0, 46, 85, 169, 215, 46, 106, 36, 114, 20, 28, 163, 229, 146, 0, 89, 73, 75, 204, 255, 82, 142, 239, 211, 225, 231, 5, 94, 139, 252, 23, 154, 227, 68, 207, 205, 60, 153, 101, 89, 247, 235, 66, 230, 120, 191, 139, 33, 231, 211, 126, 95, 60, 137, 28, 176, 42, 114, 185, 165, 55, 232, 236, 59, 238, 41, 197, 16, 144, 39, 7, 154, 218, 184, 243, 31, 80, 227, 34, 116, 248, 90, 231, 163, 159, 255, 5, 233, 134, 90, 94, 174, 248, 59, 91, 79, 96, 238, 208, 218, 57, 107, 225, 85, 146, 82, 111, 35, 148, 152, 59, 73, 233, 186, 168, 140, 161, 106, 92, 173, 254, 230, 67, 114, 35, 139, 228, 255, 81, 149, 52, 41, 93, 210, 187, 37, 14, 160, 154, 180, 9, 200, 238, 221, 1, 252, 59, 58, 26, 134, 234, 213, 170, 118, 81, 255, 3, 80, 75, 3, 4, 20, 0, 0, 8, 8, 0, 131, 182, 42, 68, 158, 64, 172, 29, 120, 6, 0, 0, 95, 61, 0, 0, 12, 0, 0, 0, 97, 114, 105, 97, 108, 95, 50, 52, 46, 102, 110, 116, 189, 91, 219, 110, 219, 72, 12, 125, 239, 87, 8, 126, 110, 55, 195, 185, 15, 144, 20, 216, 183, 254, 193, 62, 46, 180, 190, 36, 66, 29, 185, 136, 221, 221, 237, 126, 253, 74, 195, 81, 34, 89, 29, 149, 148, 28, 161, 64, 42, 59, 62, 62, 67, 14, 121, 72, 113, 148, 251, 195, 169, 190, 124, 254, 80, 20, 247, 85, 125, 56, 21, 135, 114, 187, 127, 216, 252, 254, 82, 149, 199, 77, 113, 174, 254, 107, 94, 72, 189, 41, 254, 58, 29, 119, 15, 27, 177, 41, 170, 75, 121, 172, 182, 241, 114, 251, 84, 190, 156, 247, 151, 135, 205, 166, 248, 94, 87, 219, 211, 110, 223, 94, 158, 47, 47, 251, 203, 246, 233, 203, 195, 6, 68, 243, 161, 243, 243, 233, 116, 121, 106, 94, 108, 138, 178, 140, 255, 125, 43, 119, 187, 170, 126, 108, 190, 247, 99, 252, 215, 124, 230, 91, 185, 141, 239, 136, 143, 13, 226, 244, 253, 114, 172, 234, 125, 75, 113, 23, 215, 181, 61, 61, 63, 159, 234, 162, 125, 243, 203, 190, 122, 124, 106, 24, 165, 111, 150, 84, 158, 219, 197, 181, 248, 109, 121, 220, 255, 209, 124, 57, 248, 238, 85, 67, 47, 93, 203, 245, 184, 63, 39, 214, 237, 215, 253, 238, 237, 75, 227, 111, 218, 171, 116, 93, 84, 104, 223, 161, 58, 54, 223, 90, 182, 246, 255, 41, 245, 111, 223, 234, 199, 4, 184, 123, 69, 220, 71, 195, 139, 237, 233, 123, 221, 44, 37, 192, 38, 125, 77, 251, 118, 252, 154, 208, 48, 255, 219, 44, 96, 83, 252, 136, 63, 255, 169, 118, 209, 5, 205, 229, 83, 50, 0, 84, 243, 145, 211, 225, 16, 253, 215, 44, 239, 71, 119, 109, 155, 247, 203, 221, 223, 101, 221, 110, 67, 251, 169, 150, 54, 185, 187, 62, 54, 111, 25, 92, 207, 128, 207, 71, 62, 176, 215, 132, 208, 35, 244, 61, 66, 217, 35, 148, 115, 8, 3, 26, 24, 166, 8, 105, 22, 74, 18, 97, 12, 165, 134, 81, 75, 170, 137, 176, 208, 68, 16, 16, 25, 141, 89, 107, 23, 65, 200, 200, 104, 175, 189, 234, 51, 38, 138, 30, 33, 244, 9, 29, 145, 79, 69, 62, 23, 230, 248, 116, 158, 133, 58, 50, 6, 185, 86, 160, 130, 48, 152, 26, 226, 122, 27, 37, 151, 209, 16, 9, 109, 34, 188, 246, 170, 121, 35, 148, 253, 176, 249, 4, 75, 25, 81, 109, 96, 156, 254, 130, 237, 85, 106, 54, 38, 193, 105, 101, 120, 29, 175, 162, 224, 128, 26, 69, 142, 203, 100, 163, 204, 197, 170, 20, 52, 74, 64, 197, 1, 3, 83, 110, 37, 81, 82, 131, 21, 32, 233, 184, 90, 77, 115, 0, 53, 7, 156, 155, 147, 146, 243, 40, 81, 118, 32, 136, 213, 116, 7, 80, 119, 164, 184, 118, 44, 59, 122, 60, 145, 16, 101, 71, 130, 92, 173, 66, 2, 10, 143, 148, 215, 74, 103, 123, 140, 46, 83, 62, 228, 140, 242, 1, 169, 203, 81, 106, 189, 4, 65, 221, 145, 154, 92, 148, 197, 98, 183, 166, 86, 199, 4, 170, 242, 228, 41, 137, 142, 149, 168, 60, 210, 249, 213, 172, 148, 144, 26, 186, 201, 158, 213, 223, 148, 18, 149, 71, 9, 75, 77, 145, 165, 148, 22, 147, 82, 193, 104, 43, 45, 193, 200, 97, 161, 180, 52, 70, 204, 73, 165, 70, 234, 170, 216, 165, 153, 200, 136, 73, 169, 140, 164, 218, 8, 185, 46, 146, 24, 174, 22, 115, 82, 185, 145, 156, 27, 182, 141, 68, 70, 76, 73, 229, 87, 243, 170, 75, 119, 31, 130, 156, 30, 121, 70, 90, 199, 227, 48, 33, 245, 184, 169, 227, 239, 99, 160, 49, 98, 62, 106, 165, 175, 25, 245, 59, 237, 163, 195, 70, 64, 155, 235, 200, 97, 111, 35, 145, 79, 39, 62, 67, 109, 148, 97, 97, 163, 236, 80, 113, 180, 117, 203, 125, 74, 140, 84, 84, 28, 237, 213, 90, 183, 88, 14, 21, 71, 7, 59, 85, 32, 73, 140, 196, 214, 220, 161, 226, 24, 48, 171, 69, 42, 42, 142, 81, 64, 181, 113, 105, 54, 122, 145, 166, 15, 98, 45, 141, 243, 105, 222, 97, 205, 148, 141, 225, 150, 54, 162, 226, 24, 175, 215, 170, 28, 30, 21, 199, 10, 160, 70, 78, 222, 70, 162, 87, 81, 115, 44, 184, 57, 140, 115, 42, 135, 71, 205, 177, 227, 182, 252, 189, 178, 195, 163, 230, 88, 189, 90, 95, 229, 81, 115, 236, 72, 87, 165, 228, 50, 74, 154, 202, 121, 159, 102, 115, 176, 154, 141, 168, 57, 78, 172, 230, 213, 128, 154, 227, 36, 57, 86, 197, 194, 88, 85, 105, 2, 169, 213, 58, 29, 128, 215, 169, 147, 115, 122, 52, 185, 98, 83, 74, 154, 87, 77, 218, 71, 55, 101, 163, 165, 220, 37, 211, 108, 84, 46, 241, 141, 238, 30, 3, 87, 227, 36, 208, 44, 244, 105, 142, 28, 38, 44, 84, 183, 179, 208, 98, 212, 120, 161, 231, 12, 144, 96, 70, 143, 163, 177, 82, 249, 145, 138, 247, 70, 243, 36, 62, 90, 97, 212, 24, 164, 126, 148, 136, 54, 51, 67, 206, 242, 209, 198, 85, 26, 75, 191, 87, 102, 29, 190, 128, 37, 202, 235, 169, 18, 37, 115, 58, 51, 167, 73, 213, 41, 100, 198, 83, 156, 126, 193, 144, 25, 19, 205, 128, 81, 211, 24, 147, 141, 110, 98, 228, 152, 227, 131, 25, 62, 181, 105, 15, 253, 212, 45, 106, 46, 70, 221, 28, 3, 177, 234, 251, 81, 223, 223, 203, 250, 92, 210, 195, 140, 172, 215, 233, 236, 104, 212, 187, 245, 248, 236, 45, 249, 92, 226, 179, 19, 51, 227, 91, 30, 199, 201, 100, 32, 76, 28, 85, 201, 172, 71, 251, 132, 180, 194, 164, 58, 190, 144, 55, 208, 82, 26, 83, 154, 168, 169, 144, 206, 254, 60, 109, 255, 22, 30, 139, 217, 100, 221, 168, 13, 238, 23, 122, 154, 168, 73, 90, 66, 40, 204, 248, 96, 60, 245, 150, 77, 44, 44, 75, 10, 83, 48, 184, 169, 243, 34, 153, 83, 25, 49, 231, 224, 63, 121, 117, 60, 122, 235, 143, 80, 4, 169, 244, 210, 154, 11, 133, 205, 69, 24, 53, 23, 217, 155, 196, 165, 183, 108, 32, 211, 1, 149, 128, 137, 212, 191, 101, 61, 4, 217, 157, 82, 143, 14, 111, 222, 137, 49, 164, 147, 70, 49, 154, 246, 153, 76, 228, 44, 236, 188, 67, 231, 83, 13, 68, 194, 133, 199, 83, 74, 118, 132, 215, 233, 216, 139, 84, 145, 75, 198, 48, 163, 94, 248, 28, 97, 118, 72, 188, 244, 25, 21, 157, 78, 197, 133, 149, 196, 26, 165, 22, 50, 154, 116, 40, 46, 28, 172, 101, 164, 233, 66, 213, 155, 213, 40, 187, 216, 9, 97, 206, 113, 216, 44, 202, 148, 31, 241, 116, 124, 37, 43, 117, 162, 28, 223, 239, 191, 27, 101, 210, 57, 24, 169, 192, 224, 214, 205, 221, 146, 50, 61, 143, 3, 70, 175, 102, 229, 235, 3, 57, 171, 41, 65, 82, 59, 28, 22, 11, 142, 212, 17, 165, 245, 254, 46, 62, 244, 24, 47, 191, 238, 95, 234, 170, 126, 124, 123, 2, 210, 117, 79, 64, 166, 223, 20, 135, 234, 229, 124, 193, 85, 157, 247, 219, 83, 157, 14, 95, 203, 103, 4, 124, 130, 87, 11, 38, 16, 237, 232, 180, 67, 8, 18, 32, 16, 0, 173, 102, 118, 0, 221, 3, 124, 146, 57, 68, 187, 242, 14, 209, 210, 253, 218, 138, 62, 162, 111, 5, 141, 163, 29, 167, 50, 17, 142, 189, 42, 182, 229, 241, 217, 139, 95, 122, 119, 136, 8, 92, 68, 59, 112, 250, 37, 162, 29, 225, 189, 238, 96, 223, 187, 138, 132, 176, 92, 4, 45, 114, 219, 131, 55, 94, 148, 244, 17, 180, 40, 25, 32, 44, 27, 225, 216, 136, 192, 69, 12, 118, 48, 111, 186, 23, 63, 119, 150, 160, 0, 104, 123, 238, 217, 123, 238, 115, 123, 158, 181, 220, 115, 213, 106, 0, 176, 92, 128, 227, 2, 40, 249, 215, 174, 155, 183, 21, 154, 189, 21, 125, 4, 41, 153, 6, 8, 203, 229, 48, 158, 141, 8, 92, 4, 49, 64, 122, 8, 199, 221, 141, 224, 184, 139, 10, 108, 51, 226, 83, 238, 92, 8, 123, 11, 227, 131, 173, 76, 22, 208, 124, 22, 195, 103, 113, 124, 150, 192, 134, 16, 69, 209, 102, 18, 75, 146, 16, 134, 205, 97, 185, 28, 131, 196, 34, 113, 152, 192, 69, 16, 19, 203, 102, 242, 132, 132, 24, 70, 61, 208, 32, 134, 146, 190, 54, 23, 244, 52, 18, 98, 208, 91, 126, 4, 207, 168, 209, 46, 19, 142, 52, 4, 201, 93, 46, 19, 141, 36, 10, 227, 153, 20, 38, 48, 1, 180, 206, 175, 143, 8, 142, 139, 24, 196, 162, 160, 33, 184, 190, 29, 132, 34, 17, 161, 217, 8, 199, 69, 144, 186, 125, 31, 184, 253, 73, 96, 247, 39, 33, 35, 163, 146, 132, 176, 92, 14, 162, 140, 134, 140, 140, 146, 86, 101, 217, 118, 16, 101, 52, 228, 100, 148, 8, 49, 92, 219, 135, 58, 74, 99, 1, 201, 135, 40, 62, 196, 241, 109, 33, 109, 125, 252, 75, 192, 55, 151, 81, 162, 62, 38, 44, 79, 174, 135, 16, 75, 131, 120, 110, 143, 50, 132, 88, 26, 36, 240, 109, 9, 108, 91, 90, 249, 97, 218, 50, 128, 252, 196, 150, 251, 187, 110, 54, 246, 249, 195, 253, 93, 252, 195, 234, 255, 1, 80, 75, 1, 2, 20, 0, 20, 0, 0, 8, 8, 0, 131, 182, 42, 68, 22, 124, 124, 222, 0, 29, 0, 0, 62, 29, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 114, 105, 97, 108, 95, 50, 52, 46, 112, 110, 103, 80, 75, 1, 2, 20, 0, 20, 0, 0, 8, 8, 0, 131, 182, 42, 68, 158, 64, 172, 29, 120, 6, 0, 0, 95, 61, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 29, 0, 0, 97, 114, 105, 97, 108, 95, 50, 52, 46, 102, 110, 116, 80, 75, 5, 6, 0, 0, 0, 0, 2, 0, 2, 0, 116, 0, 0, 0, 204, 35, 0, 0, 0, 0];
+ 80,
+ 75,
+ 3,
+ 4,
+ 20,
+ 0,
+ 0,
+ 8,
+ 8,
+ 0,
+ 131,
+ 182,
+ 42,
+ 68,
+ 22,
+ 124,
+ 124,
+ 222,
+ 0,
+ 29,
+ 0,
+ 0,
+ 62,
+ 29,
+ 0,
+ 0,
+ 12,
+ 0,
+ 0,
+ 0,
+ 97,
+ 114,
+ 105,
+ 97,
+ 108,
+ 95,
+ 50,
+ 52,
+ 46,
+ 112,
+ 110,
+ 103,
+ 141,
+ 121,
+ 103,
+ 80,
+ 19,
+ 80,
+ 179,
+ 118,
+ 18,
+ 66,
+ 143,
+ 180,
+ 208,
+ 155,
+ 128,
+ 64,
+ 164,
+ 67,
+ 232,
+ 16,
+ 122,
+ 239,
+ 85,
+ 5,
+ 68,
+ 64,
+ 122,
+ 83,
+ 58,
+ 132,
+ 158,
+ 0,
+ 130,
+ 244,
+ 142,
+ 160,
+ 16,
+ 170,
+ 2,
+ 138,
+ 72,
+ 87,
+ 164,
+ 5,
+ 165,
+ 119,
+ 4,
+ 233,
+ 66,
+ 144,
+ 222,
+ 36,
+ 116,
+ 233,
+ 215,
+ 119,
+ 190,
+ 31,
+ 223,
+ 251,
+ 235,
+ 206,
+ 61,
+ 179,
+ 115,
+ 102,
+ 127,
+ 236,
+ 236,
+ 60,
+ 115,
+ 102,
+ 207,
+ 238,
+ 179,
+ 243,
+ 196,
+ 27,
+ 27,
+ 106,
+ 221,
+ 33,
+ 99,
+ 38,
+ 3,
+ 0,
+ 0,
+ 119,
+ 116,
+ 180,
+ 213,
+ 77,
+ 1,
+ 0,
+ 48,
+ 230,
+ 159,
+ 207,
+ 66,
+ 66,
+ 244,
+ 239,
+ 86,
+ 224,
+ 212,
+ 200,
+ 0,
+ 0,
+ 216,
+ 8,
+ 117,
+ 212,
+ 85,
+ 204,
+ 145,
+ 115,
+ 123,
+ 79,
+ 18,
+ 211,
+ 75,
+ 229,
+ 234,
+ 49,
+ 16,
+ 18,
+ 52,
+ 21,
+ 109,
+ 148,
+ 42,
+ 7,
+ 248,
+ 159,
+ 189,
+ 80,
+ 38,
+ 137,
+ 81,
+ 38,
+ 129,
+ 130,
+ 56,
+ 101,
+ 192,
+ 240,
+ 191,
+ 1,
+ 163,
+ 11,
+ 81,
+ 191,
+ 2,
+ 91,
+ 10,
+ 85,
+ 79,
+ 145,
+ 206,
+ 63,
+ 31,
+ 84,
+ 43,
+ 184,
+ 120,
+ 42,
+ 107,
+ 111,
+ 79,
+ 79,
+ 83,
+ 134,
+ 135,
+ 73,
+ 184,
+ 79,
+ 86,
+ 152,
+ 148,
+ 106,
+ 38,
+ 51,
+ 75,
+ 254,
+ 239,
+ 206,
+ 120,
+ 234,
+ 219,
+ 124,
+ 191,
+ 179,
+ 37,
+ 151,
+ 235,
+ 165,
+ 219,
+ 155,
+ 51,
+ 82,
+ 165,
+ 219,
+ 107,
+ 33,
+ 177,
+ 142,
+ 219,
+ 72,
+ 254,
+ 176,
+ 135,
+ 183,
+ 75,
+ 46,
+ 156,
+ 24,
+ 73,
+ 186,
+ 5,
+ 129,
+ 136,
+ 228,
+ 149,
+ 157,
+ 144,
+ 117,
+ 89,
+ 241,
+ 144,
+ 158,
+ 139,
+ 37,
+ 23,
+ 137,
+ 133,
+ 32,
+ 141,
+ 105,
+ 194,
+ 245,
+ 217,
+ 191,
+ 65,
+ 91,
+ 30,
+ 194,
+ 163,
+ 183,
+ 29,
+ 112,
+ 219,
+ 5,
+ 201,
+ 73,
+ 249,
+ 208,
+ 253,
+ 212,
+ 72,
+ 202,
+ 222,
+ 75,
+ 73,
+ 37,
+ 100,
+ 120,
+ 251,
+ 34,
+ 233,
+ 16,
+ 95,
+ 196,
+ 6,
+ 112,
+ 145,
+ 197,
+ 230,
+ 72,
+ 242,
+ 110,
+ 151,
+ 28,
+ 241,
+ 83,
+ 202,
+ 145,
+ 174,
+ 253,
+ 254,
+ 19,
+ 85,
+ 7,
+ 195,
+ 205,
+ 215,
+ 107,
+ 30,
+ 85,
+ 3,
+ 236,
+ 172,
+ 203,
+ 45,
+ 249,
+ 163,
+ 178,
+ 55,
+ 161,
+ 206,
+ 139,
+ 46,
+ 191,
+ 123,
+ 2,
+ 194,
+ 148,
+ 76,
+ 17,
+ 101,
+ 73,
+ 60,
+ 198,
+ 97,
+ 239,
+ 62,
+ 242,
+ 213,
+ 198,
+ 126,
+ 94,
+ 49,
+ 218,
+ 189,
+ 121,
+ 23,
+ 113,
+ 239,
+ 73,
+ 208,
+ 208,
+ 10,
+ 195,
+ 179,
+ 33,
+ 214,
+ 136,
+ 189,
+ 239,
+ 44,
+ 127,
+ 31,
+ 15,
+ 68,
+ 242,
+ 209,
+ 76,
+ 231,
+ 47,
+ 237,
+ 111,
+ 96,
+ 190,
+ 194,
+ 3,
+ 143,
+ 17,
+ 57,
+ 247,
+ 207,
+ 57,
+ 90,
+ 61,
+ 114,
+ 166,
+ 200,
+ 71,
+ 149,
+ 14,
+ 170,
+ 88,
+ 44,
+ 46,
+ 153,
+ 218,
+ 203,
+ 189,
+ 63,
+ 165,
+ 167,
+ 119,
+ 12,
+ 30,
+ 60,
+ 217,
+ 96,
+ 37,
+ 88,
+ 140,
+ 28,
+ 191,
+ 100,
+ 7,
+ 189,
+ 253,
+ 230,
+ 145,
+ 121,
+ 120,
+ 67,
+ 41,
+ 7,
+ 108,
+ 85,
+ 251,
+ 148,
+ 164,
+ 224,
+ 238,
+ 23,
+ 182,
+ 16,
+ 199,
+ 18,
+ 217,
+ 208,
+ 55,
+ 44,
+ 112,
+ 166,
+ 124,
+ 233,
+ 193,
+ 199,
+ 70,
+ 32,
+ 182,
+ 159,
+ 232,
+ 179,
+ 43,
+ 237,
+ 116,
+ 199,
+ 172,
+ 255,
+ 82,
+ 252,
+ 194,
+ 205,
+ 249,
+ 244,
+ 208,
+ 24,
+ 93,
+ 206,
+ 123,
+ 47,
+ 210,
+ 16,
+ 100,
+ 68,
+ 151,
+ 76,
+ 144,
+ 186,
+ 246,
+ 197,
+ 86,
+ 34,
+ 201,
+ 169,
+ 200,
+ 191,
+ 216,
+ 199,
+ 203,
+ 118,
+ 109,
+ 152,
+ 107,
+ 17,
+ 112,
+ 233,
+ 228,
+ 179,
+ 59,
+ 72,
+ 104,
+ 75,
+ 240,
+ 71,
+ 252,
+ 254,
+ 213,
+ 167,
+ 63,
+ 27,
+ 71,
+ 65,
+ 218,
+ 27,
+ 254,
+ 113,
+ 138,
+ 181,
+ 3,
+ 231,
+ 121,
+ 227,
+ 42,
+ 133,
+ 147,
+ 75,
+ 146,
+ 243,
+ 153,
+ 191,
+ 227,
+ 162,
+ 2,
+ 18,
+ 105,
+ 148,
+ 172,
+ 130,
+ 205,
+ 235,
+ 226,
+ 244,
+ 130,
+ 89,
+ 230,
+ 37,
+ 50,
+ 10,
+ 40,
+ 214,
+ 185,
+ 153,
+ 144,
+ 2,
+ 98,
+ 97,
+ 117,
+ 198,
+ 82,
+ 45,
+ 13,
+ 188,
+ 41,
+ 141,
+ 74,
+ 103,
+ 186,
+ 37,
+ 187,
+ 125,
+ 9,
+ 97,
+ 185,
+ 159,
+ 170,
+ 199,
+ 161,
+ 199,
+ 159,
+ 190,
+ 244,
+ 38,
+ 213,
+ 181,
+ 149,
+ 31,
+ 51,
+ 172,
+ 37,
+ 230,
+ 159,
+ 213,
+ 42,
+ 218,
+ 90,
+ 138,
+ 79,
+ 41,
+ 202,
+ 252,
+ 13,
+ 110,
+ 192,
+ 87,
+ 113,
+ 144,
+ 131,
+ 66,
+ 22,
+ 25,
+ 62,
+ 106,
+ 42,
+ 176,
+ 22,
+ 132,
+ 5,
+ 70,
+ 31,
+ 14,
+ 226,
+ 4,
+ 70,
+ 99,
+ 110,
+ 182,
+ 89,
+ 247,
+ 103,
+ 10,
+ 61,
+ 18,
+ 167,
+ 220,
+ 94,
+ 133,
+ 133,
+ 185,
+ 71,
+ 138,
+ 237,
+ 228,
+ 19,
+ 222,
+ 69,
+ 136,
+ 182,
+ 71,
+ 120,
+ 177,
+ 134,
+ 210,
+ 134,
+ 197,
+ 99,
+ 103,
+ 152,
+ 196,
+ 55,
+ 28,
+ 162,
+ 66,
+ 133,
+ 181,
+ 219,
+ 185,
+ 119,
+ 114,
+ 25,
+ 35,
+ 121,
+ 73,
+ 67,
+ 207,
+ 50,
+ 158,
+ 232,
+ 47,
+ 115,
+ 79,
+ 94,
+ 216,
+ 166,
+ 27,
+ 76,
+ 202,
+ 89,
+ 214,
+ 100,
+ 168,
+ 217,
+ 124,
+ 98,
+ 95,
+ 186,
+ 124,
+ 206,
+ 153,
+ 102,
+ 114,
+ 97,
+ 231,
+ 186,
+ 204,
+ 32,
+ 68,
+ 136,
+ 161,
+ 0,
+ 214,
+ 146,
+ 251,
+ 193,
+ 229,
+ 246,
+ 181,
+ 200,
+ 14,
+ 28,
+ 84,
+ 185,
+ 231,
+ 146,
+ 40,
+ 190,
+ 233,
+ 176,
+ 213,
+ 26,
+ 47,
+ 132,
+ 122,
+ 34,
+ 35,
+ 22,
+ 217,
+ 144,
+ 81,
+ 223,
+ 162,
+ 131,
+ 203,
+ 9,
+ 153,
+ 172,
+ 210,
+ 2,
+ 191,
+ 140,
+ 67,
+ 206,
+ 66,
+ 168,
+ 184,
+ 227,
+ 80,
+ 191,
+ 20,
+ 118,
+ 156,
+ 144,
+ 35,
+ 154,
+ 98,
+ 0,
+ 184,
+ 175,
+ 216,
+ 199,
+ 40,
+ 84,
+ 247,
+ 165,
+ 189,
+ 51,
+ 68,
+ 58,
+ 37,
+ 202,
+ 78,
+ 59,
+ 210,
+ 230,
+ 95,
+ 54,
+ 116,
+ 23,
+ 179,
+ 132,
+ 221,
+ 117,
+ 160,
+ 230,
+ 185,
+ 112,
+ 66,
+ 253,
+ 156,
+ 216,
+ 145,
+ 246,
+ 8,
+ 65,
+ 14,
+ 11,
+ 241,
+ 168,
+ 247,
+ 142,
+ 146,
+ 206,
+ 0,
+ 187,
+ 117,
+ 75,
+ 105,
+ 104,
+ 10,
+ 171,
+ 5,
+ 122,
+ 202,
+ 65,
+ 146,
+ 81,
+ 122,
+ 119,
+ 206,
+ 70,
+ 66,
+ 91,
+ 26,
+ 40,
+ 179,
+ 205,
+ 24,
+ 172,
+ 182,
+ 55,
+ 168,
+ 55,
+ 16,
+ 235,
+ 199,
+ 216,
+ 14,
+ 69,
+ 250,
+ 182,
+ 70,
+ 230,
+ 96,
+ 103,
+ 131,
+ 136,
+ 49,
+ 50,
+ 99,
+ 149,
+ 52,
+ 248,
+ 6,
+ 150,
+ 136,
+ 187,
+ 73,
+ 30,
+ 140,
+ 186,
+ 104,
+ 216,
+ 142,
+ 213,
+ 67,
+ 240,
+ 99,
+ 25,
+ 204,
+ 38,
+ 74,
+ 63,
+ 180,
+ 91,
+ 70,
+ 61,
+ 248,
+ 41,
+ 184,
+ 183,
+ 55,
+ 136,
+ 0,
+ 131,
+ 210,
+ 111,
+ 2,
+ 137,
+ 177,
+ 53,
+ 166,
+ 98,
+ 49,
+ 185,
+ 66,
+ 87,
+ 156,
+ 178,
+ 78,
+ 249,
+ 213,
+ 170,
+ 77,
+ 253,
+ 101,
+ 140,
+ 3,
+ 171,
+ 54,
+ 90,
+ 82,
+ 47,
+ 223,
+ 139,
+ 160,
+ 158,
+ 47,
+ 240,
+ 87,
+ 21,
+ 208,
+ 33,
+ 7,
+ 116,
+ 169,
+ 62,
+ 240,
+ 227,
+ 193,
+ 168,
+ 88,
+ 179,
+ 212,
+ 103,
+ 63,
+ 88,
+ 239,
+ 158,
+ 205,
+ 72,
+ 166,
+ 189,
+ 4,
+ 126,
+ 225,
+ 77,
+ 94,
+ 250,
+ 4,
+ 50,
+ 138,
+ 123,
+ 130,
+ 157,
+ 229,
+ 209,
+ 193,
+ 217,
+ 158,
+ 109,
+ 188,
+ 2,
+ 25,
+ 221,
+ 163,
+ 190,
+ 10,
+ 101,
+ 198,
+ 59,
+ 222,
+ 17,
+ 4,
+ 133,
+ 138,
+ 231,
+ 236,
+ 6,
+ 83,
+ 34,
+ 201,
+ 10,
+ 142,
+ 51,
+ 69,
+ 170,
+ 226,
+ 161,
+ 125,
+ 103,
+ 140,
+ 108,
+ 112,
+ 222,
+ 87,
+ 224,
+ 55,
+ 36,
+ 44,
+ 17,
+ 47,
+ 176,
+ 153,
+ 61,
+ 143,
+ 101,
+ 210,
+ 116,
+ 8,
+ 87,
+ 71,
+ 47,
+ 161,
+ 138,
+ 72,
+ 202,
+ 240,
+ 167,
+ 223,
+ 92,
+ 32,
+ 68,
+ 111,
+ 156,
+ 92,
+ 174,
+ 94,
+ 216,
+ 205,
+ 208,
+ 168,
+ 164,
+ 223,
+ 254,
+ 17,
+ 35,
+ 117,
+ 208,
+ 142,
+ 197,
+ 197,
+ 12,
+ 10,
+ 63,
+ 188,
+ 234,
+ 111,
+ 164,
+ 199,
+ 59,
+ 230,
+ 14,
+ 174,
+ 174,
+ 13,
+ 59,
+ 24,
+ 129,
+ 63,
+ 215,
+ 2,
+ 210,
+ 126,
+ 176,
+ 56,
+ 73,
+ 208,
+ 130,
+ 248,
+ 140,
+ 107,
+ 69,
+ 180,
+ 255,
+ 82,
+ 62,
+ 92,
+ 153,
+ 6,
+ 124,
+ 243,
+ 31,
+ 67,
+ 113,
+ 100,
+ 13,
+ 189,
+ 211,
+ 223,
+ 188,
+ 75,
+ 160,
+ 217,
+ 55,
+ 178,
+ 188,
+ 232,
+ 80,
+ 66,
+ 255,
+ 197,
+ 187,
+ 157,
+ 166,
+ 158,
+ 239,
+ 114,
+ 165,
+ 165,
+ 86,
+ 10,
+ 239,
+ 223,
+ 58,
+ 93,
+ 248,
+ 18,
+ 110,
+ 85,
+ 95,
+ 32,
+ 170,
+ 27,
+ 216,
+ 170,
+ 4,
+ 118,
+ 98,
+ 0,
+ 212,
+ 248,
+ 57,
+ 128,
+ 119,
+ 185,
+ 170,
+ 166,
+ 185,
+ 68,
+ 231,
+ 212,
+ 197,
+ 8,
+ 239,
+ 65,
+ 130,
+ 236,
+ 61,
+ 217,
+ 224,
+ 17,
+ 178,
+ 142,
+ 145,
+ 138,
+ 127,
+ 218,
+ 184,
+ 106,
+ 158,
+ 173,
+ 230,
+ 43,
+ 139,
+ 222,
+ 100,
+ 59,
+ 44,
+ 234,
+ 98,
+ 205,
+ 68,
+ 152,
+ 202,
+ 205,
+ 37,
+ 152,
+ 15,
+ 217,
+ 165,
+ 254,
+ 142,
+ 95,
+ 179,
+ 115,
+ 77,
+ 225,
+ 34,
+ 162,
+ 69,
+ 123,
+ 197,
+ 197,
+ 40,
+ 117,
+ 94,
+ 150,
+ 57,
+ 245,
+ 228,
+ 229,
+ 139,
+ 168,
+ 47,
+ 61,
+ 232,
+ 37,
+ 173,
+ 90,
+ 218,
+ 246,
+ 94,
+ 23,
+ 175,
+ 79,
+ 253,
+ 125,
+ 144,
+ 87,
+ 148,
+ 111,
+ 188,
+ 186,
+ 220,
+ 31,
+ 68,
+ 29,
+ 206,
+ 203,
+ 83,
+ 210,
+ 5,
+ 12,
+ 222,
+ 56,
+ 33,
+ 128,
+ 35,
+ 122,
+ 4,
+ 112,
+ 6,
+ 107,
+ 30,
+ 242,
+ 174,
+ 185,
+ 249,
+ 177,
+ 247,
+ 110,
+ 56,
+ 8,
+ 17,
+ 215,
+ 18,
+ 56,
+ 29,
+ 80,
+ 1,
+ 63,
+ 208,
+ 104,
+ 54,
+ 173,
+ 83,
+ 156,
+ 165,
+ 224,
+ 213,
+ 71,
+ 90,
+ 164,
+ 234,
+ 142,
+ 4,
+ 212,
+ 67,
+ 54,
+ 170,
+ 237,
+ 75,
+ 232,
+ 41,
+ 23,
+ 238,
+ 3,
+ 176,
+ 109,
+ 144,
+ 187,
+ 111,
+ 222,
+ 172,
+ 16,
+ 210,
+ 216,
+ 131,
+ 238,
+ 141,
+ 90,
+ 180,
+ 28,
+ 192,
+ 47,
+ 80,
+ 48,
+ 69,
+ 111,
+ 56,
+ 158,
+ 86,
+ 41,
+ 73,
+ 56,
+ 122,
+ 28,
+ 242,
+ 214,
+ 127,
+ 146,
+ 55,
+ 82,
+ 166,
+ 234,
+ 27,
+ 27,
+ 62,
+ 12,
+ 250,
+ 134,
+ 153,
+ 67,
+ 35,
+ 32,
+ 9,
+ 80,
+ 73,
+ 50,
+ 191,
+ 54,
+ 241,
+ 11,
+ 74,
+ 57,
+ 56,
+ 189,
+ 67,
+ 136,
+ 168,
+ 92,
+ 215,
+ 114,
+ 194,
+ 238,
+ 61,
+ 20,
+ 85,
+ 186,
+ 86,
+ 246,
+ 110,
+ 190,
+ 61,
+ 110,
+ 203,
+ 162,
+ 60,
+ 230,
+ 120,
+ 54,
+ 225,
+ 108,
+ 76,
+ 108,
+ 177,
+ 141,
+ 123,
+ 158,
+ 20,
+ 40,
+ 155,
+ 238,
+ 51,
+ 230,
+ 12,
+ 182,
+ 206,
+ 40,
+ 250,
+ 45,
+ 214,
+ 180,
+ 7,
+ 81,
+ 44,
+ 200,
+ 19,
+ 97,
+ 37,
+ 1,
+ 132,
+ 37,
+ 161,
+ 211,
+ 83,
+ 67,
+ 117,
+ 166,
+ 212,
+ 58,
+ 17,
+ 12,
+ 159,
+ 76,
+ 186,
+ 197,
+ 140,
+ 61,
+ 188,
+ 7,
+ 52,
+ 72,
+ 145,
+ 86,
+ 181,
+ 201,
+ 167,
+ 16,
+ 28,
+ 233,
+ 220,
+ 74,
+ 111,
+ 46,
+ 183,
+ 109,
+ 149,
+ 22,
+ 106,
+ 100,
+ 119,
+ 188,
+ 52,
+ 38,
+ 53,
+ 13,
+ 28,
+ 92,
+ 13,
+ 36,
+ 77,
+ 60,
+ 108,
+ 29,
+ 126,
+ 239,
+ 145,
+ 254,
+ 103,
+ 147,
+ 116,
+ 105,
+ 170,
+ 84,
+ 132,
+ 158,
+ 224,
+ 203,
+ 207,
+ 208,
+ 112,
+ 170,
+ 254,
+ 56,
+ 160,
+ 156,
+ 147,
+ 230,
+ 165,
+ 147,
+ 24,
+ 152,
+ 145,
+ 11,
+ 212,
+ 195,
+ 85,
+ 74,
+ 92,
+ 19,
+ 185,
+ 100,
+ 210,
+ 79,
+ 16,
+ 147,
+ 42,
+ 102,
+ 118,
+ 154,
+ 126,
+ 15,
+ 250,
+ 113,
+ 5,
+ 222,
+ 167,
+ 0,
+ 12,
+ 136,
+ 110,
+ 107,
+ 82,
+ 11,
+ 126,
+ 33,
+ 154,
+ 103,
+ 94,
+ 226,
+ 85,
+ 227,
+ 89,
+ 182,
+ 126,
+ 56,
+ 212,
+ 176,
+ 114,
+ 165,
+ 211,
+ 69,
+ 60,
+ 227,
+ 146,
+ 250,
+ 126,
+ 233,
+ 173,
+ 172,
+ 63,
+ 150,
+ 239,
+ 186,
+ 10,
+ 128,
+ 48,
+ 176,
+ 38,
+ 162,
+ 163,
+ 113,
+ 31,
+ 164,
+ 227,
+ 196,
+ 228,
+ 249,
+ 178,
+ 15,
+ 118,
+ 21,
+ 145,
+ 238,
+ 101,
+ 185,
+ 184,
+ 239,
+ 251,
+ 144,
+ 34,
+ 249,
+ 125,
+ 0,
+ 2,
+ 0,
+ 163,
+ 122,
+ 156,
+ 204,
+ 179,
+ 252,
+ 218,
+ 254,
+ 251,
+ 24,
+ 29,
+ 213,
+ 120,
+ 210,
+ 206,
+ 238,
+ 97,
+ 23,
+ 227,
+ 172,
+ 233,
+ 247,
+ 140,
+ 149,
+ 233,
+ 84,
+ 224,
+ 68,
+ 123,
+ 72,
+ 132,
+ 105,
+ 69,
+ 135,
+ 10,
+ 167,
+ 217,
+ 17,
+ 131,
+ 119,
+ 3,
+ 142,
+ 9,
+ 11,
+ 101,
+ 238,
+ 229,
+ 70,
+ 189,
+ 85,
+ 241,
+ 54,
+ 5,
+ 241,
+ 72,
+ 48,
+ 61,
+ 109,
+ 243,
+ 91,
+ 81,
+ 83,
+ 246,
+ 5,
+ 71,
+ 253,
+ 130,
+ 199,
+ 149,
+ 58,
+ 9,
+ 37,
+ 27,
+ 166,
+ 241,
+ 37,
+ 0,
+ 99,
+ 14,
+ 73,
+ 78,
+ 47,
+ 93,
+ 151,
+ 57,
+ 121,
+ 38,
+ 156,
+ 112,
+ 49,
+ 210,
+ 252,
+ 123,
+ 47,
+ 95,
+ 47,
+ 148,
+ 245,
+ 56,
+ 6,
+ 8,
+ 83,
+ 255,
+ 29,
+ 111,
+ 35,
+ 197,
+ 55,
+ 112,
+ 185,
+ 148,
+ 138,
+ 203,
+ 133,
+ 92,
+ 27,
+ 1,
+ 49,
+ 99,
+ 173,
+ 163,
+ 141,
+ 235,
+ 84,
+ 46,
+ 174,
+ 238,
+ 114,
+ 80,
+ 103,
+ 23,
+ 198,
+ 146,
+ 245,
+ 126,
+ 114,
+ 132,
+ 155,
+ 220,
+ 43,
+ 49,
+ 84,
+ 224,
+ 183,
+ 162,
+ 218,
+ 63,
+ 27,
+ 217,
+ 25,
+ 215,
+ 125,
+ 22,
+ 100,
+ 34,
+ 140,
+ 90,
+ 189,
+ 132,
+ 154,
+ 69,
+ 153,
+ 194,
+ 178,
+ 13,
+ 162,
+ 190,
+ 55,
+ 134,
+ 216,
+ 76,
+ 137,
+ 209,
+ 4,
+ 72,
+ 65,
+ 190,
+ 202,
+ 11,
+ 0,
+ 196,
+ 66,
+ 39,
+ 50,
+ 192,
+ 106,
+ 138,
+ 242,
+ 109,
+ 71,
+ 124,
+ 128,
+ 85,
+ 242,
+ 126,
+ 45,
+ 203,
+ 110,
+ 250,
+ 177,
+ 137,
+ 178,
+ 40,
+ 86,
+ 5,
+ 28,
+ 38,
+ 148,
+ 39,
+ 148,
+ 201,
+ 48,
+ 169,
+ 140,
+ 42,
+ 111,
+ 156,
+ 236,
+ 222,
+ 205,
+ 125,
+ 92,
+ 87,
+ 208,
+ 122,
+ 165,
+ 63,
+ 147,
+ 39,
+ 106,
+ 215,
+ 12,
+ 103,
+ 226,
+ 100,
+ 33,
+ 72,
+ 90,
+ 146,
+ 97,
+ 39,
+ 8,
+ 245,
+ 56,
+ 71,
+ 194,
+ 219,
+ 8,
+ 240,
+ 101,
+ 187,
+ 215,
+ 58,
+ 192,
+ 151,
+ 210,
+ 110,
+ 169,
+ 0,
+ 121,
+ 191,
+ 223,
+ 187,
+ 134,
+ 248,
+ 207,
+ 38,
+ 245,
+ 223,
+ 217,
+ 66,
+ 27,
+ 137,
+ 125,
+ 61,
+ 197,
+ 174,
+ 20,
+ 69,
+ 3,
+ 247,
+ 248,
+ 205,
+ 155,
+ 23,
+ 156,
+ 6,
+ 65,
+ 151,
+ 82,
+ 114,
+ 117,
+ 182,
+ 244,
+ 118,
+ 12,
+ 234,
+ 209,
+ 250,
+ 41,
+ 83,
+ 184,
+ 84,
+ 59,
+ 105,
+ 75,
+ 108,
+ 151,
+ 5,
+ 57,
+ 242,
+ 55,
+ 63,
+ 45,
+ 73,
+ 168,
+ 163,
+ 233,
+ 238,
+ 19,
+ 97,
+ 180,
+ 202,
+ 33,
+ 3,
+ 167,
+ 204,
+ 52,
+ 180,
+ 41,
+ 119,
+ 93,
+ 196,
+ 42,
+ 74,
+ 144,
+ 138,
+ 49,
+ 99,
+ 42,
+ 76,
+ 24,
+ 16,
+ 31,
+ 162,
+ 55,
+ 149,
+ 67,
+ 199,
+ 157,
+ 89,
+ 67,
+ 247,
+ 221,
+ 90,
+ 56,
+ 201,
+ 208,
+ 54,
+ 107,
+ 199,
+ 89,
+ 232,
+ 242,
+ 139,
+ 182,
+ 246,
+ 183,
+ 59,
+ 241,
+ 37,
+ 87,
+ 38,
+ 202,
+ 239,
+ 164,
+ 53,
+ 220,
+ 78,
+ 127,
+ 156,
+ 216,
+ 149,
+ 220,
+ 220,
+ 55,
+ 34,
+ 66,
+ 206,
+ 53,
+ 188,
+ 90,
+ 191,
+ 160,
+ 176,
+ 128,
+ 200,
+ 99,
+ 135,
+ 50,
+ 185,
+ 198,
+ 234,
+ 0,
+ 199,
+ 234,
+ 195,
+ 84,
+ 50,
+ 29,
+ 80,
+ 174,
+ 234,
+ 78,
+ 46,
+ 142,
+ 138,
+ 0,
+ 106,
+ 84,
+ 57,
+ 142,
+ 218,
+ 198,
+ 116,
+ 214,
+ 246,
+ 225,
+ 197,
+ 15,
+ 228,
+ 84,
+ 34,
+ 72,
+ 169,
+ 161,
+ 143,
+ 155,
+ 202,
+ 46,
+ 211,
+ 129,
+ 82,
+ 87,
+ 121,
+ 206,
+ 213,
+ 123,
+ 119,
+ 120,
+ 235,
+ 181,
+ 168,
+ 129,
+ 228,
+ 237,
+ 199,
+ 207,
+ 24,
+ 145,
+ 127,
+ 141,
+ 35,
+ 179,
+ 77,
+ 66,
+ 247,
+ 91,
+ 2,
+ 252,
+ 111,
+ 231,
+ 18,
+ 40,
+ 48,
+ 9,
+ 187,
+ 244,
+ 176,
+ 212,
+ 231,
+ 153,
+ 143,
+ 110,
+ 243,
+ 203,
+ 102,
+ 189,
+ 177,
+ 146,
+ 205,
+ 71,
+ 254,
+ 100,
+ 23,
+ 41,
+ 4,
+ 243,
+ 122,
+ 108,
+ 242,
+ 58,
+ 193,
+ 86,
+ 116,
+ 108,
+ 130,
+ 182,
+ 173,
+ 56,
+ 235,
+ 132,
+ 217,
+ 15,
+ 159,
+ 192,
+ 152,
+ 178,
+ 205,
+ 76,
+ 151,
+ 171,
+ 125,
+ 8,
+ 130,
+ 115,
+ 204,
+ 173,
+ 74,
+ 54,
+ 14,
+ 223,
+ 110,
+ 21,
+ 203,
+ 190,
+ 250,
+ 192,
+ 233,
+ 138,
+ 223,
+ 213,
+ 225,
+ 126,
+ 111,
+ 45,
+ 254,
+ 113,
+ 175,
+ 19,
+ 72,
+ 14,
+ 233,
+ 206,
+ 197,
+ 58,
+ 190,
+ 104,
+ 250,
+ 252,
+ 129,
+ 31,
+ 171,
+ 41,
+ 158,
+ 227,
+ 118,
+ 15,
+ 93,
+ 222,
+ 159,
+ 110,
+ 199,
+ 87,
+ 122,
+ 193,
+ 139,
+ 115,
+ 27,
+ 59,
+ 110,
+ 38,
+ 180,
+ 206,
+ 184,
+ 64,
+ 0,
+ 47,
+ 237,
+ 135,
+ 124,
+ 183,
+ 206,
+ 93,
+ 95,
+ 102,
+ 157,
+ 205,
+ 28,
+ 240,
+ 28,
+ 251,
+ 109,
+ 88,
+ 164,
+ 62,
+ 168,
+ 113,
+ 248,
+ 156,
+ 10,
+ 82,
+ 13,
+ 227,
+ 117,
+ 154,
+ 231,
+ 225,
+ 255,
+ 251,
+ 214,
+ 49,
+ 192,
+ 228,
+ 116,
+ 38,
+ 109,
+ 75,
+ 138,
+ 136,
+ 190,
+ 247,
+ 39,
+ 24,
+ 97,
+ 89,
+ 95,
+ 32,
+ 120,
+ 56,
+ 196,
+ 98,
+ 173,
+ 97,
+ 104,
+ 103,
+ 236,
+ 25,
+ 213,
+ 143,
+ 37,
+ 120,
+ 80,
+ 143,
+ 137,
+ 17,
+ 92,
+ 79,
+ 254,
+ 91,
+ 125,
+ 249,
+ 151,
+ 119,
+ 32,
+ 114,
+ 190,
+ 232,
+ 56,
+ 97,
+ 87,
+ 231,
+ 7,
+ 123,
+ 39,
+ 138,
+ 244,
+ 193,
+ 8,
+ 239,
+ 176,
+ 228,
+ 171,
+ 188,
+ 125,
+ 36,
+ 165,
+ 7,
+ 206,
+ 187,
+ 44,
+ 162,
+ 247,
+ 196,
+ 14,
+ 52,
+ 34,
+ 117,
+ 122,
+ 135,
+ 107,
+ 33,
+ 46,
+ 63,
+ 44,
+ 234,
+ 8,
+ 196,
+ 26,
+ 161,
+ 199,
+ 33,
+ 101,
+ 169,
+ 242,
+ 70,
+ 21,
+ 199,
+ 167,
+ 0,
+ 68,
+ 190,
+ 206,
+ 138,
+ 161,
+ 135,
+ 67,
+ 73,
+ 128,
+ 253,
+ 80,
+ 194,
+ 118,
+ 203,
+ 197,
+ 248,
+ 230,
+ 231,
+ 57,
+ 33,
+ 144,
+ 199,
+ 64,
+ 5,
+ 44,
+ 241,
+ 27,
+ 34,
+ 65,
+ 31,
+ 92,
+ 113,
+ 119,
+ 147,
+ 73,
+ 216,
+ 7,
+ 199,
+ 236,
+ 70,
+ 211,
+ 254,
+ 86,
+ 162,
+ 40,
+ 63,
+ 63,
+ 33,
+ 96,
+ 111,
+ 223,
+ 105,
+ 115,
+ 48,
+ 216,
+ 81,
+ 142,
+ 215,
+ 127,
+ 165,
+ 78,
+ 33,
+ 109,
+ 185,
+ 5,
+ 218,
+ 152,
+ 161,
+ 166,
+ 1,
+ 123,
+ 43,
+ 239,
+ 238,
+ 238,
+ 227,
+ 239,
+ 80,
+ 156,
+ 175,
+ 206,
+ 120,
+ 78,
+ 21,
+ 210,
+ 177,
+ 155,
+ 18,
+ 178,
+ 181,
+ 250,
+ 75,
+ 31,
+ 84,
+ 35,
+ 110,
+ 108,
+ 194,
+ 156,
+ 192,
+ 9,
+ 214,
+ 24,
+ 140,
+ 82,
+ 120,
+ 168,
+ 220,
+ 149,
+ 153,
+ 254,
+ 128,
+ 12,
+ 65,
+ 55,
+ 100,
+ 224,
+ 79,
+ 38,
+ 189,
+ 39,
+ 59,
+ 190,
+ 83,
+ 129,
+ 73,
+ 23,
+ 113,
+ 86,
+ 114,
+ 67,
+ 109,
+ 26,
+ 102,
+ 173,
+ 221,
+ 153,
+ 29,
+ 103,
+ 188,
+ 24,
+ 64,
+ 208,
+ 168,
+ 114,
+ 106,
+ 99,
+ 51,
+ 168,
+ 189,
+ 231,
+ 211,
+ 84,
+ 55,
+ 107,
+ 234,
+ 57,
+ 14,
+ 132,
+ 230,
+ 118,
+ 232,
+ 97,
+ 134,
+ 9,
+ 230,
+ 22,
+ 16,
+ 39,
+ 134,
+ 162,
+ 104,
+ 200,
+ 180,
+ 198,
+ 235,
+ 239,
+ 52,
+ 193,
+ 61,
+ 178,
+ 217,
+ 99,
+ 231,
+ 162,
+ 41,
+ 98,
+ 142,
+ 37,
+ 58,
+ 95,
+ 252,
+ 158,
+ 187,
+ 16,
+ 205,
+ 92,
+ 82,
+ 224,
+ 220,
+ 234,
+ 100,
+ 26,
+ 186,
+ 216,
+ 11,
+ 248,
+ 100,
+ 79,
+ 159,
+ 99,
+ 51,
+ 233,
+ 252,
+ 223,
+ 3,
+ 16,
+ 26,
+ 69,
+ 229,
+ 196,
+ 78,
+ 191,
+ 180,
+ 158,
+ 93,
+ 41,
+ 27,
+ 122,
+ 166,
+ 156,
+ 21,
+ 182,
+ 165,
+ 200,
+ 72,
+ 196,
+ 146,
+ 161,
+ 203,
+ 181,
+ 55,
+ 211,
+ 43,
+ 57,
+ 104,
+ 144,
+ 110,
+ 172,
+ 198,
+ 77,
+ 52,
+ 82,
+ 166,
+ 13,
+ 41,
+ 189,
+ 219,
+ 200,
+ 118,
+ 102,
+ 100,
+ 157,
+ 156,
+ 92,
+ 236,
+ 208,
+ 185,
+ 70,
+ 31,
+ 137,
+ 226,
+ 153,
+ 151,
+ 8,
+ 208,
+ 98,
+ 202,
+ 215,
+ 131,
+ 107,
+ 126,
+ 234,
+ 87,
+ 15,
+ 90,
+ 160,
+ 89,
+ 45,
+ 47,
+ 156,
+ 135,
+ 39,
+ 176,
+ 244,
+ 97,
+ 142,
+ 90,
+ 182,
+ 169,
+ 232,
+ 233,
+ 202,
+ 251,
+ 89,
+ 7,
+ 117,
+ 150,
+ 232,
+ 101,
+ 100,
+ 220,
+ 47,
+ 139,
+ 18,
+ 15,
+ 16,
+ 166,
+ 218,
+ 81,
+ 222,
+ 242,
+ 84,
+ 105,
+ 163,
+ 79,
+ 25,
+ 143,
+ 155,
+ 209,
+ 146,
+ 135,
+ 34,
+ 126,
+ 65,
+ 46,
+ 194,
+ 14,
+ 115,
+ 220,
+ 101,
+ 157,
+ 26,
+ 95,
+ 44,
+ 40,
+ 36,
+ 84,
+ 21,
+ 86,
+ 157,
+ 77,
+ 90,
+ 102,
+ 157,
+ 235,
+ 232,
+ 163,
+ 8,
+ 231,
+ 147,
+ 197,
+ 235,
+ 232,
+ 92,
+ 190,
+ 173,
+ 231,
+ 50,
+ 121,
+ 195,
+ 224,
+ 121,
+ 85,
+ 162,
+ 111,
+ 182,
+ 134,
+ 26,
+ 44,
+ 224,
+ 50,
+ 248,
+ 141,
+ 201,
+ 122,
+ 142,
+ 34,
+ 239,
+ 230,
+ 51,
+ 102,
+ 130,
+ 10,
+ 30,
+ 34,
+ 228,
+ 118,
+ 253,
+ 2,
+ 251,
+ 218,
+ 243,
+ 91,
+ 119,
+ 101,
+ 88,
+ 93,
+ 122,
+ 20,
+ 17,
+ 87,
+ 43,
+ 20,
+ 95,
+ 134,
+ 150,
+ 201,
+ 219,
+ 151,
+ 14,
+ 117,
+ 246,
+ 33,
+ 6,
+ 42,
+ 111,
+ 55,
+ 86,
+ 25,
+ 144,
+ 119,
+ 144,
+ 79,
+ 91,
+ 132,
+ 191,
+ 78,
+ 59,
+ 89,
+ 255,
+ 45,
+ 175,
+ 61,
+ 134,
+ 214,
+ 17,
+ 31,
+ 7,
+ 200,
+ 164,
+ 208,
+ 57,
+ 166,
+ 90,
+ 188,
+ 174,
+ 116,
+ 122,
+ 71,
+ 202,
+ 100,
+ 68,
+ 191,
+ 164,
+ 181,
+ 40,
+ 207,
+ 202,
+ 232,
+ 11,
+ 255,
+ 4,
+ 66,
+ 20,
+ 168,
+ 226,
+ 170,
+ 152,
+ 12,
+ 173,
+ 239,
+ 216,
+ 23,
+ 163,
+ 147,
+ 39,
+ 132,
+ 15,
+ 252,
+ 2,
+ 129,
+ 247,
+ 107,
+ 168,
+ 158,
+ 87,
+ 7,
+ 17,
+ 55,
+ 137,
+ 149,
+ 191,
+ 106,
+ 134,
+ 21,
+ 228,
+ 78,
+ 19,
+ 142,
+ 190,
+ 106,
+ 204,
+ 31,
+ 39,
+ 59,
+ 213,
+ 182,
+ 148,
+ 185,
+ 165,
+ 193,
+ 119,
+ 237,
+ 38,
+ 187,
+ 74,
+ 54,
+ 177,
+ 198,
+ 222,
+ 204,
+ 126,
+ 79,
+ 72,
+ 16,
+ 22,
+ 54,
+ 149,
+ 178,
+ 252,
+ 104,
+ 42,
+ 63,
+ 160,
+ 60,
+ 93,
+ 50,
+ 78,
+ 229,
+ 77,
+ 160,
+ 122,
+ 72,
+ 209,
+ 48,
+ 88,
+ 81,
+ 8,
+ 53,
+ 38,
+ 41,
+ 24,
+ 47,
+ 174,
+ 213,
+ 116,
+ 117,
+ 230,
+ 178,
+ 106,
+ 99,
+ 169,
+ 7,
+ 78,
+ 178,
+ 179,
+ 39,
+ 20,
+ 43,
+ 33,
+ 75,
+ 158,
+ 107,
+ 82,
+ 101,
+ 10,
+ 152,
+ 181,
+ 210,
+ 74,
+ 138,
+ 248,
+ 167,
+ 105,
+ 185,
+ 223,
+ 13,
+ 35,
+ 198,
+ 171,
+ 23,
+ 212,
+ 29,
+ 238,
+ 158,
+ 69,
+ 210,
+ 225,
+ 87,
+ 129,
+ 255,
+ 153,
+ 60,
+ 37,
+ 223,
+ 193,
+ 199,
+ 142,
+ 46,
+ 0,
+ 140,
+ 92,
+ 124,
+ 92,
+ 238,
+ 196,
+ 168,
+ 98,
+ 27,
+ 34,
+ 78,
+ 23,
+ 106,
+ 15,
+ 196,
+ 75,
+ 144,
+ 199,
+ 94,
+ 9,
+ 244,
+ 82,
+ 103,
+ 253,
+ 56,
+ 100,
+ 83,
+ 215,
+ 138,
+ 35,
+ 139,
+ 93,
+ 29,
+ 68,
+ 195,
+ 102,
+ 60,
+ 186,
+ 168,
+ 68,
+ 95,
+ 146,
+ 49,
+ 54,
+ 136,
+ 161,
+ 49,
+ 44,
+ 156,
+ 44,
+ 196,
+ 6,
+ 134,
+ 2,
+ 134,
+ 199,
+ 121,
+ 58,
+ 187,
+ 127,
+ 226,
+ 209,
+ 61,
+ 181,
+ 119,
+ 87,
+ 118,
+ 43,
+ 60,
+ 249,
+ 123,
+ 175,
+ 139,
+ 34,
+ 230,
+ 32,
+ 30,
+ 98,
+ 162,
+ 8,
+ 230,
+ 102,
+ 79,
+ 47,
+ 16,
+ 146,
+ 153,
+ 73,
+ 43,
+ 162,
+ 110,
+ 243,
+ 31,
+ 186,
+ 18,
+ 214,
+ 123,
+ 246,
+ 70,
+ 239,
+ 82,
+ 97,
+ 212,
+ 229,
+ 90,
+ 232,
+ 225,
+ 69,
+ 180,
+ 143,
+ 62,
+ 109,
+ 170,
+ 59,
+ 64,
+ 212,
+ 255,
+ 155,
+ 123,
+ 74,
+ 1,
+ 0,
+ 37,
+ 149,
+ 187,
+ 246,
+ 7,
+ 24,
+ 103,
+ 67,
+ 234,
+ 46,
+ 118,
+ 85,
+ 243,
+ 24,
+ 219,
+ 79,
+ 182,
+ 51,
+ 212,
+ 200,
+ 211,
+ 183,
+ 137,
+ 99,
+ 156,
+ 193,
+ 43,
+ 210,
+ 4,
+ 58,
+ 142,
+ 126,
+ 36,
+ 60,
+ 102,
+ 59,
+ 152,
+ 203,
+ 135,
+ 189,
+ 42,
+ 41,
+ 146,
+ 124,
+ 20,
+ 64,
+ 205,
+ 118,
+ 232,
+ 202,
+ 181,
+ 91,
+ 171,
+ 113,
+ 20,
+ 158,
+ 26,
+ 201,
+ 192,
+ 87,
+ 187,
+ 82,
+ 128,
+ 42,
+ 247,
+ 220,
+ 84,
+ 235,
+ 6,
+ 59,
+ 54,
+ 7,
+ 156,
+ 205,
+ 104,
+ 182,
+ 137,
+ 87,
+ 204,
+ 91,
+ 250,
+ 179,
+ 206,
+ 17,
+ 100,
+ 118,
+ 74,
+ 255,
+ 17,
+ 77,
+ 177,
+ 215,
+ 31,
+ 155,
+ 197,
+ 181,
+ 58,
+ 250,
+ 255,
+ 40,
+ 39,
+ 78,
+ 131,
+ 59,
+ 27,
+ 117,
+ 42,
+ 76,
+ 153,
+ 169,
+ 52,
+ 103,
+ 60,
+ 4,
+ 255,
+ 246,
+ 50,
+ 254,
+ 181,
+ 125,
+ 71,
+ 93,
+ 3,
+ 180,
+ 209,
+ 90,
+ 250,
+ 198,
+ 116,
+ 235,
+ 113,
+ 184,
+ 16,
+ 177,
+ 86,
+ 130,
+ 189,
+ 243,
+ 58,
+ 227,
+ 175,
+ 196,
+ 20,
+ 243,
+ 6,
+ 185,
+ 171,
+ 23,
+ 88,
+ 40,
+ 33,
+ 200,
+ 224,
+ 71,
+ 88,
+ 54,
+ 74,
+ 65,
+ 89,
+ 219,
+ 7,
+ 214,
+ 34,
+ 137,
+ 171,
+ 132,
+ 227,
+ 213,
+ 17,
+ 44,
+ 46,
+ 91,
+ 207,
+ 68,
+ 64,
+ 152,
+ 63,
+ 144,
+ 10,
+ 79,
+ 79,
+ 111,
+ 226,
+ 59,
+ 17,
+ 69,
+ 95,
+ 136,
+ 203,
+ 184,
+ 93,
+ 56,
+ 140,
+ 165,
+ 5,
+ 246,
+ 173,
+ 238,
+ 141,
+ 124,
+ 169,
+ 26,
+ 53,
+ 57,
+ 237,
+ 201,
+ 25,
+ 190,
+ 63,
+ 125,
+ 71,
+ 127,
+ 149,
+ 199,
+ 53,
+ 157,
+ 71,
+ 168,
+ 222,
+ 212,
+ 23,
+ 222,
+ 234,
+ 228,
+ 156,
+ 141,
+ 130,
+ 13,
+ 247,
+ 47,
+ 66,
+ 76,
+ 38,
+ 102,
+ 197,
+ 137,
+ 243,
+ 85,
+ 158,
+ 128,
+ 168,
+ 30,
+ 138,
+ 182,
+ 30,
+ 213,
+ 163,
+ 97,
+ 96,
+ 57,
+ 203,
+ 210,
+ 140,
+ 71,
+ 232,
+ 114,
+ 155,
+ 177,
+ 116,
+ 224,
+ 97,
+ 12,
+ 181,
+ 140,
+ 131,
+ 184,
+ 186,
+ 59,
+ 42,
+ 168,
+ 43,
+ 96,
+ 17,
+ 10,
+ 130,
+ 37,
+ 68,
+ 98,
+ 36,
+ 82,
+ 120,
+ 142,
+ 96,
+ 143,
+ 132,
+ 152,
+ 211,
+ 210,
+ 238,
+ 26,
+ 141,
+ 207,
+ 170,
+ 0,
+ 246,
+ 248,
+ 78,
+ 251,
+ 161,
+ 168,
+ 114,
+ 27,
+ 126,
+ 194,
+ 134,
+ 44,
+ 213,
+ 141,
+ 203,
+ 27,
+ 253,
+ 201,
+ 98,
+ 56,
+ 57,
+ 131,
+ 76,
+ 122,
+ 245,
+ 103,
+ 176,
+ 160,
+ 208,
+ 215,
+ 81,
+ 0,
+ 255,
+ 136,
+ 121,
+ 101,
+ 50,
+ 12,
+ 149,
+ 192,
+ 60,
+ 23,
+ 20,
+ 219,
+ 248,
+ 18,
+ 148,
+ 90,
+ 61,
+ 217,
+ 70,
+ 130,
+ 139,
+ 23,
+ 200,
+ 126,
+ 169,
+ 89,
+ 238,
+ 11,
+ 182,
+ 36,
+ 73,
+ 231,
+ 47,
+ 110,
+ 126,
+ 189,
+ 231,
+ 104,
+ 209,
+ 107,
+ 201,
+ 39,
+ 226,
+ 200,
+ 246,
+ 104,
+ 184,
+ 231,
+ 61,
+ 157,
+ 54,
+ 223,
+ 242,
+ 50,
+ 179,
+ 221,
+ 29,
+ 147,
+ 247,
+ 176,
+ 240,
+ 175,
+ 137,
+ 59,
+ 88,
+ 167,
+ 217,
+ 159,
+ 33,
+ 175,
+ 48,
+ 124,
+ 161,
+ 177,
+ 237,
+ 250,
+ 189,
+ 51,
+ 226,
+ 22,
+ 213,
+ 96,
+ 33,
+ 188,
+ 90,
+ 246,
+ 164,
+ 207,
+ 90,
+ 16,
+ 190,
+ 37,
+ 58,
+ 53,
+ 84,
+ 0,
+ 159,
+ 245,
+ 98,
+ 209,
+ 255,
+ 75,
+ 134,
+ 50,
+ 41,
+ 253,
+ 215,
+ 16,
+ 27,
+ 206,
+ 155,
+ 187,
+ 182,
+ 16,
+ 196,
+ 19,
+ 2,
+ 94,
+ 50,
+ 52,
+ 140,
+ 251,
+ 204,
+ 197,
+ 160,
+ 137,
+ 218,
+ 210,
+ 191,
+ 109,
+ 93,
+ 64,
+ 244,
+ 186,
+ 44,
+ 211,
+ 222,
+ 235,
+ 22,
+ 40,
+ 158,
+ 238,
+ 197,
+ 113,
+ 242,
+ 151,
+ 60,
+ 79,
+ 105,
+ 235,
+ 87,
+ 217,
+ 168,
+ 96,
+ 248,
+ 7,
+ 146,
+ 39,
+ 241,
+ 153,
+ 9,
+ 101,
+ 144,
+ 31,
+ 179,
+ 118,
+ 103,
+ 234,
+ 164,
+ 157,
+ 43,
+ 41,
+ 188,
+ 236,
+ 13,
+ 166,
+ 242,
+ 132,
+ 203,
+ 6,
+ 93,
+ 118,
+ 111,
+ 23,
+ 181,
+ 73,
+ 23,
+ 39,
+ 210,
+ 234,
+ 164,
+ 161,
+ 111,
+ 84,
+ 12,
+ 242,
+ 90,
+ 236,
+ 103,
+ 100,
+ 127,
+ 144,
+ 240,
+ 121,
+ 59,
+ 213,
+ 193,
+ 159,
+ 242,
+ 225,
+ 187,
+ 72,
+ 183,
+ 165,
+ 137,
+ 48,
+ 213,
+ 167,
+ 72,
+ 178,
+ 132,
+ 104,
+ 213,
+ 61,
+ 149,
+ 173,
+ 138,
+ 201,
+ 65,
+ 44,
+ 180,
+ 83,
+ 77,
+ 222,
+ 76,
+ 209,
+ 24,
+ 140,
+ 88,
+ 134,
+ 240,
+ 16,
+ 170,
+ 207,
+ 37,
+ 185,
+ 157,
+ 108,
+ 200,
+ 141,
+ 202,
+ 148,
+ 146,
+ 202,
+ 125,
+ 86,
+ 102,
+ 226,
+ 45,
+ 29,
+ 103,
+ 175,
+ 27,
+ 43,
+ 178,
+ 81,
+ 189,
+ 18,
+ 58,
+ 185,
+ 200,
+ 115,
+ 35,
+ 243,
+ 178,
+ 102,
+ 105,
+ 2,
+ 171,
+ 67,
+ 231,
+ 52,
+ 211,
+ 28,
+ 202,
+ 235,
+ 126,
+ 125,
+ 121,
+ 121,
+ 34,
+ 77,
+ 96,
+ 84,
+ 61,
+ 233,
+ 183,
+ 209,
+ 56,
+ 126,
+ 116,
+ 195,
+ 81,
+ 240,
+ 250,
+ 170,
+ 149,
+ 15,
+ 15,
+ 22,
+ 231,
+ 62,
+ 117,
+ 145,
+ 147,
+ 143,
+ 185,
+ 167,
+ 251,
+ 46,
+ 199,
+ 1,
+ 48,
+ 107,
+ 194,
+ 175,
+ 157,
+ 179,
+ 208,
+ 70,
+ 133,
+ 252,
+ 141,
+ 93,
+ 184,
+ 115,
+ 240,
+ 240,
+ 118,
+ 213,
+ 199,
+ 66,
+ 91,
+ 220,
+ 155,
+ 120,
+ 217,
+ 98,
+ 247,
+ 218,
+ 162,
+ 180,
+ 61,
+ 39,
+ 220,
+ 148,
+ 5,
+ 249,
+ 251,
+ 88,
+ 132,
+ 129,
+ 176,
+ 9,
+ 44,
+ 69,
+ 114,
+ 46,
+ 79,
+ 35,
+ 213,
+ 157,
+ 236,
+ 141,
+ 213,
+ 29,
+ 144,
+ 77,
+ 4,
+ 254,
+ 185,
+ 66,
+ 50,
+ 59,
+ 142,
+ 247,
+ 187,
+ 220,
+ 63,
+ 146,
+ 102,
+ 12,
+ 200,
+ 0,
+ 35,
+ 210,
+ 209,
+ 57,
+ 115,
+ 88,
+ 232,
+ 151,
+ 222,
+ 95,
+ 227,
+ 59,
+ 88,
+ 97,
+ 164,
+ 123,
+ 19,
+ 52,
+ 163,
+ 178,
+ 120,
+ 149,
+ 125,
+ 196,
+ 121,
+ 104,
+ 158,
+ 188,
+ 238,
+ 243,
+ 123,
+ 160,
+ 209,
+ 39,
+ 46,
+ 194,
+ 180,
+ 74,
+ 66,
+ 132,
+ 65,
+ 87,
+ 251,
+ 221,
+ 108,
+ 211,
+ 162,
+ 7,
+ 36,
+ 95,
+ 181,
+ 15,
+ 245,
+ 9,
+ 154,
+ 67,
+ 116,
+ 40,
+ 162,
+ 248,
+ 239,
+ 146,
+ 227,
+ 179,
+ 192,
+ 99,
+ 134,
+ 135,
+ 31,
+ 215,
+ 77,
+ 177,
+ 232,
+ 180,
+ 225,
+ 78,
+ 170,
+ 176,
+ 130,
+ 72,
+ 248,
+ 191,
+ 183,
+ 207,
+ 84,
+ 205,
+ 110,
+ 70,
+ 23,
+ 45,
+ 222,
+ 95,
+ 8,
+ 133,
+ 121,
+ 82,
+ 184,
+ 93,
+ 243,
+ 86,
+ 206,
+ 189,
+ 144,
+ 55,
+ 143,
+ 169,
+ 144,
+ 137,
+ 46,
+ 63,
+ 76,
+ 73,
+ 129,
+ 111,
+ 185,
+ 246,
+ 227,
+ 192,
+ 66,
+ 244,
+ 247,
+ 211,
+ 60,
+ 134,
+ 47,
+ 72,
+ 235,
+ 84,
+ 128,
+ 117,
+ 218,
+ 56,
+ 157,
+ 48,
+ 210,
+ 106,
+ 238,
+ 111,
+ 198,
+ 95,
+ 197,
+ 169,
+ 148,
+ 209,
+ 140,
+ 98,
+ 160,
+ 164,
+ 117,
+ 55,
+ 14,
+ 131,
+ 226,
+ 180,
+ 196,
+ 174,
+ 178,
+ 251,
+ 81,
+ 210,
+ 33,
+ 116,
+ 112,
+ 213,
+ 246,
+ 39,
+ 229,
+ 115,
+ 164,
+ 28,
+ 58,
+ 116,
+ 56,
+ 82,
+ 141,
+ 133,
+ 159,
+ 55,
+ 18,
+ 94,
+ 32,
+ 132,
+ 219,
+ 101,
+ 73,
+ 233,
+ 105,
+ 165,
+ 179,
+ 57,
+ 168,
+ 135,
+ 2,
+ 108,
+ 28,
+ 124,
+ 68,
+ 102,
+ 242,
+ 34,
+ 184,
+ 219,
+ 87,
+ 180,
+ 26,
+ 243,
+ 24,
+ 132,
+ 193,
+ 74,
+ 210,
+ 172,
+ 184,
+ 104,
+ 196,
+ 139,
+ 76,
+ 29,
+ 31,
+ 132,
+ 69,
+ 126,
+ 3,
+ 6,
+ 132,
+ 244,
+ 199,
+ 194,
+ 115,
+ 163,
+ 126,
+ 162,
+ 212,
+ 60,
+ 42,
+ 100,
+ 221,
+ 41,
+ 29,
+ 70,
+ 125,
+ 29,
+ 230,
+ 13,
+ 8,
+ 172,
+ 238,
+ 164,
+ 87,
+ 112,
+ 36,
+ 57,
+ 152,
+ 33,
+ 3,
+ 7,
+ 82,
+ 135,
+ 213,
+ 38,
+ 102,
+ 123,
+ 81,
+ 52,
+ 99,
+ 116,
+ 19,
+ 75,
+ 30,
+ 32,
+ 163,
+ 76,
+ 78,
+ 247,
+ 1,
+ 160,
+ 171,
+ 169,
+ 179,
+ 246,
+ 225,
+ 187,
+ 237,
+ 245,
+ 75,
+ 118,
+ 1,
+ 74,
+ 243,
+ 193,
+ 230,
+ 106,
+ 8,
+ 226,
+ 218,
+ 210,
+ 133,
+ 182,
+ 82,
+ 191,
+ 113,
+ 202,
+ 216,
+ 91,
+ 29,
+ 246,
+ 142,
+ 118,
+ 141,
+ 40,
+ 120,
+ 9,
+ 136,
+ 72,
+ 231,
+ 9,
+ 18,
+ 1,
+ 99,
+ 36,
+ 172,
+ 252,
+ 150,
+ 117,
+ 252,
+ 71,
+ 124,
+ 176,
+ 25,
+ 127,
+ 141,
+ 28,
+ 243,
+ 13,
+ 70,
+ 54,
+ 253,
+ 100,
+ 170,
+ 45,
+ 25,
+ 57,
+ 220,
+ 143,
+ 241,
+ 248,
+ 68,
+ 116,
+ 121,
+ 250,
+ 143,
+ 55,
+ 179,
+ 222,
+ 63,
+ 242,
+ 29,
+ 151,
+ 124,
+ 168,
+ 35,
+ 171,
+ 140,
+ 42,
+ 61,
+ 238,
+ 248,
+ 181,
+ 217,
+ 10,
+ 73,
+ 14,
+ 164,
+ 134,
+ 147,
+ 233,
+ 233,
+ 238,
+ 102,
+ 248,
+ 37,
+ 103,
+ 190,
+ 61,
+ 134,
+ 2,
+ 61,
+ 210,
+ 129,
+ 24,
+ 222,
+ 158,
+ 206,
+ 192,
+ 194,
+ 164,
+ 174,
+ 45,
+ 27,
+ 48,
+ 85,
+ 196,
+ 175,
+ 32,
+ 66,
+ 101,
+ 159,
+ 129,
+ 181,
+ 240,
+ 194,
+ 31,
+ 15,
+ 198,
+ 72,
+ 247,
+ 222,
+ 174,
+ 226,
+ 162,
+ 79,
+ 86,
+ 116,
+ 142,
+ 213,
+ 208,
+ 229,
+ 26,
+ 125,
+ 200,
+ 170,
+ 67,
+ 97,
+ 125,
+ 232,
+ 225,
+ 27,
+ 154,
+ 154,
+ 105,
+ 208,
+ 231,
+ 126,
+ 130,
+ 50,
+ 159,
+ 228,
+ 238,
+ 244,
+ 214,
+ 199,
+ 36,
+ 179,
+ 109,
+ 164,
+ 14,
+ 136,
+ 189,
+ 78,
+ 236,
+ 130,
+ 8,
+ 245,
+ 90,
+ 49,
+ 203,
+ 64,
+ 147,
+ 126,
+ 18,
+ 198,
+ 190,
+ 126,
+ 150,
+ 149,
+ 231,
+ 29,
+ 149,
+ 249,
+ 86,
+ 4,
+ 23,
+ 62,
+ 235,
+ 174,
+ 81,
+ 101,
+ 227,
+ 233,
+ 225,
+ 142,
+ 49,
+ 47,
+ 108,
+ 99,
+ 163,
+ 90,
+ 223,
+ 205,
+ 175,
+ 110,
+ 128,
+ 158,
+ 48,
+ 142,
+ 145,
+ 145,
+ 229,
+ 229,
+ 137,
+ 30,
+ 100,
+ 231,
+ 171,
+ 171,
+ 28,
+ 244,
+ 28,
+ 204,
+ 72,
+ 190,
+ 37,
+ 123,
+ 115,
+ 239,
+ 248,
+ 55,
+ 196,
+ 243,
+ 154,
+ 45,
+ 251,
+ 139,
+ 150,
+ 251,
+ 83,
+ 47,
+ 235,
+ 96,
+ 50,
+ 171,
+ 164,
+ 225,
+ 122,
+ 78,
+ 38,
+ 229,
+ 168,
+ 189,
+ 56,
+ 20,
+ 132,
+ 208,
+ 143,
+ 118,
+ 226,
+ 144,
+ 53,
+ 42,
+ 239,
+ 97,
+ 177,
+ 254,
+ 152,
+ 227,
+ 76,
+ 241,
+ 74,
+ 165,
+ 60,
+ 133,
+ 198,
+ 73,
+ 148,
+ 24,
+ 29,
+ 10,
+ 38,
+ 37,
+ 191,
+ 156,
+ 140,
+ 134,
+ 157,
+ 210,
+ 230,
+ 173,
+ 200,
+ 55,
+ 142,
+ 50,
+ 118,
+ 74,
+ 88,
+ 127,
+ 127,
+ 212,
+ 183,
+ 75,
+ 126,
+ 32,
+ 28,
+ 202,
+ 137,
+ 111,
+ 240,
+ 197,
+ 197,
+ 77,
+ 202,
+ 43,
+ 155,
+ 228,
+ 139,
+ 3,
+ 66,
+ 236,
+ 8,
+ 212,
+ 24,
+ 9,
+ 77,
+ 197,
+ 75,
+ 16,
+ 68,
+ 242,
+ 244,
+ 188,
+ 214,
+ 96,
+ 77,
+ 147,
+ 145,
+ 120,
+ 31,
+ 83,
+ 162,
+ 82,
+ 213,
+ 111,
+ 14,
+ 182,
+ 144,
+ 111,
+ 1,
+ 90,
+ 233,
+ 64,
+ 41,
+ 189,
+ 88,
+ 81,
+ 69,
+ 65,
+ 90,
+ 93,
+ 54,
+ 121,
+ 119,
+ 175,
+ 208,
+ 148,
+ 231,
+ 225,
+ 52,
+ 120,
+ 127,
+ 89,
+ 179,
+ 213,
+ 146,
+ 250,
+ 14,
+ 1,
+ 162,
+ 181,
+ 251,
+ 78,
+ 45,
+ 255,
+ 62,
+ 65,
+ 76,
+ 103,
+ 119,
+ 99,
+ 14,
+ 208,
+ 25,
+ 128,
+ 169,
+ 176,
+ 145,
+ 69,
+ 243,
+ 37,
+ 138,
+ 13,
+ 3,
+ 31,
+ 248,
+ 246,
+ 90,
+ 119,
+ 48,
+ 252,
+ 65,
+ 19,
+ 63,
+ 198,
+ 146,
+ 68,
+ 157,
+ 14,
+ 96,
+ 152,
+ 89,
+ 29,
+ 54,
+ 179,
+ 124,
+ 212,
+ 187,
+ 133,
+ 153,
+ 69,
+ 240,
+ 207,
+ 83,
+ 177,
+ 110,
+ 228,
+ 200,
+ 35,
+ 33,
+ 44,
+ 244,
+ 245,
+ 146,
+ 242,
+ 80,
+ 183,
+ 59,
+ 227,
+ 40,
+ 106,
+ 160,
+ 34,
+ 218,
+ 56,
+ 33,
+ 108,
+ 218,
+ 238,
+ 231,
+ 196,
+ 18,
+ 169,
+ 236,
+ 115,
+ 241,
+ 177,
+ 173,
+ 207,
+ 52,
+ 84,
+ 234,
+ 228,
+ 135,
+ 140,
+ 75,
+ 179,
+ 214,
+ 32,
+ 10,
+ 76,
+ 57,
+ 17,
+ 63,
+ 206,
+ 173,
+ 28,
+ 27,
+ 31,
+ 133,
+ 53,
+ 27,
+ 205,
+ 90,
+ 253,
+ 72,
+ 111,
+ 108,
+ 201,
+ 180,
+ 81,
+ 112,
+ 148,
+ 226,
+ 41,
+ 48,
+ 19,
+ 234,
+ 242,
+ 19,
+ 101,
+ 211,
+ 201,
+ 55,
+ 239,
+ 215,
+ 86,
+ 101,
+ 167,
+ 231,
+ 85,
+ 115,
+ 62,
+ 91,
+ 52,
+ 70,
+ 73,
+ 136,
+ 9,
+ 228,
+ 3,
+ 60,
+ 226,
+ 91,
+ 113,
+ 211,
+ 10,
+ 252,
+ 204,
+ 67,
+ 106,
+ 231,
+ 12,
+ 191,
+ 136,
+ 178,
+ 183,
+ 21,
+ 140,
+ 97,
+ 155,
+ 124,
+ 124,
+ 46,
+ 177,
+ 116,
+ 183,
+ 43,
+ 189,
+ 210,
+ 19,
+ 75,
+ 126,
+ 36,
+ 106,
+ 122,
+ 65,
+ 8,
+ 163,
+ 227,
+ 232,
+ 168,
+ 188,
+ 183,
+ 250,
+ 237,
+ 57,
+ 225,
+ 211,
+ 49,
+ 241,
+ 97,
+ 152,
+ 71,
+ 7,
+ 1,
+ 126,
+ 117,
+ 216,
+ 191,
+ 14,
+ 240,
+ 43,
+ 169,
+ 221,
+ 22,
+ 209,
+ 238,
+ 67,
+ 24,
+ 234,
+ 43,
+ 246,
+ 215,
+ 173,
+ 19,
+ 224,
+ 78,
+ 56,
+ 236,
+ 69,
+ 151,
+ 161,
+ 88,
+ 130,
+ 107,
+ 33,
+ 122,
+ 175,
+ 190,
+ 47,
+ 56,
+ 90,
+ 74,
+ 163,
+ 244,
+ 197,
+ 21,
+ 162,
+ 239,
+ 213,
+ 1,
+ 212,
+ 44,
+ 113,
+ 119,
+ 253,
+ 133,
+ 133,
+ 206,
+ 224,
+ 228,
+ 35,
+ 48,
+ 0,
+ 142,
+ 47,
+ 104,
+ 216,
+ 21,
+ 171,
+ 249,
+ 227,
+ 60,
+ 186,
+ 210,
+ 31,
+ 86,
+ 151,
+ 194,
+ 63,
+ 109,
+ 133,
+ 151,
+ 72,
+ 16,
+ 207,
+ 92,
+ 61,
+ 39,
+ 90,
+ 8,
+ 140,
+ 6,
+ 218,
+ 103,
+ 8,
+ 149,
+ 137,
+ 159,
+ 31,
+ 235,
+ 75,
+ 122,
+ 209,
+ 2,
+ 136,
+ 159,
+ 83,
+ 230,
+ 128,
+ 140,
+ 130,
+ 46,
+ 129,
+ 178,
+ 67,
+ 150,
+ 131,
+ 214,
+ 246,
+ 255,
+ 26,
+ 242,
+ 140,
+ 3,
+ 148,
+ 142,
+ 211,
+ 62,
+ 233,
+ 44,
+ 127,
+ 143,
+ 26,
+ 149,
+ 39,
+ 62,
+ 153,
+ 70,
+ 173,
+ 192,
+ 130,
+ 77,
+ 190,
+ 79,
+ 242,
+ 245,
+ 77,
+ 70,
+ 247,
+ 106,
+ 192,
+ 220,
+ 3,
+ 154,
+ 124,
+ 40,
+ 185,
+ 208,
+ 219,
+ 20,
+ 182,
+ 5,
+ 130,
+ 174,
+ 203,
+ 97,
+ 138,
+ 110,
+ 198,
+ 127,
+ 20,
+ 55,
+ 223,
+ 62,
+ 92,
+ 22,
+ 15,
+ 94,
+ 239,
+ 154,
+ 72,
+ 21,
+ 104,
+ 151,
+ 197,
+ 75,
+ 120,
+ 155,
+ 112,
+ 186,
+ 117,
+ 76,
+ 3,
+ 48,
+ 99,
+ 24,
+ 178,
+ 151,
+ 175,
+ 226,
+ 126,
+ 200,
+ 98,
+ 121,
+ 130,
+ 246,
+ 127,
+ 88,
+ 183,
+ 210,
+ 34,
+ 76,
+ 122,
+ 158,
+ 142,
+ 104,
+ 171,
+ 27,
+ 98,
+ 127,
+ 86,
+ 117,
+ 143,
+ 144,
+ 25,
+ 134,
+ 137,
+ 227,
+ 213,
+ 79,
+ 108,
+ 230,
+ 88,
+ 13,
+ 21,
+ 20,
+ 177,
+ 246,
+ 52,
+ 186,
+ 8,
+ 94,
+ 0,
+ 235,
+ 137,
+ 85,
+ 172,
+ 66,
+ 163,
+ 20,
+ 99,
+ 210,
+ 193,
+ 192,
+ 155,
+ 15,
+ 88,
+ 51,
+ 41,
+ 41,
+ 232,
+ 70,
+ 190,
+ 242,
+ 160,
+ 213,
+ 122,
+ 175,
+ 162,
+ 121,
+ 150,
+ 194,
+ 105,
+ 185,
+ 22,
+ 77,
+ 221,
+ 222,
+ 190,
+ 39,
+ 191,
+ 200,
+ 45,
+ 110,
+ 151,
+ 138,
+ 108,
+ 168,
+ 68,
+ 23,
+ 149,
+ 140,
+ 157,
+ 176,
+ 160,
+ 30,
+ 243,
+ 222,
+ 233,
+ 131,
+ 17,
+ 24,
+ 177,
+ 101,
+ 43,
+ 92,
+ 245,
+ 20,
+ 153,
+ 25,
+ 123,
+ 182,
+ 187,
+ 239,
+ 168,
+ 159,
+ 140,
+ 154,
+ 68,
+ 229,
+ 191,
+ 201,
+ 136,
+ 167,
+ 209,
+ 219,
+ 211,
+ 24,
+ 12,
+ 69,
+ 115,
+ 232,
+ 212,
+ 57,
+ 31,
+ 203,
+ 43,
+ 31,
+ 189,
+ 32,
+ 176,
+ 72,
+ 113,
+ 249,
+ 8,
+ 242,
+ 46,
+ 36,
+ 223,
+ 29,
+ 108,
+ 30,
+ 59,
+ 43,
+ 70,
+ 149,
+ 27,
+ 184,
+ 153,
+ 61,
+ 205,
+ 216,
+ 98,
+ 198,
+ 251,
+ 3,
+ 88,
+ 63,
+ 103,
+ 36,
+ 16,
+ 107,
+ 80,
+ 106,
+ 113,
+ 225,
+ 84,
+ 179,
+ 111,
+ 151,
+ 68,
+ 123,
+ 188,
+ 127,
+ 58,
+ 215,
+ 178,
+ 198,
+ 62,
+ 205,
+ 101,
+ 200,
+ 14,
+ 170,
+ 42,
+ 10,
+ 227,
+ 125,
+ 125,
+ 86,
+ 42,
+ 203,
+ 162,
+ 210,
+ 52,
+ 129,
+ 250,
+ 148,
+ 201,
+ 174,
+ 72,
+ 93,
+ 185,
+ 68,
+ 254,
+ 242,
+ 93,
+ 117,
+ 111,
+ 162,
+ 41,
+ 81,
+ 201,
+ 20,
+ 237,
+ 179,
+ 70,
+ 14,
+ 39,
+ 209,
+ 15,
+ 209,
+ 241,
+ 117,
+ 201,
+ 139,
+ 155,
+ 42,
+ 55,
+ 161,
+ 3,
+ 51,
+ 106,
+ 70,
+ 68,
+ 156,
+ 238,
+ 219,
+ 98,
+ 187,
+ 33,
+ 185,
+ 15,
+ 195,
+ 70,
+ 210,
+ 87,
+ 57,
+ 218,
+ 0,
+ 200,
+ 237,
+ 180,
+ 229,
+ 30,
+ 73,
+ 199,
+ 214,
+ 150,
+ 207,
+ 93,
+ 18,
+ 231,
+ 94,
+ 208,
+ 166,
+ 244,
+ 167,
+ 87,
+ 70,
+ 89,
+ 138,
+ 34,
+ 112,
+ 142,
+ 51,
+ 133,
+ 70,
+ 155,
+ 162,
+ 156,
+ 175,
+ 208,
+ 117,
+ 72,
+ 121,
+ 7,
+ 70,
+ 213,
+ 18,
+ 177,
+ 142,
+ 1,
+ 112,
+ 193,
+ 220,
+ 159,
+ 127,
+ 4,
+ 173,
+ 37,
+ 217,
+ 57,
+ 212,
+ 108,
+ 34,
+ 227,
+ 138,
+ 187,
+ 198,
+ 100,
+ 255,
+ 200,
+ 2,
+ 217,
+ 173,
+ 143,
+ 194,
+ 191,
+ 123,
+ 125,
+ 28,
+ 53,
+ 61,
+ 204,
+ 34,
+ 70,
+ 121,
+ 208,
+ 0,
+ 143,
+ 3,
+ 112,
+ 45,
+ 28,
+ 248,
+ 112,
+ 83,
+ 218,
+ 145,
+ 224,
+ 84,
+ 87,
+ 81,
+ 132,
+ 23,
+ 209,
+ 91,
+ 151,
+ 11,
+ 146,
+ 132,
+ 79,
+ 210,
+ 234,
+ 81,
+ 51,
+ 18,
+ 142,
+ 90,
+ 201,
+ 145,
+ 239,
+ 254,
+ 120,
+ 88,
+ 191,
+ 90,
+ 118,
+ 111,
+ 162,
+ 33,
+ 62,
+ 13,
+ 51,
+ 235,
+ 153,
+ 88,
+ 245,
+ 225,
+ 181,
+ 37,
+ 69,
+ 232,
+ 92,
+ 217,
+ 0,
+ 22,
+ 212,
+ 63,
+ 42,
+ 169,
+ 105,
+ 224,
+ 220,
+ 98,
+ 122,
+ 214,
+ 153,
+ 14,
+ 90,
+ 101,
+ 110,
+ 90,
+ 50,
+ 228,
+ 215,
+ 67,
+ 204,
+ 182,
+ 165,
+ 9,
+ 236,
+ 39,
+ 193,
+ 42,
+ 137,
+ 189,
+ 42,
+ 142,
+ 46,
+ 238,
+ 216,
+ 204,
+ 215,
+ 115,
+ 251,
+ 254,
+ 72,
+ 134,
+ 210,
+ 210,
+ 149,
+ 90,
+ 163,
+ 161,
+ 107,
+ 119,
+ 9,
+ 121,
+ 242,
+ 254,
+ 33,
+ 54,
+ 185,
+ 50,
+ 204,
+ 121,
+ 44,
+ 145,
+ 120,
+ 64,
+ 8,
+ 203,
+ 65,
+ 149,
+ 16,
+ 11,
+ 101,
+ 46,
+ 199,
+ 170,
+ 163,
+ 29,
+ 168,
+ 42,
+ 218,
+ 207,
+ 182,
+ 25,
+ 13,
+ 179,
+ 143,
+ 68,
+ 234,
+ 194,
+ 75,
+ 233,
+ 144,
+ 92,
+ 139,
+ 207,
+ 236,
+ 65,
+ 181,
+ 4,
+ 117,
+ 102,
+ 80,
+ 135,
+ 141,
+ 95,
+ 73,
+ 151,
+ 78,
+ 220,
+ 112,
+ 120,
+ 5,
+ 234,
+ 183,
+ 114,
+ 31,
+ 121,
+ 226,
+ 141,
+ 209,
+ 91,
+ 229,
+ 229,
+ 127,
+ 165,
+ 167,
+ 148,
+ 92,
+ 247,
+ 99,
+ 112,
+ 147,
+ 16,
+ 59,
+ 81,
+ 14,
+ 188,
+ 143,
+ 205,
+ 211,
+ 147,
+ 119,
+ 122,
+ 188,
+ 204,
+ 33,
+ 78,
+ 200,
+ 85,
+ 100,
+ 119,
+ 236,
+ 57,
+ 243,
+ 152,
+ 122,
+ 62,
+ 43,
+ 251,
+ 116,
+ 167,
+ 8,
+ 53,
+ 107,
+ 175,
+ 204,
+ 210,
+ 186,
+ 225,
+ 137,
+ 92,
+ 135,
+ 172,
+ 238,
+ 89,
+ 0,
+ 145,
+ 86,
+ 217,
+ 166,
+ 189,
+ 174,
+ 227,
+ 108,
+ 52,
+ 216,
+ 40,
+ 229,
+ 51,
+ 158,
+ 29,
+ 133,
+ 130,
+ 146,
+ 82,
+ 185,
+ 226,
+ 47,
+ 169,
+ 247,
+ 57,
+ 55,
+ 66,
+ 72,
+ 91,
+ 123,
+ 61,
+ 92,
+ 73,
+ 7,
+ 124,
+ 63,
+ 62,
+ 70,
+ 224,
+ 178,
+ 31,
+ 72,
+ 209,
+ 99,
+ 4,
+ 103,
+ 126,
+ 222,
+ 95,
+ 11,
+ 164,
+ 148,
+ 129,
+ 246,
+ 106,
+ 209,
+ 43,
+ 186,
+ 164,
+ 211,
+ 23,
+ 55,
+ 149,
+ 224,
+ 25,
+ 3,
+ 99,
+ 67,
+ 119,
+ 63,
+ 17,
+ 97,
+ 114,
+ 239,
+ 212,
+ 187,
+ 99,
+ 39,
+ 40,
+ 31,
+ 188,
+ 252,
+ 185,
+ 180,
+ 252,
+ 211,
+ 109,
+ 108,
+ 120,
+ 236,
+ 233,
+ 134,
+ 211,
+ 71,
+ 78,
+ 37,
+ 193,
+ 132,
+ 169,
+ 229,
+ 44,
+ 131,
+ 23,
+ 216,
+ 9,
+ 221,
+ 44,
+ 149,
+ 0,
+ 122,
+ 23,
+ 74,
+ 249,
+ 116,
+ 213,
+ 102,
+ 183,
+ 134,
+ 1,
+ 201,
+ 98,
+ 163,
+ 9,
+ 1,
+ 52,
+ 44,
+ 119,
+ 248,
+ 115,
+ 8,
+ 242,
+ 104,
+ 22,
+ 155,
+ 105,
+ 46,
+ 151,
+ 19,
+ 31,
+ 77,
+ 149,
+ 127,
+ 253,
+ 254,
+ 29,
+ 12,
+ 100,
+ 196,
+ 6,
+ 248,
+ 170,
+ 165,
+ 235,
+ 149,
+ 227,
+ 24,
+ 174,
+ 226,
+ 130,
+ 129,
+ 187,
+ 142,
+ 89,
+ 89,
+ 229,
+ 63,
+ 108,
+ 90,
+ 154,
+ 239,
+ 110,
+ 155,
+ 209,
+ 203,
+ 107,
+ 143,
+ 51,
+ 107,
+ 47,
+ 44,
+ 146,
+ 3,
+ 21,
+ 102,
+ 6,
+ 177,
+ 90,
+ 105,
+ 38,
+ 254,
+ 252,
+ 171,
+ 118,
+ 248,
+ 252,
+ 228,
+ 80,
+ 153,
+ 80,
+ 84,
+ 192,
+ 66,
+ 220,
+ 129,
+ 211,
+ 162,
+ 43,
+ 187,
+ 153,
+ 177,
+ 192,
+ 130,
+ 110,
+ 8,
+ 125,
+ 228,
+ 34,
+ 81,
+ 18,
+ 221,
+ 64,
+ 73,
+ 77,
+ 53,
+ 73,
+ 151,
+ 36,
+ 203,
+ 176,
+ 249,
+ 105,
+ 144,
+ 201,
+ 135,
+ 222,
+ 155,
+ 241,
+ 132,
+ 70,
+ 176,
+ 9,
+ 86,
+ 102,
+ 35,
+ 137,
+ 124,
+ 38,
+ 83,
+ 147,
+ 51,
+ 251,
+ 169,
+ 18,
+ 245,
+ 202,
+ 65,
+ 216,
+ 117,
+ 85,
+ 184,
+ 234,
+ 210,
+ 117,
+ 45,
+ 239,
+ 131,
+ 165,
+ 64,
+ 71,
+ 60,
+ 36,
+ 239,
+ 228,
+ 167,
+ 238,
+ 94,
+ 17,
+ 235,
+ 112,
+ 72,
+ 170,
+ 129,
+ 176,
+ 107,
+ 205,
+ 253,
+ 34,
+ 173,
+ 81,
+ 48,
+ 142,
+ 94,
+ 141,
+ 3,
+ 238,
+ 139,
+ 133,
+ 102,
+ 164,
+ 22,
+ 131,
+ 62,
+ 165,
+ 18,
+ 121,
+ 135,
+ 63,
+ 66,
+ 106,
+ 103,
+ 7,
+ 209,
+ 104,
+ 123,
+ 255,
+ 219,
+ 187,
+ 104,
+ 199,
+ 198,
+ 192,
+ 130,
+ 126,
+ 69,
+ 196,
+ 117,
+ 46,
+ 109,
+ 207,
+ 212,
+ 53,
+ 163,
+ 217,
+ 27,
+ 216,
+ 79,
+ 211,
+ 33,
+ 23,
+ 154,
+ 10,
+ 49,
+ 16,
+ 96,
+ 121,
+ 230,
+ 211,
+ 103,
+ 245,
+ 181,
+ 195,
+ 186,
+ 18,
+ 248,
+ 252,
+ 77,
+ 23,
+ 49,
+ 158,
+ 211,
+ 13,
+ 160,
+ 121,
+ 244,
+ 111,
+ 219,
+ 159,
+ 10,
+ 101,
+ 232,
+ 157,
+ 107,
+ 243,
+ 175,
+ 168,
+ 23,
+ 20,
+ 80,
+ 65,
+ 39,
+ 36,
+ 19,
+ 190,
+ 140,
+ 73,
+ 181,
+ 185,
+ 72,
+ 229,
+ 68,
+ 28,
+ 5,
+ 107,
+ 160,
+ 80,
+ 35,
+ 192,
+ 44,
+ 50,
+ 32,
+ 15,
+ 203,
+ 126,
+ 223,
+ 18,
+ 20,
+ 101,
+ 238,
+ 108,
+ 238,
+ 170,
+ 58,
+ 108,
+ 59,
+ 19,
+ 54,
+ 217,
+ 109,
+ 105,
+ 162,
+ 253,
+ 228,
+ 200,
+ 20,
+ 234,
+ 51,
+ 178,
+ 196,
+ 84,
+ 24,
+ 213,
+ 159,
+ 143,
+ 145,
+ 56,
+ 230,
+ 238,
+ 169,
+ 90,
+ 14,
+ 254,
+ 227,
+ 216,
+ 160,
+ 180,
+ 113,
+ 221,
+ 36,
+ 144,
+ 89,
+ 221,
+ 223,
+ 172,
+ 36,
+ 152,
+ 115,
+ 91,
+ 194,
+ 64,
+ 29,
+ 73,
+ 249,
+ 25,
+ 28,
+ 15,
+ 203,
+ 90,
+ 172,
+ 34,
+ 225,
+ 32,
+ 123,
+ 132,
+ 134,
+ 125,
+ 75,
+ 127,
+ 135,
+ 122,
+ 61,
+ 110,
+ 161,
+ 10,
+ 45,
+ 139,
+ 128,
+ 60,
+ 42,
+ 56,
+ 25,
+ 146,
+ 120,
+ 170,
+ 208,
+ 161,
+ 246,
+ 54,
+ 245,
+ 241,
+ 176,
+ 167,
+ 38,
+ 40,
+ 23,
+ 35,
+ 24,
+ 238,
+ 94,
+ 55,
+ 118,
+ 121,
+ 200,
+ 133,
+ 167,
+ 109,
+ 188,
+ 100,
+ 63,
+ 236,
+ 12,
+ 227,
+ 186,
+ 63,
+ 244,
+ 126,
+ 112,
+ 0,
+ 205,
+ 60,
+ 144,
+ 107,
+ 142,
+ 226,
+ 86,
+ 194,
+ 108,
+ 151,
+ 125,
+ 236,
+ 126,
+ 39,
+ 243,
+ 62,
+ 156,
+ 84,
+ 116,
+ 133,
+ 16,
+ 83,
+ 87,
+ 159,
+ 39,
+ 35,
+ 174,
+ 37,
+ 198,
+ 112,
+ 44,
+ 215,
+ 205,
+ 163,
+ 122,
+ 126,
+ 208,
+ 23,
+ 220,
+ 148,
+ 117,
+ 255,
+ 118,
+ 207,
+ 103,
+ 150,
+ 229,
+ 12,
+ 251,
+ 87,
+ 16,
+ 87,
+ 89,
+ 167,
+ 80,
+ 107,
+ 213,
+ 11,
+ 88,
+ 93,
+ 57,
+ 30,
+ 39,
+ 153,
+ 179,
+ 223,
+ 249,
+ 71,
+ 86,
+ 33,
+ 222,
+ 58,
+ 17,
+ 220,
+ 194,
+ 98,
+ 60,
+ 97,
+ 34,
+ 149,
+ 13,
+ 225,
+ 118,
+ 171,
+ 39,
+ 206,
+ 62,
+ 167,
+ 164,
+ 191,
+ 238,
+ 74,
+ 22,
+ 149,
+ 57,
+ 118,
+ 48,
+ 43,
+ 191,
+ 241,
+ 4,
+ 220,
+ 161,
+ 87,
+ 227,
+ 221,
+ 225,
+ 118,
+ 52,
+ 204,
+ 6,
+ 25,
+ 181,
+ 117,
+ 123,
+ 5,
+ 53,
+ 84,
+ 190,
+ 100,
+ 55,
+ 214,
+ 202,
+ 75,
+ 252,
+ 232,
+ 184,
+ 72,
+ 142,
+ 42,
+ 231,
+ 158,
+ 97,
+ 48,
+ 33,
+ 105,
+ 15,
+ 208,
+ 197,
+ 155,
+ 17,
+ 56,
+ 150,
+ 254,
+ 140,
+ 28,
+ 184,
+ 232,
+ 180,
+ 129,
+ 174,
+ 92,
+ 114,
+ 23,
+ 19,
+ 234,
+ 216,
+ 146,
+ 223,
+ 166,
+ 231,
+ 226,
+ 141,
+ 44,
+ 205,
+ 34,
+ 118,
+ 41,
+ 108,
+ 121,
+ 220,
+ 81,
+ 23,
+ 251,
+ 87,
+ 110,
+ 28,
+ 16,
+ 195,
+ 165,
+ 16,
+ 73,
+ 60,
+ 45,
+ 24,
+ 102,
+ 95,
+ 130,
+ 197,
+ 236,
+ 3,
+ 48,
+ 101,
+ 195,
+ 75,
+ 168,
+ 242,
+ 207,
+ 64,
+ 12,
+ 145,
+ 145,
+ 193,
+ 185,
+ 136,
+ 148,
+ 183,
+ 29,
+ 233,
+ 226,
+ 233,
+ 80,
+ 197,
+ 189,
+ 71,
+ 77,
+ 206,
+ 254,
+ 144,
+ 74,
+ 90,
+ 235,
+ 63,
+ 155,
+ 103,
+ 73,
+ 33,
+ 159,
+ 2,
+ 162,
+ 64,
+ 138,
+ 19,
+ 47,
+ 158,
+ 70,
+ 31,
+ 3,
+ 179,
+ 185,
+ 245,
+ 102,
+ 225,
+ 57,
+ 98,
+ 130,
+ 86,
+ 84,
+ 232,
+ 175,
+ 196,
+ 62,
+ 163,
+ 205,
+ 92,
+ 198,
+ 53,
+ 84,
+ 78,
+ 141,
+ 212,
+ 97,
+ 52,
+ 192,
+ 16,
+ 125,
+ 158,
+ 209,
+ 32,
+ 71,
+ 68,
+ 178,
+ 171,
+ 193,
+ 143,
+ 131,
+ 125,
+ 155,
+ 215,
+ 1,
+ 177,
+ 117,
+ 62,
+ 82,
+ 186,
+ 244,
+ 30,
+ 71,
+ 94,
+ 121,
+ 65,
+ 50,
+ 129,
+ 252,
+ 81,
+ 193,
+ 64,
+ 228,
+ 182,
+ 113,
+ 66,
+ 164,
+ 41,
+ 192,
+ 52,
+ 12,
+ 226,
+ 173,
+ 110,
+ 215,
+ 189,
+ 118,
+ 40,
+ 113,
+ 207,
+ 88,
+ 47,
+ 217,
+ 65,
+ 237,
+ 116,
+ 240,
+ 173,
+ 79,
+ 145,
+ 103,
+ 38,
+ 38,
+ 111,
+ 63,
+ 108,
+ 215,
+ 161,
+ 181,
+ 131,
+ 161,
+ 50,
+ 117,
+ 249,
+ 31,
+ 107,
+ 34,
+ 136,
+ 237,
+ 149,
+ 89,
+ 222,
+ 18,
+ 23,
+ 127,
+ 77,
+ 156,
+ 40,
+ 184,
+ 235,
+ 45,
+ 242,
+ 157,
+ 188,
+ 169,
+ 148,
+ 200,
+ 148,
+ 194,
+ 52,
+ 85,
+ 209,
+ 121,
+ 56,
+ 136,
+ 199,
+ 225,
+ 105,
+ 77,
+ 84,
+ 24,
+ 3,
+ 170,
+ 124,
+ 40,
+ 235,
+ 80,
+ 187,
+ 85,
+ 129,
+ 102,
+ 154,
+ 33,
+ 250,
+ 59,
+ 0,
+ 73,
+ 70,
+ 145,
+ 87,
+ 103,
+ 49,
+ 64,
+ 213,
+ 156,
+ 217,
+ 1,
+ 247,
+ 241,
+ 151,
+ 183,
+ 120,
+ 85,
+ 194,
+ 142,
+ 202,
+ 134,
+ 187,
+ 241,
+ 18,
+ 215,
+ 108,
+ 111,
+ 199,
+ 159,
+ 83,
+ 206,
+ 56,
+ 69,
+ 3,
+ 23,
+ 42,
+ 26,
+ 13,
+ 227,
+ 239,
+ 47,
+ 89,
+ 147,
+ 200,
+ 82,
+ 0,
+ 175,
+ 143,
+ 90,
+ 98,
+ 64,
+ 204,
+ 157,
+ 255,
+ 170,
+ 45,
+ 152,
+ 146,
+ 99,
+ 195,
+ 133,
+ 12,
+ 249,
+ 158,
+ 78,
+ 116,
+ 109,
+ 224,
+ 72,
+ 69,
+ 128,
+ 50,
+ 63,
+ 92,
+ 208,
+ 233,
+ 128,
+ 59,
+ 58,
+ 223,
+ 0,
+ 212,
+ 103,
+ 2,
+ 70,
+ 20,
+ 99,
+ 129,
+ 107,
+ 159,
+ 223,
+ 156,
+ 66,
+ 8,
+ 17,
+ 78,
+ 237,
+ 34,
+ 141,
+ 188,
+ 143,
+ 228,
+ 39,
+ 91,
+ 152,
+ 83,
+ 182,
+ 38,
+ 104,
+ 192,
+ 167,
+ 35,
+ 34,
+ 114,
+ 87,
+ 192,
+ 194,
+ 171,
+ 158,
+ 237,
+ 176,
+ 201,
+ 223,
+ 14,
+ 154,
+ 82,
+ 89,
+ 244,
+ 49,
+ 185,
+ 172,
+ 63,
+ 89,
+ 131,
+ 58,
+ 115,
+ 195,
+ 34,
+ 43,
+ 18,
+ 39,
+ 247,
+ 63,
+ 195,
+ 172,
+ 38,
+ 213,
+ 141,
+ 171,
+ 175,
+ 89,
+ 111,
+ 239,
+ 180,
+ 35,
+ 160,
+ 250,
+ 121,
+ 252,
+ 138,
+ 31,
+ 6,
+ 253,
+ 239,
+ 225,
+ 218,
+ 156,
+ 161,
+ 170,
+ 169,
+ 79,
+ 95,
+ 109,
+ 221,
+ 147,
+ 156,
+ 253,
+ 58,
+ 191,
+ 15,
+ 194,
+ 80,
+ 201,
+ 181,
+ 74,
+ 225,
+ 182,
+ 218,
+ 80,
+ 48,
+ 254,
+ 168,
+ 131,
+ 84,
+ 102,
+ 153,
+ 2,
+ 162,
+ 73,
+ 243,
+ 176,
+ 169,
+ 223,
+ 195,
+ 240,
+ 82,
+ 195,
+ 91,
+ 137,
+ 156,
+ 176,
+ 125,
+ 75,
+ 25,
+ 211,
+ 215,
+ 128,
+ 194,
+ 138,
+ 138,
+ 99,
+ 33,
+ 129,
+ 56,
+ 48,
+ 99,
+ 245,
+ 221,
+ 228,
+ 148,
+ 162,
+ 15,
+ 203,
+ 206,
+ 60,
+ 69,
+ 118,
+ 3,
+ 97,
+ 208,
+ 235,
+ 150,
+ 13,
+ 178,
+ 97,
+ 213,
+ 15,
+ 82,
+ 12,
+ 176,
+ 58,
+ 33,
+ 28,
+ 163,
+ 110,
+ 189,
+ 131,
+ 38,
+ 25,
+ 184,
+ 74,
+ 118,
+ 255,
+ 101,
+ 234,
+ 186,
+ 21,
+ 22,
+ 186,
+ 220,
+ 0,
+ 91,
+ 150,
+ 110,
+ 121,
+ 170,
+ 68,
+ 244,
+ 129,
+ 189,
+ 138,
+ 211,
+ 140,
+ 110,
+ 174,
+ 122,
+ 87,
+ 160,
+ 50,
+ 117,
+ 186,
+ 115,
+ 169,
+ 48,
+ 86,
+ 44,
+ 215,
+ 80,
+ 141,
+ 255,
+ 223,
+ 78,
+ 26,
+ 253,
+ 241,
+ 119,
+ 70,
+ 227,
+ 102,
+ 196,
+ 159,
+ 36,
+ 118,
+ 137,
+ 187,
+ 239,
+ 48,
+ 44,
+ 186,
+ 206,
+ 147,
+ 56,
+ 38,
+ 74,
+ 80,
+ 101,
+ 148,
+ 139,
+ 8,
+ 29,
+ 192,
+ 227,
+ 161,
+ 46,
+ 29,
+ 170,
+ 188,
+ 58,
+ 144,
+ 227,
+ 97,
+ 218,
+ 211,
+ 210,
+ 26,
+ 105,
+ 105,
+ 18,
+ 170,
+ 172,
+ 227,
+ 243,
+ 10,
+ 8,
+ 226,
+ 36,
+ 39,
+ 34,
+ 129,
+ 71,
+ 97,
+ 240,
+ 6,
+ 216,
+ 50,
+ 100,
+ 26,
+ 241,
+ 208,
+ 163,
+ 0,
+ 68,
+ 96,
+ 103,
+ 220,
+ 190,
+ 244,
+ 50,
+ 234,
+ 170,
+ 42,
+ 98,
+ 253,
+ 148,
+ 190,
+ 62,
+ 40,
+ 211,
+ 164,
+ 60,
+ 137,
+ 10,
+ 25,
+ 229,
+ 219,
+ 244,
+ 195,
+ 90,
+ 59,
+ 196,
+ 159,
+ 216,
+ 110,
+ 218,
+ 125,
+ 247,
+ 246,
+ 212,
+ 23,
+ 167,
+ 115,
+ 144,
+ 105,
+ 32,
+ 23,
+ 7,
+ 194,
+ 72,
+ 132,
+ 90,
+ 246,
+ 15,
+ 81,
+ 228,
+ 41,
+ 153,
+ 187,
+ 30,
+ 129,
+ 70,
+ 98,
+ 183,
+ 203,
+ 71,
+ 28,
+ 244,
+ 200,
+ 78,
+ 185,
+ 108,
+ 110,
+ 59,
+ 69,
+ 223,
+ 117,
+ 119,
+ 6,
+ 189,
+ 57,
+ 179,
+ 180,
+ 84,
+ 164,
+ 11,
+ 139,
+ 200,
+ 81,
+ 78,
+ 168,
+ 168,
+ 180,
+ 26,
+ 208,
+ 93,
+ 89,
+ 214,
+ 29,
+ 34,
+ 41,
+ 156,
+ 216,
+ 24,
+ 128,
+ 169,
+ 99,
+ 131,
+ 196,
+ 82,
+ 136,
+ 165,
+ 25,
+ 96,
+ 111,
+ 226,
+ 221,
+ 146,
+ 135,
+ 1,
+ 246,
+ 51,
+ 110,
+ 211,
+ 162,
+ 88,
+ 51,
+ 243,
+ 129,
+ 103,
+ 92,
+ 160,
+ 70,
+ 251,
+ 234,
+ 177,
+ 80,
+ 220,
+ 155,
+ 236,
+ 18,
+ 183,
+ 2,
+ 178,
+ 233,
+ 200,
+ 43,
+ 215,
+ 99,
+ 161,
+ 29,
+ 62,
+ 160,
+ 164,
+ 164,
+ 211,
+ 171,
+ 122,
+ 245,
+ 152,
+ 53,
+ 206,
+ 181,
+ 21,
+ 183,
+ 252,
+ 54,
+ 99,
+ 106,
+ 55,
+ 13,
+ 217,
+ 74,
+ 7,
+ 239,
+ 161,
+ 184,
+ 19,
+ 40,
+ 119,
+ 115,
+ 0,
+ 16,
+ 89,
+ 182,
+ 186,
+ 197,
+ 47,
+ 233,
+ 122,
+ 140,
+ 184,
+ 53,
+ 174,
+ 249,
+ 18,
+ 243,
+ 162,
+ 141,
+ 221,
+ 209,
+ 186,
+ 160,
+ 176,
+ 248,
+ 27,
+ 163,
+ 253,
+ 178,
+ 34,
+ 124,
+ 84,
+ 30,
+ 57,
+ 250,
+ 103,
+ 155,
+ 53,
+ 235,
+ 112,
+ 132,
+ 250,
+ 252,
+ 91,
+ 104,
+ 176,
+ 216,
+ 41,
+ 87,
+ 162,
+ 228,
+ 223,
+ 91,
+ 156,
+ 165,
+ 15,
+ 107,
+ 159,
+ 40,
+ 70,
+ 183,
+ 183,
+ 248,
+ 96,
+ 190,
+ 242,
+ 17,
+ 227,
+ 205,
+ 169,
+ 212,
+ 158,
+ 255,
+ 206,
+ 31,
+ 135,
+ 95,
+ 189,
+ 87,
+ 200,
+ 77,
+ 85,
+ 219,
+ 190,
+ 15,
+ 221,
+ 167,
+ 4,
+ 60,
+ 122,
+ 10,
+ 8,
+ 129,
+ 43,
+ 222,
+ 144,
+ 94,
+ 175,
+ 161,
+ 195,
+ 237,
+ 130,
+ 179,
+ 84,
+ 194,
+ 66,
+ 155,
+ 223,
+ 98,
+ 59,
+ 17,
+ 96,
+ 191,
+ 3,
+ 90,
+ 150,
+ 252,
+ 193,
+ 64,
+ 26,
+ 214,
+ 245,
+ 70,
+ 71,
+ 65,
+ 75,
+ 217,
+ 178,
+ 85,
+ 208,
+ 12,
+ 159,
+ 172,
+ 231,
+ 232,
+ 150,
+ 222,
+ 225,
+ 17,
+ 26,
+ 246,
+ 113,
+ 223,
+ 122,
+ 24,
+ 123,
+ 171,
+ 138,
+ 170,
+ 102,
+ 59,
+ 188,
+ 246,
+ 86,
+ 202,
+ 39,
+ 190,
+ 134,
+ 232,
+ 30,
+ 61,
+ 226,
+ 50,
+ 110,
+ 160,
+ 185,
+ 46,
+ 32,
+ 226,
+ 175,
+ 209,
+ 72,
+ 242,
+ 82,
+ 195,
+ 118,
+ 230,
+ 5,
+ 248,
+ 29,
+ 57,
+ 166,
+ 200,
+ 173,
+ 174,
+ 234,
+ 206,
+ 168,
+ 178,
+ 213,
+ 122,
+ 45,
+ 9,
+ 175,
+ 232,
+ 224,
+ 231,
+ 21,
+ 46,
+ 132,
+ 189,
+ 35,
+ 106,
+ 31,
+ 85,
+ 195,
+ 15,
+ 121,
+ 158,
+ 164,
+ 139,
+ 79,
+ 217,
+ 248,
+ 27,
+ 199,
+ 33,
+ 195,
+ 40,
+ 65,
+ 143,
+ 153,
+ 10,
+ 25,
+ 211,
+ 122,
+ 253,
+ 224,
+ 76,
+ 207,
+ 190,
+ 109,
+ 61,
+ 104,
+ 127,
+ 92,
+ 186,
+ 255,
+ 128,
+ 72,
+ 100,
+ 116,
+ 192,
+ 237,
+ 255,
+ 169,
+ 103,
+ 17,
+ 149,
+ 138,
+ 79,
+ 252,
+ 4,
+ 62,
+ 185,
+ 77,
+ 110,
+ 62,
+ 154,
+ 31,
+ 178,
+ 84,
+ 228,
+ 219,
+ 94,
+ 127,
+ 134,
+ 88,
+ 170,
+ 144,
+ 195,
+ 131,
+ 245,
+ 126,
+ 244,
+ 238,
+ 127,
+ 141,
+ 243,
+ 246,
+ 226,
+ 139,
+ 246,
+ 15,
+ 255,
+ 220,
+ 118,
+ 68,
+ 129,
+ 53,
+ 251,
+ 79,
+ 116,
+ 92,
+ 81,
+ 33,
+ 115,
+ 169,
+ 244,
+ 255,
+ 87,
+ 222,
+ 184,
+ 161,
+ 125,
+ 198,
+ 197,
+ 112,
+ 149,
+ 184,
+ 156,
+ 61,
+ 243,
+ 221,
+ 84,
+ 243,
+ 19,
+ 141,
+ 177,
+ 173,
+ 172,
+ 68,
+ 113,
+ 241,
+ 240,
+ 12,
+ 10,
+ 211,
+ 224,
+ 158,
+ 150,
+ 14,
+ 191,
+ 181,
+ 151,
+ 212,
+ 200,
+ 215,
+ 44,
+ 248,
+ 127,
+ 225,
+ 247,
+ 82,
+ 58,
+ 137,
+ 39,
+ 115,
+ 171,
+ 248,
+ 250,
+ 255,
+ 75,
+ 185,
+ 67,
+ 94,
+ 202,
+ 122,
+ 7,
+ 30,
+ 153,
+ 140,
+ 248,
+ 123,
+ 204,
+ 26,
+ 106,
+ 28,
+ 89,
+ 177,
+ 249,
+ 163,
+ 202,
+ 159,
+ 69,
+ 213,
+ 53,
+ 189,
+ 224,
+ 43,
+ 103,
+ 78,
+ 145,
+ 34,
+ 148,
+ 214,
+ 163,
+ 204,
+ 159,
+ 219,
+ 191,
+ 89,
+ 199,
+ 78,
+ 0,
+ 46,
+ 85,
+ 169,
+ 215,
+ 46,
+ 106,
+ 36,
+ 114,
+ 20,
+ 28,
+ 163,
+ 229,
+ 146,
+ 0,
+ 89,
+ 73,
+ 75,
+ 204,
+ 255,
+ 82,
+ 142,
+ 239,
+ 211,
+ 225,
+ 231,
+ 5,
+ 94,
+ 139,
+ 252,
+ 23,
+ 154,
+ 227,
+ 68,
+ 207,
+ 205,
+ 60,
+ 153,
+ 101,
+ 89,
+ 247,
+ 235,
+ 66,
+ 230,
+ 120,
+ 191,
+ 139,
+ 33,
+ 231,
+ 211,
+ 126,
+ 95,
+ 60,
+ 137,
+ 28,
+ 176,
+ 42,
+ 114,
+ 185,
+ 165,
+ 55,
+ 232,
+ 236,
+ 59,
+ 238,
+ 41,
+ 197,
+ 16,
+ 144,
+ 39,
+ 7,
+ 154,
+ 218,
+ 184,
+ 243,
+ 31,
+ 80,
+ 227,
+ 34,
+ 116,
+ 248,
+ 90,
+ 231,
+ 163,
+ 159,
+ 255,
+ 5,
+ 233,
+ 134,
+ 90,
+ 94,
+ 174,
+ 248,
+ 59,
+ 91,
+ 79,
+ 96,
+ 238,
+ 208,
+ 218,
+ 57,
+ 107,
+ 225,
+ 85,
+ 146,
+ 82,
+ 111,
+ 35,
+ 148,
+ 152,
+ 59,
+ 73,
+ 233,
+ 186,
+ 168,
+ 140,
+ 161,
+ 106,
+ 92,
+ 173,
+ 254,
+ 230,
+ 67,
+ 114,
+ 35,
+ 139,
+ 228,
+ 255,
+ 81,
+ 149,
+ 52,
+ 41,
+ 93,
+ 210,
+ 187,
+ 37,
+ 14,
+ 160,
+ 154,
+ 180,
+ 9,
+ 200,
+ 238,
+ 221,
+ 1,
+ 252,
+ 59,
+ 58,
+ 26,
+ 134,
+ 234,
+ 213,
+ 170,
+ 118,
+ 81,
+ 255,
+ 3,
+ 80,
+ 75,
+ 3,
+ 4,
+ 20,
+ 0,
+ 0,
+ 8,
+ 8,
+ 0,
+ 131,
+ 182,
+ 42,
+ 68,
+ 158,
+ 64,
+ 172,
+ 29,
+ 120,
+ 6,
+ 0,
+ 0,
+ 95,
+ 61,
+ 0,
+ 0,
+ 12,
+ 0,
+ 0,
+ 0,
+ 97,
+ 114,
+ 105,
+ 97,
+ 108,
+ 95,
+ 50,
+ 52,
+ 46,
+ 102,
+ 110,
+ 116,
+ 189,
+ 91,
+ 219,
+ 110,
+ 219,
+ 72,
+ 12,
+ 125,
+ 239,
+ 87,
+ 8,
+ 126,
+ 110,
+ 55,
+ 195,
+ 185,
+ 15,
+ 144,
+ 20,
+ 216,
+ 183,
+ 254,
+ 193,
+ 62,
+ 46,
+ 180,
+ 190,
+ 36,
+ 66,
+ 29,
+ 185,
+ 136,
+ 221,
+ 221,
+ 237,
+ 126,
+ 253,
+ 74,
+ 195,
+ 81,
+ 34,
+ 89,
+ 29,
+ 149,
+ 148,
+ 28,
+ 161,
+ 64,
+ 42,
+ 59,
+ 62,
+ 62,
+ 67,
+ 14,
+ 121,
+ 72,
+ 113,
+ 148,
+ 251,
+ 195,
+ 169,
+ 190,
+ 124,
+ 254,
+ 80,
+ 20,
+ 247,
+ 85,
+ 125,
+ 56,
+ 21,
+ 135,
+ 114,
+ 187,
+ 127,
+ 216,
+ 252,
+ 254,
+ 82,
+ 149,
+ 199,
+ 77,
+ 113,
+ 174,
+ 254,
+ 107,
+ 94,
+ 72,
+ 189,
+ 41,
+ 254,
+ 58,
+ 29,
+ 119,
+ 15,
+ 27,
+ 177,
+ 41,
+ 170,
+ 75,
+ 121,
+ 172,
+ 182,
+ 241,
+ 114,
+ 251,
+ 84,
+ 190,
+ 156,
+ 247,
+ 151,
+ 135,
+ 205,
+ 166,
+ 248,
+ 94,
+ 87,
+ 219,
+ 211,
+ 110,
+ 223,
+ 94,
+ 158,
+ 47,
+ 47,
+ 251,
+ 203,
+ 246,
+ 233,
+ 203,
+ 195,
+ 6,
+ 68,
+ 243,
+ 161,
+ 243,
+ 243,
+ 233,
+ 116,
+ 121,
+ 106,
+ 94,
+ 108,
+ 138,
+ 178,
+ 140,
+ 255,
+ 125,
+ 43,
+ 119,
+ 187,
+ 170,
+ 126,
+ 108,
+ 190,
+ 247,
+ 99,
+ 252,
+ 215,
+ 124,
+ 230,
+ 91,
+ 185,
+ 141,
+ 239,
+ 136,
+ 143,
+ 13,
+ 226,
+ 244,
+ 253,
+ 114,
+ 172,
+ 234,
+ 125,
+ 75,
+ 113,
+ 23,
+ 215,
+ 181,
+ 61,
+ 61,
+ 63,
+ 159,
+ 234,
+ 162,
+ 125,
+ 243,
+ 203,
+ 190,
+ 122,
+ 124,
+ 106,
+ 24,
+ 165,
+ 111,
+ 150,
+ 84,
+ 158,
+ 219,
+ 197,
+ 181,
+ 248,
+ 109,
+ 121,
+ 220,
+ 255,
+ 209,
+ 124,
+ 57,
+ 248,
+ 238,
+ 85,
+ 67,
+ 47,
+ 93,
+ 203,
+ 245,
+ 184,
+ 63,
+ 39,
+ 214,
+ 237,
+ 215,
+ 253,
+ 238,
+ 237,
+ 75,
+ 227,
+ 111,
+ 218,
+ 171,
+ 116,
+ 93,
+ 84,
+ 104,
+ 223,
+ 161,
+ 58,
+ 54,
+ 223,
+ 90,
+ 182,
+ 246,
+ 255,
+ 41,
+ 245,
+ 111,
+ 223,
+ 234,
+ 199,
+ 4,
+ 184,
+ 123,
+ 69,
+ 220,
+ 71,
+ 195,
+ 139,
+ 237,
+ 233,
+ 123,
+ 221,
+ 44,
+ 37,
+ 192,
+ 38,
+ 125,
+ 77,
+ 251,
+ 118,
+ 252,
+ 154,
+ 208,
+ 48,
+ 255,
+ 219,
+ 44,
+ 96,
+ 83,
+ 252,
+ 136,
+ 63,
+ 255,
+ 169,
+ 118,
+ 209,
+ 5,
+ 205,
+ 229,
+ 83,
+ 50,
+ 0,
+ 84,
+ 243,
+ 145,
+ 211,
+ 225,
+ 16,
+ 253,
+ 215,
+ 44,
+ 239,
+ 71,
+ 119,
+ 109,
+ 155,
+ 247,
+ 203,
+ 221,
+ 223,
+ 101,
+ 221,
+ 110,
+ 67,
+ 251,
+ 169,
+ 150,
+ 54,
+ 185,
+ 187,
+ 62,
+ 54,
+ 111,
+ 25,
+ 92,
+ 207,
+ 128,
+ 207,
+ 71,
+ 62,
+ 176,
+ 215,
+ 132,
+ 208,
+ 35,
+ 244,
+ 61,
+ 66,
+ 217,
+ 35,
+ 148,
+ 115,
+ 8,
+ 3,
+ 26,
+ 24,
+ 166,
+ 8,
+ 105,
+ 22,
+ 74,
+ 18,
+ 97,
+ 12,
+ 165,
+ 134,
+ 81,
+ 75,
+ 170,
+ 137,
+ 176,
+ 208,
+ 68,
+ 16,
+ 16,
+ 25,
+ 141,
+ 89,
+ 107,
+ 23,
+ 65,
+ 200,
+ 200,
+ 104,
+ 175,
+ 189,
+ 234,
+ 51,
+ 38,
+ 138,
+ 30,
+ 33,
+ 244,
+ 9,
+ 29,
+ 145,
+ 79,
+ 69,
+ 62,
+ 23,
+ 230,
+ 248,
+ 116,
+ 158,
+ 133,
+ 58,
+ 50,
+ 6,
+ 185,
+ 86,
+ 160,
+ 130,
+ 48,
+ 152,
+ 26,
+ 226,
+ 122,
+ 27,
+ 37,
+ 151,
+ 209,
+ 16,
+ 9,
+ 109,
+ 34,
+ 188,
+ 246,
+ 170,
+ 121,
+ 35,
+ 148,
+ 253,
+ 176,
+ 249,
+ 4,
+ 75,
+ 25,
+ 81,
+ 109,
+ 96,
+ 156,
+ 254,
+ 130,
+ 237,
+ 85,
+ 106,
+ 54,
+ 38,
+ 193,
+ 105,
+ 101,
+ 120,
+ 29,
+ 175,
+ 162,
+ 224,
+ 128,
+ 26,
+ 69,
+ 142,
+ 203,
+ 100,
+ 163,
+ 204,
+ 197,
+ 170,
+ 20,
+ 52,
+ 74,
+ 64,
+ 197,
+ 1,
+ 3,
+ 83,
+ 110,
+ 37,
+ 81,
+ 82,
+ 131,
+ 21,
+ 32,
+ 233,
+ 184,
+ 90,
+ 77,
+ 115,
+ 0,
+ 53,
+ 7,
+ 156,
+ 155,
+ 147,
+ 146,
+ 243,
+ 40,
+ 81,
+ 118,
+ 32,
+ 136,
+ 213,
+ 116,
+ 7,
+ 80,
+ 119,
+ 164,
+ 184,
+ 118,
+ 44,
+ 59,
+ 122,
+ 60,
+ 145,
+ 16,
+ 101,
+ 71,
+ 130,
+ 92,
+ 173,
+ 66,
+ 2,
+ 10,
+ 143,
+ 148,
+ 215,
+ 74,
+ 103,
+ 123,
+ 140,
+ 46,
+ 83,
+ 62,
+ 228,
+ 140,
+ 242,
+ 1,
+ 169,
+ 203,
+ 81,
+ 106,
+ 189,
+ 4,
+ 65,
+ 221,
+ 145,
+ 154,
+ 92,
+ 148,
+ 197,
+ 98,
+ 183,
+ 166,
+ 86,
+ 199,
+ 4,
+ 170,
+ 242,
+ 228,
+ 41,
+ 137,
+ 142,
+ 149,
+ 168,
+ 60,
+ 210,
+ 249,
+ 213,
+ 172,
+ 148,
+ 144,
+ 26,
+ 186,
+ 201,
+ 158,
+ 213,
+ 223,
+ 148,
+ 18,
+ 149,
+ 71,
+ 9,
+ 75,
+ 77,
+ 145,
+ 165,
+ 148,
+ 22,
+ 147,
+ 82,
+ 193,
+ 104,
+ 43,
+ 45,
+ 193,
+ 200,
+ 97,
+ 161,
+ 180,
+ 52,
+ 70,
+ 204,
+ 73,
+ 165,
+ 70,
+ 234,
+ 170,
+ 216,
+ 165,
+ 153,
+ 200,
+ 136,
+ 73,
+ 169,
+ 140,
+ 164,
+ 218,
+ 8,
+ 185,
+ 46,
+ 146,
+ 24,
+ 174,
+ 22,
+ 115,
+ 82,
+ 185,
+ 145,
+ 156,
+ 27,
+ 182,
+ 141,
+ 68,
+ 70,
+ 76,
+ 73,
+ 229,
+ 87,
+ 243,
+ 170,
+ 75,
+ 119,
+ 31,
+ 130,
+ 156,
+ 30,
+ 121,
+ 70,
+ 90,
+ 199,
+ 227,
+ 48,
+ 33,
+ 245,
+ 184,
+ 169,
+ 227,
+ 239,
+ 99,
+ 160,
+ 49,
+ 98,
+ 62,
+ 106,
+ 165,
+ 175,
+ 25,
+ 245,
+ 59,
+ 237,
+ 163,
+ 195,
+ 70,
+ 64,
+ 155,
+ 235,
+ 200,
+ 97,
+ 111,
+ 35,
+ 145,
+ 79,
+ 39,
+ 62,
+ 67,
+ 109,
+ 148,
+ 97,
+ 97,
+ 163,
+ 236,
+ 80,
+ 113,
+ 180,
+ 117,
+ 203,
+ 125,
+ 74,
+ 140,
+ 84,
+ 84,
+ 28,
+ 237,
+ 213,
+ 90,
+ 183,
+ 88,
+ 14,
+ 21,
+ 71,
+ 7,
+ 59,
+ 85,
+ 32,
+ 73,
+ 140,
+ 196,
+ 214,
+ 220,
+ 161,
+ 226,
+ 24,
+ 48,
+ 171,
+ 69,
+ 42,
+ 42,
+ 142,
+ 81,
+ 64,
+ 181,
+ 113,
+ 105,
+ 54,
+ 122,
+ 145,
+ 166,
+ 15,
+ 98,
+ 45,
+ 141,
+ 243,
+ 105,
+ 222,
+ 97,
+ 205,
+ 148,
+ 141,
+ 225,
+ 150,
+ 54,
+ 162,
+ 226,
+ 24,
+ 175,
+ 215,
+ 170,
+ 28,
+ 30,
+ 21,
+ 199,
+ 10,
+ 160,
+ 70,
+ 78,
+ 222,
+ 70,
+ 162,
+ 87,
+ 81,
+ 115,
+ 44,
+ 184,
+ 57,
+ 140,
+ 115,
+ 42,
+ 135,
+ 71,
+ 205,
+ 177,
+ 227,
+ 182,
+ 252,
+ 189,
+ 178,
+ 195,
+ 163,
+ 230,
+ 88,
+ 189,
+ 90,
+ 95,
+ 229,
+ 81,
+ 115,
+ 236,
+ 72,
+ 87,
+ 165,
+ 228,
+ 50,
+ 74,
+ 154,
+ 202,
+ 121,
+ 159,
+ 102,
+ 115,
+ 176,
+ 154,
+ 141,
+ 168,
+ 57,
+ 78,
+ 172,
+ 230,
+ 213,
+ 128,
+ 154,
+ 227,
+ 36,
+ 57,
+ 86,
+ 197,
+ 194,
+ 88,
+ 85,
+ 105,
+ 2,
+ 169,
+ 213,
+ 58,
+ 29,
+ 128,
+ 215,
+ 169,
+ 147,
+ 115,
+ 122,
+ 52,
+ 185,
+ 98,
+ 83,
+ 74,
+ 154,
+ 87,
+ 77,
+ 218,
+ 71,
+ 55,
+ 101,
+ 163,
+ 165,
+ 220,
+ 37,
+ 211,
+ 108,
+ 84,
+ 46,
+ 241,
+ 141,
+ 238,
+ 30,
+ 3,
+ 87,
+ 227,
+ 36,
+ 208,
+ 44,
+ 244,
+ 105,
+ 142,
+ 28,
+ 38,
+ 44,
+ 84,
+ 183,
+ 179,
+ 208,
+ 98,
+ 212,
+ 120,
+ 161,
+ 231,
+ 12,
+ 144,
+ 96,
+ 70,
+ 143,
+ 163,
+ 177,
+ 82,
+ 249,
+ 145,
+ 138,
+ 247,
+ 70,
+ 243,
+ 36,
+ 62,
+ 90,
+ 97,
+ 212,
+ 24,
+ 164,
+ 126,
+ 148,
+ 136,
+ 54,
+ 51,
+ 67,
+ 206,
+ 242,
+ 209,
+ 198,
+ 85,
+ 26,
+ 75,
+ 191,
+ 87,
+ 102,
+ 29,
+ 190,
+ 128,
+ 37,
+ 202,
+ 235,
+ 169,
+ 18,
+ 37,
+ 115,
+ 58,
+ 51,
+ 167,
+ 73,
+ 213,
+ 41,
+ 100,
+ 198,
+ 83,
+ 156,
+ 126,
+ 193,
+ 144,
+ 25,
+ 19,
+ 205,
+ 128,
+ 81,
+ 211,
+ 24,
+ 147,
+ 141,
+ 110,
+ 98,
+ 228,
+ 152,
+ 227,
+ 131,
+ 25,
+ 62,
+ 181,
+ 105,
+ 15,
+ 253,
+ 212,
+ 45,
+ 106,
+ 46,
+ 70,
+ 221,
+ 28,
+ 3,
+ 177,
+ 234,
+ 251,
+ 81,
+ 223,
+ 223,
+ 203,
+ 250,
+ 92,
+ 210,
+ 195,
+ 140,
+ 172,
+ 215,
+ 233,
+ 236,
+ 104,
+ 212,
+ 187,
+ 245,
+ 248,
+ 236,
+ 45,
+ 249,
+ 92,
+ 226,
+ 179,
+ 19,
+ 51,
+ 227,
+ 91,
+ 30,
+ 199,
+ 201,
+ 100,
+ 32,
+ 76,
+ 28,
+ 85,
+ 201,
+ 172,
+ 71,
+ 251,
+ 132,
+ 180,
+ 194,
+ 164,
+ 58,
+ 190,
+ 144,
+ 55,
+ 208,
+ 82,
+ 26,
+ 83,
+ 154,
+ 168,
+ 169,
+ 144,
+ 206,
+ 254,
+ 60,
+ 109,
+ 255,
+ 22,
+ 30,
+ 139,
+ 217,
+ 100,
+ 221,
+ 168,
+ 13,
+ 238,
+ 23,
+ 122,
+ 154,
+ 168,
+ 73,
+ 90,
+ 66,
+ 40,
+ 204,
+ 248,
+ 96,
+ 60,
+ 245,
+ 150,
+ 77,
+ 44,
+ 44,
+ 75,
+ 10,
+ 83,
+ 48,
+ 184,
+ 169,
+ 243,
+ 34,
+ 153,
+ 83,
+ 25,
+ 49,
+ 231,
+ 224,
+ 63,
+ 121,
+ 117,
+ 60,
+ 122,
+ 235,
+ 143,
+ 80,
+ 4,
+ 169,
+ 244,
+ 210,
+ 154,
+ 11,
+ 133,
+ 205,
+ 69,
+ 24,
+ 53,
+ 23,
+ 217,
+ 155,
+ 196,
+ 165,
+ 183,
+ 108,
+ 32,
+ 211,
+ 1,
+ 149,
+ 128,
+ 137,
+ 212,
+ 191,
+ 101,
+ 61,
+ 4,
+ 217,
+ 157,
+ 82,
+ 143,
+ 14,
+ 111,
+ 222,
+ 137,
+ 49,
+ 164,
+ 147,
+ 70,
+ 49,
+ 154,
+ 246,
+ 153,
+ 76,
+ 228,
+ 44,
+ 236,
+ 188,
+ 67,
+ 231,
+ 83,
+ 13,
+ 68,
+ 194,
+ 133,
+ 199,
+ 83,
+ 74,
+ 118,
+ 132,
+ 215,
+ 233,
+ 216,
+ 139,
+ 84,
+ 145,
+ 75,
+ 198,
+ 48,
+ 163,
+ 94,
+ 248,
+ 28,
+ 97,
+ 118,
+ 72,
+ 188,
+ 244,
+ 25,
+ 21,
+ 157,
+ 78,
+ 197,
+ 133,
+ 149,
+ 196,
+ 26,
+ 165,
+ 22,
+ 50,
+ 154,
+ 116,
+ 40,
+ 46,
+ 28,
+ 172,
+ 101,
+ 164,
+ 233,
+ 66,
+ 213,
+ 155,
+ 213,
+ 40,
+ 187,
+ 216,
+ 9,
+ 97,
+ 206,
+ 113,
+ 216,
+ 44,
+ 202,
+ 148,
+ 31,
+ 241,
+ 116,
+ 124,
+ 37,
+ 43,
+ 117,
+ 162,
+ 28,
+ 223,
+ 239,
+ 191,
+ 27,
+ 101,
+ 210,
+ 57,
+ 24,
+ 169,
+ 192,
+ 224,
+ 214,
+ 205,
+ 221,
+ 146,
+ 50,
+ 61,
+ 143,
+ 3,
+ 70,
+ 175,
+ 102,
+ 229,
+ 235,
+ 3,
+ 57,
+ 171,
+ 41,
+ 65,
+ 82,
+ 59,
+ 28,
+ 22,
+ 11,
+ 142,
+ 212,
+ 17,
+ 165,
+ 245,
+ 254,
+ 46,
+ 62,
+ 244,
+ 24,
+ 47,
+ 191,
+ 238,
+ 95,
+ 234,
+ 170,
+ 126,
+ 124,
+ 123,
+ 2,
+ 210,
+ 117,
+ 79,
+ 64,
+ 166,
+ 223,
+ 20,
+ 135,
+ 234,
+ 229,
+ 124,
+ 193,
+ 85,
+ 157,
+ 247,
+ 219,
+ 83,
+ 157,
+ 14,
+ 95,
+ 203,
+ 103,
+ 4,
+ 124,
+ 130,
+ 87,
+ 11,
+ 38,
+ 16,
+ 237,
+ 232,
+ 180,
+ 67,
+ 8,
+ 18,
+ 32,
+ 16,
+ 0,
+ 173,
+ 102,
+ 118,
+ 0,
+ 221,
+ 3,
+ 124,
+ 146,
+ 57,
+ 68,
+ 187,
+ 242,
+ 14,
+ 209,
+ 210,
+ 253,
+ 218,
+ 138,
+ 62,
+ 162,
+ 111,
+ 5,
+ 141,
+ 163,
+ 29,
+ 167,
+ 50,
+ 17,
+ 142,
+ 189,
+ 42,
+ 182,
+ 229,
+ 241,
+ 217,
+ 139,
+ 95,
+ 122,
+ 119,
+ 136,
+ 8,
+ 92,
+ 68,
+ 59,
+ 112,
+ 250,
+ 37,
+ 162,
+ 29,
+ 225,
+ 189,
+ 238,
+ 96,
+ 223,
+ 187,
+ 138,
+ 132,
+ 176,
+ 92,
+ 4,
+ 45,
+ 114,
+ 219,
+ 131,
+ 55,
+ 94,
+ 148,
+ 244,
+ 17,
+ 180,
+ 40,
+ 25,
+ 32,
+ 44,
+ 27,
+ 225,
+ 216,
+ 136,
+ 192,
+ 69,
+ 12,
+ 118,
+ 48,
+ 111,
+ 186,
+ 23,
+ 63,
+ 119,
+ 150,
+ 160,
+ 0,
+ 104,
+ 123,
+ 238,
+ 217,
+ 123,
+ 238,
+ 115,
+ 123,
+ 158,
+ 181,
+ 220,
+ 115,
+ 213,
+ 106,
+ 0,
+ 176,
+ 92,
+ 128,
+ 227,
+ 2,
+ 40,
+ 249,
+ 215,
+ 174,
+ 155,
+ 183,
+ 21,
+ 154,
+ 189,
+ 21,
+ 125,
+ 4,
+ 41,
+ 153,
+ 6,
+ 8,
+ 203,
+ 229,
+ 48,
+ 158,
+ 141,
+ 8,
+ 92,
+ 4,
+ 49,
+ 64,
+ 122,
+ 8,
+ 199,
+ 221,
+ 141,
+ 224,
+ 184,
+ 139,
+ 10,
+ 108,
+ 51,
+ 226,
+ 83,
+ 238,
+ 92,
+ 8,
+ 123,
+ 11,
+ 227,
+ 131,
+ 173,
+ 76,
+ 22,
+ 208,
+ 124,
+ 22,
+ 195,
+ 103,
+ 113,
+ 124,
+ 150,
+ 192,
+ 134,
+ 16,
+ 69,
+ 209,
+ 102,
+ 18,
+ 75,
+ 146,
+ 16,
+ 134,
+ 205,
+ 97,
+ 185,
+ 28,
+ 131,
+ 196,
+ 34,
+ 113,
+ 152,
+ 192,
+ 69,
+ 16,
+ 19,
+ 203,
+ 102,
+ 242,
+ 132,
+ 132,
+ 24,
+ 70,
+ 61,
+ 208,
+ 32,
+ 134,
+ 146,
+ 190,
+ 54,
+ 23,
+ 244,
+ 52,
+ 18,
+ 98,
+ 208,
+ 91,
+ 126,
+ 4,
+ 207,
+ 168,
+ 209,
+ 46,
+ 19,
+ 142,
+ 52,
+ 4,
+ 201,
+ 93,
+ 46,
+ 19,
+ 141,
+ 36,
+ 10,
+ 227,
+ 153,
+ 20,
+ 38,
+ 48,
+ 1,
+ 180,
+ 206,
+ 175,
+ 143,
+ 8,
+ 142,
+ 139,
+ 24,
+ 196,
+ 162,
+ 160,
+ 33,
+ 184,
+ 190,
+ 29,
+ 132,
+ 34,
+ 17,
+ 161,
+ 217,
+ 8,
+ 199,
+ 69,
+ 144,
+ 186,
+ 125,
+ 31,
+ 184,
+ 253,
+ 73,
+ 96,
+ 247,
+ 39,
+ 33,
+ 35,
+ 163,
+ 146,
+ 132,
+ 176,
+ 92,
+ 14,
+ 162,
+ 140,
+ 134,
+ 140,
+ 140,
+ 146,
+ 86,
+ 101,
+ 217,
+ 118,
+ 16,
+ 101,
+ 52,
+ 228,
+ 100,
+ 148,
+ 8,
+ 49,
+ 92,
+ 219,
+ 135,
+ 58,
+ 74,
+ 99,
+ 1,
+ 201,
+ 135,
+ 40,
+ 62,
+ 196,
+ 241,
+ 109,
+ 33,
+ 109,
+ 125,
+ 252,
+ 75,
+ 192,
+ 55,
+ 151,
+ 81,
+ 162,
+ 62,
+ 38,
+ 44,
+ 79,
+ 174,
+ 135,
+ 16,
+ 75,
+ 131,
+ 120,
+ 110,
+ 143,
+ 50,
+ 132,
+ 88,
+ 26,
+ 36,
+ 240,
+ 109,
+ 9,
+ 108,
+ 91,
+ 90,
+ 249,
+ 97,
+ 218,
+ 50,
+ 128,
+ 252,
+ 196,
+ 150,
+ 251,
+ 187,
+ 110,
+ 54,
+ 246,
+ 249,
+ 195,
+ 253,
+ 93,
+ 252,
+ 195,
+ 234,
+ 255,
+ 1,
+ 80,
+ 75,
+ 1,
+ 2,
+ 20,
+ 0,
+ 20,
+ 0,
+ 0,
+ 8,
+ 8,
+ 0,
+ 131,
+ 182,
+ 42,
+ 68,
+ 22,
+ 124,
+ 124,
+ 222,
+ 0,
+ 29,
+ 0,
+ 0,
+ 62,
+ 29,
+ 0,
+ 0,
+ 12,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 97,
+ 114,
+ 105,
+ 97,
+ 108,
+ 95,
+ 50,
+ 52,
+ 46,
+ 112,
+ 110,
+ 103,
+ 80,
+ 75,
+ 1,
+ 2,
+ 20,
+ 0,
+ 20,
+ 0,
+ 0,
+ 8,
+ 8,
+ 0,
+ 131,
+ 182,
+ 42,
+ 68,
+ 158,
+ 64,
+ 172,
+ 29,
+ 120,
+ 6,
+ 0,
+ 0,
+ 95,
+ 61,
+ 0,
+ 0,
+ 12,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 42,
+ 29,
+ 0,
+ 0,
+ 97,
+ 114,
+ 105,
+ 97,
+ 108,
+ 95,
+ 50,
+ 52,
+ 46,
+ 102,
+ 110,
+ 116,
+ 80,
+ 75,
+ 5,
+ 6,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2,
+ 0,
+ 2,
+ 0,
+ 116,
+ 0,
+ 0,
+ 0,
+ 204,
+ 35,
+ 0,
+ 0,
+ 0,
+ 0
+];
diff --git a/image/lib/src/fonts/arial_48.dart b/image/lib/src/fonts/arial_48.dart
index a156382..b7a5244 100755
--- a/image/lib/src/fonts/arial_48.dart
+++ b/image/lib/src/fonts/arial_48.dart
@@ -1,26 +1,18940 @@
import '../bitmap_font.dart';
-/**
- * 48px Arial font for use with [drawString] and [drawChar].
- */
+/// 48px Arial font for use with [drawString] and [drawChar].
final BitmapFont arial_48 = BitmapFont.fromZip(_ARIAL_48);
-const List<int> _ARIAL_48 = const
-[80, 75, 3, 4, 20, 0, 0, 8, 8, 0, 187, 182, 42, 68, 95, 169, 84, 175, 60, 66, 0, 0, 49, 67, 0, 0, 12, 0, 0, 0, 97, 114, 105, 97, 108, 95, 52, 56, 46, 112, 110, 103, 164, 187, 85, 80, 92, 77, 224, 237, 59, 131, 187, 7, 201, 64, 112, 11, 110, 131, 133, 224, 238, 16, 130, 59, 9, 131, 12, 4, 6, 215, 193, 33, 193, 157, 96, 131, 36, 192, 135, 195, 224, 26, 66, 176, 32, 67, 66, 128, 76, 112, 39, 184, 219, 0, 55, 255, 115, 238, 173, 243, 112, 30, 239, 170, 93, 187, 118, 213, 126, 233, 174, 213, 221, 235, 183, 30, 58, 193, 64, 79, 157, 148, 232, 41, 17, 0, 0, 32, 213, 212, 80, 49, 2, 0, 8, 160, 255, 190, 69, 8, 240, 254, 189, 93, 253, 135, 138, 1, 0, 165, 107, 77, 21, 197, 87, 1, 232, 3, 235, 164, 198, 242, 246, 186, 34, 18, 130, 8, 138, 255, 247, 249, 194, 74, 129, 197, 74, 49, 16, 173, 64, 192, 141, 35, 26, 16, 118, 181, 160, 125, 36, 202, 168, 153, 237, 244, 27, 37, 103, 100, 50, 247, 250, 128, 177, 95, 254, 118, 206, 249, 102, 78, 136, 251, 255, 183, 42, 30, 13, 18, 27, 31, 167, 132, 48, 219, 109, 15, 203, 143, 247, 203, 158, 251, 254, 24, 221, 156, 128, 185, 172, 219, 247, 103, 185, 13, 210, 33, 143, 143, 143, 152, 161, 71, 204, 71, 162, 117, 130, 28, 9, 130, 241, 237, 222, 97, 73, 246, 245, 226, 190, 71, 57, 152, 213, 242, 145, 45, 220, 95, 104, 56, 55, 120, 72, 22, 125, 228, 203, 53, 52, 143, 237, 118, 50, 85, 143, 87, 172, 177, 28, 154, 200, 180, 80, 223, 53, 20, 104, 222, 150, 246, 117, 27, 63, 37, 252, 209, 82, 59, 4, 6, 15, 88, 9, 120, 22, 10, 22, 41, 74, 94, 73, 224, 140, 243, 164, 94, 15, 157, 104, 163, 28, 249, 244, 86, 183, 249, 124, 168, 196, 182, 74, 194, 83, 240, 212, 247, 153, 115, 58, 119, 178, 243, 208, 217, 53, 185, 57, 35, 189, 163, 91, 178, 8, 142, 195, 163, 210, 103, 61, 65, 87, 177, 202, 237, 71, 177, 184, 250, 239, 125, 2, 99, 129, 252, 243, 193, 112, 207, 196, 113, 255, 214, 254, 249, 237, 68, 231, 63, 223, 123, 15, 165, 221, 136, 119, 190, 201, 251, 56, 38, 181, 168, 94, 74, 230, 52, 249, 72, 9, 31, 105, 236, 46, 144, 188, 212, 163, 114, 136, 226, 254, 112, 2, 184, 125, 195, 26, 242, 53, 107, 79, 217, 105, 60, 144, 187, 87, 104, 118, 186, 81, 56, 52, 165, 122, 237, 42, 232, 91, 47, 56, 46, 148, 148, 176, 239, 177, 165, 45, 42, 186, 158, 103, 209, 126, 223, 118, 56, 125, 185, 230, 166, 199, 81, 31, 236, 148, 50, 252, 116, 47, 127, 109, 206, 243, 222, 25, 83, 40, 194, 41, 159, 42, 216, 16, 191, 73, 182, 76, 178, 96, 25, 195, 56, 145, 120, 221, 209, 247, 29, 108, 181, 175, 236, 216, 29, 39, 167, 156, 18, 205, 248, 39, 191, 138, 185, 45, 189, 245, 180, 33, 13, 27, 70, 58, 148, 169, 111, 245, 83, 143, 82, 4, 226, 123, 111, 61, 214, 230, 240, 183, 32, 141, 126, 56, 251, 164, 22, 215, 124, 239, 245, 77, 175, 244, 133, 160, 70, 189, 249, 150, 16, 5, 232, 87, 197, 90, 92, 181, 190, 147, 48, 153, 95, 129, 177, 162, 31, 214, 122, 112, 101, 136, 121, 205, 132, 73, 107, 205, 156, 108, 75, 95, 180, 7, 137, 134, 71, 137, 228, 194, 157, 77, 153, 190, 180, 155, 207, 70, 187, 210, 128, 250, 228, 4, 181, 249, 93, 154, 236, 6, 159, 245, 37, 52, 160, 146, 233, 125, 94, 183, 153, 40, 153, 238, 55, 192, 214, 9, 251, 133, 167, 149, 52, 205, 70, 186, 197, 78, 215, 194, 9, 75, 43, 119, 230, 76, 240, 156, 149, 207, 24, 121, 215, 117, 248, 98, 189, 150, 79, 99, 190, 155, 82, 216, 148, 248, 230, 223, 93, 170, 214, 149, 125, 110, 243, 161, 152, 97, 140, 58, 7, 183, 124, 206, 49, 161, 208, 205, 21, 76, 48, 20, 255, 218, 191, 107, 231, 97, 214, 108, 238, 28, 221, 55, 87, 83, 165, 90, 27, 251, 190, 54, 15, 220, 90, 226, 138, 80, 123, 169, 172, 62, 99, 150, 179, 126, 7, 197, 149, 163, 16, 191, 125, 138, 34, 254, 118, 22, 83, 17, 106, 78, 32, 135, 206, 106, 104, 140, 237, 94, 230, 58, 6, 54, 15, 210, 25, 205, 12, 153, 82, 47, 201, 68, 187, 170, 70, 62, 19, 149, 250, 82, 240, 83, 86, 1, 100, 64, 5, 215, 194, 192, 136, 29, 99, 215, 9, 19, 7, 182, 4, 233, 31, 203, 233, 127, 142, 92, 15, 85, 242, 172, 69, 76, 110, 125, 144, 198, 77, 174, 139, 2, 83, 40, 135, 122, 197, 59, 15, 221, 134, 91, 103, 237, 92, 117, 229, 221, 181, 41, 135, 0, 146, 182, 45, 241, 9, 2, 214, 180, 41, 94, 181, 13, 191, 224, 12, 114, 73, 131, 99, 11, 186, 201, 184, 164, 139, 22, 4, 178, 104, 106, 64, 38, 176, 169, 142, 163, 7, 159, 157, 39, 248, 126, 140, 151, 176, 137, 14, 114, 206, 156, 207, 254, 185, 16, 172, 29, 248, 100, 108, 218, 215, 211, 191, 108, 208, 78, 127, 100, 131, 13, 53, 106, 152, 193, 136, 87, 180, 8, 239, 99, 160, 144, 118, 167, 63, 42, 166, 87, 221, 225, 109, 75, 141, 173, 129, 154, 206, 255, 254, 238, 117, 139, 191, 81, 8, 3, 6, 167, 154, 148, 143, 181, 152, 44, 191, 24, 250, 117, 148, 154, 50, 176, 33, 166, 141, 38, 47, 156, 93, 106, 88, 242, 196, 70, 143, 28, 223, 169, 18, 114, 224, 67, 43, 247, 73, 136, 27, 12, 189, 67, 243, 48, 104, 134, 48, 103, 19, 56, 120, 164, 188, 130, 171, 177, 92, 3, 225, 163, 196, 252, 151, 60, 152, 53, 243, 55, 21, 146, 30, 158, 230, 188, 217, 182, 109, 86, 210, 192, 214, 144, 229, 24, 59, 174, 199, 224, 134, 90, 130, 86, 20, 225, 160, 21, 102, 189, 111, 223, 232, 192, 109, 155, 197, 224, 180, 73, 167, 150, 182, 31, 67, 136, 233, 132, 35, 158, 104, 167, 118, 155, 129, 231, 73, 3, 61, 21, 28, 198, 123, 54, 194, 216, 90, 29, 123, 53, 147, 155, 20, 64, 210, 47, 34, 14, 38, 22, 17, 164, 159, 61, 172, 36, 94, 4, 22, 85, 59, 21, 165, 151, 158, 248, 119, 15, 143, 175, 98, 210, 108, 103, 57, 182, 133, 142, 24, 72, 174, 184, 40, 94, 146, 91, 50, 75, 65, 214, 29, 21, 65, 236, 111, 181, 151, 128, 200, 180, 221, 184, 199, 180, 40, 1, 194, 149, 84, 128, 8, 92, 98, 31, 230, 171, 8, 236, 223, 128, 64, 251, 244, 130, 66, 133, 222, 72, 102, 158, 248, 219, 141, 4, 11, 207, 72, 124, 70, 144, 218, 203, 189, 1, 31, 83, 62, 154, 125, 143, 78, 130, 70, 75, 44, 152, 62, 11, 166, 74, 116, 102, 185, 164, 45, 45, 65, 60, 27, 25, 149, 62, 151, 56, 139, 193, 50, 15, 57, 24, 61, 230, 64, 13, 81, 70, 213, 40, 201, 10, 63, 223, 159, 250, 175, 113, 207, 104, 200, 220, 155, 154, 201, 63, 10, 76, 165, 53, 203, 113, 98, 69, 133, 244, 74, 12, 55, 73, 46, 134, 54, 144, 125, 54, 18, 123, 60, 193, 124, 126, 23, 137, 135, 15, 157, 135, 131, 105, 186, 123, 251, 104, 120, 168, 27, 96, 161, 173, 101, 5, 87, 81, 220, 226, 122, 167, 35, 0, 119, 72, 161, 167, 209, 42, 27, 2, 191, 234, 217, 134, 159, 18, 253, 147, 51, 51, 14, 4, 233, 150, 133, 68, 252, 11, 183, 185, 0, 251, 241, 208, 39, 50, 153, 156, 138, 32, 168, 135, 157, 23, 169, 30, 188, 223, 15, 5, 80, 38, 88, 114, 163, 113, 123, 65, 216, 43, 194, 231, 116, 172, 238, 93, 49, 132, 126, 73, 129, 108, 164, 232, 172, 16, 105, 197, 167, 21, 231, 189, 255, 239, 219, 202, 159, 81, 9, 94, 113, 103, 218, 134, 11, 79, 28, 168, 70, 100, 195, 130, 132, 31, 74, 77, 186, 127, 8, 91, 1, 212, 60, 45, 249, 84, 247, 7, 250, 121, 71, 169, 38, 66, 35, 234, 156, 49, 188, 93, 201, 126, 133, 239, 111, 231, 185, 142, 196, 182, 109, 21, 4, 73, 48, 103, 39, 140, 250, 52, 202, 49, 109, 139, 135, 134, 176, 62, 147, 152, 117, 131, 106, 21, 179, 226, 38, 40, 158, 212, 78, 190, 95, 38, 8, 237, 120, 7, 124, 86, 191, 96, 56, 132, 38, 29, 40, 189, 138, 62, 238, 86, 245, 207, 143, 200, 207, 9, 97, 71, 169, 189, 102, 60, 225, 64, 197, 54, 244, 55, 60, 223, 80, 88, 120, 163, 108, 36, 158, 77, 155, 238, 29, 136, 97, 171, 150, 22, 249, 235, 211, 120, 68, 154, 37, 191, 114, 26, 31, 5, 126, 73, 139, 108, 116, 104, 221, 24, 69, 36, 41, 63, 214, 227, 102, 135, 37, 189, 233, 12, 110, 140, 160, 55, 12, 164, 122, 220, 88, 14, 217, 131, 111, 206, 240, 174, 245, 201, 36, 252, 52, 177, 172, 170, 79, 191, 108, 51, 176, 106, 124, 138, 110, 22, 74, 134, 78, 77, 124, 157, 193, 131, 66, 246, 233, 125, 142, 37, 185, 245, 181, 70, 219, 79, 237, 232, 101, 201, 89, 43, 195, 255, 115, 171, 161, 234, 195, 93, 107, 6, 173, 29, 22, 149, 40, 35, 91, 46, 14, 9, 17, 73, 241, 254, 171, 212, 119, 167, 67, 190, 189, 1, 53, 80, 62, 251, 2, 184, 52, 161, 134, 91, 74, 33, 159, 112, 139, 2, 40, 97, 96, 189, 229, 201, 95, 83, 143, 129, 74, 28, 72, 148, 193, 107, 3, 190, 185, 74, 95, 63, 156, 228, 164, 202, 254, 239, 43, 25, 139, 138, 160, 155, 127, 35, 235, 151, 252, 180, 202, 148, 165, 229, 198, 94, 112, 85, 175, 99, 167, 202, 46, 96, 21, 18, 158, 193, 78, 141, 85, 214, 8, 60, 154, 95, 43, 54, 77, 229, 31, 121, 65, 167, 42, 186, 219, 226, 113, 182, 123, 47, 54, 19, 155, 67, 140, 182, 147, 146, 229, 243, 79, 34, 92, 20, 18, 196, 225, 99, 140, 118, 64, 144, 170, 60, 106, 82, 171, 184, 105, 21, 195, 2, 143, 79, 199, 235, 4, 84, 8, 3, 122, 21, 247, 109, 185, 125, 74, 131, 183, 208, 27, 117, 7, 209, 243, 198, 19, 83, 50, 246, 133, 174, 186, 146, 79, 255, 68, 177, 141, 58, 169, 57, 216, 75, 98, 46, 245, 78, 44, 86, 187, 151, 125, 126, 6, 201, 147, 33, 41, 113, 173, 27, 107, 176, 44, 241, 161, 78, 216, 224, 75, 30, 217, 14, 3, 82, 164, 189, 137, 198, 39, 140, 49, 23, 132, 189, 109, 132, 19, 11, 74, 255, 228, 111, 248, 117, 198, 201, 179, 119, 32, 109, 117, 16, 23, 108, 230, 76, 61, 253, 222, 182, 138, 118, 62, 145, 17, 46, 69, 8, 49, 64, 81, 63, 57, 126, 228, 66, 225, 165, 213, 55, 236, 239, 99, 31, 88, 127, 7, 248, 65, 124, 100, 179, 156, 126, 249, 220, 131, 56, 78, 148, 196, 247, 253, 34, 56, 20, 51, 110, 219, 6, 37, 120, 85, 148, 90, 187, 12, 147, 249, 21, 64, 29, 34, 99, 142, 255, 78, 39, 155, 131, 134, 54, 57, 163, 119, 133, 226, 103, 153, 147, 105, 95, 63, 240, 246, 69, 187, 88, 130, 7, 36, 15, 169, 246, 126, 99, 123, 47, 60, 223, 112, 224, 56, 87, 202, 126, 25, 64, 37, 13, 97, 39, 70, 54, 58, 182, 110, 84, 33, 146, 70, 246, 142, 91, 57, 235, 212, 53, 111, 6, 63, 139, 178, 2, 29, 172, 124, 216, 219, 238, 14, 17, 241, 39, 38, 214, 79, 216, 72, 71, 126, 218, 0, 9, 111, 192, 178, 202, 115, 22, 62, 29, 7, 212, 221, 194, 92, 253, 207, 247, 219, 233, 19, 194, 235, 58, 190, 131, 211, 30, 55, 182, 156, 185, 147, 221, 89, 122, 103, 234, 54, 146, 98, 248, 214, 41, 165, 25, 99, 103, 130, 253, 92, 150, 158, 84, 219, 18, 253, 213, 204, 111, 36, 51, 227, 177, 44, 13, 93, 18, 181, 213, 184, 158, 149, 133, 77, 244, 135, 40, 125, 89, 80, 229, 3, 100, 105, 98, 218, 102, 236, 223, 235, 217, 5, 247, 114, 56, 254, 139, 130, 114, 88, 160, 159, 131, 244, 85, 210, 44, 0, 74, 161, 57, 153, 53, 223, 175, 216, 3, 193, 85, 0, 165, 174, 133, 250, 10, 179, 108, 49, 138, 227, 237, 61, 135, 111, 239, 105, 211, 79, 53, 205, 73, 139, 162, 25, 127, 173, 80, 43,
- 52, 250, 120, 146, 161, 219, 105, 31, 130, 85, 234, 182, 95, 81, 0, 56, 3, 226, 7, 245, 134, 25, 167, 162, 1, 97, 106, 27, 61, 84, 20, 63, 213, 164, 56, 160, 52, 72, 184, 46, 207, 131, 141, 217, 254, 211, 24, 60, 79, 35, 174, 75, 44, 24, 198, 89, 88, 35, 0, 232, 71, 255, 133, 172, 234, 46, 173, 244, 177, 40, 96, 203, 5, 65, 202, 3, 252, 73, 224, 78, 234, 114, 214, 190, 130, 29, 241, 69, 223, 119, 128, 158, 35, 2, 139, 42, 213, 29, 203, 134, 100, 160, 20, 52, 215, 138, 68, 59, 51, 28, 29, 138, 135, 37, 11, 3, 251, 204, 100, 174, 7, 124, 61, 245, 9, 81, 48, 54, 26, 98, 30, 105, 194, 62, 17, 123, 89, 172, 227, 137, 57, 79, 182, 222, 30, 75, 154, 75, 114, 243, 238, 48, 127, 157, 249, 158, 119, 166, 211, 119, 135, 71, 133, 111, 88, 211, 204, 200, 240, 143, 236, 130, 101, 185, 48, 157, 191, 20, 65, 157, 71, 156, 0, 208, 98, 33, 102, 144, 32, 183, 153, 184, 234, 85, 122, 26, 33, 122, 68, 192, 187, 81, 17, 68, 217, 247, 116, 143, 145, 78, 55, 58, 172, 188, 255, 44, 31, 85, 65, 164, 3, 186, 142, 99, 164, 198, 7, 244, 230, 30, 253, 33, 100, 234, 203, 252, 216, 199, 217, 199, 44, 90, 209, 154, 101, 22, 121, 133, 106, 100, 45, 81, 207, 225, 145, 194, 201, 224, 211, 151, 86, 253, 3, 82, 4, 41, 39, 180, 72, 215, 78, 211, 13, 123, 118, 61, 20, 54, 181, 35, 177, 188, 75, 103, 75, 226, 235, 51, 198, 23, 55, 1, 45, 84, 29, 44, 135, 161, 63, 62, 207, 149, 179, 116, 150, 107, 173, 230, 161, 162, 10, 220, 152, 58, 184, 33, 248, 196, 191, 159, 19, 162, 227, 251, 23, 143, 163, 147, 173, 232, 69, 91, 137, 207, 219, 254, 251, 142, 151, 206, 92, 144, 135, 219, 173, 176, 145, 19, 28, 205, 109, 58, 30, 102, 5, 115, 222, 222, 214, 63, 99, 180, 245, 30, 254, 253, 29, 166, 51, 54, 66, 204, 255, 122, 101, 174, 107, 20, 128, 156, 214, 14, 111, 217, 142, 59, 217, 215, 38, 155, 186, 149, 254, 250, 8, 21, 102, 186, 196, 249, 183, 94, 83, 146, 42, 200, 168, 10, 13, 114, 240, 7, 232, 196, 101, 161, 225, 207, 252, 93, 39, 233, 122, 218, 121, 46, 13, 149, 214, 164, 185, 222, 15, 163, 201, 28, 100, 155, 81, 204, 226, 97, 241, 200, 183, 116, 129, 10, 222, 60, 203, 242, 153, 227, 254, 176, 101, 224, 166, 66, 35, 218, 22, 115, 213, 121, 94, 211, 195, 161, 64, 223, 151, 119, 215, 206, 229, 138, 40, 195, 169, 33, 30, 185, 40, 170, 92, 28, 199, 93, 47, 98, 53, 161, 51, 153, 151, 134, 21, 155, 54, 225, 153, 77, 180, 69, 47, 39, 28, 191, 230, 70, 81, 242, 134, 0, 64, 169, 207, 78, 190, 54, 188, 234, 105, 82, 39, 115, 145, 252, 145, 160, 125, 136, 212, 94, 146, 180, 32, 68, 82, 138, 3, 65, 84, 221, 147, 79, 134, 232, 164, 198, 196, 149, 143, 131, 237, 79, 92, 27, 208, 158, 46, 138, 77, 92, 197, 52, 90, 86, 203, 120, 232, 126, 11, 38, 46, 70, 2, 218, 112, 77, 38, 168, 224, 14, 161, 214, 59, 22, 83, 150, 68, 180, 211, 139, 1, 207, 2, 65, 133, 253, 72, 174, 212, 254, 59, 37, 56, 107, 51, 77, 99, 14, 79, 174, 183, 2, 40, 10, 190, 13, 118, 249, 65, 97, 190, 60, 173, 245, 86, 43, 10, 156, 220, 247, 251, 83, 48, 214, 174, 2, 91, 42, 125, 204, 169, 218, 19, 69, 201, 18, 227, 111, 192, 67, 78, 38, 17, 158, 142, 49, 29, 154, 131, 167, 234, 84, 13, 66, 213, 105, 54, 7, 165, 107, 42, 8, 182, 223, 228, 161, 21, 146, 72, 124, 116, 233, 76, 41, 0, 203, 151, 22, 24, 58, 40, 235, 235, 30, 179, 189, 64, 157, 144, 83, 242, 214, 240, 63, 63, 74, 157, 180, 87, 1, 163, 81, 52, 118, 40, 42, 213, 203, 85, 66, 213, 62, 127, 44, 232, 6, 0, 236, 122, 76, 189, 22, 254, 241, 155, 30, 1, 68, 255, 95, 112, 243, 122, 55, 42, 128, 210, 122, 223, 11, 18, 192, 223, 207, 100, 229, 90, 38, 245, 112, 133, 232, 158, 36, 124, 186, 62, 178, 94, 209, 29, 189, 201, 89, 243, 87, 41, 174, 125, 239, 204, 181, 250, 140, 31, 109, 166, 34, 218, 234, 143, 3, 181, 59, 201, 158, 110, 11, 6, 2, 194, 103, 185, 76, 211, 36, 172, 34, 66, 139, 93, 247, 133, 216, 96, 150, 147, 69, 132, 208, 69, 14, 224, 153, 214, 133, 169, 230, 59, 44, 99, 242, 228, 241, 16, 108, 98, 100, 218, 216, 197, 187, 171, 170, 217, 78, 97, 167, 10, 199, 195, 77, 150, 64, 255, 146, 181, 254, 207, 19, 212, 236, 83, 201, 137, 102, 33, 29, 59, 177, 240, 99, 115, 118, 20, 180, 106, 205, 62, 195, 210, 61, 148, 104, 51, 18, 252, 50, 98, 178, 5, 248, 169, 119, 158, 135, 201, 79, 18, 18, 133, 234, 105, 198, 133, 191, 88, 179, 62, 111, 34, 187, 99, 57, 35, 195, 234, 208, 97, 2, 236, 85, 117, 63, 238, 46, 251, 177, 169, 55, 17, 108, 77, 219, 244, 1, 71, 138, 207, 93, 43, 53, 215, 136, 177, 207, 10, 147, 46, 212,
- 203, 50, 75, 202, 109, 95, 81, 34, 27, 53, 97, 129, 105, 211, 49, 100, 235, 230, 135, 64, 18, 182, 162, 165, 242, 32, 61, 67, 227, 181, 25, 7, 90, 98, 121, 147, 84, 249, 120, 134, 187, 37, 134, 63, 169, 54, 29, 111, 97, 171, 22, 187, 28, 227, 166, 251, 239, 149, 89, 217, 77, 133, 216, 206, 172, 165, 189, 177, 18, 5, 52, 136, 249, 127, 200, 238, 92, 169, 172, 86, 224, 65, 28, 231, 240, 184, 82, 21, 104, 233, 153, 171, 6, 211, 220, 24, 56, 212, 28, 54, 39, 229, 159, 31, 186, 115, 81, 113, 247, 137, 205, 246, 43, 130, 34, 253, 43, 176, 194, 74, 78, 157, 24, 152, 88, 120, 251, 182, 146, 227, 242, 49, 107, 145, 108, 222, 5, 164, 78, 100, 11, 88, 98, 223, 115, 55, 119, 184, 6, 119, 9, 105, 215, 227, 34, 129, 37, 47, 234, 173, 184, 31, 75, 16, 73, 230, 132, 4, 232, 92, 194, 37, 181, 116, 187, 142, 253, 11, 188, 17, 27, 246, 212, 159, 122, 210, 57, 242, 78, 56, 138, 156, 146, 68, 55, 75, 252, 115, 175, 71, 136, 73, 69, 83, 4, 207, 122, 152, 54, 36, 1, 15, 131, 14, 16, 242, 25, 85, 170, 74, 89, 61, 182, 149, 219, 38, 41, 17, 197, 29, 45, 15, 7, 89, 167, 195, 159, 3, 45, 225, 225, 132, 16, 71, 101, 34, 44, 232, 144, 172, 57, 46, 61, 62, 52, 254, 34, 83, 195, 244, 23, 30, 20, 16, 20, 54, 21, 242, 136, 195, 145, 133, 68, 144, 66, 129, 169, 196, 232, 249, 84, 39, 15, 183, 111, 198, 9, 212, 2, 179, 65, 162, 239, 50, 200, 18, 140, 57, 173, 147, 110, 232, 50, 15, 212, 140, 24, 149, 221, 255, 56, 124, 202, 175, 205, 152, 58, 34, 66, 43, 172, 153, 125, 24, 32, 145, 101, 229, 147, 99, 249, 26, 240, 114, 176, 216, 250, 52, 108, 110, 158, 90, 41, 214, 249, 219, 11, 21, 120, 138, 74, 8, 95, 143, 94, 163, 42, 224, 247, 22, 19, 12, 183, 211, 193, 254, 240, 9, 8, 89, 242, 11, 151, 28, 11, 234, 94, 80, 192, 78, 97, 58, 145, 120, 47, 148, 45, 169, 210, 191, 231, 182, 117, 6, 82, 62, 130, 185, 172, 140, 228, 32, 40, 158, 241, 43, 70, 249, 167, 69, 129, 31, 22, 180, 63, 21, 164, 207, 61, 216, 96, 78, 72, 127, 70, 104, 8, 186, 15, 122, 151, 143, 59, 208, 249, 81, 56, 243, 35, 214, 163, 36, 222, 97, 163, 136, 163, 88, 184, 118, 159, 248, 221, 51, 179, 92, 104, 131, 109, 238, 232, 30, 253, 215, 238, 252, 99, 133, 188, 46, 38, 212, 16, 43, 210, 196, 115, 206, 19, 210, 237, 111, 223, 45, 126, 68, 183, 37, 140, 215, 25, 101, 75, 124, 154, 145, 77, 149, 250, 228, 248, 247, 135, 208, 106, 200, 109, 110, 187, 40, 13, 0, 170, 35, 253, 32, 119, 138, 73, 21, 75, 137, 46, 150, 100, 248, 195, 237, 165, 75, 123, 42, 64, 52, 63, 45, 244, 166, 16, 199, 162, 249, 155, 6, 183, 127, 122, 46, 104, 245, 222, 166, 42, 206, 47, 150, 252, 121, 19, 185, 194, 139, 152, 97, 161, 126, 39, 63, 236, 173, 106, 34, 244, 136, 161, 90, 180, 178, 125,
- 210, 107, 34, 149, 213, 22, 9, 30, 163, 214, 5, 105, 136, 34, 40, 30, 129, 28, 240, 93, 98, 66, 150, 4, 75, 102, 102, 190, 237, 133, 141, 75, 113, 54, 16, 164, 111, 89, 126, 30, 191, 76, 40, 79, 165, 209, 201, 22, 71, 50, 250, 124, 22, 94, 109, 19, 77, 183, 180, 222, 146, 73, 67, 36, 233, 44, 118, 16, 23, 147, 226, 135, 95, 24, 250, 249, 31, 83, 43, 128, 10, 113, 94, 41, 238, 252, 86, 75, 141, 102, 206, 5, 67, 240, 2, 170, 183, 19, 53, 7, 190, 166, 237, 28, 71, 211, 116, 221, 25, 181, 98, 153, 253, 89, 84, 40, 118, 136, 65, 125, 89, 89, 68, 236, 179, 139, 46, 211, 255, 142, 42, 248, 57, 147, 209, 175, 110, 86, 75, 100, 56, 115, 69, 41, 222, 237, 43, 66, 181, 30, 97, 80, 205, 99, 226, 24, 158, 21, 86, 105, 238, 0, 22, 149, 209, 146, 134, 40, 143, 151, 117, 161, 108, 43, 73, 209, 4, 240, 58, 122, 209, 165, 62, 107, 184, 138, 226, 187, 166, 35, 190, 54, 192, 72, 82, 10, 91, 24, 174, 109, 126, 71, 47, 59, 29, 137, 181, 134, 254, 161, 78, 191, 86, 3, 214, 40, 100, 219, 214, 172, 120, 220, 170, 24, 104, 254, 97, 232, 29, 121, 19, 6, 241, 207, 55, 228, 44, 156, 182, 220, 14, 73, 0, 83, 101, 141, 170, 151, 129, 88, 243, 109, 245, 6, 237, 174, 18, 39, 170, 75, 116, 166, 72, 65, 165, 32, 55, 127, 136, 246, 11, 237, 155, 57, 23, 211, 202, 17, 164, 186, 252, 252, 88, 80, 198, 23, 141, 128, 57, 161, 238, 186, 91, 87, 152, 47, 190, 35, 73, 122, 159, 181, 247, 126, 207, 15, 90, 13, 253, 36, 161, 204, 164, 248, 138, 189, 129, 120, 55, 226, 250, 222, 201, 160, 193, 143, 2, 198, 173, 234, 159, 72, 131, 190, 123, 128, 200, 208, 215, 115, 197, 180, 0, 191, 143, 153, 2, 172, 152, 19, 9, 67, 124, 37, 217, 212, 207, 174, 26, 26, 97, 154, 33, 222, 50, 48, 129, 184, 2, 236, 128, 196, 16, 141, 175, 191, 86, 223, 211, 135, 195, 157, 214, 155, 194, 147, 182, 82, 103, 77, 108, 11, 96, 50, 115, 213, 117, 28, 119, 236, 23, 150, 181, 95, 18, 242, 20, 208, 54, 110, 71, 68, 145, 224, 249, 56, 126, 6, 47, 6, 191, 157, 170, 164, 128, 97, 5, 35, 63, 228, 10, 124, 80, 118, 171, 160, 192, 103, 32, 118, 155, 113, 136, 56, 225, 171, 144, 33, 34, 227, 61, 208, 155, 82, 56, 226, 118, 5, 169, 234, 175, 162, 161, 47, 226, 193, 104, 144, 130, 189, 154, 159, 156, 102, 73, 103, 59, 205, 125, 58, 183, 214, 231, 31, 229, 79, 164, 216, 241, 111, 249, 202, 252, 34, 230, 249, 52, 87, 21, 183, 132, 190, 230, 86, 0, 101, 224, 58, 98, 227, 73, 66, 50, 210, 117, 184, 29, 197, 230, 249, 240, 161, 194, 203, 181, 2, 165, 111, 74, 199, 231, 53, 207, 120, 60, 107, 245, 38, 36, 232, 71, 7, 11, 20, 252, 183, 176, 148, 241, 158, 127, 33, 26, 233, 217, 18, 255, 65, 71, 135, 44, 121, 39, 248, 129, 67, 73, 63, 100, 142, 29, 227, 223, 179, 221, 221, 146, 41, 162, 248, 35, 60, 3, 225, 12, 188, 111, 33, 184, 120, 24, 216, 40, 3, 190, 203, 196, 54, 22, 154, 202, 107, 229, 101, 83, 189, 75, 117, 73, 121, 251, 189, 101, 66, 35, 219, 220, 247, 72, 65, 54, 211, 80, 52, 216, 52, 45, 218, 13, 159, 165, 16, 1, 157, 24, 95, 73, 96, 38, 140, 81, 82, 189, 188, 36, 235, 215, 152, 184, 55, 57, 173, 121, 179, 74, 26, 244, 248, 218, 177, 247, 136, 4, 221, 128, 229, 62, 179, 194, 141, 131, 20, 177, 216, 129, 42, 168, 69, 161, 30, 25, 189, 137, 225, 5, 215, 241, 169, 101, 147, 144, 36, 245, 100, 91, 211, 248, 122, 58, 181, 200, 82, 197, 116, 111, 147, 255, 241, 250, 124, 193, 223, 50, 146, 141, 32, 92, 135, 20, 239, 150, 6, 133, 151, 238, 134, 174, 13, 20, 248, 54, 12, 175, 179, 193, 13, 62, 193, 77, 178, 38, 14, 193, 158, 133, 74, 174, 73, 254, 247, 39, 158, 151, 64, 230, 173, 85, 70, 228, 11, 55, 155, 118, 245, 222, 30, 173, 225, 90, 0, 116, 28, 15, 95, 27, 203, 56, 199, 47, 109, 249, 196, 126, 108, 154, 233, 53, 130, 180, 223, 25, 66, 188, 127, 246, 54, 211, 54, 27, 80, 134, 88, 155, 211, 139, 16, 167, 239, 52, 50, 114, 55, 215, 170, 119, 115, 185, 253, 163, 8, 162, 99, 126, 251, 250, 120, 87, 48, 77, 183, 63, 153, 196, 42, 12, 231, 124, 129, 37, 81, 44, 71, 203, 13, 253, 109, 124, 242, 60, 53, 241, 147, 207, 237, 183, 89, 247, 129, 144, 147, 200, 81, 188, 84, 242, 163, 79, 157, 207, 26, 190, 68, 172, 36, 240, 42, 227, 31, 12, 96, 86, 63, 118, 204, 21, 227, 161, 231, 197, 214, 215, 228, 188, 88, 156, 89, 49, 49, 210, 148, 223, 37, 213, 94, 14, 233, 132, 56, 254, 183, 170, 46, 226, 59, 66, 222, 144, 215, 196, 5, 210, 154, 241, 136, 151, 203, 154, 165, 69, 159, 5, 153, 195, 181, 40, 250, 186, 248, 58, 252, 121, 127, 55, 197, 55, 2, 153, 27, 173, 24, 51, 176, 209, 82, 153, 127, 66, 20, 125, 132, 134, 217, 174, 24, 157, 41, 175, 31, 48, 213, 88, 246, 241, 231, 142, 47, 196, 76, 162, 123, 233, 91, 127, 57, 96, 210, 126, 63, 211, 34, 70, 167, 150, 218, 167, 121, 146, 63, 69, 13, 177, 98, 168, 145, 179, 195, 237, 74, 229, 71, 178, 196, 57, 182, 223, 41, 16, 103, 203, 87, 29, 120, 151, 194, 79, 231, 188, 72, 176, 204, 13, 57, 199, 29, 134, 124, 165, 126, 148, 119, 100, 177, 225, 4, 232, 90, 18, 208, 83, 17, 94, 239, 111, 84, 190, 123, 6, 171, 179, 82, 239, 252, 169, 102, 176, 115, 36, 84, 174, 1, 242, 198, 90, 228, 97, 55, 70, 20, 3, 144, 172, 88, 165, 64, 183, 172, 78, 246, 214, 117, 169, 247, 253, 207, 36, 41, 219, 185, 155, 94, 121, 179, 101, 213, 24, 203, 176, 178, 113, 155, 7, 127, 251, 160, 224, 49, 30, 25, 204, 65, 56, 71, 17, 116, 246, 93, 35, 214, 21, 14, 86, 170, 243, 200, 217, 89, 223, 43, 162, 225, 39, 17, 240, 7, 168, 185, 30, 212, 199, 58, 11, 164, 30, 145, 116, 64, 248, 246, 15, 44, 35, 193, 252, 64, 144, 196, 53, 33, 16, 42, 78, 27, 243, 170, 159, 182, 77, 233, 177, 89, 253, 252, 195, 185, 143, 6, 17, 82, 36, 203, 198, 121, 227, 60, 192, 50, 168, 158, 114, 113,
- 89, 204, 41, 164, 78, 238, 113, 224, 118, 67, 15, 165, 230, 22, 40, 188, 146, 161, 0, 34, 56, 218, 4, 224, 169, 8, 180, 83, 246, 121, 155, 30, 238, 105, 237, 100, 154, 243, 114, 191, 157, 59, 101, 81, 104, 52, 80, 186, 148, 152, 43, 87, 193,
- 88, 100, 58, 84, 212, 82, 135, 228, 38, 154, 167, 10, 18, 101, 134, 103, 254, 106, 45, 202, 111, 72, 14, 208, 14, 245, 27, 247, 48, 199, 161, 134, 131, 179, 127, 196, 88, 18, 23, 114, 203, 73, 249, 46, 53, 127, 239, 109, 232, 36, 4, 44, 91, 138, 13, 223, 85, 122, 128, 204, 158, 93, 167, 83, 63, 0, 89, 156, 95, 136, 61, 222, 2, 100, 246, 71, 5, 127, 37, 164, 77, 183, 196, 30, 15, 223, 225, 204, 75, 18, 144, 181, 93, 204, 130, 143, 124, 132, 111, 48, 63, 173, 138, 231, 205, 231, 11, 62, 88, 9, 209, 134, 131, 242, 152, 230, 68, 80, 120, 107, 196, 26, 176, 82, 1, 240, 179, 85, 66, 127, 94, 148, 174, 15, 64, 127, 173, 186, 71, 22, 194, 94, 129, 167, 114, 61, 198, 199, 190, 220, 215, 135, 57, 83, 225, 95, 6, 213, 2, 47, 146, 192, 15, 127, 152, 66, 38, 228, 22, 42, 199, 19, 148, 111, 158, 249, 182, 201, 41, 208, 145, 13, 249, 57, 133, 83, 29, 139, 12, 88, 11, 109, 253, 8, 174, 0, 168, 196, 88, 21, 82, 147, 202, 36, 21, 199, 236, 201, 138, 208, 82, 12, 199, 155, 192, 239, 108, 48, 51, 133, 47, 233, 50, 95, 179, 11, 63, 117, 180, 31, 114, 193, 5, 78, 242, 85, 37, 68, 130, 235, 142, 100, 34, 40, 84, 228, 89, 164, 207, 178, 12, 42, 75, 217, 10, 145, 118, 163, 190, 207, 169, 66, 126, 112, 80, 132, 204, 41, 157, 217, 217, 211, 240, 194, 223, 15, 181, 179, 192, 174, 41, 225, 132, 138, 160, 30, 133, 183, 110, 112, 240, 56, 209, 222, 244, 206, 67, 67, 38, 181, 219, 43, 247, 121, 225, 123, 199, 136, 49, 61, 150, 188, 178, 8, 29, 50, 194, 105, 244, 122, 95, 173, 33, 204, 162, 69, 158, 18, 57, 253, 46, 66, 22, 206, 62, 73, 164, 32, 101, 23, 237, 230, 128, 23, 156, 45, 18, 38, 64, 238, 79, 217, 23, 101, 240, 36, 147, 205, 237, 143, 101, 93, 173, 240, 138, 152, 114, 29, 214, 165, 253, 155, 29, 166, 36, 247, 108, 60, 168, 56, 111, 88, 139, 224, 126, 120, 223, 209, 245, 144, 247, 190, 177, 105, 149, 112, 102, 55, 254, 201, 87, 69, 80, 254, 27, 145, 84, 214, 179, 63, 171, 93, 178, 144, 40, 230, 254, 62, 204, 252, 97, 2, 38, 186, 71, 254, 169, 85, 154, 183, 249, 7, 221, 189, 112, 54, 110, 145, 89, 70, 185, 81, 158, 110, 115, 255, 183, 251, 198, 163, 9, 255, 80, 61, 31, 119, 94, 218, 255, 33, 230, 98, 52, 21, 136, 190, 22, 69, 227, 95, 178, 98, 39, 212, 159, 110, 33, 72, 155, 141, 91, 227, 83, 192, 207, 3, 155, 29, 95, 72, 82, 121, 57, 240, 225, 166, 176, 220, 149, 200, 93, 124, 184, 121, 52, 30, 8, 71, 39, 94,
- 50, 239, 217, 136, 19, 132, 28, 63, 215, 124, 227, 196, 100, 230, 70, 158, 148, 151, 198, 7, 117, 84, 115, 230, 214, 27, 120, 218, 229, 176, 101, 181, 162, 242, 160, 150, 69, 222, 0, 128, 2, 238, 80, 180, 232, 163, 135, 87, 251, 134, 187, 14, 154, 64, 170, 235, 63, 123, 104, 24, 252, 141, 91, 157, 205, 72, 7, 26, 17, 73, 66, 203, 90, 125, 121, 250, 17, 35, 119, 54, 220, 179, 246, 118, 22, 222, 39, 20, 244, 54, 115, 100, 75, 98, 89, 249, 230, 85, 21, 25, 57, 150, 180, 69, 222, 109, 16, 103, 107, 104, 204, 249, 42, 238, 248, 79, 78, 76, 150, 65, 134, 126, 66, 136, 48, 223, 92, 241, 191, 67, 198, 217, 22, 12, 252, 8, 50, 114, 99, 184, 176, 30, 180, 240, 16, 20, 21, 173, 63, 66, 13, 49, 51, 3, 208, 185, 36, 0, 124, 197, 157, 46, 254, 132, 40, 119, 211, 69, 123, 123, 231, 109, 170, 91, 198, 213, 117, 78, 255, 144, 87, 2, 234, 37, 245, 186, 161, 44, 123, 5, 33, 37, 140, 92, 109, 236, 203, 149, 181, 25, 42, 67, 45, 50, 175, 189, 52, 94, 219, 108, 226, 142, 75, 209, 251, 254, 124, 74, 201, 143, 226, 38, 82, 161, 47, 33, 88, 255, 24, 97, 89, 218, 30, 35, 19, 105, 232, 103, 177, 148, 136, 92, 182, 107, 93, 151, 176, 215, 89, 187, 207, 192, 186, 159, 210, 61, 52, 193, 134, 190, 3, 130, 72, 190, 222, 73, 70, 128, 199, 157, 62, 222, 49, 213, 70, 180, 225, 93, 11, 95, 10, 209, 164, 142, 154, 176, 216, 222, 125, 161, 43, 124, 183, 200, 140, 143, 86, 216, 122, 41, 178, 153, 251, 199, 219, 251, 243, 18, 57, 14, 183, 216, 201, 196, 75, 74, 241, 205, 133, 102, 73, 214, 224, 12, 246, 96, 126, 117, 186, 92, 103, 50, 173, 222, 156, 107, 242, 79, 233, 247, 39, 219, 61, 193, 125, 164, 62, 166, 100, 16, 246, 192, 36, 198, 38, 63, 19, 125, 243, 44, 254, 23, 21, 0, 222, 98, 34, 52, 28, 240, 106, 246, 202, 214, 38, 100, 227, 243, 86, 200, 50, 41, 146, 242, 132, 12, 100, 30, 244, 87, 13, 53, 148, 91, 38, 6, 40, 148, 113, 185, 215, 215, 5, 166, 238, 9, 193, 224, 182, 159, 168, 104, 36, 124, 76, 162, 187, 140, 125, 9, 255, 248, 127, 199, 16, 239, 101, 196, 124, 151, 111, 180, 115, 126, 206, 158, 127, 37, 130, 32, 117, 242, 172, 145, 185, 211, 208, 227, 80, 175, 234, 35, 186, 30, 16, 216, 204, 31, 60, 183, 62, 53, 247, 247, 17, 187, 127, 188, 79, 13, 220, 239, 189, 155, 52, 88, 194, 39, 232, 31, 209, 25, 104, 90, 23, 193, 150, 119, 157, 251, 171, 64, 10, 137, 154, 207, 215, 101, 183, 84, 248, 146, 73, 202, 51, 50, 205, 185, 237, 92, 133, 5, 232, 159, 19, 115, 228, 79, 249, 139, 243, 165, 177, 186, 160, 163, 111, 150, 206, 140, 122, 215, 229, 110, 200, 110, 124, 61, 106, 246, 108, 23, 145, 244, 103, 216, 127, 135, 68, 51, 78, 154, 150, 224, 121, 137, 182, 223, 128, 233, 94, 252, 87, 42, 1, 229, 109, 91, 223, 163, 201, 134, 52, 69, 3, 219, 191, 237, 55, 222, 16, 126, 137, 27, 132, 48, 164, 108, 115, 11, 35, 101, 29, 6, 3, 80, 16, 24, 188, 235, 130, 3, 199, 101, 153, 195, 88, 32, 142, 163, 23, 89, 20, 44, 178, 62, 44, 206, 17, 152, 1, 136, 79, 79, 60, 71, 31, 221, 119, 155, 123, 217, 183, 117, 204, 129, 190, 13, 108, 21, 109, 182, 189, 45, 128, 149, 230, 139, 227, 43, 113, 83, 242, 186, 62, 15, 14, 149, 73, 24, 192, 110, 225, 118, 183, 116, 68, 217, 44, 2, 28, 52, 57, 24, 217, 100, 32, 200, 219, 127, 79, 64, 34, 148, 216, 162, 201, 152, 109, 129, 32, 197, 106, 104, 196, 30, 96, 21, 65, 146, 161, 237, 18, 79, 98, 110, 157, 234, 96, 197, 98, 126, 213, 74, 221, 56, 13, 95, 132, 187, 201, 208, 194, 175, 163, 255, 225, 198, 87, 160, 217, 147, 160, 53, 190, 83, 189, 10, 205, 8, 61, 9, 69, 16, 182, 152, 97, 165, 82, 203, 103, 212, 14, 92, 76, 148, 130, 176, 37, 21, 37, 36, 93, 91, 26, 236, 148, 15, 3, 208, 96, 115, 127, 241, 136, 161, 87, 115, 71, 238, 242, 150, 140, 184, 167, 48, 81, 155, 170, 206, 240, 167, 171, 108, 89, 215, 232, 243, 40, 252, 179, 142, 253, 178, 189, 234, 228, 0, 13, 123, 115, 188, 118, 94, 45, 42, 13, 41, 99, 180, 43, 195, 147, 167, 68, 36, 213, 36, 235, 195, 245, 160, 48, 140, 254, 96, 182, 151, 254, 27, 3, 68, 82, 2, 246, 60, 95, 110, 57, 132, 248, 236, 34, 155, 231, 121, 178, 126, 94, 248, 23, 137, 126, 189, 31, 146, 145, 125, 203, 235, 19, 181, 78, 141, 215, 27, 216, 255, 96, 16, 151, 220, 251, 48, 140, 110, 48, 132, 216, 49, 57, 152, 237, 164, 77, 99, 139, 38, 198, 84, 86, 244, 10, 184, 111, 20, 13, 239, 24, 194, 18, 237, 19, 61, 216, 182, 33, 202, 20, 248, 149, 146, 238, 59, 23, 9, 142, 199, 154, 229, 200, 18, 64, 160, 198, 94, 42, 190, 175, 145, 107, 91, 31, 30, 152, 169, 192, 102, 215, 219, 173, 237, 215, 122, 18, 240, 121, 117, 231, 35, 129, 255, 171, 93, 2, 102, 151, 231, 230, 238, 9, 137, 198, 231, 146, 117, 85, 81, 224, 253, 57, 113, 97, 69, 147, 76, 193, 93, 178, 223, 251, 4, 203, 157, 41, 199, 38, 254, 161, 107, 191, 251, 91, 228, 199, 66, 182, 194, 18, 139, 127, 101, 1, 232, 167, 12, 62, 144, 115, 32, 146, 8, 252, 141, 239, 161, 43, 196, 77, 117, 97, 106, 33, 2, 117, 19, 16, 145, 84, 39, 140, 237, 240, 221, 50, 167, 211, 198, 79, 5, 208, 171, 36, 54, 49, 249, 5, 91, 76, 188, 222, 94, 156, 217, 81, 222, 27, 1, 169, 182, 124, 54, 44, 41, 118, 71, 115, 210, 148, 111, 242, 245, 223, 180, 118, 59, 99, 78, 243, 216, 167, 33, 43, 28, 249, 142, 209, 178, 74, 164, 67, 210, 87, 120, 157, 105, 108, 220, 87, 193, 221, 66, 184, 183, 32, 105, 17, 79, 69, 212, 16, 11, 147, 213, 251, 236, 245, 14, 1, 108, 36, 37, 219, 130, 23, 66, 29, 171, 188, 113, 38, 146, 23, 27, 236, 142, 129, 14, 184, 252, 195, 215, 29, 125, 121, 30, 134, 89, 219, 48, 107, 129, 33, 167, 154, 175, 207, 78, 140, 245, 114, 97, 173, 27, 137, 139, 165, 20, 66, 184, 238, 194, 84, 211, 100, 232, 6, 195, 127, 150, 34, 152, 78, 164, 199, 186, 248, 170, 110, 58, 163, 169, 171, 83, 253, 69, 43, 53, 74, 156, 90, 100, 200, 181, 62, 2, 253, 162, 137, 210, 51, 32, 143, 137, 131, 63, 152, 191, 184, 199, 126, 189, 83, 253, 125, 92, 9, 9, 228, 213, 224, 249, 88, 132, 135, 51, 203, 168, 90, 171, 126, 29, 148, 43, 157, 145, 34, 241, 101, 150, 92, 189, 72, 67, 165, 166, 67, 33, 3, 139, 80, 72, 27, 165, 70, 129, 46, 212, 7, 66, 83, 185, 119, 150, 67, 61, 151, 113, 145, 134, 84, 13, 134, 81, 197, 84, 48, 99, 219, 180, 72, 107, 242, 236, 245, 112, 182, 23, 83, 46, 21, 58, 17, 224, 108, 139, 91, 17, 147, 130, 214, 37, 55, 200, 18, 188, 239, 36, 247, 134, 206, 2, 91, 231, 165, 179, 139, 200, 229, 171, 227, 222, 150, 189, 161, 138, 8, 112, 170, 213, 184, 107, 191, 101, 143, 95, 119, 21, 135, 32, 139, 165, 88, 153, 70, 39, 199, 82, 199, 214, 117, 54, 22, 179, 204, 231, 83, 190, 236, 81, 243, 193, 56, 79, 106, 153, 202, 118, 161, 168, 16, 83, 28, 2, 103, 0, 15, 207, 50, 13, 118, 92, 203, 167, 222, 81, 171, 184, 254, 130, 187, 17, 222, 78, 239, 126, 166, 163, 31, 111, 216, 215, 152, 92, 27, 4, 241, 190, 38, 60, 114, 175, 89, 243, 1, 131, 126, 243, 247, 155, 104, 96, 208, 47, 156, 172, 131, 135, 142, 58, 201, 168, 215, 243, 38, 33, 33, 158, 248, 232, 246, 145, 153, 241, 60, 203, 209, 19, 131, 192, 28, 156, 202, 232, 78, 191, 83, 147, 230, 160, 3, 255, 246, 222, 28, 55, 83, 224, 141, 25, 197, 226, 221, 58, 254, 102, 98, 66, 223, 125, 103, 226, 209, 173, 164, 92, 182, 208, 224, 198, 50, 1, 178, 241, 29, 48, 90, 97, 194, 133, 50, 68, 221, 40, 223, 138, 228, 226, 251, 48, 28, 204, 239, 174, 52, 222, 125, 218, 33, 14, 193, 78, 229, 37, 166, 56, 179, 243, 34, 101, 62, 78, 214, 52, 98, 167, 216, 16, 253, 116, 185, 65, 220, 28, 216, 159, 171, 94, 162, 115, 104, 22, 106, 213, 72, 94, 166, 168, 91, 9, 60, 93, 177, 165, 60, 36,
- 155, 97, 185, 41, 19, 16, 173, 163, 49, 29, 51, 29, 78, 174, 79, 200, 224, 220, 142, 16, 28, 198, 211, 153, 211, 252, 108, 96, 53, 24, 44, 139, 215, 28, 254, 41, 178, 252, 41, 130, 244, 128, 176, 44, 190, 173, 128, 92, 98, 120, 74, 87, 43, 27, 204, 159, 233, 205, 134, 35, 31, 19, 27, 73, 148, 28, 60, 57, 15, 35, 62, 209, 128, 247, 9, 111, 173, 33, 146, 108, 201, 208, 26, 251, 182, 79, 22, 189, 232, 235, 210, 126, 75, 243, 112, 29, 190, 12, 249, 55, 34, 97, 20, 140, 77, 81, 134, 112, 56, 138, 22, 41, 168, 184, 126, 244, 138, 42, 182, 225, 143, 180, 105, 89, 185, 30, 167, 59, 195, 81, 81, 21, 78, 176, 120, 123, 120, 14, 79, 43, 201, 80, 43, 44, 245, 90, 4, 206, 148, 202, 21, 200, 14, 255, 76, 54, 190, 28, 201, 177, 226, 175, 56, 32, 244, 240, 159, 78, 140, 34, 8, 245, 160, 171, 182, 87, 120, 123, 145, 216, 33, 56, 30, 93, 206, 179, 155, 43, 179, 26, 184, 190, 52, 11, 224, 151, 199, 66, 42, 238, 240, 100, 68, 90, 186, 252, 214, 236, 145, 127, 94, 175, 1, 220, 159, 135, 172, 134, 83, 41, 12, 42, 238, 9, 205, 101, 179, 219, 47, 228, 194, 124, 105, 91, 95, 175, 23, 6, 113, 72, 168, 87, 75, 72, 57, 81, 119, 37, 27, 131, 162, 108, 150, 27, 149, 110, 50, 126, 156, 255, 43, 242, 188, 21, 8, 250, 240, 165, 80, 1, 57, 105, 238, 206, 143, 28, 167, 122, 155, 96, 37, 150, 17, 27, 182, 203, 15, 1, 195, 114, 198, 240, 18, 148, 186, 101, 66, 99, 204, 15, 81, 21, 142, 170, 46, 198, 151, 57, 88, 60, 44, 210, 246, 52, 209, 60, 32, 180, 246, 38, 207, 91, 31, 187, 120, 121, 253, 252, 207, 91, 116, 84, 152, 60, 156, 218, 5, 213, 232, 62, 73, 47, 119, 74, 67, 41, 16, 213, 212, 71, 160, 0, 252, 132, 188, 111, 41, 90, 202, 84, 146, 102, 178, 49, 231, 218, 23, 55, 48, 171, 101, 202, 31, 14, 102, 43, 187, 211, 99, 203, 145, 112, 190, 246, 192, 142, 27, 230, 120, 57, 248, 38, 49, 95, 193, 121, 82, 137, 137, 248, 208, 80, 16, 194, 78, 84, 111, 167, 116, 110, 196, 119, 253, 172, 66, 131, 49, 113, 243, 234, 31, 2, 170, 186, 250, 167, 75, 8, 17, 162, 227, 241, 152, 132, 201, 139, 240, 190, 24, 229, 29, 189, 241, 237, 53, 130, 131, 105, 217, 89, 86, 76, 163, 65, 228, 86, 208, 112, 230, 39, 76, 137, 60, 118, 241, 253, 217, 225, 230, 199, 147, 87, 82, 169, 161, 139, 130, 146, 82, 251, 233, 237, 234, 63, 3, 211, 170, 214, 177, 104, 67, 28, 176, 25,
- 115, 137, 255, 3, 66, 113, 146, 78, 149, 169, 52, 127, 243, 228, 164, 235, 68, 209, 200, 97, 83, 134, 208, 245, 200, 26, 88, 14, 10, 253, 114, 224, 253, 194, 29, 138, 247, 85, 210, 162, 44, 203, 56, 126, 24, 0, 242, 103, 88, 242, 199, 129, 2, 68, 229, 92, 178, 196, 179, 32, 163, 154, 11, 148, 167, 178, 20, 177, 158, 226, 6, 91, 191, 128, 182, 113, 141, 97, 172, 63, 121, 203, 22, 45, 165, 62, 73, 159, 41, 97, 69, 207, 92, 89, 144, 156, 191, 73, 35, 0, 94, 190, 83, 115, 18, 43, 167, 26, 63, 89, 14, 78, 118, 254, 240, 111, 79, 115, 20, 2, 123, 103, 105, 85, 80, 0, 161, 183, 173, 191, 244, 113, 254, 126, 251, 35, 41, 70, 181, 167, 60, 217, 78, 52, 211, 52, 199, 179, 19, 111, 124, 198, 161, 187, 59, 64, 193, 189, 107, 75, 175, 78, 161, 117, 36, 212, 106, 11, 127, 188, 189, 216, 195, 187, 181, 84, 4, 17, 246, 199, 154, 43, 97, 222, 162, 98, 181, 114, 176, 253, 106, 26, 79, 229, 203, 214, 62, 102, 170, 36, 54, 89, 70, 48, 100, 169, 102, 252, 242, 174, 79, 145, 195, 166, 126, 53, 242, 132, 44, 88, 247, 142, 130, 154, 233, 9, 66, 196, 182, 30, 165, 115, 207, 182, 104, 14, 95, 172, 250, 48, 242, 201, 224, 219, 17, 39, 209, 81, 209, 148, 128, 77, 40, 1, 164, 108, 244, 188, 250, 114, 225, 58, 253, 253, 157, 81, 8, 255, 136, 172, 207, 66, 251, 172, 217, 225, 150, 85, 96, 195, 121, 179, 190, 230, 122, 237, 231, 7, 221, 145, 139, 220, 239, 219, 31, 235, 232, 140, 222, 117, 210, 32, 13, 155, 16, 184, 131, 202, 178, 94, 2, 96, 191, 255, 78, 252, 117, 251, 245, 212, 198, 187, 126, 37, 87, 192, 123, 110, 198, 66, 150, 141, 64, 44, 38, 99, 135, 223, 226, 172, 76, 47, 13, 194, 152, 112, 112, 175, 101, 21, 64, 196, 206, 33, 26, 189, 111, 210, 198, 116, 241, 232, 155, 237, 79, 183, 232, 156, 67, 20, 14, 19, 97, 6, 1, 122, 181, 17, 64, 8, 59, 207, 172, 89, 173, 118, 50, 102, 55, 121, 243, 69, 77, 68, 112, 65, 119, 205, 160, 188, 47, 74, 77, 26, 165, 230, 228, 19, 255, 106, 107, 167, 36, 64, 215, 98, 253, 47, 0, 225, 250, 213, 220, 82, 213, 61, 100, 114, 177, 109, 196, 140, 214, 99, 137, 98, 141, 225, 16, 104, 35, 40, 204, 225, 104, 235, 77, 230, 37, 73, 104, 64, 134, 60, 42, 51, 96, 118, 117, 85, 1, 209, 33, 27, 55, 240, 214, 140, 80, 177, 107, 175, 190, 106, 113, 122, 144, 124, 193, 89, 141, 225, 210, 194, 29, 73, 239, 151, 48, 225, 1, 12, 201, 63, 62, 215, 48, 92, 118, 113, 228, 141, 224, 98, 203, 28, 20, 124, 149, 252, 86, 77, 155, 24, 61, 2, 116, 207, 20, 237, 246, 36, 66, 11, 167, 17, 142, 36, 76, 137, 100, 142, 111, 216, 235, 239, 212, 153, 159, 36, 189, 147, 132, 96, 127, 148, 116, 232, 119, 38, 174, 16, 167, 70, 78, 187, 21, 13, 3, 192, 211, 43, 201, 102, 112, 125, 240, 198, 162, 92, 84, 28, 54, 197, 117, 149, 222, 140, 202, 70, 24, 100, 128, 114, 90, 230, 110, 37, 161, 144, 199, 157, 112, 2, 169, 253, 223, 149, 48, 181, 87, 169, 177, 177, 134, 119, 248, 119, 84, 90, 71, 252, 95, 233, 180, 232, 119, 168, 33, 252, 72, 112, 81, 67, 253, 147, 217, 171, 42, 4, 233, 161, 175, 227, 239, 10, 181, 35, 28, 40, 203, 131, 30, 85, 188, 119, 163, 99, 117, 203, 35, 67, 204, 92, 185, 6, 124, 243, 211, 102, 252, 243, 246, 109, 44, 90, 250, 23, 191, 151, 107, 213, 141, 224, 81, 3, 207, 157, 50, 198, 216, 87, 233, 96, 125, 116, 53, 31, 214, 138, 9, 208, 10, 152, 222, 172, 155, 90, 86, 201, 47, 92, 9, 7, 28, 132, 33, 118, 76, 13, 212, 87, 191, 69, 18, 6, 60, 5, 78, 153, 20, 173, 154, 44, 255, 104, 127, 126, 17, 110, 254, 141, 174, 42, 148, 15, 168, 18, 66, 5, 89, 63, 199, 76, 162, 98, 116, 217, 194, 219, 135, 227, 172, 230, 128, 199, 30, 141, 124, 199, 174, 180, 67, 14, 171, 217, 151, 18, 161, 248, 248, 208, 99, 247, 170, 242, 126, 43, 74, 100, 99, 133, 143, 167, 10, 122, 217, 249, 248, 195, 150, 129, 222, 212, 12, 121, 13, 35, 213, 241, 67, 242, 89, 24, 73, 244, 253, 152, 203, 83, 56, 216, 239, 91, 119, 176, 75, 40, 247, 195, 145, 19, 198, 83, 119, 242, 235, 60, 243, 175, 25, 26, 78, 22, 39, 124, 232, 206, 208, 79, 243, 155, 24, 17, 175, 197, 145, 47, 113, 176, 76, 223, 120, 123, 255, 255, 140, 174, 237, 83, 201, 165, 68, 55, 133, 9, 149, 212, 48, 57, 242, 33, 115, 202, 242, 23, 57, 203, 238, 12, 178, 102, 190, 191, 219, 119, 102, 116, 233, 243, 133, 8, 89, 28, 115, 196, 150, 71, 218, 211, 176, 77, 122, 159, 58, 9, 178, 167, 229, 196, 24, 56, 211, 216, 108, 91, 157, 203, 217, 209, 191, 86, 202, 109, 179, 26, 234, 162, 33, 218, 90, 144, 147, 18, 209, 99, 254, 233, 111, 229, 170, 8, 42, 163, 125, 165, 248, 100, 190, 210, 233, 202, 90, 77, 27, 27, 221, 192, 243, 76, 6, 130, 125, 95, 247, 154, 75, 227, 183, 104, 174, 178, 150, 164, 46, 174, 79, 198, 197, 5, 223, 129, 72, 10, 139, 143, 6, 130, 101, 183, 205, 167, 62, 47, 92, 254, 237, 211, 126, 155, 146, 229, 215, 85, 235, 156, 62, 43, 232, 234, 201, 21, 174, 80, 32, 32, 98, 150, 245, 54, 9, 72, 85, 178, 162, 255, 33, 55, 73, 99, 47, 68, 193, 217, 47, 239, 72, 32, 219, 44, 121, 44, 123, 65, 99, 186, 193, 244, 175, 6, 49, 58, 193, 1, 30, 5, 102, 68, 42, 142, 90, 24, 96, 134, 180, 246, 238, 94, 161, 240, 94, 103, 2, 142, 198, 67, 254, 219, 23, 118, 236, 49, 92, 123, 84, 91, 115, 165, 225, 123, 20, 35, 170, 215, 12, 52, 69, 197, 54, 134, 210, 23, 219, 49, 31, 2, 160, 140, 221, 233, 191, 238, 215, 86, 74, 36, 28, 233, 171, 77, 34, 142, 162, 20, 65, 207, 143, 113, 27, 132, 94, 227, 94, 39, 237, 150, 233, 97, 133, 182, 139, 158, 241, 100, 52, 22, 49, 19, 46, 213, 120, 171, 98, 53, 245, 125, 219, 226, 231, 217, 184, 159, 156, 33, 78, 183, 114, 1, 83, 156, 184, 32, 146,
- 76, 39, 35, 120, 134, 38, 40, 61, 149, 239, 77, 198, 218, 68, 214, 126, 255, 1, 128, 226, 109, 8, 242, 142, 246, 4, 78, 223, 249, 167, 70, 129, 103, 46, 18, 250, 47, 128, 174, 27, 248, 0, 38, 9, 34, 247, 236, 141, 6, 211, 212, 173, 116, 120, 163, 215, 105, 162, 59, 203, 144, 175, 206, 128, 5, 74, 239, 186, 45, 248, 237, 51, 133, 96, 2, 23, 199, 195, 55, 212, 39, 30, 182, 34, 109, 175, 203, 81, 101, 81, 17, 15, 246, 204, 217, 222, 40, 53, 218, 20, 114, 181, 96, 193, 177, 77, 145, 16, 164, 106, 83, 235, 64, 119, 2, 100, 41, 181, 206, 105, 102, 104, 242, 6, 168, 183, 125, 58, 129, 184, 92, 6, 157, 122, 100, 48, 100, 100, 32, 232, 7, 139, 117, 135, 78, 8, 27, 12, 86, 8, 74, 144, 6, 75, 207, 21, 64, 73, 14, 141, 188, 49, 56, 184, 254, 208, 173, 59, 110, 182, 145, 185, 130, 236, 226, 4, 165, 47, 118, 37, 1, 240, 193, 13, 54, 93, 173, 231, 151, 65, 35, 86, 206, 207, 127, 203, 45, 189, 65, 150, 199, 156, 66, 124, 208, 127, 20, 65, 229, 134, 127, 107, 223, 12, 0, 156, 154, 57, 210, 199, 160, 159, 61, 92, 99, 84, 135, 94, 194, 66, 185, 86, 207, 106, 162, 27, 148, 30, 122, 145, 50, 116, 94, 180, 65, 159, 194, 92, 97, 17, 174, 209, 94, 207, 170, 140, 135, 8, 67, 197, 55, 119, 180, 56, 118, 73, 126, 31, 46, 105, 212, 71, 212, 158, 77, 233, 181, 149, 98, 207, 153, 137, 73, 227, 29, 115, 92, 57, 57, 87, 88, 43, 227, 28, 232, 62, 25, 161, 219, 120, 229, 187, 145, 248, 69, 17, 180, 118, 145, 141, 145, 226, 158, 251, 118, 112, 47, 116, 247, 2, 118, 51, 82, 10, 103, 197, 77, 103, 33, 184, 92, 90, 225, 6, 98, 47, 147, 162, 175, 213, 213, 53, 59, 77, 22, 5, 100, 11, 174, 148, 131, 94, 122, 41, 217, 127, 118, 80, 254, 31, 239, 244, 184, 31, 55, 17, 73, 114, 105, 42, 15, 42, 168, 161, 48, 25, 85, 9, 250, 239,
- 218, 176, 107, 222, 15, 8, 38, 62, 62, 77, 167, 131, 178, 229, 42, 91, 113, 4, 169, 46, 134, 234, 137, 41, 183, 22, 70, 230, 173, 104, 187, 118, 183, 191, 254, 230, 119, 120, 96, 91, 236, 139, 252, 206, 173, 10, 139, 56, 108, 182, 209, 206, 215, 215, 151, 137, 52, 221, 222, 95, 172, 104, 17, 164, 36, 241, 243, 196, 48, 169, 143, 213, 42, 81, 37, 125, 63, 172, 49, 237, 217, 12, 71, 246, 173, 93, 210, 107, 232, 139, 53, 186, 250, 198, 227, 150, 159, 102, 135, 171, 215, 97, 79, 2, 27, 119, 100, 160, 89, 178, 221, 249, 140, 200, 146, 86, 71, 222, 187, 87, 32, 36, 165, 212, 69, 217, 2, 245, 111, 141, 68, 97, 194, 226, 221, 79, 103, 171, 167, 13, 14, 47, 247, 247, 110, 245, 2, 201, 244, 184, 83, 54, 75, 45, 57, 37, 16, 171, 167, 251, 145, 59, 199, 89, 128, 115, 123, 213, 201, 233, 248, 229, 186, 56, 74, 147, 7, 61, 26, 43, 214, 117, 4, 233, 137, 84, 44, 196, 231, 205, 98, 224, 50, 165, 13, 129, 17, 130, 2, 199, 207, 137, 230, 72, 66, 226, 247, 92, 203, 69, 161, 67, 239, 135, 84, 103, 21, 55, 146, 93, 102, 213, 228, 240, 70, 169, 25, 21, 184, 139, 233, 160, 115, 216, 77, 154, 251, 51, 229, 83, 76, 125, 200, 114, 60, 230, 158, 8, 83, 75, 143,
- 100, 237, 233, 114, 201, 130, 131, 145, 26, 139, 175, 222, 145, 241, 215, 149, 143, 72, 26, 197, 152, 172, 252, 161, 197, 109, 74, 125, 39, 165, 242, 133, 181, 212, 108, 144, 123, 180, 92, 137, 131, 129, 251, 109, 124, 45, 201, 247, 36, 68, 210, 196, 243, 198, 21, 4, 169, 209, 150, 228, 234, 221, 112, 230, 128, 42, 149, 145, 192, 217, 253, 191, 30, 59, 60, 216, 179, 240, 99, 48, 141, 19, 194, 62, 199, 131, 5, 179, 228, 47, 48, 82, 48, 109, 96, 220, 142, 111, 203, 251, 155, 117, 123, 208, 246, 173, 234, 197, 72, 165, 178, 2, 73, 73, 216, 20, 80, 169, 53, 45, 16, 138, 191, 182, 64, 250, 254, 198, 118, 89, 204, 21, 168, 76, 233, 249, 193, 148, 67, 58, 22, 231, 220, 49, 182, 64, 133, 75, 222, 153, 78, 51, 185, 103, 72, 79, 64, 103, 230, 234, 37, 5, 82, 132, 11, 208, 169, 250, 97, 73, 98, 219, 181, 167, 62, 70, 1, 244, 237, 67, 24, 57, 54, 20, 3, 124, 174, 124, 254, 110, 210, 37, 237, 95, 64, 198, 31, 60, 203, 243, 90, 180, 248, 241, 152, 56, 254, 115, 52, 156, 23, 226, 152, 210, 93, 221, 91, 68, 134, 38, 80, 113, 168, 150, 199, 124, 197, 229, 29, 186, 124, 226, 254, 199, 141, 127, 129, 47, 163, 41, 99, 186, 152, 4, 29, 63, 32, 88, 105, 122, 87, 28, 236, 253, 66, 20, 29, 173, 29, 49, 154, 90, 172, 243, 173, 48, 187, 98, 57, 97, 99, 75, 32, 204, 126, 176, 94, 147, 55, 116, 98, 144, 7, 23, 201, 187, 78, 240, 4, 130, 221, 108, 108, 240, 82, 208, 132, 223, 16, 80, 12, 214, 190, 47, 31, 7, 226, 59, 201, 73, 205, 213, 249, 60, 9, 124, 123, 99, 146, 6, 239, 97, 36, 217, 208, 15, 221, 217, 209, 243, 70, 197, 254, 7, 254, 210, 209, 84, 10, 134, 56, 234, 254, 238, 204, 13, 60, 45, 24, 57, 57, 31, 112, 14, 34, 180, 213, 170, 43, 53, 220, 10, 43, 103, 226, 67, 41, 189, 85, 13, 91, 48, 122, 144, 78, 207, 192, 57, 56, 59, 121, 108, 91, 207, 19, 249, 44, 59, 93, 79, 251, 82, 16, 171, 70, 188, 227, 165, 213, 109, 178, 62, 22, 84, 165, 155, 120, 193, 44, 149, 91, 214, 195, 26, 120, 98, 30, 188, 139, 126, 157, 218, 172, 103, 102, 73, 53, 39, 158, 214, 243, 23, 167, 83, 27, 167, 148, 122, 43, 140, 235, 19, 73, 25, 44, 222, 39, 110, 128, 70, 17, 142, 76, 245, 57, 229, 0, 178, 136, 244, 219, 65, 55, 140, 9, 28, 202, 43, 37, 68, 24, 28, 43, 232, 127, 106, 148, 124, 142, 108, 33, 36, 20, 182, 24, 234, 194, 31, 25, 209, 44, 160, 254, 242, 194, 98, 16, 225, 71, 56, 164, 78, 253, 240, 122, 47, 132, 29, 18, 85, 186, 234, 241, 245, 174, 14, 65, 170, 194, 69, 251, 182, 177, 57, 206, 32, 76, 65, 137, 221, 117, 67, 16, 235, 160, 56, 30, 94, 106, 250, 247, 115, 121, 152, 196, 60, 182, 111, 14, 179, 38, 171, 37, 37, 137, 174, 134, 240, 52, 65, 241, 104, 246, 147, 164, 175, 172, 26, 255, 53, 44, 21, 210, 231, 224, 49, 182, 122, 81, 167, 191, 78, 48, 30, 66, 107, 245, 27, 117, 93, 44, 17, 80, 239, 26, 206, 227, 174, 106, 83, 31, 155, 209, 106, 74, 41, 208, 197, 11, 121, 16, 160, 181, 35, 193, 145, 255, 182, 26, 14, 4, 123, 165, 207, 250, 132, 236, 95, 122, 244, 230, 96, 137, 147, 73, 175,
- 76, 127, 196, 12, 242, 167, 167, 48, 222, 225, 204, 71, 149, 148, 63, 106, 210, 112, 224, 215, 245, 21, 16, 115, 128, 83, 255, 224, 230, 247, 53, 241, 161, 120, 86, 155, 11, 66, 34, 46, 48, 176, 235, 66, 169, 42, 19, 204, 24, 46, 156, 59, 46, 215, 99, 226, 207, 219, 154, 85, 238, 40, 176, 197, 168, 5, 240, 84, 254, 77, 114, 176, 230, 134, 175, 140, 11, 165, 36, 87, 93, 238, 251, 1, 190, 74, 239, 251, 133, 248, 101, 160, 245, 102, 16, 145, 246, 195, 196, 113, 134, 238, 123, 44, 64, 223, 103, 178, 52, 13, 114, 73, 12, 15, 201, 167, 247, 156, 233, 81, 102, 26, 36, 115, 6, 47, 75, 167, 139, 116, 94, 237, 39, 12, 86, 230, 202, 127, 28, 199, 230, 85, 156, 176, 245, 199, 2, 243, 127, 128, 125, 90, 14, 140, 91, 122, 135, 194, 115, 43, 164, 37, 148, 159, 1, 64, 223, 41, 144, 89, 60, 178, 74, 234, 147, 109, 48, 74, 95, 124, 148, 51, 25, 84, 15, 137, 99, 85, 142, 181, 93, 73, 178, 166, 232, 108, 246, 62, 24, 186, 229, 43, 39, 147, 161, 232, 101, 204, 156, 250, 43, 125, 115, 176, 222, 213, 220, 66, 22, 71, 180, 62, 44, 25, 41, 81, 185, 230, 9, 128, 82, 216, 21, 62, 181, 70, 170, 37, 23, 83, 100, 73, 138, 205, 224, 65, 1, 157, 241, 48, 158, 242, 239, 247, 177, 44, 106, 204, 48, 242, 10, 42, 145, 53, 182, 204, 213, 194, 239, 93, 58, 199, 194, 185, 254, 128, 243, 229, 193, 39, 145, 49, 246, 128, 215, 30, 148, 85, 84, 16, 108, 24, 154, 142, 13, 192, 32, 245, 173, 250, 41, 34, 41, 154, 242, 111, 66, 104, 110, 185, 93, 68, 238, 239, 83, 50, 145, 154, 96, 156, 67, 96, 242, 163, 91, 156, 234, 147, 231, 242, 76, 72, 214, 231, 30, 50, 144, 40, 78, 106, 158, 74, 54, 86, 106, 57, 71, 18, 198, 142, 175, 153, 167, 44, 58, 117, 6, 157, 9, 88, 44, 56, 218, 139, 209, 35, 219, 153, 0, 13, 18, 67, 212, 173, 150, 185, 221, 23, 42, 65, 99, 76, 243, 39, 87, 248, 123, 94, 180, 239, 151, 243, 44, 213, 136, 72, 133, 30, 152, 158, 212, 62, 45, 129, 35, 105, 63, 37, 16, 239, 1, 188, 38, 65, 121, 28, 141, 34, 156, 139, 156, 97, 3, 190, 230, 8, 48, 252, 27, 221, 152, 30, 215, 242, 129, 163, 170, 71, 40, 203, 39, 84, 201, 62, 30, 245, 21, 154, 228, 57, 87, 228, 54, 80, 60, 205, 209, 162, 166, 199, 154, 235, 106, 124, 71, 23, 5, 166, 197, 181, 245, 208, 95, 231, 230, 130, 148, 173, 226, 252, 201, 153, 135, 213, 175, 134, 179, 85, 104, 167, 39, 244, 118, 157, 151, 161, 174, 248, 108, 84, 66, 127, 96, 72, 211, 227, 23, 169, 225, 32, 186, 14, 194, 145, 220, 183, 213, 114, 119, 28, 40, 188, 129, 140, 12, 150, 192, 57, 167, 228, 96, 29, 154, 193, 111, 115, 244, 106, 27, 207, 21, 217, 156, 37, 233, 15, 190, 196, 223, 108, 82, 202, 187, 204, 255, 154, 149, 230, 36, 142, 161, 148, 55, 151, 164, 251, 225, 210, 163, 88, 208, 205, 125, 170, 198, 139, 82, 27, 230, 205, 100, 13, 76, 249, 132, 12, 5, 108, 209, 211, 223, 58, 246, 108, 16, 108, 225, 52, 112, 242, 181, 226, 110, 132, 244, 141, 198, 74, 65, 176, 183, 85, 241, 161, 229, 208, 9, 158, 213, 56, 173, 66, 240, 101, 102, 31, 112, 191, 101, 139, 197, 88, 168, 240, 143, 73, 189, 240, 67, 239, 102, 157, 164, 93, 138, 101, 217, 197, 62, 91, 223, 247, 63, 70, 105, 116, 150, 100, 253, 201, 246, 119, 224, 1, 83, 172, 185, 233, 191, 194, 140, 67, 166, 85, 202, 150, 159, 20, 65, 240, 144, 68, 218, 59, 234, 55, 166, 235, 149, 138, 32, 74, 249, 235, 158, 185, 153, 61, 222, 48, 44, 39, 191, 159, 135, 203, 76, 224, 244, 177, 122, 200, 30, 179, 130, 135, 155, 192, 141, 149, 150, 58, 31, 121, 1, 158, 230, 62, 245, 106, 181, 126, 67, 16, 237, 47, 197, 202, 97, 28, 47, 117, 27, 176, 21, 227, 242, 42, 61, 129, 79, 100, 33, 17, 209, 251, 40, 112, 242, 17, 201, 224, 192, 120, 206, 198, 233, 152, 0, 220, 4, 7, 138, 240, 79, 85, 172, 168, 140, 199, 154, 103, 99, 212, 22, 55, 178, 41, 80, 250, 117, 68, 142, 7, 229, 39, 32, 175, 243, 31, 255, 226, 208, 199, 12, 64, 247, 59, 57, 200, 59, 93, 243, 83, 139, 177, 82, 47, 144, 81, 80, 18, 60, 72, 7, 177, 11, 71, 150, 37, 85, 229, 27, 145, 249, 242, 212, 228, 215, 197, 175, 244, 51, 218, 230, 52, 207, 233, 40, 143, 150, 0, 94, 252, 113, 126, 10, 201, 112, 122, 249, 182, 76, 74, 38, 114, 165, 231, 245, 241, 189, 94, 62, 66, 169, 87, 158, 65, 74, 190, 148, 133, 141, 150, 205, 94, 244, 207, 251, 216, 143, 170, 84, 229, 136, 78, 206, 203, 10, 215, 166, 106, 39, 17, 209, 95, 94, 107, 198, 138, 32, 2, 179, 154, 145, 94, 162, 122, 159, 107, 144, 2, 136, 113, 209, 195, 136, 63, 8, 11, 130, 221, 248, 196, 145, 141, 161, 107, 230, 84, 158, 146, 169, 205, 27, 243, 70, 37, 25, 173, 36, 250, 199, 248, 114, 141, 12, 165, 166, 43, 71, 197, 80, 177, 225, 61, 199, 178, 182, 216, 247, 31, 18, 179, 125, 11, 145, 86, 237, 31, 64, 36, 117, 208, 216, 18, 22, 49, 73, 143, 170, 174, 128, 170, 191, 180, 91, 186, 46, 40, 60, 139, 8, 206, 218, 143, 253, 246, 26, 94, 8, 73, 12, 16, 252, 21, 35, 160, 241, 254, 185, 4, 38, 225, 199, 242, 243, 19, 57, 109, 20, 30, 101, 177, 123, 186, 3, 97, 233, 220, 148, 194, 181, 180, 104, 167, 0, 45, 22, 20, 39, 214, 253, 40, 177, 207, 188, 221, 14, 186, 91, 164, 93, 39, 83, 203, 168, 143, 105, 65, 36, 177, 51, 95, 79, 149, 36, 62, 5, 52, 251, 179, 179, 48, 255, 210, 186, 46, 161, 130, 176, 239, 46, 3, 193, 34, 27, 59, 12, 117, 158, 176, 214, 159, 241, 54, 181, 138, 107, 29, 189, 231, 191, 78, 150, 193, 134, 83, 12, 174, 163, 213, 108, 242, 179, 148, 45, 244, 4, 51, 141, 139, 52, 146, 146, 3, 31, 141, 92, 80, 177, 106, 47, 111, 11, 188, 254, 177, 229, 114, 112, 226, 134, 218, 37, 90, 70, 142, 171, 243, 131, 114, 139, 215, 97, 137, 226, 8, 126, 7, 230, 206, 93, 142, 121, 172, 173, 245, 180, 75, 226, 46, 121, 163, 74, 125, 243, 170, 109, 33, 247, 9, 3, 121, 133, 241, 101, 91, 152, 5, 188, 7, 167, 30, 225, 128, 173, 235, 248, 32, 199, 47, 119, 117, 238, 160, 137, 26, 210, 172, 68, 86, 56, 232, 90, 220, 137, 197, 200, 81, 104, 194, 5, 28, 229, 105, 147, 214, 12, 137, 190, 62, 103, 178, 164, 89, 160, 187, 127, 251, 175, 89, 55, 10, 42, 31, 72, 155, 237, 95, 45, 34, 72, 217, 243, 232, 113, 29, 205, 180, 70, 24, 211, 164, 52, 34, 11, 180, 100, 131, 135, 131, 63, 143, 247, 219, 243, 83, 94, 171, 223, 132, 38, 2, 9, 251, 57, 38, 223, 228, 19, 39, 83, 212, 225, 242, 141, 70, 237, 79, 115, 249, 188, 64, 76, 26, 73, 207, 165, 199, 51, 58, 59, 65, 253, 163, 46, 248, 8, 209, 243, 90, 161, 198, 1, 21, 85, 154, 194, 121, 0, 61, 50, 206, 126, 45, 211, 96, 31, 172, 146, 75, 145, 208, 55, 89, 38, 246, 125, 218, 79, 102, 228, 233, 145, 34, 179, 183, 217, 81, 96, 159, 101, 118, 162, 145, 175, 198, 215, 154, 0, 52, 61, 181, 55, 248, 221, 150, 217, 216, 99, 226, 160, 4, 111, 2, 253, 167, 246, 48, 157, 235, 151, 109, 190, 184, 157, 246, 15, 172, 155, 81, 230, 53, 64, 32, 71, 214, 181, 132, 156, 211, 119, 173, 201, 69, 37, 230, 229, 27, 193, 239, 87, 88, 97, 46, 195, 60, 251, 36, 106, 142, 143, 145, 189, 164, 28, 183, 173, 36, 191, 153, 75, 252, 45, 106, 194, 7, 235, 147, 158, 74, 247, 58, 138, 203, 164, 89, 228, 111, 75, 221, 182, 226, 240, 124, 123, 138, 84, 220, 215, 78, 229, 152, 136, 105, 188, 140, 29, 201, 229, 133, 96, 243, 116, 39, 145, 228, 139, 139, 220, 63, 50, 88, 250, 99, 223, 255, 124, 232, 140, 96, 68, 174, 102, 150, 156, 129, 121, 229, 95, 224, 34, 237, 95, 149, 153, 199, 192, 35, 192, 159, 252, 151, 128, 72, 175, 188, 41, 162, 223, 253, 90, 221, 237, 46, 189, 31, 126, 9, 81, 230, 243, 72, 119, 119, 152, 1, 29, 120, 239, 220, 71, 250, 94, 29, 64, 120, 113, 208, 169, 140, 244, 51, 52, 71, 141, 202, 93, 150, 53, 33, 190, 228, 220, 91, 252, 188, 27, 156, 62, 7, 255, 24, 219, 160, 168, 68, 4, 93, 191, 164, 33, 127, 95, 215, 111, 169, 235, 154, 6, 38, 196, 46, 44, 244, 83, 104, 120, 59, 56, 226, 102, 89, 179, 191, 16, 147, 50, 62, 203, 65, 135, 139, 34, 138, 60, 213, 20, 121, 72, 171, 22, 95, 239, 187, 74, 209, 196, 185, 253, 32, 43, 200, 135, 26, 114, 177, 225, 77, 29, 159, 212, 137, 239, 229, 131, 56, 106, 225, 124, 92, 169, 138, 254, 1, 107, 152, 63, 226, 134, 131, 69, 157, 216, 18, 234, 226, 134, 40, 24, 76, 111, 11, 46, 125, 198, 36, 28, 104, 88, 244, 190, 124, 8, 141, 229, 255, 224, 222, 175, 121, 68, 194, 73, 186, 77, 92, 59, 130, 90, 149, 107, 28, 42, 245, 109, 132, 180, 241, 16, 144, 153, 227, 98, 149, 239, 188, 32, 236, 149, 221, 166, 181, 242, 142, 96, 31, 65, 11, 230, 5, 149, 209, 67, 176, 205, 97, 23, 188, 86, 42, 245, 200, 143, 128, 47, 99, 134, 125, 243, 43, 159, 125, 140, 158, 173, 126, 109, 220, 40, 144, 94, 22, 184, 57, 248, 120, 167, 61, 63, 245, 124, 52, 215, 31, 11, 58, 24, 222, 53, 155, 160, 183, 158, 133, 149, 160, 130, 249, 251, 229, 146, 16, 195, 1, 128, 166, 154, 150, 171, 12, 253, 226, 225, 188, 159, 210, 176, 202, 72, 63, 205, 97, 63, 59, 207, 142, 96, 12, 53, 92, 238, 32, 68, 78, 111, 160, 195, 191, 115, 212, 253, 122, 250, 15, 21, 108, 216, 51, 227, 166, 33, 135, 181, 89, 158, 182, 244, 200, 19, 147, 200, 185, 39, 170, 63, 103, 46, 240, 149, 121, 255, 208, 165, 237, 105, 113, 72, 51, 171, 141, 247, 178, 140, 142, 27, 216, 97, 42, 245, 147, 1, 109, 19, 215, 189, 226, 143, 68, 25, 131, 170, 122, 222, 69, 219, 142, 79, 184, 169, 239, 126, 104, 166, 111, 45, 223, 229, 142, 133, 50, 174, 123, 150, 55, 170, 214, 217, 170, 251, 160, 8, 22, 204, 100, 30, 126, 167, 69, 185, 226, 10, 254, 146, 127, 11, 3, 95, 78, 253, 115, 112, 176, 165, 171, 57, 147, 249, 37, 9, 146, 21, 203, 6, 248, 82, 221, 148, 207, 212, 4, 11, 153, 118, 140, 223, 9, 242, 153, 227, 15, 200, 54, 6, 205, 243, 118, 197, 0, 248, 154, 250, 129, 20, 59, 43, 191, 66, 89, 211, 206, 154, 240, 160, 58, 29, 222, 32, 177, 58, 97, 157, 111, 167, 185, 66, 145, 215, 226, 123, 133, 50, 103, 154, 136, 164, 168, 190, 91, 18, 133, 71, 186, 173, 171, 225, 196, 61, 119, 239, 75, 166, 31, 138, 67, 139, 172, 158, 41, 101, 121, 34, 35, 147, 129, 149, 210, 209, 193, 236, 5, 23, 156, 3, 115, 244, 137, 39, 83, 180, 183, 25, 89, 202, 31, 56, 222, 75, 169, 214, 61, 208, 11, 225, 61, 55, 147, 198, 85, 87, 200, 155, 194, 35, 18, 18, 222, 102, 162, 138, 153, 185, 152, 111, 86, 19, 206, 94, 146, 25, 145, 194, 141, 155, 179, 157, 210, 45, 234, 22, 129, 148, 57, 115, 1, 103, 199, 165, 173, 230, 94, 123, 43, 61, 164, 56, 199, 116, 123, 135, 249, 141, 51, 233, 79, 158, 241, 230, 73, 37, 82, 128, 88, 243, 205, 142, 210, 222, 109, 12, 233, 4, 222, 44, 101, 224, 186, 206, 133, 75, 33, 4, 50, 232, 154, 47, 225, 239, 178, 103, 227, 109, 127, 157, 251, 110, 198, 60, 141, 61, 115, 42, 174, 131, 93, 182, 230, 120, 170, 0, 32, 159, 66, 143, 205, 154, 143, 190, 118, 117, 123, 166, 227, 84, 112, 18, 193, 82, 15, 117, 238, 187, 54, 159, 177, 106, 174, 126, 222, 40, 72, 43, 31, 79, 233, 193, 252, 235, 138, 108, 254, 170, 239, 5, 60, 241, 208, 40, 90, 205, 247, 112, 48, 193, 205, 159, 162, 126, 253, 244, 43, 71, 238, 57, 120, 128, 199, 52, 14, 6, 239, 68, 73, 97, 173, 138, 6, 82, 22, 96, 68, 45, 45, 7, 94, 174, 170, 166, 10, 82, 193, 202, 117, 49, 10, 79, 41, 248, 251, 81, 251, 36, 120, 240, 15, 63, 126, 137, 174, 57, 209, 24, 250, 96, 148, 139, 67, 122, 201, 105, 178, 89, 2, 149, 199, 132, 59, 214, 32, 229, 194, 163, 241, 47, 211, 242, 11, 143, 123, 238, 76, 30, 97, 68, 170, 29, 65, 92, 184, 175, 217, 0, 100, 170, 152, 107, 162, 209, 31, 117, 92, 20, 156, 69, 117, 208, 134, 204, 64, 158, 86, 41, 95, 100, 6, 141, 246, 3, 200, 25, 91, 160, 48, 103, 228, 136, 94, 150, 158, 145, 64, 219, 239, 55, 252, 90, 121, 64, 251, 147, 207, 133, 245, 201, 127, 190, 146, 172, 28, 87, 15, 243, 1, 139, 188, 223, 15, 223, 119, 41, 134, 19, 65, 148, 137, 254, 118, 215, 49, 77, 247, 236, 124, 172, 142, 246, 17, 59, 183, 196, 9, 255, 195, 119, 142, 131, 139, 134, 147, 21, 198, 142, 221, 241, 63, 112, 165, 87, 211, 205, 45, 84, 42, 181, 42, 214, 65, 5, 114, 153, 43, 92, 25, 122, 218, 89, 10, 226, 239, 104, 250, 213, 40, 3, 50, 101, 70, 62, 166, 177, 91, 232, 5, 139, 90, 156, 185, 8, 160, 98, 113, 83, 113, 27, 15, 168, 91, 240, 199, 46, 44, 202, 131, 33, 94, 139, 191, 50, 214, 33, 111, 221, 67, 153, 165, 70, 209, 136, 89, 191, 247, 17, 27, 75, 217, 93, 171, 45, 84, 238, 11, 209, 243, 214, 110, 230, 213, 48, 101, 40, 10, 47, 109, 129, 209, 149, 135, 190, 162, 147, 168, 231, 29, 203, 3, 253, 226, 201, 232, 222, 190, 143, 118, 169, 93, 240, 117, 128, 238, 7, 209, 248, 178, 68, 44, 197, 26, 98, 88, 65, 198, 143, 198, 21, 147, 167, 140, 194, 142, 172, 8, 173, 149, 2, 174, 251, 119, 168, 33, 132, 180, 174, 7, 195, 194, 11, 10, 100, 163, 163, 98, 53, 71, 4, 229, 99, 183, 242, 203, 54, 64, 66, 225, 199, 194, 163, 45, 110, 86, 136, 163, 138, 222, 135, 148, 200, 140, 198, 111, 107, 184, 28, 85, 180, 37, 3, 231, 155, 121, 130, 87, 78, 117, 108, 94, 215, 101, 102, 222, 236, 16, 199, 145, 188, 71, 190, 4, 24, 214, 35, 120, 60, 212, 69, 251, 52, 248, 149, 85, 6, 214, 245, 86, 48, 178, 139, 109, 51, 1, 145, 52, 221, 217, 158, 212, 13, 19, 78, 221, 76, 67, 157, 213, 126, 234, 86, 122, 24, 223, 204, 255, 173, 233, 109, 39, 116, 53, 238, 229, 104, 23, 147, 204, 247, 85, 34, 228, 38, 125, 244, 71, 188, 45, 169, 216, 99, 103, 4, 137, 183, 157, 217, 48, 2, 29, 51, 107, 7, 64, 155, 73, 169, 206, 196, 193, 193, 175, 226, 74, 139, 138, 248, 58, 197, 76, 247, 95, 89, 169, 113, 79, 244, 46, 33, 180, 47, 95, 177, 242, 209, 213, 112, 28, 60, 16,
- 97, 66, 167, 114, 213, 135, 153, 216, 1, 253, 32, 173, 29, 66, 44, 247, 166, 25, 65, 22, 239, 83, 49, 45, 75, 193, 49, 152, 194, 73, 97, 154, 109, 87, 246, 249, 133, 241, 209, 8, 238, 242, 38, 237, 15, 246, 199, 143, 173, 138, 249, 143, 20, 183, 106, 31, 214, 152, 228, 176, 25, 203, 238, 239, 3, 142, 54, 231, 12, 189, 42, 12, 23, 126, 81, 118, 4, 157, 181, 235, 164, 150, 29, 146, 94, 201, 209, 207, 151, 184, 153, 166, 211, 202, 46, 20, 137, 76, 238, 206, 89, 103, 242, 133, 40, 68, 250, 212, 190, 120, 16, 220, 118, 202, 250, 166, 73, 181, 126, 83, 201, 120, 114, 237, 185, 183, 194, 8, 180, 32, 28, 122, 20, 71, 13, 145, 15, 62, 95, 167, 249, 64, 215, 182, 204, 163, 121, 154, 28, 209, 94, 223, 252, 211, 152, 10, 183, 77, 134, 75, 166, 194, 79, 56, 64, 168, 107, 93, 17, 136, 26, 26, 39, 76, 78, 43, 181, 63, 172, 210, 227, 175, 60, 36, 158, 98, 144, 85, 93, 204, 182, 241, 140, 177, 225, 191, 149, 219, 16, 31, 51, 58, 5, 233, 227, 65, 33, 245, 174, 239, 7, 239, 179, 105, 97, 28, 122, 31, 73, 252, 79, 51, 40, 144, 211, 10, 9, 49, 205, 15, 142, 5, 16, 62, 82, 244, 142, 84, 133, 21, 189, 166, 174, 152, 101, 108, 119, 112, 143, 165, 191, 240, 57, 1, 221, 49, 142, 239, 139, 91, 252, 238, 47, 184, 243, 89, 102, 216, 35, 135, 156, 122, 209, 186, 49, 10, 177, 111, 241, 77, 18, 21, 65, 181, 56, 62, 99, 39, 132, 8, 137, 54, 157, 116, 108, 55, 151, 34, 121, 153, 63, 81, 142, 47, 11, 191, 104, 182, 19, 106, 172, 89, 20, 2, 190, 133, 52, 166, 54, 123, 114, 250, 24, 216, 163, 134, 44, 168, 224, 166, 178, 122, 91, 243, 205, 90, 49, 179, 18, 219, 150, 240, 34, 134, 14, 12, 235, 234, 39, 242, 196, 122, 186, 245, 121, 222, 187, 232, 214, 159, 142, 129, 111, 76, 34, 61, 170, 255, 166, 127, 24, 247, 208, 145, 19, 236, 176, 112, 76, 189, 110, 130, 91, 219, 228, 45, 51, 116, 168, 194, 20, 146, 57, 11, 103, 254, 56, 234, 1, 239, 240, 176, 145, 148, 30, 13, 12, 150, 117, 182, 9, 52, 125, 142, 52, 54, 48, 172, 154, 240, 226, 209, 182, 170, 251, 58, 32, 218, 172, 165, 21, 104, 110, 234, 178, 221, 206, 161, 207, 106, 109, 163, 227, 224, 102, 167, 47, 129, 121, 179, 228, 66, 241, 71, 222, 222, 61, 149, 244, 149, 242, 165, 227, 247, 4, 199, 212, 128, 198, 180, 191, 142, 223, 67, 231, 172, 146, 24, 168, 77, 127, 186, 109, 141, 166, 214, 111, 205, 89, 71, 227, 220, 88, 15, 57, 13, 161, 97, 35, 138, 213, 236, 145, 15, 201, 136, 164, 151, 25, 34, 198, 7, 1, 47, 137, 144, 138, 28, 203, 206, 19, 140, 5, 69, 57, 28, 85, 229, 193, 47, 41, 145, 34, 50, 87, 247, 161, 56, 28, 65, 197, 33, 18, 99, 31, 247, 246, 9, 211, 113, 64, 198, 30, 222, 122, 84, 254, 11, 74, 194, 14, 109, 222, 71, 87, 86, 82, 132, 78, 235, 210, 142, 149, 247, 207, 85, 21, 254, 25, 112, 223, 67, 187, 26, 241, 109, 231, 94, 113, 126, 246, 228, 80, 15, 180, 182, 151, 66, 33, 47, 101, 54, 69, 9, 244, 63, 24, 216, 208, 111, 207, 176, 141, 144, 38, 73, 223, 112, 117, 65, 225, 13, 201, 146, 160, 240, 178, 173, 198, 166, 77, 72, 155, 182, 83, 0, 185, 34, 25, 101, 188, 97, 244, 9, 111, 150, 82, 157, 94, 77, 232, 189, 154, 239, 230, 114, 152, 242, 91, 207, 80, 52, 80, 180, 34, 21, 111, 16, 12, 178, 196, 122, 164, 128, 255, 72, 103, 149, 151, 63, 165, 134, 39, 51, 255, 3, 137, 11, 16, 171, 228, 18, 208, 253, 194, 225, 137, 178, 87, 168, 200, 39, 121, 151, 167, 202, 57, 88, 80, 150, 32, 249, 239, 195, 161, 74, 47, 217, 222, 76, 213, 237, 13, 67, 248, 138, 75, 139, 86, 62, 72, 231, 200, 27, 123, 229, 68, 129, 31, 204, 218, 70, 141, 94, 31, 242, 44, 201, 44, 150, 186, 113, 77, 192, 178, 222, 223, 104, 107, 189, 173, 15, 227, 148, 52, 101, 63, 0, 227, 94, 215, 239, 15, 28, 125, 83, 159, 167, 14, 239, 114, 57, 213, 179, 10, 191, 46, 65, 36, 237, 203, 48, 172, 233, 191, 191, 215, 234, 143, 141, 213, 185, 121, 63, 16, 202, 7, 68, 211, 35, 187, 137, 175, 9, 242, 29, 66, 24, 81, 67, 86, 255, 237, 49, 164, 251, 103, 1, 76, 45, 38, 237, 137, 248, 150, 245, 69, 178, 117, 143, 107, 19, 190, 194, 22, 250, 168, 55, 194, 95, 199, 236, 67, 243, 246, 100, 182, 254, 62, 25, 84, 247, 16, 12, 63, 251, 148, 48, 69, 1, 184, 63, 221, 211, 251, 209, 202, 23, 73, 242, 159, 201, 234, 32, 100, 157, 110, 19, 118, 180, 224, 162, 156, 116, 168, 68, 163, 224, 246, 166, 189, 136, 0, 205, 130, 211, 43, 244, 166, 187, 240, 47, 151, 166, 214, 207, 127, 233, 15, 136, 106, 93, 206, 99, 132, 117, 170, 206, 14, 20, 50, 53, 71, 59, 66, 181, 113, 201, 227, 95, 216, 233, 53, 127, 171, 186, 167, 37, 140, 29, 177, 99, 108, 178, 172, 55, 46, 239, 72, 200, 33, 130, 29, 38, 56, 157, 191, 174, 38, 128, 100, 57, 241, 242, 199, 61, 30, 71, 210, 170, 248, 94, 255, 117, 123, 63, 252, 140, 0, 77, 207, 17, 118, 207, 170, 157, 143, 154, 155, 137, 4, 55, 252, 28, 255, 99, 141, 113, 50, 40, 95, 230, 172, 240, 117, 133, 131, 235, 52, 141, 200, 32, 81, 43, 76, 23, 85, 44, 74, 234, 177, 21, 59, 100, 106, 145, 2, 210, 143, 236, 201, 140, 184, 223, 6, 74, 184, 250, 180, 191, 24, 225, 160, 156, 12, 198, 48, 158, 218, 169, 205, 190, 211, 249, 43, 119, 38, 6, 253, 16, 130, 60, 55, 177, 33, 191, 172, 146, 221, 26, 101, 237, 205, 148, 120, 137, 209, 143, 212, 165, 143, 205, 75, 9, 27, 229, 175, 78, 232, 215, 180, 115, 135, 252, 56, 21, 64, 35, 97, 7, 159, 20, 55, 134, 209, 113, 241, 86, 159, 236, 223, 252, 228, 233, 229, 37, 68, 183, 111, 184, 155, 236, 17, 14, 218, 244, 160, 200, 12, 17, 179, 139, 255, 209, 31, 163, 218, 91, 218, 198, 115, 212, 191, 133, 158, 235, 121, 126, 225, 142, 186, 156, 193, 144, 126, 195, 108, 152, 176, 86, 97, 151, 168, 140, 119, 18, 99, 238, 83, 203, 138, 167, 130, 192, 45, 30, 12, 118, 216, 179, 163, 215, 113, 54, 41, 145, 17, 10, 29, 248, 221, 234, 177, 181, 79, 179, 78, 69, 248, 182, 168, 179, 238, 172, 113, 144, 17, 215, 184, 154, 169, 207, 169, 114, 92, 21, 70, 56, 32, 216, 191, 31, 39, 230, 115, 48, 63, 142, 77, 157, 252, 8, 91, 199, 107, 121, 214, 143, 84, 111, 22, 180, 198, 45, 125, 44, 21, 148, 158, 201, 38, 20, 33, 127, 200, 105, 220, 243, 170, 215, 243, 39, 250, 46, 230, 237, 33, 45, 134, 250, 63, 81, 133, 58, 71, 184, 19, 126, 234, 216, 110, 133, 55, 114, 112, 180, 155, 39, 96, 245, 171, 140, 223, 31, 40, 128, 226, 141, 27, 68, 24, 168, 189, 83, 95, 87, 77, 79, 63, 173, 149, 253, 87, 186, 218, 203, 24, 141, 67, 200, 208, 237, 214, 146, 210, 144, 178, 162, 195, 16, 178, 38, 212, 168, 209, 231, 167, 128, 77, 185, 222, 12, 15, 101, 172, 243, 214, 227, 187, 156, 204, 176, 219, 86, 208, 114, 19, 199, 13, 231, 70, 93, 198, 124, 237, 247, 42, 125, 189, 134, 159, 212, 71, 185, 82, 50, 230, 50, 206, 107, 193, 154, 234, 104, 135, 30, 134, 245, 124, 194, 59, 234, 231, 39, 146, 129, 108, 49, 212, 255, 88, 102, 49, 247, 121, 128, 122, 103, 62, 186, 22, 65, 202, 150, 250, 72, 153, 207, 248, 128, 41, 194, 50, 164, 247, 183, 237, 215, 123, 152, 106, 185, 190, 26, 39, 38, 66, 169, 41, 211, 164, 244, 150, 223, 89, 80, 32, 21, 119, 59, 121, 178, 202, 28, 23, 131, 182, 218, 240, 149, 98, 105, 35, 142, 158, 122, 52, 100, 152, 159, 233, 15, 142, 104, 246, 53, 80, 64, 176, 247, 139, 210, 218, 185, 222, 180, 172, 96, 243, 106, 104, 175, 7, 131, 158, 244, 208, 13, 244, 214, 197, 89, 239, 68, 44, 103, 54, 200, 125, 46, 52, 130, 95, 20, 16, 143, 97, 125, 220, 30, 11, 216, 118, 191, 209, 43, 53, 144, 48, 59, 201, 241, 77, 171, 160, 120, 60, 148, 8, 233, 113, 220, 159, 177, 222, 104, 84, 121, 25, 121, 12, 122, 31, 9, 22, 60, 250, 11, 243, 37, 118, 174, 151, 86, 181, 30, 164, 107, 252, 43, 56, 103, 248, 242, 39, 182, 183, 133, 244, 34, 101, 91, 197, 198, 114, 161, 78, 160, 211, 44, 86, 176, 7, 0, 138, 28, 159, 231, 38, 0, 76, 25, 179, 233, 191, 195, 45, 85, 52, 245, 79, 100, 240, 102, 192, 233, 12, 254, 177, 163, 167, 245, 96, 140, 32, 237, 247, 236, 20, 19, 106, 228, 62, 125, 213, 131, 138, 245, 242, 6, 133, 146, 21, 219, 6, 94, 242, 34, 72, 9, 106, 222, 51, 205, 38, 188, 203, 233, 44, 224, 155, 50, 66, 36, 145, 86, 213, 199, 38, 46, 143, 28, 127, 184, 212, 176, 141, 139, 190, 25, 255, 32, 114, 164, 173, 8, 162, 79, 117, 82, 135, 67, 205, 138, 236, 181, 55, 84, 184, 55, 142, 109, 132, 50, 29, 103, 131, 178, 80, 114, 56, 26, 193, 26, 53, 71, 227, 80, 169, 8, 95, 121, 86, 97, 178, 121, 96, 210, 221, 94, 240, 136, 74, 157, 230, 90, 56, 78, 146, 65, 255,
- 247, 137, 179, 126, 139, 146, 195, 225, 173, 162, 172, 111, 217, 185, 103, 93, 145, 96, 181, 232, 4, 238, 232, 180, 59, 71, 232, 229, 76, 85, 172, 62, 46, 148, 98, 116, 180, 35, 250, 196, 175, 201, 215, 231, 240, 51, 121, 199, 51, 206, 152, 200, 165, 2, 144, 188, 218, 103, 11, 181, 21, 228, 203, 64, 50, 10, 182, 158, 31, 79, 37, 198, 149, 224, 184, 164, 137, 94, 126, 9, 27, 67, 65, 82, 131, 242, 239, 197, 18, 20, 44, 140, 18, 145, 165, 73, 94, 77, 125, 82, 191, 118, 94, 164, 165, 177, 116, 220, 250, 18, 211, 144, 192, 210, 57, 12, 236, 174, 84, 80, 120, 38, 43, 168, 17, 195, 8, 165, 141, 241, 172, 101, 37, 254, 124, 223, 11, 237, 193, 122, 12, 193, 143, 80, 1, 92, 52, 75, 200, 185, 83, 136, 202, 232, 52, 43, 55, 181, 81, 63, 25, 97, 191, 177, 111, 127, 100, 203, 51, 205, 241, 112, 77, 31, 170, 249, 39, 183, 104, 173, 226, 248, 206, 74, 149, 78, 24, 78, 30, 92, 7, 64, 218, 220, 69, 75, 243, 60, 8, 182, 197, 199, 153, 129, 209, 75, 56, 164, 25, 147, 18, 0, 241, 40, 29, 175, 186, 183, 59, 195, 184, 132, 236, 224, 109, 85, 131, 157, 79, 79, 60, 117, 255, 242, 62, 227, 205, 74, 137, 31, 63, 12, 162, 220, 121, 96, 197, 180, 208, 61, 179, 44, 235, 37, 214, 169, 31, 169, 109, 97, 148, 195, 218, 96, 9, 98, 183, 156, 150, 223, 55, 88, 114, 5, 34, 21, 0, 109, 75, 76, 23, 98, 222, 226, 249, 179, 135, 179, 120, 80, 0, 56, 116, 248, 250, 73, 227, 189, 115, 159, 155, 98, 39, 41, 60, 40, 189, 97, 247, 7, 90, 101, 56, 75, 147, 133, 44, 205, 71, 209, 222, 26, 168, 24, 1, 78, 245, 247, 201, 186, 110, 98, 13, 89, 189, 161, 146, 39, 33, 100, 246, 97, 123, 8, 205, 220, 241, 193, 133, 40, 159, 135, 8, 252, 107, 204, 245, 7, 10, 76, 151, 196, 55, 178, 181, 208, 10, 135, 155, 198, 232, 245, 152, 227, 43, 165, 13, 252, 142, 64, 193, 51, 183, 115, 113, 9, 243, 40, 169, 196, 224, 157, 48, 46, 239, 144, 109, 137, 252, 132, 167, 129, 213, 27, 142, 213, 185, 97, 92, 179, 118, 148, 227, 101, 198, 27, 169, 117, 215, 240, 39, 129, 143, 183, 52, 248, 171, 234, 43, 5, 60, 56, 149, 40, 175, 39, 73, 99, 92, 38, 140, 112, 199, 199, 108, 68, 146, 138, 55, 91, 181, 221, 249, 40, 130, 212, 97, 49, 200, 109, 253, 192, 233, 104, 103, 65, 179, 24, 128, 6, 96, 125, 203, 45, 139, 42, 88, 210, 171, 211, 33, 166, 140, 25, 126, 153, 169, 165, 32, 182, 175, 72, 81, 83, 38, 147, 154, 134, 99, 67, 178, 18, 155, 249, 153, 100, 105, 26, 53, 185, 216, 215, 71, 136, 244, 90, 187, 232, 233, 23, 119, 222, 186, 93, 34, 67, 75, 113, 146, 138, 239, 81, 184, 142, 167, 73, 25, 78, 191, 94, 89, 182, 66, 13, 85, 10, 32, 102, 113, 160, 6, 141, 73, 177, 143, 90, 127, 71, 184, 119, 200, 216, 111, 70, 45, 62, 164, 187, 81, 156, 184, 25, 125, 84, 34, 20, 231, 97, 157, 53, 63, 67, 154, 148, 112, 178, 113, 167, 105, 161, 157, 183, 218, 185, 60, 176, 230, 204, 240, 34, 105, 25, 243, 205, 214, 33, 37, 123, 169, 78, 45, 154, 167, 121, 128, 156, 23, 233, 225, 143, 84, 40, 60, 179, 193, 26, 19, 200, 196, 162, 219, 232, 191, 21, 89, 72, 21, 118, 248, 150, 231, 234, 30, 27, 234, 5, 230, 33, 78, 117, 145, 55, 59, 99, 232, 200, 3, 87, 180, 122, 199, 9, 2, 221, 247, 32, 153, 213, 244, 236, 97, 2, 248, 91, 213, 36, 120, 162, 191, 69, 15, 206, 235, 80, 37, 182, 85, 74, 236, 120, 104, 248, 108, 253, 76, 150, 119, 66, 200, 207, 236, 93, 253, 100, 146, 226, 130, 197, 131, 141, 12, 5, 80, 180, 208, 136, 249, 220, 164, 86, 172, 80, 35, 198, 104, 224, 132, 202, 234, 145, 189, 68, 130, 118, 196, 214, 109, 143, 21, 63, 197, 109, 139, 253, 244, 94, 12, 46, 145, 94, 173, 129, 78, 151, 232, 24, 127, 49, 65, 27, 184, 248, 137, 78, 160, 254, 229, 103, 65, 44, 17, 71, 140, 173, 118, 71, 189, 145, 90, 211, 113, 200, 83, 172, 4, 108, 143, 65, 238, 8, 176, 30, 36, 168, 22, 112, 197, 73, 50, 247, 83, 17, 148, 230, 165, 251, 62, 10, 124, 248, 75, 151, 12, 205, 83, 108, 160, 64, 196, 110, 89, 19, 189, 229, 247, 95, 211, 84, 48, 225, 112, 223, 143, 249, 156, 167, 220, 137, 108, 63, 90, 254, 51, 240, 190, 249, 213, 106, 245, 167, 169, 93, 110, 246, 205, 20, 33, 34, 183, 210, 67, 251, 221, 24, 15, 137, 206, 195, 115, 212, 208, 104, 49, 177, 26, 238, 176, 116, 90, 106, 16, 7, 100, 157, 35, 165, 75, 161, 232, 179, 5, 140, 35, 61, 205, 18, 247, 97, 2, 23, 42, 94, 229, 197, 71, 45, 183, 213, 11, 242, 67, 40, 52, 168, 87, 71, 76, 254, 205, 236, 124, 190, 224, 46, 217, 12, 29, 44, 137, 242, 195, 233, 71, 205, 89, 97, 175, 189, 27, 181, 224, 1, 11, 166, 211, 243, 227, 254, 11, 10, 234, 89, 170, 203, 129, 74, 30,
- 147, 205, 21, 114, 163, 238, 164, 217, 187, 138, 64, 238, 244, 119, 18, 23, 223, 180, 35, 148, 24, 145, 105, 18, 83, 171, 214, 10, 32, 195, 233, 55, 235, 14, 193, 225, 227, 212, 210, 2, 158, 19, 87, 250, 216, 80, 113, 90, 85, 83, 133, 162, 10, 91, 189, 226, 212, 124, 6, 152, 55, 72, 50, 2, 108, 241, 220, 147, 108, 100, 125, 18, 48, 88, 180, 135, 93, 48, 239, 63, 141, 110, 34, 110, 247, 213, 199, 28, 100, 55, 247, 82, 246, 17, 173, 12, 75, 88, 231, 4, 140, 97, 254, 34, 117, 152, 90, 121, 215, 227, 178, 79, 234, 102, 36, 58, 152, 73, 209, 253, 222, 92, 9, 1, 229, 223, 23, 140, 159, 103, 47, 107, 73, 217, 36, 240, 9, 116, 72, 236, 52, 79, 210, 19, 159, 118, 199, 164, 244, 137, 188, 113, 50, 74, 110, 204, 169, 201, 123, 229, 204, 214, 251, 202, 179, 123, 242, 169, 65, 174, 207, 179, 116, 171, 53, 90, 230, 31, 153, 107, 157, 148, 143, 24, 128, 226, 146, 200, 208, 251, 169, 151, 105, 31, 34, 37, 201, 202, 164, 172, 30, 46, 187, 201, 14, 38, 238, 210, 10, 205, 174, 139, 176, 219, 246, 134, 170, 126, 249, 125, 221, 164, 142, 17, 75, 120, 41, 20, 234, 143, 133, 44, 121, 182, 93, 34, 60, 62, 180, 235, 84, 212, 237, 133, 138, 205, 48, 238, 181, 154, 144, 160, 58, 151, 192, 100, 165, 179, 100, 16, 180, 37, 121, 82, 61, 10, 222, 183, 196, 174, 223, 11, 253, 103, 185, 211, 238, 153, 222, 191, 108, 215, 91, 120, 18, 102, 246, 40, 179, 22, 124, 128, 29, 16, 158, 5, 167, 211, 51, 101, 17, 127, 127, 1, 77, 26, 90, 116, 240, 138, 221, 200, 23, 42, 126, 182, 126, 148, 99, 43, 116, 238, 88, 187, 53, 111, 242, 131, 110, 231, 186, 5, 134, 61, 180, 244, 252, 170, 133, 239, 128, 79, 121, 175, 102, 69, 53, 141, 132, 201, 235, 157, 71, 247, 207, 151, 131, 97, 233, 162, 153, 31, 229, 159, 152, 246, 118, 190, 158, 181, 192, 214, 217, 202, 13, 110, 214, 72, 87, 30, 14, 170, 141, 73, 127, 245, 237, 62, 47, 234, 40, 99, 165, 207, 145, 92, 89, 51, 108, 34, 107, 149, 251, 38, 57, 147, 108, 124, 99, 189, 14, 190, 112, 53, 27, 212, 129, 243, 248, 250, 244, 140, 229, 110, 129, 243, 180, 100, 11, 92, 251, 246, 133, 99, 214, 246, 8, 207, 235, 67, 18, 203, 159, 79, 82, 111, 42, 128, 60, 245, 44, 50, 73, 147, 237, 117, 155, 235, 142, 254, 220, 34, 158, 238, 239, 183, 61, 129, 112, 160, 234, 150, 180, 253, 7, 181, 149, 84, 14, 250, 106, 170, 138, 95, 182, 115, 106, 229, 22, 107, 113, 63, 235, 191, 79, 67, 105, 131, 162, 1, 211, 189, 117, 244, 191, 245, 58, 242, 138, 164, 152, 122, 23, 198, 171, 35, 40, 213, 57, 200, 57, 172, 47, 115, 96, 7, 107, 195, 81, 96, 189, 94, 206, 172, 41, 203, 90, 5, 217, 147, 101, 62, 69, 219, 190, 19, 182, 63, 156, 97, 236, 142, 86, 142, 88, 62, 189, 154, 228, 225, 230, 215, 46, 177, 123, 58, 127, 185, 54, 37, 241, 220, 39, 244, 76, 63, 191, 232, 244, 211, 156, 88, 21, 79, 49, 239, 122, 27, 231, 62, 161, 242, 162, 91, 134, 98, 118, 119, 146, 99, 81, 131, 231, 125, 219, 30, 237, 106, 140, 247, 255, 190, 130, 46, 42, 133, 216, 127, 216, 73, 232, 109, 187, 220, 13, 98, 97, 245, 125, 32, 237, 53, 210, 211, 115, 101, 248, 248, 178, 167, 203, 108, 18, 147, 18, 30, 247, 254, 221, 65, 126, 173, 98, 62, 170, 204, 147, 129, 93, 86, 90, 90, 154, 1, 157, 176, 255, 85, 108, 134, 87, 107, 183, 37, 149, 185, 181, 168, 249, 248, 102, 149, 169, 179, 89, 170, 42, 192, 113, 44, 97, 213, 3, 7, 42, 14, 151, 151, 90, 234, 206, 142, 248, 249, 37, 98, 111, 175, 16, 94, 207, 138, 63, 255, 20, 90, 247, 55, 255, 217, 231, 169, 6, 250, 82, 202, 67, 186, 138, 212, 229, 123, 82, 4, 233, 255, 190, 0, 223, 198, 141, 15, 149, 146, 254, 63, 250, 245, 201, 88, 82, 251, 98, 212, 224, 127, 253, 84, 223, 187, 153, 109, 226, 75, 86, 245, 255, 232, 95, 113, 182, 235, 178, 251, 132, 183, 127, 52, 88, 8, 32, 211, 19, 176, 14, 22, 38, 127, 119, 49, 12, 157, 59, 96, 155, 211, 38, 33, 71, 87, 196, 238, 32, 190, 244, 82, 253, 188, 89, 80, 4, 233, 253, 47, 233, 147, 5, 48, 34, 87, 55, 254, 143, 124, 176, 11, 45, 146, 130, 252, 153, 255, 247, 180, 209, 111, 147, 63, 70, 158, 26, 238, 95, 8, 130, 244, 232, 195, 23, 198, 64, 4, 20, 246, 53, 47, 98, 111, 172, 225, 100, 113, 47, 244, 19, 39, 65, 193, 187, 110, 123, 15, 180, 47, 241, 101, 152, 106, 23, 60, 165, 33, 95, 71, 255, 71, 154, 10, 253, 76, 182, 101, 245, 239, 51, 254, 47, 253, 204, 216, 241, 46, 28, 28, 11, 121, 27, 228, 122, 5, 168, 80, 63, 158, 57, 128, 63, 195, 105, 111, 212, 168, 27, 51, 8, 107, 195, 118, 197, 126, 188, 191, 204, 223, 95, 172, 198, 158, 38, 238, 111, 188, 175, 45, 140, 143, 238, 20, 35, 42, 102, 226, 128, 63, 251, 255, 166, 191, 155, 232, 187, 142, 135, 26, 253, 191, 180, 187, 139, 3, 16, 78, 175, 216, 17, 154, 251, 47, 32, 135, 180, 130, 79, 95, 174, 148, 152, 24, 107, 97, 158, 188, 200, 51, 177, 239, 23, 149, 233, 255, 179, 222, 61, 119, 27, 207, 133, 171, 23, 78, 127, 255, 69, 106, 238, 10, 193, 15, 222, 19, 24, 238, 195, 60, 126, 196, 184, 236, 236, 211, 127, 167, 191, 190, 226, 248, 165, 101, 137, 9,
- 108, 39, 234, 205, 101, 60, 209, 199, 112, 96, 170, 86, 29, 211, 253, 151, 167, 148, 251, 119, 90, 177, 51, 168, 254, 53, 220, 246, 88, 106, 178, 223, 207, 119, 223, 52, 246, 189, 63, 241, 123, 255, 189, 80, 59, 153, 45, 7, 111, 253, 215, 246, 72, 79, 178, 187, 206, 112, 55, 194, 106, 157, 207, 220, 93, 199, 90, 78, 175, 183, 253, 91, 203, 80, 199, 119, 171, 160, 8, 8, 126, 85, 60, 182, 81, 125, 87, 21, 93, 51, 117, 14, 38, 152, 231, 113, 220, 209, 36, 108, 123, 175, 247, 198, 194, 111, 87, 139, 153, 126, 104, 218, 173, 20, 62, 253, 116, 23, 127, 151, 217, 146, 27, 127, 143, 191, 103, 48, 121, 179, 114, 150, 195, 203, 213, 17, 94, 147, 154, 205, 34, 106, 76, 157, 28, 22, 92, 127, 127, 39, 241, 233, 167, 255, 245, 13, 213, 42, 70, 174, 1, 235, 255, 86, 67, 146, 139, 191, 225, 57, 239, 67, 23, 179, 177, 91, 226, 53, 253, 221, 65, 237, 79, 230, 151, 151, 118, 55, 60, 183, 157, 171, 96, 215, 233, 191, 219, 238, 249, 139, 105, 178, 13, 124, 236, 203, 74, 68, 158, 254, 230, 191, 113, 248, 35, 195, 202, 158, 115, 23, 159, 88, 5, 62, 152, 203, 112, 178, 229, 217, 47, 25, 88, 240, 27, 118, 20, 124, 49, 203, 231, 127, 241, 4, 3, 124, 41, 177, 234, 186, 101, 29, 118, 193, 251, 239, 238, 201, 151, 59, 195, 229, 216, 111, 237, 232, 201, 103, 89, 103, 113, 126, 225, 95, 139, 27, 47, 183, 54, 236, 239, 191, 110, 205, 180, 227, 32, 99, 110, 78, 208, 204, 34, 96, 249, 5, 2, 194, 121, 6, 191, 133, 63, 153, 88, 48, 93, 197, 18, 161, 119, 95, 104, 56, 52, 29, 61, 242, 126, 117, 128, 223, 127, 179, 159, 89, 150, 130, 53, 95, 50, 46, 28, 75, 93, 115, 127, 231, 223, 135, 15, 222, 247, 70, 190, 185, 199, 119, 225, 248, 139, 187, 105, 115, 246, 173, 159, 236, 228, 224, 32, 146, 145, 108, 253, 127, 247, 100, 170, 128, 224, 174, 127, 242, 230, 211, 147, 99, 239, 55, 9, 157, 100, 0, 2, 79, 87, 63, 151, 117, 78, 9, 77, 0, 80, 75, 3, 4, 20, 0, 0, 8, 8, 0, 187, 182, 42, 68, 34, 236, 10, 177, 219, 6, 0, 0, 221, 61, 0, 0, 12, 0, 0, 0, 97, 114, 105, 97, 108, 95, 52, 56, 46, 102, 110, 116, 189, 91, 219, 110, 227, 54, 16, 125, 223, 175, 16, 252, 188, 219, 112, 200, 225, 13, 72, 22, 232, 219, 254, 65, 31, 11, 213, 151, 68, 88, 71, 14, 98, 167, 221, 246, 235, 43, 138, 116, 162, 75, 168, 204, 72, 177, 177, 64, 214, 118, 116, 124, 56, 195, 153, 195, 225, 144, 185, 221, 29, 234, 211, 247, 47, 69, 113, 91, 213, 187, 67, 177, 43, 215, 219, 187, 213, 239, 207, 85, 185, 95, 21, 199, 234, 191, 230, 13, 186, 85, 241, 215, 97, 191, 185, 91, 137, 85, 81, 157, 202, 125, 181, 110, 95, 174, 31, 202, 231, 227, 246, 116, 183, 90, 21, 47, 117, 181, 62, 108, 182, 225, 229, 241, 244, 188, 61, 173, 31, 126, 220, 173, 64, 52, 15, 29, 31, 15, 135, 211, 67, 243, 102, 85, 148, 101, 251, 223, 83, 185, 217, 84, 245, 253, 221, 74, 126, 109, 255, 53, 207, 60, 149, 235, 246, 19, 241, 181, 65, 28, 94, 78, 251, 170, 222, 6, 138, 155, 118, 92, 235, 195, 227, 227, 161, 46, 194, 135, 63, 182, 213, 253, 67, 195, 168, 117, 51, 164, 242, 24, 6, 167, 26, 252, 186, 220, 111, 255, 104, 190, 16, 180, 77, 239, 26, 122, 244, 129, 235, 126, 123, 76, 172, 235, 159, 219, 205, 219, 151, 182, 191, 9, 175, 210, 235, 162, 138, 246, 237, 170, 125, 243, 173, 101, 176, 255, 79, 116, 191, 61, 213, 247, 9, 112, 243, 138, 184, 109, 13, 47, 214, 135, 151, 186, 25, 138, 135, 85, 250, 154, 240, 113, 251, 53, 190, 25, 197, 175, 102, 56, 171, 226, 223, 246, 231, 63, 213, 38, 184, 64, 54, 67, 125, 72, 6, 72, 211, 60, 114, 216, 237, 90, 255, 133, 7, 207, 175, 161, 121, 243, 171, 220, 252, 93, 214, 97, 30, 164, 141, 54, 36, 127, 215, 251, 230, 1, 29, 7, 212, 35, 116, 145, 208, 14, 25, 229, 27, 163, 210, 29, 70, 213, 97, 84, 115, 8, 125, 75, 168, 97, 130, 144, 106, 34, 146, 24, 219, 96, 106, 40, 173, 166, 218, 40, 23, 218, 8, 2, 90, 198, 96, 235, 149, 230, 17, 132, 108, 41, 33, 56, 165, 199, 217, 60, 253, 190, 149, 34, 103, 37, 40, 34, 165, 138, 148, 56, 53, 151, 234, 147, 205, 196, 200, 105, 70, 147, 9, 23, 10, 88, 16, 58, 82, 58, 55, 160, 212, 92, 70, 0, 34, 163, 137, 140, 126, 104, 36, 136, 55, 74, 236, 82, 126, 147, 139, 57, 147, 242, 8, 187, 220, 177, 212, 188, 76, 218, 163, 196, 213, 28, 235, 19, 227, 208, 72, 133, 153, 196, 84, 217, 136, 69, 65, 227, 4, 145, 20, 86, 77, 56, 150, 200, 73, 13, 89, 136, 250, 35, 189, 25, 114, 226, 197, 4, 8, 162, 0, 41, 41, 231, 44, 37, 51, 57, 163, 2, 41, 52, 115, 164, 125, 38, 103, 84, 32, 101, 135, 81, 11, 252, 24, 2, 67, 228, 140, 18, 164, 156, 161, 198, 16, 44, 94, 53, 33, 138, 16, 138, 225, 34, 6, 157, 69, 44, 228, 205, 187, 156, 56, 103, 65, 129, 168, 65, 56, 90, 195, 104, 169, 50, 75, 221, 33, 138, 16, 162, 157, 90, 171, 117, 206, 181, 179, 132, 15, 162, 12, 161, 29, 166, 138, 210, 25, 78, 145, 229, 12, 16, 10, 167, 140, 50, 164, 133, 167, 218, 41, 22, 219, 41, 163, 12, 105, 133, 19, 156, 234, 115, 125, 43, 163, 12, 105, 237, 167, 10, 204, 79, 229, 52, 49, 59, 181, 27, 42, 188, 82, 220, 210, 75, 73, 26, 99, 204, 77, 3, 195, 146, 36, 36, 199, 187, 140, 184, 148, 49, 166, 166, 25, 41, 173, 2, 66, 173, 55, 39, 98, 77, 76, 76, 99, 71, 19, 233, 217, 54, 18, 25, 99, 90, 90, 16, 215, 242, 170, 77, 59, 19, 229, 38, 214, 105, 26, 163, 244, 52, 198, 152, 146, 214, 12, 83, 82, 229, 106, 246, 108, 209, 165, 104, 10, 107, 99, 66, 90, 63, 178, 209, 94, 104, 30, 109, 172, 10, 220, 104, 83, 171, 185, 132, 196, 133, 203, 198, 146, 192, 141, 116, 14, 60, 65, 231, 230, 72, 142, 141, 146, 227, 180, 94, 158, 28, 196, 80, 141, 146, 227, 28, 185, 212, 194, 133, 27, 47, 27, 37, 199, 143, 210, 49, 43, 171, 89, 70, 98, 173, 110, 163, 228, 120, 212, 87, 11, 213, 40, 57, 222, 226, 148, 141, 52, 89, 165, 121, 213, 69, 201, 1, 49, 46, 4, 236, 133, 66, 199, 65, 162, 28, 201, 92, 119, 219, 21, 126, 249, 121, 86, 166, 110, 136, 24, 59, 86, 92, 104, 42, 93, 234, 134, 180, 187, 247, 190, 99, 29, 123, 46, 137, 142,
- 77, 205, 16, 80, 147, 148, 52, 225, 161, 173, 31, 46, 53, 67, 192, 152, 107, 229, 136, 75, 221, 144, 113, 59, 68, 201, 11, 213, 87, 206, 166, 102, 154, 28, 38, 9, 106, 174, 99, 145, 104, 165, 75, 148, 214, 92, 205, 202, 40, 62, 160, 198, 10, 123, 41, 74, 159, 212, 71, 33, 94, 43, 98, 85, 202, 75, 53, 146, 2, 115, 161, 114, 192, 161, 61, 155, 233, 134, 59, 60, 100, 147, 106, 90, 111, 75, 167, 201, 196, 201, 110, 154, 204, 48, 194, 28, 59, 149, 61, 83, 142, 218, 105, 93, 45, 176, 148, 98, 18, 105, 148, 58, 101, 9, 142, 178, 36, 183, 115, 94, 108, 165, 57, 119, 185, 71, 219, 187, 236, 46, 118, 233, 249, 1, 166, 213, 75, 139, 225, 130, 9, 157, 240, 1, 18, 37, 208, 178, 4, 83, 196, 106, 57, 116, 44, 200, 76, 207, 57, 223, 141, 165, 117, 181, 48, 149, 5, 26, 197, 181, 40, 125, 90, 189, 180, 158, 148, 159, 110, 99, 189, 215, 212, 194, 57, 147, 153, 226, 71, 187, 169, 46, 136, 84, 25, 51, 125, 143, 210, 209, 40, 147, 153, 102, 178, 119, 151, 11, 31, 57, 199, 179, 38, 77, 166, 145, 83, 86, 130, 166, 245, 238, 136, 102, 166, 194, 192, 160, 207, 139, 65, 86, 99, 231, 104, 1, 190, 158, 62, 77, 200, 15, 200, 79, 165, 76, 34, 107, 140, 154, 232, 55, 247, 202, 202, 197, 7, 123, 242, 108, 230, 168, 247, 130, 153, 196, 204, 47, 153, 180, 186, 64, 157, 25, 157, 158, 136, 88, 80, 36, 197, 163, 229, 165, 74, 11, 166, 21, 19, 11, 38, 141, 145, 38, 177, 6, 207, 132, 118, 162, 168, 164, 233, 29, 18, 107, 159, 36, 4, 118, 172, 119, 134, 27, 60, 68, 185, 83, 41, 41, 173, 155, 186, 196, 128, 57, 191, 138, 57, 87, 10, 146, 99, 221, 248, 236, 178, 179, 217, 107, 155, 238, 31, 23, 149, 196, 210, 39, 213, 33, 78, 78, 118, 39, 63, 115, 179, 7, 50, 45, 36, 206, 76, 157, 60, 33, 169, 118, 166, 30, 60, 201, 243, 217, 247, 168, 222, 186, 24, 167, 79, 43, 137, 243, 114, 234, 244, 27, 73, 101, 1, 109, 54, 125, 242, 172, 23, 72, 165, 132, 133, 148, 42, 149, 120, 30, 134, 142, 237, 48, 138, 92, 94, 186, 57, 11, 137, 203, 49, 94, 174, 142, 77, 18, 235, 71, 55, 68, 32, 71, 169, 23, 82, 106, 113, 190, 58, 97, 230, 156, 57, 205, 162, 76, 1, 235, 29, 92, 203, 177, 90, 166, 203, 26, 194, 80, 15, 14, 22, 91, 169, 18, 165, 146, 115, 172, 156, 83, 57, 107, 76, 148, 218, 94, 205, 177, 58, 81, 78, 174, 94, 189, 83, 239, 197, 86, 198, 5, 83, 130, 184, 158, 149, 233, 174, 15, 204, 155, 203, 89, 101, 65, 140, 216, 184, 114, 9, 150, 216, 17, 181, 238, 246, 166, 189, 92, 217, 190, 252, 185, 125, 174, 171, 250, 254, 237, 166, 165, 61, 223, 180, 76, 191, 41, 118, 213, 243, 49, 53, 68, 142, 219, 245, 161, 78, 199, 184, 229, 99, 4, 124, 83, 175, 38, 76, 32, 194, 142, 238, 21, 1, 36, 132, 167, 32, 130, 110, 158, 17, 216, 69, 96, 14, 17, 198, 126, 70, 4, 190, 143, 237, 232, 34, 122, 118, 144, 56, 66, 79, 150, 137, 176, 29, 132, 36, 33, 216, 150, 183, 151, 57, 62, 118, 111, 31, 226, 217, 144, 112, 173, 225, 99, 72, 232, 1, 190, 78, 98, 215, 193, 154, 132, 48, 92, 4, 45, 124, 67, 29, 247, 110, 160, 72, 10, 130, 22, 40, 61, 132, 97, 35, 44, 27, 225, 185, 136, 254, 20, 102, 77, 119, 34, 227, 44, 160, 32, 122, 147, 110, 72, 8, 195, 69, 244, 38, 61, 107, 186, 99, 107, 86, 15, 97, 216, 8, 203, 70, 144, 178, 48, 140, 157, 57, 31, 200, 77, 194, 30, 130, 148, 82, 61, 132, 225, 114, 104, 199, 70, 120, 46, 130, 24, 37, 29, 132, 101, 207, 135, 183, 220, 81, 121, 182, 29, 237, 189, 122, 46, 68, 147, 50, 189, 11, 1, 62, 11, 32, 159, 69, 243, 89, 44, 159, 197, 115, 67, 184, 175, 141, 121, 136, 201, 100, 22, 146, 16, 154, 205, 97, 184, 28, 189, 204, 146, 36, 132, 231, 34, 136, 153, 101, 50, 121, 66, 66, 244, 163, 94, 209, 32, 154, 148, 191, 38, 23, 245, 52, 22, 98, 212, 27, 126, 8, 207, 88, 171, 109, 38, 30, 21, 9, 65, 243, 151, 205, 196, 35, 137, 67, 59, 46, 135, 246, 92, 132, 209, 92, 95, 121, 203, 69, 244, 227, 17, 104, 144, 206, 184, 4, 9, 1, 124, 18, 64, 62, 196, 178, 33, 221, 112, 204, 155, 226, 217, 149, 138, 103, 87, 142, 62, 19, 191, 72, 66, 24, 46, 71, 47, 126, 21, 9, 225, 185, 8, 195, 182, 131, 168, 167, 62, 23, 191, 68, 8, 45, 175, 124, 46, 128, 105, 44, 32, 249, 16, 197, 135, 88, 238, 172, 244, 247, 213, 89, 72, 251, 55, 136, 111, 46, 35, 133, 125, 155, 180, 60, 221, 238, 67, 12, 13, 226, 184, 213, 74, 31, 98, 104, 16, 207, 183, 197, 179, 109, 9, 2, 196, 180, 165, 7, 121, 199, 150, 219, 155, 115, 199, 236, 251, 151, 219, 155, 246, 207, 186, 255, 7, 80, 75, 1, 2, 20, 0, 20, 0, 0, 8, 8, 0, 187, 182, 42, 68, 95, 169, 84, 175, 60, 66, 0, 0, 49, 67, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 114, 105, 97, 108, 95, 52, 56, 46, 112, 110, 103, 80, 75, 1, 2, 20, 0, 20, 0, 0, 8, 8, 0, 187, 182, 42, 68, 34, 236, 10, 177, 219, 6, 0, 0, 221, 61, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 66, 0, 0, 97, 114, 105, 97, 108, 95, 52, 56, 46, 102, 110, 116, 80, 75, 5, 6, 0, 0, 0, 0, 2, 0, 2, 0, 116, 0, 0, 0, 107, 73, 0, 0, 0, 0];
+const List<int> _ARIAL_48 = const [
+ 80,
+ 75,
+ 3,
+ 4,
+ 20,
+ 0,
+ 0,
+ 8,
+ 8,
+ 0,
+ 187,
+ 182,
+ 42,
+ 68,
+ 95,
+ 169,
+ 84,
+ 175,
+ 60,
+ 66,
+ 0,
+ 0,
+ 49,
+ 67,
+ 0,
+ 0,
+ 12,
+ 0,
+ 0,
+ 0,
+ 97,
+ 114,
+ 105,
+ 97,
+ 108,
+ 95,
+ 52,
+ 56,
+ 46,
+ 112,
+ 110,
+ 103,
+ 164,
+ 187,
+ 85,
+ 80,
+ 92,
+ 77,
+ 224,
+ 237,
+ 59,
+ 131,
+ 187,
+ 7,
+ 201,
+ 64,
+ 112,
+ 11,
+ 110,
+ 131,
+ 133,
+ 224,
+ 238,
+ 16,
+ 130,
+ 59,
+ 9,
+ 131,
+ 12,
+ 4,
+ 6,
+ 215,
+ 193,
+ 33,
+ 193,
+ 157,
+ 96,
+ 131,
+ 36,
+ 192,
+ 135,
+ 195,
+ 224,
+ 26,
+ 66,
+ 176,
+ 32,
+ 67,
+ 66,
+ 128,
+ 76,
+ 112,
+ 39,
+ 184,
+ 219,
+ 0,
+ 55,
+ 255,
+ 115,
+ 238,
+ 173,
+ 243,
+ 112,
+ 30,
+ 239,
+ 170,
+ 93,
+ 187,
+ 118,
+ 213,
+ 126,
+ 233,
+ 174,
+ 213,
+ 221,
+ 235,
+ 183,
+ 30,
+ 58,
+ 193,
+ 64,
+ 79,
+ 157,
+ 148,
+ 232,
+ 41,
+ 17,
+ 0,
+ 0,
+ 32,
+ 213,
+ 212,
+ 80,
+ 49,
+ 2,
+ 0,
+ 8,
+ 160,
+ 255,
+ 190,
+ 69,
+ 8,
+ 240,
+ 254,
+ 189,
+ 93,
+ 253,
+ 135,
+ 138,
+ 1,
+ 0,
+ 165,
+ 107,
+ 77,
+ 21,
+ 197,
+ 87,
+ 1,
+ 232,
+ 3,
+ 235,
+ 164,
+ 198,
+ 242,
+ 246,
+ 186,
+ 34,
+ 18,
+ 130,
+ 8,
+ 138,
+ 255,
+ 247,
+ 249,
+ 194,
+ 74,
+ 129,
+ 197,
+ 74,
+ 49,
+ 16,
+ 173,
+ 64,
+ 192,
+ 141,
+ 35,
+ 26,
+ 16,
+ 118,
+ 181,
+ 160,
+ 125,
+ 36,
+ 202,
+ 168,
+ 153,
+ 237,
+ 244,
+ 27,
+ 37,
+ 103,
+ 100,
+ 50,
+ 247,
+ 250,
+ 128,
+ 177,
+ 95,
+ 254,
+ 118,
+ 206,
+ 249,
+ 102,
+ 78,
+ 136,
+ 251,
+ 255,
+ 183,
+ 42,
+ 30,
+ 13,
+ 18,
+ 27,
+ 31,
+ 167,
+ 132,
+ 48,
+ 219,
+ 109,
+ 15,
+ 203,
+ 143,
+ 247,
+ 203,
+ 158,
+ 251,
+ 254,
+ 24,
+ 221,
+ 156,
+ 128,
+ 185,
+ 172,
+ 219,
+ 247,
+ 103,
+ 185,
+ 13,
+ 210,
+ 33,
+ 143,
+ 143,
+ 143,
+ 152,
+ 161,
+ 71,
+ 204,
+ 71,
+ 162,
+ 117,
+ 130,
+ 28,
+ 9,
+ 130,
+ 241,
+ 237,
+ 222,
+ 97,
+ 73,
+ 246,
+ 245,
+ 226,
+ 190,
+ 71,
+ 57,
+ 152,
+ 213,
+ 242,
+ 145,
+ 45,
+ 220,
+ 95,
+ 104,
+ 56,
+ 55,
+ 120,
+ 72,
+ 22,
+ 125,
+ 228,
+ 203,
+ 53,
+ 52,
+ 143,
+ 237,
+ 118,
+ 50,
+ 85,
+ 143,
+ 87,
+ 172,
+ 177,
+ 28,
+ 154,
+ 200,
+ 180,
+ 80,
+ 223,
+ 53,
+ 20,
+ 104,
+ 222,
+ 150,
+ 246,
+ 117,
+ 27,
+ 63,
+ 37,
+ 252,
+ 209,
+ 82,
+ 59,
+ 4,
+ 6,
+ 15,
+ 88,
+ 9,
+ 120,
+ 22,
+ 10,
+ 22,
+ 41,
+ 74,
+ 94,
+ 73,
+ 224,
+ 140,
+ 243,
+ 164,
+ 94,
+ 15,
+ 157,
+ 104,
+ 163,
+ 28,
+ 249,
+ 244,
+ 86,
+ 183,
+ 249,
+ 124,
+ 168,
+ 196,
+ 182,
+ 74,
+ 194,
+ 83,
+ 240,
+ 212,
+ 247,
+ 153,
+ 115,
+ 58,
+ 119,
+ 178,
+ 243,
+ 208,
+ 217,
+ 53,
+ 185,
+ 57,
+ 35,
+ 189,
+ 163,
+ 91,
+ 178,
+ 8,
+ 142,
+ 195,
+ 163,
+ 210,
+ 103,
+ 61,
+ 65,
+ 87,
+ 177,
+ 202,
+ 237,
+ 71,
+ 177,
+ 184,
+ 250,
+ 239,
+ 125,
+ 2,
+ 99,
+ 129,
+ 252,
+ 243,
+ 193,
+ 112,
+ 207,
+ 196,
+ 113,
+ 255,
+ 214,
+ 254,
+ 249,
+ 237,
+ 68,
+ 231,
+ 63,
+ 223,
+ 123,
+ 15,
+ 165,
+ 221,
+ 136,
+ 119,
+ 190,
+ 201,
+ 251,
+ 56,
+ 38,
+ 181,
+ 168,
+ 94,
+ 74,
+ 230,
+ 52,
+ 249,
+ 72,
+ 9,
+ 31,
+ 105,
+ 236,
+ 46,
+ 144,
+ 188,
+ 212,
+ 163,
+ 114,
+ 136,
+ 226,
+ 254,
+ 112,
+ 2,
+ 184,
+ 125,
+ 195,
+ 26,
+ 242,
+ 53,
+ 107,
+ 79,
+ 217,
+ 105,
+ 60,
+ 144,
+ 187,
+ 87,
+ 104,
+ 118,
+ 186,
+ 81,
+ 56,
+ 52,
+ 165,
+ 122,
+ 237,
+ 42,
+ 232,
+ 91,
+ 47,
+ 56,
+ 46,
+ 148,
+ 148,
+ 176,
+ 239,
+ 177,
+ 165,
+ 45,
+ 42,
+ 186,
+ 158,
+ 103,
+ 209,
+ 126,
+ 223,
+ 118,
+ 56,
+ 125,
+ 185,
+ 230,
+ 166,
+ 199,
+ 81,
+ 31,
+ 236,
+ 148,
+ 50,
+ 252,
+ 116,
+ 47,
+ 127,
+ 109,
+ 206,
+ 243,
+ 222,
+ 25,
+ 83,
+ 40,
+ 194,
+ 41,
+ 159,
+ 42,
+ 216,
+ 16,
+ 191,
+ 73,
+ 182,
+ 76,
+ 178,
+ 96,
+ 25,
+ 195,
+ 56,
+ 145,
+ 120,
+ 221,
+ 209,
+ 247,
+ 29,
+ 108,
+ 181,
+ 175,
+ 236,
+ 216,
+ 29,
+ 39,
+ 167,
+ 156,
+ 18,
+ 205,
+ 248,
+ 39,
+ 191,
+ 138,
+ 185,
+ 45,
+ 189,
+ 245,
+ 180,
+ 33,
+ 13,
+ 27,
+ 70,
+ 58,
+ 148,
+ 169,
+ 111,
+ 245,
+ 83,
+ 143,
+ 82,
+ 4,
+ 226,
+ 123,
+ 111,
+ 61,
+ 214,
+ 230,
+ 240,
+ 183,
+ 32,
+ 141,
+ 126,
+ 56,
+ 251,
+ 164,
+ 22,
+ 215,
+ 124,
+ 239,
+ 245,
+ 77,
+ 175,
+ 244,
+ 133,
+ 160,
+ 70,
+ 189,
+ 249,
+ 150,
+ 16,
+ 5,
+ 232,
+ 87,
+ 197,
+ 90,
+ 92,
+ 181,
+ 190,
+ 147,
+ 48,
+ 153,
+ 95,
+ 129,
+ 177,
+ 162,
+ 31,
+ 214,
+ 122,
+ 112,
+ 101,
+ 136,
+ 121,
+ 205,
+ 132,
+ 73,
+ 107,
+ 205,
+ 156,
+ 108,
+ 75,
+ 95,
+ 180,
+ 7,
+ 137,
+ 134,
+ 71,
+ 137,
+ 228,
+ 194,
+ 157,
+ 77,
+ 153,
+ 190,
+ 180,
+ 155,
+ 207,
+ 70,
+ 187,
+ 210,
+ 128,
+ 250,
+ 228,
+ 4,
+ 181,
+ 249,
+ 93,
+ 154,
+ 236,
+ 6,
+ 159,
+ 245,
+ 37,
+ 52,
+ 160,
+ 146,
+ 233,
+ 125,
+ 94,
+ 183,
+ 153,
+ 40,
+ 153,
+ 238,
+ 55,
+ 192,
+ 214,
+ 9,
+ 251,
+ 133,
+ 167,
+ 149,
+ 52,
+ 205,
+ 70,
+ 186,
+ 197,
+ 78,
+ 215,
+ 194,
+ 9,
+ 75,
+ 43,
+ 119,
+ 230,
+ 76,
+ 240,
+ 156,
+ 149,
+ 207,
+ 24,
+ 121,
+ 215,
+ 117,
+ 248,
+ 98,
+ 189,
+ 150,
+ 79,
+ 99,
+ 190,
+ 155,
+ 82,
+ 216,
+ 148,
+ 248,
+ 230,
+ 223,
+ 93,
+ 170,
+ 214,
+ 149,
+ 125,
+ 110,
+ 243,
+ 161,
+ 152,
+ 97,
+ 140,
+ 58,
+ 7,
+ 183,
+ 124,
+ 206,
+ 49,
+ 161,
+ 208,
+ 205,
+ 21,
+ 76,
+ 48,
+ 20,
+ 255,
+ 218,
+ 191,
+ 107,
+ 231,
+ 97,
+ 214,
+ 108,
+ 238,
+ 28,
+ 221,
+ 55,
+ 87,
+ 83,
+ 165,
+ 90,
+ 27,
+ 251,
+ 190,
+ 54,
+ 15,
+ 220,
+ 90,
+ 226,
+ 138,
+ 80,
+ 123,
+ 169,
+ 172,
+ 62,
+ 99,
+ 150,
+ 179,
+ 126,
+ 7,
+ 197,
+ 149,
+ 163,
+ 16,
+ 191,
+ 125,
+ 138,
+ 34,
+ 254,
+ 118,
+ 22,
+ 83,
+ 17,
+ 106,
+ 78,
+ 32,
+ 135,
+ 206,
+ 106,
+ 104,
+ 140,
+ 237,
+ 94,
+ 230,
+ 58,
+ 6,
+ 54,
+ 15,
+ 210,
+ 25,
+ 205,
+ 12,
+ 153,
+ 82,
+ 47,
+ 201,
+ 68,
+ 187,
+ 170,
+ 70,
+ 62,
+ 19,
+ 149,
+ 250,
+ 82,
+ 240,
+ 83,
+ 86,
+ 1,
+ 100,
+ 64,
+ 5,
+ 215,
+ 194,
+ 192,
+ 136,
+ 29,
+ 99,
+ 215,
+ 9,
+ 19,
+ 7,
+ 182,
+ 4,
+ 233,
+ 31,
+ 203,
+ 233,
+ 127,
+ 142,
+ 92,
+ 15,
+ 85,
+ 242,
+ 172,
+ 69,
+ 76,
+ 110,
+ 125,
+ 144,
+ 198,
+ 77,
+ 174,
+ 139,
+ 2,
+ 83,
+ 40,
+ 135,
+ 122,
+ 197,
+ 59,
+ 15,
+ 221,
+ 134,
+ 91,
+ 103,
+ 237,
+ 92,
+ 117,
+ 229,
+ 221,
+ 181,
+ 41,
+ 135,
+ 0,
+ 146,
+ 182,
+ 45,
+ 241,
+ 9,
+ 2,
+ 214,
+ 180,
+ 41,
+ 94,
+ 181,
+ 13,
+ 191,
+ 224,
+ 12,
+ 114,
+ 73,
+ 131,
+ 99,
+ 11,
+ 186,
+ 201,
+ 184,
+ 164,
+ 139,
+ 22,
+ 4,
+ 178,
+ 104,
+ 106,
+ 64,
+ 38,
+ 176,
+ 169,
+ 142,
+ 163,
+ 7,
+ 159,
+ 157,
+ 39,
+ 248,
+ 126,
+ 140,
+ 151,
+ 176,
+ 137,
+ 14,
+ 114,
+ 206,
+ 156,
+ 207,
+ 254,
+ 185,
+ 16,
+ 172,
+ 29,
+ 248,
+ 100,
+ 108,
+ 218,
+ 215,
+ 211,
+ 191,
+ 108,
+ 208,
+ 78,
+ 127,
+ 100,
+ 131,
+ 13,
+ 53,
+ 106,
+ 152,
+ 193,
+ 136,
+ 87,
+ 180,
+ 8,
+ 239,
+ 99,
+ 160,
+ 144,
+ 118,
+ 167,
+ 63,
+ 42,
+ 166,
+ 87,
+ 221,
+ 225,
+ 109,
+ 75,
+ 141,
+ 173,
+ 129,
+ 154,
+ 206,
+ 255,
+ 254,
+ 238,
+ 117,
+ 139,
+ 191,
+ 81,
+ 8,
+ 3,
+ 6,
+ 167,
+ 154,
+ 148,
+ 143,
+ 181,
+ 152,
+ 44,
+ 191,
+ 24,
+ 250,
+ 117,
+ 148,
+ 154,
+ 50,
+ 176,
+ 33,
+ 166,
+ 141,
+ 38,
+ 47,
+ 156,
+ 93,
+ 106,
+ 88,
+ 242,
+ 196,
+ 70,
+ 143,
+ 28,
+ 223,
+ 169,
+ 18,
+ 114,
+ 224,
+ 67,
+ 43,
+ 247,
+ 73,
+ 136,
+ 27,
+ 12,
+ 189,
+ 67,
+ 243,
+ 48,
+ 104,
+ 134,
+ 48,
+ 103,
+ 19,
+ 56,
+ 120,
+ 164,
+ 188,
+ 130,
+ 171,
+ 177,
+ 92,
+ 3,
+ 225,
+ 163,
+ 196,
+ 252,
+ 151,
+ 60,
+ 152,
+ 53,
+ 243,
+ 55,
+ 21,
+ 146,
+ 30,
+ 158,
+ 230,
+ 188,
+ 217,
+ 182,
+ 109,
+ 86,
+ 210,
+ 192,
+ 214,
+ 144,
+ 229,
+ 24,
+ 59,
+ 174,
+ 199,
+ 224,
+ 134,
+ 90,
+ 130,
+ 86,
+ 20,
+ 225,
+ 160,
+ 21,
+ 102,
+ 189,
+ 111,
+ 223,
+ 232,
+ 192,
+ 109,
+ 155,
+ 197,
+ 224,
+ 180,
+ 73,
+ 167,
+ 150,
+ 182,
+ 31,
+ 67,
+ 136,
+ 233,
+ 132,
+ 35,
+ 158,
+ 104,
+ 167,
+ 118,
+ 155,
+ 129,
+ 231,
+ 73,
+ 3,
+ 61,
+ 21,
+ 28,
+ 198,
+ 123,
+ 54,
+ 194,
+ 216,
+ 90,
+ 29,
+ 123,
+ 53,
+ 147,
+ 155,
+ 20,
+ 64,
+ 210,
+ 47,
+ 34,
+ 14,
+ 38,
+ 22,
+ 17,
+ 164,
+ 159,
+ 61,
+ 172,
+ 36,
+ 94,
+ 4,
+ 22,
+ 85,
+ 59,
+ 21,
+ 165,
+ 151,
+ 158,
+ 248,
+ 119,
+ 15,
+ 143,
+ 175,
+ 98,
+ 210,
+ 108,
+ 103,
+ 57,
+ 182,
+ 133,
+ 142,
+ 24,
+ 72,
+ 174,
+ 184,
+ 40,
+ 94,
+ 146,
+ 91,
+ 50,
+ 75,
+ 65,
+ 214,
+ 29,
+ 21,
+ 65,
+ 236,
+ 111,
+ 181,
+ 151,
+ 128,
+ 200,
+ 180,
+ 221,
+ 184,
+ 199,
+ 180,
+ 40,
+ 1,
+ 194,
+ 149,
+ 84,
+ 128,
+ 8,
+ 92,
+ 98,
+ 31,
+ 230,
+ 171,
+ 8,
+ 236,
+ 223,
+ 128,
+ 64,
+ 251,
+ 244,
+ 130,
+ 66,
+ 133,
+ 222,
+ 72,
+ 102,
+ 158,
+ 248,
+ 219,
+ 141,
+ 4,
+ 11,
+ 207,
+ 72,
+ 124,
+ 70,
+ 144,
+ 218,
+ 203,
+ 189,
+ 1,
+ 31,
+ 83,
+ 62,
+ 154,
+ 125,
+ 143,
+ 78,
+ 130,
+ 70,
+ 75,
+ 44,
+ 152,
+ 62,
+ 11,
+ 166,
+ 74,
+ 116,
+ 102,
+ 185,
+ 164,
+ 45,
+ 45,
+ 65,
+ 60,
+ 27,
+ 25,
+ 149,
+ 62,
+ 151,
+ 56,
+ 139,
+ 193,
+ 50,
+ 15,
+ 57,
+ 24,
+ 61,
+ 230,
+ 64,
+ 13,
+ 81,
+ 70,
+ 213,
+ 40,
+ 201,
+ 10,
+ 63,
+ 223,
+ 159,
+ 250,
+ 175,
+ 113,
+ 207,
+ 104,
+ 200,
+ 220,
+ 155,
+ 154,
+ 201,
+ 63,
+ 10,
+ 76,
+ 165,
+ 53,
+ 203,
+ 113,
+ 98,
+ 69,
+ 133,
+ 244,
+ 74,
+ 12,
+ 55,
+ 73,
+ 46,
+ 134,
+ 54,
+ 144,
+ 125,
+ 54,
+ 18,
+ 123,
+ 60,
+ 193,
+ 124,
+ 126,
+ 23,
+ 137,
+ 135,
+ 15,
+ 157,
+ 135,
+ 131,
+ 105,
+ 186,
+ 123,
+ 251,
+ 104,
+ 120,
+ 168,
+ 27,
+ 96,
+ 161,
+ 173,
+ 101,
+ 5,
+ 87,
+ 81,
+ 220,
+ 226,
+ 122,
+ 167,
+ 35,
+ 0,
+ 119,
+ 72,
+ 161,
+ 167,
+ 209,
+ 42,
+ 27,
+ 2,
+ 191,
+ 234,
+ 217,
+ 134,
+ 159,
+ 18,
+ 253,
+ 147,
+ 51,
+ 51,
+ 14,
+ 4,
+ 233,
+ 150,
+ 133,
+ 68,
+ 252,
+ 11,
+ 183,
+ 185,
+ 0,
+ 251,
+ 241,
+ 208,
+ 39,
+ 50,
+ 153,
+ 156,
+ 138,
+ 32,
+ 168,
+ 135,
+ 157,
+ 23,
+ 169,
+ 30,
+ 188,
+ 223,
+ 15,
+ 5,
+ 80,
+ 38,
+ 88,
+ 114,
+ 163,
+ 113,
+ 123,
+ 65,
+ 216,
+ 43,
+ 194,
+ 231,
+ 116,
+ 172,
+ 238,
+ 93,
+ 49,
+ 132,
+ 126,
+ 73,
+ 129,
+ 108,
+ 164,
+ 232,
+ 172,
+ 16,
+ 105,
+ 197,
+ 167,
+ 21,
+ 231,
+ 189,
+ 255,
+ 239,
+ 219,
+ 202,
+ 159,
+ 81,
+ 9,
+ 94,
+ 113,
+ 103,
+ 218,
+ 134,
+ 11,
+ 79,
+ 28,
+ 168,
+ 70,
+ 100,
+ 195,
+ 130,
+ 132,
+ 31,
+ 74,
+ 77,
+ 186,
+ 127,
+ 8,
+ 91,
+ 1,
+ 212,
+ 60,
+ 45,
+ 249,
+ 84,
+ 247,
+ 7,
+ 250,
+ 121,
+ 71,
+ 169,
+ 38,
+ 66,
+ 35,
+ 234,
+ 156,
+ 49,
+ 188,
+ 93,
+ 201,
+ 126,
+ 133,
+ 239,
+ 111,
+ 231,
+ 185,
+ 142,
+ 196,
+ 182,
+ 109,
+ 21,
+ 4,
+ 73,
+ 48,
+ 103,
+ 39,
+ 140,
+ 250,
+ 52,
+ 202,
+ 49,
+ 109,
+ 139,
+ 135,
+ 134,
+ 176,
+ 62,
+ 147,
+ 152,
+ 117,
+ 131,
+ 106,
+ 21,
+ 179,
+ 226,
+ 38,
+ 40,
+ 158,
+ 212,
+ 78,
+ 190,
+ 95,
+ 38,
+ 8,
+ 237,
+ 120,
+ 7,
+ 124,
+ 86,
+ 191,
+ 96,
+ 56,
+ 132,
+ 38,
+ 29,
+ 40,
+ 189,
+ 138,
+ 62,
+ 238,
+ 86,
+ 245,
+ 207,
+ 143,
+ 200,
+ 207,
+ 9,
+ 97,
+ 71,
+ 169,
+ 189,
+ 102,
+ 60,
+ 225,
+ 64,
+ 197,
+ 54,
+ 244,
+ 55,
+ 60,
+ 223,
+ 80,
+ 88,
+ 120,
+ 163,
+ 108,
+ 36,
+ 158,
+ 77,
+ 155,
+ 238,
+ 29,
+ 136,
+ 97,
+ 171,
+ 150,
+ 22,
+ 249,
+ 235,
+ 211,
+ 120,
+ 68,
+ 154,
+ 37,
+ 191,
+ 114,
+ 26,
+ 31,
+ 5,
+ 126,
+ 73,
+ 139,
+ 108,
+ 116,
+ 104,
+ 221,
+ 24,
+ 69,
+ 36,
+ 41,
+ 63,
+ 214,
+ 227,
+ 102,
+ 135,
+ 37,
+ 189,
+ 233,
+ 12,
+ 110,
+ 140,
+ 160,
+ 55,
+ 12,
+ 164,
+ 122,
+ 220,
+ 88,
+ 14,
+ 217,
+ 131,
+ 111,
+ 206,
+ 240,
+ 174,
+ 245,
+ 201,
+ 36,
+ 252,
+ 52,
+ 177,
+ 172,
+ 170,
+ 79,
+ 191,
+ 108,
+ 51,
+ 176,
+ 106,
+ 124,
+ 138,
+ 110,
+ 22,
+ 74,
+ 134,
+ 78,
+ 77,
+ 124,
+ 157,
+ 193,
+ 131,
+ 66,
+ 246,
+ 233,
+ 125,
+ 142,
+ 37,
+ 185,
+ 245,
+ 181,
+ 70,
+ 219,
+ 79,
+ 237,
+ 232,
+ 101,
+ 201,
+ 89,
+ 43,
+ 195,
+ 255,
+ 115,
+ 171,
+ 161,
+ 234,
+ 195,
+ 93,
+ 107,
+ 6,
+ 173,
+ 29,
+ 22,
+ 149,
+ 40,
+ 35,
+ 91,
+ 46,
+ 14,
+ 9,
+ 17,
+ 73,
+ 241,
+ 254,
+ 171,
+ 212,
+ 119,
+ 167,
+ 67,
+ 190,
+ 189,
+ 1,
+ 53,
+ 80,
+ 62,
+ 251,
+ 2,
+ 184,
+ 52,
+ 161,
+ 134,
+ 91,
+ 74,
+ 33,
+ 159,
+ 112,
+ 139,
+ 2,
+ 40,
+ 97,
+ 96,
+ 189,
+ 229,
+ 201,
+ 95,
+ 83,
+ 143,
+ 129,
+ 74,
+ 28,
+ 72,
+ 148,
+ 193,
+ 107,
+ 3,
+ 190,
+ 185,
+ 74,
+ 95,
+ 63,
+ 156,
+ 228,
+ 164,
+ 202,
+ 254,
+ 239,
+ 43,
+ 25,
+ 139,
+ 138,
+ 160,
+ 155,
+ 127,
+ 35,
+ 235,
+ 151,
+ 252,
+ 180,
+ 202,
+ 148,
+ 165,
+ 229,
+ 198,
+ 94,
+ 112,
+ 85,
+ 175,
+ 99,
+ 167,
+ 202,
+ 46,
+ 96,
+ 21,
+ 18,
+ 158,
+ 193,
+ 78,
+ 141,
+ 85,
+ 214,
+ 8,
+ 60,
+ 154,
+ 95,
+ 43,
+ 54,
+ 77,
+ 229,
+ 31,
+ 121,
+ 65,
+ 167,
+ 42,
+ 186,
+ 219,
+ 226,
+ 113,
+ 182,
+ 123,
+ 47,
+ 54,
+ 19,
+ 155,
+ 67,
+ 140,
+ 182,
+ 147,
+ 146,
+ 229,
+ 243,
+ 79,
+ 34,
+ 92,
+ 20,
+ 18,
+ 196,
+ 225,
+ 99,
+ 140,
+ 118,
+ 64,
+ 144,
+ 170,
+ 60,
+ 106,
+ 82,
+ 171,
+ 184,
+ 105,
+ 21,
+ 195,
+ 2,
+ 143,
+ 79,
+ 199,
+ 235,
+ 4,
+ 84,
+ 8,
+ 3,
+ 122,
+ 21,
+ 247,
+ 109,
+ 185,
+ 125,
+ 74,
+ 131,
+ 183,
+ 208,
+ 27,
+ 117,
+ 7,
+ 209,
+ 243,
+ 198,
+ 19,
+ 83,
+ 50,
+ 246,
+ 133,
+ 174,
+ 186,
+ 146,
+ 79,
+ 255,
+ 68,
+ 177,
+ 141,
+ 58,
+ 169,
+ 57,
+ 216,
+ 75,
+ 98,
+ 46,
+ 245,
+ 78,
+ 44,
+ 86,
+ 187,
+ 151,
+ 125,
+ 126,
+ 6,
+ 201,
+ 147,
+ 33,
+ 41,
+ 113,
+ 173,
+ 27,
+ 107,
+ 176,
+ 44,
+ 241,
+ 161,
+ 78,
+ 216,
+ 224,
+ 75,
+ 30,
+ 217,
+ 14,
+ 3,
+ 82,
+ 164,
+ 189,
+ 137,
+ 198,
+ 39,
+ 140,
+ 49,
+ 23,
+ 132,
+ 189,
+ 109,
+ 132,
+ 19,
+ 11,
+ 74,
+ 255,
+ 228,
+ 111,
+ 248,
+ 117,
+ 198,
+ 201,
+ 179,
+ 119,
+ 32,
+ 109,
+ 117,
+ 16,
+ 23,
+ 108,
+ 230,
+ 76,
+ 61,
+ 253,
+ 222,
+ 182,
+ 138,
+ 118,
+ 62,
+ 145,
+ 17,
+ 46,
+ 69,
+ 8,
+ 49,
+ 64,
+ 81,
+ 63,
+ 57,
+ 126,
+ 228,
+ 66,
+ 225,
+ 165,
+ 213,
+ 55,
+ 236,
+ 239,
+ 99,
+ 31,
+ 88,
+ 127,
+ 7,
+ 248,
+ 65,
+ 124,
+ 100,
+ 179,
+ 156,
+ 126,
+ 249,
+ 220,
+ 131,
+ 56,
+ 78,
+ 148,
+ 196,
+ 247,
+ 253,
+ 34,
+ 56,
+ 20,
+ 51,
+ 110,
+ 219,
+ 6,
+ 37,
+ 120,
+ 85,
+ 148,
+ 90,
+ 187,
+ 12,
+ 147,
+ 249,
+ 21,
+ 64,
+ 29,
+ 34,
+ 99,
+ 142,
+ 255,
+ 78,
+ 39,
+ 155,
+ 131,
+ 134,
+ 54,
+ 57,
+ 163,
+ 119,
+ 133,
+ 226,
+ 103,
+ 153,
+ 147,
+ 105,
+ 95,
+ 63,
+ 240,
+ 246,
+ 69,
+ 187,
+ 88,
+ 130,
+ 7,
+ 36,
+ 15,
+ 169,
+ 246,
+ 126,
+ 99,
+ 123,
+ 47,
+ 60,
+ 223,
+ 112,
+ 224,
+ 56,
+ 87,
+ 202,
+ 126,
+ 25,
+ 64,
+ 37,
+ 13,
+ 97,
+ 39,
+ 70,
+ 54,
+ 58,
+ 182,
+ 110,
+ 84,
+ 33,
+ 146,
+ 70,
+ 246,
+ 142,
+ 91,
+ 57,
+ 235,
+ 212,
+ 53,
+ 111,
+ 6,
+ 63,
+ 139,
+ 178,
+ 2,
+ 29,
+ 172,
+ 124,
+ 216,
+ 219,
+ 238,
+ 14,
+ 17,
+ 241,
+ 39,
+ 38,
+ 214,
+ 79,
+ 216,
+ 72,
+ 71,
+ 126,
+ 218,
+ 0,
+ 9,
+ 111,
+ 192,
+ 178,
+ 202,
+ 115,
+ 22,
+ 62,
+ 29,
+ 7,
+ 212,
+ 221,
+ 194,
+ 92,
+ 253,
+ 207,
+ 247,
+ 219,
+ 233,
+ 19,
+ 194,
+ 235,
+ 58,
+ 190,
+ 131,
+ 211,
+ 30,
+ 55,
+ 182,
+ 156,
+ 185,
+ 147,
+ 221,
+ 89,
+ 122,
+ 103,
+ 234,
+ 54,
+ 146,
+ 98,
+ 248,
+ 214,
+ 41,
+ 165,
+ 25,
+ 99,
+ 103,
+ 130,
+ 253,
+ 92,
+ 150,
+ 158,
+ 84,
+ 219,
+ 18,
+ 253,
+ 213,
+ 204,
+ 111,
+ 36,
+ 51,
+ 227,
+ 177,
+ 44,
+ 13,
+ 93,
+ 18,
+ 181,
+ 213,
+ 184,
+ 158,
+ 149,
+ 133,
+ 77,
+ 244,
+ 135,
+ 40,
+ 125,
+ 89,
+ 80,
+ 229,
+ 3,
+ 100,
+ 105,
+ 98,
+ 218,
+ 102,
+ 236,
+ 223,
+ 235,
+ 217,
+ 5,
+ 247,
+ 114,
+ 56,
+ 254,
+ 139,
+ 130,
+ 114,
+ 88,
+ 160,
+ 159,
+ 131,
+ 244,
+ 85,
+ 210,
+ 44,
+ 0,
+ 74,
+ 161,
+ 57,
+ 153,
+ 53,
+ 223,
+ 175,
+ 216,
+ 3,
+ 193,
+ 85,
+ 0,
+ 165,
+ 174,
+ 133,
+ 250,
+ 10,
+ 179,
+ 108,
+ 49,
+ 138,
+ 227,
+ 237,
+ 61,
+ 135,
+ 111,
+ 239,
+ 105,
+ 211,
+ 79,
+ 53,
+ 205,
+ 73,
+ 139,
+ 162,
+ 25,
+ 127,
+ 173,
+ 80,
+ 43,
+ 52,
+ 250,
+ 120,
+ 146,
+ 161,
+ 219,
+ 105,
+ 31,
+ 130,
+ 85,
+ 234,
+ 182,
+ 95,
+ 81,
+ 0,
+ 56,
+ 3,
+ 226,
+ 7,
+ 245,
+ 134,
+ 25,
+ 167,
+ 162,
+ 1,
+ 97,
+ 106,
+ 27,
+ 61,
+ 84,
+ 20,
+ 63,
+ 213,
+ 164,
+ 56,
+ 160,
+ 52,
+ 72,
+ 184,
+ 46,
+ 207,
+ 131,
+ 141,
+ 217,
+ 254,
+ 211,
+ 24,
+ 60,
+ 79,
+ 35,
+ 174,
+ 75,
+ 44,
+ 24,
+ 198,
+ 89,
+ 88,
+ 35,
+ 0,
+ 232,
+ 71,
+ 255,
+ 133,
+ 172,
+ 234,
+ 46,
+ 173,
+ 244,
+ 177,
+ 40,
+ 96,
+ 203,
+ 5,
+ 65,
+ 202,
+ 3,
+ 252,
+ 73,
+ 224,
+ 78,
+ 234,
+ 114,
+ 214,
+ 190,
+ 130,
+ 29,
+ 241,
+ 69,
+ 223,
+ 119,
+ 128,
+ 158,
+ 35,
+ 2,
+ 139,
+ 42,
+ 213,
+ 29,
+ 203,
+ 134,
+ 100,
+ 160,
+ 20,
+ 52,
+ 215,
+ 138,
+ 68,
+ 59,
+ 51,
+ 28,
+ 29,
+ 138,
+ 135,
+ 37,
+ 11,
+ 3,
+ 251,
+ 204,
+ 100,
+ 174,
+ 7,
+ 124,
+ 61,
+ 245,
+ 9,
+ 81,
+ 48,
+ 54,
+ 26,
+ 98,
+ 30,
+ 105,
+ 194,
+ 62,
+ 17,
+ 123,
+ 89,
+ 172,
+ 227,
+ 137,
+ 57,
+ 79,
+ 182,
+ 222,
+ 30,
+ 75,
+ 154,
+ 75,
+ 114,
+ 243,
+ 238,
+ 48,
+ 127,
+ 157,
+ 249,
+ 158,
+ 119,
+ 166,
+ 211,
+ 119,
+ 135,
+ 71,
+ 133,
+ 111,
+ 88,
+ 211,
+ 204,
+ 200,
+ 240,
+ 143,
+ 236,
+ 130,
+ 101,
+ 185,
+ 48,
+ 157,
+ 191,
+ 20,
+ 65,
+ 157,
+ 71,
+ 156,
+ 0,
+ 208,
+ 98,
+ 33,
+ 102,
+ 144,
+ 32,
+ 183,
+ 153,
+ 184,
+ 234,
+ 85,
+ 122,
+ 26,
+ 33,
+ 122,
+ 68,
+ 192,
+ 187,
+ 81,
+ 17,
+ 68,
+ 217,
+ 247,
+ 116,
+ 143,
+ 145,
+ 78,
+ 55,
+ 58,
+ 172,
+ 188,
+ 255,
+ 44,
+ 31,
+ 85,
+ 65,
+ 164,
+ 3,
+ 186,
+ 142,
+ 99,
+ 164,
+ 198,
+ 7,
+ 244,
+ 230,
+ 30,
+ 253,
+ 33,
+ 100,
+ 234,
+ 203,
+ 252,
+ 216,
+ 199,
+ 217,
+ 199,
+ 44,
+ 90,
+ 209,
+ 154,
+ 101,
+ 22,
+ 121,
+ 133,
+ 106,
+ 100,
+ 45,
+ 81,
+ 207,
+ 225,
+ 145,
+ 194,
+ 201,
+ 224,
+ 211,
+ 151,
+ 86,
+ 253,
+ 3,
+ 82,
+ 4,
+ 41,
+ 39,
+ 180,
+ 72,
+ 215,
+ 78,
+ 211,
+ 13,
+ 123,
+ 118,
+ 61,
+ 20,
+ 54,
+ 181,
+ 35,
+ 177,
+ 188,
+ 75,
+ 103,
+ 75,
+ 226,
+ 235,
+ 51,
+ 198,
+ 23,
+ 55,
+ 1,
+ 45,
+ 84,
+ 29,
+ 44,
+ 135,
+ 161,
+ 63,
+ 62,
+ 207,
+ 149,
+ 179,
+ 116,
+ 150,
+ 107,
+ 173,
+ 230,
+ 161,
+ 162,
+ 10,
+ 220,
+ 152,
+ 58,
+ 184,
+ 33,
+ 248,
+ 196,
+ 191,
+ 159,
+ 19,
+ 162,
+ 227,
+ 251,
+ 23,
+ 143,
+ 163,
+ 147,
+ 173,
+ 232,
+ 69,
+ 91,
+ 137,
+ 207,
+ 219,
+ 254,
+ 251,
+ 142,
+ 151,
+ 206,
+ 92,
+ 144,
+ 135,
+ 219,
+ 173,
+ 176,
+ 145,
+ 19,
+ 28,
+ 205,
+ 109,
+ 58,
+ 30,
+ 102,
+ 5,
+ 115,
+ 222,
+ 222,
+ 214,
+ 63,
+ 99,
+ 180,
+ 245,
+ 30,
+ 254,
+ 253,
+ 29,
+ 166,
+ 51,
+ 54,
+ 66,
+ 204,
+ 255,
+ 122,
+ 101,
+ 174,
+ 107,
+ 20,
+ 128,
+ 156,
+ 214,
+ 14,
+ 111,
+ 217,
+ 142,
+ 59,
+ 217,
+ 215,
+ 38,
+ 155,
+ 186,
+ 149,
+ 254,
+ 250,
+ 8,
+ 21,
+ 102,
+ 186,
+ 196,
+ 249,
+ 183,
+ 94,
+ 83,
+ 146,
+ 42,
+ 200,
+ 168,
+ 10,
+ 13,
+ 114,
+ 240,
+ 7,
+ 232,
+ 196,
+ 101,
+ 161,
+ 225,
+ 207,
+ 252,
+ 93,
+ 39,
+ 233,
+ 122,
+ 218,
+ 121,
+ 46,
+ 13,
+ 149,
+ 214,
+ 164,
+ 185,
+ 222,
+ 15,
+ 163,
+ 201,
+ 28,
+ 100,
+ 155,
+ 81,
+ 204,
+ 226,
+ 97,
+ 241,
+ 200,
+ 183,
+ 116,
+ 129,
+ 10,
+ 222,
+ 60,
+ 203,
+ 242,
+ 153,
+ 227,
+ 254,
+ 176,
+ 101,
+ 224,
+ 166,
+ 66,
+ 35,
+ 218,
+ 22,
+ 115,
+ 213,
+ 121,
+ 94,
+ 211,
+ 195,
+ 161,
+ 64,
+ 223,
+ 151,
+ 119,
+ 215,
+ 206,
+ 229,
+ 138,
+ 40,
+ 195,
+ 169,
+ 33,
+ 30,
+ 185,
+ 40,
+ 170,
+ 92,
+ 28,
+ 199,
+ 93,
+ 47,
+ 98,
+ 53,
+ 161,
+ 51,
+ 153,
+ 151,
+ 134,
+ 21,
+ 155,
+ 54,
+ 225,
+ 153,
+ 77,
+ 180,
+ 69,
+ 47,
+ 39,
+ 28,
+ 191,
+ 230,
+ 70,
+ 81,
+ 242,
+ 134,
+ 0,
+ 64,
+ 169,
+ 207,
+ 78,
+ 190,
+ 54,
+ 188,
+ 234,
+ 105,
+ 82,
+ 39,
+ 115,
+ 145,
+ 252,
+ 145,
+ 160,
+ 125,
+ 136,
+ 212,
+ 94,
+ 146,
+ 180,
+ 32,
+ 68,
+ 82,
+ 138,
+ 3,
+ 65,
+ 84,
+ 221,
+ 147,
+ 79,
+ 134,
+ 232,
+ 164,
+ 198,
+ 196,
+ 149,
+ 143,
+ 131,
+ 237,
+ 79,
+ 92,
+ 27,
+ 208,
+ 158,
+ 46,
+ 138,
+ 77,
+ 92,
+ 197,
+ 52,
+ 90,
+ 86,
+ 203,
+ 120,
+ 232,
+ 126,
+ 11,
+ 38,
+ 46,
+ 70,
+ 2,
+ 218,
+ 112,
+ 77,
+ 38,
+ 168,
+ 224,
+ 14,
+ 161,
+ 214,
+ 59,
+ 22,
+ 83,
+ 150,
+ 68,
+ 180,
+ 211,
+ 139,
+ 1,
+ 207,
+ 2,
+ 65,
+ 133,
+ 253,
+ 72,
+ 174,
+ 212,
+ 254,
+ 59,
+ 37,
+ 56,
+ 107,
+ 51,
+ 77,
+ 99,
+ 14,
+ 79,
+ 174,
+ 183,
+ 2,
+ 40,
+ 10,
+ 190,
+ 13,
+ 118,
+ 249,
+ 65,
+ 97,
+ 190,
+ 60,
+ 173,
+ 245,
+ 86,
+ 43,
+ 10,
+ 156,
+ 220,
+ 247,
+ 251,
+ 83,
+ 48,
+ 214,
+ 174,
+ 2,
+ 91,
+ 42,
+ 125,
+ 204,
+ 169,
+ 218,
+ 19,
+ 69,
+ 201,
+ 18,
+ 227,
+ 111,
+ 192,
+ 67,
+ 78,
+ 38,
+ 17,
+ 158,
+ 142,
+ 49,
+ 29,
+ 154,
+ 131,
+ 167,
+ 234,
+ 84,
+ 13,
+ 66,
+ 213,
+ 105,
+ 54,
+ 7,
+ 165,
+ 107,
+ 42,
+ 8,
+ 182,
+ 223,
+ 228,
+ 161,
+ 21,
+ 146,
+ 72,
+ 124,
+ 116,
+ 233,
+ 76,
+ 41,
+ 0,
+ 203,
+ 151,
+ 22,
+ 24,
+ 58,
+ 40,
+ 235,
+ 235,
+ 30,
+ 179,
+ 189,
+ 64,
+ 157,
+ 144,
+ 83,
+ 242,
+ 214,
+ 240,
+ 63,
+ 63,
+ 74,
+ 157,
+ 180,
+ 87,
+ 1,
+ 163,
+ 81,
+ 52,
+ 118,
+ 40,
+ 42,
+ 213,
+ 203,
+ 85,
+ 66,
+ 213,
+ 62,
+ 127,
+ 44,
+ 232,
+ 6,
+ 0,
+ 236,
+ 122,
+ 76,
+ 189,
+ 22,
+ 254,
+ 241,
+ 155,
+ 30,
+ 1,
+ 68,
+ 255,
+ 95,
+ 112,
+ 243,
+ 122,
+ 55,
+ 42,
+ 128,
+ 210,
+ 122,
+ 223,
+ 11,
+ 18,
+ 192,
+ 223,
+ 207,
+ 100,
+ 229,
+ 90,
+ 38,
+ 245,
+ 112,
+ 133,
+ 232,
+ 158,
+ 36,
+ 124,
+ 186,
+ 62,
+ 178,
+ 94,
+ 209,
+ 29,
+ 189,
+ 201,
+ 89,
+ 243,
+ 87,
+ 41,
+ 174,
+ 125,
+ 239,
+ 204,
+ 181,
+ 250,
+ 140,
+ 31,
+ 109,
+ 166,
+ 34,
+ 218,
+ 234,
+ 143,
+ 3,
+ 181,
+ 59,
+ 201,
+ 158,
+ 110,
+ 11,
+ 6,
+ 2,
+ 194,
+ 103,
+ 185,
+ 76,
+ 211,
+ 36,
+ 172,
+ 34,
+ 66,
+ 139,
+ 93,
+ 247,
+ 133,
+ 216,
+ 96,
+ 150,
+ 147,
+ 69,
+ 132,
+ 208,
+ 69,
+ 14,
+ 224,
+ 153,
+ 214,
+ 133,
+ 169,
+ 230,
+ 59,
+ 44,
+ 99,
+ 242,
+ 228,
+ 241,
+ 16,
+ 108,
+ 98,
+ 100,
+ 218,
+ 216,
+ 197,
+ 187,
+ 171,
+ 170,
+ 217,
+ 78,
+ 97,
+ 167,
+ 10,
+ 199,
+ 195,
+ 77,
+ 150,
+ 64,
+ 255,
+ 146,
+ 181,
+ 254,
+ 207,
+ 19,
+ 212,
+ 236,
+ 83,
+ 201,
+ 137,
+ 102,
+ 33,
+ 29,
+ 59,
+ 177,
+ 240,
+ 99,
+ 115,
+ 118,
+ 20,
+ 180,
+ 106,
+ 205,
+ 62,
+ 195,
+ 210,
+ 61,
+ 148,
+ 104,
+ 51,
+ 18,
+ 252,
+ 50,
+ 98,
+ 178,
+ 5,
+ 248,
+ 169,
+ 119,
+ 158,
+ 135,
+ 201,
+ 79,
+ 18,
+ 18,
+ 133,
+ 234,
+ 105,
+ 198,
+ 133,
+ 191,
+ 88,
+ 179,
+ 62,
+ 111,
+ 34,
+ 187,
+ 99,
+ 57,
+ 35,
+ 195,
+ 234,
+ 208,
+ 97,
+ 2,
+ 236,
+ 85,
+ 117,
+ 63,
+ 238,
+ 46,
+ 251,
+ 177,
+ 169,
+ 55,
+ 17,
+ 108,
+ 77,
+ 219,
+ 244,
+ 1,
+ 71,
+ 138,
+ 207,
+ 93,
+ 43,
+ 53,
+ 215,
+ 136,
+ 177,
+ 207,
+ 10,
+ 147,
+ 46,
+ 212,
+ 203,
+ 50,
+ 75,
+ 202,
+ 109,
+ 95,
+ 81,
+ 34,
+ 27,
+ 53,
+ 97,
+ 129,
+ 105,
+ 211,
+ 49,
+ 100,
+ 235,
+ 230,
+ 135,
+ 64,
+ 18,
+ 182,
+ 162,
+ 165,
+ 242,
+ 32,
+ 61,
+ 67,
+ 227,
+ 181,
+ 25,
+ 7,
+ 90,
+ 98,
+ 121,
+ 147,
+ 84,
+ 249,
+ 120,
+ 134,
+ 187,
+ 37,
+ 134,
+ 63,
+ 169,
+ 54,
+ 29,
+ 111,
+ 97,
+ 171,
+ 22,
+ 187,
+ 28,
+ 227,
+ 166,
+ 251,
+ 239,
+ 149,
+ 89,
+ 217,
+ 77,
+ 133,
+ 216,
+ 206,
+ 172,
+ 165,
+ 189,
+ 177,
+ 18,
+ 5,
+ 52,
+ 136,
+ 249,
+ 127,
+ 200,
+ 238,
+ 92,
+ 169,
+ 172,
+ 86,
+ 224,
+ 65,
+ 28,
+ 231,
+ 240,
+ 184,
+ 82,
+ 21,
+ 104,
+ 233,
+ 153,
+ 171,
+ 6,
+ 211,
+ 220,
+ 24,
+ 56,
+ 212,
+ 28,
+ 54,
+ 39,
+ 229,
+ 159,
+ 31,
+ 186,
+ 115,
+ 81,
+ 113,
+ 247,
+ 137,
+ 205,
+ 246,
+ 43,
+ 130,
+ 34,
+ 253,
+ 43,
+ 176,
+ 194,
+ 74,
+ 78,
+ 157,
+ 24,
+ 152,
+ 88,
+ 120,
+ 251,
+ 182,
+ 146,
+ 227,
+ 242,
+ 49,
+ 107,
+ 145,
+ 108,
+ 222,
+ 5,
+ 164,
+ 78,
+ 100,
+ 11,
+ 88,
+ 98,
+ 223,
+ 115,
+ 55,
+ 119,
+ 184,
+ 6,
+ 119,
+ 9,
+ 105,
+ 215,
+ 227,
+ 34,
+ 129,
+ 37,
+ 47,
+ 234,
+ 173,
+ 184,
+ 31,
+ 75,
+ 16,
+ 73,
+ 230,
+ 132,
+ 4,
+ 232,
+ 92,
+ 194,
+ 37,
+ 181,
+ 116,
+ 187,
+ 142,
+ 253,
+ 11,
+ 188,
+ 17,
+ 27,
+ 246,
+ 212,
+ 159,
+ 122,
+ 210,
+ 57,
+ 242,
+ 78,
+ 56,
+ 138,
+ 156,
+ 146,
+ 68,
+ 55,
+ 75,
+ 252,
+ 115,
+ 175,
+ 71,
+ 136,
+ 73,
+ 69,
+ 83,
+ 4,
+ 207,
+ 122,
+ 152,
+ 54,
+ 36,
+ 1,
+ 15,
+ 131,
+ 14,
+ 16,
+ 242,
+ 25,
+ 85,
+ 170,
+ 74,
+ 89,
+ 61,
+ 182,
+ 149,
+ 219,
+ 38,
+ 41,
+ 17,
+ 197,
+ 29,
+ 45,
+ 15,
+ 7,
+ 89,
+ 167,
+ 195,
+ 159,
+ 3,
+ 45,
+ 225,
+ 225,
+ 132,
+ 16,
+ 71,
+ 101,
+ 34,
+ 44,
+ 232,
+ 144,
+ 172,
+ 57,
+ 46,
+ 61,
+ 62,
+ 52,
+ 254,
+ 34,
+ 83,
+ 195,
+ 244,
+ 23,
+ 30,
+ 20,
+ 16,
+ 20,
+ 54,
+ 21,
+ 242,
+ 136,
+ 195,
+ 145,
+ 133,
+ 68,
+ 144,
+ 66,
+ 129,
+ 169,
+ 196,
+ 232,
+ 249,
+ 84,
+ 39,
+ 15,
+ 183,
+ 111,
+ 198,
+ 9,
+ 212,
+ 2,
+ 179,
+ 65,
+ 162,
+ 239,
+ 50,
+ 200,
+ 18,
+ 140,
+ 57,
+ 173,
+ 147,
+ 110,
+ 232,
+ 50,
+ 15,
+ 212,
+ 140,
+ 24,
+ 149,
+ 221,
+ 255,
+ 56,
+ 124,
+ 202,
+ 175,
+ 205,
+ 152,
+ 58,
+ 34,
+ 66,
+ 43,
+ 172,
+ 153,
+ 125,
+ 24,
+ 32,
+ 145,
+ 101,
+ 229,
+ 147,
+ 99,
+ 249,
+ 26,
+ 240,
+ 114,
+ 176,
+ 216,
+ 250,
+ 52,
+ 108,
+ 110,
+ 158,
+ 90,
+ 41,
+ 214,
+ 249,
+ 219,
+ 11,
+ 21,
+ 120,
+ 138,
+ 74,
+ 8,
+ 95,
+ 143,
+ 94,
+ 163,
+ 42,
+ 224,
+ 247,
+ 22,
+ 19,
+ 12,
+ 183,
+ 211,
+ 193,
+ 254,
+ 240,
+ 9,
+ 8,
+ 89,
+ 242,
+ 11,
+ 151,
+ 28,
+ 11,
+ 234,
+ 94,
+ 80,
+ 192,
+ 78,
+ 97,
+ 58,
+ 145,
+ 120,
+ 47,
+ 148,
+ 45,
+ 169,
+ 210,
+ 191,
+ 231,
+ 182,
+ 117,
+ 6,
+ 82,
+ 62,
+ 130,
+ 185,
+ 172,
+ 140,
+ 228,
+ 32,
+ 40,
+ 158,
+ 241,
+ 43,
+ 70,
+ 249,
+ 167,
+ 69,
+ 129,
+ 31,
+ 22,
+ 180,
+ 63,
+ 21,
+ 164,
+ 207,
+ 61,
+ 216,
+ 96,
+ 78,
+ 72,
+ 127,
+ 70,
+ 104,
+ 8,
+ 186,
+ 15,
+ 122,
+ 151,
+ 143,
+ 59,
+ 208,
+ 249,
+ 81,
+ 56,
+ 243,
+ 35,
+ 214,
+ 163,
+ 36,
+ 222,
+ 97,
+ 163,
+ 136,
+ 163,
+ 88,
+ 184,
+ 118,
+ 159,
+ 248,
+ 221,
+ 51,
+ 179,
+ 92,
+ 104,
+ 131,
+ 109,
+ 238,
+ 232,
+ 30,
+ 253,
+ 215,
+ 238,
+ 252,
+ 99,
+ 133,
+ 188,
+ 46,
+ 38,
+ 212,
+ 16,
+ 43,
+ 210,
+ 196,
+ 115,
+ 206,
+ 19,
+ 210,
+ 237,
+ 111,
+ 223,
+ 45,
+ 126,
+ 68,
+ 183,
+ 37,
+ 140,
+ 215,
+ 25,
+ 101,
+ 75,
+ 124,
+ 154,
+ 145,
+ 77,
+ 149,
+ 250,
+ 228,
+ 248,
+ 247,
+ 135,
+ 208,
+ 106,
+ 200,
+ 109,
+ 110,
+ 187,
+ 40,
+ 13,
+ 0,
+ 170,
+ 35,
+ 253,
+ 32,
+ 119,
+ 138,
+ 73,
+ 21,
+ 75,
+ 137,
+ 46,
+ 150,
+ 100,
+ 248,
+ 195,
+ 237,
+ 165,
+ 75,
+ 123,
+ 42,
+ 64,
+ 52,
+ 63,
+ 45,
+ 244,
+ 166,
+ 16,
+ 199,
+ 162,
+ 249,
+ 155,
+ 6,
+ 183,
+ 127,
+ 122,
+ 46,
+ 104,
+ 245,
+ 222,
+ 166,
+ 42,
+ 206,
+ 47,
+ 150,
+ 252,
+ 121,
+ 19,
+ 185,
+ 194,
+ 139,
+ 152,
+ 97,
+ 161,
+ 126,
+ 39,
+ 63,
+ 236,
+ 173,
+ 106,
+ 34,
+ 244,
+ 136,
+ 161,
+ 90,
+ 180,
+ 178,
+ 125,
+ 210,
+ 107,
+ 34,
+ 149,
+ 213,
+ 22,
+ 9,
+ 30,
+ 163,
+ 214,
+ 5,
+ 105,
+ 136,
+ 34,
+ 40,
+ 30,
+ 129,
+ 28,
+ 240,
+ 93,
+ 98,
+ 66,
+ 150,
+ 4,
+ 75,
+ 102,
+ 102,
+ 190,
+ 237,
+ 133,
+ 141,
+ 75,
+ 113,
+ 54,
+ 16,
+ 164,
+ 111,
+ 89,
+ 126,
+ 30,
+ 191,
+ 76,
+ 40,
+ 79,
+ 165,
+ 209,
+ 201,
+ 22,
+ 71,
+ 50,
+ 250,
+ 124,
+ 22,
+ 94,
+ 109,
+ 19,
+ 77,
+ 183,
+ 180,
+ 222,
+ 146,
+ 73,
+ 67,
+ 36,
+ 233,
+ 44,
+ 118,
+ 16,
+ 23,
+ 147,
+ 226,
+ 135,
+ 95,
+ 24,
+ 250,
+ 249,
+ 31,
+ 83,
+ 43,
+ 128,
+ 10,
+ 113,
+ 94,
+ 41,
+ 238,
+ 252,
+ 86,
+ 75,
+ 141,
+ 102,
+ 206,
+ 5,
+ 67,
+ 240,
+ 2,
+ 170,
+ 183,
+ 19,
+ 53,
+ 7,
+ 190,
+ 166,
+ 237,
+ 28,
+ 71,
+ 211,
+ 116,
+ 221,
+ 25,
+ 181,
+ 98,
+ 153,
+ 253,
+ 89,
+ 84,
+ 40,
+ 118,
+ 136,
+ 65,
+ 125,
+ 89,
+ 89,
+ 68,
+ 236,
+ 179,
+ 139,
+ 46,
+ 211,
+ 255,
+ 142,
+ 42,
+ 248,
+ 57,
+ 147,
+ 209,
+ 175,
+ 110,
+ 86,
+ 75,
+ 100,
+ 56,
+ 115,
+ 69,
+ 41,
+ 222,
+ 237,
+ 43,
+ 66,
+ 181,
+ 30,
+ 97,
+ 80,
+ 205,
+ 99,
+ 226,
+ 24,
+ 158,
+ 21,
+ 86,
+ 105,
+ 238,
+ 0,
+ 22,
+ 149,
+ 209,
+ 146,
+ 134,
+ 40,
+ 143,
+ 151,
+ 117,
+ 161,
+ 108,
+ 43,
+ 73,
+ 209,
+ 4,
+ 240,
+ 58,
+ 122,
+ 209,
+ 165,
+ 62,
+ 107,
+ 184,
+ 138,
+ 226,
+ 187,
+ 166,
+ 35,
+ 190,
+ 54,
+ 192,
+ 72,
+ 82,
+ 10,
+ 91,
+ 24,
+ 174,
+ 109,
+ 126,
+ 71,
+ 47,
+ 59,
+ 29,
+ 137,
+ 181,
+ 134,
+ 254,
+ 161,
+ 78,
+ 191,
+ 86,
+ 3,
+ 214,
+ 40,
+ 100,
+ 219,
+ 214,
+ 172,
+ 120,
+ 220,
+ 170,
+ 24,
+ 104,
+ 254,
+ 97,
+ 232,
+ 29,
+ 121,
+ 19,
+ 6,
+ 241,
+ 207,
+ 55,
+ 228,
+ 44,
+ 156,
+ 182,
+ 220,
+ 14,
+ 73,
+ 0,
+ 83,
+ 101,
+ 141,
+ 170,
+ 151,
+ 129,
+ 88,
+ 243,
+ 109,
+ 245,
+ 6,
+ 237,
+ 174,
+ 18,
+ 39,
+ 170,
+ 75,
+ 116,
+ 166,
+ 72,
+ 65,
+ 165,
+ 32,
+ 55,
+ 127,
+ 136,
+ 246,
+ 11,
+ 237,
+ 155,
+ 57,
+ 23,
+ 211,
+ 202,
+ 17,
+ 164,
+ 186,
+ 252,
+ 252,
+ 88,
+ 80,
+ 198,
+ 23,
+ 141,
+ 128,
+ 57,
+ 161,
+ 238,
+ 186,
+ 91,
+ 87,
+ 152,
+ 47,
+ 190,
+ 35,
+ 73,
+ 122,
+ 159,
+ 181,
+ 247,
+ 126,
+ 207,
+ 15,
+ 90,
+ 13,
+ 253,
+ 36,
+ 161,
+ 204,
+ 164,
+ 248,
+ 138,
+ 189,
+ 129,
+ 120,
+ 55,
+ 226,
+ 250,
+ 222,
+ 201,
+ 160,
+ 193,
+ 143,
+ 2,
+ 198,
+ 173,
+ 234,
+ 159,
+ 72,
+ 131,
+ 190,
+ 123,
+ 128,
+ 200,
+ 208,
+ 215,
+ 115,
+ 197,
+ 180,
+ 0,
+ 191,
+ 143,
+ 153,
+ 2,
+ 172,
+ 152,
+ 19,
+ 9,
+ 67,
+ 124,
+ 37,
+ 217,
+ 212,
+ 207,
+ 174,
+ 26,
+ 26,
+ 97,
+ 154,
+ 33,
+ 222,
+ 50,
+ 48,
+ 129,
+ 184,
+ 2,
+ 236,
+ 128,
+ 196,
+ 16,
+ 141,
+ 175,
+ 191,
+ 86,
+ 223,
+ 211,
+ 135,
+ 195,
+ 157,
+ 214,
+ 155,
+ 194,
+ 147,
+ 182,
+ 82,
+ 103,
+ 77,
+ 108,
+ 11,
+ 96,
+ 50,
+ 115,
+ 213,
+ 117,
+ 28,
+ 119,
+ 236,
+ 23,
+ 150,
+ 181,
+ 95,
+ 18,
+ 242,
+ 20,
+ 208,
+ 54,
+ 110,
+ 71,
+ 68,
+ 145,
+ 224,
+ 249,
+ 56,
+ 126,
+ 6,
+ 47,
+ 6,
+ 191,
+ 157,
+ 170,
+ 164,
+ 128,
+ 97,
+ 5,
+ 35,
+ 63,
+ 228,
+ 10,
+ 124,
+ 80,
+ 118,
+ 171,
+ 160,
+ 192,
+ 103,
+ 32,
+ 118,
+ 155,
+ 113,
+ 136,
+ 56,
+ 225,
+ 171,
+ 144,
+ 33,
+ 34,
+ 227,
+ 61,
+ 208,
+ 155,
+ 82,
+ 56,
+ 226,
+ 118,
+ 5,
+ 169,
+ 234,
+ 175,
+ 162,
+ 161,
+ 47,
+ 226,
+ 193,
+ 104,
+ 144,
+ 130,
+ 189,
+ 154,
+ 159,
+ 156,
+ 102,
+ 73,
+ 103,
+ 59,
+ 205,
+ 125,
+ 58,
+ 183,
+ 214,
+ 231,
+ 31,
+ 229,
+ 79,
+ 164,
+ 216,
+ 241,
+ 111,
+ 249,
+ 202,
+ 252,
+ 34,
+ 230,
+ 249,
+ 52,
+ 87,
+ 21,
+ 183,
+ 132,
+ 190,
+ 230,
+ 86,
+ 0,
+ 101,
+ 224,
+ 58,
+ 98,
+ 227,
+ 73,
+ 66,
+ 50,
+ 210,
+ 117,
+ 184,
+ 29,
+ 197,
+ 230,
+ 249,
+ 240,
+ 161,
+ 194,
+ 203,
+ 181,
+ 2,
+ 165,
+ 111,
+ 74,
+ 199,
+ 231,
+ 53,
+ 207,
+ 120,
+ 60,
+ 107,
+ 245,
+ 38,
+ 36,
+ 232,
+ 71,
+ 7,
+ 11,
+ 20,
+ 252,
+ 183,
+ 176,
+ 148,
+ 241,
+ 158,
+ 127,
+ 33,
+ 26,
+ 233,
+ 217,
+ 18,
+ 255,
+ 65,
+ 71,
+ 135,
+ 44,
+ 121,
+ 39,
+ 248,
+ 129,
+ 67,
+ 73,
+ 63,
+ 100,
+ 142,
+ 29,
+ 227,
+ 223,
+ 179,
+ 221,
+ 221,
+ 146,
+ 41,
+ 162,
+ 248,
+ 35,
+ 60,
+ 3,
+ 225,
+ 12,
+ 188,
+ 111,
+ 33,
+ 184,
+ 120,
+ 24,
+ 216,
+ 40,
+ 3,
+ 190,
+ 203,
+ 196,
+ 54,
+ 22,
+ 154,
+ 202,
+ 107,
+ 229,
+ 101,
+ 83,
+ 189,
+ 75,
+ 117,
+ 73,
+ 121,
+ 251,
+ 189,
+ 101,
+ 66,
+ 35,
+ 219,
+ 220,
+ 247,
+ 72,
+ 65,
+ 54,
+ 211,
+ 80,
+ 52,
+ 216,
+ 52,
+ 45,
+ 218,
+ 13,
+ 159,
+ 165,
+ 16,
+ 1,
+ 157,
+ 24,
+ 95,
+ 73,
+ 96,
+ 38,
+ 140,
+ 81,
+ 82,
+ 189,
+ 188,
+ 36,
+ 235,
+ 215,
+ 152,
+ 184,
+ 55,
+ 57,
+ 173,
+ 121,
+ 179,
+ 74,
+ 26,
+ 244,
+ 248,
+ 218,
+ 177,
+ 247,
+ 136,
+ 4,
+ 221,
+ 128,
+ 229,
+ 62,
+ 179,
+ 194,
+ 141,
+ 131,
+ 20,
+ 177,
+ 216,
+ 129,
+ 42,
+ 168,
+ 69,
+ 161,
+ 30,
+ 25,
+ 189,
+ 137,
+ 225,
+ 5,
+ 215,
+ 241,
+ 169,
+ 101,
+ 147,
+ 144,
+ 36,
+ 245,
+ 100,
+ 91,
+ 211,
+ 248,
+ 122,
+ 58,
+ 181,
+ 200,
+ 82,
+ 197,
+ 116,
+ 111,
+ 147,
+ 255,
+ 241,
+ 250,
+ 124,
+ 193,
+ 223,
+ 50,
+ 146,
+ 141,
+ 32,
+ 92,
+ 135,
+ 20,
+ 239,
+ 150,
+ 6,
+ 133,
+ 151,
+ 238,
+ 134,
+ 174,
+ 13,
+ 20,
+ 248,
+ 54,
+ 12,
+ 175,
+ 179,
+ 193,
+ 13,
+ 62,
+ 193,
+ 77,
+ 178,
+ 38,
+ 14,
+ 193,
+ 158,
+ 133,
+ 74,
+ 174,
+ 73,
+ 254,
+ 247,
+ 39,
+ 158,
+ 151,
+ 64,
+ 230,
+ 173,
+ 85,
+ 70,
+ 228,
+ 11,
+ 55,
+ 155,
+ 118,
+ 245,
+ 222,
+ 30,
+ 173,
+ 225,
+ 90,
+ 0,
+ 116,
+ 28,
+ 15,
+ 95,
+ 27,
+ 203,
+ 56,
+ 199,
+ 47,
+ 109,
+ 249,
+ 196,
+ 126,
+ 108,
+ 154,
+ 233,
+ 53,
+ 130,
+ 180,
+ 223,
+ 25,
+ 66,
+ 188,
+ 127,
+ 246,
+ 54,
+ 211,
+ 54,
+ 27,
+ 80,
+ 134,
+ 88,
+ 155,
+ 211,
+ 139,
+ 16,
+ 167,
+ 239,
+ 52,
+ 50,
+ 114,
+ 55,
+ 215,
+ 170,
+ 119,
+ 115,
+ 185,
+ 253,
+ 163,
+ 8,
+ 162,
+ 99,
+ 126,
+ 251,
+ 250,
+ 120,
+ 87,
+ 48,
+ 77,
+ 183,
+ 63,
+ 153,
+ 196,
+ 42,
+ 12,
+ 231,
+ 124,
+ 129,
+ 37,
+ 81,
+ 44,
+ 71,
+ 203,
+ 13,
+ 253,
+ 109,
+ 124,
+ 242,
+ 60,
+ 53,
+ 241,
+ 147,
+ 207,
+ 237,
+ 183,
+ 89,
+ 247,
+ 129,
+ 144,
+ 147,
+ 200,
+ 81,
+ 188,
+ 84,
+ 242,
+ 163,
+ 79,
+ 157,
+ 207,
+ 26,
+ 190,
+ 68,
+ 172,
+ 36,
+ 240,
+ 42,
+ 227,
+ 31,
+ 12,
+ 96,
+ 86,
+ 63,
+ 118,
+ 204,
+ 21,
+ 227,
+ 161,
+ 231,
+ 197,
+ 214,
+ 215,
+ 228,
+ 188,
+ 88,
+ 156,
+ 89,
+ 49,
+ 49,
+ 210,
+ 148,
+ 223,
+ 37,
+ 213,
+ 94,
+ 14,
+ 233,
+ 132,
+ 56,
+ 254,
+ 183,
+ 170,
+ 46,
+ 226,
+ 59,
+ 66,
+ 222,
+ 144,
+ 215,
+ 196,
+ 5,
+ 210,
+ 154,
+ 241,
+ 136,
+ 151,
+ 203,
+ 154,
+ 165,
+ 69,
+ 159,
+ 5,
+ 153,
+ 195,
+ 181,
+ 40,
+ 250,
+ 186,
+ 248,
+ 58,
+ 252,
+ 121,
+ 127,
+ 55,
+ 197,
+ 55,
+ 2,
+ 153,
+ 27,
+ 173,
+ 24,
+ 51,
+ 176,
+ 209,
+ 82,
+ 153,
+ 127,
+ 66,
+ 20,
+ 125,
+ 132,
+ 134,
+ 217,
+ 174,
+ 24,
+ 157,
+ 41,
+ 175,
+ 31,
+ 48,
+ 213,
+ 88,
+ 246,
+ 241,
+ 231,
+ 142,
+ 47,
+ 196,
+ 76,
+ 162,
+ 123,
+ 233,
+ 91,
+ 127,
+ 57,
+ 96,
+ 210,
+ 126,
+ 63,
+ 211,
+ 34,
+ 70,
+ 167,
+ 150,
+ 218,
+ 167,
+ 121,
+ 146,
+ 63,
+ 69,
+ 13,
+ 177,
+ 98,
+ 168,
+ 145,
+ 179,
+ 195,
+ 237,
+ 74,
+ 229,
+ 71,
+ 178,
+ 196,
+ 57,
+ 182,
+ 223,
+ 41,
+ 16,
+ 103,
+ 203,
+ 87,
+ 29,
+ 120,
+ 151,
+ 194,
+ 79,
+ 231,
+ 188,
+ 72,
+ 176,
+ 204,
+ 13,
+ 57,
+ 199,
+ 29,
+ 134,
+ 124,
+ 165,
+ 126,
+ 148,
+ 119,
+ 100,
+ 177,
+ 225,
+ 4,
+ 232,
+ 90,
+ 18,
+ 208,
+ 83,
+ 17,
+ 94,
+ 239,
+ 111,
+ 84,
+ 190,
+ 123,
+ 6,
+ 171,
+ 179,
+ 82,
+ 239,
+ 252,
+ 169,
+ 102,
+ 176,
+ 115,
+ 36,
+ 84,
+ 174,
+ 1,
+ 242,
+ 198,
+ 90,
+ 228,
+ 97,
+ 55,
+ 70,
+ 20,
+ 3,
+ 144,
+ 172,
+ 88,
+ 165,
+ 64,
+ 183,
+ 172,
+ 78,
+ 246,
+ 214,
+ 117,
+ 169,
+ 247,
+ 253,
+ 207,
+ 36,
+ 41,
+ 219,
+ 185,
+ 155,
+ 94,
+ 121,
+ 179,
+ 101,
+ 213,
+ 24,
+ 203,
+ 176,
+ 178,
+ 113,
+ 155,
+ 7,
+ 127,
+ 251,
+ 160,
+ 224,
+ 49,
+ 30,
+ 25,
+ 204,
+ 65,
+ 56,
+ 71,
+ 17,
+ 116,
+ 246,
+ 93,
+ 35,
+ 214,
+ 21,
+ 14,
+ 86,
+ 170,
+ 243,
+ 200,
+ 217,
+ 89,
+ 223,
+ 43,
+ 162,
+ 225,
+ 39,
+ 17,
+ 240,
+ 7,
+ 168,
+ 185,
+ 30,
+ 212,
+ 199,
+ 58,
+ 11,
+ 164,
+ 30,
+ 145,
+ 116,
+ 64,
+ 248,
+ 246,
+ 15,
+ 44,
+ 35,
+ 193,
+ 252,
+ 64,
+ 144,
+ 196,
+ 53,
+ 33,
+ 16,
+ 42,
+ 78,
+ 27,
+ 243,
+ 170,
+ 159,
+ 182,
+ 77,
+ 233,
+ 177,
+ 89,
+ 253,
+ 252,
+ 195,
+ 185,
+ 143,
+ 6,
+ 17,
+ 82,
+ 36,
+ 203,
+ 198,
+ 121,
+ 227,
+ 60,
+ 192,
+ 50,
+ 168,
+ 158,
+ 114,
+ 113,
+ 89,
+ 204,
+ 41,
+ 164,
+ 78,
+ 238,
+ 113,
+ 224,
+ 118,
+ 67,
+ 15,
+ 165,
+ 230,
+ 22,
+ 40,
+ 188,
+ 146,
+ 161,
+ 0,
+ 34,
+ 56,
+ 218,
+ 4,
+ 224,
+ 169,
+ 8,
+ 180,
+ 83,
+ 246,
+ 121,
+ 155,
+ 30,
+ 238,
+ 105,
+ 237,
+ 100,
+ 154,
+ 243,
+ 114,
+ 191,
+ 157,
+ 59,
+ 101,
+ 81,
+ 104,
+ 52,
+ 80,
+ 186,
+ 148,
+ 152,
+ 43,
+ 87,
+ 193,
+ 88,
+ 100,
+ 58,
+ 84,
+ 212,
+ 82,
+ 135,
+ 228,
+ 38,
+ 154,
+ 167,
+ 10,
+ 18,
+ 101,
+ 134,
+ 103,
+ 254,
+ 106,
+ 45,
+ 202,
+ 111,
+ 72,
+ 14,
+ 208,
+ 14,
+ 245,
+ 27,
+ 247,
+ 48,
+ 199,
+ 161,
+ 134,
+ 131,
+ 179,
+ 127,
+ 196,
+ 88,
+ 18,
+ 23,
+ 114,
+ 203,
+ 73,
+ 249,
+ 46,
+ 53,
+ 127,
+ 239,
+ 109,
+ 232,
+ 36,
+ 4,
+ 44,
+ 91,
+ 138,
+ 13,
+ 223,
+ 85,
+ 122,
+ 128,
+ 204,
+ 158,
+ 93,
+ 167,
+ 83,
+ 63,
+ 0,
+ 89,
+ 156,
+ 95,
+ 136,
+ 61,
+ 222,
+ 2,
+ 100,
+ 246,
+ 71,
+ 5,
+ 127,
+ 37,
+ 164,
+ 77,
+ 183,
+ 196,
+ 30,
+ 15,
+ 223,
+ 225,
+ 204,
+ 75,
+ 18,
+ 144,
+ 181,
+ 93,
+ 204,
+ 130,
+ 143,
+ 124,
+ 132,
+ 111,
+ 48,
+ 63,
+ 173,
+ 138,
+ 231,
+ 205,
+ 231,
+ 11,
+ 62,
+ 88,
+ 9,
+ 209,
+ 134,
+ 131,
+ 242,
+ 152,
+ 230,
+ 68,
+ 80,
+ 120,
+ 107,
+ 196,
+ 26,
+ 176,
+ 82,
+ 1,
+ 240,
+ 179,
+ 85,
+ 66,
+ 127,
+ 94,
+ 148,
+ 174,
+ 15,
+ 64,
+ 127,
+ 173,
+ 186,
+ 71,
+ 22,
+ 194,
+ 94,
+ 129,
+ 167,
+ 114,
+ 61,
+ 198,
+ 199,
+ 190,
+ 220,
+ 215,
+ 135,
+ 57,
+ 83,
+ 225,
+ 95,
+ 6,
+ 213,
+ 2,
+ 47,
+ 146,
+ 192,
+ 15,
+ 127,
+ 152,
+ 66,
+ 38,
+ 228,
+ 22,
+ 42,
+ 199,
+ 19,
+ 148,
+ 111,
+ 158,
+ 249,
+ 182,
+ 201,
+ 41,
+ 208,
+ 145,
+ 13,
+ 249,
+ 57,
+ 133,
+ 83,
+ 29,
+ 139,
+ 12,
+ 88,
+ 11,
+ 109,
+ 253,
+ 8,
+ 174,
+ 0,
+ 168,
+ 196,
+ 88,
+ 21,
+ 82,
+ 147,
+ 202,
+ 36,
+ 21,
+ 199,
+ 236,
+ 201,
+ 138,
+ 208,
+ 82,
+ 12,
+ 199,
+ 155,
+ 192,
+ 239,
+ 108,
+ 48,
+ 51,
+ 133,
+ 47,
+ 233,
+ 50,
+ 95,
+ 179,
+ 11,
+ 63,
+ 117,
+ 180,
+ 31,
+ 114,
+ 193,
+ 5,
+ 78,
+ 242,
+ 85,
+ 37,
+ 68,
+ 130,
+ 235,
+ 142,
+ 100,
+ 34,
+ 40,
+ 84,
+ 228,
+ 89,
+ 164,
+ 207,
+ 178,
+ 12,
+ 42,
+ 75,
+ 217,
+ 10,
+ 145,
+ 118,
+ 163,
+ 190,
+ 207,
+ 169,
+ 66,
+ 126,
+ 112,
+ 80,
+ 132,
+ 204,
+ 41,
+ 157,
+ 217,
+ 217,
+ 211,
+ 240,
+ 194,
+ 223,
+ 15,
+ 181,
+ 179,
+ 192,
+ 174,
+ 41,
+ 225,
+ 132,
+ 138,
+ 160,
+ 30,
+ 133,
+ 183,
+ 110,
+ 112,
+ 240,
+ 56,
+ 209,
+ 222,
+ 244,
+ 206,
+ 67,
+ 67,
+ 38,
+ 181,
+ 219,
+ 43,
+ 247,
+ 121,
+ 225,
+ 123,
+ 199,
+ 136,
+ 49,
+ 61,
+ 150,
+ 188,
+ 178,
+ 8,
+ 29,
+ 50,
+ 194,
+ 105,
+ 244,
+ 122,
+ 95,
+ 173,
+ 33,
+ 204,
+ 162,
+ 69,
+ 158,
+ 18,
+ 57,
+ 253,
+ 46,
+ 66,
+ 22,
+ 206,
+ 62,
+ 73,
+ 164,
+ 32,
+ 101,
+ 23,
+ 237,
+ 230,
+ 128,
+ 23,
+ 156,
+ 45,
+ 18,
+ 38,
+ 64,
+ 238,
+ 79,
+ 217,
+ 23,
+ 101,
+ 240,
+ 36,
+ 147,
+ 205,
+ 237,
+ 143,
+ 101,
+ 93,
+ 173,
+ 240,
+ 138,
+ 152,
+ 114,
+ 29,
+ 214,
+ 165,
+ 253,
+ 155,
+ 29,
+ 166,
+ 36,
+ 247,
+ 108,
+ 60,
+ 168,
+ 56,
+ 111,
+ 88,
+ 139,
+ 224,
+ 126,
+ 120,
+ 223,
+ 209,
+ 245,
+ 144,
+ 247,
+ 190,
+ 177,
+ 105,
+ 149,
+ 112,
+ 102,
+ 55,
+ 254,
+ 201,
+ 87,
+ 69,
+ 80,
+ 254,
+ 27,
+ 145,
+ 84,
+ 214,
+ 179,
+ 63,
+ 171,
+ 93,
+ 178,
+ 144,
+ 40,
+ 230,
+ 254,
+ 62,
+ 204,
+ 252,
+ 97,
+ 2,
+ 38,
+ 186,
+ 71,
+ 254,
+ 169,
+ 85,
+ 154,
+ 183,
+ 249,
+ 7,
+ 221,
+ 189,
+ 112,
+ 54,
+ 110,
+ 145,
+ 89,
+ 70,
+ 185,
+ 81,
+ 158,
+ 110,
+ 115,
+ 255,
+ 183,
+ 251,
+ 198,
+ 163,
+ 9,
+ 255,
+ 80,
+ 61,
+ 31,
+ 119,
+ 94,
+ 218,
+ 255,
+ 33,
+ 230,
+ 98,
+ 52,
+ 21,
+ 136,
+ 190,
+ 22,
+ 69,
+ 227,
+ 95,
+ 178,
+ 98,
+ 39,
+ 212,
+ 159,
+ 110,
+ 33,
+ 72,
+ 155,
+ 141,
+ 91,
+ 227,
+ 83,
+ 192,
+ 207,
+ 3,
+ 155,
+ 29,
+ 95,
+ 72,
+ 82,
+ 121,
+ 57,
+ 240,
+ 225,
+ 166,
+ 176,
+ 220,
+ 149,
+ 200,
+ 93,
+ 124,
+ 184,
+ 121,
+ 52,
+ 30,
+ 8,
+ 71,
+ 39,
+ 94,
+ 50,
+ 239,
+ 217,
+ 136,
+ 19,
+ 132,
+ 28,
+ 63,
+ 215,
+ 124,
+ 227,
+ 196,
+ 100,
+ 230,
+ 70,
+ 158,
+ 148,
+ 151,
+ 198,
+ 7,
+ 117,
+ 84,
+ 115,
+ 230,
+ 214,
+ 27,
+ 120,
+ 218,
+ 229,
+ 176,
+ 101,
+ 181,
+ 162,
+ 242,
+ 160,
+ 150,
+ 69,
+ 222,
+ 0,
+ 128,
+ 2,
+ 238,
+ 80,
+ 180,
+ 232,
+ 163,
+ 135,
+ 87,
+ 251,
+ 134,
+ 187,
+ 14,
+ 154,
+ 64,
+ 170,
+ 235,
+ 63,
+ 123,
+ 104,
+ 24,
+ 252,
+ 141,
+ 91,
+ 157,
+ 205,
+ 72,
+ 7,
+ 26,
+ 17,
+ 73,
+ 66,
+ 203,
+ 90,
+ 125,
+ 121,
+ 250,
+ 17,
+ 35,
+ 119,
+ 54,
+ 220,
+ 179,
+ 246,
+ 118,
+ 22,
+ 222,
+ 39,
+ 20,
+ 244,
+ 54,
+ 115,
+ 100,
+ 75,
+ 98,
+ 89,
+ 249,
+ 230,
+ 85,
+ 21,
+ 25,
+ 57,
+ 150,
+ 180,
+ 69,
+ 222,
+ 109,
+ 16,
+ 103,
+ 107,
+ 104,
+ 204,
+ 249,
+ 42,
+ 238,
+ 248,
+ 79,
+ 78,
+ 76,
+ 150,
+ 65,
+ 134,
+ 126,
+ 66,
+ 136,
+ 48,
+ 223,
+ 92,
+ 241,
+ 191,
+ 67,
+ 198,
+ 217,
+ 22,
+ 12,
+ 252,
+ 8,
+ 50,
+ 114,
+ 99,
+ 184,
+ 176,
+ 30,
+ 180,
+ 240,
+ 16,
+ 20,
+ 21,
+ 173,
+ 63,
+ 66,
+ 13,
+ 49,
+ 51,
+ 3,
+ 208,
+ 185,
+ 36,
+ 0,
+ 124,
+ 197,
+ 157,
+ 46,
+ 254,
+ 132,
+ 40,
+ 119,
+ 211,
+ 69,
+ 123,
+ 123,
+ 231,
+ 109,
+ 170,
+ 91,
+ 198,
+ 213,
+ 117,
+ 78,
+ 255,
+ 144,
+ 87,
+ 2,
+ 234,
+ 37,
+ 245,
+ 186,
+ 161,
+ 44,
+ 123,
+ 5,
+ 33,
+ 37,
+ 140,
+ 92,
+ 109,
+ 236,
+ 203,
+ 149,
+ 181,
+ 25,
+ 42,
+ 67,
+ 45,
+ 50,
+ 175,
+ 189,
+ 52,
+ 94,
+ 219,
+ 108,
+ 226,
+ 142,
+ 75,
+ 209,
+ 251,
+ 254,
+ 124,
+ 74,
+ 201,
+ 143,
+ 226,
+ 38,
+ 82,
+ 161,
+ 47,
+ 33,
+ 88,
+ 255,
+ 24,
+ 97,
+ 89,
+ 218,
+ 30,
+ 35,
+ 19,
+ 105,
+ 232,
+ 103,
+ 177,
+ 148,
+ 136,
+ 92,
+ 182,
+ 107,
+ 93,
+ 151,
+ 176,
+ 215,
+ 89,
+ 187,
+ 207,
+ 192,
+ 186,
+ 159,
+ 210,
+ 61,
+ 52,
+ 193,
+ 134,
+ 190,
+ 3,
+ 130,
+ 72,
+ 190,
+ 222,
+ 73,
+ 70,
+ 128,
+ 199,
+ 157,
+ 62,
+ 222,
+ 49,
+ 213,
+ 70,
+ 180,
+ 225,
+ 93,
+ 11,
+ 95,
+ 10,
+ 209,
+ 164,
+ 142,
+ 154,
+ 176,
+ 216,
+ 222,
+ 125,
+ 161,
+ 43,
+ 124,
+ 183,
+ 200,
+ 140,
+ 143,
+ 86,
+ 216,
+ 122,
+ 41,
+ 178,
+ 153,
+ 251,
+ 199,
+ 219,
+ 251,
+ 243,
+ 18,
+ 57,
+ 14,
+ 183,
+ 216,
+ 201,
+ 196,
+ 75,
+ 74,
+ 241,
+ 205,
+ 133,
+ 102,
+ 73,
+ 214,
+ 224,
+ 12,
+ 246,
+ 96,
+ 126,
+ 117,
+ 186,
+ 92,
+ 103,
+ 50,
+ 173,
+ 222,
+ 156,
+ 107,
+ 242,
+ 79,
+ 233,
+ 247,
+ 39,
+ 219,
+ 61,
+ 193,
+ 125,
+ 164,
+ 62,
+ 166,
+ 100,
+ 16,
+ 246,
+ 192,
+ 36,
+ 198,
+ 38,
+ 63,
+ 19,
+ 125,
+ 243,
+ 44,
+ 254,
+ 23,
+ 21,
+ 0,
+ 222,
+ 98,
+ 34,
+ 52,
+ 28,
+ 240,
+ 106,
+ 246,
+ 202,
+ 214,
+ 38,
+ 100,
+ 227,
+ 243,
+ 86,
+ 200,
+ 50,
+ 41,
+ 146,
+ 242,
+ 132,
+ 12,
+ 100,
+ 30,
+ 244,
+ 87,
+ 13,
+ 53,
+ 148,
+ 91,
+ 38,
+ 6,
+ 40,
+ 148,
+ 113,
+ 185,
+ 215,
+ 215,
+ 5,
+ 166,
+ 238,
+ 9,
+ 193,
+ 224,
+ 182,
+ 159,
+ 168,
+ 104,
+ 36,
+ 124,
+ 76,
+ 162,
+ 187,
+ 140,
+ 125,
+ 9,
+ 255,
+ 248,
+ 127,
+ 199,
+ 16,
+ 239,
+ 101,
+ 196,
+ 124,
+ 151,
+ 111,
+ 180,
+ 115,
+ 126,
+ 206,
+ 158,
+ 127,
+ 37,
+ 130,
+ 32,
+ 117,
+ 242,
+ 172,
+ 145,
+ 185,
+ 211,
+ 208,
+ 227,
+ 80,
+ 175,
+ 234,
+ 35,
+ 186,
+ 30,
+ 16,
+ 216,
+ 204,
+ 31,
+ 60,
+ 183,
+ 62,
+ 53,
+ 247,
+ 247,
+ 17,
+ 187,
+ 127,
+ 188,
+ 79,
+ 13,
+ 220,
+ 239,
+ 189,
+ 155,
+ 52,
+ 88,
+ 194,
+ 39,
+ 232,
+ 31,
+ 209,
+ 25,
+ 104,
+ 90,
+ 23,
+ 193,
+ 150,
+ 119,
+ 157,
+ 251,
+ 171,
+ 64,
+ 10,
+ 137,
+ 154,
+ 207,
+ 215,
+ 101,
+ 183,
+ 84,
+ 248,
+ 146,
+ 73,
+ 202,
+ 51,
+ 50,
+ 205,
+ 185,
+ 237,
+ 92,
+ 133,
+ 5,
+ 232,
+ 159,
+ 19,
+ 115,
+ 228,
+ 79,
+ 249,
+ 139,
+ 243,
+ 165,
+ 177,
+ 186,
+ 160,
+ 163,
+ 111,
+ 150,
+ 206,
+ 140,
+ 122,
+ 215,
+ 229,
+ 110,
+ 200,
+ 110,
+ 124,
+ 61,
+ 106,
+ 246,
+ 108,
+ 23,
+ 145,
+ 244,
+ 103,
+ 216,
+ 127,
+ 135,
+ 68,
+ 51,
+ 78,
+ 154,
+ 150,
+ 224,
+ 121,
+ 137,
+ 182,
+ 223,
+ 128,
+ 233,
+ 94,
+ 252,
+ 87,
+ 42,
+ 1,
+ 229,
+ 109,
+ 91,
+ 223,
+ 163,
+ 201,
+ 134,
+ 52,
+ 69,
+ 3,
+ 219,
+ 191,
+ 237,
+ 55,
+ 222,
+ 16,
+ 126,
+ 137,
+ 27,
+ 132,
+ 48,
+ 164,
+ 108,
+ 115,
+ 11,
+ 35,
+ 101,
+ 29,
+ 6,
+ 3,
+ 80,
+ 16,
+ 24,
+ 188,
+ 235,
+ 130,
+ 3,
+ 199,
+ 101,
+ 153,
+ 195,
+ 88,
+ 32,
+ 142,
+ 163,
+ 23,
+ 89,
+ 20,
+ 44,
+ 178,
+ 62,
+ 44,
+ 206,
+ 17,
+ 152,
+ 1,
+ 136,
+ 79,
+ 79,
+ 60,
+ 71,
+ 31,
+ 221,
+ 119,
+ 155,
+ 123,
+ 217,
+ 183,
+ 117,
+ 204,
+ 129,
+ 190,
+ 13,
+ 108,
+ 21,
+ 109,
+ 182,
+ 189,
+ 45,
+ 128,
+ 149,
+ 230,
+ 139,
+ 227,
+ 43,
+ 113,
+ 83,
+ 242,
+ 186,
+ 62,
+ 15,
+ 14,
+ 149,
+ 73,
+ 24,
+ 192,
+ 110,
+ 225,
+ 118,
+ 183,
+ 116,
+ 68,
+ 217,
+ 44,
+ 2,
+ 28,
+ 52,
+ 57,
+ 24,
+ 217,
+ 100,
+ 32,
+ 200,
+ 219,
+ 127,
+ 79,
+ 64,
+ 34,
+ 148,
+ 216,
+ 162,
+ 201,
+ 152,
+ 109,
+ 129,
+ 32,
+ 197,
+ 106,
+ 104,
+ 196,
+ 30,
+ 96,
+ 21,
+ 65,
+ 146,
+ 161,
+ 237,
+ 18,
+ 79,
+ 98,
+ 110,
+ 157,
+ 234,
+ 96,
+ 197,
+ 98,
+ 126,
+ 213,
+ 74,
+ 221,
+ 56,
+ 13,
+ 95,
+ 132,
+ 187,
+ 201,
+ 208,
+ 194,
+ 175,
+ 163,
+ 255,
+ 225,
+ 198,
+ 87,
+ 160,
+ 217,
+ 147,
+ 160,
+ 53,
+ 190,
+ 83,
+ 189,
+ 10,
+ 205,
+ 8,
+ 61,
+ 9,
+ 69,
+ 16,
+ 182,
+ 152,
+ 97,
+ 165,
+ 82,
+ 203,
+ 103,
+ 212,
+ 14,
+ 92,
+ 76,
+ 148,
+ 130,
+ 176,
+ 37,
+ 21,
+ 37,
+ 36,
+ 93,
+ 91,
+ 26,
+ 236,
+ 148,
+ 15,
+ 3,
+ 208,
+ 96,
+ 115,
+ 127,
+ 241,
+ 136,
+ 161,
+ 87,
+ 115,
+ 71,
+ 238,
+ 242,
+ 150,
+ 140,
+ 184,
+ 167,
+ 48,
+ 81,
+ 155,
+ 170,
+ 206,
+ 240,
+ 167,
+ 171,
+ 108,
+ 89,
+ 215,
+ 232,
+ 243,
+ 40,
+ 252,
+ 179,
+ 142,
+ 253,
+ 178,
+ 189,
+ 234,
+ 228,
+ 0,
+ 13,
+ 123,
+ 115,
+ 188,
+ 118,
+ 94,
+ 45,
+ 42,
+ 13,
+ 41,
+ 99,
+ 180,
+ 43,
+ 195,
+ 147,
+ 167,
+ 68,
+ 36,
+ 213,
+ 36,
+ 235,
+ 195,
+ 245,
+ 160,
+ 48,
+ 140,
+ 254,
+ 96,
+ 182,
+ 151,
+ 254,
+ 27,
+ 3,
+ 68,
+ 82,
+ 2,
+ 246,
+ 60,
+ 95,
+ 110,
+ 57,
+ 132,
+ 248,
+ 236,
+ 34,
+ 155,
+ 231,
+ 121,
+ 178,
+ 126,
+ 94,
+ 248,
+ 23,
+ 137,
+ 126,
+ 189,
+ 31,
+ 146,
+ 145,
+ 125,
+ 203,
+ 235,
+ 19,
+ 181,
+ 78,
+ 141,
+ 215,
+ 27,
+ 216,
+ 255,
+ 96,
+ 16,
+ 151,
+ 220,
+ 251,
+ 48,
+ 140,
+ 110,
+ 48,
+ 132,
+ 216,
+ 49,
+ 57,
+ 152,
+ 237,
+ 164,
+ 77,
+ 99,
+ 139,
+ 38,
+ 198,
+ 84,
+ 86,
+ 244,
+ 10,
+ 184,
+ 111,
+ 20,
+ 13,
+ 239,
+ 24,
+ 194,
+ 18,
+ 237,
+ 19,
+ 61,
+ 216,
+ 182,
+ 33,
+ 202,
+ 20,
+ 248,
+ 149,
+ 146,
+ 238,
+ 59,
+ 23,
+ 9,
+ 142,
+ 199,
+ 154,
+ 229,
+ 200,
+ 18,
+ 64,
+ 160,
+ 198,
+ 94,
+ 42,
+ 190,
+ 175,
+ 145,
+ 107,
+ 91,
+ 31,
+ 30,
+ 152,
+ 169,
+ 192,
+ 102,
+ 215,
+ 219,
+ 173,
+ 237,
+ 215,
+ 122,
+ 18,
+ 240,
+ 121,
+ 117,
+ 231,
+ 35,
+ 129,
+ 255,
+ 171,
+ 93,
+ 2,
+ 102,
+ 151,
+ 231,
+ 230,
+ 238,
+ 9,
+ 137,
+ 198,
+ 231,
+ 146,
+ 117,
+ 85,
+ 81,
+ 224,
+ 253,
+ 57,
+ 113,
+ 97,
+ 69,
+ 147,
+ 76,
+ 193,
+ 93,
+ 178,
+ 223,
+ 251,
+ 4,
+ 203,
+ 157,
+ 41,
+ 199,
+ 38,
+ 254,
+ 161,
+ 107,
+ 191,
+ 251,
+ 91,
+ 228,
+ 199,
+ 66,
+ 182,
+ 194,
+ 18,
+ 139,
+ 127,
+ 101,
+ 1,
+ 232,
+ 167,
+ 12,
+ 62,
+ 144,
+ 115,
+ 32,
+ 146,
+ 8,
+ 252,
+ 141,
+ 239,
+ 161,
+ 43,
+ 196,
+ 77,
+ 117,
+ 97,
+ 106,
+ 33,
+ 2,
+ 117,
+ 19,
+ 16,
+ 145,
+ 84,
+ 39,
+ 140,
+ 237,
+ 240,
+ 221,
+ 50,
+ 167,
+ 211,
+ 198,
+ 79,
+ 5,
+ 208,
+ 171,
+ 36,
+ 54,
+ 49,
+ 249,
+ 5,
+ 91,
+ 76,
+ 188,
+ 222,
+ 94,
+ 156,
+ 217,
+ 81,
+ 222,
+ 27,
+ 1,
+ 169,
+ 182,
+ 124,
+ 54,
+ 44,
+ 41,
+ 118,
+ 71,
+ 115,
+ 210,
+ 148,
+ 111,
+ 242,
+ 245,
+ 223,
+ 180,
+ 118,
+ 59,
+ 99,
+ 78,
+ 243,
+ 216,
+ 167,
+ 33,
+ 43,
+ 28,
+ 249,
+ 142,
+ 209,
+ 178,
+ 74,
+ 164,
+ 67,
+ 210,
+ 87,
+ 120,
+ 157,
+ 105,
+ 108,
+ 220,
+ 87,
+ 193,
+ 221,
+ 66,
+ 184,
+ 183,
+ 32,
+ 105,
+ 17,
+ 79,
+ 69,
+ 212,
+ 16,
+ 11,
+ 147,
+ 213,
+ 251,
+ 236,
+ 245,
+ 14,
+ 1,
+ 108,
+ 36,
+ 37,
+ 219,
+ 130,
+ 23,
+ 66,
+ 29,
+ 171,
+ 188,
+ 113,
+ 38,
+ 146,
+ 23,
+ 27,
+ 236,
+ 142,
+ 129,
+ 14,
+ 184,
+ 252,
+ 195,
+ 215,
+ 29,
+ 125,
+ 121,
+ 30,
+ 134,
+ 89,
+ 219,
+ 48,
+ 107,
+ 129,
+ 33,
+ 167,
+ 154,
+ 175,
+ 207,
+ 78,
+ 140,
+ 245,
+ 114,
+ 97,
+ 173,
+ 27,
+ 137,
+ 139,
+ 165,
+ 20,
+ 66,
+ 184,
+ 238,
+ 194,
+ 84,
+ 211,
+ 100,
+ 232,
+ 6,
+ 195,
+ 127,
+ 150,
+ 34,
+ 152,
+ 78,
+ 164,
+ 199,
+ 186,
+ 248,
+ 170,
+ 110,
+ 58,
+ 163,
+ 169,
+ 171,
+ 83,
+ 253,
+ 69,
+ 43,
+ 53,
+ 74,
+ 156,
+ 90,
+ 100,
+ 200,
+ 181,
+ 62,
+ 2,
+ 253,
+ 162,
+ 137,
+ 210,
+ 51,
+ 32,
+ 143,
+ 137,
+ 131,
+ 63,
+ 152,
+ 191,
+ 184,
+ 199,
+ 126,
+ 189,
+ 83,
+ 253,
+ 125,
+ 92,
+ 9,
+ 9,
+ 228,
+ 213,
+ 224,
+ 249,
+ 88,
+ 132,
+ 135,
+ 51,
+ 203,
+ 168,
+ 90,
+ 171,
+ 126,
+ 29,
+ 148,
+ 43,
+ 157,
+ 145,
+ 34,
+ 241,
+ 101,
+ 150,
+ 92,
+ 189,
+ 72,
+ 67,
+ 165,
+ 166,
+ 67,
+ 33,
+ 3,
+ 139,
+ 80,
+ 72,
+ 27,
+ 165,
+ 70,
+ 129,
+ 46,
+ 212,
+ 7,
+ 66,
+ 83,
+ 185,
+ 119,
+ 150,
+ 67,
+ 61,
+ 151,
+ 113,
+ 145,
+ 134,
+ 84,
+ 13,
+ 134,
+ 81,
+ 197,
+ 84,
+ 48,
+ 99,
+ 219,
+ 180,
+ 72,
+ 107,
+ 242,
+ 236,
+ 245,
+ 112,
+ 182,
+ 23,
+ 83,
+ 46,
+ 21,
+ 58,
+ 17,
+ 224,
+ 108,
+ 139,
+ 91,
+ 17,
+ 147,
+ 130,
+ 214,
+ 37,
+ 55,
+ 200,
+ 18,
+ 188,
+ 239,
+ 36,
+ 247,
+ 134,
+ 206,
+ 2,
+ 91,
+ 231,
+ 165,
+ 179,
+ 139,
+ 200,
+ 229,
+ 171,
+ 227,
+ 222,
+ 150,
+ 189,
+ 161,
+ 138,
+ 8,
+ 112,
+ 170,
+ 213,
+ 184,
+ 107,
+ 191,
+ 101,
+ 143,
+ 95,
+ 119,
+ 21,
+ 135,
+ 32,
+ 139,
+ 165,
+ 88,
+ 153,
+ 70,
+ 39,
+ 199,
+ 82,
+ 199,
+ 214,
+ 117,
+ 54,
+ 22,
+ 179,
+ 204,
+ 231,
+ 83,
+ 190,
+ 236,
+ 81,
+ 243,
+ 193,
+ 56,
+ 79,
+ 106,
+ 153,
+ 202,
+ 118,
+ 161,
+ 168,
+ 16,
+ 83,
+ 28,
+ 2,
+ 103,
+ 0,
+ 15,
+ 207,
+ 50,
+ 13,
+ 118,
+ 92,
+ 203,
+ 167,
+ 222,
+ 81,
+ 171,
+ 184,
+ 254,
+ 130,
+ 187,
+ 17,
+ 222,
+ 78,
+ 239,
+ 126,
+ 166,
+ 163,
+ 31,
+ 111,
+ 216,
+ 215,
+ 152,
+ 92,
+ 27,
+ 4,
+ 241,
+ 190,
+ 38,
+ 60,
+ 114,
+ 175,
+ 89,
+ 243,
+ 1,
+ 131,
+ 126,
+ 243,
+ 247,
+ 155,
+ 104,
+ 96,
+ 208,
+ 47,
+ 156,
+ 172,
+ 131,
+ 135,
+ 142,
+ 58,
+ 201,
+ 168,
+ 215,
+ 243,
+ 38,
+ 33,
+ 33,
+ 158,
+ 248,
+ 232,
+ 246,
+ 145,
+ 153,
+ 241,
+ 60,
+ 203,
+ 209,
+ 19,
+ 131,
+ 192,
+ 28,
+ 156,
+ 202,
+ 232,
+ 78,
+ 191,
+ 83,
+ 147,
+ 230,
+ 160,
+ 3,
+ 255,
+ 246,
+ 222,
+ 28,
+ 55,
+ 83,
+ 224,
+ 141,
+ 25,
+ 197,
+ 226,
+ 221,
+ 58,
+ 254,
+ 102,
+ 98,
+ 66,
+ 223,
+ 125,
+ 103,
+ 226,
+ 209,
+ 173,
+ 164,
+ 92,
+ 182,
+ 208,
+ 224,
+ 198,
+ 50,
+ 1,
+ 178,
+ 241,
+ 29,
+ 48,
+ 90,
+ 97,
+ 194,
+ 133,
+ 50,
+ 68,
+ 221,
+ 40,
+ 223,
+ 138,
+ 228,
+ 226,
+ 251,
+ 48,
+ 28,
+ 204,
+ 239,
+ 174,
+ 52,
+ 222,
+ 125,
+ 218,
+ 33,
+ 14,
+ 193,
+ 78,
+ 229,
+ 37,
+ 166,
+ 56,
+ 179,
+ 243,
+ 34,
+ 101,
+ 62,
+ 78,
+ 214,
+ 52,
+ 98,
+ 167,
+ 216,
+ 16,
+ 253,
+ 116,
+ 185,
+ 65,
+ 220,
+ 28,
+ 216,
+ 159,
+ 171,
+ 94,
+ 162,
+ 115,
+ 104,
+ 22,
+ 106,
+ 213,
+ 72,
+ 94,
+ 166,
+ 168,
+ 91,
+ 9,
+ 60,
+ 93,
+ 177,
+ 165,
+ 60,
+ 36,
+ 155,
+ 97,
+ 185,
+ 41,
+ 19,
+ 16,
+ 173,
+ 163,
+ 49,
+ 29,
+ 51,
+ 29,
+ 78,
+ 174,
+ 79,
+ 200,
+ 224,
+ 220,
+ 142,
+ 16,
+ 28,
+ 198,
+ 211,
+ 153,
+ 211,
+ 252,
+ 108,
+ 96,
+ 53,
+ 24,
+ 44,
+ 139,
+ 215,
+ 28,
+ 254,
+ 41,
+ 178,
+ 252,
+ 41,
+ 130,
+ 244,
+ 128,
+ 176,
+ 44,
+ 190,
+ 173,
+ 128,
+ 92,
+ 98,
+ 120,
+ 74,
+ 87,
+ 43,
+ 27,
+ 204,
+ 159,
+ 233,
+ 205,
+ 134,
+ 35,
+ 31,
+ 19,
+ 27,
+ 73,
+ 148,
+ 28,
+ 60,
+ 57,
+ 15,
+ 35,
+ 62,
+ 209,
+ 128,
+ 247,
+ 9,
+ 111,
+ 173,
+ 33,
+ 146,
+ 108,
+ 201,
+ 208,
+ 26,
+ 251,
+ 182,
+ 79,
+ 22,
+ 189,
+ 232,
+ 235,
+ 210,
+ 126,
+ 75,
+ 243,
+ 112,
+ 29,
+ 190,
+ 12,
+ 249,
+ 55,
+ 34,
+ 97,
+ 20,
+ 140,
+ 77,
+ 81,
+ 134,
+ 112,
+ 56,
+ 138,
+ 22,
+ 41,
+ 168,
+ 184,
+ 126,
+ 244,
+ 138,
+ 42,
+ 182,
+ 225,
+ 143,
+ 180,
+ 105,
+ 89,
+ 185,
+ 30,
+ 167,
+ 59,
+ 195,
+ 81,
+ 81,
+ 21,
+ 78,
+ 176,
+ 120,
+ 123,
+ 120,
+ 14,
+ 79,
+ 43,
+ 201,
+ 80,
+ 43,
+ 44,
+ 245,
+ 90,
+ 4,
+ 206,
+ 148,
+ 202,
+ 21,
+ 200,
+ 14,
+ 255,
+ 76,
+ 54,
+ 190,
+ 28,
+ 201,
+ 177,
+ 226,
+ 175,
+ 56,
+ 32,
+ 244,
+ 240,
+ 159,
+ 78,
+ 140,
+ 34,
+ 8,
+ 245,
+ 160,
+ 171,
+ 182,
+ 87,
+ 120,
+ 123,
+ 145,
+ 216,
+ 33,
+ 56,
+ 30,
+ 93,
+ 206,
+ 179,
+ 155,
+ 43,
+ 179,
+ 26,
+ 184,
+ 190,
+ 52,
+ 11,
+ 224,
+ 151,
+ 199,
+ 66,
+ 42,
+ 238,
+ 240,
+ 100,
+ 68,
+ 90,
+ 186,
+ 252,
+ 214,
+ 236,
+ 145,
+ 127,
+ 94,
+ 175,
+ 1,
+ 220,
+ 159,
+ 135,
+ 172,
+ 134,
+ 83,
+ 41,
+ 12,
+ 42,
+ 238,
+ 9,
+ 205,
+ 101,
+ 179,
+ 219,
+ 47,
+ 228,
+ 194,
+ 124,
+ 105,
+ 91,
+ 95,
+ 175,
+ 23,
+ 6,
+ 113,
+ 72,
+ 168,
+ 87,
+ 75,
+ 72,
+ 57,
+ 81,
+ 119,
+ 37,
+ 27,
+ 131,
+ 162,
+ 108,
+ 150,
+ 27,
+ 149,
+ 110,
+ 50,
+ 126,
+ 156,
+ 255,
+ 43,
+ 242,
+ 188,
+ 21,
+ 8,
+ 250,
+ 240,
+ 165,
+ 80,
+ 1,
+ 57,
+ 105,
+ 238,
+ 206,
+ 143,
+ 28,
+ 167,
+ 122,
+ 155,
+ 96,
+ 37,
+ 150,
+ 17,
+ 27,
+ 182,
+ 203,
+ 15,
+ 1,
+ 195,
+ 114,
+ 198,
+ 240,
+ 18,
+ 148,
+ 186,
+ 101,
+ 66,
+ 99,
+ 204,
+ 15,
+ 81,
+ 21,
+ 142,
+ 170,
+ 46,
+ 198,
+ 151,
+ 57,
+ 88,
+ 60,
+ 44,
+ 210,
+ 246,
+ 52,
+ 209,
+ 60,
+ 32,
+ 180,
+ 246,
+ 38,
+ 207,
+ 91,
+ 31,
+ 187,
+ 120,
+ 121,
+ 253,
+ 252,
+ 207,
+ 91,
+ 116,
+ 84,
+ 152,
+ 60,
+ 156,
+ 218,
+ 5,
+ 213,
+ 232,
+ 62,
+ 73,
+ 47,
+ 119,
+ 74,
+ 67,
+ 41,
+ 16,
+ 213,
+ 212,
+ 71,
+ 160,
+ 0,
+ 252,
+ 132,
+ 188,
+ 111,
+ 41,
+ 90,
+ 202,
+ 84,
+ 146,
+ 102,
+ 178,
+ 49,
+ 231,
+ 218,
+ 23,
+ 55,
+ 48,
+ 171,
+ 101,
+ 202,
+ 31,
+ 14,
+ 102,
+ 43,
+ 187,
+ 211,
+ 99,
+ 203,
+ 145,
+ 112,
+ 190,
+ 246,
+ 192,
+ 142,
+ 27,
+ 230,
+ 120,
+ 57,
+ 248,
+ 38,
+ 49,
+ 95,
+ 193,
+ 121,
+ 82,
+ 137,
+ 137,
+ 248,
+ 208,
+ 80,
+ 16,
+ 194,
+ 78,
+ 84,
+ 111,
+ 167,
+ 116,
+ 110,
+ 196,
+ 119,
+ 253,
+ 172,
+ 66,
+ 131,
+ 49,
+ 113,
+ 243,
+ 234,
+ 31,
+ 2,
+ 170,
+ 186,
+ 250,
+ 167,
+ 75,
+ 8,
+ 17,
+ 162,
+ 227,
+ 241,
+ 152,
+ 132,
+ 201,
+ 139,
+ 240,
+ 190,
+ 24,
+ 229,
+ 29,
+ 189,
+ 241,
+ 237,
+ 53,
+ 130,
+ 131,
+ 105,
+ 217,
+ 89,
+ 86,
+ 76,
+ 163,
+ 65,
+ 228,
+ 86,
+ 208,
+ 112,
+ 230,
+ 39,
+ 76,
+ 137,
+ 60,
+ 118,
+ 241,
+ 253,
+ 217,
+ 225,
+ 230,
+ 199,
+ 147,
+ 87,
+ 82,
+ 169,
+ 161,
+ 139,
+ 130,
+ 146,
+ 82,
+ 251,
+ 233,
+ 237,
+ 234,
+ 63,
+ 3,
+ 211,
+ 170,
+ 214,
+ 177,
+ 104,
+ 67,
+ 28,
+ 176,
+ 25,
+ 115,
+ 137,
+ 255,
+ 3,
+ 66,
+ 113,
+ 146,
+ 78,
+ 149,
+ 169,
+ 52,
+ 127,
+ 243,
+ 228,
+ 164,
+ 235,
+ 68,
+ 209,
+ 200,
+ 97,
+ 83,
+ 134,
+ 208,
+ 245,
+ 200,
+ 26,
+ 88,
+ 14,
+ 10,
+ 253,
+ 114,
+ 224,
+ 253,
+ 194,
+ 29,
+ 138,
+ 247,
+ 85,
+ 210,
+ 162,
+ 44,
+ 203,
+ 56,
+ 126,
+ 24,
+ 0,
+ 242,
+ 103,
+ 88,
+ 242,
+ 199,
+ 129,
+ 2,
+ 68,
+ 229,
+ 92,
+ 178,
+ 196,
+ 179,
+ 32,
+ 163,
+ 154,
+ 11,
+ 148,
+ 167,
+ 178,
+ 20,
+ 177,
+ 158,
+ 226,
+ 6,
+ 91,
+ 191,
+ 128,
+ 182,
+ 113,
+ 141,
+ 97,
+ 172,
+ 63,
+ 121,
+ 203,
+ 22,
+ 45,
+ 165,
+ 62,
+ 73,
+ 159,
+ 41,
+ 97,
+ 69,
+ 207,
+ 92,
+ 89,
+ 144,
+ 156,
+ 191,
+ 73,
+ 35,
+ 0,
+ 94,
+ 190,
+ 83,
+ 115,
+ 18,
+ 43,
+ 167,
+ 26,
+ 63,
+ 89,
+ 14,
+ 78,
+ 118,
+ 254,
+ 240,
+ 111,
+ 79,
+ 115,
+ 20,
+ 2,
+ 123,
+ 103,
+ 105,
+ 85,
+ 80,
+ 0,
+ 161,
+ 183,
+ 173,
+ 191,
+ 244,
+ 113,
+ 254,
+ 126,
+ 251,
+ 35,
+ 41,
+ 70,
+ 181,
+ 167,
+ 60,
+ 217,
+ 78,
+ 52,
+ 211,
+ 52,
+ 199,
+ 179,
+ 19,
+ 111,
+ 124,
+ 198,
+ 161,
+ 187,
+ 59,
+ 64,
+ 193,
+ 189,
+ 107,
+ 75,
+ 175,
+ 78,
+ 161,
+ 117,
+ 36,
+ 212,
+ 106,
+ 11,
+ 127,
+ 188,
+ 189,
+ 216,
+ 195,
+ 187,
+ 181,
+ 84,
+ 4,
+ 17,
+ 246,
+ 199,
+ 154,
+ 43,
+ 97,
+ 222,
+ 162,
+ 98,
+ 181,
+ 114,
+ 176,
+ 253,
+ 106,
+ 26,
+ 79,
+ 229,
+ 203,
+ 214,
+ 62,
+ 102,
+ 170,
+ 36,
+ 54,
+ 89,
+ 70,
+ 48,
+ 100,
+ 169,
+ 102,
+ 252,
+ 242,
+ 174,
+ 79,
+ 145,
+ 195,
+ 166,
+ 126,
+ 53,
+ 242,
+ 132,
+ 44,
+ 88,
+ 247,
+ 142,
+ 130,
+ 154,
+ 233,
+ 9,
+ 66,
+ 196,
+ 182,
+ 30,
+ 165,
+ 115,
+ 207,
+ 182,
+ 104,
+ 14,
+ 95,
+ 172,
+ 250,
+ 48,
+ 242,
+ 201,
+ 224,
+ 219,
+ 17,
+ 39,
+ 209,
+ 81,
+ 209,
+ 148,
+ 128,
+ 77,
+ 40,
+ 1,
+ 164,
+ 108,
+ 244,
+ 188,
+ 250,
+ 114,
+ 225,
+ 58,
+ 253,
+ 253,
+ 157,
+ 81,
+ 8,
+ 255,
+ 136,
+ 172,
+ 207,
+ 66,
+ 251,
+ 172,
+ 217,
+ 225,
+ 150,
+ 85,
+ 96,
+ 195,
+ 121,
+ 179,
+ 190,
+ 230,
+ 122,
+ 237,
+ 231,
+ 7,
+ 221,
+ 145,
+ 139,
+ 220,
+ 239,
+ 219,
+ 31,
+ 235,
+ 232,
+ 140,
+ 222,
+ 117,
+ 210,
+ 32,
+ 13,
+ 155,
+ 16,
+ 184,
+ 131,
+ 202,
+ 178,
+ 94,
+ 2,
+ 96,
+ 191,
+ 255,
+ 78,
+ 252,
+ 117,
+ 251,
+ 245,
+ 212,
+ 198,
+ 187,
+ 126,
+ 37,
+ 87,
+ 192,
+ 123,
+ 110,
+ 198,
+ 66,
+ 150,
+ 141,
+ 64,
+ 44,
+ 38,
+ 99,
+ 135,
+ 223,
+ 226,
+ 172,
+ 76,
+ 47,
+ 13,
+ 194,
+ 152,
+ 112,
+ 112,
+ 175,
+ 101,
+ 21,
+ 64,
+ 196,
+ 206,
+ 33,
+ 26,
+ 189,
+ 111,
+ 210,
+ 198,
+ 116,
+ 241,
+ 232,
+ 155,
+ 237,
+ 79,
+ 183,
+ 232,
+ 156,
+ 67,
+ 20,
+ 14,
+ 19,
+ 97,
+ 6,
+ 1,
+ 122,
+ 181,
+ 17,
+ 64,
+ 8,
+ 59,
+ 207,
+ 172,
+ 89,
+ 173,
+ 118,
+ 50,
+ 102,
+ 55,
+ 121,
+ 243,
+ 69,
+ 77,
+ 68,
+ 112,
+ 65,
+ 119,
+ 205,
+ 160,
+ 188,
+ 47,
+ 74,
+ 77,
+ 26,
+ 165,
+ 230,
+ 228,
+ 19,
+ 255,
+ 106,
+ 107,
+ 167,
+ 36,
+ 64,
+ 215,
+ 98,
+ 253,
+ 47,
+ 0,
+ 225,
+ 250,
+ 213,
+ 220,
+ 82,
+ 213,
+ 61,
+ 100,
+ 114,
+ 177,
+ 109,
+ 196,
+ 140,
+ 214,
+ 99,
+ 137,
+ 98,
+ 141,
+ 225,
+ 16,
+ 104,
+ 35,
+ 40,
+ 204,
+ 225,
+ 104,
+ 235,
+ 77,
+ 230,
+ 37,
+ 73,
+ 104,
+ 64,
+ 134,
+ 60,
+ 42,
+ 51,
+ 96,
+ 118,
+ 117,
+ 85,
+ 1,
+ 209,
+ 33,
+ 27,
+ 55,
+ 240,
+ 214,
+ 140,
+ 80,
+ 177,
+ 107,
+ 175,
+ 190,
+ 106,
+ 113,
+ 122,
+ 144,
+ 124,
+ 193,
+ 89,
+ 141,
+ 225,
+ 210,
+ 194,
+ 29,
+ 73,
+ 239,
+ 151,
+ 48,
+ 225,
+ 1,
+ 12,
+ 201,
+ 63,
+ 62,
+ 215,
+ 48,
+ 92,
+ 118,
+ 113,
+ 228,
+ 141,
+ 224,
+ 98,
+ 203,
+ 28,
+ 20,
+ 124,
+ 149,
+ 252,
+ 86,
+ 77,
+ 155,
+ 24,
+ 61,
+ 2,
+ 116,
+ 207,
+ 20,
+ 237,
+ 246,
+ 36,
+ 66,
+ 11,
+ 167,
+ 17,
+ 142,
+ 36,
+ 76,
+ 137,
+ 100,
+ 142,
+ 111,
+ 216,
+ 235,
+ 239,
+ 212,
+ 153,
+ 159,
+ 36,
+ 189,
+ 147,
+ 132,
+ 96,
+ 127,
+ 148,
+ 116,
+ 232,
+ 119,
+ 38,
+ 174,
+ 16,
+ 167,
+ 70,
+ 78,
+ 187,
+ 21,
+ 13,
+ 3,
+ 192,
+ 211,
+ 43,
+ 201,
+ 102,
+ 112,
+ 125,
+ 240,
+ 198,
+ 162,
+ 92,
+ 84,
+ 28,
+ 54,
+ 197,
+ 117,
+ 149,
+ 222,
+ 140,
+ 202,
+ 70,
+ 24,
+ 100,
+ 128,
+ 114,
+ 90,
+ 230,
+ 110,
+ 37,
+ 161,
+ 144,
+ 199,
+ 157,
+ 112,
+ 2,
+ 169,
+ 253,
+ 223,
+ 149,
+ 48,
+ 181,
+ 87,
+ 169,
+ 177,
+ 177,
+ 134,
+ 119,
+ 248,
+ 119,
+ 84,
+ 90,
+ 71,
+ 252,
+ 95,
+ 233,
+ 180,
+ 232,
+ 119,
+ 168,
+ 33,
+ 252,
+ 72,
+ 112,
+ 81,
+ 67,
+ 253,
+ 147,
+ 217,
+ 171,
+ 42,
+ 4,
+ 233,
+ 161,
+ 175,
+ 227,
+ 239,
+ 10,
+ 181,
+ 35,
+ 28,
+ 40,
+ 203,
+ 131,
+ 30,
+ 85,
+ 188,
+ 119,
+ 163,
+ 99,
+ 117,
+ 203,
+ 35,
+ 67,
+ 204,
+ 92,
+ 185,
+ 6,
+ 124,
+ 243,
+ 211,
+ 102,
+ 252,
+ 243,
+ 246,
+ 109,
+ 44,
+ 90,
+ 250,
+ 23,
+ 191,
+ 151,
+ 107,
+ 213,
+ 141,
+ 224,
+ 81,
+ 3,
+ 207,
+ 157,
+ 50,
+ 198,
+ 216,
+ 87,
+ 233,
+ 96,
+ 125,
+ 116,
+ 53,
+ 31,
+ 214,
+ 138,
+ 9,
+ 208,
+ 10,
+ 152,
+ 222,
+ 172,
+ 155,
+ 90,
+ 86,
+ 201,
+ 47,
+ 92,
+ 9,
+ 7,
+ 28,
+ 132,
+ 33,
+ 118,
+ 76,
+ 13,
+ 212,
+ 87,
+ 191,
+ 69,
+ 18,
+ 6,
+ 60,
+ 5,
+ 78,
+ 153,
+ 20,
+ 173,
+ 154,
+ 44,
+ 255,
+ 104,
+ 127,
+ 126,
+ 17,
+ 110,
+ 254,
+ 141,
+ 174,
+ 42,
+ 148,
+ 15,
+ 168,
+ 18,
+ 66,
+ 5,
+ 89,
+ 63,
+ 199,
+ 76,
+ 162,
+ 98,
+ 116,
+ 217,
+ 194,
+ 219,
+ 135,
+ 227,
+ 172,
+ 230,
+ 128,
+ 199,
+ 30,
+ 141,
+ 124,
+ 199,
+ 174,
+ 180,
+ 67,
+ 14,
+ 171,
+ 217,
+ 151,
+ 18,
+ 161,
+ 248,
+ 248,
+ 208,
+ 99,
+ 247,
+ 170,
+ 242,
+ 126,
+ 43,
+ 74,
+ 100,
+ 99,
+ 133,
+ 143,
+ 167,
+ 10,
+ 122,
+ 217,
+ 249,
+ 248,
+ 195,
+ 150,
+ 129,
+ 222,
+ 212,
+ 12,
+ 121,
+ 13,
+ 35,
+ 213,
+ 241,
+ 67,
+ 242,
+ 89,
+ 24,
+ 73,
+ 244,
+ 253,
+ 152,
+ 203,
+ 83,
+ 56,
+ 216,
+ 239,
+ 91,
+ 119,
+ 176,
+ 75,
+ 40,
+ 247,
+ 195,
+ 145,
+ 19,
+ 198,
+ 83,
+ 119,
+ 242,
+ 235,
+ 60,
+ 243,
+ 175,
+ 25,
+ 26,
+ 78,
+ 22,
+ 39,
+ 124,
+ 232,
+ 206,
+ 208,
+ 79,
+ 243,
+ 155,
+ 24,
+ 17,
+ 175,
+ 197,
+ 145,
+ 47,
+ 113,
+ 176,
+ 76,
+ 223,
+ 120,
+ 123,
+ 255,
+ 255,
+ 140,
+ 174,
+ 237,
+ 83,
+ 201,
+ 165,
+ 68,
+ 55,
+ 133,
+ 9,
+ 149,
+ 212,
+ 48,
+ 57,
+ 242,
+ 33,
+ 115,
+ 202,
+ 242,
+ 23,
+ 57,
+ 203,
+ 238,
+ 12,
+ 178,
+ 102,
+ 190,
+ 191,
+ 219,
+ 119,
+ 102,
+ 116,
+ 233,
+ 243,
+ 133,
+ 8,
+ 89,
+ 28,
+ 115,
+ 196,
+ 150,
+ 71,
+ 218,
+ 211,
+ 176,
+ 77,
+ 122,
+ 159,
+ 58,
+ 9,
+ 178,
+ 167,
+ 229,
+ 196,
+ 24,
+ 56,
+ 211,
+ 216,
+ 108,
+ 91,
+ 157,
+ 203,
+ 217,
+ 209,
+ 191,
+ 86,
+ 202,
+ 109,
+ 179,
+ 26,
+ 234,
+ 162,
+ 33,
+ 218,
+ 90,
+ 144,
+ 147,
+ 18,
+ 209,
+ 99,
+ 254,
+ 233,
+ 111,
+ 229,
+ 170,
+ 8,
+ 42,
+ 163,
+ 125,
+ 165,
+ 248,
+ 100,
+ 190,
+ 210,
+ 233,
+ 202,
+ 90,
+ 77,
+ 27,
+ 27,
+ 221,
+ 192,
+ 243,
+ 76,
+ 6,
+ 130,
+ 125,
+ 95,
+ 247,
+ 154,
+ 75,
+ 227,
+ 183,
+ 104,
+ 174,
+ 178,
+ 150,
+ 164,
+ 46,
+ 174,
+ 79,
+ 198,
+ 197,
+ 5,
+ 223,
+ 129,
+ 72,
+ 10,
+ 139,
+ 143,
+ 6,
+ 130,
+ 101,
+ 183,
+ 205,
+ 167,
+ 62,
+ 47,
+ 92,
+ 254,
+ 237,
+ 211,
+ 126,
+ 155,
+ 146,
+ 229,
+ 215,
+ 85,
+ 235,
+ 156,
+ 62,
+ 43,
+ 232,
+ 234,
+ 201,
+ 21,
+ 174,
+ 80,
+ 32,
+ 32,
+ 98,
+ 150,
+ 245,
+ 54,
+ 9,
+ 72,
+ 85,
+ 178,
+ 162,
+ 255,
+ 33,
+ 55,
+ 73,
+ 99,
+ 47,
+ 68,
+ 193,
+ 217,
+ 47,
+ 239,
+ 72,
+ 32,
+ 219,
+ 44,
+ 121,
+ 44,
+ 123,
+ 65,
+ 99,
+ 186,
+ 193,
+ 244,
+ 175,
+ 6,
+ 49,
+ 58,
+ 193,
+ 1,
+ 30,
+ 5,
+ 102,
+ 68,
+ 42,
+ 142,
+ 90,
+ 24,
+ 96,
+ 134,
+ 180,
+ 246,
+ 238,
+ 94,
+ 161,
+ 240,
+ 94,
+ 103,
+ 2,
+ 142,
+ 198,
+ 67,
+ 254,
+ 219,
+ 23,
+ 118,
+ 236,
+ 49,
+ 92,
+ 123,
+ 84,
+ 91,
+ 115,
+ 165,
+ 225,
+ 123,
+ 20,
+ 35,
+ 170,
+ 215,
+ 12,
+ 52,
+ 69,
+ 197,
+ 54,
+ 134,
+ 210,
+ 23,
+ 219,
+ 49,
+ 31,
+ 2,
+ 160,
+ 140,
+ 221,
+ 233,
+ 191,
+ 238,
+ 215,
+ 86,
+ 74,
+ 36,
+ 28,
+ 233,
+ 171,
+ 77,
+ 34,
+ 142,
+ 162,
+ 20,
+ 65,
+ 207,
+ 143,
+ 113,
+ 27,
+ 132,
+ 94,
+ 227,
+ 94,
+ 39,
+ 237,
+ 150,
+ 233,
+ 97,
+ 133,
+ 182,
+ 139,
+ 158,
+ 241,
+ 100,
+ 52,
+ 22,
+ 49,
+ 19,
+ 46,
+ 213,
+ 120,
+ 171,
+ 98,
+ 53,
+ 245,
+ 125,
+ 219,
+ 226,
+ 231,
+ 217,
+ 184,
+ 159,
+ 156,
+ 33,
+ 78,
+ 183,
+ 114,
+ 1,
+ 83,
+ 156,
+ 184,
+ 32,
+ 146,
+ 76,
+ 39,
+ 35,
+ 120,
+ 134,
+ 38,
+ 40,
+ 61,
+ 149,
+ 239,
+ 77,
+ 198,
+ 218,
+ 68,
+ 214,
+ 126,
+ 255,
+ 1,
+ 128,
+ 226,
+ 109,
+ 8,
+ 242,
+ 142,
+ 246,
+ 4,
+ 78,
+ 223,
+ 249,
+ 167,
+ 70,
+ 129,
+ 103,
+ 46,
+ 18,
+ 250,
+ 47,
+ 128,
+ 174,
+ 27,
+ 248,
+ 0,
+ 38,
+ 9,
+ 34,
+ 247,
+ 236,
+ 141,
+ 6,
+ 211,
+ 212,
+ 173,
+ 116,
+ 120,
+ 163,
+ 215,
+ 105,
+ 162,
+ 59,
+ 203,
+ 144,
+ 175,
+ 206,
+ 128,
+ 5,
+ 74,
+ 239,
+ 186,
+ 45,
+ 248,
+ 237,
+ 51,
+ 133,
+ 96,
+ 2,
+ 23,
+ 199,
+ 195,
+ 55,
+ 212,
+ 39,
+ 30,
+ 182,
+ 34,
+ 109,
+ 175,
+ 203,
+ 81,
+ 101,
+ 81,
+ 17,
+ 15,
+ 246,
+ 204,
+ 217,
+ 222,
+ 40,
+ 53,
+ 218,
+ 20,
+ 114,
+ 181,
+ 96,
+ 193,
+ 177,
+ 77,
+ 145,
+ 16,
+ 164,
+ 106,
+ 83,
+ 235,
+ 64,
+ 119,
+ 2,
+ 100,
+ 41,
+ 181,
+ 206,
+ 105,
+ 102,
+ 104,
+ 242,
+ 6,
+ 168,
+ 183,
+ 125,
+ 58,
+ 129,
+ 184,
+ 92,
+ 6,
+ 157,
+ 122,
+ 100,
+ 48,
+ 100,
+ 100,
+ 32,
+ 232,
+ 7,
+ 139,
+ 117,
+ 135,
+ 78,
+ 8,
+ 27,
+ 12,
+ 86,
+ 8,
+ 74,
+ 144,
+ 6,
+ 75,
+ 207,
+ 21,
+ 64,
+ 73,
+ 14,
+ 141,
+ 188,
+ 49,
+ 56,
+ 184,
+ 254,
+ 208,
+ 173,
+ 59,
+ 110,
+ 182,
+ 145,
+ 185,
+ 130,
+ 236,
+ 226,
+ 4,
+ 165,
+ 47,
+ 118,
+ 37,
+ 1,
+ 240,
+ 193,
+ 13,
+ 54,
+ 93,
+ 173,
+ 231,
+ 151,
+ 65,
+ 35,
+ 86,
+ 206,
+ 207,
+ 127,
+ 203,
+ 45,
+ 189,
+ 65,
+ 150,
+ 199,
+ 156,
+ 66,
+ 124,
+ 208,
+ 127,
+ 20,
+ 65,
+ 229,
+ 134,
+ 127,
+ 107,
+ 223,
+ 12,
+ 0,
+ 156,
+ 154,
+ 57,
+ 210,
+ 199,
+ 160,
+ 159,
+ 61,
+ 92,
+ 99,
+ 84,
+ 135,
+ 94,
+ 194,
+ 66,
+ 185,
+ 86,
+ 207,
+ 106,
+ 162,
+ 27,
+ 148,
+ 30,
+ 122,
+ 145,
+ 50,
+ 116,
+ 94,
+ 180,
+ 65,
+ 159,
+ 194,
+ 92,
+ 97,
+ 17,
+ 174,
+ 209,
+ 94,
+ 207,
+ 170,
+ 140,
+ 135,
+ 8,
+ 67,
+ 197,
+ 55,
+ 119,
+ 180,
+ 56,
+ 118,
+ 73,
+ 126,
+ 31,
+ 46,
+ 105,
+ 212,
+ 71,
+ 212,
+ 158,
+ 77,
+ 233,
+ 181,
+ 149,
+ 98,
+ 207,
+ 153,
+ 137,
+ 73,
+ 227,
+ 29,
+ 115,
+ 92,
+ 57,
+ 57,
+ 87,
+ 88,
+ 43,
+ 227,
+ 28,
+ 232,
+ 62,
+ 25,
+ 161,
+ 219,
+ 120,
+ 229,
+ 187,
+ 145,
+ 248,
+ 69,
+ 17,
+ 180,
+ 118,
+ 145,
+ 141,
+ 145,
+ 226,
+ 158,
+ 251,
+ 118,
+ 112,
+ 47,
+ 116,
+ 247,
+ 2,
+ 118,
+ 51,
+ 82,
+ 10,
+ 103,
+ 197,
+ 77,
+ 103,
+ 33,
+ 184,
+ 92,
+ 90,
+ 225,
+ 6,
+ 98,
+ 47,
+ 147,
+ 162,
+ 175,
+ 213,
+ 213,
+ 53,
+ 59,
+ 77,
+ 22,
+ 5,
+ 100,
+ 11,
+ 174,
+ 148,
+ 131,
+ 94,
+ 122,
+ 41,
+ 217,
+ 127,
+ 118,
+ 80,
+ 254,
+ 31,
+ 239,
+ 244,
+ 184,
+ 31,
+ 55,
+ 17,
+ 73,
+ 114,
+ 105,
+ 42,
+ 15,
+ 42,
+ 168,
+ 161,
+ 48,
+ 25,
+ 85,
+ 9,
+ 250,
+ 239,
+ 218,
+ 176,
+ 107,
+ 222,
+ 15,
+ 8,
+ 38,
+ 62,
+ 62,
+ 77,
+ 167,
+ 131,
+ 178,
+ 229,
+ 42,
+ 91,
+ 113,
+ 4,
+ 169,
+ 46,
+ 134,
+ 234,
+ 137,
+ 41,
+ 183,
+ 22,
+ 70,
+ 230,
+ 173,
+ 104,
+ 187,
+ 118,
+ 183,
+ 191,
+ 254,
+ 230,
+ 119,
+ 120,
+ 96,
+ 91,
+ 236,
+ 139,
+ 252,
+ 206,
+ 173,
+ 10,
+ 139,
+ 56,
+ 108,
+ 182,
+ 209,
+ 206,
+ 215,
+ 215,
+ 151,
+ 137,
+ 52,
+ 221,
+ 222,
+ 95,
+ 172,
+ 104,
+ 17,
+ 164,
+ 36,
+ 241,
+ 243,
+ 196,
+ 48,
+ 169,
+ 143,
+ 213,
+ 42,
+ 81,
+ 37,
+ 125,
+ 63,
+ 172,
+ 49,
+ 237,
+ 217,
+ 12,
+ 71,
+ 246,
+ 173,
+ 93,
+ 210,
+ 107,
+ 232,
+ 139,
+ 53,
+ 186,
+ 250,
+ 198,
+ 227,
+ 150,
+ 159,
+ 102,
+ 135,
+ 171,
+ 215,
+ 97,
+ 79,
+ 2,
+ 27,
+ 119,
+ 100,
+ 160,
+ 89,
+ 178,
+ 221,
+ 249,
+ 140,
+ 200,
+ 146,
+ 86,
+ 71,
+ 222,
+ 187,
+ 87,
+ 32,
+ 36,
+ 165,
+ 212,
+ 69,
+ 217,
+ 2,
+ 245,
+ 111,
+ 141,
+ 68,
+ 97,
+ 194,
+ 226,
+ 221,
+ 79,
+ 103,
+ 171,
+ 167,
+ 13,
+ 14,
+ 47,
+ 247,
+ 247,
+ 110,
+ 245,
+ 2,
+ 201,
+ 244,
+ 184,
+ 83,
+ 54,
+ 75,
+ 45,
+ 57,
+ 37,
+ 16,
+ 171,
+ 167,
+ 251,
+ 145,
+ 59,
+ 199,
+ 89,
+ 128,
+ 115,
+ 123,
+ 213,
+ 201,
+ 233,
+ 248,
+ 229,
+ 186,
+ 56,
+ 74,
+ 147,
+ 7,
+ 61,
+ 26,
+ 43,
+ 214,
+ 117,
+ 4,
+ 233,
+ 137,
+ 84,
+ 44,
+ 196,
+ 231,
+ 205,
+ 98,
+ 224,
+ 50,
+ 165,
+ 13,
+ 129,
+ 17,
+ 130,
+ 2,
+ 199,
+ 207,
+ 137,
+ 230,
+ 72,
+ 66,
+ 226,
+ 247,
+ 92,
+ 203,
+ 69,
+ 161,
+ 67,
+ 239,
+ 135,
+ 84,
+ 103,
+ 21,
+ 55,
+ 146,
+ 93,
+ 102,
+ 213,
+ 228,
+ 240,
+ 70,
+ 169,
+ 25,
+ 21,
+ 184,
+ 139,
+ 233,
+ 160,
+ 115,
+ 216,
+ 77,
+ 154,
+ 251,
+ 51,
+ 229,
+ 83,
+ 76,
+ 125,
+ 200,
+ 114,
+ 60,
+ 230,
+ 158,
+ 8,
+ 83,
+ 75,
+ 143,
+ 100,
+ 237,
+ 233,
+ 114,
+ 201,
+ 130,
+ 131,
+ 145,
+ 26,
+ 139,
+ 175,
+ 222,
+ 145,
+ 241,
+ 215,
+ 149,
+ 143,
+ 72,
+ 26,
+ 197,
+ 152,
+ 172,
+ 252,
+ 161,
+ 197,
+ 109,
+ 74,
+ 125,
+ 39,
+ 165,
+ 242,
+ 133,
+ 181,
+ 212,
+ 108,
+ 144,
+ 123,
+ 180,
+ 92,
+ 137,
+ 131,
+ 129,
+ 251,
+ 109,
+ 124,
+ 45,
+ 201,
+ 247,
+ 36,
+ 68,
+ 210,
+ 196,
+ 243,
+ 198,
+ 21,
+ 4,
+ 169,
+ 209,
+ 150,
+ 228,
+ 234,
+ 221,
+ 112,
+ 230,
+ 128,
+ 42,
+ 149,
+ 145,
+ 192,
+ 217,
+ 253,
+ 191,
+ 30,
+ 59,
+ 60,
+ 216,
+ 179,
+ 240,
+ 99,
+ 48,
+ 141,
+ 19,
+ 194,
+ 62,
+ 199,
+ 131,
+ 5,
+ 179,
+ 228,
+ 47,
+ 48,
+ 82,
+ 48,
+ 109,
+ 96,
+ 220,
+ 142,
+ 111,
+ 203,
+ 251,
+ 155,
+ 117,
+ 123,
+ 208,
+ 246,
+ 173,
+ 234,
+ 197,
+ 72,
+ 165,
+ 178,
+ 2,
+ 73,
+ 73,
+ 216,
+ 20,
+ 80,
+ 169,
+ 53,
+ 45,
+ 16,
+ 138,
+ 191,
+ 182,
+ 64,
+ 250,
+ 254,
+ 198,
+ 118,
+ 89,
+ 204,
+ 21,
+ 168,
+ 76,
+ 233,
+ 249,
+ 193,
+ 148,
+ 67,
+ 58,
+ 22,
+ 231,
+ 220,
+ 49,
+ 182,
+ 64,
+ 133,
+ 75,
+ 222,
+ 153,
+ 78,
+ 51,
+ 185,
+ 103,
+ 72,
+ 79,
+ 64,
+ 103,
+ 230,
+ 234,
+ 37,
+ 5,
+ 82,
+ 132,
+ 11,
+ 208,
+ 169,
+ 250,
+ 97,
+ 73,
+ 98,
+ 219,
+ 181,
+ 167,
+ 62,
+ 70,
+ 1,
+ 244,
+ 237,
+ 67,
+ 24,
+ 57,
+ 54,
+ 20,
+ 3,
+ 124,
+ 174,
+ 124,
+ 254,
+ 110,
+ 210,
+ 37,
+ 237,
+ 95,
+ 64,
+ 198,
+ 31,
+ 60,
+ 203,
+ 243,
+ 90,
+ 180,
+ 248,
+ 241,
+ 152,
+ 56,
+ 254,
+ 115,
+ 52,
+ 156,
+ 23,
+ 226,
+ 152,
+ 210,
+ 93,
+ 221,
+ 91,
+ 68,
+ 134,
+ 38,
+ 80,
+ 113,
+ 168,
+ 150,
+ 199,
+ 124,
+ 197,
+ 229,
+ 29,
+ 186,
+ 124,
+ 226,
+ 254,
+ 199,
+ 141,
+ 127,
+ 129,
+ 47,
+ 163,
+ 41,
+ 99,
+ 186,
+ 152,
+ 4,
+ 29,
+ 63,
+ 32,
+ 88,
+ 105,
+ 122,
+ 87,
+ 28,
+ 236,
+ 253,
+ 66,
+ 20,
+ 29,
+ 173,
+ 29,
+ 49,
+ 154,
+ 90,
+ 172,
+ 243,
+ 173,
+ 48,
+ 187,
+ 98,
+ 57,
+ 97,
+ 99,
+ 75,
+ 32,
+ 204,
+ 126,
+ 176,
+ 94,
+ 147,
+ 55,
+ 116,
+ 98,
+ 144,
+ 7,
+ 23,
+ 201,
+ 187,
+ 78,
+ 240,
+ 4,
+ 130,
+ 221,
+ 108,
+ 108,
+ 240,
+ 82,
+ 208,
+ 132,
+ 223,
+ 16,
+ 80,
+ 12,
+ 214,
+ 190,
+ 47,
+ 31,
+ 7,
+ 226,
+ 59,
+ 201,
+ 73,
+ 205,
+ 213,
+ 249,
+ 60,
+ 9,
+ 124,
+ 123,
+ 99,
+ 146,
+ 6,
+ 239,
+ 97,
+ 36,
+ 217,
+ 208,
+ 15,
+ 221,
+ 217,
+ 209,
+ 243,
+ 70,
+ 197,
+ 254,
+ 7,
+ 254,
+ 210,
+ 209,
+ 84,
+ 10,
+ 134,
+ 56,
+ 234,
+ 254,
+ 238,
+ 204,
+ 13,
+ 60,
+ 45,
+ 24,
+ 57,
+ 57,
+ 31,
+ 112,
+ 14,
+ 34,
+ 180,
+ 213,
+ 170,
+ 43,
+ 53,
+ 220,
+ 10,
+ 43,
+ 103,
+ 226,
+ 67,
+ 41,
+ 189,
+ 85,
+ 13,
+ 91,
+ 48,
+ 122,
+ 144,
+ 78,
+ 207,
+ 192,
+ 57,
+ 56,
+ 59,
+ 121,
+ 108,
+ 91,
+ 207,
+ 19,
+ 249,
+ 44,
+ 59,
+ 93,
+ 79,
+ 251,
+ 82,
+ 16,
+ 171,
+ 70,
+ 188,
+ 227,
+ 165,
+ 213,
+ 109,
+ 178,
+ 62,
+ 22,
+ 84,
+ 165,
+ 155,
+ 120,
+ 193,
+ 44,
+ 149,
+ 91,
+ 214,
+ 195,
+ 26,
+ 120,
+ 98,
+ 30,
+ 188,
+ 139,
+ 126,
+ 157,
+ 218,
+ 172,
+ 103,
+ 102,
+ 73,
+ 53,
+ 39,
+ 158,
+ 214,
+ 243,
+ 23,
+ 167,
+ 83,
+ 27,
+ 167,
+ 148,
+ 122,
+ 43,
+ 140,
+ 235,
+ 19,
+ 73,
+ 25,
+ 44,
+ 222,
+ 39,
+ 110,
+ 128,
+ 70,
+ 17,
+ 142,
+ 76,
+ 245,
+ 57,
+ 229,
+ 0,
+ 178,
+ 136,
+ 244,
+ 219,
+ 65,
+ 55,
+ 140,
+ 9,
+ 28,
+ 202,
+ 43,
+ 37,
+ 68,
+ 24,
+ 28,
+ 43,
+ 232,
+ 127,
+ 106,
+ 148,
+ 124,
+ 142,
+ 108,
+ 33,
+ 36,
+ 20,
+ 182,
+ 24,
+ 234,
+ 194,
+ 31,
+ 25,
+ 209,
+ 44,
+ 160,
+ 254,
+ 242,
+ 194,
+ 98,
+ 16,
+ 225,
+ 71,
+ 56,
+ 164,
+ 78,
+ 253,
+ 240,
+ 122,
+ 47,
+ 132,
+ 29,
+ 18,
+ 85,
+ 186,
+ 234,
+ 241,
+ 245,
+ 174,
+ 14,
+ 65,
+ 170,
+ 194,
+ 69,
+ 251,
+ 182,
+ 177,
+ 57,
+ 206,
+ 32,
+ 76,
+ 65,
+ 137,
+ 221,
+ 117,
+ 67,
+ 16,
+ 235,
+ 160,
+ 56,
+ 30,
+ 94,
+ 106,
+ 250,
+ 247,
+ 115,
+ 121,
+ 152,
+ 196,
+ 60,
+ 182,
+ 111,
+ 14,
+ 179,
+ 38,
+ 171,
+ 37,
+ 37,
+ 137,
+ 174,
+ 134,
+ 240,
+ 52,
+ 65,
+ 241,
+ 104,
+ 246,
+ 147,
+ 164,
+ 175,
+ 172,
+ 26,
+ 255,
+ 53,
+ 44,
+ 21,
+ 210,
+ 231,
+ 224,
+ 49,
+ 182,
+ 122,
+ 81,
+ 167,
+ 191,
+ 78,
+ 48,
+ 30,
+ 66,
+ 107,
+ 245,
+ 27,
+ 117,
+ 93,
+ 44,
+ 17,
+ 80,
+ 239,
+ 26,
+ 206,
+ 227,
+ 174,
+ 106,
+ 83,
+ 31,
+ 155,
+ 209,
+ 106,
+ 74,
+ 41,
+ 208,
+ 197,
+ 11,
+ 121,
+ 16,
+ 160,
+ 181,
+ 35,
+ 193,
+ 145,
+ 255,
+ 182,
+ 26,
+ 14,
+ 4,
+ 123,
+ 165,
+ 207,
+ 250,
+ 132,
+ 236,
+ 95,
+ 122,
+ 244,
+ 230,
+ 96,
+ 137,
+ 147,
+ 73,
+ 175,
+ 76,
+ 127,
+ 196,
+ 12,
+ 242,
+ 167,
+ 167,
+ 48,
+ 222,
+ 225,
+ 204,
+ 71,
+ 149,
+ 148,
+ 63,
+ 106,
+ 210,
+ 112,
+ 224,
+ 215,
+ 245,
+ 21,
+ 16,
+ 115,
+ 128,
+ 83,
+ 255,
+ 224,
+ 230,
+ 247,
+ 53,
+ 241,
+ 161,
+ 120,
+ 86,
+ 155,
+ 11,
+ 66,
+ 34,
+ 46,
+ 48,
+ 176,
+ 235,
+ 66,
+ 169,
+ 42,
+ 19,
+ 204,
+ 24,
+ 46,
+ 156,
+ 59,
+ 46,
+ 215,
+ 99,
+ 226,
+ 207,
+ 219,
+ 154,
+ 85,
+ 238,
+ 40,
+ 176,
+ 197,
+ 168,
+ 5,
+ 240,
+ 84,
+ 254,
+ 77,
+ 114,
+ 176,
+ 230,
+ 134,
+ 175,
+ 140,
+ 11,
+ 165,
+ 36,
+ 87,
+ 93,
+ 238,
+ 251,
+ 1,
+ 190,
+ 74,
+ 239,
+ 251,
+ 133,
+ 248,
+ 101,
+ 160,
+ 245,
+ 102,
+ 16,
+ 145,
+ 246,
+ 195,
+ 196,
+ 113,
+ 134,
+ 238,
+ 123,
+ 44,
+ 64,
+ 223,
+ 103,
+ 178,
+ 52,
+ 13,
+ 114,
+ 73,
+ 12,
+ 15,
+ 201,
+ 167,
+ 247,
+ 156,
+ 233,
+ 81,
+ 102,
+ 26,
+ 36,
+ 115,
+ 6,
+ 47,
+ 75,
+ 167,
+ 139,
+ 116,
+ 94,
+ 237,
+ 39,
+ 12,
+ 86,
+ 230,
+ 202,
+ 127,
+ 28,
+ 199,
+ 230,
+ 85,
+ 156,
+ 176,
+ 245,
+ 199,
+ 2,
+ 243,
+ 127,
+ 128,
+ 125,
+ 90,
+ 14,
+ 140,
+ 91,
+ 122,
+ 135,
+ 194,
+ 115,
+ 43,
+ 164,
+ 37,
+ 148,
+ 159,
+ 1,
+ 64,
+ 223,
+ 41,
+ 144,
+ 89,
+ 60,
+ 178,
+ 74,
+ 234,
+ 147,
+ 109,
+ 48,
+ 74,
+ 95,
+ 124,
+ 148,
+ 51,
+ 25,
+ 84,
+ 15,
+ 137,
+ 99,
+ 85,
+ 142,
+ 181,
+ 93,
+ 73,
+ 178,
+ 166,
+ 232,
+ 108,
+ 246,
+ 62,
+ 24,
+ 186,
+ 229,
+ 43,
+ 39,
+ 147,
+ 161,
+ 232,
+ 101,
+ 204,
+ 156,
+ 250,
+ 43,
+ 125,
+ 115,
+ 176,
+ 222,
+ 213,
+ 220,
+ 66,
+ 22,
+ 71,
+ 180,
+ 62,
+ 44,
+ 25,
+ 41,
+ 81,
+ 185,
+ 230,
+ 9,
+ 128,
+ 82,
+ 216,
+ 21,
+ 62,
+ 181,
+ 70,
+ 170,
+ 37,
+ 23,
+ 83,
+ 100,
+ 73,
+ 138,
+ 205,
+ 224,
+ 65,
+ 1,
+ 157,
+ 241,
+ 48,
+ 158,
+ 242,
+ 239,
+ 247,
+ 177,
+ 44,
+ 106,
+ 204,
+ 48,
+ 242,
+ 10,
+ 42,
+ 145,
+ 53,
+ 182,
+ 204,
+ 213,
+ 194,
+ 239,
+ 93,
+ 58,
+ 199,
+ 194,
+ 185,
+ 254,
+ 128,
+ 243,
+ 229,
+ 193,
+ 39,
+ 145,
+ 49,
+ 246,
+ 128,
+ 215,
+ 30,
+ 148,
+ 85,
+ 84,
+ 16,
+ 108,
+ 24,
+ 154,
+ 142,
+ 13,
+ 192,
+ 32,
+ 245,
+ 173,
+ 250,
+ 41,
+ 34,
+ 41,
+ 154,
+ 242,
+ 111,
+ 66,
+ 104,
+ 110,
+ 185,
+ 93,
+ 68,
+ 238,
+ 239,
+ 83,
+ 50,
+ 145,
+ 154,
+ 96,
+ 156,
+ 67,
+ 96,
+ 242,
+ 163,
+ 91,
+ 156,
+ 234,
+ 147,
+ 231,
+ 242,
+ 76,
+ 72,
+ 214,
+ 231,
+ 30,
+ 50,
+ 144,
+ 40,
+ 78,
+ 106,
+ 158,
+ 74,
+ 54,
+ 86,
+ 106,
+ 57,
+ 71,
+ 18,
+ 198,
+ 142,
+ 175,
+ 153,
+ 167,
+ 44,
+ 58,
+ 117,
+ 6,
+ 157,
+ 9,
+ 88,
+ 44,
+ 56,
+ 218,
+ 139,
+ 209,
+ 35,
+ 219,
+ 153,
+ 0,
+ 13,
+ 18,
+ 67,
+ 212,
+ 173,
+ 150,
+ 185,
+ 221,
+ 23,
+ 42,
+ 65,
+ 99,
+ 76,
+ 243,
+ 39,
+ 87,
+ 248,
+ 123,
+ 94,
+ 180,
+ 239,
+ 151,
+ 243,
+ 44,
+ 213,
+ 136,
+ 72,
+ 133,
+ 30,
+ 152,
+ 158,
+ 212,
+ 62,
+ 45,
+ 129,
+ 35,
+ 105,
+ 63,
+ 37,
+ 16,
+ 239,
+ 1,
+ 188,
+ 38,
+ 65,
+ 121,
+ 28,
+ 141,
+ 34,
+ 156,
+ 139,
+ 156,
+ 97,
+ 3,
+ 190,
+ 230,
+ 8,
+ 48,
+ 252,
+ 27,
+ 221,
+ 152,
+ 30,
+ 215,
+ 242,
+ 129,
+ 163,
+ 170,
+ 71,
+ 40,
+ 203,
+ 39,
+ 84,
+ 201,
+ 62,
+ 30,
+ 245,
+ 21,
+ 154,
+ 228,
+ 57,
+ 87,
+ 228,
+ 54,
+ 80,
+ 60,
+ 205,
+ 209,
+ 162,
+ 166,
+ 199,
+ 154,
+ 235,
+ 106,
+ 124,
+ 71,
+ 23,
+ 5,
+ 166,
+ 197,
+ 181,
+ 245,
+ 208,
+ 95,
+ 231,
+ 230,
+ 130,
+ 148,
+ 173,
+ 226,
+ 252,
+ 201,
+ 153,
+ 135,
+ 213,
+ 175,
+ 134,
+ 179,
+ 85,
+ 104,
+ 167,
+ 39,
+ 244,
+ 118,
+ 157,
+ 151,
+ 161,
+ 174,
+ 248,
+ 108,
+ 84,
+ 66,
+ 127,
+ 96,
+ 72,
+ 211,
+ 227,
+ 23,
+ 169,
+ 225,
+ 32,
+ 186,
+ 14,
+ 194,
+ 145,
+ 220,
+ 183,
+ 213,
+ 114,
+ 119,
+ 28,
+ 40,
+ 188,
+ 129,
+ 140,
+ 12,
+ 150,
+ 192,
+ 57,
+ 167,
+ 228,
+ 96,
+ 29,
+ 154,
+ 193,
+ 111,
+ 115,
+ 244,
+ 106,
+ 27,
+ 207,
+ 21,
+ 217,
+ 156,
+ 37,
+ 233,
+ 15,
+ 190,
+ 196,
+ 223,
+ 108,
+ 82,
+ 202,
+ 187,
+ 204,
+ 255,
+ 154,
+ 149,
+ 230,
+ 36,
+ 142,
+ 161,
+ 148,
+ 55,
+ 151,
+ 164,
+ 251,
+ 225,
+ 210,
+ 163,
+ 88,
+ 208,
+ 205,
+ 125,
+ 170,
+ 198,
+ 139,
+ 82,
+ 27,
+ 230,
+ 205,
+ 100,
+ 13,
+ 76,
+ 249,
+ 132,
+ 12,
+ 5,
+ 108,
+ 209,
+ 211,
+ 223,
+ 58,
+ 246,
+ 108,
+ 16,
+ 108,
+ 225,
+ 52,
+ 112,
+ 242,
+ 181,
+ 226,
+ 110,
+ 132,
+ 244,
+ 141,
+ 198,
+ 74,
+ 65,
+ 176,
+ 183,
+ 85,
+ 241,
+ 161,
+ 229,
+ 208,
+ 9,
+ 158,
+ 213,
+ 56,
+ 173,
+ 66,
+ 240,
+ 101,
+ 102,
+ 31,
+ 112,
+ 191,
+ 101,
+ 139,
+ 197,
+ 88,
+ 168,
+ 240,
+ 143,
+ 73,
+ 189,
+ 240,
+ 67,
+ 239,
+ 102,
+ 157,
+ 164,
+ 93,
+ 138,
+ 101,
+ 217,
+ 197,
+ 62,
+ 91,
+ 223,
+ 247,
+ 63,
+ 70,
+ 105,
+ 116,
+ 150,
+ 100,
+ 253,
+ 201,
+ 246,
+ 119,
+ 224,
+ 1,
+ 83,
+ 172,
+ 185,
+ 233,
+ 191,
+ 194,
+ 140,
+ 67,
+ 166,
+ 85,
+ 202,
+ 150,
+ 159,
+ 20,
+ 65,
+ 240,
+ 144,
+ 68,
+ 218,
+ 59,
+ 234,
+ 55,
+ 166,
+ 235,
+ 149,
+ 138,
+ 32,
+ 74,
+ 249,
+ 235,
+ 158,
+ 185,
+ 153,
+ 61,
+ 222,
+ 48,
+ 44,
+ 39,
+ 191,
+ 159,
+ 135,
+ 203,
+ 76,
+ 224,
+ 244,
+ 177,
+ 122,
+ 200,
+ 30,
+ 179,
+ 130,
+ 135,
+ 155,
+ 192,
+ 141,
+ 149,
+ 150,
+ 58,
+ 31,
+ 121,
+ 1,
+ 158,
+ 230,
+ 62,
+ 245,
+ 106,
+ 181,
+ 126,
+ 67,
+ 16,
+ 237,
+ 47,
+ 197,
+ 202,
+ 97,
+ 28,
+ 47,
+ 117,
+ 27,
+ 176,
+ 21,
+ 227,
+ 242,
+ 42,
+ 61,
+ 129,
+ 79,
+ 100,
+ 33,
+ 17,
+ 209,
+ 251,
+ 40,
+ 112,
+ 242,
+ 17,
+ 201,
+ 224,
+ 192,
+ 120,
+ 206,
+ 198,
+ 233,
+ 152,
+ 0,
+ 220,
+ 4,
+ 7,
+ 138,
+ 240,
+ 79,
+ 85,
+ 172,
+ 168,
+ 140,
+ 199,
+ 154,
+ 103,
+ 99,
+ 212,
+ 22,
+ 55,
+ 178,
+ 41,
+ 80,
+ 250,
+ 117,
+ 68,
+ 142,
+ 7,
+ 229,
+ 39,
+ 32,
+ 175,
+ 243,
+ 31,
+ 255,
+ 226,
+ 208,
+ 199,
+ 12,
+ 64,
+ 247,
+ 59,
+ 57,
+ 200,
+ 59,
+ 93,
+ 243,
+ 83,
+ 139,
+ 177,
+ 82,
+ 47,
+ 144,
+ 81,
+ 80,
+ 18,
+ 60,
+ 72,
+ 7,
+ 177,
+ 11,
+ 71,
+ 150,
+ 37,
+ 85,
+ 229,
+ 27,
+ 145,
+ 249,
+ 242,
+ 212,
+ 228,
+ 215,
+ 197,
+ 175,
+ 244,
+ 51,
+ 218,
+ 230,
+ 52,
+ 207,
+ 233,
+ 40,
+ 143,
+ 150,
+ 0,
+ 94,
+ 252,
+ 113,
+ 126,
+ 10,
+ 201,
+ 112,
+ 122,
+ 249,
+ 182,
+ 76,
+ 74,
+ 38,
+ 114,
+ 165,
+ 231,
+ 245,
+ 241,
+ 189,
+ 94,
+ 62,
+ 66,
+ 169,
+ 87,
+ 158,
+ 65,
+ 74,
+ 190,
+ 148,
+ 133,
+ 141,
+ 150,
+ 205,
+ 94,
+ 244,
+ 207,
+ 251,
+ 216,
+ 143,
+ 170,
+ 84,
+ 229,
+ 136,
+ 78,
+ 206,
+ 203,
+ 10,
+ 215,
+ 166,
+ 106,
+ 39,
+ 17,
+ 209,
+ 95,
+ 94,
+ 107,
+ 198,
+ 138,
+ 32,
+ 2,
+ 179,
+ 154,
+ 145,
+ 94,
+ 162,
+ 122,
+ 159,
+ 107,
+ 144,
+ 2,
+ 136,
+ 113,
+ 209,
+ 195,
+ 136,
+ 63,
+ 8,
+ 11,
+ 130,
+ 221,
+ 248,
+ 196,
+ 145,
+ 141,
+ 161,
+ 107,
+ 230,
+ 84,
+ 158,
+ 146,
+ 169,
+ 205,
+ 27,
+ 243,
+ 70,
+ 37,
+ 25,
+ 173,
+ 36,
+ 250,
+ 199,
+ 248,
+ 114,
+ 141,
+ 12,
+ 165,
+ 166,
+ 43,
+ 71,
+ 197,
+ 80,
+ 177,
+ 225,
+ 61,
+ 199,
+ 178,
+ 182,
+ 216,
+ 247,
+ 31,
+ 18,
+ 179,
+ 125,
+ 11,
+ 145,
+ 86,
+ 237,
+ 31,
+ 64,
+ 36,
+ 117,
+ 208,
+ 216,
+ 18,
+ 22,
+ 49,
+ 73,
+ 143,
+ 170,
+ 174,
+ 128,
+ 170,
+ 191,
+ 180,
+ 91,
+ 186,
+ 46,
+ 40,
+ 60,
+ 139,
+ 8,
+ 206,
+ 218,
+ 143,
+ 253,
+ 246,
+ 26,
+ 94,
+ 8,
+ 73,
+ 12,
+ 16,
+ 252,
+ 21,
+ 35,
+ 160,
+ 241,
+ 254,
+ 185,
+ 4,
+ 38,
+ 225,
+ 199,
+ 242,
+ 243,
+ 19,
+ 57,
+ 109,
+ 20,
+ 30,
+ 101,
+ 177,
+ 123,
+ 186,
+ 3,
+ 97,
+ 233,
+ 220,
+ 148,
+ 194,
+ 181,
+ 180,
+ 104,
+ 167,
+ 0,
+ 45,
+ 22,
+ 20,
+ 39,
+ 214,
+ 253,
+ 40,
+ 177,
+ 207,
+ 188,
+ 221,
+ 14,
+ 186,
+ 91,
+ 164,
+ 93,
+ 39,
+ 83,
+ 203,
+ 168,
+ 143,
+ 105,
+ 65,
+ 36,
+ 177,
+ 51,
+ 95,
+ 79,
+ 149,
+ 36,
+ 62,
+ 5,
+ 52,
+ 251,
+ 179,
+ 179,
+ 48,
+ 255,
+ 210,
+ 186,
+ 46,
+ 161,
+ 130,
+ 176,
+ 239,
+ 46,
+ 3,
+ 193,
+ 34,
+ 27,
+ 59,
+ 12,
+ 117,
+ 158,
+ 176,
+ 214,
+ 159,
+ 241,
+ 54,
+ 181,
+ 138,
+ 107,
+ 29,
+ 189,
+ 231,
+ 191,
+ 78,
+ 150,
+ 193,
+ 134,
+ 83,
+ 12,
+ 174,
+ 163,
+ 213,
+ 108,
+ 242,
+ 179,
+ 148,
+ 45,
+ 244,
+ 4,
+ 51,
+ 141,
+ 139,
+ 52,
+ 146,
+ 146,
+ 3,
+ 31,
+ 141,
+ 92,
+ 80,
+ 177,
+ 106,
+ 47,
+ 111,
+ 11,
+ 188,
+ 254,
+ 177,
+ 229,
+ 114,
+ 112,
+ 226,
+ 134,
+ 218,
+ 37,
+ 90,
+ 70,
+ 142,
+ 171,
+ 243,
+ 131,
+ 114,
+ 139,
+ 215,
+ 97,
+ 137,
+ 226,
+ 8,
+ 126,
+ 7,
+ 230,
+ 206,
+ 93,
+ 142,
+ 121,
+ 172,
+ 173,
+ 245,
+ 180,
+ 75,
+ 226,
+ 46,
+ 121,
+ 163,
+ 74,
+ 125,
+ 243,
+ 170,
+ 109,
+ 33,
+ 247,
+ 9,
+ 3,
+ 121,
+ 133,
+ 241,
+ 101,
+ 91,
+ 152,
+ 5,
+ 188,
+ 7,
+ 167,
+ 30,
+ 225,
+ 128,
+ 173,
+ 235,
+ 248,
+ 32,
+ 199,
+ 47,
+ 119,
+ 117,
+ 238,
+ 160,
+ 137,
+ 26,
+ 210,
+ 172,
+ 68,
+ 86,
+ 56,
+ 232,
+ 90,
+ 220,
+ 137,
+ 197,
+ 200,
+ 81,
+ 104,
+ 194,
+ 5,
+ 28,
+ 229,
+ 105,
+ 147,
+ 214,
+ 12,
+ 137,
+ 190,
+ 62,
+ 103,
+ 178,
+ 164,
+ 89,
+ 160,
+ 187,
+ 127,
+ 251,
+ 175,
+ 89,
+ 55,
+ 10,
+ 42,
+ 31,
+ 72,
+ 155,
+ 237,
+ 95,
+ 45,
+ 34,
+ 72,
+ 217,
+ 243,
+ 232,
+ 113,
+ 29,
+ 205,
+ 180,
+ 70,
+ 24,
+ 211,
+ 164,
+ 52,
+ 34,
+ 11,
+ 180,
+ 100,
+ 131,
+ 135,
+ 131,
+ 63,
+ 143,
+ 247,
+ 219,
+ 243,
+ 83,
+ 94,
+ 171,
+ 223,
+ 132,
+ 38,
+ 2,
+ 9,
+ 251,
+ 57,
+ 38,
+ 223,
+ 228,
+ 19,
+ 39,
+ 83,
+ 212,
+ 225,
+ 242,
+ 141,
+ 70,
+ 237,
+ 79,
+ 115,
+ 249,
+ 188,
+ 64,
+ 76,
+ 26,
+ 73,
+ 207,
+ 165,
+ 199,
+ 51,
+ 58,
+ 59,
+ 65,
+ 253,
+ 163,
+ 46,
+ 248,
+ 8,
+ 209,
+ 243,
+ 90,
+ 161,
+ 198,
+ 1,
+ 21,
+ 85,
+ 154,
+ 194,
+ 121,
+ 0,
+ 61,
+ 50,
+ 206,
+ 126,
+ 45,
+ 211,
+ 96,
+ 31,
+ 172,
+ 146,
+ 75,
+ 145,
+ 208,
+ 55,
+ 89,
+ 38,
+ 246,
+ 125,
+ 218,
+ 79,
+ 102,
+ 228,
+ 233,
+ 145,
+ 34,
+ 179,
+ 183,
+ 217,
+ 81,
+ 96,
+ 159,
+ 101,
+ 118,
+ 162,
+ 145,
+ 175,
+ 198,
+ 215,
+ 154,
+ 0,
+ 52,
+ 61,
+ 181,
+ 55,
+ 248,
+ 221,
+ 150,
+ 217,
+ 216,
+ 99,
+ 226,
+ 160,
+ 4,
+ 111,
+ 2,
+ 253,
+ 167,
+ 246,
+ 48,
+ 157,
+ 235,
+ 151,
+ 109,
+ 190,
+ 184,
+ 157,
+ 246,
+ 15,
+ 172,
+ 155,
+ 81,
+ 230,
+ 53,
+ 64,
+ 32,
+ 71,
+ 214,
+ 181,
+ 132,
+ 156,
+ 211,
+ 119,
+ 173,
+ 201,
+ 69,
+ 37,
+ 230,
+ 229,
+ 27,
+ 193,
+ 239,
+ 87,
+ 88,
+ 97,
+ 46,
+ 195,
+ 60,
+ 251,
+ 36,
+ 106,
+ 142,
+ 143,
+ 145,
+ 189,
+ 164,
+ 28,
+ 183,
+ 173,
+ 36,
+ 191,
+ 153,
+ 75,
+ 252,
+ 45,
+ 106,
+ 194,
+ 7,
+ 235,
+ 147,
+ 158,
+ 74,
+ 247,
+ 58,
+ 138,
+ 203,
+ 164,
+ 89,
+ 228,
+ 111,
+ 75,
+ 221,
+ 182,
+ 226,
+ 240,
+ 124,
+ 123,
+ 138,
+ 84,
+ 220,
+ 215,
+ 78,
+ 229,
+ 152,
+ 136,
+ 105,
+ 188,
+ 140,
+ 29,
+ 201,
+ 229,
+ 133,
+ 96,
+ 243,
+ 116,
+ 39,
+ 145,
+ 228,
+ 139,
+ 139,
+ 220,
+ 63,
+ 50,
+ 88,
+ 250,
+ 99,
+ 223,
+ 255,
+ 124,
+ 232,
+ 140,
+ 96,
+ 68,
+ 174,
+ 102,
+ 150,
+ 156,
+ 129,
+ 121,
+ 229,
+ 95,
+ 224,
+ 34,
+ 237,
+ 95,
+ 149,
+ 153,
+ 199,
+ 192,
+ 35,
+ 192,
+ 159,
+ 252,
+ 151,
+ 128,
+ 72,
+ 175,
+ 188,
+ 41,
+ 162,
+ 223,
+ 253,
+ 90,
+ 221,
+ 237,
+ 46,
+ 189,
+ 31,
+ 126,
+ 9,
+ 81,
+ 230,
+ 243,
+ 72,
+ 119,
+ 119,
+ 152,
+ 1,
+ 29,
+ 120,
+ 239,
+ 220,
+ 71,
+ 250,
+ 94,
+ 29,
+ 64,
+ 120,
+ 113,
+ 208,
+ 169,
+ 140,
+ 244,
+ 51,
+ 52,
+ 71,
+ 141,
+ 202,
+ 93,
+ 150,
+ 53,
+ 33,
+ 190,
+ 228,
+ 220,
+ 91,
+ 252,
+ 188,
+ 27,
+ 156,
+ 62,
+ 7,
+ 255,
+ 24,
+ 219,
+ 160,
+ 168,
+ 68,
+ 4,
+ 93,
+ 191,
+ 164,
+ 33,
+ 127,
+ 95,
+ 215,
+ 111,
+ 169,
+ 235,
+ 154,
+ 6,
+ 38,
+ 196,
+ 46,
+ 44,
+ 244,
+ 83,
+ 104,
+ 120,
+ 59,
+ 56,
+ 226,
+ 102,
+ 89,
+ 179,
+ 191,
+ 16,
+ 147,
+ 50,
+ 62,
+ 203,
+ 65,
+ 135,
+ 139,
+ 34,
+ 138,
+ 60,
+ 213,
+ 20,
+ 121,
+ 72,
+ 171,
+ 22,
+ 95,
+ 239,
+ 187,
+ 74,
+ 209,
+ 196,
+ 185,
+ 253,
+ 32,
+ 43,
+ 200,
+ 135,
+ 26,
+ 114,
+ 177,
+ 225,
+ 77,
+ 29,
+ 159,
+ 212,
+ 137,
+ 239,
+ 229,
+ 131,
+ 56,
+ 106,
+ 225,
+ 124,
+ 92,
+ 169,
+ 138,
+ 254,
+ 1,
+ 107,
+ 152,
+ 63,
+ 226,
+ 134,
+ 131,
+ 69,
+ 157,
+ 216,
+ 18,
+ 234,
+ 226,
+ 134,
+ 40,
+ 24,
+ 76,
+ 111,
+ 11,
+ 46,
+ 125,
+ 198,
+ 36,
+ 28,
+ 104,
+ 88,
+ 244,
+ 190,
+ 124,
+ 8,
+ 141,
+ 229,
+ 255,
+ 224,
+ 222,
+ 175,
+ 121,
+ 68,
+ 194,
+ 73,
+ 186,
+ 77,
+ 92,
+ 59,
+ 130,
+ 90,
+ 149,
+ 107,
+ 28,
+ 42,
+ 245,
+ 109,
+ 132,
+ 180,
+ 241,
+ 16,
+ 144,
+ 153,
+ 227,
+ 98,
+ 149,
+ 239,
+ 188,
+ 32,
+ 236,
+ 149,
+ 221,
+ 166,
+ 181,
+ 242,
+ 142,
+ 96,
+ 31,
+ 65,
+ 11,
+ 230,
+ 5,
+ 149,
+ 209,
+ 67,
+ 176,
+ 205,
+ 97,
+ 23,
+ 188,
+ 86,
+ 42,
+ 245,
+ 200,
+ 143,
+ 128,
+ 47,
+ 99,
+ 134,
+ 125,
+ 243,
+ 43,
+ 159,
+ 125,
+ 140,
+ 158,
+ 173,
+ 126,
+ 109,
+ 220,
+ 40,
+ 144,
+ 94,
+ 22,
+ 184,
+ 57,
+ 248,
+ 120,
+ 167,
+ 61,
+ 63,
+ 245,
+ 124,
+ 52,
+ 215,
+ 31,
+ 11,
+ 58,
+ 24,
+ 222,
+ 53,
+ 155,
+ 160,
+ 183,
+ 158,
+ 133,
+ 149,
+ 160,
+ 130,
+ 249,
+ 251,
+ 229,
+ 146,
+ 16,
+ 195,
+ 1,
+ 128,
+ 166,
+ 154,
+ 150,
+ 171,
+ 12,
+ 253,
+ 226,
+ 225,
+ 188,
+ 159,
+ 210,
+ 176,
+ 202,
+ 72,
+ 63,
+ 205,
+ 97,
+ 63,
+ 59,
+ 207,
+ 142,
+ 96,
+ 12,
+ 53,
+ 92,
+ 238,
+ 32,
+ 68,
+ 78,
+ 111,
+ 160,
+ 195,
+ 191,
+ 115,
+ 212,
+ 253,
+ 122,
+ 250,
+ 15,
+ 21,
+ 108,
+ 216,
+ 51,
+ 227,
+ 166,
+ 33,
+ 135,
+ 181,
+ 89,
+ 158,
+ 182,
+ 244,
+ 200,
+ 19,
+ 147,
+ 200,
+ 185,
+ 39,
+ 170,
+ 63,
+ 103,
+ 46,
+ 240,
+ 149,
+ 121,
+ 255,
+ 208,
+ 165,
+ 237,
+ 105,
+ 113,
+ 72,
+ 51,
+ 171,
+ 141,
+ 247,
+ 178,
+ 140,
+ 142,
+ 27,
+ 216,
+ 97,
+ 42,
+ 245,
+ 147,
+ 1,
+ 109,
+ 19,
+ 215,
+ 189,
+ 226,
+ 143,
+ 68,
+ 25,
+ 131,
+ 170,
+ 122,
+ 222,
+ 69,
+ 219,
+ 142,
+ 79,
+ 184,
+ 169,
+ 239,
+ 126,
+ 104,
+ 166,
+ 111,
+ 45,
+ 223,
+ 229,
+ 142,
+ 133,
+ 50,
+ 174,
+ 123,
+ 150,
+ 55,
+ 170,
+ 214,
+ 217,
+ 170,
+ 251,
+ 160,
+ 8,
+ 22,
+ 204,
+ 100,
+ 30,
+ 126,
+ 167,
+ 69,
+ 185,
+ 226,
+ 10,
+ 254,
+ 146,
+ 127,
+ 11,
+ 3,
+ 95,
+ 78,
+ 253,
+ 115,
+ 112,
+ 176,
+ 165,
+ 171,
+ 57,
+ 147,
+ 249,
+ 37,
+ 9,
+ 146,
+ 21,
+ 203,
+ 6,
+ 248,
+ 82,
+ 221,
+ 148,
+ 207,
+ 212,
+ 4,
+ 11,
+ 153,
+ 118,
+ 140,
+ 223,
+ 9,
+ 242,
+ 153,
+ 227,
+ 15,
+ 200,
+ 54,
+ 6,
+ 205,
+ 243,
+ 118,
+ 197,
+ 0,
+ 248,
+ 154,
+ 250,
+ 129,
+ 20,
+ 59,
+ 43,
+ 191,
+ 66,
+ 89,
+ 211,
+ 206,
+ 154,
+ 240,
+ 160,
+ 58,
+ 29,
+ 222,
+ 32,
+ 177,
+ 58,
+ 97,
+ 157,
+ 111,
+ 167,
+ 185,
+ 66,
+ 145,
+ 215,
+ 226,
+ 123,
+ 133,
+ 50,
+ 103,
+ 154,
+ 136,
+ 164,
+ 168,
+ 190,
+ 91,
+ 18,
+ 133,
+ 71,
+ 186,
+ 173,
+ 171,
+ 225,
+ 196,
+ 61,
+ 119,
+ 239,
+ 75,
+ 166,
+ 31,
+ 138,
+ 67,
+ 139,
+ 172,
+ 158,
+ 41,
+ 101,
+ 121,
+ 34,
+ 35,
+ 147,
+ 129,
+ 149,
+ 210,
+ 209,
+ 193,
+ 236,
+ 5,
+ 23,
+ 156,
+ 3,
+ 115,
+ 244,
+ 137,
+ 39,
+ 83,
+ 180,
+ 183,
+ 25,
+ 89,
+ 202,
+ 31,
+ 56,
+ 222,
+ 75,
+ 169,
+ 214,
+ 61,
+ 208,
+ 11,
+ 225,
+ 61,
+ 55,
+ 147,
+ 198,
+ 85,
+ 87,
+ 200,
+ 155,
+ 194,
+ 35,
+ 18,
+ 18,
+ 222,
+ 102,
+ 162,
+ 138,
+ 153,
+ 185,
+ 152,
+ 111,
+ 86,
+ 19,
+ 206,
+ 94,
+ 146,
+ 25,
+ 145,
+ 194,
+ 141,
+ 155,
+ 179,
+ 157,
+ 210,
+ 45,
+ 234,
+ 22,
+ 129,
+ 148,
+ 57,
+ 115,
+ 1,
+ 103,
+ 199,
+ 165,
+ 173,
+ 230,
+ 94,
+ 123,
+ 43,
+ 61,
+ 164,
+ 56,
+ 199,
+ 116,
+ 123,
+ 135,
+ 249,
+ 141,
+ 51,
+ 233,
+ 79,
+ 158,
+ 241,
+ 230,
+ 73,
+ 37,
+ 82,
+ 128,
+ 88,
+ 243,
+ 205,
+ 142,
+ 210,
+ 222,
+ 109,
+ 12,
+ 233,
+ 4,
+ 222,
+ 44,
+ 101,
+ 224,
+ 186,
+ 206,
+ 133,
+ 75,
+ 33,
+ 4,
+ 50,
+ 232,
+ 154,
+ 47,
+ 225,
+ 239,
+ 178,
+ 103,
+ 227,
+ 109,
+ 127,
+ 157,
+ 251,
+ 110,
+ 198,
+ 60,
+ 141,
+ 61,
+ 115,
+ 42,
+ 174,
+ 131,
+ 93,
+ 182,
+ 230,
+ 120,
+ 170,
+ 0,
+ 32,
+ 159,
+ 66,
+ 143,
+ 205,
+ 154,
+ 143,
+ 190,
+ 118,
+ 117,
+ 123,
+ 166,
+ 227,
+ 84,
+ 112,
+ 18,
+ 193,
+ 82,
+ 15,
+ 117,
+ 238,
+ 187,
+ 54,
+ 159,
+ 177,
+ 106,
+ 174,
+ 126,
+ 222,
+ 40,
+ 72,
+ 43,
+ 31,
+ 79,
+ 233,
+ 193,
+ 252,
+ 235,
+ 138,
+ 108,
+ 254,
+ 170,
+ 239,
+ 5,
+ 60,
+ 241,
+ 208,
+ 40,
+ 90,
+ 205,
+ 247,
+ 112,
+ 48,
+ 193,
+ 205,
+ 159,
+ 162,
+ 126,
+ 253,
+ 244,
+ 43,
+ 71,
+ 238,
+ 57,
+ 120,
+ 128,
+ 199,
+ 52,
+ 14,
+ 6,
+ 239,
+ 68,
+ 73,
+ 97,
+ 173,
+ 138,
+ 6,
+ 82,
+ 22,
+ 96,
+ 68,
+ 45,
+ 45,
+ 7,
+ 94,
+ 174,
+ 170,
+ 166,
+ 10,
+ 82,
+ 193,
+ 202,
+ 117,
+ 49,
+ 10,
+ 79,
+ 41,
+ 248,
+ 251,
+ 81,
+ 251,
+ 36,
+ 120,
+ 240,
+ 15,
+ 63,
+ 126,
+ 137,
+ 174,
+ 57,
+ 209,
+ 24,
+ 250,
+ 96,
+ 148,
+ 139,
+ 67,
+ 122,
+ 201,
+ 105,
+ 178,
+ 89,
+ 2,
+ 149,
+ 199,
+ 132,
+ 59,
+ 214,
+ 32,
+ 229,
+ 194,
+ 163,
+ 241,
+ 47,
+ 211,
+ 242,
+ 11,
+ 143,
+ 123,
+ 238,
+ 76,
+ 30,
+ 97,
+ 68,
+ 170,
+ 29,
+ 65,
+ 92,
+ 184,
+ 175,
+ 217,
+ 0,
+ 100,
+ 170,
+ 152,
+ 107,
+ 162,
+ 209,
+ 31,
+ 117,
+ 92,
+ 20,
+ 156,
+ 69,
+ 117,
+ 208,
+ 134,
+ 204,
+ 64,
+ 158,
+ 86,
+ 41,
+ 95,
+ 100,
+ 6,
+ 141,
+ 246,
+ 3,
+ 200,
+ 25,
+ 91,
+ 160,
+ 48,
+ 103,
+ 228,
+ 136,
+ 94,
+ 150,
+ 158,
+ 145,
+ 64,
+ 219,
+ 239,
+ 55,
+ 252,
+ 90,
+ 121,
+ 64,
+ 251,
+ 147,
+ 207,
+ 133,
+ 245,
+ 201,
+ 127,
+ 190,
+ 146,
+ 172,
+ 28,
+ 87,
+ 15,
+ 243,
+ 1,
+ 139,
+ 188,
+ 223,
+ 15,
+ 223,
+ 119,
+ 41,
+ 134,
+ 19,
+ 65,
+ 148,
+ 137,
+ 254,
+ 118,
+ 215,
+ 49,
+ 77,
+ 247,
+ 236,
+ 124,
+ 172,
+ 142,
+ 246,
+ 17,
+ 59,
+ 183,
+ 196,
+ 9,
+ 255,
+ 195,
+ 119,
+ 142,
+ 131,
+ 139,
+ 134,
+ 147,
+ 21,
+ 198,
+ 142,
+ 221,
+ 241,
+ 63,
+ 112,
+ 165,
+ 87,
+ 211,
+ 205,
+ 45,
+ 84,
+ 42,
+ 181,
+ 42,
+ 214,
+ 65,
+ 5,
+ 114,
+ 153,
+ 43,
+ 92,
+ 25,
+ 122,
+ 218,
+ 89,
+ 10,
+ 226,
+ 239,
+ 104,
+ 250,
+ 213,
+ 40,
+ 3,
+ 50,
+ 101,
+ 70,
+ 62,
+ 166,
+ 177,
+ 91,
+ 232,
+ 5,
+ 139,
+ 90,
+ 156,
+ 185,
+ 8,
+ 160,
+ 98,
+ 113,
+ 83,
+ 113,
+ 27,
+ 15,
+ 168,
+ 91,
+ 240,
+ 199,
+ 46,
+ 44,
+ 202,
+ 131,
+ 33,
+ 94,
+ 139,
+ 191,
+ 50,
+ 214,
+ 33,
+ 111,
+ 221,
+ 67,
+ 153,
+ 165,
+ 70,
+ 209,
+ 136,
+ 89,
+ 191,
+ 247,
+ 17,
+ 27,
+ 75,
+ 217,
+ 93,
+ 171,
+ 45,
+ 84,
+ 238,
+ 11,
+ 209,
+ 243,
+ 214,
+ 110,
+ 230,
+ 213,
+ 48,
+ 101,
+ 40,
+ 10,
+ 47,
+ 109,
+ 129,
+ 209,
+ 149,
+ 135,
+ 190,
+ 162,
+ 147,
+ 168,
+ 231,
+ 29,
+ 203,
+ 3,
+ 253,
+ 226,
+ 201,
+ 232,
+ 222,
+ 190,
+ 143,
+ 118,
+ 169,
+ 93,
+ 240,
+ 117,
+ 128,
+ 238,
+ 7,
+ 209,
+ 248,
+ 178,
+ 68,
+ 44,
+ 197,
+ 26,
+ 98,
+ 88,
+ 65,
+ 198,
+ 143,
+ 198,
+ 21,
+ 147,
+ 167,
+ 140,
+ 194,
+ 142,
+ 172,
+ 8,
+ 173,
+ 149,
+ 2,
+ 174,
+ 251,
+ 119,
+ 168,
+ 33,
+ 132,
+ 180,
+ 174,
+ 7,
+ 195,
+ 194,
+ 11,
+ 10,
+ 100,
+ 163,
+ 163,
+ 98,
+ 53,
+ 71,
+ 4,
+ 229,
+ 99,
+ 183,
+ 242,
+ 203,
+ 54,
+ 64,
+ 66,
+ 225,
+ 199,
+ 194,
+ 163,
+ 45,
+ 110,
+ 86,
+ 136,
+ 163,
+ 138,
+ 222,
+ 135,
+ 148,
+ 200,
+ 140,
+ 198,
+ 111,
+ 107,
+ 184,
+ 28,
+ 85,
+ 180,
+ 37,
+ 3,
+ 231,
+ 155,
+ 121,
+ 130,
+ 87,
+ 78,
+ 117,
+ 108,
+ 94,
+ 215,
+ 101,
+ 102,
+ 222,
+ 236,
+ 16,
+ 199,
+ 145,
+ 188,
+ 71,
+ 190,
+ 4,
+ 24,
+ 214,
+ 35,
+ 120,
+ 60,
+ 212,
+ 69,
+ 251,
+ 52,
+ 248,
+ 149,
+ 85,
+ 6,
+ 214,
+ 245,
+ 86,
+ 48,
+ 178,
+ 139,
+ 109,
+ 51,
+ 1,
+ 145,
+ 52,
+ 221,
+ 217,
+ 158,
+ 212,
+ 13,
+ 19,
+ 78,
+ 221,
+ 76,
+ 67,
+ 157,
+ 213,
+ 126,
+ 234,
+ 86,
+ 122,
+ 24,
+ 223,
+ 204,
+ 255,
+ 173,
+ 233,
+ 109,
+ 39,
+ 116,
+ 53,
+ 238,
+ 229,
+ 104,
+ 23,
+ 147,
+ 204,
+ 247,
+ 85,
+ 34,
+ 228,
+ 38,
+ 125,
+ 244,
+ 71,
+ 188,
+ 45,
+ 169,
+ 216,
+ 99,
+ 103,
+ 4,
+ 137,
+ 183,
+ 157,
+ 217,
+ 48,
+ 2,
+ 29,
+ 51,
+ 107,
+ 7,
+ 64,
+ 155,
+ 73,
+ 169,
+ 206,
+ 196,
+ 193,
+ 193,
+ 175,
+ 226,
+ 74,
+ 139,
+ 138,
+ 248,
+ 58,
+ 197,
+ 76,
+ 247,
+ 95,
+ 89,
+ 169,
+ 113,
+ 79,
+ 244,
+ 46,
+ 33,
+ 180,
+ 47,
+ 95,
+ 177,
+ 242,
+ 209,
+ 213,
+ 112,
+ 28,
+ 60,
+ 16,
+ 97,
+ 66,
+ 167,
+ 114,
+ 213,
+ 135,
+ 153,
+ 216,
+ 1,
+ 253,
+ 32,
+ 173,
+ 29,
+ 66,
+ 44,
+ 247,
+ 166,
+ 25,
+ 65,
+ 22,
+ 239,
+ 83,
+ 49,
+ 45,
+ 75,
+ 193,
+ 49,
+ 152,
+ 194,
+ 73,
+ 97,
+ 154,
+ 109,
+ 87,
+ 246,
+ 249,
+ 133,
+ 241,
+ 209,
+ 8,
+ 238,
+ 242,
+ 38,
+ 237,
+ 15,
+ 246,
+ 199,
+ 143,
+ 173,
+ 138,
+ 249,
+ 143,
+ 20,
+ 183,
+ 106,
+ 31,
+ 214,
+ 152,
+ 228,
+ 176,
+ 25,
+ 203,
+ 238,
+ 239,
+ 3,
+ 142,
+ 54,
+ 231,
+ 12,
+ 189,
+ 42,
+ 12,
+ 23,
+ 126,
+ 81,
+ 118,
+ 4,
+ 157,
+ 181,
+ 235,
+ 164,
+ 150,
+ 29,
+ 146,
+ 94,
+ 201,
+ 209,
+ 207,
+ 151,
+ 184,
+ 153,
+ 166,
+ 211,
+ 202,
+ 46,
+ 20,
+ 137,
+ 76,
+ 238,
+ 206,
+ 89,
+ 103,
+ 242,
+ 133,
+ 40,
+ 68,
+ 250,
+ 212,
+ 190,
+ 120,
+ 16,
+ 220,
+ 118,
+ 202,
+ 250,
+ 166,
+ 73,
+ 181,
+ 126,
+ 83,
+ 201,
+ 120,
+ 114,
+ 237,
+ 185,
+ 183,
+ 194,
+ 8,
+ 180,
+ 32,
+ 28,
+ 122,
+ 20,
+ 71,
+ 13,
+ 145,
+ 15,
+ 62,
+ 95,
+ 167,
+ 249,
+ 64,
+ 215,
+ 182,
+ 204,
+ 163,
+ 121,
+ 154,
+ 28,
+ 209,
+ 94,
+ 223,
+ 252,
+ 211,
+ 152,
+ 10,
+ 183,
+ 77,
+ 134,
+ 75,
+ 166,
+ 194,
+ 79,
+ 56,
+ 64,
+ 168,
+ 107,
+ 93,
+ 17,
+ 136,
+ 26,
+ 26,
+ 39,
+ 76,
+ 78,
+ 43,
+ 181,
+ 63,
+ 172,
+ 210,
+ 227,
+ 175,
+ 60,
+ 36,
+ 158,
+ 98,
+ 144,
+ 85,
+ 93,
+ 204,
+ 182,
+ 241,
+ 140,
+ 177,
+ 225,
+ 191,
+ 149,
+ 219,
+ 16,
+ 31,
+ 51,
+ 58,
+ 5,
+ 233,
+ 227,
+ 65,
+ 33,
+ 245,
+ 174,
+ 239,
+ 7,
+ 239,
+ 179,
+ 105,
+ 97,
+ 28,
+ 122,
+ 31,
+ 73,
+ 252,
+ 79,
+ 51,
+ 40,
+ 144,
+ 211,
+ 10,
+ 9,
+ 49,
+ 205,
+ 15,
+ 142,
+ 5,
+ 16,
+ 62,
+ 82,
+ 244,
+ 142,
+ 84,
+ 133,
+ 21,
+ 189,
+ 166,
+ 174,
+ 152,
+ 101,
+ 108,
+ 119,
+ 112,
+ 143,
+ 165,
+ 191,
+ 240,
+ 57,
+ 1,
+ 221,
+ 49,
+ 142,
+ 239,
+ 139,
+ 91,
+ 252,
+ 238,
+ 47,
+ 184,
+ 243,
+ 89,
+ 102,
+ 216,
+ 35,
+ 135,
+ 156,
+ 122,
+ 209,
+ 186,
+ 49,
+ 10,
+ 177,
+ 111,
+ 241,
+ 77,
+ 18,
+ 21,
+ 65,
+ 181,
+ 56,
+ 62,
+ 99,
+ 39,
+ 132,
+ 8,
+ 137,
+ 54,
+ 157,
+ 116,
+ 108,
+ 55,
+ 151,
+ 34,
+ 121,
+ 153,
+ 63,
+ 81,
+ 142,
+ 47,
+ 11,
+ 191,
+ 104,
+ 182,
+ 19,
+ 106,
+ 172,
+ 89,
+ 20,
+ 2,
+ 190,
+ 133,
+ 52,
+ 166,
+ 54,
+ 123,
+ 114,
+ 250,
+ 24,
+ 216,
+ 163,
+ 134,
+ 44,
+ 168,
+ 224,
+ 166,
+ 178,
+ 122,
+ 91,
+ 243,
+ 205,
+ 90,
+ 49,
+ 179,
+ 18,
+ 219,
+ 150,
+ 240,
+ 34,
+ 134,
+ 14,
+ 12,
+ 235,
+ 234,
+ 39,
+ 242,
+ 196,
+ 122,
+ 186,
+ 245,
+ 121,
+ 222,
+ 187,
+ 232,
+ 214,
+ 159,
+ 142,
+ 129,
+ 111,
+ 76,
+ 34,
+ 61,
+ 170,
+ 255,
+ 166,
+ 127,
+ 24,
+ 247,
+ 208,
+ 145,
+ 19,
+ 236,
+ 176,
+ 112,
+ 76,
+ 189,
+ 110,
+ 130,
+ 91,
+ 219,
+ 228,
+ 45,
+ 51,
+ 116,
+ 168,
+ 194,
+ 20,
+ 146,
+ 57,
+ 11,
+ 103,
+ 254,
+ 56,
+ 234,
+ 1,
+ 239,
+ 240,
+ 176,
+ 145,
+ 148,
+ 30,
+ 13,
+ 12,
+ 150,
+ 117,
+ 182,
+ 9,
+ 52,
+ 125,
+ 142,
+ 52,
+ 54,
+ 48,
+ 172,
+ 154,
+ 240,
+ 226,
+ 209,
+ 182,
+ 170,
+ 251,
+ 58,
+ 32,
+ 218,
+ 172,
+ 165,
+ 21,
+ 104,
+ 110,
+ 234,
+ 178,
+ 221,
+ 206,
+ 161,
+ 207,
+ 106,
+ 109,
+ 163,
+ 227,
+ 224,
+ 102,
+ 167,
+ 47,
+ 129,
+ 121,
+ 179,
+ 228,
+ 66,
+ 241,
+ 71,
+ 222,
+ 222,
+ 61,
+ 149,
+ 244,
+ 149,
+ 242,
+ 165,
+ 227,
+ 247,
+ 4,
+ 199,
+ 212,
+ 128,
+ 198,
+ 180,
+ 191,
+ 142,
+ 223,
+ 67,
+ 231,
+ 172,
+ 146,
+ 24,
+ 168,
+ 77,
+ 127,
+ 186,
+ 109,
+ 141,
+ 166,
+ 214,
+ 111,
+ 205,
+ 89,
+ 71,
+ 227,
+ 220,
+ 88,
+ 15,
+ 57,
+ 13,
+ 161,
+ 97,
+ 35,
+ 138,
+ 213,
+ 236,
+ 145,
+ 15,
+ 201,
+ 136,
+ 164,
+ 151,
+ 25,
+ 34,
+ 198,
+ 7,
+ 1,
+ 47,
+ 137,
+ 144,
+ 138,
+ 28,
+ 203,
+ 206,
+ 19,
+ 140,
+ 5,
+ 69,
+ 57,
+ 28,
+ 85,
+ 229,
+ 193,
+ 47,
+ 41,
+ 145,
+ 34,
+ 50,
+ 87,
+ 247,
+ 161,
+ 56,
+ 28,
+ 65,
+ 197,
+ 33,
+ 18,
+ 99,
+ 31,
+ 247,
+ 246,
+ 9,
+ 211,
+ 113,
+ 64,
+ 198,
+ 30,
+ 222,
+ 122,
+ 84,
+ 254,
+ 11,
+ 74,
+ 194,
+ 14,
+ 109,
+ 222,
+ 71,
+ 87,
+ 86,
+ 82,
+ 132,
+ 78,
+ 235,
+ 210,
+ 142,
+ 149,
+ 247,
+ 207,
+ 85,
+ 21,
+ 254,
+ 25,
+ 112,
+ 223,
+ 67,
+ 187,
+ 26,
+ 241,
+ 109,
+ 231,
+ 94,
+ 113,
+ 126,
+ 246,
+ 228,
+ 80,
+ 15,
+ 180,
+ 182,
+ 151,
+ 66,
+ 33,
+ 47,
+ 101,
+ 54,
+ 69,
+ 9,
+ 244,
+ 63,
+ 24,
+ 216,
+ 208,
+ 111,
+ 207,
+ 176,
+ 141,
+ 144,
+ 38,
+ 73,
+ 223,
+ 112,
+ 117,
+ 65,
+ 225,
+ 13,
+ 201,
+ 146,
+ 160,
+ 240,
+ 178,
+ 173,
+ 198,
+ 166,
+ 77,
+ 72,
+ 155,
+ 182,
+ 83,
+ 0,
+ 185,
+ 34,
+ 25,
+ 101,
+ 188,
+ 97,
+ 244,
+ 9,
+ 111,
+ 150,
+ 82,
+ 157,
+ 94,
+ 77,
+ 232,
+ 189,
+ 154,
+ 239,
+ 230,
+ 114,
+ 152,
+ 242,
+ 91,
+ 207,
+ 80,
+ 52,
+ 80,
+ 180,
+ 34,
+ 21,
+ 111,
+ 16,
+ 12,
+ 178,
+ 196,
+ 122,
+ 164,
+ 128,
+ 255,
+ 72,
+ 103,
+ 149,
+ 151,
+ 63,
+ 165,
+ 134,
+ 39,
+ 51,
+ 255,
+ 3,
+ 137,
+ 11,
+ 16,
+ 171,
+ 228,
+ 18,
+ 208,
+ 253,
+ 194,
+ 225,
+ 137,
+ 178,
+ 87,
+ 168,
+ 200,
+ 39,
+ 121,
+ 151,
+ 167,
+ 202,
+ 57,
+ 88,
+ 80,
+ 150,
+ 32,
+ 249,
+ 239,
+ 195,
+ 161,
+ 74,
+ 47,
+ 217,
+ 222,
+ 76,
+ 213,
+ 237,
+ 13,
+ 67,
+ 248,
+ 138,
+ 75,
+ 139,
+ 86,
+ 62,
+ 72,
+ 231,
+ 200,
+ 27,
+ 123,
+ 229,
+ 68,
+ 129,
+ 31,
+ 204,
+ 218,
+ 70,
+ 141,
+ 94,
+ 31,
+ 242,
+ 44,
+ 201,
+ 44,
+ 150,
+ 186,
+ 113,
+ 77,
+ 192,
+ 178,
+ 222,
+ 223,
+ 104,
+ 107,
+ 189,
+ 173,
+ 15,
+ 227,
+ 148,
+ 52,
+ 101,
+ 63,
+ 0,
+ 227,
+ 94,
+ 215,
+ 239,
+ 15,
+ 28,
+ 125,
+ 83,
+ 159,
+ 167,
+ 14,
+ 239,
+ 114,
+ 57,
+ 213,
+ 179,
+ 10,
+ 191,
+ 46,
+ 65,
+ 36,
+ 237,
+ 203,
+ 48,
+ 172,
+ 233,
+ 191,
+ 191,
+ 215,
+ 234,
+ 143,
+ 141,
+ 213,
+ 185,
+ 121,
+ 63,
+ 16,
+ 202,
+ 7,
+ 68,
+ 211,
+ 35,
+ 187,
+ 137,
+ 175,
+ 9,
+ 242,
+ 29,
+ 66,
+ 24,
+ 81,
+ 67,
+ 86,
+ 255,
+ 237,
+ 49,
+ 164,
+ 251,
+ 103,
+ 1,
+ 76,
+ 45,
+ 38,
+ 237,
+ 137,
+ 248,
+ 150,
+ 245,
+ 69,
+ 178,
+ 117,
+ 143,
+ 107,
+ 19,
+ 190,
+ 194,
+ 22,
+ 250,
+ 168,
+ 55,
+ 194,
+ 95,
+ 199,
+ 236,
+ 67,
+ 243,
+ 246,
+ 100,
+ 182,
+ 254,
+ 62,
+ 25,
+ 84,
+ 247,
+ 16,
+ 12,
+ 63,
+ 251,
+ 148,
+ 48,
+ 69,
+ 1,
+ 184,
+ 63,
+ 221,
+ 211,
+ 251,
+ 209,
+ 202,
+ 23,
+ 73,
+ 242,
+ 159,
+ 201,
+ 234,
+ 32,
+ 100,
+ 157,
+ 110,
+ 19,
+ 118,
+ 180,
+ 224,
+ 162,
+ 156,
+ 116,
+ 168,
+ 68,
+ 163,
+ 224,
+ 246,
+ 166,
+ 189,
+ 136,
+ 0,
+ 205,
+ 130,
+ 211,
+ 43,
+ 244,
+ 166,
+ 187,
+ 240,
+ 47,
+ 151,
+ 166,
+ 214,
+ 207,
+ 127,
+ 233,
+ 15,
+ 136,
+ 106,
+ 93,
+ 206,
+ 99,
+ 132,
+ 117,
+ 170,
+ 206,
+ 14,
+ 20,
+ 50,
+ 53,
+ 71,
+ 59,
+ 66,
+ 181,
+ 113,
+ 201,
+ 227,
+ 95,
+ 216,
+ 233,
+ 53,
+ 127,
+ 171,
+ 186,
+ 167,
+ 37,
+ 140,
+ 29,
+ 177,
+ 99,
+ 108,
+ 178,
+ 172,
+ 55,
+ 46,
+ 239,
+ 72,
+ 200,
+ 33,
+ 130,
+ 29,
+ 38,
+ 56,
+ 157,
+ 191,
+ 174,
+ 38,
+ 128,
+ 100,
+ 57,
+ 241,
+ 242,
+ 199,
+ 61,
+ 30,
+ 71,
+ 210,
+ 170,
+ 248,
+ 94,
+ 255,
+ 117,
+ 123,
+ 63,
+ 252,
+ 140,
+ 0,
+ 77,
+ 207,
+ 17,
+ 118,
+ 207,
+ 170,
+ 157,
+ 143,
+ 154,
+ 155,
+ 137,
+ 4,
+ 55,
+ 252,
+ 28,
+ 255,
+ 99,
+ 141,
+ 113,
+ 50,
+ 40,
+ 95,
+ 230,
+ 172,
+ 240,
+ 117,
+ 133,
+ 131,
+ 235,
+ 52,
+ 141,
+ 200,
+ 32,
+ 81,
+ 43,
+ 76,
+ 23,
+ 85,
+ 44,
+ 74,
+ 234,
+ 177,
+ 21,
+ 59,
+ 100,
+ 106,
+ 145,
+ 2,
+ 210,
+ 143,
+ 236,
+ 201,
+ 140,
+ 184,
+ 223,
+ 6,
+ 74,
+ 184,
+ 250,
+ 180,
+ 191,
+ 24,
+ 225,
+ 160,
+ 156,
+ 12,
+ 198,
+ 48,
+ 158,
+ 218,
+ 169,
+ 205,
+ 190,
+ 211,
+ 249,
+ 43,
+ 119,
+ 38,
+ 6,
+ 253,
+ 16,
+ 130,
+ 60,
+ 55,
+ 177,
+ 33,
+ 191,
+ 172,
+ 146,
+ 221,
+ 26,
+ 101,
+ 237,
+ 205,
+ 148,
+ 120,
+ 137,
+ 209,
+ 143,
+ 212,
+ 165,
+ 143,
+ 205,
+ 75,
+ 9,
+ 27,
+ 229,
+ 175,
+ 78,
+ 232,
+ 215,
+ 180,
+ 115,
+ 135,
+ 252,
+ 56,
+ 21,
+ 64,
+ 35,
+ 97,
+ 7,
+ 159,
+ 20,
+ 55,
+ 134,
+ 209,
+ 113,
+ 241,
+ 86,
+ 159,
+ 236,
+ 223,
+ 252,
+ 228,
+ 233,
+ 229,
+ 37,
+ 68,
+ 183,
+ 111,
+ 184,
+ 155,
+ 236,
+ 17,
+ 14,
+ 218,
+ 244,
+ 160,
+ 200,
+ 12,
+ 17,
+ 179,
+ 139,
+ 255,
+ 209,
+ 31,
+ 163,
+ 218,
+ 91,
+ 218,
+ 198,
+ 115,
+ 212,
+ 191,
+ 133,
+ 158,
+ 235,
+ 121,
+ 126,
+ 225,
+ 142,
+ 186,
+ 156,
+ 193,
+ 144,
+ 126,
+ 195,
+ 108,
+ 152,
+ 176,
+ 86,
+ 97,
+ 151,
+ 168,
+ 140,
+ 119,
+ 18,
+ 99,
+ 238,
+ 83,
+ 203,
+ 138,
+ 167,
+ 130,
+ 192,
+ 45,
+ 30,
+ 12,
+ 118,
+ 216,
+ 179,
+ 163,
+ 215,
+ 113,
+ 54,
+ 41,
+ 145,
+ 17,
+ 10,
+ 29,
+ 248,
+ 221,
+ 234,
+ 177,
+ 181,
+ 79,
+ 179,
+ 78,
+ 69,
+ 248,
+ 182,
+ 168,
+ 179,
+ 238,
+ 172,
+ 113,
+ 144,
+ 17,
+ 215,
+ 184,
+ 154,
+ 169,
+ 207,
+ 169,
+ 114,
+ 92,
+ 21,
+ 70,
+ 56,
+ 32,
+ 216,
+ 191,
+ 31,
+ 39,
+ 230,
+ 115,
+ 48,
+ 63,
+ 142,
+ 77,
+ 157,
+ 252,
+ 8,
+ 91,
+ 199,
+ 107,
+ 121,
+ 214,
+ 143,
+ 84,
+ 111,
+ 22,
+ 180,
+ 198,
+ 45,
+ 125,
+ 44,
+ 21,
+ 148,
+ 158,
+ 201,
+ 38,
+ 20,
+ 33,
+ 127,
+ 200,
+ 105,
+ 220,
+ 243,
+ 170,
+ 215,
+ 243,
+ 39,
+ 250,
+ 46,
+ 230,
+ 237,
+ 33,
+ 45,
+ 134,
+ 250,
+ 63,
+ 81,
+ 133,
+ 58,
+ 71,
+ 184,
+ 19,
+ 126,
+ 234,
+ 216,
+ 110,
+ 133,
+ 55,
+ 114,
+ 112,
+ 180,
+ 155,
+ 39,
+ 96,
+ 245,
+ 171,
+ 140,
+ 223,
+ 31,
+ 40,
+ 128,
+ 226,
+ 141,
+ 27,
+ 68,
+ 24,
+ 168,
+ 189,
+ 83,
+ 95,
+ 87,
+ 77,
+ 79,
+ 63,
+ 173,
+ 149,
+ 253,
+ 87,
+ 186,
+ 218,
+ 203,
+ 24,
+ 141,
+ 67,
+ 200,
+ 208,
+ 237,
+ 214,
+ 146,
+ 210,
+ 144,
+ 178,
+ 162,
+ 195,
+ 16,
+ 178,
+ 38,
+ 212,
+ 168,
+ 209,
+ 231,
+ 167,
+ 128,
+ 77,
+ 185,
+ 222,
+ 12,
+ 15,
+ 101,
+ 172,
+ 243,
+ 214,
+ 227,
+ 187,
+ 156,
+ 204,
+ 176,
+ 219,
+ 86,
+ 208,
+ 114,
+ 19,
+ 199,
+ 13,
+ 231,
+ 70,
+ 93,
+ 198,
+ 124,
+ 237,
+ 247,
+ 42,
+ 125,
+ 189,
+ 134,
+ 159,
+ 212,
+ 71,
+ 185,
+ 82,
+ 50,
+ 230,
+ 50,
+ 206,
+ 107,
+ 193,
+ 154,
+ 234,
+ 104,
+ 135,
+ 30,
+ 134,
+ 245,
+ 124,
+ 194,
+ 59,
+ 234,
+ 231,
+ 39,
+ 146,
+ 129,
+ 108,
+ 49,
+ 212,
+ 255,
+ 88,
+ 102,
+ 49,
+ 247,
+ 121,
+ 128,
+ 122,
+ 103,
+ 62,
+ 186,
+ 22,
+ 65,
+ 202,
+ 150,
+ 250,
+ 72,
+ 153,
+ 207,
+ 248,
+ 128,
+ 41,
+ 194,
+ 50,
+ 164,
+ 247,
+ 183,
+ 237,
+ 215,
+ 123,
+ 152,
+ 106,
+ 185,
+ 190,
+ 26,
+ 39,
+ 38,
+ 66,
+ 169,
+ 41,
+ 211,
+ 164,
+ 244,
+ 150,
+ 223,
+ 89,
+ 80,
+ 32,
+ 21,
+ 119,
+ 59,
+ 121,
+ 178,
+ 202,
+ 28,
+ 23,
+ 131,
+ 182,
+ 218,
+ 240,
+ 149,
+ 98,
+ 105,
+ 35,
+ 142,
+ 158,
+ 122,
+ 52,
+ 100,
+ 152,
+ 159,
+ 233,
+ 15,
+ 142,
+ 104,
+ 246,
+ 53,
+ 80,
+ 64,
+ 176,
+ 247,
+ 139,
+ 210,
+ 218,
+ 185,
+ 222,
+ 180,
+ 172,
+ 96,
+ 243,
+ 106,
+ 104,
+ 175,
+ 7,
+ 131,
+ 158,
+ 244,
+ 208,
+ 13,
+ 244,
+ 214,
+ 197,
+ 89,
+ 239,
+ 68,
+ 44,
+ 103,
+ 54,
+ 200,
+ 125,
+ 46,
+ 52,
+ 130,
+ 95,
+ 20,
+ 16,
+ 143,
+ 97,
+ 125,
+ 220,
+ 30,
+ 11,
+ 216,
+ 118,
+ 191,
+ 209,
+ 43,
+ 53,
+ 144,
+ 48,
+ 59,
+ 201,
+ 241,
+ 77,
+ 171,
+ 160,
+ 120,
+ 60,
+ 148,
+ 8,
+ 233,
+ 113,
+ 220,
+ 159,
+ 177,
+ 222,
+ 104,
+ 84,
+ 121,
+ 25,
+ 121,
+ 12,
+ 122,
+ 31,
+ 9,
+ 22,
+ 60,
+ 250,
+ 11,
+ 243,
+ 37,
+ 118,
+ 174,
+ 151,
+ 86,
+ 181,
+ 30,
+ 164,
+ 107,
+ 252,
+ 43,
+ 56,
+ 103,
+ 248,
+ 242,
+ 39,
+ 182,
+ 183,
+ 133,
+ 244,
+ 34,
+ 101,
+ 91,
+ 197,
+ 198,
+ 114,
+ 161,
+ 78,
+ 160,
+ 211,
+ 44,
+ 86,
+ 176,
+ 7,
+ 0,
+ 138,
+ 28,
+ 159,
+ 231,
+ 38,
+ 0,
+ 76,
+ 25,
+ 179,
+ 233,
+ 191,
+ 195,
+ 45,
+ 85,
+ 52,
+ 245,
+ 79,
+ 100,
+ 240,
+ 102,
+ 192,
+ 233,
+ 12,
+ 254,
+ 177,
+ 163,
+ 167,
+ 245,
+ 96,
+ 140,
+ 32,
+ 237,
+ 247,
+ 236,
+ 20,
+ 19,
+ 106,
+ 228,
+ 62,
+ 125,
+ 213,
+ 131,
+ 138,
+ 245,
+ 242,
+ 6,
+ 133,
+ 146,
+ 21,
+ 219,
+ 6,
+ 94,
+ 242,
+ 34,
+ 72,
+ 9,
+ 106,
+ 222,
+ 51,
+ 205,
+ 38,
+ 188,
+ 203,
+ 233,
+ 44,
+ 224,
+ 155,
+ 50,
+ 66,
+ 36,
+ 145,
+ 86,
+ 213,
+ 199,
+ 38,
+ 46,
+ 143,
+ 28,
+ 127,
+ 184,
+ 212,
+ 176,
+ 141,
+ 139,
+ 190,
+ 25,
+ 255,
+ 32,
+ 114,
+ 164,
+ 173,
+ 8,
+ 162,
+ 79,
+ 117,
+ 82,
+ 135,
+ 67,
+ 205,
+ 138,
+ 236,
+ 181,
+ 55,
+ 84,
+ 184,
+ 55,
+ 142,
+ 109,
+ 132,
+ 50,
+ 29,
+ 103,
+ 131,
+ 178,
+ 80,
+ 114,
+ 56,
+ 26,
+ 193,
+ 26,
+ 53,
+ 71,
+ 227,
+ 80,
+ 169,
+ 8,
+ 95,
+ 121,
+ 86,
+ 97,
+ 178,
+ 121,
+ 96,
+ 210,
+ 221,
+ 94,
+ 240,
+ 136,
+ 74,
+ 157,
+ 230,
+ 90,
+ 56,
+ 78,
+ 146,
+ 65,
+ 255,
+ 247,
+ 137,
+ 179,
+ 126,
+ 139,
+ 146,
+ 195,
+ 225,
+ 173,
+ 162,
+ 172,
+ 111,
+ 217,
+ 185,
+ 103,
+ 93,
+ 145,
+ 96,
+ 181,
+ 232,
+ 4,
+ 238,
+ 232,
+ 180,
+ 59,
+ 71,
+ 232,
+ 229,
+ 76,
+ 85,
+ 172,
+ 62,
+ 46,
+ 148,
+ 98,
+ 116,
+ 180,
+ 35,
+ 250,
+ 196,
+ 175,
+ 201,
+ 215,
+ 231,
+ 240,
+ 51,
+ 121,
+ 199,
+ 51,
+ 206,
+ 152,
+ 200,
+ 165,
+ 2,
+ 144,
+ 188,
+ 218,
+ 103,
+ 11,
+ 181,
+ 21,
+ 228,
+ 203,
+ 64,
+ 50,
+ 10,
+ 182,
+ 158,
+ 31,
+ 79,
+ 37,
+ 198,
+ 149,
+ 224,
+ 184,
+ 164,
+ 137,
+ 94,
+ 126,
+ 9,
+ 27,
+ 67,
+ 65,
+ 82,
+ 131,
+ 242,
+ 239,
+ 197,
+ 18,
+ 20,
+ 44,
+ 140,
+ 18,
+ 145,
+ 165,
+ 73,
+ 94,
+ 77,
+ 125,
+ 82,
+ 191,
+ 118,
+ 94,
+ 164,
+ 165,
+ 177,
+ 116,
+ 220,
+ 250,
+ 18,
+ 211,
+ 144,
+ 192,
+ 210,
+ 57,
+ 12,
+ 236,
+ 174,
+ 84,
+ 80,
+ 120,
+ 38,
+ 43,
+ 168,
+ 17,
+ 195,
+ 8,
+ 165,
+ 141,
+ 241,
+ 172,
+ 101,
+ 37,
+ 254,
+ 124,
+ 223,
+ 11,
+ 237,
+ 193,
+ 122,
+ 12,
+ 193,
+ 143,
+ 80,
+ 1,
+ 92,
+ 52,
+ 75,
+ 200,
+ 185,
+ 83,
+ 136,
+ 202,
+ 232,
+ 52,
+ 43,
+ 55,
+ 181,
+ 81,
+ 63,
+ 25,
+ 97,
+ 191,
+ 177,
+ 111,
+ 127,
+ 100,
+ 203,
+ 51,
+ 205,
+ 241,
+ 112,
+ 77,
+ 31,
+ 170,
+ 249,
+ 39,
+ 183,
+ 104,
+ 173,
+ 226,
+ 248,
+ 206,
+ 74,
+ 149,
+ 78,
+ 24,
+ 78,
+ 30,
+ 92,
+ 7,
+ 64,
+ 218,
+ 220,
+ 69,
+ 75,
+ 243,
+ 60,
+ 8,
+ 182,
+ 197,
+ 199,
+ 153,
+ 129,
+ 209,
+ 75,
+ 56,
+ 164,
+ 25,
+ 147,
+ 18,
+ 0,
+ 241,
+ 40,
+ 29,
+ 175,
+ 186,
+ 183,
+ 59,
+ 195,
+ 184,
+ 132,
+ 236,
+ 224,
+ 109,
+ 85,
+ 131,
+ 157,
+ 79,
+ 79,
+ 60,
+ 117,
+ 255,
+ 242,
+ 62,
+ 227,
+ 205,
+ 74,
+ 137,
+ 31,
+ 63,
+ 12,
+ 162,
+ 220,
+ 121,
+ 96,
+ 197,
+ 180,
+ 208,
+ 61,
+ 179,
+ 44,
+ 235,
+ 37,
+ 214,
+ 169,
+ 31,
+ 169,
+ 109,
+ 97,
+ 148,
+ 195,
+ 218,
+ 96,
+ 9,
+ 98,
+ 183,
+ 156,
+ 150,
+ 223,
+ 55,
+ 88,
+ 114,
+ 5,
+ 34,
+ 21,
+ 0,
+ 109,
+ 75,
+ 76,
+ 23,
+ 98,
+ 222,
+ 226,
+ 249,
+ 179,
+ 135,
+ 179,
+ 120,
+ 80,
+ 0,
+ 56,
+ 116,
+ 248,
+ 250,
+ 73,
+ 227,
+ 189,
+ 115,
+ 159,
+ 155,
+ 98,
+ 39,
+ 41,
+ 60,
+ 40,
+ 189,
+ 97,
+ 247,
+ 7,
+ 90,
+ 101,
+ 56,
+ 75,
+ 147,
+ 133,
+ 44,
+ 205,
+ 71,
+ 209,
+ 222,
+ 26,
+ 168,
+ 24,
+ 1,
+ 78,
+ 245,
+ 247,
+ 201,
+ 186,
+ 110,
+ 98,
+ 13,
+ 89,
+ 189,
+ 161,
+ 146,
+ 39,
+ 33,
+ 100,
+ 246,
+ 97,
+ 123,
+ 8,
+ 205,
+ 220,
+ 241,
+ 193,
+ 133,
+ 40,
+ 159,
+ 135,
+ 8,
+ 252,
+ 107,
+ 204,
+ 245,
+ 7,
+ 10,
+ 76,
+ 151,
+ 196,
+ 55,
+ 178,
+ 181,
+ 208,
+ 10,
+ 135,
+ 155,
+ 198,
+ 232,
+ 245,
+ 152,
+ 227,
+ 43,
+ 165,
+ 13,
+ 252,
+ 142,
+ 64,
+ 193,
+ 51,
+ 183,
+ 115,
+ 113,
+ 9,
+ 243,
+ 40,
+ 169,
+ 196,
+ 224,
+ 157,
+ 48,
+ 46,
+ 239,
+ 144,
+ 109,
+ 137,
+ 252,
+ 132,
+ 167,
+ 129,
+ 213,
+ 27,
+ 142,
+ 213,
+ 185,
+ 97,
+ 92,
+ 179,
+ 118,
+ 148,
+ 227,
+ 101,
+ 198,
+ 27,
+ 169,
+ 117,
+ 215,
+ 240,
+ 39,
+ 129,
+ 143,
+ 183,
+ 52,
+ 248,
+ 171,
+ 234,
+ 43,
+ 5,
+ 60,
+ 56,
+ 149,
+ 40,
+ 175,
+ 39,
+ 73,
+ 99,
+ 92,
+ 38,
+ 140,
+ 112,
+ 199,
+ 199,
+ 108,
+ 68,
+ 146,
+ 138,
+ 55,
+ 91,
+ 181,
+ 221,
+ 249,
+ 40,
+ 130,
+ 212,
+ 97,
+ 49,
+ 200,
+ 109,
+ 253,
+ 192,
+ 233,
+ 104,
+ 103,
+ 65,
+ 179,
+ 24,
+ 128,
+ 6,
+ 96,
+ 125,
+ 203,
+ 45,
+ 139,
+ 42,
+ 88,
+ 210,
+ 171,
+ 211,
+ 33,
+ 166,
+ 140,
+ 25,
+ 126,
+ 153,
+ 169,
+ 165,
+ 32,
+ 182,
+ 175,
+ 72,
+ 81,
+ 83,
+ 38,
+ 147,
+ 154,
+ 134,
+ 99,
+ 67,
+ 178,
+ 18,
+ 155,
+ 249,
+ 153,
+ 100,
+ 105,
+ 26,
+ 53,
+ 185,
+ 216,
+ 215,
+ 71,
+ 136,
+ 244,
+ 90,
+ 187,
+ 232,
+ 233,
+ 23,
+ 119,
+ 222,
+ 186,
+ 93,
+ 34,
+ 67,
+ 75,
+ 113,
+ 146,
+ 138,
+ 239,
+ 81,
+ 184,
+ 142,
+ 167,
+ 73,
+ 25,
+ 78,
+ 191,
+ 94,
+ 89,
+ 182,
+ 66,
+ 13,
+ 85,
+ 10,
+ 32,
+ 102,
+ 113,
+ 160,
+ 6,
+ 141,
+ 73,
+ 177,
+ 143,
+ 90,
+ 127,
+ 71,
+ 184,
+ 119,
+ 200,
+ 216,
+ 111,
+ 70,
+ 45,
+ 62,
+ 164,
+ 187,
+ 81,
+ 156,
+ 184,
+ 25,
+ 125,
+ 84,
+ 34,
+ 20,
+ 231,
+ 97,
+ 157,
+ 53,
+ 63,
+ 67,
+ 154,
+ 148,
+ 112,
+ 178,
+ 113,
+ 167,
+ 105,
+ 161,
+ 157,
+ 183,
+ 218,
+ 185,
+ 60,
+ 176,
+ 230,
+ 204,
+ 240,
+ 34,
+ 105,
+ 25,
+ 243,
+ 205,
+ 214,
+ 33,
+ 37,
+ 123,
+ 169,
+ 78,
+ 45,
+ 154,
+ 167,
+ 121,
+ 128,
+ 156,
+ 23,
+ 233,
+ 225,
+ 143,
+ 84,
+ 40,
+ 60,
+ 179,
+ 193,
+ 26,
+ 19,
+ 200,
+ 196,
+ 162,
+ 219,
+ 232,
+ 191,
+ 21,
+ 89,
+ 72,
+ 21,
+ 118,
+ 248,
+ 150,
+ 231,
+ 234,
+ 30,
+ 27,
+ 234,
+ 5,
+ 230,
+ 33,
+ 78,
+ 117,
+ 145,
+ 55,
+ 59,
+ 99,
+ 232,
+ 200,
+ 3,
+ 87,
+ 180,
+ 122,
+ 199,
+ 9,
+ 2,
+ 221,
+ 247,
+ 32,
+ 153,
+ 213,
+ 244,
+ 236,
+ 97,
+ 2,
+ 248,
+ 91,
+ 213,
+ 36,
+ 120,
+ 162,
+ 191,
+ 69,
+ 15,
+ 206,
+ 235,
+ 80,
+ 37,
+ 182,
+ 85,
+ 74,
+ 236,
+ 120,
+ 104,
+ 248,
+ 108,
+ 253,
+ 76,
+ 150,
+ 119,
+ 66,
+ 200,
+ 207,
+ 236,
+ 93,
+ 253,
+ 100,
+ 146,
+ 226,
+ 130,
+ 197,
+ 131,
+ 141,
+ 12,
+ 5,
+ 80,
+ 180,
+ 208,
+ 136,
+ 249,
+ 220,
+ 164,
+ 86,
+ 172,
+ 80,
+ 35,
+ 198,
+ 104,
+ 224,
+ 132,
+ 202,
+ 234,
+ 145,
+ 189,
+ 68,
+ 130,
+ 118,
+ 196,
+ 214,
+ 109,
+ 143,
+ 21,
+ 63,
+ 197,
+ 109,
+ 139,
+ 253,
+ 244,
+ 94,
+ 12,
+ 46,
+ 145,
+ 94,
+ 173,
+ 129,
+ 78,
+ 151,
+ 232,
+ 24,
+ 127,
+ 49,
+ 65,
+ 27,
+ 184,
+ 248,
+ 137,
+ 78,
+ 160,
+ 254,
+ 229,
+ 103,
+ 65,
+ 44,
+ 17,
+ 71,
+ 140,
+ 173,
+ 118,
+ 71,
+ 189,
+ 145,
+ 90,
+ 211,
+ 113,
+ 200,
+ 83,
+ 172,
+ 4,
+ 108,
+ 143,
+ 65,
+ 238,
+ 8,
+ 176,
+ 30,
+ 36,
+ 168,
+ 22,
+ 112,
+ 197,
+ 73,
+ 50,
+ 247,
+ 83,
+ 17,
+ 148,
+ 230,
+ 165,
+ 251,
+ 62,
+ 10,
+ 124,
+ 248,
+ 75,
+ 151,
+ 12,
+ 205,
+ 83,
+ 108,
+ 160,
+ 64,
+ 196,
+ 110,
+ 89,
+ 19,
+ 189,
+ 229,
+ 247,
+ 95,
+ 211,
+ 84,
+ 48,
+ 225,
+ 112,
+ 223,
+ 143,
+ 249,
+ 156,
+ 167,
+ 220,
+ 137,
+ 108,
+ 63,
+ 90,
+ 254,
+ 51,
+ 240,
+ 190,
+ 249,
+ 213,
+ 106,
+ 245,
+ 167,
+ 169,
+ 93,
+ 110,
+ 246,
+ 205,
+ 20,
+ 33,
+ 34,
+ 183,
+ 210,
+ 67,
+ 251,
+ 221,
+ 24,
+ 15,
+ 137,
+ 206,
+ 195,
+ 115,
+ 212,
+ 208,
+ 104,
+ 49,
+ 177,
+ 26,
+ 238,
+ 176,
+ 116,
+ 90,
+ 106,
+ 16,
+ 7,
+ 100,
+ 157,
+ 35,
+ 165,
+ 75,
+ 161,
+ 232,
+ 179,
+ 5,
+ 140,
+ 35,
+ 61,
+ 205,
+ 18,
+ 247,
+ 97,
+ 2,
+ 23,
+ 42,
+ 94,
+ 229,
+ 197,
+ 71,
+ 45,
+ 183,
+ 213,
+ 11,
+ 242,
+ 67,
+ 40,
+ 52,
+ 168,
+ 87,
+ 71,
+ 76,
+ 254,
+ 205,
+ 236,
+ 124,
+ 190,
+ 224,
+ 46,
+ 217,
+ 12,
+ 29,
+ 44,
+ 137,
+ 242,
+ 195,
+ 233,
+ 71,
+ 205,
+ 89,
+ 97,
+ 175,
+ 189,
+ 27,
+ 181,
+ 224,
+ 1,
+ 11,
+ 166,
+ 211,
+ 243,
+ 227,
+ 254,
+ 11,
+ 10,
+ 234,
+ 89,
+ 170,
+ 203,
+ 129,
+ 74,
+ 30,
+ 147,
+ 205,
+ 21,
+ 114,
+ 163,
+ 238,
+ 164,
+ 217,
+ 187,
+ 138,
+ 64,
+ 238,
+ 244,
+ 119,
+ 18,
+ 23,
+ 223,
+ 180,
+ 35,
+ 148,
+ 24,
+ 145,
+ 105,
+ 18,
+ 83,
+ 171,
+ 214,
+ 10,
+ 32,
+ 195,
+ 233,
+ 55,
+ 235,
+ 14,
+ 193,
+ 225,
+ 227,
+ 212,
+ 210,
+ 2,
+ 158,
+ 19,
+ 87,
+ 250,
+ 216,
+ 80,
+ 113,
+ 90,
+ 85,
+ 83,
+ 133,
+ 162,
+ 10,
+ 91,
+ 189,
+ 226,
+ 212,
+ 124,
+ 6,
+ 152,
+ 55,
+ 72,
+ 50,
+ 2,
+ 108,
+ 241,
+ 220,
+ 147,
+ 108,
+ 100,
+ 125,
+ 18,
+ 48,
+ 88,
+ 180,
+ 135,
+ 93,
+ 48,
+ 239,
+ 63,
+ 141,
+ 110,
+ 34,
+ 110,
+ 247,
+ 213,
+ 199,
+ 28,
+ 100,
+ 55,
+ 247,
+ 82,
+ 246,
+ 17,
+ 173,
+ 12,
+ 75,
+ 88,
+ 231,
+ 4,
+ 140,
+ 97,
+ 254,
+ 34,
+ 117,
+ 152,
+ 90,
+ 121,
+ 215,
+ 227,
+ 178,
+ 79,
+ 234,
+ 102,
+ 36,
+ 58,
+ 152,
+ 73,
+ 209,
+ 253,
+ 222,
+ 92,
+ 9,
+ 1,
+ 229,
+ 223,
+ 23,
+ 140,
+ 159,
+ 103,
+ 47,
+ 107,
+ 73,
+ 217,
+ 36,
+ 240,
+ 9,
+ 116,
+ 72,
+ 236,
+ 52,
+ 79,
+ 210,
+ 19,
+ 159,
+ 118,
+ 199,
+ 164,
+ 244,
+ 137,
+ 188,
+ 113,
+ 50,
+ 74,
+ 110,
+ 204,
+ 169,
+ 201,
+ 123,
+ 229,
+ 204,
+ 214,
+ 251,
+ 202,
+ 179,
+ 123,
+ 242,
+ 169,
+ 65,
+ 174,
+ 207,
+ 179,
+ 116,
+ 171,
+ 53,
+ 90,
+ 230,
+ 31,
+ 153,
+ 107,
+ 157,
+ 148,
+ 143,
+ 24,
+ 128,
+ 226,
+ 146,
+ 200,
+ 208,
+ 251,
+ 169,
+ 151,
+ 105,
+ 31,
+ 34,
+ 37,
+ 201,
+ 202,
+ 164,
+ 172,
+ 30,
+ 46,
+ 187,
+ 201,
+ 14,
+ 38,
+ 238,
+ 210,
+ 10,
+ 205,
+ 174,
+ 139,
+ 176,
+ 219,
+ 246,
+ 134,
+ 170,
+ 126,
+ 249,
+ 125,
+ 221,
+ 164,
+ 142,
+ 17,
+ 75,
+ 120,
+ 41,
+ 20,
+ 234,
+ 143,
+ 133,
+ 44,
+ 121,
+ 182,
+ 93,
+ 34,
+ 60,
+ 62,
+ 180,
+ 235,
+ 84,
+ 212,
+ 237,
+ 133,
+ 138,
+ 205,
+ 48,
+ 238,
+ 181,
+ 154,
+ 144,
+ 160,
+ 58,
+ 151,
+ 192,
+ 100,
+ 165,
+ 179,
+ 100,
+ 16,
+ 180,
+ 37,
+ 121,
+ 82,
+ 61,
+ 10,
+ 222,
+ 183,
+ 196,
+ 174,
+ 223,
+ 11,
+ 253,
+ 103,
+ 185,
+ 211,
+ 238,
+ 153,
+ 222,
+ 191,
+ 108,
+ 215,
+ 91,
+ 120,
+ 18,
+ 102,
+ 246,
+ 40,
+ 179,
+ 22,
+ 124,
+ 128,
+ 29,
+ 16,
+ 158,
+ 5,
+ 167,
+ 211,
+ 51,
+ 101,
+ 17,
+ 127,
+ 127,
+ 1,
+ 77,
+ 26,
+ 90,
+ 116,
+ 240,
+ 138,
+ 221,
+ 200,
+ 23,
+ 42,
+ 126,
+ 182,
+ 126,
+ 148,
+ 99,
+ 43,
+ 116,
+ 238,
+ 88,
+ 187,
+ 53,
+ 111,
+ 242,
+ 131,
+ 110,
+ 231,
+ 186,
+ 5,
+ 134,
+ 61,
+ 180,
+ 244,
+ 252,
+ 170,
+ 133,
+ 239,
+ 128,
+ 79,
+ 121,
+ 175,
+ 102,
+ 69,
+ 53,
+ 141,
+ 132,
+ 201,
+ 235,
+ 157,
+ 71,
+ 247,
+ 207,
+ 151,
+ 131,
+ 97,
+ 233,
+ 162,
+ 153,
+ 31,
+ 229,
+ 159,
+ 152,
+ 246,
+ 118,
+ 190,
+ 158,
+ 181,
+ 192,
+ 214,
+ 217,
+ 202,
+ 13,
+ 110,
+ 214,
+ 72,
+ 87,
+ 30,
+ 14,
+ 170,
+ 141,
+ 73,
+ 127,
+ 245,
+ 237,
+ 62,
+ 47,
+ 234,
+ 40,
+ 99,
+ 165,
+ 207,
+ 145,
+ 92,
+ 89,
+ 51,
+ 108,
+ 34,
+ 107,
+ 149,
+ 251,
+ 38,
+ 57,
+ 147,
+ 108,
+ 124,
+ 99,
+ 189,
+ 14,
+ 190,
+ 112,
+ 53,
+ 27,
+ 212,
+ 129,
+ 243,
+ 248,
+ 250,
+ 244,
+ 140,
+ 229,
+ 110,
+ 129,
+ 243,
+ 180,
+ 100,
+ 11,
+ 92,
+ 251,
+ 246,
+ 133,
+ 99,
+ 214,
+ 246,
+ 8,
+ 207,
+ 235,
+ 67,
+ 18,
+ 203,
+ 159,
+ 79,
+ 82,
+ 111,
+ 42,
+ 128,
+ 60,
+ 245,
+ 44,
+ 50,
+ 73,
+ 147,
+ 237,
+ 117,
+ 155,
+ 235,
+ 142,
+ 254,
+ 220,
+ 34,
+ 158,
+ 238,
+ 239,
+ 183,
+ 61,
+ 129,
+ 112,
+ 160,
+ 234,
+ 150,
+ 180,
+ 253,
+ 7,
+ 181,
+ 149,
+ 84,
+ 14,
+ 250,
+ 106,
+ 170,
+ 138,
+ 95,
+ 182,
+ 115,
+ 106,
+ 229,
+ 22,
+ 107,
+ 113,
+ 63,
+ 235,
+ 191,
+ 79,
+ 67,
+ 105,
+ 131,
+ 162,
+ 1,
+ 211,
+ 189,
+ 117,
+ 244,
+ 191,
+ 245,
+ 58,
+ 242,
+ 138,
+ 164,
+ 152,
+ 122,
+ 23,
+ 198,
+ 171,
+ 35,
+ 40,
+ 213,
+ 57,
+ 200,
+ 57,
+ 172,
+ 47,
+ 115,
+ 96,
+ 7,
+ 107,
+ 195,
+ 81,
+ 96,
+ 189,
+ 94,
+ 206,
+ 172,
+ 41,
+ 203,
+ 90,
+ 5,
+ 217,
+ 147,
+ 101,
+ 62,
+ 69,
+ 219,
+ 190,
+ 19,
+ 182,
+ 63,
+ 156,
+ 97,
+ 236,
+ 142,
+ 86,
+ 142,
+ 88,
+ 62,
+ 189,
+ 154,
+ 228,
+ 225,
+ 230,
+ 215,
+ 46,
+ 177,
+ 123,
+ 58,
+ 127,
+ 185,
+ 54,
+ 37,
+ 241,
+ 220,
+ 39,
+ 244,
+ 76,
+ 63,
+ 191,
+ 232,
+ 244,
+ 211,
+ 156,
+ 88,
+ 21,
+ 79,
+ 49,
+ 239,
+ 122,
+ 27,
+ 231,
+ 62,
+ 161,
+ 242,
+ 162,
+ 91,
+ 134,
+ 98,
+ 118,
+ 119,
+ 146,
+ 99,
+ 81,
+ 131,
+ 231,
+ 125,
+ 219,
+ 30,
+ 237,
+ 106,
+ 140,
+ 247,
+ 255,
+ 190,
+ 130,
+ 46,
+ 42,
+ 133,
+ 216,
+ 127,
+ 216,
+ 73,
+ 232,
+ 109,
+ 187,
+ 220,
+ 13,
+ 98,
+ 97,
+ 245,
+ 125,
+ 32,
+ 237,
+ 53,
+ 210,
+ 211,
+ 115,
+ 101,
+ 248,
+ 248,
+ 178,
+ 167,
+ 203,
+ 108,
+ 18,
+ 147,
+ 18,
+ 30,
+ 247,
+ 254,
+ 221,
+ 65,
+ 126,
+ 173,
+ 98,
+ 62,
+ 170,
+ 204,
+ 147,
+ 129,
+ 93,
+ 86,
+ 90,
+ 90,
+ 154,
+ 1,
+ 157,
+ 176,
+ 255,
+ 85,
+ 108,
+ 134,
+ 87,
+ 107,
+ 183,
+ 37,
+ 149,
+ 185,
+ 181,
+ 168,
+ 249,
+ 248,
+ 102,
+ 149,
+ 169,
+ 179,
+ 89,
+ 170,
+ 42,
+ 192,
+ 113,
+ 44,
+ 97,
+ 213,
+ 3,
+ 7,
+ 42,
+ 14,
+ 151,
+ 151,
+ 90,
+ 234,
+ 206,
+ 142,
+ 248,
+ 249,
+ 37,
+ 98,
+ 111,
+ 175,
+ 16,
+ 94,
+ 207,
+ 138,
+ 63,
+ 255,
+ 20,
+ 90,
+ 247,
+ 55,
+ 255,
+ 217,
+ 231,
+ 169,
+ 6,
+ 250,
+ 82,
+ 202,
+ 67,
+ 186,
+ 138,
+ 212,
+ 229,
+ 123,
+ 82,
+ 4,
+ 233,
+ 255,
+ 190,
+ 0,
+ 223,
+ 198,
+ 141,
+ 15,
+ 149,
+ 146,
+ 254,
+ 63,
+ 250,
+ 245,
+ 201,
+ 88,
+ 82,
+ 251,
+ 98,
+ 212,
+ 224,
+ 127,
+ 253,
+ 84,
+ 223,
+ 187,
+ 153,
+ 109,
+ 226,
+ 75,
+ 86,
+ 245,
+ 255,
+ 232,
+ 95,
+ 113,
+ 182,
+ 235,
+ 178,
+ 251,
+ 132,
+ 183,
+ 127,
+ 52,
+ 88,
+ 8,
+ 32,
+ 211,
+ 19,
+ 176,
+ 14,
+ 22,
+ 38,
+ 127,
+ 119,
+ 49,
+ 12,
+ 157,
+ 59,
+ 96,
+ 155,
+ 211,
+ 38,
+ 33,
+ 71,
+ 87,
+ 196,
+ 238,
+ 32,
+ 190,
+ 244,
+ 82,
+ 253,
+ 188,
+ 89,
+ 80,
+ 4,
+ 233,
+ 253,
+ 47,
+ 233,
+ 147,
+ 5,
+ 48,
+ 34,
+ 87,
+ 55,
+ 254,
+ 143,
+ 124,
+ 176,
+ 11,
+ 45,
+ 146,
+ 130,
+ 252,
+ 153,
+ 255,
+ 247,
+ 180,
+ 209,
+ 111,
+ 147,
+ 63,
+ 70,
+ 158,
+ 26,
+ 238,
+ 95,
+ 8,
+ 130,
+ 244,
+ 232,
+ 195,
+ 23,
+ 198,
+ 64,
+ 4,
+ 20,
+ 246,
+ 53,
+ 47,
+ 98,
+ 111,
+ 172,
+ 225,
+ 100,
+ 113,
+ 47,
+ 244,
+ 19,
+ 39,
+ 65,
+ 193,
+ 187,
+ 110,
+ 123,
+ 15,
+ 180,
+ 47,
+ 241,
+ 101,
+ 152,
+ 106,
+ 23,
+ 60,
+ 165,
+ 33,
+ 95,
+ 71,
+ 255,
+ 71,
+ 154,
+ 10,
+ 253,
+ 76,
+ 182,
+ 101,
+ 245,
+ 239,
+ 51,
+ 254,
+ 47,
+ 253,
+ 204,
+ 216,
+ 241,
+ 46,
+ 28,
+ 28,
+ 11,
+ 121,
+ 27,
+ 228,
+ 122,
+ 5,
+ 168,
+ 80,
+ 63,
+ 158,
+ 57,
+ 128,
+ 63,
+ 195,
+ 105,
+ 111,
+ 212,
+ 168,
+ 27,
+ 51,
+ 8,
+ 107,
+ 195,
+ 118,
+ 197,
+ 126,
+ 188,
+ 191,
+ 204,
+ 223,
+ 95,
+ 172,
+ 198,
+ 158,
+ 38,
+ 238,
+ 111,
+ 188,
+ 175,
+ 45,
+ 140,
+ 143,
+ 238,
+ 20,
+ 35,
+ 42,
+ 102,
+ 226,
+ 128,
+ 63,
+ 251,
+ 255,
+ 166,
+ 191,
+ 155,
+ 232,
+ 187,
+ 142,
+ 135,
+ 26,
+ 253,
+ 191,
+ 180,
+ 187,
+ 139,
+ 3,
+ 16,
+ 78,
+ 175,
+ 216,
+ 17,
+ 154,
+ 251,
+ 47,
+ 32,
+ 135,
+ 180,
+ 130,
+ 79,
+ 95,
+ 174,
+ 148,
+ 152,
+ 24,
+ 107,
+ 97,
+ 158,
+ 188,
+ 200,
+ 51,
+ 177,
+ 239,
+ 23,
+ 149,
+ 233,
+ 255,
+ 179,
+ 222,
+ 61,
+ 119,
+ 27,
+ 207,
+ 133,
+ 171,
+ 23,
+ 78,
+ 127,
+ 255,
+ 69,
+ 106,
+ 238,
+ 10,
+ 193,
+ 15,
+ 222,
+ 19,
+ 24,
+ 238,
+ 195,
+ 60,
+ 126,
+ 196,
+ 184,
+ 236,
+ 236,
+ 211,
+ 127,
+ 167,
+ 191,
+ 190,
+ 226,
+ 248,
+ 165,
+ 101,
+ 137,
+ 9,
+ 108,
+ 39,
+ 234,
+ 205,
+ 101,
+ 60,
+ 209,
+ 199,
+ 112,
+ 96,
+ 170,
+ 86,
+ 29,
+ 211,
+ 253,
+ 151,
+ 167,
+ 148,
+ 251,
+ 119,
+ 90,
+ 177,
+ 51,
+ 168,
+ 254,
+ 53,
+ 220,
+ 246,
+ 88,
+ 106,
+ 178,
+ 223,
+ 207,
+ 119,
+ 223,
+ 52,
+ 246,
+ 189,
+ 63,
+ 241,
+ 123,
+ 255,
+ 189,
+ 80,
+ 59,
+ 153,
+ 45,
+ 7,
+ 111,
+ 253,
+ 215,
+ 246,
+ 72,
+ 79,
+ 178,
+ 187,
+ 206,
+ 112,
+ 55,
+ 194,
+ 106,
+ 157,
+ 207,
+ 220,
+ 93,
+ 199,
+ 90,
+ 78,
+ 175,
+ 183,
+ 253,
+ 91,
+ 203,
+ 80,
+ 199,
+ 119,
+ 171,
+ 160,
+ 8,
+ 8,
+ 126,
+ 85,
+ 60,
+ 182,
+ 81,
+ 125,
+ 87,
+ 21,
+ 93,
+ 51,
+ 117,
+ 14,
+ 38,
+ 152,
+ 231,
+ 113,
+ 220,
+ 209,
+ 36,
+ 108,
+ 123,
+ 175,
+ 247,
+ 198,
+ 194,
+ 111,
+ 87,
+ 139,
+ 153,
+ 126,
+ 104,
+ 218,
+ 173,
+ 20,
+ 62,
+ 253,
+ 116,
+ 23,
+ 127,
+ 151,
+ 217,
+ 146,
+ 27,
+ 127,
+ 143,
+ 191,
+ 103,
+ 48,
+ 121,
+ 179,
+ 114,
+ 150,
+ 195,
+ 203,
+ 213,
+ 17,
+ 94,
+ 147,
+ 154,
+ 205,
+ 34,
+ 106,
+ 76,
+ 157,
+ 28,
+ 22,
+ 92,
+ 127,
+ 127,
+ 39,
+ 241,
+ 233,
+ 167,
+ 255,
+ 245,
+ 13,
+ 213,
+ 42,
+ 70,
+ 174,
+ 1,
+ 235,
+ 255,
+ 86,
+ 67,
+ 146,
+ 139,
+ 191,
+ 225,
+ 57,
+ 239,
+ 67,
+ 23,
+ 179,
+ 177,
+ 91,
+ 226,
+ 53,
+ 253,
+ 221,
+ 65,
+ 237,
+ 79,
+ 230,
+ 151,
+ 151,
+ 118,
+ 55,
+ 60,
+ 183,
+ 157,
+ 171,
+ 96,
+ 215,
+ 233,
+ 191,
+ 219,
+ 238,
+ 249,
+ 139,
+ 105,
+ 178,
+ 13,
+ 124,
+ 236,
+ 203,
+ 74,
+ 68,
+ 158,
+ 254,
+ 230,
+ 191,
+ 113,
+ 248,
+ 35,
+ 195,
+ 202,
+ 158,
+ 115,
+ 23,
+ 159,
+ 88,
+ 5,
+ 62,
+ 152,
+ 203,
+ 112,
+ 178,
+ 229,
+ 217,
+ 47,
+ 25,
+ 88,
+ 240,
+ 27,
+ 118,
+ 20,
+ 124,
+ 49,
+ 203,
+ 231,
+ 127,
+ 241,
+ 4,
+ 3,
+ 124,
+ 41,
+ 177,
+ 234,
+ 186,
+ 101,
+ 29,
+ 118,
+ 193,
+ 251,
+ 239,
+ 238,
+ 201,
+ 151,
+ 59,
+ 195,
+ 229,
+ 216,
+ 111,
+ 237,
+ 232,
+ 201,
+ 103,
+ 89,
+ 103,
+ 113,
+ 126,
+ 225,
+ 95,
+ 139,
+ 27,
+ 47,
+ 183,
+ 54,
+ 236,
+ 239,
+ 191,
+ 110,
+ 205,
+ 180,
+ 227,
+ 32,
+ 99,
+ 110,
+ 78,
+ 208,
+ 204,
+ 34,
+ 96,
+ 249,
+ 5,
+ 2,
+ 194,
+ 121,
+ 6,
+ 191,
+ 133,
+ 63,
+ 153,
+ 88,
+ 48,
+ 93,
+ 197,
+ 18,
+ 161,
+ 119,
+ 95,
+ 104,
+ 56,
+ 52,
+ 29,
+ 61,
+ 242,
+ 126,
+ 117,
+ 128,
+ 223,
+ 127,
+ 179,
+ 159,
+ 89,
+ 150,
+ 130,
+ 53,
+ 95,
+ 50,
+ 46,
+ 28,
+ 75,
+ 93,
+ 115,
+ 127,
+ 231,
+ 223,
+ 135,
+ 15,
+ 222,
+ 247,
+ 70,
+ 190,
+ 185,
+ 199,
+ 119,
+ 225,
+ 248,
+ 139,
+ 187,
+ 105,
+ 115,
+ 246,
+ 173,
+ 159,
+ 236,
+ 228,
+ 224,
+ 32,
+ 146,
+ 145,
+ 108,
+ 253,
+ 127,
+ 247,
+ 100,
+ 170,
+ 128,
+ 224,
+ 174,
+ 127,
+ 242,
+ 230,
+ 211,
+ 147,
+ 99,
+ 239,
+ 55,
+ 9,
+ 157,
+ 100,
+ 0,
+ 2,
+ 79,
+ 87,
+ 63,
+ 151,
+ 117,
+ 78,
+ 9,
+ 77,
+ 0,
+ 80,
+ 75,
+ 3,
+ 4,
+ 20,
+ 0,
+ 0,
+ 8,
+ 8,
+ 0,
+ 187,
+ 182,
+ 42,
+ 68,
+ 34,
+ 236,
+ 10,
+ 177,
+ 219,
+ 6,
+ 0,
+ 0,
+ 221,
+ 61,
+ 0,
+ 0,
+ 12,
+ 0,
+ 0,
+ 0,
+ 97,
+ 114,
+ 105,
+ 97,
+ 108,
+ 95,
+ 52,
+ 56,
+ 46,
+ 102,
+ 110,
+ 116,
+ 189,
+ 91,
+ 219,
+ 110,
+ 227,
+ 54,
+ 16,
+ 125,
+ 223,
+ 175,
+ 16,
+ 252,
+ 188,
+ 219,
+ 112,
+ 200,
+ 225,
+ 13,
+ 72,
+ 22,
+ 232,
+ 219,
+ 254,
+ 65,
+ 31,
+ 11,
+ 213,
+ 151,
+ 68,
+ 88,
+ 71,
+ 14,
+ 98,
+ 167,
+ 221,
+ 246,
+ 235,
+ 43,
+ 138,
+ 116,
+ 162,
+ 75,
+ 168,
+ 204,
+ 72,
+ 177,
+ 177,
+ 64,
+ 214,
+ 118,
+ 116,
+ 124,
+ 56,
+ 195,
+ 153,
+ 195,
+ 225,
+ 144,
+ 185,
+ 221,
+ 29,
+ 234,
+ 211,
+ 247,
+ 47,
+ 69,
+ 113,
+ 91,
+ 213,
+ 187,
+ 67,
+ 177,
+ 43,
+ 215,
+ 219,
+ 187,
+ 213,
+ 239,
+ 207,
+ 85,
+ 185,
+ 95,
+ 21,
+ 199,
+ 234,
+ 191,
+ 230,
+ 13,
+ 186,
+ 85,
+ 241,
+ 215,
+ 97,
+ 191,
+ 185,
+ 91,
+ 137,
+ 85,
+ 81,
+ 157,
+ 202,
+ 125,
+ 181,
+ 110,
+ 95,
+ 174,
+ 31,
+ 202,
+ 231,
+ 227,
+ 246,
+ 116,
+ 183,
+ 90,
+ 21,
+ 47,
+ 117,
+ 181,
+ 62,
+ 108,
+ 182,
+ 225,
+ 229,
+ 241,
+ 244,
+ 188,
+ 61,
+ 173,
+ 31,
+ 126,
+ 220,
+ 173,
+ 64,
+ 52,
+ 15,
+ 29,
+ 31,
+ 15,
+ 135,
+ 211,
+ 67,
+ 243,
+ 102,
+ 85,
+ 148,
+ 101,
+ 251,
+ 223,
+ 83,
+ 185,
+ 217,
+ 84,
+ 245,
+ 253,
+ 221,
+ 74,
+ 126,
+ 109,
+ 255,
+ 53,
+ 207,
+ 60,
+ 149,
+ 235,
+ 246,
+ 19,
+ 241,
+ 181,
+ 65,
+ 28,
+ 94,
+ 78,
+ 251,
+ 170,
+ 222,
+ 6,
+ 138,
+ 155,
+ 118,
+ 92,
+ 235,
+ 195,
+ 227,
+ 227,
+ 161,
+ 46,
+ 194,
+ 135,
+ 63,
+ 182,
+ 213,
+ 253,
+ 67,
+ 195,
+ 168,
+ 117,
+ 51,
+ 164,
+ 242,
+ 24,
+ 6,
+ 167,
+ 26,
+ 252,
+ 186,
+ 220,
+ 111,
+ 255,
+ 104,
+ 190,
+ 16,
+ 180,
+ 77,
+ 239,
+ 26,
+ 122,
+ 244,
+ 129,
+ 235,
+ 126,
+ 123,
+ 76,
+ 172,
+ 235,
+ 159,
+ 219,
+ 205,
+ 219,
+ 151,
+ 182,
+ 191,
+ 9,
+ 175,
+ 210,
+ 235,
+ 162,
+ 138,
+ 246,
+ 237,
+ 170,
+ 125,
+ 243,
+ 173,
+ 101,
+ 176,
+ 255,
+ 79,
+ 116,
+ 191,
+ 61,
+ 213,
+ 247,
+ 9,
+ 112,
+ 243,
+ 138,
+ 184,
+ 109,
+ 13,
+ 47,
+ 214,
+ 135,
+ 151,
+ 186,
+ 25,
+ 138,
+ 135,
+ 85,
+ 250,
+ 154,
+ 240,
+ 113,
+ 251,
+ 53,
+ 190,
+ 25,
+ 197,
+ 175,
+ 102,
+ 56,
+ 171,
+ 226,
+ 223,
+ 246,
+ 231,
+ 63,
+ 213,
+ 38,
+ 184,
+ 64,
+ 54,
+ 67,
+ 125,
+ 72,
+ 6,
+ 72,
+ 211,
+ 60,
+ 114,
+ 216,
+ 237,
+ 90,
+ 255,
+ 133,
+ 7,
+ 207,
+ 175,
+ 161,
+ 121,
+ 243,
+ 171,
+ 220,
+ 252,
+ 93,
+ 214,
+ 97,
+ 30,
+ 164,
+ 141,
+ 54,
+ 36,
+ 127,
+ 215,
+ 251,
+ 230,
+ 1,
+ 29,
+ 7,
+ 212,
+ 35,
+ 116,
+ 145,
+ 208,
+ 14,
+ 25,
+ 229,
+ 27,
+ 163,
+ 210,
+ 29,
+ 70,
+ 213,
+ 97,
+ 84,
+ 115,
+ 8,
+ 125,
+ 75,
+ 168,
+ 97,
+ 130,
+ 144,
+ 106,
+ 34,
+ 146,
+ 24,
+ 219,
+ 96,
+ 106,
+ 40,
+ 173,
+ 166,
+ 218,
+ 40,
+ 23,
+ 218,
+ 8,
+ 2,
+ 90,
+ 198,
+ 96,
+ 235,
+ 149,
+ 230,
+ 17,
+ 132,
+ 108,
+ 41,
+ 33,
+ 56,
+ 165,
+ 199,
+ 217,
+ 60,
+ 253,
+ 190,
+ 149,
+ 34,
+ 103,
+ 37,
+ 40,
+ 34,
+ 165,
+ 138,
+ 148,
+ 56,
+ 53,
+ 151,
+ 234,
+ 147,
+ 205,
+ 196,
+ 200,
+ 105,
+ 70,
+ 147,
+ 9,
+ 23,
+ 10,
+ 88,
+ 16,
+ 58,
+ 82,
+ 58,
+ 55,
+ 160,
+ 212,
+ 92,
+ 70,
+ 0,
+ 34,
+ 163,
+ 137,
+ 140,
+ 126,
+ 104,
+ 36,
+ 136,
+ 55,
+ 74,
+ 236,
+ 82,
+ 126,
+ 147,
+ 139,
+ 57,
+ 147,
+ 242,
+ 8,
+ 187,
+ 220,
+ 177,
+ 212,
+ 188,
+ 76,
+ 218,
+ 163,
+ 196,
+ 213,
+ 28,
+ 235,
+ 19,
+ 227,
+ 208,
+ 72,
+ 133,
+ 153,
+ 196,
+ 84,
+ 217,
+ 136,
+ 69,
+ 65,
+ 227,
+ 4,
+ 145,
+ 20,
+ 86,
+ 77,
+ 56,
+ 150,
+ 200,
+ 73,
+ 13,
+ 89,
+ 136,
+ 250,
+ 35,
+ 189,
+ 25,
+ 114,
+ 226,
+ 197,
+ 4,
+ 8,
+ 162,
+ 0,
+ 41,
+ 41,
+ 231,
+ 44,
+ 37,
+ 51,
+ 57,
+ 163,
+ 2,
+ 41,
+ 52,
+ 115,
+ 164,
+ 125,
+ 38,
+ 103,
+ 84,
+ 32,
+ 101,
+ 135,
+ 81,
+ 11,
+ 252,
+ 24,
+ 2,
+ 67,
+ 228,
+ 140,
+ 18,
+ 164,
+ 156,
+ 161,
+ 198,
+ 16,
+ 44,
+ 94,
+ 53,
+ 33,
+ 138,
+ 16,
+ 138,
+ 225,
+ 34,
+ 6,
+ 157,
+ 69,
+ 44,
+ 228,
+ 205,
+ 187,
+ 156,
+ 56,
+ 103,
+ 65,
+ 129,
+ 168,
+ 65,
+ 56,
+ 90,
+ 195,
+ 104,
+ 169,
+ 50,
+ 75,
+ 221,
+ 33,
+ 138,
+ 16,
+ 162,
+ 157,
+ 90,
+ 171,
+ 117,
+ 206,
+ 181,
+ 179,
+ 132,
+ 15,
+ 162,
+ 12,
+ 161,
+ 29,
+ 166,
+ 138,
+ 210,
+ 25,
+ 78,
+ 145,
+ 229,
+ 12,
+ 16,
+ 10,
+ 167,
+ 140,
+ 50,
+ 164,
+ 133,
+ 167,
+ 218,
+ 41,
+ 22,
+ 219,
+ 41,
+ 163,
+ 12,
+ 105,
+ 133,
+ 19,
+ 156,
+ 234,
+ 115,
+ 125,
+ 43,
+ 163,
+ 12,
+ 105,
+ 237,
+ 167,
+ 10,
+ 204,
+ 79,
+ 229,
+ 52,
+ 49,
+ 59,
+ 181,
+ 27,
+ 42,
+ 188,
+ 82,
+ 220,
+ 210,
+ 75,
+ 73,
+ 26,
+ 99,
+ 204,
+ 77,
+ 3,
+ 195,
+ 146,
+ 36,
+ 36,
+ 199,
+ 187,
+ 140,
+ 184,
+ 148,
+ 49,
+ 166,
+ 166,
+ 25,
+ 41,
+ 173,
+ 2,
+ 66,
+ 173,
+ 55,
+ 39,
+ 98,
+ 77,
+ 76,
+ 76,
+ 99,
+ 71,
+ 19,
+ 233,
+ 217,
+ 54,
+ 18,
+ 25,
+ 99,
+ 90,
+ 90,
+ 16,
+ 215,
+ 242,
+ 170,
+ 77,
+ 59,
+ 19,
+ 229,
+ 38,
+ 214,
+ 105,
+ 26,
+ 163,
+ 244,
+ 52,
+ 198,
+ 152,
+ 146,
+ 214,
+ 12,
+ 83,
+ 82,
+ 229,
+ 106,
+ 246,
+ 108,
+ 209,
+ 165,
+ 104,
+ 10,
+ 107,
+ 99,
+ 66,
+ 90,
+ 63,
+ 178,
+ 209,
+ 94,
+ 104,
+ 30,
+ 109,
+ 172,
+ 10,
+ 220,
+ 104,
+ 83,
+ 171,
+ 185,
+ 132,
+ 196,
+ 133,
+ 203,
+ 198,
+ 146,
+ 192,
+ 141,
+ 116,
+ 14,
+ 60,
+ 65,
+ 231,
+ 230,
+ 72,
+ 142,
+ 141,
+ 146,
+ 227,
+ 180,
+ 94,
+ 158,
+ 28,
+ 196,
+ 80,
+ 141,
+ 146,
+ 227,
+ 28,
+ 185,
+ 212,
+ 194,
+ 133,
+ 27,
+ 47,
+ 27,
+ 37,
+ 199,
+ 143,
+ 210,
+ 49,
+ 43,
+ 171,
+ 89,
+ 70,
+ 98,
+ 173,
+ 110,
+ 163,
+ 228,
+ 120,
+ 212,
+ 87,
+ 11,
+ 213,
+ 40,
+ 57,
+ 222,
+ 226,
+ 148,
+ 141,
+ 52,
+ 89,
+ 165,
+ 121,
+ 213,
+ 69,
+ 201,
+ 1,
+ 49,
+ 46,
+ 4,
+ 236,
+ 133,
+ 66,
+ 199,
+ 65,
+ 162,
+ 28,
+ 201,
+ 92,
+ 119,
+ 219,
+ 21,
+ 126,
+ 249,
+ 121,
+ 86,
+ 166,
+ 110,
+ 136,
+ 24,
+ 59,
+ 86,
+ 92,
+ 104,
+ 42,
+ 93,
+ 234,
+ 134,
+ 180,
+ 187,
+ 247,
+ 190,
+ 99,
+ 29,
+ 123,
+ 46,
+ 137,
+ 142,
+ 77,
+ 205,
+ 16,
+ 80,
+ 147,
+ 148,
+ 52,
+ 225,
+ 161,
+ 173,
+ 31,
+ 46,
+ 53,
+ 67,
+ 192,
+ 152,
+ 107,
+ 229,
+ 136,
+ 75,
+ 221,
+ 144,
+ 113,
+ 59,
+ 68,
+ 201,
+ 11,
+ 213,
+ 87,
+ 206,
+ 166,
+ 102,
+ 154,
+ 28,
+ 38,
+ 9,
+ 106,
+ 174,
+ 99,
+ 145,
+ 104,
+ 165,
+ 75,
+ 148,
+ 214,
+ 92,
+ 205,
+ 202,
+ 40,
+ 62,
+ 160,
+ 198,
+ 10,
+ 123,
+ 41,
+ 74,
+ 159,
+ 212,
+ 71,
+ 33,
+ 94,
+ 43,
+ 98,
+ 85,
+ 202,
+ 75,
+ 53,
+ 146,
+ 2,
+ 115,
+ 161,
+ 114,
+ 192,
+ 161,
+ 61,
+ 155,
+ 233,
+ 134,
+ 59,
+ 60,
+ 100,
+ 147,
+ 106,
+ 90,
+ 111,
+ 75,
+ 167,
+ 201,
+ 196,
+ 201,
+ 110,
+ 154,
+ 204,
+ 48,
+ 194,
+ 28,
+ 59,
+ 149,
+ 61,
+ 83,
+ 142,
+ 218,
+ 105,
+ 93,
+ 45,
+ 176,
+ 148,
+ 98,
+ 18,
+ 105,
+ 148,
+ 58,
+ 101,
+ 9,
+ 142,
+ 178,
+ 36,
+ 183,
+ 115,
+ 94,
+ 108,
+ 165,
+ 57,
+ 119,
+ 185,
+ 71,
+ 219,
+ 187,
+ 236,
+ 46,
+ 118,
+ 233,
+ 249,
+ 1,
+ 166,
+ 213,
+ 75,
+ 139,
+ 225,
+ 130,
+ 9,
+ 157,
+ 240,
+ 1,
+ 18,
+ 37,
+ 208,
+ 178,
+ 4,
+ 83,
+ 196,
+ 106,
+ 57,
+ 116,
+ 44,
+ 200,
+ 76,
+ 207,
+ 57,
+ 223,
+ 141,
+ 165,
+ 117,
+ 181,
+ 48,
+ 149,
+ 5,
+ 26,
+ 197,
+ 181,
+ 40,
+ 125,
+ 90,
+ 189,
+ 180,
+ 158,
+ 148,
+ 159,
+ 110,
+ 99,
+ 189,
+ 215,
+ 212,
+ 194,
+ 57,
+ 147,
+ 153,
+ 226,
+ 71,
+ 187,
+ 169,
+ 46,
+ 136,
+ 84,
+ 25,
+ 51,
+ 125,
+ 143,
+ 210,
+ 209,
+ 40,
+ 147,
+ 153,
+ 102,
+ 178,
+ 119,
+ 151,
+ 11,
+ 31,
+ 57,
+ 199,
+ 179,
+ 38,
+ 77,
+ 166,
+ 145,
+ 83,
+ 86,
+ 130,
+ 166,
+ 245,
+ 238,
+ 136,
+ 102,
+ 166,
+ 194,
+ 192,
+ 160,
+ 207,
+ 139,
+ 65,
+ 86,
+ 99,
+ 231,
+ 104,
+ 1,
+ 190,
+ 158,
+ 62,
+ 77,
+ 200,
+ 15,
+ 200,
+ 79,
+ 165,
+ 76,
+ 34,
+ 107,
+ 140,
+ 154,
+ 232,
+ 55,
+ 247,
+ 202,
+ 202,
+ 197,
+ 7,
+ 123,
+ 242,
+ 108,
+ 230,
+ 168,
+ 247,
+ 130,
+ 153,
+ 196,
+ 204,
+ 47,
+ 153,
+ 180,
+ 186,
+ 64,
+ 157,
+ 25,
+ 157,
+ 158,
+ 136,
+ 88,
+ 80,
+ 36,
+ 197,
+ 163,
+ 229,
+ 165,
+ 74,
+ 11,
+ 166,
+ 21,
+ 19,
+ 11,
+ 38,
+ 141,
+ 145,
+ 38,
+ 177,
+ 6,
+ 207,
+ 132,
+ 118,
+ 162,
+ 168,
+ 164,
+ 233,
+ 29,
+ 18,
+ 107,
+ 159,
+ 36,
+ 4,
+ 118,
+ 172,
+ 119,
+ 134,
+ 27,
+ 60,
+ 68,
+ 185,
+ 83,
+ 41,
+ 41,
+ 173,
+ 155,
+ 186,
+ 196,
+ 128,
+ 57,
+ 191,
+ 138,
+ 57,
+ 87,
+ 10,
+ 146,
+ 99,
+ 221,
+ 248,
+ 236,
+ 178,
+ 179,
+ 217,
+ 107,
+ 155,
+ 238,
+ 31,
+ 23,
+ 149,
+ 196,
+ 210,
+ 39,
+ 213,
+ 33,
+ 78,
+ 78,
+ 118,
+ 39,
+ 63,
+ 115,
+ 179,
+ 7,
+ 50,
+ 45,
+ 36,
+ 206,
+ 76,
+ 157,
+ 60,
+ 33,
+ 169,
+ 118,
+ 166,
+ 30,
+ 60,
+ 201,
+ 243,
+ 217,
+ 247,
+ 168,
+ 222,
+ 186,
+ 24,
+ 167,
+ 79,
+ 43,
+ 137,
+ 243,
+ 114,
+ 234,
+ 244,
+ 27,
+ 73,
+ 101,
+ 1,
+ 109,
+ 54,
+ 125,
+ 242,
+ 172,
+ 23,
+ 72,
+ 165,
+ 132,
+ 133,
+ 148,
+ 42,
+ 149,
+ 120,
+ 30,
+ 134,
+ 142,
+ 237,
+ 48,
+ 138,
+ 92,
+ 94,
+ 186,
+ 57,
+ 11,
+ 137,
+ 203,
+ 49,
+ 94,
+ 174,
+ 142,
+ 77,
+ 18,
+ 235,
+ 71,
+ 55,
+ 68,
+ 32,
+ 71,
+ 169,
+ 23,
+ 82,
+ 106,
+ 113,
+ 190,
+ 58,
+ 97,
+ 230,
+ 156,
+ 57,
+ 205,
+ 162,
+ 76,
+ 1,
+ 235,
+ 29,
+ 92,
+ 203,
+ 177,
+ 90,
+ 166,
+ 203,
+ 26,
+ 194,
+ 80,
+ 15,
+ 14,
+ 22,
+ 91,
+ 169,
+ 18,
+ 165,
+ 146,
+ 115,
+ 172,
+ 156,
+ 83,
+ 57,
+ 107,
+ 76,
+ 148,
+ 218,
+ 94,
+ 205,
+ 177,
+ 58,
+ 81,
+ 78,
+ 174,
+ 94,
+ 189,
+ 83,
+ 239,
+ 197,
+ 86,
+ 198,
+ 5,
+ 83,
+ 130,
+ 184,
+ 158,
+ 149,
+ 233,
+ 174,
+ 15,
+ 204,
+ 155,
+ 203,
+ 89,
+ 101,
+ 65,
+ 140,
+ 216,
+ 184,
+ 114,
+ 9,
+ 150,
+ 216,
+ 17,
+ 181,
+ 238,
+ 246,
+ 166,
+ 189,
+ 92,
+ 217,
+ 190,
+ 252,
+ 185,
+ 125,
+ 174,
+ 171,
+ 250,
+ 254,
+ 237,
+ 166,
+ 165,
+ 61,
+ 223,
+ 180,
+ 76,
+ 191,
+ 41,
+ 118,
+ 213,
+ 243,
+ 49,
+ 53,
+ 68,
+ 142,
+ 219,
+ 245,
+ 161,
+ 78,
+ 199,
+ 184,
+ 229,
+ 99,
+ 4,
+ 124,
+ 83,
+ 175,
+ 38,
+ 76,
+ 32,
+ 194,
+ 142,
+ 238,
+ 21,
+ 1,
+ 36,
+ 132,
+ 167,
+ 32,
+ 130,
+ 110,
+ 158,
+ 17,
+ 216,
+ 69,
+ 96,
+ 14,
+ 17,
+ 198,
+ 126,
+ 70,
+ 4,
+ 190,
+ 143,
+ 237,
+ 232,
+ 34,
+ 122,
+ 118,
+ 144,
+ 56,
+ 66,
+ 79,
+ 150,
+ 137,
+ 176,
+ 29,
+ 132,
+ 36,
+ 33,
+ 216,
+ 150,
+ 183,
+ 151,
+ 57,
+ 62,
+ 118,
+ 111,
+ 31,
+ 226,
+ 217,
+ 144,
+ 112,
+ 173,
+ 225,
+ 99,
+ 72,
+ 232,
+ 1,
+ 190,
+ 78,
+ 98,
+ 215,
+ 193,
+ 154,
+ 132,
+ 48,
+ 92,
+ 4,
+ 45,
+ 124,
+ 67,
+ 29,
+ 247,
+ 110,
+ 160,
+ 72,
+ 10,
+ 130,
+ 22,
+ 40,
+ 61,
+ 132,
+ 97,
+ 35,
+ 44,
+ 27,
+ 225,
+ 185,
+ 136,
+ 254,
+ 20,
+ 102,
+ 77,
+ 119,
+ 34,
+ 227,
+ 44,
+ 160,
+ 32,
+ 122,
+ 147,
+ 110,
+ 72,
+ 8,
+ 195,
+ 69,
+ 244,
+ 38,
+ 61,
+ 107,
+ 186,
+ 99,
+ 107,
+ 86,
+ 15,
+ 97,
+ 216,
+ 8,
+ 203,
+ 70,
+ 144,
+ 178,
+ 48,
+ 140,
+ 157,
+ 57,
+ 31,
+ 200,
+ 77,
+ 194,
+ 30,
+ 130,
+ 148,
+ 82,
+ 61,
+ 132,
+ 225,
+ 114,
+ 104,
+ 199,
+ 70,
+ 120,
+ 46,
+ 130,
+ 24,
+ 37,
+ 29,
+ 132,
+ 101,
+ 207,
+ 135,
+ 183,
+ 220,
+ 81,
+ 121,
+ 182,
+ 29,
+ 237,
+ 189,
+ 122,
+ 46,
+ 68,
+ 147,
+ 50,
+ 189,
+ 11,
+ 1,
+ 62,
+ 11,
+ 32,
+ 159,
+ 69,
+ 243,
+ 89,
+ 44,
+ 159,
+ 197,
+ 115,
+ 67,
+ 184,
+ 175,
+ 141,
+ 121,
+ 136,
+ 201,
+ 100,
+ 22,
+ 146,
+ 16,
+ 154,
+ 205,
+ 97,
+ 184,
+ 28,
+ 189,
+ 204,
+ 146,
+ 36,
+ 132,
+ 231,
+ 34,
+ 136,
+ 153,
+ 101,
+ 50,
+ 121,
+ 66,
+ 66,
+ 244,
+ 163,
+ 94,
+ 209,
+ 32,
+ 154,
+ 148,
+ 191,
+ 38,
+ 23,
+ 245,
+ 52,
+ 22,
+ 98,
+ 212,
+ 27,
+ 126,
+ 8,
+ 207,
+ 88,
+ 171,
+ 109,
+ 38,
+ 30,
+ 21,
+ 9,
+ 65,
+ 243,
+ 151,
+ 205,
+ 196,
+ 35,
+ 137,
+ 67,
+ 59,
+ 46,
+ 135,
+ 246,
+ 92,
+ 132,
+ 209,
+ 92,
+ 95,
+ 121,
+ 203,
+ 69,
+ 244,
+ 227,
+ 17,
+ 104,
+ 144,
+ 206,
+ 184,
+ 4,
+ 9,
+ 1,
+ 124,
+ 18,
+ 64,
+ 62,
+ 196,
+ 178,
+ 33,
+ 221,
+ 112,
+ 204,
+ 155,
+ 226,
+ 217,
+ 149,
+ 138,
+ 103,
+ 87,
+ 142,
+ 62,
+ 19,
+ 191,
+ 72,
+ 66,
+ 24,
+ 46,
+ 71,
+ 47,
+ 126,
+ 21,
+ 9,
+ 225,
+ 185,
+ 8,
+ 195,
+ 182,
+ 131,
+ 168,
+ 167,
+ 62,
+ 23,
+ 191,
+ 68,
+ 8,
+ 45,
+ 175,
+ 124,
+ 46,
+ 128,
+ 105,
+ 44,
+ 32,
+ 249,
+ 16,
+ 197,
+ 135,
+ 88,
+ 238,
+ 172,
+ 244,
+ 247,
+ 213,
+ 89,
+ 72,
+ 251,
+ 55,
+ 136,
+ 111,
+ 46,
+ 35,
+ 133,
+ 125,
+ 155,
+ 180,
+ 60,
+ 221,
+ 238,
+ 67,
+ 12,
+ 13,
+ 226,
+ 184,
+ 213,
+ 74,
+ 31,
+ 98,
+ 104,
+ 16,
+ 207,
+ 183,
+ 197,
+ 179,
+ 109,
+ 9,
+ 2,
+ 196,
+ 180,
+ 165,
+ 7,
+ 121,
+ 199,
+ 150,
+ 219,
+ 155,
+ 115,
+ 199,
+ 236,
+ 251,
+ 151,
+ 219,
+ 155,
+ 246,
+ 207,
+ 186,
+ 255,
+ 7,
+ 80,
+ 75,
+ 1,
+ 2,
+ 20,
+ 0,
+ 20,
+ 0,
+ 0,
+ 8,
+ 8,
+ 0,
+ 187,
+ 182,
+ 42,
+ 68,
+ 95,
+ 169,
+ 84,
+ 175,
+ 60,
+ 66,
+ 0,
+ 0,
+ 49,
+ 67,
+ 0,
+ 0,
+ 12,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 97,
+ 114,
+ 105,
+ 97,
+ 108,
+ 95,
+ 52,
+ 56,
+ 46,
+ 112,
+ 110,
+ 103,
+ 80,
+ 75,
+ 1,
+ 2,
+ 20,
+ 0,
+ 20,
+ 0,
+ 0,
+ 8,
+ 8,
+ 0,
+ 187,
+ 182,
+ 42,
+ 68,
+ 34,
+ 236,
+ 10,
+ 177,
+ 219,
+ 6,
+ 0,
+ 0,
+ 221,
+ 61,
+ 0,
+ 0,
+ 12,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 102,
+ 66,
+ 0,
+ 0,
+ 97,
+ 114,
+ 105,
+ 97,
+ 108,
+ 95,
+ 52,
+ 56,
+ 46,
+ 102,
+ 110,
+ 116,
+ 80,
+ 75,
+ 5,
+ 6,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2,
+ 0,
+ 2,
+ 0,
+ 116,
+ 0,
+ 0,
+ 0,
+ 107,
+ 73,
+ 0,
+ 0,
+ 0,
+ 0
+];
diff --git a/image/lib/src/formats/decode_info.dart b/image/lib/src/formats/decode_info.dart
index 435c197..5d63063 100755
--- a/image/lib/src/formats/decode_info.dart
+++ b/image/lib/src/formats/decode_info.dart
@@ -1,11 +1,11 @@
-/**
- * Provides information about the image being decoded.
- */
+/// Provides information about the image being decoded.
abstract class DecodeInfo {
/// The width of the image canvas.
int width = 0;
+
/// The height of the image canvas.
int height = 0;
+
/// The suggested background color of the canvas.
int backgroundColor = 0xffffffff;
diff --git a/image/lib/src/formats/decoder.dart b/image/lib/src/formats/decoder.dart
index 9556077..46a520e 100755
--- a/image/lib/src/formats/decoder.dart
+++ b/image/lib/src/formats/decoder.dart
@@ -3,68 +3,60 @@
import '../hdr/hdr_image.dart';
import 'decode_info.dart';
-/**
- * Base class for image format decoders.
- *
- * Image pixels are stored as 32-bit unsigned ints, so all formats, regardless
- * of their encoded color resolutions, decode to 32-bit RGBA images. Encoders
- * can reduce the color resolution back down to their required formats.
- *
- * Some image formats support multiple frames, often for encoding animation.
- * In such cases, the [decodeImage] method will decode the first (or otherwise
- * specified with the [frame] parameter) frame of the file. [decodeAnimation]
- * will decode all frames from the image. [startDecode] will initiate
- * decoding of the file, and [decodeFrame] will then decode a specific frame
- * from the file, allowing for animations to be decoded one frame at a time.
- * Some formats, such as TIFF, may store multiple frames, but their use of
- * frames is for multiple page documents and not animation. The terms
- * 'animation' and 'frames' simply refer to 'pages' in this case.
- *
- * If an image file does not have multiple frames, [decodeAnimation] and
- * [startDecode]/[decodeFrame] will return the single image of the
- * file. As such, if you are not sure if a file is animated or not, you can
- * use the animated functions and process it as a single frame image if it
- * has only 1 frame, and as an animation if it has more than 1 frame.
- *
- * Most animated formats do not store full images for frames, but rather
- * some frames will store full images and others will store partial 'change'
- * images. For these files, [decodeAnimation] will always return all images
- * fully composited, meaning full frame images. Decoding frames individually
- * using [startDecode] and [decodeFrame] will return the potentially partial
- * image. In this case, the [DecodeInfo] returned by [startDecode] will include
- * the width and height resolution of the animation canvas, and each [Image]
- * returned by [decodeFrame] will have x, y, width and height properties
- * indicating where in the canvas the frame image should be drawn. It will
- * also have a disposeMethod property that specifies what should be done to
- * the canvas prior to drawing the frame: [Image.DISPOSE_NONE] indicates the
- * canvas should be left alone; [Image.DISPOSE_CLEAR] indicates the canvas
- * should be cleared. For partial frame images,[Image.DISPOSE_NONE] is used
- * so that the partial-frame is drawn on top of the previous frame, applying
- * it's changes to the image.
- */
+/// Base class for image format decoders.
+///
+/// Image pixels are stored as 32-bit unsigned ints, so all formats, regardless
+/// of their encoded color resolutions, decode to 32-bit RGBA images. Encoders
+/// can reduce the color resolution back down to their required formats.
+///
+/// Some image formats support multiple frames, often for encoding animation.
+/// In such cases, the [decodeImage] method will decode the first (or otherwise
+/// specified with the [frame] parameter) frame of the file. [decodeAnimation]
+/// will decode all frames from the image. [startDecode] will initiate
+/// decoding of the file, and [decodeFrame] will then decode a specific frame
+/// from the file, allowing for animations to be decoded one frame at a time.
+/// Some formats, such as TIFF, may store multiple frames, but their use of
+/// frames is for multiple page documents and not animation. The terms
+/// 'animation' and 'frames' simply refer to 'pages' in this case.
+///
+/// If an image file does not have multiple frames, [decodeAnimation] and
+/// [startDecode]/[decodeFrame] will return the single image of the
+/// file. As such, if you are not sure if a file is animated or not, you can
+/// use the animated functions and process it as a single frame image if it
+/// has only 1 frame, and as an animation if it has more than 1 frame.
+///
+/// Most animated formats do not store full images for frames, but rather
+/// some frames will store full images and others will store partial 'change'
+/// images. For these files, [decodeAnimation] will always return all images
+/// fully composited, meaning full frame images. Decoding frames individually
+/// using [startDecode] and [decodeFrame] will return the potentially partial
+/// image. In this case, the [DecodeInfo] returned by [startDecode] will include
+/// the width and height resolution of the animation canvas, and each [Image]
+/// returned by [decodeFrame] will have x, y, width and height properties
+/// indicating where in the canvas the frame image should be drawn. It will
+/// also have a disposeMethod property that specifies what should be done to
+/// the canvas prior to drawing the frame: [Image.DISPOSE_NONE] indicates the
+/// canvas should be left alone; [Image.DISPOSE_CLEAR] indicates the canvas
+/// should be cleared. For partial frame images,[Image.DISPOSE_NONE] is used
+/// so that the partial-frame is drawn on top of the previous frame, applying
+/// it's changes to the image.
abstract class Decoder {
- /**
- * A light-weight function to test if the given file is able to be decoded
- * by this Decoder.
- */
+ /// A light-weight function to test if the given file is able to be decoded
+ /// by this Decoder.
bool isValidFile(List<int> bytes);
- /**
- * Decode the file and extract a single image from it. If the file is
- * animated, the specified [frame] will be decoded. If there was a problem
- * decoding the file, null is returned.
- */
- Image decodeImage(List<int> bytes, {int frame: 0});
+ /// Decode the file and extract a single image from it. If the file is
+ /// animated, the specified [frame] will be decoded. If there was a problem
+ /// decoding the file, null is returned.
+ Image decodeImage(List<int> bytes, {int frame = 0});
- /**
- * Decode the file and extract a single High Dynamic Range (HDR) image from
- * it. HDR images are stored in floating-poing values. If the format of the
- * file does not support HDR images, the regular image will be converted to
- * an HDR image as (color / 255). If the file is animated, the specified
- * [frame] will be decoded. If there was a problem decoding the file, null is
- * returned.
- */
- HdrImage decodeHdrImage(List<int> bytes, {int frame: 0}) {
+ /// Decode the file and extract a single High Dynamic Range (HDR) image from
+ /// it. HDR images are stored in floating-poing values. If the format of the
+ /// file does not support HDR images, the regular image will be converted to
+ /// an HDR image as (color / 255). If the file is animated, the specified
+ /// [frame] will be decoded. If there was a problem decoding the file, null is
+ /// returned.
+ HdrImage decodeHdrImage(List<int> bytes, {int frame = 0}) {
Image img = decodeImage(bytes, frame: frame);
if (img == null) {
return null;
@@ -72,43 +64,33 @@
return new HdrImage.fromImage(img);
}
- /**
- * Decode all of the frames from an animation. If the file is not an
- * animation, a single frame animation is returned. If there was a problem
- * decoding the file, null is returned.
- */
+ /// Decode all of the frames from an animation. If the file is not an
+ /// animation, a single frame animation is returned. If there was a problem
+ /// decoding the file, null is returned.
Animation decodeAnimation(List<int> bytes);
- /**
- * Start decoding the data as an animation sequence, but don't actually
- * process the frames until they are requested with decodeFrame.
- */
+ /// Start decoding the data as an animation sequence, but don't actually
+ /// process the frames until they are requested with decodeFrame.
DecodeInfo startDecode(List<int> bytes);
- /**
- * How many frames are available to be decoded. [startDecode] should have
- * been called first. Non animated image files will have a single frame.
- */
+ /// How many frames are available to be decoded. [startDecode] should have
+ /// been called first. Non animated image files will have a single frame.
int numFrames();
- /**
- * Decode a single frame from the data that was set with [startDecode].
- * If [frame] is out of the range of available frames, null is returned.
- * Non animated image files will only have [frame] 0. An [Image]
- * is returned, which provides the image, and top-left coordinates of the
- * image, as animated frames may only occupy a subset of the canvas.
- */
+ /// Decode a single frame from the data that was set with [startDecode].
+ /// If [frame] is out of the range of available frames, null is returned.
+ /// Non animated image files will only have [frame] 0. An [Image]
+ /// is returned, which provides the image, and top-left coordinates of the
+ /// image, as animated frames may only occupy a subset of the canvas.
Image decodeFrame(int frame);
- /**
- * Decode a single high dynamic range (HDR) frame from the data that was set
- * with [startDecode]. If the format of the file does not support HDR images,
- * the regular image will be converted to an HDR image as (color / 255).
- * If [frame] is out of the range of available frames, null is returned.
- * Non animated image files will only have [frame] 0. An [Image]
- * is returned, which provides the image, and top-left coordinates of the
- * image, as animated frames may only occupy a subset of the canvas.
- */
+ /// Decode a single high dynamic range (HDR) frame from the data that was set
+ /// with [startDecode]. If the format of the file does not support HDR images,
+ /// the regular image will be converted to an HDR image as (color / 255).
+ /// If [frame] is out of the range of available frames, null is returned.
+ /// Non animated image files will only have [frame] 0. An [Image]
+ /// is returned, which provides the image, and top-left coordinates of the
+ /// image, as animated frames may only occupy a subset of the canvas.
HdrImage decodeHdrFrame(int frame) {
Image img = decodeFrame(frame);
if (img == null) {
diff --git a/image/lib/src/formats/encoder.dart b/image/lib/src/formats/encoder.dart
index 769f5fc..ae146a4 100755
--- a/image/lib/src/formats/encoder.dart
+++ b/image/lib/src/formats/encoder.dart
@@ -1,24 +1,16 @@
import '../animation.dart';
import '../image.dart';
-/**
- * Base class for image format encoders.
- */
+/// Base class for image format encoders.
abstract class Encoder {
- /**
- * Encode a single image.
- */
+ /// Encode a single image.
List<int> encodeImage(Image image);
- /**
- * Does this encoder support animation?
- */
+ /// Does this encoder support animation?
bool get supportsAnimation => false;
- /**
- * Encode an animation. Not all formats support animation, and null
- * will be returned if not.
- */
+ /// Encode an animation. Not all formats support animation, and null
+ /// will be returned if not.
List<int> encodeAnimation(Animation anim) {
return null;
}
diff --git a/image/lib/src/formats/exr/exr_b44_compressor.dart b/image/lib/src/formats/exr/exr_b44_compressor.dart
index a7e3842..0475976 100755
--- a/image/lib/src/formats/exr/exr_b44_compressor.dart
+++ b/image/lib/src/formats/exr/exr_b44_compressor.dart
@@ -7,26 +7,25 @@
import 'exr_part.dart';
abstract class ExrB44Compressor extends ExrCompressor {
- factory ExrB44Compressor(ExrPart header, int maxScanLineSize, int numScanLines,
- bool optFlatFields) = InternalExrB44Compressor;
+ factory ExrB44Compressor(ExrPart header, int maxScanLineSize,
+ int numScanLines, bool optFlatFields) = InternalExrB44Compressor;
}
@internal
-class InternalExrB44Compressor extends InternalExrCompressor implements ExrB44Compressor {
- InternalExrB44Compressor(ExrPart header, int maxScanLineSize, this._numScanLines,
- bool optFlatFields) :
- super(header) {
- }
+class InternalExrB44Compressor extends InternalExrCompressor
+ implements ExrB44Compressor {
+ InternalExrB44Compressor(ExrPart header, int maxScanLineSize,
+ this._numScanLines, bool optFlatFields)
+ : super(header as InternalExrPart);
int numScanLines() => _numScanLines;
- Uint8List compress(InputBuffer inPtr, int x, int y,
- [int width, int height]) {
+ Uint8List compress(InputBuffer inPtr, int x, int y, [int width, int height]) {
throw new ImageException('B44 compression not yet supported.');
}
Uint8List uncompress(InputBuffer inPtr, int x, int y,
- [int width, int height]) {
+ [int width, int height]) {
throw new ImageException('B44 compression not yet supported.');
}
diff --git a/image/lib/src/formats/exr/exr_channel.dart b/image/lib/src/formats/exr/exr_channel.dart
index 19ee809..039e8e7 100755
--- a/image/lib/src/formats/exr/exr_channel.dart
+++ b/image/lib/src/formats/exr/exr_channel.dart
@@ -11,28 +11,40 @@
/// Luminance
static const String Y = 'Y';
+
/// Chroma RY
static const String RY = 'RY';
+
/// Chroma BY
static const String BY = 'BY';
+
/// Red for colored mattes
static const String AR = 'AR';
+
/// Green for colored mattes
static const String AG = 'AG';
+
/// Blue for colored mattes
static const String AB = 'AB';
+
/// Distance of the front of a sample from the viewer
static const String Z = 'Z';
+
/// Distance of the back of a sample from the viewer
static const String ZBack = 'ZBack';
+
/// Alpha/opacity
static const String A = 'A';
+
/// Red value of a sample
static const String R = 'R';
+
/// Green value of a sample
static const String G = 'G';
+
/// Blue value of a sample
static const String B = 'B';
+
/// A numerical identifier for the object represented by a sample.
static const String ID = 'id';
diff --git a/image/lib/src/formats/exr/exr_compressor.dart b/image/lib/src/formats/exr/exr_compressor.dart
index 71e99b3..aa0bc8d 100755
--- a/image/lib/src/formats/exr/exr_compressor.dart
+++ b/image/lib/src/formats/exr/exr_compressor.dart
@@ -24,35 +24,35 @@
int decodedHeight = 0;
factory ExrCompressor(int type, ExrPart hdr, int maxScanLineSize,
- [int numScanLines]) {
+ [int numScanLines]) {
switch (type) {
case RLE_COMPRESSION:
return new ExrRleCompressor(hdr, maxScanLineSize);
case ZIPS_COMPRESSION:
- return new ExrZipCompressor(hdr, maxScanLineSize,
- numScanLines == null ? 1 : numScanLines);
+ return new ExrZipCompressor(
+ hdr, maxScanLineSize, numScanLines == null ? 1 : numScanLines);
case ZIP_COMPRESSION:
- return new ExrZipCompressor(hdr, maxScanLineSize,
- numScanLines == null ? 16 : numScanLines);
+ return new ExrZipCompressor(
+ hdr, maxScanLineSize, numScanLines == null ? 16 : numScanLines);
case PIZ_COMPRESSION:
- return new ExrPizCompressor(hdr, maxScanLineSize,
- numScanLines == null ? 32 : numScanLines);
+ return new ExrPizCompressor(
+ hdr, maxScanLineSize, numScanLines == null ? 32 : numScanLines);
case PXR24_COMPRESSION:
- return new ExrPxr24Compressor(hdr, maxScanLineSize,
- numScanLines == null ? 16 : numScanLines);
+ return new ExrPxr24Compressor(
+ hdr, maxScanLineSize, numScanLines == null ? 16 : numScanLines);
case B44_COMPRESSION:
return new ExrB44Compressor(hdr, maxScanLineSize,
- numScanLines == null ? 32 : numScanLines, false);
+ numScanLines == null ? 32 : numScanLines, false);
case B44A_COMPRESSION:
return new ExrB44Compressor(hdr, maxScanLineSize,
- numScanLines == null ? 32 : numScanLines, true);
+ numScanLines == null ? 32 : numScanLines, true);
default:
throw new ImageException('Invalid compression type: $type');
}
}
- factory ExrCompressor.tile(int type, int tileLineSize, int numTileLines,
- ExrPart hdr) {
+ factory ExrCompressor.tile(
+ int type, int tileLineSize, int numTileLines, ExrPart hdr) {
switch (type) {
case RLE_COMPRESSION:
return new ExrRleCompressor(hdr, (tileLineSize * numTileLines));
@@ -76,13 +76,12 @@
int numScanLines();
- Uint8List compress(InputBuffer inPtr, int x, int y,
- [int width, int height]) {
+ Uint8List compress(InputBuffer inPtr, int x, int y, [int width, int height]) {
throw new ImageException('Unsupported compression type');
}
Uint8List uncompress(InputBuffer inPtr, int x, int y,
- [int width, int height]) {
+ [int width, int height]) {
throw new ImageException('Unsupported compression type');
}
@@ -93,11 +92,11 @@
abstract class InternalExrCompressor extends ExrCompressor {
InternalExrCompressor(InternalExrPart header) : super._(header);
- InternalExrPart get header => _header;
+ InternalExrPart get header => _header as InternalExrPart;
int numSamples(int s, int a, int b) {
int a1 = a ~/ s;
int b1 = b ~/ s;
- return b1 - a1 + ((a1 * s < a) ? 0: 1);
+ return b1 - a1 + ((a1 * s < a) ? 0 : 1);
}
}
diff --git a/image/lib/src/formats/exr/exr_huffman.dart b/image/lib/src/formats/exr/exr_huffman.dart
index b5a0d3e..94d76e4 100755
--- a/image/lib/src/formats/exr/exr_huffman.dart
+++ b/image/lib/src/formats/exr/exr_huffman.dart
@@ -4,8 +4,8 @@
import '../../util/input_buffer.dart';
class ExrHuffman {
- static void uncompress(InputBuffer compressed, int nCompressed,
- Uint16List raw, int nRaw) {
+ static void uncompress(
+ InputBuffer compressed, int nCompressed, Uint16List raw, int nRaw) {
if (nCompressed == 0) {
if (nRaw != 0) {
throw new ImageException('Incomplete huffman data');
@@ -39,16 +39,15 @@
if (nBits > 8 * (nCompressed - (compressed.offset - start))) {
throw new ImageException("Error in header for Huffman-encoded data "
- "(invalid number of bits).");
+ "(invalid number of bits).");
}
buildDecTable(freq, im, iM, hdec);
decode(freq, hdec, compressed, nBits, iM, nRaw, raw);
}
- static void decode(List<int> hcode, List<ExrHufDec> hdecod,
- InputBuffer input, int ni, int rlc, int no,
- Uint16List out) {
+ static void decode(List<int> hcode, List<ExrHufDec> hdecod, InputBuffer input,
+ int ni, int rlc, int no, Uint16List out) {
List<int> c_lc = [0, 0];
int ie = input.offset + (ni + 7) ~/ 8; // input byte size
int oi = 0;
@@ -60,7 +59,8 @@
// Access decoding table
while (c_lc[1] >= HUF_DECBITS) {
- ExrHufDec pl = hdecod[(c_lc[0] >> (c_lc[1] - HUF_DECBITS)) & HUF_DECMASK];
+ ExrHufDec pl =
+ hdecod[(c_lc[0] >> (c_lc[1] - HUF_DECBITS)) & HUF_DECMASK];
if (pl.len != 0) {
// Get short code
@@ -69,7 +69,7 @@
} else {
if (pl.p == null) {
throw new ImageException("Error in Huffman-encoded data "
- "(invalid code).");
+ "(invalid code).");
}
// Search long code
@@ -77,7 +77,8 @@
for (j = 0; j < pl.lit; j++) {
int l = hufLength(hcode[pl.p[j]]);
- while (c_lc[1] < l && input.offset < ie) { // get more bits
+ while (c_lc[1] < l && input.offset < ie) {
+ // get more bits
getChar(c_lc, input);
}
@@ -94,7 +95,7 @@
if (j == pl.lit) {
throw new ImageException("Error in Huffman-encoded data "
- "(invalid code).");
+ "(invalid code).");
}
}
}
@@ -113,18 +114,18 @@
oi = getCode(pl.lit, rlc, c_lc, input, out, oi, no);
} else {
throw new ImageException("Error in Huffman-encoded data "
- "(invalid code).");
+ "(invalid code).");
}
}
if (oi != no) {
throw new ImageException("Error in Huffman-encoded data "
- "(decoded data are shorter than expected).");
+ "(decoded data are shorter than expected).");
}
}
static int getCode(int po, int rlc, List<int> c_lc, InputBuffer input,
- Uint16List out, int oi, int oe) {
+ Uint16List out, int oi, int oe) {
if (po == rlc) {
if (c_lc[1] < 8) {
getChar(c_lc, input);
@@ -136,7 +137,7 @@
if (oi + cs > oe) {
throw new ImageException("Error in Huffman-encoded data "
- "(decoded data are longer than expected).");
+ "(decoded data are longer than expected).");
}
int s = out[oi - 1];
@@ -148,14 +149,13 @@
out[oi++] = po;
} else {
throw new ImageException("Error in Huffman-encoded data "
- "(decoded data are longer than expected).");
+ "(decoded data are longer than expected).");
}
return oi;
}
-
- static void buildDecTable(List<int> hcode, int im, int iM,
- List<ExrHufDec> hdecod) {
+ static void buildDecTable(
+ List<int> hcode, int im, int iM, List<ExrHufDec> hdecod) {
// Init hashtable & loop on all codes.
// Assumes that hufClearDecTable(hdecod) has already been called.
for (; im <= iM; im++) {
@@ -167,7 +167,7 @@
// but c contains a value that is greater
// than the largest l-bit number.
throw new ImageException("Error in Huffman-encoded data "
- "(invalid code table entry).");
+ "(invalid code table entry).");
}
if (l > HUF_DECBITS) {
@@ -178,7 +178,7 @@
// Error: a short code has already
// been stored in table entry *pl.
throw new ImageException("Error in Huffman-encoded data "
- "(invalid code table entry).");
+ "(invalid code table entry).");
}
pl.lit++;
@@ -206,7 +206,7 @@
// Error: a short code or a long code has
// already been stored in table entry *pl.
throw new ImageException("Error in Huffman-encoded data "
- "(invalid code table entry).");
+ "(invalid code table entry).");
}
pl.len = l;
@@ -216,15 +216,15 @@
}
}
- static void unpackEncTable(InputBuffer p, int ni, int im, int iM,
- List<int> hcode) {
+ static void unpackEncTable(
+ InputBuffer p, int ni, int im, int iM, List<int> hcode) {
int pcode = p.offset;
List<int> c_lc = [0, 0];
for (; im <= iM; im++) {
if (p.offset - pcode > ni) {
throw new ImageException("Error in Huffman-encoded data "
- "(unexpected end of code table data).");
+ "(unexpected end of code table data).");
}
int l = hcode[im] = getBits(6, c_lc, p); // code length
@@ -232,14 +232,14 @@
if (l == LONG_ZEROCODE_RUN) {
if (p.offset - pcode > ni) {
throw new ImageException("Error in Huffman-encoded data "
- "(unexpected end of code table data).");
+ "(unexpected end of code table data).");
}
int zerun = getBits(8, c_lc, p) + SHORTEST_LONG_RUN;
if (im + zerun > iM + 1) {
throw new ImageException("Error in Huffman-encoded data "
- "(code table is longer than expected).");
+ "(code table is longer than expected).");
}
while (zerun-- != 0) {
@@ -252,7 +252,7 @@
if (im + zerun > iM + 1) {
throw new ImageException("Error in Huffman-encoded data "
- "(code table is longer than expected).");
+ "(code table is longer than expected).");
}
while (zerun-- != 0) {
@@ -325,16 +325,17 @@
static const int MASK_32 = (1 << 32) - 1;
static const int MASK_64 = (1 << 64) - 1;
- static const int HUF_ENCBITS = 16; // literal (value) bit length
- static const int HUF_DECBITS = 14; // decoding bit size (>= 8)
+ static const int HUF_ENCBITS = 16; // literal (value) bit length
+ static const int HUF_DECBITS = 14; // decoding bit size (>= 8)
static const int HUF_ENCSIZE = (1 << HUF_ENCBITS) + 1; // encoding table size
- static const int HUF_DECSIZE = 1 << HUF_DECBITS; // decoding table size
+ static const int HUF_DECSIZE = 1 << HUF_DECBITS; // decoding table size
static const int HUF_DECMASK = HUF_DECSIZE - 1;
static const int SHORT_ZEROCODE_RUN = 59;
static const int LONG_ZEROCODE_RUN = 63;
- static const int SHORTEST_LONG_RUN = 2 + LONG_ZEROCODE_RUN - SHORT_ZEROCODE_RUN;
+ static const int SHORTEST_LONG_RUN =
+ 2 + LONG_ZEROCODE_RUN - SHORT_ZEROCODE_RUN;
static const int LONGEST_LONG_RUN = 255 + SHORTEST_LONG_RUN;
}
diff --git a/image/lib/src/formats/exr/exr_image.dart b/image/lib/src/formats/exr/exr_image.dart
index 4c431e3..716c7c0 100755
--- a/image/lib/src/formats/exr/exr_image.dart
+++ b/image/lib/src/formats/exr/exr_image.dart
@@ -9,7 +9,6 @@
import 'exr_compressor.dart';
import 'exr_part.dart';
-
class ExrImage extends DecodeInfo {
/// An EXR image has one or more parts, each of which contains a framebuffer.
List<InternalExrPart> _parts = [];
@@ -29,13 +28,13 @@
flags = input.readUint24();
if (!_supportsFlags(flags)) {
throw new ImageException('The file format version number\'s flag field '
- 'contains unrecognized flags.');
+ 'contains unrecognized flags.');
}
if (!_isMultiPart()) {
ExrPart part = InternalExrPart(_isTiled(), input);
if (part.isValid) {
- _parts.add(part);
+ _parts.add(part as InternalExrPart);
}
} else {
while (true) {
@@ -43,7 +42,7 @@
if (!part.isValid) {
break;
}
- _parts.add(part);
+ _parts.add(part as InternalExrPart);
}
}
@@ -62,9 +61,7 @@
int get numFrames => 1;
- /**
- * Parse just enough of the file to identify that it's an EXR image.
- */
+ /// Parse just enough of the file to identify that it's an EXR image.
static bool isValidFile(List<int> bytes) {
InputBuffer input = InputBuffer(bytes);
@@ -90,7 +87,7 @@
ExrPart getPart(int i) => _parts[i];
- bool _isTiled() {
+ bool _isTiled() {
return (flags & TILED_FLAG) != 0;
}
@@ -118,8 +115,8 @@
if (!framebuffer.hasChannel(ch.name)) {
width = part.width;
height = part.height;
- framebuffer.addSlice(new HdrSlice(ch.name, part.width, part.height,
- ch.type));
+ framebuffer.addSlice(
+ new HdrSlice(ch.name, part.width, part.height, ch.type));
}
}
@@ -180,9 +177,8 @@
Uint8List uncompressedData;
if (compressor != null) {
- uncompressedData = compressor.uncompress(data, tx, ty,
- part.tileWidth,
- part.tileHeight);
+ uncompressedData = compressor.uncompress(
+ data, tx, ty, part.tileWidth, part.tileHeight);
tileWidth = compressor.decodedWidth;
tileHeight = compressor.decodedHeight;
} else {
diff --git a/image/lib/src/formats/exr/exr_part.dart b/image/lib/src/formats/exr/exr_part.dart
index e0d7416..a700b5a 100755
--- a/image/lib/src/formats/exr/exr_part.dart
+++ b/image/lib/src/formats/exr/exr_part.dart
@@ -1,4 +1,4 @@
-import 'dart:math' as Math;
+import 'dart:math';
import 'dart:typed_data';
import '../../image_exception.dart';
@@ -12,16 +12,22 @@
class ExrPart {
/// The framebuffer for this exr part.
HdrImage framebuffer = HdrImage();
+
/// The channels present in this part.
List<ExrChannel> channels = [];
+
/// The extra attributes read from the part header.
Map<String, ExrAttribute> attributes = {};
+
/// The display window (see the openexr documentation).
List<int> displayWindow;
+
/// The data window (see the openexr documentation).
List<int> dataWindow;
+
/// width of the data window
int width;
+
/// Height of the data window
int height;
double pixelAspectRatio = 1.0;
@@ -73,14 +79,22 @@
}
break;
case 'dataWindow':
- dataWindow = [value.readInt32(), value.readInt32(),
- value.readInt32(), value.readInt32()];
+ dataWindow = [
+ value.readInt32(),
+ value.readInt32(),
+ value.readInt32(),
+ value.readInt32()
+ ];
width = (dataWindow[2] - dataWindow[0]) + 1;
height = (dataWindow[3] - dataWindow[1]) + 1;
break;
case 'displayWindow':
- displayWindow = [value.readInt32(), value.readInt32(),
- value.readInt32(), value.readInt32()];
+ displayWindow = [
+ value.readInt32(),
+ value.readInt32(),
+ value.readInt32(),
+ value.readInt32()
+ ];
break;
case 'lineOrder':
//_lineOrder = value.readByte();
@@ -127,18 +141,18 @@
_numXTiles = List<int>(_numXLevels);
_numYTiles = List<int>(_numYLevels);
- _calculateNumTiles(_numXTiles, _numXLevels, left, right, _tileWidth,
- _tileRoundingMode);
+ _calculateNumTiles(
+ _numXTiles, _numXLevels, left, right, _tileWidth, _tileRoundingMode);
- _calculateNumTiles(_numYTiles, _numYLevels, top, bottom, _tileHeight,
- _tileRoundingMode);
+ _calculateNumTiles(
+ _numYTiles, _numYLevels, top, bottom, _tileHeight, _tileRoundingMode);
_bytesPerPixel = _calculateBytesPerPixel();
_maxBytesPerTileLine = _bytesPerPixel * _tileWidth;
//_tileBufferSize = _maxBytesPerTileLine * _tileHeight;
- _compressor = ExrCompressor(_compressionType, this,
- _maxBytesPerTileLine, _tileHeight);
+ _compressor = ExrCompressor(
+ _compressionType, this, _maxBytesPerTileLine, _tileHeight);
_offsets = List<Uint32List>(_numXLevels * _numYLevels);
for (int ly = 0, l = 0; ly < _numYLevels; ++ly) {
@@ -159,7 +173,7 @@
int maxBytesPerLine = 0;
for (int y = 0; y < height; ++y) {
- maxBytesPerLine = Math.max(maxBytesPerLine, _bytesPerLine[y]);
+ maxBytesPerLine = max(maxBytesPerLine, _bytesPerLine[y]);
}
_compressor = ExrCompressor(_compressionType, this, maxBytesPerLine);
@@ -191,9 +205,7 @@
int get bottom => dataWindow[3];
- /**
- * Was this part successfully decoded?
- */
+ /// Was this part successfully decoded?
bool get isValid => width != null;
int _calculateNumXLevels(int minX, int maxX, int minY, int maxY) {
@@ -206,7 +218,7 @@
case MIPMAP_LEVELS:
int w = maxX - minX + 1;
int h = maxY - minY + 1;
- num = _roundLog2(Math.max(w, h), _tileRoundingMode) + 1;
+ num = _roundLog2(max(w, h), _tileRoundingMode) + 1;
break;
case RIPMAP_LEVELS:
int w = maxX - minX + 1;
@@ -219,7 +231,6 @@
return num;
}
-
int _calculateNumYLevels(int minX, int maxX, int minY, int maxY) {
int num = 0;
@@ -230,7 +241,7 @@
case MIPMAP_LEVELS:
int w = (maxX - minX) + 1;
int h = (maxY - minY) + 1;
- num = _roundLog2(Math.max(w, h), _tileRoundingMode) + 1;
+ num = _roundLog2(max(w, h), _tileRoundingMode) + 1;
break;
case RIPMAP_LEVELS:
int h = (maxY - minY) + 1;
@@ -251,14 +262,13 @@
int y = 0;
while (x > 1) {
- y += 1;
+ y += 1;
x >>= 1;
}
return y;
}
-
int _ceilLog2(int x) {
int y = 0;
int r = 0;
@@ -268,7 +278,7 @@
r = 1;
}
- y += 1;
+ y += 1;
x >>= 1;
}
@@ -285,19 +295,19 @@
return bytesPerPixel;
}
- void _calculateNumTiles(List<int> numTiles, int numLevels,
- int min, int max, int size, int rmode) {
+ void _calculateNumTiles(List<int> numTiles, int numLevels, int min, int max,
+ int size, int rmode) {
for (int i = 0; i < numLevels; i++) {
numTiles[i] = (_levelSize(min, max, i, rmode) + size - 1) ~/ size;
}
}
- int _levelSize(int min, int max, int l, int rmode) {
+ int _levelSize(int _min, int _max, int l, int rmode) {
if (l < 0) {
throw new ImageException('Argument not in valid range.');
}
- int a = (max - min) + 1;
+ int a = (_max - _min) + 1;
int b = (1 << l);
int size = a ~/ b;
@@ -305,7 +315,7 @@
size += 1;
}
- return Math.max(size, 1);
+ return max(size, 1);
}
static const int TYPE_SCANLINE = 0;
diff --git a/image/lib/src/formats/exr/exr_piz_compressor.dart b/image/lib/src/formats/exr/exr_piz_compressor.dart
index 3de8788..54d2d85 100755
--- a/image/lib/src/formats/exr/exr_piz_compressor.dart
+++ b/image/lib/src/formats/exr/exr_piz_compressor.dart
@@ -10,18 +10,19 @@
import 'exr_part.dart';
import 'exr_wavelet.dart';
-/**
- * Wavelet compression
- */
+/// Wavelet compression
abstract class ExrPizCompressor extends ExrCompressor {
- factory ExrPizCompressor(ExrPart header, int maxScanLineSize,
- int numScanLines) = InternalExrPizCompressor;
+ factory ExrPizCompressor(
+ ExrPart header, int maxScanLineSize, int numScanLines) =
+ InternalExrPizCompressor;
}
@internal
-class InternalExrPizCompressor extends InternalExrCompressor implements ExrPizCompressor {
- InternalExrPizCompressor(ExrPart header, this._maxScanLineSize, this._numScanLines) :
- super(header) {
+class InternalExrPizCompressor extends InternalExrCompressor
+ implements ExrPizCompressor {
+ InternalExrPizCompressor(
+ ExrPart header, this._maxScanLineSize, this._numScanLines)
+ : super(header as InternalExrPart) {
_channelData = List<_PizChannelData>(header.channels.length);
for (int i = 0; i < _channelData.length; ++i) {
_channelData[i] = _PizChannelData();
@@ -33,13 +34,12 @@
int numScanLines() => _numScanLines;
- Uint8List compress(InputBuffer inPtr, int x, int y,
- [int width, int height]) {
+ Uint8List compress(InputBuffer inPtr, int x, int y, [int width, int height]) {
throw new ImageException('Piz compression not yet supported.');
}
Uint8List uncompress(InputBuffer inPtr, int x, int y,
- [int width, int height]) {
+ [int width, int height]) {
if (width == null) {
width = header.width;
}
@@ -86,7 +86,7 @@
if (maxNonZero >= BITMAP_SIZE) {
throw new ImageException("Error in header for PIZ-compressed data "
- "(invalid bitmap size).");
+ "(invalid bitmap size).");
}
Uint8List bitmap = Uint8List(BITMAP_SIZE);
@@ -109,7 +109,7 @@
_PizChannelData cd = _channelData[i];
for (int j = 0; j < cd.size; ++j) {
ExrWavelet.decode(_tmpBuffer, cd.start + j, cd.nx, cd.size, cd.ny,
- cd.nx * cd.size, maxValue);
+ cd.nx * cd.size, maxValue);
}
}
@@ -117,8 +117,8 @@
_applyLut(lut, _tmpBuffer, tmpBufferEnd);
if (_output == null) {
- _output = OutputBuffer(size: (_maxScanLineSize * _numScanLines) +
- (65536 + 8192));
+ _output = OutputBuffer(
+ size: (_maxScanLineSize * _numScanLines) + (65536 + 8192));
}
_output.rewind();
@@ -138,7 +138,7 @@
}
}
- return _output.getBytes();
+ return _output.getBytes() as Uint8List;
}
void _applyLut(List<int> lut, List<int> data, int nData) {
@@ -161,7 +161,7 @@
lut[k++] = 0;
}
- return n; // maximum k where lut[k] is non-zero,
+ return n; // maximum k where lut[k] is non-zero,
}
static const int USHORT_RANGE = 1 << 16;
diff --git a/image/lib/src/formats/exr/exr_pxr24_compressor.dart b/image/lib/src/formats/exr/exr_pxr24_compressor.dart
index b3cd998..b4e7d99 100755
--- a/image/lib/src/formats/exr/exr_pxr24_compressor.dart
+++ b/image/lib/src/formats/exr/exr_pxr24_compressor.dart
@@ -10,24 +10,25 @@
import 'exr_part.dart';
abstract class ExrPxr24Compressor extends ExrCompressor {
- factory ExrPxr24Compressor(ExrPart header, int maxScanLineSize,
- int numScanLines) = InternalExrPxr24Compressor;
+ factory ExrPxr24Compressor(
+ ExrPart header, int maxScanLineSize, int numScanLines) =
+ InternalExrPxr24Compressor;
}
-class InternalExrPxr24Compressor extends InternalExrCompressor implements ExrPxr24Compressor {
- InternalExrPxr24Compressor(ExrPart header, this._maxScanLineSize, this._numScanLines) :
- super(header) {
- }
+class InternalExrPxr24Compressor extends InternalExrCompressor
+ implements ExrPxr24Compressor {
+ InternalExrPxr24Compressor(
+ ExrPart header, this._maxScanLineSize, this._numScanLines)
+ : super(header as InternalExrPart);
int numScanLines() => _numScanLines;
- Uint8List compress(InputBuffer inPtr, int x, int y,
- [int width, int height]) {
+ Uint8List compress(InputBuffer inPtr, int x, int y, [int width, int height]) {
throw new ImageException('Pxr24 compression not yet supported.');
}
Uint8List uncompress(InputBuffer inPtr, int x, int y,
- [int width, int height]) {
+ [int width, int height]) {
List<int> data = _zlib.decodeBytes(inPtr.toUint8List());
if (data == null) {
throw new ImageException('Error decoding pxr24 compressed data');
@@ -67,7 +68,6 @@
int numChannels = header.channels.length;
for (int yi = minY; yi <= maxY; ++yi) {
-
for (int ci = 0; ci < numChannels; ++ci) {
ExrChannel ch = header.channels[ci];
if ((y % ch.ySampling) != 0) {
@@ -85,8 +85,8 @@
tmpEnd = ptr[2] + n;
for (int j = 0; j < n; ++j) {
int diff = (data[ptr[0]++] << 24) |
- (data[ptr[1]++] << 16) |
- (data[ptr[2]++] << 8);
+ (data[ptr[1]++] << 16) |
+ (data[ptr[2]++] << 8);
pixel[0] += diff;
for (int k = 0; k < 4; ++k) {
_output.writeByte(pixelBytes[k]);
@@ -113,8 +113,8 @@
tmpEnd = ptr[2] + n;
for (int j = 0; j < n; ++j) {
int diff = (data[ptr[0]++] << 24) |
- (data[ptr[1]++] << 16) |
- (data[ptr[2]++] << 8);
+ (data[ptr[1]++] << 16) |
+ (data[ptr[2]++] << 8);
pixel[0] += diff;
for (int k = 0; k < 4; ++k) {
_output.writeByte(pixelBytes[k]);
@@ -125,7 +125,7 @@
}
}
- return _output.getBytes();
+ return _output.getBytes() as Uint8List;
}
ZLibDecoder _zlib = ZLibDecoder();
diff --git a/image/lib/src/formats/exr/exr_rle_compressor.dart b/image/lib/src/formats/exr/exr_rle_compressor.dart
index 3b537da..b5012a9 100755
--- a/image/lib/src/formats/exr/exr_rle_compressor.dart
+++ b/image/lib/src/formats/exr/exr_rle_compressor.dart
@@ -7,23 +7,23 @@
import 'exr_part.dart';
abstract class ExrRleCompressor extends ExrCompressor {
- factory ExrRleCompressor(ExrPart header, int maxScanLineSize) = InternalExrRleCompressor;
+ factory ExrRleCompressor(ExrPart header, int maxScanLineSize) =
+ InternalExrRleCompressor;
}
-class InternalExrRleCompressor extends InternalExrCompressor implements ExrRleCompressor {
- InternalExrRleCompressor(ExrPart header, int maxScanLineSize) :
- super(header) {
- }
+class InternalExrRleCompressor extends InternalExrCompressor
+ implements ExrRleCompressor {
+ InternalExrRleCompressor(ExrPart header, int maxScanLineSize)
+ : super(header as InternalExrPart);
int numScanLines() => 1;
- Uint8List compress(InputBuffer inPtr, int x, int y,
- [int width, int height]) {
+ Uint8List compress(InputBuffer inPtr, int x, int y, [int width, int height]) {
throw new ImageException('Rle compression not yet supported.');
}
Uint8List uncompress(InputBuffer inPtr, int x, int y,
- [int width, int height]) {
+ [int width, int height]) {
OutputBuffer out = OutputBuffer(size: inPtr.length * 2);
if (width == null) {
@@ -63,7 +63,7 @@
}
}
- Uint8List data = out.getBytes();
+ Uint8List data = out.getBytes() as Uint8List;
// Predictor
for (int i = 1, len = data.length; i < len; ++i) {
diff --git a/image/lib/src/formats/exr/exr_wavelet.dart b/image/lib/src/formats/exr/exr_wavelet.dart
index 407daf3..897ed04 100755
--- a/image/lib/src/formats/exr/exr_wavelet.dart
+++ b/image/lib/src/formats/exr/exr_wavelet.dart
@@ -3,8 +3,8 @@
import '../../internal/bit_operators.dart';
class ExrWavelet {
- static void decode(Uint16List input, int si, int nx, int ox, int ny, int oy,
- int mx) {
+ static void decode(
+ Uint16List input, int si, int nx, int ox, int ny, int oy, int mx) {
bool w14 = (mx < (1 << 14));
int n = (nx > ny) ? ny : nx;
int p = 1;
@@ -38,8 +38,8 @@
// X loop
for (; px <= ex; px += ox2) {
- int p01 = px + ox1;
- int p10 = px + oy1;
+ int p01 = px + ox1;
+ int p10 = px + oy1;
int p11 = p10 + ox1;
// 2D wavelet decoding
@@ -60,7 +60,7 @@
input[p10] = a_b[0];
input[p11] = a_b[1];
} else {
- wdec16(input[px], input[p10], a_b);
+ wdec16(input[px], input[p10], a_b);
i00 = a_b[0];
i10 = a_b[1];
@@ -104,7 +104,7 @@
for (; px <= ex; px += ox2) {
int p01 = px + ox1;
- if (w14 != 0) {
+ if (w14) {
wdec14(input[px], input[p01], a_b);
i00 = a_b[0];
input[p01] = a_b[1];
@@ -125,9 +125,9 @@
}
static const int NBITS = 16;
- static const int A_OFFSET = 1 << (NBITS - 1);
- static const int M_OFFSET = 1 << (NBITS - 1);
- static const int MOD_MASK = (1 << NBITS) - 1;
+ static const int A_OFFSET = 1 << (NBITS - 1);
+ static const int M_OFFSET = 1 << (NBITS - 1);
+ static const int MOD_MASK = (1 << NBITS) - 1;
static void wdec14(int l, int h, List<int> a_b) {
int ls = uint16ToInt16(l);
diff --git a/image/lib/src/formats/exr/exr_zip_compressor.dart b/image/lib/src/formats/exr/exr_zip_compressor.dart
index 085aaf9..fda727e 100755
--- a/image/lib/src/formats/exr/exr_zip_compressor.dart
+++ b/image/lib/src/formats/exr/exr_zip_compressor.dart
@@ -8,27 +8,28 @@
import 'exr_part.dart';
abstract class ExrZipCompressor extends ExrCompressor {
- factory ExrZipCompressor(ExrPart header, int maxScanLineSize,
- int numScanLines) = InternalExrZipCompressor;
+ factory ExrZipCompressor(
+ ExrPart header, int maxScanLineSize, int numScanLines) =
+ InternalExrZipCompressor;
}
-class InternalExrZipCompressor extends InternalExrCompressor implements ExrZipCompressor {
+class InternalExrZipCompressor extends InternalExrCompressor
+ implements ExrZipCompressor {
ZLibDecoder zlib = ZLibDecoder();
- InternalExrZipCompressor(ExrPart header, int maxScanLineSize, this._numScanLines) :
- super(header) {
- }
+ InternalExrZipCompressor(
+ ExrPart header, int maxScanLineSize, this._numScanLines)
+ : super(header as InternalExrPart);
int numScanLines() => _numScanLines;
- Uint8List compress(InputBuffer input, int x, int y,
- [int width, int height]) {
+ Uint8List compress(InputBuffer input, int x, int y, [int width, int height]) {
throw new ImageException('Zip compression not yet supported');
}
Uint8List uncompress(InputBuffer input, int x, int y,
- [int width, int height]) {
- Uint8List data = zlib.decodeBytes(input.toUint8List());
+ [int width, int height]) {
+ var data = zlib.decodeBytes(input.toUint8List());
if (width == null) {
width = header.width;
diff --git a/image/lib/src/formats/exr_decoder.dart b/image/lib/src/formats/exr_decoder.dart
index ef5dc4c..0bd64e4 100755
--- a/image/lib/src/formats/exr_decoder.dart
+++ b/image/lib/src/formats/exr_decoder.dart
@@ -6,27 +6,26 @@
import 'decoder.dart';
import 'exr/exr_image.dart';
-/**
- * Decode an OpenEXR formatted image.
- *
- * OpenEXR is a format developed by Industrial Light & Magic, with collaboration
- * from other companies such as Weta and Pixar, for storing hight dynamic
- * range (HDR) images for use in digital visual effects production. It supports
- * a wide range of features, including 16-bit or 32-bit floating-point channels;
- * lossless and lossy data compression; arbitrary image channels for storing
- * any combination of data, such as red, green, blue, alpha, luminance and
- * chroma channels, depth, surface normal, motion vectors, etc. It can also
- * store images in scanline or tiled format; multiple views for stereo images;
- * multiple parts; etc.
- *
- * Because OpenEXR is a high-dynamic-range (HDR) format, it must be converted
- * to a low-dynamic-range (LDR) image for display, or for use as an OpenGL
- * texture (for example). This process is called tone-mapping. Currently only
- * a simple tone-mapping function is provided with a single [exposure]
- * parameter. More tone-mapping functionality will be added.
- */
+/// Decode an OpenEXR formatted image.
+///
+/// OpenEXR is a format developed by Industrial Light & Magic, with collaboration
+/// from other companies such as Weta and Pixar, for storing hight dynamic
+/// range (HDR) images for use in digital visual effects production. It supports
+/// a wide range of features, including 16-bit or 32-bit floating-point channels;
+/// lossless and lossy data compression; arbitrary image channels for storing
+/// any combination of data, such as red, green, blue, alpha, luminance and
+/// chroma channels, depth, surface normal, motion vectors, etc. It can also
+/// store images in scanline or tiled format; multiple views for stereo images;
+/// multiple parts; etc.
+///
+/// Because OpenEXR is a high-dynamic-range (HDR) format, it must be converted
+/// to a low-dynamic-range (LDR) image for display, or for use as an OpenGL
+/// texture (for example). This process is called tone-mapping. Currently only
+/// a simple tone-mapping function is provided with a single [exposure]
+/// parameter. More tone-mapping functionality will be added.
class ExrDecoder extends Decoder {
ExrImage exrImage;
+
/// Exposure for tone-mapping the hdr image to an [Image], applied during
/// [decodeFrame].
double exposure;
@@ -35,7 +34,7 @@
double bloomAmount;
double bloomRadius;
- ExrDecoder({this.exposure: 1.0});
+ ExrDecoder({this.exposure = 1.0});
bool isValidFile(List<int> data) {
return ExrImage.isValidFile(data);
@@ -53,8 +52,7 @@
return null;
}
- return hdrToImage(exrImage.getPart(frame).framebuffer,
- exposure: exposure);
+ return hdrToImage(exrImage.getPart(frame).framebuffer, exposure: exposure);
}
HdrImage decodeHdrFrame(int frame) {
@@ -67,7 +65,7 @@
return exrImage.parts[frame].framebuffer;
}
- Image decodeImage(List<int> bytes, {int frame: 0}) {
+ Image decodeImage(List<int> bytes, {int frame = 0}) {
if (startDecode(bytes) == null) {
return null;
}
@@ -75,7 +73,7 @@
return decodeFrame(frame);
}
- HdrImage decodeHdrImage(List<int> bytes, {int frame: 0}) {
+ HdrImage decodeHdrImage(List<int> bytes, {int frame = 0}) {
if (startDecode(bytes) == null) {
return null;
}
diff --git a/image/lib/src/formats/formats.dart b/image/lib/src/formats/formats.dart
index 611864e..59b938e 100755
--- a/image/lib/src/formats/formats.dart
+++ b/image/lib/src/formats/formats.dart
@@ -17,10 +17,8 @@
import 'tiff_decoder.dart';
import 'webp_decoder.dart';
-/**
- * Find a [Decoder] that is able to decode the given image [data].
- * Use this is you don't know the type of image it is.
- */
+/// Find a [Decoder] that is able to decode the given image [data].
+/// Use this is you don't know the type of image it is.
Decoder findDecoderForData(List<int> data) {
// The various decoders will be creating a Uint8List for their InputStream
// if the data isn't already that type, so do it once here to avoid having to
@@ -65,10 +63,8 @@
return null;
}
-/**
- * Decode the given image file bytes by first identifying the format of the
- * file and using that decoder to decode the file into a single frame [Image].
- */
+/// Decode the given image file bytes by first identifying the format of the
+/// file and using that decoder to decode the file into a single frame [Image].
Image decodeImage(List<int> data) {
Decoder decoder = findDecoderForData(data);
if (decoder == null) {
@@ -77,11 +73,9 @@
return decoder.decodeImage(data);
}
-/**
- * Decode the given image file bytes by first identifying the format of the
- * file and using that decoder to decode the file into an [Animation]
- * containing one or more [Image] frames.
- */
+/// Decode the given image file bytes by first identifying the format of the
+/// file and using that decoder to decode the file into an [Animation]
+/// containing one or more [Image] frames.
Animation decodeAnimation(List<int> data) {
Decoder decoder = findDecoderForData(data);
if (decoder == null) {
@@ -90,11 +84,9 @@
return decoder.decodeAnimation(data);
}
-/**
- * Return the [Decoder] that can decode image with the given [name],
- * by looking at the file extension. See also [findDecoderForData] to
- * determine the decoder to use given the bytes of the file.
- */
+/// Return the [Decoder] that can decode image with the given [name],
+/// by looking at the file extension. See also [findDecoderForData] to
+/// determine the decoder to use given the bytes of the file.
Decoder getDecoderForNamedImage(String name) {
String n = name.toLowerCase();
if (n.endsWith('.jpg') || n.endsWith('.jpeg')) {
@@ -124,11 +116,9 @@
return null;
}
-/**
- * Identify the format of the image using the file extension of the given
- * [name], and decode the given file [bytes] to an [Animation] with one or more
- * [Image] frames. See also [decodeAnimation].
- */
+/// Identify the format of the image using the file extension of the given
+/// [name], and decode the given file [bytes] to an [Animation] with one or more
+/// [Image] frames. See also [decodeAnimation].
Animation decodeNamedAnimation(List<int> bytes, String name) {
Decoder decoder = getDecoderForNamedImage(name);
if (decoder == null) {
@@ -137,11 +127,9 @@
return decoder.decodeAnimation(bytes);
}
-/**
- * Identify the format of the image using the file extension of the given
- * [name], and decode the given file [bytes] to a single frame [Image]. See
- * also [decodeImage].
- */
+/// Identify the format of the image using the file extension of the given
+/// [name], and decode the given file [bytes] to a single frame [Image]. See
+/// also [decodeImage].
Image decodeNamedImage(List<int> bytes, String name) {
Decoder decoder = getDecoderForNamedImage(name);
if (decoder == null) {
@@ -150,10 +138,8 @@
return decoder.decodeImage(bytes);
}
-/**
- * Identify the format of the image and encode it with the appropriate
- * [Encoder].
- */
+/// Identify the format of the image and encode it with the appropriate
+/// [Encoder].
List<int> encodeNamedImage(Image image, String name) {
String n = name.toLowerCase();
if (n.endsWith('.jpg') || n.endsWith('.jpeg')) {
@@ -171,167 +157,117 @@
return null;
}
-/**
- * Decode a JPG formatted image.
- */
-Image decodeJpg(List<int> bytes) {
+/// Decode a JPG formatted image.
+Image decodeJpg(List<int> bytes) {
return new JpegDecoder().decodeImage(bytes);
}
-/**
- * Renamed to [decodeJpg], left for backward compatibility.
- */
+/// Renamed to [decodeJpg], left for backward compatibility.
Image readJpg(List<int> bytes) => decodeJpg(bytes);
-
-/**
- * Encode an image to the JPEG format.
- */
-List<int> encodeJpg(Image image, {int quality: 100}) {
+/// Encode an image to the JPEG format.
+List<int> encodeJpg(Image image, {int quality = 100}) {
return new JpegEncoder(quality: quality).encodeImage(image);
}
-/**
- * Renamed to [encodeJpg], left for backward compatibility.
- */
-List<int> writeJpg(Image image, {int quality: 100}) =>
- encodeJpg(image, quality: quality);
+/// Renamed to [encodeJpg], left for backward compatibility.
+List<int> writeJpg(Image image, {int quality = 100}) =>
+ encodeJpg(image, quality: quality);
-
-/**
- * Decode a PNG formatted image.
- */
+/// Decode a PNG formatted image.
Image decodePng(List<int> bytes) {
return new PngDecoder().decodeImage(bytes);
}
-/**
- * Decode a PNG formatted animation.
- */
+/// Decode a PNG formatted animation.
Animation decodePngAnimation(List<int> bytes) {
return new PngDecoder().decodeAnimation(bytes);
}
-/**
- * Renamed to [decodePng], left for backward compatibility.
- */
+/// Renamed to [decodePng], left for backward compatibility.
Image readPng(List<int> bytes) => decodePng(bytes);
-/**
- * Encode an image to the PNG format.
- */
-List<int> encodePng(Image image, {int level: 6}) {
+/// Encode an image to the PNG format.
+List<int> encodePng(Image image, {int level = 6}) {
return new PngEncoder(level: level).encodeImage(image);
}
-/**
- * Encode an animation to the PNG format.
- */
-List<int> encodePngAnimation(Animation anim, {int level: 6}) {
+/// Encode an animation to the PNG format.
+List<int> encodePngAnimation(Animation anim, {int level = 6}) {
return new PngEncoder(level: level).encodeAnimation(anim);
}
-/**
- * Renamed to [encodePng], left for backward compatibility.
- */
-List<int> writePng(Image image, {int level: 6}) =>
+/// Renamed to [encodePng], left for backward compatibility.
+List<int> writePng(Image image, {int level = 6}) =>
encodePng(image, level: level);
-/**
- * Decode a Targa formatted image.
- */
+/// Decode a Targa formatted image.
Image decodeTga(List<int> bytes) {
return new TgaDecoder().decodeImage(bytes);
}
-/**
- * Renamed to [decodeTga], left for backward compatibility.
- */
+/// Renamed to [decodeTga], left for backward compatibility.
Image readTga(List<int> bytes) => decodeTga(bytes);
-/**
- * Encode an image to the Targa format.
- */
+/// Encode an image to the Targa format.
List<int> encodeTga(Image image) {
return new TgaEncoder().encodeImage(image);
}
-/**
- * Renamed to [encodeTga], left for backward compatibility.
- */
+/// Renamed to [encodeTga], left for backward compatibility.
List<int> writeTga(Image image) => encodeTga(image);
-/**
- * Decode a WebP formatted image (first frame for animations).
- */
+/// Decode a WebP formatted image (first frame for animations).
Image decodeWebP(List<int> bytes) {
return new WebPDecoder().decodeImage(bytes);
}
-/**
- * Decode an animated WebP file. If the webp isn't animated, the animation
- * will contain a single frame with the webp's image.
- */
+/// Decode an animated WebP file. If the webp isn't animated, the animation
+/// will contain a single frame with the webp's image.
Animation decodeWebPAnimation(List<int> bytes) {
return new WebPDecoder().decodeAnimation(bytes);
}
-/**
- * Decode a GIF formatted image (first frame for animations).
- */
+/// Decode a GIF formatted image (first frame for animations).
Image decodeGif(List<int> bytes) {
return new GifDecoder().decodeImage(bytes);
}
-/**
- * Decode an animated GIF file. If the gif isn't animated, the animation
- * will contain a single frame with the gif's image.
- */
+/// Decode an animated GIF file. If the gif isn't animated, the animation
+/// will contain a single frame with the gif's image.
Animation decodeGifAnimation(List<int> bytes) {
return new GifDecoder().decodeAnimation(bytes);
}
-/**
- * Encode an image to the GIF format.
- */
+/// Encode an image to the GIF format.
List<int> encodeGif(Image image) {
return new GifEncoder().encodeImage(image);
}
-/**
- * Encode an animation to the GIF format.
- */
+/// Encode an animation to the GIF format.
List<int> encodeGifAnimation(Animation anim) {
return new GifEncoder().encodeAnimation(anim);
}
-/**
- * Decode a TIFF formatted image.
- */
+/// Decode a TIFF formatted image.
Image decodeTiff(List<int> bytes) {
return new TiffDecoder().decodeImage(bytes);
}
-/**
- * Decode an multi-image (animated) TIFF file. If the tiff doesn't have
- * multiple images, the animation will contain a single frame with the tiff's
- * image.
- */
+/// Decode an multi-image (animated) TIFF file. If the tiff doesn't have
+/// multiple images, the animation will contain a single frame with the tiff's
+/// image.
Animation decodeTiffAnimation(List<int> bytes) {
return new TiffDecoder().decodeAnimation(bytes);
}
-/**
- * Decode a Photoshop PSD formatted image.
- */
+/// Decode a Photoshop PSD formatted image.
Image decodePsd(List<int> bytes) {
return new PsdDecoder().decodeImage(bytes);
}
-/**
- * Decode an OpenEXR formatted image, tone-mapped using the
- * given [exposure] to a low-dynamic-range [Image].
- */
-Image decodeExr(List<int> bytes, {double exposure: 1.0}) {
+/// Decode an OpenEXR formatted image, tone-mapped using the
+/// given [exposure] to a low-dynamic-range [Image].
+Image decodeExr(List<int> bytes, {double exposure = 1.0}) {
return new ExrDecoder(exposure: exposure).decodeImage(bytes);
}
diff --git a/image/lib/src/formats/gif/gif_color_map.dart b/image/lib/src/formats/gif/gif_color_map.dart
index 5325a42..e7bb341 100755
--- a/image/lib/src/formats/gif/gif_color_map.dart
+++ b/image/lib/src/formats/gif/gif_color_map.dart
@@ -8,15 +8,15 @@
int transparent;
final Uint8List colors;
- GifColorMap(int numColors) :
- this.numColors = numColors,
- colors = Uint8List(numColors * 3) {
+ GifColorMap(int numColors)
+ : this.numColors = numColors,
+ colors = Uint8List(numColors * 3) {
bitsPerPixel = _bitSize(numColors);
}
- int operator[](int index) => colors[index];
+ int operator [](int index) => colors[index];
- operator[]=(int index, int value) => colors[index] = value;
+ operator []=(int index, int value) => colors[index] = value;
int color(int index) {
int ci = index * 3;
diff --git a/image/lib/src/formats/gif/gif_image_desc.dart b/image/lib/src/formats/gif/gif_image_desc.dart
index c4b0b88..28e48fc 100755
--- a/image/lib/src/formats/gif/gif_image_desc.dart
+++ b/image/lib/src/formats/gif/gif_image_desc.dart
@@ -28,8 +28,8 @@
colorMap = GifColorMap(1 << bitsPerPixel);
for (int i = 0; i < colorMap.numColors; ++i) {
- colorMap.setColor(i, input.readByte(), input.readByte(),
- input.readByte());
+ colorMap.setColor(
+ i, input.readByte(), input.readByte(), input.readByte());
}
}
diff --git a/image/lib/src/formats/gif_decoder.dart b/image/lib/src/formats/gif_decoder.dart
index 57d9f78..df341c8 100755
--- a/image/lib/src/formats/gif_decoder.dart
+++ b/image/lib/src/formats/gif_decoder.dart
@@ -9,10 +9,8 @@
import 'gif/gif_image_desc.dart';
import 'gif/gif_info.dart';
-/**
- * A decoder for the GIF image format. This supports both single frame and
- * animated GIF files, and transparency.
- */
+/// A decoder for the GIF image format. This supports both single frame and
+/// animated GIF files, and transparency.
class GifDecoder extends Decoder {
GifInfo info;
@@ -22,27 +20,21 @@
}
}
- /**
- * Is the given file a valid Gif image?
- */
+ /// Is the given file a valid Gif image?
bool isValidFile(List<int> bytes) {
_input = InputBuffer(bytes);
info = GifInfo();
return _getInfo();
}
- /**
- * How many frames are available to decode?
- *
- * You should have prepared the decoder by either passing the file bytes
- * to the constructor, or calling getInfo.
- */
+ /// How many frames are available to decode?
+ ///
+ /// You should have prepared the decoder by either passing the file bytes
+ /// to the constructor, or calling getInfo.
int numFrames() => (info != null) ? info.numFrames : 0;
- /**
- * Validate the file is a Gif image and get information about it.
- * If the file is not a valid Gif image, null is returned.
- */
+ /// Validate the file is a Gif image and get information about it.
+ /// If the file is not a valid Gif image, null is returned.
GifInfo startDecode(List<int> bytes) {
_input = InputBuffer(bytes);
@@ -80,6 +72,7 @@
}
}
} catch (error) {
+ print(error);
}
//_numFrames = info.numFrames;
@@ -87,7 +80,7 @@
}
void _readApplicationExt(InputBuffer _input) {
- int blockSize = _input.readByte();
+ int blockSize = _input.readByte();
String tag = _input.readString(blockSize);
if (tag == "NETSCAPE2.0") {
int b1 = _input.readByte();
@@ -101,7 +94,7 @@
}
void _readGraphicsControlExt(InputBuffer _input) {
- /*int blockSize =*/ _input.readByte();
+ /*int blockSize =*/ _input.readByte();
int b = _input.readByte();
int duration = _input.readUint16();
int transparent = _input.readByte();
@@ -143,13 +136,13 @@
}
//_frame = frame;
- InternalGifImageDesc gifImage = info.frames[frame];
+ InternalGifImageDesc gifImage = info.frames[frame] as InternalGifImageDesc;
_input.offset = gifImage.inputPosition;
return _decodeImage(info.frames[frame]);
}
- Image decodeImage(List<int> bytes, {int frame: 0}) {
+ Image decodeImage(List<int> bytes, {int frame = 0}) {
if (startDecode(bytes) == null) {
return null;
}
@@ -158,10 +151,8 @@
return decodeFrame(frame);
}
- /**
- * Decode all of the frames of an animated gif. For single image gifs,
- * this will return an animation with a single frame.
- */
+ /// Decode all of the frames of an animated gif. For single image gifs,
+ /// this will return an animation with a single frame.
Animation decodeAnimation(List<int> bytes) {
if (startDecode(bytes) == null) {
return null;
@@ -187,9 +178,8 @@
return null;
}
- GifColorMap colorMap = (frame.colorMap != null) ?
- frame.colorMap :
- info.globalColorMap;
+ GifColorMap colorMap =
+ (frame.colorMap != null) ? frame.colorMap : info.globalColorMap;
if (lastImage != null) {
if (frame.clearFrame) {
@@ -248,14 +238,12 @@
int width = gifImage.width;
int height = gifImage.height;
- if (gifImage.x + width > info.width ||
- gifImage.y + height > info.height) {
+ if (gifImage.x + width > info.width || gifImage.y + height > info.height) {
return null;
}
- GifColorMap colorMap = (gifImage.colorMap != null) ?
- gifImage.colorMap :
- info.globalColorMap;
+ GifColorMap colorMap =
+ (gifImage.colorMap != null) ? gifImage.colorMap : info.globalColorMap;
_pixelCount = width * height;
@@ -265,8 +253,9 @@
if (gifImage.interlaced) {
int row = gifImage.y;
for (int i = 0, j = 0; i < 4; ++i) {
- for (int y = row + INTERLACED_OFFSET[i]; y < row + height;
- y += INTERLACED_JUMP[i], ++j) {
+ for (int y = row + INTERLACED_OFFSET[i];
+ y < row + height;
+ y += INTERLACED_JUMP[i], ++j) {
if (!_getLine(line)) {
return image;
}
@@ -285,8 +274,7 @@
return image;
}
- void _updateImage(Image image, int y, GifColorMap colorMap,
- Uint8List line) {
+ void _updateImage(Image image, int y, GifColorMap colorMap, Uint8List line) {
if (colorMap != null) {
for (int x = 0, width = line.length; x < width; ++x) {
image.setPixel(x, y, colorMap.color(line[x]));
@@ -345,11 +333,9 @@
return true;
}
- /**
- * Continue to get the image code in compressed form. This routine should be
- * called until NULL block is returned.
- * The block should NOT be freed by the user (not dynamically allocated).
- */
+ /// Continue to get the image code in compressed form. This routine should be
+ /// called until NULL block is returned.
+ /// The block should NOT be freed by the user (not dynamically allocated).
bool _skipRemainder() {
if (_input.isEOS) {
return true;
@@ -365,12 +351,10 @@
return true;
}
- /**
- * The LZ decompression routine:
- * This version decompress the given gif file into Line of length LineLen.
- * This routine can be called few times (one per scan line, for example), in
- * order the complete the whole image.
- */
+ /// The LZ decompression routine:
+ /// This version decompress the given gif file into Line of length LineLen.
+ /// This routine can be called few times (one per scan line, for example), in
+ /// order the complete the whole image.
bool _decompressLine(Uint8List line) {
if (_stackPtr > LZ_MAX_CODE) {
return false;
@@ -380,7 +364,7 @@
int i = 0;
if (_stackPtr != 0) {
- // Let pop the stack off before continueing to read the gif file:
+ // Let pop the stack off before continuing to read the gif file:
while (_stackPtr != 0 && i < lineLen) {
line[i++] = _stack[--_stackPtr];
}
@@ -431,10 +415,8 @@
// exactly the prefix of last code!
if (_currentCode == _runningCode - 2) {
currentPrefix = _lastCode;
- _suffix[_runningCode - 2] =
- _stack[_stackPtr++] = _getPrefixChar(_prefix,
- _lastCode,
- _clearCode);
+ _suffix[_runningCode - 2] = _stack[_stackPtr++] =
+ _getPrefixChar(_prefix, _lastCode, _clearCode);
} else {
return false;
}
@@ -449,7 +431,8 @@
// loop more than that.
int j = 0;
while (j++ <= LZ_MAX_CODE &&
- currentPrefix > _clearCode && currentPrefix <= LZ_MAX_CODE) {
+ currentPrefix > _clearCode &&
+ currentPrefix <= LZ_MAX_CODE) {
_stack[_stackPtr++] = _suffix[currentPrefix];
currentPrefix = _prefix[currentPrefix];
}
@@ -477,10 +460,10 @@
// prefix code is last code and the suffix char is
// exactly the prefix of last code!
_suffix[_runningCode - 2] =
- _getPrefixChar(_prefix, _lastCode, _clearCode);
+ _getPrefixChar(_prefix, _lastCode, _clearCode);
} else {
_suffix[_runningCode - 2] =
- _getPrefixChar(_prefix, _currentCode, _clearCode);
+ _getPrefixChar(_prefix, _currentCode, _clearCode);
}
}
@@ -491,11 +474,9 @@
return true;
}
- /**
- * The LZ decompression input routine:
- * This routine is responsible for the decompression of the bit stream from
- * 8 bits (bytes) packets, into the real codes.
- */
+ /// The LZ decompression input routine:
+ /// This routine is responsible for the decompression of the bit stream from
+ /// 8 bits (bytes) packets, into the real codes.
int _decompressInput() {
int code;
@@ -521,7 +502,8 @@
// however that codes above 4095 are used for special signaling.
// If we're using LZ_BITS bits already and we're at the max code, just
// keep using the table as it is, don't increment Private->RunningCode.
- if (_runningCode < LZ_MAX_CODE + 2 && ++_runningCode > _maxCode1 &&
+ if (_runningCode < LZ_MAX_CODE + 2 &&
+ ++_runningCode > _maxCode1 &&
_runningBits < LZ_BITS) {
_maxCode1 <<= 1;
_runningBits++;
@@ -530,12 +512,10 @@
return code;
}
- /**
- * Routine to trace the Prefixes linked list until we get a prefix which is
- * not code, but a pixel value (less than ClearCode). Returns that pixel value.
- * If image is defective, we might loop here forever, so we limit the loops to
- * the maximum possible if image O.k. - LZ_MAX_CODE times.
- */
+ /// Routine to trace the Prefixes linked list until we get a prefix which is
+ /// not code, but a pixel value (less than ClearCode). Returns that pixel value.
+ /// If image is defective, we might loop here forever, so we limit the loops to
+ /// the maximum possible if image O.k. - LZ_MAX_CODE times.
int _getPrefixChar(Uint32List prefix, int code, int clearCode) {
int i = 0;
while (code > clearCode && i++ <= LZ_MAX_CODE) {
@@ -547,12 +527,10 @@
return code;
}
- /**
- * This routines read one gif data block at a time and buffers it internally
- * so that the decompression routine could access it.
- * The routine returns the next byte from its internal buffer (or read next
- * block in if buffer empty) and returns null on failure.
- */
+ /// This routines read one gif data block at a time and buffers it internally
+ /// so that the decompression routine could access it.
+ /// The routine returns the next byte from its internal buffer (or read next
+ /// block in if buffer empty) and returns null on failure.
int _bufferedInput() {
int nextByte;
if (_buffer[0] == 0) {
@@ -566,8 +544,8 @@
return null;
}
- _buffer.setRange(1, 1 + _buffer[0],
- _input.readBytes(_buffer[0]).toUint8List());
+ _buffer.setRange(
+ 1, 1 + _buffer[0], _input.readBytes(_buffer[0]).toUint8List());
nextByte = _buffer[1];
_buffer[1] = 2; // We use now the second place as last char read!
@@ -622,14 +600,24 @@
static const int LZ_MAX_CODE = 4095;
static const int LZ_BITS = 12;
- static const int NO_SUCH_CODE = 4098; // Impossible code, to signal empty.
+ static const int NO_SUCH_CODE = 4098; // Impossible code, to signal empty.
static const List<int> CODE_MASKS = const [
- 0x0000, 0x0001, 0x0003, 0x0007,
- 0x000f, 0x001f, 0x003f, 0x007f,
- 0x00ff, 0x01ff, 0x03ff, 0x07ff,
- 0x0fff];
+ 0x0000,
+ 0x0001,
+ 0x0003,
+ 0x0007,
+ 0x000f,
+ 0x001f,
+ 0x003f,
+ 0x007f,
+ 0x00ff,
+ 0x01ff,
+ 0x03ff,
+ 0x07ff,
+ 0x0fff
+ ];
- static const List<int> INTERLACED_OFFSET = const [ 0, 4, 2, 1 ];
- static const List<int> INTERLACED_JUMP = const [ 8, 8, 4, 2 ];
+ static const List<int> INTERLACED_OFFSET = const [0, 4, 2, 1];
+ static const List<int> INTERLACED_JUMP = const [8, 8, 4, 2];
}
diff --git a/image/lib/src/formats/gif_encoder.dart b/image/lib/src/formats/gif_encoder.dart
index bc19f6e..d871244 100755
--- a/image/lib/src/formats/gif_encoder.dart
+++ b/image/lib/src/formats/gif_encoder.dart
@@ -6,12 +6,8 @@
import '../util/output_buffer.dart';
import 'encoder.dart';
-/**
- *
- */
class GifEncoder extends Encoder {
- GifEncoder({this.delay: 80}) :
- _encodedFrames = 0;
+ GifEncoder({this.delay = 80}) : _encodedFrames = 0;
void addFrame(Image image, {int duration}) {
if (output == null) {
@@ -42,9 +38,7 @@
_lastImage = _lastColorMap.getIndexMap(image);
}
- /**
- * Encode the images that were added with [addFrame].
- */
+ /// Encode the images that were added with [addFrame].
List<int> finish() {
List<int> bytes;
if (output == null) {
@@ -71,22 +65,16 @@
return bytes;
}
- /**
- * Encode a single frame image.
- */
+ /// Encode a single frame image.
List<int> encodeImage(Image image) {
addFrame(image);
return finish();
}
- /**
- * Does this encoder support animation?
- */
+ /// Does this encoder support animation?
bool get supportsAnimation => true;
- /**
- * Encode an animation.
- */
+ /// Encode an animation.
List<int> encodeAnimation(Animation anim) {
repeat = anim.loopCount;
for (Image f in anim) {
@@ -95,8 +83,8 @@
return finish();
}
- void _addImage(Uint8List image, int width, int height,
- Uint8List colorMap, int numColors) {
+ void _addImage(Uint8List image, int width, int height, Uint8List colorMap,
+ int numColors) {
// Image desc
output.writeByte(IMAGE_DESC_RECORD_TYPE);
output.writeUint16(0); // image position x,y = 0,0
@@ -139,7 +127,6 @@
_clearFlag = false;
_freeEnt = _clearCode + 2;
-
int _nextPixel() {
if (remaining == 0) {
return EOF;
@@ -176,7 +163,8 @@
ent = codeTab[i];
c = _nextPixel();
continue;
- } else if (hTab[i] >= 0) { // non-empty slot
+ } else if (hTab[i] >= 0) {
+ // non-empty slot
int disp = hSizeReg - i; // secondary hash (after G. Knott)
if (i == 0) {
disp = 1;
@@ -301,19 +289,17 @@
int dispose = 0; // dispose = no action
// packed fields
- output.writeByte(0 | // 1:3 reserved
- dispose | // 4:6 disposal
- 0 | // 7 user input - 0 = none
- transparency); // 8 transparency flag
+ output.writeByte(0 | // 1:3 reserved
+ dispose | // 4:6 disposal
+ 0 | // 7 user input - 0 = none
+ transparency); // 8 transparency flag
output.writeUint16(delay); // delay x 1/100 sec
output.writeByte(0); // transparent color index
output.writeByte(0); // block terminator
}
- /**
- * GIF header and Logical Screen Descriptor
- */
+ /// GIF header and Logical Screen Descriptor
void _writeHeader(int width, int height) {
output.writeBytes(GIF89_STAMP.codeUnits);
output.writeUint16(width);
@@ -360,7 +346,22 @@
static const int BITS = 12;
static const int HSIZE = 5003; // 80% occupancy
static const List<int> MASKS = const [
- 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F,
- 0x003F, 0x007F, 0x00FF, 0x01FF, 0x03FF, 0x07FF,
- 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF];
+ 0x0000,
+ 0x0001,
+ 0x0003,
+ 0x0007,
+ 0x000F,
+ 0x001F,
+ 0x003F,
+ 0x007F,
+ 0x00FF,
+ 0x01FF,
+ 0x03FF,
+ 0x07FF,
+ 0x0FFF,
+ 0x1FFF,
+ 0x3FFF,
+ 0x7FFF,
+ 0xFFFF
+ ];
}
diff --git a/image/lib/src/formats/jpeg/jpeg.dart b/image/lib/src/formats/jpeg/jpeg.dart
index 73b4da5..1a2c174 100755
--- a/image/lib/src/formats/jpeg/jpeg.dart
+++ b/image/lib/src/formats/jpeg/jpeg.dart
@@ -1,35 +1,38 @@
class Jpeg {
static const dctZigZag = const [
- 0, 1, 8, 16, 9, 2, 3, 10,
- 17, 24, 32, 25, 18, 11, 4, 5,
- 12, 19, 26, 33, 40, 48, 41, 34,
- 27, 20, 13, 6, 7, 14, 21, 28,
- 35, 42, 49, 56, 57, 50, 43, 36,
- 29, 22, 15, 23, 30, 37, 44, 51,
- 58, 59, 52, 45, 38, 31, 39, 46,
- 53, 60, 61, 54, 47, 55, 62, 63,
- 63, 63, 63, 63, 63, 63, 63, 63, // extra entries for safety in decoder
- 63, 63, 63, 63, 63, 63, 63, 63 ];
+ 0, 1, 8, 16, 9, 2, 3, 10,
+ 17, 24, 32, 25, 18, 11, 4, 5,
+ 12, 19, 26, 33, 40, 48, 41, 34,
+ 27, 20, 13, 6, 7, 14, 21, 28,
+ 35, 42, 49, 56, 57, 50, 43, 36,
+ 29, 22, 15, 23, 30, 37, 44, 51,
+ 58, 59, 52, 45, 38, 31, 39, 46,
+ 53, 60, 61, 54, 47, 55, 62, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63, // extra entries for safety in decoder
+ 63, 63, 63, 63, 63, 63, 63, 63
+ ];
static const int DCTSIZE = 8; // The basic DCT block is 8x8 samples
- static const int DCTSIZE2 = 64; // DCTSIZE squared; # of elements in a block
+ static const int DCTSIZE2 = 64; // DCTSIZE squared; # of elements in a block
static const int NUM_QUANT_TBLS = 4; // Quantization tables are numbered 0..3
static const int NUM_HUFF_TBLS = 4; // Huffman tables are numbered 0..3
- static const int NUM_ARITH_TBLS = 16; // Arith-coding tables are numbered 0..15
- static const int MAX_COMPS_IN_SCAN = 4; // JPEG limit on # of components in one scan
+ static const int NUM_ARITH_TBLS =
+ 16; // Arith-coding tables are numbered 0..15
+ static const int MAX_COMPS_IN_SCAN =
+ 4; // JPEG limit on # of components in one scan
static const int MAX_SAMP_FACTOR = 4; // JPEG limit on sampling factors
- static const int M_SOF0 = 0xc0;
- static const int M_SOF1 = 0xc1;
- static const int M_SOF2 = 0xc2;
- static const int M_SOF3 = 0xc3;
+ static const int M_SOF0 = 0xc0;
+ static const int M_SOF1 = 0xc1;
+ static const int M_SOF2 = 0xc2;
+ static const int M_SOF3 = 0xc3;
- static const int M_SOF5 = 0xc5;
- static const int M_SOF6 = 0xc6;
- static const int M_SOF7 = 0xc7;
+ static const int M_SOF5 = 0xc5;
+ static const int M_SOF6 = 0xc6;
+ static const int M_SOF7 = 0xc7;
- static const int M_JPG = 0xc8;
- static const int M_SOF9 = 0xc9;
+ static const int M_JPG = 0xc8;
+ static const int M_SOF9 = 0xc9;
static const int M_SOF10 = 0xca;
static const int M_SOF11 = 0xcb;
@@ -37,38 +40,38 @@
static const int M_SOF14 = 0xce;
static const int M_SOF15 = 0xcf;
- static const int M_DHT = 0xc4;
+ static const int M_DHT = 0xc4;
- static const int M_DAC = 0xcc;
+ static const int M_DAC = 0xcc;
- static const int M_RST0 = 0xd0;
- static const int M_RST1 = 0xd1;
- static const int M_RST2 = 0xd2;
- static const int M_RST3 = 0xd3;
- static const int M_RST4 = 0xd4;
- static const int M_RST5 = 0xd5;
- static const int M_RST6 = 0xd6;
- static const int M_RST7 = 0xd7;
+ static const int M_RST0 = 0xd0;
+ static const int M_RST1 = 0xd1;
+ static const int M_RST2 = 0xd2;
+ static const int M_RST3 = 0xd3;
+ static const int M_RST4 = 0xd4;
+ static const int M_RST5 = 0xd5;
+ static const int M_RST6 = 0xd6;
+ static const int M_RST7 = 0xd7;
- static const int M_SOI = 0xd8;
- static const int M_EOI = 0xd9;
- static const int M_SOS = 0xda;
- static const int M_DQT = 0xdb;
- static const int M_DNL = 0xdc;
- static const int M_DRI = 0xdd;
- static const int M_DHP = 0xde;
- static const int M_EXP = 0xdf;
+ static const int M_SOI = 0xd8;
+ static const int M_EOI = 0xd9;
+ static const int M_SOS = 0xda;
+ static const int M_DQT = 0xdb;
+ static const int M_DNL = 0xdc;
+ static const int M_DRI = 0xdd;
+ static const int M_DHP = 0xde;
+ static const int M_EXP = 0xdf;
- static const int M_APP0 = 0xe0; // JFIF, JFXX, CIFF, AVI1, Ocad
- static const int M_APP1 = 0xe1; // EXIF, ExtendedXMP, XMP, QVCI, FLIR
- static const int M_APP2 = 0xe2; // ICC_Profile, FPXR, MPF, PreviewImage
- static const int M_APP3 = 0xe3; // Meta, Stim, PreviewImage
- static const int M_APP4 = 0xe4; // Scalado, FPXR, PreviewImage
- static const int M_APP5 = 0xe5; // RMETA, PreviewImage
- static const int M_APP6 = 0xe6; // EPPIM, NITF, HP_TDHD, GoPro
- static const int M_APP7 = 0xe7; // Pentax, Qualcomm
- static const int M_APP8 = 0xe8; // SPIFF
- static const int M_APP9 = 0xe9; // MediaJukebox
+ static const int M_APP0 = 0xe0; // JFIF, JFXX, CIFF, AVI1, Ocad
+ static const int M_APP1 = 0xe1; // EXIF, ExtendedXMP, XMP, QVCI, FLIR
+ static const int M_APP2 = 0xe2; // ICC_Profile, FPXR, MPF, PreviewImage
+ static const int M_APP3 = 0xe3; // Meta, Stim, PreviewImage
+ static const int M_APP4 = 0xe4; // Scalado, FPXR, PreviewImage
+ static const int M_APP5 = 0xe5; // RMETA, PreviewImage
+ static const int M_APP6 = 0xe6; // EPPIM, NITF, HP_TDHD, GoPro
+ static const int M_APP7 = 0xe7; // Pentax, Qualcomm
+ static const int M_APP8 = 0xe8; // SPIFF
+ static const int M_APP9 = 0xe9; // MediaJukebox
static const int M_APP10 = 0xea; // Comment
static const int M_APP11 = 0xeb; // Jpeg-HDR
static const int M_APP12 = 0xec; // PictureInfo, Ducky
@@ -76,11 +79,11 @@
static const int M_APP14 = 0xee; // ADOBE
static const int M_APP15 = 0xef; // GraphicConverter
- static const int M_JPG0 = 0xf0;
+ static const int M_JPG0 = 0xf0;
static const int M_JPG13 = 0xfd;
- static const int M_COM = 0xfe;
+ static const int M_COM = 0xfe;
- static const int M_TEM = 0x01;
+ static const int M_TEM = 0x01;
static const int M_ERROR = 0x100;
}
diff --git a/image/lib/src/formats/jpeg/jpeg_component.dart b/image/lib/src/formats/jpeg/jpeg_component.dart
index 44b8221..0c2cb0e 100755
--- a/image/lib/src/formats/jpeg/jpeg_component.dart
+++ b/image/lib/src/formats/jpeg/jpeg_component.dart
@@ -15,6 +15,5 @@
JpegComponent(this.hSamples, this.vSamples, this.quantizationTableList,
this.quantizationIndex);
- Int16List get quantizationTable =>
- quantizationTableList[quantizationIndex];
+ Int16List get quantizationTable => quantizationTableList[quantizationIndex];
}
diff --git a/image/lib/src/formats/jpeg/jpeg_data.dart b/image/lib/src/formats/jpeg/jpeg_data.dart
index f32f91f..3c0f75b 100755
--- a/image/lib/src/formats/jpeg/jpeg_data.dart
+++ b/image/lib/src/formats/jpeg/jpeg_data.dart
@@ -12,18 +12,18 @@
import 'jpeg_jfif.dart';
import 'jpeg_scan.dart';
-class JpegData {
+class JpegData {
InputBuffer input;
JpegJfif jfif;
JpegAdobe adobe;
JpegFrame frame;
int resetInterval;
- ExifData exif = ExifData();
- final List<Int16List> quantizationTables = List(Jpeg.NUM_QUANT_TBLS);
- final List<JpegFrame> frames = [];
- final List huffmanTablesAC = [];
- final List huffmanTablesDC = [];
- final List<_ComponentData> components = [];
+ final exif = ExifData();
+ final quantizationTables = List<Int16List>(Jpeg.NUM_QUANT_TBLS);
+ final frames = List<JpegFrame>();
+ final huffmanTablesAC = List<dynamic>();
+ final huffmanTablesDC = List<dynamic>();
+ final components = List<_ComponentData>();
bool validate(List<int> bytes) {
input = InputBuffer(bytes, bigEndian: true);
@@ -37,7 +37,8 @@
bool hasSOS = false;
marker = _nextMarker();
- while (marker != Jpeg.M_EOI && !input.isEOS) { // EOI (End of image)
+ while (marker != Jpeg.M_EOI && !input.isEOS) {
+ // EOI (End of image)
_skipBlock();
switch (marker) {
case Jpeg.M_SOF0: // SOF0 (Start of Frame, Baseline DCT)
@@ -71,7 +72,8 @@
bool hasSOS = false;
marker = _nextMarker();
- while (marker != Jpeg.M_EOI && !input.isEOS) { // EOI (End of image)
+ while (marker != Jpeg.M_EOI && !input.isEOS) {
+ // EOI (End of image)
switch (marker) {
case Jpeg.M_SOF0: // SOF0 (Start of Frame, Baseline DCT)
case Jpeg.M_SOF1: // SOF1 (Start of Frame, Extended DCT)
@@ -116,9 +118,12 @@
for (int i = 0; i < frame.componentsOrder.length; ++i) {
JpegComponent component = frame.components[frame.componentsOrder[i]];
- components.add(_ComponentData(component.hSamples, frame.maxHSamples,
- component.vSamples, frame.maxVSamples,
- _buildComponentData(frame, component)));
+ components.add(_ComponentData(
+ component.hSamples,
+ frame.maxHSamples,
+ component.vSamples,
+ frame.maxVSamples,
+ _buildComponentData(frame, component)));
}
}
@@ -127,8 +132,6 @@
int get height => frame.scanLines;
Uint8List getData(int width, int height) {
- num scaleX = 1;
- num scaleY = 1;
_ComponentData component1;
_ComponentData component2;
_ComponentData component3;
@@ -295,8 +298,9 @@
K = component4Line[x4];
C = 255 - _clamp8((Y + 1.402 * (Cr - 128)).toInt());
- M = 255 - _clamp8((Y - 0.3441363 * (Cb - 128) -
- 0.71413636 * (Cr - 128)).toInt());
+ M = 255 -
+ _clamp8((Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128))
+ .toInt());
Ye = 255 - _clamp8((Y + 1.772 * (Cb - 128)).toInt());
}
@@ -316,7 +320,8 @@
void _read() {
int marker = _nextMarker();
- if (marker != Jpeg.M_SOI) { // SOI (Start of Image)
+ if (marker != Jpeg.M_SOI) {
+ // SOI (Start of Image)
throw new ImageException('Start Of Image marker not found.');
}
@@ -365,7 +370,8 @@
case Jpeg.M_SOF13:
case Jpeg.M_SOF14:
case Jpeg.M_SOF15:
- throw new ImageException('Unhandled frame type ${marker.toRadixString(16)}');
+ throw new ImageException(
+ 'Unhandled frame type ${marker.toRadixString(16)}');
case Jpeg.M_DHT: // DHT (Define Huffman Tables)
_readDHT(block);
@@ -394,8 +400,8 @@
}
if (marker != 0) {
- throw new ImageException('Unknown JPEG marker ' +
- marker.toRadixString(16));
+ throw new ImageException(
+ 'Unknown JPEG marker ' + marker.toRadixString(16));
}
break;
}
@@ -467,14 +473,15 @@
case FMT_ULONG:
return block.readUint32();
case FMT_URATIONAL:
- case FMT_SRATIONAL: {
- int num = block.readInt32();
- int den = block.readInt32();
- if (den == 0) {
- return 0.0;
+ case FMT_SRATIONAL:
+ {
+ int num = block.readInt32();
+ int den = block.readInt32();
+ if (den == 0) {
+ return 0.0;
+ }
+ return num / den;
}
- return num / den;
- }
case FMT_SSHORT:
return block.readInt16();
case FMT_SLONG:
@@ -529,7 +536,8 @@
}
switch (tag) {
- case TAG_ORIENTATION: {
+ case TAG_ORIENTATION:
+ {
num orientation = _readExifValue(block, format);
exif.orientation = orientation.toInt();
}
@@ -564,9 +572,11 @@
// Exif Directory
String alignment = block.readString(2);
- if (alignment == 'II') { // Exif is in Intel order
+ if (alignment == 'II') {
+ // Exif is in Intel order
block.bigEndian = false;
- } else if (alignment == 'MM') { // Exif section in Motorola order
+ } else if (alignment == 'MM') {
+ // Exif section in Motorola order
block.bigEndian = true;
} else {
return;
@@ -575,7 +585,7 @@
block.skip(2);
int offset = block.readUint32();
- if (offset < 8 || offset > 16){
+ if (offset < 8 || offset > 16) {
if (offset > block.length - 16) {
// invalid offset for first Exif IFD value ;
block.bigEndian = saveEndian;
@@ -597,8 +607,11 @@
if (marker == Jpeg.M_APP0) {
// 'JFIF\0'
- if (appData[0] == 0x4A && appData[1] == 0x46 &&
- appData[2] == 0x49 && appData[3] == 0x46 && appData[4] == 0) {
+ if (appData[0] == 0x4A &&
+ appData[1] == 0x46 &&
+ appData[2] == 0x49 &&
+ appData[3] == 0x46 &&
+ appData[4] == 0) {
jfif = JpegJfif();
jfif.majorVersion = appData[5];
jfif.minorVersion = appData[6];
@@ -615,9 +628,12 @@
_readExifData(appData);
} else if (marker == Jpeg.M_APP14) {
// 'Adobe\0'
- if (appData[0] == 0x41 && appData[1] == 0x64 &&
- appData[2] == 0x6F && appData[3] == 0x62 &&
- appData[4] == 0x65 && appData[5] == 0) {
+ if (appData[0] == 0x41 &&
+ appData[1] == 0x64 &&
+ appData[2] == 0x6F &&
+ appData[3] == 0x62 &&
+ appData[4] == 0x65 &&
+ appData[5] == 0) {
adobe = JpegAdobe();
adobe.version = appData[6];
adobe.flags0 = shiftL(appData[7], 8) | appData[8];
@@ -707,10 +723,12 @@
}
List ht;
- if (index & 0x10 != 0) { // AC table definition
+ if (index & 0x10 != 0) {
+ // AC table definition
index -= 0x10;
ht = huffmanTablesAC;
- } else { // DC table definition
+ } else {
+ // DC table definition
ht = huffmanTablesDC;
}
@@ -732,7 +750,7 @@
throw new ImageException('Invalid SOS block');
}
- List components = List(n);
+ final components = List<dynamic>(n);
for (int i = 0; i < n; i++) {
int id = block.readByte();
int c = block.readByte();
@@ -748,10 +766,10 @@
int ac_tbl_no = c & 15;
if (dc_tbl_no < huffmanTablesDC.length) {
- component.huffmanTableDC = huffmanTablesDC[dc_tbl_no];
+ component.huffmanTableDC = huffmanTablesDC[dc_tbl_no] as List;
}
if (ac_tbl_no < huffmanTablesAC.length) {
- component.huffmanTableAC = huffmanTablesAC[ac_tbl_no];
+ component.huffmanTableAC = huffmanTablesAC[ac_tbl_no] as List;
}
}
@@ -762,13 +780,14 @@
int Ah = shiftR(successiveApproximation, 4) & 15;
int Al = successiveApproximation & 15;
- new JpegScan(input, frame, components, resetInterval,
- spectralStart, spectralEnd, Ah, Al).decode();
+ new JpegScan(input, frame, components, resetInterval, spectralStart,
+ spectralEnd, Ah, Al)
+ .decode();
}
List _buildHuffmanTable(Uint8List codeLengths, Uint8List values) {
int k = 0;
- List code = [];
+ final code = List<dynamic>();
int length = 16;
while (length > 0 && (codeLengths[length - 1] == 0)) {
@@ -777,18 +796,18 @@
code.add(new _JpegHuffman());
- _JpegHuffman p = code[0];
+ _JpegHuffman p = code[0] as _JpegHuffman;
_JpegHuffman q;
for (int i = 0; i < length; i++) {
for (int j = 0; j < codeLengths[i]; j++) {
- p = code.removeLast();
+ p = code.removeLast() as _JpegHuffman;
if (p.children.length <= p.index) {
p.children.length = p.index + 1;
}
p.children[p.index] = values[k];
while (p.index > 0) {
- p = code.removeLast();
+ p = code.removeLast() as _JpegHuffman;
}
p.index++;
code.add(p);
@@ -816,11 +835,11 @@
}
}
- return code[0].children;
+ return code[0].children as List;
}
- List<Uint8List> _buildComponentData(JpegFrame frame,
- JpegComponent component) {
+ List<Uint8List> _buildComponentData(
+ JpegFrame frame, JpegComponent component) {
final int blocksPerLine = component.blocksPerLine;
final int blocksPerColumn = component.blocksPerColumn;
int samplesPerLine = shiftL(blocksPerLine, 3);
@@ -837,8 +856,7 @@
for (int blockCol = 0; blockCol < blocksPerLine; blockCol++) {
_quantizeAndInverse(component.quantizationTable,
- component.blocks[blockRow][blockCol],
- r, R);
+ component.blocks[blockRow][blockCol] as Int32List, r, R);
int offset = 0;
int sample = shiftL(blockCol, 3);
@@ -864,18 +882,14 @@
static Uint8List dctClip;
- /**
- * Quantize the coefficients and apply IDCT.
- *
- * A port of poppler's IDCT method which in turn is taken from:
- * Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz,
- * "Practical Fast 1-D DCT Algorithms with 11 Multiplications",
- * IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989, 988-991.
- */
- void _quantizeAndInverse(Int16List quantizationTable,
- Int32List coefBlock,
- Uint8List dataOut,
- Int32List dataIn) {
+ /// Quantize the coefficients and apply IDCT.
+ ///
+ /// A port of poppler's IDCT method which in turn is taken from:
+ /// Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz,
+ /// "Practical Fast 1-D DCT Algorithms with 11 Multiplications",
+ /// IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989, 988-991.
+ void _quantizeAndInverse(Int16List quantizationTable, Int32List coefBlock,
+ Uint8List dataOut, Int32List dataIn) {
Int32List p = dataIn;
const int dctClipOffset = 256;
@@ -895,13 +909,13 @@
}
// IDCT constants (20.12 fixed point format)
- const int COS_1 = 4017; // cos(pi/16)*4096
- const int SIN_1 = 799; // sin(pi/16)*4096
- const int COS_3 = 3406; // cos(3*pi/16)*4096
- const int SIN_3 = 2276; // sin(3*pi/16)*4096
- const int COS_6 = 1567; // cos(6*pi/16)*4096
- const int SIN_6 = 3784; // sin(6*pi/16)*4096
- const int SQRT_2 = 5793; // sqrt(2)*4096
+ const int COS_1 = 4017; // cos(pi/16)*4096
+ const int SIN_1 = 799; // sin(pi/16)*4096
+ const int COS_3 = 3406; // cos(3*pi/16)*4096
+ const int SIN_3 = 2276; // sin(3*pi/16)*4096
+ const int COS_6 = 1567; // cos(6*pi/16)*4096
+ const int SIN_6 = 3784; // sin(6*pi/16)*4096
+ const int SQRT_2 = 5793; // sqrt(2)*4096
const int SQRT_1D2 = 2896; // sqrt(2) / 2
// de-quantize
@@ -914,12 +928,12 @@
for (int i = 0; i < 8; ++i, row += 8) {
// check for all-zero AC coefficients
if (p[1 + row] == 0 &&
- p[2 + row] == 0 &&
- p[3 + row] == 0 &&
- p[4 + row] == 0 &&
- p[5 + row] == 0 &&
- p[6 + row] == 0 &&
- p[7 + row] == 0) {
+ p[2 + row] == 0 &&
+ p[3 + row] == 0 &&
+ p[4 + row] == 0 &&
+ p[5 + row] == 0 &&
+ p[6 + row] == 0 &&
+ p[7 + row] == 0) {
int t = shiftR((SQRT_2 * p[0 + row] + 512), 10);
p[row + 0] = t;
p[row + 1] = t;
@@ -987,12 +1001,12 @@
// check for all-zero AC coefficients
if (p[1 * 8 + col] == 0 &&
- p[2 * 8 + col] == 0 &&
- p[3 * 8 + col] == 0 &&
- p[4 * 8 + col] == 0 &&
- p[5 * 8 + col] == 0 &&
- p[6 * 8 + col] == 0 &&
- p[7 * 8 + col] == 0) {
+ p[2 * 8 + col] == 0 &&
+ p[3 * 8 + col] == 0 &&
+ p[4 * 8 + col] == 0 &&
+ p[5 * 8 + col] == 0 &&
+ p[6 * 8 + col] == 0 &&
+ p[7 * 8 + col] == 0) {
int t = shiftR((SQRT_2 * dataIn[i] + 8192), 14);
p[0 * 8 + col] = t;
p[1 * 8 + col] = t;
@@ -1010,8 +1024,10 @@
int v1 = shiftR((SQRT_2 * p[4 * 8 + col] + 2048), 12);
int v2 = p[2 * 8 + col];
int v3 = p[6 * 8 + col];
- int v4 = shiftR((SQRT_1D2 * (p[1 * 8 + col] - p[7 * 8 + col]) + 2048), 12);
- int v7 = shiftR((SQRT_1D2 * (p[1 * 8 + col] + p[7 * 8 + col]) + 2048), 12);
+ int v4 =
+ shiftR((SQRT_1D2 * (p[1 * 8 + col] - p[7 * 8 + col]) + 2048), 12);
+ int v7 =
+ shiftR((SQRT_1D2 * (p[1 * 8 + col] + p[7 * 8 + col]) + 2048), 12);
int v5 = p[3 * 8 + col];
int v6 = p[5 * 8 + col];
@@ -1061,112 +1077,1044 @@
}
static const CRR = const [
- -179, -178, -177, -175, -174, -172, -171, -170, -168, -167, -165, -164, -163,
- -161, -160, -158, -157, -156, -154, -153, -151, -150, -149, -147, -146, -144, -143,
- -142, -140, -139, -137, -136, -135, -133, -132, -130, -129, -128, -126, -125,
- -123, -122, -121, -119, -118, -116, -115, -114, -112, -111, -109, -108, -107,
- -105, -104, -102, -101, -100, -98, -97, -95, -94, -93, -91, -90, -88, -87, -86,
- -84, -83, -81, -80, -79, -77, -76, -74, -73, -72, -70, -69, -67, -66, -64, -63,
- -62, -60, -59, -57, -56, -55, -53, -52, -50, -49, -48, -46, -45, -43, -42, -41,
- -39, -38, -36, -35, -34, -32, -31, -29, -28, -27, -25, -24, -22, -21, -20, -18,
- -17, -15, -14, -13, -11, -10, -8, -7, -6, -4, -3, -1, 0, 1, 3, 4, 6, 7, 8, 10,
- 11, 13, 14, 15, 17, 18, 20, 21, 22, 24, 25, 27, 28, 29, 31, 32, 34, 35, 36, 38,
- 39, 41, 42, 43, 45, 46, 48, 49, 50, 52, 53, 55, 56, 57, 59, 60, 62, 63, 64, 66,
- 67, 69, 70, 72, 73, 74, 76, 77, 79, 80, 81, 83, 84, 86, 87, 88, 90, 91, 93, 94,
- 95, 97, 98, 100, 101, 102, 104, 105, 107, 108, 109, 111, 112, 114, 115, 116, 118,
- 119, 121, 122, 123, 125, 126, 128, 129, 130, 132, 133, 135, 136, 137, 139, 140,
- 142, 143, 144, 146, 147, 149, 150, 151, 153, 154, 156, 157, 158, 160, 161, 163,
- 164, 165, 167, 168, 170, 171, 172, 174, 175, 177, 178
+ -179,
+ -178,
+ -177,
+ -175,
+ -174,
+ -172,
+ -171,
+ -170,
+ -168,
+ -167,
+ -165,
+ -164,
+ -163,
+ -161,
+ -160,
+ -158,
+ -157,
+ -156,
+ -154,
+ -153,
+ -151,
+ -150,
+ -149,
+ -147,
+ -146,
+ -144,
+ -143,
+ -142,
+ -140,
+ -139,
+ -137,
+ -136,
+ -135,
+ -133,
+ -132,
+ -130,
+ -129,
+ -128,
+ -126,
+ -125,
+ -123,
+ -122,
+ -121,
+ -119,
+ -118,
+ -116,
+ -115,
+ -114,
+ -112,
+ -111,
+ -109,
+ -108,
+ -107,
+ -105,
+ -104,
+ -102,
+ -101,
+ -100,
+ -98,
+ -97,
+ -95,
+ -94,
+ -93,
+ -91,
+ -90,
+ -88,
+ -87,
+ -86,
+ -84,
+ -83,
+ -81,
+ -80,
+ -79,
+ -77,
+ -76,
+ -74,
+ -73,
+ -72,
+ -70,
+ -69,
+ -67,
+ -66,
+ -64,
+ -63,
+ -62,
+ -60,
+ -59,
+ -57,
+ -56,
+ -55,
+ -53,
+ -52,
+ -50,
+ -49,
+ -48,
+ -46,
+ -45,
+ -43,
+ -42,
+ -41,
+ -39,
+ -38,
+ -36,
+ -35,
+ -34,
+ -32,
+ -31,
+ -29,
+ -28,
+ -27,
+ -25,
+ -24,
+ -22,
+ -21,
+ -20,
+ -18,
+ -17,
+ -15,
+ -14,
+ -13,
+ -11,
+ -10,
+ -8,
+ -7,
+ -6,
+ -4,
+ -3,
+ -1,
+ 0,
+ 1,
+ 3,
+ 4,
+ 6,
+ 7,
+ 8,
+ 10,
+ 11,
+ 13,
+ 14,
+ 15,
+ 17,
+ 18,
+ 20,
+ 21,
+ 22,
+ 24,
+ 25,
+ 27,
+ 28,
+ 29,
+ 31,
+ 32,
+ 34,
+ 35,
+ 36,
+ 38,
+ 39,
+ 41,
+ 42,
+ 43,
+ 45,
+ 46,
+ 48,
+ 49,
+ 50,
+ 52,
+ 53,
+ 55,
+ 56,
+ 57,
+ 59,
+ 60,
+ 62,
+ 63,
+ 64,
+ 66,
+ 67,
+ 69,
+ 70,
+ 72,
+ 73,
+ 74,
+ 76,
+ 77,
+ 79,
+ 80,
+ 81,
+ 83,
+ 84,
+ 86,
+ 87,
+ 88,
+ 90,
+ 91,
+ 93,
+ 94,
+ 95,
+ 97,
+ 98,
+ 100,
+ 101,
+ 102,
+ 104,
+ 105,
+ 107,
+ 108,
+ 109,
+ 111,
+ 112,
+ 114,
+ 115,
+ 116,
+ 118,
+ 119,
+ 121,
+ 122,
+ 123,
+ 125,
+ 126,
+ 128,
+ 129,
+ 130,
+ 132,
+ 133,
+ 135,
+ 136,
+ 137,
+ 139,
+ 140,
+ 142,
+ 143,
+ 144,
+ 146,
+ 147,
+ 149,
+ 150,
+ 151,
+ 153,
+ 154,
+ 156,
+ 157,
+ 158,
+ 160,
+ 161,
+ 163,
+ 164,
+ 165,
+ 167,
+ 168,
+ 170,
+ 171,
+ 172,
+ 174,
+ 175,
+ 177,
+ 178
];
static const CRG = const [
- 5990656, 5943854, 5897052, 5850250, 5803448, 5756646, 5709844, 5663042, 5616240,
- 5569438, 5522636, 5475834, 5429032, 5382230, 5335428, 5288626, 5241824, 5195022,
- 5148220, 5101418, 5054616, 5007814, 4961012, 4914210, 4867408, 4820606, 4773804,
- 4727002, 4680200, 4633398, 4586596, 4539794, 4492992, 4446190, 4399388, 4352586,
- 4305784, 4258982, 4212180, 4165378, 4118576, 4071774, 4024972, 3978170, 3931368,
- 3884566, 3837764, 3790962, 3744160, 3697358, 3650556, 3603754, 3556952, 3510150,
- 3463348, 3416546, 3369744, 3322942, 3276140, 3229338, 3182536, 3135734, 3088932,
- 3042130, 2995328, 2948526, 2901724, 2854922, 2808120, 2761318, 2714516, 2667714,
- 2620912, 2574110, 2527308, 2480506, 2433704, 2386902, 2340100, 2293298, 2246496,
- 2199694, 2152892, 2106090, 2059288, 2012486, 1965684, 1918882, 1872080, 1825278,
- 1778476, 1731674, 1684872, 1638070, 1591268, 1544466, 1497664, 1450862, 1404060,
- 1357258, 1310456, 1263654, 1216852, 1170050, 1123248, 1076446, 1029644, 982842,
- 936040, 889238, 842436, 795634, 748832, 702030, 655228, 608426, 561624, 514822,
- 468020, 421218, 374416, 327614, 280812, 234010, 187208, 140406, 93604, 46802, 0,
- -46802, -93604, -140406, -187208, -234010, -280812, -327614, -374416, -421218,
- -468020, -514822, -561624, -608426, -655228, -702030, -748832, -795634, -842436,
- -889238, -936040, -982842, -1029644, -1076446, -1123248, -1170050, -1216852,
- -1263654, -1310456, -1357258, -1404060, -1450862, -1497664, -1544466, -1591268,
- -1638070, -1684872, -1731674, -1778476, -1825278, -1872080, -1918882, -1965684,
- -2012486, -2059288, -2106090, -2152892, -2199694, -2246496, -2293298, -2340100,
- -2386902, -2433704, -2480506, -2527308, -2574110, -2620912, -2667714, -2714516,
- -2761318, -2808120, -2854922, -2901724, -2948526, -2995328, -3042130, -3088932,
- -3135734, -3182536, -3229338, -3276140, -3322942, -3369744, -3416546, -3463348,
- -3510150, -3556952, -3603754, -3650556, -3697358, -3744160, -3790962, -3837764,
- -3884566, -3931368, -3978170, -4024972, -4071774, -4118576, -4165378, -4212180,
- -4258982, -4305784, -4352586, -4399388, -4446190, -4492992, -4539794, -4586596,
- -4633398, -4680200, -4727002, -4773804, -4820606, -4867408, -4914210, -4961012,
- -5007814, -5054616, -5101418, -5148220, -5195022, -5241824, -5288626, -5335428,
- -5382230, -5429032, -5475834, -5522636, -5569438, -5616240, -5663042, -5709844,
- -5756646, -5803448, -5850250, -5897052, -5943854
+ 5990656,
+ 5943854,
+ 5897052,
+ 5850250,
+ 5803448,
+ 5756646,
+ 5709844,
+ 5663042,
+ 5616240,
+ 5569438,
+ 5522636,
+ 5475834,
+ 5429032,
+ 5382230,
+ 5335428,
+ 5288626,
+ 5241824,
+ 5195022,
+ 5148220,
+ 5101418,
+ 5054616,
+ 5007814,
+ 4961012,
+ 4914210,
+ 4867408,
+ 4820606,
+ 4773804,
+ 4727002,
+ 4680200,
+ 4633398,
+ 4586596,
+ 4539794,
+ 4492992,
+ 4446190,
+ 4399388,
+ 4352586,
+ 4305784,
+ 4258982,
+ 4212180,
+ 4165378,
+ 4118576,
+ 4071774,
+ 4024972,
+ 3978170,
+ 3931368,
+ 3884566,
+ 3837764,
+ 3790962,
+ 3744160,
+ 3697358,
+ 3650556,
+ 3603754,
+ 3556952,
+ 3510150,
+ 3463348,
+ 3416546,
+ 3369744,
+ 3322942,
+ 3276140,
+ 3229338,
+ 3182536,
+ 3135734,
+ 3088932,
+ 3042130,
+ 2995328,
+ 2948526,
+ 2901724,
+ 2854922,
+ 2808120,
+ 2761318,
+ 2714516,
+ 2667714,
+ 2620912,
+ 2574110,
+ 2527308,
+ 2480506,
+ 2433704,
+ 2386902,
+ 2340100,
+ 2293298,
+ 2246496,
+ 2199694,
+ 2152892,
+ 2106090,
+ 2059288,
+ 2012486,
+ 1965684,
+ 1918882,
+ 1872080,
+ 1825278,
+ 1778476,
+ 1731674,
+ 1684872,
+ 1638070,
+ 1591268,
+ 1544466,
+ 1497664,
+ 1450862,
+ 1404060,
+ 1357258,
+ 1310456,
+ 1263654,
+ 1216852,
+ 1170050,
+ 1123248,
+ 1076446,
+ 1029644,
+ 982842,
+ 936040,
+ 889238,
+ 842436,
+ 795634,
+ 748832,
+ 702030,
+ 655228,
+ 608426,
+ 561624,
+ 514822,
+ 468020,
+ 421218,
+ 374416,
+ 327614,
+ 280812,
+ 234010,
+ 187208,
+ 140406,
+ 93604,
+ 46802,
+ 0,
+ -46802,
+ -93604,
+ -140406,
+ -187208,
+ -234010,
+ -280812,
+ -327614,
+ -374416,
+ -421218,
+ -468020,
+ -514822,
+ -561624,
+ -608426,
+ -655228,
+ -702030,
+ -748832,
+ -795634,
+ -842436,
+ -889238,
+ -936040,
+ -982842,
+ -1029644,
+ -1076446,
+ -1123248,
+ -1170050,
+ -1216852,
+ -1263654,
+ -1310456,
+ -1357258,
+ -1404060,
+ -1450862,
+ -1497664,
+ -1544466,
+ -1591268,
+ -1638070,
+ -1684872,
+ -1731674,
+ -1778476,
+ -1825278,
+ -1872080,
+ -1918882,
+ -1965684,
+ -2012486,
+ -2059288,
+ -2106090,
+ -2152892,
+ -2199694,
+ -2246496,
+ -2293298,
+ -2340100,
+ -2386902,
+ -2433704,
+ -2480506,
+ -2527308,
+ -2574110,
+ -2620912,
+ -2667714,
+ -2714516,
+ -2761318,
+ -2808120,
+ -2854922,
+ -2901724,
+ -2948526,
+ -2995328,
+ -3042130,
+ -3088932,
+ -3135734,
+ -3182536,
+ -3229338,
+ -3276140,
+ -3322942,
+ -3369744,
+ -3416546,
+ -3463348,
+ -3510150,
+ -3556952,
+ -3603754,
+ -3650556,
+ -3697358,
+ -3744160,
+ -3790962,
+ -3837764,
+ -3884566,
+ -3931368,
+ -3978170,
+ -4024972,
+ -4071774,
+ -4118576,
+ -4165378,
+ -4212180,
+ -4258982,
+ -4305784,
+ -4352586,
+ -4399388,
+ -4446190,
+ -4492992,
+ -4539794,
+ -4586596,
+ -4633398,
+ -4680200,
+ -4727002,
+ -4773804,
+ -4820606,
+ -4867408,
+ -4914210,
+ -4961012,
+ -5007814,
+ -5054616,
+ -5101418,
+ -5148220,
+ -5195022,
+ -5241824,
+ -5288626,
+ -5335428,
+ -5382230,
+ -5429032,
+ -5475834,
+ -5522636,
+ -5569438,
+ -5616240,
+ -5663042,
+ -5709844,
+ -5756646,
+ -5803448,
+ -5850250,
+ -5897052,
+ -5943854
];
static const CBG = const [
- 2919680, 2897126, 2874572, 2852018, 2829464, 2806910, 2784356, 2761802, 2739248, 2716694,
- 2694140, 2671586, 2649032, 2626478, 2603924, 2581370, 2558816, 2536262, 2513708,
- 2491154, 2468600, 2446046, 2423492, 2400938, 2378384, 2355830, 2333276, 2310722,
- 2288168, 2265614, 2243060, 2220506, 2197952, 2175398, 2152844, 2130290, 2107736,
- 2085182, 2062628, 2040074, 2017520, 1994966, 1972412, 1949858, 1927304, 1904750,
- 1882196, 1859642, 1837088, 1814534, 1791980, 1769426, 1746872, 1724318, 1701764,
- 1679210, 1656656, 1634102, 1611548, 1588994, 1566440, 1543886, 1521332, 1498778,
- 1476224, 1453670, 1431116, 1408562, 1386008, 1363454, 1340900, 1318346, 1295792,
- 1273238, 1250684, 1228130, 1205576, 1183022, 1160468, 1137914, 1115360,
- 1092806, 1070252, 1047698, 1025144, 1002590, 980036, 957482, 934928, 912374,
- 889820, 867266, 844712, 822158, 799604, 777050, 754496, 731942, 709388, 686834,
- 664280, 641726, 619172, 596618, 574064, 551510, 528956, 506402, 483848, 461294,
- 438740, 416186, 393632, 371078, 348524, 325970, 303416, 280862, 258308, 235754,
- 213200, 190646, 168092, 145538, 122984, 100430, 77876, 55322, 32768, 10214, -12340,
- -34894, -57448, -80002, -102556, -125110, -147664, -170218, -192772, -215326,
- -237880, -260434, -282988, -305542, -328096, -350650, -373204, -395758, -418312,
- -440866, -463420, -485974, -508528, -531082, -553636, -576190, -598744, -621298,
- -643852, -666406, -688960, -711514, -734068, -756622, -779176, -801730, -824284,
- -846838, -869392, -891946, -914500, -937054, -959608, -982162, -1004716, -1027270,
- -1049824, -1072378, -1094932, -1117486, -1140040, -1162594, -1185148, -1207702,
- -1230256, -1252810, -1275364, -1297918, -1320472, -1343026, -1365580, -1388134,
- -1410688, -1433242, -1455796, -1478350, -1500904, -1523458, -1546012, -1568566,
- -1591120, -1613674, -1636228, -1658782, -1681336, -1703890, -1726444, -1748998,
- -1771552, -1794106, -1816660, -1839214, -1861768, -1884322, -1906876, -1929430,
- -1951984, -1974538, -1997092, -2019646, -2042200, -2064754, -2087308, -2109862,
- -2132416, -2154970, -2177524, -2200078, -2222632, -2245186, -2267740, -2290294,
- -2312848, -2335402, -2357956, -2380510, -2403064, -2425618, -2448172, -2470726,
- -2493280, -2515834, -2538388, -2560942, -2583496, -2606050, -2628604, -2651158,
- -2673712, -2696266, -2718820, -2741374, -2763928, -2786482, -2809036, -2831590
+ 2919680,
+ 2897126,
+ 2874572,
+ 2852018,
+ 2829464,
+ 2806910,
+ 2784356,
+ 2761802,
+ 2739248,
+ 2716694,
+ 2694140,
+ 2671586,
+ 2649032,
+ 2626478,
+ 2603924,
+ 2581370,
+ 2558816,
+ 2536262,
+ 2513708,
+ 2491154,
+ 2468600,
+ 2446046,
+ 2423492,
+ 2400938,
+ 2378384,
+ 2355830,
+ 2333276,
+ 2310722,
+ 2288168,
+ 2265614,
+ 2243060,
+ 2220506,
+ 2197952,
+ 2175398,
+ 2152844,
+ 2130290,
+ 2107736,
+ 2085182,
+ 2062628,
+ 2040074,
+ 2017520,
+ 1994966,
+ 1972412,
+ 1949858,
+ 1927304,
+ 1904750,
+ 1882196,
+ 1859642,
+ 1837088,
+ 1814534,
+ 1791980,
+ 1769426,
+ 1746872,
+ 1724318,
+ 1701764,
+ 1679210,
+ 1656656,
+ 1634102,
+ 1611548,
+ 1588994,
+ 1566440,
+ 1543886,
+ 1521332,
+ 1498778,
+ 1476224,
+ 1453670,
+ 1431116,
+ 1408562,
+ 1386008,
+ 1363454,
+ 1340900,
+ 1318346,
+ 1295792,
+ 1273238,
+ 1250684,
+ 1228130,
+ 1205576,
+ 1183022,
+ 1160468,
+ 1137914,
+ 1115360,
+ 1092806,
+ 1070252,
+ 1047698,
+ 1025144,
+ 1002590,
+ 980036,
+ 957482,
+ 934928,
+ 912374,
+ 889820,
+ 867266,
+ 844712,
+ 822158,
+ 799604,
+ 777050,
+ 754496,
+ 731942,
+ 709388,
+ 686834,
+ 664280,
+ 641726,
+ 619172,
+ 596618,
+ 574064,
+ 551510,
+ 528956,
+ 506402,
+ 483848,
+ 461294,
+ 438740,
+ 416186,
+ 393632,
+ 371078,
+ 348524,
+ 325970,
+ 303416,
+ 280862,
+ 258308,
+ 235754,
+ 213200,
+ 190646,
+ 168092,
+ 145538,
+ 122984,
+ 100430,
+ 77876,
+ 55322,
+ 32768,
+ 10214,
+ -12340,
+ -34894,
+ -57448,
+ -80002,
+ -102556,
+ -125110,
+ -147664,
+ -170218,
+ -192772,
+ -215326,
+ -237880,
+ -260434,
+ -282988,
+ -305542,
+ -328096,
+ -350650,
+ -373204,
+ -395758,
+ -418312,
+ -440866,
+ -463420,
+ -485974,
+ -508528,
+ -531082,
+ -553636,
+ -576190,
+ -598744,
+ -621298,
+ -643852,
+ -666406,
+ -688960,
+ -711514,
+ -734068,
+ -756622,
+ -779176,
+ -801730,
+ -824284,
+ -846838,
+ -869392,
+ -891946,
+ -914500,
+ -937054,
+ -959608,
+ -982162,
+ -1004716,
+ -1027270,
+ -1049824,
+ -1072378,
+ -1094932,
+ -1117486,
+ -1140040,
+ -1162594,
+ -1185148,
+ -1207702,
+ -1230256,
+ -1252810,
+ -1275364,
+ -1297918,
+ -1320472,
+ -1343026,
+ -1365580,
+ -1388134,
+ -1410688,
+ -1433242,
+ -1455796,
+ -1478350,
+ -1500904,
+ -1523458,
+ -1546012,
+ -1568566,
+ -1591120,
+ -1613674,
+ -1636228,
+ -1658782,
+ -1681336,
+ -1703890,
+ -1726444,
+ -1748998,
+ -1771552,
+ -1794106,
+ -1816660,
+ -1839214,
+ -1861768,
+ -1884322,
+ -1906876,
+ -1929430,
+ -1951984,
+ -1974538,
+ -1997092,
+ -2019646,
+ -2042200,
+ -2064754,
+ -2087308,
+ -2109862,
+ -2132416,
+ -2154970,
+ -2177524,
+ -2200078,
+ -2222632,
+ -2245186,
+ -2267740,
+ -2290294,
+ -2312848,
+ -2335402,
+ -2357956,
+ -2380510,
+ -2403064,
+ -2425618,
+ -2448172,
+ -2470726,
+ -2493280,
+ -2515834,
+ -2538388,
+ -2560942,
+ -2583496,
+ -2606050,
+ -2628604,
+ -2651158,
+ -2673712,
+ -2696266,
+ -2718820,
+ -2741374,
+ -2763928,
+ -2786482,
+ -2809036,
+ -2831590
];
static const CBB = const [
- -227, -225, -223, -222, -220, -218, -216, -214, -213, -211, -209, -207, -206,
- -204, -202, -200, -198, -197, -195, -193, -191, -190, -188,
- -186, -184, -183, -181, -179, -177, -175, -174, -172, -170, -168, -167, -165,
- -163, -161, -159, -158, -156, -154, -152, -151, -149, -147, -145, -144, -142,
- -140, -138, -136, -135, -133, -131, -129, -128, -126, -124, -122, -120, -119, -117,
- -115, -113, -112, -110, -108, -106, -105, -103, -101, -99, -97, -96, -94, -92,
- -90, -89, -87, -85, -83, -82, -80, -78, -76, -74, -73, -71, -69, -67, -66, -64,
- -62, -60, -58, -57, -55, -53, -51, -50, -48, -46, -44, -43, -41, -39, -37, -35,
- -34, -32, -30, -28, -27, -25, -23, -21, -19, -18, -16, -14, -12, -11, -9, -7,
- -5, -4, -2, 0, 2, 4, 5, 7, 9, 11, 12, 14, 16, 18, 19, 21, 23, 25, 27, 28, 30, 32,
- 34, 35, 37, 39, 41, 43, 44, 46, 48, 50, 51, 53, 55, 57, 58, 60, 62, 64, 66, 67,
- 69, 71, 73, 74, 76, 78, 80, 82, 83, 85, 87, 89, 90, 92, 94, 96, 97, 99, 101, 103,
- 105, 106, 108, 110, 112, 113, 115, 117, 119, 120, 122, 124, 126, 128, 129, 131,
- 133, 135, 136, 138, 140, 142, 144, 145, 147, 149, 151, 152, 154, 156, 158, 159,
- 161, 163, 165, 167, 168, 170, 172, 174, 175, 177, 179, 181, 183, 184, 186, 188,
- 190, 191, 193, 195, 197, 198, 200, 202, 204, 206, 207, 209, 211, 213, 214, 216,
- 218, 220, 222, 223, 225
+ -227,
+ -225,
+ -223,
+ -222,
+ -220,
+ -218,
+ -216,
+ -214,
+ -213,
+ -211,
+ -209,
+ -207,
+ -206,
+ -204,
+ -202,
+ -200,
+ -198,
+ -197,
+ -195,
+ -193,
+ -191,
+ -190,
+ -188,
+ -186,
+ -184,
+ -183,
+ -181,
+ -179,
+ -177,
+ -175,
+ -174,
+ -172,
+ -170,
+ -168,
+ -167,
+ -165,
+ -163,
+ -161,
+ -159,
+ -158,
+ -156,
+ -154,
+ -152,
+ -151,
+ -149,
+ -147,
+ -145,
+ -144,
+ -142,
+ -140,
+ -138,
+ -136,
+ -135,
+ -133,
+ -131,
+ -129,
+ -128,
+ -126,
+ -124,
+ -122,
+ -120,
+ -119,
+ -117,
+ -115,
+ -113,
+ -112,
+ -110,
+ -108,
+ -106,
+ -105,
+ -103,
+ -101,
+ -99,
+ -97,
+ -96,
+ -94,
+ -92,
+ -90,
+ -89,
+ -87,
+ -85,
+ -83,
+ -82,
+ -80,
+ -78,
+ -76,
+ -74,
+ -73,
+ -71,
+ -69,
+ -67,
+ -66,
+ -64,
+ -62,
+ -60,
+ -58,
+ -57,
+ -55,
+ -53,
+ -51,
+ -50,
+ -48,
+ -46,
+ -44,
+ -43,
+ -41,
+ -39,
+ -37,
+ -35,
+ -34,
+ -32,
+ -30,
+ -28,
+ -27,
+ -25,
+ -23,
+ -21,
+ -19,
+ -18,
+ -16,
+ -14,
+ -12,
+ -11,
+ -9,
+ -7,
+ -5,
+ -4,
+ -2,
+ 0,
+ 2,
+ 4,
+ 5,
+ 7,
+ 9,
+ 11,
+ 12,
+ 14,
+ 16,
+ 18,
+ 19,
+ 21,
+ 23,
+ 25,
+ 27,
+ 28,
+ 30,
+ 32,
+ 34,
+ 35,
+ 37,
+ 39,
+ 41,
+ 43,
+ 44,
+ 46,
+ 48,
+ 50,
+ 51,
+ 53,
+ 55,
+ 57,
+ 58,
+ 60,
+ 62,
+ 64,
+ 66,
+ 67,
+ 69,
+ 71,
+ 73,
+ 74,
+ 76,
+ 78,
+ 80,
+ 82,
+ 83,
+ 85,
+ 87,
+ 89,
+ 90,
+ 92,
+ 94,
+ 96,
+ 97,
+ 99,
+ 101,
+ 103,
+ 105,
+ 106,
+ 108,
+ 110,
+ 112,
+ 113,
+ 115,
+ 117,
+ 119,
+ 120,
+ 122,
+ 124,
+ 126,
+ 128,
+ 129,
+ 131,
+ 133,
+ 135,
+ 136,
+ 138,
+ 140,
+ 142,
+ 144,
+ 145,
+ 147,
+ 149,
+ 151,
+ 152,
+ 154,
+ 156,
+ 158,
+ 159,
+ 161,
+ 163,
+ 165,
+ 167,
+ 168,
+ 170,
+ 172,
+ 174,
+ 175,
+ 177,
+ 179,
+ 181,
+ 183,
+ 184,
+ 186,
+ 188,
+ 190,
+ 191,
+ 193,
+ 195,
+ 197,
+ 198,
+ 200,
+ 202,
+ 204,
+ 206,
+ 207,
+ 209,
+ 211,
+ 213,
+ 214,
+ 216,
+ 218,
+ 220,
+ 222,
+ 223,
+ 225
];
}
class _JpegHuffman {
- List children = [];
+ final children = List<dynamic>();
int index = 0;
}
@@ -1179,7 +2127,7 @@
int hScaleShift;
int vScaleShift;
_ComponentData(this.hSamples, this.maxHSamples, this.vSamples,
- this.maxVSamples, this.lines)
- : hScaleShift = (hSamples == 1 && maxHSamples == 2) ? 1 : 0
- , vScaleShift = (vSamples == 1 && maxVSamples == 2) ? 1 : 0;
+ this.maxVSamples, this.lines)
+ : hScaleShift = (hSamples == 1 && maxHSamples == 2) ? 1 : 0,
+ vScaleShift = (vSamples == 1 && maxVSamples == 2) ? 1 : 0;
}
diff --git a/image/lib/src/formats/jpeg/jpeg_frame.dart b/image/lib/src/formats/jpeg/jpeg_frame.dart
index 776f5db..d3099ea 100755
--- a/image/lib/src/formats/jpeg/jpeg_frame.dart
+++ b/image/lib/src/formats/jpeg/jpeg_frame.dart
@@ -27,16 +27,17 @@
for (int componentId in components.keys) {
JpegComponent component = components[componentId];
- int blocksPerLine = ((samplesPerLine / 8).ceil() *
- component.hSamples / maxHSamples).ceil();
- int blocksPerColumn = ((scanLines / 8).ceil() *
- component.vSamples / maxVSamples).ceil();
+ int blocksPerLine =
+ ((samplesPerLine / 8).ceil() * component.hSamples / maxHSamples)
+ .ceil();
+ int blocksPerColumn =
+ ((scanLines / 8).ceil() * component.vSamples / maxVSamples).ceil();
int blocksPerLineForMcu = mcusPerLine * component.hSamples;
int blocksPerColumnForMcu = mcusPerColumn * component.vSamples;
- List blocks = List(blocksPerColumnForMcu);
+ final blocks = List<dynamic>(blocksPerColumnForMcu);
for (int i = 0; i < blocksPerColumnForMcu; i++) {
- List row = List(blocksPerLineForMcu);
+ final row = List<dynamic>(blocksPerLineForMcu);
for (int j = 0; j < blocksPerLineForMcu; j++) {
row[j] = Int32List(64);
}
diff --git a/image/lib/src/formats/jpeg/jpeg_scan.dart b/image/lib/src/formats/jpeg/jpeg_scan.dart
index 50b2ccf..fa6ac1c 100755
--- a/image/lib/src/formats/jpeg/jpeg_scan.dart
+++ b/image/lib/src/formats/jpeg/jpeg_scan.dart
@@ -4,7 +4,6 @@
import 'jpeg_component.dart';
import 'jpeg_frame.dart';
-
class JpegScan {
InputBuffer input;
JpegFrame frame;
@@ -28,9 +27,15 @@
int successiveACState = 0;
int successiveACNextValue;
- JpegScan(this.input, this.frame, this.components,
- this.resetInterval, this.spectralStart, this.spectralEnd,
- this.successivePrev, this.successive) {
+ JpegScan(
+ this.input,
+ this.frame,
+ this.components,
+ this.resetInterval,
+ this.spectralStart,
+ this.spectralEnd,
+ this.successivePrev,
+ this.successive) {
precision = frame.precision;
samplesPerLine = frame.samplesPerLine;
scanLines = frame.scanLines;
@@ -43,7 +48,7 @@
void decode() {
int componentsLength = components.length;
JpegComponent component;
- var decodeFn;
+ dynamic decodeFn;
if (progressive) {
if (spectralStart == 0) {
@@ -59,7 +64,8 @@
int mcuExpected;
if (componentsLength == 1) {
- mcuExpected = (components[0].blocksPerLine * components[0].blocksPerColumn);
+ mcuExpected =
+ (components[0].blocksPerLine * components[0].blocksPerColumn) as int;
} else {
mcuExpected = (mcusPerLine * frame.mcusPerColumn);
}
@@ -77,7 +83,7 @@
eobrun = 0;
if (componentsLength == 1) {
- component = components[0];
+ component = components[0] as JpegComponent;
for (int n = 0; n < resetInterval; n++) {
_decodeBlock(component, decodeFn, mcu);
mcu++;
@@ -85,7 +91,7 @@
} else {
for (int n = 0; n < resetInterval; n++) {
for (int i = 0; i < componentsLength; i++) {
- component = components[i];
+ component = components[i] as JpegComponent;
h = component.hSamples;
v = component.vSamples;
for (int j = 0; j < v; j++) {
@@ -127,7 +133,7 @@
int nextByte = input.readByte();
if (nextByte != 0) {
throw new ImageException('unexpected marker: ' +
- ((bitsData << 8) | nextByte).toRadixString(16));
+ ((bitsData << 8) | nextByte).toRadixString(16));
}
}
@@ -135,8 +141,8 @@
return (bitsData >> 7) & 1;
}
- int _decodeHuffman(tree) {
- var node = tree;
+ int _decodeHuffman(dynamic tree) {
+ dynamic node = tree;
int bit;
while ((bit = _readBit()) != null) {
node = node[bit];
@@ -149,7 +155,7 @@
}
int _receive(int length) {
- int n = 0;
+ int n = 0;
while (length > 0) {
int bit = _readBit();
if (bit == null) {
@@ -238,7 +244,7 @@
}
}
- void _decodeACSuccessive(JpegComponent component, zz) {
+ void _decodeACSuccessive(JpegComponent component, dynamic zz) {
int k = spectralStart;
int e = spectralEnd;
int s = 0;
@@ -302,20 +308,20 @@
}
}
- void _decodeMcu(JpegComponent component, decodeFn,
- int mcu, int row, int col) {
+ void _decodeMcu(
+ JpegComponent component, dynamic decodeFn, int mcu, int row, int col) {
int mcuRow = (mcu ~/ mcusPerLine);
int mcuCol = mcu % mcusPerLine;
int blockRow = mcuRow * component.vSamples + row;
int blockCol = mcuCol * component.hSamples + col;
- if (blockRow >= component.blocks.length ||
- blockCol >= component.blocks[blockRow].length) {
+ int numCols = component.blocks[blockRow].length as int;
+ if (blockRow >= component.blocks.length || blockCol >= numCols) {
return;
}
decodeFn(component, component.blocks[blockRow][blockCol]);
}
- void _decodeBlock(JpegComponent component, decodeFn, int mcu) {
+ void _decodeBlock(JpegComponent component, dynamic decodeFn, int mcu) {
int blockRow = mcu ~/ component.blocksPerLine;
int blockCol = mcu % component.blocksPerLine;
decodeFn(component, component.blocks[blockRow][blockCol]);
diff --git a/image/lib/src/formats/jpeg_decoder.dart b/image/lib/src/formats/jpeg_decoder.dart
index 284a4b4..0f13418 100755
--- a/image/lib/src/formats/jpeg_decoder.dart
+++ b/image/lib/src/formats/jpeg_decoder.dart
@@ -1,5 +1,3 @@
-import 'dart:typed_data';
-
import '../animation.dart';
import '../color.dart';
import '../exif_data.dart';
@@ -11,16 +9,12 @@
import 'jpeg/jpeg_data.dart';
import 'jpeg/jpeg_info.dart';
-/**
- * Decode a jpeg encoded image.
- */
+/// Decode a jpeg encoded image.
class JpegDecoder extends Decoder {
JpegInfo info;
InputBuffer input;
- /**
- * Is the given file a valid JPEG image?
- */
+ /// Is the given file a valid JPEG image?
bool isValidFile(List<int> data) {
return new JpegData().validate(data);
}
@@ -51,7 +45,7 @@
return image;
}
- Image decodeImage(List<int> data, {int frame: 0}) {
+ Image decodeImage(List<int> data, {int frame = 0}) {
JpegData jpeg = JpegData();
jpeg.read(data);
diff --git a/image/lib/src/formats/jpeg_encoder.dart b/image/lib/src/formats/jpeg_encoder.dart
index 943867d..d68b49c 100755
--- a/image/lib/src/formats/jpeg_encoder.dart
+++ b/image/lib/src/formats/jpeg_encoder.dart
@@ -6,14 +6,12 @@
import 'encoder.dart';
import 'jpeg/jpeg.dart';
-/**
- * Encode an image to the JPEG format.
- *
- * Derived from:
- * https://github.com/owencm/javascript-jpeg-encoder
- */
+/// Encode an image to the JPEG format.
+///
+/// Derived from:
+/// https://github.com/owencm/javascript-jpeg-encoder
class JpegEncoder extends Encoder {
- JpegEncoder({int quality: 100}) {
+ JpegEncoder({int quality = 100}) {
_initHuffmanTbl();
_initCategoryNumber();
_initRGBYUVTable();
@@ -21,10 +19,11 @@
}
void setQuality(int quality) {
- quality = quality.clamp(0, 100);
+ quality = quality.clamp(0, 100).toInt();
if (currentQuality == quality) {
- return; // don't recalc if unchanged
+ // don't re-calc if unchanged
+ return;
}
int sf = 0;
@@ -115,8 +114,8 @@
// Do the bit alignment of the EOI marker
if (_bytepos >= 0) {
- final fillbits = [(1 << (_bytepos + 1)) - 1, _bytepos + 1];
- _writeBits(fp, fillbits);
+ final fillBits = [(1 << (_bytepos + 1)) - 1, _bytepos + 1];
+ _writeBits(fp, fillBits);
}
_writeMarker(fp, Jpeg.M_EOI);
@@ -184,10 +183,10 @@
}
}
- List _computeHuffmanTbl(List nrcodes, List std_table) {
+ List<List<int>> _computeHuffmanTbl(List<int> nrcodes, List<int> std_table) {
int codevalue = 0;
int pos_in_table = 0;
- List HT = List();
+ List<List<int>> HT = [];
for (int k = 1; k <= 16; k++) {
for (int j = 1; j <= nrcodes[k]; j++) {
int index = std_table[pos_in_table];
@@ -224,7 +223,7 @@
bitcode[32767 + nr] = [nr, cat];
}
// Negative numbers
- for (int nrneg = -(nrupper-1); nrneg <= -nrlower; nrneg++) {
+ for (int nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) {
category[32767 + nrneg] = cat;
bitcode[32767 + nrneg] = [nrupper - 1 + nrneg, cat];
}
@@ -405,20 +404,20 @@
void _writeSOF0(OutputBuffer out, int width, int height) {
_writeMarker(out, Jpeg.M_SOF0);
- out.writeUint16(17); // length, truecolor YUV JPG
- out.writeByte(8); // precision
+ out.writeUint16(17); // length, truecolor YUV JPG
+ out.writeByte(8); // precision
out.writeUint16(height);
out.writeUint16(width);
- out.writeByte(3); // nrofcomponents
- out.writeByte(1); // IdY
+ out.writeByte(3); // nrofcomponents
+ out.writeByte(1); // IdY
out.writeByte(0x11); // HVY
- out.writeByte(0); // QTY
- out.writeByte(2); // IdU
+ out.writeByte(0); // QTY
+ out.writeByte(2); // IdU
out.writeByte(0x11); // HVU
- out.writeByte(1); // QTU
- out.writeByte(3); // IdV
+ out.writeByte(1); // QTU
+ out.writeByte(3); // IdV
out.writeByte(0x11); // HVV
- out.writeByte(1); // QTV
+ out.writeByte(1); // QTV
}
void _writeDQT(OutputBuffer out) {
@@ -487,9 +486,9 @@
}
int _processDU(OutputBuffer out, List<double> CDU, List<double> fdtbl,
- int DC, HTDC, HTAC) {
- List EOB = HTAC[0x00];
- List M16zeroes = HTAC[0xF0];
+ int DC, List<List<int>> HTDC, List<List<int>> HTAC) {
+ List<int> EOB = HTAC[0x00];
+ List<int> M16zeroes = HTAC[0xF0];
int pos;
const I16 = 16;
const I63 = 63;
@@ -525,7 +524,8 @@
int lng;
while (i <= end0pos) {
int startpos = i;
- for (; (DU[i] == 0) && (i <= end0pos); ++i);
+ for (; (DU[i] == 0) && (i <= end0pos); ++i) {
+ }
int nrzeroes = i - startpos;
if (nrzeroes >= I16) {
@@ -579,15 +579,15 @@
final UVTable = Uint8List(64);
final fdtbl_Y = Float32List(64);
final fdtbl_UV = Float32List(64);
- List YDC_HT;
- List UVDC_HT;
- List YAC_HT;
- List UVAC_HT;
+ List<List<int>> YDC_HT;
+ List<List<int>> UVDC_HT;
+ List<List<int>> YAC_HT;
+ List<List<int>> UVAC_HT;
- final bitcode = List(65535);
- final category = List(65535);
+ final bitcode = List<List<int>>(65535);
+ final category = List<int>(65535);
final outputfDCTQuant = List<int>(64);
- final DU = List(64);
+ final DU = List<int>(64);
final Float32List YDU = Float32List(64);
final Float32List UDU = Float32List(64);
diff --git a/image/lib/src/formats/png/png_frame.dart b/image/lib/src/formats/png/png_frame.dart
index 407a34a..8e3d186 100755
--- a/image/lib/src/formats/png/png_frame.dart
+++ b/image/lib/src/formats/png/png_frame.dart
@@ -1,8 +1,6 @@
import '../../internal/internal.dart';
-/**
- * Decodes a frame from a PNG animation.
- */
+/// Decodes a frame from a PNG animation.
class PngFrame {
// DisposeMode
static const int APNG_DISPOSE_OP_NONE = 0;
diff --git a/image/lib/src/formats/png_decoder.dart b/image/lib/src/formats/png_decoder.dart
index e52f06f..365ea11 100755
--- a/image/lib/src/formats/png_decoder.dart
+++ b/image/lib/src/formats/png_decoder.dart
@@ -1,5 +1,3 @@
-//import 'dart:math' as Math;
-
import 'package:archive/archive.dart';
import '../animation.dart';
@@ -14,15 +12,11 @@
import 'png/png_frame.dart';
import 'png/png_info.dart';
-/**
- * Decode a PNG encoded image.
- */
+/// Decode a PNG encoded image.
class PngDecoder extends Decoder {
InternalPngInfo _info;
- /**
- * Is the given file a valid PNG image?
- */
+ /// Is the given file a valid PNG image?
bool isValidFile(List<int> data) {
InputBuffer input = InputBuffer(data, bigEndian: true);
InputBuffer pngHeader = input.readBytes(8);
@@ -38,10 +32,8 @@
PngInfo get info => _info;
- /**
- * Start decoding the data as an animation sequence, but don't actually
- * process the frames until they are requested with decodeFrame.
- */
+ /// Start decoding the data as an animation sequence, but don't actually
+ /// process the frames until they are requested with decodeFrame.
DecodeInfo startDecode(List<int> data) {
_input = InputBuffer(data, bigEndian: true);
@@ -72,8 +64,8 @@
// Validate some of the info in the header to make sure we support
// the proposed image data.
- if (![GRAYSCALE, RGB, INDEXED,
- GRAYSCALE_ALPHA, RGBA].contains(_info.colorType)) {
+ if (![GRAYSCALE, RGB, INDEXED, GRAYSCALE_ALPHA, RGBA]
+ .contains(_info.colorType)) {
return null;
}
@@ -173,7 +165,7 @@
break;
case 'fdAT':
/*int sequenceNumber =*/ _input.readUint32();
- InternalPngFrame frame = _info.frames.last;
+ InternalPngFrame frame = _info.frames.last as InternalPngFrame;
frame.fdat.add(inputPos);
_input.skip(chunkSize - 4);
_input.skip(4); // CRC
@@ -190,7 +182,7 @@
} else if (_info.colorType == 0 || _info.colorType == 4) {
/*int gray =*/ _input.readUint16();
chunkSize -= 2;
- } else if (_info.colorType == 2 || _info.colorType ==6) {
+ } else if (_info.colorType == 2 || _info.colorType == 6) {
/*int r =*/ _input.readUint16();
/*int g =*/ _input.readUint16();
/*int b =*/ _input.readUint16();
@@ -227,14 +219,10 @@
return _info;
}
- /**
- * The number of frames that can be decoded.
- */
+ /// The number of frames that can be decoded.
int numFrames() => _info != null ? _info.numFrames : 0;
- /**
- * Decode the frame (assuming [startDecode] has already been called).
- */
+ /// Decode the frame (assuming [startDecode] has already been called).
Image decodeFrame(int frame) {
if (_info == null) {
return null;
@@ -263,7 +251,7 @@
throw new ImageException('Invalid Frame Number: $frame');
}
- InternalPngFrame f = _info.frames[frame];
+ InternalPngFrame f = _info.frames[frame] as InternalPngFrame;
width = f.width;
height = f.height;
for (int i = 0; i < f.fdat.length; ++i) {
@@ -281,7 +269,8 @@
int format;
if (_info.colorType == GRAYSCALE_ALPHA ||
- _info.colorType == RGBA || _info.transparency != null) {
+ _info.colorType == RGBA ||
+ _info.transparency != null) {
format = Image.RGBA;
} else {
format = Image.RGB;
@@ -337,14 +326,13 @@
_info.width = origW;
_info.height = origH;
- image.iccProfile = ICCProfileData(_info.iCCPName,
- ICCPCompression.deflate,
- _info.iCCPData);
+ image.iccProfile =
+ ICCProfileData(_info.iCCPName, ICCPCompression.deflate, _info.iCCPData);
return image;
}
- Image decodeImage(List<int> data, {int frame: 0}) {
+ Image decodeImage(List<int> data, {int frame = 0}) {
if (startDecode(data) == null) {
return null;
}
@@ -387,8 +375,10 @@
dispose == PngFrame.APNG_DISPOSE_OP_PREVIOUS) {
lastImage.fill(_info.backgroundColor);
}
- copyInto(lastImage, image, dstX: frame.xOffset, dstY: frame.yOffset,
- blend: frame.blend == PngFrame.APNG_BLEND_OP_OVER);
+ copyInto(lastImage, image,
+ dstX: frame.xOffset,
+ dstY: frame.yOffset,
+ blend: frame.blend == PngFrame.APNG_BLEND_OP_OVER);
} else {
lastImage = image;
}
@@ -401,15 +391,12 @@
return anim;
}
- /**
- * Process a pass of an interlaced image.
- */
- void _processPass(InputBuffer input, Image image,
- int xOffset, int yOffset, int xStep, int yStep,
- int passWidth, int passHeight) {
- final int channels = (_info.colorType == GRAYSCALE_ALPHA) ? 2 :
- (_info.colorType == RGB) ? 3 :
- (_info.colorType == RGBA) ? 4 : 1;
+ /// Process a pass of an interlaced image.
+ void _processPass(InputBuffer input, Image image, int xOffset, int yOffset,
+ int xStep, int yStep, int passWidth, int passHeight) {
+ final int channels = (_info.colorType == GRAYSCALE_ALPHA)
+ ? 2
+ : (_info.colorType == RGB) ? 3 : (_info.colorType == RGBA) ? 4 : 1;
final int pixelDepth = channels * _info.bits;
final int bpp = (pixelDepth + 7) >> 3;
@@ -422,7 +409,8 @@
//int pi = 0;
for (int srcY = 0, dstY = yOffset, ri = 0;
- srcY < passHeight; ++srcY, dstY += yStep, ri = 1 - ri, _progressY++) {
+ srcY < passHeight;
+ ++srcY, dstY += yStep, ri = 1 - ri, _progressY++) {
int filterType = input.readByte();
inData[ri] = input.readBytes(rowBytes).toUint8List();
@@ -444,8 +432,9 @@
//int yMax = Math.min(dstY + blockHeight, _info.height);
- for (int srcX = 0, dstX = xOffset; srcX < passWidth;
- ++srcX, dstX += xStep) {
+ for (int srcX = 0, dstX = xOffset;
+ srcX < passWidth;
+ ++srcX, dstX += xStep) {
_readPixel(rowInput, pixel);
int c = _getColor(pixel);
image.setPixel(dstX, dstY, c);
@@ -455,7 +444,7 @@
//int xPixels = xMax - dstX;
for (int i = 0; i < blockHeight; ++i) {
for (int j = 0; j < blockWidth; ++j) {
- image.setPixel(dstX + j, dstY + j, c);
+ image.setPixelSafe(dstX + j, dstY + j, c);
}
}
}
@@ -464,9 +453,9 @@
}
void _process(InputBuffer input, Image image) {
- final int channels = (_info.colorType == GRAYSCALE_ALPHA) ? 2 :
- (_info.colorType == RGB) ? 3 :
- (_info.colorType == RGBA) ? 4 : 1;
+ final int channels = (_info.colorType == GRAYSCALE_ALPHA)
+ ? 2
+ : (_info.colorType == RGB) ? 3 : (_info.colorType == RGBA) ? 4 : 1;
final int pixelDepth = channels * _info.bits;
@@ -573,9 +562,7 @@
return c << 4;
}
- /**
- * Return the CRC of the bytes
- */
+ /// Return the CRC of the bytes
int _crc(String type, List<int> bytes) {
int crc = getCrc32(type.codeUnits);
return getCrc32(bytes, crc);
@@ -589,9 +576,7 @@
_bitBufferLen = 0;
}
- /**
- * Read a number of bits from the input stream.
- */
+ /// Read a number of bits from the input stream.
int _readBits(InputBuffer input, int numBits) {
if (numBits == 0) {
return 0;
@@ -620,11 +605,13 @@
}
// output byte
- int mask = (numBits == 1) ? 1 :
- (numBits == 2) ? 3 :
- (numBits == 4) ? 0xf :
- (numBits == 8) ? 0xff :
- (numBits == 16) ? 0xffff : 0;
+ int mask = (numBits == 1)
+ ? 1
+ : (numBits == 2)
+ ? 3
+ : (numBits == 4)
+ ? 0xf
+ : (numBits == 8) ? 0xff : (numBits == 16) ? 0xffff : 0;
int octet = (_bitBuffer >> (_bitBufferLen - numBits)) & mask;
@@ -633,9 +620,7 @@
return octet;
}
- /**
- * Read the next pixel from the input stream.
- */
+ /// Read the next pixel from the input stream.
void _readPixel(InputBuffer input, List<int> pixel) {
switch (_info.colorType) {
case GRAYSCALE:
@@ -664,9 +649,7 @@
throw new ImageException('Invalid color type: ${_info.colorType}.');
}
- /**
- * Get the color with the list of components.
- */
+ /// Get the color with the list of components.
int _getColor(List<int> raw) {
switch (_info.colorType) {
case GRAYSCALE:
@@ -750,8 +733,9 @@
case INDEXED:
int p = raw[0] * 3;
- int a = _info.transparency != null &&
- raw[0] < _info.transparency.length ? _info.transparency[raw[0]] : 255;
+ int a = _info.transparency != null && raw[0] < _info.transparency.length
+ ? _info.transparency[raw[0]]
+ : 255;
if (p >= _info.palette.length) {
return getColor(255, 255, 255, a);
diff --git a/image/lib/src/formats/png_encoder.dart b/image/lib/src/formats/png_encoder.dart
index 26df9da..f8daab3 100755
--- a/image/lib/src/formats/png_encoder.dart
+++ b/image/lib/src/formats/png_encoder.dart
@@ -9,14 +9,11 @@
import '../util/output_buffer.dart';
import 'encoder.dart';
-/**
- * Encode an image to the PNG format.
- */
+/// Encode an image to the PNG format.
class PngEncoder extends Encoder {
- PngEncoder({this.filter: FILTER_PAETH, this.level});
+ PngEncoder({this.filter = FILTER_PAETH, this.level});
void addFrame(Image image) {
-
xOffset = image.xOffset;
yOffset = image.xOffset;
delay = image.duration;
@@ -40,13 +37,12 @@
}
// Include room for the filter bytes (1 byte per row).
- List<int> filteredImage = Uint8List((image.width * image.height *
- image.format) + image.height);
+ List<int> filteredImage =
+ Uint8List((image.width * image.height * image.format) + image.height);
_filter(image, filteredImage);
- List<int> compressed = ZLibEncoder().encode(filteredImage,
- level: level);
+ List<int> compressed = ZLibEncoder().encode(filteredImage, level: level);
if (isAnimated) {
_writeFrameControlChunk();
@@ -82,14 +78,10 @@
return bytes;
}
- /**
- * Does this encoder support animation?
- */
+ /// Does this encoder support animation?
bool get supportsAnimation => true;
- /**
- * Encode an animation.
- */
+ /// Encode an animation.
List<int> encodeAnimation(Animation anim) {
isAnimated = true;
_frames = anim.frames.length;
@@ -101,9 +93,7 @@
return finish();
}
- /**
- * Encode a single frame image.
- */
+ /// Encode a single frame image.
List<int> encodeImage(Image image) {
isAnimated = false;
addFrame(image);
@@ -267,7 +257,8 @@
if (image.format == Image.RGBA) {
int ba = (row == 0) ? 0 : getAlpha(image.getPixel(x, row - 1));
int xa = getAlpha(image.getPixel(x, row));
- out[oi++] = (xa - ba) & 0xff;;
+ out[oi++] = (xa - ba) & 0xff;
+ ;
}
}
@@ -297,7 +288,8 @@
int aa = (x == 0) ? 0 : getAlpha(image.getPixel(x - 1, row));
int ba = (row == 0) ? 0 : getAlpha(image.getPixel(x, row - 1));
int xa = getAlpha(image.getPixel(x, row));
- out[oi++] = (xa - ((aa + ba) >> 1)) & 0xff;;
+ out[oi++] = (xa - ((aa + ba) >> 1)) & 0xff;
+ ;
}
}
@@ -329,9 +321,12 @@
int bg = (row == 0) ? 0 : getGreen(image.getPixel(x, row - 1));
int bb = (row == 0) ? 0 : getBlue(image.getPixel(x, row - 1));
- int cr = (row == 0 || x == 0) ? 0 : getRed(image.getPixel(x - 1, row - 1));
- int cg = (row == 0 || x == 0) ? 0 : getGreen(image.getPixel(x - 1, row - 1));
- int cb = (row == 0 || x == 0) ? 0 : getBlue(image.getPixel(x - 1, row - 1));
+ int cr =
+ (row == 0 || x == 0) ? 0 : getRed(image.getPixel(x - 1, row - 1));
+ int cg =
+ (row == 0 || x == 0) ? 0 : getGreen(image.getPixel(x - 1, row - 1));
+ int cb =
+ (row == 0 || x == 0) ? 0 : getBlue(image.getPixel(x - 1, row - 1));
int xr = getRed(image.getPixel(x, row));
int xg = getGreen(image.getPixel(x, row));
@@ -347,19 +342,19 @@
if (image.format == Image.RGBA) {
int aa = (x == 0) ? 0 : getAlpha(image.getPixel(x - 1, row));
int ba = (row == 0) ? 0 : getAlpha(image.getPixel(x, row - 1));
- int ca = (row == 0 || x == 0) ? 0 : getAlpha(image.getPixel(x - 1, row - 1));
+ int ca =
+ (row == 0 || x == 0) ? 0 : getAlpha(image.getPixel(x - 1, row - 1));
int xa = getAlpha(image.getPixel(x, row));
int pa = _paethPredictor(aa, ba, ca);
- out[oi++] = (xa - pa) & 0xff;;
+ out[oi++] = (xa - pa) & 0xff;
+ ;
}
}
return oi;
}
- /**
- * Return the CRC of the bytes
- */
+ /// Return the CRC of the bytes
int _crc(String type, List<int> bytes) {
int crc = getCrc32(type.codeUnits);
return getCrc32(bytes, crc);
diff --git a/image/lib/src/formats/psd/layer_data/psd_layer_additional_data.dart b/image/lib/src/formats/psd/layer_data/psd_layer_additional_data.dart
index 21f9732..f0686e0 100755
--- a/image/lib/src/formats/psd/layer_data/psd_layer_additional_data.dart
+++ b/image/lib/src/formats/psd/layer_data/psd_layer_additional_data.dart
@@ -4,7 +4,7 @@
class PsdLayerAdditionalData extends PsdLayerData {
InputBuffer data;
- PsdLayerAdditionalData(String tag, InputBuffer data) :
- this.data = data,
- super.type(tag);
+ PsdLayerAdditionalData(String tag, InputBuffer data)
+ : this.data = data,
+ super.type(tag);
}
diff --git a/image/lib/src/formats/psd/layer_data/psd_layer_section_divider.dart b/image/lib/src/formats/psd/layer_data/psd_layer_section_divider.dart
index 71ae146..ff9ad89 100755
--- a/image/lib/src/formats/psd/layer_data/psd_layer_section_divider.dart
+++ b/image/lib/src/formats/psd/layer_data/psd_layer_section_divider.dart
@@ -17,8 +17,7 @@
String key;
int subType = SUBTYPE_NORMAL;
- PsdLayerSectionDivider(String tag, InputBuffer data) :
- super.type(tag) {
+ PsdLayerSectionDivider(String tag, InputBuffer data) : super.type(tag) {
int len = data.length;
type = data.readUint32();
diff --git a/image/lib/src/formats/psd/psd_blending_ranges.dart b/image/lib/src/formats/psd/psd_blending_ranges.dart
index bb5e850..e62e544 100755
--- a/image/lib/src/formats/psd/psd_blending_ranges.dart
+++ b/image/lib/src/formats/psd/psd_blending_ranges.dart
@@ -36,4 +36,4 @@
}
}
}
-}
\ No newline at end of file
+}
diff --git a/image/lib/src/formats/psd/psd_channel.dart b/image/lib/src/formats/psd/psd_channel.dart
index 7a95ce6..1c99881 100755
--- a/image/lib/src/formats/psd/psd_channel.dart
+++ b/image/lib/src/formats/psd/psd_channel.dart
@@ -24,14 +24,13 @@
PsdChannel(this.id, this.dataLength);
PsdChannel.read(InputBuffer input, this.id, int width, int height,
- int bitDepth, int compression, Uint16List lineLengths,
- int planeNumber) {
- readPlane(input, width, height, bitDepth, compression, lineLengths,
- planeNumber);
+ int bitDepth, int compression, Uint16List lineLengths, int planeNumber) {
+ readPlane(
+ input, width, height, bitDepth, compression, lineLengths, planeNumber);
}
void readPlane(InputBuffer input, int width, int height, int bitDepth,
- [int compression, Uint16List lineLengths, int planeNum = 0]) {
+ [int compression, Uint16List lineLengths, int planeNum = 0]) {
if (compression == null) {
compression = input.readUint16();
}
@@ -44,8 +43,8 @@
if (lineLengths == null) {
lineLengths = _readLineLengths(input, height);
}
- _readPlaneRleCompressed(input, width, height, bitDepth, lineLengths,
- planeNum);
+ _readPlaneRleCompressed(
+ input, width, height, bitDepth, lineLengths, planeNum);
break;
default:
throw new ImageException('Unsupported compression: $compression');
@@ -60,8 +59,8 @@
return lineLengths;
}
- void _readPlaneUncompressed(InputBuffer input, int width, int height,
- int bitDepth) {
+ void _readPlaneUncompressed(
+ InputBuffer input, int width, int height, int bitDepth) {
int len = width * height;
if (bitDepth == 16) {
len *= 2;
@@ -77,8 +76,7 @@
}
void _readPlaneRleCompressed(InputBuffer input, int width, int height,
- int bitDepth, Uint16List lineLengths,
- int planeNum) {
+ int bitDepth, Uint16List lineLengths, int planeNum) {
int len = width * height;
if (bitDepth == 16) {
len *= 2;
diff --git a/image/lib/src/formats/psd/psd_image.dart b/image/lib/src/formats/psd/psd_image.dart
index b2a3ce7..f8e3f8d 100755
--- a/image/lib/src/formats/psd/psd_image.dart
+++ b/image/lib/src/formats/psd/psd_image.dart
@@ -1,4 +1,4 @@
-import 'dart:math' as Math;
+import 'dart:math';
import 'dart:typed_data';
import '../decode_info.dart';
@@ -58,10 +58,8 @@
/// The number of frames that can be decoded.
int get numFrames => 1;
- /**
- * Decode the raw psd structure without rendering the output image.
- * Use [renderImage] to render the output image.
- */
+ /// Decode the raw psd structure without rendering the output image.
+ /// Use [renderImage] to render the output image.
bool decode() {
if (!isValid || _input == null) {
return false;
@@ -133,8 +131,8 @@
int ab = pixels[di + 2];
int aa = pixels[di + 3];
- _blend(ar, ag, ab, aa, br, bg, bb, ba, blendMode, opacity,
- pixels, di);
+ _blend(
+ ar, ag, ab, aa, br, bg, bb, ba, blendMode, opacity, pixels, di);
}
di += 4;
@@ -145,10 +143,8 @@
return mergedImage;
}
- void _blend(int ar, int ag, int ab, int aa,
- int br, int bg, int bb, int ba,
- int blendMode, double opacity,
- Uint8List pixels, int di) {
+ void _blend(int ar, int ag, int ab, int aa, int br, int bg, int bb, int ba,
+ int blendMode, double opacity, Uint8List pixels, int di) {
int r = br;
int g = bg;
int b = bb;
@@ -281,11 +277,11 @@
}
static int _blendLighten(int a, int b) {
- return Math.max(a, b);
+ return max(a, b);
}
static int _blendDarken(int a, int b) {
- return Math.min(a, b);
+ return min(a, b);
}
static int _blendMultiply(int a, int b) {
@@ -302,11 +298,10 @@
if (2.0 * x < aa) {
z = 2.0 * y * x + y * (1.0 - aa) + x * (1.0 - ba);
} else {
- z = ba * aa - 2.0 * (aa - x) * (ba - y) +
- y * (1.0 - aa) + x * (1.0 - ba);
+ z = ba * aa - 2.0 * (aa - x) * (ba - y) + y * (1.0 - aa) + x * (1.0 - ba);
}
- return (z * 255.0).toInt().clamp(0, 255);
+ return (z * 255.0).clamp(0, 255).toInt();
}
static int _blendColorBurn(int a, int b) {
@@ -314,22 +309,22 @@
return 0; // We don't want to divide by zero
}
int c = (255.0 * (1.0 - (1.0 - (a / 255.0)) / (b / 255.0))).toInt();
- return c.clamp(0, 255);
+ return c.clamp(0, 255).toInt();
}
static int _blendLinearBurn(int a, int b) {
- return (a + b - 255).clamp(0, 255);
+ return (a + b - 255).clamp(0, 255).toInt();
}
static int _blendScreen(int a, int b) {
- return (255 - ((255 - b) * (255 - a))).clamp(0, 255);
+ return (255 - ((255 - b) * (255 - a))).clamp(0, 255).toInt();
}
static int _blendColorDodge(int a, int b) {
if (b == 255) {
return 255;
}
- return (((a / 255) / (1.0 - (b / 255.0))) * 255.0).toInt().clamp(0, 255);
+ return (((a / 255) / (1.0 - (b / 255.0))) * 255.0).clamp(0, 255).toInt();
}
static int _blendLinearDodge(int a, int b) {
@@ -339,8 +334,9 @@
static int _blendSoftLight(int a, int b) {
double aa = a / 255.0;
double bb = b / 255.0;
- return (255.0 * ((1.0 - bb) * bb * aa +
- bb * (1.0 - (1.0 - bb) * (1.0 - aa)))).round();
+ return (255.0 *
+ ((1.0 - bb) * bb * aa + bb * (1.0 - (1.0 - bb) * (1.0 - aa))))
+ .round();
}
static int _blendHardLight(int bottom, int top) {
@@ -354,7 +350,7 @@
}
static int _blendVividLight(int bottom, int top) {
- if ( top < 128) {
+ if (top < 128) {
return _blendColorBurn(bottom, 2 * top);
} else {
return _blendColorDodge(bottom, 2 * (top - 128));
@@ -370,9 +366,9 @@
}
static int _blendPinLight(int bottom, int top) {
- return (top < 128) ?
- _blendDarken(bottom, 2 * top) :
- _blendLighten(bottom, 2 * (top - 128));
+ return (top < 128)
+ ? _blendDarken(bottom, 2 * top)
+ : _blendLighten(bottom, 2 * (top - 128));
}
static int _blendHardMix(int bottom, int top) {
@@ -438,8 +434,8 @@
}
if (blockSignature == RESOURCE_BLOCK_SIGNATURE) {
- imageResources[blockId] = PsdImageResource(blockId, blockName,
- blockData);
+ imageResources[blockId] =
+ PsdImageResource(blockId, blockName, blockData);
}
}
}
@@ -504,23 +500,19 @@
mergeImageChannels = [];
for (int i = 0; i < channels; ++i) {
mergeImageChannels.add(new PsdChannel.read(_imageData, i == 3 ? -1 : i,
- width, height, depth, compression,
- lineLengths, i));
+ width, height, depth, compression, lineLengths, i));
}
- mergedImage = createImageFromChannels(colorMode, depth,
- width, height,
- mergeImageChannels);
+ mergedImage = createImageFromChannels(
+ colorMode, depth, width, height, mergeImageChannels);
}
static int _ch(List<int> data, int si, int ns) {
- return ns == 1 ? data[si] :
- ((data[si] << 8) | data[si + 1]) >> 8;
+ return ns == 1 ? data[si] : ((data[si] << 8) | data[si + 1]) >> 8;
}
static Image createImageFromChannels(int colorMode, int bitDepth, int width,
- int height,
- List<PsdChannel> channelList) {
+ int height, List<PsdChannel> channelList) {
Image output = Image(width, height);
Uint8List pixels = output.getBytes();
@@ -548,8 +540,7 @@
pixels[di++] = _ch(channel2.data, si, ns);
pixels[di++] = _ch(channel1.data, si, ns);
pixels[di++] = _ch(channel0.data, si, ns);
- pixels[di++] = numChannels >= 4 ?
- _ch(channel_1.data, si, ns) : 255;
+ pixels[di++] = numChannels >= 4 ? _ch(channel_1.data, si, ns) : 255;
var b = pixels[xi];
var g = pixels[xi + 1];
@@ -568,8 +559,7 @@
int L = _ch(channel0.data, si, ns) * 100 >> 8;
int a = _ch(channel1.data, si, ns) - 128;
int b = _ch(channel2.data, si, ns) - 128;
- int alpha = numChannels >= 4 ?
- _ch(channel_1.data, si, ns) : 255;
+ int alpha = numChannels >= 4 ? _ch(channel_1.data, si, ns) : 255;
List<int> rgb = labToRGB(L, a, b);
pixels[di++] = rgb[2];
pixels[di++] = rgb[1];
@@ -578,8 +568,7 @@
break;
case COLORMODE_GRAYSCALE:
int gray = _ch(channel0.data, si, ns);
- int alpha = numChannels >= 2 ?
- _ch(channel_1.data, si, ns) : 255;
+ int alpha = numChannels >= 2 ? _ch(channel_1.data, si, ns) : 255;
pixels[di++] = gray;
pixels[di++] = gray;
pixels[di++] = gray;
@@ -590,8 +579,7 @@
int m = _ch(channel1.data, si, ns);
int y = _ch(channel2.data, si, ns);
int k = _ch(channels[numChannels == 4 ? -1 : 3].data, si, ns);
- int alpha = numChannels >= 5 ?
- _ch(channel_1.data, si, ns) : 255;
+ int alpha = numChannels >= 5 ? _ch(channel_1.data, si, ns) : 255;
List<int> rgb = cmykToRGB(255 - c, 255 - m, 255 - y, 255 - k);
pixels[di++] = rgb[2];
pixels[di++] = rgb[1];
diff --git a/image/lib/src/formats/psd/psd_layer.dart b/image/lib/src/formats/psd/psd_layer.dart
index 9e25c12..59bda67 100755
--- a/image/lib/src/formats/psd/psd_layer.dart
+++ b/image/lib/src/formats/psd/psd_layer.dart
@@ -75,7 +75,6 @@
static const int FLAG_PHOTOSHOP_5 = 8;
static const int FLAG_PIXEL_DATA_IRRELEVANT_TO_APPEARANCE = 16;
-
PsdLayer([InputBuffer input]) {
if (input == null) {
return;
@@ -99,7 +98,7 @@
int sig = input.readUint32();
if (sig != SIGNATURE) {
throw new ImageException('Invalid PSD layer signature: '
- '${sig.toRadixString(16)}');
+ '${sig.toRadixString(16)}');
}
blendMode = input.readUint32();
@@ -145,7 +144,7 @@
int sig = extra.readUint32();
if (sig != SIGNATURE) {
throw new ImageException('PSD invalid signature for layer additional '
- 'data: ${sig.toRadixString(16)}');
+ 'data: ${sig.toRadixString(16)}');
}
String tag = extra.readString(4);
@@ -179,16 +178,24 @@
fx.intensity = data.readUint32();
fx.angle = data.readUint32();
fx.distance = data.readUint32();
- fx.color = [data.readUint16(), data.readUint16(),
- data.readUint16(), data.readUint16(),
- data.readUint16()];
+ fx.color = [
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16()
+ ];
fx.blendMode = data.readString(8);
fx.enabled = data.readByte() != 0;
fx.globalAngle = data.readByte() != 0;
fx.opacity = data.readByte();
- fx.nativeColor = [data.readUint16(), data.readUint16(),
- data.readUint16(), data.readUint16(),
- data.readUint16()];
+ fx.nativeColor = [
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16()
+ ];
} else if (fxTag == 'isdw') {
var fx = PsdInnerShadowEffect();
effects.add(fx);
@@ -197,32 +204,48 @@
fx.intensity = data.readUint32();
fx.angle = data.readUint32();
fx.distance = data.readUint32();
- fx.color = [data.readUint16(), data.readUint16(),
- data.readUint16(), data.readUint16(),
- data.readUint16()];
+ fx.color = [
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16()
+ ];
fx.blendMode = data.readString(8);
fx.enabled = data.readByte() != 0;
fx.globalAngle = data.readByte() != 0;
fx.opacity = data.readByte();
- fx.nativeColor = [data.readUint16(), data.readUint16(),
- data.readUint16(), data.readUint16(),
- data.readUint16()];
+ fx.nativeColor = [
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16()
+ ];
} else if (fxTag == 'oglw') {
var fx = PsdOuterGlowEffect();
effects.add(fx);
fx.version = data.readUint32();
fx.blur = data.readUint32();
fx.intensity = data.readUint32();
- fx.color = [data.readUint16(), data.readUint16(),
- data.readUint16(), data.readUint16(),
- data.readUint16()];
+ fx.color = [
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16()
+ ];
fx.blendMode = data.readString(8);
fx.enabled = data.readByte() != 0;
fx.opacity = data.readByte();
if (fx.version == 2) {
- fx.nativeColor = [data.readUint16(), data.readUint16(),
- data.readUint16(), data.readUint16(),
- data.readUint16()];
+ fx.nativeColor = [
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16()
+ ];
}
} else if (fxTag == 'iglw') {
var fx = PsdInnerGlowEffect();
@@ -230,17 +253,25 @@
fx.version = data.readUint32();
fx.blur = data.readUint32();
fx.intensity = data.readUint32();
- fx.color = [data.readUint16(), data.readUint16(),
- data.readUint16(), data.readUint16(),
- data.readUint16()];
+ fx.color = [
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16()
+ ];
fx.blendMode = data.readString(8);
fx.enabled = data.readByte() != 0;
fx.opacity = data.readByte();
if (fx.version == 2) {
fx.invert = data.readByte() != 0;
- fx.nativeColor = [data.readUint16(), data.readUint16(),
- data.readUint16(), data.readUint16(),
- data.readUint16()];
+ fx.nativeColor = [
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16()
+ ];
}
} else if (fxTag == 'bevl') {
var fx = PsdBevelEffect();
@@ -251,12 +282,20 @@
fx.blur = data.readUint32();
fx.highlightBlendMode = data.readString(8);
fx.shadowBlendMode = data.readString(8);
- fx.highlightColor = [data.readUint16(), data.readUint16(),
- data.readUint16(), data.readUint16(),
- data.readUint16()];
- fx.shadowColor = [data.readUint16(), data.readUint16(),
- data.readUint16(), data.readUint16(),
- data.readUint16()];
+ fx.highlightColor = [
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16()
+ ];
+ fx.shadowColor = [
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16()
+ ];
fx.bevelStyle = data.readByte();
fx.highlightOpacity = data.readByte();
fx.shadowOpacity = data.readByte();
@@ -264,26 +303,42 @@
fx.globalAngle = data.readByte() != 0;
fx.upOrDown = data.readByte();
if (fx.version == 2) {
- fx.realHighlightColor = [data.readUint16(), data.readUint16(),
- data.readUint16(), data.readUint16(),
- data.readUint16()];
- fx.realShadowColor = [data.readUint16(), data.readUint16(),
- data.readUint16(), data.readUint16(),
- data.readUint16()];
+ fx.realHighlightColor = [
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16()
+ ];
+ fx.realShadowColor = [
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16()
+ ];
}
} else if (fxTag == 'sofi') {
var fx = PsdSolidFillEffect();
effects.add(fx);
fx.version = data.readUint32();
fx.blendMode = data.readString(4);
- fx.color = [data.readUint16(), data.readUint16(),
- data.readUint16(), data.readUint16(),
- data.readUint16()];
+ fx.color = [
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16()
+ ];
fx.opacity = data.readByte();
fx.enabled = data.readByte() != 0;
- fx.nativeColor = [data.readUint16(), data.readUint16(),
- data.readUint16(), data.readUint16(),
- data.readUint16()];
+ fx.nativeColor = [
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16(),
+ data.readUint16()
+ ];
} else {
data.skip(size);
}
@@ -293,26 +348,21 @@
}
}
- /**
- * Is this layer visible?
- */
+ /// Is this layer visible?
bool isVisible() => flags & FLAG_HIDDEN == 0;
- /**
- * Is this layer a folder?
- */
+ /// Is this layer a folder?
int type() {
if (additionalData.containsKey(PsdLayerSectionDivider.TAG)) {
- PsdLayerSectionDivider section = additionalData[PsdLayerSectionDivider.TAG];
+ var section =
+ additionalData[PsdLayerSectionDivider.TAG] as PsdLayerSectionDivider;
return section.type;
}
return PsdLayerSectionDivider.NORMAL;
}
- /**
- * Get the channel for the given [id].
- * Returns null if the layer does not have the given channel.
- */
+ /// Get the channel for the given [id].
+ /// Returns null if the layer does not have the given channel.
PsdChannel getChannel(int id) {
for (int i = 0; i < channels.length; ++i) {
if (channels[i].id == id) {
@@ -327,7 +377,7 @@
channels[i].readPlane(input, width, height, psd.depth);
}
- layerImage = PsdImage.createImageFromChannels(psd.colorMode, psd.depth,
- width, height, channels);
+ layerImage = PsdImage.createImageFromChannels(
+ psd.colorMode, psd.depth, width, height, channels);
}
}
diff --git a/image/lib/src/formats/psd_decoder.dart b/image/lib/src/formats/psd_decoder.dart
index 1d9ef46..028f242 100755
--- a/image/lib/src/formats/psd_decoder.dart
+++ b/image/lib/src/formats/psd_decoder.dart
@@ -4,23 +4,17 @@
import 'decode_info.dart';
import 'psd/psd_image.dart';
-/**
- * Decode a Photoshop PSD image.
- */
+/// Decode a Photoshop PSD image.
class PsdDecoder extends Decoder {
PsdImage info;
- /**
- * A light-weight function to test if the given file is able to be decoded
- * by this Decoder.
- */
+ /// A light-weight function to test if the given file is able to be decoded
+ /// by this Decoder.
bool isValidFile(List<int> bytes) {
return new PsdImage(bytes).isValid;
}
- /**
- * Decode a raw PSD image without rendering it to a flat image.
- */
+ /// Decode a raw PSD image without rendering it to a flat image.
PsdImage decodePsd(List<int> bytes) {
PsdImage psd = PsdImage(bytes);
if (!psd.decode()) {
@@ -29,21 +23,17 @@
return psd;
}
- /**
- * Decode the file and extract a single image from it. If the file is
- * animated, the specified [frame] will be decoded. If there was a problem
- * decoding the file, null is returned.
- */
- Image decodeImage(List<int> bytes, {int frame: 0}) {
+ /// Decode the file and extract a single image from it. If the file is
+ /// animated, the specified [frame] will be decoded. If there was a problem
+ /// decoding the file, null is returned.
+ Image decodeImage(List<int> bytes, {int frame = 0}) {
startDecode(bytes);
return decodeFrame(frame);
}
- /**
- * Decode all of the frames from an animation. If the file is not an
- * animation, a single frame animation is returned. If there was a problem
- * decoding the file, null is returned.
- */
+ /// Decode all of the frames from an animation. If the file is not an
+ /// animation, a single frame animation is returned. If there was a problem
+ /// decoding the file, null is returned.
Animation decodeAnimation(List<int> bytes) {
if (startDecode(bytes) == null) {
return null;
@@ -64,28 +54,22 @@
return anim;
}
- /**
- * Start decoding the data as an animation sequence, but don't actually
- * process the frames until they are requested with decodeFrame.
- */
+ /// Start decoding the data as an animation sequence, but don't actually
+ /// process the frames until they are requested with decodeFrame.
DecodeInfo startDecode(List<int> bytes) {
info = PsdImage(bytes);
return info;
}
- /**
- * How many frames are available to be decoded. [startDecode] should have
- * been called first. Non animated image files will have a single frame.
- */
+ /// How many frames are available to be decoded. [startDecode] should have
+ /// been called first. Non animated image files will have a single frame.
int numFrames() => info != null ? info.numFrames : 0;
- /**
- * Decode a single frame from the data stat was set with [startDecode].
- * If [frame] is out of the range of available frames, null is returned.
- * Non animated image files will only have [frame] 0. An [AnimationFrame]
- * is returned, which provides the image, and top-left coordinates of the
- * image, as animated frames may only occupy a subset of the canvas.
- */
+ /// Decode a single frame from the data stat was set with [startDecode].
+ /// If [frame] is out of the range of available frames, null is returned.
+ /// Non animated image files will only have [frame] 0. An [AnimationFrame]
+ /// is returned, which provides the image, and top-left coordinates of the
+ /// image, as animated frames may only occupy a subset of the canvas.
Image decodeFrame(int frame) {
if (info == null) {
return null;
diff --git a/image/lib/src/formats/pvrtc/pvrtc_bit_utility.dart b/image/lib/src/formats/pvrtc/pvrtc_bit_utility.dart
index 86cb522..47ce77c 100755
--- a/image/lib/src/formats/pvrtc/pvrtc_bit_utility.dart
+++ b/image/lib/src/formats/pvrtc/pvrtc_bit_utility.dart
@@ -5,183 +5,1621 @@
(value >> shift) | (value << (32 - shift));
static const List<int> BITSCALE_5_TO_8 = const [
- 0, 8, 16, 24, 32, 41, 49, 57, 65, 74,
- 82, 90, 98, 106, 115, 123, 131, 139, 148, 156,
- 164, 172, 180, 189, 197, 205, 213, 222, 230, 238,
- 246, 255];
+ 0,
+ 8,
+ 16,
+ 24,
+ 32,
+ 41,
+ 49,
+ 57,
+ 65,
+ 74,
+ 82,
+ 90,
+ 98,
+ 106,
+ 115,
+ 123,
+ 131,
+ 139,
+ 148,
+ 156,
+ 164,
+ 172,
+ 180,
+ 189,
+ 197,
+ 205,
+ 213,
+ 222,
+ 230,
+ 238,
+ 246,
+ 255
+ ];
static const List<int> BITSCALE_4_TO_8 = const [
- 0, 17, 34, 51, 68, 85, 102, 119, 136, 153,
- 170, 187, 204, 221, 238, 255];
+ 0,
+ 17,
+ 34,
+ 51,
+ 68,
+ 85,
+ 102,
+ 119,
+ 136,
+ 153,
+ 170,
+ 187,
+ 204,
+ 221,
+ 238,
+ 255
+ ];
static const List<int> BITSCALE_3_TO_8 = const [
- 0, 36, 72, 109, 145, 182, 218, 255];
+ 0,
+ 36,
+ 72,
+ 109,
+ 145,
+ 182,
+ 218,
+ 255
+ ];
static const List<int> BITSCALE_8_TO_5_FLOOR = const [
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
- 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
- 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
- 3, 3, 3, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 5, 5, 5, 5, 5, 5, 5, 5,
- 6, 6, 6, 6, 6, 6, 6, 6, 7, 7,
- 7, 7, 7, 7, 7, 7, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 9, 9, 9, 9, 9,
- 9, 9, 9, 10, 10, 10, 10, 10, 10, 10,
- 10, 11, 11, 11, 11, 11, 11, 11, 11, 12,
- 12, 12, 12, 12, 12, 12, 12, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 14, 14, 14, 14,
- 14, 14, 14, 14, 15, 15, 15, 15, 15, 15,
- 15, 15, 16, 16, 16, 16, 16, 16, 16, 16,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 18,
- 18, 18, 18, 18, 18, 18, 18, 19, 19, 19,
- 19, 19, 19, 19, 19, 20, 20, 20, 20, 20,
- 20, 20, 20, 21, 21, 21, 21, 21, 21, 21,
- 21, 22, 22, 22, 22, 22, 22, 22, 22, 22,
- 23, 23, 23, 23, 23, 23, 23, 23, 24, 24,
- 24, 24, 24, 24, 24, 24, 25, 25, 25, 25,
- 25, 25, 25, 25, 26, 26, 26, 26, 26, 26,
- 26, 26, 26, 27, 27, 27, 27, 27, 27, 27,
- 27, 28, 28, 28, 28, 28, 28, 28, 28, 29,
- 29, 29, 29, 29, 29, 29, 29, 30, 30, 30,
- 30, 30, 30, 30, 30, 31];
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 15,
+ 15,
+ 15,
+ 15,
+ 15,
+ 15,
+ 15,
+ 15,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 17,
+ 17,
+ 17,
+ 17,
+ 17,
+ 17,
+ 17,
+ 17,
+ 17,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 19,
+ 19,
+ 19,
+ 19,
+ 19,
+ 19,
+ 19,
+ 19,
+ 20,
+ 20,
+ 20,
+ 20,
+ 20,
+ 20,
+ 20,
+ 20,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 22,
+ 22,
+ 22,
+ 22,
+ 22,
+ 22,
+ 22,
+ 22,
+ 22,
+ 23,
+ 23,
+ 23,
+ 23,
+ 23,
+ 23,
+ 23,
+ 23,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 25,
+ 25,
+ 25,
+ 25,
+ 25,
+ 25,
+ 25,
+ 25,
+ 26,
+ 26,
+ 26,
+ 26,
+ 26,
+ 26,
+ 26,
+ 26,
+ 26,
+ 27,
+ 27,
+ 27,
+ 27,
+ 27,
+ 27,
+ 27,
+ 27,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 29,
+ 29,
+ 29,
+ 29,
+ 29,
+ 29,
+ 29,
+ 29,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 31
+ ];
static const List<int> BITSCALE_8_TO_4_FLOOR = const [
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 15];
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 15
+ ];
static const List<int> BITSCALE_8_TO_3_FLOOR = const [
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 7];
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 7
+ ];
static const List<int> BITSCALE_8_TO_5_CEIL = const [
- 0, 1, 1, 1, 1, 1, 1, 1, 1, 2,
- 2, 2, 2, 2, 2, 2, 2, 3, 3, 3,
- 3, 3, 3, 3, 3, 4, 4, 4, 4, 4,
- 4, 4, 4, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 6, 6, 6, 6, 6, 6, 6, 6,
- 7, 7, 7, 7, 7, 7, 7, 7, 8, 8,
- 8, 8, 8, 8, 8, 8, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 10, 10, 10, 10, 10,
- 10, 10, 10, 11, 11, 11, 11, 11, 11, 11,
- 11, 12, 12, 12, 12, 12, 12, 12, 12, 13,
- 13, 13, 13, 13, 13, 13, 13, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 15, 15, 15, 15,
- 15, 15, 15, 15, 16, 16, 16, 16, 16, 16,
- 16, 16, 17, 17, 17, 17, 17, 17, 17, 17,
- 18, 18, 18, 18, 18, 18, 18, 18, 18, 19,
- 19, 19, 19, 19, 19, 19, 19, 20, 20, 20,
- 20, 20, 20, 20, 20, 21, 21, 21, 21, 21,
- 21, 21, 21, 22, 22, 22, 22, 22, 22, 22,
- 22, 23, 23, 23, 23, 23, 23, 23, 23, 23,
- 24, 24, 24, 24, 24, 24, 24, 24, 25, 25,
- 25, 25, 25, 25, 25, 25, 26, 26, 26, 26,
- 26, 26, 26, 26, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 28, 28, 28, 28, 28, 28, 28,
- 28, 29, 29, 29, 29, 29, 29, 29, 29, 30,
- 30, 30, 30, 30, 30, 30, 30, 31, 31, 31,
- 31, 31, 31, 31, 31, 31];
+ 0,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 15,
+ 15,
+ 15,
+ 15,
+ 15,
+ 15,
+ 15,
+ 15,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 17,
+ 17,
+ 17,
+ 17,
+ 17,
+ 17,
+ 17,
+ 17,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 19,
+ 19,
+ 19,
+ 19,
+ 19,
+ 19,
+ 19,
+ 19,
+ 20,
+ 20,
+ 20,
+ 20,
+ 20,
+ 20,
+ 20,
+ 20,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 22,
+ 22,
+ 22,
+ 22,
+ 22,
+ 22,
+ 22,
+ 22,
+ 23,
+ 23,
+ 23,
+ 23,
+ 23,
+ 23,
+ 23,
+ 23,
+ 23,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 25,
+ 25,
+ 25,
+ 25,
+ 25,
+ 25,
+ 25,
+ 25,
+ 26,
+ 26,
+ 26,
+ 26,
+ 26,
+ 26,
+ 26,
+ 26,
+ 27,
+ 27,
+ 27,
+ 27,
+ 27,
+ 27,
+ 27,
+ 27,
+ 27,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 29,
+ 29,
+ 29,
+ 29,
+ 29,
+ 29,
+ 29,
+ 29,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 31,
+ 31,
+ 31,
+ 31,
+ 31,
+ 31,
+ 31,
+ 31,
+ 31
+ ];
static const List<int> BITSCALE_8_TO_4_CEIL = const [
- 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14, 14, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15];
+ 0,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 10,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 13,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 15,
+ 15,
+ 15,
+ 15,
+ 15,
+ 15,
+ 15,
+ 15,
+ 15,
+ 15,
+ 15,
+ 15,
+ 15,
+ 15,
+ 15,
+ 15,
+ 15
+ ];
static const List<int> BITSCALE_8_TO_3_CEIL = const [
- 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 4, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7];
+ 0,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7
+ ];
}
diff --git a/image/lib/src/formats/pvrtc/pvrtc_color.dart b/image/lib/src/formats/pvrtc/pvrtc_color.dart
index 3060cba..489c56c 100755
--- a/image/lib/src/formats/pvrtc/pvrtc_color.dart
+++ b/image/lib/src/formats/pvrtc/pvrtc_color.dart
@@ -6,14 +6,13 @@
PvrtcColorRgb([this.r = 0, this.g = 0, this.b = 0]);
PvrtcColorRgb.from(PvrtcColorRgb other)
- : r = other.r
- , g = other.g
- , b = other.b;
+ : r = other.r,
+ g = other.g,
+ b = other.b;
PvrtcColorRgb copy() => new PvrtcColorRgb.from(this);
- PvrtcColorRgb operator *(int x) =>
- new PvrtcColorRgb(r * x, g * x, b * x);
+ PvrtcColorRgb operator *(int x) => new PvrtcColorRgb(r * x, g * x, b * x);
PvrtcColorRgb operator +(PvrtcColorRgb x) =>
new PvrtcColorRgb(r + x.r, g + x.g, b + x.b);
@@ -57,15 +56,15 @@
PvrtcColorRgba([this.r = 0, this.g = 0, this.b = 0, this.a = 0]);
PvrtcColorRgba.from(PvrtcColorRgba other)
- : r = other.r
- , g = other.g
- , b = other.b
- , a = other.a;
+ : r = other.r,
+ g = other.g,
+ b = other.b,
+ a = other.a;
PvrtcColorRgba copy() => new PvrtcColorRgba.from(this);
PvrtcColorRgba operator *(int x) =>
- new PvrtcColorRgba(r * x, g * x, b * x, a * x);
+ new PvrtcColorRgba(r * x, g * x, b * x, a * x);
PvrtcColorRgba operator +(PvrtcColorRgba x) =>
new PvrtcColorRgba(r + x.r, g + x.g, b + x.b, a + x.a);
diff --git a/image/lib/src/formats/pvrtc/pvrtc_color_bounding_box.dart b/image/lib/src/formats/pvrtc/pvrtc_color_bounding_box.dart
index 036a55c..9ea96c7 100755
--- a/image/lib/src/formats/pvrtc/pvrtc_color_bounding_box.dart
+++ b/image/lib/src/formats/pvrtc/pvrtc_color_bounding_box.dart
@@ -1,12 +1,12 @@
class PvrtcColorBoundingBox {
- var min;
- var max;
+ dynamic min;
+ dynamic max;
- PvrtcColorBoundingBox(min, max)
- : this.min = min.copy()
- , this.max = max.copy();
+ PvrtcColorBoundingBox(dynamic min, dynamic max)
+ : this.min = min.copy(),
+ this.max = max.copy();
- void add(c) {
+ void add(dynamic c) {
min.setMin(c);
max.setMax(c);
}
diff --git a/image/lib/src/formats/pvrtc/pvrtc_decoder.dart b/image/lib/src/formats/pvrtc/pvrtc_decoder.dart
index 1355e0d..1f05079 100755
--- a/image/lib/src/formats/pvrtc/pvrtc_decoder.dart
+++ b/image/lib/src/formats/pvrtc/pvrtc_decoder.dart
@@ -6,10 +6,8 @@
import 'pvrtc_color.dart';
import 'pvrtc_packet.dart';
-/**
- * Ported from Jeffrey Lim's PVRTC encoder/decoder,
- * https://bitbucket.org/jthlim/pvrtccompressor
- */
+/// Ported from Jeffrey Lim's PVRTC encoder/decoder,
+/// https://bitbucket.org/jthlim/pvrtccompressor
class PvrtcDecoder {
Image decodePvr(List<int> data) {
// Use a heuristic to detect potential apple PVRTC formats
@@ -17,7 +15,7 @@
// very likely to be apple PVRTC
var image = decodeApplePVRTC(data);
if (image != null) {
- return image;
+ return image;
}
}
@@ -120,17 +118,17 @@
const int HEADER_SIZE = 52;
const int PVRTEX_CUBEMAP = (1 << 12);
- const int PVR_PIXELTYPE_MASK = 0xff;
- const int PVR_TYPE_RGBA4444 = 0x10;
- const int PVR_TYPE_RGBA5551 = 0x11;
- const int PVR_TYPE_RGBA8888 = 0x12;
- const int PVR_TYPE_RGB565 = 0x13;
- const int PVR_TYPE_RGB555 = 0x14;
- const int PVR_TYPE_RGB888 = 0x15;
- const int PVR_TYPE_I8 = 0x16;
- const int PVR_TYPE_AI8 = 0x17;
- const int PVR_TYPE_PVRTC2 = 0x18;
- const int PVR_TYPE_PVRTC4 = 0x19;
+ const int PVR_PIXELTYPE_MASK = 0xff;
+ const int PVR_TYPE_RGBA4444 = 0x10;
+ const int PVR_TYPE_RGBA5551 = 0x11;
+ const int PVR_TYPE_RGBA8888 = 0x12;
+ const int PVR_TYPE_RGB565 = 0x13;
+ const int PVR_TYPE_RGB555 = 0x14;
+ const int PVR_TYPE_RGB888 = 0x15;
+ const int PVR_TYPE_I8 = 0x16;
+ const int PVR_TYPE_AI8 = 0x17;
+ const int PVR_TYPE_PVRTC2 = 0x18;
+ const int PVR_TYPE_PVRTC4 = 0x19;
if (length < HEADER_SIZE) {
return null;
@@ -279,7 +277,7 @@
Uint8List out = image.getBytes();
int oi = 0;
for (int y = 0; y < height; ++y) {
- for(int x = 0; x < width; ++x) {
+ for (int x = 0; x < width; ++x) {
int i = input.readByte();
out[oi++] = i;
out[oi++] = i;
@@ -293,7 +291,7 @@
Uint8List out = image.getBytes();
int oi = 0;
for (int y = 0; y < height; ++y) {
- for(int x = 0; x < width; ++x) {
+ for (int x = 0; x < width; ++x) {
int i = input.readByte();
int a = input.readByte();
out[oi++] = i;
@@ -307,8 +305,9 @@
// Currently unsupported
return null;
case PVR_TYPE_PVRTC4:
- return amask == 0 ? decodeRgb4bpp(width, height, input.toUint8List()) :
- decodeRgba4bpp(width, height, input.toUint8List());
+ return amask == 0
+ ? decodeRgb4bpp(width, height, input.toUint8List())
+ : decodeRgba4bpp(width, height, input.toUint8List());
}
// Unknown format
@@ -359,8 +358,12 @@
/*int flags =*/ input.readUint32();
var format = input.readUint32();
- var order = [input.readByte(), input.readByte(),
- input.readByte(), input.readByte()];
+ var order = [
+ input.readByte(),
+ input.readByte(),
+ input.readByte(),
+ input.readByte()
+ ];
/*int colorspace =*/ input.readUint32();
/*int channeltype =*/ input.readUint32();
int height = input.readUint32();
@@ -494,14 +497,14 @@
p3.setBlock(x1, y1);
var ca = p0.getColorRgbA() * factors[factorIndex][0] +
- p1.getColorRgbA() * factors[factorIndex][1] +
- p2.getColorRgbA() * factors[factorIndex][2] +
- p3.getColorRgbA() * factors[factorIndex][3];
+ p1.getColorRgbA() * factors[factorIndex][1] +
+ p2.getColorRgbA() * factors[factorIndex][2] +
+ p3.getColorRgbA() * factors[factorIndex][3];
var cb = p0.getColorRgbB() * factors[factorIndex][0] +
- p1.getColorRgbB() * factors[factorIndex][1] +
- p2.getColorRgbB() * factors[factorIndex][2] +
- p3.getColorRgbB() * factors[factorIndex][3];
+ p1.getColorRgbB() * factors[factorIndex][1] +
+ p2.getColorRgbB() * factors[factorIndex][2] +
+ p3.getColorRgbB() * factors[factorIndex][3];
var w = weights[weightIndex + mod & 3];
@@ -563,14 +566,14 @@
p3.setBlock(x1, y1);
var ca = p0.getColorRgbaA() * factors[factorIndex][0] +
- p1.getColorRgbaA() * factors[factorIndex][1] +
- p2.getColorRgbaA() * factors[factorIndex][2] +
- p3.getColorRgbaA() * factors[factorIndex][3];
+ p1.getColorRgbaA() * factors[factorIndex][1] +
+ p2.getColorRgbaA() * factors[factorIndex][2] +
+ p3.getColorRgbaA() * factors[factorIndex][3];
var cb = p0.getColorRgbaB() * factors[factorIndex][0] +
- p1.getColorRgbaB() * factors[factorIndex][1] +
- p2.getColorRgbaB() * factors[factorIndex][2] +
- p3.getColorRgbaB() * factors[factorIndex][3];
+ p1.getColorRgbaB() * factors[factorIndex][1] +
+ p2.getColorRgbaB() * factors[factorIndex][2] +
+ p3.getColorRgbaB() * factors[factorIndex][3];
var w = weights[weightIndex + mod & 3];
diff --git a/image/lib/src/formats/pvrtc/pvrtc_encoder.dart b/image/lib/src/formats/pvrtc/pvrtc_encoder.dart
index ca1241d..d4f4710 100755
--- a/image/lib/src/formats/pvrtc/pvrtc_encoder.dart
+++ b/image/lib/src/formats/pvrtc/pvrtc_encoder.dart
@@ -9,10 +9,8 @@
import 'pvrtc_color_bounding_box.dart';
import 'pvrtc_packet.dart';
-/**
- * Ported from Jeffrey Lim's PVRTC encoder/decoder,
- * https://bitbucket.org/jthlim/pvrtccompressor
- */
+/// Ported from Jeffrey Lim's PVRTC encoder/decoder,
+/// https://bitbucket.org/jthlim/pvrtccompressor
class PvrtcEncoder {
// PVR Format
static const int PVR_AUTO = -1;
@@ -21,12 +19,12 @@
static const int PVR_RGB_4BPP = 2;
static const int PVR_RGBA_4BPP = 3;
- Uint8List encodePvr(Image bitmap, {int format: PVR_AUTO}) {
+ Uint8List encodePvr(Image bitmap, {int format = PVR_AUTO}) {
OutputBuffer output = OutputBuffer();
- var pvrtc;
+ dynamic pvrtc;
if (format == PVR_AUTO) {
- if (bitmap.format == Image.RGB) {
+ if (bitmap.format == Image.RGB) {
pvrtc = encodeRgb4Bpp(bitmap);
format = PVR_RGB_4BPP;
} else {
@@ -73,9 +71,9 @@
output.writeUint32(mipmapCount);
output.writeUint32(metaDataSize);
- output.writeBytes(pvrtc);
+ output.writeBytes(pvrtc as List<int>);
- return output.getBytes();
+ return output.getBytes() as Uint8List;
}
Uint8List encodeRgb4Bpp(Image bitmap) {
@@ -106,8 +104,8 @@
packet.setBlock(x, y);
packet.usePunchthroughAlpha = 0;
var cbb = _calculateBoundingBoxRgb(bitmap, x, y);
- packet.setColorRgbA(cbb.min);
- packet.setColorRgbB(cbb.max);
+ packet.setColorRgbA(cbb.min as PvrtcColorRgb);
+ packet.setColorRgbB(cbb.max as PvrtcColorRgb);
}
}
@@ -125,7 +123,7 @@
final int y0 = (y + yOffset) & blockMask;
final int y1 = (y0 + 1) & blockMask;
- for(int px = 0; px < 4; ++px) {
+ for (int px = 0; px < 4; ++px) {
final int xOffset = (px < 2) ? -1 : 0;
final int x0 = (x + xOffset) & blockMask;
final int x1 = (x0 + 1) & blockMask;
@@ -136,14 +134,14 @@
p3.setBlock(x1, y1);
var ca = p0.getColorRgbA() * factors[factorIndex][0] +
- p1.getColorRgbA() * factors[factorIndex][1] +
- p2.getColorRgbA() * factors[factorIndex][2] +
- p3.getColorRgbA() * factors[factorIndex][3];
+ p1.getColorRgbA() * factors[factorIndex][1] +
+ p2.getColorRgbA() * factors[factorIndex][2] +
+ p3.getColorRgbA() * factors[factorIndex][3];
var cb = p0.getColorRgbB() * factors[factorIndex][0] +
- p1.getColorRgbB() * factors[factorIndex][1] +
- p2.getColorRgbB() * factors[factorIndex][2] +
- p3.getColorRgbB() * factors[factorIndex][3];
+ p1.getColorRgbB() * factors[factorIndex][1] +
+ p2.getColorRgbB() * factors[factorIndex][2] +
+ p3.getColorRgbB() * factors[factorIndex][3];
int pi = pixelIndex + ((py * size + px) * 4);
int r = bitmapData[pi];
@@ -182,7 +180,6 @@
return outputData;
}
-
Uint8List encodeRgba4Bpp(Image bitmap) {
if (bitmap.width != bitmap.height) {
throw new ImageException('PVRTC requires a square image.');
@@ -211,8 +208,8 @@
packet.setBlock(x, y);
packet.usePunchthroughAlpha = 0;
var cbb = _calculateBoundingBoxRgba(bitmap, x, y);
- packet.setColorRgbaA(cbb.min);
- packet.setColorRgbaB(cbb.max);
+ packet.setColorRgbaA(cbb.min as PvrtcColorRgba);
+ packet.setColorRgbaB(cbb.max as PvrtcColorRgba);
}
}
@@ -230,7 +227,7 @@
final int y0 = (y + yOffset) & blockMask;
final int y1 = (y0 + 1) & blockMask;
- for(int px = 0; px < 4; ++px) {
+ for (int px = 0; px < 4; ++px) {
final int xOffset = (px < 2) ? -1 : 0;
final int x0 = (x + xOffset) & blockMask;
final int x1 = (x0 + 1) & blockMask;
@@ -241,14 +238,14 @@
p3.setBlock(x1, y1);
var ca = p0.getColorRgbaA() * factors[factorIndex][0] +
- p1.getColorRgbaA() * factors[factorIndex][1] +
- p2.getColorRgbaA() * factors[factorIndex][2] +
- p3.getColorRgbaA() * factors[factorIndex][3];
+ p1.getColorRgbaA() * factors[factorIndex][1] +
+ p2.getColorRgbaA() * factors[factorIndex][2] +
+ p3.getColorRgbaA() * factors[factorIndex][3];
var cb = p0.getColorRgbaB() * factors[factorIndex][0] +
- p1.getColorRgbaB() * factors[factorIndex][1] +
- p2.getColorRgbaB() * factors[factorIndex][2] +
- p3.getColorRgbaB() * factors[factorIndex][3];
+ p1.getColorRgbaB() * factors[factorIndex][1] +
+ p2.getColorRgbaB() * factors[factorIndex][2] +
+ p3.getColorRgbaB() * factors[factorIndex][3];
int pi = pixelIndex + ((py * size + px) * 4);
int r = bitmapData[pi];
@@ -290,12 +287,11 @@
}
static PvrtcColorBoundingBox _calculateBoundingBoxRgb(Image bitmap,
- int blockX,
- int blockY) {
+ int blockX, int blockY) {
int size = bitmap.width;
int pi = (blockY * 4 * size + blockX * 4);
- _pixel(i) {
+ _pixel(int i) {
int c = bitmap[pi + i];
return new PvrtcColorRgb(getRed(c), getGreen(c), getBlue(c));
}
@@ -323,15 +319,15 @@
return cbb;
}
- static PvrtcColorBoundingBox _calculateBoundingBoxRgba(Image bitmap,
- int blockX,
- int blockY) {
+ static PvrtcColorBoundingBox _calculateBoundingBoxRgba(
+ Image bitmap, int blockX, int blockY) {
int size = bitmap.width;
int pi = (blockY * 4 * size + blockX * 4);
- _pixel(i) {
+ _pixel(int i) {
int c = bitmap[pi + i];
- return new PvrtcColorRgba(getRed(c), getGreen(c), getBlue(c), getAlpha(c));
+ return new PvrtcColorRgba(
+ getRed(c), getGreen(c), getBlue(c), getAlpha(c));
}
var cbb = PvrtcColorBoundingBox(_pixel(0), _pixel(0));
@@ -357,12 +353,22 @@
return cbb;
}
- /*static void _getPacket(packet, packetData, index) {
- index *= 2;
- packet.modulationData = packetData[index];
- packet.colorData = packetData[index + 1];
- }*/
-
- static const MODULATION_LUT =
- const [ 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3 ];
+ static const MODULATION_LUT = const [
+ 0,
+ 0,
+ 0,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 3,
+ 3,
+ 3
+ ];
}
diff --git a/image/lib/src/formats/pvrtc/pvrtc_packet.dart b/image/lib/src/formats/pvrtc/pvrtc_packet.dart
index 71fc51d..7a41312 100755
--- a/image/lib/src/formats/pvrtc/pvrtc_packet.dart
+++ b/image/lib/src/formats/pvrtc/pvrtc_packet.dart
@@ -3,16 +3,13 @@
import 'pvrtc_bit_utility.dart';
import 'pvrtc_color.dart';
-/**
- * Ported from Jeffrey Lim's PVRTC encoder/decoder,
- * https://bitbucket.org/jthlim/pvrtccompressor
- */
+/// Ported from Jeffrey Lim's PVRTC encoder/decoder,
+/// https://bitbucket.org/jthlim/pvrtccompressor
class PvrtcPacket {
Uint32List rawData;
int index;
- PvrtcPacket(TypedData data)
- : rawData = Uint32List.view(data.buffer);
+ PvrtcPacket(TypedData data) : rawData = Uint32List.view(data.buffer);
void setBlock(int x, int y) => setIndex(_getMortonNumber(x, y));
@@ -123,15 +120,13 @@
var g = colorA >> 4 & 0x1f;
var b = colorA & 0xf;
return new PvrtcColorRgb(BitUtility.BITSCALE_5_TO_8[r],
- BitUtility.BITSCALE_5_TO_8[g],
- BitUtility.BITSCALE_4_TO_8[b]);
+ BitUtility.BITSCALE_5_TO_8[g], BitUtility.BITSCALE_4_TO_8[b]);
} else {
var r = (colorA >> 7) & 0xf;
var g = (colorA >> 3) & 0xf;
var b = colorA & 7;
return new PvrtcColorRgb(BitUtility.BITSCALE_4_TO_8[r],
- BitUtility.BITSCALE_4_TO_8[g],
- BitUtility.BITSCALE_3_TO_8[b]);
+ BitUtility.BITSCALE_4_TO_8[g], BitUtility.BITSCALE_3_TO_8[b]);
}
}
@@ -141,15 +136,14 @@
var g = colorA >> 4 & 0x1f;
var b = colorA & 0xf;
return new PvrtcColorRgba(BitUtility.BITSCALE_5_TO_8[r],
- BitUtility.BITSCALE_5_TO_8[g],
- BitUtility.BITSCALE_4_TO_8[b],
- 255);
+ BitUtility.BITSCALE_5_TO_8[g], BitUtility.BITSCALE_4_TO_8[b], 255);
} else {
var a = colorA >> 11 & 7;
var r = (colorA >> 7) & 0xf;
var g = (colorA >> 3) & 0xf;
var b = colorA & 7;
- return new PvrtcColorRgba(BitUtility.BITSCALE_4_TO_8[r],
+ return new PvrtcColorRgba(
+ BitUtility.BITSCALE_4_TO_8[r],
BitUtility.BITSCALE_4_TO_8[g],
BitUtility.BITSCALE_3_TO_8[b],
BitUtility.BITSCALE_3_TO_8[a]);
@@ -162,15 +156,13 @@
var g = colorB >> 5 & 0x1f;
var b = colorB & 0x1f;
return new PvrtcColorRgb(BitUtility.BITSCALE_5_TO_8[r],
- BitUtility.BITSCALE_5_TO_8[g],
- BitUtility.BITSCALE_5_TO_8[b]);
+ BitUtility.BITSCALE_5_TO_8[g], BitUtility.BITSCALE_5_TO_8[b]);
} else {
var r = colorB >> 8 & 0xf;
var g = colorB >> 4 & 0xf;
var b = colorB & 0xf;
return new PvrtcColorRgb(BitUtility.BITSCALE_4_TO_8[r],
- BitUtility.BITSCALE_4_TO_8[g],
- BitUtility.BITSCALE_4_TO_8[b]);
+ BitUtility.BITSCALE_4_TO_8[g], BitUtility.BITSCALE_4_TO_8[b]);
}
}
@@ -180,15 +172,14 @@
var g = colorB >> 5 & 0x1f;
var b = colorB & 0x1f;
return new PvrtcColorRgba(BitUtility.BITSCALE_5_TO_8[r],
- BitUtility.BITSCALE_5_TO_8[g],
- BitUtility.BITSCALE_5_TO_8[b],
- 255);
+ BitUtility.BITSCALE_5_TO_8[g], BitUtility.BITSCALE_5_TO_8[b], 255);
} else {
var a = colorB >> 12 & 7;
var r = colorB >> 8 & 0xf;
var g = colorB >> 4 & 0xf;
var b = colorB & 0xf;
- return new PvrtcColorRgba(BitUtility.BITSCALE_4_TO_8[r],
+ return new PvrtcColorRgba(
+ BitUtility.BITSCALE_4_TO_8[r],
BitUtility.BITSCALE_4_TO_8[g],
BitUtility.BITSCALE_4_TO_8[b],
BitUtility.BITSCALE_3_TO_8[a]);
@@ -218,82 +209,305 @@
}
static int _getMortonNumber(int x, int y) {
- return MORTON_TABLE[x >> 8] << 17 | MORTON_TABLE[y >> 8] << 16 |
- MORTON_TABLE[x & 0xFF] << 1 | MORTON_TABLE[y & 0xFF];
+ return MORTON_TABLE[x >> 8] << 17 |
+ MORTON_TABLE[y >> 8] << 16 |
+ MORTON_TABLE[x & 0xFF] << 1 |
+ MORTON_TABLE[y & 0xFF];
}
static const BITS_14 = (1 << 14) - 1;
static const BITS_15 = (1 << 15) - 1;
static const BILINEAR_FACTORS = const [
- const [ 4, 4, 4, 4 ],
- const [ 2, 6, 2, 6 ],
- const [ 8, 0, 8, 0 ],
- const [ 6, 2, 6, 2 ],
-
- const [ 2, 2, 6, 6 ],
- const [ 1, 3, 3, 9 ],
- const [ 4, 0, 12, 0 ],
- const [ 3, 1, 9, 3 ],
-
- const [ 8, 8, 0, 0 ],
- const [ 4, 12, 0, 0 ],
- const [ 16, 0, 0, 0 ],
- const [ 12, 4, 0, 0 ],
-
- const [ 6, 6, 2, 2 ],
- const [ 3, 9, 1, 3 ],
- const [ 12, 0, 4, 0 ],
- const [ 9, 3, 3, 1 ],
+ const [4, 4, 4, 4],
+ const [2, 6, 2, 6],
+ const [8, 0, 8, 0],
+ const [6, 2, 6, 2],
+ const [2, 2, 6, 6],
+ const [1, 3, 3, 9],
+ const [4, 0, 12, 0],
+ const [3, 1, 9, 3],
+ const [8, 8, 0, 0],
+ const [4, 12, 0, 0],
+ const [16, 0, 0, 0],
+ const [12, 4, 0, 0],
+ const [6, 6, 2, 2],
+ const [3, 9, 1, 3],
+ const [12, 0, 4, 0],
+ const [9, 3, 3, 1],
];
// Weights are { colorA, colorB, alphaA, alphaB }
static const WEIGHTS = const [
// Weights for Mode=0
- const [ 8, 0, 8, 0 ],
- const [ 5, 3, 5, 3 ],
- const [ 3, 5, 3, 5 ],
- const [ 0, 8, 0, 8 ],
+ const [8, 0, 8, 0],
+ const [5, 3, 5, 3],
+ const [3, 5, 3, 5],
+ const [0, 8, 0, 8],
// Weights for Mode=1
- const [ 8, 0, 8, 0 ],
- const [ 4, 4, 4, 4 ],
- const [ 4, 4, 0, 0 ],
- const [ 0, 8, 0, 8 ],
+ const [8, 0, 8, 0],
+ const [4, 4, 4, 4],
+ const [4, 4, 0, 0],
+ const [0, 8, 0, 8],
];
static const MORTON_TABLE = const [
- 0x0000, 0x0001, 0x0004, 0x0005, 0x0010, 0x0011, 0x0014, 0x0015,
- 0x0040, 0x0041, 0x0044, 0x0045, 0x0050, 0x0051, 0x0054, 0x0055,
- 0x0100, 0x0101, 0x0104, 0x0105, 0x0110, 0x0111, 0x0114, 0x0115,
- 0x0140, 0x0141, 0x0144, 0x0145, 0x0150, 0x0151, 0x0154, 0x0155,
- 0x0400, 0x0401, 0x0404, 0x0405, 0x0410, 0x0411, 0x0414, 0x0415,
- 0x0440, 0x0441, 0x0444, 0x0445, 0x0450, 0x0451, 0x0454, 0x0455,
- 0x0500, 0x0501, 0x0504, 0x0505, 0x0510, 0x0511, 0x0514, 0x0515,
- 0x0540, 0x0541, 0x0544, 0x0545, 0x0550, 0x0551, 0x0554, 0x0555,
- 0x1000, 0x1001, 0x1004, 0x1005, 0x1010, 0x1011, 0x1014, 0x1015,
- 0x1040, 0x1041, 0x1044, 0x1045, 0x1050, 0x1051, 0x1054, 0x1055,
- 0x1100, 0x1101, 0x1104, 0x1105, 0x1110, 0x1111, 0x1114, 0x1115,
- 0x1140, 0x1141, 0x1144, 0x1145, 0x1150, 0x1151, 0x1154, 0x1155,
- 0x1400, 0x1401, 0x1404, 0x1405, 0x1410, 0x1411, 0x1414, 0x1415,
- 0x1440, 0x1441, 0x1444, 0x1445, 0x1450, 0x1451, 0x1454, 0x1455,
- 0x1500, 0x1501, 0x1504, 0x1505, 0x1510, 0x1511, 0x1514, 0x1515,
- 0x1540, 0x1541, 0x1544, 0x1545, 0x1550, 0x1551, 0x1554, 0x1555,
- 0x4000, 0x4001, 0x4004, 0x4005, 0x4010, 0x4011, 0x4014, 0x4015,
- 0x4040, 0x4041, 0x4044, 0x4045, 0x4050, 0x4051, 0x4054, 0x4055,
- 0x4100, 0x4101, 0x4104, 0x4105, 0x4110, 0x4111, 0x4114, 0x4115,
- 0x4140, 0x4141, 0x4144, 0x4145, 0x4150, 0x4151, 0x4154, 0x4155,
- 0x4400, 0x4401, 0x4404, 0x4405, 0x4410, 0x4411, 0x4414, 0x4415,
- 0x4440, 0x4441, 0x4444, 0x4445, 0x4450, 0x4451, 0x4454, 0x4455,
- 0x4500, 0x4501, 0x4504, 0x4505, 0x4510, 0x4511, 0x4514, 0x4515,
- 0x4540, 0x4541, 0x4544, 0x4545, 0x4550, 0x4551, 0x4554, 0x4555,
- 0x5000, 0x5001, 0x5004, 0x5005, 0x5010, 0x5011, 0x5014, 0x5015,
- 0x5040, 0x5041, 0x5044, 0x5045, 0x5050, 0x5051, 0x5054, 0x5055,
- 0x5100, 0x5101, 0x5104, 0x5105, 0x5110, 0x5111, 0x5114, 0x5115,
- 0x5140, 0x5141, 0x5144, 0x5145, 0x5150, 0x5151, 0x5154, 0x5155,
- 0x5400, 0x5401, 0x5404, 0x5405, 0x5410, 0x5411, 0x5414, 0x5415,
- 0x5440, 0x5441, 0x5444, 0x5445, 0x5450, 0x5451, 0x5454, 0x5455,
- 0x5500, 0x5501, 0x5504, 0x5505, 0x5510, 0x5511, 0x5514, 0x5515,
- 0x5540, 0x5541, 0x5544, 0x5545, 0x5550, 0x5551, 0x5554, 0x5555
- ];
+ 0x0000,
+ 0x0001,
+ 0x0004,
+ 0x0005,
+ 0x0010,
+ 0x0011,
+ 0x0014,
+ 0x0015,
+ 0x0040,
+ 0x0041,
+ 0x0044,
+ 0x0045,
+ 0x0050,
+ 0x0051,
+ 0x0054,
+ 0x0055,
+ 0x0100,
+ 0x0101,
+ 0x0104,
+ 0x0105,
+ 0x0110,
+ 0x0111,
+ 0x0114,
+ 0x0115,
+ 0x0140,
+ 0x0141,
+ 0x0144,
+ 0x0145,
+ 0x0150,
+ 0x0151,
+ 0x0154,
+ 0x0155,
+ 0x0400,
+ 0x0401,
+ 0x0404,
+ 0x0405,
+ 0x0410,
+ 0x0411,
+ 0x0414,
+ 0x0415,
+ 0x0440,
+ 0x0441,
+ 0x0444,
+ 0x0445,
+ 0x0450,
+ 0x0451,
+ 0x0454,
+ 0x0455,
+ 0x0500,
+ 0x0501,
+ 0x0504,
+ 0x0505,
+ 0x0510,
+ 0x0511,
+ 0x0514,
+ 0x0515,
+ 0x0540,
+ 0x0541,
+ 0x0544,
+ 0x0545,
+ 0x0550,
+ 0x0551,
+ 0x0554,
+ 0x0555,
+ 0x1000,
+ 0x1001,
+ 0x1004,
+ 0x1005,
+ 0x1010,
+ 0x1011,
+ 0x1014,
+ 0x1015,
+ 0x1040,
+ 0x1041,
+ 0x1044,
+ 0x1045,
+ 0x1050,
+ 0x1051,
+ 0x1054,
+ 0x1055,
+ 0x1100,
+ 0x1101,
+ 0x1104,
+ 0x1105,
+ 0x1110,
+ 0x1111,
+ 0x1114,
+ 0x1115,
+ 0x1140,
+ 0x1141,
+ 0x1144,
+ 0x1145,
+ 0x1150,
+ 0x1151,
+ 0x1154,
+ 0x1155,
+ 0x1400,
+ 0x1401,
+ 0x1404,
+ 0x1405,
+ 0x1410,
+ 0x1411,
+ 0x1414,
+ 0x1415,
+ 0x1440,
+ 0x1441,
+ 0x1444,
+ 0x1445,
+ 0x1450,
+ 0x1451,
+ 0x1454,
+ 0x1455,
+ 0x1500,
+ 0x1501,
+ 0x1504,
+ 0x1505,
+ 0x1510,
+ 0x1511,
+ 0x1514,
+ 0x1515,
+ 0x1540,
+ 0x1541,
+ 0x1544,
+ 0x1545,
+ 0x1550,
+ 0x1551,
+ 0x1554,
+ 0x1555,
+ 0x4000,
+ 0x4001,
+ 0x4004,
+ 0x4005,
+ 0x4010,
+ 0x4011,
+ 0x4014,
+ 0x4015,
+ 0x4040,
+ 0x4041,
+ 0x4044,
+ 0x4045,
+ 0x4050,
+ 0x4051,
+ 0x4054,
+ 0x4055,
+ 0x4100,
+ 0x4101,
+ 0x4104,
+ 0x4105,
+ 0x4110,
+ 0x4111,
+ 0x4114,
+ 0x4115,
+ 0x4140,
+ 0x4141,
+ 0x4144,
+ 0x4145,
+ 0x4150,
+ 0x4151,
+ 0x4154,
+ 0x4155,
+ 0x4400,
+ 0x4401,
+ 0x4404,
+ 0x4405,
+ 0x4410,
+ 0x4411,
+ 0x4414,
+ 0x4415,
+ 0x4440,
+ 0x4441,
+ 0x4444,
+ 0x4445,
+ 0x4450,
+ 0x4451,
+ 0x4454,
+ 0x4455,
+ 0x4500,
+ 0x4501,
+ 0x4504,
+ 0x4505,
+ 0x4510,
+ 0x4511,
+ 0x4514,
+ 0x4515,
+ 0x4540,
+ 0x4541,
+ 0x4544,
+ 0x4545,
+ 0x4550,
+ 0x4551,
+ 0x4554,
+ 0x4555,
+ 0x5000,
+ 0x5001,
+ 0x5004,
+ 0x5005,
+ 0x5010,
+ 0x5011,
+ 0x5014,
+ 0x5015,
+ 0x5040,
+ 0x5041,
+ 0x5044,
+ 0x5045,
+ 0x5050,
+ 0x5051,
+ 0x5054,
+ 0x5055,
+ 0x5100,
+ 0x5101,
+ 0x5104,
+ 0x5105,
+ 0x5110,
+ 0x5111,
+ 0x5114,
+ 0x5115,
+ 0x5140,
+ 0x5141,
+ 0x5144,
+ 0x5145,
+ 0x5150,
+ 0x5151,
+ 0x5154,
+ 0x5155,
+ 0x5400,
+ 0x5401,
+ 0x5404,
+ 0x5405,
+ 0x5410,
+ 0x5411,
+ 0x5414,
+ 0x5415,
+ 0x5440,
+ 0x5441,
+ 0x5444,
+ 0x5445,
+ 0x5450,
+ 0x5451,
+ 0x5454,
+ 0x5455,
+ 0x5500,
+ 0x5501,
+ 0x5504,
+ 0x5505,
+ 0x5510,
+ 0x5511,
+ 0x5514,
+ 0x5515,
+ 0x5540,
+ 0x5541,
+ 0x5544,
+ 0x5545,
+ 0x5550,
+ 0x5551,
+ 0x5554,
+ 0x5555
+ ];
}
diff --git a/image/lib/src/formats/tga_decoder.dart b/image/lib/src/formats/tga_decoder.dart
index 1bf9053..f317657 100755
--- a/image/lib/src/formats/tga_decoder.dart
+++ b/image/lib/src/formats/tga_decoder.dart
@@ -6,20 +6,14 @@
import 'decode_info.dart';
import 'tga/tga_info.dart';
-/**
- * Decode a TGA image. This only supports the 24-bit uncompressed format.
- * TODO add more TGA support.
- */
+/// Decode a TGA image. This only supports the 24-bit uncompressed format.
class TgaDecoder extends Decoder {
TgaInfo info;
InputBuffer input;
- /**
- * Is the given file a valid TGA image?
- */
+ /// Is the given file a valid TGA image?
bool isValidFile(List<int> data) {
- InputBuffer input = InputBuffer(data,
- bigEndian: true);
+ InputBuffer input = InputBuffer(data, bigEndian: true);
InputBuffer header = input.readBytes(18);
if (header[2] != 2) {
@@ -74,7 +68,7 @@
return image;
}
- Image decodeImage(List<int> data, {int frame: 0}) {
+ Image decodeImage(List<int> data, {int frame = 0}) {
if (startDecode(data) == null) {
return null;
}
diff --git a/image/lib/src/formats/tga_encoder.dart b/image/lib/src/formats/tga_encoder.dart
index 7143fbd..82ee682 100755
--- a/image/lib/src/formats/tga_encoder.dart
+++ b/image/lib/src/formats/tga_encoder.dart
@@ -3,9 +3,7 @@
import '../util/output_buffer.dart';
import 'encoder.dart';
-/**
- * Encode a TGA image. This only supports the 24-bit uncompressed format.
- */
+/// Encode a TGA image. This only supports the 24-bit uncompressed format.
class TgaEncoder extends Encoder {
List<int> encodeImage(Image image) {
OutputBuffer out = OutputBuffer(bigEndian: true);
diff --git a/image/lib/src/formats/tiff/tiff_bit_reader.dart b/image/lib/src/formats/tiff/tiff_bit_reader.dart
index aa5822f..17f4bba 100755
--- a/image/lib/src/formats/tiff/tiff_bit_reader.dart
+++ b/image/lib/src/formats/tiff/tiff_bit_reader.dart
@@ -7,9 +7,7 @@
int readByte() => readBits(8);
- /**
- * Read a number of bits from the input stream.
- */
+ /// Read a number of bits from the input stream.
int readBits(int numBits) {
if (numBits == 0) {
return 0;
@@ -36,7 +34,7 @@
}
value = (value << numBits) +
- (_bitBuffer >> (_bitPos - numBits) & _BIT_MASK[numBits]);
+ (_bitBuffer >> (_bitPos - numBits) & _BIT_MASK[numBits]);
_bitPos -= numBits;
}
@@ -44,10 +42,8 @@
return value;
}
- /**
- * Flush the rest of the bits in the buffer so the next read starts at the
- * next byte.
- */
+ /// Flush the rest of the bits in the buffer so the next read starts at the
+ /// next byte.
void flushByte() {
_bitPos = 0;
}
diff --git a/image/lib/src/formats/tiff/tiff_entry.dart b/image/lib/src/formats/tiff/tiff_entry.dart
index 348f397..4011124 100755
--- a/image/lib/src/formats/tiff/tiff_entry.dart
+++ b/image/lib/src/formats/tiff/tiff_entry.dart
@@ -93,18 +93,19 @@
static const int TYPE_DOUBLE = 12;
static const List<int> SIZE_OF_TYPE = const [
- 0, // 0 = n/a
- 1, // 1 = byte
- 1, // 2 = ascii
- 2, // 3 = short
- 4, // 4 = long
- 8, // 5 = rational
- 1, // 6 = sbyte
- 1, // 7 = undefined
- 2, // 8 = sshort
- 4, // 9 = slong
- 8, // 10 = srational
- 4, // 11 = float
- 8, // 12 = double
- 0];
+ 0, // 0 = n/a
+ 1, // 1 = byte
+ 1, // 2 = ascii
+ 2, // 3 = short
+ 4, // 4 = long
+ 8, // 5 = rational
+ 1, // 6 = sbyte
+ 1, // 7 = undefined
+ 2, // 8 = sshort
+ 4, // 9 = slong
+ 8, // 10 = srational
+ 4, // 11 = float
+ 8, // 12 = double
+ 0
+ ];
}
diff --git a/image/lib/src/formats/tiff/tiff_fax_decoder.dart b/image/lib/src/formats/tiff/tiff_fax_decoder.dart
index 097be05..806ad26 100755
--- a/image/lib/src/formats/tiff/tiff_fax_decoder.dart
+++ b/image/lib/src/formats/tiff/tiff_fax_decoder.dart
@@ -29,9 +29,7 @@
currChangingElems = List<int>(width);
}
- /**
- * One-dimensional decoding methods
- */
+ /// One-dimensional decoding methods
void decode1D(InputBuffer out, InputBuffer compData, int startX, int height) {
this.data = compData;
bitPointer = 0;
@@ -65,20 +63,23 @@
isT = entry & 0x0001;
bits = (entry >> 1) & 0x0f;
- if (bits == 12) { // Additional Make up code
+ if (bits == 12) {
+ // Additional Make up code
// Get the next 2 bits
twoBits = _nextLesserThan8Bits(2);
// Consolidate the 2 new bits and last 2 bits into 4 bits
current = ((current << 2) & 0x000c) | twoBits;
entry = ADDITIONAL_MAKEUP[current];
- bits = (entry >> 1) & 0x07; // 3 bits 0000 0111
- code = (entry >> 4) & 0x0fff; // 12 bits
+ bits = (entry >> 1) & 0x07; // 3 bits 0000 0111
+ code = (entry >> 4) & 0x0fff; // 12 bits
bitOffset += code; // Skip white run
_updatePointer(4 - bits);
- } else if (bits == 0) { // ERROR
+ } else if (bits == 0) {
+ // ERROR
throw new ImageException("TIFFFaxDecoder0");
- } else if (bits == 15) { // EOL
+ } else if (bits == 15) {
+ // EOL
throw new ImageException("TIFFFaxDecoder1");
} else {
// 11 bits - 0000 0111 1111 1111 = 0x07ff
@@ -126,8 +127,8 @@
_updatePointer(5);
current = _nextLesserThan8Bits(4);
entry = ADDITIONAL_MAKEUP[current];
- bits = (entry >> 1) & 0x07; // 3 bits 0000 0111
- code = (entry >> 4) & 0x0fff; // 12 bits
+ bits = (entry >> 1) & 0x07; // 3 bits 0000 0111
+ code = (entry >> 4) & 0x0fff; // 12 bits
_setToBlack(buffer, lineOffset, bitOffset, code);
bitOffset += code;
@@ -182,12 +183,9 @@
currChangingElems[changingElemSize++] = bitOffset;
}
- /**
- * Two-dimensional decoding methods
- */
-
+ /// Two-dimensional decoding methods
void decode2D(InputBuffer out, InputBuffer compData, int startX, int height,
- int tiffT4Options) {
+ int tiffT4Options) {
this.data = compData;
compression = 3;
@@ -331,7 +329,7 @@
}
void decodeT6(InputBuffer out, InputBuffer compData, int startX, int height,
- int tiffT6Options) {
+ int tiffT6Options) {
this.data = compData;
compression = 4;
@@ -399,7 +397,8 @@
code = (entry & 0x78) >> 3;
bits = entry & 0x07;
- if (code == 0) { // Pass
+ if (code == 0) {
+ // Pass
// We always assume WhiteIsZero format for fax.
if (!isWhite) {
_setToBlack(out, lineOffset, bitOffset, b2 - bitOffset);
@@ -408,7 +407,8 @@
// Set pointer to only consume the correct number of bits.
_updatePointer(7 - bits);
- } else if (code == 1) { // Horizontal
+ } else if (code == 1) {
+ // Horizontal
// Set pointer to only consume the correct number of bits.
_updatePointer(7 - bits);
@@ -437,15 +437,15 @@
}
a0 = bitOffset;
- } else if (code <= 8) { // Vertical
+ } else if (code <= 8) {
+ // Vertical
a1 = b1 + (code - 5);
cce[currIndex++] = a1;
// We write the current color till a1 - 1 pos,
// since a1 is where the next color starts
if (!isWhite) {
- _setToBlack(out, lineOffset, bitOffset,
- a1 - bitOffset);
+ _setToBlack(out, lineOffset, bitOffset, a1 - bitOffset);
}
bitOffset = a0 = a1;
isWhite = !isWhite;
@@ -533,11 +533,7 @@
}
}
-
-
- /**
- * Returns run length
- */
+ /// Returns run length
int _decodeWhiteCodeWord() {
int current, entry, bits, isT, twoBits, code = -1;
int runLength = 0;
@@ -551,19 +547,22 @@
isT = entry & 0x0001;
bits = (entry >> 1) & 0x0f;
- if (bits == 12) { // Additional Make up code
+ if (bits == 12) {
+ // Additional Make up code
// Get the next 2 bits
twoBits = _nextLesserThan8Bits(2);
// Consolidate the 2 new bits and last 2 bits into 4 bits
current = ((current << 2) & 0x000c) | twoBits;
entry = ADDITIONAL_MAKEUP[current];
- bits = (entry >> 1) & 0x07; // 3 bits 0000 0111
- code = (entry >> 4) & 0x0fff; // 12 bits
+ bits = (entry >> 1) & 0x07; // 3 bits 0000 0111
+ code = (entry >> 4) & 0x0fff; // 12 bits
runLength += code;
_updatePointer(4 - bits);
- } else if (bits == 0) { // ERROR
+ } else if (bits == 0) {
+ // ERROR
throw new ImageException("TIFFFaxDecoder0");
- } else if (bits == 15) { // EOL
+ } else if (bits == 15) {
+ // EOL
throw new ImageException("TIFFFaxDecoder1");
} else {
// 11 bits - 0000 0111 1111 1111 = 0x07ff
@@ -579,9 +578,7 @@
return runLength;
}
- /**
- * Returns run length
- */
+ /// Returns run length
int _decodeBlackCodeWord() {
int current, entry, bits, isT, code = -1;
int runLength = 0;
@@ -610,8 +607,8 @@
_updatePointer(5);
current = _nextLesserThan8Bits(4);
entry = ADDITIONAL_MAKEUP[current];
- bits = (entry >> 1) & 0x07; // 3 bits 0000 0111
- code = (entry >> 4) & 0x0fff; // 12 bits
+ bits = (entry >> 1) & 0x07; // 3 bits 0000 0111
+ code = (entry >> 4) & 0x0fff; // 12 bits
runLength += code;
_updatePointer(4 - bits);
@@ -722,7 +719,8 @@
}
}
- void _setToBlack(InputBuffer buffer, int lineOffset, int bitOffset, int numBits) {
+ void _setToBlack(
+ InputBuffer buffer, int lineOffset, int bitOffset, int numBits) {
int bitNum = 8 * lineOffset + bitOffset;
int lastBit = bitNum + numBits;
@@ -808,7 +806,7 @@
if (bitsFromNext2NextByte != 0) {
i2 <<= bitsFromNext2NextByte;
i3 = (next2next & TABLE2[bitsFromNext2NextByte]) >>
- (8 - bitsFromNext2NextByte);
+ (8 - bitsFromNext2NextByte);
i2 |= i3;
bytePointer++;
bitPointer = bitsFromNext2NextByte;
@@ -871,9 +869,7 @@
return i1;
}
- /**
- * Move pointer backwards by given amount of bits
- */
+ /// Move pointer backwards by given amount of bits
void _updatePointer(int bitsToMoveBack) {
int i = bitPointer - bitsToMoveBack;
@@ -885,9 +881,7 @@
}
}
- /**
- * Move to the next byte boundary
- */
+ /// Move to the next byte boundary
bool _advancePointer() {
if (bitPointer != 0) {
bytePointer++;
@@ -906,7 +900,8 @@
0x1f, // 5 bits are left in first byte
0x3f, // 6 bits are left in first byte
0x7f, // 7 bits are left in first byte
- 0xff]; // 8 bits are left in first byte
+ 0xff
+ ]; // 8 bits are left in first byte
static const List<int> TABLE2 = const [
0x00, // 0
@@ -917,315 +912,556 @@
0xf8, // 5
0xfc, // 6
0xfe, // 7
- 0xff]; // 8
+ 0xff
+ ]; // 8
// Table to be used when fillOrder = 2, for flipping bytes.
static const List<int> FLIP_TABLE = const [
- 0, -128, 64, -64, 32, -96, 96, -32,
- 16, -112, 80, -48, 48, -80, 112, -16,
- 8, -120, 72, -56, 40, -88, 104, -24,
- 24, -104, 88, -40, 56, -72, 120, -8,
- 4, -124, 68, -60, 36, -92, 100, -28,
- 20, -108, 84, -44, 52, -76, 116, -12,
- 12, -116, 76, -52, 44, -84, 108, -20,
- 28, -100, 92, -36, 60, -68, 124, -4,
- 2, -126, 66, -62, 34, -94, 98, -30,
- 18, -110, 82, -46, 50, -78, 114, -14,
- 10, -118, 74, -54, 42, -86, 106, -22,
- 26, -102, 90, -38, 58, -70, 122, -6,
- 6, -122, 70, -58, 38, -90, 102, -26,
- 22, -106, 86, -42, 54, -74, 118, -10,
- 14, -114, 78, -50, 46, -82, 110, -18,
- 30, -98, 94, -34, 62, -66, 126, -2,
- 1, -127, 65, -63, 33, -95, 97, -31,
- 17, -111, 81, -47, 49, -79, 113, -15,
- 9, -119, 73, -55, 41, -87, 105, -23,
- 25, -103, 89, -39, 57, -71, 121, -7,
- 5, -123, 69, -59, 37, -91, 101, -27,
- 21, -107, 85, -43, 53, -75, 117, -11,
- 13, -115, 77, -51, 45, -83, 109, -19,
- 29, -99, 93, -35, 61, -67, 125, -3,
- 3, -125, 67, -61, 35, -93, 99, -29,
- 19, -109, 83, -45, 51, -77, 115, -13,
- 11, -117, 75, -53, 43, -85, 107, -21,
- 27, -101, 91, -37, 59, -69, 123, -5,
- 7, -121, 71, -57, 39, -89, 103, -25,
- 23, -105, 87, -41, 55, -73, 119, -9,
- 15, -113, 79, -49, 47, -81, 111, -17,
- 31, -97, 95, -33, 63, -65, 127, -1];
+ 0,
+ -128,
+ 64,
+ -64,
+ 32,
+ -96,
+ 96,
+ -32,
+ 16,
+ -112,
+ 80,
+ -48,
+ 48,
+ -80,
+ 112,
+ -16,
+ 8,
+ -120,
+ 72,
+ -56,
+ 40,
+ -88,
+ 104,
+ -24,
+ 24,
+ -104,
+ 88,
+ -40,
+ 56,
+ -72,
+ 120,
+ -8,
+ 4,
+ -124,
+ 68,
+ -60,
+ 36,
+ -92,
+ 100,
+ -28,
+ 20,
+ -108,
+ 84,
+ -44,
+ 52,
+ -76,
+ 116,
+ -12,
+ 12,
+ -116,
+ 76,
+ -52,
+ 44,
+ -84,
+ 108,
+ -20,
+ 28,
+ -100,
+ 92,
+ -36,
+ 60,
+ -68,
+ 124,
+ -4,
+ 2,
+ -126,
+ 66,
+ -62,
+ 34,
+ -94,
+ 98,
+ -30,
+ 18,
+ -110,
+ 82,
+ -46,
+ 50,
+ -78,
+ 114,
+ -14,
+ 10,
+ -118,
+ 74,
+ -54,
+ 42,
+ -86,
+ 106,
+ -22,
+ 26,
+ -102,
+ 90,
+ -38,
+ 58,
+ -70,
+ 122,
+ -6,
+ 6,
+ -122,
+ 70,
+ -58,
+ 38,
+ -90,
+ 102,
+ -26,
+ 22,
+ -106,
+ 86,
+ -42,
+ 54,
+ -74,
+ 118,
+ -10,
+ 14,
+ -114,
+ 78,
+ -50,
+ 46,
+ -82,
+ 110,
+ -18,
+ 30,
+ -98,
+ 94,
+ -34,
+ 62,
+ -66,
+ 126,
+ -2,
+ 1,
+ -127,
+ 65,
+ -63,
+ 33,
+ -95,
+ 97,
+ -31,
+ 17,
+ -111,
+ 81,
+ -47,
+ 49,
+ -79,
+ 113,
+ -15,
+ 9,
+ -119,
+ 73,
+ -55,
+ 41,
+ -87,
+ 105,
+ -23,
+ 25,
+ -103,
+ 89,
+ -39,
+ 57,
+ -71,
+ 121,
+ -7,
+ 5,
+ -123,
+ 69,
+ -59,
+ 37,
+ -91,
+ 101,
+ -27,
+ 21,
+ -107,
+ 85,
+ -43,
+ 53,
+ -75,
+ 117,
+ -11,
+ 13,
+ -115,
+ 77,
+ -51,
+ 45,
+ -83,
+ 109,
+ -19,
+ 29,
+ -99,
+ 93,
+ -35,
+ 61,
+ -67,
+ 125,
+ -3,
+ 3,
+ -125,
+ 67,
+ -61,
+ 35,
+ -93,
+ 99,
+ -29,
+ 19,
+ -109,
+ 83,
+ -45,
+ 51,
+ -77,
+ 115,
+ -13,
+ 11,
+ -117,
+ 75,
+ -53,
+ 43,
+ -85,
+ 107,
+ -21,
+ 27,
+ -101,
+ 91,
+ -37,
+ 59,
+ -69,
+ 123,
+ -5,
+ 7,
+ -121,
+ 71,
+ -57,
+ 39,
+ -89,
+ 103,
+ -25,
+ 23,
+ -105,
+ 87,
+ -41,
+ 55,
+ -73,
+ 119,
+ -9,
+ 15,
+ -113,
+ 79,
+ -49,
+ 47,
+ -81,
+ 111,
+ -17,
+ 31,
+ -97,
+ 95,
+ -33,
+ 63,
+ -65,
+ 127,
+ -1
+ ];
// The main 10 bit white runs lookup table
static const List<int> WHITE = const [
// 0 - 7
- 6430, 6400, 6400, 6400, 3225, 3225, 3225, 3225,
+ 6430, 6400, 6400, 6400, 3225, 3225, 3225, 3225,
// 8 - 15
- 944, 944, 944, 944, 976, 976, 976, 976,
+ 944, 944, 944, 944, 976, 976, 976, 976,
// 16 - 23
- 1456, 1456, 1456, 1456, 1488, 1488, 1488, 1488,
+ 1456, 1456, 1456, 1456, 1488, 1488, 1488, 1488,
// 24 - 31
- 718, 718, 718, 718, 718, 718, 718, 718,
+ 718, 718, 718, 718, 718, 718, 718, 718,
// 32 - 39
- 750, 750, 750, 750, 750, 750, 750, 750,
+ 750, 750, 750, 750, 750, 750, 750, 750,
// 40 - 47
- 1520, 1520, 1520, 1520, 1552, 1552, 1552, 1552,
+ 1520, 1520, 1520, 1520, 1552, 1552, 1552, 1552,
// 48 - 55
- 428, 428, 428, 428, 428, 428, 428, 428,
+ 428, 428, 428, 428, 428, 428, 428, 428,
// 56 - 63
- 428, 428, 428, 428, 428, 428, 428, 428,
+ 428, 428, 428, 428, 428, 428, 428, 428,
// 64 - 71
- 654, 654, 654, 654, 654, 654, 654, 654,
+ 654, 654, 654, 654, 654, 654, 654, 654,
// 72 - 79
- 1072, 1072, 1072, 1072, 1104, 1104, 1104, 1104,
+ 1072, 1072, 1072, 1072, 1104, 1104, 1104, 1104,
// 80 - 87
- 1136, 1136, 1136, 1136, 1168, 1168, 1168, 1168,
+ 1136, 1136, 1136, 1136, 1168, 1168, 1168, 1168,
// 88 - 95
- 1200, 1200, 1200, 1200, 1232, 1232, 1232, 1232,
+ 1200, 1200, 1200, 1200, 1232, 1232, 1232, 1232,
// 96 - 103
- 622, 622, 622, 622, 622, 622, 622, 622,
+ 622, 622, 622, 622, 622, 622, 622, 622,
// 104 - 111
- 1008, 1008, 1008, 1008, 1040, 1040, 1040, 1040,
+ 1008, 1008, 1008, 1008, 1040, 1040, 1040, 1040,
// 112 - 119
- 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44,
// 120 - 127
- 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44,
// 128 - 135
- 396, 396, 396, 396, 396, 396, 396, 396,
+ 396, 396, 396, 396, 396, 396, 396, 396,
// 136 - 143
- 396, 396, 396, 396, 396, 396, 396, 396,
+ 396, 396, 396, 396, 396, 396, 396, 396,
// 144 - 151
- 1712, 1712, 1712, 1712, 1744, 1744, 1744, 1744,
+ 1712, 1712, 1712, 1712, 1744, 1744, 1744, 1744,
// 152 - 159
- 846, 846, 846, 846, 846, 846, 846, 846,
+ 846, 846, 846, 846, 846, 846, 846, 846,
// 160 - 167
- 1264, 1264, 1264, 1264, 1296, 1296, 1296, 1296,
+ 1264, 1264, 1264, 1264, 1296, 1296, 1296, 1296,
// 168 - 175
- 1328, 1328, 1328, 1328, 1360, 1360, 1360, 1360,
+ 1328, 1328, 1328, 1328, 1360, 1360, 1360, 1360,
// 176 - 183
- 1392, 1392, 1392, 1392, 1424, 1424, 1424, 1424,
+ 1392, 1392, 1392, 1392, 1424, 1424, 1424, 1424,
// 184 - 191
- 686, 686, 686, 686, 686, 686, 686, 686,
+ 686, 686, 686, 686, 686, 686, 686, 686,
// 192 - 199
- 910, 910, 910, 910, 910, 910, 910, 910,
+ 910, 910, 910, 910, 910, 910, 910, 910,
// 200 - 207
- 1968, 1968, 1968, 1968, 2000, 2000, 2000, 2000,
+ 1968, 1968, 1968, 1968, 2000, 2000, 2000, 2000,
// 208 - 215
- 2032, 2032, 2032, 2032, 16, 16, 16, 16,
+ 2032, 2032, 2032, 2032, 16, 16, 16, 16,
// 216 - 223
- 10257, 10257, 10257, 10257, 12305, 12305, 12305, 12305,
+ 10257, 10257, 10257, 10257, 12305, 12305, 12305, 12305,
// 224 - 231
- 330, 330, 330, 330, 330, 330, 330, 330,
+ 330, 330, 330, 330, 330, 330, 330, 330,
// 232 - 239
- 330, 330, 330, 330, 330, 330, 330, 330,
+ 330, 330, 330, 330, 330, 330, 330, 330,
// 240 - 247
- 330, 330, 330, 330, 330, 330, 330, 330,
+ 330, 330, 330, 330, 330, 330, 330, 330,
// 248 - 255
- 330, 330, 330, 330, 330, 330, 330, 330,
+ 330, 330, 330, 330, 330, 330, 330, 330,
// 256 - 263
- 362, 362, 362, 362, 362, 362, 362, 362,
+ 362, 362, 362, 362, 362, 362, 362, 362,
// 264 - 271
- 362, 362, 362, 362, 362, 362, 362, 362,
+ 362, 362, 362, 362, 362, 362, 362, 362,
// 272 - 279
- 362, 362, 362, 362, 362, 362, 362, 362,
+ 362, 362, 362, 362, 362, 362, 362, 362,
// 280 - 287
- 362, 362, 362, 362, 362, 362, 362, 362,
+ 362, 362, 362, 362, 362, 362, 362, 362,
// 288 - 295
- 878, 878, 878, 878, 878, 878, 878, 878,
+ 878, 878, 878, 878, 878, 878, 878, 878,
// 296 - 303
- 1904, 1904, 1904, 1904, 1936, 1936, 1936, 1936,
+ 1904, 1904, 1904, 1904, 1936, 1936, 1936, 1936,
// 304 - 311
-18413, -18413, -16365, -16365, -14317, -14317, -10221, -10221,
// 312 - 319
- 590, 590, 590, 590, 590, 590, 590, 590,
+ 590, 590, 590, 590, 590, 590, 590, 590,
// 320 - 327
- 782, 782, 782, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782,
// 328 - 335
- 1584, 1584, 1584, 1584, 1616, 1616, 1616, 1616,
+ 1584, 1584, 1584, 1584, 1616, 1616, 1616, 1616,
// 336 - 343
- 1648, 1648, 1648, 1648, 1680, 1680, 1680, 1680,
+ 1648, 1648, 1648, 1648, 1680, 1680, 1680, 1680,
// 344 - 351
- 814, 814, 814, 814, 814, 814, 814, 814,
+ 814, 814, 814, 814, 814, 814, 814, 814,
// 352 - 359
- 1776, 1776, 1776, 1776, 1808, 1808, 1808, 1808,
+ 1776, 1776, 1776, 1776, 1808, 1808, 1808, 1808,
// 360 - 367
- 1840, 1840, 1840, 1840, 1872, 1872, 1872, 1872,
+ 1840, 1840, 1840, 1840, 1872, 1872, 1872, 1872,
// 368 - 375
- 6157, 6157, 6157, 6157, 6157, 6157, 6157, 6157,
+ 6157, 6157, 6157, 6157, 6157, 6157, 6157, 6157,
// 376 - 383
- 6157, 6157, 6157, 6157, 6157, 6157, 6157, 6157,
+ 6157, 6157, 6157, 6157, 6157, 6157, 6157, 6157,
// 384 - 391
-12275, -12275, -12275, -12275, -12275, -12275, -12275, -12275,
// 392 - 399
-12275, -12275, -12275, -12275, -12275, -12275, -12275, -12275,
// 400 - 407
- 14353, 14353, 14353, 14353, 16401, 16401, 16401, 16401,
+ 14353, 14353, 14353, 14353, 16401, 16401, 16401, 16401,
// 408 - 415
- 22547, 22547, 24595, 24595, 20497, 20497, 20497, 20497,
+ 22547, 22547, 24595, 24595, 20497, 20497, 20497, 20497,
// 416 - 423
- 18449, 18449, 18449, 18449, 26643, 26643, 28691, 28691,
+ 18449, 18449, 18449, 18449, 26643, 26643, 28691, 28691,
// 424 - 431
- 30739, 30739, -32749, -32749, -30701, -30701, -28653, -28653,
+ 30739, 30739, -32749, -32749, -30701, -30701, -28653, -28653,
// 432 - 439
-26605, -26605, -24557, -24557, -22509, -22509, -20461, -20461,
// 440 - 447
- 8207, 8207, 8207, 8207, 8207, 8207, 8207, 8207,
+ 8207, 8207, 8207, 8207, 8207, 8207, 8207, 8207,
// 448 - 455
- 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72,
// 456 - 463
- 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72,
// 464 - 471
- 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72,
// 472 - 479
- 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72,
// 480 - 487
- 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72,
// 488 - 495
- 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72,
// 496 - 503
- 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72,
// 504 - 511
- 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72,
// 512 - 519
- 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
// 520 - 527
- 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
// 528 - 535
- 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
// 536 - 543
- 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
// 544 - 551
- 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
// 552 - 559
- 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
// 560 - 567
- 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
// 568 - 575
- 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
// 576 - 583
- 4107, 4107, 4107, 4107, 4107, 4107, 4107, 4107,
+ 4107, 4107, 4107, 4107, 4107, 4107, 4107, 4107,
// 584 - 591
- 4107, 4107, 4107, 4107, 4107, 4107, 4107, 4107,
+ 4107, 4107, 4107, 4107, 4107, 4107, 4107, 4107,
// 592 - 599
- 4107, 4107, 4107, 4107, 4107, 4107, 4107, 4107,
+ 4107, 4107, 4107, 4107, 4107, 4107, 4107, 4107,
// 600 - 607
- 4107, 4107, 4107, 4107, 4107, 4107, 4107, 4107,
+ 4107, 4107, 4107, 4107, 4107, 4107, 4107, 4107,
// 608 - 615
- 266, 266, 266, 266, 266, 266, 266, 266,
+ 266, 266, 266, 266, 266, 266, 266, 266,
// 616 - 623
- 266, 266, 266, 266, 266, 266, 266, 266,
+ 266, 266, 266, 266, 266, 266, 266, 266,
// 624 - 631
- 266, 266, 266, 266, 266, 266, 266, 266,
+ 266, 266, 266, 266, 266, 266, 266, 266,
// 632 - 639
- 266, 266, 266, 266, 266, 266, 266, 266,
+ 266, 266, 266, 266, 266, 266, 266, 266,
// 640 - 647
- 298, 298, 298, 298, 298, 298, 298, 298,
+ 298, 298, 298, 298, 298, 298, 298, 298,
// 648 - 655
- 298, 298, 298, 298, 298, 298, 298, 298,
+ 298, 298, 298, 298, 298, 298, 298, 298,
// 656 - 663
- 298, 298, 298, 298, 298, 298, 298, 298,
+ 298, 298, 298, 298, 298, 298, 298, 298,
// 664 - 671
- 298, 298, 298, 298, 298, 298, 298, 298,
+ 298, 298, 298, 298, 298, 298, 298, 298,
// 672 - 679
- 524, 524, 524, 524, 524, 524, 524, 524,
+ 524, 524, 524, 524, 524, 524, 524, 524,
// 680 - 687
- 524, 524, 524, 524, 524, 524, 524, 524,
+ 524, 524, 524, 524, 524, 524, 524, 524,
// 688 - 695
- 556, 556, 556, 556, 556, 556, 556, 556,
+ 556, 556, 556, 556, 556, 556, 556, 556,
// 696 - 703
- 556, 556, 556, 556, 556, 556, 556, 556,
+ 556, 556, 556, 556, 556, 556, 556, 556,
// 704 - 711
- 136, 136, 136, 136, 136, 136, 136, 136,
+ 136, 136, 136, 136, 136, 136, 136, 136,
// 712 - 719
- 136, 136, 136, 136, 136, 136, 136, 136,
+ 136, 136, 136, 136, 136, 136, 136, 136,
// 720 - 727
- 136, 136, 136, 136, 136, 136, 136, 136,
+ 136, 136, 136, 136, 136, 136, 136, 136,
// 728 - 735
- 136, 136, 136, 136, 136, 136, 136, 136,
+ 136, 136, 136, 136, 136, 136, 136, 136,
// 736 - 743
- 136, 136, 136, 136, 136, 136, 136, 136,
+ 136, 136, 136, 136, 136, 136, 136, 136,
// 744 - 751
- 136, 136, 136, 136, 136, 136, 136, 136,
+ 136, 136, 136, 136, 136, 136, 136, 136,
// 752 - 759
- 136, 136, 136, 136, 136, 136, 136, 136,
+ 136, 136, 136, 136, 136, 136, 136, 136,
// 760 - 767
- 136, 136, 136, 136, 136, 136, 136, 136,
+ 136, 136, 136, 136, 136, 136, 136, 136,
// 768 - 775
- 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
// 776 - 783
- 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
// 784 - 791
- 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
// 792 - 799
- 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
// 800 - 807
- 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
// 808 - 815
- 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
// 816 - 823
- 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
// 824 - 831
- 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
// 832 - 839
- 460, 460, 460, 460, 460, 460, 460, 460,
+ 460, 460, 460, 460, 460, 460, 460, 460,
// 840 - 847
- 460, 460, 460, 460, 460, 460, 460, 460,
+ 460, 460, 460, 460, 460, 460, 460, 460,
// 848 - 855
- 492, 492, 492, 492, 492, 492, 492, 492,
+ 492, 492, 492, 492, 492, 492, 492, 492,
// 856 - 863
- 492, 492, 492, 492, 492, 492, 492, 492,
+ 492, 492, 492, 492, 492, 492, 492, 492,
// 864 - 871
- 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059,
+ 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059,
// 872 - 879
- 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059,
+ 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059,
// 880 - 887
- 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059,
+ 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059,
// 888 - 895
- 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059,
+ 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059,
// 896 - 903
- 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
// 904 - 911
- 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
// 912 - 919
- 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
// 920 - 927
- 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
// 928 - 935
- 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
// 936 - 943
- 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
// 944 - 951
- 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
// 952 - 959
- 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
// 960 - 967
- 232, 232, 232, 232, 232, 232, 232, 232,
+ 232, 232, 232, 232, 232, 232, 232, 232,
// 968 - 975
- 232, 232, 232, 232, 232, 232, 232, 232,
+ 232, 232, 232, 232, 232, 232, 232, 232,
// 976 - 983
- 232, 232, 232, 232, 232, 232, 232, 232,
+ 232, 232, 232, 232, 232, 232, 232, 232,
// 984 - 991
- 232, 232, 232, 232, 232, 232, 232, 232,
+ 232, 232, 232, 232, 232, 232, 232, 232,
// 992 - 999
- 232, 232, 232, 232, 232, 232, 232, 232,
+ 232, 232, 232, 232, 232, 232, 232, 232,
// 1000 - 1007
- 232, 232, 232, 232, 232, 232, 232, 232,
+ 232, 232, 232, 232, 232, 232, 232, 232,
// 1008 - 1015
- 232, 232, 232, 232, 232, 232, 232, 232,
+ 232, 232, 232, 232, 232, 232, 232, 232,
// 1016 - 1023
- 232, 232, 232, 232, 232, 232, 232, 232];
+ 232, 232, 232, 232, 232, 232, 232, 232
+ ];
/// Additional make up codes for both White and Black runs
static const List<int> ADDITIONAL_MAKEUP = const [
- 28679, 28679, 31752, -32759,
- -31735, -30711, -29687, -28663,
- 29703, 29703, 30727, 30727,
- -27639, -26615, -25591, -24567];
+ 28679,
+ 28679,
+ 31752,
+ -32759,
+ -31735,
+ -30711,
+ -29687,
+ -28663,
+ 29703,
+ 29703,
+ 30727,
+ 30727,
+ -27639,
+ -26615,
+ -25591,
+ -24567
+ ];
/// Initial black run look up table, uses the first 4 bits of a code
static const List<int> INIT_BLACK = const [
// 0 - 7
- 3226, 6412, 200, 168, 38, 38, 134, 134,
+ 3226, 6412, 200, 168, 38, 38, 134, 134,
// 8 - 15
- 100, 100, 100, 100, 68, 68, 68, 68];
+ 100, 100, 100, 100, 68, 68, 68, 68
+ ];
//
static const List<int> TWO_BIT_BLACK = const [292, 260, 226, 226]; // 0 - 3
@@ -1233,165 +1469,167 @@
// Main black run table, using the last 9 bits of possible 13 bit code
static const List<int> BLACK = const [
// 0 - 7
- 62, 62, 30, 30, 0, 0, 0, 0,
+ 62, 62, 30, 30, 0, 0, 0, 0,
// 8 - 15
- 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
// 16 - 23
- 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
// 24 - 31
- 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
// 32 - 39
- 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
// 40 - 47
- 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
// 48 - 55
- 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
// 56 - 63
- 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
// 64 - 71
- 588, 588, 588, 588, 588, 588, 588, 588,
+ 588, 588, 588, 588, 588, 588, 588, 588,
// 72 - 79
- 1680, 1680, 20499, 22547, 24595, 26643, 1776, 1776,
+ 1680, 1680, 20499, 22547, 24595, 26643, 1776, 1776,
// 80 - 87
- 1808, 1808, -24557, -22509, -20461, -18413, 1904, 1904,
+ 1808, 1808, -24557, -22509, -20461, -18413, 1904, 1904,
// 88 - 95
- 1936, 1936, -16365, -14317, 782, 782, 782, 782,
+ 1936, 1936, -16365, -14317, 782, 782, 782, 782,
// 96 - 103
- 814, 814, 814, 814, -12269, -10221, 10257, 10257,
+ 814, 814, 814, 814, -12269, -10221, 10257, 10257,
// 104 - 111
- 12305, 12305, 14353, 14353, 16403, 18451, 1712, 1712,
+ 12305, 12305, 14353, 14353, 16403, 18451, 1712, 1712,
// 112 - 119
- 1744, 1744, 28691, 30739, -32749, -30701, -28653, -26605,
+ 1744, 1744, 28691, 30739, -32749, -30701, -28653, -26605,
// 120 - 127
- 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061,
+ 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061,
// 128 - 135
- 424, 424, 424, 424, 424, 424, 424, 424,
+ 424, 424, 424, 424, 424, 424, 424, 424,
// 136 - 143
- 424, 424, 424, 424, 424, 424, 424, 424,
+ 424, 424, 424, 424, 424, 424, 424, 424,
// 144 - 151
- 424, 424, 424, 424, 424, 424, 424, 424,
+ 424, 424, 424, 424, 424, 424, 424, 424,
// 152 - 159
- 424, 424, 424, 424, 424, 424, 424, 424,
+ 424, 424, 424, 424, 424, 424, 424, 424,
// 160 - 167
- 750, 750, 750, 750, 1616, 1616, 1648, 1648,
+ 750, 750, 750, 750, 1616, 1616, 1648, 1648,
// 168 - 175
- 1424, 1424, 1456, 1456, 1488, 1488, 1520, 1520,
+ 1424, 1424, 1456, 1456, 1488, 1488, 1520, 1520,
// 176 - 183
- 1840, 1840, 1872, 1872, 1968, 1968, 8209, 8209,
+ 1840, 1840, 1872, 1872, 1968, 1968, 8209, 8209,
// 184 - 191
- 524, 524, 524, 524, 524, 524, 524, 524,
+ 524, 524, 524, 524, 524, 524, 524, 524,
// 192 - 199
- 556, 556, 556, 556, 556, 556, 556, 556,
+ 556, 556, 556, 556, 556, 556, 556, 556,
// 200 - 207
- 1552, 1552, 1584, 1584, 2000, 2000, 2032, 2032,
+ 1552, 1552, 1584, 1584, 2000, 2000, 2032, 2032,
// 208 - 215
- 976, 976, 1008, 1008, 1040, 1040, 1072, 1072,
+ 976, 976, 1008, 1008, 1040, 1040, 1072, 1072,
// 216 - 223
- 1296, 1296, 1328, 1328, 718, 718, 718, 718,
+ 1296, 1296, 1328, 1328, 718, 718, 718, 718,
// 224 - 231
- 456, 456, 456, 456, 456, 456, 456, 456,
+ 456, 456, 456, 456, 456, 456, 456, 456,
// 232 - 239
- 456, 456, 456, 456, 456, 456, 456, 456,
+ 456, 456, 456, 456, 456, 456, 456, 456,
// 240 - 247
- 456, 456, 456, 456, 456, 456, 456, 456,
+ 456, 456, 456, 456, 456, 456, 456, 456,
// 248 - 255
- 456, 456, 456, 456, 456, 456, 456, 456,
+ 456, 456, 456, 456, 456, 456, 456, 456,
// 256 - 263
- 326, 326, 326, 326, 326, 326, 326, 326,
+ 326, 326, 326, 326, 326, 326, 326, 326,
// 264 - 271
- 326, 326, 326, 326, 326, 326, 326, 326,
+ 326, 326, 326, 326, 326, 326, 326, 326,
// 272 - 279
- 326, 326, 326, 326, 326, 326, 326, 326,
+ 326, 326, 326, 326, 326, 326, 326, 326,
// 280 - 287
- 326, 326, 326, 326, 326, 326, 326, 326,
+ 326, 326, 326, 326, 326, 326, 326, 326,
// 288 - 295
- 326, 326, 326, 326, 326, 326, 326, 326,
+ 326, 326, 326, 326, 326, 326, 326, 326,
// 296 - 303
- 326, 326, 326, 326, 326, 326, 326, 326,
+ 326, 326, 326, 326, 326, 326, 326, 326,
// 304 - 311
- 326, 326, 326, 326, 326, 326, 326, 326,
+ 326, 326, 326, 326, 326, 326, 326, 326,
// 312 - 319
- 326, 326, 326, 326, 326, 326, 326, 326,
+ 326, 326, 326, 326, 326, 326, 326, 326,
// 320 - 327
- 358, 358, 358, 358, 358, 358, 358, 358,
+ 358, 358, 358, 358, 358, 358, 358, 358,
// 328 - 335
- 358, 358, 358, 358, 358, 358, 358, 358,
+ 358, 358, 358, 358, 358, 358, 358, 358,
// 336 - 343
- 358, 358, 358, 358, 358, 358, 358, 358,
+ 358, 358, 358, 358, 358, 358, 358, 358,
// 344 - 351
- 358, 358, 358, 358, 358, 358, 358, 358,
+ 358, 358, 358, 358, 358, 358, 358, 358,
// 352 - 359
- 358, 358, 358, 358, 358, 358, 358, 358,
+ 358, 358, 358, 358, 358, 358, 358, 358,
// 360 - 367
- 358, 358, 358, 358, 358, 358, 358, 358,
+ 358, 358, 358, 358, 358, 358, 358, 358,
// 368 - 375
- 358, 358, 358, 358, 358, 358, 358, 358,
+ 358, 358, 358, 358, 358, 358, 358, 358,
// 376 - 383
- 358, 358, 358, 358, 358, 358, 358, 358,
+ 358, 358, 358, 358, 358, 358, 358, 358,
// 384 - 391
- 490, 490, 490, 490, 490, 490, 490, 490,
+ 490, 490, 490, 490, 490, 490, 490, 490,
// 392 - 399
- 490, 490, 490, 490, 490, 490, 490, 490,
+ 490, 490, 490, 490, 490, 490, 490, 490,
// 400 - 407
- 4113, 4113, 6161, 6161, 848, 848, 880, 880,
+ 4113, 4113, 6161, 6161, 848, 848, 880, 880,
// 408 - 415
- 912, 912, 944, 944, 622, 622, 622, 622,
+ 912, 912, 944, 944, 622, 622, 622, 622,
// 416 - 423
- 654, 654, 654, 654, 1104, 1104, 1136, 1136,
+ 654, 654, 654, 654, 1104, 1104, 1136, 1136,
// 424 - 431
- 1168, 1168, 1200, 1200, 1232, 1232, 1264, 1264,
+ 1168, 1168, 1200, 1200, 1232, 1232, 1264, 1264,
// 432 - 439
- 686, 686, 686, 686, 1360, 1360, 1392, 1392,
+ 686, 686, 686, 686, 1360, 1360, 1392, 1392,
// 440 - 447
- 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
// 448 - 455
- 390, 390, 390, 390, 390, 390, 390, 390,
+ 390, 390, 390, 390, 390, 390, 390, 390,
// 456 - 463
- 390, 390, 390, 390, 390, 390, 390, 390,
+ 390, 390, 390, 390, 390, 390, 390, 390,
// 464 - 471
- 390, 390, 390, 390, 390, 390, 390, 390,
+ 390, 390, 390, 390, 390, 390, 390, 390,
// 472 - 479
- 390, 390, 390, 390, 390, 390, 390, 390,
+ 390, 390, 390, 390, 390, 390, 390, 390,
// 480 - 487
- 390, 390, 390, 390, 390, 390, 390, 390,
+ 390, 390, 390, 390, 390, 390, 390, 390,
// 488 - 495
- 390, 390, 390, 390, 390, 390, 390, 390,
+ 390, 390, 390, 390, 390, 390, 390, 390,
// 496 - 503
- 390, 390, 390, 390, 390, 390, 390, 390,
+ 390, 390, 390, 390, 390, 390, 390, 390,
// 504 - 511
- 390, 390, 390, 390, 390, 390, 390, 390];
+ 390, 390, 390, 390, 390, 390, 390, 390
+ ];
static const List<int> TWO_D_CODES = const [
// 0 - 7
- 80, 88, 23, 71, 30, 30, 62, 62,
+ 80, 88, 23, 71, 30, 30, 62, 62,
// 8 - 15
- 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
// 16 - 23
- 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11,
// 24 - 31
- 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11,
// 32 - 39
- 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
// 40 - 47
- 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
// 48 - 55
- 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
// 56 - 63
- 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
// 64 - 71
- 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
// 72 - 79
- 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
// 80 - 87
- 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
// 88 - 95
- 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
// 96 - 103
- 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
// 104 - 111
- 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
// 112 - 119
- 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
// 120 - 127
- 41, 41, 41, 41, 41, 41, 41, 41];
+ 41, 41, 41, 41, 41, 41, 41, 41
+ ];
}
diff --git a/image/lib/src/formats/tiff/tiff_image.dart b/image/lib/src/formats/tiff/tiff_image.dart
index 5c3a8e3..3c93a0f 100755
--- a/image/lib/src/formats/tiff/tiff_image.dart
+++ b/image/lib/src/formats/tiff/tiff_image.dart
@@ -40,10 +40,13 @@
int t6Options = 0;
int extraSamples;
List<int> colorMap;
+
/// Starting index in the [colorMap] for the red channel.
int colorMapRed;
+
/// Starting index in the [colorMap] for the green channel.
int colorMapGreen;
+
/// Starting index in the [colorMap] for the blue channel.
int colorMapBlue;
Image image;
@@ -93,8 +96,10 @@
}
}
- if (width == null || height == null ||
- bitsPerSample == null || compression == null) {
+ if (width == null ||
+ height == null ||
+ bitsPerSample == null ||
+ compression == null) {
return;
}
@@ -178,8 +183,7 @@
break;
case 3: // RGB Palette
if (samplesPerPixel == 1 &&
- (bitsPerSample == 4 || bitsPerSample == 8 ||
- bitsPerSample == 16)) {
+ (bitsPerSample == 4 || bitsPerSample == 8 || bitsPerSample == 16)) {
imageType = TYPE_PALETTE;
}
break;
@@ -190,7 +194,8 @@
break;
case 6: // YCbCr
if (compression == COMPRESSION_JPEG &&
- bitsPerSample == 8 && samplesPerPixel == 3) {
+ bitsPerSample == 8 &&
+ samplesPerPixel == 3) {
imageType = TYPE_RGB;
} else {
if (hasTag(TAG_YCBCR_SUBSAMPLING)) {
@@ -217,10 +222,12 @@
}
}
- bool get isValid => width != null && height != null &&
- samplesPerPixel != null &&
- bitsPerSample != null &&
- compression != null;
+ bool get isValid =>
+ width != null &&
+ height != null &&
+ samplesPerPixel != null &&
+ bitsPerSample != null &&
+ compression != null;
Image decode(InputBuffer p) {
image = Image(width, height);
@@ -234,13 +241,13 @@
HdrImage decodeHdr(InputBuffer p) {
hdrImage = HdrImage.create(width, height, 4, HdrImage.HALF);
- for (int tileY = 0, ti = 0; tileY < tilesY; ++tileY) {
- for (int tileX = 0; tileX < tilesX; ++tileX, ++ti) {
- _decodeTile(p, tileX, tileY);
- }
+ for (int tileY = 0, ti = 0; tileY < tilesY; ++tileY) {
+ for (int tileX = 0; tileX < tilesX; ++tileX, ++ti) {
+ _decodeTile(p, tileX, tileY);
}
- return hdrImage;
}
+ return hdrImage;
+ }
bool hasTag(int tag) => tags.containsKey(tag);
@@ -268,14 +275,14 @@
if (bitsPerSample == 8 || bitsPerSample == 16) {
if (compression == COMPRESSION_NONE) {
bdata = p;
-
} else if (compression == COMPRESSION_LZW) {
bdata = InputBuffer(new Uint8List(bytesInThisTile));
LzwDecoder decoder = LzwDecoder();
try {
decoder.decode(new InputBuffer.from(p, offset: 0, length: byteCount),
- bdata.buffer);
+ bdata.buffer);
} catch (e) {
+ print(e);
}
// Horizontal Differencing Predictor
if (predictor == 2) {
@@ -283,7 +290,8 @@
for (int j = 0; j < tileHeight; j++) {
count = samplesPerPixel * (j * tileWidth + 1);
for (int i = samplesPerPixel, len = tileWidth * samplesPerPixel;
- i < len; i++) {
+ i < len;
+ i++) {
bdata[count] += bdata[count - samplesPerPixel];
count++;
}
@@ -292,12 +300,10 @@
} else if (compression == COMPRESSION_PACKBITS) {
bdata = InputBuffer(new Uint8List(bytesInThisTile));
_decodePackbits(p, bytesInThisTile, bdata.buffer);
-
} else if (compression == COMPRESSION_DEFLATE) {
List<int> data = p.toList(0, byteCount);
List<int> outData = Inflate(data).getBytes();
bdata = InputBuffer(outData);
-
} else if (compression == COMPRESSION_ZIP) {
List<int> data = p.toList(0, byteCount);
List<int> outData = ZLibDecoder().decodeBytes(data);
@@ -353,9 +359,10 @@
if (image != null) {
int c;
if (photometricType == 3 && colorMap != null) {
- c = getColor(colorMap[colorMapRed + gray],
- colorMap[colorMapGreen + gray],
- colorMap[colorMapBlue + gray]);
+ c = getColor(
+ colorMap[colorMapRed + gray],
+ colorMap[colorMapGreen + gray],
+ colorMap[colorMapBlue + gray]);
} else {
c = getColor(gray, gray, gray, 255);
}
@@ -461,8 +468,8 @@
}
}
- void _jpegToImage(Image tile, Image image, int outX, int outY,
- int tileWidth, int tileHeight) {
+ void _jpegToImage(Image tile, Image image, int outX, int outY, int tileWidth,
+ int tileHeight) {
int width = tileWidth;
int height = tileHeight;
for (int y = 0; y < height; y++) {
@@ -562,24 +569,21 @@
} else if (compression == COMPRESSION_CCITT_RLE) {
bdata = InputBuffer(new Uint8List(tileWidth * tileHeight));
try {
- new TiffFaxDecoder(fillOrder, tileWidth, tileHeight).
- decode1D(bdata, p, 0, tileHeight);
- } catch (_) {
- }
+ new TiffFaxDecoder(fillOrder, tileWidth, tileHeight)
+ .decode1D(bdata, p, 0, tileHeight);
+ } catch (_) {}
} else if (compression == COMPRESSION_CCITT_FAX3) {
bdata = InputBuffer(new Uint8List(tileWidth * tileHeight));
try {
- new TiffFaxDecoder(fillOrder, tileWidth, tileHeight).
- decode2D(bdata, p, 0, tileHeight, t4Options);
- } catch (_) {
- }
+ new TiffFaxDecoder(fillOrder, tileWidth, tileHeight)
+ .decode2D(bdata, p, 0, tileHeight, t4Options);
+ } catch (_) {}
} else if (compression == COMPRESSION_CCITT_FAX4) {
bdata = InputBuffer(new Uint8List(tileWidth * tileHeight));
try {
- new TiffFaxDecoder(fillOrder, tileWidth, tileHeight).
- decodeT6(bdata, p, 0, tileHeight, t6Options);
- } catch (_) {
- }
+ new TiffFaxDecoder(fillOrder, tileWidth, tileHeight)
+ .decodeT6(bdata, p, 0, tileHeight, t6Options);
+ } catch (_) {}
} else if (compression == COMPRESSION_ZIP) {
List<int> data = p.toList(0, byteCount);
List<int> outData = ZLibDecoder().decodeBytes(data);
@@ -614,9 +618,7 @@
}
}
- /**
- * Uncompress packbits compressed image data.
- */
+ /// Uncompress packbits compressed image data.
void _decodePackbits(InputBuffer data, int arraySize, List<int> dst) {
int srcCount = 0;
int dstCount = 0;
@@ -734,7 +736,7 @@
static const int TAG_T4_OPTIONS = 292;
static const int TAG_T6_OPTIONS = 293;
static const int TAG_THRESHOLDING = 263;
- static const int TAG_TILE_WIDTH = 322;
+ static const int TAG_TILE_WIDTH = 322;
static const int TAG_TILE_LENGTH = 323;
static const int TAG_TILE_OFFSETS = 324;
static const int TAG_TILE_BYTE_COUNTS = 325;
diff --git a/image/lib/src/formats/tiff/tiff_lzw_decoder.dart b/image/lib/src/formats/tiff/tiff_lzw_decoder.dart
index aaf0a6e..19b9ff2 100755
--- a/image/lib/src/formats/tiff/tiff_lzw_decoder.dart
+++ b/image/lib/src/formats/tiff/tiff_lzw_decoder.dart
@@ -8,7 +8,7 @@
this._out = out;
int outLen = out.length;
_outPointer = 0;
- _data = p.buffer;
+ _data = p.buffer as Uint8List;
_dataLength = _data.length;
_bytePointer = p.offset;
@@ -88,9 +88,7 @@
}
}
- /**
- * Returns the next 9, 10, 11 or 12 bits
- */
+ /// Returns the next 9, 10, 11 or 12 bits
int _getNextCode() {
if (_bytePointer >= _dataLength) {
return 257;
@@ -110,9 +108,7 @@
return code;
}
- /**
- * Initialize the string table.
- */
+ /// Initialize the string table.
void _initializeStringTable() {
_table = Uint8List(LZ_MAX_CODE + 1);
_prefix = Uint32List(LZ_MAX_CODE + 1);
diff --git a/image/lib/src/formats/tiff_decoder.dart b/image/lib/src/formats/tiff_decoder.dart
index 12ef08f..ff16b0b 100755
--- a/image/lib/src/formats/tiff_decoder.dart
+++ b/image/lib/src/formats/tiff_decoder.dart
@@ -11,36 +11,28 @@
class TiffDecoder extends Decoder {
TiffInfo info;
- /**
- * Is the given file a valid TIFF image?
- */
+ /// Is the given file a valid TIFF image?
bool isValidFile(List<int> data) {
return _readHeader(new InputBuffer(data)) != null;
}
- /**
- * Validate the file is a Gif image and get information about it.
- * If the file is not a valid Gif image, null is returned.
- */
+ /// Validate the file is a Gif image and get information about it.
+ /// If the file is not a valid Gif image, null is returned.
TiffInfo startDecode(List<int> bytes) {
_input = InputBuffer(new Uint8List.fromList(bytes));
info = _readHeader(_input);
return info;
}
- /**
- * How many frames are available to be decoded. [startDecode] should have
- * been called first. Non animated image files will have a single frame.
- */
+ /// How many frames are available to be decoded. [startDecode] should have
+ /// been called first. Non animated image files will have a single frame.
int numFrames() => info != null ? info.images.length : 0;
- /**
- * Decode a single frame from the data stat was set with [startDecode].
- * If [frame] is out of the range of available frames, null is returned.
- * Non animated image files will only have [frame] 0. An [AnimationFrame]
- * is returned, which provides the image, and top-left coordinates of the
- * image, as animated frames may only occupy a subset of the canvas.
- */
+ /// Decode a single frame from the data stat was set with [startDecode].
+ /// If [frame] is out of the range of available frames, null is returned.
+ /// Non animated image files will only have [frame] 0. An [AnimationFrame]
+ /// is returned, which provides the image, and top-left coordinates of the
+ /// image, as animated frames may only occupy a subset of the canvas.
Image decodeFrame(int frame) {
if (info == null) {
return null;
@@ -49,12 +41,10 @@
return info.images[frame].decode(_input);
}
- /**
- * Decode the file and extract a single image from it. If the file is
- * animated, the specified [frame] will be decoded. If there was a problem
- * decoding the file, null is returned.
- */
- Image decodeImage(List<int> data, {int frame: 0}) {
+ /// Decode the file and extract a single image from it. If the file is
+ /// animated, the specified [frame] will be decoded. If there was a problem
+ /// decoding the file, null is returned.
+ Image decodeImage(List<int> data, {int frame = 0}) {
InputBuffer ptr = InputBuffer(new Uint8List.fromList(data));
TiffInfo info = _readHeader(ptr);
@@ -65,7 +55,7 @@
return info.images[frame].decode(ptr);
}
- HdrImage decodeHdrImage(List<int> data, {int frame: 0}) {
+ HdrImage decodeHdrImage(List<int> data, {int frame = 0}) {
InputBuffer ptr = InputBuffer(new Uint8List.fromList(data));
TiffInfo info = _readHeader(ptr);
@@ -76,11 +66,9 @@
return info.images[frame].decodeHdr(ptr);
}
- /**
- * Decode all of the frames from an animation. If the file is not an
- * animation, a single frame animation is returned. If there was a problem
- * decoding the file, null is returned.
- */
+ /// Decode all of the frames from an animation. If the file is not an
+ /// animation, a single frame animation is returned. If there was a problem
+ /// decoding the file, null is returned.
Animation decodeAnimation(List<int> data) {
if (startDecode(data) == null) {
return null;
@@ -101,14 +89,11 @@
return anim;
}
- /**
- * Read the TIFF header and IFD blocks.
- */
+ /// Read the TIFF header and IFD blocks.
TiffInfo _readHeader(InputBuffer p) {
TiffInfo info = TiffInfo();
int byteOrder = p.readUint16();
- if (byteOrder != TIFF_LITTLE_ENDIAN &&
- byteOrder != TIFF_BIG_ENDIAN) {
+ if (byteOrder != TIFF_LITTLE_ENDIAN && byteOrder != TIFF_BIG_ENDIAN) {
return null;
}
@@ -153,7 +138,7 @@
}
}
- return info.images.length > 0 ? info : null;
+ return info.images.isNotEmpty ? info : null;
}
InputBuffer _input;
diff --git a/image/lib/src/formats/webp/vp8.dart b/image/lib/src/formats/webp/vp8.dart
index 9d27dfd..50392ec 100755
--- a/image/lib/src/formats/webp/vp8.dart
+++ b/image/lib/src/formats/webp/vp8.dart
@@ -8,15 +8,12 @@
import 'webp_alpha.dart';
import 'webp_info.dart';
-/**
- * WebP lossy format.
- */
+/// WebP lossy format.
class VP8 {
InputBuffer input;
InternalWebPInfo _webp;
- VP8(InputBuffer input, this._webp) :
- this.input = input;
+ VP8(InputBuffer input, this._webp) : this.input = input;
WebPInfo get webp => _webp;
@@ -120,7 +117,7 @@
_parseQuant();
// Frame buffer marking
- br.get(); // ignore the value of update_proba_
+ br.get(); // ignore the value of update_proba_
_parseProba();
@@ -131,7 +128,8 @@
hdr.useSegment = br.get() != 0;
if (hdr.useSegment) {
hdr.updateMap = br.get() != 0;
- if (br.get() != 0) { // update data
+ if (br.get() != 0) {
+ // update data
hdr.absoluteDelta = br.get() != 0;
for (int s = 0; s < NUM_MB_SEGMENTS; ++s) {
hdr.quantizer[s] = br.get() != 0 ? br.getSignedValue(7) : 0;
@@ -159,7 +157,8 @@
hdr.sharpness = br.getValue(3);
hdr.useLfDelta = br.get() != 0;
if (hdr.useLfDelta) {
- if (br.get() != 0) { // update lf-delta?
+ if (br.get() != 0) {
+ // update lf-delta?
for (int i = 0; i < NUM_REF_LF_DELTAS; ++i) {
if (br.get() != 0) {
hdr.refLfDelta[i] = br.getSignedValue(6);
@@ -179,16 +178,14 @@
return true;
}
- /**
- * This function returns VP8_STATUS_SUSPENDED if we don't have all the
- * necessary data in 'buf'.
- * This case is not necessarily an error (for incremental decoding).
- * Still, no bitreader is ever initialized to make it possible to read
- * unavailable memory.
- * If we don't even have the partitions' sizes, than VP8_STATUS_NOT_ENOUGH_DATA
- * is returned, and this is an unrecoverable error.
- * If the partitions were positioned ok, VP8_STATUS_OK is returned.
- */
+ /// This function returns VP8_STATUS_SUSPENDED if we don't have all the
+ /// necessary data in 'buf'.
+ /// This case is not necessarily an error (for incremental decoding).
+ /// Still, no bitreader is ever initialized to make it possible to read
+ /// unavailable memory.
+ /// If we don't even have the partitions' sizes, than VP8_STATUS_NOT_ENOUGH_DATA
+ /// is returned, and this is an unrecoverable error.
+ /// If the partitions were positioned ok, VP8_STATUS_OK is returned.
bool _parsePartitions(InputBuffer input) {
int sz = 0;
int bufEnd = input.length;
@@ -215,8 +212,8 @@
sz += 3;
}
- InputBuffer pin = input.subset(bufEnd - partStart,
- position: input.position + partStart);
+ InputBuffer pin =
+ input.subset(bufEnd - partStart, position: input.position + partStart);
_partitions[lastPart] = VP8BitReader(pin);
// Init is ok, but there's not enough data
@@ -251,7 +248,7 @@
VP8QuantMatrix m = _dqm[i];
m.y1Mat[0] = DC_TABLE[_clip(q + dqy1_dc, 127)];
- m.y1Mat[1] = AC_TABLE[_clip(q + 0, 127)];
+ m.y1Mat[1] = AC_TABLE[_clip(q + 0, 127)];
m.y2Mat[0] = DC_TABLE[_clip(q + dqy2_dc, 127)] * 2;
// For all x in [0..284], x*155/100 is bitwise equal to (x*101581) >> 16.
@@ -265,7 +262,7 @@
m.uvMat[0] = DC_TABLE[_clip(q + dquv_dc, 117)];
m.uvMat[1] = AC_TABLE[_clip(q + dquv_ac, 127)];
- m.uvQuant = q + dquv_ac; // for dithering strength evaluation
+ m.uvQuant = q + dquv_ac; // for dithering strength evaluation
}
}
@@ -275,9 +272,10 @@
for (int b = 0; b < NUM_BANDS; ++b) {
for (int c = 0; c < NUM_CTX; ++c) {
for (int p = 0; p < NUM_PROBAS; ++p) {
- final int v = br.getBit(COEFFS_UPDATE_PROBA[t][b][c][p]) != 0 ?
- br.getValue(8) : COEFFS_PROBA_0[t][b][c][p];
- proba.bands[t][b].probas[c][p] = v;
+ final int v = br.getBit(COEFFS_UPDATE_PROBA[t][b][c][p]) != 0
+ ? br.getValue(8)
+ : COEFFS_PROBA_0[t][b][c][p];
+ proba.bands[t][b].probas[c][p] = v;
}
}
}
@@ -289,10 +287,8 @@
}
}
- /**
- * Precompute the filtering strength for each segment and each i4x4/i16x16
- * mode.
- */
+ /// Precompute the filtering strength for each segment and each i4x4/i16x16
+ /// mode.
void _precomputeFilterStrengths() {
if (_filterType > 0) {
VP8FilterHeader hdr = _filterHeader;
@@ -341,7 +337,7 @@
info.fLimit = 2 * level + ilevel;
info.hevThresh = (level >= 40) ? 2 : (level >= 15) ? 1 : 0;
} else {
- info.fLimit = 0; // no filtering
+ info.fLimit = 0; // no filtering
}
info.fInner = i4x4 != 0;
@@ -377,13 +373,13 @@
final int extra_uv = (extra_rows ~/ 2) * _cacheUVStride;
_cacheY = InputBuffer(new Uint8List(16 * _cacheYStride + extra_y),
- offset: extra_y);
+ offset: extra_y);
_cacheU = InputBuffer(new Uint8List(8 * _cacheUVStride + extra_uv),
- offset: extra_uv);
+ offset: extra_uv);
_cacheV = InputBuffer(new Uint8List(8 * _cacheUVStride + extra_uv),
- offset: extra_uv);
+ offset: extra_uv);
_tmpY = InputBuffer(new Uint8List(webp.width));
@@ -536,12 +532,14 @@
}
// predict and add residuals
- if (block.isIntra4x4) { // 4x4
+ if (block.isIntra4x4) {
+ // 4x4
InputBuffer topRight = InputBuffer.from(y_dst, offset: -BPS + 16);
Uint32List topRight32 = topRight.toUint32List();
if (mb_y > 0) {
- if (mb_x >= _mbWidth - 1) { // on rightmost border
+ if (mb_x >= _mbWidth - 1) {
+ // on rightmost border
topRight.memset(0, 4, top_yuv.y[15]);
} else {
topRight.memcpy(0, 4, _yuvT[mb_x + 1].y);
@@ -562,7 +560,8 @@
_doTransform(bits, new InputBuffer(coeffs, offset: n * 16), dst);
}
- } else { // 16x16
+ } else {
+ // 16x16
int predFunc = _checkMode(mb_x, mb_y, block.imodes[0]);
VP8Filter.PredLuma16[predFunc](y_dst);
@@ -615,10 +614,23 @@
}
static const List<int> kScan = const [
- 0 + 0 * BPS, 4 + 0 * BPS, 8 + 0 * BPS, 12 + 0 * BPS,
- 0 + 4 * BPS, 4 + 4 * BPS, 8 + 4 * BPS, 12 + 4 * BPS,
- 0 + 8 * BPS, 4 + 8 * BPS, 8 + 8 * BPS, 12 + 8 * BPS,
- 0 + 12 * BPS, 4 + 12 * BPS, 8 + 12 * BPS, 12 + 12 * BPS ];
+ 0 + 0 * BPS,
+ 4 + 0 * BPS,
+ 8 + 0 * BPS,
+ 12 + 0 * BPS,
+ 0 + 4 * BPS,
+ 4 + 4 * BPS,
+ 8 + 4 * BPS,
+ 12 + 4 * BPS,
+ 0 + 8 * BPS,
+ 4 + 8 * BPS,
+ 8 + 8 * BPS,
+ 12 + 8 * BPS,
+ 0 + 12 * BPS,
+ 4 + 12 * BPS,
+ 8 + 12 * BPS,
+ 12 + 12 * BPS
+ ];
static int _checkMode(int mb_x, int mb_y, int mode) {
if (mode == B_DC_PRED) {
@@ -648,8 +660,10 @@
}
void _doUVTransform(int bits, InputBuffer src, InputBuffer dst) {
- if (bits & 0xff != 0) { // any non-zero coeff at all?
- if (bits & 0xaa != 0) { // any non-zero AC coefficient?
+ if (bits & 0xff != 0) {
+ // any non-zero coeff at all?
+ if (bits & 0xaa != 0) {
+ // any non-zero AC coefficient?
// note we don't use the AC3 variant for U/V
_dsp.transformUV(src, dst);
} else {
@@ -661,14 +675,12 @@
// vertical position of a MB
int MACROBLOCK_VPOS(int mb_y) => mb_y * 16;
- /**
- * kFilterExtraRows[] = How many extra lines are needed on the MB boundary
- * for caching, given a filtering level.
- * Simple filter: up to 2 luma samples are read and 1 is written.
- * Complex filter: up to 4 luma samples are read and 3 are written. Same for
- * U/V, so it's 8 samples total (because of the 2x upsampling).
- */
- static const List<int> kFilterExtraRows = const [ 0, 2, 8 ];
+ /// kFilterExtraRows[] = How many extra lines are needed on the MB boundary
+ /// for caching, given a filtering level.
+ /// Simple filter: up to 2 luma samples are read and 1 is written.
+ /// Complex filter: up to 4 luma samples are read and 3 are written. Same for
+ /// U/V, so it's 8 samples total (because of the 2x upsampling).
+ static const List<int> kFilterExtraRows = const [0, 2, 8];
void _doFilter(int mbX, int mbY) {
final int yBps = _cacheYStride;
@@ -680,7 +692,8 @@
return;
}
- if (_filterType == 1) { // simple
+ if (_filterType == 1) {
+ // simple
if (mbX > 0) {
_dsp.simpleHFilter16(yDst, yBps, limit + 4);
}
@@ -693,7 +706,8 @@
if (fInfo.fInner) {
_dsp.simpleVFilter16i(yDst, yBps, limit);
}
- } else { // complex
+ } else {
+ // complex
final int uvBps = _cacheUVStride;
InputBuffer uDst = InputBuffer.from(_cacheU, offset: mbX * 8);
InputBuffer vDst = InputBuffer.from(_cacheV, offset: mbX * 8);
@@ -718,31 +732,25 @@
}
}
- /**
- * Filter the decoded macroblock row (if needed)
- */
+ /// Filter the decoded macroblock row (if needed)
void _filterRow() {
for (int mbX = _tlMbX; mbX < _brMbX; ++mbX) {
_doFilter(mbX, _mbY);
}
}
- void _ditherRow() {
- }
+ void _ditherRow() {}
-
- /**
- * This function is called after a row of macroblocks is finished decoding.
- * It also takes into account the following restrictions:
- *
- * * In case of in-loop filtering, we must hold off sending some of the bottom
- * pixels as they are yet unfiltered. They will be when the next macroblock
- * row is decoded. Meanwhile, we must preserve them by rotating them in the
- * cache area. This doesn't hold for the very bottom row of the uncropped
- * picture of course.
- * * we must clip the remaining pixels against the cropping area. The VP8Io
- * struct must have the following fields set correctly before calling put():
- */
+ /// This function is called after a row of macroblocks is finished decoding.
+ /// It also takes into account the following restrictions:
+ ///
+ /// * In case of in-loop filtering, we must hold off sending some of the bottom
+ /// pixels as they are yet unfiltered. They will be when the next macroblock
+ /// row is decoded. Meanwhile, we must preserve them by rotating them in the
+ /// cache area. This doesn't hold for the very bottom row of the uncropped
+ /// picture of course.
+ /// * we must clip the remaining pixels against the cropping area. The VP8Io
+ /// struct must have the following fields set correctly before calling put():
bool _finishRow(bool useFilter) {
final int extraYRows = kFilterExtraRows[_filterType];
final int ySize = extraYRows * _cacheYStride;
@@ -780,7 +788,7 @@
}
if (yEnd > _cropBottom) {
- yEnd = _cropBottom; // make sure we don't overflow on last row.
+ yEnd = _cropBottom; // make sure we don't overflow on last row.
}
_a = null;
@@ -866,16 +874,21 @@
rgba[3] = 0xff;
}
- void _upsample(InputBuffer topY, InputBuffer bottomY,
- InputBuffer topU, InputBuffer topV,
- InputBuffer curU, InputBuffer curV,
- InputBuffer topDst, InputBuffer bottomDst,
- int len) {
+ void _upsample(
+ InputBuffer topY,
+ InputBuffer bottomY,
+ InputBuffer topU,
+ InputBuffer topV,
+ InputBuffer curU,
+ InputBuffer curV,
+ InputBuffer topDst,
+ InputBuffer bottomDst,
+ int len) {
int LOAD_UV(int u, int v) => ((u) | ((v) << 16));
final int lastPixelPair = (len - 1) >> 1;
int tl_uv = LOAD_UV(topU[0], topV[0]); // top-left sample
- int l_uv = LOAD_UV(curU[0], curV[0]); // left-sample
+ int l_uv = LOAD_UV(curU[0], curV[0]); // left-sample
final int uv0 = (3 * tl_uv + l_uv + 0x00020002) >> 2;
_yuvToRgba(topY[0], uv0 & 0xff, (uv0 >> 16), topDst);
@@ -887,7 +900,7 @@
for (int x = 1; x <= lastPixelPair; ++x) {
final int t_uv = LOAD_UV(topU[x], topV[x]); // top sample
- final int uv = LOAD_UV(curU[x], curV[x]); // sample
+ final int uv = LOAD_UV(curU[x], curV[x]); // sample
// precompute invariant values associated with first and second diagonals
final int avg = tl_uv + t_uv + l_uv + uv + 0x00080008;
final int diag_12 = (avg + 2 * (t_uv + l_uv)) >> 3;
@@ -900,7 +913,7 @@
new InputBuffer.from(topDst, offset: (2 * x - 1) * 4));
_yuvToRgba(topY[2 * x - 0], uv1 & 0xff, (uv1 >> 16),
- new InputBuffer.from(topDst, offset: (2 * x - 0) * 4));
+ new InputBuffer.from(topDst, offset: (2 * x - 0) * 4));
if (bottomY != null) {
uv0 = (diag_03 + l_uv) >> 1;
@@ -910,7 +923,7 @@
new InputBuffer.from(bottomDst, offset: (2 * x - 1) * 4));
_yuvToRgba(bottomY[2 * x], uv1 & 0xff, (uv1 >> 16),
- new InputBuffer.from(bottomDst, offset: (2 * x + 0) * 4));
+ new InputBuffer.from(bottomDst, offset: (2 * x + 0) * 4));
}
tl_uv = t_uv;
@@ -920,12 +933,12 @@
if ((len & 1) == 0) {
final int uv0 = (3 * tl_uv + l_uv + 0x00020002) >> 2;
_yuvToRgba(topY[len - 1], uv0 & 0xff, (uv0 >> 16),
- new InputBuffer.from(topDst, offset: (len - 1) * 4));
+ new InputBuffer.from(topDst, offset: (len - 1) * 4));
if (bottomY != null) {
final int uv0 = (3 * l_uv + tl_uv + 0x00020002) >> 2;
_yuvToRgba(bottomY[len - 1], uv0 & 0xff, (uv0 >> 16),
- new InputBuffer.from(bottomDst, offset: (len - 1) * 4));
+ new InputBuffer.from(bottomDst, offset: (len - 1) * 4));
}
}
}
@@ -953,7 +966,8 @@
alpha.offset -= webp.width;
}
- InputBuffer dst = InputBuffer(output.getBytes(), offset: startY * stride + 3);
+ InputBuffer dst =
+ InputBuffer(output.getBytes(), offset: startY * stride + 3);
if (_cropTop + mbY + mbH == _cropBottom) {
// If it's the very last call, we process all the remaining rows!
@@ -971,10 +985,10 @@
}
}
-
int _emitFancyRGB(int mbY, int mbW, int mbH) {
- int numLinesOut = mbH; // a priori guess
- InputBuffer dst = InputBuffer(output.getBytes(), offset: mbY * webp.width * 4);
+ int numLinesOut = mbH; // a priori guess
+ InputBuffer dst =
+ InputBuffer(output.getBytes(), offset: mbY * webp.width * 4);
InputBuffer curY = InputBuffer.from(_y);
InputBuffer curU = InputBuffer.from(_u);
InputBuffer curV = InputBuffer.from(_v);
@@ -991,7 +1005,7 @@
} else {
// We can finish the left-over line from previous call.
_upsample(_tmpY, curY, topU, topV, curU, curV,
- new InputBuffer.from(dst, offset: -stride), dst, mbW);
+ new InputBuffer.from(dst, offset: -stride), dst, mbW);
++numLinesOut;
}
@@ -1005,9 +1019,16 @@
curV.offset += _cacheUVStride;
dst.offset += 2 * stride;
curY.offset += 2 * _cacheYStride;
- _upsample(new InputBuffer.from(curY, offset: -_cacheYStride), curY,
- topU, topV, curU, curV,
- new InputBuffer.from(dst, offset: -stride), dst, mbW);
+ _upsample(
+ new InputBuffer.from(curY, offset: -_cacheYStride),
+ curY,
+ topU,
+ topV,
+ curU,
+ curV,
+ new InputBuffer.from(dst, offset: -stride),
+ dst,
+ mbW);
}
// move to last row
@@ -1036,7 +1057,7 @@
final int height = webp.height;
if (row < 0 || numRows <= 0 || row + numRows > height) {
- return null; // sanity check.
+ return null; // sanity check.
}
if (row == 0) {
@@ -1064,9 +1085,9 @@
// to decode more than 1 keyframe.
if (_segmentHeader.updateMap) {
// Hardcoded tree parsing
- _segment = br.getBit(_proba.segments[0]) == 0 ?
- br.getBit(_proba.segments[1]) :
- 2 + br.getBit(_proba.segments[2]);
+ _segment = br.getBit(_proba.segments[0]) == 0
+ ? br.getBit(_proba.segments[1])
+ : 2 + br.getBit(_proba.segments[2]);
}
skip = _useSkipProba ? br.getBit(_skipP) != 0 : false;
@@ -1084,7 +1105,8 @@
block.nonZeroUV = 0;
}
- if (_filterType > 0) { // store filter info
+ if (_filterType > 0) {
+ // store filter info
_fInfo[_mbX] = _fStrengths[_segment][block.isIntra4x4 ? 1 : 0];
VP8FInfo finfo = _fInfo[_mbX];
finfo.fInner = finfo.fInner || !skip;
@@ -1111,14 +1133,17 @@
dst.memset(0, dst.length, 0);
- if (!block.isIntra4x4) { // parse DC
+ if (!block.isIntra4x4) {
+ // parse DC
InputBuffer dc = InputBuffer(new Int16List(16));
final int ctx = mb.nzDc + leftMb.nzDc;
final int nz = _getCoeffs(tokenBr, bands[1], ctx, q.y2Mat, 0, dc);
mb.nzDc = leftMb.nzDc = (nz > 0) ? 1 : 0;
- if (nz > 1) { // more than just the DC -> perform the full transform
+ if (nz > 1) {
+ // more than just the DC -> perform the full transform
_transformWHT(dc, dst);
- } else { // only DC is non-zero -> inlined simplified transform
+ } else {
+ // only DC is non-zero -> inlined simplified transform
final int dc0 = (dc[0] + 3) >> 3;
for (int i = 0; i < 16 * 16; i += 16) {
dst[i] = dc0;
@@ -1199,21 +1224,21 @@
int oi = 0;
for (int i = 0; i < 4; ++i) {
final int a0 = src[0 + i] + src[12 + i];
- final int a1 = src[4 + i] + src[ 8 + i];
- final int a2 = src[4 + i] - src[ 8 + i];
+ final int a1 = src[4 + i] + src[8 + i];
+ final int a2 = src[4 + i] - src[8 + i];
final int a3 = src[0 + i] - src[12 + i];
- tmp[0 + i] = a0 + a1;
- tmp[8 + i] = a0 - a1;
- tmp[4 + i] = a3 + a2;
+ tmp[0 + i] = a0 + a1;
+ tmp[8 + i] = a0 - a1;
+ tmp[4 + i] = a3 + a2;
tmp[12 + i] = a3 - a2;
}
for (int i = 0; i < 4; ++i) {
- final int dc = tmp[0 + i * 4] + 3; // w/ rounder
- final int a0 = dc + tmp[3 + i * 4];
+ final int dc = tmp[0 + i * 4] + 3; // w/ rounder
+ final int a0 = dc + tmp[3 + i * 4];
final int a1 = tmp[1 + i * 4] + tmp[2 + i * 4];
final int a2 = tmp[1 + i * 4] - tmp[2 + i * 4];
- final int a3 = dc - tmp[3 + i * 4];
+ final int a3 = dc - tmp[3 + i * 4];
out[oi + 0] = (a0 + a1) >> 3;
out[oi + 16] = (a3 + a2) >> 3;
out[oi + 32] = (a0 - a1) >> 3;
@@ -1230,20 +1255,62 @@
}
static const List<int> kBands = const [
- 0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 0];
+ 0,
+ 1,
+ 2,
+ 3,
+ 6,
+ 4,
+ 5,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 7,
+ 0
+ ];
- static const List<int> kCat3 = const [ 173, 148, 140 ];
- static const List<int> kCat4 = const [ 176, 155, 140, 135 ];
- static const List<int> kCat5 = const [ 180, 157, 141, 134, 130 ];
- static const List<int> kCat6 = const [ 254, 254, 243, 230, 196, 177, 153,
- 140, 133, 130, 129 ];
- static const List<List<int>> kCat3456 = const [ kCat3, kCat4, kCat5, kCat6 ];
- static const List<int> kZigzag = const [ 0, 1, 4, 8, 5, 2, 3, 6, 9, 12,
- 13, 10, 7, 11, 14, 15 ];
+ static const List<int> kCat3 = const [173, 148, 140];
+ static const List<int> kCat4 = const [176, 155, 140, 135];
+ static const List<int> kCat5 = const [180, 157, 141, 134, 130];
+ static const List<int> kCat6 = const [
+ 254,
+ 254,
+ 243,
+ 230,
+ 196,
+ 177,
+ 153,
+ 140,
+ 133,
+ 130,
+ 129
+ ];
+ static const List<List<int>> kCat3456 = const [kCat3, kCat4, kCat5, kCat6];
+ static const List<int> kZigzag = const [
+ 0,
+ 1,
+ 4,
+ 8,
+ 5,
+ 2,
+ 3,
+ 6,
+ 9,
+ 12,
+ 13,
+ 10,
+ 7,
+ 11,
+ 14,
+ 15
+ ];
- /**
- * See section 13-2: http://tools.ietf.org/html/rfc6386#section-13.2
- */
+ /// See section 13-2: http://tools.ietf.org/html/rfc6386#section-13.2
int _getLargeValue(VP8BitReader br, List<int> p) {
int v;
if (br.getBit(p[3]) == 0) {
@@ -1275,27 +1342,26 @@
return v;
}
-
- /**
- * Returns the position of the last non-zero coeff plus one
- */
- int _getCoeffs(VP8BitReader br, List<VP8BandProbas> prob,
- int ctx, List<int> dq, int n, InputBuffer out) {
+ /// Returns the position of the last non-zero coeff plus one
+ int _getCoeffs(VP8BitReader br, List<VP8BandProbas> prob, int ctx,
+ List<int> dq, int n, InputBuffer out) {
// n is either 0 or 1 here. kBands[n] is not necessary for extracting '*p'.
List<int> p = prob[n].probas[ctx];
for (; n < 16; ++n) {
if (br.getBit(p[0]) == 0) {
- return n; // previous coeff was last non-zero coeff
+ return n; // previous coeff was last non-zero coeff
}
- while (br.getBit(p[1]) == 0) { // sequence of zero coeffs
+ while (br.getBit(p[1]) == 0) {
+ // sequence of zero coeffs
p = prob[kBands[++n]].probas[0];
if (n == 16) {
return 16;
}
}
- { // non zero coeff
+ {
+ // non zero coeff
List<Uint8List> p_ctx = prob[kBands[n + 1]].probas;
int v;
if (br.getBit(p[2]) == 0) {
@@ -1324,10 +1390,9 @@
block.isIntra4x4 = br.getBit(145) == 0;
if (!block.isIntra4x4) {
// Hardcoded 16x16 intra-mode decision tree.
- final int ymode =
- br.getBit(156) != 0 ?
- (br.getBit(128) != 0 ? TM_PRED : H_PRED) :
- (br.getBit(163) != 0 ? V_PRED : DC_PRED);
+ final int ymode = br.getBit(156) != 0
+ ? (br.getBit(128) != 0 ? TM_PRED : H_PRED)
+ : (br.getBit(163) != 0 ? V_PRED : DC_PRED);
block.imodes[0] = ymode;
top.fillRange(ti, ti + 4, ymode);
@@ -1360,9 +1425,9 @@
}
// Hardcoded UVMode decision tree
- block.uvmode = br.getBit(142) == 0 ? DC_PRED
- : br.getBit(114) == 0 ? V_PRED
- : br.getBit(183) != 0 ? TM_PRED : H_PRED;
+ block.uvmode = br.getBit(142) == 0
+ ? DC_PRED
+ : br.getBit(114) == 0 ? V_PRED : br.getBit(183) != 0 ? TM_PRED : H_PRED;
}
// Main data source
@@ -1385,6 +1450,7 @@
/// Width in macroblock units.
int _mbWidth;
+
/// Height in macroblock units.
int _mbHeight;
@@ -1414,18 +1480,22 @@
// Boundary data cache and persistent buffers.
/// top intra modes values: 4 * _mbWidth
Uint8List _intraT;
+
/// left intra modes values
Uint8List _intraL = Uint8List(4);
/// uint8, segment of the currently parsed block
int _segment;
+
/// top y/u/v samples
List<VP8TopSamples> _yuvT;
/// contextual macroblock info (mb_w_ + 1)
List<VP8MB> _mbInfo;
+
/// filter strength info
List<VP8FInfo> _fInfo;
+
/// main block for Y/U/V (size = YUV_SIZE)
Uint8List _yuvBlock;
@@ -1452,19 +1522,23 @@
/// current position, in macroblock units
int _mbX = 0;
int _mbY = 0;
+
/// parsed reconstruction data
List<VP8MBData> _mbData;
/// 0=off, 1=simple, 2=complex
int _filterType;
+
/// precalculated per-segment/type
List<List<VP8FInfo>> _fStrengths;
// Alpha
/// alpha-plane decoder object
WebPAlpha _alpha;
+
/// compressed alpha data (if present)
InputBuffer _alphaData;
+
/// true if alpha_data_ is decoded in alpha_plane_
//int _isAlphaDecoded;
/// output. Persistent, contains the whole data.
@@ -1479,442 +1553,549 @@
return v < 0 ? 0 : v > M ? M : v;
}
- static const List<int> kYModesIntra4 = const [
- -B_DC_PRED, 1,
- -B_TM_PRED, 2,
- -B_VE_PRED, 3,
- 4, 6,
- -B_HE_PRED, 5,
- -B_RD_PRED, -B_VR_PRED,
- -B_LD_PRED, 7,
- -B_VL_PRED, 8,
- -B_HD_PRED, -B_HU_PRED ];
+ static const kYModesIntra4 = [
+ -B_DC_PRED,
+ 1,
+ -B_TM_PRED,
+ 2,
+ -B_VE_PRED,
+ 3,
+ 4,
+ 6,
+ -B_HE_PRED,
+ 5,
+ -B_RD_PRED,
+ -B_VR_PRED,
+ -B_LD_PRED,
+ 7,
+ -B_VL_PRED,
+ 8,
+ -B_HD_PRED,
+ -B_HU_PRED
+ ];
- static const List<List<List<int>>> kBModesProba = const [
- const [ const [ 231, 120, 48, 89, 115, 113, 120, 152, 112 ],
- const [ 152, 179, 64, 126, 170, 118, 46, 70, 95 ],
- const [ 175, 69, 143, 80, 85, 82, 72, 155, 103 ],
- const [ 56, 58, 10, 171, 218, 189, 17, 13, 152 ],
- const [ 114, 26, 17, 163, 44, 195, 21, 10, 173 ],
- const [ 121, 24, 80, 195, 26, 62, 44, 64, 85 ],
- const [ 144, 71, 10, 38, 171, 213, 144, 34, 26 ],
- const [ 170, 46, 55, 19, 136, 160, 33, 206, 71 ],
- const [ 63, 20, 8, 114, 114, 208, 12, 9, 226 ],
- const [ 81, 40, 11, 96, 182, 84, 29, 16, 36 ] ],
- const [ const [ 134, 183, 89, 137, 98, 101, 106, 165, 148 ],
- const [ 72, 187, 100, 130, 157, 111, 32, 75, 80 ],
- const [ 66, 102, 167, 99, 74, 62, 40, 234, 128 ],
- const [ 41, 53, 9, 178, 241, 141, 26, 8, 107 ],
- const [ 74, 43, 26, 146, 73, 166, 49, 23, 157 ],
- const [ 65, 38, 105, 160, 51, 52, 31, 115, 128 ],
- const [ 104, 79, 12, 27, 217, 255, 87, 17, 7 ],
- const [ 87, 68, 71, 44, 114, 51, 15, 186, 23 ],
- const [ 47, 41, 14, 110, 182, 183, 21, 17, 194 ],
- const [ 66, 45, 25, 102, 197, 189, 23, 18, 22 ] ],
- const [ const [ 88, 88, 147, 150, 42, 46, 45, 196, 205 ],
- const [ 43, 97, 183, 117, 85, 38, 35, 179, 61 ],
- const [ 39, 53, 200, 87, 26, 21, 43, 232, 171 ],
- const [ 56, 34, 51, 104, 114, 102, 29, 93, 77 ],
- const [ 39, 28, 85, 171, 58, 165, 90, 98, 64 ],
- const [ 34, 22, 116, 206, 23, 34, 43, 166, 73 ],
- const [ 107, 54, 32, 26, 51, 1, 81, 43, 31 ],
- const [ 68, 25, 106, 22, 64, 171, 36, 225, 114 ],
- const [ 34, 19, 21, 102, 132, 188, 16, 76, 124 ],
- const [ 62, 18, 78, 95, 85, 57, 50, 48, 51 ] ],
- const [ const [ 193, 101, 35, 159, 215, 111, 89, 46, 111 ],
- const [ 60, 148, 31, 172, 219, 228, 21, 18, 111 ],
- const [ 112, 113, 77, 85, 179, 255, 38, 120, 114 ],
- const [ 40, 42, 1, 196, 245, 209, 10, 25, 109 ],
- const [ 88, 43, 29, 140, 166, 213, 37, 43, 154 ],
- const [ 61, 63, 30, 155, 67, 45, 68, 1, 209 ],
- const [ 100, 80, 8, 43, 154, 1, 51, 26, 71 ],
- const [ 142, 78, 78, 16, 255, 128, 34, 197, 171 ],
- const [ 41, 40, 5, 102, 211, 183, 4, 1, 221 ],
- const [ 51, 50, 17, 168, 209, 192, 23, 25, 82 ] ],
- const [ const [ 138, 31, 36, 171, 27, 166, 38, 44, 229 ],
- const [ 67, 87, 58, 169, 82, 115, 26, 59, 179 ],
- const [ 63, 59, 90, 180, 59, 166, 93, 73, 154 ],
- const [ 40, 40, 21, 116, 143, 209, 34, 39, 175 ],
- const [ 47, 15, 16, 183, 34, 223, 49, 45, 183 ],
- const [ 46, 17, 33, 183, 6, 98, 15, 32, 183 ],
- const [ 57, 46, 22, 24, 128, 1, 54, 17, 37 ],
- const [ 65, 32, 73, 115, 28, 128, 23, 128, 205 ],
- const [ 40, 3, 9, 115, 51, 192, 18, 6, 223 ],
- const [ 87, 37, 9, 115, 59, 77, 64, 21, 47 ] ],
- const [ const [ 104, 55, 44, 218, 9, 54, 53, 130, 226 ],
- const [ 64, 90, 70, 205, 40, 41, 23, 26, 57 ],
- const [ 54, 57, 112, 184, 5, 41, 38, 166, 213 ],
- const [ 30, 34, 26, 133, 152, 116, 10, 32, 134 ],
- const [ 39, 19, 53, 221, 26, 114, 32, 73, 255 ],
- const [ 31, 9, 65, 234, 2, 15, 1, 118, 73 ],
- const [ 75, 32, 12, 51, 192, 255, 160, 43, 51 ],
- const [ 88, 31, 35, 67, 102, 85, 55, 186, 85 ],
- const [ 56, 21, 23, 111, 59, 205, 45, 37, 192 ],
- const [ 55, 38, 70, 124, 73, 102, 1, 34, 98 ] ],
- const [ const [ 125, 98, 42, 88, 104, 85, 117, 175, 82 ],
- const [ 95, 84, 53, 89, 128, 100, 113, 101, 45 ],
- const [ 75, 79, 123, 47, 51, 128, 81, 171, 1 ],
- const [ 57, 17, 5, 71, 102, 57, 53, 41, 49 ],
- const [ 38, 33, 13, 121, 57, 73, 26, 1, 85 ],
- const [ 41, 10, 67, 138, 77, 110, 90, 47, 114 ],
- const [ 115, 21, 2, 10, 102, 255, 166, 23, 6 ],
- const [ 101, 29, 16, 10, 85, 128, 101, 196, 26 ],
- const [ 57, 18, 10, 102, 102, 213, 34, 20, 43 ],
- const [ 117, 20, 15, 36, 163, 128, 68, 1, 26 ] ],
- const [ const [ 102, 61, 71, 37, 34, 53, 31, 243, 192 ],
- const [ 69, 60, 71, 38, 73, 119, 28, 222, 37 ],
- const [ 68, 45, 128, 34, 1, 47, 11, 245, 171 ],
- const [ 62, 17, 19, 70, 146, 85, 55, 62, 70 ],
- const [ 37, 43, 37, 154, 100, 163, 85, 160, 1 ],
- const [ 63, 9, 92, 136, 28, 64, 32, 201, 85 ],
- const [ 75, 15, 9, 9, 64, 255, 184, 119, 16 ],
- const [ 86, 6, 28, 5, 64, 255, 25, 248, 1 ],
- const [ 56, 8, 17, 132, 137, 255, 55, 116, 128 ],
- const [ 58, 15, 20, 82, 135, 57, 26, 121, 40 ] ],
- const [ const [ 164, 50, 31, 137, 154, 133, 25, 35, 218 ],
- const [ 51, 103, 44, 131, 131, 123, 31, 6, 158 ],
- const [ 86, 40, 64, 135, 148, 224, 45, 183, 128 ],
- const [ 22, 26, 17, 131, 240, 154, 14, 1, 209 ],
- const [ 45, 16, 21, 91, 64, 222, 7, 1, 197 ],
- const [ 56, 21, 39, 155, 60, 138, 23, 102, 213 ],
- const [ 83, 12, 13, 54, 192, 255, 68, 47, 28 ],
- const [ 85, 26, 85, 85, 128, 128, 32, 146, 171 ],
- const [ 18, 11, 7, 63, 144, 171, 4, 4, 246 ],
- const [ 35, 27, 10, 146, 174, 171, 12, 26, 128 ] ],
- const [ const [ 190, 80, 35, 99, 180, 80, 126, 54, 45 ],
- const [ 85, 126, 47, 87, 176, 51, 41, 20, 32 ],
- const [ 101, 75, 128, 139, 118, 146, 116, 128, 85 ],
- const [ 56, 41, 15, 176, 236, 85, 37, 9, 62 ],
- const [ 71, 30, 17, 119, 118, 255, 17, 18, 138 ],
- const [ 101, 38, 60, 138, 55, 70, 43, 26, 142 ],
- const [ 146, 36, 19, 30, 171, 255, 97, 27, 20 ],
- const [ 138, 45, 61, 62, 219, 1, 81, 188, 64 ],
- const [ 32, 41, 20, 117, 151, 142, 20, 21, 163 ],
- const [ 112, 19, 12, 61, 195, 128, 48, 4, 24 ] ] ];
+ static const kBModesProba = [
+ [
+ [231, 120, 48, 89, 115, 113, 120, 152, 112],
+ [152, 179, 64, 126, 170, 118, 46, 70, 95],
+ [175, 69, 143, 80, 85, 82, 72, 155, 103],
+ [56, 58, 10, 171, 218, 189, 17, 13, 152],
+ [114, 26, 17, 163, 44, 195, 21, 10, 173],
+ [121, 24, 80, 195, 26, 62, 44, 64, 85],
+ [144, 71, 10, 38, 171, 213, 144, 34, 26],
+ [170, 46, 55, 19, 136, 160, 33, 206, 71],
+ [63, 20, 8, 114, 114, 208, 12, 9, 226],
+ [81, 40, 11, 96, 182, 84, 29, 16, 36]
+ ],
+ [
+ [134, 183, 89, 137, 98, 101, 106, 165, 148],
+ [72, 187, 100, 130, 157, 111, 32, 75, 80],
+ [66, 102, 167, 99, 74, 62, 40, 234, 128],
+ [41, 53, 9, 178, 241, 141, 26, 8, 107],
+ [74, 43, 26, 146, 73, 166, 49, 23, 157],
+ [65, 38, 105, 160, 51, 52, 31, 115, 128],
+ [104, 79, 12, 27, 217, 255, 87, 17, 7],
+ [87, 68, 71, 44, 114, 51, 15, 186, 23],
+ [47, 41, 14, 110, 182, 183, 21, 17, 194],
+ [66, 45, 25, 102, 197, 189, 23, 18, 22]
+ ],
+ [
+ [88, 88, 147, 150, 42, 46, 45, 196, 205],
+ [43, 97, 183, 117, 85, 38, 35, 179, 61],
+ [39, 53, 200, 87, 26, 21, 43, 232, 171],
+ [56, 34, 51, 104, 114, 102, 29, 93, 77],
+ [39, 28, 85, 171, 58, 165, 90, 98, 64],
+ [34, 22, 116, 206, 23, 34, 43, 166, 73],
+ [107, 54, 32, 26, 51, 1, 81, 43, 31],
+ [68, 25, 106, 22, 64, 171, 36, 225, 114],
+ [34, 19, 21, 102, 132, 188, 16, 76, 124],
+ [62, 18, 78, 95, 85, 57, 50, 48, 51]
+ ],
+ [
+ [193, 101, 35, 159, 215, 111, 89, 46, 111],
+ [60, 148, 31, 172, 219, 228, 21, 18, 111],
+ [112, 113, 77, 85, 179, 255, 38, 120, 114],
+ [40, 42, 1, 196, 245, 209, 10, 25, 109],
+ [88, 43, 29, 140, 166, 213, 37, 43, 154],
+ [61, 63, 30, 155, 67, 45, 68, 1, 209],
+ [100, 80, 8, 43, 154, 1, 51, 26, 71],
+ [142, 78, 78, 16, 255, 128, 34, 197, 171],
+ [41, 40, 5, 102, 211, 183, 4, 1, 221],
+ [51, 50, 17, 168, 209, 192, 23, 25, 82]
+ ],
+ [
+ [138, 31, 36, 171, 27, 166, 38, 44, 229],
+ [67, 87, 58, 169, 82, 115, 26, 59, 179],
+ [63, 59, 90, 180, 59, 166, 93, 73, 154],
+ [40, 40, 21, 116, 143, 209, 34, 39, 175],
+ [47, 15, 16, 183, 34, 223, 49, 45, 183],
+ [46, 17, 33, 183, 6, 98, 15, 32, 183],
+ [57, 46, 22, 24, 128, 1, 54, 17, 37],
+ [65, 32, 73, 115, 28, 128, 23, 128, 205],
+ [40, 3, 9, 115, 51, 192, 18, 6, 223],
+ [87, 37, 9, 115, 59, 77, 64, 21, 47]
+ ],
+ [
+ [104, 55, 44, 218, 9, 54, 53, 130, 226],
+ [64, 90, 70, 205, 40, 41, 23, 26, 57],
+ [54, 57, 112, 184, 5, 41, 38, 166, 213],
+ [30, 34, 26, 133, 152, 116, 10, 32, 134],
+ [39, 19, 53, 221, 26, 114, 32, 73, 255],
+ [31, 9, 65, 234, 2, 15, 1, 118, 73],
+ [75, 32, 12, 51, 192, 255, 160, 43, 51],
+ [88, 31, 35, 67, 102, 85, 55, 186, 85],
+ [56, 21, 23, 111, 59, 205, 45, 37, 192],
+ [55, 38, 70, 124, 73, 102, 1, 34, 98]
+ ],
+ [
+ [125, 98, 42, 88, 104, 85, 117, 175, 82],
+ [95, 84, 53, 89, 128, 100, 113, 101, 45],
+ [75, 79, 123, 47, 51, 128, 81, 171, 1],
+ [57, 17, 5, 71, 102, 57, 53, 41, 49],
+ [38, 33, 13, 121, 57, 73, 26, 1, 85],
+ [41, 10, 67, 138, 77, 110, 90, 47, 114],
+ [115, 21, 2, 10, 102, 255, 166, 23, 6],
+ [101, 29, 16, 10, 85, 128, 101, 196, 26],
+ [57, 18, 10, 102, 102, 213, 34, 20, 43],
+ [117, 20, 15, 36, 163, 128, 68, 1, 26]
+ ],
+ [
+ [102, 61, 71, 37, 34, 53, 31, 243, 192],
+ [69, 60, 71, 38, 73, 119, 28, 222, 37],
+ [68, 45, 128, 34, 1, 47, 11, 245, 171],
+ [62, 17, 19, 70, 146, 85, 55, 62, 70],
+ [37, 43, 37, 154, 100, 163, 85, 160, 1],
+ [63, 9, 92, 136, 28, 64, 32, 201, 85],
+ [75, 15, 9, 9, 64, 255, 184, 119, 16],
+ [86, 6, 28, 5, 64, 255, 25, 248, 1],
+ [56, 8, 17, 132, 137, 255, 55, 116, 128],
+ [58, 15, 20, 82, 135, 57, 26, 121, 40]
+ ],
+ [
+ [164, 50, 31, 137, 154, 133, 25, 35, 218],
+ [51, 103, 44, 131, 131, 123, 31, 6, 158],
+ [86, 40, 64, 135, 148, 224, 45, 183, 128],
+ [22, 26, 17, 131, 240, 154, 14, 1, 209],
+ [45, 16, 21, 91, 64, 222, 7, 1, 197],
+ [56, 21, 39, 155, 60, 138, 23, 102, 213],
+ [83, 12, 13, 54, 192, 255, 68, 47, 28],
+ [85, 26, 85, 85, 128, 128, 32, 146, 171],
+ [18, 11, 7, 63, 144, 171, 4, 4, 246],
+ [35, 27, 10, 146, 174, 171, 12, 26, 128]
+ ],
+ [
+ [190, 80, 35, 99, 180, 80, 126, 54, 45],
+ [85, 126, 47, 87, 176, 51, 41, 20, 32],
+ [101, 75, 128, 139, 118, 146, 116, 128, 85],
+ [56, 41, 15, 176, 236, 85, 37, 9, 62],
+ [71, 30, 17, 119, 118, 255, 17, 18, 138],
+ [101, 38, 60, 138, 55, 70, 43, 26, 142],
+ [146, 36, 19, 30, 171, 255, 97, 27, 20],
+ [138, 45, 61, 62, 219, 1, 81, 188, 64],
+ [32, 41, 20, 117, 151, 142, 20, 21, 163],
+ [112, 19, 12, 61, 195, 128, 48, 4, 24]
+ ]
+ ];
- static const List COEFFS_PROBA_0 = const [
- const [ const [ const [ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 ],
- const [ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 ],
- const [ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 ]
+ static const COEFFS_PROBA_0 = [
+ [
+ [
+ [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],
+ [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],
+ [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128]
+ ],
+ [
+ [253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128],
+ [189, 129, 242, 255, 227, 213, 255, 219, 128, 128, 128],
+ [106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128]
+ ],
+ [
+ [1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128],
+ [181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128],
+ [78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128],
+ ],
+ [
+ [1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128],
+ [184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128],
+ [77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128],
+ ],
+ [
+ [1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128],
+ [170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128],
+ [37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128]
+ ],
+ [
+ [1, 204, 254, 255, 245, 255, 128, 128, 128, 128, 128],
+ [207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128],
+ [102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128]
+ ],
+ [
+ [1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128],
+ [177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128],
+ [80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128]
+ ],
+ [
+ [1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],
+ [246, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],
+ [255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128]
+ ]
],
- const [ const [ 253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128 ],
- const [ 189, 129, 242, 255, 227, 213, 255, 219, 128, 128, 128 ],
- const [ 106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128 ]
+ [
+ [
+ [198, 35, 237, 223, 193, 187, 162, 160, 145, 155, 62],
+ [131, 45, 198, 221, 172, 176, 220, 157, 252, 221, 1],
+ [68, 47, 146, 208, 149, 167, 221, 162, 255, 223, 128]
+ ],
+ [
+ [1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128],
+ [184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128],
+ [81, 99, 181, 242, 176, 190, 249, 202, 255, 255, 128]
+ ],
+ [
+ [1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128],
+ [99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128],
+ [23, 91, 163, 242, 170, 187, 247, 210, 255, 255, 128]
+ ],
+ [
+ [1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128],
+ [109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128],
+ [44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128]
+ ],
+ [
+ [1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128],
+ [94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128],
+ [22, 100, 174, 245, 186, 161, 255, 199, 128, 128, 128]
+ ],
+ [
+ [1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128],
+ [124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128],
+ [35, 77, 181, 251, 193, 211, 255, 205, 128, 128, 128]
+ ],
+ [
+ [1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128],
+ [121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128],
+ [45, 99, 188, 251, 195, 217, 255, 224, 128, 128, 128]
+ ],
+ [
+ [1, 1, 251, 255, 213, 255, 128, 128, 128, 128, 128],
+ [203, 1, 248, 255, 255, 128, 128, 128, 128, 128, 128],
+ [137, 1, 177, 255, 224, 255, 128, 128, 128, 128, 128]
+ ]
],
- const [ const [ 1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128 ],
- const [ 181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128 ],
- const [ 78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128 ],
+ [
+ [
+ [253, 9, 248, 251, 207, 208, 255, 192, 128, 128, 128],
+ [175, 13, 224, 243, 193, 185, 249, 198, 255, 255, 128],
+ [73, 17, 171, 221, 161, 179, 236, 167, 255, 234, 128]
+ ],
+ [
+ [1, 95, 247, 253, 212, 183, 255, 255, 128, 128, 128],
+ [239, 90, 244, 250, 211, 209, 255, 255, 128, 128, 128],
+ [155, 77, 195, 248, 188, 195, 255, 255, 128, 128, 128]
+ ],
+ [
+ [1, 24, 239, 251, 218, 219, 255, 205, 128, 128, 128],
+ [201, 51, 219, 255, 196, 186, 128, 128, 128, 128, 128],
+ [69, 46, 190, 239, 201, 218, 255, 228, 128, 128, 128]
+ ],
+ [
+ [1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128],
+ [223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128],
+ [141, 124, 248, 255, 255, 128, 128, 128, 128, 128, 128]
+ ],
+ [
+ [1, 16, 248, 255, 255, 128, 128, 128, 128, 128, 128],
+ [190, 36, 230, 255, 236, 255, 128, 128, 128, 128, 128],
+ [149, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128]
+ ],
+ [
+ [1, 226, 255, 128, 128, 128, 128, 128, 128, 128, 128],
+ [247, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128],
+ [240, 128, 255, 128, 128, 128, 128, 128, 128, 128, 128]
+ ],
+ [
+ [1, 134, 252, 255, 255, 128, 128, 128, 128, 128, 128],
+ [213, 62, 250, 255, 255, 128, 128, 128, 128, 128, 128],
+ [55, 93, 255, 128, 128, 128, 128, 128, 128, 128, 128]
+ ],
+ [
+ [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],
+ [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],
+ [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128]
+ ]
],
- const [ const [ 1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128 ],
- const [ 184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128 ],
- const [ 77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128 ],
- ],
- const [ const [ 1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128 ],
- const [ 170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128 ],
- const [ 37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128 ]
- ],
- const [ const [ 1, 204, 254, 255, 245, 255, 128, 128, 128, 128, 128 ],
- const [ 207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128 ],
- const [ 102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128 ]
- ],
- const [ const [ 1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128 ],
- const [ 177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128 ],
- const [ 80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128 ]
- ],
- const [ const [ 1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128 ],
- const [ 246, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128 ],
- const [ 255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 ]
+ [
+ [
+ [202, 24, 213, 235, 186, 191, 220, 160, 240, 175, 255],
+ [126, 38, 182, 232, 169, 184, 228, 174, 255, 187, 128],
+ [61, 46, 138, 219, 151, 178, 240, 170, 255, 216, 128]
+ ],
+ [
+ [1, 112, 230, 250, 199, 191, 247, 159, 255, 255, 128],
+ [166, 109, 228, 252, 211, 215, 255, 174, 128, 128, 128],
+ [39, 77, 162, 232, 172, 180, 245, 178, 255, 255, 128]
+ ],
+ [
+ [1, 52, 220, 246, 198, 199, 249, 220, 255, 255, 128],
+ [124, 74, 191, 243, 183, 193, 250, 221, 255, 255, 128],
+ [24, 71, 130, 219, 154, 170, 243, 182, 255, 255, 128]
+ ],
+ [
+ [1, 182, 225, 249, 219, 240, 255, 224, 128, 128, 128],
+ [149, 150, 226, 252, 216, 205, 255, 171, 128, 128, 128],
+ [28, 108, 170, 242, 183, 194, 254, 223, 255, 255, 128]
+ ],
+ [
+ [1, 81, 230, 252, 204, 203, 255, 192, 128, 128, 128],
+ [123, 102, 209, 247, 188, 196, 255, 233, 128, 128, 128],
+ [20, 95, 153, 243, 164, 173, 255, 203, 128, 128, 128]
+ ],
+ [
+ [1, 222, 248, 255, 216, 213, 128, 128, 128, 128, 128],
+ [168, 175, 246, 252, 235, 205, 255, 255, 128, 128, 128],
+ [47, 116, 215, 255, 211, 212, 255, 255, 128, 128, 128]
+ ],
+ [
+ [1, 121, 236, 253, 212, 214, 255, 255, 128, 128, 128],
+ [141, 84, 213, 252, 201, 202, 255, 219, 128, 128, 128],
+ [42, 80, 160, 240, 162, 185, 255, 205, 128, 128, 128]
+ ],
+ [
+ [1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],
+ [244, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],
+ [238, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128]
+ ]
]
- ],
- const [ const [ const [ 198, 35, 237, 223, 193, 187, 162, 160, 145, 155, 62 ],
- const [ 131, 45, 198, 221, 172, 176, 220, 157, 252, 221, 1 ],
- const [ 68, 47, 146, 208, 149, 167, 221, 162, 255, 223, 128 ]
- ],
- const [ const [ 1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128 ],
- const [ 184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128 ],
- const [ 81, 99, 181, 242, 176, 190, 249, 202, 255, 255, 128 ]
- ],
- const [ const [ 1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128 ],
- const [ 99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128 ],
- const [ 23, 91, 163, 242, 170, 187, 247, 210, 255, 255, 128 ]
- ],
- const [ const [ 1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128 ],
- const [ 109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128 ],
- const [ 44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128 ]
- ],
- const [ const [ 1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128 ],
- const [ 94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128 ],
- const [ 22, 100, 174, 245, 186, 161, 255, 199, 128, 128, 128 ]
- ],
- const [ const [ 1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128 ],
- const [ 124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128 ],
- const [ 35, 77, 181, 251, 193, 211, 255, 205, 128, 128, 128 ]
- ],
- const [ const [ 1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128 ],
- const [ 121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128 ],
- const [ 45, 99, 188, 251, 195, 217, 255, 224, 128, 128, 128 ]
- ],
- const [ const [ 1, 1, 251, 255, 213, 255, 128, 128, 128, 128, 128 ],
- const [ 203, 1, 248, 255, 255, 128, 128, 128, 128, 128, 128 ],
- const [ 137, 1, 177, 255, 224, 255, 128, 128, 128, 128, 128 ]
- ]
- ],
- const [ const [ const [ 253, 9, 248, 251, 207, 208, 255, 192, 128, 128, 128 ],
- const [ 175, 13, 224, 243, 193, 185, 249, 198, 255, 255, 128 ],
- const [ 73, 17, 171, 221, 161, 179, 236, 167, 255, 234, 128 ]
- ],
- const [ const [ 1, 95, 247, 253, 212, 183, 255, 255, 128, 128, 128 ],
- const [ 239, 90, 244, 250, 211, 209, 255, 255, 128, 128, 128 ],
- const [ 155, 77, 195, 248, 188, 195, 255, 255, 128, 128, 128 ]
- ],
- const [ const [ 1, 24, 239, 251, 218, 219, 255, 205, 128, 128, 128 ],
- const [ 201, 51, 219, 255, 196, 186, 128, 128, 128, 128, 128 ],
- const [ 69, 46, 190, 239, 201, 218, 255, 228, 128, 128, 128 ]
- ],
- const [ const [ 1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128 ],
- const [ 223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128 ],
- const [ 141, 124, 248, 255, 255, 128, 128, 128, 128, 128, 128 ]
- ],
- const [ const [ 1, 16, 248, 255, 255, 128, 128, 128, 128, 128, 128 ],
- const [ 190, 36, 230, 255, 236, 255, 128, 128, 128, 128, 128 ],
- const [ 149, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128 ]
- ],
- const [ const [ 1, 226, 255, 128, 128, 128, 128, 128, 128, 128, 128 ],
- const [ 247, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128 ],
- const [ 240, 128, 255, 128, 128, 128, 128, 128, 128, 128, 128 ]
- ],
- const [ const [ 1, 134, 252, 255, 255, 128, 128, 128, 128, 128, 128 ],
- const [ 213, 62, 250, 255, 255, 128, 128, 128, 128, 128, 128 ],
- const [ 55, 93, 255, 128, 128, 128, 128, 128, 128, 128, 128 ]
- ],
- const [ const [ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 ],
- const [ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 ],
- const [ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 ]
- ]
- ],
- const [ const [ const [ 202, 24, 213, 235, 186, 191, 220, 160, 240, 175, 255 ],
- const [ 126, 38, 182, 232, 169, 184, 228, 174, 255, 187, 128 ],
- const [ 61, 46, 138, 219, 151, 178, 240, 170, 255, 216, 128 ]
- ],
- const [ const [ 1, 112, 230, 250, 199, 191, 247, 159, 255, 255, 128 ],
- const [ 166, 109, 228, 252, 211, 215, 255, 174, 128, 128, 128 ],
- const [ 39, 77, 162, 232, 172, 180, 245, 178, 255, 255, 128 ]
- ],
- const [ const [ 1, 52, 220, 246, 198, 199, 249, 220, 255, 255, 128 ],
- const [ 124, 74, 191, 243, 183, 193, 250, 221, 255, 255, 128 ],
- const [ 24, 71, 130, 219, 154, 170, 243, 182, 255, 255, 128 ]
- ],
- const [ const [ 1, 182, 225, 249, 219, 240, 255, 224, 128, 128, 128 ],
- const [ 149, 150, 226, 252, 216, 205, 255, 171, 128, 128, 128 ],
- const [ 28, 108, 170, 242, 183, 194, 254, 223, 255, 255, 128 ]
- ],
- const [ const [ 1, 81, 230, 252, 204, 203, 255, 192, 128, 128, 128 ],
- const [ 123, 102, 209, 247, 188, 196, 255, 233, 128, 128, 128 ],
- const [ 20, 95, 153, 243, 164, 173, 255, 203, 128, 128, 128 ]
- ],
- const [ const [ 1, 222, 248, 255, 216, 213, 128, 128, 128, 128, 128 ],
- const [ 168, 175, 246, 252, 235, 205, 255, 255, 128, 128, 128 ],
- const [ 47, 116, 215, 255, 211, 212, 255, 255, 128, 128, 128 ]
- ],
- const [ const [ 1, 121, 236, 253, 212, 214, 255, 255, 128, 128, 128 ],
- const [ 141, 84, 213, 252, 201, 202, 255, 219, 128, 128, 128 ],
- const [ 42, 80, 160, 240, 162, 185, 255, 205, 128, 128, 128 ]
- ],
- const [ const [ 1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128 ],
- const [ 244, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128 ],
- const [ 238, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128 ]
- ]
- ] ];
+ ];
-
- static const List COEFFS_UPDATE_PROBA = const [
- const [ const [ const [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ]
+ static const COEFFS_UPDATE_PROBA = [
+ [
+ [
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
+ ],
+ [
+ [176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255],
+ [223, 241, 252, 255, 255, 255, 255, 255, 255, 255, 255],
+ [249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255]
+ ],
+ [
+ [255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255],
+ [234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],
+ [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
+ ],
+ [
+ [255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255],
+ [239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],
+ [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255]
+ ],
+ [
+ [255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],
+ [251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
+ ],
+ [
+ [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],
+ [251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],
+ [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255]
+ ],
+ [
+ [255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255],
+ [250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255],
+ [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
+ ],
+ [
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
+ ]
],
- const [ const [ 176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 223, 241, 252, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255 ]
+ [
+ [
+ [217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
+ [225, 252, 241, 253, 255, 255, 254, 255, 255, 255, 255],
+ [234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255]
+ ],
+ [
+ [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],
+ [223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],
+ [238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255]
+ ],
+ [
+ [255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],
+ [249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
+ ],
+ [
+ [255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255],
+ [247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
+ ],
+ [
+ [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],
+ [252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
+ ],
+ [
+ [255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],
+ [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
+ ],
+ [
+ [255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255],
+ [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
+ [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
+ ],
+ [
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
+ ]
],
- const [ const [ 255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ]
+ [
+ [
+ [186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255],
+ [234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255],
+ [251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255]
+ ],
+ [
+ [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],
+ [236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],
+ [251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255]
+ ],
+ [
+ [255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],
+ [254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
+ ],
+ [
+ [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],
+ [254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],
+ [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
+ ],
+ [
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
+ [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
+ ],
+ [
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
+ ],
+ [
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
+ ],
+ [
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
+ ]
],
- const [ const [ 255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255 ]
- ],
- const [ const [ 255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ]
- ],
- const [ const [ 255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255 ]
- ],
- const [ const [ 255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255 ],
- const [ 250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255 ],
- const [ 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ]
- ],
- const [ const [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ]
+ [
+ [
+ [248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
+ [250, 254, 252, 254, 255, 255, 255, 255, 255, 255, 255],
+ [248, 254, 249, 253, 255, 255, 255, 255, 255, 255, 255]
+ ],
+ [
+ [255, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],
+ [246, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],
+ [252, 254, 251, 254, 254, 255, 255, 255, 255, 255, 255]
+ ],
+ [
+ [255, 254, 252, 255, 255, 255, 255, 255, 255, 255, 255],
+ [248, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255],
+ [253, 255, 254, 254, 255, 255, 255, 255, 255, 255, 255]
+ ],
+ [
+ [255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],
+ [245, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],
+ [253, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255]
+ ],
+ [
+ [255, 251, 253, 255, 255, 255, 255, 255, 255, 255, 255],
+ [252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],
+ [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255]
+ ],
+ [
+ [255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255],
+ [249, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],
+ [255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255]
+ ],
+ [
+ [255, 255, 253, 255, 255, 255, 255, 255, 255, 255, 255],
+ [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
+ ],
+ [
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
+ [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
+ [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
+ ]
]
- ],
- const [ const [ const [ 217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 225, 252, 241, 253, 255, 255, 254, 255, 255, 255, 255 ],
- const [ 234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255 ]
- ],
- const [ const [ 255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255 ]
- ],
- const [ const [ 255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ]
- ],
- const [ const [ 255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ]
- ],
- const [ const [ 255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ]
- ],
- const [ const [ 255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ]
- ],
- const [ const [ 255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ]
- ],
- const [ const [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ]
- ]
- ],
- const [ const [ const [ 186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255 ]
- ],
- const [ const [ 255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255 ]
- ],
- const [ const [ 255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ]
- ],
- const [ const [ 255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ]
- ],
- const [ const [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ]
- ],
- const [ const [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ]
- ],
- const [ const [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ]
- ],
- const [ const [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ]
- ]
- ],
- const [ const [ const [ 248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 250, 254, 252, 254, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 248, 254, 249, 253, 255, 255, 255, 255, 255, 255, 255 ]
- ],
- const [ const [ 255, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 246, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 252, 254, 251, 254, 254, 255, 255, 255, 255, 255, 255 ]
- ],
- const [ const [ 255, 254, 252, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 248, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 253, 255, 254, 254, 255, 255, 255, 255, 255, 255, 255 ]
- ],
- const [ const [ 255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 245, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 253, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 ]
- ],
- const [ const [ 255, 251, 253, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 ]
- ],
- const [ const [ 255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 249, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255 ]
- ],
- const [ const [ 255, 255, 253, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ]
- ],
- const [ const [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ],
- const [ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ]
- ] ] ];
+ ];
// Paragraph 14.1
- static const List<int> DC_TABLE = const [ // uint8
- 4, 5, 6, 7, 8, 9, 10, 10,
- 11, 12, 13, 14, 15, 16, 17, 17,
- 18, 19, 20, 20, 21, 21, 22, 22,
- 23, 23, 24, 25, 25, 26, 27, 28,
- 29, 30, 31, 32, 33, 34, 35, 36,
- 37, 37, 38, 39, 40, 41, 42, 43,
- 44, 45, 46, 46, 47, 48, 49, 50,
- 51, 52, 53, 54, 55, 56, 57, 58,
- 59, 60, 61, 62, 63, 64, 65, 66,
- 67, 68, 69, 70, 71, 72, 73, 74,
- 75, 76, 76, 77, 78, 79, 80, 81,
- 82, 83, 84, 85, 86, 87, 88, 89,
- 91, 93, 95, 96, 98, 100, 101, 102,
- 104, 106, 108, 110, 112, 114, 116, 118,
- 122, 124, 126, 128, 130, 132, 134, 136,
- 138, 140, 143, 145, 148, 151, 154, 157];
+ static const DC_TABLE = [
+ // uint8
+ 4, 5, 6, 7, 8, 9, 10, 10,
+ 11, 12, 13, 14, 15, 16, 17, 17,
+ 18, 19, 20, 20, 21, 21, 22, 22,
+ 23, 23, 24, 25, 25, 26, 27, 28,
+ 29, 30, 31, 32, 33, 34, 35, 36,
+ 37, 37, 38, 39, 40, 41, 42, 43,
+ 44, 45, 46, 46, 47, 48, 49, 50,
+ 51, 52, 53, 54, 55, 56, 57, 58,
+ 59, 60, 61, 62, 63, 64, 65, 66,
+ 67, 68, 69, 70, 71, 72, 73, 74,
+ 75, 76, 76, 77, 78, 79, 80, 81,
+ 82, 83, 84, 85, 86, 87, 88, 89,
+ 91, 93, 95, 96, 98, 100, 101, 102,
+ 104, 106, 108, 110, 112, 114, 116, 118,
+ 122, 124, 126, 128, 130, 132, 134, 136,
+ 138, 140, 143, 145, 148, 151, 154, 157
+ ];
- static const List<int> AC_TABLE = const [ // uint16
- 4, 5, 6, 7, 8, 9, 10, 11,
- 12, 13, 14, 15, 16, 17, 18, 19,
- 20, 21, 22, 23, 24, 25, 26, 27,
- 28, 29, 30, 31, 32, 33, 34, 35,
- 36, 37, 38, 39, 40, 41, 42, 43,
- 44, 45, 46, 47, 48, 49, 50, 51,
- 52, 53, 54, 55, 56, 57, 58, 60,
- 62, 64, 66, 68, 70, 72, 74, 76,
- 78, 80, 82, 84, 86, 88, 90, 92,
- 94, 96, 98, 100, 102, 104, 106, 108,
- 110, 112, 114, 116, 119, 122, 125, 128,
- 131, 134, 137, 140, 143, 146, 149, 152,
- 155, 158, 161, 164, 167, 170, 173, 177,
- 181, 185, 189, 193, 197, 201, 205, 209,
- 213, 217, 221, 225, 229, 234, 239, 245,
- 249, 254, 259, 264, 269, 274, 279, 284];
+ static const AC_TABLE = [
+ // uint16
+ 4, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 14, 15, 16, 17, 18, 19,
+ 20, 21, 22, 23, 24, 25, 26, 27,
+ 28, 29, 30, 31, 32, 33, 34, 35,
+ 36, 37, 38, 39, 40, 41, 42, 43,
+ 44, 45, 46, 47, 48, 49, 50, 51,
+ 52, 53, 54, 55, 56, 57, 58, 60,
+ 62, 64, 66, 68, 70, 72, 74, 76,
+ 78, 80, 82, 84, 86, 88, 90, 92,
+ 94, 96, 98, 100, 102, 104, 106, 108,
+ 110, 112, 114, 116, 119, 122, 125, 128,
+ 131, 134, 137, 140, 143, 146, 149, 152,
+ 155, 158, 161, 164, 167, 170, 173, 177,
+ 181, 185, 189, 193, 197, 201, 205, 209,
+ 213, 217, 221, 225, 229, 234, 239, 245,
+ 249, 254, 259, 264, 269, 274, 279, 284
+ ];
- /**
- * FILTER_EXTRA_ROWS = How many extra lines are needed on the MB boundary
- * for caching, given a filtering level.
- * Simple filter: up to 2 luma samples are read and 1 is written.
- * Complex filter: up to 4 luma samples are read and 3 are written. Same for
- * U/V, so it's 8 samples total (because of the 2x upsampling).
- */
- static const List<int> FILTER_EXTRA_ROWS = const [ 0, 2, 8 ];
+ /// FILTER_EXTRA_ROWS = How many extra lines are needed on the MB boundary
+ /// for caching, given a filtering level.
+ /// Simple filter: up to 2 luma samples are read and 1 is written.
+ /// Complex filter: up to 4 luma samples are read and 3 are written. Same for
+ /// U/V, so it's 8 samples total (because of the 2x upsampling).
+ static const FILTER_EXTRA_ROWS = [0, 2, 8];
static const int VP8_SIGNATURE = 0x2a019d;
static const int MB_FEATURE_TREE_PROBS = 3;
static const int NUM_MB_SEGMENTS = 4;
static const int NUM_REF_LF_DELTAS = 4;
- static const int NUM_MODE_LF_DELTAS = 4; // I4x4, ZERO, *, SPLIT
+ static const int NUM_MODE_LF_DELTAS = 4; // I4x4, ZERO, *, SPLIT
static const int MAX_NUM_PARTITIONS = 8;
- static const int B_DC_PRED = 0; // 4x4 modes
+ static const int B_DC_PRED = 0; // 4x4 modes
static const int B_TM_PRED = 1;
static const int B_VE_PRED = 2;
static const int B_HE_PRED = 3;
@@ -1963,12 +2144,13 @@
static const int XOR_YUV_MASK2 = (-YUV_MASK2 - 1);
// These constants are 14b fixed-point version of ITU-R BT.601 constants.
- static const int kYScale = 19077; // 1.164 = 255 / 219
- static const int kVToR = 26149; // 1.596 = 255 / 112 * 0.701
- static const int kUToG = 6419; // 0.391 = 255 / 112 * 0.886 * 0.114 / 0.587
- static const int kVToG = 13320; // 0.813 = 255 / 112 * 0.701 * 0.299 / 0.587
- static const int kUToB = 33050; // 2.018 = 255 / 112 * 0.886
+ static const int kYScale = 19077; // 1.164 = 255 / 219
+ static const int kVToR = 26149; // 1.596 = 255 / 112 * 0.701
+ static const int kUToG = 6419; // 0.391 = 255 / 112 * 0.886 * 0.114 / 0.587
+ static const int kVToG = 13320; // 0.813 = 255 / 112 * 0.701 * 0.299 / 0.587
+ static const int kUToB = 33050; // 2.018 = 255 / 112 * 0.886
static const int kRCst = (-kYScale * 16 - kVToR * 128 + YUV_HALF2);
- static const int kGCst = (-kYScale * 16 + kUToG * 128 + kVToG * 128 + YUV_HALF2);
+ static const int kGCst =
+ (-kYScale * 16 + kUToG * 128 + kVToG * 128 + YUV_HALF2);
static const int kBCst = (-kYScale * 16 - kUToB * 128 + YUV_HALF2);
}
diff --git a/image/lib/src/formats/webp/vp8_bit_reader.dart b/image/lib/src/formats/webp/vp8_bit_reader.dart
index 70bc97b..e5e5f76 100755
--- a/image/lib/src/formats/webp/vp8_bit_reader.dart
+++ b/image/lib/src/formats/webp/vp8_bit_reader.dart
@@ -80,7 +80,7 @@
_value = bits | (_value << BITS);
_bits += (BITS);
} else {
- _loadFinalBytes(); // no need to be inlined
+ _loadFinalBytes(); // no need to be inlined
}
}
@@ -102,31 +102,264 @@
// Read a bit with proba 'prob'. Speed-critical function!
static const List<int> LOG_2_RANGE = const [
- 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 0];
+ 7,
+ 6,
+ 6,
+ 5,
+ 5,
+ 5,
+ 5,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 0
+ ];
static const List<int> NEW_RANGE = const [
- 127, 127, 191, 127, 159, 191, 223, 127,
- 143, 159, 175, 191, 207, 223, 239, 127,
- 135, 143, 151, 159, 167, 175, 183, 191,
- 199, 207, 215, 223, 231, 239, 247, 127,
- 131, 135, 139, 143, 147, 151, 155, 159,
- 163, 167, 171, 175, 179, 183, 187, 191,
- 195, 199, 203, 207, 211, 215, 219, 223,
- 227, 231, 235, 239, 243, 247, 251, 127,
- 129, 131, 133, 135, 137, 139, 141, 143,
- 145, 147, 149, 151, 153, 155, 157, 159,
- 161, 163, 165, 167, 169, 171, 173, 175,
- 177, 179, 181, 183, 185, 187, 189, 191,
- 193, 195, 197, 199, 201, 203, 205, 207,
- 209, 211, 213, 215, 217, 219, 221, 223,
- 225, 227, 229, 231, 233, 235, 237, 239,
- 241, 243, 245, 247, 249, 251, 253, 127];
+ 127,
+ 127,
+ 191,
+ 127,
+ 159,
+ 191,
+ 223,
+ 127,
+ 143,
+ 159,
+ 175,
+ 191,
+ 207,
+ 223,
+ 239,
+ 127,
+ 135,
+ 143,
+ 151,
+ 159,
+ 167,
+ 175,
+ 183,
+ 191,
+ 199,
+ 207,
+ 215,
+ 223,
+ 231,
+ 239,
+ 247,
+ 127,
+ 131,
+ 135,
+ 139,
+ 143,
+ 147,
+ 151,
+ 155,
+ 159,
+ 163,
+ 167,
+ 171,
+ 175,
+ 179,
+ 183,
+ 187,
+ 191,
+ 195,
+ 199,
+ 203,
+ 207,
+ 211,
+ 215,
+ 219,
+ 223,
+ 227,
+ 231,
+ 235,
+ 239,
+ 243,
+ 247,
+ 251,
+ 127,
+ 129,
+ 131,
+ 133,
+ 135,
+ 137,
+ 139,
+ 141,
+ 143,
+ 145,
+ 147,
+ 149,
+ 151,
+ 153,
+ 155,
+ 157,
+ 159,
+ 161,
+ 163,
+ 165,
+ 167,
+ 169,
+ 171,
+ 173,
+ 175,
+ 177,
+ 179,
+ 181,
+ 183,
+ 185,
+ 187,
+ 189,
+ 191,
+ 193,
+ 195,
+ 197,
+ 199,
+ 201,
+ 203,
+ 205,
+ 207,
+ 209,
+ 211,
+ 213,
+ 215,
+ 217,
+ 219,
+ 221,
+ 223,
+ 225,
+ 227,
+ 229,
+ 231,
+ 233,
+ 235,
+ 237,
+ 239,
+ 241,
+ 243,
+ 245,
+ 247,
+ 249,
+ 251,
+ 253,
+ 127
+ ];
}
diff --git a/image/lib/src/formats/webp/vp8_filter.dart b/image/lib/src/formats/webp/vp8_filter.dart
index 2ab6f3a..c1b2e76 100755
--- a/image/lib/src/formats/webp/vp8_filter.dart
+++ b/image/lib/src/formats/webp/vp8_filter.dart
@@ -46,19 +46,19 @@
}
// on macroblock edges
- void vFilter16(InputBuffer p, int stride, int thresh, int ithresh,
- int hev_thresh) {
+ void vFilter16(
+ InputBuffer p, int stride, int thresh, int ithresh, int hev_thresh) {
_filterLoop26(p, stride, 1, 16, thresh, ithresh, hev_thresh);
}
- void hFilter16(InputBuffer p, int stride, int thresh, int ithresh,
- int hev_thresh) {
+ void hFilter16(
+ InputBuffer p, int stride, int thresh, int ithresh, int hev_thresh) {
_filterLoop26(p, 1, stride, 16, thresh, ithresh, hev_thresh);
}
// on three inner edges
- void vFilter16i(InputBuffer p, int stride, int thresh, int ithresh,
- int hev_thresh) {
+ void vFilter16i(
+ InputBuffer p, int stride, int thresh, int ithresh, int hev_thresh) {
InputBuffer p2 = InputBuffer.from(p);
for (int k = 3; k > 0; --k) {
p2.offset += 4 * stride;
@@ -66,8 +66,8 @@
}
}
- void hFilter16i(InputBuffer p, int stride, int thresh, int ithresh,
- int hev_thresh) {
+ void hFilter16i(
+ InputBuffer p, int stride, int thresh, int ithresh, int hev_thresh) {
InputBuffer p2 = InputBuffer.from(p);
for (int k = 3; k > 0; --k) {
p2.offset += 4;
@@ -75,31 +75,29 @@
}
}
- /**
- * 8-pixels wide variant, for chroma filtering
- */
- void vFilter8(InputBuffer u, InputBuffer v, int stride, int thresh, int ithresh,
- int hev_thresh) {
+ /// 8-pixels wide variant, for chroma filtering
+ void vFilter8(InputBuffer u, InputBuffer v, int stride, int thresh,
+ int ithresh, int hev_thresh) {
_filterLoop26(u, stride, 1, 8, thresh, ithresh, hev_thresh);
_filterLoop26(v, stride, 1, 8, thresh, ithresh, hev_thresh);
}
- void hFilter8(InputBuffer u, InputBuffer v, int stride, int thresh, int ithresh,
- int hev_thresh) {
+ void hFilter8(InputBuffer u, InputBuffer v, int stride, int thresh,
+ int ithresh, int hev_thresh) {
_filterLoop26(u, 1, stride, 8, thresh, ithresh, hev_thresh);
_filterLoop26(v, 1, stride, 8, thresh, ithresh, hev_thresh);
}
- void vFilter8i(InputBuffer u, InputBuffer v, int stride, int thresh, int ithresh,
- int hev_thresh) {
+ void vFilter8i(InputBuffer u, InputBuffer v, int stride, int thresh,
+ int ithresh, int hev_thresh) {
InputBuffer u2 = InputBuffer.from(u, offset: 4 * stride);
InputBuffer v2 = InputBuffer.from(v, offset: 4 * stride);
_filterLoop24(u2, stride, 1, 8, thresh, ithresh, hev_thresh);
_filterLoop24(v2, stride, 1, 8, thresh, ithresh, hev_thresh);
}
- void hFilter8i(InputBuffer u, InputBuffer v, int stride, int thresh, int ithresh,
- int hev_thresh) {
+ void hFilter8i(InputBuffer u, InputBuffer v, int stride, int thresh,
+ int ithresh, int hev_thresh) {
InputBuffer u2 = InputBuffer.from(u, offset: 4);
InputBuffer v2 = InputBuffer.from(v, offset: 4);
_filterLoop24(u2, 1, stride, 8, thresh, ithresh, hev_thresh);
@@ -107,7 +105,7 @@
}
void _filterLoop26(InputBuffer p, int hstride, int vstride, int size,
- int thresh, int ithresh, int hev_thresh) {
+ int thresh, int ithresh, int hev_thresh) {
InputBuffer p2 = InputBuffer.from(p);
while (size-- > 0) {
if (_needsFilter2(p2, hstride, thresh, ithresh)) {
@@ -122,7 +120,7 @@
}
void _filterLoop24(InputBuffer p, int hstride, int vstride, int size,
- int thresh, int ithresh, int hev_thresh) {
+ int thresh, int ithresh, int hev_thresh) {
InputBuffer p2 = InputBuffer.from(p);
while (size-- > 0) {
if (_needsFilter2(p2, hstride, thresh, ithresh)) {
@@ -136,9 +134,7 @@
}
}
- /**
- * 4 pixels in, 2 pixels out
- */
+ /// 4 pixels in, 2 pixels out
void _doFilter2(InputBuffer p, int step) {
final int p1 = p[-2 * step];
final int p0 = p[-step];
@@ -151,9 +147,7 @@
p[0] = clip1[255 + q0 - a1];
}
- /**
- * 4 pixels in, 4 pixels out
- */
+ /// 4 pixels in, 4 pixels out
void _doFilter4(InputBuffer p, int step) {
final int p1 = p[-2 * step];
final int p0 = p[-step];
@@ -169,9 +163,7 @@
p[step] = clip1[255 + q1 - a3];
}
- /**
- * 6 pixels in, 6 pixels out
- */
+ /// 6 pixels in, 6 pixels out
void _doFilter6(InputBuffer p, int step) {
final int p2 = p[-3 * step];
final int p1 = p[-2 * step];
@@ -182,7 +174,7 @@
final int a = sclip1[1020 + 3 * (q0 - p0) + sclip1[1020 + p1 - q1]];
final int a1 = shiftR(27 * a + 63, 7); // eq. to ((3 * a + 7) * 9) >> 7
final int a2 = shiftR(18 * a + 63, 7); // eq. to ((2 * a + 7) * 9) >> 7
- final int a3 = shiftR(9 * a + 63, 7); // eq. to ((1 * a + 7) * 9) >> 7
+ final int a3 = shiftR(9 * a + 63, 7); // eq. to ((1 * a + 7) * 9) >> 7
p[-3 * step] = clip1[255 + p2 + a3];
p[-2 * step] = clip1[255 + p1 + a2];
p[-step] = clip1[255 + p0 + a1];
@@ -220,9 +212,12 @@
return false;
}
- return abs0[255 + p3 - p2] <= it && abs0[255 + p2 - p1] <= it &&
- abs0[255 + p1 - p0] <= it && abs0[255 + q3 - q2] <= it &&
- abs0[255 + q2 - q1] <= it && abs0[255 + q1 - q0] <= it;
+ return abs0[255 + p3 - p2] <= it &&
+ abs0[255 + p2 - p1] <= it &&
+ abs0[255 + p1 - p0] <= it &&
+ abs0[255 + q3 - q2] <= it &&
+ abs0[255 + q2 - q1] <= it &&
+ abs0[255 + q1 - q0] <= it;
}
void transformOne(InputBuffer src, InputBuffer dst) {
@@ -230,15 +225,18 @@
int si = 0;
int di = 0;
int tmp = 0;
- for (int i = 0; i < 4; ++i) { // vertical pass
+ for (int i = 0; i < 4; ++i) {
+ // vertical pass
final int a = src[si] + src[si + 8]; // [-4096, 4094]
final int b = src[si] - src[si + 8]; // [-4095, 4095]
- final int c = _mul(src[si + 4], kC2) - _mul(src[si + 12], kC1); // [-3783, 3783]
- final int d = _mul(src[si + 4], kC1) + _mul(src[si + 12], kC2); // [-3785, 3781]
- C[tmp++] = a + d; // [-7881, 7875]
- C[tmp++] = b + c; // [-7878, 7878]
- C[tmp++] = b - c; // [-7878, 7878]
- C[tmp++] = a - d; // [-7877, 7879]
+ final int c =
+ _mul(src[si + 4], kC2) - _mul(src[si + 12], kC1); // [-3783, 3783]
+ final int d =
+ _mul(src[si + 4], kC1) + _mul(src[si + 12], kC2); // [-3785, 3781]
+ C[tmp++] = a + d; // [-7881, 7875]
+ C[tmp++] = b + c; // [-7878, 7878]
+ C[tmp++] = b - c; // [-7878, 7878]
+ C[tmp++] = a - d; // [-7877, 7879]
si++;
}
@@ -250,10 +248,11 @@
// In the worst case scenario, the input to clip_8b() can be as large as
// [-60713, 60968].
tmp = 0;
- for (int i = 0; i < 4; ++i) { // horizontal pass
+ for (int i = 0; i < 4; ++i) {
+ // horizontal pass
final int dc = C[tmp] + 4;
- final int a = dc + C[tmp + 8];
- final int b = dc - C[tmp + 8];
+ final int a = dc + C[tmp + 8];
+ final int b = dc - C[tmp + 8];
final int c = _mul(C[tmp + 4], kC2) - _mul(C[tmp + 12], kC1);
final int d = _mul(C[tmp + 4], kC1) + _mul(C[tmp + 12], kC2);
_store(dst, di, 0, 0, a + d);
@@ -265,19 +264,18 @@
}
}
-
void transform(InputBuffer src, InputBuffer dst, bool doTwo) {
transformOne(src, dst);
if (doTwo) {
transformOne(new InputBuffer.from(src, offset: 16),
- new InputBuffer.from(dst, offset: 4));
+ new InputBuffer.from(dst, offset: 4));
}
}
void transformUV(InputBuffer src, InputBuffer dst) {
transform(src, dst, true);
transform(new InputBuffer.from(src, offset: 2 * 16),
- new InputBuffer.from(dst, offset: 4 * VP8.BPS), true);
+ new InputBuffer.from(dst, offset: 4 * VP8.BPS), true);
}
void transformDC(InputBuffer src, InputBuffer dst) {
@@ -295,21 +293,19 @@
}
if (src[1 * 16] != 0) {
transformDC(new InputBuffer.from(src, offset: 1 * 16),
- new InputBuffer.from(dst, offset: 4));
+ new InputBuffer.from(dst, offset: 4));
}
if (src[2 * 16] != 0) {
transformDC(new InputBuffer.from(src, offset: 2 * 16),
- new InputBuffer.from(dst, offset: 4 * VP8.BPS));
+ new InputBuffer.from(dst, offset: 4 * VP8.BPS));
}
if (src[3 * 16] != 0) {
transformDC(new InputBuffer.from(src, offset: 3 * 16),
- new InputBuffer.from(dst, offset: 4 * VP8.BPS + 4));
+ new InputBuffer.from(dst, offset: 4 * VP8.BPS + 4));
}
}
- /**
- * Simplified transform when only in[0], in[1] and in[4] are non-zero
- */
+ /// Simplified transform when only in[0], in[1] and in[4] are non-zero
void transformAC3(InputBuffer src, InputBuffer dst) {
final int a = src[0] + 4;
final int c4 = _mul(src[4], kC2);
@@ -322,16 +318,17 @@
_store2(dst, 3, a - d4, d1, c1);
}
- static int AVG3(a, b, c) => shiftR(((a) + 2 * (b) + (c) + 2), 2);
- static int AVG2(a, b) => shiftR(((a) + (b) + 1), 1);
+ static int AVG3(int a, int b, int c) => shiftR(((a) + 2 * (b) + (c) + 2), 2);
+ static int AVG2(int a, int b) => shiftR(((a) + (b) + 1), 1);
static void VE4(InputBuffer dst) {
int top = -VP8.BPS; // dst +
final List<int> vals = [
- AVG3(dst[top - 1], dst[top], dst[top + 1]),
- AVG3(dst[top], dst[top + 1], dst[top + 2]),
- AVG3(dst[top + 1], dst[top + 2], dst[top + 3]),
- AVG3(dst[top + 2], dst[top + 3], dst[top + 4])];
+ AVG3(dst[top - 1], dst[top], dst[top + 1]),
+ AVG3(dst[top], dst[top + 1], dst[top + 2]),
+ AVG3(dst[top + 1], dst[top + 2], dst[top + 3]),
+ AVG3(dst[top + 2], dst[top + 3], dst[top + 4])
+ ];
for (int i = 0; i < 4; ++i) {
dst.memcpy(i * VP8.BPS, 4, vals);
@@ -356,7 +353,8 @@
d2.toUint32List()[0] = 0x01010101 * AVG3(D, E, E);
}
- static void DC4(InputBuffer dst) { // DC
+ static void DC4(InputBuffer dst) {
+ // DC
int dc = 4;
for (int i = 0; i < 4; ++i) {
dc += dst[i - VP8.BPS] + dst[-1 + i * VP8.BPS];
@@ -394,11 +392,9 @@
trueMotion(dst, 16);
}
- static int DST(x, y) => x + y * VP8.BPS;
+ static int DST(int x, int y) => x + y * VP8.BPS;
- /**
- * Down-right
- */
+ /// Down-right
static void RD4(InputBuffer dst) {
final int I = dst[-1 + 0 * VP8.BPS];
final int J = dst[-1 + 1 * VP8.BPS];
@@ -413,15 +409,14 @@
dst[DST(0, 3)] = AVG3(J, K, L);
dst[DST(0, 2)] = dst[DST(1, 3)] = AVG3(I, J, K);
dst[DST(0, 1)] = dst[DST(1, 2)] = dst[DST(2, 3)] = AVG3(X, I, J);
- dst[DST(0, 0)] = dst[DST(1, 1)] = dst[DST(2, 2)] = dst[DST(3, 3)] = AVG3(A, X, I);
+ dst[DST(0, 0)] =
+ dst[DST(1, 1)] = dst[DST(2, 2)] = dst[DST(3, 3)] = AVG3(A, X, I);
dst[DST(1, 0)] = dst[DST(2, 1)] = dst[DST(3, 2)] = AVG3(B, A, X);
dst[DST(2, 0)] = dst[DST(3, 1)] = AVG3(C, B, A);
dst[DST(3, 0)] = AVG3(D, C, B);
}
- /**
- * Down-Left
- */
+ /// Down-Left
static void LD4(InputBuffer dst) {
final int A = dst[0 - VP8.BPS];
final int B = dst[1 - VP8.BPS];
@@ -434,15 +429,14 @@
dst[DST(0, 0)] = AVG3(A, B, C);
dst[DST(1, 0)] = dst[DST(0, 1)] = AVG3(B, C, D);
dst[DST(2, 0)] = dst[DST(1, 1)] = dst[DST(0, 2)] = AVG3(C, D, E);
- dst[DST(3, 0)] = dst[DST(2, 1)] = dst[DST(1, 2)] = dst[DST(0, 3)] = AVG3(D, E, F);
+ dst[DST(3, 0)] =
+ dst[DST(2, 1)] = dst[DST(1, 2)] = dst[DST(0, 3)] = AVG3(D, E, F);
dst[DST(3, 1)] = dst[DST(2, 2)] = dst[DST(1, 3)] = AVG3(E, F, G);
dst[DST(3, 2)] = dst[DST(2, 3)] = AVG3(F, G, H);
dst[DST(3, 3)] = AVG3(G, H, H);
}
- /**
- * Vertical-Right
- */
+ /// Vertical-Right
static void VR4(InputBuffer dst) {
final int I = dst[-1 + 0 * VP8.BPS];
final int J = dst[-1 + 1 * VP8.BPS];
@@ -465,9 +459,7 @@
dst[DST(3, 1)] = AVG3(B, C, D);
}
- /**
- * Vertical-Left
- */
+ /// Vertical-Left
static void VL4(InputBuffer dst) {
final int A = dst[0 - VP8.BPS];
final int B = dst[1 - VP8.BPS];
@@ -490,9 +482,7 @@
dst[DST(3, 3)] = AVG3(F, G, H);
}
- /**
- * Horizontal-Up
- */
+ /// Horizontal-Up
static void HU4(InputBuffer dst) {
final int I = dst[-1 + 0 * VP8.BPS];
final int J = dst[-1 + 1 * VP8.BPS];
@@ -504,13 +494,11 @@
dst[DST(1, 0)] = AVG3(I, J, K);
dst[DST(3, 0)] = dst[DST(1, 1)] = AVG3(J, K, L);
dst[DST(3, 1)] = dst[DST(1, 2)] = AVG3(K, L, L);
- dst[DST(3, 2)] = dst[DST(2, 2)] = dst[DST(0, 3)] = dst[DST(1, 3)] =
- dst[DST(2, 3)] = dst[DST(3, 3)] = L;
+ dst[DST(3, 2)] = dst[DST(2, 2)] =
+ dst[DST(0, 3)] = dst[DST(1, 3)] = dst[DST(2, 3)] = dst[DST(3, 3)] = L;
}
- /**
- * Horizontal-Down
- */
+ /// Horizontal-Down
static void HD4(InputBuffer dst) {
final int I = dst[-1 + 0 * VP8.BPS];
final int J = dst[-1 + 1 * VP8.BPS];
@@ -534,13 +522,15 @@
dst[DST(1, 3)] = AVG3(L, K, J);
}
- static void VE16(InputBuffer dst) { // vertical
+ static void VE16(InputBuffer dst) {
+ // vertical
for (int j = 0; j < 16; ++j) {
dst.memcpy(j * VP8.BPS, 16, dst, -VP8.BPS);
}
}
- static void HE16(InputBuffer dst) { // horizontal
+ static void HE16(InputBuffer dst) {
+ // horizontal
int di = 0;
for (int j = 16; j > 0; --j) {
dst.memset(di, 16, dst[di - 1]);
@@ -554,7 +544,8 @@
}
}
- static void DC16(InputBuffer dst) { // DC
+ static void DC16(InputBuffer dst) {
+ // DC
int DC = 16;
for (int j = 0; j < 16; ++j) {
DC += dst[-1 + j * VP8.BPS] + dst[j - VP8.BPS];
@@ -562,9 +553,7 @@
Put16(DC >> 5, dst);
}
- /**
- * DC with top samples not available
- */
+ /// DC with top samples not available
static void DC16NoTop(InputBuffer dst) {
int DC = 8;
for (int j = 0; j < 16; ++j) {
@@ -573,9 +562,7 @@
Put16(DC >> 4, dst);
}
- /**
- * DC with left samples not available
- */
+ /// DC with left samples not available
static void DC16NoLeft(InputBuffer dst) {
int DC = 8;
for (int i = 0; i < 16; ++i) {
@@ -584,9 +571,7 @@
Put16(DC >> 4, dst);
}
- /**
- * DC with no top and left samples
- */
+ /// DC with no top and left samples
static void DC16NoTopLeft(InputBuffer dst) {
Put16(0x80, dst);
}
@@ -605,9 +590,7 @@
}
}
- /**
- * helper for chroma-DC predictions
- */
+ /// helper for chroma-DC predictions
static void Put8x8uv(int value, InputBuffer dst) {
for (int j = 0; j < 8; ++j) {
dst.memset(j * VP8.BPS, 8, value);
@@ -622,9 +605,7 @@
Put8x8uv(dc0 >> 4, dst);
}
- /**
- * DC with no left samples
- */
+ /// DC with no left samples
static void DC8uvNoLeft(InputBuffer dst) {
int dc0 = 4;
for (int i = 0; i < 8; ++i) {
@@ -633,9 +614,7 @@
Put8x8uv(dc0 >> 3, dst);
}
- /**
- * DC with no top samples
- */
+ /// DC with no top samples
static void DC8uvNoTop(InputBuffer dst) {
int dc0 = 4;
for (int i = 0; i < 8; ++i) {
@@ -644,22 +623,43 @@
Put8x8uv(dc0 >> 3, dst);
}
- /**
- * DC with nothing
- */
+ /// DC with nothing
static void DC8uvNoTopLeft(InputBuffer dst) {
Put8x8uv(0x80, dst);
}
- static const List PredLuma4 = const [
- DC4, TM4, VE4, HE4, RD4, VR4, LD4, VL4, HD4, HU4 ];
+ static const PredLuma4 = [
+ DC4,
+ TM4,
+ VE4,
+ HE4,
+ RD4,
+ VR4,
+ LD4,
+ VL4,
+ HD4,
+ HU4
+ ];
- static const List PredLuma16 = const [
- DC16, TM16, VE16, HE16, DC16NoTop, DC16NoLeft, DC16NoTopLeft ];
+ static const PredLuma16 = [
+ DC16,
+ TM16,
+ VE16,
+ HE16,
+ DC16NoTop,
+ DC16NoLeft,
+ DC16NoTopLeft
+ ];
- static const List PredChroma8 = const [
- DC8uv, TM8uv, VE8uv, HE8uv, DC8uvNoTop, DC8uvNoLeft, DC8uvNoTopLeft ];
-
+ static const PredChroma8 = [
+ DC8uv,
+ TM8uv,
+ VE8uv,
+ HE8uv,
+ DC8uvNoTop,
+ DC8uvNoLeft,
+ DC8uvNoTopLeft
+ ];
static const int kC1 = 20091 + (1 << 16);
static const int kC2 = 35468;
@@ -682,12 +682,16 @@
/// abs(i)
static Uint8List abs0 = Uint8List(255 + 255 + 1);
+
/// abs(i)>>1
static Uint8List abs1 = Uint8List(255 + 255 + 1);
+
/// clips [-1020, 1020] to [-128, 127]
static Int8List sclip1 = Int8List(1020 + 1020 + 1);
+
/// clips [-112, 112] to [-16, 15]
static Int8List sclip2 = Int8List(112 + 112 + 1);
+
/// clips [-255,510] to [0,255]
static Uint8List clip1 = Uint8List(255 + 510 + 1);
diff --git a/image/lib/src/formats/webp/vp8_types.dart b/image/lib/src/formats/webp/vp8_types.dart
index de08bd1..06c53ae 100755
--- a/image/lib/src/formats/webp/vp8_types.dart
+++ b/image/lib/src/formats/webp/vp8_types.dart
@@ -18,24 +18,24 @@
int clampType; // uint8
}
-/**
- * Segment features
- */
+/// Segment features
class VP8SegmentHeader {
bool useSegment = false;
+
/// whether to update the segment map or not
bool updateMap = false;
+
/// absolute or delta values for quantizer and filter
bool absoluteDelta = true;
+
/// quantization changes
Int8List quantizer = Int8List(VP8.NUM_MB_SEGMENTS);
+
/// filter strength for segments
Int8List filterStrength = Int8List(VP8.NUM_MB_SEGMENTS);
}
-/**
- * All the probas associated to one band
- */
+/// All the probas associated to one band
class VP8BandProbas {
List<Uint8List> probas = List<Uint8List>(VP8.NUM_CTX);
VP8BandProbas() {
@@ -45,11 +45,10 @@
}
}
-/**
- * Struct collecting all frame-persistent probabilities.
- */
+/// Struct collecting all frame-persistent probabilities.
class VP8Proba {
Uint8List segments = Uint8List(VP8.MB_FEATURE_TREE_PROBS);
+
/// Type: 0:Intra16-AC 1:Intra16-DC 2:Chroma 3:Intra4
List<List<VP8BandProbas>> bands = List(VP8.NUM_TYPES);
@@ -65,9 +64,7 @@
}
}
-/**
- * Filter parameters
- */
+/// Filter parameters
class VP8FilterHeader {
bool simple; // 0=complex, 1=simple
int level; // [0..63]
@@ -80,9 +77,7 @@
//------------------------------------------------------------------------------
// Informations about the macroblocks.
-/**
- * filter specs
- */
+/// filter specs
class VP8FInfo {
int fLimit = 0; // uint8_t, filter limit in [3..189], or 0 if no filtering
int fInnerLevel = 0; // uint8_t, inner limit in [1..63]
@@ -90,17 +85,14 @@
int hevThresh = 0; // uint8_t, high edge variance threshold in [0..2]
}
-/**
- * Top/Left Contexts used for syntax-parsing
- */
-class VP8MB{
- int nz = 0; // uint8_t, non-zero AC/DC coeffs (4bit for luma + 4bit for chroma)
+/// Top/Left Contexts used for syntax-parsing
+class VP8MB {
+ int nz =
+ 0; // uint8_t, non-zero AC/DC coeffs (4bit for luma + 4bit for chroma)
int nzDc = 0; // uint8_t, non-zero DC coeff (1bit)
}
-/**
- * Dequantization matrices
- */
+/// Dequantization matrices
class VP8QuantMatrix {
Int32List y1Mat = Int32List(2);
Int32List y2Mat = Int32List(2);
@@ -110,15 +102,14 @@
int dither; // dithering amplitude (0 = off, max=255)
}
-/**
- * Data needed to reconstruct a macroblock
- */
+/// Data needed to reconstruct a macroblock
class VP8MBData {
/// 384 coeffs = (16+4+4) * 4*4
Int16List coeffs = Int16List(384);
bool isIntra4x4; // true if intra4x4
/// one 16x16 mode (#0) or sixteen 4x4 modes
Uint8List imodes = Uint8List(16);
+
/// chroma prediction mode
int uvmode;
// bit-wise info about the content of each sub-4x4 blocks (in decoding order).
@@ -130,13 +121,12 @@
// This allows to call specialized transform functions.
int nonZeroY;
int nonZeroUV;
+
/// uint8_t, local dithering strength (deduced from non_zero_*)
int dither;
}
-/**
- * Saved top samples, per macroblock. Fits into a cache-line.
- */
+/// Saved top samples, per macroblock. Fits into a cache-line.
class VP8TopSamples {
Uint8List y = Uint8List(16);
Uint8List u = Uint8List(8);
@@ -149,23 +139,21 @@
Uint32List _table = Uint32List(RANDOM_TABLE_SIZE);
int _amplitude;
- /**
- * Initializes random generator with an amplitude 'dithering' in range [0..1].
- */
+ /// Initializes random generator with an amplitude 'dithering' in range [0..1].
VP8Random(double dithering) {
_table.setRange(0, RANDOM_TABLE_SIZE, _RANDOM_TABLE);
_index1 = 0;
_index2 = 31;
- _amplitude = (dithering < 0.0) ? 0 :
- (dithering > 1.0) ? (1 << RANDOM_DITHER_FIX) :
- ((1 << RANDOM_DITHER_FIX) * dithering).toInt();
+ _amplitude = (dithering < 0.0)
+ ? 0
+ : (dithering > 1.0)
+ ? (1 << RANDOM_DITHER_FIX)
+ : ((1 << RANDOM_DITHER_FIX) * dithering).toInt();
}
- /**
- * Returns a centered pseudo-random number with 'num_bits' amplitude.
- * (uses D.Knuth's Difference-based random generator).
- * 'amp' is in RANDOM_DITHER_FIX fixed-point precision.
- */
+ /// Returns a centered pseudo-random number with 'num_bits' amplitude.
+ /// (uses D.Knuth's Difference-based random generator).
+ /// 'amp' is in RANDOM_DITHER_FIX fixed-point precision.
int randomBits2(int numBits, int amp) {
int diff = _table[_index1] - _table[_index2];
if (diff < 0) {
@@ -201,14 +189,60 @@
// 31b-range values
static const List<int> _RANDOM_TABLE = const [
- 0x0de15230, 0x03b31886, 0x775faccb, 0x1c88626a, 0x68385c55, 0x14b3b828,
- 0x4a85fef8, 0x49ddb84b, 0x64fcf397, 0x5c550289, 0x4a290000, 0x0d7ec1da,
- 0x5940b7ab, 0x5492577d, 0x4e19ca72, 0x38d38c69, 0x0c01ee65, 0x32a1755f,
- 0x5437f652, 0x5abb2c32, 0x0faa57b1, 0x73f533e7, 0x685feeda, 0x7563cce2,
- 0x6e990e83, 0x4730a7ed, 0x4fc0d9c6, 0x496b153c, 0x4f1403fa, 0x541afb0c,
- 0x73990b32, 0x26d7cb1c, 0x6fcc3706, 0x2cbb77d8, 0x75762f2a, 0x6425ccdd,
- 0x24b35461, 0x0a7d8715, 0x220414a8, 0x141ebf67, 0x56b41583, 0x73e502e3,
- 0x44cab16f, 0x28264d42, 0x73baaefb, 0x0a50ebed, 0x1d6ab6fb, 0x0d3ad40b,
- 0x35db3b68, 0x2b081e83, 0x77ce6b95, 0x5181e5f0, 0x78853bbc, 0x009f9494,
- 0x27e5ed3c];
+ 0x0de15230,
+ 0x03b31886,
+ 0x775faccb,
+ 0x1c88626a,
+ 0x68385c55,
+ 0x14b3b828,
+ 0x4a85fef8,
+ 0x49ddb84b,
+ 0x64fcf397,
+ 0x5c550289,
+ 0x4a290000,
+ 0x0d7ec1da,
+ 0x5940b7ab,
+ 0x5492577d,
+ 0x4e19ca72,
+ 0x38d38c69,
+ 0x0c01ee65,
+ 0x32a1755f,
+ 0x5437f652,
+ 0x5abb2c32,
+ 0x0faa57b1,
+ 0x73f533e7,
+ 0x685feeda,
+ 0x7563cce2,
+ 0x6e990e83,
+ 0x4730a7ed,
+ 0x4fc0d9c6,
+ 0x496b153c,
+ 0x4f1403fa,
+ 0x541afb0c,
+ 0x73990b32,
+ 0x26d7cb1c,
+ 0x6fcc3706,
+ 0x2cbb77d8,
+ 0x75762f2a,
+ 0x6425ccdd,
+ 0x24b35461,
+ 0x0a7d8715,
+ 0x220414a8,
+ 0x141ebf67,
+ 0x56b41583,
+ 0x73e502e3,
+ 0x44cab16f,
+ 0x28264d42,
+ 0x73baaefb,
+ 0x0a50ebed,
+ 0x1d6ab6fb,
+ 0x0d3ad40b,
+ 0x35db3b68,
+ 0x2b081e83,
+ 0x77ce6b95,
+ 0x5181e5f0,
+ 0x78853bbc,
+ 0x009f9494,
+ 0x27e5ed3c
+ ];
}
diff --git a/image/lib/src/formats/webp/vp8l.dart b/image/lib/src/formats/webp/vp8l.dart
index 84c6736..87b5ac2 100755
--- a/image/lib/src/formats/webp/vp8l.dart
+++ b/image/lib/src/formats/webp/vp8l.dart
@@ -11,20 +11,17 @@
import 'webp_huffman.dart';
import 'webp_info.dart';
-/**
- * WebP lossless format.
- */
+/// WebP lossless format.
class VP8L {
InputBuffer input;
VP8LBitReader br;
WebPInfo webp;
Image image;
- VP8L(InputBuffer input, WebPInfo webp) :
- this.input = input,
- this.webp = webp,
- this.br = VP8LBitReader(input) {
- }
+ VP8L(InputBuffer input, WebPInfo webp)
+ : this.input = input,
+ this.webp = webp,
+ this.br = VP8LBitReader(input);
bool decodeHeader() {
int signature = br.readBits(8);
@@ -58,8 +55,8 @@
image = Image(webp.width, webp.height);
- if (!_decodeImageData(_pixels, webp.width, webp.height,
- webp.height, _processRows)) {
+ if (!_decodeImageData(
+ _pixels, webp.width, webp.height, webp.height, _processRows)) {
return null;
}
@@ -116,14 +113,15 @@
case VP8LTransform.CROSS_COLOR_TRANSFORM:
transform.bits = br.readBits(3) + 2;
transform.data = _decodeImageStream(
- _subSampleSize(transform.xsize, transform.bits),
- _subSampleSize(transform.ysize, transform.bits), false);
+ _subSampleSize(transform.xsize, transform.bits),
+ _subSampleSize(transform.ysize, transform.bits),
+ false);
break;
case VP8LTransform.COLOR_INDEXING_TRANSFORM:
final int numColors = br.readBits(8) + 1;
- final int bits = (numColors > 16) ? 0 :
- (numColors > 4) ? 1 :
- (numColors > 2) ? 2 : 3;
+ final int bits = (numColors > 16)
+ ? 0
+ : (numColors > 4) ? 1 : (numColors > 2) ? 2 : 3;
transformSize[0] = _subSampleSize(transform.xsize, bits);
transform.bits = bits;
transform.data = _decodeImageStream(numColors, 1, false);
@@ -165,8 +163,8 @@
}
// Read the Huffman codes (may recurse).
- if (!_readHuffmanCodes(transformXsize, transformYsize,
- colorCacheBits, isLevel0)) {
+ if (!_readHuffmanCodes(
+ transformXsize, transformYsize, colorCacheBits, isLevel0)) {
throw new ImageException('Invalid Huffman Codes');
}
@@ -194,8 +192,8 @@
Uint32List data = Uint32List(totalSize);
// Use the Huffman trees to decode the LZ77 encoded data.
- if (!_decodeImageData(data, transformXsize, transformYsize,
- transformYsize, null)) {
+ if (!_decodeImageData(
+ data, transformXsize, transformYsize, transformYsize, null)) {
throw new ImageException('Failed to decode image data.');
}
@@ -205,8 +203,8 @@
return data;
}
- bool _decodeImageData(data, int width, int height,
- int lastRow, processFunc) {
+ bool _decodeImageData(dynamic data, int width, int height, int lastRow,
+ dynamic processFunc) {
int row = _lastPixel ~/ width;
int col = _lastPixel % width;
@@ -234,7 +232,8 @@
br.fillBitWindow();
int code = htreeGroup.htrees[_GREEN].readSymbol(br);
- if (code < NUM_LITERAL_CODES) { // Literal
+ if (code < NUM_LITERAL_CODES) {
+ // Literal
int red = htreeGroup.htrees[_RED].readSymbol(br);
int green = code;
br.fillBitWindow();
@@ -256,12 +255,13 @@
if (colorCache != null) {
while (lastCached < src) {
- colorCache.insert(data[lastCached]);
+ colorCache.insert(data[lastCached] as int);
lastCached++;
}
}
}
- } else if (code < lenCodeLimit) { // Backward reference
+ } else if (code < lenCodeLimit) {
+ // Backward reference
final int lengthSym = code - NUM_LITERAL_CODES;
final int length = _getCopyLength(lengthSym);
final int distSymbol = htreeGroup.htrees[_DIST].readSymbol(br);
@@ -292,16 +292,17 @@
}
if (colorCache != null) {
while (lastCached < src) {
- colorCache.insert(data[lastCached]);
+ colorCache.insert(data[lastCached] as int);
lastCached++;
}
}
}
- } else if (code < colorCacheLimit) { // Color cache
+ } else if (code < colorCacheLimit) {
+ // Color cache
final int key = code - lenCodeLimit;
while (lastCached < src) {
- colorCache.insert(data[lastCached]);
+ colorCache.insert(data[lastCached] as int);
lastCached++;
}
@@ -319,12 +320,13 @@
if (colorCache != null) {
while (lastCached < src) {
- colorCache.insert(data[lastCached]);
+ colorCache.insert(data[lastCached] as int);
lastCached++;
}
}
}
- } else { // Not reached
+ } else {
+ // Not reached
return false;
}
}
@@ -343,10 +345,8 @@
return true;
}
- /**
- * Row-processing for the special case when alpha data contains only one
- * transform (color indexing), and trivial non-green literals.
- */
+ /// Row-processing for the special case when alpha data contains only one
+ /// transform (color indexing), and trivial non-green literals.
bool _is8bOptimizable() {
if (_colorCacheSize > 0) {
return false;
@@ -368,19 +368,17 @@
return true;
}
- /**
- * Special row-processing that only stores the alpha data.
- */
+ /// Special row-processing that only stores the alpha data.
void _extractAlphaRows(int row) {
final int numRows = row - _lastRow;
if (numRows <= 0) {
- return; // Nothing to be done.
+ return; // Nothing to be done.
}
_applyInverseTransforms(numRows, webp.width * _lastRow);
// Extract alpha (which is stored in the green plane).
- final int width = webp.width; // the final width (!= dec->width_)
+ final int width = webp.width; // the final width (!= dec->width_)
final int cachePixs = width * numRows;
final int di = width * _lastRow;
@@ -413,7 +411,8 @@
br.fillBitWindow();
int code = htreeGroup.htrees[_GREEN].readSymbol(br);
- if (code < NUM_LITERAL_CODES) { // Literal
+ if (code < NUM_LITERAL_CODES) {
+ // Literal
_pixels8[pos] = code;
++pos;
++col;
@@ -424,7 +423,8 @@
_extractPalettedAlphaRows(row);
}
}
- } else if (code < lenCodeLimit) { // Backward reference
+ } else if (code < lenCodeLimit) {
+ // Backward reference
final int lengthSym = code - NUM_LITERAL_CODES;
final int length = _getCopyLength(lengthSym);
final int distSymbol = htreeGroup.htrees[_DIST].readSymbol(br);
@@ -457,7 +457,8 @@
if (pos < last && (col & mask) != 0) {
htreeGroup = _getHtreeGroupForPos(col, row);
}
- } else { // Not reached
+ } else {
+ // Not reached
return false;
}
}
@@ -479,9 +480,7 @@
_lastRow = row;
}
- /**
- * Special method for paletted alpha data.
- */
+ /// Special method for paletted alpha data.
void _applyInverseTransformsAlpha(int numRows, InputBuffer rows) {
final int startRow = _lastRow;
final int endRow = startRow + numRows;
@@ -491,17 +490,15 @@
transform.colorIndexInverseTransformAlpha(startRow, endRow, rows, rowsOut);
}
- /**
- * Processes (transforms, scales & color-converts) the rows decoded after the
- * last call.
- */
+ /// Processes (transforms, scales & color-converts) the rows decoded after the
+ /// last call.
//static int __count = 0;
void _processRows(int row) {
int rows = webp.width * _lastRow; // offset into _pixels
final int numRows = row - _lastRow;
if (numRows <= 0) {
- return; // Nothing to be done.
+ return; // Nothing to be done.
}
_applyInverseTransforms(numRows, rows);
@@ -537,14 +534,14 @@
while (n-- > 0) {
VP8LTransform transform = _transforms[n];
- transform.inverseTransform(startRow, endRow, _pixels, rowsIn,
- _pixels, rowsOut);
+ transform.inverseTransform(
+ startRow, endRow, _pixels, rowsIn, _pixels, rowsOut);
rowsIn = rowsOut;
}
}
- bool _readHuffmanCodes(int xsize, int ysize, int colorCacheBits,
- bool allowRecursion) {
+ bool _readHuffmanCodes(
+ int xsize, int ysize, int colorCacheBits, bool allowRecursion) {
Uint32List huffmanImage;
int numHtreeGroups = 1;
@@ -620,12 +617,11 @@
codeLengths[1] = numSymbols - 1;
}
- ok = tree.buildExplicit(codeLengths, codes, symbols,
- alphabetSize, numSymbols);
+ ok = tree.buildExplicit(
+ codeLengths, codes, symbols, alphabetSize, numSymbols);
} else {
// Decode Huffman-coded code lengths.
- Int32List codeLengthCodeLengths =
- new Int32List(_NUM_CODE_LENGTH_CODES);
+ Int32List codeLengthCodeLengths = new Int32List(_NUM_CODE_LENGTH_CODES);
final int numCodes = br.readBits(4) + 4;
if (numCodes > _NUM_CODE_LENGTH_CODES) {
@@ -638,8 +634,8 @@
codeLengthCodeLengths[_CODE_LENGTH_CODE_ORDER[i]] = br.readBits(3);
}
- ok = _readHuffmanCodeLengths(codeLengthCodeLengths, alphabetSize,
- codeLengths);
+ ok = _readHuffmanCodeLengths(
+ codeLengthCodeLengths, alphabetSize, codeLengths);
if (ok) {
ok = tree.buildImplicit(codeLengths, alphabetSize);
@@ -649,8 +645,8 @@
return ok;
}
- bool _readHuffmanCodeLengths(List<int> codeLengthCodeLengths,
- int numSymbols, List<int> codeLengths) {
+ bool _readHuffmanCodeLengths(
+ List<int> codeLengthCodeLengths, int numSymbols, List<int> codeLengths) {
//bool ok = false;
int symbol;
int max_symbol;
@@ -661,7 +657,8 @@
return false;
}
- if (br.readBits(1) != 0) { // use length
+ if (br.readBits(1) != 0) {
+ // use length
final int length_nbits = 2 + 2 * br.readBits(3);
max_symbol = 2 + br.readBits(length_nbits);
if (max_symbol > numSymbols) {
@@ -735,17 +732,13 @@
}
}
- /**
- * Computes sampled size of 'size' when sampling using 'sampling bits'.
- */
+ /// Computes sampled size of 'size' when sampling using 'sampling bits'.
static int _subSampleSize(int size, int samplingBits) {
return (size + (1 << samplingBits) - 1) >> samplingBits;
}
- /**
- * For security reason, we need to remap the color map to span
- * the total possible bundled values, and not just the num_colors.
- */
+ /// For security reason, we need to remap the color map to span
+ /// the total possible bundled values, and not just the num_colors.
bool _expandColorMap(int numColors, VP8LTransform transform) {
final int finalNumColors = 1 << (8 >> transform.bits);
Uint32List newColorMap = Uint32List(finalNumColors);
@@ -779,8 +772,8 @@
}
HTreeGroup _getHtreeGroupForPos(int x, int y) {
- int metaIndex = _getMetaIndex(_huffmanImage, _huffmanXsize,
- _huffmanSubsampleBits, x, y);
+ int metaIndex = _getMetaIndex(
+ _huffmanImage, _huffmanXsize, _huffmanSubsampleBits, x, y);
if (_htreeGroups[metaIndex] == null) {
_htreeGroups[metaIndex] = HTreeGroup();
}
@@ -798,32 +791,163 @@
static const int _NUM_CODE_LENGTH_CODES = 19;
static const List<int> _CODE_LENGTH_CODE_ORDER = const [
- 17, 18, 0, 1, 2, 3, 4, 5, 16, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
+ 17,
+ 18,
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 16,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15
+ ];
static const int _CODE_TO_PLANE_CODES = 120;
static const List<int> _CODE_TO_PLANE = const [
- 0x18, 0x07, 0x17, 0x19, 0x28, 0x06, 0x27, 0x29, 0x16, 0x1a,
- 0x26, 0x2a, 0x38, 0x05, 0x37, 0x39, 0x15, 0x1b, 0x36, 0x3a,
- 0x25, 0x2b, 0x48, 0x04, 0x47, 0x49, 0x14, 0x1c, 0x35, 0x3b,
- 0x46, 0x4a, 0x24, 0x2c, 0x58, 0x45, 0x4b, 0x34, 0x3c, 0x03,
- 0x57, 0x59, 0x13, 0x1d, 0x56, 0x5a, 0x23, 0x2d, 0x44, 0x4c,
- 0x55, 0x5b, 0x33, 0x3d, 0x68, 0x02, 0x67, 0x69, 0x12, 0x1e,
- 0x66, 0x6a, 0x22, 0x2e, 0x54, 0x5c, 0x43, 0x4d, 0x65, 0x6b,
- 0x32, 0x3e, 0x78, 0x01, 0x77, 0x79, 0x53, 0x5d, 0x11, 0x1f,
- 0x64, 0x6c, 0x42, 0x4e, 0x76, 0x7a, 0x21, 0x2f, 0x75, 0x7b,
- 0x31, 0x3f, 0x63, 0x6d, 0x52, 0x5e, 0x00, 0x74, 0x7c, 0x41,
- 0x4f, 0x10, 0x20, 0x62, 0x6e, 0x30, 0x73, 0x7d, 0x51, 0x5f,
- 0x40, 0x72, 0x7e, 0x61, 0x6f, 0x50, 0x71, 0x7f, 0x60, 0x70];
+ 0x18,
+ 0x07,
+ 0x17,
+ 0x19,
+ 0x28,
+ 0x06,
+ 0x27,
+ 0x29,
+ 0x16,
+ 0x1a,
+ 0x26,
+ 0x2a,
+ 0x38,
+ 0x05,
+ 0x37,
+ 0x39,
+ 0x15,
+ 0x1b,
+ 0x36,
+ 0x3a,
+ 0x25,
+ 0x2b,
+ 0x48,
+ 0x04,
+ 0x47,
+ 0x49,
+ 0x14,
+ 0x1c,
+ 0x35,
+ 0x3b,
+ 0x46,
+ 0x4a,
+ 0x24,
+ 0x2c,
+ 0x58,
+ 0x45,
+ 0x4b,
+ 0x34,
+ 0x3c,
+ 0x03,
+ 0x57,
+ 0x59,
+ 0x13,
+ 0x1d,
+ 0x56,
+ 0x5a,
+ 0x23,
+ 0x2d,
+ 0x44,
+ 0x4c,
+ 0x55,
+ 0x5b,
+ 0x33,
+ 0x3d,
+ 0x68,
+ 0x02,
+ 0x67,
+ 0x69,
+ 0x12,
+ 0x1e,
+ 0x66,
+ 0x6a,
+ 0x22,
+ 0x2e,
+ 0x54,
+ 0x5c,
+ 0x43,
+ 0x4d,
+ 0x65,
+ 0x6b,
+ 0x32,
+ 0x3e,
+ 0x78,
+ 0x01,
+ 0x77,
+ 0x79,
+ 0x53,
+ 0x5d,
+ 0x11,
+ 0x1f,
+ 0x64,
+ 0x6c,
+ 0x42,
+ 0x4e,
+ 0x76,
+ 0x7a,
+ 0x21,
+ 0x2f,
+ 0x75,
+ 0x7b,
+ 0x31,
+ 0x3f,
+ 0x63,
+ 0x6d,
+ 0x52,
+ 0x5e,
+ 0x00,
+ 0x74,
+ 0x7c,
+ 0x41,
+ 0x4f,
+ 0x10,
+ 0x20,
+ 0x62,
+ 0x6e,
+ 0x30,
+ 0x73,
+ 0x7d,
+ 0x51,
+ 0x5f,
+ 0x40,
+ 0x72,
+ 0x7e,
+ 0x61,
+ 0x6f,
+ 0x50,
+ 0x71,
+ 0x7f,
+ 0x60,
+ 0x70
+ ];
static const int _CODE_LENGTH_LITERALS = 16;
static const int _CODE_LENGTH_REPEAT_CODE = 16;
static const List<int> _CODE_LENGTH_EXTRA_BITS = const [2, 3, 7];
- static const List<int> _CODE_LENGTH_REPEAT_OFFSETS = const [ 3, 3, 11 ];
+ static const List<int> _CODE_LENGTH_REPEAT_OFFSETS = const [3, 3, 11];
static const List<int> ALPHABET_SIZE = const [
NUM_LITERAL_CODES + NUM_LENGTH_CODES,
- NUM_LITERAL_CODES, NUM_LITERAL_CODES,
- NUM_LITERAL_CODES, NUM_DISTANCE_CODES];
+ NUM_LITERAL_CODES,
+ NUM_LITERAL_CODES,
+ NUM_LITERAL_CODES,
+ NUM_DISTANCE_CODES
+ ];
static const int VP8L_MAGIC_BYTE = 0x2f;
static const int VP8L_VERSION = 0;
@@ -832,7 +956,7 @@
int _lastRow = 0;
int _colorCacheSize = 0;
- VP8LColorCache _colorCache;
+ VP8LColorCache _colorCache;
int _huffmanMask = 0;
int _huffmanSubsampleBits = 0;
@@ -880,7 +1004,8 @@
int get ioHeight => _ioHeight;
set ioHeight(int height) => _ioHeight = height;
- bool decodeImageData(data, int width, int height, int lastRow, processFunc) =>
+ bool decodeImageData(dynamic data, int width, int height, int lastRow,
+ dynamic processFunc) =>
_decodeImageData(data, width, height, lastRow, processFunc);
Uint32List decodeImageStream(int xsize, int ysize, bool isLevel0) =>
@@ -897,5 +1022,6 @@
void extractAlphaRows(int row) => _extractAlphaRows(row);
- static int subSampleSize(int size, int samplingBits) => VP8L._subSampleSize(size, samplingBits);
+ static int subSampleSize(int size, int samplingBits) =>
+ VP8L._subSampleSize(size, samplingBits);
}
diff --git a/image/lib/src/formats/webp/vp8l_bit_reader.dart b/image/lib/src/formats/webp/vp8l_bit_reader.dart
index 0a6359b..84f1911 100755
--- a/image/lib/src/formats/webp/vp8l_bit_reader.dart
+++ b/image/lib/src/formats/webp/vp8l_bit_reader.dart
@@ -18,14 +18,12 @@
_buffer8[7] = _input.readByte();
}
- /**
- * Return the prefetched bits, so they can be looked up.
- */
+ /// Return the prefetched bits, so they can be looked up.
int prefetchBits() {
int b2 = 0;
if (bitPos < 32) {
b2 = (_buffer[0] >> bitPos) +
- ((_buffer[1] & BIT_MASK[bitPos]) * (BIT_MASK[32 - bitPos] + 1));
+ ((_buffer[1] & BIT_MASK[bitPos]) * (BIT_MASK[32 - bitPos] + 1));
} else if (bitPos == 32) {
b2 = _buffer[1];
} else {
@@ -36,18 +34,14 @@
bool get isEOS => (_input.isEOS && bitPos >= LBITS);
- /**
- * Advances the read buffer by 4 bytes to make room for reading next 32 bits.
- */
+ /// Advances the read buffer by 4 bytes to make room for reading next 32 bits.
void fillBitWindow() {
if (bitPos >= WBITS) {
_shiftBytes();
}
}
- /**
- * Reads the specified number of bits from Read Buffer.
- */
+ /// Reads the specified number of bits from Read Buffer.
int readBits(int numBits) {
// Flag an error if end_of_stream or n_bits is more than allowed limit.
if (!isEOS && numBits < MAX_NUM_BIT_READ) {
@@ -61,9 +55,7 @@
}
}
- /**
- * If not at EOS, reload up to LBITS byte-by-byte
- */
+ /// If not at EOS, reload up to LBITS byte-by-byte
void _shiftBytes() {
while (bitPos >= 8 && !_input.isEOS) {
int b = _input.readByte();
@@ -83,16 +75,49 @@
/// The number of bytes used for the bit buffer.
static const int VALUE_SIZE = 8;
static const int MAX_NUM_BIT_READ = 25;
+
/// Number of bits prefetched.
static const int LBITS = 64;
+
/// Minimum number of bytes needed after fillBitWindow.
static const int WBITS = 32;
+
/// Number of bytes needed to store WBITS bits.
static const int LOG8_WBITS = 4;
static const List<int> BIT_MASK = const [
- 0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383,
- 32767, 65535, 131071, 262143, 524287, 1048575, 2097151, 4194303, 8388607,
- 16777215, 33554431, 67108863, 134217727, 268435455, 536870911,
- 1073741823, 2147483647, 4294967295];
+ 0,
+ 1,
+ 3,
+ 7,
+ 15,
+ 31,
+ 63,
+ 127,
+ 255,
+ 511,
+ 1023,
+ 2047,
+ 4095,
+ 8191,
+ 16383,
+ 32767,
+ 65535,
+ 131071,
+ 262143,
+ 524287,
+ 1048575,
+ 2097151,
+ 4194303,
+ 8388607,
+ 16777215,
+ 33554431,
+ 67108863,
+ 134217727,
+ 268435455,
+ 536870911,
+ 1073741823,
+ 2147483647,
+ 4294967295
+ ];
}
diff --git a/image/lib/src/formats/webp/vp8l_color_cache.dart b/image/lib/src/formats/webp/vp8l_color_cache.dart
index 2b3c41a..38175c6 100755
--- a/image/lib/src/formats/webp/vp8l_color_cache.dart
+++ b/image/lib/src/formats/webp/vp8l_color_cache.dart
@@ -4,9 +4,9 @@
final Uint32List colors; // color entries
final int hashShift; // Hash shift: 32 - hash_bits.
- VP8LColorCache(int hashBits) :
- colors = Uint32List(1 << hashBits),
- hashShift = 32 - hashBits;
+ VP8LColorCache(int hashBits)
+ : colors = Uint32List(1 << hashBits),
+ hashShift = 32 - hashBits;
void insert(int argb) {
final int a = (argb * _HASH_MUL) & 0xffffffff;
diff --git a/image/lib/src/formats/webp/vp8l_transform.dart b/image/lib/src/formats/webp/vp8l_transform.dart
index 340a83f..97aeed4 100755
--- a/image/lib/src/formats/webp/vp8l_transform.dart
+++ b/image/lib/src/formats/webp/vp8l_transform.dart
@@ -6,7 +6,7 @@
class VP8LTransform {
// enum VP8LImageTransformType
- static const int PREDICTOR_TRANSFORM = 0;
+ static const int PREDICTOR_TRANSFORM = 0;
static const int CROSS_COLOR_TRANSFORM = 1;
static const int SUBTRACT_GREEN = 2;
static const int COLOR_INDEXING_TRANSFORM = 3;
@@ -17,17 +17,14 @@
Uint32List data;
int bits = 0;
- void inverseTransform(int rowStart, int rowEnd,
- Uint32List inData,
- int rowsIn,
- Uint32List outData,
- int rowsOut) {
+ void inverseTransform(int rowStart, int rowEnd, Uint32List inData, int rowsIn,
+ Uint32List outData, int rowsOut) {
final int width = xsize;
switch (type) {
case SUBTRACT_GREEN:
- addGreenToBlueAndRed(outData, rowsOut,
- rowsOut + (rowEnd - rowStart) * width);
+ addGreenToBlueAndRed(
+ outData, rowsOut, rowsOut + (rowEnd - rowStart) * width);
break;
case PREDICTOR_TRANSFORM:
predictorInverseTransform(rowStart, rowEnd, outData, rowsOut);
@@ -51,24 +48,24 @@
// the effective width of VP8LSubSampleSize(xsize_, bits_). All other
// transforms work on effective width of xsize_.
final int outStride = (rowEnd - rowStart) * width;
- final int inStride = (rowEnd - rowStart) *
- InternalVP8L.subSampleSize(xsize, bits);
+ final int inStride =
+ (rowEnd - rowStart) * InternalVP8L.subSampleSize(xsize, bits);
int src = rowsOut + outStride - inStride;
outData.setRange(src, src + inStride, inData, rowsOut);
- colorIndexInverseTransform(rowStart, rowEnd, inData, src,
- outData, rowsOut);
+ colorIndexInverseTransform(
+ rowStart, rowEnd, inData, src, outData, rowsOut);
} else {
- colorIndexInverseTransform(rowStart, rowEnd, inData, rowsIn,
- outData, rowsOut);
+ colorIndexInverseTransform(
+ rowStart, rowEnd, inData, rowsIn, outData, rowsOut);
}
break;
}
}
- void colorIndexInverseTransformAlpha(int yStart, int yEnd,
- InputBuffer src, InputBuffer dst) {
+ void colorIndexInverseTransformAlpha(
+ int yStart, int yEnd, InputBuffer src, InputBuffer dst) {
final int bitsPerPixel = 8 >> bits;
final int width = xsize;
Uint32List colorMap = this.data;
@@ -87,7 +84,8 @@
packed_pixels = _getAlphaIndex(src[0]);
src.offset++;
}
- int p = _getAlphaValue(colorMap[packed_pixels & bit_mask]);;
+ int p = _getAlphaValue(colorMap[packed_pixels & bit_mask]);
+ ;
dst[0] = p;
dst.offset++;
packed_pixels >>= bitsPerPixel;
@@ -105,9 +103,8 @@
}
}
- void colorIndexInverseTransform(int yStart, int yEnd,
- Uint32List inData, int src,
- Uint32List outData, int dst) {
+ void colorIndexInverseTransform(int yStart, int yEnd, Uint32List inData,
+ int src, Uint32List outData, int dst) {
final int bitsPerPixel = 8 >> bits;
final int width = xsize;
Uint32List colorMap = this.data;
@@ -132,17 +129,16 @@
} else {
for (int y = yStart; y < yEnd; ++y) {
for (int x = 0; x < width; ++x) {
- outData[dst++] = _getARGBValue(colorMap[_getARGBIndex(inData[src++])]);
+ outData[dst++] =
+ _getARGBValue(colorMap[_getARGBIndex(inData[src++])]);
}
}
}
}
- /**
- * Color space inverse transform.
- */
- void colorSpaceInverseTransform(int yStart, int yEnd, Uint32List outData,
- int data) {
+ /// Color space inverse transform.
+ void colorSpaceInverseTransform(
+ int yStart, int yEnd, Uint32List outData, int data) {
final int width = xsize;
final int mask = (1 << bits) - 1;
final int tilesPerRow = InternalVP8L.subSampleSize(width, bits);
@@ -165,18 +161,18 @@
++y;
if ((y & mask) == 0) {
- predRow += tilesPerRow;;
+ predRow += tilesPerRow;
+ ;
}
}
}
- /**
- * Inverse prediction.
- */
- void predictorInverseTransform(int yStart, int yEnd, Uint32List outData,
- int data) {
+ /// Inverse prediction.
+ void predictorInverseTransform(
+ int yStart, int yEnd, Uint32List outData, int data) {
final int width = xsize;
- if (yStart == 0) { // First Row follows the L (mode=1) mode.
+ if (yStart == 0) {
+ // First Row follows the L (mode=1) mode.
final int pred0 = _predictor0(outData, outData[data - 1], 0);
_addPixelsEq(outData, data, pred0);
for (int x = 1; x < width; ++x) {
@@ -204,7 +200,8 @@
var predFunc = PREDICTORS[k];
for (int x = 1; x < width; ++x) {
- if ((x & mask) == 0) { // start of tile. Read predictor function.
+ if ((x & mask) == 0) {
+ // start of tile. Read predictor function.
int k = ((this.data[predModeSrc++]) >> 8) & 0xf;
predFunc = PREDICTORS[k];
}
@@ -216,16 +213,15 @@
data += width;
++y;
- if ((y & mask) == 0) { // Use the same mask, since tiles are squares.
+ if ((y & mask) == 0) {
+ // Use the same mask, since tiles are squares.
predModeBase += tilesPerRow;
}
}
}
- /**
- * Add green to blue and red channels (i.e. perform the inverse transform of
- * 'subtract green').
- */
+ /// Add green to blue and red channels (i.e. perform the inverse transform of
+ /// 'subtract green').
void addGreenToBlueAndRed(Uint32List pixels, int data, int dataEnd) {
while (data < dataEnd) {
final int argb = pixels[data];
@@ -253,9 +249,7 @@
return (val >> 8) & 0xff;
}
- /**
- * In-place sum of each component with mod 256.
- */
+ /// In-place sum of each component with mod 256.
static void _addPixelsEq(Uint32List pixels, int a, int b) {
int pa = pixels[a];
final int alphaAndGreen = (pa & 0xff00ff00) + (b & 0xff00ff00);
@@ -275,10 +269,8 @@
return _average2(_average2(a0, a1), _average2(a2, a3));
}
- /**
- * Return 0, when a is a negative integer.
- * Return 255, when a is positive.
- */
+ /// Return 0, when a is a negative integer.
+ /// Return 255, when a is positive.
static int _clip255(int a) {
if (a < 0) {
return 0;
@@ -293,15 +285,12 @@
return _clip255(a + b - c);
}
-
static int _clampedAddSubtractFull(int c0, int c1, int c2) {
final int a = _addSubtractComponentFull(c0 >> 24, c1 >> 24, c2 >> 24);
- final int r = _addSubtractComponentFull((c0 >> 16) & 0xff,
- (c1 >> 16) & 0xff,
- (c2 >> 16) & 0xff);
- final int g = _addSubtractComponentFull((c0 >> 8) & 0xff,
- (c1 >> 8) & 0xff,
- (c2 >> 8) & 0xff);
+ final int r = _addSubtractComponentFull(
+ (c0 >> 16) & 0xff, (c1 >> 16) & 0xff, (c2 >> 16) & 0xff);
+ final int g = _addSubtractComponentFull(
+ (c0 >> 8) & 0xff, (c1 >> 8) & 0xff, (c2 >> 8) & 0xff);
final int b = _addSubtractComponentFull(c0 & 0xff, c1 & 0xff, c2 & 0xff);
return (a << 24) | (r << 16) | (g << 8) | b;
}
@@ -313,9 +302,12 @@
static int _clampedAddSubtractHalf(int c0, int c1, int c2) {
final int avg = _average2(c0, c1);
final int a = _addSubtractComponentHalf(avg >> 24, c2 >> 24);
- final int r = _addSubtractComponentHalf((avg >> 16) & 0xff, (c2 >> 16) & 0xff);
- final int g = _addSubtractComponentHalf((avg >> 8) & 0xff, (c2 >> 8) & 0xff);
- final int b = _addSubtractComponentHalf((avg >> 0) & 0xff, (c2 >> 0) & 0xff);
+ final int r =
+ _addSubtractComponentHalf((avg >> 16) & 0xff, (c2 >> 16) & 0xff);
+ final int g =
+ _addSubtractComponentHalf((avg >> 8) & 0xff, (c2 >> 8) & 0xff);
+ final int b =
+ _addSubtractComponentHalf((avg >> 0) & 0xff, (c2 >> 0) & 0xff);
return (a << 24) | (r << 16) | (g << 8) | b;
}
@@ -326,11 +318,10 @@
}
static int _select(int a, int b, int c) {
- final int pa_minus_pb =
- _sub3((a >> 24) , (b >> 24) , (c >> 24) ) +
+ final int pa_minus_pb = _sub3((a >> 24), (b >> 24), (c >> 24)) +
_sub3((a >> 16) & 0xff, (b >> 16) & 0xff, (c >> 16) & 0xff) +
- _sub3((a >> 8) & 0xff, (b >> 8) & 0xff, (c >> 8) & 0xff) +
- _sub3((a ) & 0xff, (b ) & 0xff, (c ) & 0xff);
+ _sub3((a >> 8) & 0xff, (b >> 8) & 0xff, (c >> 8) & 0xff) +
+ _sub3((a) & 0xff, (b) & 0xff, (c) & 0xff);
return (pa_minus_pb <= 0) ? a : b;
}
@@ -354,7 +345,7 @@
}
static int _predictor4(Uint32List pixels, int left, int top) {
- return pixels[top -1];
+ return pixels[top - 1];
}
static int _predictor5(Uint32List pixels, int left, int top) {
@@ -370,7 +361,7 @@
}
static int _predictor8(Uint32List pixels, int left, int top) {
- return _average2(pixels[top -1], pixels[top]);
+ return _average2(pixels[top - 1], pixels[top]);
}
static int _predictor9(Uint32List pixels, int left, int top) {
@@ -378,7 +369,7 @@
}
static int _predictor10(Uint32List pixels, int left, int top) {
- return _average4(left, pixels[top -1], pixels[top], pixels[top + 1]);
+ return _average4(left, pixels[top - 1], pixels[top], pixels[top + 1]);
}
static int _predictor11(Uint32List pixels, int left, int top) {
@@ -393,16 +384,28 @@
return _clampedAddSubtractHalf(left, pixels[top], pixels[top - 1]);
}
- static final List PREDICTORS = [
- _predictor0, _predictor1, _predictor2, _predictor3,
- _predictor4, _predictor5, _predictor6, _predictor7,
- _predictor8, _predictor9, _predictor10, _predictor11,
- _predictor12, _predictor13,
- _predictor0, _predictor0 ];
+ static final PREDICTORS = [
+ _predictor0,
+ _predictor1,
+ _predictor2,
+ _predictor3,
+ _predictor4,
+ _predictor5,
+ _predictor6,
+ _predictor7,
+ _predictor8,
+ _predictor9,
+ _predictor10,
+ _predictor11,
+ _predictor12,
+ _predictor13,
+ _predictor0,
+ _predictor0
+ ];
}
class _VP8LMultipliers {
- final Uint8List data = Uint8List(3);
+ final data = Uint8List(3);
// Note: the members are uint8_t, so that any negative values are
// automatically converted to "mod 256" values.
@@ -424,16 +427,13 @@
data[2] = 0;
}
- void set colorCode(int colorCode) {
+ set colorCode(int colorCode) {
data[0] = (colorCode >> 0) & 0xff;
data[1] = (colorCode >> 8) & 0xff;
data[2] = (colorCode >> 16) & 0xff;
}
- int get colorCode => 0xff000000 |
- (data[2] << 16) |
- (data[1] << 8) |
- data[0];
+ int get colorCode => 0xff000000 | (data[2] << 16) | (data[1] << 8) | data[0];
int transformColor(int argb, bool inverse) {
final int green = (argb >> 8) & 0xff;
@@ -445,7 +445,8 @@
int g = colorTransformDelta(greenToRed, green);
newRed = (newRed + g) & 0xffffffff;
newRed &= 0xff;
- newBlue = (newBlue + colorTransformDelta(greenToBlue, green)) & 0xffffffff;
+ newBlue =
+ (newBlue + colorTransformDelta(greenToBlue, green)) & 0xffffffff;
newBlue = (newBlue + colorTransformDelta(redToBlue, newRed)) & 0xffffffff;
newBlue &= 0xff;
} else {
@@ -469,4 +470,3 @@
return d >> 5;
}
}
-
diff --git a/image/lib/src/formats/webp/webp_alpha.dart b/image/lib/src/formats/webp/webp_alpha.dart
index 7767232..89182d1 100755
--- a/image/lib/src/formats/webp/webp_alpha.dart
+++ b/image/lib/src/formats/webp/webp_alpha.dart
@@ -55,14 +55,13 @@
return false;
}
- var unfilterFunc = WebPFilters.UNFILTERS[filter];
+ dynamic unfilterFunc = WebPFilters.UNFILTERS[filter];
if (method == ALPHA_NO_COMPRESSION) {
final int offset = row * width;
final int numPixels = numRows * width;
- output.setRange(offset, numPixels, input.buffer,
- input.position + offset);
+ output.setRange(offset, numPixels, input.buffer, input.position + offset);
} else {
if (!_decodeAlphaImageStream(row + numRows, output)) {
return false;
@@ -86,23 +85,26 @@
return true;
}
- bool _dequantizeLevels(Uint8List data, int width, int height,
- int row, int num_rows) {
- if (data == null || width <= 0 || height <= 0 || row < 0 || num_rows < 0 ||
+ bool _dequantizeLevels(
+ Uint8List data, int width, int height, int row, int num_rows) {
+ if (data == null ||
+ width <= 0 ||
+ height <= 0 ||
+ row < 0 ||
+ num_rows < 0 ||
row + num_rows > height) {
return false;
}
return true;
}
-
bool _decodeAlphaImageStream(int lastRow, Uint8List output) {
_vp8l.opaque = output;
// Decode (with special row processing).
- return _use8bDecode ?
- _vp8l.decodeAlphaData(_vp8l.webp.width, _vp8l.webp.height, lastRow) :
- _vp8l.decodeImageData(_vp8l.pixels, _vp8l.webp.width, _vp8l.webp.height,
- lastRow, _vp8l.extractAlphaRows);
+ return _use8bDecode
+ ? _vp8l.decodeAlphaData(_vp8l.webp.width, _vp8l.webp.height, lastRow)
+ : _vp8l.decodeImageData(_vp8l.pixels, _vp8l.webp.width,
+ _vp8l.webp.height, lastRow, _vp8l.extractAlphaRows);
}
bool _decodeAlphaHeader() {
@@ -133,6 +135,7 @@
}
InternalVP8L _vp8l;
+
/// Although alpha channel
/// requires only 1 byte per
/// pixel, sometimes VP8LDecoder may need to allocate
diff --git a/image/lib/src/formats/webp/webp_filters.dart b/image/lib/src/formats/webp/webp_filters.dart
index e16e883..deab4d5 100755
--- a/image/lib/src/formats/webp/webp_filters.dart
+++ b/image/lib/src/formats/webp/webp_filters.dart
@@ -8,60 +8,59 @@
static const int FILTER_HORIZONTAL = 1;
static const int FILTER_VERTICAL = 2;
static const int FILTER_GRADIENT = 3;
- static const int FILTER_LAST = FILTER_GRADIENT + 1; // end marker
+ static const int FILTER_LAST = FILTER_GRADIENT + 1; // end marker
static const int FILTER_BEST = 5;
static const int FILTER_FAST = 6;
- static const List FILTERS = const [
- null, // WEBP_FILTER_NONE
- horizontalFilter, // WEBP_FILTER_HORIZONTAL
- verticalFilter, // WEBP_FILTER_VERTICAL
- gradientFilter // WEBP_FILTER_GRADIENT
+ static const FILTERS = [
+ null, // WEBP_FILTER_NONE
+ horizontalFilter, // WEBP_FILTER_HORIZONTAL
+ verticalFilter, // WEBP_FILTER_VERTICAL
+ gradientFilter // WEBP_FILTER_GRADIENT
];
-
- static const List UNFILTERS = const [
- null, // WEBP_FILTER_NONE
- horizontalUnfilter, // WEBP_FILTER_HORIZONTAL
- verticalUnfilter, // WEBP_FILTER_VERTICAL
- gradientUnfilter // WEBP_FILTER_GRADIENT
+ static const UNFILTERS = [
+ null, // WEBP_FILTER_NONE
+ horizontalUnfilter, // WEBP_FILTER_HORIZONTAL
+ verticalUnfilter, // WEBP_FILTER_VERTICAL
+ gradientUnfilter // WEBP_FILTER_GRADIENT
];
static void horizontalFilter(Uint8List data, int width, int height,
- int stride, Uint8List filteredData) {
- _doHorizontalFilter(data, width, height, stride, 0, height, false,
- filteredData);
+ int stride, Uint8List filteredData) {
+ _doHorizontalFilter(
+ data, width, height, stride, 0, height, false, filteredData);
}
- static void horizontalUnfilter(int width, int height, int stride, int row,
- int numRows, Uint8List data) {
+ static void horizontalUnfilter(
+ int width, int height, int stride, int row, int numRows, Uint8List data) {
_doHorizontalFilter(data, width, height, stride, row, numRows, true, data);
}
- static void verticalFilter(Uint8List data, int width, int height,
- int stride, Uint8List filteredData) {
- _doVerticalFilter(data, width, height, stride, 0, height, false,
- filteredData);
+ static void verticalFilter(Uint8List data, int width, int height, int stride,
+ Uint8List filteredData) {
+ _doVerticalFilter(
+ data, width, height, stride, 0, height, false, filteredData);
}
static void verticalUnfilter(int width, int height, int stride, int row,
- int num_rows, Uint8List data) {
+ int num_rows, Uint8List data) {
_doVerticalFilter(data, width, height, stride, row, num_rows, true, data);
}
- static void gradientFilter(Uint8List data, int width, int height,
- int stride, Uint8List filteredData) {
- _doGradientFilter(data, width, height, stride, 0, height, false,
- filteredData);
+ static void gradientFilter(Uint8List data, int width, int height, int stride,
+ Uint8List filteredData) {
+ _doGradientFilter(
+ data, width, height, stride, 0, height, false, filteredData);
}
static void gradientUnfilter(int width, int height, int stride, int row,
- int num_rows, Uint8List data) {
+ int num_rows, Uint8List data) {
_doGradientFilter(data, width, height, stride, row, num_rows, true, data);
}
- static void _predictLine(InputBuffer src, InputBuffer pred, InputBuffer dst, int length,
- bool inverse) {
+ static void _predictLine(InputBuffer src, InputBuffer pred, InputBuffer dst,
+ int length, bool inverse) {
if (inverse) {
for (int i = 0; i < length; ++i) {
dst[i] = src[i] + pred[i];
@@ -73,10 +72,8 @@
}
}
- static void _doHorizontalFilter(Uint8List src,
- int width, int height, int stride,
- int row, int numRows,
- bool inverse, Uint8List out) {
+ static void _doHorizontalFilter(Uint8List src, int width, int height,
+ int stride, int row, int numRows, bool inverse, Uint8List out) {
final int startOffset = row * stride;
final int lastRow = row + numRows;
InputBuffer s = InputBuffer(src, offset: startOffset);
@@ -87,7 +84,7 @@
// Leftmost pixel is the same as input for topmost scanline.
o[0] = s[0];
_predictLine(new InputBuffer.from(s, offset: 1), preds,
- new InputBuffer.from(o, offset: 1), width - 1, inverse);
+ new InputBuffer.from(o, offset: 1), width - 1, inverse);
row = 1;
preds.offset += stride;
s.offset += stride;
@@ -97,9 +94,10 @@
// Filter line-by-line.
while (row < lastRow) {
// Leftmost pixel is predicted from above.
- _predictLine(s, new InputBuffer.from(preds, offset: -stride), o, 1, inverse);
+ _predictLine(
+ s, new InputBuffer.from(preds, offset: -stride), o, 1, inverse);
_predictLine(new InputBuffer.from(s, offset: 1), preds,
- new InputBuffer.from(o, offset: 1), width - 1, inverse);
+ new InputBuffer.from(o, offset: 1), width - 1, inverse);
++row;
preds.offset += stride;
s.offset += stride;
@@ -107,10 +105,8 @@
}
}
- static void _doVerticalFilter(Uint8List src,
- int width, int height, int stride,
- int row, int numRows,
- bool inverse, Uint8List out) {
+ static void _doVerticalFilter(Uint8List src, int width, int height,
+ int stride, int row, int numRows, bool inverse, Uint8List out) {
final int startOffset = row * stride;
final int last_row = row + numRows;
InputBuffer s = InputBuffer(src, offset: startOffset);
@@ -122,8 +118,7 @@
o[0] = s[0];
// Rest of top scan-line is left-predicted.
_predictLine(new InputBuffer.from(s, offset: 1), preds,
- new InputBuffer.from(o, offset: 1), width - 1,
- inverse);
+ new InputBuffer.from(o, offset: 1), width - 1, inverse);
row = 1;
s.offset += stride;
o.offset += stride;
@@ -144,13 +139,11 @@
static int _gradientPredictor(int a, int b, int c) {
final int g = a + b - c;
- return ((g & ~0xff) == 0) ? g : (g < 0) ? 0 : 255; // clip to 8bit
+ return ((g & ~0xff) == 0) ? g : (g < 0) ? 0 : 255; // clip to 8bit
}
- static void _doGradientFilter(Uint8List src,
- int width, int height, int stride,
- int row, int numRows,
- bool inverse, Uint8List out) {
+ static void _doGradientFilter(Uint8List src, int width, int height,
+ int stride, int row, int numRows, bool inverse, Uint8List out) {
final int startOffset = row * stride;
final int lastRow = row + numRows;
InputBuffer s = InputBuffer(src, offset: startOffset);
@@ -161,7 +154,7 @@
if (row == 0) {
o[0] = s[0];
_predictLine(new InputBuffer.from(s, offset: 1), preds,
- new InputBuffer.from(o, offset: 1), width - 1, inverse);
+ new InputBuffer.from(o, offset: 1), width - 1, inverse);
row = 1;
preds.offset += stride;
s.offset += stride;
@@ -171,12 +164,11 @@
// Filter line-by-line.
while (row < lastRow) {
// leftmost pixel: predict from above.
- _predictLine(s, new InputBuffer.from(preds, offset: -stride),
- o, 1, inverse);
+ _predictLine(
+ s, new InputBuffer.from(preds, offset: -stride), o, 1, inverse);
for (int w = 1; w < width; ++w) {
- final int pred = _gradientPredictor(preds[w - 1],
- preds[w - stride],
- preds[w - stride - 1]);
+ final int pred = _gradientPredictor(
+ preds[w - 1], preds[w - stride], preds[w - stride - 1]);
o[w] = s[w] + (inverse ? pred : -pred);
}
++row;
diff --git a/image/lib/src/formats/webp/webp_frame.dart b/image/lib/src/formats/webp/webp_frame.dart
index ab1dd9e..7f3c327 100755
--- a/image/lib/src/formats/webp/webp_frame.dart
+++ b/image/lib/src/formats/webp/webp_frame.dart
@@ -1,20 +1,23 @@
import '../../internal/internal.dart';
import '../../util/input_buffer.dart';
-/**
- * Decodes a frame from a WebP animation.
- */
+/// Decodes a frame from a WebP animation.
class WebPFrame {
/// The x coordinate of the upper left corner of the frame.
int x;
+
/// The y coordinate of the upper left corner of the frame.
int y;
+
/// The width of the frame.
int width;
+
/// The height of the frame.
int height;
+
/// How long the frame should be displayed, in milliseconds.
int duration;
+
/// Indicates how the current frame is to be treated after it has been
/// displayed (before rendering the next frame) on the canvas.
/// If true, the frame is cleared to the background color. If false,
diff --git a/image/lib/src/formats/webp/webp_huffman.dart b/image/lib/src/formats/webp/webp_huffman.dart
index 7ae311f..1ad9dbd 100755
--- a/image/lib/src/formats/webp/webp_huffman.dart
+++ b/image/lib/src/formats/webp/webp_huffman.dart
@@ -4,9 +4,7 @@
import 'vp8l.dart';
import 'vp8l_bit_reader.dart';
-/**
- * Huffman Tree.
- */
+/// Huffman Tree.
@internal
class HuffmanTree {
static const int HUFF_LUT_BITS = 7;
@@ -19,8 +17,10 @@
/// all the nodes, starting at root, stored as a single int array, where
/// each node occupies two ints as [symbol, children].
Int32List tree;
+
/// max number of nodes
int maxNodes = 0;
+
/// number of currently occupied nodes
int numNodes = 0;
@@ -92,11 +92,8 @@
return _isFull();
}
- bool buildExplicit(List<int> codeLengths,
- List<int> codes,
- List<int> symbols,
- int maxSymbol,
- int numSymbols) {
+ bool buildExplicit(List<int> codeLengths, List<int> codes, List<int> symbols,
+ int maxSymbol, int numSymbols) {
// Initialize the tree. Will fail if num_symbols = 0.
if (!_init(numSymbols)) {
return false;
@@ -118,11 +115,9 @@
return _isFull();
}
- /**
- * Decodes the next Huffman code from bit-stream.
- * input.fillBitWindow() needs to be called at minimum every second call
- * to ReadSymbol, in order to pre-fetch enough bits.
- */
+ /// Decodes the next Huffman code from bit-stream.
+ /// input.fillBitWindow() needs to be called at minimum every second call
+ /// to ReadSymbol, in order to pre-fetch enough bits.
int readSymbol(VP8LBitReader br) {
int node = 0;
int bits = br.prefetchBits();
@@ -165,8 +160,8 @@
lutBits[idx] = codeLength;
}
} else {
- baseCode = _reverseBitsShort((code >> (codeLength - HUFF_LUT_BITS)),
- HUFF_LUT_BITS);
+ baseCode = _reverseBitsShort(
+ (code >> (codeLength - HUFF_LUT_BITS)), HUFF_LUT_BITS);
}
while (codeLength-- > 0) {
@@ -209,8 +204,23 @@
// Pre-reversed 4-bit values.
static const List<int> _REVERSED_BITS = const [
- 0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe,
- 0x1, 0x9, 0x5, 0xd, 0x3, 0xb, 0x7, 0xf];
+ 0x0,
+ 0x8,
+ 0x4,
+ 0xc,
+ 0x2,
+ 0xa,
+ 0x6,
+ 0xe,
+ 0x1,
+ 0x9,
+ 0x5,
+ 0xd,
+ 0x3,
+ 0xb,
+ 0x7,
+ 0xf
+ ];
int _reverseBitsShort(int bits, int numBits) {
int v = (_REVERSED_BITS[bits & 0xf] << 4) | _REVERSED_BITS[bits >> 4];
@@ -251,15 +261,13 @@
_nodeSetChildren(children + 1, -1);
}
- bool _huffmanCodeLengthsToCodes(List<int> codeLengths, int codeLengthsSize,
- List<int> huffCodes) {
+ bool _huffmanCodeLengthsToCodes(
+ List<int> codeLengths, int codeLengthsSize, List<int> huffCodes) {
int symbol;
int codeLen;
- Int32List codeLengthHist =
- new Int32List(VP8L.MAX_ALLOWED_CODE_LENGTH + 1);
+ Int32List codeLengthHist = new Int32List(VP8L.MAX_ALLOWED_CODE_LENGTH + 1);
int currCode;
- Int32List nextCodes =
- new Int32List(VP8L.MAX_ALLOWED_CODE_LENGTH + 1);
+ Int32List nextCodes = new Int32List(VP8L.MAX_ALLOWED_CODE_LENGTH + 1);
int maxCodeLength = 0;
// Calculate max code length.
@@ -305,9 +313,7 @@
}
}
-/**
- * A group of huffman trees.
- */
+/// A group of huffman trees.
@internal
class HTreeGroup {
final List<HuffmanTree> htrees =
@@ -319,7 +325,7 @@
}
}
- HuffmanTree operator[](int index) {
+ HuffmanTree operator [](int index) {
if (htrees[index] == null) {
htrees[index] = HuffmanTree();
}
diff --git a/image/lib/src/formats/webp/webp_info.dart b/image/lib/src/formats/webp/webp_info.dart
index f8b9305..df19c0c 100755
--- a/image/lib/src/formats/webp/webp_info.dart
+++ b/image/lib/src/formats/webp/webp_info.dart
@@ -3,9 +3,7 @@
import '../decode_info.dart';
import 'webp_frame.dart';
-/**
- * Features gathered from the bitstream
- */
+/// Features gathered from the bitstream
class WebPInfo extends DecodeInfo {
// enum Format
static const int FORMAT_UNDEFINED = 0;
@@ -15,18 +13,25 @@
/// True if the bitstream contains an alpha channel.
bool hasAlpha = false;
+
/// True if the bitstream is an animation.
bool hasAnimation = false;
+
/// 0 = undefined (/mixed), 1 = lossy, 2 = lossless, 3 = animated
int format = FORMAT_UNDEFINED;
+
/// ICCP data string.
String iccp = '';
+
/// EXIF data string.
String exif = '';
+
/// XMP data string.
String xmp = '';
+
/// How many times the animation should loop.
int animLoopCount = 0;
+
/// Information about each animation frame.
List<WebPFrame> frames = [];
diff --git a/image/lib/src/formats/webp_decoder.dart b/image/lib/src/formats/webp_decoder.dart
index 672928c..a1fd78c 100755
--- a/image/lib/src/formats/webp_decoder.dart
+++ b/image/lib/src/formats/webp_decoder.dart
@@ -9,10 +9,8 @@
import 'webp/webp_frame.dart';
import 'webp/webp_info.dart';
-/**
- * Decode a WebP formatted image. This supports lossless (vp8l), lossy (vp8),
- * lossy+alpha, and animated WebP images.
- */
+/// Decode a WebP formatted image. This supports lossless (vp8l), lossy (vp8),
+/// lossy+alpha, and animated WebP images.
class WebPDecoder extends Decoder {
InternalWebPInfo _info;
@@ -24,9 +22,7 @@
WebPInfo get info => _info;
- /**
- * Is the given file a valid WebP image?
- */
+ /// Is the given file a valid WebP image?
bool isValidFile(List<int> bytes) {
_input = InputBuffer(bytes);
if (!_getHeader(_input)) {
@@ -35,18 +31,14 @@
return true;
}
- /**
- * How many frames are available to decode?
- *
- * You should have prepared the decoder by either passing the file bytes
- * to the constructor, or calling getInfo.
- */
+ /// How many frames are available to decode?
+ ///
+ /// You should have prepared the decoder by either passing the file bytes
+ /// to the constructor, or calling getInfo.
int numFrames() => (_info != null) ? _info.numFrames : 0;
- /**
- * Validate the file is a WebP image and get information about it.
- * If the file is not a valid WebP image, null is returned.
- */
+ /// Validate the file is a WebP image and get information about it.
+ /// If the file is not a valid WebP image, null is returned.
WebPInfo startDecode(List<int> bytes) {
_input = InputBuffer(bytes);
@@ -91,44 +83,40 @@
return null;
}
- InternalWebPFrame f = _info.frames[frame];
- InputBuffer frameData = _input.subset(f.frameSize,
- position: f.framePosition);
+ InternalWebPFrame f = _info.frames[frame] as InternalWebPFrame;
+ InputBuffer frameData =
+ _input.subset(f.frameSize, position: f.framePosition);
return _decodeFrame(frameData, frame: frame);
}
if (_info.format == WebPInfo.FORMAT_LOSSLESS) {
- InputBuffer data = _input.subset(_info.vp8Size,
- position: _info.vp8Position);
+ InputBuffer data =
+ _input.subset(_info.vp8Size, position: _info.vp8Position);
return new VP8L(data, _info).decode();
} else if (_info.format == WebPInfo.FORMAT_LOSSY) {
- InputBuffer data = _input.subset(_info.vp8Size,
- position: _info.vp8Position);
+ InputBuffer data =
+ _input.subset(_info.vp8Size, position: _info.vp8Position);
return new VP8(data, _info).decode();
}
return null;
}
- /**
- * Decode a WebP formatted file stored in [bytes] into an Image.
- * If it's not a valid webp file, null is returned.
- * If the webp file stores animated frames, only the first image will
- * be returned. Use [decodeAnimation] to decode the full animation.
- */
- Image decodeImage(List<int> bytes, {int frame: 0}) {
+ /// Decode a WebP formatted file stored in [bytes] into an Image.
+ /// If it's not a valid webp file, null is returned.
+ /// If the webp file stores animated frames, only the first image will
+ /// be returned. Use [decodeAnimation] to decode the full animation.
+ Image decodeImage(List<int> bytes, {int frame = 0}) {
startDecode(bytes);
_info.frame = 0;
_info.numFrames = 1;
return decodeFrame(frame);
}
- /**
- * Decode all of the frames of an animated webp. For single image webps,
- * this will return an animation with a single frame.
- */
-Animation decodeAnimation(List<int> bytes) {
+ /// Decode all of the frames of an animated webp. For single image webps,
+ /// this will return an animation with a single frame.
+ Animation decodeAnimation(List<int> bytes) {
if (startDecode(bytes) == null) {
return null;
}
@@ -180,8 +168,7 @@
return anim;
}
-
- Image _decodeFrame(InputBuffer input, {int frame: 0}) {
+ Image _decodeFrame(InputBuffer input, {int frame = 0}) {
InternalWebPInfo webp = InternalWebPInfo();
if (!_getInfo(input, webp)) {
return null;
@@ -198,14 +185,13 @@
if (frame >= webp.frames.length || frame < 0) {
return null;
}
- InternalWebPFrame f = webp.frames[frame];
- InputBuffer frameData = input.subset(f.frameSize,
- position: f.framePosition);
+ InternalWebPFrame f = webp.frames[frame] as InternalWebPFrame;
+ InputBuffer frameData =
+ input.subset(f.frameSize, position: f.framePosition);
return _decodeFrame(frameData, frame: frame);
} else {
- InputBuffer data = input.subset(webp.vp8Size,
- position: webp.vp8Position);
+ InputBuffer data = input.subset(webp.vp8Size, position: webp.vp8Position);
if (webp.format == WebPInfo.FORMAT_LOSSLESS) {
return new VP8L(data, webp).decode();
} else if (webp.format == WebPInfo.FORMAT_LOSSY) {
@@ -261,8 +247,8 @@
found = true;
break;
case 'ALPH':
- webp.alphaData = InputBuffer(input.buffer,
- bigEndian: input.bigEndian);
+ webp.alphaData =
+ InputBuffer(input.buffer, bigEndian: input.bigEndian);
webp.alphaData.offset = input.offset;
webp.alphaSize = size;
input.skip(diskSize);
diff --git a/image/lib/src/formats/webp_encoder.dart b/image/lib/src/formats/webp_encoder.dart
index 5f4f8af..a38f9f2 100755
--- a/image/lib/src/formats/webp_encoder.dart
+++ b/image/lib/src/formats/webp_encoder.dart
@@ -5,9 +5,7 @@
import '../util/output_buffer.dart';
import 'encoder.dart';
-/**
- * Encode an image to the PNG format.
- */
+/// Encode an image to the PNG format.
class WebPEncoder extends Encoder {
static const int LOSSLESS = 0;
static const int LOSSY = 1;
@@ -15,19 +13,14 @@
int format;
num quality;
- /**
- * [format] can be [LOSSY] or [LOSSLESS].
- * [quality] is controls lossy compression, in the range
- * 0 (smallest file) and 100 (biggest).
- */
- WebPEncoder({this.format: LOSSY,
- this.quality: 100});
+ /// [format] can be [LOSSY] or [LOSSLESS].
+ /// [quality] is controls lossy compression, in the range
+ /// 0 (smallest file) and 100 (biggest).
+ WebPEncoder({this.format = LOSSY, this.quality = 100});
- /**
- * Add a frame to be encoded. Call [finish] to encode the added frames.
- * If only one frame is added, a single-image WebP is encoded; otherwise
- * if there are more than one frame, a multi-frame animated WebP is encoded.
- */
+ /// Add a frame to be encoded. Call [finish] to encode the added frames.
+ /// If only one frame is added, a single-image WebP is encoded; otherwise
+ /// if there are more than one frame, a multi-frame animated WebP is encoded.
void addFrame(Image image, {int duration}) {
if (output == null) {
output = OutputBuffer();
@@ -55,9 +48,7 @@
_lastImage = _encodeImage(image);
}
- /**
- * Encode the images that were added with [addFrame].
- */
+ /// Encode the images that were added with [addFrame].
List<int> finish() {
List<int> bytes;
if (output == null) {
@@ -83,22 +74,16 @@
return bytes;
}
- /**
- * Encode a single frame image.
- */
+ /// Encode a single frame image.
List<int> encodeImage(Image image) {
addFrame(image);
return finish();
}
- /**
- * Does this encoder support animation?
- */
+ /// Does this encoder support animation?
bool get supportsAnimation => true;
- /**
- * Encode an animation.
- */
+ /// Encode an animation.
List<int> encodeAnimation(Animation anim) {
for (Image f in anim) {
addFrame(f, duration: f.duration);
@@ -110,12 +95,9 @@
return null;
}
- void _writeHeader(int width, int height) {
+ void _writeHeader(int width, int height) {}
- }
-
- void _addImage(Uint8List image, int width, int height) {
- }
+ void _addImage(Uint8List image, int width, int height) {}
OutputBuffer output;
int delay;
diff --git a/image/lib/src/hdr/half.dart b/image/lib/src/hdr/half.dart
index 36b7b85..c0138d8 100755
--- a/image/lib/src/hdr/half.dart
+++ b/image/lib/src/hdr/half.dart
@@ -2,14 +2,12 @@
import '../internal/bit_operators.dart';
-/**
- * A 16-bit floating-point number, used by high-dynamic-range image formats
- * as a more efficient storage for floating-point values that don't require
- * full 32-bit precision. A list of Half floats can be stored in a [Uint16List],
- * and converted to a double using the [HalfToDouble] static method.
- *
- * This class is derived from the OpenEXR library.
- */
+/// A 16-bit floating-point number, used by high-dynamic-range image formats
+/// as a more efficient storage for floating-point values that don't require
+/// full 32-bit precision. A list of Half floats can be stored in a [Uint16List],
+/// and converted to a double using the [HalfToDouble] static method.
+///
+/// This class is derived from the OpenEXR library.
class Half {
Half([num f]) {
if (f != null) {
@@ -17,8 +15,7 @@
}
}
- Half.fromBits(int bits) :
- _h = bits {
+ Half.fromBits(int bits) : _h = bits {
if (_toFloatFloat32 == null) {
_initialize();
}
@@ -31,12 +28,12 @@
return _toFloatFloat32[bits];
}
- static int DoubleToHalf(num f) {
+ static int DoubleToHalf(num n) {
if (_toFloatFloat32 == null) {
_initialize();
}
- f = f.toDouble();
+ double f = n.toDouble();
int x_i = float32ToUint32(f);
if (f == 0.0) {
// Common special case - zero.
@@ -74,38 +71,34 @@
double toDouble() => _toFloatFloat32[_h];
- /**
- * Unary minus
- */
- Half operator-() => new Half.fromBits(_h ^ 0x8000);
+ /// Unary minus
+ Half operator -() => new Half.fromBits(_h ^ 0x8000);
- /**
- * Addition operator for Half or num left operands.
- */
- Half operator+(f) {
- return new Half(toDouble() + f.toDouble());
+ /// Addition operator for Half or num left operands.
+ Half operator +(dynamic f) {
+ double d = (f is Half) ? f.toDouble() : (f is num) ? f.toDouble() : 0;
+ return new Half(toDouble() + d);
}
- /**
- * Subtraction operator for Half or num left operands.
- */
- Half operator-(f) {
- return new Half(toDouble() - f.toDouble());
+ /// Subtraction operator for Half or num left operands.
+ Half operator -(dynamic f) {
+ double d = (f is Half) ? f.toDouble() : (f is num) ? f.toDouble() : 0;
+ return new Half(toDouble() - d.toDouble());
}
- Half operator*(f) {
- return new Half(toDouble() * f.toDouble());
+ Half operator *(dynamic f) {
+ double d = (f is Half) ? f.toDouble() : (f is num) ? f.toDouble() : 0;
+ return new Half(toDouble() * d.toDouble());
}
- Half operator/(f) {
- return new Half(toDouble() / f.toDouble());
+ Half operator /(dynamic f) {
+ double d = (f is Half) ? f.toDouble() : (f is num) ? f.toDouble() : 0;
+ return new Half(toDouble() / d.toDouble());
}
- /**
- * Round to n-bit precision (n should be between 0 and 10).
- * After rounding, the significand's 10-n least significant
- * bits will be zero.
- */
+ /// Round to n-bit precision (n should be between 0 and 10).
+ /// After rounding, the significand's 10-n least significant
+ /// bits will be zero.
Half round(int n) {
if (n >= 10) {
return this;
@@ -122,7 +115,7 @@
// up causes the significand to overflow.
e >>= 9 - n;
- e += e & 1;
+ e += e & 1;
e <<= 9 - n;
// Check for exponent overflow.
@@ -138,81 +131,59 @@
return new Half.fromBits(s | e);
}
- /**
- * Returns true if h is a normalized number, a denormalized number or zero.
- */
+ /// Returns true if h is a normalized number, a denormalized number or zero.
bool isFinite() {
int e = (_h >> 10) & 0x001f;
return e < 31;
}
- /**
- * Returns true if h is a normalized number.
- */
+ /// Returns true if h is a normalized number.
bool isNormalized() {
int e = (_h >> 10) & 0x001f;
return e > 0 && e < 31;
}
- /**
- * Returns true if h is a denormalized number.
- */
+ /// Returns true if h is a denormalized number.
bool isDenormalized() {
int e = (_h >> 10) & 0x001f;
- int m = _h & 0x3ff;
+ int m = _h & 0x3ff;
return e == 0 && m != 0;
}
- /**
- * Returns true if h is zero.
- */
+ /// Returns true if h is zero.
bool isZero() {
return (_h & 0x7fff) == 0;
}
- /**
- * Returns true if h is a NAN.
- */
+ /// Returns true if h is a NAN.
bool isNan() {
int e = (_h >> 10) & 0x001f;
- int m = _h & 0x3ff;
+ int m = _h & 0x3ff;
return e == 31 && m != 0;
}
- /**
- * Returns true if h is a positive or a negative infinity.
- */
+ /// Returns true if h is a positive or a negative infinity.
bool isInfinity() {
int e = (_h >> 10) & 0x001f;
- int m = _h & 0x3ff;
+ int m = _h & 0x3ff;
return e == 31 && m == 0;
}
- /**
- * Returns true if the sign bit of h is set (negative).
- */
+ /// Returns true if the sign bit of h is set (negative).
bool isNegative() {
return (_h & 0x8000) != 0;
}
- /**
- * Returns +infinity.
- */
+ /// Returns +infinity.
static Half posInf() => new Half.fromBits(0x7c00);
- /**
- * Returns -infinity.
- */
+ /// Returns -infinity.
static Half negInf() => new Half.fromBits(0xfc00);
- /**
- * Returns a NAN with the bit pattern 0111111111111111.
- */
+ /// Returns a NAN with the bit pattern 0111111111111111.
static Half qNan() => new Half.fromBits(0x7fff);
- /**
- * Returns a NAN with the bit pattern 0111110111111111.
- */
+ /// Returns a NAN with the bit pattern 0111110111111111.
static Half sNan() => new Half.fromBits(0x7dff);
int bits() => _h;
@@ -229,9 +200,9 @@
// resulting half number.
// Adjust e, accounting for the different exponent bias
// of float and half (127 versus 15).
- int s = (i >> 16) & 0x00008000;
+ int s = (i >> 16) & 0x00008000;
int e = ((i >> 23) & 0x000000ff) - (127 - 15);
- int m = i & 0x007fffff;
+ int m = i & 0x007fffff;
// Now reassemble s, e and m into a half:
if (e <= 0) {
@@ -294,14 +265,14 @@
m = m + 0x00000fff + ((m >> 13) & 1);
if (m & 0x00800000 != 0) {
- m = 0; // overflow in significand,
- e += 1; // adjust exponent
+ m = 0; // overflow in significand,
+ e += 1; // adjust exponent
}
// Handle exponent overflow
if (e > 30) {
- return s | 0x7c00; // if this returns, the half becomes an
+ return s | 0x7c00; // if this returns, the half becomes an
} // infinity with the same sign as f.
// Assemble the half from s, e and m.
@@ -323,11 +294,11 @@
if (e <= 0 || e >= 30) {
// Special case
- _eLut[i] = 0;
+ _eLut[i] = 0;
_eLut[i | 0x100] = 0;
} else {
// Common case - normalized half, no exponent overflow possible
- _eLut[i] = (e << 10);
+ _eLut[i] = (e << 10);
_eLut[i | 0x100] = ((e << 10) | 0x8000);
}
}
@@ -342,7 +313,7 @@
static int _halfToFloat(int y) {
int s = (y >> 15) & 0x00000001;
int e = (y >> 10) & 0x0000001f;
- int m = y & 0x000003ff;
+ int m = y & 0x000003ff;
if (e == 0) {
if (m == 0) {
@@ -352,7 +323,7 @@
// Denormalized number -- renormalize it
while ((m & 0x00000400) == 0) {
m <<= 1;
- e -= 1;
+ e -= 1;
}
e += 1;
diff --git a/image/lib/src/hdr/hdr_bloom.dart b/image/lib/src/hdr/hdr_bloom.dart
index 8580117..1b8bd5d 100755
--- a/image/lib/src/hdr/hdr_bloom.dart
+++ b/image/lib/src/hdr/hdr_bloom.dart
@@ -1,25 +1,23 @@
-import 'dart:math' as Math;
+import 'dart:math';
import 'dart:typed_data';
import 'hdr_image.dart';
-/**
- * Applies an HDR bloom filter to the image, in-place.
- */
-HdrImage hdrBloom(HdrImage hdr, {double radius: 0.01, double weight: 0.1}) {
+/// Applies an HDR bloom filter to the image, in-place.
+HdrImage hdrBloom(HdrImage hdr, {double radius = 0.01, double weight = 0.1}) {
double _lerp(double t, double a, double b) => (1.0 - t) * a + t * b;
//int nPix = xResolution * yResolution;
// Possibly apply bloom effect to image
if (radius > 0.0 && weight > 0.0) {
// Compute image-space extent of bloom effect
- int bloomSupport = (radius * Math.max(hdr.width, hdr.height)).ceil();
+ int bloomSupport = (radius * max(hdr.width, hdr.height)).ceil();
int bloomWidth = bloomSupport ~/ 2;
// Initialize bloom filter table
Float32List bloomFilter = Float32List(bloomWidth * bloomWidth);
for (int i = 0; i < bloomWidth * bloomWidth; ++i) {
- double dist = Math.sqrt(i / bloomWidth);
- bloomFilter[i] = Math.pow(Math.max(0.0, 1.0 - dist), 4.0);
+ double dist = sqrt(i / bloomWidth);
+ bloomFilter[i] = pow(max(0.0, 1.0 - dist), 4.0).toDouble();
}
// Apply bloom filter to image pixels
@@ -28,10 +26,10 @@
for (int x = 0; x < hdr.width; ++x, ++offset) {
// Compute bloom for pixel _(x,y)_
// Compute extent of pixels contributing bloom
- int x0 = Math.max(0, x - bloomWidth);
- int x1 = Math.min(x + bloomWidth, hdr.width - 1);
- int y0 = Math.max(0, y - bloomWidth);
- int y1 = Math.min(y + bloomWidth, hdr.height - 1);
+ int x0 = max(0, x - bloomWidth);
+ int x1 = min(x + bloomWidth, hdr.width - 1);
+ int y0 = max(0, y - bloomWidth);
+ int y1 = min(y + bloomWidth, hdr.height - 1);
double sumWt = 0.0;
for (int by = y0; by <= y1; ++by) {
@@ -66,8 +64,10 @@
for (int y = 0, offset = 0; y < hdr.height; ++y) {
for (int x = 0; x < hdr.width; ++x, offset += 3) {
hdr.setRed(x, y, _lerp(weight, hdr.getRed(x, y), bloomImage[offset]));
- hdr.setGreen(x, y, _lerp(weight, hdr.getGreen(x, y), bloomImage[offset + 1]));
- hdr.setBlue(x, y, _lerp(weight, hdr.getBlue(x, y), bloomImage[offset + 2]));
+ hdr.setGreen(
+ x, y, _lerp(weight, hdr.getGreen(x, y), bloomImage[offset + 1]));
+ hdr.setBlue(
+ x, y, _lerp(weight, hdr.getBlue(x, y), bloomImage[offset + 2]));
}
}
}
diff --git a/image/lib/src/hdr/hdr_gamma.dart b/image/lib/src/hdr/hdr_gamma.dart
index caa92d3..3439b21 100755
--- a/image/lib/src/hdr/hdr_gamma.dart
+++ b/image/lib/src/hdr/hdr_gamma.dart
@@ -1,16 +1,14 @@
-import 'dart:math' as Math;
+import 'dart:math';
import 'hdr_image.dart';
-/**
- * Apply gamma scaling to the HDR image, in-place.
- */
-HdrImage hdrGamma(HdrImage hdr, {double gamma: 2.2}) {
+/// Apply gamma scaling to the HDR image, in-place.
+HdrImage hdrGamma(HdrImage hdr, {double gamma = 2.2}) {
for (int y = 0; y < hdr.height; ++y) {
for (int x = 0; x < hdr.width; ++x) {
- double r = Math.pow(hdr.getRed(x, y), 1.0 / gamma);
- double g = Math.pow(hdr.getGreen(x, y), 1.0 / gamma);
- double b = Math.pow(hdr.getBlue(x, y), 1.0 / gamma);
+ var r = pow(hdr.getRed(x, y), 1.0 / gamma);
+ var g = pow(hdr.getGreen(x, y), 1.0 / gamma);
+ var b = pow(hdr.getBlue(x, y), 1.0 / gamma);
hdr.setRed(x, y, r);
hdr.setGreen(x, y, g);
diff --git a/image/lib/src/hdr/hdr_image.dart b/image/lib/src/hdr/hdr_image.dart
index d95299c..2cc4df0 100755
--- a/image/lib/src/hdr/hdr_image.dart
+++ b/image/lib/src/hdr/hdr_image.dart
@@ -3,10 +3,8 @@
import '../image.dart';
import 'hdr_slice.dart';
-/**
- * A high dynamic range RGBA image stored in 16-bit or 32-bit floating-point
- * channels.
- */
+/// A high dynamic range RGBA image stored in 16-bit or 32-bit floating-point
+/// channels.
class HdrImage {
static const int HALF = 1;
static const int FLOAT = 2;
@@ -14,14 +12,19 @@
/// Red value of a sample
static const String R = 'R';
+
/// Green value of a sample
static const String G = 'G';
+
/// Blue value of a sample
static const String B = 'B';
+
/// Alpha/opacity
static const String A = 'A';
+
/// Distance of the front of a sample from the viewer
static const String Z = 'Z';
+
/// A numerical identifier for the object represented by a sample.
static const String ID = 'id';
@@ -32,12 +35,9 @@
HdrSlice alpha;
HdrSlice depth;
- HdrImage() {
- }
+ HdrImage();
- /**
- * Create an RGB[A] image.
- */
+ /// Create an RGB[A] image.
HdrImage.create(int width, int height, int channels, int format) {
if (channels < 0 || channels > 4) {
return;
@@ -52,9 +52,7 @@
}
}
- /**
- * Create a copy of the [other] HdrImage.
- */
+ /// Create a copy of the [other] HdrImage.
HdrImage.from(HdrImage other) {
for (String ch in other.slices.keys) {
HdrSlice slice = other.slices[ch];
@@ -62,10 +60,8 @@
}
}
- /**
- * Create an HDR image from a LDR [Image] by transforming the channel values
- * to the range [0, 1].
- */
+ /// Create an HDR image from a LDR [Image] by transforming the channel values
+ /// to the range [0, 1].
HdrImage.fromImage(Image other) {
addSlice(new HdrSlice(R, other.width, other.height, HALF));
addSlice(new HdrSlice(G, other.width, other.height, HALF));
@@ -86,42 +82,28 @@
}
}
- /**
- * Does the image have any color channels?
- */
+ /// Does the image have any color channels?
bool get hasColor => red != null || green != null || blue != null;
- /**
- * Does the image have an alpha channel?
- */
+ /// Does the image have an alpha channel?
bool get hasAlpha => alpha != null;
- /**
- * Does the image have a depth channel?
- */
+ /// Does the image have a depth channel?
bool get hasDepth => depth != null;
- /**
- * The width of the framebuffer.
- */
+ /// The width of the framebuffer.
int get width => slices.isEmpty ? 0 : slices.values.first.width;
- /**
- * The height of the framebuffer.
- */
+ /// The height of the framebuffer.
int get height => slices.isEmpty ? 0 : slices.values.first.height;
- /**
- * Get the value of the red channel at the given pixel coordinates [x], [y].
- */
+ /// Get the value of the red channel at the given pixel coordinates [x], [y].
double getRed(int x, int y) {
return red != null ? red.getFloat(x, y) : 0.0;
}
- /**
- * Set the value of the red channel at the given pixel coordinates [x], [y].
- */
- void setRed(int x, int y, double c) {
+ /// Set the value of the red channel at the given pixel coordinates [x], [y].
+ void setRed(int x, int y, num c) {
if (red != null) {
red.setFloat(x, y, c);
}
@@ -129,21 +111,17 @@
void setRedInt(int x, int y, int c) {
if (red != null) {
- red.setInt(x, y, c);
+ red.setInt(x, y, c);
}
}
- /**
- * Get the value of the green channel at the given pixel coordinates [x], [y].
- */
+ /// Get the value of the green channel at the given pixel coordinates [x], [y].
double getGreen(int x, int y) {
return green != null ? green.getFloat(x, y) : 0.0;
}
- /**
- * Set the value of the green channel at the given pixel coordinates [x], [y].
- */
- void setGreen(int x, int y, double c) {
+ /// Set the value of the green channel at the given pixel coordinates [x], [y].
+ void setGreen(int x, int y, num c) {
if (green != null) {
green.setFloat(x, y, c);
}
@@ -151,21 +129,17 @@
void setGreenInt(int x, int y, int c) {
if (green != null) {
- green.setInt(x, y, c);
+ green.setInt(x, y, c);
}
}
- /**
- * Get the value of the blue channel at the given pixel coordinates [x], [y].
- */
+ /// Get the value of the blue channel at the given pixel coordinates [x], [y].
double getBlue(int x, int y) {
return blue != null ? blue.getFloat(x, y) : 0.0;
}
- /**
- * Set the value of the blue channel at the given pixel coordinates [x], [y].
- */
- void setBlue(int x, int y, double c) {
+ /// Set the value of the blue channel at the given pixel coordinates [x], [y].
+ void setBlue(int x, int y, num c) {
if (blue != null) {
blue.setFloat(x, y, c);
}
@@ -177,16 +151,12 @@
}
}
- /**
- * Get the value of the alpha channel at the given pixel coordinates [x], [y].
- */
+ /// Get the value of the alpha channel at the given pixel coordinates [x], [y].
double getAlpha(int x, int y) {
return alpha != null ? alpha.getFloat(x, y) : 0.0;
}
- /**
- * Set the value of the alpha channel at the given pixel coordinates [x], [y].
- */
+ /// Set the value of the alpha channel at the given pixel coordinates [x], [y].
void setAlpha(int x, int y, double c) {
if (alpha != null) {
alpha.setFloat(x, y, c);
@@ -199,35 +169,25 @@
}
}
- /**
- * Get the value of the depth channel at the given pixel coordinates [x], [y].
- */
+ /// Get the value of the depth channel at the given pixel coordinates [x], [y].
double getDepth(int x, int y) {
return depth != null ? depth.getFloat(x, y) : 0.0;
}
- /**
- * Set the value of the depth channel at the given pixel coordinates [x], [y].
- */
+ /// Set the value of the depth channel at the given pixel coordinates [x], [y].
void setDepth(int x, int y, double c) {
if (depth != null) {
depth.setFloat(x, y, c);
}
}
- /**
- * Does this image contain the given channel?
- */
+ /// Does this image contain the given channel?
bool hasChannel(String ch) => slices.containsKey(ch);
- /**
- * Access a framebuffer slice by name.
- */
- HdrSlice operator[](String ch) => slices[ch];
+ /// Access a framebuffer slice by name.
+ HdrSlice operator [](String ch) => slices[ch];
- /**
- * Add a channel [slice] to the
- */
+ /// Add a channel [slice] to the
void addSlice(HdrSlice slice) {
String ch = slice.name;
slices[ch] = slice;
@@ -250,10 +210,8 @@
}
}
- /**
- * Convert the framebuffer to an floating-point image, as a sequence of
- * floats in RGBA order.
- */
+ /// Convert the framebuffer to an floating-point image, as a sequence of
+ /// floats in RGBA order.
Float32List toFloatRgba() {
Float32List rgba = Float32List(width * height * 4);
int w = width;
@@ -270,4 +228,3 @@
return rgba;
}
}
-
diff --git a/image/lib/src/hdr/hdr_slice.dart b/image/lib/src/hdr/hdr_slice.dart
index 2da0002..20e20ee 100755
--- a/image/lib/src/hdr/hdr_slice.dart
+++ b/image/lib/src/hdr/hdr_slice.dart
@@ -3,67 +3,62 @@
import 'half.dart';
import 'hdr_image.dart';
-/**
- * A slice is the data for an image framebuffer for a single channel.
- */
+/// A slice is the data for an image framebuffer for a single channel.
class HdrSlice {
final String name;
final int width;
final int height;
+
/// Indicates the type of data stored by the slice, either [HdrImage.HALF],
/// [HdrImage.FLOAT], or [HdrImage.UINT].
final int type;
+
/// [data] will be either Uint16List, Float32List, or Uint32List depending
/// on the type being HALF, FLOAT or UINT respectively.
- final data;
+ final dynamic data;
- HdrSlice(this.name, int width, int height, int type) :
- this.width = width,
- this.height = height,
- this.type = type,
- data = type == HdrImage.HALF ? new Uint16List(width * height) :
- type == HdrImage.FLOAT ? new Float32List(width * height) :
- new Uint32List(width * height);
+ HdrSlice(this.name, int width, int height, int type)
+ : this.width = width,
+ this.height = height,
+ this.type = type,
+ data = type == HdrImage.HALF
+ ? new Uint16List(width * height)
+ : type == HdrImage.FLOAT
+ ? new Float32List(width * height)
+ : new Uint32List(width * height);
- /**
- * Create a copy of the [other] HdrSlice.
- */
- HdrSlice.from(HdrSlice other) :
- name = other.name ,
- width = other.width,
- height = other.height,
- type = other.type,
- data = other.type == HdrImage.HALF ? new Uint16List.fromList(other.data) :
- other.type == HdrImage.FLOAT ? new Float32List.fromList(other.data) :
- new Uint32List.fromList(other.data);
+ /// Create a copy of the [other] HdrSlice.
+ HdrSlice.from(HdrSlice other)
+ : name = other.name,
+ width = other.width,
+ height = other.height,
+ type = other.type,
+ data = other.type == HdrImage.HALF
+ ? new Uint16List.fromList(other.data as List<int>)
+ : other.type == HdrImage.FLOAT
+ ? new Float32List.fromList(other.data as List<double>)
+ : new Uint32List.fromList(other.data as List<int>);
- /**
- * Get the raw bytes of the data buffer.
- */
- Uint8List getBytes() => new Uint8List.view(data.buffer);
+ /// Get the raw bytes of the data buffer.
+ Uint8List getBytes() => new Uint8List.view(data.buffer as ByteBuffer);
- /**
- * Does this channel store floating-point data?
- */
+ /// Does this channel store floating-point data?
bool get isFloat => type == HdrImage.FLOAT || type == HdrImage.HALF;
- /**
- * Get the float value of the sample at the coordinates [x],[y].
- * [Half] samples are converted to double.
- * An exception will occur if the slice stores UINT data.
- */
+ /// Get the float value of the sample at the coordinates [x],[y].
+ /// [Half] samples are converted to double.
+ /// An exception will occur if the slice stores UINT data.
double getFloat(int x, int y) {
int pi = y * width + x;
- double s = (type == HdrImage.HALF) ?
- Half.HalfToDouble(data[pi]) : data[pi];
+ var s = (type == HdrImage.HALF)
+ ? Half.HalfToDouble(data[pi] as int)
+ : data[pi] as double;
return s;
}
- /**
- * Set the float value of the sample at the coordinates [x],[y] for
- * [FLOAT] or [HALF] slices.
- */
- void setFloat(int x, int y, double v) {
+ /// Set the float value of the sample at the coordinates [x],[y] for
+ ///[FLOAT] or [HALF] slices.
+ void setFloat(int x, int y, num v) {
int pi = y * width + x;
if (type == HdrImage.FLOAT) {
data[pi] = v;
@@ -72,19 +67,15 @@
}
}
- /**
- * Get the int value of the sample at the coordinates [x],[y].
- * An exception will occur if the slice stores FLOAT or HALF data.
- */
+ /// Get the int value of the sample at the coordinates [x],[y].
+ ///An exception will occur if the slice stores FLOAT or HALF data.
int getInt(int x, int y) {
int pi = y * width + x;
- return data[pi];
+ return data[pi] as int;
}
- /**
- * Set the int value of the sample at the coordinates [x],[y] for [UINT]
- * slices.
- */
+ /// Set the int value of the sample at the coordinates [x],[y] for [UINT]
+ /// slices.
void setInt(int x, int y, int v) {
int pi = y * width + x;
data[pi] = v;
diff --git a/image/lib/src/hdr/hdr_to_image.dart b/image/lib/src/hdr/hdr_to_image.dart
index 00d3da9..e90e98d 100755
--- a/image/lib/src/hdr/hdr_to_image.dart
+++ b/image/lib/src/hdr/hdr_to_image.dart
@@ -1,27 +1,25 @@
-import 'dart:math' as Math;
+import 'dart:math' as math;
import 'dart:typed_data';
import '../image.dart';
import '../image_exception.dart';
import 'hdr_image.dart';
-/**
- * Convert a high dynamic range image to a low dynamic range image,
- * with optional exposure control.
- */
-Image hdrToImage(HdrImage hdr, {double exposure}) {
- double _knee(double x, double f) {
- return Math.log(x * f + 1.0) / f;
+/// Convert a high dynamic range image to a low dynamic range image,
+/// with optional exposure control.
+Image hdrToImage(HdrImage hdr, {num exposure}) {
+ num _knee(num x, num f) {
+ return math.log(x * f + 1.0) / f;
}
- double _gamma(double h, double m) {
- double x = Math.max(0.0, h * m);
+ num _gamma(num h, num m) {
+ num x = math.max(0, h * m);
if (x > 1.0) {
x = 1.0 + _knee(x - 1, 0.184874);
}
- return (Math.pow(x, 0.4545) * 84.66);
+ return math.pow(x, 0.4545) * 84.66;
}
Image image = Image(hdr.width, hdr.height);
@@ -31,9 +29,9 @@
throw new ImageException('Only RGB[A] images are currently supported.');
}
- double m = exposure != null ?
- Math.pow(2.0, (exposure + 2.47393).clamp(-20.0, 20.0)) :
- 1.0;
+ num m = (exposure != null)
+ ? math.pow(2.0, (exposure + 2.47393).clamp(-20.0, 20.0))
+ : 1.0;
for (int y = 0, di = 0; y < hdr.height; ++y) {
for (int x = 0; x < hdr.width; ++x) {
@@ -51,7 +49,7 @@
b = 0.0;
}
- double ri, gi, bi;
+ num ri, gi, bi;
if (exposure != null) {
ri = _gamma(r, m);
gi = _gamma(g, m);
@@ -63,23 +61,23 @@
}
// Normalize the color
- double mi = Math.max(ri, Math.max(gi, bi));
+ num mi = math.max(ri, math.max(gi, bi));
if (mi > 255.0) {
ri = 255.0 * (ri / mi);
gi = 255.0 * (gi / mi);
bi = 255.0 * (bi / mi);
}
- pixels[di++] = ri.toInt().clamp(0, 255);
- pixels[di++] = gi.toInt().clamp(0, 255);
- pixels[di++] = bi.toInt().clamp(0, 255);
+ pixels[di++] = ri.clamp(0, 255).toInt();
+ pixels[di++] = gi.clamp(0, 255).toInt();
+ pixels[di++] = bi.clamp(0, 255).toInt();
if (hdr.alpha != null) {
double a = hdr.alpha.getFloat(x, y);
if (a.isInfinite || a.isNaN) {
a = 1.0;
}
- pixels[di++] = (a * 255.0).toInt().clamp(0, 255);
+ pixels[di++] = (a * 255.0).clamp(0, 255).toInt();
} else {
pixels[di++] = 255;
}
diff --git a/image/lib/src/hdr/reinhard_tone_map.dart b/image/lib/src/hdr/reinhard_tone_map.dart
index b32400e..c673aef 100755
--- a/image/lib/src/hdr/reinhard_tone_map.dart
+++ b/image/lib/src/hdr/reinhard_tone_map.dart
@@ -1,12 +1,10 @@
-import 'dart:math' as Math;
+import 'dart:math';
import 'hdr_image.dart';
-/**
- * Applies Reinhard tone mapping to the hdr image, in-place.
- */
+/// Applies Reinhard tone mapping to the hdr image, in-place.
HdrImage reinhardToneMap(HdrImage hdr) {
- const List<double> yw = const [0.212671, 0.715160, 0.072169 ];
+ const List<double> yw = const [0.212671, 0.715160, 0.072169];
// Compute world adaptation luminance, _Ywa_
double Ywa = 0.0;
@@ -18,12 +16,12 @@
double lum = yw[0] * r + yw[1] * g + yw[2] * b;
if (lum > 1.0e-4) {
- Ywa += Math.log(lum);
+ Ywa += log(lum);
}
}
}
- Ywa = Math.exp(Ywa / (hdr.width * hdr.height));
+ Ywa = exp(Ywa / (hdr.width * hdr.height));
double invY2 = 1.0 / (Ywa * Ywa);
diff --git a/image/lib/src/icc_profile_data.dart b/image/lib/src/icc_profile_data.dart
index 823cceb..c06d946 100755
--- a/image/lib/src/icc_profile_data.dart
+++ b/image/lib/src/icc_profile_data.dart
@@ -1,14 +1,9 @@
import 'dart:typed_data';
import 'package:archive/archive.dart';
-enum ICCPCompression {
- none,
- deflate
-}
+enum ICCPCompression { none, deflate }
-/**
- * ICC Profile data stored with an image.
- */
+/// ICC Profile data stored with an image.
class ICCProfileData {
String name = "";
ICCPCompression compression;
@@ -27,7 +22,7 @@
if (compression == ICCPCompression.deflate) {
return data;
}
- data = ZLibEncoder().encode(data);
+ data = ZLibEncoder().encode(data) as Uint8List;
compression = ICCPCompression.deflate;
return data;
}
@@ -38,7 +33,7 @@
if (compression == ICCPCompression.deflate) {
return data;
}
- data = ZLibDecoder().decodeBytes(data);
+ data = ZLibDecoder().decodeBytes(data) as Uint8List;
compression = ICCPCompression.none;
return data;
}
diff --git a/image/lib/src/image.dart b/image/lib/src/image.dart
index d190340..e4c72fa 100755
--- a/image/lib/src/image.dart
+++ b/image/lib/src/image.dart
@@ -1,4 +1,4 @@
-import 'dart:math' as Math;
+import 'dart:math';
import 'dart:typed_data';
import 'color.dart';
@@ -7,149 +7,146 @@
import 'image_exception.dart';
import 'util/interpolation.dart';
-/**
- * A 32-bit image buffer where pixels are encoded into 32-bit unsigned ints.
- * You can use the methods in color to encode/decode the RGBA channels of a
- * color for a pixel.
- *
- * Pixels are stored in 32-bit unsigned integers in aabbggrr format.
- * This is to be consistent with HTML canvas data. You can use
- * [getBytes] to access the pixel at the byte (channel) level, where there
- * are four bytes per pixel in red, green, blue, and alpha order.
- *
- * If this image is a frame of an animation as decoded by the [decodeFrame]
- * method of [Decoder], then the [xOffset], [yOffset], [width] and [height]
- * coordinates determine area of the canvas this image should be drawn into,
- * as some frames of an animation only modify part of the canvas (recording
- * the part of the frame that actually changes). The [decodeAnimation] method
- * will always return the fully composed animation, so these coordinate
- * properties are not used.
- */
+/// A 32-bit image buffer where pixels are encoded into 32-bit unsigned ints.
+/// You can use the methods in color to encode/decode the RGBA channels of a
+/// color for a pixel.
+///
+/// Pixels are stored in 32-bit unsigned integers in aabbggrr format.
+/// This is to be consistent with HTML canvas data. You can use
+/// [getBytes] to access the pixel at the byte (channel) level, where there
+/// are four bytes per pixel in red, green, blue, and alpha order.
+///
+/// If this image is a frame of an animation as decoded by the [decodeFrame]
+/// method of [Decoder], then the [xOffset], [yOffset], [width] and [height]
+/// coordinates determine area of the canvas this image should be drawn into,
+/// as some frames of an animation only modify part of the canvas (recording
+/// the part of the frame that actually changes). The [decodeAnimation] method
+/// will always return the fully composed animation, so these coordinate
+/// properties are not used.
class Image {
/// 24-bit RGB image.
static const int RGB = 3;
+
/// 32-bit RGBA image.
static const int RGBA = 4;
/// When drawing this frame, the canvas should be left as it is.
static const int DISPOSE_NONE = 0;
+
/// When drawing this frame, the canvas should be cleared first.
static const int DISPOSE_CLEAR = 1;
+
/// When drawing this frame, the canvas should be reverted to how it was before drawing it.
static const int DISPOSE_PREVIOUS = 2;
/// No alpha blending should be done when drawing this frame (replace
/// pixels in canvas).
static const int BLEND_SOURCE = 0;
+
/// Alpha blending should be used when drawing this frame (composited over
/// the current canvas image).
static const int BLEND_OVER = 1;
/// Width of the image.
final int width;
+
/// Height of the image.
final int height;
+
/// x position at which to render the frame.
int xOffset = 0;
+
/// y position at which to render the frame.
int yOffset = 0;
+
/// How long this frame should be displayed, in milliseconds.
/// A duration of 0 indicates no delay and the next frame will be drawn
/// as quickly as it can.
int duration = 0;
+
/// Defines what should be done to the canvas when drawing this frame.
int disposeMethod = DISPOSE_CLEAR;
+
/// Defines the blending method (alpha compositing) to use when drawing this
/// frame.
int blendMethod = BLEND_OVER;
+
/// Pixels are encoded into 4-byte integers, where each byte is an RGBA
/// channel.
final Uint32List data;
ExifData exif;
ICCProfileData iccProfile;
- /**
- * Create an image with the given dimensions and format.
- */
- Image(int width, int height, [this._format = RGBA, ExifData exif,
- ICCProfileData iccp]) :
- this.width = width,
- this.height = height,
- data = Uint32List(width * height),
- exif = ExifData.from(exif),
- iccProfile = iccp;
+ /// Create an image with the given dimensions and format.
+ Image(int width, int height,
+ [this._format = RGBA, ExifData exif, ICCProfileData iccp])
+ : this.width = width,
+ this.height = height,
+ data = Uint32List(width * height),
+ exif = ExifData.from(exif),
+ iccProfile = iccp;
- /**
- * Create a copy of the image [other].
- */
- Image.from(Image other) :
- width = other.width,
- height = other.height,
- xOffset = other.xOffset,
- yOffset = other.yOffset,
- duration = other.duration,
- disposeMethod = other.disposeMethod,
- blendMethod = other.blendMethod,
- _format = other._format,
- data = Uint32List.fromList(other.data),
- exif = ExifData.from(other.exif),
- iccProfile = other.iccProfile;
+ /// Create a copy of the image [other].
+ Image.from(Image other)
+ : width = other.width,
+ height = other.height,
+ xOffset = other.xOffset,
+ yOffset = other.yOffset,
+ duration = other.duration,
+ disposeMethod = other.disposeMethod,
+ blendMethod = other.blendMethod,
+ _format = other._format,
+ data = Uint32List.fromList(other.data),
+ exif = ExifData.from(other.exif),
+ iccProfile = other.iccProfile;
- /**
- * Create an image from [bytes].
- *
- * [bytes] should be in RGB<A> format with a byte [0,255] for each channel.
- * The length of [bytes] should be <3|4> * (width * height).
- * [format] determines if there are 3 or 4 channels per pixel.
- *
- * For example, given an Html Canvas, you could create an image:
- * var bytes = canvas.getContext('2d').getImageData(0, 0,
- * canvas.width, canvas.height).data;
- * Image image = Image.fromBytes(canvas.width, canvas.height, bytes);
- */
+ /// Create an image from [bytes].
+ ///
+ /// [bytes] should be in RGB<A> format with a byte [0,255] for each channel.
+ /// The length of [bytes] should be <3|4> * (width * height).
+ /// [format] determines if there are 3 or 4 channels per pixel.
+ ///
+ /// For example, given an Html Canvas, you could create an image:
+ /// var bytes = canvas.getContext('2d').getImageData(0, 0,
+ /// canvas.width, canvas.height).data;
+ /// Image image = Image.fromBytes(canvas.width, canvas.height, bytes);
Image.fromBytes(int width, int height, List<int> bytes,
- [this._format = RGBA, ExifData exif, ICCProfileData iccp]) :
- this.width = width,
- this.height = height,
- // Create a uint32 view of the byte buffer.
- // This assumes the system architecture is little-endian...
- data = bytes is Uint8List ? new Uint32List.view(bytes.buffer) :
- bytes is Uint8ClampedList ? new Uint32List.view(bytes.buffer) :
- bytes is Uint32List ? new Uint32List.view(bytes.buffer) :
- new Uint32List.view(new Uint8List.fromList(bytes).buffer),
- exif = ExifData.from(exif),
- iccProfile = iccp;
+ [this._format = RGBA, ExifData exif, ICCProfileData iccp])
+ : this.width = width,
+ this.height = height,
+ // Create a uint32 view of the byte buffer.
+ // This assumes the system architecture is little-endian...
+ data = bytes is Uint8List
+ ? new Uint32List.view(bytes.buffer)
+ : bytes is Uint8ClampedList
+ ? new Uint32List.view(bytes.buffer)
+ : bytes is Uint32List
+ ? new Uint32List.view(bytes.buffer)
+ : new Uint32List.view(new Uint8List.fromList(bytes).buffer),
+ exif = ExifData.from(exif),
+ iccProfile = iccp;
- /**
- * Clone this image.
- */
+ /// Clone this image.
Image clone() => new Image.from(this);
- /**
- * Get the RGBA bytes from the image. You can use this to access the
- * RGBA color channels directly, or to pass it to something like an
- * Html canvas context.
- *
- * For example, given an Html Canvas, you could draw this image into the
- * canvas:
- * Html.ImageData d = context2D.createImageData(image.width, image.height);
- * d.data.setRange(0, image.length, image.getBytes());
- * context2D.putImageData(data, 0, 0);
- */
- Uint8List getBytes() =>
- new Uint8List.view(data.buffer);
+ /// Get the RGBA bytes from the image. You can use this to access the
+ /// RGBA color channels directly, or to pass it to something like an
+ /// Html canvas context.
+ ///
+ /// For example, given an Html Canvas, you could draw this image into the
+ /// canvas:
+ /// Html.ImageData d = context2D.createImageData(image.width, image.height);
+ /// d.data.setRange(0, image.length, image.getBytes());
+ /// context2D.putImageData(data, 0, 0);
+ Uint8List getBytes() => new Uint8List.view(data.buffer);
- /**
- * Get the format of the image, either [RGB] or [RGBA].
- */
+ /// Get the format of the image, either [RGB] or [RGBA].
int get format => _format;
- /**
- * Set the format of the image, either [RGB] or [RGBA]. The format is used
- * for informational purposes and has no effect on the actual stored data,
- * which is always in 4-byte RGBA format.
- */
- void set format(int f) {
+ /// Set the format of the image, either [RGB] or [RGBA]. The format is used
+ /// for informational purposes and has no effect on the actual stored data,
+ /// which is always in 4-byte RGBA format.
+ set format(int f) {
if (f == _format) {
return;
}
@@ -159,26 +156,20 @@
_format = f;
}
- /**
- * How many color channels does the image have, 3 or 4?
- * Note that internally, images always have 4 8-bit channels.
- */
+ /// How many color channels does the image have, 3 or 4?
+ /// Note that internally, images always have 4 8-bit channels.
int get numChannels => _format;
- /**
- * Set all of the pixels of the image to the given [color].
- */
+ /// Set all of the pixels of the image to the given [color].
Image fill(int color) {
data.fillRange(0, data.length, color);
return this;
}
- /**
- * Add the colors of [other] to the pixels of this image.
- */
- Image operator+(Image other) {
- int h = Math.min(height, other.height);
- int w = Math.min(width, other.width);
+ /// Add the colors of [other] to the pixels of this image.
+ Image operator +(Image other) {
+ int h = min(height, other.height);
+ int w = min(width, other.width);
for (int y = 0; y < h; ++y) {
for (int x = 0; x < w; ++x) {
int c1 = getPixel(x, y);
@@ -199,12 +190,10 @@
return this;
}
- /**
- * Subtract the colors of [other] from the pixels of this image.
- */
- Image operator-(Image other) {
- int h = Math.min(height, other.height);
- int w = Math.min(width, other.width);
+ /// Subtract the colors of [other] from the pixels of this image.
+ Image operator -(Image other) {
+ int h = min(height, other.height);
+ int w = min(width, other.width);
for (int y = 0; y < h; ++y) {
for (int x = 0; x < w; ++x) {
int c1 = getPixel(x, y);
@@ -225,12 +214,10 @@
return this;
}
- /**
- * Multiply the colors of [other] with the pixels of this image.
- */
- Image operator*(Image other) {
- int h = Math.min(height, other.height);
- int w = Math.min(width, other.width);
+ /// Multiply the colors of [other] with the pixels of this image.
+ Image operator *(Image other) {
+ int h = min(height, other.height);
+ int w = min(width, other.width);
for (int y = 0; y < h; ++y) {
for (int x = 0; x < w; ++x) {
int c1 = getPixel(x, y);
@@ -251,12 +238,10 @@
return this;
}
- /**
- * OR the colors of [other] to the pixels of this image.
- */
- Image operator|(Image other) {
- int h = Math.min(height, other.height);
- int w = Math.min(width, other.width);
+ /// OR the colors of [other] to the pixels of this image.
+ Image operator |(Image other) {
+ int h = min(height, other.height);
+ int w = min(width, other.width);
for (int y = 0; y < h; ++y) {
for (int x = 0; x < w; ++x) {
int c1 = getPixel(x, y);
@@ -277,12 +262,10 @@
return this;
}
- /**
- * AND the colors of [other] with the pixels of this image.
- */
- Image operator&(Image other) {
- int h = Math.min(height, other.height);
- int w = Math.min(width, other.width);
+ /// AND the colors of [other] with the pixels of this image.
+ Image operator &(Image other) {
+ int h = min(height, other.height);
+ int w = min(width, other.width);
for (int y = 0; y < h; ++y) {
for (int x = 0; x < w; ++x) {
int c1 = getPixel(x, y);
@@ -303,12 +286,10 @@
return this;
}
- /**
- * Modula the colors of [other] with the pixels of this image.
- */
- Image operator%(Image other) {
- int h = Math.min(height, other.height);
- int w = Math.min(width, other.width);
+ /// Modula the colors of [other] with the pixels of this image.
+ Image operator %(Image other) {
+ int h = min(height, other.height);
+ int w = min(width, other.width);
for (int y = 0; y < h; ++y) {
for (int x = 0; x < w; ++x) {
int c1 = getPixel(x, y);
@@ -329,54 +310,34 @@
return this;
}
- /**
- * The size of the image buffer.
- */
+ /// The size of the image buffer.
int get length => data.length;
- /**
- * Get a pixel from the buffer.
- */
- int operator[](int index) => data[index];
+ /// Get a pixel from the buffer.
+ int operator [](int index) => data[index];
- /**
- * Set a pixel in the buffer.
- */
- void operator[]=(int index, int color) {
+ /// Set a pixel in the buffer.
+ void operator []=(int index, int color) {
data[index] = color;
}
- /**
- * Get the buffer index for the [x], [y] pixel coordinates.
- */
+ /// Get the buffer index for the [x], [y] pixel coordinates.
int index(int x, int y) => y * width + x;
- /**
- * Is the given pixel coordinates within the resolution of the image.
- */
- bool boundsSafe(int x, int y) =>
- x >= 0 && x < width && y >= 0 && y < height;
+ /// Is the given pixel coordinates within the resolution of the image.
+ bool boundsSafe(int x, int y) => x >= 0 && x < width && y >= 0 && y < height;
- /**
- * Get the pixel from the given [x], [y] coordinate.
- */
- int getPixel(int x, int y) =>
- boundsSafe(x, y) ? data[y * width + x] : 0;
+ /// Get the pixel from the given [x], [y] coordinate.
+ int getPixel(int x, int y) => boundsSafe(x, y) ? data[y * width + x] : 0;
- /**
- * Get the pixel from the given [x], [y] coordinate without check the bounds.
- */
+ /// Get the pixel from the given [x], [y] coordinate without check the bounds.
int getUnsafePixel(int x, int y) => data[y * width + x];
- /**
- * Get the pixel from the given [offset], index.
- */
+ /// Get the pixel from the given [offset], index.
int getUnsafePixel_(int offset) => data[offset];
- /**
- * Get the pixel using the given [interpolation] type for non-integer pixel
- * coordinates.
- */
+ /// Get the pixel using the given [interpolation] type for non-integer pixel
+ /// coordinates.
int getPixelInterpolate(num fx, num fy, [int interpolation = LINEAR]) {
if (interpolation == CUBIC) {
return getPixelCubic(fx, fy);
@@ -386,21 +347,21 @@
return getPixel(fx.toInt(), fy.toInt());
}
- /**
- * Get the pixel using linear interpolation for non-integer pixel
- * coordinates.
- */
+ /// Get the pixel using linear interpolation for non-integer pixel
+ /// coordinates.
int getPixelLinear(num fx, num fy) {
int x = fx.toInt() - (fx >= 0 ? 0 : 1);
int nx = x + 1;
int y = fy.toInt() - (fy >= 0 ? 0 : 1);
int ny = y + 1;
- double dx = fx - x;
- double dy = fy - y;
+ num dx = fx - x;
+ num dy = fy - y;
int _linear(int Icc, int Inc, int Icn, int Inn) {
- return (Icc + dx * (Inc - Icc + dy * (Icc + Inn - Icn - Inc)) +
- dy * (Icn - Icc)).toInt();
+ return (Icc +
+ dx * (Inc - Icc + dy * (Icc + Inn - Icn - Inc)) +
+ dy * (Icn - Icc))
+ .toInt();
}
int Icc = getPixel(x, y);
@@ -415,10 +376,8 @@
_linear(getAlpha(Icc), getAlpha(Inc), getAlpha(Icn), getAlpha(Inn)));
}
- /**
- * Get the pixel using cubic interpolation for non-integer pixel
- * coordinates.
- */
+ /// Get the pixel using cubic interpolation for non-integer pixel
+ /// coordinates.
int getPixelCubic(num fx, num fy) {
int x = fx.toInt() - (fx >= 0.0 ? 0 : 1);
int px = x - 1;
@@ -432,100 +391,106 @@
var dx = fx - x;
var dy = fy - y;
- double _cubic(num dx, num Ipp, num Icp, num Inp, num Iap) =>
+ num _cubic(num dx, num Ipp, num Icp, num Inp, num Iap) =>
Icp + 0.5 * (dx * (-Ipp + Inp) +
- dx * dx * (2 * Ipp - 5 * Icp + 4 * Inp - Iap) +
- dx * dx * dx * (-Ipp + 3 * Icp - 3 * Inp + Iap));
+ dx * dx * (2 * Ipp - 5 * Icp + 4 * Inp - Iap) +
+ dx * dx * dx * (-Ipp + 3 * Icp - 3 * Inp + Iap));
int Ipp = getPixel(px, py);
int Icp = getPixel(x, py);
int Inp = getPixel(nx, py);
int Iap = getPixel(ax, py);
- double Ip0 = _cubic(dx, getRed(Ipp), getRed(Icp), getRed(Inp), getRed(Iap));
- double Ip1 = _cubic(dx, getGreen(Ipp), getGreen(Icp), getGreen(Inp), getGreen(Iap));
- double Ip2 = _cubic(dx, getBlue(Ipp), getBlue(Icp), getBlue(Inp), getBlue(Iap));
- double Ip3 = _cubic(dx, getAlpha(Ipp), getAlpha(Icp), getAlpha(Inp), getAlpha(Iap));
+ num Ip0 = _cubic(dx, getRed(Ipp), getRed(Icp), getRed(Inp), getRed(Iap));
+ num Ip1 =
+ _cubic(dx, getGreen(Ipp), getGreen(Icp), getGreen(Inp), getGreen(Iap));
+ num Ip2 =
+ _cubic(dx, getBlue(Ipp), getBlue(Icp), getBlue(Inp), getBlue(Iap));
+ num Ip3 =
+ _cubic(dx, getAlpha(Ipp), getAlpha(Icp), getAlpha(Inp), getAlpha(Iap));
int Ipc = getPixel(px, y);
int Icc = getPixel(x, y);
int Inc = getPixel(nx, y);
int Iac = getPixel(ax, y);
- double Ic0 = _cubic(dx, getRed(Ipc), getRed(Icc), getRed(Inc), getRed(Iac));
- double Ic1 = _cubic(dx, getGreen(Ipc), getGreen(Icc), getGreen(Inc), getGreen(Iac));
- double Ic2 = _cubic(dx, getBlue(Ipc), getBlue(Icc), getBlue(Inc), getBlue(Iac));
- double Ic3 = _cubic(dx, getAlpha(Ipc), getAlpha(Icc), getAlpha(Inc), getAlpha(Iac));
+ num Ic0 = _cubic(dx, getRed(Ipc), getRed(Icc), getRed(Inc), getRed(Iac));
+ num Ic1 =
+ _cubic(dx, getGreen(Ipc), getGreen(Icc), getGreen(Inc), getGreen(Iac));
+ num Ic2 =
+ _cubic(dx, getBlue(Ipc), getBlue(Icc), getBlue(Inc), getBlue(Iac));
+ num Ic3 =
+ _cubic(dx, getAlpha(Ipc), getAlpha(Icc), getAlpha(Inc), getAlpha(Iac));
int Ipn = getPixel(px, ny);
int Icn = getPixel(x, ny);
int Inn = getPixel(nx, ny);
int Ian = getPixel(ax, ny);
- double In0 = _cubic(dx, getRed(Ipn), getRed(Icn), getRed(Inn), getRed(Ian));
- double In1 = _cubic(dx, getGreen(Ipn), getGreen(Icn), getGreen(Inn), getGreen(Ian));
- double In2 = _cubic(dx, getBlue(Ipn), getBlue(Icn), getBlue(Inn), getBlue(Ian));
- double In3 = _cubic(dx, getAlpha(Ipn), getAlpha(Icn), getAlpha(Inn), getAlpha(Ian));
+ num In0 = _cubic(dx, getRed(Ipn), getRed(Icn), getRed(Inn), getRed(Ian));
+ num In1 =
+ _cubic(dx, getGreen(Ipn), getGreen(Icn), getGreen(Inn), getGreen(Ian));
+ num In2 =
+ _cubic(dx, getBlue(Ipn), getBlue(Icn), getBlue(Inn), getBlue(Ian));
+ num In3 =
+ _cubic(dx, getAlpha(Ipn), getAlpha(Icn), getAlpha(Inn), getAlpha(Ian));
int Ipa = getPixel(px, ay);
int Ica = getPixel(x, ay);
int Ina = getPixel(nx, ay);
int Iaa = getPixel(ax, ay);
- double Ia0 = _cubic(dx, getRed(Ipa), getRed(Ica), getRed(Ina), getRed(Iaa));
- double Ia1 = _cubic(dx, getGreen(Ipa), getGreen(Ica), getGreen(Ina), getGreen(Iaa));
- double Ia2 = _cubic(dx, getBlue(Ipa), getBlue(Ica), getBlue(Ina), getBlue(Iaa));
- double Ia3 = _cubic(dx, getAlpha(Ipa), getAlpha(Ica), getAlpha(Ina), getAlpha(Iaa));
+ num Ia0 = _cubic(dx, getRed(Ipa), getRed(Ica), getRed(Ina), getRed(Iaa));
+ num Ia1 =
+ _cubic(dx, getGreen(Ipa), getGreen(Ica), getGreen(Ina), getGreen(Iaa));
+ num Ia2 =
+ _cubic(dx, getBlue(Ipa), getBlue(Ica), getBlue(Ina), getBlue(Iaa));
+ num Ia3 =
+ _cubic(dx, getAlpha(Ipa), getAlpha(Ica), getAlpha(Ina), getAlpha(Iaa));
- double c0 = _cubic(dy, Ip0, Ic0, In0, Ia0);
- double c1 = _cubic(dy, Ip1, Ic1, In1, Ia1);
- double c2 = _cubic(dy, Ip2, Ic2, In2, Ia2);
- double c3 = _cubic(dy, Ip3, Ic3, In3, Ia3);
+ num c0 = _cubic(dy, Ip0, Ic0, In0, Ia0);
+ num c1 = _cubic(dy, Ip1, Ic1, In1, Ia1);
+ num c2 = _cubic(dy, Ip2, Ic2, In2, Ia2);
+ num c3 = _cubic(dy, Ip3, Ic3, In3, Ia3);
return getColor(c0.toInt(), c1.toInt(), c2.toInt(), c3.toInt());
}
- /**
- * Set the pixel at the given [x], [y] coordinate to the [color].
- *
- * This simply replaces the existing color, it does not do any alpha
- * blending. Use [drawPixel] for that.
- */
+ /// Set the pixel at the given [x], [y] coordinate to the [color].
+ ///
+ /// This simply replaces the existing color, it does not do any alpha
+ /// blending. Use [drawPixel] for that.
void setPixel(int x, int y, int color) {
+ data[y * width + x] = color;
+ }
+
+ void setPixelSafe(int x, int y, int color) {
if (boundsSafe(x, y)) {
data[y * width + x] = color;
}
}
- /**
- * Set the pixel at the given [x], [y] coordinate to the [color] without check the bounds.
- *
- * This simply replaces the existing color, it does not do any alpha
- * blending. Use [drawPixel] for that.
- */
- void setUnsafePixel(int x, int y, int color){
+ /// Set the pixel at the given [x], [y] coordinate to the [color] without
+ /// check the bounds.
+ ///
+ /// This simply replaces the existing color, it does not do any alpha
+ /// blending. Use [drawPixel] for that.
+ void setUnsafePixel(int x, int y, int color) {
data[y * width + x] = color;
}
- /**
- * Set the pixel at the given [offset] index to the [color] without check the bounds.
- */
- void setUnsafePixel_(int offset, int color){
+ /// Set the pixel at the given [offset] index to the [color] without check
+ /// the bounds.
+ void setUnsafePixel_(int offset, int color) {
data[offset] = color;
}
- /**
- * Set the pixel at the given [x], [y] coordinate to the color
- * [r], [g], [b], [a].
- *
- * This simply replaces the existing color, it does not do any alpha
- * blending. Use [drawPixel] for that.
- */
+ /// Set the pixel at the given [x], [y] coordinate to the color
+ /// [r], [g], [b], [a].
+ ///
+ /// This simply replaces the existing color, it does not do any alpha
+ /// blending. Use [drawPixel] for that.
void setPixelRGBA(int x, int y, int r, int g, int b, [int a = 0xff]) {
- if (boundsSafe(x, y)) {
- data[y * width + x] = getColor(r, g, b, a);
- }
+ data[y * width + x] = getColor(r, g, b, a);
}
- /**
- * Return the average gray value of the image.
- */
+ /// Return the average gray value of the image.
int getWhiteBalance() {
final len = data.length;
int r = 0;
diff --git a/image/lib/src/image_exception.dart b/image/lib/src/image_exception.dart
index e4d094c..bfaaffe 100755
--- a/image/lib/src/image_exception.dart
+++ b/image/lib/src/image_exception.dart
@@ -1,6 +1,4 @@
-/**
- * An exception thrown when there was a problem in the image library.
- */
+/// An exception thrown when there was a problem in the image library.
class ImageException implements Exception {
/// A message describing the error.
final String message;
diff --git a/image/lib/src/internal/bit_operators.dart b/image/lib/src/internal/bit_operators.dart
index e5eae4a..53fde64 100755
--- a/image/lib/src/internal/bit_operators.dart
+++ b/image/lib/src/internal/bit_operators.dart
@@ -17,68 +17,69 @@
}
const List<int> SHIFT_BITS = const [
- 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384,
- 32768, 65536];
+ 1,
+ 2,
+ 4,
+ 8,
+ 16,
+ 32,
+ 64,
+ 128,
+ 256,
+ 512,
+ 1024,
+ 2048,
+ 4096,
+ 8192,
+ 16384,
+ 32768,
+ 65536
+];
-
-/**
- * Binary conversion of a uint8 to an int8. This is equivalent in C to
- * typecasting an unsigned char to a char.
- */
+/// Binary conversion of a uint8 to an int8. This is equivalent in C to
+/// typecasting an unsigned char to a char.
int uint8ToInt8(int d) {
__uint8[0] = d;
return __uint8ToInt8[0];
}
-/**
- * Binary conversion of a uint16 to an int16. This is equivalent in C to
- * typecasting an unsigned short to a short.
- */
+/// Binary conversion of a uint16 to an int16. This is equivalent in C to
+/// typecasting an unsigned short to a short.
int uint16ToInt16(int d) {
__uint16[0] = d;
return __uint16ToInt16[0];
}
-/**
- * Binary conversion of a uint32 to an int32. This is equivalent in C to
- * typecasting an unsigned int to signed int.
- */
+/// Binary conversion of a uint32 to an int32. This is equivalent in C to
+/// typecasting an unsigned int to signed int.
int uint32ToInt32(int d) {
__uint32[0] = d;
return __uint32ToInt32[0];
}
-/**
- * Binary conversion of a uint32 to an float32. This is equivalent in C to
- * typecasting an unsigned int to float.
- */
+/// Binary conversion of a uint32 to an float32. This is equivalent in C to
+/// typecasting an unsigned int to float.
double uint32ToFloat32(int d) {
__uint32[0] = d;
return __uint32ToFloat32[0];
}
-/**
- * Binary conversion of a uint64 to an float64. This is equivalent in C to
- * typecasting an unsigned long long to double.
- */
+/// Binary conversion of a uint64 to an float64. This is equivalent in C to
+/// typecasting an unsigned long long to double.
double uint64ToFloat64(int d) {
__uint64[0] = d;
return __uint64ToFloat64[0];
}
-/**
- * Binary conversion of an int32 to a uint32. This is equivalent in C to
- * typecasting an int to an unsigned int.
- */
+/// Binary conversion of an int32 to a uint32. This is equivalent in C to
+/// typecasting an int to an unsigned int.
int int32ToUint32(int d) {
__int32[0] = d;
return __int32ToUint32[0];
}
-/**
- * Binary conversion of a float32 to an uint32. This is equivalent in C to
- * typecasting a float to unsigned int.
- */
+/// Binary conversion of a float32 to an uint32. This is equivalent in C to
+/// typecasting a float to unsigned int.
int float32ToUint32(double d) {
__float32[0] = d;
return __float32ToUint32[0];
@@ -101,4 +102,4 @@
final Uint32List __float32ToUint32 = Uint32List.view(__float32.buffer);
final Uint64List __uint64 = Uint64List(1);
-final Float64List __uint64ToFloat64 = Float64List.view(__uint64.buffer);
\ No newline at end of file
+final Float64List __uint64ToFloat64 = Float64List.view(__uint64.buffer);
diff --git a/image/lib/src/internal/clamp.dart b/image/lib/src/internal/clamp.dart
index 554bc6f..fc175a4 100755
--- a/image/lib/src/internal/clamp.dart
+++ b/image/lib/src/internal/clamp.dart
@@ -1,3 +1,3 @@
-int clamp(int x, int a, int b) => x.clamp(a, b);
+int clamp(int x, int a, int b) => x.clamp(a, b).toInt();
-int clamp255(int x) => x.clamp(0, 255);
+int clamp255(int x) => x.clamp(0, 255).toInt();
diff --git a/image/lib/src/transform/bake_orientation.dart b/image/lib/src/transform/bake_orientation.dart
index 13392e2..c57942c 100755
--- a/image/lib/src/transform/bake_orientation.dart
+++ b/image/lib/src/transform/bake_orientation.dart
@@ -3,12 +3,10 @@
import 'flip.dart';
import 'copy_rotate.dart';
-/**
- * If [image] has an orientation value in its exif data, this will rotate the
- * image so that it physically matches its orientation. This can be used to
- * bake the orientation of the image for image formats that don't support exif
- * data.
- */
+/// If [image] has an orientation value in its exif data, this will rotate the
+/// image so that it physically matches its orientation. This can be used to
+/// bake the orientation of the image for image formats that don't support exif
+/// data.
Image bakeOrientation(Image image) {
Image bakedImage = Image.from(image);
if (!image.exif.hasOrientation || image.exif.orientation == 1) {
diff --git a/image/lib/src/transform/copy_crop.dart b/image/lib/src/transform/copy_crop.dart
index 4c03c09..5d6cbdb 100755
--- a/image/lib/src/transform/copy_crop.dart
+++ b/image/lib/src/transform/copy_crop.dart
@@ -1,8 +1,6 @@
import '../image.dart';
-/**
- * Returns a cropped copy of [src].
- */
+/// Returns a cropped copy of [src].
Image copyCrop(Image src, int x, int y, int w, int h) {
Image dst = Image(w, h, src.format, src.exif, src.iccProfile);
diff --git a/image/lib/src/transform/copy_into.dart b/image/lib/src/transform/copy_into.dart
index b604fcc..396b30c 100755
--- a/image/lib/src/transform/copy_into.dart
+++ b/image/lib/src/transform/copy_into.dart
@@ -1,24 +1,27 @@
import '../image.dart';
import '../draw/draw_pixel.dart';
-/**
- * Copies a rectangular portion of one image to another image. [dst] is the
- * destination image, [src] is the source image identifier.
- *
- * In other words, copyInto will take an rectangular area from src of
- * width [src_w] and height [src_h] at position ([src_x],[src_y]) and place it
- * in a rectangular area of [dst] of width [dst_w] and height [dst_h] at
- * position ([dst_x],[dst_y]).
- *
- * If the source and destination coordinates and width and heights differ,
- * appropriate stretching or shrinking of the image fragment will be performed.
- * The coordinates refer to the upper left corner. This function can be used to
- * copy regions within the same image (if [dst] is the same as [src])
- * but if the regions overlap the results will be unpredictable.
- */
+/// Copies a rectangular portion of one image to another image. [dst] is the
+/// destination image, [src] is the source image identifier.
+///
+/// In other words, copyInto will take an rectangular area from src of
+/// width [src_w] and height [src_h] at position ([src_x],[src_y]) and place it
+/// in a rectangular area of [dst] of width [dst_w] and height [dst_h] at
+/// position ([dst_x],[dst_y]).
+///
+/// If the source and destination coordinates and width and heights differ,
+/// appropriate stretching or shrinking of the image fragment will be performed.
+/// The coordinates refer to the upper left corner. This function can be used to
+/// copy regions within the same image (if [dst] is the same as [src])
+/// but if the regions overlap the results will be unpredictable.
Image copyInto(Image dst, Image src,
- {int dstX, int dstY, int srcX, int srcY,
- int srcW, int srcH, bool blend: true}) {
+ {int dstX,
+ int dstY,
+ int srcX,
+ int srcY,
+ int srcW,
+ int srcH,
+ bool blend = true}) {
if (dstX == null) {
dstX = 0;
}
diff --git a/image/lib/src/transform/copy_rectify.dart b/image/lib/src/transform/copy_rectify.dart
index 6eebcdb..1ad7c65 100755
--- a/image/lib/src/transform/copy_rectify.dart
+++ b/image/lib/src/transform/copy_rectify.dart
@@ -1,12 +1,14 @@
import '../image.dart';
import '../util/point.dart';
-/**
- * Returns a copy of the [src] image, where the given rectangle
- * has been mapped to the full image.
- */
-Image copyRectify(Image src, {Point topLeft, Point topRight, Point bottomLeft,
- Point bottomRight, Image toImage = null}) {
+/// Returns a copy of the [src] image, where the given rectangle
+/// has been mapped to the full image.
+Image copyRectify(Image src,
+ {Point topLeft,
+ Point topRight,
+ Point bottomLeft,
+ Point bottomRight,
+ Image toImage}) {
Image dst = toImage == null ? Image.from(src) : toImage;
for (int y = 0; y < dst.height; ++y) {
double v = y / (dst.height - 1);
@@ -14,9 +16,9 @@
double u = x / (dst.width - 1);
// bilinear interpolation
Point srcPixelCoord = topLeft * (1 - u) * (1 - v) +
- topRight * (u) * (1 - v) +
- bottomLeft * (1 - u) * (v) +
- bottomRight * (u) * (v);
+ topRight * (u) * (1 - v) +
+ bottomLeft * (1 - u) * (v) +
+ bottomRight * (u) * (v);
var srcPixel = src.getPixel(srcPixelCoord.xi, srcPixelCoord.yi);
dst.setPixel(x, y, srcPixel);
}
diff --git a/image/lib/src/transform/copy_resize.dart b/image/lib/src/transform/copy_resize.dart
index 03df52e..c5fb0a2 100755
--- a/image/lib/src/transform/copy_resize.dart
+++ b/image/lib/src/transform/copy_resize.dart
@@ -6,15 +6,13 @@
import '../util/interpolation.dart';
import 'bake_orientation.dart';
-/**
- * Returns a resized copy of the [src] image.
- * If [height] is -1, then it will be determined by the aspect
- * ratio of [src] and [width].
- * If [width] is -1, then it will be determined by the aspect ratio
- * of [src] and [height].
- */
-Image copyResize(Image src, int width, [int height = -1,
- int interpolation = NEAREST]) {
+/// Returns a resized copy of the [src] image.
+/// If [height] is -1, then it will be determined by the aspect
+/// ratio of [src] and [width].
+/// If [width] is -1, then it will be determined by the aspect ratio
+/// of [src] and [height].
+Image copyResize(Image src, int width,
+ [int height = -1, int interpolation = NEAREST]) {
if (width <= 0 && height <= 0) {
throw new ImageException('Invalid size');
}
@@ -83,11 +81,11 @@
} else {
// Copy the pixels from this image to the new image.
for (int y = 0; y < height; ++y) {
- double y2 = (y * dy);
- for (int x = 0; x < width; ++x) {
- double x2 = (x * dx);
- dst.setPixel(x, y, src.getPixelInterpolate(x2, y2, interpolation));
- }
+ double y2 = (y * dy);
+ for (int x = 0; x < width; ++x) {
+ double x2 = (x * dx);
+ dst.setPixel(x, y, src.getPixelInterpolate(x2, y2, interpolation));
+ }
}
}
diff --git a/image/lib/src/transform/copy_resize_crop_square.dart b/image/lib/src/transform/copy_resize_crop_square.dart
new file mode 100755
index 0000000..c7080eb
--- /dev/null
+++ b/image/lib/src/transform/copy_resize_crop_square.dart
@@ -0,0 +1,42 @@
+import 'dart:typed_data';
+
+import '../image.dart';
+import '../image_exception.dart';
+
+/// Returns a resized and square cropped copy of the [src] image of [size] size.
+Image copyResizeCropSquare(Image src, int size) {
+ if (size <= 0) {
+ throw new ImageException('Invalid size');
+ }
+
+ int height = size;
+ int width = size;
+ if (src.width < src.height){
+ height = (size * (src.height / src.width)).toInt();
+ }
+ else if (src.width > src.height){
+ width = (size * (src.width / src.height)).toInt();
+ }
+
+ Image dst = Image(size, size, src.format, src.exif, src.iccProfile);
+
+ double dy = src.height / height;
+ double dx = src.width / width;
+
+ int xOffset = ((width - size) ~/ 2);
+ int yOffset = ((height - size) ~/ 2);
+
+ final scaleX = Int32List(size);
+ for (int x = 0; x < size; ++x) {
+ scaleX[x] = ((x + xOffset) * dx).toInt();
+ }
+
+ for (int y = 0; y < size; ++y) {
+ int y2 = ((y + yOffset) * dy).toInt();
+ for (int x = 0; x < size; ++x) {
+ dst.setPixel(x, y, src.getPixel(scaleX[x], y2));
+ }
+ }
+
+ return dst;
+}
diff --git a/image/lib/src/transform/copy_rotate.dart b/image/lib/src/transform/copy_rotate.dart
index 31e3c2f..124dfcb 100755
--- a/image/lib/src/transform/copy_rotate.dart
+++ b/image/lib/src/transform/copy_rotate.dart
@@ -1,13 +1,11 @@
-import 'dart:math' as Math;
+import 'dart:math';
import '../image.dart';
import '../util/interpolation.dart';
-/**
- * Returns a copy of the [src] image, rotated by [angle] degrees.
- */
-Image copyRotate(Image src, num angle, {int interpolation: LINEAR}) {
- double nangle = angle % 360.0;
+/// Returns a copy of the [src] image, rotated by [angle] degrees.
+Image copyRotate(Image src, num angle, {int interpolation = LINEAR}) {
+ num nangle = angle % 360.0;
// Optimized version for orthogonal angles.
if ((nangle % 90.0) == 0.0) {
@@ -17,8 +15,8 @@
int iangle = nangle ~/ 90.0;
switch (iangle) {
case 1: // 90 deg.
- Image dst = Image(src.height, src.width, src.format, src.exif,
- src.iccProfile);
+ Image dst =
+ Image(src.height, src.width, src.format, src.exif, src.iccProfile);
for (int y = 0; y < dst.height; ++y) {
for (int x = 0; x < dst.width; ++x) {
dst.setPixel(x, y, src.getPixel(y, hm1 - x));
@@ -26,8 +24,8 @@
}
return dst;
case 2: // 180 deg.
- Image dst = Image(src.width, src.height, src.format, src.exif,
- src.iccProfile);
+ Image dst =
+ Image(src.width, src.height, src.format, src.exif, src.iccProfile);
for (int y = 0; y < dst.height; ++y) {
for (int x = 0; x < dst.width; ++x) {
dst.setPixel(x, y, src.getPixel(wm1 - x, hm1 - y));
@@ -35,8 +33,8 @@
}
return dst;
case 3: // 270 deg.
- Image dst = Image(src.height, src.width, src.format, src.exif,
- src.iccProfile);
+ Image dst =
+ Image(src.height, src.width, src.format, src.exif, src.iccProfile);
for (int y = 0; y < dst.height; ++y) {
for (int x = 0; x < dst.width; ++x) {
dst.setPixel(x, y, src.getPixel(wm1 - y, x));
@@ -49,9 +47,9 @@
}
// Generic angle.
- double rad = (nangle * Math.pi / 180.0);
- double ca = Math.cos(rad);
- double sa = Math.sin(rad);
+ double rad = (nangle * pi / 180.0);
+ double ca = cos(rad);
+ double sa = sin(rad);
double ux = (src.width * ca).abs();
double uy = (src.width * sa).abs();
double vx = (src.height * sa).abs();
@@ -61,14 +59,13 @@
double dw2 = 0.5 * (ux + vx);
double dh2 = 0.5 * (uy + vy);
- Image dst = Image((ux + vx).toInt(), (uy + vy).toInt(), Image.RGBA,
- src.exif, src.iccProfile);
+ Image dst = Image((ux + vx).toInt(), (uy + vy).toInt(), Image.RGBA, src.exif,
+ src.iccProfile);
for (int y = 0; y < dst.height; ++y) {
for (int x = 0; x < dst.width; ++x) {
int c = src.getPixelInterpolate(w2 + (x - dw2) * ca + (y - dh2) * sa,
- h2 - (x - dw2) * sa + (y - dh2) * ca,
- interpolation);
+ h2 - (x - dw2) * sa + (y - dh2) * ca, interpolation);
dst.setPixel(x, y, c);
}
}
diff --git a/image/lib/src/transform/flip.dart b/image/lib/src/transform/flip.dart
index 8cb81fa..1c9be85 100755
--- a/image/lib/src/transform/flip.dart
+++ b/image/lib/src/transform/flip.dart
@@ -9,10 +9,8 @@
/// Flip the image both horizontally and vertically.
const int FLIP_BOTH = 3;
-/**
- * Flips the [src] image using the given [mode], which can be one of:
- * [FLIP_HORIZONTAL], [FLIP_VERTICAL], or [FLIP_BOTH].
- */
+/// Flips the [src] image using the given [mode], which can be one of:
+/// [FLIP_HORIZONTAL], [FLIP_VERTICAL], or [FLIP_BOTH].
Image flip(Image src, int mode) {
if (mode < 1 || mode > 3) {
return src;
@@ -34,9 +32,7 @@
return src;
}
-/**
- * Flip the [src] image vertically.
- */
+/// Flip the [src] image vertically.
Image flipVertical(Image src) {
int w = src.width;
int h = src.height;
@@ -53,9 +49,7 @@
return src;
}
-/**
- * Flip the src image horizontally.
- */
+/// Flip the src image horizontally.
Image flipHorizontal(Image src) {
int w = src.width;
int h = src.height;
diff --git a/image/lib/src/transform/trim.dart b/image/lib/src/transform/trim.dart
index 1fa9f54..8c45129 100755
--- a/image/lib/src/transform/trim.dart
+++ b/image/lib/src/transform/trim.dart
@@ -5,10 +5,12 @@
/// Trim an image to the top-left and bottom-right most non-transparent pixels,
/// used by [findTrim] and [trim].
const int TRIM_TRANSPARENT = 0;
+
/// Trim an image to the top-left and bottom-right most pixels that are not the
/// same as the top-left most pixel of the image,
/// used by [findTrim] and [trim].
const int TRIM_TOP_LEFT_COLOR = 1;
+
/// Trim an image to the top-left and bottom-right most pixels that are not the
/// same as the bottom-right most pixel of the image,
/// used by [findTrim] and [trim].
@@ -17,31 +19,34 @@
/// Trim the image down from the top,
/// used by [findTrim] and [trim].
const int TRIM_TOP = 1;
+
/// Trim the image up from the bottom,
/// used by [findTrim] and [trim].
const int TRIM_BOTTOM = 2;
+
/// Trim the left edge of the image,
/// used by [findTrim] and [trim].
const int TRIM_LEFT = 4;
+
/// Trim the right edge of the image,
/// used by [findTrim] and [trim].
const int TRIM_RIGHT = 8;
+
/// Trim all edges of the image,
/// used by [findTrim] and [trim].
const int TRIM_ALL = TRIM_TOP | TRIM_BOTTOM | TRIM_LEFT | TRIM_RIGHT;
-/**
- * Find the crop area to be used by the trim function. Returns the
- * coordinates as [x, y, width, height]. You could pass these coordinates
- * to the [copyCrop] function to crop the image.
- */
-List<int> findTrim(Image src, {int mode: TRIM_TRANSPARENT, sides: TRIM_ALL}) {
+/// Find the crop area to be used by the trim function. Returns the
+/// coordinates as [x, y, width, height]. You could pass these coordinates
+/// to the [copyCrop] function to crop the image.
+List<int> findTrim(Image src, {int mode = TRIM_TRANSPARENT,
+ int sides = TRIM_ALL}) {
int h = src.height;
int w = src.width;
- int bg = (mode == TRIM_TOP_LEFT_COLOR) ? src.getPixel(0, 0) :
- (mode == TRIM_BOTTOM_RIGHT_COLOR) ? src.getPixel(w - 1, h - 1) :
- 0;
+ int bg = (mode == TRIM_TOP_LEFT_COLOR)
+ ? src.getPixel(0, 0)
+ : (mode == TRIM_BOTTOM_RIGHT_COLOR) ? src.getPixel(w - 1, h - 1) : 0;
int xmin = w;
int xmax = 0;
@@ -92,18 +97,16 @@
return [xmin, ymin, w, h];
}
-/**
- * Automatically crops the image by finding the corners of the image that
- * meet the [mode] criteria (not transparent or a different color).
- *
- * [mode] can be either [TRIM_TRANSPARENT], [TRIM_TOP_LEFT_CORNER] or
- * [TRIM_BOTTOM_RIGHT_CORNER].
- *
- * [sides] can be used to control which sides of the image get trimmed,
- * and can be any combination of [TRIM_TOP], [TRIM_BOTTOM], [TRIM_LEFT],
- * and [TRIM_RIGHT].
- */
-Image trim(Image src, {int mode: TRIM_TRANSPARENT, sides: TRIM_ALL}) {
+/// Automatically crops the image by finding the corners of the image that
+/// meet the [mode] criteria (not transparent or a different color).
+///
+/// [mode] can be either [TRIM_TRANSPARENT], [TRIM_TOP_LEFT_CORNER] or
+/// [TRIM_BOTTOM_RIGHT_CORNER].
+///
+/// [sides] can be used to control which sides of the image get trimmed,
+/// and can be any combination of [TRIM_TOP], [TRIM_BOTTOM], [TRIM_LEFT],
+/// and [TRIM_RIGHT].
+Image trim(Image src, {int mode = TRIM_TRANSPARENT, int sides = TRIM_ALL}) {
if (mode == TRIM_TRANSPARENT && src.format == Image.RGB) {
return new Image.from(src);
}
@@ -111,8 +114,8 @@
List<int> crop = findTrim(src, mode: mode, sides: sides);
Image dst = Image(crop[2], crop[3], Image.RGBA, src.exif, src.iccProfile);
- copyInto(dst, src, srcX: crop[0], srcY: crop[1],
- srcW: crop[2], srcH: crop[3], blend: false);
+ copyInto(dst, src,
+ srcX: crop[0], srcY: crop[1], srcW: crop[2], srcH: crop[3], blend: false);
return dst;
}
diff --git a/image/lib/src/util/clip_line.dart b/image/lib/src/util/clip_line.dart
index 5456f4f..6ca7f46 100755
--- a/image/lib/src/util/clip_line.dart
+++ b/image/lib/src/util/clip_line.dart
@@ -1,11 +1,9 @@
-/**
- * Clip a line to a rectangle using the Cohen–Sutherland clipping algorithm.
- * [line] is a list of 4 ints <x1, y1, x2, y2>.
- * [rect] is a list of 4 ints <x1, y1, x2, y2>.
- * Results are stored in [line].
- * If [line] falls completely outside of [rect], false is returned, otherwise
- * true is returned.
- */
+/// Clip a line to a rectangle using the Cohen–Sutherland clipping algorithm.
+/// [line] is a list of 4 ints <x1, y1, x2, y2>.
+/// [rect] is a list of 4 ints <x1, y1, x2, y2>.
+/// Results are stored in [line].
+/// If [line] falls completely outside of [rect], false is returned, otherwise
+/// true is returned.
bool clipLine(List<int> line, List<int> rect) {
int x0 = line[0];
int y0 = line[1];
@@ -17,24 +15,28 @@
int ymax = rect[3];
const int INSIDE = 0; // 0000
- const int LEFT = 1; // 0001
- const int RIGHT = 2; // 0010
+ const int LEFT = 1; // 0001
+ const int RIGHT = 2; // 0010
const int BOTTOM = 4; // 0100
- const int TOP = 8; // 1000
+ const int TOP = 8; // 1000
// Compute the bit code for a point (x, y) using the clip rectangle
// bounded diagonally by (xmin, ymin), and (xmax, ymax)
int _computeOutCode(int x, int y) {
int code = INSIDE; // initialised as being inside of clip window
- if (x < xmin) { // to the left of clip window
+ if (x < xmin) {
+ // to the left of clip window
code |= LEFT;
- } else if (x > xmax) { // to the right of clip window
+ } else if (x > xmax) {
+ // to the right of clip window
code |= RIGHT;
}
- if (y < ymin) { // below the clip window
+ if (y < ymin) {
+ // below the clip window
code |= BOTTOM;
- } else if (y > ymax) { // above the clip window
+ } else if (y > ymax) {
+ // above the clip window
code |= TOP;
}
diff --git a/image/lib/src/util/input_buffer.dart b/image/lib/src/util/input_buffer.dart
index ba5338e..f064405 100755
--- a/image/lib/src/util/input_buffer.dart
+++ b/image/lib/src/util/input_buffer.dart
@@ -3,9 +3,7 @@
import '../image_exception.dart';
import '../internal/bit_operators.dart';
-/**
- * A buffer that can be read as a stream of bytes.
- */
+/// A buffer that can be read as a stream of bytes.
class InputBuffer {
List<int> buffer;
final int start;
@@ -13,104 +11,83 @@
int offset;
bool bigEndian;
- /**
- * Create a InputStream for reading from a List<int>
- */
- InputBuffer(buffer, {this.bigEndian: false, int offset: 0, int length}) :
- this.buffer = buffer,
- this.start = offset,
- this.offset = offset,
- this.end = (length == null ? buffer.length : offset + length);
+ /// Create a InputStream for reading from a List<int>
+ InputBuffer(List<int> buffer, {this.bigEndian = false, int offset = 0,
+ int length})
+ : this.buffer = buffer,
+ this.start = offset,
+ this.offset = offset,
+ this.end = (length == null) ? buffer.length : offset + length;
- /**
- * Create a copy of [other].
- */
- InputBuffer.from(InputBuffer other, {int offset: 0, int length}) :
- this.buffer = other.buffer,
- this.offset = other.offset + offset,
- this.start = other.start,
- this.end = (length == null) ? other.end : other.offset + offset + length,
- this.bigEndian = other.bigEndian;
+ /// Create a copy of [other].
+ InputBuffer.from(InputBuffer other, {int offset = 0, int length})
+ : this.buffer = other.buffer,
+ this.offset = other.offset + offset,
+ this.start = other.start,
+ this.end =
+ (length == null) ? other.end : other.offset + offset + length,
+ this.bigEndian = other.bigEndian;
- /**
- * The current read position relative to the start of the buffer.
- */
+ /// The current read position relative to the start of the buffer.
int get position => offset - start;
- /**
- * How many bytes are left in the stream.
- */
+ /// How many bytes are left in the stream.
int get length => end - offset;
- /**
- * Is the current position at the end of the stream?
- */
+ /// Is the current position at the end of the stream?
bool get isEOS => offset >= end;
- /**
- * Reset to the beginning of the stream.
- */
+ /// Reset to the beginning of the stream.
void rewind() {
offset = start;
}
- /**
- * Access the buffer relative from the current position.
- */
- int operator[](int index) => buffer[offset + index];
+ /// Access the buffer relative from the current position.
+ int operator [](int index) => buffer[offset + index];
- /**
- * Set a buffer element relative to the current position.
- */
- operator[]=(int index, int value) => buffer[offset + index] = value;
+ /// Set a buffer element relative to the current position.
+ operator []=(int index, int value) => buffer[offset + index] = value;
- /**
- * Copy data from [other] to this buffer, at [start] offset from the
- * current read position, and [length] number of bytes. [offset] is
- * the offset in [other] to start reading.
- */
- void memcpy(int start, int length, other, [int offset = 0]) {
+ /// Copy data from [other] to this buffer, at [start] offset from the
+ /// current read position, and [length] number of bytes. [offset] is
+ /// the offset in [other] to start reading.
+ void memcpy(int start, int length, dynamic other, [int offset = 0]) {
if (other is InputBuffer) {
buffer.setRange(this.offset + start, this.offset + start + length,
- other.buffer, other.offset + offset);
+ other.buffer, other.offset + offset);
} else {
buffer.setRange(this.offset + start, this.offset + start + length,
- other, offset);
+ other as List<int>, offset);
}
}
- /**
- * Set a range of bytes in this buffer to [value], at [start] offset from the
- * current read poisiton, and [length] number of bytes.
- */
+ /// Set a range of bytes in this buffer to [value], at [start] offset from the
+ ///current read position, and [length] number of bytes.
void memset(int start, int length, int value) {
buffer.fillRange(offset + start, offset + start + length, value);
}
- /**
- * Return a InputStream to read a subset of this stream. It does not
- * move the read position of this stream. [position] is specified relative
- * to the start of the buffer. If [position] is not specified, the current
- * read position is used. If [length] is not specified, the remainder of this
- * stream is used.
- */
- InputBuffer subset(int count, {int position, int offset: 0}) {
+ /// Return a InputStream to read a subset of this stream. It does not
+ /// move the read position of this stream. [position] is specified relative
+ /// to the start of the buffer. If [position] is not specified, the current
+ /// read position is used. If [length] is not specified, the remainder of this
+ /// stream is used.
+ InputBuffer subset(int count, {int position, int offset = 0}) {
int pos = position != null ? start + position : this.offset;
pos += offset;
- return new InputBuffer(buffer, bigEndian: bigEndian, offset: pos,
- length: count);
+ return new InputBuffer(buffer,
+ bigEndian: bigEndian, offset: pos, length: count);
}
- /**
- * Returns the position of the given [value] within the buffer, starting
- * from the current read position with the given [offset]. The position
- * returned is relative to the start of the buffer, or -1 if the [value]
- * was not found.
- */
+ /// Returns the position of the given [value] within the buffer, starting
+ /// from the current read position with the given [offset]. The position
+ /// returned is relative to the start of the buffer, or -1 if the [value]
+ /// was not found.
int indexOf(int value, [int offset = 0]) {
for (int i = this.offset + offset, end = this.offset + length;
- i < end; ++i) {
+ i < end;
+ ++i) {
if (buffer[i] == value) {
return i - this.start;
}
@@ -118,24 +95,18 @@
return -1;
}
- /**
- * Read [count] bytes from an [offset] of the current read position, without
- * moving the read position.
- */
+ /// Read [count] bytes from an [offset] of the current read position, without
+ /// moving the read position.
InputBuffer peekBytes(int count, [int offset = 0]) {
return subset(count, offset: offset);
}
- /**
- * Move the read position by [count] bytes.
- */
+ /// Move the read position by [count] bytes.
void skip(int count) {
offset += count;
}
- /**
- * Read a single byte.
- */
+ /// Read a single byte.
int readByte() {
return buffer[offset++];
}
@@ -144,19 +115,15 @@
return uint8ToInt8(readByte());
}
- /**
- * Read [count] bytes from the stream.
- */
+ /// Read [count] bytes from the stream.
InputBuffer readBytes(int count) {
InputBuffer bytes = subset(count);
offset += bytes.length;
return bytes;
}
- /**
- * Read a null-terminated string, or if [len] is provided, that number of
- * bytes returned as a string.
- */
+ /// Read a null-terminated string, or if [len] is provided, that number of
+ /// bytes returned as a string.
String readString([int len]) {
if (len == null) {
List<int> codes = [];
@@ -176,9 +143,7 @@
return str;
}
- /**
- * Read a 16-bit word from the stream.
- */
+ /// Read a 16-bit word from the stream.
int readUint16() {
int b1 = buffer[offset++] & 0xff;
int b2 = buffer[offset++] & 0xff;
@@ -188,16 +153,12 @@
return (b2 << 8) | b1;
}
- /**
- * Read a 16-bit word from the stream.
- */
+ /// Read a 16-bit word from the stream.
int readInt16() {
return uint16ToInt16(readUint16());
}
- /**
- * Read a 24-bit word from the stream.
- */
+ /// Read a 24-bit word from the stream.
int readUint24() {
int b1 = buffer[offset++] & 0xff;
int b2 = buffer[offset++] & 0xff;
@@ -208,9 +169,7 @@
return b1 | (b2 << 8) | (b3 << 16);
}
- /**
- * Read a 32-bit word from the stream.
- */
+ /// Read a 32-bit word from the stream.
int readUint32() {
int b1 = buffer[offset++] & 0xff;
int b2 = buffer[offset++] & 0xff;
@@ -222,30 +181,22 @@
return (b4 << 24) | (b3 << 16) | (b2 << 8) | b1;
}
- /**
- * Read a signed 32-bit integer from the stream.
- */
+ /// Read a signed 32-bit integer from the stream.
int readInt32() {
return uint32ToInt32(readUint32());
}
- /**
- * Read a 32-bit float.
- */
+ /// Read a 32-bit float.
double readFloat32() {
return uint32ToFloat32(readUint32());
}
- /**
- * Read a 64-bit float.
- */
+ /// Read a 64-bit float.
double readFloat64() {
return uint64ToFloat64(readUint64());
}
- /**
- * Read a 64-bit word form the stream.
- */
+ /// Read a 64-bit word form the stream.
int readUint64() {
int b1 = buffer[offset++] & 0xff;
int b2 = buffer[offset++] & 0xff;
@@ -256,11 +207,23 @@
int b7 = buffer[offset++] & 0xff;
int b8 = buffer[offset++] & 0xff;
if (bigEndian) {
- return (b1 << 56) | (b2 << 48) | (b3 << 40) | (b4 << 32) |
- (b5 << 24) | (b6 << 16) | (b7 << 8) | b8;
+ return (b1 << 56) |
+ (b2 << 48) |
+ (b3 << 40) |
+ (b4 << 32) |
+ (b5 << 24) |
+ (b6 << 16) |
+ (b7 << 8) |
+ b8;
}
- return (b8 << 56) | (b7 << 48) | (b6 << 40) | (b5 << 32) |
- (b4 << 24) | (b3 << 16) | (b2 << 8) | b1;
+ return (b8 << 56) |
+ (b7 << 48) |
+ (b6 << 40) |
+ (b5 << 32) |
+ (b4 << 24) |
+ (b3 << 16) |
+ (b2 << 8) |
+ b1;
}
List<int> toList([int offset = 0, int length = 0]) {
@@ -275,20 +238,19 @@
Uint8List toUint8List([int offset = 0, int length]) {
int len = length != null ? length : this.length - offset;
if (buffer is Uint8List) {
- Uint8List b = buffer;
- return new Uint8List.view(b.buffer,
- b.offsetInBytes + this.offset + offset,
- len);
+ Uint8List b = buffer as Uint8List;
+ return new Uint8List.view(
+ b.buffer, b.offsetInBytes + this.offset + offset, len);
}
- return new Uint8List.fromList(buffer.sublist(this.offset + offset,
- this.offset + offset + len));
+ return new Uint8List.fromList(
+ buffer.sublist(this.offset + offset, this.offset + offset + len));
}
Uint32List toUint32List([int offset = 0]) {
if (buffer is Uint8List) {
- Uint8List b = buffer;
- return new Uint32List.view(b.buffer,
- b.offsetInBytes + this.offset + offset);
+ Uint8List b = buffer as Uint8List;
+ return new Uint32List.view(
+ b.buffer, b.offsetInBytes + this.offset + offset);
}
return new Uint32List.view(toUint8List().buffer);
}
diff --git a/image/lib/src/util/interpolation.dart b/image/lib/src/util/interpolation.dart
index 3012b50..8d20784 100755
--- a/image/lib/src/util/interpolation.dart
+++ b/image/lib/src/util/interpolation.dart
@@ -2,9 +2,12 @@
/// Nearest interopolation.
const int NEAREST = 0;
+
/// Linear interpolation.
const int LINEAR = 1;
+
/// Cubic interpolation.
const int CUBIC = 2;
+
/// Averaging interpolation
const int AVERAGE = 3;
diff --git a/image/lib/src/util/min_max.dart b/image/lib/src/util/min_max.dart
index 913afd4..ddf68cc 100755
--- a/image/lib/src/util/min_max.dart
+++ b/image/lib/src/util/min_max.dart
@@ -1,10 +1,8 @@
import '../color.dart';
import '../image.dart';
-/**
- * Find the minimum and maximum color value in the image.
- * Returns a list as <[min], [max]>.
- */
+/// Find the minimum and maximum color value in the image.
+/// Returns a list as <[min], [max]>.
List<int> minMax(Image image) {
int min = 255;
int max = 0;
@@ -45,4 +43,4 @@
}
return [min, max];
-}
\ No newline at end of file
+}
diff --git a/image/lib/src/util/neural_quantizer.dart b/image/lib/src/util/neural_quantizer.dart
index 1551bec..cb662e0 100755
--- a/image/lib/src/util/neural_quantizer.dart
+++ b/image/lib/src/util/neural_quantizer.dart
@@ -29,14 +29,12 @@
* Dart port by Brendan Duncan.
*/
-/**
- * Compute a color map with a given number of colors that best represents
- * the given image.
- */
+/// Compute a color map with a given number of colors that best represents
+/// the given image.
class NeuralQuantizer extends Quantizer {
Uint8List colorMap;
- NeuralQuantizer(Image image, {int numberOfColors=256}) {
+ NeuralQuantizer(Image image, {int numberOfColors = 256}) {
if (image.width * image.height < MAX_PRIME) {
throw new ImageException('Image is too small');
}
@@ -47,9 +45,7 @@
addImage(image);
}
- /**
- * Add an image to the quantized color table.
- */
+ /// Add an image to the quantized color table.
void addImage(Image image) {
_learn(image);
_fix();
@@ -57,21 +53,14 @@
_copyColorMap();
}
- /**
- * How many colors are in the [colorMap]?
- */
+ /// How many colors are in the [colorMap]?
int get numColors => NET_SIZE;
- /**
- * Get a color from the [colorMap].
- */
- int color(int index) => getColor(colorMap[index * 3],
- colorMap[index * 3 + 1],
- colorMap[index * 3 + 2]);
+ /// Get a color from the [colorMap].
+ int color(int index) => getColor(
+ colorMap[index * 3], colorMap[index * 3 + 1], colorMap[index * 3 + 2]);
- /**
- * Find the index of the closest color to [c] in the [colorMap].
- */
+ /// Find the index of the closest color to [c] in the [colorMap].
int lookup(int c) {
int r = getRed(c);
int g = getGreen(c);
@@ -79,16 +68,12 @@
return _inxSearch(b, g, r);
}
- /**
- * Find the index of the closest color to [r],[g],[b] in the [colorMap].
- */
+ /// Find the index of the closest color to [r],[g],[b] in the [colorMap].
int lookupRGB(int r, int g, int b) {
return _inxSearch(b, g, r);
}
- /**
- * Find the color closest to [c] in the [colorMap].
- */
+ /// Find the color closest to [c] in the [colorMap].
int getQuantizedColor(int c) {
int r = getRed(c);
int g = getGreen(c);
@@ -99,9 +84,7 @@
return getColor(colorMap[i], colorMap[i + 1], colorMap[i + 2], a);
}
- /**
- * Convert the [image] to an index map, mapping to this [colorMap].
- */
+ /// Convert the [image] to an index map, mapping to this [colorMap].
Uint8List getIndexMap(Image image) {
Uint8List map = Uint8List(image.width * image.height);
for (int i = 0, len = image.length; i < len; ++i) {
@@ -136,15 +119,15 @@
int _inxSearch(int b, int g, int r) {
// Search for BGR values 0..255 and return colour index
- int bestd = 1000; // biggest possible dist is 256*3
+ int bestd = 1000; // biggest possible dist is 256*3
int best = -1;
- int i = _netIndex[g]; // index on g
- int j = i - 1; // start at netindex[g] and work outwards
+ int i = _netIndex[g]; // index on g
+ int j = i - 1; // start at netindex[g] and work outwards
while ((i < NET_SIZE) || (j >= 0)) {
if (i < NET_SIZE) {
int p = i * 4;
- int dist = _colorMap[p + 1] - g; // inx key
+ int dist = _colorMap[p + 1] - g; // inx key
if (dist >= bestd) {
i = NET_SIZE; // stop iter
} else {
@@ -220,9 +203,7 @@
}
}
- /**
- * Insertion sort of network and building of netindex[0..255]
- */
+ /// Insertion sort of network and building of netindex[0..255]
void _inxBuild() {
int previouscol = 0;
int startpos = 0;
@@ -233,9 +214,10 @@
// find smallest in i..netsize-1
for (int j = i + 1, q = p + 4; j < NET_SIZE; j++, q += 4) {
- if (_colorMap[q + 1] < smallval) { // index on g
+ if (_colorMap[q + 1] < smallval) {
+ // index on g
smallpos = j;
- smallval = _colorMap[q + 1]; // index on g
+ smallval = _colorMap[q + 1]; // index on g
}
}
@@ -267,13 +249,13 @@
_netIndex[j] = i;
}
previouscol = smallval;
- startpos = i;
+ startpos = i;
}
}
_netIndex[previouscol] = (startpos + MAX_NET_POS) >> 1;
for (int j = previouscol + 1; j < 256; j++) {
- _netIndex[j] = MAX_NET_POS; // really 256
+ _netIndex[j] = MAX_NET_POS; // really 256
}
}
@@ -310,15 +292,16 @@
int i = 0;
while (i < samplePixels) {
int p = image[pos];
- int red = getRed(p);
+ int red = getRed(p);
int green = getGreen(p);
- int blue = getBlue(p);
+ int blue = getBlue(p);
double b = blue.toDouble();
double g = green.toDouble();
double r = red.toDouble();
- if (i == 0) { // remember background colour
+ if (i == 0) {
+ // remember background colour
_network[BG_COLOR * 3] = b;
_network[BG_COLOR * 3 + 1] = g;
_network[BG_COLOR * 3 + 2] = r;
@@ -327,11 +310,12 @@
int j = _specialFind(b, g, r);
j = j < 0 ? _contest(b, g, r) : j;
- if (j >= SPECIALS) { // don't learn for specials
+ if (j >= SPECIALS) {
+ // don't learn for specials
double a = (1.0 * alpha) / INIT_ALPHA;
_alterSingle(a, j, b, g, r);
if (rad > 0) {
- _alterNeighbors(a, rad, j, b, g, r); // alter neighbours
+ _alterNeighbors(a, rad, j, b, g, r); // alter neighbours
}
}
@@ -356,12 +340,12 @@
// Move neuron i towards biased (b,g,r) by factor alpha
int p = i * 3;
_network[p] -= (alpha * (_network[p] - b));
- _network[p + 1] -= (alpha*(_network[p + 1] - g));
- _network[p + 2] -= (alpha*(_network[p + 2] - r));
+ _network[p + 1] -= (alpha * (_network[p + 1] - g));
+ _network[p + 2] -= (alpha * (_network[p + 2] - r));
}
- void _alterNeighbors(double alpha, int rad, int i,
- double b, double g, double r) {
+ void _alterNeighbors(
+ double alpha, int rad, int i, double b, double g, double r) {
int lo = i - rad;
if (lo < SPECIALS - 1) {
lo = SPECIALS - 1;
@@ -450,11 +434,11 @@
}
void _setupArrays() {
- _network[0] = 0.0; // black
+ _network[0] = 0.0; // black
_network[1] = 0.0;
_network[2] = 0.0;
- _network[3] = 255.0; // white
+ _network[3] = 255.0; // white
_network[4] = 255.0;
_network[5] = 255.0;
@@ -497,7 +481,7 @@
static const double BETA_GAMMA = BETA * GAMMA;
/// the network itself
- List<double> _network ;
+ List<double> _network;
Int32List _colorMap;
Int32List _netIndex = Int32List(256);
// bias and freq arrays for learning
@@ -507,10 +491,10 @@
// four primes near 500 - assume no image has a length so large
// that it is divisible by all four primes
- static const int PRIME1 = 499;
- static const int PRIME2 = 491;
- static const int PRIME3 = 487;
- static const int PRIME4 = 503;
+ static const int PRIME1 = 499;
+ static const int PRIME2 = 491;
+ static const int PRIME3 = 487;
+ static const int PRIME4 = 503;
static const int MAX_PRIME = PRIME4;
int _sampleFac = 1;
diff --git a/image/lib/src/util/octree_quantizer.dart b/image/lib/src/util/octree_quantizer.dart
index ee1ed43..f9f4a7a 100755
--- a/image/lib/src/util/octree_quantizer.dart
+++ b/image/lib/src/util/octree_quantizer.dart
@@ -7,7 +7,7 @@
class OctreeQuantizer extends Quantizer {
_OctreeNode _root;
- OctreeQuantizer(Image image, {int numberOfColors=256}) {
+ OctreeQuantizer(Image image, {int numberOfColors = 256}) {
_root = _OctreeNode(0, 0, null);
_HeapNode heap = _HeapNode();
@@ -33,9 +33,7 @@
}
}
- /**
- * Find the index of the closest color to [c] in the [colorMap].
- */
+ /// Find the index of the closest color to [c] in the [colorMap].
int getQuantizedColor(int c) {
int r = getRed(c);
int g = getGreen(c);
@@ -44,8 +42,8 @@
for (int bit = 1 << 7; bit != 0; bit >>= 1) {
int i = ((g & bit) != 0 ? 1 : 0) * 4 +
- ((r & bit) != 0 ? 1 : 0) * 2 +
- ((b & bit) != 0 ? 1 : 0);
+ ((r & bit) != 0 ? 1 : 0) * 2 +
+ ((b & bit) != 0 ? 1 : 0);
if (root.children[i] == null) {
break;
}
@@ -71,12 +69,12 @@
return (ac < bc) ? -1 : (ac > bc) ? 1 : 0;
}
-
_OctreeNode _nodeInsert(_OctreeNode root, int r, int g, int b) {
int depth = 0;
for (int bit = 1 << 7; ++depth < 8; bit >>= 1) {
int i = ((g & bit) != 0 ? 1 : 0) * 4 +
- ((r & bit) != 0 ? 1 : 0) * 2 + ((b & bit) != 0 ? 1 : 0);
+ ((r & bit) != 0 ? 1 : 0) * 2 +
+ ((b & bit) != 0 ? 1 : 0);
if (root.children[i] == null) {
root.children[i] = _OctreeNode(i, depth, root);
}
@@ -185,7 +183,7 @@
int count = 0;
int heap_idx = 0;
List<_OctreeNode> children = List<_OctreeNode>(8);
- _OctreeNode parent = null;
+ _OctreeNode parent;
int childCount = 0;
int childIndex = 0;
int flags = 0;
diff --git a/image/lib/src/util/output_buffer.dart b/image/lib/src/util/output_buffer.dart
index 8de0a06..4d50e08 100755
--- a/image/lib/src/util/output_buffer.dart
+++ b/image/lib/src/util/output_buffer.dart
@@ -6,35 +6,27 @@
int length;
final bool bigEndian;
- /**
- * Create a byte buffer for writing.
- */
- OutputBuffer({int size: _BLOCK_SIZE, this.bigEndian: false}) :
- _buffer = Uint8List(size == null ? _BLOCK_SIZE : size),
- length = 0;
+ /// Create a byte buffer for writing.
+ OutputBuffer({int size = _BLOCK_SIZE, this.bigEndian = false})
+ : _buffer = Uint8List(size == null ? _BLOCK_SIZE : size),
+ length = 0;
void rewind() {
length = 0;
}
- /**
- * Get the resulting bytes from the buffer.
- */
+ /// Get the resulting bytes from the buffer.
List<int> getBytes() {
return new Uint8List.view(_buffer.buffer, 0, length);
}
- /**
- * Clear the buffer.
- */
+ /// Clear the buffer.
void clear() {
_buffer = Uint8List(_BLOCK_SIZE);
length = 0;
}
- /**
- * Write a byte to the end of the buffer.
- */
+ /// Write a byte to the end of the buffer.
void writeByte(int value) {
if (length == _buffer.length) {
_expandBuffer();
@@ -42,9 +34,7 @@
_buffer[length++] = value & 0xff;
}
- /**
- * Write a set of bytes to the end of the buffer.
- */
+ /// Write a set of bytes to the end of the buffer.
void writeBytes(List<int> bytes, [int len]) {
if (len == null) {
len = bytes.length;
@@ -64,9 +54,7 @@
length += bytes.length;
}
- /**
- * Write a 16-bit word to the end of the buffer.
- */
+ /// Write a 16-bit word to the end of the buffer.
void writeUint16(int value) {
if (bigEndian) {
writeByte((value >> 8) & 0xff);
@@ -77,9 +65,7 @@
writeByte((value >> 8) & 0xff);
}
- /**
- * Write a 32-bit word to the end of the buffer.
- */
+ /// Write a 32-bit word to the end of the buffer.
void writeUint32(int value) {
if (bigEndian) {
writeByte((value >> 24) & 0xff);
@@ -94,12 +80,10 @@
writeByte((value >> 24) & 0xff);
}
- /**
- * Return the subset of the buffer in the range [start:end].
- * If [start] or [end] are < 0 then it is relative to the end of the buffer.
- * If [end] is not specified (or null), then it is the end of the buffer.
- * This is equivalent to the python list range operator.
- */
+ /// Return the subset of the buffer in the range [start:end].
+ /// If [start] or [end] are < 0 then it is relative to the end of the buffer.
+ /// If [end] is not specified (or null), then it is the end of the buffer.
+ /// This is equivalent to the python list range operator.
List<int> subset(int start, [int end]) {
if (start < 0) {
start = (length) + start;
@@ -114,12 +98,11 @@
return new Uint8List.view(_buffer.buffer, start, end - start);
}
- /**
- * Grow the buffer to accommodate additional data.
- */
+ /// Grow the buffer to accommodate additional data.
void _expandBuffer([int required]) {
- int blockSize = (required != null) ? required :
- (_buffer.length == 0) ? _BLOCK_SIZE : (_buffer.length * 2);
+ int blockSize = (required != null)
+ ? required
+ : (_buffer.isEmpty) ? _BLOCK_SIZE : (_buffer.length * 2);
Uint8List newBuffer = Uint8List(_buffer.length + blockSize);
newBuffer.setRange(0, _buffer.length, _buffer);
_buffer = newBuffer;
diff --git a/image/lib/src/util/point.dart b/image/lib/src/util/point.dart
index 8378713..49e20eb 100755
--- a/image/lib/src/util/point.dart
+++ b/image/lib/src/util/point.dart
@@ -1,22 +1,28 @@
+/// 2-dimensional point
class Point {
num x;
num y;
- get xi { return x.toInt(); }
- get yi { return y.toInt(); }
+ int get xi {
+ return x.toInt();
+ }
+
+ int get yi {
+ return y.toInt();
+ }
Point([this.x = 0, this.y = 0]);
Point.from(Point other)
- : x = other.x
- , y = other.y;
+ : x = other.x,
+ y = other.y;
- Point operator*(double s) {
+ Point operator *(double s) {
return Point(x * s, y * s);
}
- Point operator+(Point rhs) {
+ Point operator +(Point rhs) {
return Point(x + rhs.x, y + rhs.y);
}
}
diff --git a/image/lib/src/util/quantizer.dart b/image/lib/src/util/quantizer.dart
index 0770797..ed4252f 100755
--- a/image/lib/src/util/quantizer.dart
+++ b/image/lib/src/util/quantizer.dart
@@ -1,7 +1,4 @@
-
abstract class Quantizer {
- /**
- * Find the index of the closest color to [c] in the [colorMap].
- */
+ /// Find the index of the closest color to [c] in the [colorMap].
int getQuantizedColor(int c);
}
diff --git a/image/lib/src/util/random.dart b/image/lib/src/util/random.dart
index 9ce006f..020235a 100755
--- a/image/lib/src/util/random.dart
+++ b/image/lib/src/util/random.dart
@@ -1,17 +1,13 @@
-import 'dart:math' as Math;
+import 'dart:math';
-/**
- * Return a random variable between [-1,1].
- */
-double crand(Math.Random rand) {
+/// Return a random variable between [-1,1].
+double crand(Random rand) {
return 1.0 - 2.0 * rand.nextDouble();
}
-/**
- * Return a random variable following a gaussian distribution and a standard
- * deviation of 1.
- */
-double grand(Math.Random rand) {
+/// Return a random variable following a gaussian distribution and a standard
+/// deviation of 1.
+double grand(Random rand) {
double x1, w;
do {
double x2 = 2.0 * rand.nextDouble() - 1.0;
@@ -19,21 +15,19 @@
w = x1 * x1 + x2 * x2;
} while (w <= 0.0 || w >= 1.0);
- return x1 * Math.sqrt((-2.0 * Math.log(w)) /w);
+ return x1 * sqrt((-2.0 * log(w)) / w);
}
-/**
- * Return a random variable following a Poisson distribution of parameter [z].
- */
-int prand(Math.Random rand, double z) {
+/// Return a random variable following a Poisson distribution of parameter [z].
+int prand(Random rand, double z) {
if (z <= 1.0e-10) {
return 0;
}
if (z > 100) {
- return ((Math.sqrt(z) * grand(rand)) + z).toInt();
+ return ((sqrt(z) * grand(rand)) + z).toInt();
}
int k = 0;
- double y = Math.exp(-z);
+ double y = exp(-z);
for (double s = 1.0; s >= y; ++k) {
s *= rand.nextDouble();
}
diff --git a/image/pubspec.yaml b/image/pubspec.yaml
index 08b84c2..d771c52 100755
--- a/image/pubspec.yaml
+++ b/image/pubspec.yaml
@@ -1,5 +1,5 @@
name: image
-version: 2.0.8
+version: 2.0.9
author: Brendan Duncan <brendanduncan@gmail.com>
description: Provides server and web apps the ability to load, manipulate, and save images with various image file formats including PNG, JPEG, GIF, WebP, TIFF, TGA, PSD, PVR, and OpenEXR.
homepage: https://github.com/brendan-duncan/image
@@ -11,3 +11,4 @@
xml: '>=3.2.5 <4.0.0'
dev_dependencies:
test: '>=0.12.42 <2.0.0'
+ pedantic: ^1.0.0
diff --git a/image/web/filter_lab.dart b/image/web/filter_lab.dart
index c56498e..445253a 100755
--- a/image/web/filter_lab.dart
+++ b/image/web/filter_lab.dart
@@ -1,16 +1,16 @@
-import 'dart:html' as Html;
+import 'dart:html';
import 'package:image/image.dart';
-Html.ImageData filterImageData;
-Html.CanvasElement canvas;
-Html.DivElement logDiv;
+ImageData filterImageData;
+CanvasElement canvas;
+DivElement logDiv;
Image origImage;
-void _addControl(String label, String value, Html.DivElement parent,
- callback) {
- Html.LabelElement amountLabel = Html.LabelElement();
+void _addControl(String label, String value, DivElement parent,
+ dynamic callback) {
+ LabelElement amountLabel = LabelElement();
amountLabel.text = label + ':';
- var amountEdit = Html.InputElement();
+ var amountEdit = InputElement();
amountEdit.value = value;
amountEdit.id = label + '_edit';
amountEdit.onChange.listen((e) {
@@ -18,24 +18,24 @@
double d = double.parse(amountEdit.value);
callback(d);
} catch (e) {
+ print(e);
}
});
amountLabel.htmlFor = label + '_edit';
parent.append(amountLabel);
parent.append(amountEdit);
- parent.append(new Html.ParagraphElement());
+ parent.append(new ParagraphElement());
}
-
void testSepia() {
- Html.DivElement sidebar = Html.document.querySelector('#sidebar');
+ var sidebar = document.querySelector('#sidebar') as DivElement;
sidebar.children.clear();
- var label = Html.Element.tag('h1');
+ var label = Element.tag('h1');
label.text = 'Sepia';
sidebar.children.add(label);
- double amount = 1.0;
+ num amount = 1.0;
void _apply() {
Stopwatch t = Stopwatch();
@@ -44,8 +44,8 @@
image = sepia(image, amount: amount);
// Fill the buffer with our image data.
- filterImageData.data.setRange(0, filterImageData.data.length,
- image.getBytes());
+ filterImageData.data
+ .setRange(0, filterImageData.data.length, image.getBytes());
// Draw the buffer onto the canvas.
canvas.context2D.clearRect(0, 0, canvas.width, canvas.height);
canvas.context2D.putImageData(filterImageData, 0, 0);
@@ -53,7 +53,7 @@
print(t.elapsedMilliseconds / 1000.0);
}
- _addControl('Amount', amount.toString(), sidebar, (v) {
+ _addControl('Amount', amount.toString(), sidebar, (num v) {
amount = v;
_apply();
});
@@ -62,14 +62,14 @@
}
void testSobel() {
- Html.DivElement sidebar = Html.document.querySelector('#sidebar');
+ var sidebar = document.querySelector('#sidebar') as DivElement;
sidebar.children.clear();
- var label = Html.Element.tag('h1');
+ var label = Element.tag('h1');
label.text = 'Sepia';
sidebar.children.add(label);
- double amount = 1.0;
+ num amount = 1.0;
void _apply() {
Stopwatch t = Stopwatch();
@@ -78,8 +78,8 @@
image = sobel(image, amount: amount);
// Fill the buffer with our image data.
- filterImageData.data.setRange(0, filterImageData.data.length,
- image.getBytes());
+ filterImageData.data
+ .setRange(0, filterImageData.data.length, image.getBytes());
// Draw the buffer onto the canvas.
canvas.context2D.clearRect(0, 0, canvas.width, canvas.height);
canvas.context2D.putImageData(filterImageData, 0, 0);
@@ -87,7 +87,7 @@
print(t.elapsedMilliseconds / 1000.0);
}
- _addControl('Amount', amount.toString(), sidebar, (v) {
+ _addControl('Amount', amount.toString(), sidebar, (num v) {
amount = v;
_apply();
});
@@ -96,10 +96,10 @@
}
void testGaussian() {
- Html.DivElement sidebar = Html.document.querySelector('#sidebar');
+ var sidebar = document.querySelector('#sidebar') as DivElement;
sidebar.children.clear();
- var label = Html.Element.tag('h1');
+ var label = Element.tag('h1');
label.text = 'Gaussian Blur';
sidebar.children.add(label);
@@ -112,8 +112,8 @@
image = gaussianBlur(image, radius);
// Fill the buffer with our image data.
- filterImageData.data.setRange(0, filterImageData.data.length,
- image.getBytes());
+ filterImageData.data
+ .setRange(0, filterImageData.data.length, image.getBytes());
// Draw the buffer onto the canvas.
canvas.context2D.clearRect(0, 0, canvas.width, canvas.height);
canvas.context2D.putImageData(filterImageData, 0, 0);
@@ -121,7 +121,7 @@
print(t.elapsedMilliseconds / 1000.0);
}
- _addControl('Radius', radius.toString(), sidebar, (v) {
+ _addControl('Radius', radius.toString(), sidebar, (num v) {
radius = v.toInt();
_apply();
});
@@ -130,16 +130,16 @@
}
void testVignette() {
- Html.DivElement sidebar = Html.document.querySelector('#sidebar');
+ var sidebar = document.querySelector('#sidebar') as DivElement;
sidebar.children.clear();
- var label = Html.Element.tag('h1');
+ var label = Element.tag('h1');
label.text = 'Vignette';
sidebar.children.add(label);
- double start = 0.3;
- double end = 0.75;
- double amount = 1.0;
+ num start = 0.3;
+ num end = 0.75;
+ num amount = 1.0;
void _apply() {
Stopwatch t = Stopwatch();
@@ -149,7 +149,7 @@
// Fill the buffer with our image data.
filterImageData.data.setRange(0, filterImageData.data.length,
- image.getBytes());
+ image.getBytes());
// Draw the buffer onto the canvas.
canvas.context2D.clearRect(0, 0, canvas.width, canvas.height);
canvas.context2D.putImageData(filterImageData, 0, 0);
@@ -157,29 +157,29 @@
print(t.elapsedMilliseconds / 1000.0);
}
- _addControl('Start', start.toString(), sidebar, (v) {
+ _addControl('Start', start.toString(), sidebar, (num v) {
start = v;
_apply();
});
- _addControl('End', end.toString(), sidebar, (v) {
- end = v;
- _apply();
- });
+ _addControl('End', end.toString(), sidebar, (num v) {
+ end = v;
+ _apply();
+ });
- _addControl('Amount', amount.toString(), sidebar, (v) {
- amount = v;
- _apply();
- });
+ _addControl('Amount', amount.toString(), sidebar, (num v) {
+ amount = v;
+ _apply();
+ });
_apply();
}
void testPixelate() {
- Html.DivElement sidebar = Html.document.querySelector('#sidebar');
+ var sidebar = document.querySelector('#sidebar') as DivElement;
sidebar.children.clear();
- var label = Html.Element.tag('h1');
+ var label = Element.tag('h1');
label.text = 'Pixelate';
sidebar.children.add(label);
@@ -193,7 +193,7 @@
// Fill the buffer with our image data.
filterImageData.data.setRange(0, filterImageData.data.length,
- image.getBytes());
+ image.getBytes());
// Draw the buffer onto the canvas.
canvas.context2D.clearRect(0, 0, canvas.width, canvas.height);
canvas.context2D.putImageData(filterImageData, 0, 0);
@@ -201,7 +201,7 @@
print(t.elapsedMilliseconds / 1000.0);
}
- _addControl('blockSize', blockSize.toString(), sidebar, (v) {
+ _addControl('blockSize', blockSize.toString(), sidebar, (num v) {
blockSize = v.toInt();
_apply();
});
@@ -210,10 +210,10 @@
}
void testColorOffset() {
- Html.DivElement sidebar = Html.document.querySelector('#sidebar');
+ var sidebar = document.querySelector('#sidebar') as DivElement;
sidebar.children.clear();
- var label = Html.Element.tag('h1');
+ var label = Element.tag('h1');
label.text = 'Pixelate';
sidebar.children.add(label);
@@ -230,7 +230,7 @@
// Fill the buffer with our image data.
filterImageData.data.setRange(0, filterImageData.data.length,
- image.getBytes());
+ image.getBytes());
// Draw the buffer onto the canvas.
canvas.context2D.clearRect(0, 0, canvas.width, canvas.height);
canvas.context2D.putImageData(filterImageData, 0, 0);
@@ -238,57 +238,62 @@
print(t.elapsedMilliseconds / 1000.0);
}
- _addControl('red', red.toString(), sidebar, (v) {
+ _addControl('red', red.toString(), sidebar, (num v) {
red = v.toInt();
_apply();
});
- _addControl('green', red.toString(), sidebar, (v) {
- green = v.toInt();
- _apply();
- });
+ _addControl('green', red.toString(), sidebar, (num v) {
+ green = v.toInt();
+ _apply();
+ });
- _addControl('blue', red.toString(), sidebar, (v) {
- blue = v.toInt();
- _apply();
- });
+ _addControl('blue', red.toString(), sidebar, (num v) {
+ blue = v.toInt();
+ _apply();
+ });
- _addControl('alpha', red.toString(), sidebar, (v) {
- alpha = v.toInt();
- _apply();
- });
+ _addControl('alpha', red.toString(), sidebar, (num v) {
+ alpha = v.toInt();
+ _apply();
+ });
_apply();
}
void testAdjustColor() {
- Html.DivElement sidebar = Html.document.querySelector('#sidebar');
+ var sidebar = document.querySelector('#sidebar') as DivElement;
sidebar.children.clear();
- var label = Html.Element.tag('h1');
+ var label = Element.tag('h1');
label.text = 'Adjust Color';
sidebar.children.add(label);
- double contrast = 1.0;
- double saturation = 1.0;
- double brightness = 1.0;
- double gamma = 0.8;
- double exposure = 0.3;
- double hue = 0.0;
- double amount = 1.0;
+ num contrast = 1.0;
+ num saturation = 1.0;
+ num brightness = 1.0;
+ num gamma = 0.8;
+ num exposure = 0.3;
+ num hue = 0.0;
+ num amount = 1.0;
void _apply() {
Stopwatch t = Stopwatch();
t.start();
Image image = Image.from(origImage);
- image = adjustColor(image, contrast: contrast, saturation: saturation,
- brightness: brightness, gamma: gamma, exposure: exposure,
- hue: hue, amount: amount);
+ image = adjustColor(image,
+ contrast: contrast,
+ saturation: saturation,
+ brightness: brightness,
+ gamma: gamma,
+ exposure: exposure,
+ hue: hue,
+ amount: amount);
// Fill the buffer with our image data.
- filterImageData.data.setRange(0, filterImageData.data.length,
- image.getBytes());
+ filterImageData.data
+ .setRange(0, filterImageData.data.length, image.getBytes());
// Draw the buffer onto the canvas.
canvas.context2D.clearRect(0, 0, canvas.width, canvas.height);
canvas.context2D.putImageData(filterImageData, 0, 0);
@@ -297,37 +302,37 @@
print(t.elapsedMilliseconds / 1000.0);
}
- _addControl('Contrast', contrast.toString(), sidebar, (v) {
+ _addControl('Contrast', contrast.toString(), sidebar, (num v) {
contrast = v;
_apply();
});
- _addControl('Saturation', saturation.toString(), sidebar, (v) {
- saturation = v;
- _apply();
- });
+ _addControl('Saturation', saturation.toString(), sidebar, (num v) {
+ saturation = v;
+ _apply();
+ });
- _addControl('Brightness', brightness.toString(), sidebar, (v) {
- brightness = v;
- _apply();
- });
+ _addControl('Brightness', brightness.toString(), sidebar, (num v) {
+ brightness = v;
+ _apply();
+ });
- _addControl('Gamma', gamma.toString(), sidebar, (v) {
- gamma = v;
- _apply();
- });
+ _addControl('Gamma', gamma.toString(), sidebar, (num v) {
+ gamma = v;
+ _apply();
+ });
- _addControl('Exposure', exposure.toString(), sidebar, (v) {
- exposure = v;
- _apply();
- });
+ _addControl('Exposure', exposure.toString(), sidebar, (num v) {
+ exposure = v;
+ _apply();
+ });
- _addControl('Hue', hue.toString(), sidebar, (v) {
- hue = v;
- _apply();
- });
+ _addControl('Hue', hue.toString(), sidebar, (num v) {
+ hue = v;
+ _apply();
+ });
- _addControl('Amount', amount.toString(), sidebar, (v) {
+ _addControl('Amount', amount.toString(), sidebar, (num v) {
amount = v;
_apply();
});
@@ -336,10 +341,10 @@
}
void main() {
- canvas = Html.document.querySelector('#filter_canvas');
- logDiv = Html.document.querySelector('#log');
+ canvas = document.querySelector('#filter_canvas') as CanvasElement;
+ logDiv = document.querySelector('#log') as DivElement;
- Html.SelectElement menu = Html.document.querySelector('#FilterType');
+ var menu = document.querySelector('#FilterType') as SelectElement;
menu.onChange.listen((e) {
if (menu.value == 'Pixelate') {
testPixelate();
@@ -358,10 +363,10 @@
}
});
- Html.ImageElement img = Html.ImageElement();
+ ImageElement img = ImageElement();
img.src = 'res/big_buck_bunny.jpg';
img.onLoad.listen((e) {
- var c = Html.CanvasElement();
+ var c = CanvasElement();
c.width = img.width;
c.height = img.height;
c.context2D.drawImage(img, 0, 0);
diff --git a/image/web/image_http_input.dart b/image/web/image_http_input.dart
index 4b5d991..5f14a61 100755
--- a/image/web/image_http_input.dart
+++ b/image/web/image_http_input.dart
@@ -1,39 +1,35 @@
-import 'dart:html' as Html;
+import 'dart:html';
import 'package:image/image.dart';
import 'dart:convert';
-Html.InputElement fileInput;
+InputElement fileInput;
void main() {
// There are at least two ways to get a file into an html dart app:
// using a file Input element, or an AJAX HttpRequest.
// This example demonstrates using a file Input element.
- fileInput = Html.querySelector("#file");
+ fileInput = querySelector("#file") as InputElement;
fileInput.addEventListener("change", onFileChanged);
}
-/**
- * Called when the user has selected a file.
- */
-void onFileChanged(Html.Event event) {
- Html.FileList files = fileInput.files;
+/// Called when the user has selected a file.
+void onFileChanged(Event event) {
+ var files = fileInput.files as FileList;
var file = files.item(0);
- Html.FileReader reader = Html.FileReader();
+ FileReader reader = FileReader();
reader.addEventListener("load", onFileLoaded);
reader.readAsArrayBuffer(file);
}
-/**
- * Called when the file has been read.
- */
-void onFileLoaded(Html.Event event) {
- Html.FileReader reader = event.currentTarget;
+/// Called when the file has been read.
+void onFileLoaded(Event event) {
+ FileReader reader = event.currentTarget as FileReader;
- var bytes = reader.result;
+ var bytes = reader.result as List<int>;
// Find a decoder that is able to decode the given file contents.
Decoder decoder = findDecoderForData(bytes);
@@ -51,29 +47,28 @@
// a canvas.
if (image != null) {
// Add a separator to the html page
- Html.document.body.append(new Html.ParagraphElement());
+ document.body.append(new ParagraphElement());
// Draw the image into a canvas. First create a canvas at the correct
// resolution.
- var c = Html.CanvasElement();
- Html.document.body.append(c);
+ var c = CanvasElement();
+ document.body.append(c);
c.width = image.width;
c.height = image.height;
// Create a buffer that the canvas can draw.
- Html.ImageData d = c.context2D.createImageData(c.width, c.height);
+ ImageData d = c.context2D.createImageData(c.width, c.height);
// Fill the buffer with our image data.
d.data.setRange(0, d.data.length, image.getBytes());
// Draw the buffer onto the canvas.
c.context2D.putImageData(d, 0, 0);
-
// OR we could use an IMG element to display the image.
// This requires encoding it to a common format (like PNG), base64 encoding
// the encoded image, and using a data url for the img src.
- var img = Html.ImageElement();
- Html.document.body.append(img);
+ var img = ImageElement();
+ document.body.append(img);
// encode the image to a PNG
var png = encodePng(image);
// base64 encode the png
diff --git a/image/web/image_server.dart b/image/web/image_server.dart
index ae1b0ea..a2ecc78 100755
--- a/image/web/image_server.dart
+++ b/image/web/image_server.dart
@@ -1,15 +1,15 @@
-import 'dart:io' as Io;
+import 'dart:io';
import 'package:image/image.dart';
void main(List<String> argv) {
- if (argv.length < 1) {
+ if (argv.isEmpty) {
print('Usage: image_server <image_file>');
return;
}
String filename = argv[0];
- Io.File file = Io.File(filename);
+ File file = File(filename);
if (!file.existsSync()) {
print('File does not exist: ${filename}');
return;
@@ -30,5 +30,5 @@
// Save the image as a PNG
List<int> png = PngEncoder().encodeImage(image);
// Write the PNG to disk
- new Io.File(filename + '.png').writeAsBytesSync(png);
+ new File(filename + '.png').writeAsBytesSync(png);
}
diff --git a/image/web/mandelbrot.dart b/image/web/mandelbrot.dart
index 5ef0d6c..e58a887 100755
--- a/image/web/mandelbrot.dart
+++ b/image/web/mandelbrot.dart
@@ -1,4 +1,4 @@
-import 'dart:html' as Html;
+import 'dart:html';
import 'dart:math';
import 'package:image/image.dart';
@@ -6,16 +6,14 @@
return log(x) / div;
}
-/**
- * Render the Mandelbrot Set into an Image and display it.
- */
+/// Render the Mandelbrot Set into an Image and display it.
void main() {
const int width = 1024;
const int height = 1024;
// Create a canvas to put our decoded image into.
- var c = Html.CanvasElement(width: width, height: height);
- Html.document.body.append(c);
+ var c = CanvasElement(width: width, height: height);
+ document.body.append(c);
double zoom = 1.0;
double moveX = -0.5;
@@ -55,8 +53,9 @@
image.setPixelRGBA(x, y, 0, 0, 0);
} else {
double z = sqrt(newRe * newRe + newIm * newIm);
- double b = 256.0 * logN(1.75 + i -
- logN(logN(z, log2), log2), log2) / Log2MaxIterations;
+ double b = 256.0 *
+ logN(1.75 + i - logN(logN(z, log2), log2), log2) /
+ Log2MaxIterations;
int brightness = b.toInt();
image.setPixelRGBA(x, y, brightness, brightness, 255);
}
@@ -64,7 +63,7 @@
}
// Create a buffer that the canvas can draw.
- Html.ImageData d = c.context2D.createImageData(image.width, image.height);
+ ImageData d = c.context2D.createImageData(image.width, image.height);
// Fill the buffer with our image data.
d.data.setRange(0, d.data.length, image.getBytes());
// Draw the buffer onto the canvas.
diff --git a/image/web/test_formats.dart b/image/web/test_formats.dart
index 7005f75..66674f6 100755
--- a/image/web/test_formats.dart
+++ b/image/web/test_formats.dart
@@ -1,44 +1,51 @@
-import 'dart:html' as Html;
-import 'dart:async' as Async;
+import 'dart:html';
+import 'dart:async';
+import 'dart:html' as prefix0;
import 'dart:typed_data';
import 'package:image/image.dart';
-/**
- * Decode and display various image formats. This is used as a visual
- * unit-test to indentify problems that may occur after the translation to
- * javascript.
- */
+/// Decode and display various image formats. This is used as a visual
+/// unit-test to identify problems that may occur after the translation to
+/// javascript.
void main() {
// An img on the html page is used to establish the path to the images
// directory. It's removed after we get the path since we'll be populating
// the page with our own decoded images.
- Html.ImageElement img = Html.querySelectorAll('img')[0];
+ var img = querySelectorAll('img')[0] as prefix0.ImageElement;
String path = img.src.substring(0, img.src.lastIndexOf('/'));
img.remove();
// The list of images we'll be decoding, representing a wide range
// of formats and sub-formats.
- List<String> images = ['penguins.jpg', '1_webp_ll.webp', '1.webp', '3_webp_a.webp',
- 'puppies.jpg', 'cars.gif', 'trees.png',
- 'animated.png', 'BladeRunner_lossy.webp'];
+ List<String> images = [
+ 'penguins.jpg',
+ '1_webp_ll.webp',
+ '1.webp',
+ '3_webp_a.webp',
+ 'puppies.jpg',
+ 'cars.gif',
+ 'trees.png',
+ 'animated.png',
+ 'BladeRunner_lossy.webp'
+ ];
for (String name in images) {
// Use an http request to get the image file from disk.
- var req = Html.HttpRequest();
+ var req = HttpRequest();
req.open('GET', path + '/' + name);
req.responseType = 'arraybuffer';
req.onLoadEnd.listen((e) {
if (req.status == 200) {
// Convert the text to binary byte list.
- List<int> bytes = Uint8List.view(req.response);
+ List<int> bytes = Uint8List.view(req.response as ByteBuffer);
- var label = Html.DivElement();
- Html.document.body.append(label);
+ var label = DivElement();
+ document.body.append(label);
label.text = name;
// Create a canvas to put our decoded image into.
- var c = Html.CanvasElement();
- Html.document.body.append(c);
+ var c = CanvasElement();
+ document.body.append(c);
// Find the best decoder for the image.
Decoder decoder = findDecoderForData(bytes);
@@ -64,7 +71,7 @@
c.height = newImage.height;
// Create a buffer that the canvas can draw.
- Html.ImageData d = c.context2D.createImageData(c.width, c.height);
+ ImageData d = c.context2D.createImageData(c.width, c.height);
// Fill the buffer with our image data.
d.data.setRange(0, d.data.length, newImage.getBytes());
// Draw the buffer onto the canvas.
@@ -81,10 +88,10 @@
c.width = anim.frames[0].width;
c.height = anim.frames[0].height;
// Create a buffer that the canvas can draw.
- Html.ImageData d = c.context2D.createImageData(c.width, c.height);
+ ImageData d = c.context2D.createImageData(c.width, c.height);
int frame = 0;
- new Async.Timer.periodic(new Duration(milliseconds: 40), (t) {
+ new Timer.periodic(new Duration(milliseconds: 40), (t) {
Image image = anim.frames[frame++];
if (frame >= anim.numFrames) {
frame = 0;
@@ -96,7 +103,7 @@
c.context2D.putImageData(d, 0, 0);
});
}
- });
- req.send('');
+ });
+ req.send('');
}
}
diff --git a/image/web/test_jpeg_encoder.dart b/image/web/test_jpeg_encoder.dart
index fdad554..5358177 100755
--- a/image/web/test_jpeg_encoder.dart
+++ b/image/web/test_jpeg_encoder.dart
@@ -1,16 +1,16 @@
-import 'dart:html' as Html;
+import 'dart:html';
import 'dart:convert';
import 'package:image/image.dart';
void main() {
- var theImg = Html.document.getElementById('testimage') as Html.ImageElement;
- var cvs = Html.document.createElement('canvas') as Html.CanvasElement;
+ var theImg = document.getElementById('testimage') as ImageElement;
+ var cvs = document.createElement('canvas') as CanvasElement;
cvs.width = theImg.width;
cvs.height = theImg.height;
- var ctx = cvs.getContext("2d") as Html.CanvasRenderingContext2D;
+ var ctx = cvs.getContext("2d") as CanvasRenderingContext2D;
- ctx.drawImage(theImg,0,0);
+ ctx.drawImage(theImg, 0, 0);
var bytes = ctx.getImageData(0, 0, cvs.width, cvs.height).data;
Image image = Image.fromBytes(cvs.width, cvs.height, bytes);
@@ -18,7 +18,7 @@
var jpg = encodeJpg(image, quality: 25);
var jpg64 = base64Encode(jpg);
- var img = Html.document.createElement('img') as Html.ImageElement;
+ var img = document.createElement('img') as ImageElement;
img.src = 'data:image/png;base64,${jpg64}';
- Html.document.body.append(img);
+ document.body.append(img);
}
diff --git a/image/web/webp_viewer.dart b/image/web/webp_viewer.dart
index 26aa389..4d92c53 100755
--- a/image/web/webp_viewer.dart
+++ b/image/web/webp_viewer.dart
@@ -1,25 +1,27 @@
-import 'dart:html' as Html;
+import 'dart:html';
import 'dart:convert';
import 'package:image/image.dart';
-/**
- * Convert all .webp IMG elements on the page to PNG so that they can be viewed
- * by browsers like FireFox and IE.
- */
+/// Convert all .webp IMG elements on the page to PNG so that they can be viewed
+/// by browsers like FireFox and IE.
void main() {
- var images = Html.querySelectorAll('img');
+ var images = querySelectorAll('img');
for (var _img in images) {
- var img = _img as Html.ImageElement;
+ var img = _img as ImageElement;
if (img.src.toLowerCase().endsWith('.webp')) {
- var req = Html.HttpRequest();
+ var req = HttpRequest();
req.open('GET', img.src);
req.overrideMimeType('text\/plain; charset=x-user-defined');
req.onLoadEnd.listen((e) {
if (req.status == 200) {
- var bytes = req.responseText.split('').map((e){
- return new String.fromCharCode(e.codeUnitAt(0) & 0xff);
- }).join('').codeUnits;
+ var bytes = req.responseText
+ .split('')
+ .map((e) {
+ return new String.fromCharCode(e.codeUnitAt(0) & 0xff);
+ })
+ .join('')
+ .codeUnits;
Image image = decodeWebP(bytes);
List<int> png = encodePng(image);