|  | var Stack = require('./_Stack'), | 
						
						
							|  |     equalArrays = require('./_equalArrays'), | 
						
						
							|  |     equalByTag = require('./_equalByTag'), | 
						
						
							|  |     equalObjects = require('./_equalObjects'), | 
						
						
							|  |     getTag = require('./_getTag'), | 
						
						
							|  |     isArray = require('./isArray'), | 
						
						
							|  |     isBuffer = require('./isBuffer'), | 
						
						
							|  |     isTypedArray = require('./isTypedArray'); | 
						
						
							|  | 
 | 
						
						
							|  | /** Used to compose bitmasks for value comparisons. */ | 
						
						
							|  | var COMPARE_PARTIAL_FLAG = 1; | 
						
						
							|  | 
 | 
						
						
							|  | /** `Object#toString` result references. */ | 
						
						
							|  | var argsTag = '[object Arguments]', | 
						
						
							|  |     arrayTag = '[object Array]', | 
						
						
							|  |     objectTag = '[object Object]'; | 
						
						
							|  | 
 | 
						
						
							|  | /** Used for built-in method references. */ | 
						
						
							|  | var objectProto = Object.prototype; | 
						
						
							|  | 
 | 
						
						
							|  | /** Used to check objects for own properties. */ | 
						
						
							|  | var hasOwnProperty = objectProto.hasOwnProperty; | 
						
						
							|  | 
 | 
						
						
							|  | /** | 
						
						
							|  |  * A specialized version of `baseIsEqual` for arrays and objects which performs | 
						
						
							|  |  * deep comparisons and tracks traversed objects enabling objects with circular | 
						
						
							|  |  * references to be compared. | 
						
						
							|  |  * | 
						
						
							|  |  * @private | 
						
						
							|  |  * @param {Object} object The object to compare. | 
						
						
							|  |  * @param {Object} other The other object to compare. | 
						
						
							|  |  * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. | 
						
						
							|  |  * @param {Function} customizer The function to customize comparisons. | 
						
						
							|  |  * @param {Function} equalFunc The function to determine equivalents of values. | 
						
						
							|  |  * @param {Object} [stack] Tracks traversed `object` and `other` objects. | 
						
						
							|  |  * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. | 
						
						
							|  |  */ | 
						
						
							|  | function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { | 
						
						
							|  |   var objIsArr = isArray(object), | 
						
						
							|  |       othIsArr = isArray(other), | 
						
						
							|  |       objTag = objIsArr ? arrayTag : getTag(object), | 
						
						
							|  |       othTag = othIsArr ? arrayTag : getTag(other); | 
						
						
							|  | 
 | 
						
						
							|  |   objTag = objTag == argsTag ? objectTag : objTag; | 
						
						
							|  |   othTag = othTag == argsTag ? objectTag : othTag; | 
						
						
							|  | 
 | 
						
						
							|  |   var objIsObj = objTag == objectTag, | 
						
						
							|  |       othIsObj = othTag == objectTag, | 
						
						
							|  |       isSameTag = objTag == othTag; | 
						
						
							|  | 
 | 
						
						
							|  |   if (isSameTag && isBuffer(object)) { | 
						
						
							|  |     if (!isBuffer(other)) { | 
						
						
							|  |       return false; | 
						
						
							|  |     } | 
						
						
							|  |     objIsArr = true; | 
						
						
							|  |     objIsObj = false; | 
						
						
							|  |   } | 
						
						
							|  |   if (isSameTag && !objIsObj) { | 
						
						
							|  |     stack || (stack = new Stack); | 
						
						
							|  |     return (objIsArr || isTypedArray(object)) | 
						
						
							|  |       ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) | 
						
						
							|  |       : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); | 
						
						
							|  |   } | 
						
						
							|  |   if (!(bitmask & COMPARE_PARTIAL_FLAG)) { | 
						
						
							|  |     var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), | 
						
						
							|  |         othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); | 
						
						
							|  | 
 | 
						
						
							|  |     if (objIsWrapped || othIsWrapped) { | 
						
						
							|  |       var objUnwrapped = objIsWrapped ? object.value() : object, | 
						
						
							|  |           othUnwrapped = othIsWrapped ? other.value() : other; | 
						
						
							|  | 
 | 
						
						
							|  |       stack || (stack = new Stack); | 
						
						
							|  |       return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); | 
						
						
							|  |     } | 
						
						
							|  |   } | 
						
						
							|  |   if (!isSameTag) { | 
						
						
							|  |     return false; | 
						
						
							|  |   } | 
						
						
							|  |   stack || (stack = new Stack); | 
						
						
							|  |   return equalObjects(object, other, bitmask, customizer, equalFunc, stack); | 
						
						
							|  | } | 
						
						
							|  | 
 | 
						
						
							|  | module.exports = baseIsEqualDeep;
 |