holder_rails 2.9.0 → 2.9.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 39c5281d7180281efb41a1edf27f298bf8241a6e
4
- data.tar.gz: 2dfc66e687c8ba89a0fa565c1fa1b88953c8fb58
3
+ metadata.gz: 73b958dd1ed08fe21e5c00de8deb5e5f79da1e61
4
+ data.tar.gz: bf8fa791d9728a772e2d907a8630dc052e417854
5
5
  SHA512:
6
- metadata.gz: 53a98257465f143b91d996abf4c6fd7bc44e459ddfb6f8aad46a77e57cc925f7cdedb18c3a165425504a5d042762586db5f643faeadb8f515f78ce1dbcd96898
7
- data.tar.gz: 229d18c489cfd94a03ef253efa7d16045272d890a6f0853dcfb7c7239461367bc01480796a478d5cd6b7a55f82b502b1d36d609d5a68e1322c7154a6ec8b37ca
6
+ metadata.gz: 10a88514ea4815e61057a7185a3800bc4aaf81c2522a01cfc317c259563612081f3db560abc6ea701d16e76ef687226a82d82e4238b493541759a3e1233173da
7
+ data.tar.gz: cb2db20ff202a5ecff3fbe08fe6981d627334b1e3fbb15b3cbc1dffb716aac1fd89e59d8ff0b407a4563791a32ac384d6f0c74245383163be2fb68802978106b
@@ -1,7 +1,7 @@
1
1
  module HolderRails
2
2
  module Helpers
3
3
  def holder_tag(size, text='', theme=nil, html_options={}, holder_options={})
4
- size = "#{size}x#{size}" unless size =~ /\A\d+%?x\d+\z/
4
+ size = "#{size}x#{size}" unless size =~ /\A\d+p?x\d+\z/
5
5
 
6
6
  holder_options[:text] = text unless text.to_s.empty?
7
7
  holder_options[:theme] = theme unless theme.nil?
@@ -1,3 +1,3 @@
1
1
  module HolderRails
2
- VERSION = "2.9.0"
2
+ VERSION = "2.9.1"
3
3
  end
@@ -7,7 +7,7 @@ class HolderRailsTest < ActionView::TestCase
7
7
  test "size" do
8
8
  assert_dom_equal '<img data-src="holder.js/100x100?" src="" />', holder_tag(100)
9
9
  assert_dom_equal '<img data-src="holder.js/200x300?" src="" />', holder_tag('200x300')
10
- assert_dom_equal '<img data-src="holder.js/100%x75?" src="" />', holder_tag('100%x75')
10
+ assert_dom_equal '<img data-src="holder.js/100px75?" src="" />', holder_tag('100px75')
11
11
  end
12
12
 
13
13
  test "text" do
