(function(){/*
 * SystemJS global script loading support
 * Extra for the s.js build only
 * (Included by default in system.js build)
 */
(function (global) {
  var systemJSPrototype = global.System.constructor.prototype;

  // safari unpredictably lists some new globals first or second in object order
  var firstGlobalProp, secondGlobalProp, lastGlobalProp;
  function getGlobalProp (useFirstGlobalProp) {
    var cnt = 0;
    var foundLastProp, result;
    for (var p in global) {
      // do not check frames cause it could be removed during import
      if (shouldSkipProperty(p))
        continue;
      if (cnt === 0 && p !== firstGlobalProp || cnt === 1 && p !== secondGlobalProp)
        return p;
      if (foundLastProp) {
        lastGlobalProp = p;
        result = useFirstGlobalProp && result || p;
      }
      else {
        foundLastProp = p === lastGlobalProp;
      }
      cnt++;
    }
    return result;
  }

  function noteGlobalProps () {
    // alternatively Object.keys(global).pop()
    // but this may be faster (pending benchmarks)
    firstGlobalProp = secondGlobalProp = undefined;
    for (var p in global) {
      // do not check frames cause it could be removed during import
      if (shouldSkipProperty(p))
        continue;
      if (!firstGlobalProp)
        firstGlobalProp = p;
      else if (!secondGlobalProp)
        secondGlobalProp = p;
      lastGlobalProp = p;
    }
    return lastGlobalProp;
  }

  var impt = systemJSPrototype.import;
  systemJSPrototype.import = function (id, parentUrl) {
    noteGlobalProps();
    return impt.call(this, id, parentUrl);
  };

  var emptyInstantiation = [[], function () { return {} }];

  var getRegister = systemJSPrototype.getRegister;
  systemJSPrototype.getRegister = function () {
    var lastRegister = getRegister.call(this);
    if (lastRegister)
      return lastRegister;

    // no registration -> attempt a global detection as difference from snapshot
    // when multiple globals, we take the global value to be the last defined new global object property
    // for performance, this will not support multi-version / global collisions as previous SystemJS versions did
    // note in Edge, deleting and re-adding a global does not change its ordering
    var globalProp = getGlobalProp(this.firstGlobalProp);
    if (!globalProp)
      return emptyInstantiation;

    var globalExport;
    try {
      globalExport = global[globalProp];
    }
    catch (e) {
      return emptyInstantiation;
    }

    return [[], function (_export) {
      return {
        execute: function () {
          _export(globalExport);
          _export({ default: globalExport, __useDefault: true });
        }
      };
    }];
  };

  var isIE11 = typeof navigator !== 'undefined' && navigator.userAgent.indexOf('Trident') !== -1;

  function shouldSkipProperty(p) {
    return !global.hasOwnProperty(p)
      || !isNaN(p) && p < global.length
      || isIE11 && global[p] && typeof window !== 'undefined' && global[p].parent === window;
  }
})(typeof self !== 'undefined' ? self : global);})();