| /** | 
 |  * @licstart The following is the entire license notice for the | 
 |  * Javascript code in this page | 
 |  * | 
 |  * Copyright 2020 Mozilla Foundation | 
 |  * | 
 |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
 |  * you may not use this file except in compliance with the License. | 
 |  * You may obtain a copy of the License at | 
 |  * | 
 |  *     http://www.apache.org/licenses/LICENSE-2.0 | 
 |  * | 
 |  * Unless required by applicable law or agreed to in writing, software | 
 |  * distributed under the License is distributed on an "AS IS" BASIS, | 
 |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 |  * See the License for the specific language governing permissions and | 
 |  * limitations under the License. | 
 |  * | 
 |  * @licend The above is the entire license notice for the | 
 |  * Javascript code in this page | 
 |  */ | 
 | "use strict"; | 
 |  | 
 | function xmlEncode(s) { | 
 |   var i = 0, | 
 |       ch; | 
 |   s = String(s); | 
 |  | 
 |   while (i < s.length && (ch = s[i]) !== "&" && ch !== "<" && ch !== '"' && ch !== "\n" && ch !== "\r" && ch !== "\t") { | 
 |     i++; | 
 |   } | 
 |  | 
 |   if (i >= s.length) { | 
 |     return s; | 
 |   } | 
 |  | 
 |   var buf = s.substring(0, i); | 
 |  | 
 |   while (i < s.length) { | 
 |     ch = s[i++]; | 
 |  | 
 |     switch (ch) { | 
 |       case "&": | 
 |         buf += "&"; | 
 |         break; | 
 |  | 
 |       case "<": | 
 |         buf += "<"; | 
 |         break; | 
 |  | 
 |       case '"': | 
 |         buf += """; | 
 |         break; | 
 |  | 
 |       case "\n": | 
 |         buf += "
"; | 
 |         break; | 
 |  | 
 |       case "\r": | 
 |         buf += "
"; | 
 |         break; | 
 |  | 
 |       case "\t": | 
 |         buf += "	"; | 
 |         break; | 
 |  | 
 |       default: | 
 |         buf += ch; | 
 |         break; | 
 |     } | 
 |   } | 
 |  | 
 |   return buf; | 
 | } | 
 |  | 
 | function DOMElement(name) { | 
 |   this.nodeName = name; | 
 |   this.childNodes = []; | 
 |   this.attributes = {}; | 
 |   this.textContent = ""; | 
 |  | 
 |   if (name === "style") { | 
 |     this.sheet = { | 
 |       cssRules: [], | 
 |       insertRule: function (rule) { | 
 |         this.cssRules.push(rule); | 
 |       } | 
 |     }; | 
 |   } | 
 | } | 
 |  | 
 | DOMElement.prototype = { | 
 |   getAttribute: function DOMElement_getAttribute(name) { | 
 |     if (name in this.attributes) { | 
 |       return this.attributes[name]; | 
 |     } | 
 |  | 
 |     return null; | 
 |   }, | 
 |   getAttributeNS: function DOMElement_getAttributeNS(NS, name) { | 
 |     if (name in this.attributes) { | 
 |       return this.attributes[name]; | 
 |     } | 
 |  | 
 |     if (NS) { | 
 |       var suffix = ":" + name; | 
 |  | 
 |       for (var fullName in this.attributes) { | 
 |         if (fullName.slice(-suffix.length) === suffix) { | 
 |           return this.attributes[fullName]; | 
 |         } | 
 |       } | 
 |     } | 
 |  | 
 |     return null; | 
 |   }, | 
 |   setAttribute: function DOMElement_setAttribute(name, value) { | 
 |     value = value || ""; | 
 |     value = xmlEncode(value); | 
 |     this.attributes[name] = value; | 
 |   }, | 
 |   setAttributeNS: function DOMElement_setAttributeNS(NS, name, value) { | 
 |     this.setAttribute(name, value); | 
 |   }, | 
 |   appendChild: function DOMElement_appendChild(element) { | 
 |     var childNodes = this.childNodes; | 
 |  | 
 |     if (!childNodes.includes(element)) { | 
 |       childNodes.push(element); | 
 |     } | 
 |   }, | 
 |   hasChildNodes: function DOMElement_hasChildNodes() { | 
 |     return this.childNodes.length !== 0; | 
 |   }, | 
 |   cloneNode: function DOMElement_cloneNode() { | 
 |     var newNode = new DOMElement(this.nodeName); | 
 |     newNode.childNodes = this.childNodes; | 
 |     newNode.attributes = this.attributes; | 
 |     newNode.textContent = this.textContent; | 
 |     return newNode; | 
 |   }, | 
 |   toString: function DOMElement_toString() { | 
 |     var buf = []; | 
 |     var serializer = this.getSerializer(); | 
 |     var chunk; | 
 |  | 
 |     while ((chunk = serializer.getNext()) !== null) { | 
 |       buf.push(chunk); | 
 |     } | 
 |  | 
 |     return buf.join(""); | 
 |   }, | 
 |   getSerializer: function DOMElement_getSerializer() { | 
 |     return new DOMElementSerializer(this); | 
 |   } | 
 | }; | 
 |  | 
 | function DOMElementSerializer(node) { | 
 |   this._node = node; | 
 |   this._state = 0; | 
 |   this._loopIndex = 0; | 
 |   this._attributeKeys = null; | 
 |   this._childSerializer = null; | 
 | } | 
 |  | 
 | DOMElementSerializer.prototype = { | 
 |   getNext: function DOMElementSerializer_getNext() { | 
 |     var node = this._node; | 
 |  | 
 |     switch (this._state) { | 
 |       case 0: | 
 |         ++this._state; | 
 |         return "<" + node.nodeName; | 
 |  | 
 |       case 1: | 
 |         ++this._state; | 
 |  | 
 |         if (node.nodeName === "svg:svg") { | 
 |           return ' xmlns:xlink="http://www.w3.org/1999/xlink"' + ' xmlns:svg="http://www.w3.org/2000/svg"'; | 
 |         } | 
 |  | 
 |       case 2: | 
 |         ++this._state; | 
 |         this._loopIndex = 0; | 
 |         this._attributeKeys = Object.keys(node.attributes); | 
 |  | 
 |       case 3: | 
 |         if (this._loopIndex < this._attributeKeys.length) { | 
 |           var name = this._attributeKeys[this._loopIndex++]; | 
 |           return " " + name + '="' + xmlEncode(node.attributes[name]) + '"'; | 
 |         } | 
 |  | 
 |         ++this._state; | 
 |         return ">"; | 
 |  | 
 |       case 4: | 
 |         if (node.nodeName === "svg:tspan" || node.nodeName === "svg:style") { | 
 |           this._state = 6; | 
 |           return xmlEncode(node.textContent); | 
 |         } | 
 |  | 
 |         ++this._state; | 
 |         this._loopIndex = 0; | 
 |  | 
 |       case 5: | 
 |         var value; | 
 |  | 
 |         while (true) { | 
 |           value = this._childSerializer && this._childSerializer.getNext(); | 
 |  | 
 |           if (value !== null) { | 
 |             return value; | 
 |           } | 
 |  | 
 |           var nextChild = node.childNodes[this._loopIndex++]; | 
 |  | 
 |           if (nextChild) { | 
 |             this._childSerializer = new DOMElementSerializer(nextChild); | 
 |           } else { | 
 |             this._childSerializer = null; | 
 |             ++this._state; | 
 |             break; | 
 |           } | 
 |         } | 
 |  | 
 |       case 6: | 
 |         ++this._state; | 
 |         return "</" + node.nodeName + ">"; | 
 |  | 
 |       case 7: | 
 |         return null; | 
 |  | 
 |       default: | 
 |         throw new Error("Unexpected serialization state: " + this._state); | 
 |     } | 
 |   } | 
 | }; | 
 | const document = { | 
 |   childNodes: [], | 
 |  | 
 |   get currentScript() { | 
 |     return { | 
 |       src: "" | 
 |     }; | 
 |   }, | 
 |  | 
 |   get documentElement() { | 
 |     return this; | 
 |   }, | 
 |  | 
 |   createElementNS: function (NS, element) { | 
 |     var elObject = new DOMElement(element); | 
 |     return elObject; | 
 |   }, | 
 |   createElement: function (element) { | 
 |     return this.createElementNS("", element); | 
 |   }, | 
 |   getElementsByTagName: function (element) { | 
 |     if (element === "head") { | 
 |       return [this.head || (this.head = new DOMElement("head"))]; | 
 |     } | 
 |  | 
 |     return []; | 
 |   } | 
 | }; | 
 |  | 
 | function Image() { | 
 |   this._src = null; | 
 |   this.onload = null; | 
 | } | 
 |  | 
 | Image.prototype = { | 
 |   get src() { | 
 |     return this._src; | 
 |   }, | 
 |  | 
 |   set src(value) { | 
 |     this._src = value; | 
 |  | 
 |     if (this.onload) { | 
 |       this.onload(); | 
 |     } | 
 |   } | 
 |  | 
 | }; | 
 | exports.document = document; | 
 | exports.Image = Image; | 
 | var exported_symbols = Object.keys(exports); | 
 |  | 
 | exports.setStubs = function (namespace) { | 
 |   exported_symbols.forEach(function (key) { | 
 |     console.assert(!(key in namespace), "property should not be set: " + key); | 
 |     namespace[key] = exports[key]; | 
 |   }); | 
 | }; | 
 |  | 
 | exports.unsetStubs = function (namespace) { | 
 |   exported_symbols.forEach(function (key) { | 
 |     console.assert(key in namespace, "property should be set: " + key); | 
 |     delete namespace[key]; | 
 |   }); | 
 | }; |