@@ -1,8 +1,8 @@
1
1
  /*!
2
2
 
3
3
  Holder - client side image placeholders
4
- Version 2.9.0+f2dkw
5
- © 2015 Ivan Malopinsky - http://imsky.co
4
+ Version 2.9.1+ygdp
5
+ © 2016 Ivan Malopinsky - http://imsky.co
6
6
 
7
7
  Site: http://holderjs.com
8
8
  Issues: https://github.com/imsky/holder/issues
@@ -210,36 +210,32 @@ License: MIT
210
210
 
211
211
  //requestAnimationFrame polyfill for older Firefox/Chrome versions
212
212
  if (!window.requestAnimationFrame) {
213
- if (window.webkitRequestAnimationFrame) {
213
+ if (window.webkitRequestAnimationFrame && window.webkitCancelAnimationFrame) {
214
214
  //https://github.com/Financial-Times/polyfill-service/blob/master/polyfills/requestAnimationFrame/polyfill-webkit.js
215
215
  (function (global) {
216
- // window.requestAnimationFrame
217
216
  global.requestAnimationFrame = function (callback) {
218
217
  return webkitRequestAnimationFrame(function () {
219
218
  callback(global.performance.now());
220
219
  });
221
220
  };
222
221
 
223
- // window.cancelAnimationFrame
224
- global.cancelAnimationFrame = webkitCancelAnimationFrame;
222
+ global.cancelAnimationFrame = global.webkitCancelAnimationFrame;
225
223
  }(window));
226
- } else if (window.mozRequestAnimationFrame) {
224
+ } else if (window.mozRequestAnimationFrame && window.mozCancelAnimationFrame) {
227
225
  //https://github.com/Financial-Times/polyfill-service/blob/master/polyfills/requestAnimationFrame/polyfill-moz.js
228
226
  (function (global) {
229
- // window.requestAnimationFrame
230
227
  global.requestAnimationFrame = function (callback) {
231
228
  return mozRequestAnimationFrame(function () {
232
229
  callback(global.performance.now());
233
230
  });
234
231
  };
235
232
 
236
- // window.cancelAnimationFrame
237
- global.cancelAnimationFrame = mozCancelAnimationFrame;
233
+ global.cancelAnimationFrame = global.mozCancelAnimationFrame;
238
234
  }(window));
239
235
  } else {
240
236
  (function (global) {
241
237
  global.requestAnimationFrame = function (callback) {
242
- return global.setTimeout(callback, 1000 / 60);
238
+ return global.setTimeout(callback, 1000 / 60);
243
239
  };
244
240
 
245
241
  global.cancelAnimationFrame = global.clearTimeout;
@@ -325,15 +321,15 @@ return /******/ (function(modules) { // webpackBootstrap
325
321
  var onDomReady = __webpack_require__(2);
326
322
  var querystring = __webpack_require__(3);
327
323
 
328
- var SceneGraph = __webpack_require__(6);
329
- var utils = __webpack_require__(7);
330
- var SVG = __webpack_require__(8);
331
- var DOM = __webpack_require__(9);
332
- var Color = __webpack_require__(10);
333
- var constants = __webpack_require__(11);
324
+ var SceneGraph = __webpack_require__(10);
325
+ var utils = __webpack_require__(11);
326
+ var SVG = __webpack_require__(12);
327
+ var DOM = __webpack_require__(13);
328
+ var Color = __webpack_require__(14);
329
+ var constants = __webpack_require__(15);
334
330
 
335
- var svgRenderer = __webpack_require__(12);
336
- var sgCanvasRenderer = __webpack_require__(15);
331
+ var svgRenderer = __webpack_require__(16);
332
+ var sgCanvasRenderer = __webpack_require__(19);
337
333
 
338
334
  var extend = utils.extend;
339
335
  var dimensionCheck = utils.dimensionCheck;
@@ -602,7 +598,13 @@ return /******/ (function(modules) { // webpackBootstrap
602
598
  instanceOptions: instanceOptions
603
599
  };
604
600
 
605
- var parts = url.split('?');
601
+ var firstQuestionMark = url.indexOf('?');
602
+ var parts = [url];
603
+
604
+ if (firstQuestionMark !== -1) {
605
+ parts = [url.slice(0, firstQuestionMark), url.slice(firstQuestionMark + 1)];
606
+ }
607
+
606
608
  var basics = parts[0].split('/');
607
609
 
608
610
  holder.holderURL = url;
@@ -1779,9 +1781,9 @@ return /******/ (function(modules) { // webpackBootstrap
1779
1781
 
1780
1782
  /***/ },
1781
1783
  /* 5 */
1782
- /***/ function(module, exports) {
1784
+ /***/ function(module, exports, __webpack_require__) {
1783
1785
 
1784
- /**
1786
+ /* WEBPACK VAR INJECTION */(function(Buffer) {/**
1785
1787
  * toString ref.
1786
1788
  */
1787
1789
 
@@ -1809,6 +1811,8 @@ return /******/ (function(modules) { // webpackBootstrap
1809
1811
  if (val !== val) return 'nan';
1810
1812
  if (val && val.nodeType === 1) return 'element';
1811
1813
 
1814
+ if (typeof Buffer != 'undefined' && Buffer.isBuffer(val)) return 'buffer';
1815
+
1812
1816
  val = val.valueOf
1813
1817
  ? val.valueOf()
1814
1818
  : Object.prototype.valueOf.apply(val)
@@ -1816,249 +1820,2060 @@ return /******/ (function(modules) { // webpackBootstrap
1816
1820
  return typeof val;
1817
1821
  };
1818
1822
 
1823
+ /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(6).Buffer))
1819
1824
 
1820
1825
  /***/ },
1821
1826
  /* 6 */
1822
- /***/ function(module, exports) {
1823
-
1824
- var SceneGraph = function(sceneProperties) {
1825
- var nodeCount = 1;
1826
-
1827
- //todo: move merge to helpers section
1828
- function merge(parent, child) {
1829
- for (var prop in child) {
1830
- parent[prop] = child[prop];
1831
- }
1832
- return parent;
1833
- }
1834
-
1835
- var SceneNode = function(name) {
1836
- nodeCount++;
1837
- this.parent = null;
1838
- this.children = {};
1839
- this.id = nodeCount;
1840
- this.name = 'n' + nodeCount;
1841
- if (typeof name !== 'undefined') {
1842
- this.name = name;
1843
- }
1844
- this.x = this.y = this.z = 0;
1845
- this.width = this.height = 0;
1846
- };
1827
+ /***/ function(module, exports, __webpack_require__) {
1847
1828
 
1848
- SceneNode.prototype.resize = function(width, height) {
1849
- if (width != null) {
1850
- this.width = width;
1851
- }
1852
- if (height != null) {
1853
- this.height = height;
1854
- }
1855
- };
1829
+ /* WEBPACK VAR INJECTION */(function(Buffer, global) {/*!
1830
+ * The buffer module from node.js, for the browser.
1831
+ *
1832
+ * @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
1833
+ * @license MIT
1834
+ */
1835
+ /* eslint-disable no-proto */
1856
1836
 
1857
- SceneNode.prototype.moveTo = function(x, y, z) {
1858
- this.x = x != null ? x : this.x;
1859
- this.y = y != null ? y : this.y;
1860
- this.z = z != null ? z : this.z;
1861
- };
1837
+ var base64 = __webpack_require__(7)
1838
+ var ieee754 = __webpack_require__(8)
1839
+ var isArray = __webpack_require__(9)
1862
1840
 
1863
- SceneNode.prototype.add = function(child) {
1864
- var name = child.name;
1865
- if (typeof this.children[name] === 'undefined') {
1866
- this.children[name] = child;
1867
- child.parent = this;
1868
- } else {
1869
- throw 'SceneGraph: child already exists: ' + name;
1870
- }
1871
- };
1841
+ exports.Buffer = Buffer
1842
+ exports.SlowBuffer = SlowBuffer
1843
+ exports.INSPECT_MAX_BYTES = 50
1844
+ Buffer.poolSize = 8192 // not used by this implementation
1872
1845
 
1873
- var RootNode = function() {
1874
- SceneNode.call(this, 'root');
1875
- this.properties = sceneProperties;
1876
- };
1846
+ var rootParent = {}
1877
1847
 
1878
- RootNode.prototype = new SceneNode();
1848
+ /**
1849
+ * If `Buffer.TYPED_ARRAY_SUPPORT`:
1850
+ * === true Use Uint8Array implementation (fastest)
1851
+ * === false Use Object implementation (most compatible, even IE6)
1852
+ *
1853
+ * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
1854
+ * Opera 11.6+, iOS 4.2+.
1855
+ *
1856
+ * Due to various browser bugs, sometimes the Object implementation will be used even
1857
+ * when the browser supports typed arrays.
1858
+ *
1859
+ * Note:
1860
+ *
1861
+ * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,
1862
+ * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
1863
+ *
1864
+ * - Safari 5-7 lacks support for changing the `Object.prototype.constructor` property
1865
+ * on objects.
1866
+ *
1867
+ * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
1868
+ *
1869
+ * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
1870
+ * incorrect length in some situations.
1879
1871
 
1880
- var Shape = function(name, props) {
1881
- SceneNode.call(this, name);
1882
- this.properties = {
1883
- 'fill': '#000000'
1884
- };
1885
- if (typeof props !== 'undefined') {
1886
- merge(this.properties, props);
1887
- } else if (typeof name !== 'undefined' && typeof name !== 'string') {
1888
- throw 'SceneGraph: invalid node name';
1889
- }
1890
- };
1872
+ * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they
1873
+ * get the Object implementation, which is slower but behaves correctly.
1874
+ */
1875
+ Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined
1876
+ ? global.TYPED_ARRAY_SUPPORT
1877
+ : typedArraySupport()
1878
+
1879
+ function typedArraySupport () {
1880
+ function Bar () {}
1881
+ try {
1882
+ var arr = new Uint8Array(1)
1883
+ arr.foo = function () { return 42 }
1884
+ arr.constructor = Bar
1885
+ return arr.foo() === 42 && // typed array instances can be augmented
1886
+ arr.constructor === Bar && // constructor can be set
1887
+ typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
1888
+ arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
1889
+ } catch (e) {
1890
+ return false
1891
+ }
1892
+ }
1891
1893
 
1892
- Shape.prototype = new SceneNode();
1894
+ function kMaxLength () {
1895
+ return Buffer.TYPED_ARRAY_SUPPORT
1896
+ ? 0x7fffffff
1897
+ : 0x3fffffff
1898
+ }
1893
1899
 
1894
- var Group = function() {
1895
- Shape.apply(this, arguments);
1896
- this.type = 'group';
1897
- };
1900
+ /**
1901
+ * Class: Buffer
1902
+ * =============
1903
+ *
1904
+ * The Buffer constructor returns instances of `Uint8Array` that are augmented
1905
+ * with function properties for all the node `Buffer` API functions. We use
1906
+ * `Uint8Array` so that square bracket notation works as expected -- it returns
1907
+ * a single octet.
1908
+ *
1909
+ * By augmenting the instances, we can avoid modifying the `Uint8Array`
1910
+ * prototype.
1911
+ */
1912
+ function Buffer (arg) {
1913
+ if (!(this instanceof Buffer)) {
1914
+ // Avoid going through an ArgumentsAdaptorTrampoline in the common case.
1915
+ if (arguments.length > 1) return new Buffer(arg, arguments[1])
1916
+ return new Buffer(arg)
1917
+ }
1898
1918
 
1899
- Group.prototype = new Shape();
1919
+ this.length = 0
1920
+ this.parent = undefined
1900
1921
 
1901
- var Rect = function() {
1902
- Shape.apply(this, arguments);
1903
- this.type = 'rect';
1904
- };
1922
+ // Common case.
1923
+ if (typeof arg === 'number') {
1924
+ return fromNumber(this, arg)
1925
+ }
1905
1926
 
1906
- Rect.prototype = new Shape();
1927
+ // Slightly less common case.
1928
+ if (typeof arg === 'string') {
1929
+ return fromString(this, arg, arguments.length > 1 ? arguments[1] : 'utf8')
1930
+ }
1907
1931
 
1908
- var Text = function(text) {
1909
- Shape.call(this);
1910
- this.type = 'text';
1911
- this.properties.text = text;
1912
- };
1932
+ // Unusual.
1933
+ return fromObject(this, arg)
1934
+ }
1913
1935
 
1914
- Text.prototype = new Shape();
1936
+ function fromNumber (that, length) {
1937
+ that = allocate(that, length < 0 ? 0 : checked(length) | 0)
1938
+ if (!Buffer.TYPED_ARRAY_SUPPORT) {
1939
+ for (var i = 0; i < length; i++) {
1940
+ that[i] = 0
1941
+ }
1942
+ }
1943
+ return that
1944
+ }
1915
1945
 
1916
- var root = new RootNode();
1946
+ function fromString (that, string, encoding) {
1947
+ if (typeof encoding !== 'string' || encoding === '') encoding = 'utf8'
1917
1948
 
1918
- this.Shape = {
1919
- 'Rect': Rect,
1920
- 'Text': Text,
1921
- 'Group': Group
1922
- };
1949
+ // Assumption: byteLength() return value is always < kMaxLength.
1950
+ var length = byteLength(string, encoding) | 0
1951
+ that = allocate(that, length)
1923
1952
 
1924
- this.root = root;
1925
- return this;
1926
- };
1953
+ that.write(string, encoding)
1954
+ return that
1955
+ }
1927
1956
 
1928
- module.exports = SceneGraph;
1957
+ function fromObject (that, object) {
1958
+ if (Buffer.isBuffer(object)) return fromBuffer(that, object)
1929
1959
 
1960
+ if (isArray(object)) return fromArray(that, object)
1930
1961
 
1931
- /***/ },
1932
- /* 7 */
1933
- /***/ function(module, exports) {
1962
+ if (object == null) {
1963
+ throw new TypeError('must start with number, buffer, array or string')
1964
+ }
1934
1965
 
1935
- /* WEBPACK VAR INJECTION */(function(global) {/**
1936
- * Shallow object clone and merge
1937
- *
1938
- * @param a Object A
1939
- * @param b Object B
1940
- * @returns {Object} New object with all of A's properties, and all of B's properties, overwriting A's properties
1941
- */
1942
- exports.extend = function(a, b) {
1943
- var c = {};
1944
- for (var x in a) {
1945
- if (a.hasOwnProperty(x)) {
1946
- c[x] = a[x];
1947
- }
1966
+ if (typeof ArrayBuffer !== 'undefined') {
1967
+ if (object.buffer instanceof ArrayBuffer) {
1968
+ return fromTypedArray(that, object)
1948
1969
  }
1949
- if (b != null) {
1950
- for (var y in b) {
1951
- if (b.hasOwnProperty(y)) {
1952
- c[y] = b[y];
1953
- }
1954
- }
1970
+ if (object instanceof ArrayBuffer) {
1971
+ return fromArrayBuffer(that, object)
1955
1972
  }
1956
- return c;
1957
- };
1973
+ }
1958
1974
 
1959
- /**
1960
- * Takes a k/v list of CSS properties and returns a rule
1961
- *
1962
- * @param props CSS properties object
1963
- */
1964
- exports.cssProps = function(props) {
1965
- var ret = [];
1966
- for (var p in props) {
1967
- if (props.hasOwnProperty(p)) {
1968
- ret.push(p + ':' + props[p]);
1969
- }
1970
- }
1971
- return ret.join(';');
1972
- };
1975
+ if (object.length) return fromArrayLike(that, object)
1973
1976
 
1974
- /**
1975
- * Encodes HTML entities in a string
1976
- *
1977
- * @param str Input string
1978
- */
1979
- exports.encodeHtmlEntity = function(str) {
1980
- var buf = [];
1981
- var charCode = 0;
1982
- for (var i = str.length - 1; i >= 0; i--) {
1983
- charCode = str.charCodeAt(i);
1984
- if (charCode > 128) {
1985
- buf.unshift(['&#', charCode, ';'].join(''));
1986
- } else {
1987
- buf.unshift(str[i]);
1988
- }
1989
- }
1990
- return buf.join('');
1991
- };
1977
+ return fromJsonObject(that, object)
1978
+ }
1992
1979
 
1993
- /**
1994
- * Checks if an image exists
1995
- *
1996
- * @param src URL of image
1997
- * @param callback Callback to call once image status has been found
1998
- */
1999
- exports.imageExists = function(src, callback) {
2000
- var image = new Image();
2001
- image.onerror = function() {
2002
- callback.call(this, false);
2003
- };
2004
- image.onload = function() {
2005
- callback.call(this, true);
2006
- };
2007
- image.src = src;
2008
- };
1980
+ function fromBuffer (that, buffer) {
1981
+ var length = checked(buffer.length) | 0
1982
+ that = allocate(that, length)
1983
+ buffer.copy(that, 0, 0, length)
1984
+ return that
1985
+ }
2009
1986
 
2010
- /**
2011
- * Decodes HTML entities in a string
2012
- *
2013
- * @param str Input string
2014
- */
2015
- exports.decodeHtmlEntity = function(str) {
2016
- return str.replace(/&#(\d+);/g, function(match, dec) {
2017
- return String.fromCharCode(dec);
2018
- });
2019
- };
1987
+ function fromArray (that, array) {
1988
+ var length = checked(array.length) | 0
1989
+ that = allocate(that, length)
1990
+ for (var i = 0; i < length; i += 1) {
1991
+ that[i] = array[i] & 255
1992
+ }
1993
+ return that
1994
+ }
2020
1995
 
1996
+ // Duplicate of fromArray() to keep fromArray() monomorphic.
1997
+ function fromTypedArray (that, array) {
1998
+ var length = checked(array.length) | 0
1999
+ that = allocate(that, length)
2000
+ // Truncating the elements is probably not what people expect from typed
2001
+ // arrays with BYTES_PER_ELEMENT > 1 but it's compatible with the behavior
2002
+ // of the old Buffer constructor.
2003
+ for (var i = 0; i < length; i += 1) {
2004
+ that[i] = array[i] & 255
2005
+ }
2006
+ return that
2007
+ }
2021
2008
 
2022
- /**
2023
- * Returns an element's dimensions if it's visible, `false` otherwise.
2024
- *
2025
- * @param el DOM element
2026
- */
2027
- exports.dimensionCheck = function(el) {
2028
- var dimensions = {
2029
- height: el.clientHeight,
2030
- width: el.clientWidth
2031
- };
2009
+ function fromArrayBuffer (that, array) {
2010
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
2011
+ // Return an augmented `Uint8Array` instance, for best performance
2012
+ array.byteLength
2013
+ that = Buffer._augment(new Uint8Array(array))
2014
+ } else {
2015
+ // Fallback: Return an object instance of the Buffer class
2016
+ that = fromTypedArray(that, new Uint8Array(array))
2017
+ }
2018
+ return that
2019
+ }
2032
2020
 
2033
- if (dimensions.height && dimensions.width) {
2034
- return dimensions;
2035
- } else {
2036
- return false;
2037
- }
2038
- };
2021
+ function fromArrayLike (that, array) {
2022
+ var length = checked(array.length) | 0
2023
+ that = allocate(that, length)
2024
+ for (var i = 0; i < length; i += 1) {
2025
+ that[i] = array[i] & 255
2026
+ }
2027
+ return that
2028
+ }
2039
2029
 
2030
+ // Deserialize { type: 'Buffer', data: [1,2,3,...] } into a Buffer object.
2031
+ // Returns a zero-length buffer for inputs that don't conform to the spec.
2032
+ function fromJsonObject (that, object) {
2033
+ var array
2034
+ var length = 0
2040
2035
 
2041
- /**
2042
- * Returns true if value is truthy or if it is "semantically truthy"
2043
- * @param val
2044
- */
2045
- exports.truthy = function(val) {
2046
- if (typeof val === 'string') {
2047
- return val === 'true' || val === 'yes' || val === '1' || val === 'on' || val === '✓';
2048
- }
2049
- return !!val;
2050
- };
2036
+ if (object.type === 'Buffer' && isArray(object.data)) {
2037
+ array = object.data
2038
+ length = checked(array.length) | 0
2039
+ }
2040
+ that = allocate(that, length)
2051
2041
 
2052
- /**
2053
- * Parses input into a well-formed CSS color
2054
- * @param val
2055
- */
2056
- exports.parseColor = function(val) {
2057
- var hexre = /(^(?:#?)[0-9a-f]{6}$)|(^(?:#?)[0-9a-f]{3}$)/i;
2058
- var rgbre = /^rgb\((\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/;
2059
- var rgbare = /^rgba\((\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(0\.\d{1,}|1)\)$/;
2042
+ for (var i = 0; i < length; i += 1) {
2043
+ that[i] = array[i] & 255
2044
+ }
2045
+ return that
2046
+ }
2060
2047
 
2061
- var match = val.match(hexre);
2048
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
2049
+ Buffer.prototype.__proto__ = Uint8Array.prototype
2050
+ Buffer.__proto__ = Uint8Array
2051
+ }
2052
+
2053
+ function allocate (that, length) {
2054
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
2055
+ // Return an augmented `Uint8Array` instance, for best performance
2056
+ that = Buffer._augment(new Uint8Array(length))
2057
+ that.__proto__ = Buffer.prototype
2058
+ } else {
2059
+ // Fallback: Return an object instance of the Buffer class
2060
+ that.length = length
2061
+ that._isBuffer = true
2062
+ }
2063
+
2064
+ var fromPool = length !== 0 && length <= Buffer.poolSize >>> 1
2065
+ if (fromPool) that.parent = rootParent
2066
+
2067
+ return that
2068
+ }
2069
+
2070
+ function checked (length) {
2071
+ // Note: cannot use `length < kMaxLength` here because that fails when
2072
+ // length is NaN (which is otherwise coerced to zero.)
2073
+ if (length >= kMaxLength()) {
2074
+ throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
2075
+ 'size: 0x' + kMaxLength().toString(16) + ' bytes')
2076
+ }
2077
+ return length | 0
2078
+ }
2079
+
2080
+ function SlowBuffer (subject, encoding) {
2081
+ if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding)
2082
+
2083
+ var buf = new Buffer(subject, encoding)
2084
+ delete buf.parent
2085
+ return buf
2086
+ }
2087
+
2088
+ Buffer.isBuffer = function isBuffer (b) {
2089
+ return !!(b != null && b._isBuffer)
2090
+ }
2091
+
2092
+ Buffer.compare = function compare (a, b) {
2093
+ if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
2094
+ throw new TypeError('Arguments must be Buffers')
2095
+ }
2096
+
2097
+ if (a === b) return 0
2098
+
2099
+ var x = a.length
2100
+ var y = b.length
2101
+
2102
+ var i = 0
2103
+ var len = Math.min(x, y)
2104
+ while (i < len) {
2105
+ if (a[i] !== b[i]) break
2106
+
2107
+ ++i
2108
+ }
2109
+
2110
+ if (i !== len) {
2111
+ x = a[i]
2112
+ y = b[i]
2113
+ }
2114
+
2115
+ if (x < y) return -1
2116
+ if (y < x) return 1
2117
+ return 0
2118
+ }
2119
+
2120
+ Buffer.isEncoding = function isEncoding (encoding) {
2121
+ switch (String(encoding).toLowerCase()) {
2122
+ case 'hex':
2123
+ case 'utf8':
2124
+ case 'utf-8':
2125
+ case 'ascii':
2126
+ case 'binary':
2127
+ case 'base64':
2128
+ case 'raw':
2129
+ case 'ucs2':
2130
+ case 'ucs-2':
2131
+ case 'utf16le':
2132
+ case 'utf-16le':
2133
+ return true
2134
+ default:
2135
+ return false
2136
+ }
2137
+ }
2138
+
2139
+ Buffer.concat = function concat (list, length) {
2140
+ if (!isArray(list)) throw new TypeError('list argument must be an Array of Buffers.')
2141
+
2142
+ if (list.length === 0) {
2143
+ return new Buffer(0)
2144
+ }
2145
+
2146
+ var i
2147
+ if (length === undefined) {
2148
+ length = 0
2149
+ for (i = 0; i < list.length; i++) {
2150
+ length += list[i].length
2151
+ }
2152
+ }
2153
+
2154
+ var buf = new Buffer(length)
2155
+ var pos = 0
2156
+ for (i = 0; i < list.length; i++) {
2157
+ var item = list[i]
2158
+ item.copy(buf, pos)
2159
+ pos += item.length
2160
+ }
2161
+ return buf
2162
+ }
2163
+
2164
+ function byteLength (string, encoding) {
2165
+ if (typeof string !== 'string') string = '' + string
2166
+
2167
+ var len = string.length
2168
+ if (len === 0) return 0
2169
+
2170
+ // Use a for loop to avoid recursion
2171
+ var loweredCase = false
2172
+ for (;;) {
2173
+ switch (encoding) {
2174
+ case 'ascii':
2175
+ case 'binary':
2176
+ // Deprecated
2177
+ case 'raw':
2178
+ case 'raws':
2179
+ return len
2180
+ case 'utf8':
2181
+ case 'utf-8':
2182
+ return utf8ToBytes(string).length
2183
+ case 'ucs2':
2184
+ case 'ucs-2':
2185
+ case 'utf16le':
2186
+ case 'utf-16le':
2187
+ return len * 2
2188
+ case 'hex':
2189
+ return len >>> 1
2190
+ case 'base64':
2191
+ return base64ToBytes(string).length
2192
+ default:
2193
+ if (loweredCase) return utf8ToBytes(string).length // assume utf8
2194
+ encoding = ('' + encoding).toLowerCase()
2195
+ loweredCase = true
2196
+ }
2197
+ }
2198
+ }
2199
+ Buffer.byteLength = byteLength
2200
+
2201
+ // pre-set for values that may exist in the future
2202
+ Buffer.prototype.length = undefined
2203
+ Buffer.prototype.parent = undefined
2204
+
2205
+ function slowToString (encoding, start, end) {
2206
+ var loweredCase = false
2207
+
2208
+ start = start | 0
2209
+ end = end === undefined || end === Infinity ? this.length : end | 0
2210
+
2211
+ if (!encoding) encoding = 'utf8'
2212
+ if (start < 0) start = 0
2213
+ if (end > this.length) end = this.length
2214
+ if (end <= start) return ''
2215
+
2216
+ while (true) {
2217
+ switch (encoding) {
2218
+ case 'hex':
2219
+ return hexSlice(this, start, end)
2220
+
2221
+ case 'utf8':
2222
+ case 'utf-8':
2223
+ return utf8Slice(this, start, end)
2224
+
2225
+ case 'ascii':
2226
+ return asciiSlice(this, start, end)
2227
+
2228
+ case 'binary':
2229
+ return binarySlice(this, start, end)
2230
+
2231
+ case 'base64':
2232
+ return base64Slice(this, start, end)
2233
+
2234
+ case 'ucs2':
2235
+ case 'ucs-2':
2236
+ case 'utf16le':
2237
+ case 'utf-16le':
2238
+ return utf16leSlice(this, start, end)
2239
+
2240
+ default:
2241
+ if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
2242
+ encoding = (encoding + '').toLowerCase()
2243
+ loweredCase = true
2244
+ }
2245
+ }
2246
+ }
2247
+
2248
+ Buffer.prototype.toString = function toString () {
2249
+ var length = this.length | 0
2250
+ if (length === 0) return ''
2251
+ if (arguments.length === 0) return utf8Slice(this, 0, length)
2252
+ return slowToString.apply(this, arguments)
2253
+ }
2254
+
2255
+ Buffer.prototype.equals = function equals (b) {
2256
+ if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
2257
+ if (this === b) return true
2258
+ return Buffer.compare(this, b) === 0
2259
+ }
2260
+
2261
+ Buffer.prototype.inspect = function inspect () {
2262
+ var str = ''
2263
+ var max = exports.INSPECT_MAX_BYTES
2264
+ if (this.length > 0) {
2265
+ str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
2266
+ if (this.length > max) str += ' ... '
2267
+ }
2268
+ return '<Buffer ' + str + '>'
2269
+ }
2270
+
2271
+ Buffer.prototype.compare = function compare (b) {
2272
+ if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
2273
+ if (this === b) return 0
2274
+ return Buffer.compare(this, b)
2275
+ }
2276
+
2277
+ Buffer.prototype.indexOf = function indexOf (val, byteOffset) {
2278
+ if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff
2279
+ else if (byteOffset < -0x80000000) byteOffset = -0x80000000
2280
+ byteOffset >>= 0
2281
+
2282
+ if (this.length === 0) return -1
2283
+ if (byteOffset >= this.length) return -1
2284
+
2285
+ // Negative offsets start from the end of the buffer
2286
+ if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0)
2287
+
2288
+ if (typeof val === 'string') {
2289
+ if (val.length === 0) return -1 // special case: looking for empty string always fails
2290
+ return String.prototype.indexOf.call(this, val, byteOffset)
2291
+ }
2292
+ if (Buffer.isBuffer(val)) {
2293
+ return arrayIndexOf(this, val, byteOffset)
2294
+ }
2295
+ if (typeof val === 'number') {
2296
+ if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') {
2297
+ return Uint8Array.prototype.indexOf.call(this, val, byteOffset)
2298
+ }
2299
+ return arrayIndexOf(this, [ val ], byteOffset)
2300
+ }
2301
+
2302
+ function arrayIndexOf (arr, val, byteOffset) {
2303
+ var foundIndex = -1
2304
+ for (var i = 0; byteOffset + i < arr.length; i++) {
2305
+ if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) {
2306
+ if (foundIndex === -1) foundIndex = i
2307
+ if (i - foundIndex + 1 === val.length) return byteOffset + foundIndex
2308
+ } else {
2309
+ foundIndex = -1
2310
+ }
2311
+ }
2312
+ return -1
2313
+ }
2314
+
2315
+ throw new TypeError('val must be string, number or Buffer')
2316
+ }
2317
+
2318
+ // `get` is deprecated
2319
+ Buffer.prototype.get = function get (offset) {
2320
+ console.log('.get() is deprecated. Access using array indexes instead.')
2321
+ return this.readUInt8(offset)
2322
+ }
2323
+
2324
+ // `set` is deprecated
2325
+ Buffer.prototype.set = function set (v, offset) {
2326
+ console.log('.set() is deprecated. Access using array indexes instead.')
2327
+ return this.writeUInt8(v, offset)
2328
+ }
2329
+
2330
+ function hexWrite (buf, string, offset, length) {
2331
+ offset = Number(offset) || 0
2332
+ var remaining = buf.length - offset
2333
+ if (!length) {
2334
+ length = remaining
2335
+ } else {
2336
+ length = Number(length)
2337
+ if (length > remaining) {
2338
+ length = remaining
2339
+ }
2340
+ }
2341
+
2342
+ // must be an even number of digits
2343
+ var strLen = string.length
2344
+ if (strLen % 2 !== 0) throw new Error('Invalid hex string')
2345
+
2346
+ if (length > strLen / 2) {
2347
+ length = strLen / 2
2348
+ }
2349
+ for (var i = 0; i < length; i++) {
2350
+ var parsed = parseInt(string.substr(i * 2, 2), 16)
2351
+ if (isNaN(parsed)) throw new Error('Invalid hex string')
2352
+ buf[offset + i] = parsed
2353
+ }
2354
+ return i
2355
+ }
2356
+
2357
+ function utf8Write (buf, string, offset, length) {
2358
+ return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
2359
+ }
2360
+
2361
+ function asciiWrite (buf, string, offset, length) {
2362
+ return blitBuffer(asciiToBytes(string), buf, offset, length)
2363
+ }
2364
+
2365
+ function binaryWrite (buf, string, offset, length) {
2366
+ return asciiWrite(buf, string, offset, length)
2367
+ }
2368
+
2369
+ function base64Write (buf, string, offset, length) {
2370
+ return blitBuffer(base64ToBytes(string), buf, offset, length)
2371
+ }
2372
+
2373
+ function ucs2Write (buf, string, offset, length) {
2374
+ return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
2375
+ }
2376
+
2377
+ Buffer.prototype.write = function write (string, offset, length, encoding) {
2378
+ // Buffer#write(string)
2379
+ if (offset === undefined) {
2380
+ encoding = 'utf8'
2381
+ length = this.length
2382
+ offset = 0
2383
+ // Buffer#write(string, encoding)
2384
+ } else if (length === undefined && typeof offset === 'string') {
2385
+ encoding = offset
2386
+ length = this.length
2387
+ offset = 0
2388
+ // Buffer#write(string, offset[, length][, encoding])
2389
+ } else if (isFinite(offset)) {
2390
+ offset = offset | 0
2391
+ if (isFinite(length)) {
2392
+ length = length | 0
2393
+ if (encoding === undefined) encoding = 'utf8'
2394
+ } else {
2395
+ encoding = length
2396
+ length = undefined
2397
+ }
2398
+ // legacy write(string, encoding, offset, length) - remove in v0.13
2399
+ } else {
2400
+ var swap = encoding
2401
+ encoding = offset
2402
+ offset = length | 0
2403
+ length = swap
2404
+ }
2405
+
2406
+ var remaining = this.length - offset
2407
+ if (length === undefined || length > remaining) length = remaining
2408
+
2409
+ if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
2410
+ throw new RangeError('attempt to write outside buffer bounds')
2411
+ }
2412
+
2413
+ if (!encoding) encoding = 'utf8'
2414
+
2415
+ var loweredCase = false
2416
+ for (;;) {
2417
+ switch (encoding) {
2418
+ case 'hex':
2419
+ return hexWrite(this, string, offset, length)
2420
+
2421
+ case 'utf8':
2422
+ case 'utf-8':
2423
+ return utf8Write(this, string, offset, length)
2424
+
2425
+ case 'ascii':
2426
+ return asciiWrite(this, string, offset, length)
2427
+
2428
+ case 'binary':
2429
+ return binaryWrite(this, string, offset, length)
2430
+
2431
+ case 'base64':
2432
+ // Warning: maxLength not taken into account in base64Write
2433
+ return base64Write(this, string, offset, length)
2434
+
2435
+ case 'ucs2':
2436
+ case 'ucs-2':
2437
+ case 'utf16le':
2438
+ case 'utf-16le':
2439
+ return ucs2Write(this, string, offset, length)
2440
+
2441
+ default:
2442
+ if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
2443
+ encoding = ('' + encoding).toLowerCase()
2444
+ loweredCase = true
2445
+ }
2446
+ }
2447
+ }
2448
+
2449
+ Buffer.prototype.toJSON = function toJSON () {
2450
+ return {
2451
+ type: 'Buffer',
2452
+ data: Array.prototype.slice.call(this._arr || this, 0)
2453
+ }
2454
+ }
2455
+
2456
+ function base64Slice (buf, start, end) {
2457
+ if (start === 0 && end === buf.length) {
2458
+ return base64.fromByteArray(buf)
2459
+ } else {
2460
+ return base64.fromByteArray(buf.slice(start, end))
2461
+ }
2462
+ }
2463
+
2464
+ function utf8Slice (buf, start, end) {
2465
+ end = Math.min(buf.length, end)
2466
+ var res = []
2467
+
2468
+ var i = start
2469
+ while (i < end) {
2470
+ var firstByte = buf[i]
2471
+ var codePoint = null
2472
+ var bytesPerSequence = (firstByte > 0xEF) ? 4
2473
+ : (firstByte > 0xDF) ? 3
2474
+ : (firstByte > 0xBF) ? 2
2475
+ : 1
2476
+
2477
+ if (i + bytesPerSequence <= end) {
2478
+ var secondByte, thirdByte, fourthByte, tempCodePoint
2479
+
2480
+ switch (bytesPerSequence) {
2481
+ case 1:
2482
+ if (firstByte < 0x80) {
2483
+ codePoint = firstByte
2484
+ }
2485
+ break
2486
+ case 2:
2487
+ secondByte = buf[i + 1]
2488
+ if ((secondByte & 0xC0) === 0x80) {
2489
+ tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
2490
+ if (tempCodePoint > 0x7F) {
2491
+ codePoint = tempCodePoint
2492
+ }
2493
+ }
2494
+ break
2495
+ case 3:
2496
+ secondByte = buf[i + 1]
2497
+ thirdByte = buf[i + 2]
2498
+ if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
2499
+ tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
2500
+ if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
2501
+ codePoint = tempCodePoint
2502
+ }
2503
+ }
2504
+ break
2505
+ case 4:
2506
+ secondByte = buf[i + 1]
2507
+ thirdByte = buf[i + 2]
2508
+ fourthByte = buf[i + 3]
2509
+ if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
2510
+ tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
2511
+ if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
2512
+ codePoint = tempCodePoint
2513
+ }
2514
+ }
2515
+ }
2516
+ }
2517
+
2518
+ if (codePoint === null) {
2519
+ // we did not generate a valid codePoint so insert a
2520
+ // replacement char (U+FFFD) and advance only 1 byte
2521
+ codePoint = 0xFFFD
2522
+ bytesPerSequence = 1
2523
+ } else if (codePoint > 0xFFFF) {
2524
+ // encode to utf16 (surrogate pair dance)
2525
+ codePoint -= 0x10000
2526
+ res.push(codePoint >>> 10 & 0x3FF | 0xD800)
2527
+ codePoint = 0xDC00 | codePoint & 0x3FF
2528
+ }
2529
+
2530
+ res.push(codePoint)
2531
+ i += bytesPerSequence
2532
+ }
2533
+
2534
+ return decodeCodePointsArray(res)
2535
+ }
2536
+
2537
+ // Based on http://stackoverflow.com/a/22747272/680742, the browser with
2538
+ // the lowest limit is Chrome, with 0x10000 args.
2539
+ // We go 1 magnitude less, for safety
2540
+ var MAX_ARGUMENTS_LENGTH = 0x1000
2541
+
2542
+ function decodeCodePointsArray (codePoints) {
2543
+ var len = codePoints.length
2544
+ if (len <= MAX_ARGUMENTS_LENGTH) {
2545
+ return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
2546
+ }
2547
+
2548
+ // Decode in chunks to avoid "call stack size exceeded".
2549
+ var res = ''
2550
+ var i = 0
2551
+ while (i < len) {
2552
+ res += String.fromCharCode.apply(
2553
+ String,
2554
+ codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
2555
+ )
2556
+ }
2557
+ return res
2558
+ }
2559
+
2560
+ function asciiSlice (buf, start, end) {
2561
+ var ret = ''
2562
+ end = Math.min(buf.length, end)
2563
+
2564
+ for (var i = start; i < end; i++) {
2565
+ ret += String.fromCharCode(buf[i] & 0x7F)
2566
+ }
2567
+ return ret
2568
+ }
2569
+
2570
+ function binarySlice (buf, start, end) {
2571
+ var ret = ''
2572
+ end = Math.min(buf.length, end)
2573
+
2574
+ for (var i = start; i < end; i++) {
2575
+ ret += String.fromCharCode(buf[i])
2576
+ }
2577
+ return ret
2578
+ }
2579
+
2580
+ function hexSlice (buf, start, end) {
2581
+ var len = buf.length
2582
+
2583
+ if (!start || start < 0) start = 0
2584
+ if (!end || end < 0 || end > len) end = len
2585
+
2586
+ var out = ''
2587
+ for (var i = start; i < end; i++) {
2588
+ out += toHex(buf[i])
2589
+ }
2590
+ return out
2591
+ }
2592
+
2593
+ function utf16leSlice (buf, start, end) {
2594
+ var bytes = buf.slice(start, end)
2595
+ var res = ''
2596
+ for (var i = 0; i < bytes.length; i += 2) {
2597
+ res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)
2598
+ }
2599
+ return res
2600
+ }
2601
+
2602
+ Buffer.prototype.slice = function slice (start, end) {
2603
+ var len = this.length
2604
+ start = ~~start
2605
+ end = end === undefined ? len : ~~end
2606
+
2607
+ if (start < 0) {
2608
+ start += len
2609
+ if (start < 0) start = 0
2610
+ } else if (start > len) {
2611
+ start = len
2612
+ }
2613
+
2614
+ if (end < 0) {
2615
+ end += len
2616
+ if (end < 0) end = 0
2617
+ } else if (end > len) {
2618
+ end = len
2619
+ }
2620
+
2621
+ if (end < start) end = start
2622
+
2623
+ var newBuf
2624
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
2625
+ newBuf = Buffer._augment(this.subarray(start, end))
2626
+ } else {
2627
+ var sliceLen = end - start
2628
+ newBuf = new Buffer(sliceLen, undefined)
2629
+ for (var i = 0; i < sliceLen; i++) {
2630
+ newBuf[i] = this[i + start]
2631
+ }
2632
+ }
2633
+
2634
+ if (newBuf.length) newBuf.parent = this.parent || this
2635
+
2636
+ return newBuf
2637
+ }
2638
+
2639
+ /*
2640
+ * Need to make sure that buffer isn't trying to write out of bounds.
2641
+ */
2642
+ function checkOffset (offset, ext, length) {
2643
+ if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
2644
+ if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
2645
+ }
2646
+
2647
+ Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
2648
+ offset = offset | 0
2649
+ byteLength = byteLength | 0
2650
+ if (!noAssert) checkOffset(offset, byteLength, this.length)
2651
+
2652
+ var val = this[offset]
2653
+ var mul = 1
2654
+ var i = 0
2655
+ while (++i < byteLength && (mul *= 0x100)) {
2656
+ val += this[offset + i] * mul
2657
+ }
2658
+
2659
+ return val
2660
+ }
2661
+
2662
+ Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
2663
+ offset = offset | 0
2664
+ byteLength = byteLength | 0
2665
+ if (!noAssert) {
2666
+ checkOffset(offset, byteLength, this.length)
2667
+ }
2668
+
2669
+ var val = this[offset + --byteLength]
2670
+ var mul = 1
2671
+ while (byteLength > 0 && (mul *= 0x100)) {
2672
+ val += this[offset + --byteLength] * mul
2673
+ }
2674
+
2675
+ return val
2676
+ }
2677
+
2678
+ Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
2679
+ if (!noAssert) checkOffset(offset, 1, this.length)
2680
+ return this[offset]
2681
+ }
2682
+
2683
+ Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
2684
+ if (!noAssert) checkOffset(offset, 2, this.length)
2685
+ return this[offset] | (this[offset + 1] << 8)
2686
+ }
2687
+
2688
+ Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
2689
+ if (!noAssert) checkOffset(offset, 2, this.length)
2690
+ return (this[offset] << 8) | this[offset + 1]
2691
+ }
2692
+
2693
+ Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
2694
+ if (!noAssert) checkOffset(offset, 4, this.length)
2695
+
2696
+ return ((this[offset]) |
2697
+ (this[offset + 1] << 8) |
2698
+ (this[offset + 2] << 16)) +
2699
+ (this[offset + 3] * 0x1000000)
2700
+ }
2701
+
2702
+ Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
2703
+ if (!noAssert) checkOffset(offset, 4, this.length)
2704
+
2705
+ return (this[offset] * 0x1000000) +
2706
+ ((this[offset + 1] << 16) |
2707
+ (this[offset + 2] << 8) |
2708
+ this[offset + 3])
2709
+ }
2710
+
2711
+ Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
2712
+ offset = offset | 0
2713
+ byteLength = byteLength | 0
2714
+ if (!noAssert) checkOffset(offset, byteLength, this.length)
2715
+
2716
+ var val = this[offset]
2717
+ var mul = 1
2718
+ var i = 0
2719
+ while (++i < byteLength && (mul *= 0x100)) {
2720
+ val += this[offset + i] * mul
2721
+ }
2722
+ mul *= 0x80
2723
+
2724
+ if (val >= mul) val -= Math.pow(2, 8 * byteLength)
2725
+
2726
+ return val
2727
+ }
2728
+
2729
+ Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
2730
+ offset = offset | 0
2731
+ byteLength = byteLength | 0
2732
+ if (!noAssert) checkOffset(offset, byteLength, this.length)
2733
+
2734
+ var i = byteLength
2735
+ var mul = 1
2736
+ var val = this[offset + --i]
2737
+ while (i > 0 && (mul *= 0x100)) {
2738
+ val += this[offset + --i] * mul
2739
+ }
2740
+ mul *= 0x80
2741
+
2742
+ if (val >= mul) val -= Math.pow(2, 8 * byteLength)
2743
+
2744
+ return val
2745
+ }
2746
+
2747
+ Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
2748
+ if (!noAssert) checkOffset(offset, 1, this.length)
2749
+ if (!(this[offset] & 0x80)) return (this[offset])
2750
+ return ((0xff - this[offset] + 1) * -1)
2751
+ }
2752
+
2753
+ Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
2754
+ if (!noAssert) checkOffset(offset, 2, this.length)
2755
+ var val = this[offset] | (this[offset + 1] << 8)
2756
+ return (val & 0x8000) ? val | 0xFFFF0000 : val
2757
+ }
2758
+
2759
+ Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
2760
+ if (!noAssert) checkOffset(offset, 2, this.length)
2761
+ var val = this[offset + 1] | (this[offset] << 8)
2762
+ return (val & 0x8000) ? val | 0xFFFF0000 : val
2763
+ }
2764
+
2765
+ Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
2766
+ if (!noAssert) checkOffset(offset, 4, this.length)
2767
+
2768
+ return (this[offset]) |
2769
+ (this[offset + 1] << 8) |
2770
+ (this[offset + 2] << 16) |
2771
+ (this[offset + 3] << 24)
2772
+ }
2773
+
2774
+ Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
2775
+ if (!noAssert) checkOffset(offset, 4, this.length)
2776
+
2777
+ return (this[offset] << 24) |
2778
+ (this[offset + 1] << 16) |
2779
+ (this[offset + 2] << 8) |
2780
+ (this[offset + 3])
2781
+ }
2782
+
2783
+ Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
2784
+ if (!noAssert) checkOffset(offset, 4, this.length)
2785
+ return ieee754.read(this, offset, true, 23, 4)
2786
+ }
2787
+
2788
+ Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
2789
+ if (!noAssert) checkOffset(offset, 4, this.length)
2790
+ return ieee754.read(this, offset, false, 23, 4)
2791
+ }
2792
+
2793
+ Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
2794
+ if (!noAssert) checkOffset(offset, 8, this.length)
2795
+ return ieee754.read(this, offset, true, 52, 8)
2796
+ }
2797
+
2798
+ Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
2799
+ if (!noAssert) checkOffset(offset, 8, this.length)
2800
+ return ieee754.read(this, offset, false, 52, 8)
2801
+ }
2802
+
2803
+ function checkInt (buf, value, offset, ext, max, min) {
2804
+ if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance')
2805
+ if (value > max || value < min) throw new RangeError('value is out of bounds')
2806
+ if (offset + ext > buf.length) throw new RangeError('index out of range')
2807
+ }
2808
+
2809
+ Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
2810
+ value = +value
2811
+ offset = offset | 0
2812
+ byteLength = byteLength | 0
2813
+ if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)
2814
+
2815
+ var mul = 1
2816
+ var i = 0
2817
+ this[offset] = value & 0xFF
2818
+ while (++i < byteLength && (mul *= 0x100)) {
2819
+ this[offset + i] = (value / mul) & 0xFF
2820
+ }
2821
+
2822
+ return offset + byteLength
2823
+ }
2824
+
2825
+ Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
2826
+ value = +value
2827
+ offset = offset | 0
2828
+ byteLength = byteLength | 0
2829
+ if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)
2830
+
2831
+ var i = byteLength - 1
2832
+ var mul = 1
2833
+ this[offset + i] = value & 0xFF
2834
+ while (--i >= 0 && (mul *= 0x100)) {
2835
+ this[offset + i] = (value / mul) & 0xFF
2836
+ }
2837
+
2838
+ return offset + byteLength
2839
+ }
2840
+
2841
+ Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
2842
+ value = +value
2843
+ offset = offset | 0
2844
+ if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
2845
+ if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
2846
+ this[offset] = (value & 0xff)
2847
+ return offset + 1
2848
+ }
2849
+
2850
+ function objectWriteUInt16 (buf, value, offset, littleEndian) {
2851
+ if (value < 0) value = 0xffff + value + 1
2852
+ for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) {
2853
+ buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
2854
+ (littleEndian ? i : 1 - i) * 8
2855
+ }
2856
+ }
2857
+
2858
+ Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
2859
+ value = +value
2860
+ offset = offset | 0
2861
+ if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
2862
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
2863
+ this[offset] = (value & 0xff)
2864
+ this[offset + 1] = (value >>> 8)
2865
+ } else {
2866
+ objectWriteUInt16(this, value, offset, true)
2867
+ }
2868
+ return offset + 2
2869
+ }
2870
+
2871
+ Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
2872
+ value = +value
2873
+ offset = offset | 0
2874
+ if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
2875
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
2876
+ this[offset] = (value >>> 8)
2877
+ this[offset + 1] = (value & 0xff)
2878
+ } else {
2879
+ objectWriteUInt16(this, value, offset, false)
2880
+ }
2881
+ return offset + 2
2882
+ }
2883
+
2884
+ function objectWriteUInt32 (buf, value, offset, littleEndian) {
2885
+ if (value < 0) value = 0xffffffff + value + 1
2886
+ for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) {
2887
+ buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
2888
+ }
2889
+ }
2890
+
2891
+ Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
2892
+ value = +value
2893
+ offset = offset | 0
2894
+ if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
2895
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
2896
+ this[offset + 3] = (value >>> 24)
2897
+ this[offset + 2] = (value >>> 16)
2898
+ this[offset + 1] = (value >>> 8)
2899
+ this[offset] = (value & 0xff)
2900
+ } else {
2901
+ objectWriteUInt32(this, value, offset, true)
2902
+ }
2903
+ return offset + 4
2904
+ }
2905
+
2906
+ Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
2907
+ value = +value
2908
+ offset = offset | 0
2909
+ if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
2910
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
2911
+ this[offset] = (value >>> 24)
2912
+ this[offset + 1] = (value >>> 16)
2913
+ this[offset + 2] = (value >>> 8)
2914
+ this[offset + 3] = (value & 0xff)
2915
+ } else {
2916
+ objectWriteUInt32(this, value, offset, false)
2917
+ }
2918
+ return offset + 4
2919
+ }
2920
+
2921
+ Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
2922
+ value = +value
2923
+ offset = offset | 0
2924
+ if (!noAssert) {
2925
+ var limit = Math.pow(2, 8 * byteLength - 1)
2926
+
2927
+ checkInt(this, value, offset, byteLength, limit - 1, -limit)
2928
+ }
2929
+
2930
+ var i = 0
2931
+ var mul = 1
2932
+ var sub = value < 0 ? 1 : 0
2933
+ this[offset] = value & 0xFF
2934
+ while (++i < byteLength && (mul *= 0x100)) {
2935
+ this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
2936
+ }
2937
+
2938
+ return offset + byteLength
2939
+ }
2940
+
2941
+ Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
2942
+ value = +value
2943
+ offset = offset | 0
2944
+ if (!noAssert) {
2945
+ var limit = Math.pow(2, 8 * byteLength - 1)
2946
+
2947
+ checkInt(this, value, offset, byteLength, limit - 1, -limit)
2948
+ }
2949
+
2950
+ var i = byteLength - 1
2951
+ var mul = 1
2952
+ var sub = value < 0 ? 1 : 0
2953
+ this[offset + i] = value & 0xFF
2954
+ while (--i >= 0 && (mul *= 0x100)) {
2955
+ this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
2956
+ }
2957
+
2958
+ return offset + byteLength
2959
+ }
2960
+
2961
+ Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
2962
+ value = +value
2963
+ offset = offset | 0
2964
+ if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
2965
+ if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
2966
+ if (value < 0) value = 0xff + value + 1
2967
+ this[offset] = (value & 0xff)
2968
+ return offset + 1
2969
+ }
2970
+
2971
+ Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
2972
+ value = +value
2973
+ offset = offset | 0
2974
+ if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
2975
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
2976
+ this[offset] = (value & 0xff)
2977
+ this[offset + 1] = (value >>> 8)
2978
+ } else {
2979
+ objectWriteUInt16(this, value, offset, true)
2980
+ }
2981
+ return offset + 2
2982
+ }
2983
+
2984
+ Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
2985
+ value = +value
2986
+ offset = offset | 0
2987
+ if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
2988
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
2989
+ this[offset] = (value >>> 8)
2990
+ this[offset + 1] = (value & 0xff)
2991
+ } else {
2992
+ objectWriteUInt16(this, value, offset, false)
2993
+ }
2994
+ return offset + 2
2995
+ }
2996
+
2997
+ Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
2998
+ value = +value
2999
+ offset = offset | 0
3000
+ if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
3001
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
3002
+ this[offset] = (value & 0xff)
3003
+ this[offset + 1] = (value >>> 8)
3004
+ this[offset + 2] = (value >>> 16)
3005
+ this[offset + 3] = (value >>> 24)
3006
+ } else {
3007
+ objectWriteUInt32(this, value, offset, true)
3008
+ }
3009
+ return offset + 4
3010
+ }
3011
+
3012
+ Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
3013
+ value = +value
3014
+ offset = offset | 0
3015
+ if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
3016
+ if (value < 0) value = 0xffffffff + value + 1
3017
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
3018
+ this[offset] = (value >>> 24)
3019
+ this[offset + 1] = (value >>> 16)
3020
+ this[offset + 2] = (value >>> 8)
3021
+ this[offset + 3] = (value & 0xff)
3022
+ } else {
3023
+ objectWriteUInt32(this, value, offset, false)
3024
+ }
3025
+ return offset + 4
3026
+ }
3027
+
3028
+ function checkIEEE754 (buf, value, offset, ext, max, min) {
3029
+ if (value > max || value < min) throw new RangeError('value is out of bounds')
3030
+ if (offset + ext > buf.length) throw new RangeError('index out of range')
3031
+ if (offset < 0) throw new RangeError('index out of range')
3032
+ }
3033
+
3034
+ function writeFloat (buf, value, offset, littleEndian, noAssert) {
3035
+ if (!noAssert) {
3036
+ checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
3037
+ }
3038
+ ieee754.write(buf, value, offset, littleEndian, 23, 4)
3039
+ return offset + 4
3040
+ }
3041
+
3042
+ Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
3043
+ return writeFloat(this, value, offset, true, noAssert)
3044
+ }
3045
+
3046
+ Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
3047
+ return writeFloat(this, value, offset, false, noAssert)
3048
+ }
3049
+
3050
+ function writeDouble (buf, value, offset, littleEndian, noAssert) {
3051
+ if (!noAssert) {
3052
+ checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
3053
+ }
3054
+ ieee754.write(buf, value, offset, littleEndian, 52, 8)
3055
+ return offset + 8
3056
+ }
3057
+
3058
+ Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
3059
+ return writeDouble(this, value, offset, true, noAssert)
3060
+ }
3061
+
3062
+ Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
3063
+ return writeDouble(this, value, offset, false, noAssert)
3064
+ }
3065
+
3066
+ // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
3067
+ Buffer.prototype.copy = function copy (target, targetStart, start, end) {
3068
+ if (!start) start = 0
3069
+ if (!end && end !== 0) end = this.length
3070
+ if (targetStart >= target.length) targetStart = target.length
3071
+ if (!targetStart) targetStart = 0
3072
+ if (end > 0 && end < start) end = start
3073
+
3074
+ // Copy 0 bytes; we're done
3075
+ if (end === start) return 0
3076
+ if (target.length === 0 || this.length === 0) return 0
3077
+
3078
+ // Fatal error conditions
3079
+ if (targetStart < 0) {
3080
+ throw new RangeError('targetStart out of bounds')
3081
+ }
3082
+ if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')
3083
+ if (end < 0) throw new RangeError('sourceEnd out of bounds')
3084
+
3085
+ // Are we oob?
3086
+ if (end > this.length) end = this.length
3087
+ if (target.length - targetStart < end - start) {
3088
+ end = target.length - targetStart + start
3089
+ }
3090
+
3091
+ var len = end - start
3092
+ var i
3093
+
3094
+ if (this === target && start < targetStart && targetStart < end) {
3095
+ // descending copy from end
3096
+ for (i = len - 1; i >= 0; i--) {
3097
+ target[i + targetStart] = this[i + start]
3098
+ }
3099
+ } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
3100
+ // ascending copy from start
3101
+ for (i = 0; i < len; i++) {
3102
+ target[i + targetStart] = this[i + start]
3103
+ }
3104
+ } else {
3105
+ target._set(this.subarray(start, start + len), targetStart)
3106
+ }
3107
+
3108
+ return len
3109
+ }
3110
+
3111
+ // fill(value, start=0, end=buffer.length)
3112
+ Buffer.prototype.fill = function fill (value, start, end) {
3113
+ if (!value) value = 0
3114
+ if (!start) start = 0
3115
+ if (!end) end = this.length
3116
+
3117
+ if (end < start) throw new RangeError('end < start')
3118
+
3119
+ // Fill 0 bytes; we're done
3120
+ if (end === start) return
3121
+ if (this.length === 0) return
3122
+
3123
+ if (start < 0 || start >= this.length) throw new RangeError('start out of bounds')
3124
+ if (end < 0 || end > this.length) throw new RangeError('end out of bounds')
3125
+
3126
+ var i
3127
+ if (typeof value === 'number') {
3128
+ for (i = start; i < end; i++) {
3129
+ this[i] = value
3130
+ }
3131
+ } else {
3132
+ var bytes = utf8ToBytes(value.toString())
3133
+ var len = bytes.length
3134
+ for (i = start; i < end; i++) {
3135
+ this[i] = bytes[i % len]
3136
+ }
3137
+ }
3138
+
3139
+ return this
3140
+ }
3141
+
3142
+ /**
3143
+ * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance.
3144
+ * Added in Node 0.12. Only available in browsers that support ArrayBuffer.
3145
+ */
3146
+ Buffer.prototype.toArrayBuffer = function toArrayBuffer () {
3147
+ if (typeof Uint8Array !== 'undefined') {
3148
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
3149
+ return (new Buffer(this)).buffer
3150
+ } else {
3151
+ var buf = new Uint8Array(this.length)
3152
+ for (var i = 0, len = buf.length; i < len; i += 1) {
3153
+ buf[i] = this[i]
3154
+ }
3155
+ return buf.buffer
3156
+ }
3157
+ } else {
3158
+ throw new TypeError('Buffer.toArrayBuffer not supported in this browser')
3159
+ }
3160
+ }
3161
+
3162
+ // HELPER FUNCTIONS
3163
+ // ================
3164
+
3165
+ var BP = Buffer.prototype
3166
+
3167
+ /**
3168
+ * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods
3169
+ */
3170
+ Buffer._augment = function _augment (arr) {
3171
+ arr.constructor = Buffer
3172
+ arr._isBuffer = true
3173
+
3174
+ // save reference to original Uint8Array set method before overwriting
3175
+ arr._set = arr.set
3176
+
3177
+ // deprecated
3178
+ arr.get = BP.get
3179
+ arr.set = BP.set
3180
+
3181
+ arr.write = BP.write
3182
+ arr.toString = BP.toString
3183
+ arr.toLocaleString = BP.toString
3184
+ arr.toJSON = BP.toJSON
3185
+ arr.equals = BP.equals
3186
+ arr.compare = BP.compare
3187
+ arr.indexOf = BP.indexOf
3188
+ arr.copy = BP.copy
3189
+ arr.slice = BP.slice
3190
+ arr.readUIntLE = BP.readUIntLE
3191
+ arr.readUIntBE = BP.readUIntBE
3192
+ arr.readUInt8 = BP.readUInt8
3193
+ arr.readUInt16LE = BP.readUInt16LE
3194
+ arr.readUInt16BE = BP.readUInt16BE
3195
+ arr.readUInt32LE = BP.readUInt32LE
3196
+ arr.readUInt32BE = BP.readUInt32BE
3197
+ arr.readIntLE = BP.readIntLE
3198
+ arr.readIntBE = BP.readIntBE
3199
+ arr.readInt8 = BP.readInt8
3200
+ arr.readInt16LE = BP.readInt16LE
3201
+ arr.readInt16BE = BP.readInt16BE
3202
+ arr.readInt32LE = BP.readInt32LE
3203
+ arr.readInt32BE = BP.readInt32BE
3204
+ arr.readFloatLE = BP.readFloatLE
3205
+ arr.readFloatBE = BP.readFloatBE
3206
+ arr.readDoubleLE = BP.readDoubleLE
3207
+ arr.readDoubleBE = BP.readDoubleBE
3208
+ arr.writeUInt8 = BP.writeUInt8
3209
+ arr.writeUIntLE = BP.writeUIntLE
3210
+ arr.writeUIntBE = BP.writeUIntBE
3211
+ arr.writeUInt16LE = BP.writeUInt16LE
3212
+ arr.writeUInt16BE = BP.writeUInt16BE
3213
+ arr.writeUInt32LE = BP.writeUInt32LE
3214
+ arr.writeUInt32BE = BP.writeUInt32BE
3215
+ arr.writeIntLE = BP.writeIntLE
3216
+ arr.writeIntBE = BP.writeIntBE
3217
+ arr.writeInt8 = BP.writeInt8
3218
+ arr.writeInt16LE = BP.writeInt16LE
3219
+ arr.writeInt16BE = BP.writeInt16BE
3220
+ arr.writeInt32LE = BP.writeInt32LE
3221
+ arr.writeInt32BE = BP.writeInt32BE
3222
+ arr.writeFloatLE = BP.writeFloatLE
3223
+ arr.writeFloatBE = BP.writeFloatBE
3224
+ arr.writeDoubleLE = BP.writeDoubleLE
3225
+ arr.writeDoubleBE = BP.writeDoubleBE
3226
+ arr.fill = BP.fill
3227
+ arr.inspect = BP.inspect
3228
+ arr.toArrayBuffer = BP.toArrayBuffer
3229
+
3230
+ return arr
3231
+ }
3232
+
3233
+ var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g
3234
+
3235
+ function base64clean (str) {
3236
+ // Node strips out invalid characters like \n and \t from the string, base64-js does not
3237
+ str = stringtrim(str).replace(INVALID_BASE64_RE, '')
3238
+ // Node converts strings with length < 2 to ''
3239
+ if (str.length < 2) return ''
3240
+ // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
3241
+ while (str.length % 4 !== 0) {
3242
+ str = str + '='
3243
+ }
3244
+ return str
3245
+ }
3246
+
3247
+ function stringtrim (str) {
3248
+ if (str.trim) return str.trim()
3249
+ return str.replace(/^\s+|\s+$/g, '')
3250
+ }
3251
+
3252
+ function toHex (n) {
3253
+ if (n < 16) return '0' + n.toString(16)
3254
+ return n.toString(16)
3255
+ }
3256
+
3257
+ function utf8ToBytes (string, units) {
3258
+ units = units || Infinity
3259
+ var codePoint
3260
+ var length = string.length
3261
+ var leadSurrogate = null
3262
+ var bytes = []
3263
+
3264
+ for (var i = 0; i < length; i++) {
3265
+ codePoint = string.charCodeAt(i)
3266
+
3267
+ // is surrogate component
3268
+ if (codePoint > 0xD7FF && codePoint < 0xE000) {
3269
+ // last char was a lead
3270
+ if (!leadSurrogate) {
3271
+ // no lead yet
3272
+ if (codePoint > 0xDBFF) {
3273
+ // unexpected trail
3274
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
3275
+ continue
3276
+ } else if (i + 1 === length) {
3277
+ // unpaired lead
3278
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
3279
+ continue
3280
+ }
3281
+
3282
+ // valid lead
3283
+ leadSurrogate = codePoint
3284
+
3285
+ continue
3286
+ }
3287
+
3288
+ // 2 leads in a row
3289
+ if (codePoint < 0xDC00) {
3290
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
3291
+ leadSurrogate = codePoint
3292
+ continue
3293
+ }
3294
+
3295
+ // valid surrogate pair
3296
+ codePoint = leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00 | 0x10000
3297
+ } else if (leadSurrogate) {
3298
+ // valid bmp char, but last char was a lead
3299
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
3300
+ }
3301
+
3302
+ leadSurrogate = null
3303
+
3304
+ // encode utf8
3305
+ if (codePoint < 0x80) {
3306
+ if ((units -= 1) < 0) break
3307
+ bytes.push(codePoint)
3308
+ } else if (codePoint < 0x800) {
3309
+ if ((units -= 2) < 0) break
3310
+ bytes.push(
3311
+ codePoint >> 0x6 | 0xC0,
3312
+ codePoint & 0x3F | 0x80
3313
+ )
3314
+ } else if (codePoint < 0x10000) {
3315
+ if ((units -= 3) < 0) break
3316
+ bytes.push(
3317
+ codePoint >> 0xC | 0xE0,
3318
+ codePoint >> 0x6 & 0x3F | 0x80,
3319
+ codePoint & 0x3F | 0x80
3320
+ )
3321
+ } else if (codePoint < 0x110000) {
3322
+ if ((units -= 4) < 0) break
3323
+ bytes.push(
3324
+ codePoint >> 0x12 | 0xF0,
3325
+ codePoint >> 0xC & 0x3F | 0x80,
3326
+ codePoint >> 0x6 & 0x3F | 0x80,
3327
+ codePoint & 0x3F | 0x80
3328
+ )
3329
+ } else {
3330
+ throw new Error('Invalid code point')
3331
+ }
3332
+ }
3333
+
3334
+ return bytes
3335
+ }
3336
+
3337
+ function asciiToBytes (str) {
3338
+ var byteArray = []
3339
+ for (var i = 0; i < str.length; i++) {
3340
+ // Node's code seems to be doing this and not & 0x7F..
3341
+ byteArray.push(str.charCodeAt(i) & 0xFF)
3342
+ }
3343
+ return byteArray
3344
+ }
3345
+
3346
+ function utf16leToBytes (str, units) {
3347
+ var c, hi, lo
3348
+ var byteArray = []
3349
+ for (var i = 0; i < str.length; i++) {
3350
+ if ((units -= 2) < 0) break
3351
+
3352
+ c = str.charCodeAt(i)
3353
+ hi = c >> 8
3354
+ lo = c % 256
3355
+ byteArray.push(lo)
3356
+ byteArray.push(hi)
3357
+ }
3358
+
3359
+ return byteArray
3360
+ }
3361
+
3362
+ function base64ToBytes (str) {
3363
+ return base64.toByteArray(base64clean(str))
3364
+ }
3365
+
3366
+ function blitBuffer (src, dst, offset, length) {
3367
+ for (var i = 0; i < length; i++) {
3368
+ if ((i + offset >= dst.length) || (i >= src.length)) break
3369
+ dst[i + offset] = src[i]
3370
+ }
3371
+ return i
3372
+ }
3373
+
3374
+ /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(6).Buffer, (function() { return this; }())))
3375
+
3376
+ /***/ },
3377
+ /* 7 */
3378
+ /***/ function(module, exports, __webpack_require__) {
3379
+
3380
+ var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
3381
+
3382
+ ;(function (exports) {
3383
+ 'use strict';
3384
+
3385
+ var Arr = (typeof Uint8Array !== 'undefined')
3386
+ ? Uint8Array
3387
+ : Array
3388
+
3389
+ var PLUS = '+'.charCodeAt(0)
3390
+ var SLASH = '/'.charCodeAt(0)
3391
+ var NUMBER = '0'.charCodeAt(0)
3392
+ var LOWER = 'a'.charCodeAt(0)
3393
+ var UPPER = 'A'.charCodeAt(0)
3394
+ var PLUS_URL_SAFE = '-'.charCodeAt(0)
3395
+ var SLASH_URL_SAFE = '_'.charCodeAt(0)
3396
+
3397
+ function decode (elt) {
3398
+ var code = elt.charCodeAt(0)
3399
+ if (code === PLUS ||
3400
+ code === PLUS_URL_SAFE)
3401
+ return 62 // '+'
3402
+ if (code === SLASH ||
3403
+ code === SLASH_URL_SAFE)
3404
+ return 63 // '/'
3405
+ if (code < NUMBER)
3406
+ return -1 //no match
3407
+ if (code < NUMBER + 10)
3408
+ return code - NUMBER + 26 + 26
3409
+ if (code < UPPER + 26)
3410
+ return code - UPPER
3411
+ if (code < LOWER + 26)
3412
+ return code - LOWER + 26
3413
+ }
3414
+
3415
+ function b64ToByteArray (b64) {
3416
+ var i, j, l, tmp, placeHolders, arr
3417
+
3418
+ if (b64.length % 4 > 0) {
3419
+ throw new Error('Invalid string. Length must be a multiple of 4')
3420
+ }
3421
+
3422
+ // the number of equal signs (place holders)
3423
+ // if there are two placeholders, than the two characters before it
3424
+ // represent one byte
3425
+ // if there is only one, then the three characters before it represent 2 bytes
3426
+ // this is just a cheap hack to not do indexOf twice
3427
+ var len = b64.length
3428
+ placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0
3429
+
3430
+ // base64 is 4/3 + up to two characters of the original data
3431
+ arr = new Arr(b64.length * 3 / 4 - placeHolders)
3432
+
3433
+ // if there are placeholders, only get up to the last complete 4 chars
3434
+ l = placeHolders > 0 ? b64.length - 4 : b64.length
3435
+
3436
+ var L = 0
3437
+
3438
+ function push (v) {
3439
+ arr[L++] = v
3440
+ }
3441
+
3442
+ for (i = 0, j = 0; i < l; i += 4, j += 3) {
3443
+ tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3))
3444
+ push((tmp & 0xFF0000) >> 16)
3445
+ push((tmp & 0xFF00) >> 8)
3446
+ push(tmp & 0xFF)
3447
+ }
3448
+
3449
+ if (placeHolders === 2) {
3450
+ tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4)
3451
+ push(tmp & 0xFF)
3452
+ } else if (placeHolders === 1) {
3453
+ tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2)
3454
+ push((tmp >> 8) & 0xFF)
3455
+ push(tmp & 0xFF)
3456
+ }
3457
+
3458
+ return arr
3459
+ }
3460
+
3461
+ function uint8ToBase64 (uint8) {
3462
+ var i,
3463
+ extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes
3464
+ output = "",
3465
+ temp, length
3466
+
3467
+ function encode (num) {
3468
+ return lookup.charAt(num)
3469
+ }
3470
+
3471
+ function tripletToBase64 (num) {
3472
+ return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F)
3473
+ }
3474
+
3475
+ // go through the array every three bytes, we'll deal with trailing stuff later
3476
+ for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {
3477
+ temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
3478
+ output += tripletToBase64(temp)
3479
+ }
3480
+
3481
+ // pad the end with zeros, but make sure to not forget the extra bytes
3482
+ switch (extraBytes) {
3483
+ case 1:
3484
+ temp = uint8[uint8.length - 1]
3485
+ output += encode(temp >> 2)
3486
+ output += encode((temp << 4) & 0x3F)
3487
+ output += '=='
3488
+ break
3489
+ case 2:
3490
+ temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1])
3491
+ output += encode(temp >> 10)
3492
+ output += encode((temp >> 4) & 0x3F)
3493
+ output += encode((temp << 2) & 0x3F)
3494
+ output += '='
3495
+ break
3496
+ }
3497
+
3498
+ return output
3499
+ }
3500
+
3501
+ exports.toByteArray = b64ToByteArray
3502
+ exports.fromByteArray = uint8ToBase64
3503
+ }( false ? (this.base64js = {}) : exports))
3504
+
3505
+
3506
+ /***/ },
3507
+ /* 8 */
3508
+ /***/ function(module, exports) {
3509
+
3510
+ exports.read = function (buffer, offset, isLE, mLen, nBytes) {
3511
+ var e, m
3512
+ var eLen = nBytes * 8 - mLen - 1
3513
+ var eMax = (1 << eLen) - 1
3514
+ var eBias = eMax >> 1
3515
+ var nBits = -7
3516
+ var i = isLE ? (nBytes - 1) : 0
3517
+ var d = isLE ? -1 : 1
3518
+ var s = buffer[offset + i]
3519
+
3520
+ i += d
3521
+
3522
+ e = s & ((1 << (-nBits)) - 1)
3523
+ s >>= (-nBits)
3524
+ nBits += eLen
3525
+ for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
3526
+
3527
+ m = e & ((1 << (-nBits)) - 1)
3528
+ e >>= (-nBits)
3529
+ nBits += mLen
3530
+ for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
3531
+
3532
+ if (e === 0) {
3533
+ e = 1 - eBias
3534
+ } else if (e === eMax) {
3535
+ return m ? NaN : ((s ? -1 : 1) * Infinity)
3536
+ } else {
3537
+ m = m + Math.pow(2, mLen)
3538
+ e = e - eBias
3539
+ }
3540
+ return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
3541
+ }
3542
+
3543
+ exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
3544
+ var e, m, c
3545
+ var eLen = nBytes * 8 - mLen - 1
3546
+ var eMax = (1 << eLen) - 1
3547
+ var eBias = eMax >> 1
3548
+ var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
3549
+ var i = isLE ? 0 : (nBytes - 1)
3550
+ var d = isLE ? 1 : -1
3551
+ var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
3552
+
3553
+ value = Math.abs(value)
3554
+
3555
+ if (isNaN(value) || value === Infinity) {
3556
+ m = isNaN(value) ? 1 : 0
3557
+ e = eMax
3558
+ } else {
3559
+ e = Math.floor(Math.log(value) / Math.LN2)
3560
+ if (value * (c = Math.pow(2, -e)) < 1) {
3561
+ e--
3562
+ c *= 2
3563
+ }
3564
+ if (e + eBias >= 1) {
3565
+ value += rt / c
3566
+ } else {
3567
+ value += rt * Math.pow(2, 1 - eBias)
3568
+ }
3569
+ if (value * c >= 2) {
3570
+ e++
3571
+ c /= 2
3572
+ }
3573
+
3574
+ if (e + eBias >= eMax) {
3575
+ m = 0
3576
+ e = eMax
3577
+ } else if (e + eBias >= 1) {
3578
+ m = (value * c - 1) * Math.pow(2, mLen)
3579
+ e = e + eBias
3580
+ } else {
3581
+ m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
3582
+ e = 0
3583
+ }
3584
+ }
3585
+
3586
+ for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
3587
+
3588
+ e = (e << mLen) | m
3589
+ eLen += mLen
3590
+ for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
3591
+
3592
+ buffer[offset + i - d] |= s * 128
3593
+ }
3594
+
3595
+
3596
+ /***/ },
3597
+ /* 9 */
3598
+ /***/ function(module, exports) {
3599
+
3600
+
3601
+ /**
3602
+ * isArray
3603
+ */
3604
+
3605
+ var isArray = Array.isArray;
3606
+
3607
+ /**
3608
+ * toString
3609
+ */
3610
+
3611
+ var str = Object.prototype.toString;
3612
+
3613
+ /**
3614
+ * Whether or not the given `val`
3615
+ * is an array.
3616
+ *
3617
+ * example:
3618
+ *
3619
+ * isArray([]);
3620
+ * // > true
3621
+ * isArray(arguments);
3622
+ * // > false
3623
+ * isArray('');
3624
+ * // > false
3625
+ *
3626
+ * @param {mixed} val
3627
+ * @return {bool}
3628
+ */
3629
+
3630
+ module.exports = isArray || function (val) {
3631
+ return !! val && '[object Array]' == str.call(val);
3632
+ };
3633
+
3634
+
3635
+ /***/ },
3636
+ /* 10 */
3637
+ /***/ function(module, exports) {
3638
+
3639
+ var SceneGraph = function(sceneProperties) {
3640
+ var nodeCount = 1;
3641
+
3642
+ //todo: move merge to helpers section
3643
+ function merge(parent, child) {
3644
+ for (var prop in child) {
3645
+ parent[prop] = child[prop];
3646
+ }
3647
+ return parent;
3648
+ }
3649
+
3650
+ var SceneNode = function(name) {
3651
+ nodeCount++;
3652
+ this.parent = null;
3653
+ this.children = {};
3654
+ this.id = nodeCount;
3655
+ this.name = 'n' + nodeCount;
3656
+ if (typeof name !== 'undefined') {
3657
+ this.name = name;
3658
+ }
3659
+ this.x = this.y = this.z = 0;
3660
+ this.width = this.height = 0;
3661
+ };
3662
+
3663
+ SceneNode.prototype.resize = function(width, height) {
3664
+ if (width != null) {
3665
+ this.width = width;
3666
+ }
3667
+ if (height != null) {
3668
+ this.height = height;
3669
+ }
3670
+ };
3671
+
3672
+ SceneNode.prototype.moveTo = function(x, y, z) {
3673
+ this.x = x != null ? x : this.x;
3674
+ this.y = y != null ? y : this.y;
3675
+ this.z = z != null ? z : this.z;
3676
+ };
3677
+
3678
+ SceneNode.prototype.add = function(child) {
3679
+ var name = child.name;
3680
+ if (typeof this.children[name] === 'undefined') {
3681
+ this.children[name] = child;
3682
+ child.parent = this;
3683
+ } else {
3684
+ throw 'SceneGraph: child already exists: ' + name;
3685
+ }
3686
+ };
3687
+
3688
+ var RootNode = function() {
3689
+ SceneNode.call(this, 'root');
3690
+ this.properties = sceneProperties;
3691
+ };
3692
+
3693
+ RootNode.prototype = new SceneNode();
3694
+
3695
+ var Shape = function(name, props) {
3696
+ SceneNode.call(this, name);
3697
+ this.properties = {
3698
+ 'fill': '#000000'
3699
+ };
3700
+ if (typeof props !== 'undefined') {
3701
+ merge(this.properties, props);
3702
+ } else if (typeof name !== 'undefined' && typeof name !== 'string') {
3703
+ throw 'SceneGraph: invalid node name';
3704
+ }
3705
+ };
3706
+
3707
+ Shape.prototype = new SceneNode();
3708
+
3709
+ var Group = function() {
3710
+ Shape.apply(this, arguments);
3711
+ this.type = 'group';
3712
+ };
3713
+
3714
+ Group.prototype = new Shape();
3715
+
3716
+ var Rect = function() {
3717
+ Shape.apply(this, arguments);
3718
+ this.type = 'rect';
3719
+ };
3720
+
3721
+ Rect.prototype = new Shape();
3722
+
3723
+ var Text = function(text) {
3724
+ Shape.call(this);
3725
+ this.type = 'text';
3726
+ this.properties.text = text;
3727
+ };
3728
+
3729
+ Text.prototype = new Shape();
3730
+
3731
+ var root = new RootNode();
3732
+
3733
+ this.Shape = {
3734
+ 'Rect': Rect,
3735
+ 'Text': Text,
3736
+ 'Group': Group
3737
+ };
3738
+
3739
+ this.root = root;
3740
+ return this;
3741
+ };
3742
+
3743
+ module.exports = SceneGraph;
3744
+
3745
+
3746
+ /***/ },
3747
+ /* 11 */
3748
+ /***/ function(module, exports) {
3749
+
3750
+ /* WEBPACK VAR INJECTION */(function(global) {/**
3751
+ * Shallow object clone and merge
3752
+ *
3753
+ * @param a Object A
3754
+ * @param b Object B
3755
+ * @returns {Object} New object with all of A's properties, and all of B's properties, overwriting A's properties
3756
+ */
3757
+ exports.extend = function(a, b) {
3758
+ var c = {};
3759
+ for (var x in a) {
3760
+ if (a.hasOwnProperty(x)) {
3761
+ c[x] = a[x];
3762
+ }
3763
+ }
3764
+ if (b != null) {
3765
+ for (var y in b) {
3766
+ if (b.hasOwnProperty(y)) {
3767
+ c[y] = b[y];
3768
+ }
3769
+ }
3770
+ }
3771
+ return c;
3772
+ };
3773
+
3774
+ /**
3775
+ * Takes a k/v list of CSS properties and returns a rule
3776
+ *
3777
+ * @param props CSS properties object
3778
+ */
3779
+ exports.cssProps = function(props) {
3780
+ var ret = [];
3781
+ for (var p in props) {
3782
+ if (props.hasOwnProperty(p)) {
3783
+ ret.push(p + ':' + props[p]);
3784
+ }
3785
+ }
3786
+ return ret.join(';');
3787
+ };
3788
+
3789
+ /**
3790
+ * Encodes HTML entities in a string
3791
+ *
3792
+ * @param str Input string
3793
+ */
3794
+ exports.encodeHtmlEntity = function(str) {
3795
+ var buf = [];
3796
+ var charCode = 0;
3797
+ for (var i = str.length - 1; i >= 0; i--) {
3798
+ charCode = str.charCodeAt(i);
3799
+ if (charCode > 128) {
3800
+ buf.unshift(['&#', charCode, ';'].join(''));
3801
+ } else {
3802
+ buf.unshift(str[i]);
3803
+ }
3804
+ }
3805
+ return buf.join('');
3806
+ };
3807
+
3808
+ /**
3809
+ * Checks if an image exists
3810
+ *
3811
+ * @param src URL of image
3812
+ * @param callback Callback to call once image status has been found
3813
+ */
3814
+ exports.imageExists = function(src, callback) {
3815
+ var image = new Image();
3816
+ image.onerror = function() {
3817
+ callback.call(this, false);
3818
+ };
3819
+ image.onload = function() {
3820
+ callback.call(this, true);
3821
+ };
3822
+ image.src = src;
3823
+ };
3824
+
3825
+ /**
3826
+ * Decodes HTML entities in a string
3827
+ *
3828
+ * @param str Input string
3829
+ */
3830
+ exports.decodeHtmlEntity = function(str) {
3831
+ return str.replace(/&#(\d+);/g, function(match, dec) {
3832
+ return String.fromCharCode(dec);
3833
+ });
3834
+ };
3835
+
3836
+
3837
+ /**
3838
+ * Returns an element's dimensions if it's visible, `false` otherwise.
3839
+ *
3840
+ * @param el DOM element
3841
+ */
3842
+ exports.dimensionCheck = function(el) {
3843
+ var dimensions = {
3844
+ height: el.clientHeight,
3845
+ width: el.clientWidth
3846
+ };
3847
+
3848
+ if (dimensions.height && dimensions.width) {
3849
+ return dimensions;
3850
+ } else {
3851
+ return false;
3852
+ }
3853
+ };
3854
+
3855
+
3856
+ /**
3857
+ * Returns true if value is truthy or if it is "semantically truthy"
3858
+ * @param val
3859
+ */
3860
+ exports.truthy = function(val) {
3861
+ if (typeof val === 'string') {
3862
+ return val === 'true' || val === 'yes' || val === '1' || val === 'on' || val === '✓';
3863
+ }
3864
+ return !!val;
3865
+ };
3866
+
3867
+ /**
3868
+ * Parses input into a well-formed CSS color
3869
+ * @param val
3870
+ */
3871
+ exports.parseColor = function(val) {
3872
+ var hexre = /(^(?:#?)[0-9a-f]{6}$)|(^(?:#?)[0-9a-f]{3}$)/i;
3873
+ var rgbre = /^rgb\((\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/;
3874
+ var rgbare = /^rgba\((\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(0\.\d{1,}|1)\)$/;
3875
+
3876
+ var match = val.match(hexre);
2062
3877
  var retval;
2063
3878
 
2064
3879
  if (match !== null) {
@@ -2108,10 +3923,10 @@ return /******/ (function(modules) { // webpackBootstrap
2108
3923
  /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))
2109
3924
 
2110
3925
  /***/ },
2111
- /* 8 */
3926
+ /* 12 */
2112
3927
  /***/ function(module, exports, __webpack_require__) {
2113
3928
 
2114
- /* WEBPACK VAR INJECTION */(function(global) {var DOM = __webpack_require__(9);
3929
+ /* WEBPACK VAR INJECTION */(function(global) {var DOM = __webpack_require__(13);
2115
3930
 
2116
3931
  var SVG_NS = 'http://www.w3.org/2000/svg';
2117
3932
  var NODE_TYPE_COMMENT = 8;
@@ -2224,7 +4039,7 @@ return /******/ (function(modules) { // webpackBootstrap
2224
4039
  /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))
2225
4040
 
2226
4041
  /***/ },
2227
- /* 9 */
4042
+ /* 13 */
2228
4043
  /***/ function(module, exports) {
2229
4044
 
2230
4045
  /* WEBPACK VAR INJECTION */(function(global) {/**
@@ -2293,7 +4108,7 @@ return /******/ (function(modules) { // webpackBootstrap
2293
4108
  /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))
2294
4109
 
2295
4110
  /***/ },
2296
- /* 10 */
4111
+ /* 14 */
2297
4112
  /***/ function(module, exports) {
2298
4113
 
2299
4114
  var Color = function(color, options) {
@@ -2501,23 +4316,23 @@ return /******/ (function(modules) { // webpackBootstrap
2501
4316
 
2502
4317
 
2503
4318
  /***/ },
2504
- /* 11 */
4319
+ /* 15 */
2505
4320
  /***/ function(module, exports) {
2506
4321
 
2507
4322
  module.exports = {
2508
- 'version': '2.9.0',
4323
+ 'version': '2.9.1',
2509
4324
  'svg_ns': 'http://www.w3.org/2000/svg'
2510
4325
  };
2511
4326
 
2512
4327
  /***/ },
2513
- /* 12 */
4328
+ /* 16 */
2514
4329
  /***/ function(module, exports, __webpack_require__) {
2515
4330
 
2516
- var shaven = __webpack_require__(13);
4331
+ var shaven = __webpack_require__(17);
2517
4332
 
2518
- var SVG = __webpack_require__(8);
2519
- var constants = __webpack_require__(11);
2520
- var utils = __webpack_require__(7);
4333
+ var SVG = __webpack_require__(12);
4334
+ var constants = __webpack_require__(15);
4335
+ var utils = __webpack_require__(11);
2521
4336
 
2522
4337
  var SVG_NS = constants.svg_ns;
2523
4338
 
@@ -2669,10 +4484,10 @@ return /******/ (function(modules) { // webpackBootstrap
2669
4484
  };
2670
4485
 
2671
4486
  /***/ },
2672
- /* 13 */
4487
+ /* 17 */
2673
4488
  /***/ function(module, exports, __webpack_require__) {
2674
4489
 
2675
- var escape = __webpack_require__(14)
4490
+ var escape = __webpack_require__(18)
2676
4491
 
2677
4492
  // TODO: remove namespace
2678
4493
 
@@ -2866,15 +4681,26 @@ return /******/ (function(modules) { // webpackBootstrap
2866
4681
 
2867
4682
 
2868
4683
  /***/ },
2869
- /* 14 */
4684
+ /* 18 */
2870
4685
  /***/ function(module, exports) {
2871
4686
 
2872
4687
  /*!
2873
4688
  * escape-html
2874
4689
  * Copyright(c) 2012-2013 TJ Holowaychuk
4690
+ * Copyright(c) 2015 Andreas Lubbe
4691
+ * Copyright(c) 2015 Tiancheng "Timothy" Gu
2875
4692
  * MIT Licensed
2876
4693
  */
2877
4694
 
4695
+ 'use strict';
4696
+
4697
+ /**
4698
+ * Module variables.
4699
+ * @private
4700
+ */
4701
+
4702
+ var matchHtmlRegExp = /["'&<>]/;
4703
+
2878
4704
  /**
2879
4705
  * Module exports.
2880
4706
  * @public
@@ -2885,27 +4711,65 @@ return /******/ (function(modules) { // webpackBootstrap
2885
4711
  /**
2886
4712
  * Escape special characters in the given string of html.
2887
4713
  *
2888
- * @param {string} str The string to escape for inserting into HTML
4714
+ * @param {string} string The string to escape for inserting into HTML
2889
4715
  * @return {string}
2890
4716
  * @public
2891
4717
  */
2892
4718
 
2893
- function escapeHtml(html) {
2894
- return String(html)
2895
- .replace(/&/g, '&amp;')
2896
- .replace(/"/g, '&quot;')
2897
- .replace(/'/g, '&#39;')
2898
- .replace(/</g, '&lt;')
2899
- .replace(/>/g, '&gt;');
4719
+ function escapeHtml(string) {
4720
+ var str = '' + string;
4721
+ var match = matchHtmlRegExp.exec(str);
4722
+
4723
+ if (!match) {
4724
+ return str;
4725
+ }
4726
+
4727
+ var escape;
4728
+ var html = '';
4729
+ var index = 0;
4730
+ var lastIndex = 0;
4731
+
4732
+ for (index = match.index; index < str.length; index++) {
4733
+ switch (str.charCodeAt(index)) {
4734
+ case 34: // "
4735
+ escape = '&quot;';
4736
+ break;
4737
+ case 38: // &
4738
+ escape = '&amp;';
4739
+ break;
4740
+ case 39: // '
4741
+ escape = '&#39;';
4742
+ break;
4743
+ case 60: // <
4744
+ escape = '&lt;';
4745
+ break;
4746
+ case 62: // >
4747
+ escape = '&gt;';
4748
+ break;
4749
+ default:
4750
+ continue;
4751
+ }
4752
+
4753
+ if (lastIndex !== index) {
4754
+ html += str.substring(lastIndex, index);
4755
+ }
4756
+
4757
+ lastIndex = index + 1;
4758
+ html += escape;
4759
+ }
4760
+
4761
+ return lastIndex !== index
4762
+ ? html + str.substring(lastIndex, index)
4763
+ : html;
2900
4764
  }
2901
4765
 
2902
4766
 
2903
4767
  /***/ },
2904
- /* 15 */
4768
+ /* 19 */
2905
4769
  /***/ function(module, exports, __webpack_require__) {
2906
4770
 
2907
- var DOM = __webpack_require__(9);
2908
- var utils = __webpack_require__(7);
4771
+ var DOM = __webpack_require__(13);
4772
+ var utils = __webpack_require__(11);
2909
4773
 
2910
4774
  module.exports = (function() {
2911
4775
  var canvas = DOM.newEl('canvas');