{"version":3,"file":"js/chunk-vendors-8cbd2506.a1f4a1d5.js","mappings":"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","sources":["webpack://ouvidoria/./node_modules/register-service-worker/index.js","webpack://ouvidoria/./node_modules/sanitize-html/index.js"],"sourcesContent":["// Register a service worker to serve assets from local cache.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\n// cached resources are updated in the background.\n\nvar isLocalhost = function () { return Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n); }\n\nvar waitWindowLoad\n// https://github.com/yyx990803/register-service-worker/pull/33#discussion_r394181861\nif (typeof window !== 'undefined') {\n // Typically, a browser that supports `serviceWorker` should also have supported\n // `Promise`. But as this package can be used in environments without service\n // worker support (in that case it would do nothing), there's a chance that\n // `Promise` does not exist. So we must check for its existence first.\n if (typeof Promise !== 'undefined') {\n waitWindowLoad = new Promise(function (resolve) { return window.addEventListener('load', resolve); })\n } else {\n waitWindowLoad = { then: function (cb) { return window.addEventListener('load', cb); } }\n }\n}\n\nexport function register (swUrl, hooks) {\n if ( hooks === void 0 ) hooks = {};\n\n var registrationOptions = hooks.registrationOptions; if ( registrationOptions === void 0 ) registrationOptions = {};\n delete hooks.registrationOptions\n\n var emit = function (hook) {\n var args = [], len = arguments.length - 1;\n while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];\n\n if (hooks && hooks[hook]) {\n hooks[hook].apply(hooks, args)\n }\n }\n\n if ('serviceWorker' in navigator) {\n waitWindowLoad.then(function () {\n if (isLocalhost()) {\n // This is running on localhost. Lets check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, emit, registrationOptions)\n navigator.serviceWorker.ready.then(function (registration) {\n emit('ready', registration)\n }).catch(function (error) { return handleError(emit, error); })\n } else {\n // Is not local host. Just register service worker\n registerValidSW(swUrl, emit, registrationOptions)\n navigator.serviceWorker.ready.then(function (registration) {\n emit('ready', registration)\n }).catch(function (error) { return handleError(emit, error); })\n }\n })\n }\n}\n\nfunction handleError (emit, error) {\n if (!navigator.onLine) {\n emit('offline')\n }\n emit('error', error)\n}\n\nfunction registerValidSW (swUrl, emit, registrationOptions) {\n navigator.serviceWorker\n .register(swUrl, registrationOptions)\n .then(function (registration) {\n emit('registered', registration)\n if (registration.waiting) {\n emit('updated', registration)\n return\n }\n registration.onupdatefound = function () {\n emit('updatefound', registration)\n var installingWorker = registration.installing\n installingWorker.onstatechange = function () {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the old content will have been purged and\n // the fresh content will have been added to the cache.\n // It's the perfect time to display a \"New content is\n // available; please refresh.\" message in your web app.\n emit('updated', registration)\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n emit('cached', registration)\n }\n }\n }\n }\n })\n .catch(function (error) { return handleError(emit, error); })\n}\n\nfunction checkValidServiceWorker (swUrl, emit, registrationOptions) {\n // Check if the service worker can be found.\n fetch(swUrl)\n .then(function (response) {\n // Ensure service worker exists, and that we really are getting a JS file.\n if (response.status === 404) {\n // No service worker found.\n emit('error', new Error((\"Service worker not found at \" + swUrl)))\n unregister()\n } else if (response.headers.get('content-type').indexOf('javascript') === -1) {\n emit('error', new Error(\n \"Expected \" + swUrl + \" to have javascript content-type, \" +\n \"but received \" + (response.headers.get('content-type'))))\n unregister()\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, emit, registrationOptions)\n }\n })\n .catch(function (error) { return handleError(emit, error); })\n}\n\nexport function unregister () {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(function (registration) {\n registration.unregister()\n }).catch(function (error) { return handleError(emit, error); })\n }\n}\n","const htmlparser = require('htmlparser2');\nconst escapeStringRegexp = require('escape-string-regexp');\nconst { isPlainObject } = require('is-plain-object');\nconst deepmerge = require('deepmerge');\nconst parseSrcset = require('parse-srcset');\nconst { parse: postcssParse } = require('postcss');\n// Tags that can conceivably represent stand-alone media.\nconst mediaTags = [\n 'img', 'audio', 'video', 'picture', 'svg',\n 'object', 'map', 'iframe', 'embed'\n];\n// Tags that are inherently vulnerable to being used in XSS attacks.\nconst vulnerableTags = [ 'script', 'style' ];\n\nfunction each(obj, cb) {\n if (obj) {\n Object.keys(obj).forEach(function (key) {\n cb(obj[key], key);\n });\n }\n}\n\n// Avoid false positives with .__proto__, .hasOwnProperty, etc.\nfunction has(obj, key) {\n return ({}).hasOwnProperty.call(obj, key);\n}\n\n// Returns those elements of `a` for which `cb(a)` returns truthy\nfunction filter(a, cb) {\n const n = [];\n each(a, function(v) {\n if (cb(v)) {\n n.push(v);\n }\n });\n return n;\n}\n\nfunction isEmptyObject(obj) {\n for (const key in obj) {\n if (has(obj, key)) {\n return false;\n }\n }\n return true;\n}\n\nfunction stringifySrcset(parsedSrcset) {\n return parsedSrcset.map(function(part) {\n if (!part.url) {\n throw new Error('URL missing');\n }\n\n return (\n part.url +\n (part.w ? ` ${part.w}w` : '') +\n (part.h ? ` ${part.h}h` : '') +\n (part.d ? ` ${part.d}x` : '')\n );\n }).join(', ');\n}\n\nmodule.exports = sanitizeHtml;\n\n// A valid attribute name.\n// We use a tolerant definition based on the set of strings defined by\n// html.spec.whatwg.org/multipage/parsing.html#before-attribute-name-state\n// and html.spec.whatwg.org/multipage/parsing.html#attribute-name-state .\n// The characters accepted are ones which can be appended to the attribute\n// name buffer without triggering a parse error:\n// * unexpected-equals-sign-before-attribute-name\n// * unexpected-null-character\n// * unexpected-character-in-attribute-name\n// We exclude the empty string because it's impossible to get to the after\n// attribute name state with an empty attribute name buffer.\nconst VALID_HTML_ATTRIBUTE_NAME = /^[^\\0\\t\\n\\f\\r /<=>]+$/;\n\n// Ignore the _recursing flag; it's there for recursive\n// invocation as a guard against this exploit:\n// https://github.com/fb55/htmlparser2/issues/105\n\nfunction sanitizeHtml(html, options, _recursing) {\n if (html == null) {\n return '';\n }\n\n let result = '';\n // Used for hot swapping the result variable with an empty string in order to \"capture\" the text written to it.\n let tempResult = '';\n\n function Frame(tag, attribs) {\n const that = this;\n this.tag = tag;\n this.attribs = attribs || {};\n this.tagPosition = result.length;\n this.text = ''; // Node inner text\n this.mediaChildren = [];\n\n this.updateParentNodeText = function() {\n if (stack.length) {\n const parentFrame = stack[stack.length - 1];\n parentFrame.text += that.text;\n }\n };\n\n this.updateParentNodeMediaChildren = function() {\n if (stack.length && mediaTags.includes(this.tag)) {\n const parentFrame = stack[stack.length - 1];\n parentFrame.mediaChildren.push(this.tag);\n }\n };\n }\n\n options = Object.assign({}, sanitizeHtml.defaults, options);\n options.parser = Object.assign({}, htmlParserDefaults, options.parser);\n\n // vulnerableTags\n vulnerableTags.forEach(function (tag) {\n if (\n options.allowedTags !== false && (options.allowedTags || []).indexOf(tag) > -1 &&\n !options.allowVulnerableTags\n ) {\n console.warn(`\\n\\n⚠️ Your \\`allowedTags\\` option includes, \\`${tag}\\`, which is inherently\\nvulnerable to XSS attacks. Please remove it from \\`allowedTags\\`.\\nOr, to disable this warning, add the \\`allowVulnerableTags\\` option\\nand ensure you are accounting for this risk.\\n\\n`);\n }\n });\n\n // Tags that contain something other than HTML, or where discarding\n // the text when the tag is disallowed makes sense for other reasons.\n // If we are not allowing these tags, we should drop their content too.\n // For other tags you would drop the tag but keep its content.\n const nonTextTagsArray = options.nonTextTags || [\n 'script',\n 'style',\n 'textarea',\n 'option'\n ];\n let allowedAttributesMap;\n let allowedAttributesGlobMap;\n if (options.allowedAttributes) {\n allowedAttributesMap = {};\n allowedAttributesGlobMap = {};\n each(options.allowedAttributes, function(attributes, tag) {\n allowedAttributesMap[tag] = [];\n const globRegex = [];\n attributes.forEach(function(obj) {\n if (typeof obj === 'string' && obj.indexOf('*') >= 0) {\n globRegex.push(escapeStringRegexp(obj).replace(/\\\\\\*/g, '.*'));\n } else {\n allowedAttributesMap[tag].push(obj);\n }\n });\n if (globRegex.length) {\n allowedAttributesGlobMap[tag] = new RegExp('^(' + globRegex.join('|') + ')$');\n }\n });\n }\n const allowedClassesMap = {};\n const allowedClassesGlobMap = {};\n const allowedClassesRegexMap = {};\n each(options.allowedClasses, function(classes, tag) {\n // Implicitly allows the class attribute\n if (allowedAttributesMap) {\n if (!has(allowedAttributesMap, tag)) {\n allowedAttributesMap[tag] = [];\n }\n allowedAttributesMap[tag].push('class');\n }\n\n allowedClassesMap[tag] = [];\n allowedClassesRegexMap[tag] = [];\n const globRegex = [];\n classes.forEach(function(obj) {\n if (typeof obj === 'string' && obj.indexOf('*') >= 0) {\n globRegex.push(escapeStringRegexp(obj).replace(/\\\\\\*/g, '.*'));\n } else if (obj instanceof RegExp) {\n allowedClassesRegexMap[tag].push(obj);\n } else {\n allowedClassesMap[tag].push(obj);\n }\n });\n if (globRegex.length) {\n allowedClassesGlobMap[tag] = new RegExp('^(' + globRegex.join('|') + ')$');\n }\n });\n\n const transformTagsMap = {};\n let transformTagsAll;\n each(options.transformTags, function(transform, tag) {\n let transFun;\n if (typeof transform === 'function') {\n transFun = transform;\n } else if (typeof transform === 'string') {\n transFun = sanitizeHtml.simpleTransform(transform);\n }\n if (tag === '*') {\n transformTagsAll = transFun;\n } else {\n transformTagsMap[tag] = transFun;\n }\n });\n\n let depth;\n let stack;\n let skipMap;\n let transformMap;\n let skipText;\n let skipTextDepth;\n let addedText = false;\n\n initializeState();\n\n const parser = new htmlparser.Parser({\n onopentag: function(name, attribs) {\n // If `enforceHtmlBoundary` is `true` and this has found the opening\n // `html` tag, reset the state.\n if (options.enforceHtmlBoundary && name === 'html') {\n initializeState();\n }\n\n if (skipText) {\n skipTextDepth++;\n return;\n }\n const frame = new Frame(name, attribs);\n stack.push(frame);\n\n let skip = false;\n const hasText = !!frame.text;\n let transformedTag;\n if (has(transformTagsMap, name)) {\n transformedTag = transformTagsMap[name](name, attribs);\n\n frame.attribs = attribs = transformedTag.attribs;\n\n if (transformedTag.text !== undefined) {\n frame.innerText = transformedTag.text;\n }\n\n if (name !== transformedTag.tagName) {\n frame.name = name = transformedTag.tagName;\n transformMap[depth] = transformedTag.tagName;\n }\n }\n if (transformTagsAll) {\n transformedTag = transformTagsAll(name, attribs);\n\n frame.attribs = attribs = transformedTag.attribs;\n if (name !== transformedTag.tagName) {\n frame.name = name = transformedTag.tagName;\n transformMap[depth] = transformedTag.tagName;\n }\n }\n\n if ((options.allowedTags !== false && (options.allowedTags || []).indexOf(name) === -1) || (options.disallowedTagsMode === 'recursiveEscape' && !isEmptyObject(skipMap)) || (options.nestingLimit != null && depth >= options.nestingLimit)) {\n skip = true;\n skipMap[depth] = true;\n if (options.disallowedTagsMode === 'discard') {\n if (nonTextTagsArray.indexOf(name) !== -1) {\n skipText = true;\n skipTextDepth = 1;\n }\n }\n skipMap[depth] = true;\n }\n depth++;\n if (skip) {\n if (options.disallowedTagsMode === 'discard') {\n // We want the contents but not this tag\n return;\n }\n tempResult = result;\n result = '';\n }\n result += '<' + name;\n\n if (name === 'script') {\n if (options.allowedScriptHostnames || options.allowedScriptDomains) {\n frame.innerText = '';\n }\n }\n\n if (!allowedAttributesMap || has(allowedAttributesMap, name) || allowedAttributesMap['*']) {\n each(attribs, function(value, a) {\n if (!VALID_HTML_ATTRIBUTE_NAME.test(a)) {\n // This prevents part of an attribute name in the output from being\n // interpreted as the end of an attribute, or end of a tag.\n delete frame.attribs[a];\n return;\n }\n // check allowedAttributesMap for the element and attribute and modify the value\n // as necessary if there are specific values defined.\n let passedAllowedAttributesMapCheck = false;\n if (!allowedAttributesMap ||\n (has(allowedAttributesMap, name) && allowedAttributesMap[name].indexOf(a) !== -1) ||\n (allowedAttributesMap['*'] && allowedAttributesMap['*'].indexOf(a) !== -1) ||\n (has(allowedAttributesGlobMap, name) && allowedAttributesGlobMap[name].test(a)) ||\n (allowedAttributesGlobMap['*'] && allowedAttributesGlobMap['*'].test(a))) {\n passedAllowedAttributesMapCheck = true;\n } else if (allowedAttributesMap && allowedAttributesMap[name]) {\n for (const o of allowedAttributesMap[name]) {\n if (isPlainObject(o) && o.name && (o.name === a)) {\n passedAllowedAttributesMapCheck = true;\n let newValue = '';\n if (o.multiple === true) {\n // verify the values that are allowed\n const splitStrArray = value.split(' ');\n for (const s of splitStrArray) {\n if (o.values.indexOf(s) !== -1) {\n if (newValue === '') {\n newValue = s;\n } else {\n newValue += ' ' + s;\n }\n }\n }\n } else if (o.values.indexOf(value) >= 0) {\n // verified an allowed value matches the entire attribute value\n newValue = value;\n }\n value = newValue;\n }\n }\n }\n if (passedAllowedAttributesMapCheck) {\n if (options.allowedSchemesAppliedToAttributes.indexOf(a) !== -1) {\n if (naughtyHref(name, value)) {\n delete frame.attribs[a];\n return;\n }\n }\n\n if (name === 'script' && a === 'src') {\n\n let allowed = true;\n\n try {\n const parsed = parseUrl(value);\n\n if (options.allowedScriptHostnames || options.allowedScriptDomains) {\n const allowedHostname = (options.allowedScriptHostnames || []).find(function (hostname) {\n return hostname === parsed.url.hostname;\n });\n const allowedDomain = (options.allowedScriptDomains || []).find(function(domain) {\n return parsed.url.hostname === domain || parsed.url.hostname.endsWith(`.${domain}`);\n });\n allowed = allowedHostname || allowedDomain;\n }\n } catch (e) {\n allowed = false;\n }\n\n if (!allowed) {\n delete frame.attribs[a];\n return;\n }\n }\n\n if (name === 'iframe' && a === 'src') {\n let allowed = true;\n try {\n const parsed = parseUrl(value);\n\n if (parsed.isRelativeUrl) {\n // default value of allowIframeRelativeUrls is true\n // unless allowedIframeHostnames or allowedIframeDomains specified\n allowed = has(options, 'allowIframeRelativeUrls')\n ? options.allowIframeRelativeUrls\n : (!options.allowedIframeHostnames && !options.allowedIframeDomains);\n } else if (options.allowedIframeHostnames || options.allowedIframeDomains) {\n const allowedHostname = (options.allowedIframeHostnames || []).find(function (hostname) {\n return hostname === parsed.url.hostname;\n });\n const allowedDomain = (options.allowedIframeDomains || []).find(function(domain) {\n return parsed.url.hostname === domain || parsed.url.hostname.endsWith(`.${domain}`);\n });\n allowed = allowedHostname || allowedDomain;\n }\n } catch (e) {\n // Unparseable iframe src\n allowed = false;\n }\n if (!allowed) {\n delete frame.attribs[a];\n return;\n }\n }\n if (a === 'srcset') {\n try {\n let parsed = parseSrcset(value);\n parsed.forEach(function(value) {\n if (naughtyHref('srcset', value.url)) {\n value.evil = true;\n }\n });\n parsed = filter(parsed, function(v) {\n return !v.evil;\n });\n if (!parsed.length) {\n delete frame.attribs[a];\n return;\n } else {\n value = stringifySrcset(filter(parsed, function(v) {\n return !v.evil;\n }));\n frame.attribs[a] = value;\n }\n } catch (e) {\n // Unparseable srcset\n delete frame.attribs[a];\n return;\n }\n }\n if (a === 'class') {\n const allowedSpecificClasses = allowedClassesMap[name];\n const allowedWildcardClasses = allowedClassesMap['*'];\n const allowedSpecificClassesGlob = allowedClassesGlobMap[name];\n const allowedSpecificClassesRegex = allowedClassesRegexMap[name];\n const allowedWildcardClassesGlob = allowedClassesGlobMap['*'];\n const allowedClassesGlobs = [\n allowedSpecificClassesGlob,\n allowedWildcardClassesGlob\n ]\n .concat(allowedSpecificClassesRegex)\n .filter(function (t) {\n return t;\n });\n if (allowedSpecificClasses && allowedWildcardClasses) {\n value = filterClasses(value, deepmerge(allowedSpecificClasses, allowedWildcardClasses), allowedClassesGlobs);\n } else {\n value = filterClasses(value, allowedSpecificClasses || allowedWildcardClasses, allowedClassesGlobs);\n }\n if (!value.length) {\n delete frame.attribs[a];\n return;\n }\n }\n if (a === 'style') {\n try {\n const abstractSyntaxTree = postcssParse(name + ' {' + value + '}');\n const filteredAST = filterCss(abstractSyntaxTree, options.allowedStyles);\n\n value = stringifyStyleAttributes(filteredAST);\n\n if (value.length === 0) {\n delete frame.attribs[a];\n return;\n }\n } catch (e) {\n delete frame.attribs[a];\n return;\n }\n }\n result += ' ' + a;\n if (value && value.length) {\n result += '=\"' + escapeHtml(value, true) + '\"';\n }\n } else {\n delete frame.attribs[a];\n }\n });\n }\n if (options.selfClosing.indexOf(name) !== -1) {\n result += ' />';\n } else {\n result += '>';\n if (frame.innerText && !hasText && !options.textFilter) {\n result += escapeHtml(frame.innerText);\n addedText = true;\n }\n }\n if (skip) {\n result = tempResult + escapeHtml(result);\n tempResult = '';\n }\n },\n ontext: function(text) {\n if (skipText) {\n return;\n }\n const lastFrame = stack[stack.length - 1];\n let tag;\n\n if (lastFrame) {\n tag = lastFrame.tag;\n // If inner text was set by transform function then let's use it\n text = lastFrame.innerText !== undefined ? lastFrame.innerText : text;\n }\n\n if (options.disallowedTagsMode === 'discard' && ((tag === 'script') || (tag === 'style'))) {\n // htmlparser2 gives us these as-is. Escaping them ruins the content. Allowing\n // script tags is, by definition, game over for XSS protection, so if that's\n // your concern, don't allow them. The same is essentially true for style tags\n // which have their own collection of XSS vectors.\n result += text;\n } else {\n const escaped = escapeHtml(text, false);\n if (options.textFilter && !addedText) {\n result += options.textFilter(escaped, tag);\n } else if (!addedText) {\n result += escaped;\n }\n }\n if (stack.length) {\n const frame = stack[stack.length - 1];\n frame.text += text;\n }\n },\n onclosetag: function(name) {\n\n if (skipText) {\n skipTextDepth--;\n if (!skipTextDepth) {\n skipText = false;\n } else {\n return;\n }\n }\n\n const frame = stack.pop();\n if (!frame) {\n // Do not crash on bad markup\n return;\n }\n\n if (frame.tag !== name) {\n // Another case of bad markup.\n // Push to stack, so that it will be used in future closing tags.\n stack.push(frame);\n return;\n }\n\n skipText = options.enforceHtmlBoundary ? name === 'html' : false;\n depth--;\n const skip = skipMap[depth];\n if (skip) {\n delete skipMap[depth];\n if (options.disallowedTagsMode === 'discard') {\n frame.updateParentNodeText();\n return;\n }\n tempResult = result;\n result = '';\n }\n\n if (transformMap[depth]) {\n name = transformMap[depth];\n delete transformMap[depth];\n }\n\n if (options.exclusiveFilter && options.exclusiveFilter(frame)) {\n result = result.substr(0, frame.tagPosition);\n return;\n }\n\n frame.updateParentNodeMediaChildren();\n frame.updateParentNodeText();\n\n if (options.selfClosing.indexOf(name) !== -1) {\n // Already output />\n if (skip) {\n result = tempResult;\n tempResult = '';\n }\n return;\n }\n\n result += '';\n if (skip) {\n result = tempResult + escapeHtml(result);\n tempResult = '';\n }\n addedText = false;\n }\n }, options.parser);\n parser.write(html);\n parser.end();\n\n return result;\n\n function initializeState() {\n result = '';\n depth = 0;\n stack = [];\n skipMap = {};\n transformMap = {};\n skipText = false;\n skipTextDepth = 0;\n }\n\n function escapeHtml(s, quote) {\n if (typeof (s) !== 'string') {\n s = s + '';\n }\n if (options.parser.decodeEntities) {\n s = s.replace(/&/g, '&').replace(//g, '>');\n if (quote) {\n s = s.replace(/\"/g, '"');\n }\n }\n // TODO: this is inadequate because it will pass `&0;`. This approach\n // will not work, each & must be considered with regard to whether it\n // is followed by a 100% syntactically valid entity or not, and escaped\n // if it is not. If this bothers you, don't set parser.decodeEntities\n // to false. (The default is true.)\n s = s.replace(/&(?![a-zA-Z0-9#]{1,20};)/g, '&') // Match ampersands not part of existing HTML entity\n .replace(//g, '>');\n if (quote) {\n s = s.replace(/\"/g, '"');\n }\n return s;\n }\n\n function naughtyHref(name, href) {\n // Browsers ignore character codes of 32 (space) and below in a surprising\n // number of situations. Start reading here:\n // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet#Embedded_tab\n // eslint-disable-next-line no-control-regex\n href = href.replace(/[\\x00-\\x20]+/g, '');\n // Clobber any comments in URLs, which the browser might\n // interpret inside an XML data island, allowing\n // a javascript: URL to be snuck through\n while (true) {\n const firstIndex = href.indexOf('', firstIndex + 4);\n if (lastIndex === -1) {\n break;\n }\n href = href.substring(0, firstIndex) + href.substring(lastIndex + 3);\n }\n // Case insensitive so we don't get faked out by JAVASCRIPT #1\n // Allow more characters after the first so we don't get faked\n // out by certain schemes browsers accept\n const matches = href.match(/^([a-zA-Z][a-zA-Z0-9.\\-+]*):/);\n if (!matches) {\n // Protocol-relative URL starting with any combination of '/' and '\\'\n if (href.match(/^[/\\\\]{2}/)) {\n return !options.allowProtocolRelative;\n }\n\n // No scheme\n return false;\n }\n const scheme = matches[1].toLowerCase();\n\n if (has(options.allowedSchemesByTag, name)) {\n return options.allowedSchemesByTag[name].indexOf(scheme) === -1;\n }\n\n return !options.allowedSchemes || options.allowedSchemes.indexOf(scheme) === -1;\n }\n\n function parseUrl(value) {\n value = value.replace(/^(\\w+:)?\\s*[\\\\/]\\s*[\\\\/]/, '$1//');\n if (value.startsWith('relative:')) {\n // An attempt to exploit our workaround for base URLs being\n // mandatory for relative URL validation in the WHATWG\n // URL parser, reject it\n throw new Error('relative: exploit attempt');\n }\n // naughtyHref is in charge of whether protocol relative URLs\n // are cool. Here we are concerned just with allowed hostnames and\n // whether to allow relative URLs.\n //\n // Build a placeholder \"base URL\" against which any reasonable\n // relative URL may be parsed successfully\n let base = 'relative://relative-site';\n for (let i = 0; (i < 100); i++) {\n base += `/${i}`;\n }\n\n const parsed = new URL(value, base);\n\n const isRelativeUrl = parsed && parsed.hostname === 'relative-site' && parsed.protocol === 'relative:';\n return {\n isRelativeUrl,\n url: parsed\n };\n }\n /**\n * Filters user input css properties by allowlisted regex attributes.\n * Modifies the abstractSyntaxTree object.\n *\n * @param {object} abstractSyntaxTree - Object representation of CSS attributes.\n * @property {array[Declaration]} abstractSyntaxTree.nodes[0] - Each object cointains prop and value key, i.e { prop: 'color', value: 'red' }.\n * @param {object} allowedStyles - Keys are properties (i.e color), value is list of permitted regex rules (i.e /green/i).\n * @return {object} - The modified tree.\n */\n function filterCss(abstractSyntaxTree, allowedStyles) {\n if (!allowedStyles) {\n return abstractSyntaxTree;\n }\n\n const astRules = abstractSyntaxTree.nodes[0];\n let selectedRule;\n\n // Merge global and tag-specific styles into new AST.\n if (allowedStyles[astRules.selector] && allowedStyles['*']) {\n selectedRule = deepmerge(\n allowedStyles[astRules.selector],\n allowedStyles['*']\n );\n } else {\n selectedRule = allowedStyles[astRules.selector] || allowedStyles['*'];\n }\n\n if (selectedRule) {\n abstractSyntaxTree.nodes[0].nodes = astRules.nodes.reduce(filterDeclarations(selectedRule), []);\n }\n\n return abstractSyntaxTree;\n }\n\n /**\n * Extracts the style attributes from an AbstractSyntaxTree and formats those\n * values in the inline style attribute format.\n *\n * @param {AbstractSyntaxTree} filteredAST\n * @return {string} - Example: \"color:yellow;text-align:center !important;font-family:helvetica;\"\n */\n function stringifyStyleAttributes(filteredAST) {\n return filteredAST.nodes[0].nodes\n .reduce(function(extractedAttributes, attrObject) {\n extractedAttributes.push(\n `${attrObject.prop}:${attrObject.value}${attrObject.important ? ' !important' : ''}`\n );\n return extractedAttributes;\n }, [])\n .join(';');\n }\n\n /**\n * Filters the existing attributes for the given property. Discards any attributes\n * which don't match the allowlist.\n *\n * @param {object} selectedRule - Example: { color: red, font-family: helvetica }\n * @param {array} allowedDeclarationsList - List of declarations which pass the allowlist.\n * @param {object} attributeObject - Object representing the current css property.\n * @property {string} attributeObject.type - Typically 'declaration'.\n * @property {string} attributeObject.prop - The CSS property, i.e 'color'.\n * @property {string} attributeObject.value - The corresponding value to the css property, i.e 'red'.\n * @return {function} - When used in Array.reduce, will return an array of Declaration objects\n */\n function filterDeclarations(selectedRule) {\n return function (allowedDeclarationsList, attributeObject) {\n // If this property is allowlisted...\n if (has(selectedRule, attributeObject.prop)) {\n const matchesRegex = selectedRule[attributeObject.prop].some(function(regularExpression) {\n return regularExpression.test(attributeObject.value);\n });\n\n if (matchesRegex) {\n allowedDeclarationsList.push(attributeObject);\n }\n }\n return allowedDeclarationsList;\n };\n }\n\n function filterClasses(classes, allowed, allowedGlobs) {\n if (!allowed) {\n // The class attribute is allowed without filtering on this tag\n return classes;\n }\n classes = classes.split(/\\s+/);\n return classes.filter(function(clss) {\n return allowed.indexOf(clss) !== -1 || allowedGlobs.some(function(glob) {\n return glob.test(clss);\n });\n }).join(' ');\n }\n}\n\n// Defaults are accessible to you so that you can use them as a starting point\n// programmatically if you wish\n\nconst htmlParserDefaults = {\n decodeEntities: true\n};\nsanitizeHtml.defaults = {\n allowedTags: [\n // Sections derived from MDN element categories and limited to the more\n // benign categories.\n // https://developer.mozilla.org/en-US/docs/Web/HTML/Element\n // Content sectioning\n 'address', 'article', 'aside', 'footer', 'header',\n 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hgroup',\n 'main', 'nav', 'section',\n // Text content\n 'blockquote', 'dd', 'div', 'dl', 'dt', 'figcaption', 'figure',\n 'hr', 'li', 'main', 'ol', 'p', 'pre', 'ul',\n // Inline text semantics\n 'a', 'abbr', 'b', 'bdi', 'bdo', 'br', 'cite', 'code', 'data', 'dfn',\n 'em', 'i', 'kbd', 'mark', 'q',\n 'rb', 'rp', 'rt', 'rtc', 'ruby',\n 's', 'samp', 'small', 'span', 'strong', 'sub', 'sup', 'time', 'u', 'var', 'wbr',\n // Table content\n 'caption', 'col', 'colgroup', 'table', 'tbody', 'td', 'tfoot', 'th',\n 'thead', 'tr'\n ],\n disallowedTagsMode: 'discard',\n allowedAttributes: {\n a: [ 'href', 'name', 'target' ],\n // We don't currently allow img itself by default, but\n // these attributes would make sense if we did.\n img: [ 'src', 'srcset', 'alt', 'title', 'width', 'height', 'loading' ]\n },\n // Lots of these won't come up by default because we don't allow them\n selfClosing: [ 'img', 'br', 'hr', 'area', 'base', 'basefont', 'input', 'link', 'meta' ],\n // URL schemes we permit\n allowedSchemes: [ 'http', 'https', 'ftp', 'mailto', 'tel' ],\n allowedSchemesByTag: {},\n allowedSchemesAppliedToAttributes: [ 'href', 'src', 'cite' ],\n allowProtocolRelative: true,\n enforceHtmlBoundary: false\n};\n\nsanitizeHtml.simpleTransform = function(newTagName, newAttribs, merge) {\n merge = (merge === undefined) ? true : merge;\n newAttribs = newAttribs || {};\n\n return function(tagName, attribs) {\n let attrib;\n if (merge) {\n for (attrib in newAttribs) {\n attribs[attrib] = newAttribs[attrib];\n }\n } else {\n attribs = newAttribs;\n }\n\n return {\n tagName: newTagName,\n attribs: attribs\n };\n };\n};\n"],"names":["waitWindowLoad","isLocalhost","Boolean","window","location","hostname","match","register","swUrl","hooks","registrationOptions","emit","hook","args","len","arguments","length","apply","navigator","then","checkValidServiceWorker","serviceWorker","ready","registration","catch","error","handleError","registerValidSW","onLine","waiting","onupdatefound","installingWorker","installing","onstatechange","state","controller","fetch","response","status","Error","unregister","headers","get","indexOf","Promise","resolve","addEventListener","cb","htmlparser","escapeStringRegexp","isPlainObject","deepmerge","parseSrcset","parse","postcssParse","mediaTags","vulnerableTags","each","obj","Object","keys","forEach","key","has","hasOwnProperty","call","filter","a","n","v","push","isEmptyObject","stringifySrcset","parsedSrcset","map","part","url","w","h","d","join","module","exports","sanitizeHtml","VALID_HTML_ATTRIBUTE_NAME","html","options","_recursing","result","tempResult","Frame","tag","attribs","that","this","tagPosition","text","mediaChildren","updateParentNodeText","stack","parentFrame","updateParentNodeMediaChildren","includes","assign","defaults","parser","htmlParserDefaults","allowedTags","allowVulnerableTags","console","warn","nonTextTagsArray","nonTextTags","allowedAttributesMap","allowedAttributesGlobMap","allowedAttributes","attributes","globRegex","replace","RegExp","allowedClassesMap","allowedClassesGlobMap","allowedClassesRegexMap","allowedClasses","classes","transformTagsMap","transformTagsAll","depth","skipMap","transformMap","skipText","skipTextDepth","transformTags","transform","transFun","simpleTransform","addedText","initializeState","Parser","onopentag","name","enforceHtmlBoundary","frame","skip","hasText","transformedTag","undefined","innerText","tagName","disallowedTagsMode","nestingLimit","allowedScriptHostnames","allowedScriptDomains","value","test","passedAllowedAttributesMapCheck","o","newValue","multiple","splitStrArray","split","s","values","allowedSchemesAppliedToAttributes","naughtyHref","allowed","parsed","parseUrl","allowedHostname","find","allowedDomain","domain","endsWith","e","isRelativeUrl","allowIframeRelativeUrls","allowedIframeHostnames","allowedIframeDomains","evil","allowedSpecificClasses","allowedWildcardClasses","allowedSpecificClassesGlob","allowedSpecificClassesRegex","allowedWildcardClassesGlob","allowedClassesGlobs","concat","t","filterClasses","abstractSyntaxTree","filteredAST","filterCss","allowedStyles","stringifyStyleAttributes","escapeHtml","selfClosing","textFilter","ontext","lastFrame","escaped","onclosetag","pop","exclusiveFilter","substr","write","end","quote","decodeEntities","href","firstIndex","lastIndex","substring","matches","allowProtocolRelative","scheme","toLowerCase","allowedSchemesByTag","allowedSchemes","startsWith","base","i","URL","protocol","astRules","nodes","selectedRule","selector","reduce","filterDeclarations","extractedAttributes","attrObject","prop","important","allowedDeclarationsList","attributeObject","matchesRegex","some","regularExpression","allowedGlobs","clss","glob","img","newTagName","newAttribs","merge","attrib"],"sourceRoot":""}