]> git.proxmox.com Git - mirror_novnc.git/blobdiff - vendor/browser-es-module-loader/dist/browser-es-module-loader.js
Better currentScript fallback
[mirror_novnc.git] / vendor / browser-es-module-loader / dist / browser-es-module-loader.js
index 3aa2e5168222f5023babfe01a2e08b985f59da4e..0c9887ce384e1aede8b66140197c9aba9bc4c98c 100644 (file)
        (global.BrowserESModuleLoader = factory());
 }(this, (function () { 'use strict';
 
-/*
- * Environment
- */
-var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';
-var isNode = typeof process !== 'undefined' && process.versions && process.versions.node;
-var isWindows = typeof process !== 'undefined' && typeof process.platform === 'string' && process.platform.match(/^win/);
-
-var envGlobal = typeof self !== 'undefined' ? self : global;
-/*
- * Simple Symbol() shim
- */
-var hasSymbol = typeof Symbol !== 'undefined';
-function createSymbol (name) {
-  return hasSymbol ? Symbol() : '@@' + name;
-}
-
-
-
-
-
-/*
- * Environment baseURI
- */
-var baseURI;
-
-// environent baseURI detection
-if (typeof document != 'undefined' && document.getElementsByTagName) {
-  baseURI = document.baseURI;
-
-  if (!baseURI) {
-    var bases = document.getElementsByTagName('base');
-    baseURI = bases[0] && bases[0].href || window.location.href;
-  }
-}
-else if (typeof location != 'undefined') {
-  baseURI = location.href;
-}
-
-// sanitize out the hash and querystring
-if (baseURI) {
-  baseURI = baseURI.split('#')[0].split('?')[0];
-  var slashIndex = baseURI.lastIndexOf('/');
-  if (slashIndex !== -1)
-    baseURI = baseURI.substr(0, slashIndex + 1);
-}
-else if (typeof process !== 'undefined' && process.cwd) {
-  baseURI = 'file://' + (isWindows ? '/' : '') + process.cwd();
-  if (isWindows)
-    baseURI = baseURI.replace(/\\/g, '/');
-}
-else {
-  throw new TypeError('No environment baseURI');
-}
-
-// ensure baseURI has trailing "/"
-if (baseURI[baseURI.length - 1] !== '/')
-  baseURI += '/';
-
-/*
- * LoaderError with chaining for loader stacks
- */
-var errArgs = new Error(0, '_').fileName == '_';
-function LoaderError__Check_error_message_for_loader_stack (childErr, newMessage) {
-  // Convert file:/// URLs to paths in Node
-  if (!isBrowser)
-    newMessage = newMessage.replace(isWindows ? /file:\/\/\//g : /file:\/\//g, '');
-
-  var message = (childErr.message || childErr) + '\n  ' + newMessage;
-
-  var err;
-  if (errArgs && childErr.fileName)
-    err = new Error(message, childErr.fileName, childErr.lineNumber);
-  else
-    err = new Error(message);
-
-
-  var stack = childErr.originalErr ? childErr.originalErr.stack : childErr.stack;
-
-  if (isNode)
-    // node doesn't show the message otherwise
-    err.stack = message + '\n  ' + stack;
-  else
-    err.stack = stack;
-
-  err.originalErr = childErr.originalErr || childErr;
-
-  return err;
+/*\r
+ * Environment\r
+ */\r
+var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\r
+var isNode = typeof process !== 'undefined' && process.versions && process.versions.node;\r
+var isWindows = typeof process !== 'undefined' && typeof process.platform === 'string' && process.platform.match(/^win/);\r
+\r
+var envGlobal = typeof self !== 'undefined' ? self : global;\r
+/*\r
+ * Simple Symbol() shim\r
+ */\r
+var hasSymbol = typeof Symbol !== 'undefined';\r
+function createSymbol (name) {\r
+  return hasSymbol ? Symbol() : '@@' + name;\r
+}\r
+\r
+var toStringTag = hasSymbol && Symbol.toStringTag;\r
+\r
+\r
+\r
+\r
+\r
+/*\r
+ * Environment baseURI\r
+ */\r
+var baseURI;\r
+\r
+// environent baseURI detection\r
+if (typeof document != 'undefined' && document.getElementsByTagName) {\r
+  baseURI = document.baseURI;\r
+\r
+  if (!baseURI) {\r
+    var bases = document.getElementsByTagName('base');\r
+    baseURI = bases[0] && bases[0].href || window.location.href;\r
+  }\r
+}\r
+else if (typeof location != 'undefined') {\r
+  baseURI = location.href;\r
+}\r
+\r
+// sanitize out the hash and querystring\r
+if (baseURI) {\r
+  baseURI = baseURI.split('#')[0].split('?')[0];\r
+  var slashIndex = baseURI.lastIndexOf('/');\r
+  if (slashIndex !== -1)\r
+    baseURI = baseURI.substr(0, slashIndex + 1);\r
+}\r
+else if (typeof process !== 'undefined' && process.cwd) {\r
+  baseURI = 'file://' + (isWindows ? '/' : '') + process.cwd();\r
+  if (isWindows)\r
+    baseURI = baseURI.replace(/\\/g, '/');\r
+}\r
+else {\r
+  throw new TypeError('No environment baseURI');\r
+}\r
+\r
+// ensure baseURI has trailing "/"\r
+if (baseURI[baseURI.length - 1] !== '/')\r
+  baseURI += '/';\r
+\r
+/*\r
+ * LoaderError with chaining for loader stacks\r
+ */\r
+var errArgs = new Error(0, '_').fileName == '_';\r
+function LoaderError__Check_error_message_for_loader_stack (childErr, newMessage) {\r
+  // Convert file:/// URLs to paths in Node\r
+  if (!isBrowser)\r
+    newMessage = newMessage.replace(isWindows ? /file:\/\/\//g : /file:\/\//g, '');\r
+\r
+  var message = (childErr.message || childErr) + '\n  ' + newMessage;\r
+\r
+  var err;\r
+  if (errArgs && childErr.fileName)\r
+    err = new Error(message, childErr.fileName, childErr.lineNumber);\r
+  else\r
+    err = new Error(message);\r
+\r
+\r
+  var stack = childErr.originalErr ? childErr.originalErr.stack : childErr.stack;\r
+\r
+  if (isNode)\r
+    // node doesn't show the message otherwise\r
+    err.stack = message + '\n  ' + stack;\r
+  else\r
+    err.stack = stack;\r
+\r
+  err.originalErr = childErr.originalErr || childErr;\r
+\r
+  return err;\r
 }
 
-var resolvedPromise = Promise.resolve();
-
-/*
- * Simple Array values shim
- */
-function arrayValues (arr) {
-  if (arr.values)
-    return arr.values();
-
-  if (typeof Symbol === 'undefined' || !Symbol.iterator)
-    throw new Error('Symbol.iterator not supported in this browser');
-
-  var iterable = {};
-  iterable[Symbol.iterator] = function () {
-    var keys = Object.keys(arr);
-    var keyIndex = 0;
-    return {
-      next: function () {
-        if (keyIndex < keys.length)
-          return {
-            value: arr[keys[keyIndex++]],
-            done: false
-          };
-        else
-          return {
-            value: undefined,
-            done: true
-          };
-      }
-    };
-  };
-  return iterable;
-}
-
-/*
- * 3. Reflect.Loader
- *
- * We skip the entire native internal pipeline, just providing the bare API
- */
-// 3.1.1
-function Loader () {
-  this.registry = new Registry();
-}
-// 3.3.1
-Loader.prototype.constructor = Loader;
-
-function ensureInstantiated (module) {
-  if (!(module instanceof ModuleNamespace))
-    throw new TypeError('Module instantiation did not return a valid namespace object.');
-  return module;
-}
-
-// 3.3.2
-Loader.prototype.import = function (key, parent) {
-  if (typeof key !== 'string')
-    throw new TypeError('Loader import method must be passed a module key string');
-  // custom resolveInstantiate combined hook for better perf
-  var loader = this;
-  return resolvedPromise
-  .then(function () {
-    return loader[RESOLVE_INSTANTIATE](key, parent);
-  })
-  .then(ensureInstantiated)
-  //.then(Module.evaluate)
-  .catch(function (err) {
-    throw LoaderError__Check_error_message_for_loader_stack(err, 'Loading ' + key + (parent ? ' from ' + parent : ''));
-  });
-};
-// 3.3.3
-var RESOLVE = Loader.resolve = createSymbol('resolve');
-
-/*
- * Combined resolve / instantiate hook
- *
- * Not in current reduced spec, but necessary to separate RESOLVE from RESOLVE + INSTANTIATE as described
- * in the spec notes of this repo to ensure that loader.resolve doesn't instantiate when not wanted.
- *
- * We implement RESOLVE_INSTANTIATE as a single hook instead of a separate INSTANTIATE in order to avoid
- * the need for double registry lookups as a performance optimization.
- */
-var RESOLVE_INSTANTIATE = Loader.resolveInstantiate = createSymbol('resolveInstantiate');
-
-// default resolveInstantiate is just to call resolve and then get from the registry
-// this provides compatibility for the resolveInstantiate optimization
-Loader.prototype[RESOLVE_INSTANTIATE] = function (key, parent) {
-  var loader = this;
-  return loader.resolve(key, parent)
-  .then(function (resolved) {
-    return loader.registry.get(resolved);
-  });
-};
-
-function ensureResolution (resolvedKey) {
-  if (resolvedKey === undefined)
-    throw new RangeError('No resolution found.');
-  return resolvedKey;
-}
-
-Loader.prototype.resolve = function (key, parent) {
-  var loader = this;
-  return resolvedPromise
-  .then(function() {
-    return loader[RESOLVE](key, parent);
-  })
-  .then(ensureResolution)
-  .catch(function (err) {
-    throw LoaderError__Check_error_message_for_loader_stack(err, 'Resolving ' + key + (parent ? ' to ' + parent : ''));
-  });
-};
-
-// 3.3.4 (import without evaluate)
-// this is not documented because the use of deferred evaluation as in Module.evaluate is not
-// documented, as it is not considered a stable feature to be encouraged
-// Loader.prototype.load may well be deprecated if this stays disabled
-/* Loader.prototype.load = function (key, parent) {
-  return Promise.resolve(this[RESOLVE_INSTANTIATE](key, parent || this.key))
-  .catch(function (err) {
-    throw addToError(err, 'Loading ' + key + (parent ? ' from ' + parent : ''));
-  });
+var resolvedPromise$1 = Promise.resolve();\r
+\r
+/*\r
+ * Simple Array values shim\r
+ */\r
+function arrayValues (arr) {\r
+  if (arr.values)\r
+    return arr.values();\r
+\r
+  if (typeof Symbol === 'undefined' || !Symbol.iterator)\r
+    throw new Error('Symbol.iterator not supported in this browser');\r
+\r
+  var iterable = {};\r
+  iterable[Symbol.iterator] = function () {\r
+    var keys = Object.keys(arr);\r
+    var keyIndex = 0;\r
+    return {\r
+      next: function () {\r
+        if (keyIndex < keys.length)\r
+          return {\r
+            value: arr[keys[keyIndex++]],\r
+            done: false\r
+          };\r
+        else\r
+          return {\r
+            value: undefined,\r
+            done: true\r
+          };\r
+      }\r
+    };\r
+  };\r
+  return iterable;\r
+}\r
+\r
+/*\r
+ * 3. Reflect.Loader\r
+ *\r
+ * We skip the entire native internal pipeline, just providing the bare API\r
+ */\r
+// 3.1.1\r
+function Loader () {\r
+  this.registry = new Registry();\r
+}\r
+// 3.3.1\r
+Loader.prototype.constructor = Loader;\r
+\r
+function ensureInstantiated (module) {\r
+  if (module === undefined)\r
+    return;\r
+  if (module instanceof ModuleNamespace === false && module[toStringTag] !== 'module')\r
+    throw new TypeError('Module instantiation did not return a valid namespace object.');\r
+  return module;\r
+}\r
+\r
+// 3.3.2\r
+Loader.prototype.import = function (key, parent) {\r
+  if (typeof key !== 'string')\r
+    throw new TypeError('Loader import method must be passed a module key string');\r
+  // custom resolveInstantiate combined hook for better perf\r
+  var loader = this;\r
+  return resolvedPromise$1\r
+  .then(function () {\r
+    return loader[RESOLVE_INSTANTIATE](key, parent);\r
+  })\r
+  .then(ensureInstantiated)\r
+  //.then(Module.evaluate)\r
+  .catch(function (err) {\r
+    throw LoaderError__Check_error_message_for_loader_stack(err, 'Loading ' + key + (parent ? ' from ' + parent : ''));\r
+  });\r
+};\r
+// 3.3.3\r
+var RESOLVE = Loader.resolve = createSymbol('resolve');\r
+\r
+/*\r
+ * Combined resolve / instantiate hook\r
+ *\r
+ * Not in current reduced spec, but necessary to separate RESOLVE from RESOLVE + INSTANTIATE as described\r
+ * in the spec notes of this repo to ensure that loader.resolve doesn't instantiate when not wanted.\r
+ *\r
+ * We implement RESOLVE_INSTANTIATE as a single hook instead of a separate INSTANTIATE in order to avoid\r
+ * the need for double registry lookups as a performance optimization.\r
+ */\r
+var RESOLVE_INSTANTIATE = Loader.resolveInstantiate = createSymbol('resolveInstantiate');\r
+\r
+// default resolveInstantiate is just to call resolve and then get from the registry\r
+// this provides compatibility for the resolveInstantiate optimization\r
+Loader.prototype[RESOLVE_INSTANTIATE] = function (key, parent) {\r
+  var loader = this;\r
+  return loader.resolve(key, parent)\r
+  .then(function (resolved) {\r
+    return loader.registry.get(resolved);\r
+  });\r
+};\r
+\r
+function ensureResolution (resolvedKey) {\r
+  if (resolvedKey === undefined)\r
+    throw new RangeError('No resolution found.');\r
+  return resolvedKey;\r
+}\r
+\r
+Loader.prototype.resolve = function (key, parent) {\r
+  var loader = this;\r
+  return resolvedPromise$1\r
+  .then(function() {\r
+    return loader[RESOLVE](key, parent);\r
+  })\r
+  .then(ensureResolution)\r
+  .catch(function (err) {\r
+    throw LoaderError__Check_error_message_for_loader_stack(err, 'Resolving ' + key + (parent ? ' to ' + parent : ''));\r
+  });\r
+};\r
+\r
+// 3.3.4 (import without evaluate)\r
+// this is not documented because the use of deferred evaluation as in Module.evaluate is not\r
+// documented, as it is not considered a stable feature to be encouraged\r
+// Loader.prototype.load may well be deprecated if this stays disabled\r
+/* Loader.prototype.load = function (key, parent) {\r
+  return Promise.resolve(this[RESOLVE_INSTANTIATE](key, parent || this.key))\r
+  .catch(function (err) {\r
+    throw addToError(err, 'Loading ' + key + (parent ? ' from ' + parent : ''));\r
+  });\r
+}; */\r
+\r
+/*\r
+ * 4. Registry\r
+ *\r
+ * Instead of structuring through a Map, just use a dictionary object\r
+ * We throw for construction attempts so this doesn't affect the public API\r
+ *\r
+ * Registry has been adjusted to use Namespace objects over ModuleStatus objects\r
+ * as part of simplifying loader API implementation\r
+ */\r
+var iteratorSupport = typeof Symbol !== 'undefined' && Symbol.iterator;\r
+var REGISTRY = createSymbol('registry');\r
+function Registry() {\r
+  this[REGISTRY] = {};\r
+}\r
+// 4.4.1\r
+if (iteratorSupport) {\r
+  // 4.4.2\r
+  Registry.prototype[Symbol.iterator] = function () {\r
+    return this.entries()[Symbol.iterator]();\r
+  };\r
+\r
+  // 4.4.3\r
+  Registry.prototype.entries = function () {\r
+    var registry = this[REGISTRY];\r
+    return arrayValues(Object.keys(registry).map(function (key) {\r
+      return [key, registry[key]];\r
+    }));\r
+  };\r
+}\r
+\r
+// 4.4.4\r
+Registry.prototype.keys = function () {\r
+  return arrayValues(Object.keys(this[REGISTRY]));\r
+};\r
+// 4.4.5\r
+Registry.prototype.values = function () {\r
+  var registry = this[REGISTRY];\r
+  return arrayValues(Object.keys(registry).map(function (key) {\r
+    return registry[key];\r
+  }));\r
+};\r
+// 4.4.6\r
+Registry.prototype.get = function (key) {\r
+  return this[REGISTRY][key];\r
+};\r
+// 4.4.7\r
+Registry.prototype.set = function (key, namespace) {\r
+  if (!(namespace instanceof ModuleNamespace || namespace[toStringTag] === 'module'))\r
+    throw new Error('Registry must be set with an instance of Module Namespace');\r
+  this[REGISTRY][key] = namespace;\r
+  return this;\r
+};\r
+// 4.4.8\r
+Registry.prototype.has = function (key) {\r
+  return Object.hasOwnProperty.call(this[REGISTRY], key);\r
+};\r
+// 4.4.9\r
+Registry.prototype.delete = function (key) {\r
+  if (Object.hasOwnProperty.call(this[REGISTRY], key)) {\r
+    delete this[REGISTRY][key];\r
+    return true;\r
+  }\r
+  return false;\r
+};\r
+\r
+/*\r
+ * Simple ModuleNamespace Exotic object based on a baseObject\r
+ * We export this for allowing a fast-path for module namespace creation over Module descriptors\r
+ */\r
+// var EVALUATE = createSymbol('evaluate');\r
+var BASE_OBJECT = createSymbol('baseObject');\r
+\r
+// 8.3.1 Reflect.Module\r
+/*\r
+ * Best-effort simplified non-spec implementation based on\r
+ * a baseObject referenced via getters.\r
+ *\r
+ * Allows:\r
+ *\r
+ *   loader.registry.set('x', new Module({ default: 'x' }));\r
+ *\r
+ * Optional evaluation function provides experimental Module.evaluate\r
+ * support for non-executed modules in registry.\r
+ */\r
+function ModuleNamespace (baseObject/*, evaluate*/) {\r
+  Object.defineProperty(this, BASE_OBJECT, {\r
+    value: baseObject\r
+  });\r
+\r
+  // evaluate defers namespace population\r
+  /* if (evaluate) {\r
+    Object.defineProperty(this, EVALUATE, {\r
+      value: evaluate,\r
+      configurable: true,\r
+      writable: true\r
+    });\r
+  }\r
+  else { */\r
+    Object.keys(baseObject).forEach(extendNamespace, this);\r
+  //}\r
+}\r
+// 8.4.2\r
+ModuleNamespace.prototype = Object.create(null);\r
+\r
+if (toStringTag)\r
+  Object.defineProperty(ModuleNamespace.prototype, toStringTag, {\r
+    value: 'Module'\r
+  });\r
+\r
+function extendNamespace (key) {\r
+  Object.defineProperty(this, key, {\r
+    enumerable: true,\r
+    get: function () {\r
+      return this[BASE_OBJECT][key];\r
+    }\r
+  });\r
+}\r
+\r
+/* function doEvaluate (evaluate, context) {\r
+  try {\r
+    evaluate.call(context);\r
+  }\r
+  catch (e) {\r
+    return e;\r
+  }\r
+}\r
+\r
+// 8.4.1 Module.evaluate... not documented or used because this is potentially unstable\r
+Module.evaluate = function (ns) {\r
+  var evaluate = ns[EVALUATE];\r
+  if (evaluate) {\r
+    ns[EVALUATE] = undefined;\r
+    var err = doEvaluate(evaluate);\r
+    if (err) {\r
+      // cache the error\r
+      ns[EVALUATE] = function () {\r
+        throw err;\r
+      };\r
+      throw err;\r
+    }\r
+    Object.keys(ns[BASE_OBJECT]).forEach(extendNamespace, ns);\r
+  }\r
+  // make chainable\r
+  return ns;\r
 }; */
 
-/*
- * 4. Registry
- *
- * Instead of structuring through a Map, just use a dictionary object
- * We throw for construction attempts so this doesn't affect the public API
- *
- * Registry has been adjusted to use Namespace objects over ModuleStatus objects
- * as part of simplifying loader API implementation
- */
-var iteratorSupport = typeof Symbol !== 'undefined' && Symbol.iterator;
-var REGISTRY = createSymbol('registry');
-function Registry() {
-  this[REGISTRY] = {};
-}
-// 4.4.1
-if (iteratorSupport) {
-  // 4.4.2
-  Registry.prototype[Symbol.iterator] = function () {
-    return this.entries()[Symbol.iterator]();
-  };
-
-  // 4.4.3
-  Registry.prototype.entries = function () {
-    var registry = this[REGISTRY];
-    return arrayValues(Object.keys(registry).map(function (key) {
-      return [key, registry[key]];
-    }));
-  };
+/*\r
+ * Optimized URL normalization assuming a syntax-valid URL parent\r
+ */\r
+function throwResolveError (relUrl, parentUrl) {\r
+  throw new RangeError('Unable to resolve "' + relUrl + '" to ' + parentUrl);\r
+}\r
+var backslashRegEx = /\\/g;\r
+function resolveIfNotPlain (relUrl, parentUrl) {\r
+  if (relUrl[0] === ' ' || relUrl[relUrl.length - 1] === ' ')\r
+    relUrl = relUrl.trim();\r
+  var parentProtocol = parentUrl && parentUrl.substr(0, parentUrl.indexOf(':') + 1);\r
+\r
+  var firstChar = relUrl[0];\r
+  var secondChar = relUrl[1];\r
+\r
+  // protocol-relative\r
+  if (firstChar === '/' && secondChar === '/') {\r
+    if (!parentProtocol)\r
+      throwResolveError(relUrl, parentUrl);\r
+    if (relUrl.indexOf('\\') !== -1)\r
+      relUrl = relUrl.replace(backslashRegEx, '/');\r
+    return parentProtocol + relUrl;\r
+  }\r
+  // relative-url\r
+  else if (firstChar === '.' && (secondChar === '/' || secondChar === '.' && (relUrl[2] === '/' || relUrl.length === 2 && (relUrl += '/')) ||\r
+      relUrl.length === 1  && (relUrl += '/')) ||\r
+      firstChar === '/') {\r
+    if (relUrl.indexOf('\\') !== -1)\r
+      relUrl = relUrl.replace(backslashRegEx, '/');\r
+    var parentIsPlain = !parentProtocol || parentUrl[parentProtocol.length] !== '/';\r
+\r
+    // read pathname from parent if a URL\r
+    // pathname taken to be part after leading "/"\r
+    var pathname;\r
+    if (parentIsPlain) {\r
+      // resolving to a plain parent -> skip standard URL prefix, and treat entire parent as pathname\r
+      if (parentUrl === undefined)\r
+        throwResolveError(relUrl, parentUrl);\r
+      pathname = parentUrl;\r
+    }\r
+    else if (parentUrl[parentProtocol.length + 1] === '/') {\r
+      // resolving to a :// so we need to read out the auth and host\r
+      if (parentProtocol !== 'file:') {\r
+        pathname = parentUrl.substr(parentProtocol.length + 2);\r
+        pathname = pathname.substr(pathname.indexOf('/') + 1);\r
+      }\r
+      else {\r
+        pathname = parentUrl.substr(8);\r
+      }\r
+    }\r
+    else {\r
+      // resolving to :/ so pathname is the /... part\r
+      pathname = parentUrl.substr(parentProtocol.length + 1);\r
+    }\r
+\r
+    if (firstChar === '/') {\r
+      if (parentIsPlain)\r
+        throwResolveError(relUrl, parentUrl);\r
+      else\r
+        return parentUrl.substr(0, parentUrl.length - pathname.length - 1) + relUrl;\r
+    }\r
+\r
+    // join together and split for removal of .. and . segments\r
+    // looping the string instead of anything fancy for perf reasons\r
+    // '../../../../../z' resolved to 'x/y' is just 'z' regardless of parentIsPlain\r
+    var segmented = pathname.substr(0, pathname.lastIndexOf('/') + 1) + relUrl;\r
+\r
+    var output = [];\r
+    var segmentIndex = -1;\r
+\r
+    for (var i = 0; i < segmented.length; i++) {\r
+      // busy reading a segment - only terminate on '/'\r
+      if (segmentIndex !== -1) {\r
+        if (segmented[i] === '/') {\r
+          output.push(segmented.substring(segmentIndex, i + 1));\r
+          segmentIndex = -1;\r
+        }\r
+        continue;\r
+      }\r
+\r
+      // new segment - check if it is relative\r
+      if (segmented[i] === '.') {\r
+        // ../ segment\r
+        if (segmented[i + 1] === '.' && (segmented[i + 2] === '/' || i + 2 === segmented.length)) {\r
+          output.pop();\r
+          i += 2;\r
+        }\r
+        // ./ segment\r
+        else if (segmented[i + 1] === '/' || i + 1 === segmented.length) {\r
+          i += 1;\r
+        }\r
+        else {\r
+          // the start of a new segment as below\r
+          segmentIndex = i;\r
+          continue;\r
+        }\r
+\r
+        // this is the plain URI backtracking error (../, package:x -> error)\r
+        if (parentIsPlain && output.length === 0)\r
+          throwResolveError(relUrl, parentUrl);\r
+\r
+        continue;\r
+      }\r
+\r
+      // it is the start of a new segment\r
+      segmentIndex = i;\r
+    }\r
+    // finish reading out the last segment\r
+    if (segmentIndex !== -1)\r
+      output.push(segmented.substr(segmentIndex));\r
+\r
+    return parentUrl.substr(0, parentUrl.length - pathname.length) + output.join('');\r
+  }\r
+\r
+  // sanitizes and verifies (by returning undefined if not a valid URL-like form)\r
+  // Windows filepath compatibility is an added convenience here\r
+  var protocolIndex = relUrl.indexOf(':');\r
+  if (protocolIndex !== -1) {\r
+    if (isNode) {\r
+      // C:\x becomes file:///c:/x (we don't support C|\x)\r
+      if (relUrl[1] === ':' && relUrl[2] === '\\' && relUrl[0].match(/[a-z]/i))\r
+        return 'file:///' + relUrl.replace(backslashRegEx, '/');\r
+    }\r
+    return relUrl;\r
+  }\r
 }
 
-// 4.4.4
-Registry.prototype.keys = function () {
-  return arrayValues(Object.keys(this[REGISTRY]));
-};
-// 4.4.5
-Registry.prototype.values = function () {
-  var registry = this[REGISTRY];
-  return arrayValues(Object.keys(registry).map(function (key) {
-    return registry[key];
-  }));
-};
-// 4.4.6
-Registry.prototype.get = function (key) {
-  return this[REGISTRY][key];
-};
-// 4.4.7
-Registry.prototype.set = function (key, namespace) {
-  if (!(namespace instanceof ModuleNamespace))
-    throw new Error('Registry must be set with an instance of Module Namespace');
-  this[REGISTRY][key] = namespace;
-  return this;
-};
-// 4.4.8
-Registry.prototype.has = function (key) {
-  return Object.hasOwnProperty.call(this[REGISTRY], key);
-};
-// 4.4.9
-Registry.prototype.delete = function (key) {
-  if (Object.hasOwnProperty.call(this[REGISTRY], key)) {
-    delete this[REGISTRY][key];
-    return true;
-  }
-  return false;
-};
-
-/*
- * Simple ModuleNamespace Exotic object based on a baseObject
- * We export this for allowing a fast-path for module namespace creation over Module descriptors
- */
-// var EVALUATE = createSymbol('evaluate');
-var BASE_OBJECT = createSymbol('baseObject');
-
-// 8.3.1 Reflect.Module
-/*
- * Best-effort simplified non-spec implementation based on
- * a baseObject referenced via getters.
- *
- * Allows:
- *
- *   loader.registry.set('x', new Module({ default: 'x' }));
- *
- * Optional evaluation function provides experimental Module.evaluate
- * support for non-executed modules in registry.
- */
-function ModuleNamespace (baseObject/*, evaluate*/) {
-  Object.defineProperty(this, BASE_OBJECT, {
-    value: baseObject
-  });
-
-  // evaluate defers namespace population
-  /* if (evaluate) {
-    Object.defineProperty(this, EVALUATE, {
-      value: evaluate,
-      configurable: true,
-      writable: true
-    });
-  }
-  else { */
-    Object.keys(baseObject).forEach(extendNamespace, this);
-  //}
-}
-// 8.4.2
-ModuleNamespace.prototype = Object.create(null);
-
-if (typeof Symbol !== 'undefined' && Symbol.toStringTag)
-  Object.defineProperty(ModuleNamespace.prototype, Symbol.toStringTag, {
-    value: 'Module'
-  });
-
-function extendNamespace (key) {
-  Object.defineProperty(this, key, {
-    enumerable: true,
-    get: function () {
-      return this[BASE_OBJECT][key];
-    }
-  });
-}
-
-/* function doEvaluate (evaluate, context) {
-  try {
-    evaluate.call(context);
-  }
-  catch (e) {
-    return e;
-  }
-}
-
-// 8.4.1 Module.evaluate... not documented or used because this is potentially unstable
-Module.evaluate = function (ns) {
-  var evaluate = ns[EVALUATE];
-  if (evaluate) {
-    ns[EVALUATE] = undefined;
-    var err = doEvaluate(evaluate);
-    if (err) {
-      // cache the error
-      ns[EVALUATE] = function () {
-        throw err;
-      };
-      throw err;
-    }
-    Object.keys(ns[BASE_OBJECT]).forEach(extendNamespace, ns);
-  }
-  // make chainable
-  return ns;
-}; */
-
-/*
- * Optimized URL normalization assuming a syntax-valid URL parent
- */
-function throwResolveError (relUrl, parentUrl) {
-  throw new RangeError('Unable to resolve "' + relUrl + '" to ' + parentUrl);
-}
-function resolveIfNotPlain (relUrl, parentUrl) {
-  relUrl = relUrl.trim();
-  var parentProtocol = parentUrl && parentUrl.substr(0, parentUrl.indexOf(':') + 1);
-
-  var firstChar = relUrl[0];
-  var secondChar = relUrl[1];
-
-  // protocol-relative
-  if (firstChar === '/' && secondChar === '/') {
-    if (!parentProtocol)
-      throwResolveError(relUrl, parentUrl);
-    return parentProtocol + relUrl;
-  }
-  // relative-url
-  else if (firstChar === '.' && (secondChar === '/' || secondChar === '.' && (relUrl[2] === '/' || relUrl.length === 2 && (relUrl += '/')) ||
-      relUrl.length === 1  && (relUrl += '/')) ||
-      firstChar === '/') {
-    var parentIsPlain = !parentProtocol || parentUrl[parentProtocol.length] !== '/';
-
-    // read pathname from parent if a URL
-    // pathname taken to be part after leading "/"
-    var pathname;
-    if (parentIsPlain) {
-      // resolving to a plain parent -> skip standard URL prefix, and treat entire parent as pathname
-      if (parentUrl === undefined)
-        throwResolveError(relUrl, parentUrl);
-      pathname = parentUrl;
-    }
-    else if (parentUrl[parentProtocol.length + 1] === '/') {
-      // resolving to a :// so we need to read out the auth and host
-      if (parentProtocol !== 'file:') {
-        pathname = parentUrl.substr(parentProtocol.length + 2);
-        pathname = pathname.substr(pathname.indexOf('/') + 1);
-      }
-      else {
-        pathname = parentUrl.substr(8);
-      }
-    }
-    else {
-      // resolving to :/ so pathname is the /... part
-      pathname = parentUrl.substr(parentProtocol.length + 1);
-    }
-
-    if (firstChar === '/') {
-      if (parentIsPlain)
-        throwResolveError(relUrl, parentUrl);
-      else
-        return parentUrl.substr(0, parentUrl.length - pathname.length - 1) + relUrl;
-    }
-
-    // join together and split for removal of .. and . segments
-    // looping the string instead of anything fancy for perf reasons
-    // '../../../../../z' resolved to 'x/y' is just 'z' regardless of parentIsPlain
-    var segmented = pathname.substr(0, pathname.lastIndexOf('/') + 1) + relUrl;
-
-    var output = [];
-    var segmentIndex = -1;
-
-    for (var i = 0; i < segmented.length; i++) {
-      // busy reading a segment - only terminate on '/'
-      if (segmentIndex !== -1) {
-        if (segmented[i] === '/') {
-          output.push(segmented.substring(segmentIndex, i + 1));
-          segmentIndex = -1;
-        }
-        continue;
-      }
-
-      // new segment - check if it is relative
-      if (segmented[i] === '.') {
-        // ../ segment
-        if (segmented[i + 1] === '.' && (segmented[i + 2] === '/' || i + 2 === segmented.length)) {
-          output.pop();
-          i += 2;
-        }
-        // ./ segment
-        else if (segmented[i + 1] === '/' || i + 1 === segmented.length) {
-          i += 1;
-        }
-        else {
-          // the start of a new segment as below
-          segmentIndex = i;
-          continue;
-        }
-
-        // this is the plain URI backtracking error (../, package:x -> error)
-        if (parentIsPlain && output.length === 0)
-          throwResolveError(relUrl, parentUrl);
-
-        continue;
-      }
-
-      // it is the start of a new segment
-      segmentIndex = i;
-    }
-    // finish reading out the last segment
-    if (segmentIndex !== -1)
-      output.push(segmented.substr(segmentIndex));
-
-    return parentUrl.substr(0, parentUrl.length - pathname.length) + output.join('');
-  }
-
-  // sanitizes and verifies (by returning undefined if not a valid URL-like form)
-  // Windows filepath compatibility is an added convenience here
-  var protocolIndex = relUrl.indexOf(':');
-  if (protocolIndex !== -1) {
-    if (isNode) {
-      // C:\x becomes file:///c:/x (we don't support C|\x)
-      if (relUrl[1] === ':' && relUrl[2] === '\\' && relUrl[0].match(/[a-z]/i))
-        return 'file:///' + relUrl.replace(/\\/g, '/');
-    }
-    return relUrl;
-  }
-}
-
-/*
- * Register Loader
- *
- * Builds directly on top of loader polyfill to provide:
- * - loader.register support
- * - hookable higher-level resolve
- * - instantiate hook returning a ModuleNamespace or undefined for es module loading
- * - loader error behaviour as in HTML and loader specs, caching load and eval errors separately
- * - build tracing support by providing a .trace=true and .loads object format
- */
-
-var REGISTER_INTERNAL = createSymbol('register-internal');
-
-function RegisterLoader$1 () {
-  Loader.call(this);
-
-  var registryDelete = this.registry.delete;
-  this.registry.delete = function (key) {
-    var deleted = registryDelete.call(this, key);
-
-    // also delete from register registry if linked
-    if (records.hasOwnProperty(key) && !records[key].linkRecord) {
-      delete records[key];
-      deleted = true;
-    }
-
-    return deleted;
-  };
-
-  var records = {};
-
-  this[REGISTER_INTERNAL] = {
-    // last anonymous System.register call
-    lastRegister: undefined,
-    // in-flight es module load records
-    records: records
-  };
-
-  // tracing
-  this.trace = false;
-}
-
-RegisterLoader$1.prototype = Object.create(Loader.prototype);
-RegisterLoader$1.prototype.constructor = RegisterLoader$1;
-
-var INSTANTIATE = RegisterLoader$1.instantiate = createSymbol('instantiate');
-
-// default normalize is the WhatWG style normalizer
-RegisterLoader$1.prototype[RegisterLoader$1.resolve = Loader.resolve] = function (key, parentKey) {
-  return resolveIfNotPlain(key, parentKey || baseURI);
-};
-
-RegisterLoader$1.prototype[INSTANTIATE] = function (key, processAnonRegister) {};
-
-// once evaluated, the linkRecord is set to undefined leaving just the other load record properties
-// this allows tracking new binding listeners for es modules through importerSetters
-// for dynamic modules, the load record is removed entirely.
-function createLoadRecord (state, key, registration) {
-  return state.records[key] = {
-    key: key,
-
-    // defined System.register cache
-    registration: registration,
-
-    // module namespace object
-    module: undefined,
-
-    // es-only
-    // this sticks around so new module loads can listen to binding changes
-    // for already-loaded modules by adding themselves to their importerSetters
-    importerSetters: undefined,
-
-    loadError: undefined,
-    evalError: undefined,
-
-    // in-flight linking record
-    linkRecord: {
-      // promise for instantiated
-      instantiatePromise: undefined,
-      dependencies: undefined,
-      execute: undefined,
-      executingRequire: false,
-
-      // underlying module object bindings
-      moduleObj: undefined,
-
-      // es only, also indicates if es or not
-      setters: undefined,
-
-      // promise for instantiated dependencies (dependencyInstantiations populated)
-      depsInstantiatePromise: undefined,
-      // will be the array of dependency load record or a module namespace
-      dependencyInstantiations: undefined,
-
-      // NB optimization and way of ensuring module objects in setters
-      // indicates setters which should run pre-execution of that dependency
-      // setters is then just for completely executed module objects
-      // alternatively we just pass the partially filled module objects as
-      // arguments into the execute function
-      // hoisted: undefined
-    }
-  };
-}
-
-RegisterLoader$1.prototype[Loader.resolveInstantiate] = function (key, parentKey) {
-  var loader = this;
-  var state = this[REGISTER_INTERNAL];
-  var registry = this.registry[REGISTRY];
-
-  return resolveInstantiate(loader, key, parentKey, registry, state)
-  .then(function (instantiated) {
-    if (instantiated instanceof ModuleNamespace)
-      return instantiated;
-
-    // resolveInstantiate always returns a load record with a link record and no module value
-    var link = instantiated.linkRecord;
-
-    // if already beaten to done, return
-    if (!link) {
-      if (instantiated.module)
-        return instantiated.module;
-      throw instantiated.evalError;
-    }
-
-    return deepInstantiateDeps(loader, instantiated, link, registry, state)
-    .then(function () {
-      return ensureEvaluate(loader, instantiated, link, registry, state, undefined);
-    });
-  });
-};
-
-function resolveInstantiate (loader, key, parentKey, registry, state) {
-  // normalization shortpath for already-normalized key
-  // could add a plain name filter, but doesn't yet seem necessary for perf
-  var module = registry[key];
-  if (module)
-    return Promise.resolve(module);
-
-  var load = state.records[key];
-
-  // already linked but not in main registry is ignored
-  if (load && !load.module) {
-    if (load.loadError)
-      return Promise.reject(load.loadError);
-    return instantiate(loader, load, load.linkRecord, registry, state);
-  }
-
-  return loader.resolve(key, parentKey)
-  .then(function (resolvedKey) {
-    // main loader registry always takes preference
-    module = registry[resolvedKey];
-    if (module)
-      return module;
-
-    load = state.records[resolvedKey];
-
-    // already has a module value but not already in the registry (load.module)
-    // means it was removed by registry.delete, so we should
-    // disgard the current load record creating a new one over it
-    // but keep any existing registration
-    if (!load || load.module)
-      load = createLoadRecord(state, resolvedKey, load && load.registration);
-
-    if (load.loadError)
-      return Promise.reject(load.loadError);
-
-    var link = load.linkRecord;
-    if (!link)
-      return load;
-
-    return instantiate(loader, load, link, registry, state);
-  });
-}
-
-function createProcessAnonRegister (loader, load, state) {
-  return function () {
-    var lastRegister = state.lastRegister;
-
-    if (!lastRegister)
-      return !!load.registration;
-
-    state.lastRegister = undefined;
-    load.registration = lastRegister;
-
-    return true;
-  };
-}
-
-function instantiate (loader, load, link, registry, state) {
-  return link.instantiatePromise || (link.instantiatePromise =
-  // if there is already an existing registration, skip running instantiate
-  (load.registration ? Promise.resolve() : Promise.resolve().then(function () {
-    state.lastRegister = undefined;
-    return loader[INSTANTIATE](load.key, loader[INSTANTIATE].length > 1 && createProcessAnonRegister(loader, load, state));
-  }))
-  .then(function (instantiation) {
-    // direct module return from instantiate -> we're done
-    if (instantiation !== undefined) {
-      if (!(instantiation instanceof ModuleNamespace))
-        throw new TypeError('Instantiate did not return a valid Module object.');
-
-      delete state.records[load.key];
-      if (loader.trace)
-        traceLoad(loader, load, link);
-      return registry[load.key] = instantiation;
-    }
-
-    // run the cached loader.register declaration if there is one
-    var registration = load.registration;
-    // clear to allow new registrations for future loads (combined with registry delete)
-    load.registration = undefined;
-    if (!registration)
-      throw new TypeError('Module instantiation did not call an anonymous or correctly named System.register.');
-
-    link.dependencies = registration[0];
-
-    load.importerSetters = [];
-
-    link.moduleObj = {};
-
-    // process System.registerDynamic declaration
-    if (registration[2]) {
-      link.moduleObj.default = link.moduleObj.__useDefault = {};
-      link.executingRequire = registration[1];
-      link.execute = registration[2];
-    }
-
-    // process System.register declaration
-    else {
-      registerDeclarative(loader, load, link, registration[1]);
-    }
-
-    return load;
-  })
-  .catch(function (err) {
-    load.linkRecord = undefined;
-    throw load.loadError = load.loadError || LoaderError__Check_error_message_for_loader_stack(err, 'Instantiating ' + load.key);
-  }));
-}
-
-// like resolveInstantiate, but returning load records for linking
-function resolveInstantiateDep (loader, key, parentKey, registry, state, traceDepMap) {
-  // normalization shortpaths for already-normalized key
-  // DISABLED to prioritise consistent resolver calls
-  // could add a plain name filter, but doesn't yet seem necessary for perf
-  /* var load = state.records[key];
-  var module = registry[key];
-
-  if (module) {
-    if (traceDepMap)
-      traceDepMap[key] = key;
-
-    // registry authority check in case module was deleted or replaced in main registry
-    if (load && load.module && load.module === module)
-      return load;
-    else
-      return module;
-  }
-
-  // already linked but not in main registry is ignored
-  if (load && !load.module) {
-    if (traceDepMap)
-      traceDepMap[key] = key;
-    return instantiate(loader, load, load.linkRecord, registry, state);
-  } */
-  return loader.resolve(key, parentKey)
-  .then(function (resolvedKey) {
-    if (traceDepMap)
-      traceDepMap[key] = resolvedKey;
-
-    // normalization shortpaths for already-normalized key
-    var load = state.records[resolvedKey];
-    var module = registry[resolvedKey];
-
-    // main loader registry always takes preference
-    if (module && (!load || load.module && module !== load.module))
-      return module;
-
-    if (load && load.loadError)
-      throw load.loadError;
-
-    // already has a module value but not already in the registry (load.module)
-    // means it was removed by registry.delete, so we should
-    // disgard the current load record creating a new one over it
-    // but keep any existing registration
-    if (!load || !module && load.module)
-      load = createLoadRecord(state, resolvedKey, load && load.registration);
-
-    var link = load.linkRecord;
-    if (!link)
-      return load;
-
-    return instantiate(loader, load, link, registry, state);
-  });
-}
-
-function traceLoad (loader, load, link) {
-  loader.loads = loader.loads || {};
-  loader.loads[load.key] = {
-    key: load.key,
-    deps: link.dependencies,
-    dynamicDeps: [],
-    depMap: link.depMap || {}
-  };
-}
-
-/*
- * Convert a CJS module.exports into a valid object for new Module:
- *
- *   new Module(getEsModule(module.exports))
- *
- * Sets the default value to the module, while also reading off named exports carefully.
- */
-function registerDeclarative (loader, load, link, declare) {
-  var moduleObj = link.moduleObj;
-  var importerSetters = load.importerSetters;
-
-  var definedExports = false;
-
-  // closure especially not based on link to allow link record disposal
-  var declared = declare.call(envGlobal, function (name, value) {
-    if (typeof name === 'object') {
-      var changed = false;
-      for (var p in name) {
-        value = name[p];
-        if (p !== '__useDefault' && (!(p in moduleObj) || moduleObj[p] !== value)) {
-          changed = true;
-          moduleObj[p] = value;
-        }
-      }
-      if (changed === false)
-        return value;
-    }
-    else {
-      if ((definedExports || name in moduleObj) && moduleObj[name] === value)
-        return value;
-      moduleObj[name] = value;
-    }
-
-    for (var i = 0; i < importerSetters.length; i++)
-      importerSetters[i](moduleObj);
-
-    return value;
-  }, new ContextualLoader(loader, load.key));
-
-  link.setters = declared.setters;
-  link.execute = declared.execute;
-  if (declared.exports) {
-    link.moduleObj = moduleObj = declared.exports;
-    definedExports = true;
-  }
-}
-
-function instantiateDeps (loader, load, link, registry, state) {
-  if (link.depsInstantiatePromise)
-    return link.depsInstantiatePromise;
-
-  var depsInstantiatePromises = Array(link.dependencies.length);
-
-  for (var i = 0; i < link.dependencies.length; i++)
-    depsInstantiatePromises[i] = resolveInstantiateDep(loader, link.dependencies[i], load.key, registry, state, loader.trace && link.depMap || (link.depMap = {}));
-
-  var depsInstantiatePromise = Promise.all(depsInstantiatePromises)
-  .then(function (dependencyInstantiations) {
-    link.dependencyInstantiations = dependencyInstantiations;
-
-    // run setters to set up bindings to instantiated dependencies
-    if (link.setters) {
-      for (var i = 0; i < dependencyInstantiations.length; i++) {
-        var setter = link.setters[i];
-        if (setter) {
-          var instantiation = dependencyInstantiations[i];
-
-          if (instantiation instanceof ModuleNamespace) {
-            setter(instantiation);
-          }
-          else {
-            if (instantiation.loadError)
-              throw instantiation.loadError;
-            setter(instantiation.module || instantiation.linkRecord.moduleObj);
-            // this applies to both es and dynamic registrations
-            if (instantiation.importerSetters)
-              instantiation.importerSetters.push(setter);
-          }
-        }
-      }
-    }
-
-    return load;
-  });
-
-  if (loader.trace)
-    depsInstantiatePromise = depsInstantiatePromise.then(function () {
-      traceLoad(loader, load, link);
-      return load;
-    });
-
-  depsInstantiatePromise = depsInstantiatePromise.catch(function (err) {
-    // throw up the instantiateDeps stack
-    link.depsInstantiatePromise = undefined;
-    throw LoaderError__Check_error_message_for_loader_stack(err, 'Loading ' + load.key);
-  });
-
-  depsInstantiatePromise.catch(function () {});
-
-  return link.depsInstantiatePromise = depsInstantiatePromise;
-}
-
-function deepInstantiateDeps (loader, load, link, registry, state) {
-  return new Promise(function (resolve, reject) {
-    var seen = [];
-    var loadCnt = 0;
-    function queueLoad (load) {
-      var link = load.linkRecord;
-      if (!link)
-        return;
-
-      if (seen.indexOf(load) !== -1)
-        return;
-      seen.push(load);
-
-      loadCnt++;
-      instantiateDeps(loader, load, link, registry, state)
-      .then(processLoad, reject);
-    }
-    function processLoad (load) {
-      loadCnt--;
-      var link = load.linkRecord;
-      if (link) {
-        for (var i = 0; i < link.dependencies.length; i++) {
-          var depLoad = link.dependencyInstantiations[i];
-          if (!(depLoad instanceof ModuleNamespace))
-            queueLoad(depLoad);
-        }
-      }
-      if (loadCnt === 0)
-        resolve();
-    }
-    queueLoad(load);
-  });
-}
-
-/*
- * System.register
- */
-RegisterLoader$1.prototype.register = function (key, deps, declare) {
-  var state = this[REGISTER_INTERNAL];
-
-  // anonymous modules get stored as lastAnon
-  if (declare === undefined) {
-    state.lastRegister = [key, deps, undefined];
-  }
-
-  // everything else registers into the register cache
-  else {
-    var load = state.records[key] || createLoadRecord(state, key, undefined);
-    load.registration = [deps, declare, undefined];
-  }
-};
-
-/*
- * System.registerDyanmic
- */
-RegisterLoader$1.prototype.registerDynamic = function (key, deps, executingRequire, execute) {
-  var state = this[REGISTER_INTERNAL];
-
-  // anonymous modules get stored as lastAnon
-  if (typeof key !== 'string') {
-    state.lastRegister = [key, deps, executingRequire];
-  }
-
-  // everything else registers into the register cache
-  else {
-    var load = state.records[key] || createLoadRecord(state, key, undefined);
-    load.registration = [deps, executingRequire, execute];
-  }
-};
-
-// ContextualLoader class
-// backwards-compatible with previous System.register context argument by exposing .id, .key
-function ContextualLoader (loader, key) {
-  this.loader = loader;
-  this.key = this.id = key;
-  this.meta = {
-    url: key
-    // scriptElement: null
-  };
-}
-/*ContextualLoader.prototype.constructor = function () {
-  throw new TypeError('Cannot subclass the contextual loader only Reflect.Loader.');
-};*/
-ContextualLoader.prototype.import = function (key) {
-  if (this.loader.trace)
-    this.loader.loads[this.key].dynamicDeps.push(key);
-  return this.loader.import(key, this.key);
-};
-/*ContextualLoader.prototype.resolve = function (key) {
-  return this.loader.resolve(key, this.key);
-};*/
-
-// this is the execution function bound to the Module namespace record
-function ensureEvaluate (loader, load, link, registry, state, seen) {
-  if (load.module)
-    return load.module;
-
-  if (load.evalError)
-    throw load.evalError;
-
-  if (seen && seen.indexOf(load) !== -1)
-    return load.linkRecord.moduleObj;
-
-  // for ES loads we always run ensureEvaluate on top-level, so empty seen is passed regardless
-  // for dynamic loads, we pass seen if also dynamic
-  var err = doEvaluate(loader, load, link, registry, state, link.setters ? [] : seen || []);
-  if (err)
-    throw err;
-
-  return load.module;
-}
-
-function makeDynamicRequire (loader, key, dependencies, dependencyInstantiations, registry, state, seen) {
-  // we can only require from already-known dependencies
-  return function (name) {
-    for (var i = 0; i < dependencies.length; i++) {
-      if (dependencies[i] === name) {
-        var depLoad = dependencyInstantiations[i];
-        var module;
-
-        if (depLoad instanceof ModuleNamespace)
-          module = depLoad;
-        else
-          module = ensureEvaluate(loader, depLoad, depLoad.linkRecord, registry, state, seen);
-
-        return '__useDefault' in module ? module.__useDefault : module;
-      }
-    }
-    throw new Error('Module ' + name + ' not declared as a System.registerDynamic dependency of ' + key);
-  };
-}
-
-// ensures the given es load is evaluated
-// returns the error if any
-function doEvaluate (loader, load, link, registry, state, seen) {
-  seen.push(load);
-
-  var err;
-
-  // es modules evaluate dependencies first
-  // non es modules explicitly call moduleEvaluate through require
-  if (link.setters) {
-    var depLoad, depLink;
-    for (var i = 0; i < link.dependencies.length; i++) {
-      depLoad = link.dependencyInstantiations[i];
-
-      if (depLoad instanceof ModuleNamespace)
-        continue;
-
-      // custom Module returned from instantiate
-      depLink = depLoad.linkRecord;
-      if (depLink && seen.indexOf(depLoad) === -1) {
-        if (depLoad.evalError)
-          err = depLoad.evalError;
-        else
-          // dynamic / declarative boundaries clear the "seen" list
-          // we just let cross format circular throw as would happen in real implementations
-          err = doEvaluate(loader, depLoad, depLink, registry, state, depLink.setters ? seen : []);
-      }
-
-      if (err) {
-        load.linkRecord = undefined;
-        load.evalError = LoaderError__Check_error_message_for_loader_stack(err, 'Evaluating ' + load.key);
-        return load.evalError;
-      }
-    }
-  }
-
-  // link.execute won't exist for Module returns from instantiate on top-level load
-  if (link.execute) {
-    // ES System.register execute
-    // "this" is null in ES
-    if (link.setters) {
-      err = declarativeExecute(link.execute);
-    }
-    // System.registerDynamic execute
-    // "this" is "exports" in CJS
-    else {
-      var module = { id: load.key };
-      var moduleObj = link.moduleObj;
-      Object.defineProperty(module, 'exports', {
-        configurable: true,
-        set: function (exports) {
-          moduleObj.default = moduleObj.__useDefault = exports;
-        },
-        get: function () {
-          return moduleObj.__useDefault;
-        }
-      });
-
-      var require = makeDynamicRequire(loader, load.key, link.dependencies, link.dependencyInstantiations, registry, state, seen);
-
-      // evaluate deps first
-      if (!link.executingRequire)
-        for (var i = 0; i < link.dependencies.length; i++)
-          require(link.dependencies[i]);
-
-      err = dynamicExecute(link.execute, require, moduleObj.default, module);
-
-      // pick up defineProperty calls to module.exports when we can
-      if (module.exports !== moduleObj.__useDefault)
-        moduleObj.default = moduleObj.__useDefault = module.exports;
-
-      var moduleDefault = moduleObj.default;
-
-      // __esModule flag extension support via lifting
-      if (moduleDefault && moduleDefault.__esModule) {
-        for (var p in moduleDefault) {
-          if (Object.hasOwnProperty.call(moduleDefault, p))
-            moduleObj[p] = moduleDefault[p];
-        }
-      }
-    }
-  }
-
-  // dispose link record
-  load.linkRecord = undefined;
-
-  if (err)
-    return load.evalError = LoaderError__Check_error_message_for_loader_stack(err, 'Evaluating ' + load.key);
-
-  registry[load.key] = load.module = new ModuleNamespace(link.moduleObj);
-
-  // if not an esm module, run importer setters and clear them
-  // this allows dynamic modules to update themselves into es modules
-  // as soon as execution has completed
-  if (!link.setters) {
-    if (load.importerSetters)
-      for (var i = 0; i < load.importerSetters.length; i++)
-        load.importerSetters[i](load.module);
-    load.importerSetters = undefined;
-  }
-}
-
-// {} is the closest we can get to call(undefined)
-var nullContext = {};
-if (Object.freeze)
+var resolvedPromise = Promise.resolve();\r
+/*\r
+ * Register Loader\r
+ *\r
+ * Builds directly on top of loader polyfill to provide:\r
+ * - loader.register support\r
+ * - hookable higher-level resolve\r
+ * - instantiate hook returning a ModuleNamespace or undefined for es module loading\r
+ * - loader error behaviour as in HTML and loader specs, caching load and eval errors separately\r
+ * - build tracing support by providing a .trace=true and .loads object format\r
+ */\r
+\r
+var REGISTER_INTERNAL = createSymbol('register-internal');\r
+\r
+function RegisterLoader$1 () {\r
+  Loader.call(this);\r
+\r
+  var registryDelete = this.registry.delete;\r
+  this.registry.delete = function (key) {\r
+    var deleted = registryDelete.call(this, key);\r
+\r
+    // also delete from register registry if linked\r
+    if (records.hasOwnProperty(key) && !records[key].linkRecord) {\r
+      delete records[key];\r
+      deleted = true;\r
+    }\r
+\r
+    return deleted;\r
+  };\r
+\r
+  var records = {};\r
+\r
+  this[REGISTER_INTERNAL] = {\r
+    // last anonymous System.register call\r
+    lastRegister: undefined,\r
+    // in-flight es module load records\r
+    records: records\r
+  };\r
+\r
+  // tracing\r
+  this.trace = false;\r
+}\r
+\r
+RegisterLoader$1.prototype = Object.create(Loader.prototype);\r
+RegisterLoader$1.prototype.constructor = RegisterLoader$1;\r
+\r
+var INSTANTIATE = RegisterLoader$1.instantiate = createSymbol('instantiate');\r
+\r
+// default normalize is the WhatWG style normalizer\r
+RegisterLoader$1.prototype[RegisterLoader$1.resolve = Loader.resolve] = function (key, parentKey) {\r
+  return resolveIfNotPlain(key, parentKey || baseURI);\r
+};\r
+\r
+RegisterLoader$1.prototype[INSTANTIATE] = function (key, processAnonRegister) {};\r
+\r
+// once evaluated, the linkRecord is set to undefined leaving just the other load record properties\r
+// this allows tracking new binding listeners for es modules through importerSetters\r
+// for dynamic modules, the load record is removed entirely.\r
+function createLoadRecord (state, key, registration) {\r
+  return state.records[key] = {\r
+    key: key,\r
+\r
+    // defined System.register cache\r
+    registration: registration,\r
+\r
+    // module namespace object\r
+    module: undefined,\r
+\r
+    // es-only\r
+    // this sticks around so new module loads can listen to binding changes\r
+    // for already-loaded modules by adding themselves to their importerSetters\r
+    importerSetters: undefined,\r
+\r
+    loadError: undefined,\r
+    evalError: undefined,\r
+\r
+    // in-flight linking record\r
+    linkRecord: {\r
+      // promise for instantiated\r
+      instantiatePromise: undefined,\r
+      dependencies: undefined,\r
+      execute: undefined,\r
+      executingRequire: false,\r
+\r
+      // underlying module object bindings\r
+      moduleObj: undefined,\r
+\r
+      // es only, also indicates if es or not\r
+      setters: undefined,\r
+\r
+      // promise for instantiated dependencies (dependencyInstantiations populated)\r
+      depsInstantiatePromise: undefined,\r
+      // will be the array of dependency load record or a module namespace\r
+      dependencyInstantiations: undefined,\r
+\r
+      // top-level await!\r
+      evaluatePromise: undefined,\r
+\r
+      // NB optimization and way of ensuring module objects in setters\r
+      // indicates setters which should run pre-execution of that dependency\r
+      // setters is then just for completely executed module objects\r
+      // alternatively we just pass the partially filled module objects as\r
+      // arguments into the execute function\r
+      // hoisted: undefined\r
+    }\r
+  };\r
+}\r
+\r
+RegisterLoader$1.prototype[Loader.resolveInstantiate] = function (key, parentKey) {\r
+  var loader = this;\r
+  var state = this[REGISTER_INTERNAL];\r
+  var registry = this.registry[REGISTRY];\r
+\r
+  return resolveInstantiate(loader, key, parentKey, registry, state)\r
+  .then(function (instantiated) {\r
+    if (instantiated instanceof ModuleNamespace || instantiated[toStringTag] === 'module')\r
+      return instantiated;\r
+\r
+    // resolveInstantiate always returns a load record with a link record and no module value\r
+    var link = instantiated.linkRecord;\r
+\r
+    // if already beaten to done, return\r
+    if (!link) {\r
+      if (instantiated.module)\r
+        return instantiated.module;\r
+      throw instantiated.evalError;\r
+    }\r
+\r
+    return deepInstantiateDeps(loader, instantiated, link, registry, state)\r
+    .then(function () {\r
+      return ensureEvaluate(loader, instantiated, link, registry, state);\r
+    });\r
+  });\r
+};\r
+\r
+function resolveInstantiate (loader, key, parentKey, registry, state) {\r
+  // normalization shortpath for already-normalized key\r
+  // could add a plain name filter, but doesn't yet seem necessary for perf\r
+  var module = registry[key];\r
+  if (module)\r
+    return Promise.resolve(module);\r
+\r
+  var load = state.records[key];\r
+\r
+  // already linked but not in main registry is ignored\r
+  if (load && !load.module) {\r
+    if (load.loadError)\r
+      return Promise.reject(load.loadError);\r
+    return instantiate(loader, load, load.linkRecord, registry, state);\r
+  }\r
+\r
+  return loader.resolve(key, parentKey)\r
+  .then(function (resolvedKey) {\r
+    // main loader registry always takes preference\r
+    module = registry[resolvedKey];\r
+    if (module)\r
+      return module;\r
+\r
+    load = state.records[resolvedKey];\r
+\r
+    // already has a module value but not already in the registry (load.module)\r
+    // means it was removed by registry.delete, so we should\r
+    // disgard the current load record creating a new one over it\r
+    // but keep any existing registration\r
+    if (!load || load.module)\r
+      load = createLoadRecord(state, resolvedKey, load && load.registration);\r
+\r
+    if (load.loadError)\r
+      return Promise.reject(load.loadError);\r
+\r
+    var link = load.linkRecord;\r
+    if (!link)\r
+      return load;\r
+\r
+    return instantiate(loader, load, link, registry, state);\r
+  });\r
+}\r
+\r
+function createProcessAnonRegister (loader, load, state) {\r
+  return function () {\r
+    var lastRegister = state.lastRegister;\r
+\r
+    if (!lastRegister)\r
+      return !!load.registration;\r
+\r
+    state.lastRegister = undefined;\r
+    load.registration = lastRegister;\r
+\r
+    return true;\r
+  };\r
+}\r
+\r
+function instantiate (loader, load, link, registry, state) {\r
+  return link.instantiatePromise || (link.instantiatePromise =\r
+  // if there is already an existing registration, skip running instantiate\r
+  (load.registration ? resolvedPromise : resolvedPromise.then(function () {\r
+    state.lastRegister = undefined;\r
+    return loader[INSTANTIATE](load.key, loader[INSTANTIATE].length > 1 && createProcessAnonRegister(loader, load, state));\r
+  }))\r
+  .then(function (instantiation) {\r
+    // direct module return from instantiate -> we're done\r
+    if (instantiation !== undefined) {\r
+      if (!(instantiation instanceof ModuleNamespace || instantiation[toStringTag] === 'module'))\r
+        throw new TypeError('Instantiate did not return a valid Module object.');\r
+\r
+      delete state.records[load.key];\r
+      if (loader.trace)\r
+        traceLoad(loader, load, link);\r
+      return registry[load.key] = instantiation;\r
+    }\r
+\r
+    // run the cached loader.register declaration if there is one\r
+    var registration = load.registration;\r
+    // clear to allow new registrations for future loads (combined with registry delete)\r
+    load.registration = undefined;\r
+    if (!registration)\r
+      throw new TypeError('Module instantiation did not call an anonymous or correctly named System.register.');\r
+\r
+    link.dependencies = registration[0];\r
+\r
+    load.importerSetters = [];\r
+\r
+    link.moduleObj = {};\r
+\r
+    // process System.registerDynamic declaration\r
+    if (registration[2]) {\r
+      link.moduleObj.default = link.moduleObj.__useDefault = {};\r
+      link.executingRequire = registration[1];\r
+      link.execute = registration[2];\r
+    }\r
+\r
+    // process System.register declaration\r
+    else {\r
+      registerDeclarative(loader, load, link, registration[1]);\r
+    }\r
+\r
+    return load;\r
+  })\r
+  .catch(function (err) {\r
+    load.linkRecord = undefined;\r
+    throw load.loadError = load.loadError || LoaderError__Check_error_message_for_loader_stack(err, 'Instantiating ' + load.key);\r
+  }));\r
+}\r
+\r
+// like resolveInstantiate, but returning load records for linking\r
+function resolveInstantiateDep (loader, key, parentKey, registry, state, traceDepMap) {\r
+  // normalization shortpaths for already-normalized key\r
+  // DISABLED to prioritise consistent resolver calls\r
+  // could add a plain name filter, but doesn't yet seem necessary for perf\r
+  /* var load = state.records[key];\r
+  var module = registry[key];\r
+\r
+  if (module) {\r
+    if (traceDepMap)\r
+      traceDepMap[key] = key;\r
+\r
+    // registry authority check in case module was deleted or replaced in main registry\r
+    if (load && load.module && load.module === module)\r
+      return load;\r
+    else\r
+      return module;\r
+  }\r
+\r
+  // already linked but not in main registry is ignored\r
+  if (load && !load.module) {\r
+    if (traceDepMap)\r
+      traceDepMap[key] = key;\r
+    return instantiate(loader, load, load.linkRecord, registry, state);\r
+  } */\r
+  return loader.resolve(key, parentKey)\r
+  .then(function (resolvedKey) {\r
+    if (traceDepMap)\r
+      traceDepMap[key] = resolvedKey;\r
+\r
+    // normalization shortpaths for already-normalized key\r
+    var load = state.records[resolvedKey];\r
+    var module = registry[resolvedKey];\r
+\r
+    // main loader registry always takes preference\r
+    if (module && (!load || load.module && module !== load.module))\r
+      return module;\r
+\r
+    if (load && load.loadError)\r
+      throw load.loadError;\r
+\r
+    // already has a module value but not already in the registry (load.module)\r
+    // means it was removed by registry.delete, so we should\r
+    // disgard the current load record creating a new one over it\r
+    // but keep any existing registration\r
+    if (!load || !module && load.module)\r
+      load = createLoadRecord(state, resolvedKey, load && load.registration);\r
+\r
+    var link = load.linkRecord;\r
+    if (!link)\r
+      return load;\r
+\r
+    return instantiate(loader, load, link, registry, state);\r
+  });\r
+}\r
+\r
+function traceLoad (loader, load, link) {\r
+  loader.loads = loader.loads || {};\r
+  loader.loads[load.key] = {\r
+    key: load.key,\r
+    deps: link.dependencies,\r
+    dynamicDeps: [],\r
+    depMap: link.depMap || {}\r
+  };\r
+}\r
+\r
+/*\r
+ * Convert a CJS module.exports into a valid object for new Module:\r
+ *\r
+ *   new Module(getEsModule(module.exports))\r
+ *\r
+ * Sets the default value to the module, while also reading off named exports carefully.\r
+ */\r
+function registerDeclarative (loader, load, link, declare) {\r
+  var moduleObj = link.moduleObj;\r
+  var importerSetters = load.importerSetters;\r
+\r
+  var definedExports = false;\r
+\r
+  // closure especially not based on link to allow link record disposal\r
+  var declared = declare.call(envGlobal, function (name, value) {\r
+    if (typeof name === 'object') {\r
+      var changed = false;\r
+      for (var p in name) {\r
+        value = name[p];\r
+        if (p !== '__useDefault' && (!(p in moduleObj) || moduleObj[p] !== value)) {\r
+          changed = true;\r
+          moduleObj[p] = value;\r
+        }\r
+      }\r
+      if (changed === false)\r
+        return value;\r
+    }\r
+    else {\r
+      if ((definedExports || name in moduleObj) && moduleObj[name] === value)\r
+        return value;\r
+      moduleObj[name] = value;\r
+    }\r
+\r
+    for (var i = 0; i < importerSetters.length; i++)\r
+      importerSetters[i](moduleObj);\r
+\r
+    return value;\r
+  }, new ContextualLoader(loader, load.key));\r
+\r
+  link.setters = declared.setters || [];\r
+  link.execute = declared.execute;\r
+  if (declared.exports) {\r
+    link.moduleObj = moduleObj = declared.exports;\r
+    definedExports = true;\r
+  }\r
+}\r
+\r
+function instantiateDeps (loader, load, link, registry, state) {\r
+  if (link.depsInstantiatePromise)\r
+    return link.depsInstantiatePromise;\r
+\r
+  var depsInstantiatePromises = Array(link.dependencies.length);\r
+\r
+  for (var i = 0; i < link.dependencies.length; i++)\r
+    depsInstantiatePromises[i] = resolveInstantiateDep(loader, link.dependencies[i], load.key, registry, state, loader.trace && link.depMap || (link.depMap = {}));\r
+\r
+  var depsInstantiatePromise = Promise.all(depsInstantiatePromises)\r
+  .then(function (dependencyInstantiations) {\r
+    link.dependencyInstantiations = dependencyInstantiations;\r
+\r
+    // run setters to set up bindings to instantiated dependencies\r
+    if (link.setters) {\r
+      for (var i = 0; i < dependencyInstantiations.length; i++) {\r
+        var setter = link.setters[i];\r
+        if (setter) {\r
+          var instantiation = dependencyInstantiations[i];\r
+\r
+          if (instantiation instanceof ModuleNamespace || instantiation[toStringTag] === 'module') {\r
+            setter(instantiation);\r
+          }\r
+          else {\r
+            if (instantiation.loadError)\r
+              throw instantiation.loadError;\r
+            setter(instantiation.module || instantiation.linkRecord.moduleObj);\r
+            // this applies to both es and dynamic registrations\r
+            if (instantiation.importerSetters)\r
+              instantiation.importerSetters.push(setter);\r
+          }\r
+        }\r
+      }\r
+    }\r
+\r
+    return load;\r
+  });\r
+\r
+  if (loader.trace)\r
+    depsInstantiatePromise = depsInstantiatePromise.then(function () {\r
+      traceLoad(loader, load, link);\r
+      return load;\r
+    });\r
+\r
+  depsInstantiatePromise = depsInstantiatePromise.catch(function (err) {\r
+    // throw up the instantiateDeps stack\r
+    link.depsInstantiatePromise = undefined;\r
+    throw LoaderError__Check_error_message_for_loader_stack(err, 'Loading ' + load.key);\r
+  });\r
+\r
+  depsInstantiatePromise.catch(function () {});\r
+\r
+  return link.depsInstantiatePromise = depsInstantiatePromise;\r
+}\r
+\r
+function deepInstantiateDeps (loader, load, link, registry, state) {\r
+  var seen = [];\r
+  function addDeps (load, link) {\r
+    if (!link)\r
+      return resolvedPromise;\r
+    if (seen.indexOf(load) !== -1)\r
+      return resolvedPromise;\r
+    seen.push(load);\r
+    \r
+    return instantiateDeps(loader, load, link, registry, state)\r
+    .then(function () {\r
+      var depPromises;\r
+      for (var i = 0; i < link.dependencies.length; i++) {\r
+        var depLoad = link.dependencyInstantiations[i];\r
+        if (!(depLoad instanceof ModuleNamespace || depLoad[toStringTag] === 'module')) {\r
+          depPromises = depPromises || [];\r
+          depPromises.push(addDeps(depLoad, depLoad.linkRecord));\r
+        }\r
+      }\r
+      if (depPromises)\r
+        return Promise.all(depPromises);\r
+    });\r
+  }\r
+\r
+  return addDeps(load, link);\r
+}\r
+\r
+/*\r
+ * System.register\r
+ */\r
+RegisterLoader$1.prototype.register = function (key, deps, declare) {\r
+  var state = this[REGISTER_INTERNAL];\r
+\r
+  // anonymous modules get stored as lastAnon\r
+  if (declare === undefined) {\r
+    state.lastRegister = [key, deps, undefined];\r
+  }\r
+\r
+  // everything else registers into the register cache\r
+  else {\r
+    var load = state.records[key] || createLoadRecord(state, key, undefined);\r
+    load.registration = [deps, declare, undefined];\r
+  }\r
+};\r
+\r
+/*\r
+ * System.registerDyanmic\r
+ */\r
+RegisterLoader$1.prototype.registerDynamic = function (key, deps, executingRequire, execute) {\r
+  var state = this[REGISTER_INTERNAL];\r
+\r
+  // anonymous modules get stored as lastAnon\r
+  if (typeof key !== 'string') {\r
+    state.lastRegister = [key, deps, executingRequire];\r
+  }\r
+\r
+  // everything else registers into the register cache\r
+  else {\r
+    var load = state.records[key] || createLoadRecord(state, key, undefined);\r
+    load.registration = [deps, executingRequire, execute];\r
+  }\r
+};\r
+\r
+// ContextualLoader class\r
+// backwards-compatible with previous System.register context argument by exposing .id, .key\r
+function ContextualLoader (loader, key) {\r
+  this.loader = loader;\r
+  this.key = this.id = key;\r
+  this.meta = {\r
+    url: key\r
+    // scriptElement: null\r
+  };\r
+}\r
+/*ContextualLoader.prototype.constructor = function () {\r
+  throw new TypeError('Cannot subclass the contextual loader only Reflect.Loader.');\r
+};*/\r
+ContextualLoader.prototype.import = function (key) {\r
+  if (this.loader.trace)\r
+    this.loader.loads[this.key].dynamicDeps.push(key);\r
+  return this.loader.import(key, this.key);\r
+};\r
+/*ContextualLoader.prototype.resolve = function (key) {\r
+  return this.loader.resolve(key, this.key);\r
+};*/\r
+\r
+function ensureEvaluate (loader, load, link, registry, state) {\r
+  if (load.module)\r
+    return load.module;\r
+  if (load.evalError)\r
+    throw load.evalError;\r
+  if (link.evaluatePromise)\r
+    return link.evaluatePromise;\r
+\r
+  if (link.setters) {\r
+    var evaluatePromise = doEvaluateDeclarative(loader, load, link, registry, state, [load]);\r
+    if (evaluatePromise)\r
+      return evaluatePromise;\r
+  }\r
+  else {\r
+    doEvaluateDynamic(loader, load, link, registry, state, [load]);\r
+  }\r
+  return load.module;\r
+}\r
+\r
+function makeDynamicRequire (loader, key, dependencies, dependencyInstantiations, registry, state, seen) {\r
+  // we can only require from already-known dependencies\r
+  return function (name) {\r
+    for (var i = 0; i < dependencies.length; i++) {\r
+      if (dependencies[i] === name) {\r
+        var depLoad = dependencyInstantiations[i];\r
+        var module;\r
+\r
+        if (depLoad instanceof ModuleNamespace || depLoad[toStringTag] === 'module') {\r
+          module = depLoad;\r
+        }\r
+        else {\r
+          if (depLoad.evalError)\r
+            throw depLoad.evalError;\r
+          if (depLoad.module === undefined && seen.indexOf(depLoad) === -1 && !depLoad.linkRecord.evaluatePromise) {\r
+            if (depLoad.linkRecord.setters) {\r
+              doEvaluateDeclarative(loader, depLoad, depLoad.linkRecord, registry, state, [depLoad]);\r
+            }\r
+            else {\r
+              seen.push(depLoad);\r
+              doEvaluateDynamic(loader, depLoad, depLoad.linkRecord, registry, state, seen);\r
+            }\r
+          }\r
+          module = depLoad.module || depLoad.linkRecord.moduleObj;\r
+        }\r
+\r
+        return '__useDefault' in module ? module.__useDefault : module;\r
+      }\r
+    }\r
+    throw new Error('Module ' + name + ' not declared as a System.registerDynamic dependency of ' + key);\r
+  };\r
+}\r
+\r
+function evalError (load, err) {\r
+  load.linkRecord = undefined;\r
+  var evalError = LoaderError__Check_error_message_for_loader_stack(err, 'Evaluating ' + load.key);\r
+  if (load.evalError === undefined)\r
+    load.evalError = evalError;\r
+  throw evalError;\r
+}\r
+\r
+// es modules evaluate dependencies first\r
+// returns the error if any\r
+function doEvaluateDeclarative (loader, load, link, registry, state, seen) {\r
+  var depLoad, depLink;\r
+  var depLoadPromises;\r
+  for (var i = 0; i < link.dependencies.length; i++) {\r
+    var depLoad = link.dependencyInstantiations[i];\r
+    if (depLoad instanceof ModuleNamespace || depLoad[toStringTag] === 'module')\r
+      continue;\r
+\r
+    // custom Module returned from instantiate\r
+    depLink = depLoad.linkRecord;\r
+    if (depLink) {\r
+      if (depLoad.evalError) {\r
+        evalError(load, depLoad.evalError);\r
+      }\r
+      else if (depLink.setters) {\r
+        if (seen.indexOf(depLoad) === -1) {\r
+          seen.push(depLoad);\r
+          try {\r
+            var depLoadPromise = doEvaluateDeclarative(loader, depLoad, depLink, registry, state, seen);\r
+          }\r
+          catch (e) {\r
+            evalError(load, e);\r
+          }\r
+          if (depLoadPromise) {\r
+            depLoadPromises = depLoadPromises || [];\r
+            depLoadPromises.push(depLoadPromise.catch(function (err) {\r
+              evalError(load, err);\r
+            }));\r
+          }\r
+        }\r
+      }\r
+      else {\r
+        try {\r
+          doEvaluateDynamic(loader, depLoad, depLink, registry, state, [depLoad]);\r
+        }\r
+        catch (e) {\r
+          evalError(load, e);\r
+        }\r
+      }\r
+    }\r
+  }\r
+\r
+  if (depLoadPromises)\r
+    return link.evaluatePromise = Promise.all(depLoadPromises)\r
+    .then(function () {\r
+      if (link.execute) {\r
+        // ES System.register execute\r
+        // "this" is null in ES\r
+        try {\r
+          var execPromise = link.execute.call(nullContext);\r
+        }\r
+        catch (e) {\r
+          evalError(load, e);\r
+        }\r
+        if (execPromise)\r
+          return execPromise.catch(function (e) {\r
+            evalError(load, e);\r
+          })\r
+          .then(function () {\r
+            load.linkRecord = undefined;\r
+            return registry[load.key] = load.module = new ModuleNamespace(link.moduleObj);\r
+          });\r
+      }\r
+    \r
+      // dispose link record\r
+      load.linkRecord = undefined;\r
+      registry[load.key] = load.module = new ModuleNamespace(link.moduleObj);\r
+    });\r
+\r
+  if (link.execute) {\r
+    // ES System.register execute\r
+    // "this" is null in ES\r
+    try {\r
+      var execPromise = link.execute.call(nullContext);\r
+    }\r
+    catch (e) {\r
+      evalError(load, e);\r
+    }\r
+    if (execPromise)\r
+      return link.evaluatePromise = execPromise.catch(function (e) {\r
+        evalError(load, e);\r
+      })\r
+      .then(function () {\r
+        load.linkRecord = undefined;\r
+        return registry[load.key] = load.module = new ModuleNamespace(link.moduleObj);\r
+      });\r
+  }\r
+\r
+  // dispose link record\r
+  load.linkRecord = undefined;\r
+  registry[load.key] = load.module = new ModuleNamespace(link.moduleObj);\r
+}\r
+\r
+// non es modules explicitly call moduleEvaluate through require\r
+function doEvaluateDynamic (loader, load, link, registry, state, seen) {\r
+  // System.registerDynamic execute\r
+  // "this" is "exports" in CJS\r
+  var module = { id: load.key };\r
+  var moduleObj = link.moduleObj;\r
+  Object.defineProperty(module, 'exports', {\r
+    configurable: true,\r
+    set: function (exports) {\r
+      moduleObj.default = moduleObj.__useDefault = exports;\r
+    },\r
+    get: function () {\r
+      return moduleObj.__useDefault;\r
+    }\r
+  });\r
+\r
+  var require = makeDynamicRequire(loader, load.key, link.dependencies, link.dependencyInstantiations, registry, state, seen);\r
+\r
+  // evaluate deps first\r
+  if (!link.executingRequire)\r
+    for (var i = 0; i < link.dependencies.length; i++)\r
+      require(link.dependencies[i]);\r
+\r
+  try {\r
+    var output = link.execute.call(envGlobal, require, moduleObj.default, module);\r
+    if (output !== undefined)\r
+      module.exports = output;\r
+  }\r
+  catch (e) {\r
+    evalError(load, e);\r
+  }\r
+\r
+  load.linkRecord = undefined;\r
+\r
+  // pick up defineProperty calls to module.exports when we can\r
+  if (module.exports !== moduleObj.__useDefault)\r
+    moduleObj.default = moduleObj.__useDefault = module.exports;\r
+\r
+  var moduleDefault = moduleObj.default;\r
+\r
+  // __esModule flag extension support via lifting\r
+  if (moduleDefault && moduleDefault.__esModule) {\r
+    for (var p in moduleDefault) {\r
+      if (Object.hasOwnProperty.call(moduleDefault, p))\r
+        moduleObj[p] = moduleDefault[p];\r
+    }\r
+  }\r
+\r
+  registry[load.key] = load.module = new ModuleNamespace(link.moduleObj);\r
+\r
+  // run importer setters and clear them\r
+  // this allows dynamic modules to update themselves into es modules\r
+  // as soon as execution has completed\r
+  if (load.importerSetters)\r
+    for (var i = 0; i < load.importerSetters.length; i++)\r
+      load.importerSetters[i](load.module);\r
+  load.importerSetters = undefined;\r
+}\r
+\r
+// the closest we can get to call(undefined)\r
+var nullContext = Object.create(null);\r
+if (Object.freeze)\r
   Object.freeze(nullContext);
 
-function declarativeExecute (execute) {
-  try {
-    execute.call(nullContext);
-  }
-  catch (e) {
-    return e;
-  }
-}
-
-function dynamicExecute (execute, require, exports, module) {
-  try {
-    var output = execute.call(envGlobal, require, exports, module);
-    if (output !== undefined)
-      module.exports = output;
-  }
-  catch (e) {
-    return e;
-  }
-}
-
 var loader;
 
 // <script type="module"> support
@@ -1284,9 +1343,16 @@ var WorkerPool = function (script, size) {
   var current = document.currentScript;
   // IE doesn't support currentScript
   if (!current) {
-    // We should be the last loaded script
+    // Find an entry with out basename
     var scripts = document.getElementsByTagName('script');
-    current = scripts[scripts.length - 1];
+    for (var i = 0; i < scripts.length; i++) {
+      if (scripts[i].src.indexOf("browser-es-module-loader.js") !== -1) {
+        current = scripts[i];
+        break;
+      }
+    }
+    if (!current)
+      throw Error("Could not find own <script> element");
   }
   script = current.src.substr(0, current.src.lastIndexOf("/")) + "/" + script;
   this._workers = new Array(size);