docs: function equal(a, b) {
  
      if (Object.is(a, b))
          return true;
  
  	// Dates must have equal time values
  	if (isDate(a) && isDate(b))
  		return a.getTime() === b.getTime();
  
  	// Non-objects must be strictly equal (types must be equal)
  	if (!isObject(a) || !isObject(b))
  		return a === b;
  
  	// Prototypes must be identical.  getPrototypeOf may throw on
  	// ES3 engines that don't provide access to the prototype.
  	try {
  
  	    if (Object.getPrototypeOf(a) !== Object.getPrototypeOf(b))
  		    return false;
  
  	} catch (err) {}
  
  	var aKeys = Object.keys(a),
  		bKeys = Object.keys(b);
  
  	// Number of own properties must be identical
  	if (aKeys.length !== bKeys.length)
  		return false;
  
  	for (var i$0 = 0; i$0 < aKeys.length; ++i$0) {
  
  		// Names of own properties must be identical
  		if (!OP_hasOwnProperty.call(b, aKeys[i$0]))
  			return false;
  
  		// Values of own properties must be equal
  		if (!equal(a[aKeys[i$0]], b[aKeys[i$0]]))
  			return false;
  	}
  
  	return true;
  }