| 'use strict'; | 
|   | 
| var keysShim; | 
| if (!Object.keys) { | 
|     // modified from https://github.com/es-shims/es5-shim | 
|     var has = Object.prototype.hasOwnProperty; | 
|     var toStr = Object.prototype.toString; | 
|     var isArgs = require('./isArguments'); // eslint-disable-line global-require | 
|     var isEnumerable = Object.prototype.propertyIsEnumerable; | 
|     var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString'); | 
|     var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype'); | 
|     var dontEnums = [ | 
|         'toString', | 
|         'toLocaleString', | 
|         'valueOf', | 
|         'hasOwnProperty', | 
|         'isPrototypeOf', | 
|         'propertyIsEnumerable', | 
|         'constructor' | 
|     ]; | 
|     var equalsConstructorPrototype = function (o) { | 
|         var ctor = o.constructor; | 
|         return ctor && ctor.prototype === o; | 
|     }; | 
|     var excludedKeys = { | 
|         $applicationCache: true, | 
|         $console: true, | 
|         $external: true, | 
|         $frame: true, | 
|         $frameElement: true, | 
|         $frames: true, | 
|         $innerHeight: true, | 
|         $innerWidth: true, | 
|         $onmozfullscreenchange: true, | 
|         $onmozfullscreenerror: true, | 
|         $outerHeight: true, | 
|         $outerWidth: true, | 
|         $pageXOffset: true, | 
|         $pageYOffset: true, | 
|         $parent: true, | 
|         $scrollLeft: true, | 
|         $scrollTop: true, | 
|         $scrollX: true, | 
|         $scrollY: true, | 
|         $self: true, | 
|         $webkitIndexedDB: true, | 
|         $webkitStorageInfo: true, | 
|         $window: true | 
|     }; | 
|     var hasAutomationEqualityBug = (function () { | 
|         /* global window */ | 
|         if (typeof window === 'undefined') { return false; } | 
|         for (var k in window) { | 
|             try { | 
|                 if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') { | 
|                     try { | 
|                         equalsConstructorPrototype(window[k]); | 
|                     } catch (e) { | 
|                         return true; | 
|                     } | 
|                 } | 
|             } catch (e) { | 
|                 return true; | 
|             } | 
|         } | 
|         return false; | 
|     }()); | 
|     var equalsConstructorPrototypeIfNotBuggy = function (o) { | 
|         /* global window */ | 
|         if (typeof window === 'undefined' || !hasAutomationEqualityBug) { | 
|             return equalsConstructorPrototype(o); | 
|         } | 
|         try { | 
|             return equalsConstructorPrototype(o); | 
|         } catch (e) { | 
|             return false; | 
|         } | 
|     }; | 
|   | 
|     keysShim = function keys(object) { | 
|         var isObject = object !== null && typeof object === 'object'; | 
|         var isFunction = toStr.call(object) === '[object Function]'; | 
|         var isArguments = isArgs(object); | 
|         var isString = isObject && toStr.call(object) === '[object String]'; | 
|         var theKeys = []; | 
|   | 
|         if (!isObject && !isFunction && !isArguments) { | 
|             throw new TypeError('Object.keys called on a non-object'); | 
|         } | 
|   | 
|         var skipProto = hasProtoEnumBug && isFunction; | 
|         if (isString && object.length > 0 && !has.call(object, 0)) { | 
|             for (var i = 0; i < object.length; ++i) { | 
|                 theKeys.push(String(i)); | 
|             } | 
|         } | 
|   | 
|         if (isArguments && object.length > 0) { | 
|             for (var j = 0; j < object.length; ++j) { | 
|                 theKeys.push(String(j)); | 
|             } | 
|         } else { | 
|             for (var name in object) { | 
|                 if (!(skipProto && name === 'prototype') && has.call(object, name)) { | 
|                     theKeys.push(String(name)); | 
|                 } | 
|             } | 
|         } | 
|   | 
|         if (hasDontEnumBug) { | 
|             var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object); | 
|   | 
|             for (var k = 0; k < dontEnums.length; ++k) { | 
|                 if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) { | 
|                     theKeys.push(dontEnums[k]); | 
|                 } | 
|             } | 
|         } | 
|         return theKeys; | 
|     }; | 
| } | 
| module.exports = keysShim; |