{"version":3,"sources":["../lib/00-start.js","../lib/01-eventsource-constructor-polyfill.js","../lib/02-utils.js","../lib/10-URIMapCacher.js","../lib/20-CSSStyleSheetDetector.js","../lib/csssourceinterceptor.js","../lib/protocolloadfallbackhandler.js","../lib/sourceinterceptor.js","../lib/~~-end.js"],"sourcesContent":["\"use strict\";\n\n(function(){\nif(typeof module != \"undefined\"){\n  module.exports = (...x)=>module.exports.init(...x)\n  module.exports.init = init;\n}else{\n  init();\n}\nfunction init(options){\n\noptions = options || {};\n\nvar pfh;\n\nif(typeof module != \"undefined\"){\n  pfh = module.exports;\n  pfh.options = {};\n}else{\n  pfh = self;\n}\n\nfor(let [name,val] of [\n  ['replaceFetch', true],\n  ['replaceXMLHttpRequest', true],\n  ['serviceWorkerDoesHandleLoadFallbackHandlers', false],\n  ['serviceWorkerPrefix', location.origin + \"/proxy/\"],\n  ['fallbackProxyAvailable', false],\n  ['proxybase', location.origin + \"/proxy/\"]\n]){\n  if(typeof self[name] == 'undefined'){\n    if(name in options){\n      self[name] = options[name];\n    }else{\n      self[name] = val;\n    }\n  }\n  if(pfh != self && typeof pfh.options[name] == 'undefined')\n    Object.defineProperty(pfh.options,name,{\n      enumerable: true,\n      configurable: true,\n      get: ()=>self[name],\n      set(val){self[name]=val;}\n    });\n}\n\nfunction exportGlobal(name,value,keep){\n  if(name in self && keep)\n    return;\n  self[name] = value;\n  if(pfh != self){\n    Object.defineProperty(pfh,name,{\n      enumerable: true,\n      configurable: true,\n      get: ()=>self[name],\n      set(val){self[name]=val;}\n    });\n  }\n}\n\n// See ~~-end.js for the end of the function that wraps everything\n","try {\n  new EventTarget();\n} catch(e) {\n  // If the EventTarget constructor isn't supported, replace it with a polyfill\n  let listeners = Symbol(\"listeners\");\n  exportGlobal('nativeEventTarget',EventTarget,true);\n  exportGlobal('EventTarget', function EventTarget(){\n    if(!new.target)\n      throw new TypeError(\"class constructors must be invoked with |new|\");\n    function EventTarget(){\n      this[listeners] = {};\n    }\n    EventTarget.prototype = {\n      addEventListener(type, callback){\n        if(!this[listeners][type])\n          this[listeners][type] = [];\n        this[listeners][type].push(callback);\n      },\n      removeEventListener(type, callback){\n        var list = this[listeners][type];\n        if(!list) return;\n        var i = this[listeners][type].indexOf(callback);\n        if(i == -1) return;\n        list.splice(i, 1);\n      },\n      dispatchEvent(event){\n        var list = this[listeners][event.type];\n        if(!list) return true;\n        for( var i=0,n=list.length; i<n; i++)\n          list[i].call(this, event);\n        return !event.defaultPrevented;\n      }\n    };\n    // fake the instanceof check for EventTarget instances with this function to return true\n    Object.setPrototypeOf(EventTarget.prototype, nativeEventTarget.prototype); // \n    // Correct prototype from new\n    Object.setPrototypeOf(Object.getPrototypeOf(this),EventTarget.prototype);\n    EventTarget.apply(this);\n  });\n  // fake the instanceof check for nativeEventTarget instances with this function to return true\n  EventTarget.prototype = nativeEventTarget.prototype;\n}\n","\nexportGlobal(\"PFHUtils\",{\n\n  logStack(){\n    console.log(new Error().stack);\n  },\n\n  ucfirst(string){\n    return string.charAt(0).toUpperCase() + string.slice(1);\n  },\n\n  parseRange(str){\n    let ranges = str.split(/ *, */);\n    var result = [];\n    for(let range of ranges){\n      var r=null, a=[];\n      if(r=range.match(/^(\\d+)-(\\d+)$/)){\n        a = Array.from(new Uint32Array(r[2]-r[1]+1)).map((x,i)=>(i+ +r[1]).toString());\n      }else if(r=range.match(/^(\\d+)$/)){\n        a = [r[1]];\n      }\n      result = result.concat(a);\n    }\n    return Array.from(new Set(result));\n  },\n\n  readStreamToReadableStream(stream){\n    if(!stream.readable)\n      throw new Error(\"Stream isn't readable\");\n    return new ReadableStream({\n      start(controller){\n        stream.on(\"data\",chunk=>{\n          controller.enqueue(chunk);\n        });\n        stream.on(\"end\",()=>{\n          controller.close();\n        });\n      }\n    });\n  }\n\n});\n","new (class URIMapCacher extends EventTarget {\n  constructor(){\n    super();\n    this.list = [];\n    if(self.URIMapCacher){\n      this.list = self.URIMapCacher.list;\n    }\n    exportGlobal('URIMapCacher',this);\n  }\n  getURL(uri){\n    for(let entry of this.list){\n      if(entry.uri != uri)\n        continue;\n      entry.refcount++;\n      if(entry.url)\n        return entry.url;\n      if(entry.promise)\n        return entry.promise.then(()=>entry.url,()=>null);\n      entry.refcount--;\n      return null;\n    }\n    return null;\n  }\n  getURI(url){\n    for(let entry of this.list){\n      if(entry.url != url)\n        continue;\n      return entry.uri;\n    }\n    return null;\n  }\n  set(uri, url){\n    if(url instanceof Promise){\n      let e = null;\n      for(let entry of this.list){\n        if(entry.uri != uri)\n          continue;\n        e = entry;\n        break;\n      }\n      if(e){\n        e.refcount++;\n      }else{\n        this.list.push(e={\n          uri,\n          refcount: 1\n        });\n      }\n      if(!e.promise){\n        e.promise = new Promise((resolve,reject)=>{\n          e.resolve = resolve;\n          e.reject = reject;\n        });\n      }\n      e.lastprom = url;\n      return url.then(res=>{\n        if(url != e.lastprom && !e.aborted)\n          return false;\n        delete e.lastprom;\n        delete e.aborted;\n        if(e.url){\n          this.dispatchEvent(\n            new CustomEvent(\"urlchange\",{\n              detail: {\n                oldurl: e.url,\n                url: res,\n                uri: e.uri\n              }\n            })\n          );\n        }else{\n          this.dispatchEvent(\n            new CustomEvent(\"newurl\",{\n              detail: {\n                url: res,\n                uri: e.uri\n              }\n            })\n          );\n        }\n        e.url = res;\n        e.resolve();\n        delete e.promise;\n        delete e.resolve;\n        delete e.reject;\n        return true;\n      },err=>{\n        if(url != e.lastprom)\n          return;\n        e.aborted = true;\n        if(!e.url)\n          this.remove(e,err);\n        delete e.promise;\n        delete e.resolve;\n        delete e.reject;\n        return false;\n      });\n    }\n    if( uri == url )\n      return false;\n    for(let entry of this.list){\n      if(entry.uri != uri)\n        continue;\n      entry.refcount++;\n      if(entry.url != url){\n        this.dispatchEvent(\n          new CustomEvent(\"urlchange\",{\n            detail: {\n              oldurl: entry.url,\n              url: url,\n              uri: entry.uri\n            }\n          })\n        );\n        entry.url = url;\n      }\n      return true;\n    }\n    this.list.push({\n      url, uri,\n      refcount: 1\n    });\n    this.dispatchEvent( new CustomEvent(\"newurl\",{ detail: { url, uri } }) );\n    return true;\n  }\n  remove(entry,err){\n    var i = this.list.indexOf(entry);\n    if(i == -1)\n      return;\n    if(entry.reject)\n      entry.reject(err);\n    entry.refcount = 0;\n    this.dispatchEvent(\n      new CustomEvent(\"removed\",{\n        detail: {\n          url: entry.url,\n          uri: entry.uri\n        }\n      })\n    );\n    this.list.splice(i,1);\n  }\n  release(url){\n    for(let i=0,n=this.list.length; i<n; i++){\n      let entry = this.list[i];\n      if(entry.url == url){\n        if(!--entry.refcount){\n          this.remove(entry);\n        }\n        return true;\n      }\n    }\n    return false;\n  }\n})();\n","(function(){\n  if(!self.$pfh_lastCheckStyleSheets)\n    self.$pfh_lastCheckStyleSheets = [];\n  if(self.$pfh_interval)\n    clearInterval(self.$pfh_interval);\n  self.$pfh_interval = setInterval(function(){\n    var checked = Symbol('checked');\n    for( stylesheet of Array.from(document.styleSheets) ){\n      var i = $pfh_lastCheckStyleSheets.indexOf(stylesheet);\n      if(i == -1){\n        $pfh_lastCheckStyleSheets.push(stylesheet);\n        dispatchEvent(new CustomEvent(\"stylesheetadded\",{detail:stylesheet}));\n      }\n      stylesheet[checked] = true;\n    }\n    for( var i=0; i<$pfh_lastCheckStyleSheets.length; i++ ){\n      if($pfh_lastCheckStyleSheets[i][checked]){\n        delete $pfh_lastCheckStyleSheets[i][checked];\n      }else{\n        var stylesheet = $pfh_lastCheckStyleSheets.splice(i--,1)[0];\n        dispatchEvent(new CustomEvent(\"stylesheetremoved\",{detail:stylesheet}));\n      }\n    }\n  }, 333);\n})();\n","if(!CSS.escape)\n  CSS.escape = x=>JSON.stringify(x).substr(1,x.length);\n\nnew (class CSSSourceIntercepter {\n\n  constructor(){\n\n    if(!self.CSSSourceIntercepter){\n      exportGlobal('CSSSourceIntercepter',this);\n\n      let subject = document.createElement(\"div\");\n\n      for( let method of Object.getOwnPropertyNames(new.target.prototype) ){\n        if(method == 'constructor')\n          continue;\n        if(!(this[method] instanceof Function))\n          continue;\n        for( let styleinterface of [\n          self.CSSStyleDeclaration,\n          self.CSS2Properties,\n          Object.getPrototypeOf(subject.style)\n        ]){\n          if(!styleinterface)\n            continue;\n          if(styleinterface.prototype)\n            styleinterface = styleinterface.prototype;\n          if(!styleinterface[method])\n            continue;\n          if((\"native\"+PFHUtils.ucfirst(method)) in styleinterface)\n            continue;\n          Object.defineProperty(styleinterface,\"native\"+PFHUtils.ucfirst(method),{\n            enumerable: false,\n            configurable: true,\n            value: styleinterface[method]\n          });\n          delete styleinterface[method];\n          Object.defineProperty(styleinterface,method,{\n            enumerable: false,\n            configurable: true,\n            value(...args){\n              return self.CSSSourceIntercepter[method](this,...args);\n            }\n          });\n        }\n      }\n\n      for( let styleinterface of [\n        self.CSSStyleDeclaration,\n        self.CSS2Properties,\n        self.CSSStyleRule,\n        Object.getPrototypeOf(subject.style)\n      ]){\n        if(!styleinterface)\n          continue;\n        if(styleinterface.prototype)\n          styleinterface = styleinterface.prototype;\n        if(Object.getOwnPropertyDescriptor(styleinterface,\"nativeCssText\"))\n          continue;\n        let desc = Object.getOwnPropertyDescriptor(styleinterface,\"cssText\");\n        if(!desc)\n          continue;\n        desc.enumerable = false;\n        Object.defineProperty(styleinterface,\"nativeCssText\",desc);\n        delete styleinterface[\"cssText\"];\n        Object.defineProperty(styleinterface,\"cssText\",{\n          enumerable: true,\n          configurable: true,\n          get(){\n            return self.CSSSourceIntercepter.CSSTransformURLs(this.nativeCssText);\n          },\n          set(value){\n            if(this instanceof CSSStyleRule)\n              return;\n            this.nativeCssText = self.CSSSourceIntercepter.CSSTransformURIs(this,\"cssText\",value);\n          }\n        });\n      }\n\n      {\n        let desc = Object.getOwnPropertyDescriptor(HTMLElement.prototype,'style');\n        desc.enumerable = false;\n        Object.defineProperty(HTMLElement.prototype,\"nativeStyle\",desc);\n        delete HTMLElement.prototype.style;\n        Object.defineProperty(HTMLElement.prototype,\"style\",{\n          enumerable: true,\n          configurable: true,\n          get(){\n            return this.nativeStyle;\n          },\n          set(value){\n            this.nativeStyle.cssText = value;\n          }\n        });\n      }\n\n      for(let attr in subject.style){\n        if(attr in this)\n          continue;\n        if(typeof subject.style[attr] != \"string\")\n          continue;\n        let attr_dashes = attr.replace(/[A-Z]/g,x=>\"-\"+x.toLowerCase());\n        if(!CSS.supports(attr_dashes,\"url(.)\"))\n          continue;\n        let desc = {\n          enumerable: true,\n          configurable: true,\n          get(){\n            return self.CSSSourceIntercepter.getPropertyValue(this,attr_dashes);\n          },\n          set(value){\n            self.CSSSourceIntercepter.setProperty(this,attr_dashes,value);\n          }\n        };\n        for( let styleinterface of [\n          self.CSSStyleDeclaration,\n          self.CSS2Properties,\n          Object.getPrototypeOf(subject.style)\n        ]){\n          if(!styleinterface)\n            continue;\n          if(styleinterface.prototype)\n            styleinterface = styleinterface.prototype;\n          delete styleinterface[attr];\n          Object.defineProperty(styleinterface,attr,desc);\n          if(attr != attr_dashes){\n            desc.enumerable = false;\n            delete styleinterface[attr_dashes];\n            Object.defineProperty(styleinterface,attr_dashes,desc);\n          }\n        }\n      }\n\n      addEventListener(\n        \"stylesheetadded\",\n        event => self.CSSSourceIntercepter.processStyleSheet(event.detail)\n      );\n\n    }\n\n    for(let stylesheet of Array.from(document.styleSheets))\n      this.processStyleSheet(stylesheet);\n\n    exportGlobal('CSSSourceIntercepter',this);\n  }\n\n  processStyle(style){\n    for( let name of Array.from(style) ){\n      if(!CSS.supports(name,\"url(.)\"))\n        continue;\n      style[name] = style[name];\n    }\n  }\n\n  processStyleSheet(stylesheet){\n    for( let rule of Array.from(stylesheet.cssRules) ){\n      if(rule instanceof CSSGroupingRule){\n        process(rule);\n      }else if(rule instanceof CSSStyleRule){\n        this.processStyle(rule.style);\n      }\n    }\n  }\n\n  CSSUnescape(value){\n    value = value.replace(/\\\\[^bfnrtu\\\\]/g,x=>x.substr(1));\n    value = JSON.parse('\"'+value+'\"');\n    return decodeURI(value);\n  }\n\n  getCSSURIs(value){\n    return ((\"\"+value).match(/url\\(\\s*([^)]+|'[^']+'|\"[^\"]+\")\\s*\\)/g)||[])\n      .map(uri=>this.CSSUnescape(uri.match(/^url\\(\\s*(['\"]?)(.*)\\1\\s*\\)$/)[2].trim()))\n      .filter(uri=>/^[a-z0-9+-.]+:/i.test(uri))\n      .filter(uri=>!protocolLoadFallbackHandler.isURIexempt(uri));\n  }\n\n  CSSURIReplace(value,uri,url){\n    return value.replace(/url\\(\\s*([^)]+|'[^']+'|\"[^\"]+\")\\s*\\)/g,val=>{\n      let tmp = val.match(/^url\\(\\s*(['\"]?)(.*)\\1\\s*\\)$/)[2].trim();\n      tmp = this.CSSUnescape(tmp);\n      if(tmp == decodeURI(uri))\n        return 'url(\"'+CSS.escape(url)+'\")';\n      return val;\n    });\n  }\n\n  CSSTransformURIs(style,name,value){\n    var uris = this.getCSSURIs(value);\n    for(let uri of uris){\n      let decoded_uri = decodeURI(uri);\n      let result = protocolLoadFallbackHandler.getCheckVirtualImageURL(decoded_uri);\n      let loadable_uri = result instanceof Promise ? decoded_uri : result;\n      if(result instanceof Promise)\n        result.then(url=>this.applyLoadableURL(style,name,uri,url));\n      value = this.CSSURIReplace(value,uri,loadable_uri);\n    }\n    return value;\n  }\n\n  CSSTransformURLs(value){\n    var uris = this.getCSSURIs(value)\n    for(let uri of uris){\n      let decoded_uri = this.CSSUnescape(uri);\n      let url = protocolLoadFallbackHandler.getURIfromURL(decoded_uri);\n      value = this.CSSURIReplace(value, uri, url);\n    }\n    return value;\n  }\n\n  applyLoadableURL(style,name,uri,url){\n    if(uri == url)\n      return;\n    var value = style.nativeGetPropertyValue(name);\n    var newvalue = this.CSSURIReplace(value,uri,url);\n    if(value == newvalue)\n      return;\n    style.nativeSetProperty(name,newvalue);\n  }\n\n  getPropertyValue(style,name){\n    var value = style.nativeGetPropertyValue(name);\n    return this.CSSTransformURLs(value);\n  }\n\n  setProperty(style,name,value){\n    value = this.CSSTransformURIs(style,name,value);\n    return style.nativeSetProperty(name,value);\n  }\n\n})();\n","\nexportGlobal('ProtocolLoadFallbackHandlerError',\n  class ProtocolLoadFallbackHandlerError extends Error {\n    constructor(messageOrError,soft){\n      super(messageOrError && (messageOrError.message || messageOrError));\n      if(messageOrError instanceof Error)\n        Object.setPrototypeOf(this,messageOrError);\n      this.soft = soft || false;\n    }\n  }\n);\n\nnew (class ProtocolLoadFallbackHandler {\n  constructor(){\n    exportGlobal('nativeFetch',fetch,true);\n    exportGlobal('nativeXMLHttpRequest',XMLHttpRequest,true);\n    if(replaceXMLHttpRequest)\n      exportGlobal('XMLHttpRequest',this.XMLHttpRequest);\n    if(replaceFetch)\n      exportGlobal('fetch', (...args)=>this.fetch(...args));\n    this.handlers = new Map();\n    if(self.protocolLoadFallbackHandler){\n      this.handlers = protocolLoadFallbackHandler.handlers;\n      removeEventListener(\"error\",self.protocolLoadFallbackHandler.$onerror);\n    }\n    exportGlobal('protocolLoadFallbackHandler', this);\n    this.$onerror = (...args) => this.onerror(...args);\n    addEventListener(\"error\",this.$onerror,true);\n  }\n  isURIexempt(uri){\n    if(!/^[a-zA-Z0-9+-.]*:/.test(uri))\n      return true;\n    if( uri.startsWith(location.protocol)\n     || uri.startsWith(\"http:\")\n     || uri.startsWith(\"https:\")\n     || uri.startsWith(\"file:\")\n     || uri.startsWith(\"blob:\")\n    ) return true;\n    if(fallbackProxyAvailable && uri.startsWith(proxybase))\n      return true;\n    if( serviceWorkerDoesHandleLoadFallbackHandlers\n     && navigator.serviceWorker\n     && navigator.serviceWorker.controller\n     && uri.startsWith(serviceWorkerPrefix)\n    ) return true;\n    return false;\n  }\n  makeVirtualURI(uri){\n    let cached = URIMapCacher.getURL(uri);\n    if(cached)\n      return Promise.resolve(cached);\n    let doit = ()=>{\n      if(typeof uri != \"string\")\n        return Promise.reject(new ProtocolLoadFallbackHandlerError(\"uri must be a string\"));\n      if( this.isURIexempt(uri) )\n        return uri;\n      if( serviceWorkerDoesHandleLoadFallbackHandlers\n      && navigator.serviceWorker && navigator.serviceWorker.controller\n      ){\n        return serviceWorkerPrefix + btoa(uri);\n      }else{\n        var scheme = uri.match(/^([^:]+):/);\n        scheme = scheme && scheme[1] || null;\n        if(!scheme)\n          return uri;\n        return this.getHandler(scheme).then(handler=>{\n          if(handler.makeVirtualURI){\n            return handler.makeVirtualURI(uri);\n          }else{\n            return handler.fetch(uri)\n                    .then(reponse=>reponse.blob())\n                    .then(blob=>URL.createObjectURL(blob));\n          }\n        }).catch(e=>{\n          if(!e.soft || !fallbackProxyAvailable)\n            throw e;\n          return proxybase + btoa(uri);\n        });\n      }\n    };\n    var res = doit();\n    URIMapCacher.set(uri,res);\n    return Promise.resolve(res);\n  }\n  getURIfromURL(url){\n    if(fallbackProxyAvailable && uri.startsWith(proxybase))\n      return url.substr(proxybase);\n    if( serviceWorkerDoesHandleLoadFallbackHandlers\n     && navigator.serviceWorker\n     && navigator.serviceWorker.controller\n     && uri.startsWith(serviceWorkerPrefix)\n    ) return url.substr(serviceWorkerPrefix);\n    if(this.isURIexempt(url))\n      return url;\n    return URIMapCacher.getURI(url) || url;\n  }\n  getCheckVirtualImageURL(uri){\n    if(this.isURIexempt(uri))\n      return uri;\n    var res = URIMapCacher.getURL(uri);\n    if(res) return res;\n    return new Promise(resolve=>{\n      var image = new Image();\n      image.$ignorefallbackhandler = true;\n      image.src = uri;\n      var resolved = false;\n      let finish = result => {\n        if(resolved)\n          return;\n        resolved = true;\n        if(!result){\n          resolve(this.makeVirtualURI(uri));\n        }else{\n          resolve(uri);\n        }\n      };\n      image.onerror = ()=>{\n        finish(false);\n      };\n      image.onload = ()=>{\n        finish(true);\n      };\n    });\n  }\n  get XMLHttpRequest(){\n    var events = [\n      \"abort\", \"error\", \"load\",\n      \"loadstart\", \"progress\",\n      \"timeout\", \"loadend\",\n      \"readystatechange\"\n    ];\n    var esym = {};\n    var priv = Symbol(\"priv\");\n    var onerror = Symbol(\"onerror\");\n    var onabort = Symbol(\"onabort\");\n    var onload = Symbol(\"onload\");\n    var onloadstart = Symbol(\"onloadstart\");\n    var onloadend = Symbol(\"onloadend\");\n    var onprogress = Symbol(\"onprogress\");\n    var onreadystatechange = Symbol(\"onreadystatechange\");\n    var ontimeout = Symbol(\"ontimeout\");\n    var fetchresolve = Symbol(\"fetchresolve\");\n    var fetchfailure = Symbol(\"fetchfailure\");\n    var setreadystate = Symbol(\"setreadystate\");\n    var XMLHttpRequest = class XMLHttpRequest extends EventTarget {\n      constructor(){\n        super();\n        var p = this[priv] = {\n          headers: [],\n          native: true,\n          request: null,\n          requestHeaders: null,\n          responseHeaders: null,\n          responseType: \"\",\n          response: null,\n          fetchPromise: null,\n          fetchController: null,\n          withCredentials: false,\n          status: 0,\n          statusText: \"\",\n          forcedMime: null,\n          readyState: XMLHttpRequest.UNSENT\n        };\n        p.xhr = new nativeXMLHttpRequest();\n        p.xhr.onerror = (...a)=>this[onerror](...a);\n        p.xhr.onabort = (...a)=>this[onabort](...a);\n        p.xhr.onload = (...a)=>this[onload](...a);\n        p.xhr.onloadstart = (...a)=>this[onloadstart](...a);\n        p.xhr.onloadend = (...a)=>this[onloadend](...a);\n        p.xhr.onprogress = (...a)=>this[onprogress](...a);\n        p.xhr.onreadystatechange = (...a)=>this[onreadystatechange](...a);\n        p.xhr.ontimeout = (...a)=>this[ontimeout](...a);\n      }\n      [onerror](e){\n        var p = this[priv];\n        var event = new e.constructor(e.type,e);\n        e.preventDefault();\n        e.stopPropagation();\n        e.stopImmediatePropagation();\n        if(p.native){\n          if( ('sending' in p) && p.readyState == XMLHttpRequest.OPENED\n           && !protocolLoadFallbackHandler.isURIexempt(p.request.url)\n          ){\n            p.native = false;\n            p.readyState = XMLHttpRequest.OPENED;\n            this.send(...p.sending);\n          }else{\n            p.readyState = XMLHttpRequest.DONE;\n            this.dispatchEvent(event);\n          }\n        }\n        return false;\n      }\n      [onabort](event){\n        event = new event.constructor(event.type,event);\n        if(this[priv].native)\n          this.dispatchEvent(event);\n      }\n      [onload](event){\n        event = new event.constructor(event.type,event);\n        let p = this[priv];\n        if(p.native){\n          if(p.xhr.response && p.xhr.response instanceof Document)\n            sourceIntercepter.checkDocument(p.xhr.response);\n          this.dispatchEvent(event);\n        }\n      }\n      [onloadstart](event){\n        var p = this[priv];\n        event = new event.constructor(event.type,event);\n        if(this[priv].native){\n          if( !protocolLoadFallbackHandler.isURIexempt(p.request.url)\n           && p.xhr.readyState == XMLHttpRequest.DONE\n           && p.xhr.status == 0\n          ) return;\n          this.dispatchEvent(event);\n        }\n      }\n      [onloadend](event){\n        var p = this[priv];\n        event = new event.constructor(event.type,event);\n        if(this[priv].native){\n          if( !protocolLoadFallbackHandler.isURIexempt(p.request.url)\n           && p.xhr.readyState == XMLHttpRequest.DONE\n           && p.xhr.status == 0\n          ) return;\n          this.dispatchEvent(event);\n        }\n      }\n      [onprogress](event){\n        event = new event.constructor(event.type,event);\n        if(this[priv].native)\n          this.dispatchEvent(event);\n      }\n      [onreadystatechange](event){\n        var p = this[priv];\n        event = new event.constructor(event.type,event);\n        if(p.native){\n          if( !protocolLoadFallbackHandler.isURIexempt(p.request.url)\n           && p.xhr.readyState == XMLHttpRequest.DONE\n           && p.xhr.status == 0\n          ) return; // Ready state set from 1 to 4, likely due to an error, ignore it.\n          this.dispatchEvent(event);\n          p.readyState = p.xhr.readyState;\n        }\n      }\n      [ontimeout](event){\n        event = new event.constructor(event.type,event);\n        if(this[priv].native)\n          this.dispatchEvent(event);\n      }\n      [setreadystate](state){\n        var p = this[priv];\n        if(p.native)\n          return;\n        if(p.readyState == state)\n          return;\n        p.readyState = state;\n        this.dispatchEvent(new Event(\"readystatechange\"));\n      }\n      [fetchresolve](response){\n        var that = this;\n        var p = this[priv];\n        if(p.native)\n          return;\n        p.responseHeaders = response.headers;\n        p.status = response.status;\n        p.statusText = response.statusText;\n        this[setreadystate](XMLHttpRequest.HEADERS_RECEIVED);\n        this.dispatchEvent(new Event(\"loadstart\"));\n        function finish(response){\n          var type = p.responseType || 'text';\n          var res = Promise.resolve(null);\n          switch(type){\n            case \"text\": res = response.text(); break;\n            case \"blob\": res = response.blob(); break;\n            case \"json\": res = response.json(); break;\n            case \"arraybuffer\": res = response.arrayBuffer(); break;\n            case \"document\": {\n              res = response.text().then(text=>{\n                if(p.forcedMime)\n                  return new DOMParser().parseFromString(text, p.forcedMime);\n                try {\n                  return new DOMParser().parseFromString(text, response.headers.get(\"Content-Type\") || \"text/html\");\n                } catch(e) {\n                  return new DOMParser().parseFromString(text, \"text/html\");\n                }\n              });\n            } break;\n          }\n          res.then(function(result){\n            if(result && result instanceof Document)\n              sourceIntercepter.checkDocument(result);\n            p.response = result;\n            var progress = {\n              loaded: result && result.length || 0,\n              total: 0,\n              lengthComputable: false\n            };\n            that[setreadystate](XMLHttpRequest.DONE);\n            that.dispatchEvent(new ProgressEvent(\"loadend\",progress));\n            that.dispatchEvent(new ProgressEvent(\"load\",progress));\n          });\n        }\n        if(response.body){\n          let length = p.responseHeaders.get(\"Content-Length\");\n          if(length === null){\n            let range = p.responseHeaders.get(\"Content-Range\");\n            if(range){\n              range = range.match(/bytes (\\d+)-(\\d+)/);\n              if(range)\n                length = range[2]-range[1];\n            }\n          }\n          if(length === null){\n            let range = p.requestHeaders.get(\"Range\");\n            if(range){\n              range = range.match(/bytes=(\\d+)-(\\d+)/);\n              if(range)\n                length = range[2]-range[1];\n            }\n          }\n          let readfail = function(error){\n            if(!(error instanceof Error)){\n              that.dispatchEvent(new ErrorEvent(\"error\",{\n                message: message,\n                filename: e.fileName,\n                lineno: e.lineNumber,\n                colno: e.columnNumber,\n                error: e,\n                bubbles: false,\n                cancelable: true,\n                composed: true\n              }));\n            }\n            that[setreadystate](XMLHttpRequest.DONE);\n          };\n          var that = this;\n          let count = 0;\n          let responseCopy = response.clone();\n          let reader = response.body.getReader();\n          reader.read().then(function process({done,value}){\n            if( p.readyState != XMLHttpRequest.HEADERS_RECEIVED\n             && p.readyState != XMLHttpRequest.LOADING\n            ){\n              reader.releaseLock();\n              reader = null;\n              p.fetchController = null;\n              p.fetchPromise = null;\n              return;\n            }\n            let offset = count;\n            if(value)\n              count += value.byteLength;\n            var progress = {\n              loaded: count,\n              total: length,\n              lengthComputable: length !== null\n            };\n            that.dispatchEvent(new ProgressEvent(\"progress\",progress));\n            if(done){\n              finish(responseCopy);\n              return;\n            }\n            that[setreadystate](XMLHttpRequest.LOADING);\n            reader.read().then(process).catch(readfail);\n          }).catch(readfail);\n        }else{\n          finish(response);\n        }\n      }\n      [fetchfailure](error){\n        var p = this[priv];\n        if(p.native)\n          return;\n        var event = new ErrorEvent(\"error\",{\n          message: error.message,\n          filename: error.fileName,\n          lineno: error.lineNumber,\n          colno: error.columnNumber,\n          error: error,\n          bubbles: false,\n          cancelable: true,\n          composed: true\n        });\n        this[setreadystate](XMLHttpRequest.DONE);\n        this.dispatchEvent(event);\n      }\n      get readyState(){\n        var p = this[priv];\n        return p.native ? p.xhr.readyState : p.readyState;\n      }\n      get response(){\n        var p = this[priv];\n        if(p.native)\n          return p.xhr.response;\n        return p.response;\n      }\n      get responseText(){\n        var p = this[priv];\n        if(p.native)\n          return p.xhr.responseText;\n        if((p.responseType||'text') == 'text')\n          return p.response;\n        return null;\n      }\n      get responseURL(){\n        var p = this[priv];\n        if(p.native)\n          return p.xhr.responseURL;\n        return p.request && p.request.url || null;\n      }\n      get responseXML(){\n        var p = this[priv];\n        if(p.native)\n          return p.xhr.responseXML;\n        if(p.responseType == 'document')\n          return p.response;\n        return null;\n      }\n      get status(){\n        var p = this[priv];\n        if(p.native)\n          return p.xhr.status;\n        return p.status;\n      }\n      get statusText(){\n        var p = this[priv];\n        if(p.native)\n          return p.xhr.statusText;\n        return p.statusText;\n      }\n      get upload(){\n        var p = this[priv];\n        if(p.native)\n          return p.xhr.upload;\n        return null; // TODO\n      }\n      get responseType(){\n        var p = this[priv];\n        if(p.native)\n          return p.xhr.responseType;\n        return p.responseType || 'text';\n      }\n      set responseType(value){\n        if([ \"text\", \"arraybuffer\", \"blob\", \"json\", \"document\" ].indexOf(value) == -1 )\n          return;\n        var p = this[priv];\n        p.xhr.responseType = value;\n        p.responseType = value;\n      }\n      get withCredentials(){\n        var p = this[priv];\n        if(p.native)\n          return p.xhr.withCredentials;\n        return p.withCredentials;\n      }\n      set withCredentials(value){\n        var p = this[priv];\n        p.xhr.withCredentials = value;\n        p.withCredentials = value;\n      }\n      open(method, url, _async, user, password){\n        var p = this[priv];\n        p.request = {\n          method, url, \"async\": _async,\n          user, password\n        };\n        p.xhr.open(method, url, _async, user, password);\n        p.status = 0;\n        p.statusText = \"\";\n        p.requestHeaders = new Headers();\n        p.requestHeaders.delete('Authorization');\n        if(user || password)\n          p.requestHeaders.set('Authorization', 'Basic '+btoa(user+':'+password));\n        p.responseHeaders = null;\n        p.responseType = \"\";\n        p.response = null,\n        p.native = true;\n        p.fetchPromise = null;\n        p.fetchController = null;\n        p.withCredentials = false;\n        p.forcedMime = null;\n        this[setreadystate](XMLHttpRequest.OPENED);\n      }\n      send(...args){\n        var p = this[priv];\n        if(p.readyState != XMLHttpRequest.OPENED)\n          throw new DOMException(\"Failed to execute 'send' on 'XMLHttpRequest': The object's state must be OPENED\");\n        delete p.sending;\n        if(p.native){\n          p.sending = args;\n          return p.xhr.send(...args);\n        }else{\n          let headers = null;\n          var params = {};\n          params.method = p.request.method;\n          if(!p.requestHeaders.entries().next().done)\n            params.headers = p.requestHeaders;\n          if(args.length >= 1)\n            params.body = args[0];\n          if(typeof AbortController != 'undefined'){\n            this.fetchController = new AbortController();\n            params.signal = this.fetchController.signal;\n          }\n          p.fetchPromise = protocolLoadFallbackHandler.fetch(p.request.url,params);\n          p.fetchPromise.then(\n            response => this[fetchresolve](response),\n            error => this[fetchfailure](error)\n          );\n        }\n      }\n      abort(){\n        var p = this[priv];\n        if(p.native){\n          p.xhr.abort();\n        }else{\n          if(p.fetchController)\n            p.fetchController.abort();\n          if(p.fetchPromise)\n            this.dispatchEvent(new Event(\"abort\"));\n          p.fetchController = null;\n          p.fetchPromise = null;\n        }\n      }\n      getAllResponseHeaders(){\n        var p = this[priv];\n        if(p.native){\n          return p.xhr.getAllResponseHeaders();\n        }else{\n          let res = \"\";\n          if(p.responseHeaders)\n          for(let [key,value] of p.responseHeaders)\n            res += key + ': ' + value + \"\\r\\n\";\n          return res;\n        }\n      }\n      setRequestHeader(header, value){\n        var p = this[priv];\n        if(this.readyState != XMLHttpRequest.OPENED)\n          throw new DOMException(\"Failed to execute 'setRequestHeader' on 'XMLHttpRequest': The object's state must be OPENED\");\n        p.xhr.setRequestHeader(header, value);\n        p.requestHeaders.append(header, value);\n      }\n      getResponseHeader(headerName){\n        var p = this[priv];\n        if(p.native){\n          return p.xhr.getResponseHeader(headerName);\n        }else{\n          if(!p.responseHeaders)\n            return null;\n          return p.responseHeaders.get(headerName);\n        }\n      }\n      overrideMimeType(mimeType){\n        var p = this[priv];\n        p.forcedMime = mimeType;\n        if(p.native)\n          return p.xhr.overrideMimeType(mimeType);\n      }\n    };\n    for(let [name,value] of [\n      [\"UNSENT\",0], [\"OPENED\",1],\n      [\"HEADERS_RECEIVED\",2],\n      [\"LOADING\",3], [\"DONE\",4]\n    ]){\n      XMLHttpRequest[name] = value;\n      XMLHttpRequest.prototype[name] = value;\n    }\n    for(let event of events){\n      esym[event] = Symbol(event);\n      Object.defineProperty(XMLHttpRequest.prototype,\"on\"+event,{\n        configurable: false,\n        enumerable: true,\n        get(){\n          return XMLHttpRequest[esym[event]] || null;\n        },\n        set(value){\n          if(XMLHttpRequest[esym[event]])\n            this.removeEventListener(event,XMLHttpRequest[esym[event]]);\n          XMLHttpRequest[esym[event]] = value;\n          this.addEventListener(event,XMLHttpRequest[esym[event]]);\n        }\n      })\n    }\n    return XMLHttpRequest;\n  }\n  fetch(...args){\n    if(!args.length)\n      return Promise.reject(new ProtocolLoadFallbackHandlerError(\"Too few arguments\"));\n    var uri = null;\n    if(typeof args[0] == \"string\")\n      uri = args[0];\n    if(args[0] instanceof Request)\n      uri = args[0].url;\n    if(typeof uri != \"string\")\n      return Promise.reject(new ProtocolLoadFallbackHandlerError(\"first argument must be a string or Request object\"));\n    return nativeFetch(...args).catch(e=>{\n      if( this.isURIexempt(uri) )\n        throw e;\n      if( serviceWorkerDoesHandleLoadFallbackHandlers\n       && navigator.serviceWorker && navigator.serviceWorker.controller\n      ){\n        return nativeFetch(serviceWorkerPrefix + btoa(uri),...(args.slice(1)));\n      }else{\n        var scheme = uri.match(/^([^:]+):/);\n        scheme = scheme && scheme[1] || null;\n        if(!scheme)\n          throw e;\n        return this.getHandler(scheme).then(\n          handler => {\n            if(handler.fetch){\n              return handler.fetch(...args).catch(e=>{\n                if(!(e instanceof ProtocolLoadFallbackHandlerError) || !e.soft || !fallbackProxyAvailable)\n                  throw e;\n                return nativeFetch(proxybase + btoa(uri),...(args.slice(1)));\n              });\n            }else{\n              return handler.makeVirtualURI(uri).then(nuri=>nativeFetch(nuri,...(args.slice(1))));\n            }\n          },\n          error => {\n            throw e;\n          }\n        );\n      }\n    });\n  }\n  renderTo(element,uri){\n    var scheme = uri.match(/^([^:]+):/);\n    scheme = scheme && scheme[1] || null;\n    return this.getHandler(scheme).then(handler=>{\n      if(handler.renderTo){\n        try {\n          element.$sourcelock = true;\n          return Promise.resolve(handler.renderTo(element,uri)).then(\n            ()=>{element.$sourcelock=false;},\n            e=>{element.$sourcelock=false; throw e;}\n          );\n        }catch(e){\n          return Promise.reject(e);\n        }\n      }else{\n        return Promise.reject();\n      }\n    }).catch(e=>{\n      return this.makeVirtualURI(uri).then(nuri=>{\n        if(nuri == uri)\n          throw new ProtocolLoadFallbackHandlerError(\"Failed to obtain a supportet URI\");\n        var curi = sourceIntercepter.getSource(element);\n        if(uri != curi)\n          return;\n        sourceIntercepter.setNativeURI(element,nuri);\n      });\n    });\n  }\n  getHandler(scheme){\n    return new Promise((resolve,reject)=>{\n      var handler = this.handlers.get(scheme);\n      if(handler){\n        resolve(handler)\n        return;\n      }\n      reject(new ProtocolLoadFallbackHandlerError(\"No protocol fallback handler for scheme \"+scheme+\" available\"));\n    });\n  }\n  setHandler(name, handler){\n    if(!handler.makeVirtualURI && !handler.fetch)\n      throw new Error(\"A fallback protocol handler must have at least a fetch or a makeVirtualURI function\");\n    this.handlers.set(name, handler);\n  }\n  removeHandler(name){\n    this.handlers.delete(name);\n  }\n  onerror(event){\n    if(event.trueError)\n      return;\n    if(!(event.target instanceof HTMLElement))\n      return true;\n    if(event.target instanceof HTMLMediaElement){\n      let ple = event.target.lasterror && event.target.lasterror.mediaerror || null;\n      // A few browsers may produce errors in media elements unrelated to the media they load or play,\n      // google chrome for example produces one when it fails to load the poster image.\n      if(!event.target.error || event.target.error == ple){\n        event.preventDefault();\n        event.stopPropagation();\n        event.stopImmediatePropagation();\n        return false;\n      }\n      if(!event.message)\n        event.message = event.target.error.message;\n    }\n    if(event.target.$ignorefallbackhandler)\n      return true;\n    function trueLoadError(e){\n      var message = \"Failed to load <\"+event.target.nodeName.toLowerCase()+\"> from \"+sourceIntercepter.getSource(event.target);\n      if(!e){\n        e = new Error(message);\n      }else{\n        if(!!e.message)\n          message = message + ': ' +e.message;\n      }\n      if(!!event.message)\n        message += '\\nPrevious error from browser was: '+event.message;\n      if(e instanceof Error){\n        e = new ErrorEvent('error',{\n          message: message,\n          filename: e.fileName,\n          lineno: e.lineNumber,\n          colno: e.columnNumber,\n          error: e,\n          bubbles: false,\n          cancelable: true,\n          composed: true\n        });\n      }else if(e instanceof Event){\n        if(!(e instanceof ErrorEvent)){\n          let e2 = new ErrorEvent('error',{\n            message: message,\n            filename: e.filename,\n            lineno: e.lineno,\n            colno: e.colno,\n            error: e,\n            bubbles: false,\n            cancelable: true,\n            composed: true\n          });\n          e = e2;\n        }\n      }\n      e.trueError = true;\n      var le = new ErrorEvent(\"loaderror\",{\n        message: message,\n        filename: e.filename,\n        lineno: e.lineno,\n        colno: e.colno,\n        error: e,\n        bubbles: false,\n        cancelable: true,\n        composed: true\n      });\n      let cancelled = false;\n      cancelled = cancelled || !event.target.dispatchEvent(le);\n      cancelled = cancelled || !event.target.dispatchEvent(e);\n      if(!cancelled){\n        event.target.loadState = \"loaderror\";\n        console.error(message);\n      }\n    }\n    sourceIntercepter.check(event.target);\n    var uri = sourceIntercepter.getSource(event.target);\n    var lasterror = event.target.lasterror;\n    event.target.lasterror = {\n      event: event,\n      source: uri\n    };\n    if(event.target instanceof HTMLMediaElement)\n      event.target.lasterror.mediaerror = event.target.error;\n    if( !uri || this.isURIexempt(uri)\n     || (lasterror && lasterror.source == uri)\n    ){\n      trueLoadError(event);\n      return true;\n    }\n    event.target.loadState = \"loading\";\n    event.preventDefault();\n    event.stopPropagation();\n    event.stopImmediatePropagation();\n    if( serviceWorkerDoesHandleLoadFallbackHandlers\n     && navigator.serviceWorker && navigator.serviceWorker.controller\n    ){\n      sourceIntercepter.setNativeURI(event.target,serviceWorkerPrefix + btoa(uri));\n    }else{\n      this.renderTo(event.target,uri).catch(e=>{\n        trueLoadError(e);\n      });\n    }\n    return false;\n  }\n})();\n","new (class SourceIntercepter {\n  constructor(){\n    var that = this;\n    this.nodeTypes = new Map();\n    for( let desc of Object.values(Object.getOwnPropertyDescriptors(window)) )\n      try {\n        if(desc.value.prototype instanceof Node)\n          this.nodeTypes.set(desc.value.name, desc.value);\n      } catch(e) {}\n    var excludeList = [\n      HTMLAnchorElement,\n      HTMLAreaElement\n    ];\n    for(let [name,type] of this.nodeTypes){\n      let hasLoadableKeys = [];\n      for(let key of ['src','href','srcset'])\n        if(key in type.prototype)\n          hasLoadableKeys.push(key);\n      if(!hasLoadableKeys.length)\n        continue;\n      if(excludeList.indexOf(type) != -1)\n        continue;\n      this.control(type);\n    }\n    this.$onload = function(event){return sourceIntercepter.onload(this,event);};\n    this.$onready = function(event){return sourceIntercepter.onready(this,event);};\n    this.$onerror = function(event){return sourceIntercepter.onerror(this,event);};\n    delete HTMLElement.prototype.loadState;\n    Object.defineProperty(HTMLElement.prototype, 'loadState' ,{\n      enumerable: false,\n      configurable: true,\n      get(){\n        that.check(this);\n        return this.$loadState;\n      },\n      set(state){\n        if(state && [\"loaderror\",\"loading\",\"ready\",\"loaded\"].indexOf(state) == -1)\n          throw Error(\"invalid state\");\n        this.classList.remove(\"loaded\");\n        this.classList.remove(\"ready\");\n        this.classList.remove(\"loaderror\");\n        this.classList.remove(\"loading\");\n        if(state)\n          this.classList.add(state);\n        this.$loadState = state || null;\n      }\n    });\n    this.checkDocument(document);\n    exportGlobal('sourceIntercepter', this);\n  }\n  control(type){\n    var that = this;\n    for(let key of ['src','href'])\n      if(key in type.prototype)\n        this.intercept(\n          type.prototype, key,\n          function(...x){ return that.getSource(this,key,...x); },\n          function(...x){ return that.setSource(this,key,...x); }\n        );\n    if(\"poster\" in type.prototype)\n      this.intercept(\n        type.prototype, \"poster\",\n        function(){\n          return protocolLoadFallbackHandler.getURIfromURL(this.nativePoster);\n        },\n        function(value){\n          this.nativePoster = value;\n          Promise.resolve(\n            protocolLoadFallbackHandler.getCheckVirtualImageURL(this.nativePoster)\n          ).then(url=>{\n            if(this.nativePoster == value)\n              this.nativePoster = url;\n          });\n        }\n      );\n  }\n  intercept(obj,key,getter,setter){\n    var desc = Object.getOwnPropertyDescriptor(obj, 'native'+PFHUtils.ucfirst(key))\n            || Object.getOwnPropertyDescriptor(obj, key);\n    if(!desc)\n      return false;\n    var tmp = Object.create(desc);\n    tmp.enumerable = false;\n    tmp.configurable = true;\n    Object.defineProperty(obj,'native'+PFHUtils.ucfirst(key),desc);\n    delete obj[key];\n    Object.defineProperty(obj,key,{\n      enumerable: desc.enumerable,\n      configurable: true,\n      get: getter,\n      set: setter\n    });\n  }\n  checkDocument(doc){\n    if(!(doc instanceof Document))\n      return;\n    this.checkAll(doc);\n    var observer = new MutationObserver(mutationsList=>{\n      for(var mutation of mutationsList){\n        if(mutation.type != 'childList')\n          continue;\n        for(let node of mutation.addedNodes)\n          if(node instanceof HTMLElement)\n            this.check(node);\n      }\n    });\n    let onload = ()=>{\n      if([\"interactive\",\"complete\"].indexOf(doc.readyState) == -1)\n        return;\n      observer.disconnect();\n      doc.removeEventListener(\"load\",onload);\n      this.checkAll(doc);\n    };\n    if([\"interactive\",\"complete\"].indexOf(doc.readyState) == -1){\n      observer.observe(doc, {childList: true, subtree: true});\n      doc.addEventListener(\"readystatechange\",onload,true);\n    }\n  }\n  checkAll(base){\n    if(!base || !(base instanceof Node))\n      return;\n    this.check(base);\n    let n = base.children.length;\n    for(let i=0; i<n; i++)\n      this.checkAll(base.children[i]);\n  }\n  check(element){\n    if(!(element instanceof HTMLElement))\n      return;\n    if('realSource' in element)\n      return;\n    CSSSourceIntercepter.processStyle(element.style);\n    if(![\"src\",\"href\"].some(a=>a in element))\n      return;\n    element.addEventListener(\"load\",this.$onload,true);\n    element.addEventListener(\"canplaythrough\",this.$onload,true);\n    element.addEventListener(\"loadeddata\",this.$ready,true);\n    element.realSource = element.nativeSrc || element.nativeHref;\n    var state = null;\n    if('complete' in element && 'naturalWidth' in element){ // img specific checks\n      if(!element.complete){\n        state = \"loaderror\";\n      }else if(element.naturalWidth){\n        state = \"loaded\";\n      }else{\n        state = \"loading\";\n      }\n    }\n    if(element instanceof HTMLMediaElement){\n      if(element.poster)\n        element.poster = element.poster;\n      if(element.error){\n        state = \"loaderror\";\n      }else if(element.readyState == HTMLMediaElement.HAVE_NOTHING){\n        state = \"loading\";\n      }else{\n        if(element.readyState == HTMLMediaElement.HAVE_ENOUGH_DATA){\n          state = \"loaded\"; // Not quiet, but close enough\n        }else if(element.readyState){\n          state = \"ready\";\n        }else{\n          state = \"loading\";\n        }\n      }\n    }\n    if(element instanceof HTMLTrackElement){\n      switch(element.readyState){\n        case HTMLTrackElement.LOADED : state = \"loaded\"; break;\n        case HTMLTrackElement.LOADING: state = \"loading\"; break;\n        case HTMLTrackElement.ERROR  : state = \"loaderror\"; break;\n        case HTMLTrackElement.NONE   : state = null; break;\n        default: state = null; break;\n      }\n    }\n    this.loadState = state;\n  }\n  onload(element,event){\n    element.loadState = \"loaded\";\n  }\n  onready(element,event){\n    element.loadState = \"ready\";\n  }\n  onerror(event){\n    protocolLoadFallbackHandler.onerror(event);\n  }\n  getSource(target,key){\n    if(key){\n      return target.realSource || target['native'+PFHUtils.ucfirst(key)];\n    }else{\n      return target.realSource || target.nativeSrc || target.nativeHref;\n    }\n  }\n  setNativeURI(element,nuri){\n    if(element.nativeSrc){\n      element.nativeSrc = nuri;\n    }else if(element.nativeHref){\n      element.nativeHref = nuri;\n    }\n  }\n  getNativeURI(element){\n    return element.nativeSrc\n        || element.nativeHref;\n  }\n  setSource(target,key,uri){\n    if(uri == target.realSource)\n      return;\n    if(target.classList){\n      this.loadState = \"loading\";\n    }\n    if(!target.$sourcelock)\n      target.realSource = uri;\n    target.addEventListener(\"error\",this.$onerror);\n    target.addEventListener(\"load\",this.$onload,true);\n    target.addEventListener(\"canplaythrough\",this.$onload,true);\n    target.addEventListener(\"loadeddata\",this.$onready,true);\n    target['native'+PFHUtils.ucfirst(key)] = uri;\n  }\n})();\n\n","return init;\n}\nreturn init;\n})(); // see 00-start for the start of these functions.\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3wBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1NA;AACA;AACA;AACA;","file":"protocolloadfallbackhandler.js"}