{"version":3,"sources":["app.js"],"names":["r","e","n","t","o","i","f","c","require","u","a","Error","code","p","exports","call","length","1","module","page","util","controls","window","jQuery","s","document","createElement","setAttribute","getElementsByTagName","appendChild","app","self","top","antiClickjack","getElementById","parentNode","removeChild","location","cookie","$","addClass","append","html","Resources","COOKIES_DISABLED","appendTo","SitePreferences","LISTING_INFINITE_SCROLL","limitCharacters","init","extend","pageContext","ready","./controls.js","./jquery-ext","./page","./util","2","lg","grid","md","sm","xLg","scrollTop","3","breakpoints","nav","wrapper","banner","_","isPDP","is","isCheckout","triggers","selecturl","showsearch","hidesearch","removeClass","showpromo","hidepromo","hidemenu","find","showrefinements","hiderefinements","pin","unpin","state","isDesktop","width","isSm","reset","avoid","all","activeElement","attr","onResize","minicartActive","hasClass","onScroll","pinBanner","outerHeight","buildTrigger","el","unbind","bind","wc","toggleClass","focus","scroll","this","on","innerWidth","preventDefault","hide","closest","show","css","getCat","animate","link","href","topcat","parentcat","forEach","throttle","trailing","trigger","assign","value","./breakpoints","lodash","4","fn","toggledList","options","eventName","triggerSelector","children","parent","callback","syncHeight","arr","makeArray","sort","b","height","5","title","type","params","getQueryStringParams","search","substr","redirect","newURL","setTimeout","refresh","offset","6","appendParamToURL","url","name","indexOf","separator","encodeURIComponent","removeParamFromURL","hash","domain","split","paramUrl","newParams","push","join","appendParamsToUrl","_url","each","getQueryString","qs","isString","elementInViewport","offsetToTop","offsetTop","left","offsetLeft","offsetWidth","offsetHeight","offsetParent","pageXOffset","pageYOffset","innerHeight","compatMode","documentElement","clientHeight","scrollLeft","clientWidth","ajaxUrl","path","toAbsoluteUrl","charAt","loadDynamicCss","urls","len","loadedCssFiles","loadCssFile","rel","clearDynamicCss","remove","decodeURIComponent","replace","RegExp","$0","$1","$2","$3","fillAddressFields","address","$form","field","DEFAULT_COUNTRY","toLowerCase","inputField","val","handleLabels","stateCode","characterLimit","data","charCountHtml","String","format","CHAR_LIMIT_MSG","charCountContainer","next","insertAfter","change","setDeleteConfirmation","container","message","confirm","scrollBrowser","xLocation","isMobile","mobileAgentHash","idx","userAgent","navigator","addOverlay","element","fadeIn","removeOverlay","floatingLabels","inputs","inputSelect","thisUtil","blur","input","event","parents","siblings","prepend","lockScroll","body","initWidth","outerWidth","initHeight","scrollPosition","scrollTo","marginR","marginB","margin-right","margin-bottom","unlockScroll","7","global","undefined","upper","lower","VERSION","BIND_FLAG","BIND_KEY_FLAG","CURRY_BOUND_FLAG","CURRY_FLAG","CURRY_RIGHT_FLAG","PARTIAL_FLAG","PARTIAL_RIGHT_FLAG","ARY_FLAG","REARG_FLAG","DEFAULT_TRUNC_LENGTH","DEFAULT_TRUNC_OMISSION","HOT_COUNT","HOT_SPAN","LARGE_ARRAY_SIZE","LAZY_FILTER_FLAG","LAZY_MAP_FLAG","FUNC_ERROR_TEXT","PLACEHOLDER","argsTag","arrayTag","boolTag","dateTag","errorTag","funcTag","numberTag","objectTag","regexpTag","stringTag","arrayBufferTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint8ClampedTag","uint16Tag","uint32Tag","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEscapedHtml","reUnescapedHtml","reHasEscapedHtml","source","reHasUnescapedHtml","reEscape","reEvaluate","reInterpolate","reIsDeepProp","reIsPlainProp","rePropName","reRegExpChars","reHasRegExpChars","reComboMark","reEscapeChar","reEsTemplate","reFlags","reHasHexPrefix","reIsHostCtor","reIsUint","reLatin1","reNoMatch","reUnescapedString","reWords","contextProps","templateCounter","typedArrayTags","cloneableTags","deburredLetters","À","Á","Â","Ã","Ä","Å","à","á","â","ã","ä","å","Ç","ç","Ð","ð","È","É","Ê","Ë","è","é","ê","ë","Ì","Í","Î","Ï","ì","í","î","ï","Ñ","ñ","Ò","Ó","Ô","Õ","Ö","Ø","ò","ó","ô","õ","ö","ø","Ù","Ú","Û","Ü","ù","ú","û","ü","Ý","ý","ÿ","Æ","æ","Þ","þ","ß","htmlEscapes","&","<",">","\"","'","`","htmlUnescapes","&","<",">",""","'","`","objectTypes","function","object","regexpEscapes","0","8","9","A","B","C","D","E","F","d","v","x","stringEscapes","\\","\n","\r","
","
","freeExports","nodeType","freeModule","freeGlobal","Object","freeSelf","freeWindow","moduleExports","root","baseCompareAscending","other","valIsNull","valIsUndef","valIsReflexive","othIsNull","othIsUndef","othIsReflexive","baseFindIndex","array","predicate","fromRight","index","baseIndexOf","fromIndex","indexOfNaN","baseIsFunction","baseToString","charsLeftIndex","string","chars","charsRightIndex","compareAscending","criteria","deburrLetter","letter","escapeHtmlChar","chr","escapeRegExpChar","leadingChar","whitespaceChar","escapeStringChar","isObjectLike","isSpace","charCode","replaceHolders","placeholder","resIndex","result","trimmedLeftIndex","charCodeAt","trimmedRightIndex","unescapeHtmlChar","runInContext","context","Array","defaults","pick","Date","Function","Math","Number","TypeError","arrayProto","prototype","objectProto","stringProto","fnToString","toString","hasOwnProperty","idCounter","objToString","oldDash","reIsNative","ArrayBuffer","clearTimeout","parseFloat","pow","propertyIsEnumerable","Set","getNative","splice","Uint8Array","WeakMap","nativeCeil","ceil","nativeCreate","nativeFloor","floor","nativeIsArray","nativeIsFinite","isFinite","nativeKeys","nativeMax","max","nativeMin","min","nativeNow","nativeParseInt","parseInt","nativeRandom","random","NEGATIVE_INFINITY","POSITIVE_INFINITY","MAX_ARRAY_LENGTH","MAX_ARRAY_INDEX","HALF_MAX_ARRAY_LENGTH","MAX_SAFE_INTEGER","metaMap","realNames","isArray","LazyWrapper","LodashWrapper","wrapperClone","baseLodash","chainAll","actions","__wrapped__","__actions__","__chain__","support","__dir__","__filtered__","__iteratees__","__takeCount__","__views__","MapCache","__data__","SetCache","values","set","cacheIndexOf","cache","isObject","has","arrayCopy","arrayEach","iteratee","arrayEvery","arrayFilter","arrayMap","arrayPush","arrayReduce","accumulator","initFromArray","arraySome","assignOwnDefaults","objectValue","sourceValue","key","assignWith","customizer","props","keys","baseAssign","baseCopy","baseAt","collection","isNil","isArr","isArrayLike","propsLength","isIndex","baseCallback","func","thisArg","argCount","bindCallback","identity","baseMatches","property","baseMatchesProperty","baseClone","isDeep","stackA","stackB","constructor","initCloneArray","tag","isFunc","Ctor","bufferClone","buffer","byteOffset","exec","lastIndex","initCloneByTag","initCloneObject","baseForOwn","subValue","templateSettings","escape","evaluate","interpolate","variable","imports","baseCreate","baseDelay","wait","args","apply","baseDifference","getIndexOf","isCommon","createCache","valuesLength","outer","valuesIndex","baseEach","createBaseEach","baseEachRight","baseForOwnRight","baseEvery","baseFilter","baseFind","eachFunc","retKey","baseFlatten","isStrict","isArguments","baseFor","createBaseFor","baseForRight","baseForIn","keysIn","baseFunctions","isFunction","baseGet","pathKey","toObject","baseIsEqual","isLoose","equalFunc","objIsArr","othIsArr","objTag","othTag","isTypedArray","objIsObj","othIsObj","isSameTag","equalByTag","objIsWrapped","othIsWrapped","arrLength","othLength","arrValue","othValue","objProps","objLength","skipCtor","objValue","objCtor","othCtor","pop","baseIsEqualDeep","baseIsMatch","matchData","noCustomizer","srcValue","baseMap","getMatchData","isKey","isStrictComparable","toPath","baseSlice","last","baseProperty","basePullAt","indexes","previous","baseRandom","baseSetData","start","end","baseSome","baseSortBy","comparer","baseSortByOrder","iteratees","orders","getCallback","objCriteria","othCriteria","ordersLength","order","compareMultiple","baseUniq","isLarge","seen","computed","seenIndex","baseValues","baseWhile","isDrop","baseWrapperValue","action","binaryIndex","retHighest","low","high","mid","binaryIndexBy","valIsNaN","isDef","isReflexive","setLow","arguments","byteLength","composeArgs","partials","holders","holdersLength","argsIndex","argsLength","leftIndex","leftLength","composeArgsRight","holdersIndex","rightIndex","rightLength","createAggregator","setter","initializer","createAssigner","assigner","restParam","sources","guard","isIterateeCall","getLength","isLength","iterable","keysFunc","createCompounder","words","deburr","createCtorWrapper","thisBinding","createCurry","flag","curryFunc","arity","createWrapper","createDefaults","createExtremum","comparator","exValue","current","arrayExtremum","toIterable","baseExtremum","createFind","createFindIndex","createFindKey","objectFunc","createFlow","funcs","thru","getFuncName","funcName","getData","isLaziable","plant","createForEach","arrayFunc","createForIn","createForOwn","createObjectMapper","isMapKeys","mapped","createPadDir","createPadding","createPartial","partialFunc","createReduce","initFromCollection","baseReduce","createHybridWrapper","bitmask","partialsRight","holdersRight","argPos","ary","isAry","isBind","isBindKey","isCurry","isCurryBound","isCurryRight","argsHolders","newArgPos","newArity","newData","setData","oldArray","reorder","strLength","padLength","repeat","slice","createRound","methodName","number","precision","createSortedIndex","srcBitmask","newBitmask","isCombo","mergeData","createBindWrapper","get","noop","otherFunc","target","pairs","isNative","invokePath","test","pickByArray","pickByCallback","count","lastCalled","stamp","now","remaining","shimKeys","allowIndexes","match","quote","clone","difference","drop","dropRight","findIndex","findLastIndex","first","intersection","arrays","othIndex","caches","pullAt","rest","sortedIndex","sortedLastIndex","union","uniq","isSorted","sortedUniq","unzip","group","unzipWith","without","zip","zipObject","zipWith","chain","interceptor","wrapperConcat","arrayConcat","at","countBy","every","filter","findLast","forEachRight","groupBy","includes","indexBy","invoke","isProp","map","partition","reduce","reduceRight","sample","toArray","rand","some","sortByAll","getTime","before","temp","bindAll","methodNames","functions","bindKey","curry","curryRight","debounce","maxTimeoutId","timeoutId","trailingCall","maxWait","leading","complete","isCalled","id","delayed","maxDelayed","debounced","leadingCall","cancel","defer","delay","flow","flowRight","memoize","resolver","memoized","Cache","modArgs","transforms","partial","partialRight","rearg","otherArgs","gt","isEqual","isError","isNumber","isPlainObject","isRegExp","lt","toPlainObject","merge","baseMerge","isSrcArr","mergeFunc","baseMergeDeep","defaultsDeep","mergeDefaults","findKey","findLastKey","forIn","forInRight","forOwn","forOwnRight","isProto","skipIndexes","mapKeys","mapValues","omit","camelCase","word","toUpperCase","kebabCase","padLeft","padRight","snakeCase","startCase","trim","pattern","attempt","matches","method","methodOf","mixin","isObj","basePropertyDeep","round","add","after","chunk","size","compact","constant","create","properties","dropRightWhile","dropWhile","fill","baseFill","flatten","flattenDeep","initial","invert","multiValue","matchesProperty","negate","once","pluck","propertyOf","pull","range","step","reject","nested","shuffle","sortBy","sortByOrder","spread","take","takeRight","takeRightWhile","takeWhile","tap","times","transform","valuesIn","where","wrap","xor","backflow","collect","compose","eachRight","methods","select","tail","unique","augend","addend","capitalize","cloneDeep","endsWith","position","escapeRegExp","findWhere","defaultValue","gte","inRange","isBoolean","isDate","isElement","isEmpty","isMatch","isNaN","isNull","isUndefined","lastIndexOf","lte","noConflict","pad","radix","floating","noMin","noMax","startsWith","sum","arraySum","baseSum","template","otherOptions","settings","isEscaping","isEvaluating","importsKeys","importsValues","reDelimiters","sourceURL","escapeValue","interpolateValue","esTemplateValue","evaluateValue","trimLeft","trimRight","trunc","omission","newEnd","substring","unescape","uniqueId","prefix","any","contains","eq","detect","foldl","foldr","head","include","inject","filtered","reverse","isFilter","takeName","dropName","operationName","createCallback","checkIteratee","retUnwrapped","lodashFunc","isHybrid","isLazy","useLazy","onlyLazy","chainName","dir","isRight","view","getView","iterLength","takeCount","iterIndex","commit","concat","wrapped","run","toJSON","valueOf","define","amd"],"mappings":"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","file":"app.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i').addClass('browser-compatibility-alert').append($('

').addClass('browser-error').html(Resources.COOKIES_DISABLED)).appendTo('#browser-check');\n\t\t}\n\t\tinitializeDom();\n\t\tcontrols.init();\n\n\t\t$.extend(page, window.pageContext);\n\t},\n};\n\n// initialize app\n$(document).ready(function () {\n\tapp.init();\n});\n\n},{\"./controls.js\":3,\"./jquery-ext\":4,\"./page\":5,\"./util\":6}],2:[function(require,module,exports){\n'use strict';\n\n// Helper object to be used in conjunction with Enquire.js\n// These values correlate directly to their CSS counterparts\n\n/*\n\tlg: 'screen and (min-width: ' + breakpoints.lgVal + 'px)',\n\tmd: 'screen and (min-width: 768px)',\n\tmdOnly: '(min-width: 768px) and (max-width:1047px)',\n\tsm: 'screen and (max-width: 767px)',\n\txLg: 'screen and (min-width: 1800px)',\n*/\n\nvar breakpoints = {\n\tlg: 1048,\n\tgrid: 960,\n\tmd: 768,\n\t//mdOnly: '(min-width: 768px) and (max-width:1047px)',\n\tsm: 767,\n\txLg: 1800,\n\tscrollTop: 100\n};\n\nmodule.exports = breakpoints;\n},{}],3:[function(require,module,exports){\n'use strict';\n\nvar breakpoints = require('./breakpoints'),\n nav = $('#navigation'),\n wrapper = $('#wrapper'),\n banner = $('.top-banner'),\n _ = require('lodash'),\n isPDP = $('.pt_product-details').is('*'),\n isCheckout = $('.pt_checkout').is('*'),\n triggers = ['refinements', 'promo', 'search', 'menu'],\n selecturl = $('.js-select-url');\n\n/**\n * prevent slidedown promo message if the class \"remove-slidedown\" is used\n */\n\nif ($('.remove-slidedown').length) {\n triggers[1] = '';\n}\n/**\n * @function\n * @description Setup controls for promos, search, and navigation open/close/pinning in one place\n */\nvar controls = {\n showsearch: function () {\n wrapper.addClass('search-active');\n },\n\n hidesearch: function () {\n wrapper.removeClass('search-active');\n },\n\n showpromo: function () {\n wrapper.addClass('promo-active');\n },\n\n hidepromo: function () {\n wrapper.removeClass('promo-active');\n },\n\n hidemenu: function () {\n wrapper.removeClass('menu-active');\n nav.removeClass('is-open').find('.active').removeClass('active');\n },\n\n showrefinements: function () {\n wrapper.addClass('refinements-active');\n },\n\n hiderefinements: function () {\n wrapper.removeClass('refinements-active');\n },\n\n pin: function () {\n controls.hidepromo();\n wrapper.addClass('pinned');\n },\n\n unpin: function () {\n wrapper.removeClass('pinned');\n },\n};\n\nvar state = {\n isDesktop: function () {\n return $(window).width() > breakpoints.lg;\n },\n\n isSm: function () {\n return $(window).width() < breakpoints.sm;\n },\n\n reset: function (avoid) {\n var all = typeof avoid === 'undefined';\n // Adding check for search field currently active to prevent closing of search box on android devices as keyboard opening triggers window resize event\n if ((all || avoid != 'search') && !$(document.activeElement).attr('id') === 'q') {\n controls.hidesearch();\n }\n if (all || avoid != 'promo') {\n controls.hidepromo();\n }\n if (all || avoid != 'menu') {\n controls.hidemenu();\n }\n },\n\n onResize: function () {\n state.reset();\n },\n\n minicartActive: function () {\n return $('#mini-cart').hasClass('is-visible');\n },\n\n onScroll: function () {\n var pinBanner = $(window).scrollTop() > banner.outerHeight();\n if (!isCheckout) {\n // removed && state.isDesktop() for mobile fixed filter bar --- header bug removed !isPDP &&\n //and prevent unpin on PDP and when minicart is active\n pinBanner && !state.minicartActive() ? controls.pin() : controls.unpin();\n }\n },\n};\n\nvar buildTrigger = function (el) {\n $('.js-' + el + '-toggle')\n .unbind('click')\n .bind('click', function (e) {\n var avoid = el;\n state.reset(avoid);\n var wc = el + '-active';\n wrapper.toggleClass(wc);\n\n if (el === 'search' && wrapper.hasClass('search-active')) {\n $('#q').focus();\n }\n });\n};\n\nif (isPDP) {\n $('.js-top-banner').addClass('pdp-navigation');\n}\n\n$(window).scroll(function () {\n if ($(this).scrollTop() > 10) {\n $('.pdp-navigation').addClass('nowfixed');\n }\n\n if ($(this).scrollTop() < 10) {\n $('.pdp-navigation').removeClass('nowfixed');\n }\n});\n\n$(document).on('click', '.menu-toggle', function () {\n $('#wrapper').removeClass('search-active');\n $('#navigation').removeClass('mobile-closed');\n $('#navigation').addClass('mobile-open');\n $('.menu-toggle').addClass('mobile-is-open');\n $('.icon.icon-nav-open').addClass('close-mob');\n $('body').addClass('freeze');\n $('html').addClass('freeze');\n});\n\n$(document).on('click', '.mobile-is-open', function () {\n if (window.innerWidth <= 1048) {\n $('#navigation').removeClass('mobile-open');\n $('#navigation').addClass('mobile-closed');\n $(this).removeClass('mobile-is-open');\n $('.icon.icon-nav-open').removeClass('close-mob');\n $('body').removeClass('freeze');\n $('html').removeClass('freeze');\n }\n});\n$(document).on('click', '.js-search-toggle', function (e) {\n e.preventDefault();\n if (window.innerWidth <= 1048) {\n $('#navigation').removeClass('mobile-open');\n $('#navigation').addClass('mobile-closed');\n $('.js-menu-toggle').removeClass('mobile-is-open');\n $('.icon.icon-nav-open').removeClass('close-mob');\n $('body').removeClass('freeze');\n $('html').removeClass('freeze');\n }\n});\n\n$(document).on('click', '.has-sub-menu.js-menu-item-toggle', function (e) {\n if (window.innerWidth <= 1048) {\n e.preventDefault();\n $('.menu-category.level-1 li').hide();\n $(this).closest('li').show();\n $(this).closest('li').find('.level-2 .menu-horizontal').show();\n $(this).closest('li').find('.level-2').css('opacity', '1');\n $(this).closest('li').find('.level-2').show();\n $(this).closest('li').find('.nav-group').show();\n $(this).closest('li').find('.level-3 li').show();\n $(this).closest('li').find('.back-arrow').show();\n $(this).closest('li').find('.explore').show();\n $(this).addClass('back-to-nav');\n $('.menu-item-toggle i').hide();\n $('.level-4').hide();\n return;\n }\n});\n\n$(document).on('click', '#hassubsub', function (e) {\n if (window.innerWidth <= 1048) {\n e.preventDefault();\n if ($(this).hasClass('subsub-header')) {\n return;\n } else {\n $('.menu-grid-container li').hide();\n $('.back-to-nav').hide();\n $(this).closest('.nav-group').find('.nav-link.nav-link-2').addClass('hide');\n $(this).closest('.nav-group').show();\n $(this).show();\n var getCat = $(this).attr('class');\n $('.' + getCat + '.level-4').show();\n $(this).addClass('subsub-header');\n $(this).find('.subsubarrow').addClass('hide');\n $('#navigation').animate(\n {\n scrollTop: 0,\n },\n 1,\n );\n\n return;\n }\n }\n});\n\n$(document).on('click', '.subsub-header', function (e) {\n if (window.innerWidth <= 1048) {\n e.preventDefault();\n $('.subsub-header').removeClass('subsub-header');\n $('.menu-grid-container li').show();\n $('.back-to-nav').show();\n $('.level-4').hide();\n $(this).closest('.nav-group').find('.nav-link.nav-link-2').removeClass('hide');\n return;\n }\n});\n\n$(document).on('click', '.back-to-nav .explore', function (e) {\n if (window.innerWidth <= 1048) {\n e.preventDefault();\n var link = $(this).closest('.back-to-nav').attr('href');\n window.location.href = link;\n $('#navigation').removeClass('mobile-open');\n $('#navigation').addClass('mobile-closed');\n $(this).removeClass('mobile-is-open');\n $('.icon.icon-nav-open').removeClass('close-mob');\n $('body').removeClass('freeze');\n $('html').removeClass('freeze');\n $('.menu-category.level-1 li').hide();\n $('.top-level-nav').show();\n $('.back-arrow').hide();\n $('.explore').hide();\n $('.menu-item-toggle i').show();\n $('.back-to-nav').show();\n $('.back-to-nav').removeClass('back-to-nav');\n $('.subsub-header').removeClass('subsub-header');\n }\n});\n\n$(document).on('click', '.back-to-nav', function (e) {\n if (window.innerWidth <= 1048) {\n e.preventDefault();\n $('.menu-category.level-1 li').hide();\n $('.top-level-nav').show();\n $('.back-arrow').hide();\n $('.explore').hide();\n $('.menu-item-toggle i').show();\n $('.back-to-nav').removeClass('back-to-nav');\n }\n});\n\n$(document).ready(function () {\n if (window.innerWidth <= 1048) {\n if ($('.side-menu-top-cat').length) {\n var topcat = $('.side-menu-top-cat').attr('data-mobile-topcat');\n var parentcat = $('.parent-breadcrumb').attr('data-mobile-cat');\n $('.menu-category.level-1 li').hide();\n $('.has-sub-menu.js-menu-item-toggle.' + topcat)\n .closest('li')\n .show();\n $('.has-sub-menu.js-menu-item-toggle.' + topcat)\n .closest('li')\n .find('.level-2 .menu-horizontal')\n .show();\n $('.has-sub-menu.js-menu-item-toggle.' + topcat)\n .closest('li')\n .find('.level-2')\n .css('opacity', '1');\n $('.has-sub-menu.js-menu-item-toggle.' + topcat)\n .closest('li')\n .find('.level-2')\n .show();\n $('.has-sub-menu.js-menu-item-toggle.' + topcat)\n .closest('li')\n .find('.nav-group')\n .show();\n $('.has-sub-menu.js-menu-item-toggle.' + topcat)\n .closest('li')\n .find('.level-3 li')\n .show();\n $('.has-sub-menu.js-menu-item-toggle.' + topcat)\n .closest('li')\n .find('.back-arrow')\n .show();\n $('.has-sub-menu.js-menu-item-toggle.' + topcat)\n .closest('li')\n .find('.explore')\n .show();\n $('.has-sub-menu.js-menu-item-toggle.' + topcat).addClass('back-to-nav');\n $('.menu-item-toggle i').hide();\n $('.level-4').hide();\n } else {\n return;\n }\n if ($('#hassubsub.' + parentcat).length) {\n $('.menu-grid-container li').hide();\n $('.back-to-nav').hide();\n $('#hassubsub.' + parentcat)\n .closest('.nav-group')\n .find('.nav-link.nav-link-2')\n .addClass('hide');\n $('#hassubsub.' + parentcat)\n .closest('.nav-group')\n .show();\n $('#hassubsub.' + parentcat).show();\n $('.' + parentcat + '.level-4').show();\n $('#hassubsub.' + parentcat).addClass('subsub-header');\n $('#hassubsub.' + parentcat)\n .find('.subsubarrow')\n .addClass('hide');\n }\n }\n});\n\n/**\n * @private\n * @function\n * @description init events for the account dropdown custom mediahive\n */\nfunction initSelectURL() {\n if (selecturl.length > 0) {\n selecturl.on('change', function (e) {\n window.location.assign(this.value);\n });\n }\n}\n\nexports.init = function () {\n _.forEach(triggers, buildTrigger);\n\n $(window).on('resize', _.throttle(state.onResize, 500, { trailing: true }));\n $(window).on('scroll', _.throttle(state.onScroll, 500, { trailing: true }));\n $(window).trigger('resize scroll');\n\n //mobile selects\n initSelectURL();\n};\n\n},{\"./breakpoints\":2,\"lodash\":7}],4:[function(require,module,exports){\n'use strict';\n// jQuery extensions\n\nmodule.exports = function () {\n\t// params\n\t// toggleClass - required\n\t// triggerSelector - optional. the selector for the element that triggers the event handler. defaults to the child elements of the list.\n\t// eventName - optional. defaults to 'click'\n\t$.fn.toggledList = function (options) {\n\t\tif (!options.toggleClass) { return this; }\n\t\tvar list = this;\n\t\treturn list.on(options.eventName || 'click', options.triggerSelector || list.children(), function (e) {\n\t\t\te.preventDefault();\n\t\t\tvar classTarget = options.triggerSelector ? $(this).parent() : $(this);\n\t\t\tclassTarget.toggleClass(options.toggleClass);\n\t\t\t// execute callback if exists\n\t\t\tif (options.callback) {options.callback();}\n\t\t});\n\t};\n\n\t$.fn.syncHeight = function () {\n\t\tvar arr = $.makeArray(this);\n\t\tarr.sort(function (a, b) {\n\t\t\treturn $(a).height() - $(b).height();\n\t\t});\n\t\treturn this.height($(arr[arr.length - 1]).height());\n\t};\n};\n\n},{}],5:[function(require,module,exports){\n'use strict';\n\nvar util = require('./util');\n\nvar page = {\n title: '',\n type: '',\n params: util.getQueryStringParams(window.location.search.substr(1)),\n redirect: function(newURL) {\n setTimeout(function() {\n window.location.href = newURL;\n }, 0);\n },\n refresh: function() {\n setTimeout(function() {\n window.location.assign(window.location.href);\n }, 500);\n }\n};\n\n$(document).on('click', '.js-contacts_link', function(e) {\n e.preventDefault();\n $('html, body').removeClass('freeze').animate({\n scrollTop: $(\"#footer-contacts\").offset().top\n }, 800);\n});\n\nmodule.exports = page;\n\n},{\"./util\":6}],6:[function(require,module,exports){\n'use strict';\n\nvar _ = require('lodash');\n\nvar util = {\n\t/**\n\t * @function\n\t * @description appends the parameter with the given name and value to the given url and returns the changed url\n\t * @param {String} url the url to which the parameter will be added\n\t * @param {String} name the name of the parameter\n\t * @param {String} value the value of the parameter\n\t */\n\tappendParamToURL: function (url, name, value) {\n\t\t// quit if the param already exists\n\t\tif (url.indexOf(name + '=') !== -1) {\n\t\t\treturn url;\n\t\t}\n\t\tvar separator = url.indexOf('?') !== -1 ? '&' : '?';\n\t\treturn url + separator + name + '=' + encodeURIComponent(value);\n\t},\n\n\t/**\n\t * @function\n\t * @description remove the parameter and its value from the given url and returns the changed url\n\t * @param {String} url the url from which the parameter will be removed\n\t * @param {String} name the name of parameter that will be removed from url\n\t */\n\tremoveParamFromURL: function (url, name) {\n\t\tif (url.indexOf('?') === -1 || url.indexOf(name + '=') === -1) {\n\t\t\treturn url;\n\t\t}\n\t\tvar hash;\n\t\tvar params;\n\t\tvar domain = url.split('?')[0];\n\t\tvar paramUrl = url.split('?')[1];\n\t\tvar newParams = [];\n\t\t// if there is a hash at the end, store the hash\n\t\tif (paramUrl.indexOf('#') > -1) {\n\t\t\thash = paramUrl.split('#')[1] || '';\n\t\t\tparamUrl = paramUrl.split('#')[0];\n\t\t}\n\t\tparams = paramUrl.split('&');\n\t\tfor (var i = 0; i < params.length; i++) {\n\t\t\t// put back param to newParams array if it is not the one to be removed\n\t\t\tif (params[i].split('=')[0] !== name) {\n\t\t\t\tnewParams.push(params[i]);\n\t\t\t}\n\t\t}\n\t\treturn domain + '?' + newParams.join('&') + (hash ? '#' + hash : '');\n\t},\n\n\t/**\n\t * @function\n\t * @description appends the parameters to the given url and returns the changed url\n\t * @param {String} url the url to which the parameters will be added\n\t * @param {Object} params\n\t */\n\tappendParamsToUrl: function (url, params) {\n\t\tvar _url = url;\n\t\t_.each(params, function (value, name) {\n\t\t\t_url = this.appendParamToURL(_url, name, value);\n\t\t}.bind(this));\n\t\treturn _url;\n\t},\n\t/**\n\t * @function\n\t * @description extract the query string from URL\n\t * @param {String} url the url to extra query string from\n\t **/\n\tgetQueryString: function (url) {\n\t\tvar qs;\n\t\tif (!_.isString(url)) { return; }\n\t\tvar a = document.createElement('a');\n\t\ta.href = url;\n\t\tif (a.search) {\n\t\t\tqs = a.search.substr(1); // remove the leading ?\n\t\t}\n\t\treturn qs;\n\t},\n\t/**\n\t * @function\n\t * @description\n\t * @param {String}\n\t * @param {String}\n\t */\n\telementInViewport: function (el, offsetToTop) {\n\t\tvar top = el.offsetTop,\n\t\t\tleft = el.offsetLeft,\n\t\t\twidth = el.offsetWidth,\n\t\t\theight = el.offsetHeight;\n\n\t\twhile (el.offsetParent) {\n\t\t\tel = el.offsetParent;\n\t\t\ttop += el.offsetTop;\n\t\t\tleft += el.offsetLeft;\n\t\t}\n\n\t\tif (typeof(offsetToTop) !== 'undefined') {\n\t\t\ttop -= offsetToTop;\n\t\t}\n\n\t\tif (window.pageXOffset !== null) {\n\t\t\treturn (\n\t\t\t\ttop < (window.pageYOffset + window.innerHeight) &&\n\t\t\t\tleft < (window.pageXOffset + window.innerWidth) &&\n\t\t\t\t(top + height) > window.pageYOffset &&\n\t\t\t\t(left + width) > window.pageXOffset\n\t\t\t);\n\t\t}\n\n\t\tif (document.compatMode === 'CSS1Compat') {\n\t\t\treturn (\n\t\t\t\ttop < (window.document.documentElement.scrollTop + window.document.documentElement.clientHeight) &&\n\t\t\t\tleft < (window.document.documentElement.scrollLeft + window.document.documentElement.clientWidth) &&\n\t\t\t\t(top + height) > window.document.documentElement.scrollTop &&\n\t\t\t\t(left + width) > window.document.documentElement.scrollLeft\n\t\t\t);\n\t\t}\n\t},\n\n\t/**\n\t * @function\n\t * @description Appends the parameter 'format=ajax' to a given path\n\t * @param {String} path the relative path\n\t */\n\tajaxUrl: function (path) {\n\t\treturn this.appendParamToURL(path, 'format', 'ajax');\n\t},\n\n\t/**\n\t * @function\n\t * @description\n\t * @param {String} url\n\t */\n\ttoAbsoluteUrl: function (url) {\n\t\tif (url.indexOf('http') !== 0 && url.charAt(0) !== '/') {\n\t\t\turl = '/' + url;\n\t\t}\n\t\treturn url;\n\t},\n\t/**\n\t * @function\n\t * @description Loads css dynamically from given urls\n\t * @param {Array} urls Array of urls from which css will be dynamically loaded.\n\t */\n\tloadDynamicCss: function (urls) {\n\t\tvar i, len = urls.length;\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tthis.loadedCssFiles.push(this.loadCssFile(urls[i]));\n\t\t}\n\t},\n\n\t/**\n\t * @function\n\t * @description Loads css file dynamically from given url\n\t * @param {String} url The url from which css file will be dynamically loaded.\n\t */\n\tloadCssFile: function (url) {\n\t\treturn $('').appendTo($('head')).attr({\n\t\t\ttype: 'text/css',\n\t\t\trel: 'stylesheet'\n\t\t}).attr('href', url); // for i.e. <9, href must be added after link has been appended to head\n\t},\n\t// array to keep track of the dynamically loaded CSS files\n\tloadedCssFiles: [],\n\n\t/**\n\t * @function\n\t * @description Removes all css files which were dynamically loaded\n\t */\n\tclearDynamicCss: function () {\n\t\tvar i = this.loadedCssFiles.length;\n\t\twhile (0 > i--) {\n\t\t\t$(this.loadedCssFiles[i]).remove();\n\t\t}\n\t\tthis.loadedCssFiles = [];\n\t},\n\t/**\n\t * @function\n\t * @description Extracts all parameters from a given query string into an object\n\t * @param {String} qs The query string from which the parameters will be extracted\n\t */\n\tgetQueryStringParams: function (qs) {\n\t\tif (!qs || qs.length === 0) { return {}; }\n\t\tvar params = {},\n\t\t\tunescapedQS = decodeURIComponent(qs);\n\t\t// Use the String::replace method to iterate over each\n\t\t// name-value pair in the string.\n\t\tunescapedQS.replace(new RegExp('([^?=&]+)(=([^&]*))?', 'g'),\n\t\t\tfunction ($0, $1, $2, $3) {\n\t\t\t\tparams[$1] = $3;\n\t\t\t}\n\t\t);\n\t\treturn params;\n\t},\n\n\tfillAddressFields: function (address, $form) {\n\t\tfor (var field in address) {\n\t\t\tif (field === 'ID' || field === 'UUID' || field === 'key' || field === 'type') {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// Forces country code to US as it is the only option on the site and legacy data sometimes breaks form\n\t\t\tif (field === 'countryCode') {\n\t\t\t\taddress[field] = window.SitePreferences.DEFAULT_COUNTRY.toLowerCase() !== 'gb' ? 'us' : 'gb';\n\t\t\t}\n\t\t\t// if the key in address object ends with 'Code', remove that suffix\n\t\t\t// keys that ends with 'Code' are postalCode, stateCode and countryCode\n\t\t\tvar inputField = $form.find('[name$=\"' + field.replace('Code', '') + '\"]');\n\t\t\tinputField.val(address[field]);\n\t\t\tthis.handleLabels(inputField);\n\t\t\t// update the state fields\n\t\t\tif (field === 'countryCode') {\n\t\t\t\t$form.find('[name$=\"country\"]').trigger('change');\n\t\t\t\t// retrigger state selection after country has changed\n\t\t\t\t// this results in duplication of the state code, but is a necessary evil\n\t\t\t\t// for now because sometimes countryCode comes after stateCode\n\t\t\t\t$form.find('[name$=\"state\"]').val(address.stateCode).trigger('change');\n\t\t\t}\n\t\t}\n\t},\n\t/**\n\t * @function\n\t * @description Updates the number of the remaining character\n\t * based on the character limit in a text area\n\t */\n\tlimitCharacters: function () {\n\t\t$('form').find('textarea[data-character-limit]').each(function () {\n\t\t\tvar characterLimit = $(this).data('character-limit');\n\t\t\tvar charCountHtml = String.format(Resources.CHAR_LIMIT_MSG,\n\t\t\t\t'' + characterLimit + '',\n\t\t\t\t'' + characterLimit + '');\n\t\t\tvar charCountContainer = $(this).next('div.char-count');\n\t\t\tif (charCountContainer.length === 0) {\n\t\t\t\tcharCountContainer = $('

').insertAfter($(this));\n\t\t\t}\n\t\t\tcharCountContainer.html(charCountHtml);\n\t\t\t// trigger the keydown event so that any existing character data is calculated\n\t\t\t$(this).change();\n\t\t});\n\t},\n\t/**\n\t * @function\n\t * @description Binds the onclick-event to a delete button on a given container,\n\t * which opens a confirmation box with a given message\n\t * @param {String} container The name of element to which the function will be bind\n\t * @param {String} message The message the will be shown upon a click\n\t */\n\tsetDeleteConfirmation: function (container, message) {\n\t\t$(container).on('click', '.delete', function () {\n\t\t\treturn window.confirm(message);\n\t\t});\n\t},\n\t/**\n\t * @function\n\t * @description Scrolls a browser window to a given x point\n\t * @param {String} The x coordinate\n\t */\n\t\n\t// commented out to prevent scroll to top\n\tscrollBrowser: function (xLocation) {\n\t\t$('html, body').animate({scrollTop: xLocation}, 500);\n\t},\n\n\tisMobile: function () {\n\t\tvar mobileAgentHash = ['mobile', 'tablet', 'phone', 'ipad', 'ipod', 'android', 'blackberry', 'windows ce', 'opera mini', 'palm'];\n\t\tvar\tidx = 0;\n\t\tvar isMobile = false;\n\t\tvar userAgent = (navigator.userAgent).toLowerCase();\n\n\t\twhile (mobileAgentHash[idx] && !isMobile) {\n\t\t\tisMobile = (userAgent.indexOf(mobileAgentHash[idx]) >= 0);\n\t\t\tidx++;\n\t\t}\n\t\treturn isMobile;\n\t},\n\t\n\t/**\n\t * @function\n\t * @description Add/remove dark overlay to body element \n\t */\n\t\n\t addOverlay: function (element) {\n\t\t element.append('
');\n\t\t $('.ui-widget-overlay').fadeIn();\n\t },\n\t \n\t removeOverlay: function () {\n\t\t $('.ui-widget-overlay').remove();\n\t },\n\n\t/**\n\t* @function\n\t* @description Handles floating labels for input elements\n\t*/\n\tfloatingLabels: function (container) {\n\t\tvar inputs = container.find('input[type=text], input[type=number], input[type=password], input[type=tel], input[type=email], .input-select');\n\t\tvar inputSelect = container.find('.input-select');\n\n\t\tvar thisUtil = this;\n\t\t\n\t\tinputs.focus(function(e) {\n\t\t\tthisUtil.handleLabels($(this), 'focus')\n\t\t});\n\n\t\tinputs.blur(function(e) {\n\t\t\tthisUtil.handleLabels($(this), 'blur')\n\t\t});\n\n\t\tinputSelect.change(function() {\n\t\t\tthisUtil.handleLabels($(this), 'select')\n\t\t})\n\t},\n\n\thandleLabels: function (input, event) {\n\t\tif (input.hasClass('valid')) {\n\t\t\tinput.parents('.form-row').find('label').addClass('active').removeClass('label-error')\n\t\t} else if (input.hasClass('error')) {\n\t\t\tinput.parents('.form-row').find('label').removeClass('active').addClass('label-error');\n\t\t\tinput.siblings('span.error, label.error.label-error').find('.icon-warning').remove();\n\t\t\tinput.siblings('span.error, label.error.label-error').prepend('');\n\t\t} else {\n\t\t\tif (event == 'focus' ) {\n\t\t\t\tinput.parents('.form-row').find('label').addClass('active');\n\t\t\t} else if (event == 'blur' && input.val() == '') {\n\t\t\t\tinput.parents('.form-row').find('label').removeClass('active').removeClass('label-error')\n\t\t\t} else if (input.val()) {\n\t\t\t\t\tinput.parents('.form-row').find('label').addClass('active');\n\t\t\t} else {\n\t\t\t\tinput.parents('.form-row').find('label').removeClass('active');\n\t\t\t}\n\t\t}\n\n\t\tif (input.hasClass('input-select') && input.val()) {\n\t\t\tinput.parents('.form-row').find('label').addClass('active');\n\t\t\tinput.removeClass('empty');\n\t\t}\n\t},\n\n\t/**\n\t* @function\n\t* @description lock and unlock scroll on html/body element\n\t*/\n\tlockScroll: function () {\n\t var html = $('html');\n\t var body = $('body');\n\t var initWidth = body.outerWidth();\n\t var initHeight = body.outerHeight();\n\n\t var scrollPosition = [\n\t self.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,\n\t self.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop\n\t ];\n\t html.data('scroll-position', scrollPosition);\n\t html.data('previous-overflow', html.css('overflow'));\n\t html.css('overflow', 'hidden');\n\t window.scrollTo(scrollPosition[0], scrollPosition[1]); \n\n\t var marginR = body.outerWidth()-initWidth;\n\t var marginB = body.outerHeight()-initHeight; \n\t body.css({'margin-right': marginR,'margin-bottom': marginB});\n\t},\n\n\tunlockScroll: function () {\n\t var html = $('html');\n\t var body = $('body');\n\t html.css('overflow', html.data('previous-overflow'));\n\t var scrollPosition = html.data('scroll-position');\n\t window.scrollTo(scrollPosition[0], scrollPosition[1]); \n\n\t body.css({'margin-right': 0, 'margin-bottom': 0});\n\t}\n\n};\n\nmodule.exports = util;\n\n},{\"lodash\":7}],7:[function(require,module,exports){\n(function (global){(function (){\n/**\n * @license\n * lodash 3.10.1 (Custom Build) \n * Build: `lodash modern -d -o ./index.js`\n * Copyright 2012-2015 The Dojo Foundation \n * Based on Underscore.js 1.8.3 \n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license \n */\n;(function() {\n\n /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n var undefined;\n\n /** Used as the semantic version number. */\n var VERSION = '3.10.1';\n\n /** Used to compose bitmasks for wrapper metadata. */\n var BIND_FLAG = 1,\n BIND_KEY_FLAG = 2,\n CURRY_BOUND_FLAG = 4,\n CURRY_FLAG = 8,\n CURRY_RIGHT_FLAG = 16,\n PARTIAL_FLAG = 32,\n PARTIAL_RIGHT_FLAG = 64,\n ARY_FLAG = 128,\n REARG_FLAG = 256;\n\n /** Used as default options for `_.trunc`. */\n var DEFAULT_TRUNC_LENGTH = 30,\n DEFAULT_TRUNC_OMISSION = '...';\n\n /** Used to detect when a function becomes hot. */\n var HOT_COUNT = 150,\n HOT_SPAN = 16;\n\n /** Used as the size to enable large array optimizations. */\n var LARGE_ARRAY_SIZE = 200;\n\n /** Used to indicate the type of lazy iteratees. */\n var LAZY_FILTER_FLAG = 1,\n LAZY_MAP_FLAG = 2;\n\n /** Used as the `TypeError` message for \"Functions\" methods. */\n var FUNC_ERROR_TEXT = 'Expected a function';\n\n /** Used as the internal argument placeholder. */\n var PLACEHOLDER = '__lodash_placeholder__';\n\n /** `Object#toString` result references. */\n var argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\n var arrayBufferTag = '[object ArrayBuffer]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n /** Used to match empty string literals in compiled template source. */\n var reEmptyStringLeading = /\\b__p \\+= '';/g,\n reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n /** Used to match HTML entities and HTML characters. */\n var reEscapedHtml = /&(?:amp|lt|gt|quot|#39|#96);/g,\n reUnescapedHtml = /[&<>\"'`]/g,\n reHasEscapedHtml = RegExp(reEscapedHtml.source),\n reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n /** Used to match template delimiters. */\n var reEscape = /<%-([\\s\\S]+?)%>/g,\n reEvaluate = /<%([\\s\\S]+?)%>/g,\n reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n /** Used to match property names within property paths. */\n var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\n\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/,\n rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\n\\\\]|\\\\.)*?)\\2)\\]/g;\n\n /**\n * Used to match `RegExp` [syntax characters](http://ecma-international.org/ecma-262/6.0/#sec-patterns)\n * and those outlined by [`EscapeRegExpPattern`](http://ecma-international.org/ecma-262/6.0/#sec-escaperegexppattern).\n */\n var reRegExpChars = /^[:!,]|[\\\\^$.*+?()[\\]{}|\\/]|(^[0-9a-fA-Fnrtuvx])|([\\n\\r\\u2028\\u2029])/g,\n reHasRegExpChars = RegExp(reRegExpChars.source);\n\n /** Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). */\n var reComboMark = /[\\u0300-\\u036f\\ufe20-\\ufe23]/g;\n\n /** Used to match backslashes in property paths. */\n var reEscapeChar = /\\\\(\\\\)?/g;\n\n /** Used to match [ES template delimiters](http://ecma-international.org/ecma-262/6.0/#sec-template-literal-lexical-components). */\n var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n /** Used to match `RegExp` flags from their coerced string values. */\n var reFlags = /\\w*$/;\n\n /** Used to detect hexadecimal string values. */\n var reHasHexPrefix = /^0[xX]/;\n\n /** Used to detect host constructors (Safari > 5). */\n var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n /** Used to detect unsigned integer values. */\n var reIsUint = /^\\d+$/;\n\n /** Used to match latin-1 supplementary letters (excluding mathematical operators). */\n var reLatin1 = /[\\xc0-\\xd6\\xd8-\\xde\\xdf-\\xf6\\xf8-\\xff]/g;\n\n /** Used to ensure capturing order of template delimiters. */\n var reNoMatch = /($^)/;\n\n /** Used to match unescaped characters in compiled string literals. */\n var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n /** Used to match words to create compound words. */\n var reWords = (function() {\n var upper = '[A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde]',\n lower = '[a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff]+';\n\n return RegExp(upper + '+(?=' + upper + lower + ')|' + upper + '?' + lower + '|' + upper + '+|[0-9]+', 'g');\n }());\n\n /** Used to assign default `context` object properties. */\n var contextProps = [\n 'Array', 'ArrayBuffer', 'Date', 'Error', 'Float32Array', 'Float64Array',\n 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Math', 'Number',\n 'Object', 'RegExp', 'Set', 'String', '_', 'clearTimeout', 'isFinite',\n 'parseFloat', 'parseInt', 'setTimeout', 'TypeError', 'Uint8Array',\n 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap'\n ];\n\n /** Used to make template sourceURLs easier to identify. */\n var templateCounter = -1;\n\n /** Used to identify `toStringTag` values of typed arrays. */\n var typedArrayTags = {};\n typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n typedArrayTags[uint32Tag] = true;\n typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n typedArrayTags[dateTag] = typedArrayTags[errorTag] =\n typedArrayTags[funcTag] = typedArrayTags[mapTag] =\n typedArrayTags[numberTag] = typedArrayTags[objectTag] =\n typedArrayTags[regexpTag] = typedArrayTags[setTag] =\n typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n\n /** Used to identify `toStringTag` values supported by `_.clone`. */\n var cloneableTags = {};\n cloneableTags[argsTag] = cloneableTags[arrayTag] =\n cloneableTags[arrayBufferTag] = cloneableTags[boolTag] =\n cloneableTags[dateTag] = cloneableTags[float32Tag] =\n cloneableTags[float64Tag] = cloneableTags[int8Tag] =\n cloneableTags[int16Tag] = cloneableTags[int32Tag] =\n cloneableTags[numberTag] = cloneableTags[objectTag] =\n cloneableTags[regexpTag] = cloneableTags[stringTag] =\n cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n cloneableTags[errorTag] = cloneableTags[funcTag] =\n cloneableTags[mapTag] = cloneableTags[setTag] =\n cloneableTags[weakMapTag] = false;\n\n /** Used to map latin-1 supplementary letters to basic latin letters. */\n var deburredLetters = {\n '\\xc0': 'A', '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n '\\xe0': 'a', '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n '\\xc7': 'C', '\\xe7': 'c',\n '\\xd0': 'D', '\\xf0': 'd',\n '\\xc8': 'E', '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n '\\xe8': 'e', '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n '\\xcC': 'I', '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n '\\xeC': 'i', '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n '\\xd1': 'N', '\\xf1': 'n',\n '\\xd2': 'O', '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n '\\xf2': 'o', '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n '\\xd9': 'U', '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n '\\xf9': 'u', '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n '\\xdd': 'Y', '\\xfd': 'y', '\\xff': 'y',\n '\\xc6': 'Ae', '\\xe6': 'ae',\n '\\xde': 'Th', '\\xfe': 'th',\n '\\xdf': 'ss'\n };\n\n /** Used to map characters to HTML entities. */\n var htmlEscapes = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '`': '`'\n };\n\n /** Used to map HTML entities to characters. */\n var htmlUnescapes = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\",\n '`': '`'\n };\n\n /** Used to determine if values are of the language type `Object`. */\n var objectTypes = {\n 'function': true,\n 'object': true\n };\n\n /** Used to escape characters for inclusion in compiled regexes. */\n var regexpEscapes = {\n '0': 'x30', '1': 'x31', '2': 'x32', '3': 'x33', '4': 'x34',\n '5': 'x35', '6': 'x36', '7': 'x37', '8': 'x38', '9': 'x39',\n 'A': 'x41', 'B': 'x42', 'C': 'x43', 'D': 'x44', 'E': 'x45', 'F': 'x46',\n 'a': 'x61', 'b': 'x62', 'c': 'x63', 'd': 'x64', 'e': 'x65', 'f': 'x66',\n 'n': 'x6e', 'r': 'x72', 't': 'x74', 'u': 'x75', 'v': 'x76', 'x': 'x78'\n };\n\n /** Used to escape characters for inclusion in compiled string literals. */\n var stringEscapes = {\n '\\\\': '\\\\',\n \"'\": \"'\",\n '\\n': 'n',\n '\\r': 'r',\n '\\u2028': 'u2028',\n '\\u2029': 'u2029'\n };\n\n /** Detect free variable `exports`. */\n var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\n\n /** Detect free variable `module`. */\n var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\n\n /** Detect free variable `global` from Node.js. */\n var freeGlobal = freeExports && freeModule && typeof global == 'object' && global && global.Object && global;\n\n /** Detect free variable `self`. */\n var freeSelf = objectTypes[typeof self] && self && self.Object && self;\n\n /** Detect free variable `window`. */\n var freeWindow = objectTypes[typeof window] && window && window.Object && window;\n\n /** Detect the popular CommonJS extension `module.exports`. */\n var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\n\n /**\n * Used as a reference to the global object.\n *\n * The `this` value is used if it's the global object to avoid Greasemonkey's\n * restricted `window` object, otherwise the `window` object is used.\n */\n var root = freeGlobal || ((freeWindow !== (this && this.window)) && freeWindow) || freeSelf || this;\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * The base implementation of `compareAscending` which compares values and\n * sorts them in ascending order without guaranteeing a stable sort.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {number} Returns the sort order indicator for `value`.\n */\n function baseCompareAscending(value, other) {\n if (value !== other) {\n var valIsNull = value === null,\n valIsUndef = value === undefined,\n valIsReflexive = value === value;\n\n var othIsNull = other === null,\n othIsUndef = other === undefined,\n othIsReflexive = other === other;\n\n if ((value > other && !othIsNull) || !valIsReflexive ||\n (valIsNull && !othIsUndef && othIsReflexive) ||\n (valIsUndef && othIsReflexive)) {\n return 1;\n }\n if ((value < other && !valIsNull) || !othIsReflexive ||\n (othIsNull && !valIsUndef && valIsReflexive) ||\n (othIsUndef && valIsReflexive)) {\n return -1;\n }\n }\n return 0;\n }\n\n /**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for callback shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to search.\n * @param {Function} predicate The function invoked per iteration.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseFindIndex(array, predicate, fromRight) {\n var length = array.length,\n index = fromRight ? length : -1;\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * The base implementation of `_.indexOf` without support for binary searches.\n *\n * @private\n * @param {Array} array The array to search.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseIndexOf(array, value, fromIndex) {\n if (value !== value) {\n return indexOfNaN(array, fromIndex);\n }\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * The base implementation of `_.isFunction` without support for environments\n * with incorrect `typeof` results.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n */\n function baseIsFunction(value) {\n // Avoid a Chakra JIT bug in compatibility modes of IE 11.\n // See https://github.com/jashkenas/underscore/issues/1621 for more details.\n return typeof value == 'function' || false;\n }\n\n /**\n * Converts `value` to a string if it's not one. An empty string is returned\n * for `null` or `undefined` values.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\n function baseToString(value) {\n return value == null ? '' : (value + '');\n }\n\n /**\n * Used by `_.trim` and `_.trimLeft` to get the index of the first character\n * of `string` that is not found in `chars`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @param {string} chars The characters to find.\n * @returns {number} Returns the index of the first character not found in `chars`.\n */\n function charsLeftIndex(string, chars) {\n var index = -1,\n length = string.length;\n\n while (++index < length && chars.indexOf(string.charAt(index)) > -1) {}\n return index;\n }\n\n /**\n * Used by `_.trim` and `_.trimRight` to get the index of the last character\n * of `string` that is not found in `chars`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @param {string} chars The characters to find.\n * @returns {number} Returns the index of the last character not found in `chars`.\n */\n function charsRightIndex(string, chars) {\n var index = string.length;\n\n while (index-- && chars.indexOf(string.charAt(index)) > -1) {}\n return index;\n }\n\n /**\n * Used by `_.sortBy` to compare transformed elements of a collection and stable\n * sort them in ascending order.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @returns {number} Returns the sort order indicator for `object`.\n */\n function compareAscending(object, other) {\n return baseCompareAscending(object.criteria, other.criteria) || (object.index - other.index);\n }\n\n /**\n * Used by `_.sortByOrder` to compare multiple properties of a value to another\n * and stable sort them.\n *\n * If `orders` is unspecified, all valuess are sorted in ascending order. Otherwise,\n * a value is sorted in ascending order if its corresponding order is \"asc\", and\n * descending if \"desc\".\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {boolean[]} orders The order to sort by for each property.\n * @returns {number} Returns the sort order indicator for `object`.\n */\n function compareMultiple(object, other, orders) {\n var index = -1,\n objCriteria = object.criteria,\n othCriteria = other.criteria,\n length = objCriteria.length,\n ordersLength = orders.length;\n\n while (++index < length) {\n var result = baseCompareAscending(objCriteria[index], othCriteria[index]);\n if (result) {\n if (index >= ordersLength) {\n return result;\n }\n var order = orders[index];\n return result * ((order === 'asc' || order === true) ? 1 : -1);\n }\n }\n // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n // that causes it, under certain circumstances, to provide the same value for\n // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n // for more details.\n //\n // This also ensures a stable sort in V8 and other engines.\n // See https://code.google.com/p/v8/issues/detail?id=90 for more details.\n return object.index - other.index;\n }\n\n /**\n * Used by `_.deburr` to convert latin-1 supplementary letters to basic latin letters.\n *\n * @private\n * @param {string} letter The matched letter to deburr.\n * @returns {string} Returns the deburred letter.\n */\n function deburrLetter(letter) {\n return deburredLetters[letter];\n }\n\n /**\n * Used by `_.escape` to convert characters to HTML entities.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */\n function escapeHtmlChar(chr) {\n return htmlEscapes[chr];\n }\n\n /**\n * Used by `_.escapeRegExp` to escape characters for inclusion in compiled regexes.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @param {string} leadingChar The capture group for a leading character.\n * @param {string} whitespaceChar The capture group for a whitespace character.\n * @returns {string} Returns the escaped character.\n */\n function escapeRegExpChar(chr, leadingChar, whitespaceChar) {\n if (leadingChar) {\n chr = regexpEscapes[chr];\n } else if (whitespaceChar) {\n chr = stringEscapes[chr];\n }\n return '\\\\' + chr;\n }\n\n /**\n * Used by `_.template` to escape characters for inclusion in compiled string literals.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */\n function escapeStringChar(chr) {\n return '\\\\' + stringEscapes[chr];\n }\n\n /**\n * Gets the index at which the first occurrence of `NaN` is found in `array`.\n *\n * @private\n * @param {Array} array The array to search.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched `NaN`, else `-1`.\n */\n function indexOfNaN(array, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 0 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n var other = array[index];\n if (other !== other) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * Checks if `value` is object-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n */\n function isObjectLike(value) {\n return !!value && typeof value == 'object';\n }\n\n /**\n * Used by `trimmedLeftIndex` and `trimmedRightIndex` to determine if a\n * character code is whitespace.\n *\n * @private\n * @param {number} charCode The character code to inspect.\n * @returns {boolean} Returns `true` if `charCode` is whitespace, else `false`.\n */\n function isSpace(charCode) {\n return ((charCode <= 160 && (charCode >= 9 && charCode <= 13) || charCode == 32 || charCode == 160) || charCode == 5760 || charCode == 6158 ||\n (charCode >= 8192 && (charCode <= 8202 || charCode == 8232 || charCode == 8233 || charCode == 8239 || charCode == 8287 || charCode == 12288 || charCode == 65279)));\n }\n\n /**\n * Replaces all `placeholder` elements in `array` with an internal placeholder\n * and returns an array of their indexes.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {*} placeholder The placeholder to replace.\n * @returns {Array} Returns the new array of placeholder indexes.\n */\n function replaceHolders(array, placeholder) {\n var index = -1,\n length = array.length,\n resIndex = -1,\n result = [];\n\n while (++index < length) {\n if (array[index] === placeholder) {\n array[index] = PLACEHOLDER;\n result[++resIndex] = index;\n }\n }\n return result;\n }\n\n /**\n * An implementation of `_.uniq` optimized for sorted arrays without support\n * for callback shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The function invoked per iteration.\n * @returns {Array} Returns the new duplicate-value-free array.\n */\n function sortedUniq(array, iteratee) {\n var seen,\n index = -1,\n length = array.length,\n resIndex = -1,\n result = [];\n\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value, index, array) : value;\n\n if (!index || seen !== computed) {\n seen = computed;\n result[++resIndex] = value;\n }\n }\n return result;\n }\n\n /**\n * Used by `_.trim` and `_.trimLeft` to get the index of the first non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the first non-whitespace character.\n */\n function trimmedLeftIndex(string) {\n var index = -1,\n length = string.length;\n\n while (++index < length && isSpace(string.charCodeAt(index))) {}\n return index;\n }\n\n /**\n * Used by `_.trim` and `_.trimRight` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\n function trimmedRightIndex(string) {\n var index = string.length;\n\n while (index-- && isSpace(string.charCodeAt(index))) {}\n return index;\n }\n\n /**\n * Used by `_.unescape` to convert HTML entities to characters.\n *\n * @private\n * @param {string} chr The matched character to unescape.\n * @returns {string} Returns the unescaped character.\n */\n function unescapeHtmlChar(chr) {\n return htmlUnescapes[chr];\n }\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Create a new pristine `lodash` function using the given `context` object.\n *\n * @static\n * @memberOf _\n * @category Utility\n * @param {Object} [context=root] The context object.\n * @returns {Function} Returns a new `lodash` function.\n * @example\n *\n * _.mixin({ 'foo': _.constant('foo') });\n *\n * var lodash = _.runInContext();\n * lodash.mixin({ 'bar': lodash.constant('bar') });\n *\n * _.isFunction(_.foo);\n * // => true\n * _.isFunction(_.bar);\n * // => false\n *\n * lodash.isFunction(lodash.foo);\n * // => false\n * lodash.isFunction(lodash.bar);\n * // => true\n *\n * // using `context` to mock `Date#getTime` use in `_.now`\n * var mock = _.runInContext({\n * 'Date': function() {\n * return { 'getTime': getTimeMock };\n * }\n * });\n *\n * // or creating a suped-up `defer` in Node.js\n * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n */\n function runInContext(context) {\n // Avoid issues with some ES3 environments that attempt to use values, named\n // after built-in constructors like `Object`, for the creation of literals.\n // ES5 clears this up by stating that literals must use built-in constructors.\n // See https://es5.github.io/#x11.1.5 for more details.\n context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\n\n /** Native constructor references. */\n var Array = context.Array,\n Date = context.Date,\n Error = context.Error,\n Function = context.Function,\n Math = context.Math,\n Number = context.Number,\n Object = context.Object,\n RegExp = context.RegExp,\n String = context.String,\n TypeError = context.TypeError;\n\n /** Used for native method references. */\n var arrayProto = Array.prototype,\n objectProto = Object.prototype,\n stringProto = String.prototype;\n\n /** Used to resolve the decompiled source of functions. */\n var fnToString = Function.prototype.toString;\n\n /** Used to check objects for own properties. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /** Used to generate unique IDs. */\n var idCounter = 0;\n\n /**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\n var objToString = objectProto.toString;\n\n /** Used to restore the original `_` reference in `_.noConflict`. */\n var oldDash = root._;\n\n /** Used to detect if a method is native. */\n var reIsNative = RegExp('^' +\n fnToString.call(hasOwnProperty).replace(/[\\\\^$.*+?()[\\]{}|]/g, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n );\n\n /** Native method references. */\n var ArrayBuffer = context.ArrayBuffer,\n clearTimeout = context.clearTimeout,\n parseFloat = context.parseFloat,\n pow = Math.pow,\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\n Set = getNative(context, 'Set'),\n setTimeout = context.setTimeout,\n splice = arrayProto.splice,\n Uint8Array = context.Uint8Array,\n WeakMap = getNative(context, 'WeakMap');\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeCeil = Math.ceil,\n nativeCreate = getNative(Object, 'create'),\n nativeFloor = Math.floor,\n nativeIsArray = getNative(Array, 'isArray'),\n nativeIsFinite = context.isFinite,\n nativeKeys = getNative(Object, 'keys'),\n nativeMax = Math.max,\n nativeMin = Math.min,\n nativeNow = getNative(Date, 'now'),\n nativeParseInt = context.parseInt,\n nativeRandom = Math.random;\n\n /** Used as references for `-Infinity` and `Infinity`. */\n var NEGATIVE_INFINITY = Number.NEGATIVE_INFINITY,\n POSITIVE_INFINITY = Number.POSITIVE_INFINITY;\n\n /** Used as references for the maximum length and index of an array. */\n var MAX_ARRAY_LENGTH = 4294967295,\n MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\n HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n /**\n * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)\n * of an array-like value.\n */\n var MAX_SAFE_INTEGER = 9007199254740991;\n\n /** Used to store function metadata. */\n var metaMap = WeakMap && new WeakMap;\n\n /** Used to lookup unminified function names. */\n var realNames = {};\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a `lodash` object which wraps `value` to enable implicit chaining.\n * Methods that operate on and return arrays, collections, and functions can\n * be chained together. Methods that retrieve a single value or may return a\n * primitive value will automatically end the chain returning the unwrapped\n * value. Explicit chaining may be enabled using `_.chain`. The execution of\n * chained methods is lazy, that is, execution is deferred until `_#value`\n * is implicitly or explicitly called.\n *\n * Lazy evaluation allows several methods to support shortcut fusion. Shortcut\n * fusion is an optimization strategy which merge iteratee calls; this can help\n * to avoid the creation of intermediate data structures and greatly reduce the\n * number of iteratee executions.\n *\n * Chaining is supported in custom builds as long as the `_#value` method is\n * directly or indirectly included in the build.\n *\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\n *\n * The wrapper `Array` methods are:\n * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`,\n * `splice`, and `unshift`\n *\n * The wrapper `String` methods are:\n * `replace` and `split`\n *\n * The wrapper methods that support shortcut fusion are:\n * `compact`, `drop`, `dropRight`, `dropRightWhile`, `dropWhile`, `filter`,\n * `first`, `initial`, `last`, `map`, `pluck`, `reject`, `rest`, `reverse`,\n * `slice`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, `toArray`,\n * and `where`\n *\n * The chainable wrapper methods are:\n * `after`, `ary`, `assign`, `at`, `before`, `bind`, `bindAll`, `bindKey`,\n * `callback`, `chain`, `chunk`, `commit`, `compact`, `concat`, `constant`,\n * `countBy`, `create`, `curry`, `debounce`, `defaults`, `defaultsDeep`,\n * `defer`, `delay`, `difference`, `drop`, `dropRight`, `dropRightWhile`,\n * `dropWhile`, `fill`, `filter`, `flatten`, `flattenDeep`, `flow`, `flowRight`,\n * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\n * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\n * `invoke`, `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`,\n * `matchesProperty`, `memoize`, `merge`, `method`, `methodOf`, `mixin`,\n * `modArgs`, `negate`, `omit`, `once`, `pairs`, `partial`, `partialRight`,\n * `partition`, `pick`, `plant`, `pluck`, `property`, `propertyOf`, `pull`,\n * `pullAt`, `push`, `range`, `rearg`, `reject`, `remove`, `rest`, `restParam`,\n * `reverse`, `set`, `shuffle`, `slice`, `sort`, `sortBy`, `sortByAll`,\n * `sortByOrder`, `splice`, `spread`, `take`, `takeRight`, `takeRightWhile`,\n * `takeWhile`, `tap`, `throttle`, `thru`, `times`, `toArray`, `toPlainObject`,\n * `transform`, `union`, `uniq`, `unshift`, `unzip`, `unzipWith`, `values`,\n * `valuesIn`, `where`, `without`, `wrap`, `xor`, `zip`, `zipObject`, `zipWith`\n *\n * The wrapper methods that are **not** chainable by default are:\n * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clone`, `cloneDeep`,\n * `deburr`, `endsWith`, `escape`, `escapeRegExp`, `every`, `find`, `findIndex`,\n * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `findWhere`, `first`,\n * `floor`, `get`, `gt`, `gte`, `has`, `identity`, `includes`, `indexOf`,\n * `inRange`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\n * `isEmpty`, `isEqual`, `isError`, `isFinite` `isFunction`, `isMatch`,\n * `isNative`, `isNaN`, `isNull`, `isNumber`, `isObject`, `isPlainObject`,\n * `isRegExp`, `isString`, `isUndefined`, `isTypedArray`, `join`, `kebabCase`,\n * `last`, `lastIndexOf`, `lt`, `lte`, `max`, `min`, `noConflict`, `noop`,\n * `now`, `pad`, `padLeft`, `padRight`, `parseInt`, `pop`, `random`, `reduce`,\n * `reduceRight`, `repeat`, `result`, `round`, `runInContext`, `shift`, `size`,\n * `snakeCase`, `some`, `sortedIndex`, `sortedLastIndex`, `startCase`,\n * `startsWith`, `sum`, `template`, `trim`, `trimLeft`, `trimRight`, `trunc`,\n * `unescape`, `uniqueId`, `value`, and `words`\n *\n * The wrapper method `sample` will return a wrapped value when `n` is provided,\n * otherwise an unwrapped value is returned.\n *\n * @name _\n * @constructor\n * @category Chain\n * @param {*} value The value to wrap in a `lodash` instance.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var wrapped = _([1, 2, 3]);\n *\n * // returns an unwrapped value\n * wrapped.reduce(function(total, n) {\n * return total + n;\n * });\n * // => 6\n *\n * // returns a wrapped value\n * var squares = wrapped.map(function(n) {\n * return n * n;\n * });\n *\n * _.isArray(squares);\n * // => false\n *\n * _.isArray(squares.value());\n * // => true\n */\n function lodash(value) {\n if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n if (value instanceof LodashWrapper) {\n return value;\n }\n if (hasOwnProperty.call(value, '__chain__') && hasOwnProperty.call(value, '__wrapped__')) {\n return wrapperClone(value);\n }\n }\n return new LodashWrapper(value);\n }\n\n /**\n * The function whose prototype all chaining wrappers inherit from.\n *\n * @private\n */\n function baseLodash() {\n // No operation performed.\n }\n\n /**\n * The base constructor for creating `lodash` wrapper objects.\n *\n * @private\n * @param {*} value The value to wrap.\n * @param {boolean} [chainAll] Enable chaining for all wrapper methods.\n * @param {Array} [actions=[]] Actions to peform to resolve the unwrapped value.\n */\n function LodashWrapper(value, chainAll, actions) {\n this.__wrapped__ = value;\n this.__actions__ = actions || [];\n this.__chain__ = !!chainAll;\n }\n\n /**\n * An object environment feature flags.\n *\n * @static\n * @memberOf _\n * @type Object\n */\n var support = lodash.support = {};\n\n /**\n * By default, the template delimiters used by lodash are like those in\n * embedded Ruby (ERB). Change the following template settings to use\n * alternative delimiters.\n *\n * @static\n * @memberOf _\n * @type Object\n */\n lodash.templateSettings = {\n\n /**\n * Used to detect `data` property values to be HTML-escaped.\n *\n * @memberOf _.templateSettings\n * @type RegExp\n */\n 'escape': reEscape,\n\n /**\n * Used to detect code to be evaluated.\n *\n * @memberOf _.templateSettings\n * @type RegExp\n */\n 'evaluate': reEvaluate,\n\n /**\n * Used to detect `data` property values to inject.\n *\n * @memberOf _.templateSettings\n * @type RegExp\n */\n 'interpolate': reInterpolate,\n\n /**\n * Used to reference the data object in the template text.\n *\n * @memberOf _.templateSettings\n * @type string\n */\n 'variable': '',\n\n /**\n * Used to import variables into the compiled template.\n *\n * @memberOf _.templateSettings\n * @type Object\n */\n 'imports': {\n\n /**\n * A reference to the `lodash` function.\n *\n * @memberOf _.templateSettings.imports\n * @type Function\n */\n '_': lodash\n }\n };\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n *\n * @private\n * @param {*} value The value to wrap.\n */\n function LazyWrapper(value) {\n this.__wrapped__ = value;\n this.__actions__ = [];\n this.__dir__ = 1;\n this.__filtered__ = false;\n this.__iteratees__ = [];\n this.__takeCount__ = POSITIVE_INFINITY;\n this.__views__ = [];\n }\n\n /**\n * Creates a clone of the lazy wrapper object.\n *\n * @private\n * @name clone\n * @memberOf LazyWrapper\n * @returns {Object} Returns the cloned `LazyWrapper` object.\n */\n function lazyClone() {\n var result = new LazyWrapper(this.__wrapped__);\n result.__actions__ = arrayCopy(this.__actions__);\n result.__dir__ = this.__dir__;\n result.__filtered__ = this.__filtered__;\n result.__iteratees__ = arrayCopy(this.__iteratees__);\n result.__takeCount__ = this.__takeCount__;\n result.__views__ = arrayCopy(this.__views__);\n return result;\n }\n\n /**\n * Reverses the direction of lazy iteration.\n *\n * @private\n * @name reverse\n * @memberOf LazyWrapper\n * @returns {Object} Returns the new reversed `LazyWrapper` object.\n */\n function lazyReverse() {\n if (this.__filtered__) {\n var result = new LazyWrapper(this);\n result.__dir__ = -1;\n result.__filtered__ = true;\n } else {\n result = this.clone();\n result.__dir__ *= -1;\n }\n return result;\n }\n\n /**\n * Extracts the unwrapped value from its lazy wrapper.\n *\n * @private\n * @name value\n * @memberOf LazyWrapper\n * @returns {*} Returns the unwrapped value.\n */\n function lazyValue() {\n var array = this.__wrapped__.value(),\n dir = this.__dir__,\n isArr = isArray(array),\n isRight = dir < 0,\n arrLength = isArr ? array.length : 0,\n view = getView(0, arrLength, this.__views__),\n start = view.start,\n end = view.end,\n length = end - start,\n index = isRight ? end : (start - 1),\n iteratees = this.__iteratees__,\n iterLength = iteratees.length,\n resIndex = 0,\n takeCount = nativeMin(length, this.__takeCount__);\n\n if (!isArr || arrLength < LARGE_ARRAY_SIZE || (arrLength == length && takeCount == length)) {\n return baseWrapperValue((isRight && isArr) ? array.reverse() : array, this.__actions__);\n }\n var result = [];\n\n outer:\n while (length-- && resIndex < takeCount) {\n index += dir;\n\n var iterIndex = -1,\n value = array[index];\n\n while (++iterIndex < iterLength) {\n var data = iteratees[iterIndex],\n iteratee = data.iteratee,\n type = data.type,\n computed = iteratee(value);\n\n if (type == LAZY_MAP_FLAG) {\n value = computed;\n } else if (!computed) {\n if (type == LAZY_FILTER_FLAG) {\n continue outer;\n } else {\n break outer;\n }\n }\n }\n result[resIndex++] = value;\n }\n return result;\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a cache object to store key/value pairs.\n *\n * @private\n * @static\n * @name Cache\n * @memberOf _.memoize\n */\n function MapCache() {\n this.__data__ = {};\n }\n\n /**\n * Removes `key` and its value from the cache.\n *\n * @private\n * @name delete\n * @memberOf _.memoize.Cache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed successfully, else `false`.\n */\n function mapDelete(key) {\n return this.has(key) && delete this.__data__[key];\n }\n\n /**\n * Gets the cached value for `key`.\n *\n * @private\n * @name get\n * @memberOf _.memoize.Cache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the cached value.\n */\n function mapGet(key) {\n return key == '__proto__' ? undefined : this.__data__[key];\n }\n\n /**\n * Checks if a cached value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf _.memoize.Cache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function mapHas(key) {\n return key != '__proto__' && hasOwnProperty.call(this.__data__, key);\n }\n\n /**\n * Sets `value` to `key` of the cache.\n *\n * @private\n * @name set\n * @memberOf _.memoize.Cache\n * @param {string} key The key of the value to cache.\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache object.\n */\n function mapSet(key, value) {\n if (key != '__proto__') {\n this.__data__[key] = value;\n }\n return this;\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n *\n * Creates a cache object to store unique values.\n *\n * @private\n * @param {Array} [values] The values to cache.\n */\n function SetCache(values) {\n var length = values ? values.length : 0;\n\n this.data = { 'hash': nativeCreate(null), 'set': new Set };\n while (length--) {\n this.push(values[length]);\n }\n }\n\n /**\n * Checks if `value` is in `cache` mimicking the return signature of\n * `_.indexOf` by returning `0` if the value is found, else `-1`.\n *\n * @private\n * @param {Object} cache The cache to search.\n * @param {*} value The value to search for.\n * @returns {number} Returns `0` if `value` is found, else `-1`.\n */\n function cacheIndexOf(cache, value) {\n var data = cache.data,\n result = (typeof value == 'string' || isObject(value)) ? data.set.has(value) : data.hash[value];\n\n return result ? 0 : -1;\n }\n\n /**\n * Adds `value` to the cache.\n *\n * @private\n * @name push\n * @memberOf SetCache\n * @param {*} value The value to cache.\n */\n function cachePush(value) {\n var data = this.data;\n if (typeof value == 'string' || isObject(value)) {\n data.set.add(value);\n } else {\n data.hash[value] = true;\n }\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a new array joining `array` with `other`.\n *\n * @private\n * @param {Array} array The array to join.\n * @param {Array} other The other array to join.\n * @returns {Array} Returns the new concatenated array.\n */\n function arrayConcat(array, other) {\n var index = -1,\n length = array.length,\n othIndex = -1,\n othLength = other.length,\n result = Array(length + othLength);\n\n while (++index < length) {\n result[index] = array[index];\n }\n while (++othIndex < othLength) {\n result[index++] = other[othIndex];\n }\n return result;\n }\n\n /**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\n function arrayCopy(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n }\n\n /**\n * A specialized version of `_.forEach` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\n function arrayEach(array, iteratee) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n }\n\n /**\n * A specialized version of `_.forEachRight` for arrays without support for\n * callback shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\n function arrayEachRight(array, iteratee) {\n var length = array.length;\n\n while (length--) {\n if (iteratee(array[length], length, array) === false) {\n break;\n }\n }\n return array;\n }\n\n /**\n * A specialized version of `_.every` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n */\n function arrayEvery(array, predicate) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n if (!predicate(array[index], index, array)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * A specialized version of `baseExtremum` for arrays which invokes `iteratee`\n * with one argument: (value).\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} comparator The function used to compare values.\n * @param {*} exValue The initial extremum value.\n * @returns {*} Returns the extremum value.\n */\n function arrayExtremum(array, iteratee, comparator, exValue) {\n var index = -1,\n length = array.length,\n computed = exValue,\n result = computed;\n\n while (++index < length) {\n var value = array[index],\n current = +iteratee(value);\n\n if (comparator(current, computed)) {\n computed = current;\n result = value;\n }\n }\n return result;\n }\n\n /**\n * A specialized version of `_.filter` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\n function arrayFilter(array, predicate) {\n var index = -1,\n length = array.length,\n resIndex = -1,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[++resIndex] = value;\n }\n }\n return result;\n }\n\n /**\n * A specialized version of `_.map` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\n function arrayMap(array, iteratee) {\n var index = -1,\n length = array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n }\n\n /**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\n function arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n }\n\n /**\n * A specialized version of `_.reduce` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initFromArray] Specify using the first element of `array`\n * as the initial value.\n * @returns {*} Returns the accumulated value.\n */\n function arrayReduce(array, iteratee, accumulator, initFromArray) {\n var index = -1,\n length = array.length;\n\n if (initFromArray && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n }\n\n /**\n * A specialized version of `_.reduceRight` for arrays without support for\n * callback shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initFromArray] Specify using the last element of `array`\n * as the initial value.\n * @returns {*} Returns the accumulated value.\n */\n function arrayReduceRight(array, iteratee, accumulator, initFromArray) {\n var length = array.length;\n if (initFromArray && length) {\n accumulator = array[--length];\n }\n while (length--) {\n accumulator = iteratee(accumulator, array[length], length, array);\n }\n return accumulator;\n }\n\n /**\n * A specialized version of `_.some` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\n function arraySome(array, predicate) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * A specialized version of `_.sum` for arrays without support for callback\n * shorthands and `this` binding..\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {number} Returns the sum.\n */\n function arraySum(array, iteratee) {\n var length = array.length,\n result = 0;\n\n while (length--) {\n result += +iteratee(array[length]) || 0;\n }\n return result;\n }\n\n /**\n * Used by `_.defaults` to customize its `_.assign` use.\n *\n * @private\n * @param {*} objectValue The destination object property value.\n * @param {*} sourceValue The source object property value.\n * @returns {*} Returns the value to assign to the destination object.\n */\n function assignDefaults(objectValue, sourceValue) {\n return objectValue === undefined ? sourceValue : objectValue;\n }\n\n /**\n * Used by `_.template` to customize its `_.assign` use.\n *\n * **Note:** This function is like `assignDefaults` except that it ignores\n * inherited property values when checking if a property is `undefined`.\n *\n * @private\n * @param {*} objectValue The destination object property value.\n * @param {*} sourceValue The source object property value.\n * @param {string} key The key associated with the object and source values.\n * @param {Object} object The destination object.\n * @returns {*} Returns the value to assign to the destination object.\n */\n function assignOwnDefaults(objectValue, sourceValue, key, object) {\n return (objectValue === undefined || !hasOwnProperty.call(object, key))\n ? sourceValue\n : objectValue;\n }\n\n /**\n * A specialized version of `_.assign` for customizing assigned values without\n * support for argument juggling, multiple sources, and `this` binding `customizer`\n * functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {Function} customizer The function to customize assigned values.\n * @returns {Object} Returns `object`.\n */\n function assignWith(object, source, customizer) {\n var index = -1,\n props = keys(source),\n length = props.length;\n\n while (++index < length) {\n var key = props[index],\n value = object[key],\n result = customizer(value, source[key], key, object, source);\n\n if ((result === result ? (result !== value) : (value === value)) ||\n (value === undefined && !(key in object))) {\n object[key] = result;\n }\n }\n return object;\n }\n\n /**\n * The base implementation of `_.assign` without support for argument juggling,\n * multiple sources, and `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\n function baseAssign(object, source) {\n return source == null\n ? object\n : baseCopy(source, keys(source), object);\n }\n\n /**\n * The base implementation of `_.at` without support for string collections\n * and individual key arguments.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {number[]|string[]} props The property names or indexes of elements to pick.\n * @returns {Array} Returns the new array of picked elements.\n */\n function baseAt(collection, props) {\n var index = -1,\n isNil = collection == null,\n isArr = !isNil && isArrayLike(collection),\n length = isArr ? collection.length : 0,\n propsLength = props.length,\n result = Array(propsLength);\n\n while(++index < propsLength) {\n var key = props[index];\n if (isArr) {\n result[index] = isIndex(key, length) ? collection[key] : undefined;\n } else {\n result[index] = isNil ? undefined : collection[key];\n }\n }\n return result;\n }\n\n /**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property names to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @returns {Object} Returns `object`.\n */\n function baseCopy(source, props, object) {\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n object[key] = source[key];\n }\n return object;\n }\n\n /**\n * The base implementation of `_.callback` which supports specifying the\n * number of arguments to provide to `func`.\n *\n * @private\n * @param {*} [func=_.identity] The value to convert to a callback.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {number} [argCount] The number of arguments to provide to `func`.\n * @returns {Function} Returns the callback.\n */\n function baseCallback(func, thisArg, argCount) {\n var type = typeof func;\n if (type == 'function') {\n return thisArg === undefined\n ? func\n : bindCallback(func, thisArg, argCount);\n }\n if (func == null) {\n return identity;\n }\n if (type == 'object') {\n return baseMatches(func);\n }\n return thisArg === undefined\n ? property(func)\n : baseMatchesProperty(func, thisArg);\n }\n\n /**\n * The base implementation of `_.clone` without support for argument juggling\n * and `this` binding `customizer` functions.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @param {Function} [customizer] The function to customize cloning values.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The object `value` belongs to.\n * @param {Array} [stackA=[]] Tracks traversed source objects.\n * @param {Array} [stackB=[]] Associates clones with source counterparts.\n * @returns {*} Returns the cloned value.\n */\n function baseClone(value, isDeep, customizer, key, object, stackA, stackB) {\n var result;\n if (customizer) {\n result = object ? customizer(value, key, object) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return arrayCopy(value, result);\n }\n } else {\n var tag = objToString.call(value),\n isFunc = tag == funcTag;\n\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = initCloneObject(isFunc ? {} : value);\n if (!isDeep) {\n return baseAssign(result, value);\n }\n } else {\n return cloneableTags[tag]\n ? initCloneByTag(value, tag, isDeep)\n : (object ? value : {});\n }\n }\n // Check for circular references and return its corresponding clone.\n stackA || (stackA = []);\n stackB || (stackB = []);\n\n var length = stackA.length;\n while (length--) {\n if (stackA[length] == value) {\n return stackB[length];\n }\n }\n // Add the source value to the stack of traversed objects and associate it with its clone.\n stackA.push(value);\n stackB.push(result);\n\n // Recursively populate clone (susceptible to call stack limits).\n (isArr ? arrayEach : baseForOwn)(value, function(subValue, key) {\n result[key] = baseClone(subValue, isDeep, customizer, key, value, stackA, stackB);\n });\n return result;\n }\n\n /**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} prototype The object to inherit from.\n * @returns {Object} Returns the new object.\n */\n var baseCreate = (function() {\n function object() {}\n return function(prototype) {\n if (isObject(prototype)) {\n object.prototype = prototype;\n var result = new object;\n object.prototype = undefined;\n }\n return result || {};\n };\n }());\n\n /**\n * The base implementation of `_.delay` and `_.defer` which accepts an index\n * of where to slice the arguments to provide to `func`.\n *\n * @private\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @param {Object} args The arguments provide to `func`.\n * @returns {number} Returns the timer id.\n */\n function baseDelay(func, wait, args) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return setTimeout(function() { func.apply(undefined, args); }, wait);\n }\n\n /**\n * The base implementation of `_.difference` which accepts a single array\n * of values to exclude.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n */\n function baseDifference(array, values) {\n var length = array ? array.length : 0,\n result = [];\n\n if (!length) {\n return result;\n }\n var index = -1,\n indexOf = getIndexOf(),\n isCommon = indexOf == baseIndexOf,\n cache = (isCommon && values.length >= LARGE_ARRAY_SIZE) ? createCache(values) : null,\n valuesLength = values.length;\n\n if (cache) {\n indexOf = cacheIndexOf;\n isCommon = false;\n values = cache;\n }\n outer:\n while (++index < length) {\n var value = array[index];\n\n if (isCommon && value === value) {\n var valuesIndex = valuesLength;\n while (valuesIndex--) {\n if (values[valuesIndex] === value) {\n continue outer;\n }\n }\n result.push(value);\n }\n else if (indexOf(values, value, 0) < 0) {\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.forEach` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object|string} Returns `collection`.\n */\n var baseEach = createBaseEach(baseForOwn);\n\n /**\n * The base implementation of `_.forEachRight` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object|string} Returns `collection`.\n */\n var baseEachRight = createBaseEach(baseForOwnRight, true);\n\n /**\n * The base implementation of `_.every` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`\n */\n function baseEvery(collection, predicate) {\n var result = true;\n baseEach(collection, function(value, index, collection) {\n result = !!predicate(value, index, collection);\n return result;\n });\n return result;\n }\n\n /**\n * Gets the extremum value of `collection` invoking `iteratee` for each value\n * in `collection` to generate the criterion by which the value is ranked.\n * The `iteratee` is invoked with three arguments: (value, index|key, collection).\n *\n * @private\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} comparator The function used to compare values.\n * @param {*} exValue The initial extremum value.\n * @returns {*} Returns the extremum value.\n */\n function baseExtremum(collection, iteratee, comparator, exValue) {\n var computed = exValue,\n result = computed;\n\n baseEach(collection, function(value, index, collection) {\n var current = +iteratee(value, index, collection);\n if (comparator(current, computed) || (current === exValue && current === result)) {\n computed = current;\n result = value;\n }\n });\n return result;\n }\n\n /**\n * The base implementation of `_.fill` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to fill.\n * @param {*} value The value to fill `array` with.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns `array`.\n */\n function baseFill(array, value, start, end) {\n var length = array.length;\n\n start = start == null ? 0 : (+start || 0);\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = (end === undefined || end > length) ? length : (+end || 0);\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : (end >>> 0);\n start >>>= 0;\n\n while (start < length) {\n array[start++] = value;\n }\n return array;\n }\n\n /**\n * The base implementation of `_.filter` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\n function baseFilter(collection, predicate) {\n var result = [];\n baseEach(collection, function(value, index, collection) {\n if (predicate(value, index, collection)) {\n result.push(value);\n }\n });\n return result;\n }\n\n /**\n * The base implementation of `_.find`, `_.findLast`, `_.findKey`, and `_.findLastKey`,\n * without support for callback shorthands and `this` binding, which iterates\n * over `collection` using the provided `eachFunc`.\n *\n * @private\n * @param {Array|Object|string} collection The collection to search.\n * @param {Function} predicate The function invoked per iteration.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @param {boolean} [retKey] Specify returning the key of the found element\n * instead of the element itself.\n * @returns {*} Returns the found element or its key, else `undefined`.\n */\n function baseFind(collection, predicate, eachFunc, retKey) {\n var result;\n eachFunc(collection, function(value, key, collection) {\n if (predicate(value, key, collection)) {\n result = retKey ? key : value;\n return false;\n }\n });\n return result;\n }\n\n /**\n * The base implementation of `_.flatten` with added support for restricting\n * flattening and specifying the start index.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {boolean} [isDeep] Specify a deep flatten.\n * @param {boolean} [isStrict] Restrict flattening to arrays-like objects.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\n function baseFlatten(array, isDeep, isStrict, result) {\n result || (result = []);\n\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n var value = array[index];\n if (isObjectLike(value) && isArrayLike(value) &&\n (isStrict || isArray(value) || isArguments(value))) {\n if (isDeep) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, isDeep, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `baseForIn` and `baseForOwn` which iterates\n * over `object` properties returned by `keysFunc` invoking `iteratee` for\n * each property. Iteratee functions may exit iteration early by explicitly\n * returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\n var baseFor = createBaseFor();\n\n /**\n * This function is like `baseFor` except that it iterates over properties\n * in the opposite order.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\n var baseForRight = createBaseFor(true);\n\n /**\n * The base implementation of `_.forIn` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\n function baseForIn(object, iteratee) {\n return baseFor(object, iteratee, keysIn);\n }\n\n /**\n * The base implementation of `_.forOwn` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\n function baseForOwn(object, iteratee) {\n return baseFor(object, iteratee, keys);\n }\n\n /**\n * The base implementation of `_.forOwnRight` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\n function baseForOwnRight(object, iteratee) {\n return baseForRight(object, iteratee, keys);\n }\n\n /**\n * The base implementation of `_.functions` which creates an array of\n * `object` function property names filtered from those provided.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Array} props The property names to filter.\n * @returns {Array} Returns the new array of filtered property names.\n */\n function baseFunctions(object, props) {\n var index = -1,\n length = props.length,\n resIndex = -1,\n result = [];\n\n while (++index < length) {\n var key = props[index];\n if (isFunction(object[key])) {\n result[++resIndex] = key;\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `get` without support for string paths\n * and default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} path The path of the property to get.\n * @param {string} [pathKey] The key representation of path.\n * @returns {*} Returns the resolved value.\n */\n function baseGet(object, path, pathKey) {\n if (object == null) {\n return;\n }\n if (pathKey !== undefined && pathKey in toObject(object)) {\n path = [pathKey];\n }\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[path[index++]];\n }\n return (index && index == length) ? object : undefined;\n }\n\n /**\n * The base implementation of `_.isEqual` without support for `this` binding\n * `customizer` functions.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize comparing values.\n * @param {boolean} [isLoose] Specify performing partial comparisons.\n * @param {Array} [stackA] Tracks traversed `value` objects.\n * @param {Array} [stackB] Tracks traversed `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\n function baseIsEqual(value, other, customizer, isLoose, stackA, stackB) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB);\n }\n\n /**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} [customizer] The function to customize comparing objects.\n * @param {boolean} [isLoose] Specify performing partial comparisons.\n * @param {Array} [stackA=[]] Tracks traversed `value` objects.\n * @param {Array} [stackB=[]] Tracks traversed `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA, stackB) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = arrayTag,\n othTag = arrayTag;\n\n if (!objIsArr) {\n objTag = objToString.call(object);\n if (objTag == argsTag) {\n objTag = objectTag;\n } else if (objTag != objectTag) {\n objIsArr = isTypedArray(object);\n }\n }\n if (!othIsArr) {\n othTag = objToString.call(other);\n if (othTag == argsTag) {\n othTag = objectTag;\n } else if (othTag != objectTag) {\n othIsArr = isTypedArray(other);\n }\n }\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && !(objIsArr || objIsObj)) {\n return equalByTag(object, other, objTag);\n }\n if (!isLoose) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, isLoose, stackA, stackB);\n }\n }\n if (!isSameTag) {\n return false;\n }\n // Assume cyclic values are equal.\n // For more information on detecting circular references see https://es5.github.io/#JO.\n stackA || (stackA = []);\n stackB || (stackB = []);\n\n var length = stackA.length;\n while (length--) {\n if (stackA[length] == object) {\n return stackB[length] == other;\n }\n }\n // Add `object` and `other` to the stack of traversed objects.\n stackA.push(object);\n stackB.push(other);\n\n var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isLoose, stackA, stackB);\n\n stackA.pop();\n stackB.pop();\n\n return result;\n }\n\n /**\n * The base implementation of `_.isMatch` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Array} matchData The propery names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparing objects.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\n function baseIsMatch(object, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = toObject(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var result = customizer ? customizer(objValue, srcValue, key) : undefined;\n if (!(result === undefined ? baseIsEqual(srcValue, objValue, customizer, true) : result)) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * The base implementation of `_.map` without support for callback shorthands\n * and `this` binding.\n *\n * @private\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\n function baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n }\n\n /**\n * The base implementation of `_.matches` which does not clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new function.\n */\n function baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n var key = matchData[0][0],\n value = matchData[0][1];\n\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === value && (value !== undefined || (key in toObject(object)));\n };\n }\n return function(object) {\n return baseIsMatch(object, matchData);\n };\n }\n\n /**\n * The base implementation of `_.matchesProperty` which does not clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to compare.\n * @returns {Function} Returns the new function.\n */\n function baseMatchesProperty(path, srcValue) {\n var isArr = isArray(path),\n isCommon = isKey(path) && isStrictComparable(srcValue),\n pathKey = (path + '');\n\n path = toPath(path);\n return function(object) {\n if (object == null) {\n return false;\n }\n var key = pathKey;\n object = toObject(object);\n if ((isArr || !isCommon) && !(key in object)) {\n object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));\n if (object == null) {\n return false;\n }\n key = last(path);\n object = toObject(object);\n }\n return object[key] === srcValue\n ? (srcValue !== undefined || (key in object))\n : baseIsEqual(srcValue, object[key], undefined, true);\n };\n }\n\n /**\n * The base implementation of `_.merge` without support for argument juggling,\n * multiple sources, and `this` binding `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Array} [stackA=[]] Tracks traversed source objects.\n * @param {Array} [stackB=[]] Associates values with source counterparts.\n * @returns {Object} Returns `object`.\n */\n function baseMerge(object, source, customizer, stackA, stackB) {\n if (!isObject(object)) {\n return object;\n }\n var isSrcArr = isArrayLike(source) && (isArray(source) || isTypedArray(source)),\n props = isSrcArr ? undefined : keys(source);\n\n arrayEach(props || source, function(srcValue, key) {\n if (props) {\n key = srcValue;\n srcValue = source[key];\n }\n if (isObjectLike(srcValue)) {\n stackA || (stackA = []);\n stackB || (stackB = []);\n baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB);\n }\n else {\n var value = object[key],\n result = customizer ? customizer(value, srcValue, key, object, source) : undefined,\n isCommon = result === undefined;\n\n if (isCommon) {\n result = srcValue;\n }\n if ((result !== undefined || (isSrcArr && !(key in object))) &&\n (isCommon || (result === result ? (result !== value) : (value === value)))) {\n object[key] = result;\n }\n }\n });\n return object;\n }\n\n /**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Array} [stackA=[]] Tracks traversed source objects.\n * @param {Array} [stackB=[]] Associates values with source counterparts.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function baseMergeDeep(object, source, key, mergeFunc, customizer, stackA, stackB) {\n var length = stackA.length,\n srcValue = source[key];\n\n while (length--) {\n if (stackA[length] == srcValue) {\n object[key] = stackB[length];\n return;\n }\n }\n var value = object[key],\n result = customizer ? customizer(value, srcValue, key, object, source) : undefined,\n isCommon = result === undefined;\n\n if (isCommon) {\n result = srcValue;\n if (isArrayLike(srcValue) && (isArray(srcValue) || isTypedArray(srcValue))) {\n result = isArray(value)\n ? value\n : (isArrayLike(value) ? arrayCopy(value) : []);\n }\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n result = isArguments(value)\n ? toPlainObject(value)\n : (isPlainObject(value) ? value : {});\n }\n else {\n isCommon = false;\n }\n }\n // Add the source value to the stack of traversed objects and associate\n // it with its merged value.\n stackA.push(srcValue);\n stackB.push(result);\n\n if (isCommon) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n object[key] = mergeFunc(result, srcValue, customizer, stackA, stackB);\n } else if (result === result ? (result !== value) : (value === value)) {\n object[key] = result;\n }\n }\n\n /**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new function.\n */\n function baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n }\n\n /**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new function.\n */\n function basePropertyDeep(path) {\n var pathKey = (path + '');\n path = toPath(path);\n return function(object) {\n return baseGet(object, path, pathKey);\n };\n }\n\n /**\n * The base implementation of `_.pullAt` without support for individual\n * index arguments and capturing the removed elements.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {number[]} indexes The indexes of elements to remove.\n * @returns {Array} Returns `array`.\n */\n function basePullAt(array, indexes) {\n var length = array ? indexes.length : 0;\n while (length--) {\n var index = indexes[length];\n if (index != previous && isIndex(index)) {\n var previous = index;\n splice.call(array, index, 1);\n }\n }\n return array;\n }\n\n /**\n * The base implementation of `_.random` without support for argument juggling\n * and returning floating-point numbers.\n *\n * @private\n * @param {number} min The minimum possible value.\n * @param {number} max The maximum possible value.\n * @returns {number} Returns the random number.\n */\n function baseRandom(min, max) {\n return min + nativeFloor(nativeRandom() * (max - min + 1));\n }\n\n /**\n * The base implementation of `_.reduce` and `_.reduceRight` without support\n * for callback shorthands and `this` binding, which iterates over `collection`\n * using the provided `eachFunc`.\n *\n * @private\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} accumulator The initial value.\n * @param {boolean} initFromCollection Specify using the first or last element\n * of `collection` as the initial value.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the accumulated value.\n */\n function baseReduce(collection, iteratee, accumulator, initFromCollection, eachFunc) {\n eachFunc(collection, function(value, index, collection) {\n accumulator = initFromCollection\n ? (initFromCollection = false, value)\n : iteratee(accumulator, value, index, collection);\n });\n return accumulator;\n }\n\n /**\n * The base implementation of `setData` without support for hot loop detection.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\n var baseSetData = !metaMap ? identity : function(func, data) {\n metaMap.set(func, data);\n return func;\n };\n\n /**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\n function baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n start = start == null ? 0 : (+start || 0);\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = (end === undefined || end > length) ? length : (+end || 0);\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n }\n\n /**\n * The base implementation of `_.some` without support for callback shorthands\n * and `this` binding.\n *\n * @private\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\n function baseSome(collection, predicate) {\n var result;\n\n baseEach(collection, function(value, index, collection) {\n result = predicate(value, index, collection);\n return !result;\n });\n return !!result;\n }\n\n /**\n * The base implementation of `_.sortBy` which uses `comparer` to define\n * the sort order of `array` and replaces criteria objects with their\n * corresponding values.\n *\n * @private\n * @param {Array} array The array to sort.\n * @param {Function} comparer The function to define sort order.\n * @returns {Array} Returns `array`.\n */\n function baseSortBy(array, comparer) {\n var length = array.length;\n\n array.sort(comparer);\n while (length--) {\n array[length] = array[length].value;\n }\n return array;\n }\n\n /**\n * The base implementation of `_.sortByOrder` without param guards.\n *\n * @private\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {boolean[]} orders The sort orders of `iteratees`.\n * @returns {Array} Returns the new sorted array.\n */\n function baseSortByOrder(collection, iteratees, orders) {\n var callback = getCallback(),\n index = -1;\n\n iteratees = arrayMap(iteratees, function(iteratee) { return callback(iteratee); });\n\n var result = baseMap(collection, function(value) {\n var criteria = arrayMap(iteratees, function(iteratee) { return iteratee(value); });\n return { 'criteria': criteria, 'index': ++index, 'value': value };\n });\n\n return baseSortBy(result, function(object, other) {\n return compareMultiple(object, other, orders);\n });\n }\n\n /**\n * The base implementation of `_.sum` without support for callback shorthands\n * and `this` binding.\n *\n * @private\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {number} Returns the sum.\n */\n function baseSum(collection, iteratee) {\n var result = 0;\n baseEach(collection, function(value, index, collection) {\n result += +iteratee(value, index, collection) || 0;\n });\n return result;\n }\n\n /**\n * The base implementation of `_.uniq` without support for callback shorthands\n * and `this` binding.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The function invoked per iteration.\n * @returns {Array} Returns the new duplicate-value-free array.\n */\n function baseUniq(array, iteratee) {\n var index = -1,\n indexOf = getIndexOf(),\n length = array.length,\n isCommon = indexOf == baseIndexOf,\n isLarge = isCommon && length >= LARGE_ARRAY_SIZE,\n seen = isLarge ? createCache() : null,\n result = [];\n\n if (seen) {\n indexOf = cacheIndexOf;\n isCommon = false;\n } else {\n isLarge = false;\n seen = iteratee ? [] : result;\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value, index, array) : value;\n\n if (isCommon && value === value) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n }\n else if (indexOf(seen, computed, 0) < 0) {\n if (iteratee || isLarge) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.values` and `_.valuesIn` which creates an\n * array of `object` property values corresponding to the property names\n * of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the array of property values.\n */\n function baseValues(object, props) {\n var index = -1,\n length = props.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = object[props[index]];\n }\n return result;\n }\n\n /**\n * The base implementation of `_.dropRightWhile`, `_.dropWhile`, `_.takeRightWhile`,\n * and `_.takeWhile` without support for callback shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to query.\n * @param {Function} predicate The function invoked per iteration.\n * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the slice of `array`.\n */\n function baseWhile(array, predicate, isDrop, fromRight) {\n var length = array.length,\n index = fromRight ? length : -1;\n\n while ((fromRight ? index-- : ++index < length) && predicate(array[index], index, array)) {}\n return isDrop\n ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n }\n\n /**\n * The base implementation of `wrapperValue` which returns the result of\n * performing a sequence of actions on the unwrapped `value`, where each\n * successive action is supplied the return value of the previous.\n *\n * @private\n * @param {*} value The unwrapped value.\n * @param {Array} actions Actions to peform to resolve the unwrapped value.\n * @returns {*} Returns the resolved value.\n */\n function baseWrapperValue(value, actions) {\n var result = value;\n if (result instanceof LazyWrapper) {\n result = result.value();\n }\n var index = -1,\n length = actions.length;\n\n while (++index < length) {\n var action = actions[index];\n result = action.func.apply(action.thisArg, arrayPush([result], action.args));\n }\n return result;\n }\n\n /**\n * Performs a binary search of `array` to determine the index at which `value`\n * should be inserted into `array` in order to maintain its sort order.\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n */\n function binaryIndex(array, value, retHighest) {\n var low = 0,\n high = array ? array.length : low;\n\n if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n while (low < high) {\n var mid = (low + high) >>> 1,\n computed = array[mid];\n\n if ((retHighest ? (computed <= value) : (computed < value)) && computed !== null) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return high;\n }\n return binaryIndexBy(array, value, identity, retHighest);\n }\n\n /**\n * This function is like `binaryIndex` except that it invokes `iteratee` for\n * `value` and each element of `array` to compute their sort ranking. The\n * iteratee is invoked with one argument; (value).\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n */\n function binaryIndexBy(array, value, iteratee, retHighest) {\n value = iteratee(value);\n\n var low = 0,\n high = array ? array.length : 0,\n valIsNaN = value !== value,\n valIsNull = value === null,\n valIsUndef = value === undefined;\n\n while (low < high) {\n var mid = nativeFloor((low + high) / 2),\n computed = iteratee(array[mid]),\n isDef = computed !== undefined,\n isReflexive = computed === computed;\n\n if (valIsNaN) {\n var setLow = isReflexive || retHighest;\n } else if (valIsNull) {\n setLow = isReflexive && isDef && (retHighest || computed != null);\n } else if (valIsUndef) {\n setLow = isReflexive && (retHighest || isDef);\n } else if (computed == null) {\n setLow = false;\n } else {\n setLow = retHighest ? (computed <= value) : (computed < value);\n }\n if (setLow) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return nativeMin(high, MAX_ARRAY_INDEX);\n }\n\n /**\n * A specialized version of `baseCallback` which only supports `this` binding\n * and specifying the number of arguments to provide to `func`.\n *\n * @private\n * @param {Function} func The function to bind.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {number} [argCount] The number of arguments to provide to `func`.\n * @returns {Function} Returns the callback.\n */\n function bindCallback(func, thisArg, argCount) {\n if (typeof func != 'function') {\n return identity;\n }\n if (thisArg === undefined) {\n return func;\n }\n switch (argCount) {\n case 1: return function(value) {\n return func.call(thisArg, value);\n };\n case 3: return function(value, index, collection) {\n return func.call(thisArg, value, index, collection);\n };\n case 4: return function(accumulator, value, index, collection) {\n return func.call(thisArg, accumulator, value, index, collection);\n };\n case 5: return function(value, other, key, object, source) {\n return func.call(thisArg, value, other, key, object, source);\n };\n }\n return function() {\n return func.apply(thisArg, arguments);\n };\n }\n\n /**\n * Creates a clone of the given array buffer.\n *\n * @private\n * @param {ArrayBuffer} buffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\n function bufferClone(buffer) {\n var result = new ArrayBuffer(buffer.byteLength),\n view = new Uint8Array(result);\n\n view.set(new Uint8Array(buffer));\n return result;\n }\n\n /**\n * Creates an array that is the composition of partially applied arguments,\n * placeholders, and provided arguments into a single array of arguments.\n *\n * @private\n * @param {Array|Object} args The provided arguments.\n * @param {Array} partials The arguments to prepend to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @returns {Array} Returns the new array of composed arguments.\n */\n function composeArgs(args, partials, holders) {\n var holdersLength = holders.length,\n argsIndex = -1,\n argsLength = nativeMax(args.length - holdersLength, 0),\n leftIndex = -1,\n leftLength = partials.length,\n result = Array(leftLength + argsLength);\n\n while (++leftIndex < leftLength) {\n result[leftIndex] = partials[leftIndex];\n }\n while (++argsIndex < holdersLength) {\n result[holders[argsIndex]] = args[argsIndex];\n }\n while (argsLength--) {\n result[leftIndex++] = args[argsIndex++];\n }\n return result;\n }\n\n /**\n * This function is like `composeArgs` except that the arguments composition\n * is tailored for `_.partialRight`.\n *\n * @private\n * @param {Array|Object} args The provided arguments.\n * @param {Array} partials The arguments to append to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @returns {Array} Returns the new array of composed arguments.\n */\n function composeArgsRight(args, partials, holders) {\n var holdersIndex = -1,\n holdersLength = holders.length,\n argsIndex = -1,\n argsLength = nativeMax(args.length - holdersLength, 0),\n rightIndex = -1,\n rightLength = partials.length,\n result = Array(argsLength + rightLength);\n\n while (++argsIndex < argsLength) {\n result[argsIndex] = args[argsIndex];\n }\n var offset = argsIndex;\n while (++rightIndex < rightLength) {\n result[offset + rightIndex] = partials[rightIndex];\n }\n while (++holdersIndex < holdersLength) {\n result[offset + holders[holdersIndex]] = args[argsIndex++];\n }\n return result;\n }\n\n /**\n * Creates a `_.countBy`, `_.groupBy`, `_.indexBy`, or `_.partition` function.\n *\n * @private\n * @param {Function} setter The function to set keys and values of the accumulator object.\n * @param {Function} [initializer] The function to initialize the accumulator object.\n * @returns {Function} Returns the new aggregator function.\n */\n function createAggregator(setter, initializer) {\n return function(collection, iteratee, thisArg) {\n var result = initializer ? initializer() : {};\n iteratee = getCallback(iteratee, thisArg, 3);\n\n if (isArray(collection)) {\n var index = -1,\n length = collection.length;\n\n while (++index < length) {\n var value = collection[index];\n setter(result, value, iteratee(value, index, collection), collection);\n }\n } else {\n baseEach(collection, function(value, key, collection) {\n setter(result, value, iteratee(value, key, collection), collection);\n });\n }\n return result;\n };\n }\n\n /**\n * Creates a `_.assign`, `_.defaults`, or `_.merge` function.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\n function createAssigner(assigner) {\n return restParam(function(object, sources) {\n var index = -1,\n length = object == null ? 0 : sources.length,\n customizer = length > 2 ? sources[length - 2] : undefined,\n guard = length > 2 ? sources[2] : undefined,\n thisArg = length > 1 ? sources[length - 1] : undefined;\n\n if (typeof customizer == 'function') {\n customizer = bindCallback(customizer, thisArg, 5);\n length -= 2;\n } else {\n customizer = typeof thisArg == 'function' ? thisArg : undefined;\n length -= (customizer ? 1 : 0);\n }\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, customizer);\n }\n }\n return object;\n });\n }\n\n /**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\n function createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n var length = collection ? getLength(collection) : 0;\n if (!isLength(length)) {\n return eachFunc(collection, iteratee);\n }\n var index = fromRight ? length : -1,\n iterable = toObject(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n }\n\n /**\n * Creates a base function for `_.forIn` or `_.forInRight`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\n function createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var iterable = toObject(object),\n props = keysFunc(object),\n length = props.length,\n index = fromRight ? length : -1;\n\n while ((fromRight ? index-- : ++index < length)) {\n var key = props[index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n }\n\n /**\n * Creates a function that wraps `func` and invokes it with the `this`\n * binding of `thisArg`.\n *\n * @private\n * @param {Function} func The function to bind.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @returns {Function} Returns the new bound function.\n */\n function createBindWrapper(func, thisArg) {\n var Ctor = createCtorWrapper(func);\n\n function wrapper() {\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n return fn.apply(thisArg, arguments);\n }\n return wrapper;\n }\n\n /**\n * Creates a `Set` cache object to optimize linear searches of large arrays.\n *\n * @private\n * @param {Array} [values] The values to cache.\n * @returns {null|Object} Returns the new cache object if `Set` is supported, else `null`.\n */\n function createCache(values) {\n return (nativeCreate && Set) ? new SetCache(values) : null;\n }\n\n /**\n * Creates a function that produces compound words out of the words in a\n * given string.\n *\n * @private\n * @param {Function} callback The function to combine each word.\n * @returns {Function} Returns the new compounder function.\n */\n function createCompounder(callback) {\n return function(string) {\n var index = -1,\n array = words(deburr(string)),\n length = array.length,\n result = '';\n\n while (++index < length) {\n result = callback(result, array[index], index);\n }\n return result;\n };\n }\n\n /**\n * Creates a function that produces an instance of `Ctor` regardless of\n * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n *\n * @private\n * @param {Function} Ctor The constructor to wrap.\n * @returns {Function} Returns the new wrapped function.\n */\n function createCtorWrapper(Ctor) {\n return function() {\n // Use a `switch` statement to work with class constructors.\n // See http://ecma-international.org/ecma-262/6.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n // for more details.\n var args = arguments;\n switch (args.length) {\n case 0: return new Ctor;\n case 1: return new Ctor(args[0]);\n case 2: return new Ctor(args[0], args[1]);\n case 3: return new Ctor(args[0], args[1], args[2]);\n case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n }\n var thisBinding = baseCreate(Ctor.prototype),\n result = Ctor.apply(thisBinding, args);\n\n // Mimic the constructor's `return` behavior.\n // See https://es5.github.io/#x13.2.2 for more details.\n return isObject(result) ? result : thisBinding;\n };\n }\n\n /**\n * Creates a `_.curry` or `_.curryRight` function.\n *\n * @private\n * @param {boolean} flag The curry bit flag.\n * @returns {Function} Returns the new curry function.\n */\n function createCurry(flag) {\n function curryFunc(func, arity, guard) {\n if (guard && isIterateeCall(func, arity, guard)) {\n arity = undefined;\n }\n var result = createWrapper(func, flag, undefined, undefined, undefined, undefined, undefined, arity);\n result.placeholder = curryFunc.placeholder;\n return result;\n }\n return curryFunc;\n }\n\n /**\n * Creates a `_.defaults` or `_.defaultsDeep` function.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @param {Function} customizer The function to customize assigned values.\n * @returns {Function} Returns the new defaults function.\n */\n function createDefaults(assigner, customizer) {\n return restParam(function(args) {\n var object = args[0];\n if (object == null) {\n return object;\n }\n args.push(customizer);\n return assigner.apply(undefined, args);\n });\n }\n\n /**\n * Creates a `_.max` or `_.min` function.\n *\n * @private\n * @param {Function} comparator The function used to compare values.\n * @param {*} exValue The initial extremum value.\n * @returns {Function} Returns the new extremum function.\n */\n function createExtremum(comparator, exValue) {\n return function(collection, iteratee, thisArg) {\n if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {\n iteratee = undefined;\n }\n iteratee = getCallback(iteratee, thisArg, 3);\n if (iteratee.length == 1) {\n collection = isArray(collection) ? collection : toIterable(collection);\n var result = arrayExtremum(collection, iteratee, comparator, exValue);\n if (!(collection.length && result === exValue)) {\n return result;\n }\n }\n return baseExtremum(collection, iteratee, comparator, exValue);\n };\n }\n\n /**\n * Creates a `_.find` or `_.findLast` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new find function.\n */\n function createFind(eachFunc, fromRight) {\n return function(collection, predicate, thisArg) {\n predicate = getCallback(predicate, thisArg, 3);\n if (isArray(collection)) {\n var index = baseFindIndex(collection, predicate, fromRight);\n return index > -1 ? collection[index] : undefined;\n }\n return baseFind(collection, predicate, eachFunc);\n };\n }\n\n /**\n * Creates a `_.findIndex` or `_.findLastIndex` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new find function.\n */\n function createFindIndex(fromRight) {\n return function(array, predicate, thisArg) {\n if (!(array && array.length)) {\n return -1;\n }\n predicate = getCallback(predicate, thisArg, 3);\n return baseFindIndex(array, predicate, fromRight);\n };\n }\n\n /**\n * Creates a `_.findKey` or `_.findLastKey` function.\n *\n * @private\n * @param {Function} objectFunc The function to iterate over an object.\n * @returns {Function} Returns the new find function.\n */\n function createFindKey(objectFunc) {\n return function(object, predicate, thisArg) {\n predicate = getCallback(predicate, thisArg, 3);\n return baseFind(object, predicate, objectFunc, true);\n };\n }\n\n /**\n * Creates a `_.flow` or `_.flowRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new flow function.\n */\n function createFlow(fromRight) {\n return function() {\n var wrapper,\n length = arguments.length,\n index = fromRight ? length : -1,\n leftIndex = 0,\n funcs = Array(length);\n\n while ((fromRight ? index-- : ++index < length)) {\n var func = funcs[leftIndex++] = arguments[index];\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (!wrapper && LodashWrapper.prototype.thru && getFuncName(func) == 'wrapper') {\n wrapper = new LodashWrapper([], true);\n }\n }\n index = wrapper ? -1 : length;\n while (++index < length) {\n func = funcs[index];\n\n var funcName = getFuncName(func),\n data = funcName == 'wrapper' ? getData(func) : undefined;\n\n if (data && isLaziable(data[0]) && data[1] == (ARY_FLAG | CURRY_FLAG | PARTIAL_FLAG | REARG_FLAG) && !data[4].length && data[9] == 1) {\n wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n } else {\n wrapper = (func.length == 1 && isLaziable(func)) ? wrapper[funcName]() : wrapper.thru(func);\n }\n }\n return function() {\n var args = arguments,\n value = args[0];\n\n if (wrapper && args.length == 1 && isArray(value) && value.length >= LARGE_ARRAY_SIZE) {\n return wrapper.plant(value).value();\n }\n var index = 0,\n result = length ? funcs[index].apply(this, args) : value;\n\n while (++index < length) {\n result = funcs[index].call(this, result);\n }\n return result;\n };\n };\n }\n\n /**\n * Creates a function for `_.forEach` or `_.forEachRight`.\n *\n * @private\n * @param {Function} arrayFunc The function to iterate over an array.\n * @param {Function} eachFunc The function to iterate over a collection.\n * @returns {Function} Returns the new each function.\n */\n function createForEach(arrayFunc, eachFunc) {\n return function(collection, iteratee, thisArg) {\n return (typeof iteratee == 'function' && thisArg === undefined && isArray(collection))\n ? arrayFunc(collection, iteratee)\n : eachFunc(collection, bindCallback(iteratee, thisArg, 3));\n };\n }\n\n /**\n * Creates a function for `_.forIn` or `_.forInRight`.\n *\n * @private\n * @param {Function} objectFunc The function to iterate over an object.\n * @returns {Function} Returns the new each function.\n */\n function createForIn(objectFunc) {\n return function(object, iteratee, thisArg) {\n if (typeof iteratee != 'function' || thisArg !== undefined) {\n iteratee = bindCallback(iteratee, thisArg, 3);\n }\n return objectFunc(object, iteratee, keysIn);\n };\n }\n\n /**\n * Creates a function for `_.forOwn` or `_.forOwnRight`.\n *\n * @private\n * @param {Function} objectFunc The function to iterate over an object.\n * @returns {Function} Returns the new each function.\n */\n function createForOwn(objectFunc) {\n return function(object, iteratee, thisArg) {\n if (typeof iteratee != 'function' || thisArg !== undefined) {\n iteratee = bindCallback(iteratee, thisArg, 3);\n }\n return objectFunc(object, iteratee);\n };\n }\n\n /**\n * Creates a function for `_.mapKeys` or `_.mapValues`.\n *\n * @private\n * @param {boolean} [isMapKeys] Specify mapping keys instead of values.\n * @returns {Function} Returns the new map function.\n */\n function createObjectMapper(isMapKeys) {\n return function(object, iteratee, thisArg) {\n var result = {};\n iteratee = getCallback(iteratee, thisArg, 3);\n\n baseForOwn(object, function(value, key, object) {\n var mapped = iteratee(value, key, object);\n key = isMapKeys ? mapped : key;\n value = isMapKeys ? value : mapped;\n result[key] = value;\n });\n return result;\n };\n }\n\n /**\n * Creates a function for `_.padLeft` or `_.padRight`.\n *\n * @private\n * @param {boolean} [fromRight] Specify padding from the right.\n * @returns {Function} Returns the new pad function.\n */\n function createPadDir(fromRight) {\n return function(string, length, chars) {\n string = baseToString(string);\n return (fromRight ? string : '') + createPadding(string, length, chars) + (fromRight ? '' : string);\n };\n }\n\n /**\n * Creates a `_.partial` or `_.partialRight` function.\n *\n * @private\n * @param {boolean} flag The partial bit flag.\n * @returns {Function} Returns the new partial function.\n */\n function createPartial(flag) {\n var partialFunc = restParam(function(func, partials) {\n var holders = replaceHolders(partials, partialFunc.placeholder);\n return createWrapper(func, flag, undefined, partials, holders);\n });\n return partialFunc;\n }\n\n /**\n * Creates a function for `_.reduce` or `_.reduceRight`.\n *\n * @private\n * @param {Function} arrayFunc The function to iterate over an array.\n * @param {Function} eachFunc The function to iterate over a collection.\n * @returns {Function} Returns the new each function.\n */\n function createReduce(arrayFunc, eachFunc) {\n return function(collection, iteratee, accumulator, thisArg) {\n var initFromArray = arguments.length < 3;\n return (typeof iteratee == 'function' && thisArg === undefined && isArray(collection))\n ? arrayFunc(collection, iteratee, accumulator, initFromArray)\n : baseReduce(collection, getCallback(iteratee, thisArg, 4), accumulator, initFromArray, eachFunc);\n };\n }\n\n /**\n * Creates a function that wraps `func` and invokes it with optional `this`\n * binding of, partial application, and currying.\n *\n * @private\n * @param {Function|string} func The function or method name to reference.\n * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [partialsRight] The arguments to append to those provided to the new function.\n * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createHybridWrapper(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n var isAry = bitmask & ARY_FLAG,\n isBind = bitmask & BIND_FLAG,\n isBindKey = bitmask & BIND_KEY_FLAG,\n isCurry = bitmask & CURRY_FLAG,\n isCurryBound = bitmask & CURRY_BOUND_FLAG,\n isCurryRight = bitmask & CURRY_RIGHT_FLAG,\n Ctor = isBindKey ? undefined : createCtorWrapper(func);\n\n function wrapper() {\n // Avoid `arguments` object use disqualifying optimizations by\n // converting it to an array before providing it to other functions.\n var length = arguments.length,\n index = length,\n args = Array(length);\n\n while (index--) {\n args[index] = arguments[index];\n }\n if (partials) {\n args = composeArgs(args, partials, holders);\n }\n if (partialsRight) {\n args = composeArgsRight(args, partialsRight, holdersRight);\n }\n if (isCurry || isCurryRight) {\n var placeholder = wrapper.placeholder,\n argsHolders = replaceHolders(args, placeholder);\n\n length -= argsHolders.length;\n if (length < arity) {\n var newArgPos = argPos ? arrayCopy(argPos) : undefined,\n newArity = nativeMax(arity - length, 0),\n newsHolders = isCurry ? argsHolders : undefined,\n newHoldersRight = isCurry ? undefined : argsHolders,\n newPartials = isCurry ? args : undefined,\n newPartialsRight = isCurry ? undefined : args;\n\n bitmask |= (isCurry ? PARTIAL_FLAG : PARTIAL_RIGHT_FLAG);\n bitmask &= ~(isCurry ? PARTIAL_RIGHT_FLAG : PARTIAL_FLAG);\n\n if (!isCurryBound) {\n bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG);\n }\n var newData = [func, bitmask, thisArg, newPartials, newsHolders, newPartialsRight, newHoldersRight, newArgPos, ary, newArity],\n result = createHybridWrapper.apply(undefined, newData);\n\n if (isLaziable(func)) {\n setData(result, newData);\n }\n result.placeholder = placeholder;\n return result;\n }\n }\n var thisBinding = isBind ? thisArg : this,\n fn = isBindKey ? thisBinding[func] : func;\n\n if (argPos) {\n args = reorder(args, argPos);\n }\n if (isAry && ary < args.length) {\n args.length = ary;\n }\n if (this && this !== root && this instanceof wrapper) {\n fn = Ctor || createCtorWrapper(func);\n }\n return fn.apply(thisBinding, args);\n }\n return wrapper;\n }\n\n /**\n * Creates the padding required for `string` based on the given `length`.\n * The `chars` string is truncated if the number of characters exceeds `length`.\n *\n * @private\n * @param {string} string The string to create padding for.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the pad for `string`.\n */\n function createPadding(string, length, chars) {\n var strLength = string.length;\n length = +length;\n\n if (strLength >= length || !nativeIsFinite(length)) {\n return '';\n }\n var padLength = length - strLength;\n chars = chars == null ? ' ' : (chars + '');\n return repeat(chars, nativeCeil(padLength / chars.length)).slice(0, padLength);\n }\n\n /**\n * Creates a function that wraps `func` and invokes it with the optional `this`\n * binding of `thisArg` and the `partials` prepended to those provided to\n * the wrapper.\n *\n * @private\n * @param {Function} func The function to partially apply arguments to.\n * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} partials The arguments to prepend to those provided to the new function.\n * @returns {Function} Returns the new bound function.\n */\n function createPartialWrapper(func, bitmask, thisArg, partials) {\n var isBind = bitmask & BIND_FLAG,\n Ctor = createCtorWrapper(func);\n\n function wrapper() {\n // Avoid `arguments` object use disqualifying optimizations by\n // converting it to an array before providing it `func`.\n var argsIndex = -1,\n argsLength = arguments.length,\n leftIndex = -1,\n leftLength = partials.length,\n args = Array(leftLength + argsLength);\n\n while (++leftIndex < leftLength) {\n args[leftIndex] = partials[leftIndex];\n }\n while (argsLength--) {\n args[leftIndex++] = arguments[++argsIndex];\n }\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n return fn.apply(isBind ? thisArg : this, args);\n }\n return wrapper;\n }\n\n /**\n * Creates a `_.ceil`, `_.floor`, or `_.round` function.\n *\n * @private\n * @param {string} methodName The name of the `Math` method to use when rounding.\n * @returns {Function} Returns the new round function.\n */\n function createRound(methodName) {\n var func = Math[methodName];\n return function(number, precision) {\n precision = precision === undefined ? 0 : (+precision || 0);\n if (precision) {\n precision = pow(10, precision);\n return func(number * precision) / precision;\n }\n return func(number);\n };\n }\n\n /**\n * Creates a `_.sortedIndex` or `_.sortedLastIndex` function.\n *\n * @private\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {Function} Returns the new index function.\n */\n function createSortedIndex(retHighest) {\n return function(array, value, iteratee, thisArg) {\n var callback = getCallback(iteratee);\n return (iteratee == null && callback === baseCallback)\n ? binaryIndex(array, value, retHighest)\n : binaryIndexBy(array, value, callback(iteratee, thisArg, 1), retHighest);\n };\n }\n\n /**\n * Creates a function that either curries or invokes `func` with optional\n * `this` binding and partially applied arguments.\n *\n * @private\n * @param {Function|string} func The function or method name to reference.\n * @param {number} bitmask The bitmask of flags.\n * The bitmask may be composed of the following flags:\n * 1 - `_.bind`\n * 2 - `_.bindKey`\n * 4 - `_.curry` or `_.curryRight` of a bound function\n * 8 - `_.curry`\n * 16 - `_.curryRight`\n * 32 - `_.partial`\n * 64 - `_.partialRight`\n * 128 - `_.rearg`\n * 256 - `_.ary`\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to be partially applied.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createWrapper(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n var isBindKey = bitmask & BIND_KEY_FLAG;\n if (!isBindKey && typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var length = partials ? partials.length : 0;\n if (!length) {\n bitmask &= ~(PARTIAL_FLAG | PARTIAL_RIGHT_FLAG);\n partials = holders = undefined;\n }\n length -= (holders ? holders.length : 0);\n if (bitmask & PARTIAL_RIGHT_FLAG) {\n var partialsRight = partials,\n holdersRight = holders;\n\n partials = holders = undefined;\n }\n var data = isBindKey ? undefined : getData(func),\n newData = [func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity];\n\n if (data) {\n mergeData(newData, data);\n bitmask = newData[1];\n arity = newData[9];\n }\n newData[9] = arity == null\n ? (isBindKey ? 0 : func.length)\n : (nativeMax(arity - length, 0) || 0);\n\n if (bitmask == BIND_FLAG) {\n var result = createBindWrapper(newData[0], newData[2]);\n } else if ((bitmask == PARTIAL_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) && !newData[4].length) {\n result = createPartialWrapper.apply(undefined, newData);\n } else {\n result = createHybridWrapper.apply(undefined, newData);\n }\n var setter = data ? baseSetData : setData;\n return setter(result, newData);\n }\n\n /**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} [customizer] The function to customize comparing arrays.\n * @param {boolean} [isLoose] Specify performing partial comparisons.\n * @param {Array} [stackA] Tracks traversed `value` objects.\n * @param {Array} [stackB] Tracks traversed `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\n function equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) {\n var index = -1,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isLoose && othLength > arrLength)) {\n return false;\n }\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index],\n result = customizer ? customizer(isLoose ? othValue : arrValue, isLoose ? arrValue : othValue, index) : undefined;\n\n if (result !== undefined) {\n if (result) {\n continue;\n }\n return false;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (isLoose) {\n if (!arraySome(other, function(othValue) {\n return arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);\n })) {\n return false;\n }\n } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB))) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function equalByTag(object, other, tag) {\n switch (tag) {\n case boolTag:\n case dateTag:\n // Coerce dates and booleans to numbers, dates to milliseconds and booleans\n // to `1` or `0` treating invalid dates coerced to `NaN` as not equal.\n return +object == +other;\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case numberTag:\n // Treat `NaN` vs. `NaN` as equal.\n return (object != +object)\n ? other != +other\n : object == +other;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings primitives and string\n // objects as equal. See https://es5.github.io/#x15.10.6.4 for more details.\n return object == (other + '');\n }\n return false;\n }\n\n /**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} [customizer] The function to customize comparing values.\n * @param {boolean} [isLoose] Specify performing partial comparisons.\n * @param {Array} [stackA] Tracks traversed `value` objects.\n * @param {Array} [stackB] Tracks traversed `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function equalObjects(object, other, equalFunc, customizer, isLoose, stackA, stackB) {\n var objProps = keys(object),\n objLength = objProps.length,\n othProps = keys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isLoose) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n var skipCtor = isLoose;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key],\n result = customizer ? customizer(isLoose ? othValue : objValue, isLoose? objValue : othValue, key) : undefined;\n\n // Recursively compare objects (susceptible to call stack limits).\n if (!(result === undefined ? equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB) : result)) {\n return false;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (!skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Gets the appropriate \"callback\" function. If the `_.callback` method is\n * customized this function returns the custom method, otherwise it returns\n * the `baseCallback` function. If arguments are provided the chosen function\n * is invoked with them and its result is returned.\n *\n * @private\n * @returns {Function} Returns the chosen function or its result.\n */\n function getCallback(func, thisArg, argCount) {\n var result = lodash.callback || callback;\n result = result === callback ? baseCallback : result;\n return argCount ? result(func, thisArg, argCount) : result;\n }\n\n /**\n * Gets metadata for `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {*} Returns the metadata for `func`.\n */\n var getData = !metaMap ? noop : function(func) {\n return metaMap.get(func);\n };\n\n /**\n * Gets the name of `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {string} Returns the function name.\n */\n function getFuncName(func) {\n var result = func.name,\n array = realNames[result],\n length = array ? array.length : 0;\n\n while (length--) {\n var data = array[length],\n otherFunc = data.func;\n if (otherFunc == null || otherFunc == func) {\n return data.name;\n }\n }\n return result;\n }\n\n /**\n * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\n * customized this function returns the custom method, otherwise it returns\n * the `baseIndexOf` function. If arguments are provided the chosen function\n * is invoked with them and its result is returned.\n *\n * @private\n * @returns {Function|number} Returns the chosen function or its result.\n */\n function getIndexOf(collection, target, fromIndex) {\n var result = lodash.indexOf || indexOf;\n result = result === indexOf ? baseIndexOf : result;\n return collection ? result(collection, target, fromIndex) : result;\n }\n\n /**\n * Gets the \"length\" property value of `object`.\n *\n * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n * that affects Safari on at least iOS 8.1-8.3 ARM64.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {*} Returns the \"length\" value.\n */\n var getLength = baseProperty('length');\n\n /**\n * Gets the propery names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\n function getMatchData(object) {\n var result = pairs(object),\n length = result.length;\n\n while (length--) {\n result[length][2] = isStrictComparable(result[length][1]);\n }\n return result;\n }\n\n /**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\n function getNative(object, key) {\n var value = object == null ? undefined : object[key];\n return isNative(value) ? value : undefined;\n }\n\n /**\n * Gets the view, applying any `transforms` to the `start` and `end` positions.\n *\n * @private\n * @param {number} start The start of the view.\n * @param {number} end The end of the view.\n * @param {Array} transforms The transformations to apply to the view.\n * @returns {Object} Returns an object containing the `start` and `end`\n * positions of the view.\n */\n function getView(start, end, transforms) {\n var index = -1,\n length = transforms.length;\n\n while (++index < length) {\n var data = transforms[index],\n size = data.size;\n\n switch (data.type) {\n case 'drop': start += size; break;\n case 'dropRight': end -= size; break;\n case 'take': end = nativeMin(end, start + size); break;\n case 'takeRight': start = nativeMax(start, end - size); break;\n }\n }\n return { 'start': start, 'end': end };\n }\n\n /**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\n function initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add array properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n }\n\n /**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\n function initCloneObject(object) {\n var Ctor = object.constructor;\n if (!(typeof Ctor == 'function' && Ctor instanceof Ctor)) {\n Ctor = Object;\n }\n return new Ctor;\n }\n\n /**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\n function initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return bufferClone(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n var buffer = object.buffer;\n return new Ctor(isDeep ? bufferClone(buffer) : buffer, object.byteOffset, object.length);\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n var result = new Ctor(object.source, reFlags.exec(object));\n result.lastIndex = object.lastIndex;\n }\n return result;\n }\n\n /**\n * Invokes the method at `path` on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the method to invoke.\n * @param {Array} args The arguments to invoke the method with.\n * @returns {*} Returns the result of the invoked method.\n */\n function invokePath(object, path, args) {\n if (object != null && !isKey(path, object)) {\n path = toPath(path);\n object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));\n path = last(path);\n }\n var func = object == null ? object : object[path];\n return func == null ? undefined : func.apply(object, args);\n }\n\n /**\n * Checks if `value` is array-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n */\n function isArrayLike(value) {\n return value != null && isLength(getLength(value));\n }\n\n /**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\n function isIndex(value, length) {\n value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;\n length = length == null ? MAX_SAFE_INTEGER : length;\n return value > -1 && value % 1 == 0 && value < length;\n }\n\n /**\n * Checks if the provided arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.\n */\n function isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)) {\n var other = object[index];\n return value === value ? (value === other) : (other !== other);\n }\n return false;\n }\n\n /**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\n function isKey(value, object) {\n var type = typeof value;\n if ((type == 'string' && reIsPlainProp.test(value)) || type == 'number') {\n return true;\n }\n if (isArray(value)) {\n return false;\n }\n var result = !reIsDeepProp.test(value);\n return result || (object != null && value in toObject(object));\n }\n\n /**\n * Checks if `func` has a lazy counterpart.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` has a lazy counterpart, else `false`.\n */\n function isLaziable(func) {\n var funcName = getFuncName(func);\n if (!(funcName in LazyWrapper.prototype)) {\n return false;\n }\n var other = lodash[funcName];\n if (func === other) {\n return true;\n }\n var data = getData(other);\n return !!data && func === data[0];\n }\n\n /**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n */\n function isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n }\n\n /**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\n function isStrictComparable(value) {\n return value === value && !isObject(value);\n }\n\n /**\n * Merges the function metadata of `source` into `data`.\n *\n * Merging metadata reduces the number of wrappers required to invoke a function.\n * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n * may be applied regardless of execution order. Methods like `_.ary` and `_.rearg`\n * augment function arguments, making the order in which they are executed important,\n * preventing the merging of metadata. However, we make an exception for a safe\n * common case where curried functions have `_.ary` and or `_.rearg` applied.\n *\n * @private\n * @param {Array} data The destination metadata.\n * @param {Array} source The source metadata.\n * @returns {Array} Returns `data`.\n */\n function mergeData(data, source) {\n var bitmask = data[1],\n srcBitmask = source[1],\n newBitmask = bitmask | srcBitmask,\n isCommon = newBitmask < ARY_FLAG;\n\n var isCombo =\n (srcBitmask == ARY_FLAG && bitmask == CURRY_FLAG) ||\n (srcBitmask == ARY_FLAG && bitmask == REARG_FLAG && data[7].length <= source[8]) ||\n (srcBitmask == (ARY_FLAG | REARG_FLAG) && bitmask == CURRY_FLAG);\n\n // Exit early if metadata can't be merged.\n if (!(isCommon || isCombo)) {\n return data;\n }\n // Use source `thisArg` if available.\n if (srcBitmask & BIND_FLAG) {\n data[2] = source[2];\n // Set when currying a bound function.\n newBitmask |= (bitmask & BIND_FLAG) ? 0 : CURRY_BOUND_FLAG;\n }\n // Compose partial arguments.\n var value = source[3];\n if (value) {\n var partials = data[3];\n data[3] = partials ? composeArgs(partials, value, source[4]) : arrayCopy(value);\n data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : arrayCopy(source[4]);\n }\n // Compose partial right arguments.\n value = source[5];\n if (value) {\n partials = data[5];\n data[5] = partials ? composeArgsRight(partials, value, source[6]) : arrayCopy(value);\n data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : arrayCopy(source[6]);\n }\n // Use source `argPos` if available.\n value = source[7];\n if (value) {\n data[7] = arrayCopy(value);\n }\n // Use source `ary` if it's smaller.\n if (srcBitmask & ARY_FLAG) {\n data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n }\n // Use source `arity` if one is not provided.\n if (data[9] == null) {\n data[9] = source[9];\n }\n // Use source `func` and merge bitmasks.\n data[0] = source[0];\n data[1] = newBitmask;\n\n return data;\n }\n\n /**\n * Used by `_.defaultsDeep` to customize its `_.merge` use.\n *\n * @private\n * @param {*} objectValue The destination object property value.\n * @param {*} sourceValue The source object property value.\n * @returns {*} Returns the value to assign to the destination object.\n */\n function mergeDefaults(objectValue, sourceValue) {\n return objectValue === undefined ? sourceValue : merge(objectValue, sourceValue, mergeDefaults);\n }\n\n /**\n * A specialized version of `_.pick` which picks `object` properties specified\n * by `props`.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} props The property names to pick.\n * @returns {Object} Returns the new object.\n */\n function pickByArray(object, props) {\n object = toObject(object);\n\n var index = -1,\n length = props.length,\n result = {};\n\n while (++index < length) {\n var key = props[index];\n if (key in object) {\n result[key] = object[key];\n }\n }\n return result;\n }\n\n /**\n * A specialized version of `_.pick` which picks `object` properties `predicate`\n * returns truthy for.\n *\n * @private\n * @param {Object} object The source object.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Object} Returns the new object.\n */\n function pickByCallback(object, predicate) {\n var result = {};\n baseForIn(object, function(value, key, object) {\n if (predicate(value, key, object)) {\n result[key] = value;\n }\n });\n return result;\n }\n\n /**\n * Reorder `array` according to the specified indexes where the element at\n * the first index is assigned as the first element, the element at\n * the second index is assigned as the second element, and so on.\n *\n * @private\n * @param {Array} array The array to reorder.\n * @param {Array} indexes The arranged array indexes.\n * @returns {Array} Returns `array`.\n */\n function reorder(array, indexes) {\n var arrLength = array.length,\n length = nativeMin(indexes.length, arrLength),\n oldArray = arrayCopy(array);\n\n while (length--) {\n var index = indexes[length];\n array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n }\n return array;\n }\n\n /**\n * Sets metadata for `func`.\n *\n * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n * period of time, it will trip its breaker and transition to an identity function\n * to avoid garbage collection pauses in V8. See [V8 issue 2070](https://code.google.com/p/v8/issues/detail?id=2070)\n * for more details.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\n var setData = (function() {\n var count = 0,\n lastCalled = 0;\n\n return function(key, value) {\n var stamp = now(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return key;\n }\n } else {\n count = 0;\n }\n return baseSetData(key, value);\n };\n }());\n\n /**\n * A fallback implementation of `Object.keys` which creates an array of the\n * own enumerable property names of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\n function shimKeys(object) {\n var props = keysIn(object),\n propsLength = props.length,\n length = propsLength && object.length;\n\n var allowIndexes = !!length && isLength(length) &&\n (isArray(object) || isArguments(object));\n\n var index = -1,\n result = [];\n\n while (++index < propsLength) {\n var key = props[index];\n if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * Converts `value` to an array-like object if it's not one.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {Array|Object} Returns the array-like object.\n */\n function toIterable(value) {\n if (value == null) {\n return [];\n }\n if (!isArrayLike(value)) {\n return values(value);\n }\n return isObject(value) ? value : Object(value);\n }\n\n /**\n * Converts `value` to an object if it's not one.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {Object} Returns the object.\n */\n function toObject(value) {\n return isObject(value) ? value : Object(value);\n }\n\n /**\n * Converts `value` to property path array if it's not one.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {Array} Returns the property path array.\n */\n function toPath(value) {\n if (isArray(value)) {\n return value;\n }\n var result = [];\n baseToString(value).replace(rePropName, function(match, number, quote, string) {\n result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n }\n\n /**\n * Creates a clone of `wrapper`.\n *\n * @private\n * @param {Object} wrapper The wrapper to clone.\n * @returns {Object} Returns the cloned wrapper.\n */\n function wrapperClone(wrapper) {\n return wrapper instanceof LazyWrapper\n ? wrapper.clone()\n : new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__, arrayCopy(wrapper.__actions__));\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an array of elements split into groups the length of `size`.\n * If `collection` can't be split evenly, the final chunk will be the remaining\n * elements.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to process.\n * @param {number} [size=1] The length of each chunk.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n * @returns {Array} Returns the new array containing chunks.\n * @example\n *\n * _.chunk(['a', 'b', 'c', 'd'], 2);\n * // => [['a', 'b'], ['c', 'd']]\n *\n * _.chunk(['a', 'b', 'c', 'd'], 3);\n * // => [['a', 'b', 'c'], ['d']]\n */\n function chunk(array, size, guard) {\n if (guard ? isIterateeCall(array, size, guard) : size == null) {\n size = 1;\n } else {\n size = nativeMax(nativeFloor(size) || 1, 1);\n }\n var index = 0,\n length = array ? array.length : 0,\n resIndex = -1,\n result = Array(nativeCeil(length / size));\n\n while (index < length) {\n result[++resIndex] = baseSlice(array, index, (index += size));\n }\n return result;\n }\n\n /**\n * Creates an array with all falsey values removed. The values `false`, `null`,\n * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to compact.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.compact([0, 1, false, 2, '', 3]);\n * // => [1, 2, 3]\n */\n function compact(array) {\n var index = -1,\n length = array ? array.length : 0,\n resIndex = -1,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (value) {\n result[++resIndex] = value;\n }\n }\n return result;\n }\n\n /**\n * Creates an array of unique `array` values not included in the other\n * provided arrays using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The arrays of values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.difference([1, 2, 3], [4, 2]);\n * // => [1, 3]\n */\n var difference = restParam(function(array, values) {\n return (isObjectLike(array) && isArrayLike(array))\n ? baseDifference(array, baseFlatten(values, false, true))\n : [];\n });\n\n /**\n * Creates a slice of `array` with `n` elements dropped from the beginning.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.drop([1, 2, 3]);\n * // => [2, 3]\n *\n * _.drop([1, 2, 3], 2);\n * // => [3]\n *\n * _.drop([1, 2, 3], 5);\n * // => []\n *\n * _.drop([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\n function drop(array, n, guard) {\n var length = array ? array.length : 0;\n if (!length) {\n return [];\n }\n if (guard ? isIterateeCall(array, n, guard) : n == null) {\n n = 1;\n }\n return baseSlice(array, n < 0 ? 0 : n);\n }\n\n /**\n * Creates a slice of `array` with `n` elements dropped from the end.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.dropRight([1, 2, 3]);\n * // => [1, 2]\n *\n * _.dropRight([1, 2, 3], 2);\n * // => [1]\n *\n * _.dropRight([1, 2, 3], 5);\n * // => []\n *\n * _.dropRight([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\n function dropRight(array, n, guard) {\n var length = array ? array.length : 0;\n if (!length) {\n return [];\n }\n if (guard ? isIterateeCall(array, n, guard) : n == null) {\n n = 1;\n }\n n = length - (+n || 0);\n return baseSlice(array, 0, n < 0 ? 0 : n);\n }\n\n /**\n * Creates a slice of `array` excluding elements dropped from the end.\n * Elements are dropped until `predicate` returns falsey. The predicate is\n * bound to `thisArg` and invoked with three arguments: (value, index, array).\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that match the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.dropRightWhile([1, 2, 3], function(n) {\n * return n > 1;\n * });\n * // => [1]\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * // using the `_.matches` callback shorthand\n * _.pluck(_.dropRightWhile(users, { 'user': 'pebbles', 'active': false }), 'user');\n * // => ['barney', 'fred']\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.pluck(_.dropRightWhile(users, 'active', false), 'user');\n * // => ['barney']\n *\n * // using the `_.property` callback shorthand\n * _.pluck(_.dropRightWhile(users, 'active'), 'user');\n * // => ['barney', 'fred', 'pebbles']\n */\n function dropRightWhile(array, predicate, thisArg) {\n return (array && array.length)\n ? baseWhile(array, getCallback(predicate, thisArg, 3), true, true)\n : [];\n }\n\n /**\n * Creates a slice of `array` excluding elements dropped from the beginning.\n * Elements are dropped until `predicate` returns falsey. The predicate is\n * bound to `thisArg` and invoked with three arguments: (value, index, array).\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.dropWhile([1, 2, 3], function(n) {\n * return n < 3;\n * });\n * // => [3]\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * // using the `_.matches` callback shorthand\n * _.pluck(_.dropWhile(users, { 'user': 'barney', 'active': false }), 'user');\n * // => ['fred', 'pebbles']\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.pluck(_.dropWhile(users, 'active', false), 'user');\n * // => ['pebbles']\n *\n * // using the `_.property` callback shorthand\n * _.pluck(_.dropWhile(users, 'active'), 'user');\n * // => ['barney', 'fred', 'pebbles']\n */\n function dropWhile(array, predicate, thisArg) {\n return (array && array.length)\n ? baseWhile(array, getCallback(predicate, thisArg, 3), true)\n : [];\n }\n\n /**\n * Fills elements of `array` with `value` from `start` up to, but not\n * including, `end`.\n *\n * **Note:** This method mutates `array`.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to fill.\n * @param {*} value The value to fill `array` with.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _.fill(array, 'a');\n * console.log(array);\n * // => ['a', 'a', 'a']\n *\n * _.fill(Array(3), 2);\n * // => [2, 2, 2]\n *\n * _.fill([4, 6, 8], '*', 1, 2);\n * // => [4, '*', 8]\n */\n function fill(array, value, start, end) {\n var length = array ? array.length : 0;\n if (!length) {\n return [];\n }\n if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n start = 0;\n end = length;\n }\n return baseFill(array, value, start, end);\n }\n\n /**\n * This method is like `_.find` except that it returns the index of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to search.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.findIndex(users, function(chr) {\n * return chr.user == 'barney';\n * });\n * // => 0\n *\n * // using the `_.matches` callback shorthand\n * _.findIndex(users, { 'user': 'fred', 'active': false });\n * // => 1\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.findIndex(users, 'active', false);\n * // => 0\n *\n * // using the `_.property` callback shorthand\n * _.findIndex(users, 'active');\n * // => 2\n */\n var findIndex = createFindIndex();\n\n /**\n * This method is like `_.findIndex` except that it iterates over elements\n * of `collection` from right to left.\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to search.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.findLastIndex(users, function(chr) {\n * return chr.user == 'pebbles';\n * });\n * // => 2\n *\n * // using the `_.matches` callback shorthand\n * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n * // => 0\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.findLastIndex(users, 'active', false);\n * // => 2\n *\n * // using the `_.property` callback shorthand\n * _.findLastIndex(users, 'active');\n * // => 0\n */\n var findLastIndex = createFindIndex(true);\n\n /**\n * Gets the first element of `array`.\n *\n * @static\n * @memberOf _\n * @alias head\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the first element of `array`.\n * @example\n *\n * _.first([1, 2, 3]);\n * // => 1\n *\n * _.first([]);\n * // => undefined\n */\n function first(array) {\n return array ? array[0] : undefined;\n }\n\n /**\n * Flattens a nested array. If `isDeep` is `true` the array is recursively\n * flattened, otherwise it is only flattened a single level.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to flatten.\n * @param {boolean} [isDeep] Specify a deep flatten.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, 3, [4]]]);\n * // => [1, 2, 3, [4]]\n *\n * // using `isDeep`\n * _.flatten([1, [2, 3, [4]]], true);\n * // => [1, 2, 3, 4]\n */\n function flatten(array, isDeep, guard) {\n var length = array ? array.length : 0;\n if (guard && isIterateeCall(array, isDeep, guard)) {\n isDeep = false;\n }\n return length ? baseFlatten(array, isDeep) : [];\n }\n\n /**\n * Recursively flattens a nested array.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to recursively flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flattenDeep([1, [2, 3, [4]]]);\n * // => [1, 2, 3, 4]\n */\n function flattenDeep(array) {\n var length = array ? array.length : 0;\n return length ? baseFlatten(array, true) : [];\n }\n\n /**\n * Gets the index at which the first occurrence of `value` is found in `array`\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * for equality comparisons. If `fromIndex` is negative, it is used as the offset\n * from the end of `array`. If `array` is sorted providing `true` for `fromIndex`\n * performs a faster binary search.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to search.\n * @param {*} value The value to search for.\n * @param {boolean|number} [fromIndex=0] The index to search from or `true`\n * to perform a binary search on a sorted array.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.indexOf([1, 2, 1, 2], 2);\n * // => 1\n *\n * // using `fromIndex`\n * _.indexOf([1, 2, 1, 2], 2, 2);\n * // => 3\n *\n * // performing a binary search\n * _.indexOf([1, 1, 2, 2], 2, true);\n * // => 2\n */\n function indexOf(array, value, fromIndex) {\n var length = array ? array.length : 0;\n if (!length) {\n return -1;\n }\n if (typeof fromIndex == 'number') {\n fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex;\n } else if (fromIndex) {\n var index = binaryIndex(array, value);\n if (index < length &&\n (value === value ? (value === array[index]) : (array[index] !== array[index]))) {\n return index;\n }\n return -1;\n }\n return baseIndexOf(array, value, fromIndex || 0);\n }\n\n /**\n * Gets all but the last element of `array`.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to query.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.initial([1, 2, 3]);\n * // => [1, 2]\n */\n function initial(array) {\n return dropRight(array, 1);\n }\n\n /**\n * Creates an array of unique values that are included in all of the provided\n * arrays using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of shared values.\n * @example\n * _.intersection([1, 2], [4, 2], [2, 1]);\n * // => [2]\n */\n var intersection = restParam(function(arrays) {\n var othLength = arrays.length,\n othIndex = othLength,\n caches = Array(length),\n indexOf = getIndexOf(),\n isCommon = indexOf == baseIndexOf,\n result = [];\n\n while (othIndex--) {\n var value = arrays[othIndex] = isArrayLike(value = arrays[othIndex]) ? value : [];\n caches[othIndex] = (isCommon && value.length >= 120) ? createCache(othIndex && value) : null;\n }\n var array = arrays[0],\n index = -1,\n length = array ? array.length : 0,\n seen = caches[0];\n\n outer:\n while (++index < length) {\n value = array[index];\n if ((seen ? cacheIndexOf(seen, value) : indexOf(result, value, 0)) < 0) {\n var othIndex = othLength;\n while (--othIndex) {\n var cache = caches[othIndex];\n if ((cache ? cacheIndexOf(cache, value) : indexOf(arrays[othIndex], value, 0)) < 0) {\n continue outer;\n }\n }\n if (seen) {\n seen.push(value);\n }\n result.push(value);\n }\n }\n return result;\n });\n\n /**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\n function last(array) {\n var length = array ? array.length : 0;\n return length ? array[length - 1] : undefined;\n }\n\n /**\n * This method is like `_.indexOf` except that it iterates over elements of\n * `array` from right to left.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to search.\n * @param {*} value The value to search for.\n * @param {boolean|number} [fromIndex=array.length-1] The index to search from\n * or `true` to perform a binary search on a sorted array.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.lastIndexOf([1, 2, 1, 2], 2);\n * // => 3\n *\n * // using `fromIndex`\n * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n * // => 1\n *\n * // performing a binary search\n * _.lastIndexOf([1, 1, 2, 2], 2, true);\n * // => 3\n */\n function lastIndexOf(array, value, fromIndex) {\n var length = array ? array.length : 0;\n if (!length) {\n return -1;\n }\n var index = length;\n if (typeof fromIndex == 'number') {\n index = (fromIndex < 0 ? nativeMax(length + fromIndex, 0) : nativeMin(fromIndex || 0, length - 1)) + 1;\n } else if (fromIndex) {\n index = binaryIndex(array, value, true) - 1;\n var other = array[index];\n if (value === value ? (value === other) : (other !== other)) {\n return index;\n }\n return -1;\n }\n if (value !== value) {\n return indexOfNaN(array, index, true);\n }\n while (index--) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * Removes all provided values from `array` using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * **Note:** Unlike `_.without`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to modify.\n * @param {...*} [values] The values to remove.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [1, 2, 3, 1, 2, 3];\n *\n * _.pull(array, 2, 3);\n * console.log(array);\n * // => [1, 1]\n */\n function pull() {\n var args = arguments,\n array = args[0];\n\n if (!(array && array.length)) {\n return array;\n }\n var index = 0,\n indexOf = getIndexOf(),\n length = args.length;\n\n while (++index < length) {\n var fromIndex = 0,\n value = args[index];\n\n while ((fromIndex = indexOf(array, value, fromIndex)) > -1) {\n splice.call(array, fromIndex, 1);\n }\n }\n return array;\n }\n\n /**\n * Removes elements from `array` corresponding to the given indexes and returns\n * an array of the removed elements. Indexes may be specified as an array of\n * indexes or as individual arguments.\n *\n * **Note:** Unlike `_.at`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to modify.\n * @param {...(number|number[])} [indexes] The indexes of elements to remove,\n * specified as individual indexes or arrays of indexes.\n * @returns {Array} Returns the new array of removed elements.\n * @example\n *\n * var array = [5, 10, 15, 20];\n * var evens = _.pullAt(array, 1, 3);\n *\n * console.log(array);\n * // => [5, 15]\n *\n * console.log(evens);\n * // => [10, 20]\n */\n var pullAt = restParam(function(array, indexes) {\n indexes = baseFlatten(indexes);\n\n var result = baseAt(array, indexes);\n basePullAt(array, indexes.sort(baseCompareAscending));\n return result;\n });\n\n /**\n * Removes all elements from `array` that `predicate` returns truthy for\n * and returns an array of the removed elements. The predicate is bound to\n * `thisArg` and invoked with three arguments: (value, index, array).\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * **Note:** Unlike `_.filter`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {Array} Returns the new array of removed elements.\n * @example\n *\n * var array = [1, 2, 3, 4];\n * var evens = _.remove(array, function(n) {\n * return n % 2 == 0;\n * });\n *\n * console.log(array);\n * // => [1, 3]\n *\n * console.log(evens);\n * // => [2, 4]\n */\n function remove(array, predicate, thisArg) {\n var result = [];\n if (!(array && array.length)) {\n return result;\n }\n var index = -1,\n indexes = [],\n length = array.length;\n\n predicate = getCallback(predicate, thisArg, 3);\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result.push(value);\n indexes.push(index);\n }\n }\n basePullAt(array, indexes);\n return result;\n }\n\n /**\n * Gets all but the first element of `array`.\n *\n * @static\n * @memberOf _\n * @alias tail\n * @category Array\n * @param {Array} array The array to query.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.rest([1, 2, 3]);\n * // => [2, 3]\n */\n function rest(array) {\n return drop(array, 1);\n }\n\n /**\n * Creates a slice of `array` from `start` up to, but not including, `end`.\n *\n * **Note:** This method is used instead of `Array#slice` to support node\n * lists in IE < 9 and to ensure dense arrays are returned.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\n function slice(array, start, end) {\n var length = array ? array.length : 0;\n if (!length) {\n return [];\n }\n if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n start = 0;\n end = length;\n }\n return baseSlice(array, start, end);\n }\n\n /**\n * Uses a binary search to determine the lowest index at which `value` should\n * be inserted into `array` in order to maintain its sort order. If an iteratee\n * function is provided it is invoked for `value` and each element of `array`\n * to compute their sort ranking. The iteratee is bound to `thisArg` and\n * invoked with one argument; (value).\n *\n * If a property name is provided for `iteratee` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `iteratee` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * _.sortedIndex([30, 50], 40);\n * // => 1\n *\n * _.sortedIndex([4, 4, 5, 5], 5);\n * // => 2\n *\n * var dict = { 'data': { 'thirty': 30, 'forty': 40, 'fifty': 50 } };\n *\n * // using an iteratee function\n * _.sortedIndex(['thirty', 'fifty'], 'forty', function(word) {\n * return this.data[word];\n * }, dict);\n * // => 1\n *\n * // using the `_.property` callback shorthand\n * _.sortedIndex([{ 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\n * // => 1\n */\n var sortedIndex = createSortedIndex();\n\n /**\n * This method is like `_.sortedIndex` except that it returns the highest\n * index at which `value` should be inserted into `array` in order to\n * maintain its sort order.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * _.sortedLastIndex([4, 4, 5, 5], 5);\n * // => 4\n */\n var sortedLastIndex = createSortedIndex(true);\n\n /**\n * Creates a slice of `array` with `n` elements taken from the beginning.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to take.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.take([1, 2, 3]);\n * // => [1]\n *\n * _.take([1, 2, 3], 2);\n * // => [1, 2]\n *\n * _.take([1, 2, 3], 5);\n * // => [1, 2, 3]\n *\n * _.take([1, 2, 3], 0);\n * // => []\n */\n function take(array, n, guard) {\n var length = array ? array.length : 0;\n if (!length) {\n return [];\n }\n if (guard ? isIterateeCall(array, n, guard) : n == null) {\n n = 1;\n }\n return baseSlice(array, 0, n < 0 ? 0 : n);\n }\n\n /**\n * Creates a slice of `array` with `n` elements taken from the end.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to take.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.takeRight([1, 2, 3]);\n * // => [3]\n *\n * _.takeRight([1, 2, 3], 2);\n * // => [2, 3]\n *\n * _.takeRight([1, 2, 3], 5);\n * // => [1, 2, 3]\n *\n * _.takeRight([1, 2, 3], 0);\n * // => []\n */\n function takeRight(array, n, guard) {\n var length = array ? array.length : 0;\n if (!length) {\n return [];\n }\n if (guard ? isIterateeCall(array, n, guard) : n == null) {\n n = 1;\n }\n n = length - (+n || 0);\n return baseSlice(array, n < 0 ? 0 : n);\n }\n\n /**\n * Creates a slice of `array` with elements taken from the end. Elements are\n * taken until `predicate` returns falsey. The predicate is bound to `thisArg`\n * and invoked with three arguments: (value, index, array).\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.takeRightWhile([1, 2, 3], function(n) {\n * return n > 1;\n * });\n * // => [2, 3]\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * // using the `_.matches` callback shorthand\n * _.pluck(_.takeRightWhile(users, { 'user': 'pebbles', 'active': false }), 'user');\n * // => ['pebbles']\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.pluck(_.takeRightWhile(users, 'active', false), 'user');\n * // => ['fred', 'pebbles']\n *\n * // using the `_.property` callback shorthand\n * _.pluck(_.takeRightWhile(users, 'active'), 'user');\n * // => []\n */\n function takeRightWhile(array, predicate, thisArg) {\n return (array && array.length)\n ? baseWhile(array, getCallback(predicate, thisArg, 3), false, true)\n : [];\n }\n\n /**\n * Creates a slice of `array` with elements taken from the beginning. Elements\n * are taken until `predicate` returns falsey. The predicate is bound to\n * `thisArg` and invoked with three arguments: (value, index, array).\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.takeWhile([1, 2, 3], function(n) {\n * return n < 3;\n * });\n * // => [1, 2]\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false},\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * // using the `_.matches` callback shorthand\n * _.pluck(_.takeWhile(users, { 'user': 'barney', 'active': false }), 'user');\n * // => ['barney']\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.pluck(_.takeWhile(users, 'active', false), 'user');\n * // => ['barney', 'fred']\n *\n * // using the `_.property` callback shorthand\n * _.pluck(_.takeWhile(users, 'active'), 'user');\n * // => []\n */\n function takeWhile(array, predicate, thisArg) {\n return (array && array.length)\n ? baseWhile(array, getCallback(predicate, thisArg, 3))\n : [];\n }\n\n /**\n * Creates an array of unique values, in order, from all of the provided arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.union([1, 2], [4, 2], [2, 1]);\n * // => [1, 2, 4]\n */\n var union = restParam(function(arrays) {\n return baseUniq(baseFlatten(arrays, false, true));\n });\n\n /**\n * Creates a duplicate-free version of an array, using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * for equality comparisons, in which only the first occurence of each element\n * is kept. Providing `true` for `isSorted` performs a faster search algorithm\n * for sorted arrays. If an iteratee function is provided it is invoked for\n * each element in the array to generate the criterion by which uniqueness\n * is computed. The `iteratee` is bound to `thisArg` and invoked with three\n * arguments: (value, index, array).\n *\n * If a property name is provided for `iteratee` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `iteratee` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @alias unique\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {boolean} [isSorted] Specify the array is sorted.\n * @param {Function|Object|string} [iteratee] The function invoked per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Array} Returns the new duplicate-value-free array.\n * @example\n *\n * _.uniq([2, 1, 2]);\n * // => [2, 1]\n *\n * // using `isSorted`\n * _.uniq([1, 1, 2], true);\n * // => [1, 2]\n *\n * // using an iteratee function\n * _.uniq([1, 2.5, 1.5, 2], function(n) {\n * return this.floor(n);\n * }, Math);\n * // => [1, 2.5]\n *\n * // using the `_.property` callback shorthand\n * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\n function uniq(array, isSorted, iteratee, thisArg) {\n var length = array ? array.length : 0;\n if (!length) {\n return [];\n }\n if (isSorted != null && typeof isSorted != 'boolean') {\n thisArg = iteratee;\n iteratee = isIterateeCall(array, isSorted, thisArg) ? undefined : isSorted;\n isSorted = false;\n }\n var callback = getCallback();\n if (!(iteratee == null && callback === baseCallback)) {\n iteratee = callback(iteratee, thisArg, 3);\n }\n return (isSorted && getIndexOf() == baseIndexOf)\n ? sortedUniq(array, iteratee)\n : baseUniq(array, iteratee);\n }\n\n /**\n * This method is like `_.zip` except that it accepts an array of grouped\n * elements and creates an array regrouping the elements to their pre-zip\n * configuration.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array of grouped elements to process.\n * @returns {Array} Returns the new array of regrouped elements.\n * @example\n *\n * var zipped = _.zip(['fred', 'barney'], [30, 40], [true, false]);\n * // => [['fred', 30, true], ['barney', 40, false]]\n *\n * _.unzip(zipped);\n * // => [['fred', 'barney'], [30, 40], [true, false]]\n */\n function unzip(array) {\n if (!(array && array.length)) {\n return [];\n }\n var index = -1,\n length = 0;\n\n array = arrayFilter(array, function(group) {\n if (isArrayLike(group)) {\n length = nativeMax(group.length, length);\n return true;\n }\n });\n var result = Array(length);\n while (++index < length) {\n result[index] = arrayMap(array, baseProperty(index));\n }\n return result;\n }\n\n /**\n * This method is like `_.unzip` except that it accepts an iteratee to specify\n * how regrouped values should be combined. The `iteratee` is bound to `thisArg`\n * and invoked with four arguments: (accumulator, value, index, group).\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array of grouped elements to process.\n * @param {Function} [iteratee] The function to combine regrouped values.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Array} Returns the new array of regrouped elements.\n * @example\n *\n * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n * // => [[1, 10, 100], [2, 20, 200]]\n *\n * _.unzipWith(zipped, _.add);\n * // => [3, 30, 300]\n */\n function unzipWith(array, iteratee, thisArg) {\n var length = array ? array.length : 0;\n if (!length) {\n return [];\n }\n var result = unzip(array);\n if (iteratee == null) {\n return result;\n }\n iteratee = bindCallback(iteratee, thisArg, 4);\n return arrayMap(result, function(group) {\n return arrayReduce(group, iteratee, undefined, true);\n });\n }\n\n /**\n * Creates an array excluding all provided values using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to filter.\n * @param {...*} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.without([1, 2, 1, 3], 1, 2);\n * // => [3]\n */\n var without = restParam(function(array, values) {\n return isArrayLike(array)\n ? baseDifference(array, values)\n : [];\n });\n\n /**\n * Creates an array of unique values that is the [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n * of the provided arrays.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of values.\n * @example\n *\n * _.xor([1, 2], [4, 2]);\n * // => [1, 4]\n */\n function xor() {\n var index = -1,\n length = arguments.length;\n\n while (++index < length) {\n var array = arguments[index];\n if (isArrayLike(array)) {\n var result = result\n ? arrayPush(baseDifference(result, array), baseDifference(array, result))\n : array;\n }\n }\n return result ? baseUniq(result) : [];\n }\n\n /**\n * Creates an array of grouped elements, the first of which contains the first\n * elements of the given arrays, the second of which contains the second elements\n * of the given arrays, and so on.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {...Array} [arrays] The arrays to process.\n * @returns {Array} Returns the new array of grouped elements.\n * @example\n *\n * _.zip(['fred', 'barney'], [30, 40], [true, false]);\n * // => [['fred', 30, true], ['barney', 40, false]]\n */\n var zip = restParam(unzip);\n\n /**\n * The inverse of `_.pairs`; this method returns an object composed from arrays\n * of property names and values. Provide either a single two dimensional array,\n * e.g. `[[key1, value1], [key2, value2]]` or two arrays, one of property names\n * and one of corresponding values.\n *\n * @static\n * @memberOf _\n * @alias object\n * @category Array\n * @param {Array} props The property names.\n * @param {Array} [values=[]] The property values.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.zipObject([['fred', 30], ['barney', 40]]);\n * // => { 'fred': 30, 'barney': 40 }\n *\n * _.zipObject(['fred', 'barney'], [30, 40]);\n * // => { 'fred': 30, 'barney': 40 }\n */\n function zipObject(props, values) {\n var index = -1,\n length = props ? props.length : 0,\n result = {};\n\n if (length && !values && !isArray(props[0])) {\n values = [];\n }\n while (++index < length) {\n var key = props[index];\n if (values) {\n result[key] = values[index];\n } else if (key) {\n result[key[0]] = key[1];\n }\n }\n return result;\n }\n\n /**\n * This method is like `_.zip` except that it accepts an iteratee to specify\n * how grouped values should be combined. The `iteratee` is bound to `thisArg`\n * and invoked with four arguments: (accumulator, value, index, group).\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {...Array} [arrays] The arrays to process.\n * @param {Function} [iteratee] The function to combine grouped values.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Array} Returns the new array of grouped elements.\n * @example\n *\n * _.zipWith([1, 2], [10, 20], [100, 200], _.add);\n * // => [111, 222]\n */\n var zipWith = restParam(function(arrays) {\n var length = arrays.length,\n iteratee = length > 2 ? arrays[length - 2] : undefined,\n thisArg = length > 1 ? arrays[length - 1] : undefined;\n\n if (length > 2 && typeof iteratee == 'function') {\n length -= 2;\n } else {\n iteratee = (length > 1 && typeof thisArg == 'function') ? (--length, thisArg) : undefined;\n thisArg = undefined;\n }\n arrays.length = length;\n return unzipWith(arrays, iteratee, thisArg);\n });\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a `lodash` object that wraps `value` with explicit method\n * chaining enabled.\n *\n * @static\n * @memberOf _\n * @category Chain\n * @param {*} value The value to wrap.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'pebbles', 'age': 1 }\n * ];\n *\n * var youngest = _.chain(users)\n * .sortBy('age')\n * .map(function(chr) {\n * return chr.user + ' is ' + chr.age;\n * })\n * .first()\n * .value();\n * // => 'pebbles is 1'\n */\n function chain(value) {\n var result = lodash(value);\n result.__chain__ = true;\n return result;\n }\n\n /**\n * This method invokes `interceptor` and returns `value`. The interceptor is\n * bound to `thisArg` and invoked with one argument; (value). The purpose of\n * this method is to \"tap into\" a method chain in order to perform operations\n * on intermediate results within the chain.\n *\n * @static\n * @memberOf _\n * @category Chain\n * @param {*} value The value to provide to `interceptor`.\n * @param {Function} interceptor The function to invoke.\n * @param {*} [thisArg] The `this` binding of `interceptor`.\n * @returns {*} Returns `value`.\n * @example\n *\n * _([1, 2, 3])\n * .tap(function(array) {\n * array.pop();\n * })\n * .reverse()\n * .value();\n * // => [2, 1]\n */\n function tap(value, interceptor, thisArg) {\n interceptor.call(thisArg, value);\n return value;\n }\n\n /**\n * This method is like `_.tap` except that it returns the result of `interceptor`.\n *\n * @static\n * @memberOf _\n * @category Chain\n * @param {*} value The value to provide to `interceptor`.\n * @param {Function} interceptor The function to invoke.\n * @param {*} [thisArg] The `this` binding of `interceptor`.\n * @returns {*} Returns the result of `interceptor`.\n * @example\n *\n * _(' abc ')\n * .chain()\n * .trim()\n * .thru(function(value) {\n * return [value];\n * })\n * .value();\n * // => ['abc']\n */\n function thru(value, interceptor, thisArg) {\n return interceptor.call(thisArg, value);\n }\n\n /**\n * Enables explicit method chaining on the wrapper object.\n *\n * @name chain\n * @memberOf _\n * @category Chain\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 }\n * ];\n *\n * // without explicit chaining\n * _(users).first();\n * // => { 'user': 'barney', 'age': 36 }\n *\n * // with explicit chaining\n * _(users).chain()\n * .first()\n * .pick('user')\n * .value();\n * // => { 'user': 'barney' }\n */\n function wrapperChain() {\n return chain(this);\n }\n\n /**\n * Executes the chained sequence and returns the wrapped result.\n *\n * @name commit\n * @memberOf _\n * @category Chain\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var array = [1, 2];\n * var wrapped = _(array).push(3);\n *\n * console.log(array);\n * // => [1, 2]\n *\n * wrapped = wrapped.commit();\n * console.log(array);\n * // => [1, 2, 3]\n *\n * wrapped.last();\n * // => 3\n *\n * console.log(array);\n * // => [1, 2, 3]\n */\n function wrapperCommit() {\n return new LodashWrapper(this.value(), this.__chain__);\n }\n\n /**\n * Creates a new array joining a wrapped array with any additional arrays\n * and/or values.\n *\n * @name concat\n * @memberOf _\n * @category Chain\n * @param {...*} [values] The values to concatenate.\n * @returns {Array} Returns the new concatenated array.\n * @example\n *\n * var array = [1];\n * var wrapped = _(array).concat(2, [3], [[4]]);\n *\n * console.log(wrapped.value());\n * // => [1, 2, 3, [4]]\n *\n * console.log(array);\n * // => [1]\n */\n var wrapperConcat = restParam(function(values) {\n values = baseFlatten(values);\n return this.thru(function(array) {\n return arrayConcat(isArray(array) ? array : [toObject(array)], values);\n });\n });\n\n /**\n * Creates a clone of the chained sequence planting `value` as the wrapped value.\n *\n * @name plant\n * @memberOf _\n * @category Chain\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var array = [1, 2];\n * var wrapped = _(array).map(function(value) {\n * return Math.pow(value, 2);\n * });\n *\n * var other = [3, 4];\n * var otherWrapped = wrapped.plant(other);\n *\n * otherWrapped.value();\n * // => [9, 16]\n *\n * wrapped.value();\n * // => [1, 4]\n */\n function wrapperPlant(value) {\n var result,\n parent = this;\n\n while (parent instanceof baseLodash) {\n var clone = wrapperClone(parent);\n if (result) {\n previous.__wrapped__ = clone;\n } else {\n result = clone;\n }\n var previous = clone;\n parent = parent.__wrapped__;\n }\n previous.__wrapped__ = value;\n return result;\n }\n\n /**\n * Reverses the wrapped array so the first element becomes the last, the\n * second element becomes the second to last, and so on.\n *\n * **Note:** This method mutates the wrapped array.\n *\n * @name reverse\n * @memberOf _\n * @category Chain\n * @returns {Object} Returns the new reversed `lodash` wrapper instance.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _(array).reverse().value()\n * // => [3, 2, 1]\n *\n * console.log(array);\n * // => [3, 2, 1]\n */\n function wrapperReverse() {\n var value = this.__wrapped__;\n\n var interceptor = function(value) {\n return (wrapped && wrapped.__dir__ < 0) ? value : value.reverse();\n };\n if (value instanceof LazyWrapper) {\n var wrapped = value;\n if (this.__actions__.length) {\n wrapped = new LazyWrapper(this);\n }\n wrapped = wrapped.reverse();\n wrapped.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });\n return new LodashWrapper(wrapped, this.__chain__);\n }\n return this.thru(interceptor);\n }\n\n /**\n * Produces the result of coercing the unwrapped value to a string.\n *\n * @name toString\n * @memberOf _\n * @category Chain\n * @returns {string} Returns the coerced string value.\n * @example\n *\n * _([1, 2, 3]).toString();\n * // => '1,2,3'\n */\n function wrapperToString() {\n return (this.value() + '');\n }\n\n /**\n * Executes the chained sequence to extract the unwrapped value.\n *\n * @name value\n * @memberOf _\n * @alias run, toJSON, valueOf\n * @category Chain\n * @returns {*} Returns the resolved unwrapped value.\n * @example\n *\n * _([1, 2, 3]).value();\n * // => [1, 2, 3]\n */\n function wrapperValue() {\n return baseWrapperValue(this.__wrapped__, this.__actions__);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an array of elements corresponding to the given keys, or indexes,\n * of `collection`. Keys may be specified as individual arguments or as arrays\n * of keys.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {...(number|number[]|string|string[])} [props] The property names\n * or indexes of elements to pick, specified individually or in arrays.\n * @returns {Array} Returns the new array of picked elements.\n * @example\n *\n * _.at(['a', 'b', 'c'], [0, 2]);\n * // => ['a', 'c']\n *\n * _.at(['barney', 'fred', 'pebbles'], 0, 2);\n * // => ['barney', 'pebbles']\n */\n var at = restParam(function(collection, props) {\n return baseAt(collection, baseFlatten(props));\n });\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` through `iteratee`. The corresponding value\n * of each key is the number of times the key was returned by `iteratee`.\n * The `iteratee` is bound to `thisArg` and invoked with three arguments:\n * (value, index|key, collection).\n *\n * If a property name is provided for `iteratee` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `iteratee` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.countBy([4.3, 6.1, 6.4], function(n) {\n * return Math.floor(n);\n * });\n * // => { '4': 1, '6': 2 }\n *\n * _.countBy([4.3, 6.1, 6.4], function(n) {\n * return this.floor(n);\n * }, Math);\n * // => { '4': 1, '6': 2 }\n *\n * _.countBy(['one', 'two', 'three'], 'length');\n * // => { '3': 2, '5': 1 }\n */\n var countBy = createAggregator(function(result, value, key) {\n hasOwnProperty.call(result, key) ? ++result[key] : (result[key] = 1);\n });\n\n /**\n * Checks if `predicate` returns truthy for **all** elements of `collection`.\n * The predicate is bound to `thisArg` and invoked with three arguments:\n * (value, index|key, collection).\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @alias all\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n * @example\n *\n * _.every([true, 1, null, 'yes'], Boolean);\n * // => false\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false }\n * ];\n *\n * // using the `_.matches` callback shorthand\n * _.every(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.every(users, 'active', false);\n * // => true\n *\n * // using the `_.property` callback shorthand\n * _.every(users, 'active');\n * // => false\n */\n function every(collection, predicate, thisArg) {\n var func = isArray(collection) ? arrayEvery : baseEvery;\n if (thisArg && isIterateeCall(collection, predicate, thisArg)) {\n predicate = undefined;\n }\n if (typeof predicate != 'function' || thisArg !== undefined) {\n predicate = getCallback(predicate, thisArg, 3);\n }\n return func(collection, predicate);\n }\n\n /**\n * Iterates over elements of `collection`, returning an array of all elements\n * `predicate` returns truthy for. The predicate is bound to `thisArg` and\n * invoked with three arguments: (value, index|key, collection).\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @alias select\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {Array} Returns the new filtered array.\n * @example\n *\n * _.filter([4, 5, 6], function(n) {\n * return n % 2 == 0;\n * });\n * // => [4, 6]\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * // using the `_.matches` callback shorthand\n * _.pluck(_.filter(users, { 'age': 36, 'active': true }), 'user');\n * // => ['barney']\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.pluck(_.filter(users, 'active', false), 'user');\n * // => ['fred']\n *\n * // using the `_.property` callback shorthand\n * _.pluck(_.filter(users, 'active'), 'user');\n * // => ['barney']\n */\n function filter(collection, predicate, thisArg) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n predicate = getCallback(predicate, thisArg, 3);\n return func(collection, predicate);\n }\n\n /**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is bound to `thisArg` and\n * invoked with three arguments: (value, index|key, collection).\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @alias detect\n * @category Collection\n * @param {Array|Object|string} collection The collection to search.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false },\n * { 'user': 'pebbles', 'age': 1, 'active': true }\n * ];\n *\n * _.result(_.find(users, function(chr) {\n * return chr.age < 40;\n * }), 'user');\n * // => 'barney'\n *\n * // using the `_.matches` callback shorthand\n * _.result(_.find(users, { 'age': 1, 'active': true }), 'user');\n * // => 'pebbles'\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.result(_.find(users, 'active', false), 'user');\n * // => 'fred'\n *\n * // using the `_.property` callback shorthand\n * _.result(_.find(users, 'active'), 'user');\n * // => 'barney'\n */\n var find = createFind(baseEach);\n\n /**\n * This method is like `_.find` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to search.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * _.findLast([1, 2, 3, 4], function(n) {\n * return n % 2 == 1;\n * });\n * // => 3\n */\n var findLast = createFind(baseEachRight, true);\n\n /**\n * Performs a deep comparison between each element in `collection` and the\n * source object, returning the first element that has equivalent property\n * values.\n *\n * **Note:** This method supports comparing arrays, booleans, `Date` objects,\n * numbers, `Object` objects, regexes, and strings. Objects are compared by\n * their own, not inherited, enumerable properties. For comparing a single\n * own or inherited property value see `_.matchesProperty`.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to search.\n * @param {Object} source The object of property values to match.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * _.result(_.findWhere(users, { 'age': 36, 'active': true }), 'user');\n * // => 'barney'\n *\n * _.result(_.findWhere(users, { 'age': 40, 'active': false }), 'user');\n * // => 'fred'\n */\n function findWhere(collection, source) {\n return find(collection, baseMatches(source));\n }\n\n /**\n * Iterates over elements of `collection` invoking `iteratee` for each element.\n * The `iteratee` is bound to `thisArg` and invoked with three arguments:\n * (value, index|key, collection). Iteratee functions may exit iteration early\n * by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\" property\n * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\n * may be used for object iteration.\n *\n * @static\n * @memberOf _\n * @alias each\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Array|Object|string} Returns `collection`.\n * @example\n *\n * _([1, 2]).forEach(function(n) {\n * console.log(n);\n * }).value();\n * // => logs each value from left to right and returns the array\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(n, key) {\n * console.log(n, key);\n * });\n * // => logs each value-key pair and returns the object (iteration order is not guaranteed)\n */\n var forEach = createForEach(arrayEach, baseEach);\n\n /**\n * This method is like `_.forEach` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @alias eachRight\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Array|Object|string} Returns `collection`.\n * @example\n *\n * _([1, 2]).forEachRight(function(n) {\n * console.log(n);\n * }).value();\n * // => logs each value from right to left and returns the array\n */\n var forEachRight = createForEach(arrayEachRight, baseEachRight);\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` through `iteratee`. The corresponding value\n * of each key is an array of the elements responsible for generating the key.\n * The `iteratee` is bound to `thisArg` and invoked with three arguments:\n * (value, index|key, collection).\n *\n * If a property name is provided for `iteratee` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `iteratee` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.groupBy([4.2, 6.1, 6.4], function(n) {\n * return Math.floor(n);\n * });\n * // => { '4': [4.2], '6': [6.1, 6.4] }\n *\n * _.groupBy([4.2, 6.1, 6.4], function(n) {\n * return this.floor(n);\n * }, Math);\n * // => { '4': [4.2], '6': [6.1, 6.4] }\n *\n * // using the `_.property` callback shorthand\n * _.groupBy(['one', 'two', 'three'], 'length');\n * // => { '3': ['one', 'two'], '5': ['three'] }\n */\n var groupBy = createAggregator(function(result, value, key) {\n if (hasOwnProperty.call(result, key)) {\n result[key].push(value);\n } else {\n result[key] = [value];\n }\n });\n\n /**\n * Checks if `value` is in `collection` using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * for equality comparisons. If `fromIndex` is negative, it is used as the offset\n * from the end of `collection`.\n *\n * @static\n * @memberOf _\n * @alias contains, include\n * @category Collection\n * @param {Array|Object|string} collection The collection to search.\n * @param {*} target The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`.\n * @returns {boolean} Returns `true` if a matching element is found, else `false`.\n * @example\n *\n * _.includes([1, 2, 3], 1);\n * // => true\n *\n * _.includes([1, 2, 3], 1, 2);\n * // => false\n *\n * _.includes({ 'user': 'fred', 'age': 40 }, 'fred');\n * // => true\n *\n * _.includes('pebbles', 'eb');\n * // => true\n */\n function includes(collection, target, fromIndex, guard) {\n var length = collection ? getLength(collection) : 0;\n if (!isLength(length)) {\n collection = values(collection);\n length = collection.length;\n }\n if (typeof fromIndex != 'number' || (guard && isIterateeCall(target, fromIndex, guard))) {\n fromIndex = 0;\n } else {\n fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : (fromIndex || 0);\n }\n return (typeof collection == 'string' || !isArray(collection) && isString(collection))\n ? (fromIndex <= length && collection.indexOf(target, fromIndex) > -1)\n : (!!length && getIndexOf(collection, target, fromIndex) > -1);\n }\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` through `iteratee`. The corresponding value\n * of each key is the last element responsible for generating the key. The\n * iteratee function is bound to `thisArg` and invoked with three arguments:\n * (value, index|key, collection).\n *\n * If a property name is provided for `iteratee` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `iteratee` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * var keyData = [\n * { 'dir': 'left', 'code': 97 },\n * { 'dir': 'right', 'code': 100 }\n * ];\n *\n * _.indexBy(keyData, 'dir');\n * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n *\n * _.indexBy(keyData, function(object) {\n * return String.fromCharCode(object.code);\n * });\n * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n *\n * _.indexBy(keyData, function(object) {\n * return this.fromCharCode(object.code);\n * }, String);\n * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n */\n var indexBy = createAggregator(function(result, value, key) {\n result[key] = value;\n });\n\n /**\n * Invokes the method at `path` of each element in `collection`, returning\n * an array of the results of each invoked method. Any additional arguments\n * are provided to each invoked method. If `methodName` is a function it is\n * invoked for, and `this` bound to, each element in `collection`.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Array|Function|string} path The path of the method to invoke or\n * the function invoked per iteration.\n * @param {...*} [args] The arguments to invoke the method with.\n * @returns {Array} Returns the array of results.\n * @example\n *\n * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\n * // => [[1, 5, 7], [1, 2, 3]]\n *\n * _.invoke([123, 456], String.prototype.split, '');\n * // => [['1', '2', '3'], ['4', '5', '6']]\n */\n var invoke = restParam(function(collection, path, args) {\n var index = -1,\n isFunc = typeof path == 'function',\n isProp = isKey(path),\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value) {\n var func = isFunc ? path : ((isProp && value != null) ? value[path] : undefined);\n result[++index] = func ? func.apply(value, args) : invokePath(value, path, args);\n });\n return result;\n });\n\n /**\n * Creates an array of values by running each element in `collection` through\n * `iteratee`. The `iteratee` is bound to `thisArg` and invoked with three\n * arguments: (value, index|key, collection).\n *\n * If a property name is provided for `iteratee` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `iteratee` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `callback`, `chunk`, `clone`, `create`, `curry`, `curryRight`,\n * `drop`, `dropRight`, `every`, `fill`, `flatten`, `invert`, `max`, `min`,\n * `parseInt`, `slice`, `sortBy`, `take`, `takeRight`, `template`, `trim`,\n * `trimLeft`, `trimRight`, `trunc`, `random`, `range`, `sample`, `some`,\n * `sum`, `uniq`, and `words`\n *\n * @static\n * @memberOf _\n * @alias collect\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function timesThree(n) {\n * return n * 3;\n * }\n *\n * _.map([1, 2], timesThree);\n * // => [3, 6]\n *\n * _.map({ 'a': 1, 'b': 2 }, timesThree);\n * // => [3, 6] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // using the `_.property` callback shorthand\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\n function map(collection, iteratee, thisArg) {\n var func = isArray(collection) ? arrayMap : baseMap;\n iteratee = getCallback(iteratee, thisArg, 3);\n return func(collection, iteratee);\n }\n\n /**\n * Creates an array of elements split into two groups, the first of which\n * contains elements `predicate` returns truthy for, while the second of which\n * contains elements `predicate` returns falsey for. The predicate is bound\n * to `thisArg` and invoked with three arguments: (value, index|key, collection).\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {Array} Returns the array of grouped elements.\n * @example\n *\n * _.partition([1, 2, 3], function(n) {\n * return n % 2;\n * });\n * // => [[1, 3], [2]]\n *\n * _.partition([1.2, 2.3, 3.4], function(n) {\n * return this.floor(n) % 2;\n * }, Math);\n * // => [[1.2, 3.4], [2.3]]\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true },\n * { 'user': 'pebbles', 'age': 1, 'active': false }\n * ];\n *\n * var mapper = function(array) {\n * return _.pluck(array, 'user');\n * };\n *\n * // using the `_.matches` callback shorthand\n * _.map(_.partition(users, { 'age': 1, 'active': false }), mapper);\n * // => [['pebbles'], ['barney', 'fred']]\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.map(_.partition(users, 'active', false), mapper);\n * // => [['barney', 'pebbles'], ['fred']]\n *\n * // using the `_.property` callback shorthand\n * _.map(_.partition(users, 'active'), mapper);\n * // => [['fred'], ['barney', 'pebbles']]\n */\n var partition = createAggregator(function(result, value, key) {\n result[key ? 0 : 1].push(value);\n }, function() { return [[], []]; });\n\n /**\n * Gets the property value of `path` from all elements in `collection`.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Array|string} path The path of the property to pluck.\n * @returns {Array} Returns the property values.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 }\n * ];\n *\n * _.pluck(users, 'user');\n * // => ['barney', 'fred']\n *\n * var userIndex = _.indexBy(users, 'user');\n * _.pluck(userIndex, 'age');\n * // => [36, 40] (iteration order is not guaranteed)\n */\n function pluck(collection, path) {\n return map(collection, property(path));\n }\n\n /**\n * Reduces `collection` to a value which is the accumulated result of running\n * each element in `collection` through `iteratee`, where each successive\n * invocation is supplied the return value of the previous. If `accumulator`\n * is not provided the first element of `collection` is used as the initial\n * value. The `iteratee` is bound to `thisArg` and invoked with four arguments:\n * (accumulator, value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\n *\n * The guarded methods are:\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `sortByAll`,\n * and `sortByOrder`\n *\n * @static\n * @memberOf _\n * @alias foldl, inject\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {*} Returns the accumulated value.\n * @example\n *\n * _.reduce([1, 2], function(total, n) {\n * return total + n;\n * });\n * // => 3\n *\n * _.reduce({ 'a': 1, 'b': 2 }, function(result, n, key) {\n * result[key] = n * 3;\n * return result;\n * }, {});\n * // => { 'a': 3, 'b': 6 } (iteration order is not guaranteed)\n */\n var reduce = createReduce(arrayReduce, baseEach);\n\n /**\n * This method is like `_.reduce` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @alias foldr\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {*} Returns the accumulated value.\n * @example\n *\n * var array = [[0, 1], [2, 3], [4, 5]];\n *\n * _.reduceRight(array, function(flattened, other) {\n * return flattened.concat(other);\n * }, []);\n * // => [4, 5, 2, 3, 0, 1]\n */\n var reduceRight = createReduce(arrayReduceRight, baseEachRight);\n\n /**\n * The opposite of `_.filter`; this method returns the elements of `collection`\n * that `predicate` does **not** return truthy for.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {Array} Returns the new filtered array.\n * @example\n *\n * _.reject([1, 2, 3, 4], function(n) {\n * return n % 2 == 0;\n * });\n * // => [1, 3]\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true }\n * ];\n *\n * // using the `_.matches` callback shorthand\n * _.pluck(_.reject(users, { 'age': 40, 'active': true }), 'user');\n * // => ['barney']\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.pluck(_.reject(users, 'active', false), 'user');\n * // => ['fred']\n *\n * // using the `_.property` callback shorthand\n * _.pluck(_.reject(users, 'active'), 'user');\n * // => ['barney']\n */\n function reject(collection, predicate, thisArg) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n predicate = getCallback(predicate, thisArg, 3);\n return func(collection, function(value, index, collection) {\n return !predicate(value, index, collection);\n });\n }\n\n /**\n * Gets a random element or `n` random elements from a collection.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to sample.\n * @param {number} [n] The number of elements to sample.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n * @returns {*} Returns the random sample(s).\n * @example\n *\n * _.sample([1, 2, 3, 4]);\n * // => 2\n *\n * _.sample([1, 2, 3, 4], 2);\n * // => [3, 1]\n */\n function sample(collection, n, guard) {\n if (guard ? isIterateeCall(collection, n, guard) : n == null) {\n collection = toIterable(collection);\n var length = collection.length;\n return length > 0 ? collection[baseRandom(0, length - 1)] : undefined;\n }\n var index = -1,\n result = toArray(collection),\n length = result.length,\n lastIndex = length - 1;\n\n n = nativeMin(n < 0 ? 0 : (+n || 0), length);\n while (++index < n) {\n var rand = baseRandom(index, lastIndex),\n value = result[rand];\n\n result[rand] = result[index];\n result[index] = value;\n }\n result.length = n;\n return result;\n }\n\n /**\n * Creates an array of shuffled values, using a version of the\n * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to shuffle.\n * @returns {Array} Returns the new shuffled array.\n * @example\n *\n * _.shuffle([1, 2, 3, 4]);\n * // => [4, 1, 3, 2]\n */\n function shuffle(collection) {\n return sample(collection, POSITIVE_INFINITY);\n }\n\n /**\n * Gets the size of `collection` by returning its length for array-like\n * values or the number of own enumerable properties for objects.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @returns {number} Returns the size of `collection`.\n * @example\n *\n * _.size([1, 2, 3]);\n * // => 3\n *\n * _.size({ 'a': 1, 'b': 2 });\n * // => 2\n *\n * _.size('pebbles');\n * // => 7\n */\n function size(collection) {\n var length = collection ? getLength(collection) : 0;\n return isLength(length) ? length : keys(collection).length;\n }\n\n /**\n * Checks if `predicate` returns truthy for **any** element of `collection`.\n * The function returns as soon as it finds a passing value and does not iterate\n * over the entire collection. The predicate is bound to `thisArg` and invoked\n * with three arguments: (value, index|key, collection).\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @alias any\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n * @example\n *\n * _.some([null, 0, 'yes', false], Boolean);\n * // => true\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false }\n * ];\n *\n * // using the `_.matches` callback shorthand\n * _.some(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.some(users, 'active', false);\n * // => true\n *\n * // using the `_.property` callback shorthand\n * _.some(users, 'active');\n * // => true\n */\n function some(collection, predicate, thisArg) {\n var func = isArray(collection) ? arraySome : baseSome;\n if (thisArg && isIterateeCall(collection, predicate, thisArg)) {\n predicate = undefined;\n }\n if (typeof predicate != 'function' || thisArg !== undefined) {\n predicate = getCallback(predicate, thisArg, 3);\n }\n return func(collection, predicate);\n }\n\n /**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection through `iteratee`. This method performs\n * a stable sort, that is, it preserves the original sort order of equal elements.\n * The `iteratee` is bound to `thisArg` and invoked with three arguments:\n * (value, index|key, collection).\n *\n * If a property name is provided for `iteratee` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `iteratee` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * _.sortBy([1, 2, 3], function(n) {\n * return Math.sin(n);\n * });\n * // => [3, 1, 2]\n *\n * _.sortBy([1, 2, 3], function(n) {\n * return this.sin(n);\n * }, Math);\n * // => [3, 1, 2]\n *\n * var users = [\n * { 'user': 'fred' },\n * { 'user': 'pebbles' },\n * { 'user': 'barney' }\n * ];\n *\n * // using the `_.property` callback shorthand\n * _.pluck(_.sortBy(users, 'user'), 'user');\n * // => ['barney', 'fred', 'pebbles']\n */\n function sortBy(collection, iteratee, thisArg) {\n if (collection == null) {\n return [];\n }\n if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {\n iteratee = undefined;\n }\n var index = -1;\n iteratee = getCallback(iteratee, thisArg, 3);\n\n var result = baseMap(collection, function(value, key, collection) {\n return { 'criteria': iteratee(value, key, collection), 'index': ++index, 'value': value };\n });\n return baseSortBy(result, compareAscending);\n }\n\n /**\n * This method is like `_.sortBy` except that it can sort by multiple iteratees\n * or property names.\n *\n * If a property name is provided for an iteratee the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If an object is provided for an iteratee the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {...(Function|Function[]|Object|Object[]|string|string[])} iteratees\n * The iteratees to sort by, specified as individual values or arrays of values.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 42 },\n * { 'user': 'barney', 'age': 34 }\n * ];\n *\n * _.map(_.sortByAll(users, ['user', 'age']), _.values);\n * // => [['barney', 34], ['barney', 36], ['fred', 42], ['fred', 48]]\n *\n * _.map(_.sortByAll(users, 'user', function(chr) {\n * return Math.floor(chr.age / 10);\n * }), _.values);\n * // => [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]]\n */\n var sortByAll = restParam(function(collection, iteratees) {\n if (collection == null) {\n return [];\n }\n var guard = iteratees[2];\n if (guard && isIterateeCall(iteratees[0], iteratees[1], guard)) {\n iteratees.length = 1;\n }\n return baseSortByOrder(collection, baseFlatten(iteratees), []);\n });\n\n /**\n * This method is like `_.sortByAll` except that it allows specifying the\n * sort orders of the iteratees to sort by. If `orders` is unspecified, all\n * values are sorted in ascending order. Otherwise, a value is sorted in\n * ascending order if its corresponding order is \"asc\", and descending if \"desc\".\n *\n * If a property name is provided for an iteratee the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If an object is provided for an iteratee the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {boolean[]} [orders] The sort orders of `iteratees`.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 34 },\n * { 'user': 'fred', 'age': 42 },\n * { 'user': 'barney', 'age': 36 }\n * ];\n *\n * // sort by `user` in ascending order and by `age` in descending order\n * _.map(_.sortByOrder(users, ['user', 'age'], ['asc', 'desc']), _.values);\n * // => [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]]\n */\n function sortByOrder(collection, iteratees, orders, guard) {\n if (collection == null) {\n return [];\n }\n if (guard && isIterateeCall(iteratees, orders, guard)) {\n orders = undefined;\n }\n if (!isArray(iteratees)) {\n iteratees = iteratees == null ? [] : [iteratees];\n }\n if (!isArray(orders)) {\n orders = orders == null ? [] : [orders];\n }\n return baseSortByOrder(collection, iteratees, orders);\n }\n\n /**\n * Performs a deep comparison between each element in `collection` and the\n * source object, returning an array of all elements that have equivalent\n * property values.\n *\n * **Note:** This method supports comparing arrays, booleans, `Date` objects,\n * numbers, `Object` objects, regexes, and strings. Objects are compared by\n * their own, not inherited, enumerable properties. For comparing a single\n * own or inherited property value see `_.matchesProperty`.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to search.\n * @param {Object} source The object of property values to match.\n * @returns {Array} Returns the new filtered array.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false, 'pets': ['hoppy'] },\n * { 'user': 'fred', 'age': 40, 'active': true, 'pets': ['baby puss', 'dino'] }\n * ];\n *\n * _.pluck(_.where(users, { 'age': 36, 'active': false }), 'user');\n * // => ['barney']\n *\n * _.pluck(_.where(users, { 'pets': ['dino'] }), 'user');\n * // => ['fred']\n */\n function where(collection, source) {\n return filter(collection, baseMatches(source));\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Gets the number of milliseconds that have elapsed since the Unix epoch\n * (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @category Date\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => logs the number of milliseconds it took for the deferred function to be invoked\n */\n var now = nativeNow || function() {\n return new Date().getTime();\n };\n\n /*------------------------------------------------------------------------*/\n\n /**\n * The opposite of `_.before`; this method creates a function that invokes\n * `func` once it is called `n` or more times.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {number} n The number of calls before `func` is invoked.\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * var saves = ['profile', 'settings'];\n *\n * var done = _.after(saves.length, function() {\n * console.log('done saving!');\n * });\n *\n * _.forEach(saves, function(type) {\n * asyncSave({ 'type': type, 'complete': done });\n * });\n * // => logs 'done saving!' after the two async saves have completed\n */\n function after(n, func) {\n if (typeof func != 'function') {\n if (typeof n == 'function') {\n var temp = n;\n n = func;\n func = temp;\n } else {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n }\n n = nativeIsFinite(n = +n) ? n : 0;\n return function() {\n if (--n < 1) {\n return func.apply(this, arguments);\n }\n };\n }\n\n /**\n * Creates a function that accepts up to `n` arguments ignoring any\n * additional arguments.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to cap arguments for.\n * @param {number} [n=func.length] The arity cap.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n * @returns {Function} Returns the new function.\n * @example\n *\n * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n * // => [6, 8, 10]\n */\n function ary(func, n, guard) {\n if (guard && isIterateeCall(func, n, guard)) {\n n = undefined;\n }\n n = (func && n == null) ? func.length : nativeMax(+n || 0, 0);\n return createWrapper(func, ARY_FLAG, undefined, undefined, undefined, undefined, n);\n }\n\n /**\n * Creates a function that invokes `func`, with the `this` binding and arguments\n * of the created function, while it is called less than `n` times. Subsequent\n * calls to the created function return the result of the last `func` invocation.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {number} n The number of calls at which `func` is no longer invoked.\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * jQuery('#add').on('click', _.before(5, addContactToList));\n * // => allows adding up to 4 contacts to the list\n */\n function before(n, func) {\n var result;\n if (typeof func != 'function') {\n if (typeof n == 'function') {\n var temp = n;\n n = func;\n func = temp;\n } else {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n }\n return function() {\n if (--n > 0) {\n result = func.apply(this, arguments);\n }\n if (n <= 1) {\n func = undefined;\n }\n return result;\n };\n }\n\n /**\n * Creates a function that invokes `func` with the `this` binding of `thisArg`\n * and prepends any additional `_.bind` arguments to those provided to the\n * bound function.\n *\n * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for partially applied arguments.\n *\n * **Note:** Unlike native `Function#bind` this method does not set the \"length\"\n * property of bound functions.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to bind.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new bound function.\n * @example\n *\n * var greet = function(greeting, punctuation) {\n * return greeting + ' ' + this.user + punctuation;\n * };\n *\n * var object = { 'user': 'fred' };\n *\n * var bound = _.bind(greet, object, 'hi');\n * bound('!');\n * // => 'hi fred!'\n *\n * // using placeholders\n * var bound = _.bind(greet, object, _, '!');\n * bound('hi');\n * // => 'hi fred!'\n */\n var bind = restParam(function(func, thisArg, partials) {\n var bitmask = BIND_FLAG;\n if (partials.length) {\n var holders = replaceHolders(partials, bind.placeholder);\n bitmask |= PARTIAL_FLAG;\n }\n return createWrapper(func, bitmask, thisArg, partials, holders);\n });\n\n /**\n * Binds methods of an object to the object itself, overwriting the existing\n * method. Method names may be specified as individual arguments or as arrays\n * of method names. If no method names are provided all enumerable function\n * properties, own and inherited, of `object` are bound.\n *\n * **Note:** This method does not set the \"length\" property of bound functions.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Object} object The object to bind and assign the bound methods to.\n * @param {...(string|string[])} [methodNames] The object method names to bind,\n * specified as individual method names or arrays of method names.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var view = {\n * 'label': 'docs',\n * 'onClick': function() {\n * console.log('clicked ' + this.label);\n * }\n * };\n *\n * _.bindAll(view);\n * jQuery('#docs').on('click', view.onClick);\n * // => logs 'clicked docs' when the element is clicked\n */\n var bindAll = restParam(function(object, methodNames) {\n methodNames = methodNames.length ? baseFlatten(methodNames) : functions(object);\n\n var index = -1,\n length = methodNames.length;\n\n while (++index < length) {\n var key = methodNames[index];\n object[key] = createWrapper(object[key], BIND_FLAG, object);\n }\n return object;\n });\n\n /**\n * Creates a function that invokes the method at `object[key]` and prepends\n * any additional `_.bindKey` arguments to those provided to the bound function.\n *\n * This method differs from `_.bind` by allowing bound functions to reference\n * methods that may be redefined or don't yet exist.\n * See [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n * for more details.\n *\n * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Object} object The object the method belongs to.\n * @param {string} key The key of the method.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new bound function.\n * @example\n *\n * var object = {\n * 'user': 'fred',\n * 'greet': function(greeting, punctuation) {\n * return greeting + ' ' + this.user + punctuation;\n * }\n * };\n *\n * var bound = _.bindKey(object, 'greet', 'hi');\n * bound('!');\n * // => 'hi fred!'\n *\n * object.greet = function(greeting, punctuation) {\n * return greeting + 'ya ' + this.user + punctuation;\n * };\n *\n * bound('!');\n * // => 'hiya fred!'\n *\n * // using placeholders\n * var bound = _.bindKey(object, 'greet', _, '!');\n * bound('hi');\n * // => 'hiya fred!'\n */\n var bindKey = restParam(function(object, key, partials) {\n var bitmask = BIND_FLAG | BIND_KEY_FLAG;\n if (partials.length) {\n var holders = replaceHolders(partials, bindKey.placeholder);\n bitmask |= PARTIAL_FLAG;\n }\n return createWrapper(key, bitmask, object, partials, holders);\n });\n\n /**\n * Creates a function that accepts one or more arguments of `func` that when\n * called either invokes `func` returning its result, if all `func` arguments\n * have been provided, or returns a function that accepts one or more of the\n * remaining `func` arguments, and so on. The arity of `func` may be specified\n * if `func.length` is not sufficient.\n *\n * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for provided arguments.\n *\n * **Note:** This method does not set the \"length\" property of curried functions.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to curry.\n * @param {number} [arity=func.length] The arity of `func`.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n * @returns {Function} Returns the new curried function.\n * @example\n *\n * var abc = function(a, b, c) {\n * return [a, b, c];\n * };\n *\n * var curried = _.curry(abc);\n *\n * curried(1)(2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2, 3);\n * // => [1, 2, 3]\n *\n * // using placeholders\n * curried(1)(_, 3)(2);\n * // => [1, 2, 3]\n */\n var curry = createCurry(CURRY_FLAG);\n\n /**\n * This method is like `_.curry` except that arguments are applied to `func`\n * in the manner of `_.partialRight` instead of `_.partial`.\n *\n * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for provided arguments.\n *\n * **Note:** This method does not set the \"length\" property of curried functions.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to curry.\n * @param {number} [arity=func.length] The arity of `func`.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n * @returns {Function} Returns the new curried function.\n * @example\n *\n * var abc = function(a, b, c) {\n * return [a, b, c];\n * };\n *\n * var curried = _.curryRight(abc);\n *\n * curried(3)(2)(1);\n * // => [1, 2, 3]\n *\n * curried(2, 3)(1);\n * // => [1, 2, 3]\n *\n * curried(1, 2, 3);\n * // => [1, 2, 3]\n *\n * // using placeholders\n * curried(3)(1, _)(2);\n * // => [1, 2, 3]\n */\n var curryRight = createCurry(CURRY_RIGHT_FLAG);\n\n /**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed invocations. Provide an options object to indicate that `func`\n * should be invoked on the leading and/or trailing edge of the `wait` timeout.\n * Subsequent calls to the debounced function return the result of the last\n * `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n * on the trailing edge of the timeout only if the the debounced function is\n * invoked more than once during the `wait` timeout.\n *\n * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options] The options object.\n * @param {boolean} [options.leading=false] Specify invoking on the leading\n * edge of the timeout.\n * @param {number} [options.maxWait] The maximum time `func` is allowed to be\n * delayed before it is invoked.\n * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n * edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // avoid costly calculations while the window size is in flux\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // invoke `sendMail` when the click event is fired, debouncing subsequent calls\n * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // ensure `batchLog` is invoked once after 1 second of debounced calls\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', _.debounce(batchLog, 250, {\n * 'maxWait': 1000\n * }));\n *\n * // cancel a debounced call\n * var todoChanges = _.debounce(batchLog, 1000);\n * Object.observe(models.todo, todoChanges);\n *\n * Object.observe(models, function(changes) {\n * if (_.find(changes, { 'user': 'todo', 'type': 'delete'})) {\n * todoChanges.cancel();\n * }\n * }, ['delete']);\n *\n * // ...at some point `models.todo` is changed\n * models.todo.completed = true;\n *\n * // ...before 1 second has passed `models.todo` is deleted\n * // which cancels the debounced `todoChanges` call\n * delete models.todo;\n */\n function debounce(func, wait, options) {\n var args,\n maxTimeoutId,\n result,\n stamp,\n thisArg,\n timeoutId,\n trailingCall,\n lastCalled = 0,\n maxWait = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = wait < 0 ? 0 : (+wait || 0);\n if (options === true) {\n var leading = true;\n trailing = false;\n } else if (isObject(options)) {\n leading = !!options.leading;\n maxWait = 'maxWait' in options && nativeMax(+options.maxWait || 0, wait);\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function cancel() {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n if (maxTimeoutId) {\n clearTimeout(maxTimeoutId);\n }\n lastCalled = 0;\n maxTimeoutId = timeoutId = trailingCall = undefined;\n }\n\n function complete(isCalled, id) {\n if (id) {\n clearTimeout(id);\n }\n maxTimeoutId = timeoutId = trailingCall = undefined;\n if (isCalled) {\n lastCalled = now();\n result = func.apply(thisArg, args);\n if (!timeoutId && !maxTimeoutId) {\n args = thisArg = undefined;\n }\n }\n }\n\n function delayed() {\n var remaining = wait - (now() - stamp);\n if (remaining <= 0 || remaining > wait) {\n complete(trailingCall, maxTimeoutId);\n } else {\n timeoutId = setTimeout(delayed, remaining);\n }\n }\n\n function maxDelayed() {\n complete(trailing, timeoutId);\n }\n\n function debounced() {\n args = arguments;\n stamp = now();\n thisArg = this;\n trailingCall = trailing && (timeoutId || !leading);\n\n if (maxWait === false) {\n var leadingCall = leading && !timeoutId;\n } else {\n if (!maxTimeoutId && !leading) {\n lastCalled = stamp;\n }\n var remaining = maxWait - (stamp - lastCalled),\n isCalled = remaining <= 0 || remaining > maxWait;\n\n if (isCalled) {\n if (maxTimeoutId) {\n maxTimeoutId = clearTimeout(maxTimeoutId);\n }\n lastCalled = stamp;\n result = func.apply(thisArg, args);\n }\n else if (!maxTimeoutId) {\n maxTimeoutId = setTimeout(maxDelayed, remaining);\n }\n }\n if (isCalled && timeoutId) {\n timeoutId = clearTimeout(timeoutId);\n }\n else if (!timeoutId && wait !== maxWait) {\n timeoutId = setTimeout(delayed, wait);\n }\n if (leadingCall) {\n isCalled = true;\n result = func.apply(thisArg, args);\n }\n if (isCalled && !timeoutId && !maxTimeoutId) {\n args = thisArg = undefined;\n }\n return result;\n }\n debounced.cancel = cancel;\n return debounced;\n }\n\n /**\n * Defers invoking the `func` until the current call stack has cleared. Any\n * additional arguments are provided to `func` when it is invoked.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to defer.\n * @param {...*} [args] The arguments to invoke the function with.\n * @returns {number} Returns the timer id.\n * @example\n *\n * _.defer(function(text) {\n * console.log(text);\n * }, 'deferred');\n * // logs 'deferred' after one or more milliseconds\n */\n var defer = restParam(function(func, args) {\n return baseDelay(func, 1, args);\n });\n\n /**\n * Invokes `func` after `wait` milliseconds. Any additional arguments are\n * provided to `func` when it is invoked.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @param {...*} [args] The arguments to invoke the function with.\n * @returns {number} Returns the timer id.\n * @example\n *\n * _.delay(function(text) {\n * console.log(text);\n * }, 1000, 'later');\n * // => logs 'later' after one second\n */\n var delay = restParam(function(func, wait, args) {\n return baseDelay(func, wait, args);\n });\n\n /**\n * Creates a function that returns the result of invoking the provided\n * functions with the `this` binding of the created function, where each\n * successive invocation is supplied the return value of the previous.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {...Function} [funcs] Functions to invoke.\n * @returns {Function} Returns the new function.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var addSquare = _.flow(_.add, square);\n * addSquare(1, 2);\n * // => 9\n */\n var flow = createFlow();\n\n /**\n * This method is like `_.flow` except that it creates a function that\n * invokes the provided functions from right to left.\n *\n * @static\n * @memberOf _\n * @alias backflow, compose\n * @category Function\n * @param {...Function} [funcs] Functions to invoke.\n * @returns {Function} Returns the new function.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var addSquare = _.flowRight(square, _.add);\n * addSquare(1, 2);\n * // => 9\n */\n var flowRight = createFlow(true);\n\n /**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is coerced to a string and used as the\n * cache key. The `func` is invoked with the `this` binding of the memoized\n * function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the [`Map`](http://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoizing function.\n * @example\n *\n * var upperCase = _.memoize(function(string) {\n * return string.toUpperCase();\n * });\n *\n * upperCase('fred');\n * // => 'FRED'\n *\n * // modifying the result cache\n * upperCase.cache.set('fred', 'BARNEY');\n * upperCase('fred');\n * // => 'BARNEY'\n *\n * // replacing `_.memoize.Cache`\n * var object = { 'user': 'fred' };\n * var other = { 'user': 'barney' };\n * var identity = _.memoize(_.identity);\n *\n * identity(object);\n * // => { 'user': 'fred' }\n * identity(other);\n * // => { 'user': 'fred' }\n *\n * _.memoize.Cache = WeakMap;\n * var identity = _.memoize(_.identity);\n *\n * identity(object);\n * // => { 'user': 'fred' }\n * identity(other);\n * // => { 'user': 'barney' }\n */\n function memoize(func, resolver) {\n if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result);\n return result;\n };\n memoized.cache = new memoize.Cache;\n return memoized;\n }\n\n /**\n * Creates a function that runs each argument through a corresponding\n * transform function.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to wrap.\n * @param {...(Function|Function[])} [transforms] The functions to transform\n * arguments, specified as individual functions or arrays of functions.\n * @returns {Function} Returns the new function.\n * @example\n *\n * function doubled(n) {\n * return n * 2;\n * }\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var modded = _.modArgs(function(x, y) {\n * return [x, y];\n * }, square, doubled);\n *\n * modded(1, 2);\n * // => [1, 4]\n *\n * modded(5, 10);\n * // => [25, 20]\n */\n var modArgs = restParam(function(func, transforms) {\n transforms = baseFlatten(transforms);\n if (typeof func != 'function' || !arrayEvery(transforms, baseIsFunction)) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var length = transforms.length;\n return restParam(function(args) {\n var index = nativeMin(args.length, length);\n while (index--) {\n args[index] = transforms[index](args[index]);\n }\n return func.apply(this, args);\n });\n });\n\n /**\n * Creates a function that negates the result of the predicate `func`. The\n * `func` predicate is invoked with the `this` binding and arguments of the\n * created function.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} predicate The predicate to negate.\n * @returns {Function} Returns the new function.\n * @example\n *\n * function isEven(n) {\n * return n % 2 == 0;\n * }\n *\n * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n * // => [1, 3, 5]\n */\n function negate(predicate) {\n if (typeof predicate != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return function() {\n return !predicate.apply(this, arguments);\n };\n }\n\n /**\n * Creates a function that is restricted to invoking `func` once. Repeat calls\n * to the function return the value of the first call. The `func` is invoked\n * with the `this` binding and arguments of the created function.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * var initialize = _.once(createApplication);\n * initialize();\n * initialize();\n * // `initialize` invokes `createApplication` once\n */\n function once(func) {\n return before(2, func);\n }\n\n /**\n * Creates a function that invokes `func` with `partial` arguments prepended\n * to those provided to the new function. This method is like `_.bind` except\n * it does **not** alter the `this` binding.\n *\n * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * **Note:** This method does not set the \"length\" property of partially\n * applied functions.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to partially apply arguments to.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new partially applied function.\n * @example\n *\n * var greet = function(greeting, name) {\n * return greeting + ' ' + name;\n * };\n *\n * var sayHelloTo = _.partial(greet, 'hello');\n * sayHelloTo('fred');\n * // => 'hello fred'\n *\n * // using placeholders\n * var greetFred = _.partial(greet, _, 'fred');\n * greetFred('hi');\n * // => 'hi fred'\n */\n var partial = createPartial(PARTIAL_FLAG);\n\n /**\n * This method is like `_.partial` except that partially applied arguments\n * are appended to those provided to the new function.\n *\n * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * **Note:** This method does not set the \"length\" property of partially\n * applied functions.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to partially apply arguments to.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new partially applied function.\n * @example\n *\n * var greet = function(greeting, name) {\n * return greeting + ' ' + name;\n * };\n *\n * var greetFred = _.partialRight(greet, 'fred');\n * greetFred('hi');\n * // => 'hi fred'\n *\n * // using placeholders\n * var sayHelloTo = _.partialRight(greet, 'hello', _);\n * sayHelloTo('fred');\n * // => 'hello fred'\n */\n var partialRight = createPartial(PARTIAL_RIGHT_FLAG);\n\n /**\n * Creates a function that invokes `func` with arguments arranged according\n * to the specified indexes where the argument value at the first index is\n * provided as the first argument, the argument value at the second index is\n * provided as the second argument, and so on.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to rearrange arguments for.\n * @param {...(number|number[])} indexes The arranged argument indexes,\n * specified as individual indexes or arrays of indexes.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var rearged = _.rearg(function(a, b, c) {\n * return [a, b, c];\n * }, 2, 0, 1);\n *\n * rearged('b', 'c', 'a')\n * // => ['a', 'b', 'c']\n *\n * var map = _.rearg(_.map, [1, 0]);\n * map(function(n) {\n * return n * 3;\n * }, [1, 2, 3]);\n * // => [3, 6, 9]\n */\n var rearg = restParam(function(func, indexes) {\n return createWrapper(func, REARG_FLAG, undefined, undefined, undefined, baseFlatten(indexes));\n });\n\n /**\n * Creates a function that invokes `func` with the `this` binding of the\n * created function and arguments from `start` and beyond provided as an array.\n *\n * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters).\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.restParam(function(what, names) {\n * return what + ' ' + _.initial(names).join(', ') +\n * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n * });\n *\n * say('hello', 'fred', 'barney', 'pebbles');\n * // => 'hello fred, barney, & pebbles'\n */\n function restParam(func, start) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n start = nativeMax(start === undefined ? (func.length - 1) : (+start || 0), 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n rest = Array(length);\n\n while (++index < length) {\n rest[index] = args[start + index];\n }\n switch (start) {\n case 0: return func.call(this, rest);\n case 1: return func.call(this, args[0], rest);\n case 2: return func.call(this, args[0], args[1], rest);\n }\n var otherArgs = Array(start + 1);\n index = -1;\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = rest;\n return func.apply(this, otherArgs);\n };\n }\n\n /**\n * Creates a function that invokes `func` with the `this` binding of the created\n * function and an array of arguments much like [`Function#apply`](https://es5.github.io/#x15.3.4.3).\n *\n * **Note:** This method is based on the [spread operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator).\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to spread arguments over.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.spread(function(who, what) {\n * return who + ' says ' + what;\n * });\n *\n * say(['fred', 'hello']);\n * // => 'fred says hello'\n *\n * // with a Promise\n * var numbers = Promise.all([\n * Promise.resolve(40),\n * Promise.resolve(36)\n * ]);\n *\n * numbers.then(_.spread(function(x, y) {\n * return x + y;\n * }));\n * // => a Promise of 76\n */\n function spread(func) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return function(array) {\n return func.apply(this, array);\n };\n }\n\n /**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed invocations. Provide an options object to indicate\n * that `func` should be invoked on the leading and/or trailing edge of the\n * `wait` timeout. Subsequent calls to the throttled function return the\n * result of the last `func` call.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n * on the trailing edge of the timeout only if the the throttled function is\n * invoked more than once during the `wait` timeout.\n *\n * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options] The options object.\n * @param {boolean} [options.leading=true] Specify invoking on the leading\n * edge of the timeout.\n * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n * edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // avoid excessively updating the position while scrolling\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes\n * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\n * 'trailing': false\n * }));\n *\n * // cancel a trailing throttled call\n * jQuery(window).on('popstate', throttled.cancel);\n */\n function throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (options === false) {\n leading = false;\n } else if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, { 'leading': leading, 'maxWait': +wait, 'trailing': trailing });\n }\n\n /**\n * Creates a function that provides `value` to the wrapper function as its\n * first argument. Any additional arguments provided to the function are\n * appended to those provided to the wrapper function. The wrapper is invoked\n * with the `this` binding of the created function.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {*} value The value to wrap.\n * @param {Function} wrapper The wrapper function.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var p = _.wrap(_.escape, function(func, text) {\n * return '

' + func(text) + '

';\n * });\n *\n * p('fred, barney, & pebbles');\n * // => '

fred, barney, & pebbles

'\n */\n function wrap(value, wrapper) {\n wrapper = wrapper == null ? identity : wrapper;\n return createWrapper(wrapper, PARTIAL_FLAG, undefined, [value], []);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a clone of `value`. If `isDeep` is `true` nested objects are cloned,\n * otherwise they are assigned by reference. If `customizer` is provided it is\n * invoked to produce the cloned values. If `customizer` returns `undefined`\n * cloning is handled by the method instead. The `customizer` is bound to\n * `thisArg` and invoked with two argument; (value [, index|key, object]).\n *\n * **Note:** This method is loosely based on the\n * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).\n * The enumerable properties of `arguments` objects and objects created by\n * constructors other than `Object` are cloned to plain `Object` objects. An\n * empty object is returned for uncloneable values such as functions, DOM nodes,\n * Maps, Sets, and WeakMaps.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @param {Function} [customizer] The function to customize cloning values.\n * @param {*} [thisArg] The `this` binding of `customizer`.\n * @returns {*} Returns the cloned value.\n * @example\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * var shallow = _.clone(users);\n * shallow[0] === users[0];\n * // => true\n *\n * var deep = _.clone(users, true);\n * deep[0] === users[0];\n * // => false\n *\n * // using a customizer callback\n * var el = _.clone(document.body, function(value) {\n * if (_.isElement(value)) {\n * return value.cloneNode(false);\n * }\n * });\n *\n * el === document.body\n * // => false\n * el.nodeName\n * // => BODY\n * el.childNodes.length;\n * // => 0\n */\n function clone(value, isDeep, customizer, thisArg) {\n if (isDeep && typeof isDeep != 'boolean' && isIterateeCall(value, isDeep, customizer)) {\n isDeep = false;\n }\n else if (typeof isDeep == 'function') {\n thisArg = customizer;\n customizer = isDeep;\n isDeep = false;\n }\n return typeof customizer == 'function'\n ? baseClone(value, isDeep, bindCallback(customizer, thisArg, 1))\n : baseClone(value, isDeep);\n }\n\n /**\n * Creates a deep clone of `value`. If `customizer` is provided it is invoked\n * to produce the cloned values. If `customizer` returns `undefined` cloning\n * is handled by the method instead. The `customizer` is bound to `thisArg`\n * and invoked with two argument; (value [, index|key, object]).\n *\n * **Note:** This method is loosely based on the\n * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).\n * The enumerable properties of `arguments` objects and objects created by\n * constructors other than `Object` are cloned to plain `Object` objects. An\n * empty object is returned for uncloneable values such as functions, DOM nodes,\n * Maps, Sets, and WeakMaps.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to deep clone.\n * @param {Function} [customizer] The function to customize cloning values.\n * @param {*} [thisArg] The `this` binding of `customizer`.\n * @returns {*} Returns the deep cloned value.\n * @example\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * var deep = _.cloneDeep(users);\n * deep[0] === users[0];\n * // => false\n *\n * // using a customizer callback\n * var el = _.cloneDeep(document.body, function(value) {\n * if (_.isElement(value)) {\n * return value.cloneNode(true);\n * }\n * });\n *\n * el === document.body\n * // => false\n * el.nodeName\n * // => BODY\n * el.childNodes.length;\n * // => 20\n */\n function cloneDeep(value, customizer, thisArg) {\n return typeof customizer == 'function'\n ? baseClone(value, true, bindCallback(customizer, thisArg, 1))\n : baseClone(value, true);\n }\n\n /**\n * Checks if `value` is greater than `other`.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`, else `false`.\n * @example\n *\n * _.gt(3, 1);\n * // => true\n *\n * _.gt(3, 3);\n * // => false\n *\n * _.gt(1, 3);\n * // => false\n */\n function gt(value, other) {\n return value > other;\n }\n\n /**\n * Checks if `value` is greater than or equal to `other`.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than or equal to `other`, else `false`.\n * @example\n *\n * _.gte(3, 1);\n * // => true\n *\n * _.gte(3, 3);\n * // => true\n *\n * _.gte(1, 3);\n * // => false\n */\n function gte(value, other) {\n return value >= other;\n }\n\n /**\n * Checks if `value` is classified as an `arguments` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\n function isArguments(value) {\n return isObjectLike(value) && isArrayLike(value) &&\n hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');\n }\n\n /**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(function() { return arguments; }());\n * // => false\n */\n var isArray = nativeIsArray || function(value) {\n return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;\n };\n\n /**\n * Checks if `value` is classified as a boolean primitive or object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isBoolean(false);\n * // => true\n *\n * _.isBoolean(null);\n * // => false\n */\n function isBoolean(value) {\n return value === true || value === false || (isObjectLike(value) && objToString.call(value) == boolTag);\n }\n\n /**\n * Checks if `value` is classified as a `Date` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isDate(new Date);\n * // => true\n *\n * _.isDate('Mon April 23 2012');\n * // => false\n */\n function isDate(value) {\n return isObjectLike(value) && objToString.call(value) == dateTag;\n }\n\n /**\n * Checks if `value` is a DOM element.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n * @example\n *\n * _.isElement(document.body);\n * // => true\n *\n * _.isElement('');\n * // => false\n */\n function isElement(value) {\n return !!value && value.nodeType === 1 && isObjectLike(value) && !isPlainObject(value);\n }\n\n /**\n * Checks if `value` is empty. A value is considered empty unless it is an\n * `arguments` object, array, string, or jQuery-like collection with a length\n * greater than `0` or an object with own enumerable properties.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {Array|Object|string} value The value to inspect.\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n * @example\n *\n * _.isEmpty(null);\n * // => true\n *\n * _.isEmpty(true);\n * // => true\n *\n * _.isEmpty(1);\n * // => true\n *\n * _.isEmpty([1, 2, 3]);\n * // => false\n *\n * _.isEmpty({ 'a': 1 });\n * // => false\n */\n function isEmpty(value) {\n if (value == null) {\n return true;\n }\n if (isArrayLike(value) && (isArray(value) || isString(value) || isArguments(value) ||\n (isObjectLike(value) && isFunction(value.splice)))) {\n return !value.length;\n }\n return !keys(value).length;\n }\n\n /**\n * Performs a deep comparison between two values to determine if they are\n * equivalent. If `customizer` is provided it is invoked to compare values.\n * If `customizer` returns `undefined` comparisons are handled by the method\n * instead. The `customizer` is bound to `thisArg` and invoked with three\n * arguments: (value, other [, index|key]).\n *\n * **Note:** This method supports comparing arrays, booleans, `Date` objects,\n * numbers, `Object` objects, regexes, and strings. Objects are compared by\n * their own, not inherited, enumerable properties. Functions and DOM nodes\n * are **not** supported. Provide a customizer function to extend support\n * for comparing other values.\n *\n * @static\n * @memberOf _\n * @alias eq\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize value comparisons.\n * @param {*} [thisArg] The `this` binding of `customizer`.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'user': 'fred' };\n * var other = { 'user': 'fred' };\n *\n * object == other;\n * // => false\n *\n * _.isEqual(object, other);\n * // => true\n *\n * // using a customizer callback\n * var array = ['hello', 'goodbye'];\n * var other = ['hi', 'goodbye'];\n *\n * _.isEqual(array, other, function(value, other) {\n * if (_.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/)) {\n * return true;\n * }\n * });\n * // => true\n */\n function isEqual(value, other, customizer, thisArg) {\n customizer = typeof customizer == 'function' ? bindCallback(customizer, thisArg, 3) : undefined;\n var result = customizer ? customizer(value, other) : undefined;\n return result === undefined ? baseIsEqual(value, other, customizer) : !!result;\n }\n\n /**\n * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n * `SyntaxError`, `TypeError`, or `URIError` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n * @example\n *\n * _.isError(new Error);\n * // => true\n *\n * _.isError(Error);\n * // => false\n */\n function isError(value) {\n return isObjectLike(value) && typeof value.message == 'string' && objToString.call(value) == errorTag;\n }\n\n /**\n * Checks if `value` is a finite primitive number.\n *\n * **Note:** This method is based on [`Number.isFinite`](http://ecma-international.org/ecma-262/6.0/#sec-number.isfinite).\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n * @example\n *\n * _.isFinite(10);\n * // => true\n *\n * _.isFinite('10');\n * // => false\n *\n * _.isFinite(true);\n * // => false\n *\n * _.isFinite(Object(10));\n * // => false\n *\n * _.isFinite(Infinity);\n * // => false\n */\n function isFinite(value) {\n return typeof value == 'number' && nativeIsFinite(value);\n }\n\n /**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\n function isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in older versions of Chrome and Safari which return 'function' for regexes\n // and Safari 8 equivalents which return 'object' for typed array constructors.\n return isObject(value) && objToString.call(value) == funcTag;\n }\n\n /**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(1);\n * // => false\n */\n function isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n }\n\n /**\n * Performs a deep comparison between `object` and `source` to determine if\n * `object` contains equivalent property values. If `customizer` is provided\n * it is invoked to compare values. If `customizer` returns `undefined`\n * comparisons are handled by the method instead. The `customizer` is bound\n * to `thisArg` and invoked with three arguments: (value, other, index|key).\n *\n * **Note:** This method supports comparing properties of arrays, booleans,\n * `Date` objects, numbers, `Object` objects, regexes, and strings. Functions\n * and DOM nodes are **not** supported. Provide a customizer function to extend\n * support for comparing other values.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Function} [customizer] The function to customize value comparisons.\n * @param {*} [thisArg] The `this` binding of `customizer`.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n * @example\n *\n * var object = { 'user': 'fred', 'age': 40 };\n *\n * _.isMatch(object, { 'age': 40 });\n * // => true\n *\n * _.isMatch(object, { 'age': 36 });\n * // => false\n *\n * // using a customizer callback\n * var object = { 'greeting': 'hello' };\n * var source = { 'greeting': 'hi' };\n *\n * _.isMatch(object, source, function(value, other) {\n * return _.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/) || undefined;\n * });\n * // => true\n */\n function isMatch(object, source, customizer, thisArg) {\n customizer = typeof customizer == 'function' ? bindCallback(customizer, thisArg, 3) : undefined;\n return baseIsMatch(object, getMatchData(source), customizer);\n }\n\n /**\n * Checks if `value` is `NaN`.\n *\n * **Note:** This method is not the same as [`isNaN`](https://es5.github.io/#x15.1.2.4)\n * which returns `true` for `undefined` and other non-numeric values.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n * @example\n *\n * _.isNaN(NaN);\n * // => true\n *\n * _.isNaN(new Number(NaN));\n * // => true\n *\n * isNaN(undefined);\n * // => true\n *\n * _.isNaN(undefined);\n * // => false\n */\n function isNaN(value) {\n // An `NaN` primitive is the only value that is not equal to itself.\n // Perform the `toStringTag` check first to avoid errors with some host objects in IE.\n return isNumber(value) && value != +value;\n }\n\n /**\n * Checks if `value` is a native function.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function, else `false`.\n * @example\n *\n * _.isNative(Array.prototype.push);\n * // => true\n *\n * _.isNative(_);\n * // => false\n */\n function isNative(value) {\n if (value == null) {\n return false;\n }\n if (isFunction(value)) {\n return reIsNative.test(fnToString.call(value));\n }\n return isObjectLike(value) && reIsHostCtor.test(value);\n }\n\n /**\n * Checks if `value` is `null`.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n * @example\n *\n * _.isNull(null);\n * // => true\n *\n * _.isNull(void 0);\n * // => false\n */\n function isNull(value) {\n return value === null;\n }\n\n /**\n * Checks if `value` is classified as a `Number` primitive or object.\n *\n * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are classified\n * as numbers, use the `_.isFinite` method.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isNumber(8.4);\n * // => true\n *\n * _.isNumber(NaN);\n * // => true\n *\n * _.isNumber('8.4');\n * // => false\n */\n function isNumber(value) {\n return typeof value == 'number' || (isObjectLike(value) && objToString.call(value) == numberTag);\n }\n\n /**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * **Note:** This method assumes objects created by the `Object` constructor\n * have no inherited enumerable properties.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\n function isPlainObject(value) {\n var Ctor;\n\n // Exit early for non `Object` objects.\n if (!(isObjectLike(value) && objToString.call(value) == objectTag && !isArguments(value)) ||\n (!hasOwnProperty.call(value, 'constructor') && (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor)))) {\n return false;\n }\n // IE < 9 iterates inherited properties before own properties. If the first\n // iterated property is an object's own property then there are no inherited\n // enumerable properties.\n var result;\n // In most environments an object's own properties are iterated before\n // its inherited properties. If the last iterated property is an object's\n // own property then there are no inherited enumerable properties.\n baseForIn(value, function(subValue, key) {\n result = key;\n });\n return result === undefined || hasOwnProperty.call(value, result);\n }\n\n /**\n * Checks if `value` is classified as a `RegExp` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isRegExp(/abc/);\n * // => true\n *\n * _.isRegExp('/abc/');\n * // => false\n */\n function isRegExp(value) {\n return isObject(value) && objToString.call(value) == regexpTag;\n }\n\n /**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\n function isString(value) {\n return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag);\n }\n\n /**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\n function isTypedArray(value) {\n return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];\n }\n\n /**\n * Checks if `value` is `undefined`.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n * @example\n *\n * _.isUndefined(void 0);\n * // => true\n *\n * _.isUndefined(null);\n * // => false\n */\n function isUndefined(value) {\n return value === undefined;\n }\n\n /**\n * Checks if `value` is less than `other`.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`, else `false`.\n * @example\n *\n * _.lt(1, 3);\n * // => true\n *\n * _.lt(3, 3);\n * // => false\n *\n * _.lt(3, 1);\n * // => false\n */\n function lt(value, other) {\n return value < other;\n }\n\n /**\n * Checks if `value` is less than or equal to `other`.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than or equal to `other`, else `false`.\n * @example\n *\n * _.lte(1, 3);\n * // => true\n *\n * _.lte(3, 3);\n * // => true\n *\n * _.lte(3, 1);\n * // => false\n */\n function lte(value, other) {\n return value <= other;\n }\n\n /**\n * Converts `value` to an array.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Array} Returns the converted array.\n * @example\n *\n * (function() {\n * return _.toArray(arguments).slice(1);\n * }(1, 2, 3));\n * // => [2, 3]\n */\n function toArray(value) {\n var length = value ? getLength(value) : 0;\n if (!isLength(length)) {\n return values(value);\n }\n if (!length) {\n return [];\n }\n return arrayCopy(value);\n }\n\n /**\n * Converts `value` to a plain object flattening inherited enumerable\n * properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\n function toPlainObject(value) {\n return baseCopy(value, keysIn(value));\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Recursively merges own enumerable properties of the source object(s), that\n * don't resolve to `undefined` into the destination object. Subsequent sources\n * overwrite property assignments of previous sources. If `customizer` is\n * provided it is invoked to produce the merged values of the destination and\n * source properties. If `customizer` returns `undefined` merging is handled\n * by the method instead. The `customizer` is bound to `thisArg` and invoked\n * with five arguments: (objectValue, sourceValue, key, object, source).\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {*} [thisArg] The `this` binding of `customizer`.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var users = {\n * 'data': [{ 'user': 'barney' }, { 'user': 'fred' }]\n * };\n *\n * var ages = {\n * 'data': [{ 'age': 36 }, { 'age': 40 }]\n * };\n *\n * _.merge(users, ages);\n * // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] }\n *\n * // using a customizer callback\n * var object = {\n * 'fruits': ['apple'],\n * 'vegetables': ['beet']\n * };\n *\n * var other = {\n * 'fruits': ['banana'],\n * 'vegetables': ['carrot']\n * };\n *\n * _.merge(object, other, function(a, b) {\n * if (_.isArray(a)) {\n * return a.concat(b);\n * }\n * });\n * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] }\n */\n var merge = createAssigner(baseMerge);\n\n /**\n * Assigns own enumerable properties of source object(s) to the destination\n * object. Subsequent sources overwrite property assignments of previous sources.\n * If `customizer` is provided it is invoked to produce the assigned values.\n * The `customizer` is bound to `thisArg` and invoked with five arguments:\n * (objectValue, sourceValue, key, object, source).\n *\n * **Note:** This method mutates `object` and is based on\n * [`Object.assign`](http://ecma-international.org/ecma-262/6.0/#sec-object.assign).\n *\n * @static\n * @memberOf _\n * @alias extend\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {*} [thisArg] The `this` binding of `customizer`.\n * @returns {Object} Returns `object`.\n * @example\n *\n * _.assign({ 'user': 'barney' }, { 'age': 40 }, { 'user': 'fred' });\n * // => { 'user': 'fred', 'age': 40 }\n *\n * // using a customizer callback\n * var defaults = _.partialRight(_.assign, function(value, other) {\n * return _.isUndefined(value) ? other : value;\n * });\n *\n * defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });\n * // => { 'user': 'barney', 'age': 36 }\n */\n var assign = createAssigner(function(object, source, customizer) {\n return customizer\n ? assignWith(object, source, customizer)\n : baseAssign(object, source);\n });\n\n /**\n * Creates an object that inherits from the given `prototype` object. If a\n * `properties` object is provided its own enumerable properties are assigned\n * to the created object.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} prototype The object to inherit from.\n * @param {Object} [properties] The properties to assign to the object.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n * @returns {Object} Returns the new object.\n * @example\n *\n * function Shape() {\n * this.x = 0;\n * this.y = 0;\n * }\n *\n * function Circle() {\n * Shape.call(this);\n * }\n *\n * Circle.prototype = _.create(Shape.prototype, {\n * 'constructor': Circle\n * });\n *\n * var circle = new Circle;\n * circle instanceof Circle;\n * // => true\n *\n * circle instanceof Shape;\n * // => true\n */\n function create(prototype, properties, guard) {\n var result = baseCreate(prototype);\n if (guard && isIterateeCall(prototype, properties, guard)) {\n properties = undefined;\n }\n return properties ? baseAssign(result, properties) : result;\n }\n\n /**\n * Assigns own enumerable properties of source object(s) to the destination\n * object for all destination properties that resolve to `undefined`. Once a\n * property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * _.defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });\n * // => { 'user': 'barney', 'age': 36 }\n */\n var defaults = createDefaults(assign, assignDefaults);\n\n /**\n * This method is like `_.defaults` except that it recursively assigns\n * default properties.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * _.defaultsDeep({ 'user': { 'name': 'barney' } }, { 'user': { 'name': 'fred', 'age': 36 } });\n * // => { 'user': { 'name': 'barney', 'age': 36 } }\n *\n */\n var defaultsDeep = createDefaults(merge, mergeDefaults);\n\n /**\n * This method is like `_.find` except that it returns the key of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to search.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {string|undefined} Returns the key of the matched element, else `undefined`.\n * @example\n *\n * var users = {\n * 'barney': { 'age': 36, 'active': true },\n * 'fred': { 'age': 40, 'active': false },\n * 'pebbles': { 'age': 1, 'active': true }\n * };\n *\n * _.findKey(users, function(chr) {\n * return chr.age < 40;\n * });\n * // => 'barney' (iteration order is not guaranteed)\n *\n * // using the `_.matches` callback shorthand\n * _.findKey(users, { 'age': 1, 'active': true });\n * // => 'pebbles'\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.findKey(users, 'active', false);\n * // => 'fred'\n *\n * // using the `_.property` callback shorthand\n * _.findKey(users, 'active');\n * // => 'barney'\n */\n var findKey = createFindKey(baseForOwn);\n\n /**\n * This method is like `_.findKey` except that it iterates over elements of\n * a collection in the opposite order.\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to search.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {string|undefined} Returns the key of the matched element, else `undefined`.\n * @example\n *\n * var users = {\n * 'barney': { 'age': 36, 'active': true },\n * 'fred': { 'age': 40, 'active': false },\n * 'pebbles': { 'age': 1, 'active': true }\n * };\n *\n * _.findLastKey(users, function(chr) {\n * return chr.age < 40;\n * });\n * // => returns `pebbles` assuming `_.findKey` returns `barney`\n *\n * // using the `_.matches` callback shorthand\n * _.findLastKey(users, { 'age': 36, 'active': true });\n * // => 'barney'\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.findLastKey(users, 'active', false);\n * // => 'fred'\n *\n * // using the `_.property` callback shorthand\n * _.findLastKey(users, 'active');\n * // => 'pebbles'\n */\n var findLastKey = createFindKey(baseForOwnRight);\n\n /**\n * Iterates over own and inherited enumerable properties of an object invoking\n * `iteratee` for each property. The `iteratee` is bound to `thisArg` and invoked\n * with three arguments: (value, key, object). Iteratee functions may exit\n * iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Object} Returns `object`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forIn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => logs 'a', 'b', and 'c' (iteration order is not guaranteed)\n */\n var forIn = createForIn(baseFor);\n\n /**\n * This method is like `_.forIn` except that it iterates over properties of\n * `object` in the opposite order.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Object} Returns `object`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forInRight(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => logs 'c', 'b', and 'a' assuming `_.forIn ` logs 'a', 'b', and 'c'\n */\n var forInRight = createForIn(baseForRight);\n\n /**\n * Iterates over own enumerable properties of an object invoking `iteratee`\n * for each property. The `iteratee` is bound to `thisArg` and invoked with\n * three arguments: (value, key, object). Iteratee functions may exit iteration\n * early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Object} Returns `object`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => logs 'a' and 'b' (iteration order is not guaranteed)\n */\n var forOwn = createForOwn(baseForOwn);\n\n /**\n * This method is like `_.forOwn` except that it iterates over properties of\n * `object` in the opposite order.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Object} Returns `object`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwnRight(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => logs 'b' and 'a' assuming `_.forOwn` logs 'a' and 'b'\n */\n var forOwnRight = createForOwn(baseForOwnRight);\n\n /**\n * Creates an array of function property names from all enumerable properties,\n * own and inherited, of `object`.\n *\n * @static\n * @memberOf _\n * @alias methods\n * @category Object\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns the new array of property names.\n * @example\n *\n * _.functions(_);\n * // => ['after', 'ary', 'assign', ...]\n */\n function functions(object) {\n return baseFunctions(object, keysIn(object));\n }\n\n /**\n * Gets the property value at `path` of `object`. If the resolved value is\n * `undefined` the `defaultValue` is used in its place.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned if the resolved value is `undefined`.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\n function get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, toPath(path), path + '');\n return result === undefined ? defaultValue : result;\n }\n\n /**\n * Checks if `path` is a direct property.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` is a direct property, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': { 'c': 3 } } };\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b.c');\n * // => true\n *\n * _.has(object, ['a', 'b', 'c']);\n * // => true\n */\n function has(object, path) {\n if (object == null) {\n return false;\n }\n var result = hasOwnProperty.call(object, path);\n if (!result && !isKey(path)) {\n path = toPath(path);\n object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));\n if (object == null) {\n return false;\n }\n path = last(path);\n result = hasOwnProperty.call(object, path);\n }\n return result || (isLength(object.length) && isIndex(path, object.length) &&\n (isArray(object) || isArguments(object)));\n }\n\n /**\n * Creates an object composed of the inverted keys and values of `object`.\n * If `object` contains duplicate values, subsequent values overwrite property\n * assignments of previous values unless `multiValue` is `true`.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to invert.\n * @param {boolean} [multiValue] Allow multiple values per key.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n * @returns {Object} Returns the new inverted object.\n * @example\n *\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\n *\n * _.invert(object);\n * // => { '1': 'c', '2': 'b' }\n *\n * // with `multiValue`\n * _.invert(object, true);\n * // => { '1': ['a', 'c'], '2': ['b'] }\n */\n function invert(object, multiValue, guard) {\n if (guard && isIterateeCall(object, multiValue, guard)) {\n multiValue = undefined;\n }\n var index = -1,\n props = keys(object),\n length = props.length,\n result = {};\n\n while (++index < length) {\n var key = props[index],\n value = object[key];\n\n if (multiValue) {\n if (hasOwnProperty.call(result, value)) {\n result[value].push(key);\n } else {\n result[value] = [key];\n }\n }\n else {\n result[value] = key;\n }\n }\n return result;\n }\n\n /**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\n var keys = !nativeKeys ? shimKeys : function(object) {\n var Ctor = object == null ? undefined : object.constructor;\n if ((typeof Ctor == 'function' && Ctor.prototype === object) ||\n (typeof object != 'function' && isArrayLike(object))) {\n return shimKeys(object);\n }\n return isObject(object) ? nativeKeys(object) : [];\n };\n\n /**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\n function keysIn(object) {\n if (object == null) {\n return [];\n }\n if (!isObject(object)) {\n object = Object(object);\n }\n var length = object.length;\n length = (length && isLength(length) &&\n (isArray(object) || isArguments(object)) && length) || 0;\n\n var Ctor = object.constructor,\n index = -1,\n isProto = typeof Ctor == 'function' && Ctor.prototype === object,\n result = Array(length),\n skipIndexes = length > 0;\n\n while (++index < length) {\n result[index] = (index + '');\n }\n for (var key in object) {\n if (!(skipIndexes && isIndex(key, length)) &&\n !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * The opposite of `_.mapValues`; this method creates an object with the\n * same values as `object` and keys generated by running each own enumerable\n * property of `object` through `iteratee`.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Object} Returns the new mapped object.\n * @example\n *\n * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n * return key + value;\n * });\n * // => { 'a1': 1, 'b2': 2 }\n */\n var mapKeys = createObjectMapper(true);\n\n /**\n * Creates an object with the same keys as `object` and values generated by\n * running each own enumerable property of `object` through `iteratee`. The\n * iteratee function is bound to `thisArg` and invoked with three arguments:\n * (value, key, object).\n *\n * If a property name is provided for `iteratee` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `iteratee` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Object} Returns the new mapped object.\n * @example\n *\n * _.mapValues({ 'a': 1, 'b': 2 }, function(n) {\n * return n * 3;\n * });\n * // => { 'a': 3, 'b': 6 }\n *\n * var users = {\n * 'fred': { 'user': 'fred', 'age': 40 },\n * 'pebbles': { 'user': 'pebbles', 'age': 1 }\n * };\n *\n * // using the `_.property` callback shorthand\n * _.mapValues(users, 'age');\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n */\n var mapValues = createObjectMapper();\n\n /**\n * The opposite of `_.pick`; this method creates an object composed of the\n * own and inherited enumerable properties of `object` that are not omitted.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {Function|...(string|string[])} [predicate] The function invoked per\n * iteration or property names to omit, specified as individual property\n * names or arrays of property names.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'user': 'fred', 'age': 40 };\n *\n * _.omit(object, 'age');\n * // => { 'user': 'fred' }\n *\n * _.omit(object, _.isNumber);\n * // => { 'user': 'fred' }\n */\n var omit = restParam(function(object, props) {\n if (object == null) {\n return {};\n }\n if (typeof props[0] != 'function') {\n var props = arrayMap(baseFlatten(props), String);\n return pickByArray(object, baseDifference(keysIn(object), props));\n }\n var predicate = bindCallback(props[0], props[1], 3);\n return pickByCallback(object, function(value, key, object) {\n return !predicate(value, key, object);\n });\n });\n\n /**\n * Creates a two dimensional array of the key-value pairs for `object`,\n * e.g. `[[key1, value1], [key2, value2]]`.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the new array of key-value pairs.\n * @example\n *\n * _.pairs({ 'barney': 36, 'fred': 40 });\n * // => [['barney', 36], ['fred', 40]] (iteration order is not guaranteed)\n */\n function pairs(object) {\n object = toObject(object);\n\n var index = -1,\n props = keys(object),\n length = props.length,\n result = Array(length);\n\n while (++index < length) {\n var key = props[index];\n result[index] = [key, object[key]];\n }\n return result;\n }\n\n /**\n * Creates an object composed of the picked `object` properties. Property\n * names may be specified as individual arguments or as arrays of property\n * names. If `predicate` is provided it is invoked for each property of `object`\n * picking the properties `predicate` returns truthy for. The predicate is\n * bound to `thisArg` and invoked with three arguments: (value, key, object).\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {Function|...(string|string[])} [predicate] The function invoked per\n * iteration or property names to pick, specified as individual property\n * names or arrays of property names.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'user': 'fred', 'age': 40 };\n *\n * _.pick(object, 'user');\n * // => { 'user': 'fred' }\n *\n * _.pick(object, _.isString);\n * // => { 'user': 'fred' }\n */\n var pick = restParam(function(object, props) {\n if (object == null) {\n return {};\n }\n return typeof props[0] == 'function'\n ? pickByCallback(object, bindCallback(props[0], props[1], 3))\n : pickByArray(object, baseFlatten(props));\n });\n\n /**\n * This method is like `_.get` except that if the resolved value is a function\n * it is invoked with the `this` binding of its parent object and its result\n * is returned.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to resolve.\n * @param {*} [defaultValue] The value returned if the resolved value is `undefined`.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n *\n * _.result(object, 'a[0].b.c1');\n * // => 3\n *\n * _.result(object, 'a[0].b.c2');\n * // => 4\n *\n * _.result(object, 'a.b.c', 'default');\n * // => 'default'\n *\n * _.result(object, 'a.b.c', _.constant('default'));\n * // => 'default'\n */\n function result(object, path, defaultValue) {\n var result = object == null ? undefined : object[path];\n if (result === undefined) {\n if (object != null && !isKey(path, object)) {\n path = toPath(path);\n object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));\n result = object == null ? undefined : object[last(path)];\n }\n result = result === undefined ? defaultValue : result;\n }\n return isFunction(result) ? result.call(object) : result;\n }\n\n /**\n * Sets the property value of `path` on `object`. If a portion of `path`\n * does not exist it is created.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to augment.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.set(object, 'a[0].b.c', 4);\n * console.log(object.a[0].b.c);\n * // => 4\n *\n * _.set(object, 'x[0].y.z', 5);\n * console.log(object.x[0].y.z);\n * // => 5\n */\n function set(object, path, value) {\n if (object == null) {\n return object;\n }\n var pathKey = (path + '');\n path = (object[pathKey] != null || isKey(path, object)) ? [pathKey] : toPath(path);\n\n var index = -1,\n length = path.length,\n lastIndex = length - 1,\n nested = object;\n\n while (nested != null && ++index < length) {\n var key = path[index];\n if (isObject(nested)) {\n if (index == lastIndex) {\n nested[key] = value;\n } else if (nested[key] == null) {\n nested[key] = isIndex(path[index + 1]) ? [] : {};\n }\n }\n nested = nested[key];\n }\n return object;\n }\n\n /**\n * An alternative to `_.reduce`; this method transforms `object` to a new\n * `accumulator` object which is the result of running each of its own enumerable\n * properties through `iteratee`, with each invocation potentially mutating\n * the `accumulator` object. The `iteratee` is bound to `thisArg` and invoked\n * with four arguments: (accumulator, value, key, object). Iteratee functions\n * may exit iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Array|Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The custom accumulator value.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {*} Returns the accumulated value.\n * @example\n *\n * _.transform([2, 3, 4], function(result, n) {\n * result.push(n *= n);\n * return n % 2 == 0;\n * });\n * // => [4, 9]\n *\n * _.transform({ 'a': 1, 'b': 2 }, function(result, n, key) {\n * result[key] = n * 3;\n * });\n * // => { 'a': 3, 'b': 6 }\n */\n function transform(object, iteratee, accumulator, thisArg) {\n var isArr = isArray(object) || isTypedArray(object);\n iteratee = getCallback(iteratee, thisArg, 4);\n\n if (accumulator == null) {\n if (isArr || isObject(object)) {\n var Ctor = object.constructor;\n if (isArr) {\n accumulator = isArray(object) ? new Ctor : [];\n } else {\n accumulator = baseCreate(isFunction(Ctor) ? Ctor.prototype : undefined);\n }\n } else {\n accumulator = {};\n }\n }\n (isArr ? arrayEach : baseForOwn)(object, function(value, index, object) {\n return iteratee(accumulator, value, index, object);\n });\n return accumulator;\n }\n\n /**\n * Creates an array of the own enumerable property values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.values(new Foo);\n * // => [1, 2] (iteration order is not guaranteed)\n *\n * _.values('hi');\n * // => ['h', 'i']\n */\n function values(object) {\n return baseValues(object, keys(object));\n }\n\n /**\n * Creates an array of the own and inherited enumerable property values\n * of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.valuesIn(new Foo);\n * // => [1, 2, 3] (iteration order is not guaranteed)\n */\n function valuesIn(object) {\n return baseValues(object, keysIn(object));\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Checks if `n` is between `start` and up to but not including, `end`. If\n * `end` is not specified it is set to `start` with `start` then set to `0`.\n *\n * @static\n * @memberOf _\n * @category Number\n * @param {number} n The number to check.\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @returns {boolean} Returns `true` if `n` is in the range, else `false`.\n * @example\n *\n * _.inRange(3, 2, 4);\n * // => true\n *\n * _.inRange(4, 8);\n * // => true\n *\n * _.inRange(4, 2);\n * // => false\n *\n * _.inRange(2, 2);\n * // => false\n *\n * _.inRange(1.2, 2);\n * // => true\n *\n * _.inRange(5.2, 4);\n * // => false\n */\n function inRange(value, start, end) {\n start = +start || 0;\n if (end === undefined) {\n end = start;\n start = 0;\n } else {\n end = +end || 0;\n }\n return value >= nativeMin(start, end) && value < nativeMax(start, end);\n }\n\n /**\n * Produces a random number between `min` and `max` (inclusive). If only one\n * argument is provided a number between `0` and the given number is returned.\n * If `floating` is `true`, or either `min` or `max` are floats, a floating-point\n * number is returned instead of an integer.\n *\n * @static\n * @memberOf _\n * @category Number\n * @param {number} [min=0] The minimum possible value.\n * @param {number} [max=1] The maximum possible value.\n * @param {boolean} [floating] Specify returning a floating-point number.\n * @returns {number} Returns the random number.\n * @example\n *\n * _.random(0, 5);\n * // => an integer between 0 and 5\n *\n * _.random(5);\n * // => also an integer between 0 and 5\n *\n * _.random(5, true);\n * // => a floating-point number between 0 and 5\n *\n * _.random(1.2, 5.2);\n * // => a floating-point number between 1.2 and 5.2\n */\n function random(min, max, floating) {\n if (floating && isIterateeCall(min, max, floating)) {\n max = floating = undefined;\n }\n var noMin = min == null,\n noMax = max == null;\n\n if (floating == null) {\n if (noMax && typeof min == 'boolean') {\n floating = min;\n min = 1;\n }\n else if (typeof max == 'boolean') {\n floating = max;\n noMax = true;\n }\n }\n if (noMin && noMax) {\n max = 1;\n noMax = false;\n }\n min = +min || 0;\n if (noMax) {\n max = min;\n min = 0;\n } else {\n max = +max || 0;\n }\n if (floating || min % 1 || max % 1) {\n var rand = nativeRandom();\n return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand + '').length - 1)))), max);\n }\n return baseRandom(min, max);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the camel cased string.\n * @example\n *\n * _.camelCase('Foo Bar');\n * // => 'fooBar'\n *\n * _.camelCase('--foo-bar');\n * // => 'fooBar'\n *\n * _.camelCase('__foo_bar__');\n * // => 'fooBar'\n */\n var camelCase = createCompounder(function(result, word, index) {\n word = word.toLowerCase();\n return result + (index ? (word.charAt(0).toUpperCase() + word.slice(1)) : word);\n });\n\n /**\n * Capitalizes the first character of `string`.\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to capitalize.\n * @returns {string} Returns the capitalized string.\n * @example\n *\n * _.capitalize('fred');\n * // => 'Fred'\n */\n function capitalize(string) {\n string = baseToString(string);\n return string && (string.charAt(0).toUpperCase() + string.slice(1));\n }\n\n /**\n * Deburrs `string` by converting [latin-1 supplementary letters](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n * to basic latin letters and removing [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to deburr.\n * @returns {string} Returns the deburred string.\n * @example\n *\n * _.deburr('déjà vu');\n * // => 'deja vu'\n */\n function deburr(string) {\n string = baseToString(string);\n return string && string.replace(reLatin1, deburrLetter).replace(reComboMark, '');\n }\n\n /**\n * Checks if `string` ends with the given target string.\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to search.\n * @param {string} [target] The string to search for.\n * @param {number} [position=string.length] The position to search from.\n * @returns {boolean} Returns `true` if `string` ends with `target`, else `false`.\n * @example\n *\n * _.endsWith('abc', 'c');\n * // => true\n *\n * _.endsWith('abc', 'b');\n * // => false\n *\n * _.endsWith('abc', 'b', 2);\n * // => true\n */\n function endsWith(string, target, position) {\n string = baseToString(string);\n target = (target + '');\n\n var length = string.length;\n position = position === undefined\n ? length\n : nativeMin(position < 0 ? 0 : (+position || 0), length);\n\n position -= target.length;\n return position >= 0 && string.indexOf(target, position) == position;\n }\n\n /**\n * Converts the characters \"&\", \"<\", \">\", '\"', \"'\", and \"\\`\", in `string` to\n * their corresponding HTML entities.\n *\n * **Note:** No other characters are escaped. To escape additional characters\n * use a third-party library like [_he_](https://mths.be/he).\n *\n * Though the \">\" character is escaped for symmetry, characters like\n * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n * unless they're part of a tag or unquoted attribute value.\n * See [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n * (under \"semi-related fun fact\") for more details.\n *\n * Backticks are escaped because in Internet Explorer < 9, they can break out\n * of attribute values or HTML comments. See [#59](https://html5sec.org/#59),\n * [#102](https://html5sec.org/#102), [#108](https://html5sec.org/#108), and\n * [#133](https://html5sec.org/#133) of the [HTML5 Security Cheatsheet](https://html5sec.org/)\n * for more details.\n *\n * When working with HTML you should always [quote attribute values](http://wonko.com/post/html-escaping)\n * to reduce XSS vectors.\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escape('fred, barney, & pebbles');\n * // => 'fred, barney, & pebbles'\n */\n function escape(string) {\n // Reset `lastIndex` because in IE < 9 `String#replace` does not.\n string = baseToString(string);\n return (string && reHasUnescapedHtml.test(string))\n ? string.replace(reUnescapedHtml, escapeHtmlChar)\n : string;\n }\n\n /**\n * Escapes the `RegExp` special characters \"\\\", \"/\", \"^\", \"$\", \".\", \"|\", \"?\",\n * \"*\", \"+\", \"(\", \")\", \"[\", \"]\", \"{\" and \"}\" in `string`.\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escapeRegExp('[lodash](https://lodash.com/)');\n * // => '\\[lodash\\]\\(https:\\/\\/lodash\\.com\\/\\)'\n */\n function escapeRegExp(string) {\n string = baseToString(string);\n return (string && reHasRegExpChars.test(string))\n ? string.replace(reRegExpChars, escapeRegExpChar)\n : (string || '(?:)');\n }\n\n /**\n * Converts `string` to [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the kebab cased string.\n * @example\n *\n * _.kebabCase('Foo Bar');\n * // => 'foo-bar'\n *\n * _.kebabCase('fooBar');\n * // => 'foo-bar'\n *\n * _.kebabCase('__foo_bar__');\n * // => 'foo-bar'\n */\n var kebabCase = createCompounder(function(result, word, index) {\n return result + (index ? '-' : '') + word.toLowerCase();\n });\n\n /**\n * Pads `string` on the left and right sides if it's shorter than `length`.\n * Padding characters are truncated if they can't be evenly divided by `length`.\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.pad('abc', 8);\n * // => ' abc '\n *\n * _.pad('abc', 8, '_-');\n * // => '_-abc_-_'\n *\n * _.pad('abc', 3);\n * // => 'abc'\n */\n function pad(string, length, chars) {\n string = baseToString(string);\n length = +length;\n\n var strLength = string.length;\n if (strLength >= length || !nativeIsFinite(length)) {\n return string;\n }\n var mid = (length - strLength) / 2,\n leftLength = nativeFloor(mid),\n rightLength = nativeCeil(mid);\n\n chars = createPadding('', rightLength, chars);\n return chars.slice(0, leftLength) + string + chars;\n }\n\n /**\n * Pads `string` on the left side if it's shorter than `length`. Padding\n * characters are truncated if they exceed `length`.\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.padLeft('abc', 6);\n * // => ' abc'\n *\n * _.padLeft('abc', 6, '_-');\n * // => '_-_abc'\n *\n * _.padLeft('abc', 3);\n * // => 'abc'\n */\n var padLeft = createPadDir();\n\n /**\n * Pads `string` on the right side if it's shorter than `length`. Padding\n * characters are truncated if they exceed `length`.\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.padRight('abc', 6);\n * // => 'abc '\n *\n * _.padRight('abc', 6, '_-');\n * // => 'abc_-_'\n *\n * _.padRight('abc', 3);\n * // => 'abc'\n */\n var padRight = createPadDir(true);\n\n /**\n * Converts `string` to an integer of the specified radix. If `radix` is\n * `undefined` or `0`, a `radix` of `10` is used unless `value` is a hexadecimal,\n * in which case a `radix` of `16` is used.\n *\n * **Note:** This method aligns with the [ES5 implementation](https://es5.github.io/#E)\n * of `parseInt`.\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} string The string to convert.\n * @param {number} [radix] The radix to interpret `value` by.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.parseInt('08');\n * // => 8\n *\n * _.map(['6', '08', '10'], _.parseInt);\n * // => [6, 8, 10]\n */\n function parseInt(string, radix, guard) {\n // Firefox < 21 and Opera < 15 follow ES3 for `parseInt`.\n // Chrome fails to trim leading whitespace characters.\n // See https://code.google.com/p/v8/issues/detail?id=3109 for more details.\n if (guard ? isIterateeCall(string, radix, guard) : radix == null) {\n radix = 0;\n } else if (radix) {\n radix = +radix;\n }\n string = trim(string);\n return nativeParseInt(string, radix || (reHasHexPrefix.test(string) ? 16 : 10));\n }\n\n /**\n * Repeats the given string `n` times.\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to repeat.\n * @param {number} [n=0] The number of times to repeat the string.\n * @returns {string} Returns the repeated string.\n * @example\n *\n * _.repeat('*', 3);\n * // => '***'\n *\n * _.repeat('abc', 2);\n * // => 'abcabc'\n *\n * _.repeat('abc', 0);\n * // => ''\n */\n function repeat(string, n) {\n var result = '';\n string = baseToString(string);\n n = +n;\n if (n < 1 || !string || !nativeIsFinite(n)) {\n return result;\n }\n // Leverage the exponentiation by squaring algorithm for a faster repeat.\n // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n do {\n if (n % 2) {\n result += string;\n }\n n = nativeFloor(n / 2);\n string += string;\n } while (n);\n\n return result;\n }\n\n /**\n * Converts `string` to [snake case](https://en.wikipedia.org/wiki/Snake_case).\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the snake cased string.\n * @example\n *\n * _.snakeCase('Foo Bar');\n * // => 'foo_bar'\n *\n * _.snakeCase('fooBar');\n * // => 'foo_bar'\n *\n * _.snakeCase('--foo-bar');\n * // => 'foo_bar'\n */\n var snakeCase = createCompounder(function(result, word, index) {\n return result + (index ? '_' : '') + word.toLowerCase();\n });\n\n /**\n * Converts `string` to [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the start cased string.\n * @example\n *\n * _.startCase('--foo-bar');\n * // => 'Foo Bar'\n *\n * _.startCase('fooBar');\n * // => 'Foo Bar'\n *\n * _.startCase('__foo_bar__');\n * // => 'Foo Bar'\n */\n var startCase = createCompounder(function(result, word, index) {\n return result + (index ? ' ' : '') + (word.charAt(0).toUpperCase() + word.slice(1));\n });\n\n /**\n * Checks if `string` starts with the given target string.\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to search.\n * @param {string} [target] The string to search for.\n * @param {number} [position=0] The position to search from.\n * @returns {boolean} Returns `true` if `string` starts with `target`, else `false`.\n * @example\n *\n * _.startsWith('abc', 'a');\n * // => true\n *\n * _.startsWith('abc', 'b');\n * // => false\n *\n * _.startsWith('abc', 'b', 1);\n * // => true\n */\n function startsWith(string, target, position) {\n string = baseToString(string);\n position = position == null\n ? 0\n : nativeMin(position < 0 ? 0 : (+position || 0), string.length);\n\n return string.lastIndexOf(target, position) == position;\n }\n\n /**\n * Creates a compiled template function that can interpolate data properties\n * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n * properties may be accessed as free variables in the template. If a setting\n * object is provided it takes precedence over `_.templateSettings` values.\n *\n * **Note:** In the development build `_.template` utilizes\n * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n * for easier debugging.\n *\n * For more information on precompiling templates see\n * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n *\n * For more information on Chrome extension sandboxes see\n * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The template string.\n * @param {Object} [options] The options object.\n * @param {RegExp} [options.escape] The HTML \"escape\" delimiter.\n * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\n * @param {Object} [options.imports] An object to import into the template as free variables.\n * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\n * @param {string} [options.sourceURL] The sourceURL of the template's compiled source.\n * @param {string} [options.variable] The data object variable name.\n * @param- {Object} [otherOptions] Enables the legacy `options` param signature.\n * @returns {Function} Returns the compiled template function.\n * @example\n *\n * // using the \"interpolate\" delimiter to create a compiled template\n * var compiled = _.template('hello <%= user %>!');\n * compiled({ 'user': 'fred' });\n * // => 'hello fred!'\n *\n * // using the HTML \"escape\" delimiter to escape data property values\n * var compiled = _.template('<%- value %>');\n * compiled({ 'value': '