old_contents: /*! http://mths.be/array-from v0.1.0 by @mathias */
  if (!Array.from) {
  	(function () {
  		'use strict';
  		var defineProperty = (function () {
  			// IE 8 only supports `Object.defineProperty` on DOM elements
  			try {
  				var object = {};
  				var $defineProperty = Object.defineProperty;
  				var result = $defineProperty(object, object, object) && $defineProperty;
  			} catch(error) {}
  			return result;
  		}());
  		var toLength = function(value) {
  			var number = Number(value);
  			var length;
  			if (number != number) { // better `isNaN`
  				length = 0;
  			} else if (number == 0 || !isFinite(number)) {
  				length = number;
  			} else {
  				length = (number < 0 ? -1 : +1) * Math.floor(Math.abs(number));
  			}
  			if (length <= 0) {
  				return 0;
  			}
  			return Math.min(length, 0x1FFFFFFFFFFFFF);
  		};
  		var isConstructor = function (Constructor) {
  			try {
  				new Constructor();
  				return true;
  			} catch(_) {
  				return false;
  			}
  		};
  		var from = function (arrayLike) {
  			var Me = this;
  			if (arrayLike == null) {
  				throw TypeError();
  			}
  			var items = Object(arrayLike);
  			var mapFn = arguments.length > 1 ? arguments[1] : undefined;
  			var T = arguments.length > 2 ? arguments[2] : undefined;
  			var mapping = true;
  			if (mapFn === undefined) {
  				mapping = false;
  			} else if (typeof mapFn != 'function') {
  				throw TypeError();
  			}
  			var len = toLength(items.length);
  			var A = isConstructor(Me) ? new Me(len) : new Array(len);
  			var k = 0;
  			var kValue;
  			var mappedValue;
  			while (k < len) {
  				if (k in items) { // note: `HasProperty` (not `HasOwnProperty`)
  					kValue = items[k];
  					mappedValue = mapping ? mapFn.call(T, kValue, k, items) : kValue;
  					A[k] = mappedValue;
  				}
  				++k;
  			}
  			A.length = len;
  			return A;
  		};
  		if (defineProperty) {
  			defineProperty(Array, 'from', {
  				'value': from,
  				'configurable': true,
  				'writable': true
  			});
  		} else {
  			Array.from = from;
  		}
  	}());
  }
  
  
new_contents: /*! http://mths.be/array-from v0.1.0 by @mathias */
  if (!Array.from) {
  	(function () {
  		'use strict';
  		var defineProperty = (function () {
  			// IE 8 only supports `Object.defineProperty` on DOM elements
  			try {
  				var object = {};
  				var $defineProperty = Object.defineProperty;
  				var result = $defineProperty(object, object, object) && $defineProperty;
  			} catch(error) {}
  			return result;
  		}());
  		var toStr = Object.prototype.toString;
  		var isCallable = function (fn) {
  			return typeof fn === 'function' || toStr.call(fn) === '[object Function]';
  		};
  		var toLength = function(value) {
  			var number = Number(value);
  			var length;
  			if (number != number) { // better `isNaN`
  				length = 0;
  			} else if (number == 0 || !isFinite(number)) {
  				length = number;
  			} else {
  				length = (number < 0 ? -1 : +1) * Math.floor(Math.abs(number));
  			}
  			if (length <= 0) {
  				return 0;
  			}
  			return Math.min(length, 0x1FFFFFFFFFFFFF);
  		};
  		var isConstructor = function (Constructor) {
  			try {
  				new Constructor();
  				return true;
  			} catch(_) {
  				return false;
  			}
  		};
  		var from = function (arrayLike) {
  			var Me = this;
  			if (arrayLike == null) {
  				throw TypeError();
  			}
  			var items = Object(arrayLike);
  			var mapFn = arguments.length > 1 ? arguments[1] : undefined;
  			var T = arguments.length > 2 ? arguments[2] : undefined;
  			var mapping = true;
  			if (mapFn === undefined) {
  				mapping = false;
  			} else if (!isCallable(mapFn)) {
  				throw TypeError('Array.from: when provided, the second argument must be a function');
  			}
  			var len = toLength(items.length);
  			var A = isConstructor(Me) ? new Me(len) : new Array(len);
  			var k = 0;
  			var kValue;
  			var mappedValue;
  			while (k < len) {
  				if (k in items) { // note: `HasProperty` (not `HasOwnProperty`)
  					kValue = items[k];
  					mappedValue = mapping ? mapFn.call(T, kValue, k, items) : kValue;
  					A[k] = mappedValue;
  				}
  				++k;
  			}
  			A.length = len;
  			return A;
  		};
  		if (defineProperty) {
  			defineProperty(Array, 'from', {
  				'value': from,
  				'configurable': true,
  				'writable': true
  			});
  		} else {
  			Array.from = from;
  		}
  	}());
  }
  
  
subject: Add isCallable, and use it to properly check the mapping function.