diff --git a/.all-contributorsrc b/.all-contributorsrc new file mode 100644 index 00000000..5b8bf0e1 --- /dev/null +++ b/.all-contributorsrc @@ -0,0 +1,364 @@ +{ + "projectName": "transform", + "projectOwner": "ritz078", + "repoType": "github", + "repoHost": "https://github.com", + "files": [ + "README.md" + ], + "imageSize": 100, + "commit": false, + "commitConvention": "angular", + "contributors": [ + { + "login": "ritz078", + "name": "Ritesh Kumar", + "avatar_url": "https://avatars3.githubusercontent.com/u/5389035?v=4", + "profile": "http://riteshkr.com", + "contributions": [ + "doc", + "code", + "ideas", + "review" + ] + }, + { + "login": "skade", + "name": "Florian Gilcher", + "avatar_url": "https://avatars2.githubusercontent.com/u/47542?v=4", + "profile": "http://asquera.de", + "contributions": [ + "code" + ] + }, + { + "login": "killercup", + "name": "Pascal Hertleif", + "avatar_url": "https://avatars1.githubusercontent.com/u/20063?v=4", + "profile": "http://pascalhertleif.de/", + "contributions": [ + "code" + ] + }, + { + "login": "Landish", + "name": "Lado Lomidze", + "avatar_url": "https://avatars3.githubusercontent.com/u/534610?v=4", + "profile": "http://landish.github.io", + "contributions": [ + "code" + ] + }, + { + "login": "mattiamanzati", + "name": "Mattia Manzati", + "avatar_url": "https://avatars1.githubusercontent.com/u/13787614?v=4", + "profile": "https://github.com/mattiamanzati", + "contributions": [ + "code" + ] + }, + { + "login": "morajabi", + "name": "Mohammad Rajabifard", + "avatar_url": "https://avatars3.githubusercontent.com/u/12202757?v=4", + "profile": "https://tarino.ir", + "contributions": [ + "ideas", + "code" + ] + }, + { + "login": "Raathigesh", + "name": "Raathigeshan Kugarajan", + "avatar_url": "https://avatars0.githubusercontent.com/u/3108160?v=4", + "profile": "http://raathigesh.com/", + "contributions": [ + "code" + ] + }, + { + "login": "gyandeeps", + "name": "Gyandeep Singh", + "avatar_url": "https://avatars2.githubusercontent.com/u/5554486?v=4", + "profile": "https://gyandeeps.com", + "contributions": [ + "code" + ] + }, + { + "login": "mholt", + "name": "Matt Holt", + "avatar_url": "https://avatars2.githubusercontent.com/u/1128849?v=4", + "profile": "https://matt.life", + "contributions": [ + "code" + ] + }, + { + "login": "cg-cnu", + "name": "sreenivas alapati", + "avatar_url": "https://avatars0.githubusercontent.com/u/2767425?v=4", + "profile": "https://medium.com/@sreenivas", + "contributions": [ + "code" + ] + }, + { + "login": "bcherny", + "name": "Boris Cherny", + "avatar_url": "https://avatars2.githubusercontent.com/u/1761758?v=4", + "profile": "https://performancejs.com", + "contributions": [ + "code" + ] + }, + { + "login": "intabulas", + "name": "Mark Lussier", + "avatar_url": "https://avatars0.githubusercontent.com/u/448?v=4", + "profile": "http://www.twitter.com/intabulas", + "contributions": [ + "code" + ] + }, + { + "login": "brikou", + "name": "Brice BERNARD", + "avatar_url": "https://avatars3.githubusercontent.com/u/383212?v=4", + "profile": "https://github.com/brikou", + "contributions": [ + "code" + ] + }, + { + "login": "satya164", + "name": "Satyajit Sahoo", + "avatar_url": "https://avatars2.githubusercontent.com/u/1174278?v=4", + "profile": "https://twitter.com/@satya164", + "contributions": [ + "code" + ] + }, + { + "login": "shakyShane", + "name": "Shane Osbourne", + "avatar_url": "https://avatars3.githubusercontent.com/u/1643522?v=4", + "profile": "https://medium.com/@shakyShane", + "contributions": [ + "code" + ] + }, + { + "login": "pd4d10", + "name": "Rongjian Zhang", + "avatar_url": "https://avatars0.githubusercontent.com/u/9524411?v=4", + "profile": "https://github.com/pd4d10", + "contributions": [ + "code" + ] + }, + { + "login": "KeshShan", + "name": "Keshan Nageswaran", + "avatar_url": "https://avatars3.githubusercontent.com/u/12506034?v=4", + "profile": "http://keshShan.github.io", + "contributions": [ + "code" + ] + }, + { + "login": "code", + "name": "codegent", + "avatar_url": "https://avatars1.githubusercontent.com/u/7318?v=4", + "profile": "http://www.codegent.com", + "contributions": [ + "code" + ] + }, + { + "login": "bastor", + "name": "Sebastian Maliszczak", + "avatar_url": "https://avatars3.githubusercontent.com/u/1881814?v=4", + "profile": "https://github.com/bastor", + "contributions": [ + "code" + ] + }, + { + "login": "Haroenv", + "name": "Haroen Viaene", + "avatar_url": "https://avatars3.githubusercontent.com/u/6270048?v=4", + "profile": "https://haroen.me", + "contributions": [ + "code" + ] + }, + { + "login": "timneutkens", + "name": "Tim Neutkens", + "avatar_url": "https://avatars2.githubusercontent.com/u/6324199?v=4", + "profile": "https://timn.tech", + "contributions": [ + "plugin", + "code" + ] + }, + { + "login": "raminrez", + "name": "Ramin Rezaie", + "avatar_url": "https://avatars1.githubusercontent.com/u/7345325?v=4", + "profile": "https://github.com/raminrez", + "contributions": [ + "code" + ] + }, + { + "login": "guilhermesteves", + "name": "Guilherme Esteves", + "avatar_url": "https://avatars3.githubusercontent.com/u/2166045?v=4", + "profile": "https://guilhermeesteves.com", + "contributions": [ + "code" + ] + }, + { + "login": "p-racoon", + "name": "Prasham Ashesh", + "avatar_url": "https://avatars2.githubusercontent.com/u/13845070?v=4", + "profile": "https://github.com/p-racoon", + "contributions": [ + "code" + ] + }, + { + "login": "jamesgeorge007", + "name": "James George", + "avatar_url": "https://avatars2.githubusercontent.com/u/25279263?v=4", + "profile": "https://ghuser.io/jamesgeorge007", + "contributions": [ + "code" + ] + }, + { + "login": "ChaitanyaGadodia", + "name": "Chaitanya Gadodia", + "avatar_url": "https://avatars1.githubusercontent.com/u/10559670?v=4", + "profile": "https://chaitanyagadodia.github.io/", + "contributions": [ + "code" + ] + }, + { + "login": "miklosme", + "name": "Miklos Megyes", + "avatar_url": "https://avatars3.githubusercontent.com/u/8769273?v=4", + "profile": "https://miklos.dev", + "contributions": [ + "code" + ] + }, + { + "login": "Rishabh-Rathod", + "name": "Rishabh Rathod", + "avatar_url": "https://avatars0.githubusercontent.com/u/23132741?v=4", + "profile": "https://github.com/Rishabh-Rathod", + "contributions": [ + "code" + ] + }, + { + "login": "agent515", + "name": "agent515", + "avatar_url": "https://avatars.githubusercontent.com/u/46898603?v=4", + "profile": "https://github.com/agent515", + "contributions": [ + "code" + ] + }, + { + "login": "jfsiii", + "name": "John Schulz", + "avatar_url": "https://avatars.githubusercontent.com/u/57655?v=4", + "profile": "http://JFSIII.org", + "contributions": [ + "code" + ] + }, + { + "login": "nasrul21", + "name": "Nasrul Faizin", + "avatar_url": "https://avatars.githubusercontent.com/u/15046792?v=4", + "profile": "https://github.com/nasrul21", + "contributions": [ + "code" + ] + }, + { + "login": "jdjfisher", + "name": "Jordan Fisher", + "avatar_url": "https://avatars.githubusercontent.com/u/43887886?v=4", + "profile": "https://github.com/jdjfisher", + "contributions": [ + "code" + ] + }, + { + "login": "csandman", + "name": "Chris Sandvik", + "avatar_url": "https://avatars.githubusercontent.com/u/9214195?v=4", + "profile": "https://github.com/csandman", + "contributions": [ + "code" + ] + }, + { + "login": "LemonNekoGH", + "name": "LemonNeko", + "avatar_url": "https://avatars.githubusercontent.com/u/17664845?v=4", + "profile": "https://blog.lemonneko.moe", + "contributions": [ + "code" + ] + }, + { + "login": "Pooja444", + "name": "Pooja Kulkarni", + "avatar_url": "https://avatars.githubusercontent.com/u/24620969?v=4", + "profile": "http://poojakulkarni.dev", + "contributions": [ + "code" + ] + }, + { + "login": "SuttonJack", + "name": "Jack Sutton", + "avatar_url": "https://avatars.githubusercontent.com/u/92991945?v=4", + "profile": "https://github.com/SuttonJack", + "contributions": [ + "code" + ] + }, + { + "login": "Jackardios", + "name": "Salakhutdinov Salavat", + "avatar_url": "https://avatars.githubusercontent.com/u/24757335?v=4", + "profile": "https://t.me/jackardios", + "contributions": [ + "code" + ] + }, + { + "login": "salman0ansari", + "name": "Mohd Salman", + "avatar_url": "https://avatars.githubusercontent.com/u/30106022?v=4", + "profile": "https://github.com/salman0ansari", + "contributions": [ + "code" + ] + } + ], + "contributorsPerLine": 7, + "skipCi": true, + "commitType": "docs" +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..fed2ada0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +.idea +.next +node_modules +yarn-error.log +dist +out +.DS_Store +public/static/monaco/*.worker.js.map +.tool-versions +heroku + +.vercel diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..ed8fa3e4 --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +public/static/monaco diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..afacddcb --- /dev/null +++ b/.prettierrc @@ -0,0 +1,17 @@ +{ + "printWidth": 80, + "tabWidth": 2, + "useTabs": false, + "semi": true, + "singleQuote": false, + "quoteProps": "as-needed", + "jsxSingleQuote": false, + "trailingComma": "none", + "bracketSpacing": true, + "arrowParens": "avoid", + "requirePragma": false, + "insertPragma": false, + "proseWrap": "preserve", + "htmlWhitespaceSensitivity": "css", + "endOfLine": "lf" +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..4ebcc5ee --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Ritesh Kumar + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 00000000..f8476200 --- /dev/null +++ b/README.md @@ -0,0 +1,41 @@ +![Demo](public/cover.png) + +# 无CDN版transform + +fork自[https://github.com/ritz078/transform](https://github.com/ritz078/transform) + +去除monaco编辑器的cdn,并且语言改成中文 + +去除cdn的方法是本地cdn,也就是从cdn上下载文件放在 `/public/static`,然后配置cdn路径为自己 + +## 构建 + +### 开发环境 + +必须是 `v16.X`版本的node.js + +请到node.js网站下载对应版本,下载二进制文件(zip压缩包)解压后,修改环境变量Path里面的原有nodejs到对应新目录,重启终端后就成功切换到v16.x的版本 + +### 初始化 + +国内网络可能会导致某些包安装失败 + +```sh +yarn +``` + +### 编译 + +```sh +yarn build +``` + +### 发行 + +```sh +yarn export +``` + +运行后会有一个 `out`文件夹,里面的内容放到静态http服务器即可 + +注意发行前必须编译,否则会一直导出以前编译出的老版本 diff --git a/assets/svgs/Error404.tsx b/assets/svgs/Error404.tsx new file mode 100644 index 00000000..36cbcaea --- /dev/null +++ b/assets/svgs/Error404.tsx @@ -0,0 +1,295 @@ +import React from "react"; + +export default function Error404() { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +} diff --git a/assets/svgs/Error500.tsx b/assets/svgs/Error500.tsx new file mode 100644 index 00000000..f0491bfc --- /dev/null +++ b/assets/svgs/Error500.tsx @@ -0,0 +1,618 @@ +import React from "react"; + +export default function Error500() { + return ( + + + + + + + + + bug fixing + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +} diff --git a/assets/svgs/Npm.tsx b/assets/svgs/Npm.tsx new file mode 100644 index 00000000..6f44b9b9 --- /dev/null +++ b/assets/svgs/Npm.tsx @@ -0,0 +1,25 @@ +import React from "react"; + +export default function Npm() { + return ( + + + + + ); +} diff --git a/assets/vendor/babel-plugin-js-to-mobx-state-tree.js b/assets/vendor/babel-plugin-js-to-mobx-state-tree.js new file mode 100644 index 00000000..ad52b7fe --- /dev/null +++ b/assets/vendor/babel-plugin-js-to-mobx-state-tree.js @@ -0,0 +1,93 @@ +import uniqBy from "lodash/uniqBy"; +import isEmpty from "lodash/isEmpty"; + +/** + * This is a babel plugin that converts an object to PropTypes + * @param t + * @returns {{visitor: {ArrayExpression: (function(*)), NullLiteral: (function(*)), StringLiteral: (function(*)), NumericLiteral: (function(*)), ArrowFunctionExpression: (function(*)), FunctionExpression: (function(*)), BooleanLiteral: (function(*)), Program: (function(*, *)), ObjectExpression: (function(*))}}} + */ +export default function BabelPluginJsToMobxStateTree({ types: t }) { + return { + visitor: { + ArrayExpression(path) { + // if (t.isCallExpression(path.parent)) return; + let uniqueElements = uniqBy(path.node.elements, "type"); + + if (t.isObjectExpression(uniqueElements[0])) { + uniqueElements = [ + t.callExpression( + t.memberExpression(t.identifier("t"), t.identifier("model")), + uniqueElements + ) + ]; + } + + if ( + (!isEmpty(uniqueElements) && uniqueElements.length === 1) || + t.isCallExpression(uniqueElements) + ) { + path.replaceWith( + t.callExpression( + t.memberExpression(t.identifier("t"), t.identifier("array")), + uniqueElements + ) + ); + } else { + path.replaceWith(t.identifier("t.array")); + } + }, + + NullLiteral(path) { + path.replaceWith(t.identifier("t.null")); + }, + + StringLiteral(path) { + if (path.parentKey === "key") return; + path.replaceWith(t.identifier(`t.string`)); + }, + + NumericLiteral(path) { + path.replaceWith(t.identifier("t.number")); + }, + + ArrowFunctionExpression(path) { + path.replaceWith(t.identifier("t.frozen")); + }, + + FunctionExpression(path) { + path.replaceWith(t.identifier("t.frozen")); + }, + + BooleanLiteral(path) { + path.replaceWith(t.identifier("t.boolean")); + }, + + Program(path) { + path.traverse({ + enter(path) { + t.removeComments(path.node); + } + }); + }, + + ObjectProperty(path) { + if (t.isStringLiteral(path.node.key)) { + path.node.key = t.identifier(path.node.key.value); + } + }, + + ObjectExpression(path) { + if (t.isCallExpression(path.parent)) return; + + const elements = [path.node]; + + path.replaceWith( + t.callExpression( + t.memberExpression(t.identifier("t"), t.identifier("model")), + elements + ) + ); + } + } + }; +} diff --git a/assets/vendor/html-minifier.js b/assets/vendor/html-minifier.js new file mode 100644 index 00000000..3508bf7a --- /dev/null +++ b/assets/vendor/html-minifier.js @@ -0,0 +1,49062 @@ +/*! + * HTMLMinifier v4.0.0 (https://kangax.github.io/html-minifier/) + * Copyright 2010-2019 Juriy "kangax" Zaytsev + * Licensed under the MIT license + */ + +let globalMinify; + +require = (function() { + function r(e, n, t) { + function o(i, f) { + if (!n[i]) { + if (!e[i]) { + var c = "function" == typeof require && require; + if (!f && c) return c(i, !0); + if (u) return u(i, !0); + var a = new Error("Cannot find module '" + i + "'"); + throw ((a.code = "MODULE_NOT_FOUND"), a); + } + var p = (n[i] = { exports: {} }); + e[i][0].call( + p.exports, + function(r) { + var n = e[i][1][r]; + return o(n || r); + }, + p, + p.exports, + r, + e, + n, + t + ); + } + return n[i].exports; + } + for ( + var u = "function" == typeof require && require, i = 0; + i < t.length; + i++ + ) + o(t[i]); + return o; + } + return r; +})()( + { + 1: [ + function(require, module, exports) { + "use strict"; + + exports.byteLength = byteLength; + exports.toByteArray = toByteArray; + exports.fromByteArray = fromByteArray; + + var lookup = []; + var revLookup = []; + var Arr = typeof Uint8Array !== "undefined" ? Uint8Array : Array; + + var code = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + for (var i = 0, len = code.length; i < len; ++i) { + lookup[i] = code[i]; + revLookup[code.charCodeAt(i)] = i; + } + + // Support decoding URL-safe base64 strings, as Node.js does. + // See: https://en.wikipedia.org/wiki/Base64#URL_applications + revLookup["-".charCodeAt(0)] = 62; + revLookup["_".charCodeAt(0)] = 63; + + function getLens(b64) { + var len = b64.length; + + if (len % 4 > 0) { + throw new Error("Invalid string. Length must be a multiple of 4"); + } + + // Trim off extra bytes after placeholder bytes are found + // See: https://github.com/beatgammit/base64-js/issues/42 + var validLen = b64.indexOf("="); + if (validLen === -1) validLen = len; + + var placeHoldersLen = validLen === len ? 0 : 4 - (validLen % 4); + + return [validLen, placeHoldersLen]; + } + + // base64 is 4/3 + up to two characters of the original data + function byteLength(b64) { + var lens = getLens(b64); + var validLen = lens[0]; + var placeHoldersLen = lens[1]; + return ((validLen + placeHoldersLen) * 3) / 4 - placeHoldersLen; + } + + function _byteLength(b64, validLen, placeHoldersLen) { + return ((validLen + placeHoldersLen) * 3) / 4 - placeHoldersLen; + } + + function toByteArray(b64) { + var tmp; + var lens = getLens(b64); + var validLen = lens[0]; + var placeHoldersLen = lens[1]; + + var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen)); + + var curByte = 0; + + // if there are placeholders, only get up to the last complete 4 chars + var len = placeHoldersLen > 0 ? validLen - 4 : validLen; + + for (var i = 0; i < len; i += 4) { + tmp = + (revLookup[b64.charCodeAt(i)] << 18) | + (revLookup[b64.charCodeAt(i + 1)] << 12) | + (revLookup[b64.charCodeAt(i + 2)] << 6) | + revLookup[b64.charCodeAt(i + 3)]; + arr[curByte++] = (tmp >> 16) & 0xff; + arr[curByte++] = (tmp >> 8) & 0xff; + arr[curByte++] = tmp & 0xff; + } + + if (placeHoldersLen === 2) { + tmp = + (revLookup[b64.charCodeAt(i)] << 2) | + (revLookup[b64.charCodeAt(i + 1)] >> 4); + arr[curByte++] = tmp & 0xff; + } + + if (placeHoldersLen === 1) { + tmp = + (revLookup[b64.charCodeAt(i)] << 10) | + (revLookup[b64.charCodeAt(i + 1)] << 4) | + (revLookup[b64.charCodeAt(i + 2)] >> 2); + arr[curByte++] = (tmp >> 8) & 0xff; + arr[curByte++] = tmp & 0xff; + } + + return arr; + } + + function tripletToBase64(num) { + return ( + lookup[(num >> 18) & 0x3f] + + lookup[(num >> 12) & 0x3f] + + lookup[(num >> 6) & 0x3f] + + lookup[num & 0x3f] + ); + } + + function encodeChunk(uint8, start, end) { + var tmp; + var output = []; + for (var i = start; i < end; i += 3) { + tmp = + ((uint8[i] << 16) & 0xff0000) + + ((uint8[i + 1] << 8) & 0xff00) + + (uint8[i + 2] & 0xff); + output.push(tripletToBase64(tmp)); + } + return output.join(""); + } + + function fromByteArray(uint8) { + var tmp; + var len = uint8.length; + var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes + var parts = []; + var maxChunkLength = 16383; // must be multiple of 3 + + // go through the array every three bytes, we'll deal with trailing stuff later + for ( + var i = 0, len2 = len - extraBytes; + i < len2; + i += maxChunkLength + ) { + parts.push( + encodeChunk( + uint8, + i, + i + maxChunkLength > len2 ? len2 : i + maxChunkLength + ) + ); + } + + // pad the end with zeros, but make sure to not forget the extra bytes + if (extraBytes === 1) { + tmp = uint8[len - 1]; + parts.push(lookup[tmp >> 2] + lookup[(tmp << 4) & 0x3f] + "=="); + } else if (extraBytes === 2) { + tmp = (uint8[len - 2] << 8) + uint8[len - 1]; + parts.push( + lookup[tmp >> 10] + + lookup[(tmp >> 4) & 0x3f] + + lookup[(tmp << 2) & 0x3f] + + "=" + ); + } + + return parts.join(""); + } + }, + {} + ], + 2: [function(require, module, exports) {}, {}], + 3: [ + function(require, module, exports) { + arguments[4][2][0].apply(exports, arguments); + }, + { dup: 2 } + ], + 4: [ + function(require, module, exports) { + (function(Buffer) { + /*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ + /* eslint-disable no-proto */ + + "use strict"; + + var base64 = require("base64-js"); + var ieee754 = require("ieee754"); + + exports.Buffer = Buffer; + exports.SlowBuffer = SlowBuffer; + exports.INSPECT_MAX_BYTES = 50; + + var K_MAX_LENGTH = 0x7fffffff; + exports.kMaxLength = K_MAX_LENGTH; + + /** + * If `Buffer.TYPED_ARRAY_SUPPORT`: + * === true Use Uint8Array implementation (fastest) + * === false Print warning and recommend using `buffer` v4.x which has an Object + * implementation (most compatible, even IE6) + * + * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, + * Opera 11.6+, iOS 4.2+. + * + * We report that the browser does not support typed arrays if the are not subclassable + * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array` + * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support + * for __proto__ and has a buggy typed array implementation. + */ + Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport(); + + if ( + !Buffer.TYPED_ARRAY_SUPPORT && + typeof console !== "undefined" && + typeof console.error === "function" + ) { + console.error( + "This browser lacks typed array (Uint8Array) support which is required by " + + "`buffer` v5.x. Use `buffer` v4.x if you require old browser support." + ); + } + + function typedArraySupport() { + // Can typed array instances can be augmented? + try { + var arr = new Uint8Array(1); + arr.__proto__ = { + __proto__: Uint8Array.prototype, + foo: function() { + return 42; + } + }; + return arr.foo() === 42; + } catch (e) { + return false; + } + } + + Object.defineProperty(Buffer.prototype, "parent", { + enumerable: true, + get: function() { + if (!Buffer.isBuffer(this)) return undefined; + return this.buffer; + } + }); + + Object.defineProperty(Buffer.prototype, "offset", { + enumerable: true, + get: function() { + if (!Buffer.isBuffer(this)) return undefined; + return this.byteOffset; + } + }); + + function createBuffer(length) { + if (length > K_MAX_LENGTH) { + throw new RangeError( + 'The value "' + length + '" is invalid for option "size"' + ); + } + // Return an augmented `Uint8Array` instance + var buf = new Uint8Array(length); + buf.__proto__ = Buffer.prototype; + return buf; + } + + /** + * The Buffer constructor returns instances of `Uint8Array` that have their + * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of + * `Uint8Array`, so the returned instances will have all the node `Buffer` methods + * and the `Uint8Array` methods. Square bracket notation works as expected -- it + * returns a single octet. + * + * The `Uint8Array` prototype remains unmodified. + */ + + function Buffer(arg, encodingOrOffset, length) { + // Common case. + if (typeof arg === "number") { + if (typeof encodingOrOffset === "string") { + throw new TypeError( + 'The "string" argument must be of type string. Received type number' + ); + } + return allocUnsafe(arg); + } + return from(arg, encodingOrOffset, length); + } + + // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 + if ( + typeof Symbol !== "undefined" && + Symbol.species != null && + Buffer[Symbol.species] === Buffer + ) { + Object.defineProperty(Buffer, Symbol.species, { + value: null, + configurable: true, + enumerable: false, + writable: false + }); + } + + Buffer.poolSize = 8192; // not used by this implementation + + function from(value, encodingOrOffset, length) { + if (typeof value === "string") { + return fromString(value, encodingOrOffset); + } + + if (ArrayBuffer.isView(value)) { + return fromArrayLike(value); + } + + if (value == null) { + throw TypeError( + "The first argument must be one of type string, Buffer, ArrayBuffer, Array, " + + "or Array-like Object. Received type " + + typeof value + ); + } + + if ( + isInstance(value, ArrayBuffer) || + (value && isInstance(value.buffer, ArrayBuffer)) + ) { + return fromArrayBuffer(value, encodingOrOffset, length); + } + + if (typeof value === "number") { + throw new TypeError( + 'The "value" argument must not be of type number. Received type number' + ); + } + + var valueOf = value.valueOf && value.valueOf(); + if (valueOf != null && valueOf !== value) { + return Buffer.from(valueOf, encodingOrOffset, length); + } + + var b = fromObject(value); + if (b) return b; + + if ( + typeof Symbol !== "undefined" && + Symbol.toPrimitive != null && + typeof value[Symbol.toPrimitive] === "function" + ) { + return Buffer.from( + value[Symbol.toPrimitive]("string"), + encodingOrOffset, + length + ); + } + + throw new TypeError( + "The first argument must be one of type string, Buffer, ArrayBuffer, Array, " + + "or Array-like Object. Received type " + + typeof value + ); + } + + /** + * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError + * if value is a number. + * Buffer.from(str[, encoding]) + * Buffer.from(array) + * Buffer.from(buffer) + * Buffer.from(arrayBuffer[, byteOffset[, length]]) + **/ + Buffer.from = function(value, encodingOrOffset, length) { + return from(value, encodingOrOffset, length); + }; + + // Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug: + // https://github.com/feross/buffer/pull/148 + Buffer.prototype.__proto__ = Uint8Array.prototype; + Buffer.__proto__ = Uint8Array; + + function assertSize(size) { + if (typeof size !== "number") { + throw new TypeError('"size" argument must be of type number'); + } else if (size < 0) { + throw new RangeError( + 'The value "' + size + '" is invalid for option "size"' + ); + } + } + + function alloc(size, fill, encoding) { + assertSize(size); + if (size <= 0) { + return createBuffer(size); + } + if (fill !== undefined) { + // Only pay attention to encoding if it's a string. This + // prevents accidentally sending in a number that would + // be interpretted as a start offset. + return typeof encoding === "string" + ? createBuffer(size).fill(fill, encoding) + : createBuffer(size).fill(fill); + } + return createBuffer(size); + } + + /** + * Creates a new filled Buffer instance. + * alloc(size[, fill[, encoding]]) + **/ + Buffer.alloc = function(size, fill, encoding) { + return alloc(size, fill, encoding); + }; + + function allocUnsafe(size) { + assertSize(size); + return createBuffer(size < 0 ? 0 : checked(size) | 0); + } + + /** + * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. + * */ + Buffer.allocUnsafe = function(size) { + return allocUnsafe(size); + }; + /** + * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. + */ + Buffer.allocUnsafeSlow = function(size) { + return allocUnsafe(size); + }; + + function fromString(string, encoding) { + if (typeof encoding !== "string" || encoding === "") { + encoding = "utf8"; + } + + if (!Buffer.isEncoding(encoding)) { + throw new TypeError("Unknown encoding: " + encoding); + } + + var length = byteLength(string, encoding) | 0; + var buf = createBuffer(length); + + var actual = buf.write(string, encoding); + + if (actual !== length) { + // Writing a hex string, for example, that contains invalid characters will + // cause everything after the first invalid character to be ignored. (e.g. + // 'abxxcd' will be treated as 'ab') + buf = buf.slice(0, actual); + } + + return buf; + } + + function fromArrayLike(array) { + var length = array.length < 0 ? 0 : checked(array.length) | 0; + var buf = createBuffer(length); + for (var i = 0; i < length; i += 1) { + buf[i] = array[i] & 255; + } + return buf; + } + + function fromArrayBuffer(array, byteOffset, length) { + if (byteOffset < 0 || array.byteLength < byteOffset) { + throw new RangeError('"offset" is outside of buffer bounds'); + } + + if (array.byteLength < byteOffset + (length || 0)) { + throw new RangeError('"length" is outside of buffer bounds'); + } + + var buf; + if (byteOffset === undefined && length === undefined) { + buf = new Uint8Array(array); + } else if (length === undefined) { + buf = new Uint8Array(array, byteOffset); + } else { + buf = new Uint8Array(array, byteOffset, length); + } + + // Return an augmented `Uint8Array` instance + buf.__proto__ = Buffer.prototype; + return buf; + } + + function fromObject(obj) { + if (Buffer.isBuffer(obj)) { + var len = checked(obj.length) | 0; + var buf = createBuffer(len); + + if (buf.length === 0) { + return buf; + } + + obj.copy(buf, 0, 0, len); + return buf; + } + + if (obj.length !== undefined) { + if (typeof obj.length !== "number" || numberIsNaN(obj.length)) { + return createBuffer(0); + } + return fromArrayLike(obj); + } + + if (obj.type === "Buffer" && Array.isArray(obj.data)) { + return fromArrayLike(obj.data); + } + } + + function checked(length) { + // Note: cannot use `length < K_MAX_LENGTH` here because that fails when + // length is NaN (which is otherwise coerced to zero.) + if (length >= K_MAX_LENGTH) { + throw new RangeError( + "Attempt to allocate Buffer larger than maximum " + + "size: 0x" + + K_MAX_LENGTH.toString(16) + + " bytes" + ); + } + return length | 0; + } + + function SlowBuffer(length) { + if (+length != length) { + // eslint-disable-line eqeqeq + length = 0; + } + return Buffer.alloc(+length); + } + + Buffer.isBuffer = function isBuffer(b) { + return b != null && b._isBuffer === true && b !== Buffer.prototype; // so Buffer.isBuffer(Buffer.prototype) will be false + }; + + Buffer.compare = function compare(a, b) { + if (isInstance(a, Uint8Array)) + a = Buffer.from(a, a.offset, a.byteLength); + if (isInstance(b, Uint8Array)) + b = Buffer.from(b, b.offset, b.byteLength); + if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { + throw new TypeError( + 'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array' + ); + } + + if (a === b) return 0; + + var x = a.length; + var y = b.length; + + for (var i = 0, len = Math.min(x, y); i < len; ++i) { + if (a[i] !== b[i]) { + x = a[i]; + y = b[i]; + break; + } + } + + if (x < y) return -1; + if (y < x) return 1; + return 0; + }; + + Buffer.isEncoding = function isEncoding(encoding) { + switch (String(encoding).toLowerCase()) { + case "hex": + case "utf8": + case "utf-8": + case "ascii": + case "latin1": + case "binary": + case "base64": + case "ucs2": + case "ucs-2": + case "utf16le": + case "utf-16le": + return true; + default: + return false; + } + }; + + Buffer.concat = function concat(list, length) { + if (!Array.isArray(list)) { + throw new TypeError( + '"list" argument must be an Array of Buffers' + ); + } + + if (list.length === 0) { + return Buffer.alloc(0); + } + + var i; + if (length === undefined) { + length = 0; + for (i = 0; i < list.length; ++i) { + length += list[i].length; + } + } + + var buffer = Buffer.allocUnsafe(length); + var pos = 0; + for (i = 0; i < list.length; ++i) { + var buf = list[i]; + if (isInstance(buf, Uint8Array)) { + buf = Buffer.from(buf); + } + if (!Buffer.isBuffer(buf)) { + throw new TypeError( + '"list" argument must be an Array of Buffers' + ); + } + buf.copy(buffer, pos); + pos += buf.length; + } + return buffer; + }; + + function byteLength(string, encoding) { + if (Buffer.isBuffer(string)) { + return string.length; + } + if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) { + return string.byteLength; + } + if (typeof string !== "string") { + throw new TypeError( + 'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' + + "Received type " + + typeof string + ); + } + + var len = string.length; + var mustMatch = arguments.length > 2 && arguments[2] === true; + if (!mustMatch && len === 0) return 0; + + // Use a for loop to avoid recursion + var loweredCase = false; + for (;;) { + switch (encoding) { + case "ascii": + case "latin1": + case "binary": + return len; + case "utf8": + case "utf-8": + return utf8ToBytes(string).length; + case "ucs2": + case "ucs-2": + case "utf16le": + case "utf-16le": + return len * 2; + case "hex": + return len >>> 1; + case "base64": + return base64ToBytes(string).length; + default: + if (loweredCase) { + return mustMatch ? -1 : utf8ToBytes(string).length; // assume utf8 + } + encoding = ("" + encoding).toLowerCase(); + loweredCase = true; + } + } + } + Buffer.byteLength = byteLength; + + function slowToString(encoding, start, end) { + var loweredCase = false; + + // No need to verify that "this.length <= MAX_UINT32" since it's a read-only + // property of a typed array. + + // This behaves neither like String nor Uint8Array in that we set start/end + // to their upper/lower bounds if the value passed is out of range. + // undefined is handled specially as per ECMA-262 6th Edition, + // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. + if (start === undefined || start < 0) { + start = 0; + } + // Return early if start > this.length. Done here to prevent potential uint32 + // coercion fail below. + if (start > this.length) { + return ""; + } + + if (end === undefined || end > this.length) { + end = this.length; + } + + if (end <= 0) { + return ""; + } + + // Force coersion to uint32. This will also coerce falsey/NaN values to 0. + end >>>= 0; + start >>>= 0; + + if (end <= start) { + return ""; + } + + if (!encoding) encoding = "utf8"; + + while (true) { + switch (encoding) { + case "hex": + return hexSlice(this, start, end); + + case "utf8": + case "utf-8": + return utf8Slice(this, start, end); + + case "ascii": + return asciiSlice(this, start, end); + + case "latin1": + case "binary": + return latin1Slice(this, start, end); + + case "base64": + return base64Slice(this, start, end); + + case "ucs2": + case "ucs-2": + case "utf16le": + case "utf-16le": + return utf16leSlice(this, start, end); + + default: + if (loweredCase) + throw new TypeError("Unknown encoding: " + encoding); + encoding = (encoding + "").toLowerCase(); + loweredCase = true; + } + } + } + + // This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package) + // to detect a Buffer instance. It's not possible to use `instanceof Buffer` + // reliably in a browserify context because there could be multiple different + // copies of the 'buffer' package in use. This method works even for Buffer + // instances that were created from another copy of the `buffer` package. + // See: https://github.com/feross/buffer/issues/154 + Buffer.prototype._isBuffer = true; + + function swap(b, n, m) { + var i = b[n]; + b[n] = b[m]; + b[m] = i; + } + + Buffer.prototype.swap16 = function swap16() { + var len = this.length; + if (len % 2 !== 0) { + throw new RangeError("Buffer size must be a multiple of 16-bits"); + } + for (var i = 0; i < len; i += 2) { + swap(this, i, i + 1); + } + return this; + }; + + Buffer.prototype.swap32 = function swap32() { + var len = this.length; + if (len % 4 !== 0) { + throw new RangeError("Buffer size must be a multiple of 32-bits"); + } + for (var i = 0; i < len; i += 4) { + swap(this, i, i + 3); + swap(this, i + 1, i + 2); + } + return this; + }; + + Buffer.prototype.swap64 = function swap64() { + var len = this.length; + if (len % 8 !== 0) { + throw new RangeError("Buffer size must be a multiple of 64-bits"); + } + for (var i = 0; i < len; i += 8) { + swap(this, i, i + 7); + swap(this, i + 1, i + 6); + swap(this, i + 2, i + 5); + swap(this, i + 3, i + 4); + } + return this; + }; + + Buffer.prototype.toString = function toString() { + var length = this.length; + if (length === 0) return ""; + if (arguments.length === 0) return utf8Slice(this, 0, length); + return slowToString.apply(this, arguments); + }; + + Buffer.prototype.toLocaleString = Buffer.prototype.toString; + + Buffer.prototype.equals = function equals(b) { + if (!Buffer.isBuffer(b)) + throw new TypeError("Argument must be a Buffer"); + if (this === b) return true; + return Buffer.compare(this, b) === 0; + }; + + Buffer.prototype.inspect = function inspect() { + var str = ""; + var max = exports.INSPECT_MAX_BYTES; + str = this.toString("hex", 0, max) + .replace(/(.{2})/g, "$1 ") + .trim(); + if (this.length > max) str += " ... "; + return ""; + }; + + Buffer.prototype.compare = function compare( + target, + start, + end, + thisStart, + thisEnd + ) { + if (isInstance(target, Uint8Array)) { + target = Buffer.from(target, target.offset, target.byteLength); + } + if (!Buffer.isBuffer(target)) { + throw new TypeError( + 'The "target" argument must be one of type Buffer or Uint8Array. ' + + "Received type " + + typeof target + ); + } + + if (start === undefined) { + start = 0; + } + if (end === undefined) { + end = target ? target.length : 0; + } + if (thisStart === undefined) { + thisStart = 0; + } + if (thisEnd === undefined) { + thisEnd = this.length; + } + + if ( + start < 0 || + end > target.length || + thisStart < 0 || + thisEnd > this.length + ) { + throw new RangeError("out of range index"); + } + + if (thisStart >= thisEnd && start >= end) { + return 0; + } + if (thisStart >= thisEnd) { + return -1; + } + if (start >= end) { + return 1; + } + + start >>>= 0; + end >>>= 0; + thisStart >>>= 0; + thisEnd >>>= 0; + + if (this === target) return 0; + + var x = thisEnd - thisStart; + var y = end - start; + var len = Math.min(x, y); + + var thisCopy = this.slice(thisStart, thisEnd); + var targetCopy = target.slice(start, end); + + for (var i = 0; i < len; ++i) { + if (thisCopy[i] !== targetCopy[i]) { + x = thisCopy[i]; + y = targetCopy[i]; + break; + } + } + + if (x < y) return -1; + if (y < x) return 1; + return 0; + }; + + // Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, + // OR the last index of `val` in `buffer` at offset <= `byteOffset`. + // + // Arguments: + // - buffer - a Buffer to search + // - val - a string, Buffer, or number + // - byteOffset - an index into `buffer`; will be clamped to an int32 + // - encoding - an optional encoding, relevant is val is a string + // - dir - true for indexOf, false for lastIndexOf + function bidirectionalIndexOf( + buffer, + val, + byteOffset, + encoding, + dir + ) { + // Empty buffer means no match + if (buffer.length === 0) return -1; + + // Normalize byteOffset + if (typeof byteOffset === "string") { + encoding = byteOffset; + byteOffset = 0; + } else if (byteOffset > 0x7fffffff) { + byteOffset = 0x7fffffff; + } else if (byteOffset < -0x80000000) { + byteOffset = -0x80000000; + } + byteOffset = +byteOffset; // Coerce to Number. + if (numberIsNaN(byteOffset)) { + // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer + byteOffset = dir ? 0 : buffer.length - 1; + } + + // Normalize byteOffset: negative offsets start from the end of the buffer + if (byteOffset < 0) byteOffset = buffer.length + byteOffset; + if (byteOffset >= buffer.length) { + if (dir) return -1; + else byteOffset = buffer.length - 1; + } else if (byteOffset < 0) { + if (dir) byteOffset = 0; + else return -1; + } + + // Normalize val + if (typeof val === "string") { + val = Buffer.from(val, encoding); + } + + // Finally, search either indexOf (if dir is true) or lastIndexOf + if (Buffer.isBuffer(val)) { + // Special case: looking for empty string/buffer always fails + if (val.length === 0) { + return -1; + } + return arrayIndexOf(buffer, val, byteOffset, encoding, dir); + } else if (typeof val === "number") { + val = val & 0xff; // Search for a byte value [0-255] + if (typeof Uint8Array.prototype.indexOf === "function") { + if (dir) { + return Uint8Array.prototype.indexOf.call( + buffer, + val, + byteOffset + ); + } else { + return Uint8Array.prototype.lastIndexOf.call( + buffer, + val, + byteOffset + ); + } + } + return arrayIndexOf(buffer, [val], byteOffset, encoding, dir); + } + + throw new TypeError("val must be string, number or Buffer"); + } + + function arrayIndexOf(arr, val, byteOffset, encoding, dir) { + var indexSize = 1; + var arrLength = arr.length; + var valLength = val.length; + + if (encoding !== undefined) { + encoding = String(encoding).toLowerCase(); + if ( + encoding === "ucs2" || + encoding === "ucs-2" || + encoding === "utf16le" || + encoding === "utf-16le" + ) { + if (arr.length < 2 || val.length < 2) { + return -1; + } + indexSize = 2; + arrLength /= 2; + valLength /= 2; + byteOffset /= 2; + } + } + + function read(buf, i) { + if (indexSize === 1) { + return buf[i]; + } else { + return buf.readUInt16BE(i * indexSize); + } + } + + var i; + if (dir) { + var foundIndex = -1; + for (i = byteOffset; i < arrLength; i++) { + if ( + read(arr, i) === + read(val, foundIndex === -1 ? 0 : i - foundIndex) + ) { + if (foundIndex === -1) foundIndex = i; + if (i - foundIndex + 1 === valLength) + return foundIndex * indexSize; + } else { + if (foundIndex !== -1) i -= i - foundIndex; + foundIndex = -1; + } + } + } else { + if (byteOffset + valLength > arrLength) + byteOffset = arrLength - valLength; + for (i = byteOffset; i >= 0; i--) { + var found = true; + for (var j = 0; j < valLength; j++) { + if (read(arr, i + j) !== read(val, j)) { + found = false; + break; + } + } + if (found) return i; + } + } + + return -1; + } + + Buffer.prototype.includes = function includes( + val, + byteOffset, + encoding + ) { + return this.indexOf(val, byteOffset, encoding) !== -1; + }; + + Buffer.prototype.indexOf = function indexOf( + val, + byteOffset, + encoding + ) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, true); + }; + + Buffer.prototype.lastIndexOf = function lastIndexOf( + val, + byteOffset, + encoding + ) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, false); + }; + + function hexWrite(buf, string, offset, length) { + offset = Number(offset) || 0; + var remaining = buf.length - offset; + if (!length) { + length = remaining; + } else { + length = Number(length); + if (length > remaining) { + length = remaining; + } + } + + var strLen = string.length; + + if (length > strLen / 2) { + length = strLen / 2; + } + for (var i = 0; i < length; ++i) { + var parsed = parseInt(string.substr(i * 2, 2), 16); + if (numberIsNaN(parsed)) return i; + buf[offset + i] = parsed; + } + return i; + } + + function utf8Write(buf, string, offset, length) { + return blitBuffer( + utf8ToBytes(string, buf.length - offset), + buf, + offset, + length + ); + } + + function asciiWrite(buf, string, offset, length) { + return blitBuffer(asciiToBytes(string), buf, offset, length); + } + + function latin1Write(buf, string, offset, length) { + return asciiWrite(buf, string, offset, length); + } + + function base64Write(buf, string, offset, length) { + return blitBuffer(base64ToBytes(string), buf, offset, length); + } + + function ucs2Write(buf, string, offset, length) { + return blitBuffer( + utf16leToBytes(string, buf.length - offset), + buf, + offset, + length + ); + } + + Buffer.prototype.write = function write( + string, + offset, + length, + encoding + ) { + // Buffer#write(string) + if (offset === undefined) { + encoding = "utf8"; + length = this.length; + offset = 0; + // Buffer#write(string, encoding) + } else if (length === undefined && typeof offset === "string") { + encoding = offset; + length = this.length; + offset = 0; + // Buffer#write(string, offset[, length][, encoding]) + } else if (isFinite(offset)) { + offset = offset >>> 0; + if (isFinite(length)) { + length = length >>> 0; + if (encoding === undefined) encoding = "utf8"; + } else { + encoding = length; + length = undefined; + } + } else { + throw new Error( + "Buffer.write(string, encoding, offset[, length]) is no longer supported" + ); + } + + var remaining = this.length - offset; + if (length === undefined || length > remaining) length = remaining; + + if ( + (string.length > 0 && (length < 0 || offset < 0)) || + offset > this.length + ) { + throw new RangeError("Attempt to write outside buffer bounds"); + } + + if (!encoding) encoding = "utf8"; + + var loweredCase = false; + for (;;) { + switch (encoding) { + case "hex": + return hexWrite(this, string, offset, length); + + case "utf8": + case "utf-8": + return utf8Write(this, string, offset, length); + + case "ascii": + return asciiWrite(this, string, offset, length); + + case "latin1": + case "binary": + return latin1Write(this, string, offset, length); + + case "base64": + // Warning: maxLength not taken into account in base64Write + return base64Write(this, string, offset, length); + + case "ucs2": + case "ucs-2": + case "utf16le": + case "utf-16le": + return ucs2Write(this, string, offset, length); + + default: + if (loweredCase) + throw new TypeError("Unknown encoding: " + encoding); + encoding = ("" + encoding).toLowerCase(); + loweredCase = true; + } + } + }; + + Buffer.prototype.toJSON = function toJSON() { + return { + type: "Buffer", + data: Array.prototype.slice.call(this._arr || this, 0) + }; + }; + + function base64Slice(buf, start, end) { + if (start === 0 && end === buf.length) { + return base64.fromByteArray(buf); + } else { + return base64.fromByteArray(buf.slice(start, end)); + } + } + + function utf8Slice(buf, start, end) { + end = Math.min(buf.length, end); + var res = []; + + var i = start; + while (i < end) { + var firstByte = buf[i]; + var codePoint = null; + var bytesPerSequence = + firstByte > 0xef + ? 4 + : firstByte > 0xdf + ? 3 + : firstByte > 0xbf + ? 2 + : 1; + + if (i + bytesPerSequence <= end) { + var secondByte, thirdByte, fourthByte, tempCodePoint; + + switch (bytesPerSequence) { + case 1: + if (firstByte < 0x80) { + codePoint = firstByte; + } + break; + case 2: + secondByte = buf[i + 1]; + if ((secondByte & 0xc0) === 0x80) { + tempCodePoint = + ((firstByte & 0x1f) << 0x6) | (secondByte & 0x3f); + if (tempCodePoint > 0x7f) { + codePoint = tempCodePoint; + } + } + break; + case 3: + secondByte = buf[i + 1]; + thirdByte = buf[i + 2]; + if ( + (secondByte & 0xc0) === 0x80 && + (thirdByte & 0xc0) === 0x80 + ) { + tempCodePoint = + ((firstByte & 0xf) << 0xc) | + ((secondByte & 0x3f) << 0x6) | + (thirdByte & 0x3f); + if ( + tempCodePoint > 0x7ff && + (tempCodePoint < 0xd800 || tempCodePoint > 0xdfff) + ) { + codePoint = tempCodePoint; + } + } + break; + case 4: + secondByte = buf[i + 1]; + thirdByte = buf[i + 2]; + fourthByte = buf[i + 3]; + if ( + (secondByte & 0xc0) === 0x80 && + (thirdByte & 0xc0) === 0x80 && + (fourthByte & 0xc0) === 0x80 + ) { + tempCodePoint = + ((firstByte & 0xf) << 0x12) | + ((secondByte & 0x3f) << 0xc) | + ((thirdByte & 0x3f) << 0x6) | + (fourthByte & 0x3f); + if (tempCodePoint > 0xffff && tempCodePoint < 0x110000) { + codePoint = tempCodePoint; + } + } + } + } + + if (codePoint === null) { + // we did not generate a valid codePoint so insert a + // replacement char (U+FFFD) and advance only 1 byte + codePoint = 0xfffd; + bytesPerSequence = 1; + } else if (codePoint > 0xffff) { + // encode to utf16 (surrogate pair dance) + codePoint -= 0x10000; + res.push(((codePoint >>> 10) & 0x3ff) | 0xd800); + codePoint = 0xdc00 | (codePoint & 0x3ff); + } + + res.push(codePoint); + i += bytesPerSequence; + } + + return decodeCodePointsArray(res); + } + + // Based on http://stackoverflow.com/a/22747272/680742, the browser with + // the lowest limit is Chrome, with 0x10000 args. + // We go 1 magnitude less, for safety + var MAX_ARGUMENTS_LENGTH = 0x1000; + + function decodeCodePointsArray(codePoints) { + var len = codePoints.length; + if (len <= MAX_ARGUMENTS_LENGTH) { + return String.fromCharCode.apply(String, codePoints); // avoid extra slice() + } + + // Decode in chunks to avoid "call stack size exceeded". + var res = ""; + var i = 0; + while (i < len) { + res += String.fromCharCode.apply( + String, + codePoints.slice(i, (i += MAX_ARGUMENTS_LENGTH)) + ); + } + return res; + } + + function asciiSlice(buf, start, end) { + var ret = ""; + end = Math.min(buf.length, end); + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i] & 0x7f); + } + return ret; + } + + function latin1Slice(buf, start, end) { + var ret = ""; + end = Math.min(buf.length, end); + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i]); + } + return ret; + } + + function hexSlice(buf, start, end) { + var len = buf.length; + + if (!start || start < 0) start = 0; + if (!end || end < 0 || end > len) end = len; + + var out = ""; + for (var i = start; i < end; ++i) { + out += toHex(buf[i]); + } + return out; + } + + function utf16leSlice(buf, start, end) { + var bytes = buf.slice(start, end); + var res = ""; + for (var i = 0; i < bytes.length; i += 2) { + res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256); + } + return res; + } + + Buffer.prototype.slice = function slice(start, end) { + var len = this.length; + start = ~~start; + end = end === undefined ? len : ~~end; + + if (start < 0) { + start += len; + if (start < 0) start = 0; + } else if (start > len) { + start = len; + } + + if (end < 0) { + end += len; + if (end < 0) end = 0; + } else if (end > len) { + end = len; + } + + if (end < start) end = start; + + var newBuf = this.subarray(start, end); + // Return an augmented `Uint8Array` instance + newBuf.__proto__ = Buffer.prototype; + return newBuf; + }; + + /* + * Need to make sure that buffer isn't trying to write out of bounds. + */ + function checkOffset(offset, ext, length) { + if (offset % 1 !== 0 || offset < 0) + throw new RangeError("offset is not uint"); + if (offset + ext > length) + throw new RangeError("Trying to access beyond buffer length"); + } + + Buffer.prototype.readUIntLE = function readUIntLE( + offset, + byteLength, + noAssert + ) { + offset = offset >>> 0; + byteLength = byteLength >>> 0; + if (!noAssert) checkOffset(offset, byteLength, this.length); + + var val = this[offset]; + var mul = 1; + var i = 0; + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul; + } + + return val; + }; + + Buffer.prototype.readUIntBE = function readUIntBE( + offset, + byteLength, + noAssert + ) { + offset = offset >>> 0; + byteLength = byteLength >>> 0; + if (!noAssert) { + checkOffset(offset, byteLength, this.length); + } + + var val = this[offset + --byteLength]; + var mul = 1; + while (byteLength > 0 && (mul *= 0x100)) { + val += this[offset + --byteLength] * mul; + } + + return val; + }; + + Buffer.prototype.readUInt8 = function readUInt8(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 1, this.length); + return this[offset]; + }; + + Buffer.prototype.readUInt16LE = function readUInt16LE( + offset, + noAssert + ) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 2, this.length); + return this[offset] | (this[offset + 1] << 8); + }; + + Buffer.prototype.readUInt16BE = function readUInt16BE( + offset, + noAssert + ) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 2, this.length); + return (this[offset] << 8) | this[offset + 1]; + }; + + Buffer.prototype.readUInt32LE = function readUInt32LE( + offset, + noAssert + ) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 4, this.length); + + return ( + (this[offset] | + (this[offset + 1] << 8) | + (this[offset + 2] << 16)) + + this[offset + 3] * 0x1000000 + ); + }; + + Buffer.prototype.readUInt32BE = function readUInt32BE( + offset, + noAssert + ) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 4, this.length); + + return ( + this[offset] * 0x1000000 + + ((this[offset + 1] << 16) | + (this[offset + 2] << 8) | + this[offset + 3]) + ); + }; + + Buffer.prototype.readIntLE = function readIntLE( + offset, + byteLength, + noAssert + ) { + offset = offset >>> 0; + byteLength = byteLength >>> 0; + if (!noAssert) checkOffset(offset, byteLength, this.length); + + var val = this[offset]; + var mul = 1; + var i = 0; + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul; + } + mul *= 0x80; + + if (val >= mul) val -= Math.pow(2, 8 * byteLength); + + return val; + }; + + Buffer.prototype.readIntBE = function readIntBE( + offset, + byteLength, + noAssert + ) { + offset = offset >>> 0; + byteLength = byteLength >>> 0; + if (!noAssert) checkOffset(offset, byteLength, this.length); + + var i = byteLength; + var mul = 1; + var val = this[offset + --i]; + while (i > 0 && (mul *= 0x100)) { + val += this[offset + --i] * mul; + } + mul *= 0x80; + + if (val >= mul) val -= Math.pow(2, 8 * byteLength); + + return val; + }; + + Buffer.prototype.readInt8 = function readInt8(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 1, this.length); + if (!(this[offset] & 0x80)) return this[offset]; + return (0xff - this[offset] + 1) * -1; + }; + + Buffer.prototype.readInt16LE = function readInt16LE( + offset, + noAssert + ) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 2, this.length); + var val = this[offset] | (this[offset + 1] << 8); + return val & 0x8000 ? val | 0xffff0000 : val; + }; + + Buffer.prototype.readInt16BE = function readInt16BE( + offset, + noAssert + ) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 2, this.length); + var val = this[offset + 1] | (this[offset] << 8); + return val & 0x8000 ? val | 0xffff0000 : val; + }; + + Buffer.prototype.readInt32LE = function readInt32LE( + offset, + noAssert + ) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 4, this.length); + + return ( + this[offset] | + (this[offset + 1] << 8) | + (this[offset + 2] << 16) | + (this[offset + 3] << 24) + ); + }; + + Buffer.prototype.readInt32BE = function readInt32BE( + offset, + noAssert + ) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 4, this.length); + + return ( + (this[offset] << 24) | + (this[offset + 1] << 16) | + (this[offset + 2] << 8) | + this[offset + 3] + ); + }; + + Buffer.prototype.readFloatLE = function readFloatLE( + offset, + noAssert + ) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 4, this.length); + return ieee754.read(this, offset, true, 23, 4); + }; + + Buffer.prototype.readFloatBE = function readFloatBE( + offset, + noAssert + ) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 4, this.length); + return ieee754.read(this, offset, false, 23, 4); + }; + + Buffer.prototype.readDoubleLE = function readDoubleLE( + offset, + noAssert + ) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 8, this.length); + return ieee754.read(this, offset, true, 52, 8); + }; + + Buffer.prototype.readDoubleBE = function readDoubleBE( + offset, + noAssert + ) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 8, this.length); + return ieee754.read(this, offset, false, 52, 8); + }; + + function checkInt(buf, value, offset, ext, max, min) { + if (!Buffer.isBuffer(buf)) + throw new TypeError( + '"buffer" argument must be a Buffer instance' + ); + if (value > max || value < min) + throw new RangeError('"value" argument is out of bounds'); + if (offset + ext > buf.length) + throw new RangeError("Index out of range"); + } + + Buffer.prototype.writeUIntLE = function writeUIntLE( + value, + offset, + byteLength, + noAssert + ) { + value = +value; + offset = offset >>> 0; + byteLength = byteLength >>> 0; + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1; + checkInt(this, value, offset, byteLength, maxBytes, 0); + } + + var mul = 1; + var i = 0; + this[offset] = value & 0xff; + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xff; + } + + return offset + byteLength; + }; + + Buffer.prototype.writeUIntBE = function writeUIntBE( + value, + offset, + byteLength, + noAssert + ) { + value = +value; + offset = offset >>> 0; + byteLength = byteLength >>> 0; + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1; + checkInt(this, value, offset, byteLength, maxBytes, 0); + } + + var i = byteLength - 1; + var mul = 1; + this[offset + i] = value & 0xff; + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xff; + } + + return offset + byteLength; + }; + + Buffer.prototype.writeUInt8 = function writeUInt8( + value, + offset, + noAssert + ) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0); + this[offset] = value & 0xff; + return offset + 1; + }; + + Buffer.prototype.writeUInt16LE = function writeUInt16LE( + value, + offset, + noAssert + ) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0); + this[offset] = value & 0xff; + this[offset + 1] = value >>> 8; + return offset + 2; + }; + + Buffer.prototype.writeUInt16BE = function writeUInt16BE( + value, + offset, + noAssert + ) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0); + this[offset] = value >>> 8; + this[offset + 1] = value & 0xff; + return offset + 2; + }; + + Buffer.prototype.writeUInt32LE = function writeUInt32LE( + value, + offset, + noAssert + ) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0); + this[offset + 3] = value >>> 24; + this[offset + 2] = value >>> 16; + this[offset + 1] = value >>> 8; + this[offset] = value & 0xff; + return offset + 4; + }; + + Buffer.prototype.writeUInt32BE = function writeUInt32BE( + value, + offset, + noAssert + ) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0); + this[offset] = value >>> 24; + this[offset + 1] = value >>> 16; + this[offset + 2] = value >>> 8; + this[offset + 3] = value & 0xff; + return offset + 4; + }; + + Buffer.prototype.writeIntLE = function writeIntLE( + value, + offset, + byteLength, + noAssert + ) { + value = +value; + offset = offset >>> 0; + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1); + + checkInt(this, value, offset, byteLength, limit - 1, -limit); + } + + var i = 0; + var mul = 1; + var sub = 0; + this[offset] = value & 0xff; + while (++i < byteLength && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { + sub = 1; + } + this[offset + i] = (((value / mul) >> 0) - sub) & 0xff; + } + + return offset + byteLength; + }; + + Buffer.prototype.writeIntBE = function writeIntBE( + value, + offset, + byteLength, + noAssert + ) { + value = +value; + offset = offset >>> 0; + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1); + + checkInt(this, value, offset, byteLength, limit - 1, -limit); + } + + var i = byteLength - 1; + var mul = 1; + var sub = 0; + this[offset + i] = value & 0xff; + while (--i >= 0 && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { + sub = 1; + } + this[offset + i] = (((value / mul) >> 0) - sub) & 0xff; + } + + return offset + byteLength; + }; + + Buffer.prototype.writeInt8 = function writeInt8( + value, + offset, + noAssert + ) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80); + if (value < 0) value = 0xff + value + 1; + this[offset] = value & 0xff; + return offset + 1; + }; + + Buffer.prototype.writeInt16LE = function writeInt16LE( + value, + offset, + noAssert + ) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000); + this[offset] = value & 0xff; + this[offset + 1] = value >>> 8; + return offset + 2; + }; + + Buffer.prototype.writeInt16BE = function writeInt16BE( + value, + offset, + noAssert + ) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000); + this[offset] = value >>> 8; + this[offset + 1] = value & 0xff; + return offset + 2; + }; + + Buffer.prototype.writeInt32LE = function writeInt32LE( + value, + offset, + noAssert + ) { + value = +value; + offset = offset >>> 0; + if (!noAssert) + checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000); + this[offset] = value & 0xff; + this[offset + 1] = value >>> 8; + this[offset + 2] = value >>> 16; + this[offset + 3] = value >>> 24; + return offset + 4; + }; + + Buffer.prototype.writeInt32BE = function writeInt32BE( + value, + offset, + noAssert + ) { + value = +value; + offset = offset >>> 0; + if (!noAssert) + checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000); + if (value < 0) value = 0xffffffff + value + 1; + this[offset] = value >>> 24; + this[offset + 1] = value >>> 16; + this[offset + 2] = value >>> 8; + this[offset + 3] = value & 0xff; + return offset + 4; + }; + + function checkIEEE754(buf, value, offset, ext, max, min) { + if (offset + ext > buf.length) + throw new RangeError("Index out of range"); + if (offset < 0) throw new RangeError("Index out of range"); + } + + function writeFloat(buf, value, offset, littleEndian, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) { + checkIEEE754( + buf, + value, + offset, + 4, + 3.4028234663852886e38, + -3.4028234663852886e38 + ); + } + ieee754.write(buf, value, offset, littleEndian, 23, 4); + return offset + 4; + } + + Buffer.prototype.writeFloatLE = function writeFloatLE( + value, + offset, + noAssert + ) { + return writeFloat(this, value, offset, true, noAssert); + }; + + Buffer.prototype.writeFloatBE = function writeFloatBE( + value, + offset, + noAssert + ) { + return writeFloat(this, value, offset, false, noAssert); + }; + + function writeDouble(buf, value, offset, littleEndian, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) { + checkIEEE754( + buf, + value, + offset, + 8, + 1.7976931348623157e308, + -1.7976931348623157e308 + ); + } + ieee754.write(buf, value, offset, littleEndian, 52, 8); + return offset + 8; + } + + Buffer.prototype.writeDoubleLE = function writeDoubleLE( + value, + offset, + noAssert + ) { + return writeDouble(this, value, offset, true, noAssert); + }; + + Buffer.prototype.writeDoubleBE = function writeDoubleBE( + value, + offset, + noAssert + ) { + return writeDouble(this, value, offset, false, noAssert); + }; + + // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) + Buffer.prototype.copy = function copy( + target, + targetStart, + start, + end + ) { + if (!Buffer.isBuffer(target)) + throw new TypeError("argument should be a Buffer"); + if (!start) start = 0; + if (!end && end !== 0) end = this.length; + if (targetStart >= target.length) targetStart = target.length; + if (!targetStart) targetStart = 0; + if (end > 0 && end < start) end = start; + + // Copy 0 bytes; we're done + if (end === start) return 0; + if (target.length === 0 || this.length === 0) return 0; + + // Fatal error conditions + if (targetStart < 0) { + throw new RangeError("targetStart out of bounds"); + } + if (start < 0 || start >= this.length) + throw new RangeError("Index out of range"); + if (end < 0) throw new RangeError("sourceEnd out of bounds"); + + // Are we oob? + if (end > this.length) end = this.length; + if (target.length - targetStart < end - start) { + end = target.length - targetStart + start; + } + + var len = end - start; + + if ( + this === target && + typeof Uint8Array.prototype.copyWithin === "function" + ) { + // Use built-in when available, missing from IE11 + this.copyWithin(targetStart, start, end); + } else if ( + this === target && + start < targetStart && + targetStart < end + ) { + // descending copy from end + for (var i = len - 1; i >= 0; --i) { + target[i + targetStart] = this[i + start]; + } + } else { + Uint8Array.prototype.set.call( + target, + this.subarray(start, end), + targetStart + ); + } + + return len; + }; + + // Usage: + // buffer.fill(number[, offset[, end]]) + // buffer.fill(buffer[, offset[, end]]) + // buffer.fill(string[, offset[, end]][, encoding]) + Buffer.prototype.fill = function fill(val, start, end, encoding) { + // Handle string cases: + if (typeof val === "string") { + if (typeof start === "string") { + encoding = start; + start = 0; + end = this.length; + } else if (typeof end === "string") { + encoding = end; + end = this.length; + } + if (encoding !== undefined && typeof encoding !== "string") { + throw new TypeError("encoding must be a string"); + } + if ( + typeof encoding === "string" && + !Buffer.isEncoding(encoding) + ) { + throw new TypeError("Unknown encoding: " + encoding); + } + if (val.length === 1) { + var code = val.charCodeAt(0); + if ( + (encoding === "utf8" && code < 128) || + encoding === "latin1" + ) { + // Fast path: If `val` fits into a single byte, use that numeric value. + val = code; + } + } + } else if (typeof val === "number") { + val = val & 255; + } + + // Invalid ranges are not set to a default, so can range check early. + if (start < 0 || this.length < start || this.length < end) { + throw new RangeError("Out of range index"); + } + + if (end <= start) { + return this; + } + + start = start >>> 0; + end = end === undefined ? this.length : end >>> 0; + + if (!val) val = 0; + + var i; + if (typeof val === "number") { + for (i = start; i < end; ++i) { + this[i] = val; + } + } else { + var bytes = Buffer.isBuffer(val) + ? val + : Buffer.from(val, encoding); + var len = bytes.length; + if (len === 0) { + throw new TypeError( + 'The value "' + val + '" is invalid for argument "value"' + ); + } + for (i = 0; i < end - start; ++i) { + this[i + start] = bytes[i % len]; + } + } + + return this; + }; + + // HELPER FUNCTIONS + // ================ + + var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g; + + function base64clean(str) { + // Node takes equal signs as end of the Base64 encoding + str = str.split("=")[0]; + // Node strips out invalid characters like \n and \t from the string, base64-js does not + str = str.trim().replace(INVALID_BASE64_RE, ""); + // Node converts strings with length < 2 to '' + if (str.length < 2) return ""; + // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not + while (str.length % 4 !== 0) { + str = str + "="; + } + return str; + } + + function toHex(n) { + if (n < 16) return "0" + n.toString(16); + return n.toString(16); + } + + function utf8ToBytes(string, units) { + units = units || Infinity; + var codePoint; + var length = string.length; + var leadSurrogate = null; + var bytes = []; + + for (var i = 0; i < length; ++i) { + codePoint = string.charCodeAt(i); + + // is surrogate component + if (codePoint > 0xd7ff && codePoint < 0xe000) { + // last char was a lead + if (!leadSurrogate) { + // no lead yet + if (codePoint > 0xdbff) { + // unexpected trail + if ((units -= 3) > -1) bytes.push(0xef, 0xbf, 0xbd); + continue; + } else if (i + 1 === length) { + // unpaired lead + if ((units -= 3) > -1) bytes.push(0xef, 0xbf, 0xbd); + continue; + } + + // valid lead + leadSurrogate = codePoint; + + continue; + } + + // 2 leads in a row + if (codePoint < 0xdc00) { + if ((units -= 3) > -1) bytes.push(0xef, 0xbf, 0xbd); + leadSurrogate = codePoint; + continue; + } + + // valid surrogate pair + codePoint = + (((leadSurrogate - 0xd800) << 10) | (codePoint - 0xdc00)) + + 0x10000; + } else if (leadSurrogate) { + // valid bmp char, but last char was a lead + if ((units -= 3) > -1) bytes.push(0xef, 0xbf, 0xbd); + } + + leadSurrogate = null; + + // encode utf8 + if (codePoint < 0x80) { + if ((units -= 1) < 0) break; + bytes.push(codePoint); + } else if (codePoint < 0x800) { + if ((units -= 2) < 0) break; + bytes.push( + (codePoint >> 0x6) | 0xc0, + (codePoint & 0x3f) | 0x80 + ); + } else if (codePoint < 0x10000) { + if ((units -= 3) < 0) break; + bytes.push( + (codePoint >> 0xc) | 0xe0, + ((codePoint >> 0x6) & 0x3f) | 0x80, + (codePoint & 0x3f) | 0x80 + ); + } else if (codePoint < 0x110000) { + if ((units -= 4) < 0) break; + bytes.push( + (codePoint >> 0x12) | 0xf0, + ((codePoint >> 0xc) & 0x3f) | 0x80, + ((codePoint >> 0x6) & 0x3f) | 0x80, + (codePoint & 0x3f) | 0x80 + ); + } else { + throw new Error("Invalid code point"); + } + } + + return bytes; + } + + function asciiToBytes(str) { + var byteArray = []; + for (var i = 0; i < str.length; ++i) { + // Node's code seems to be doing this and not & 0x7F.. + byteArray.push(str.charCodeAt(i) & 0xff); + } + return byteArray; + } + + function utf16leToBytes(str, units) { + var c, hi, lo; + var byteArray = []; + for (var i = 0; i < str.length; ++i) { + if ((units -= 2) < 0) break; + + c = str.charCodeAt(i); + hi = c >> 8; + lo = c % 256; + byteArray.push(lo); + byteArray.push(hi); + } + + return byteArray; + } + + function base64ToBytes(str) { + return base64.toByteArray(base64clean(str)); + } + + function blitBuffer(src, dst, offset, length) { + for (var i = 0; i < length; ++i) { + if (i + offset >= dst.length || i >= src.length) break; + dst[i + offset] = src[i]; + } + return i; + } + + // ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass + // the `instanceof` check but they should be treated as of that type. + // See: https://github.com/feross/buffer/issues/166 + function isInstance(obj, type) { + return ( + obj instanceof type || + (obj != null && + obj.constructor != null && + obj.constructor.name != null && + obj.constructor.name === type.name) + ); + } + function numberIsNaN(obj) { + // For IE11 support + return obj !== obj; // eslint-disable-line no-self-compare + } + }.call(this, require("buffer").Buffer)); + }, + { "base64-js": 1, buffer: 4, ieee754: 105 } + ], + 5: [ + function(require, module, exports) { + module.exports = { + "100": "Continue", + "101": "Switching Protocols", + "102": "Processing", + "200": "OK", + "201": "Created", + "202": "Accepted", + "203": "Non-Authoritative Information", + "204": "No Content", + "205": "Reset Content", + "206": "Partial Content", + "207": "Multi-Status", + "208": "Already Reported", + "226": "IM Used", + "300": "Multiple Choices", + "301": "Moved Permanently", + "302": "Found", + "303": "See Other", + "304": "Not Modified", + "305": "Use Proxy", + "307": "Temporary Redirect", + "308": "Permanent Redirect", + "400": "Bad Request", + "401": "Unauthorized", + "402": "Payment Required", + "403": "Forbidden", + "404": "Not Found", + "405": "Method Not Allowed", + "406": "Not Acceptable", + "407": "Proxy Authentication Required", + "408": "Request Timeout", + "409": "Conflict", + "410": "Gone", + "411": "Length Required", + "412": "Precondition Failed", + "413": "Payload Too Large", + "414": "URI Too Long", + "415": "Unsupported Media Type", + "416": "Range Not Satisfiable", + "417": "Expectation Failed", + "418": "I'm a teapot", + "421": "Misdirected Request", + "422": "Unprocessable Entity", + "423": "Locked", + "424": "Failed Dependency", + "425": "Unordered Collection", + "426": "Upgrade Required", + "428": "Precondition Required", + "429": "Too Many Requests", + "431": "Request Header Fields Too Large", + "451": "Unavailable For Legal Reasons", + "500": "Internal Server Error", + "501": "Not Implemented", + "502": "Bad Gateway", + "503": "Service Unavailable", + "504": "Gateway Timeout", + "505": "HTTP Version Not Supported", + "506": "Variant Also Negotiates", + "507": "Insufficient Storage", + "508": "Loop Detected", + "509": "Bandwidth Limit Exceeded", + "510": "Not Extended", + "511": "Network Authentication Required" + }; + }, + {} + ], + 6: [ + function(require, module, exports) { + module.exports = require("./lib/clean"); + }, + { "./lib/clean": 7 } + ], + 7: [ + function(require, module, exports) { + (function(process) { + /** + * Clean-css - https://github.com/jakubpawlowicz/clean-css + * Released under the terms of MIT license + * + * Copyright (C) 2017 JakubPawlowicz.com + */ + + var level0Optimize = require("./optimizer/level-0/optimize"); + var level1Optimize = require("./optimizer/level-1/optimize"); + var level2Optimize = require("./optimizer/level-2/optimize"); + var validator = require("./optimizer/validator"); + + var compatibilityFrom = require("./options/compatibility"); + var fetchFrom = require("./options/fetch"); + var formatFrom = require("./options/format").formatFrom; + var inlineFrom = require("./options/inline"); + var inlineRequestFrom = require("./options/inline-request"); + var inlineTimeoutFrom = require("./options/inline-timeout"); + var OptimizationLevel = require("./options/optimization-level") + .OptimizationLevel; + var optimizationLevelFrom = require("./options/optimization-level") + .optimizationLevelFrom; + var rebaseFrom = require("./options/rebase"); + var rebaseToFrom = require("./options/rebase-to"); + + var inputSourceMapTracker = require("./reader/input-source-map-tracker"); + var readSources = require("./reader/read-sources"); + + var serializeStyles = require("./writer/simple"); + var serializeStylesAndSourceMap = require("./writer/source-maps"); + + var CleanCSS = (module.exports = function CleanCSS(options) { + options = options || {}; + + this.options = { + compatibility: compatibilityFrom(options.compatibility), + fetch: fetchFrom(options.fetch), + format: formatFrom(options.format), + inline: inlineFrom(options.inline), + inlineRequest: inlineRequestFrom(options.inlineRequest), + inlineTimeout: inlineTimeoutFrom(options.inlineTimeout), + level: optimizationLevelFrom(options.level), + rebase: rebaseFrom(options.rebase), + rebaseTo: rebaseToFrom(options.rebaseTo), + returnPromise: !!options.returnPromise, + sourceMap: !!options.sourceMap, + sourceMapInlineSources: !!options.sourceMapInlineSources + }; + }); + + // for compatibility with optimize-css-assets-webpack-plugin + CleanCSS.process = function(input, opts) { + var cleanCss; + var optsTo = opts.to; + + delete opts.to; + cleanCss = new CleanCSS( + Object.assign({ returnPromise: true, rebaseTo: optsTo }, opts) + ); + + return cleanCss.minify(input).then(function(output) { + return { css: output.styles }; + }); + }; + + CleanCSS.prototype.minify = function( + input, + maybeSourceMap, + maybeCallback + ) { + var options = this.options; + + if (options.returnPromise) { + return new Promise(function(resolve, reject) { + minify(input, options, maybeSourceMap, function( + errors, + output + ) { + return errors ? reject(errors) : resolve(output); + }); + }); + } else { + return minify(input, options, maybeSourceMap, maybeCallback); + } + }; + + function minify(input, options, maybeSourceMap, maybeCallback) { + var sourceMap = + typeof maybeSourceMap != "function" ? maybeSourceMap : null; + var callback = + typeof maybeCallback == "function" + ? maybeCallback + : typeof maybeSourceMap == "function" + ? maybeSourceMap + : null; + var context = { + stats: { + efficiency: 0, + minifiedSize: 0, + originalSize: 0, + startedAt: Date.now(), + timeSpent: 0 + }, + cache: { + specificity: {} + }, + errors: [], + inlinedStylesheets: [], + inputSourceMapTracker: inputSourceMapTracker(), + localOnly: !callback, + options: options, + source: null, + sourcesContent: {}, + validator: validator(options.compatibility), + warnings: [] + }; + + if (sourceMap) { + context.inputSourceMapTracker.track(undefined, sourceMap); + } + + return runner(context.localOnly)(function() { + return readSources(input, context, function(tokens) { + var serialize = context.options.sourceMap + ? serializeStylesAndSourceMap + : serializeStyles; + + var optimizedTokens = optimize(tokens, context); + var optimizedStyles = serialize(optimizedTokens, context); + var output = withMetadata(optimizedStyles, context); + + return callback + ? callback( + context.errors.length > 0 ? context.errors : null, + output + ) + : output; + }); + }); + } + + function runner(localOnly) { + // to always execute code asynchronously when a callback is given + // more at blog.izs.me/post/59142742143/designing-apis-for-asynchrony + return localOnly + ? function(callback) { + return callback(); + } + : process.nextTick; + } + + function optimize(tokens, context) { + var optimized; + + optimized = level0Optimize(tokens, context); + optimized = + OptimizationLevel.One in context.options.level + ? level1Optimize(tokens, context) + : tokens; + optimized = + OptimizationLevel.Two in context.options.level + ? level2Optimize(tokens, context, true) + : optimized; + + return optimized; + } + + function withMetadata(output, context) { + output.stats = calculateStatsFrom(output.styles, context); + output.errors = context.errors; + output.inlinedStylesheets = context.inlinedStylesheets; + output.warnings = context.warnings; + + return output; + } + + function calculateStatsFrom(styles, context) { + var finishedAt = Date.now(); + var timeSpent = finishedAt - context.stats.startedAt; + + delete context.stats.startedAt; + context.stats.timeSpent = timeSpent; + context.stats.efficiency = + 1 - styles.length / context.stats.originalSize; + context.stats.minifiedSize = styles.length; + + return context.stats; + } + }.call(this, require("_process"))); + }, + { + "./optimizer/level-0/optimize": 9, + "./optimizer/level-1/optimize": 10, + "./optimizer/level-2/optimize": 29, + "./optimizer/validator": 57, + "./options/compatibility": 59, + "./options/fetch": 60, + "./options/format": 61, + "./options/inline": 64, + "./options/inline-request": 62, + "./options/inline-timeout": 63, + "./options/optimization-level": 65, + "./options/rebase": 67, + "./options/rebase-to": 66, + "./reader/input-source-map-tracker": 71, + "./reader/read-sources": 77, + "./writer/simple": 99, + "./writer/source-maps": 100, + _process: 112 + } + ], + 8: [ + function(require, module, exports) { + var Hack = { + ASTERISK: "asterisk", + BANG: "bang", + BACKSLASH: "backslash", + UNDERSCORE: "underscore" + }; + + module.exports = Hack; + }, + {} + ], + 9: [ + function(require, module, exports) { + function level0Optimize(tokens) { + // noop as level 0 means no optimizations! + return tokens; + } + + module.exports = level0Optimize; + }, + {} + ], + 10: [ + function(require, module, exports) { + var shortenHex = require("./shorten-hex"); + var shortenHsl = require("./shorten-hsl"); + var shortenRgb = require("./shorten-rgb"); + var sortSelectors = require("./sort-selectors"); + var tidyRules = require("./tidy-rules"); + var tidyBlock = require("./tidy-block"); + var tidyAtRule = require("./tidy-at-rule"); + + var Hack = require("../hack"); + var removeUnused = require("../remove-unused"); + var restoreFromOptimizing = require("../restore-from-optimizing"); + var wrapForOptimizing = require("../wrap-for-optimizing").all; + + var OptimizationLevel = require("../../options/optimization-level") + .OptimizationLevel; + + var Token = require("../../tokenizer/token"); + var Marker = require("../../tokenizer/marker"); + + var formatPosition = require("../../utils/format-position"); + var split = require("../../utils/split"); + + var serializeRules = require("../../writer/one-time").rules; + + var IgnoreProperty = "ignore-property"; + + var CHARSET_TOKEN = "@charset"; + var CHARSET_REGEXP = new RegExp("^" + CHARSET_TOKEN, "i"); + + var DEFAULT_ROUNDING_PRECISION = require("../../options/rounding-precision") + .DEFAULT; + + var WHOLE_PIXEL_VALUE = /(?:^|\s|\()(-?\d+)px/; + var TIME_VALUE = /^(\-?[\d\.]+)(m?s)$/; + + var HEX_VALUE_PATTERN = /[0-9a-f]/i; + var PROPERTY_NAME_PATTERN = /^(?:\-chrome\-|\-[\w\-]+\w|\w[\w\-]+\w|\-\-\S+)$/; + var IMPORT_PREFIX_PATTERN = /^@import/i; + var QUOTED_PATTERN = /^('.*'|".*")$/; + var QUOTED_BUT_SAFE_PATTERN = /^['"][a-zA-Z][a-zA-Z\d\-_]+['"]$/; + var URL_PREFIX_PATTERN = /^url\(/i; + var VARIABLE_NAME_PATTERN = /^--\S+$/; + + function isNegative(value) { + return value && value[1][0] == "-" && parseFloat(value[1]) < 0; + } + + function isQuoted(value) { + return QUOTED_PATTERN.test(value); + } + + function isUrl(value) { + return URL_PREFIX_PATTERN.test(value); + } + + function normalizeUrl(value) { + return value + .replace(URL_PREFIX_PATTERN, "url(") + .replace(/\\?\n|\\?\r\n/g, ""); + } + + function optimizeBackground(property) { + var values = property.value; + + if (values.length == 1 && values[0][1] == "none") { + values[0][1] = "0 0"; + } + + if (values.length == 1 && values[0][1] == "transparent") { + values[0][1] = "0 0"; + } + } + + function optimizeBorderRadius(property) { + var values = property.value; + var spliceAt; + + if ( + values.length == 3 && + values[1][1] == "/" && + values[0][1] == values[2][1] + ) { + spliceAt = 1; + } else if ( + values.length == 5 && + values[2][1] == "/" && + values[0][1] == values[3][1] && + values[1][1] == values[4][1] + ) { + spliceAt = 2; + } else if ( + values.length == 7 && + values[3][1] == "/" && + values[0][1] == values[4][1] && + values[1][1] == values[5][1] && + values[2][1] == values[6][1] + ) { + spliceAt = 3; + } else if ( + values.length == 9 && + values[4][1] == "/" && + values[0][1] == values[5][1] && + values[1][1] == values[6][1] && + values[2][1] == values[7][1] && + values[3][1] == values[8][1] + ) { + spliceAt = 4; + } + + if (spliceAt) { + property.value.splice(spliceAt); + property.dirty = true; + } + } + + function optimizeColors(name, value, compatibility) { + if ( + value.indexOf("#") === -1 && + value.indexOf("rgb") == -1 && + value.indexOf("hsl") == -1 + ) { + return shortenHex(value); + } + + value = value + .replace(/rgb\((\-?\d+),(\-?\d+),(\-?\d+)\)/g, function( + match, + red, + green, + blue + ) { + return shortenRgb(red, green, blue); + }) + .replace(/hsl\((-?\d+),(-?\d+)%?,(-?\d+)%?\)/g, function( + match, + hue, + saturation, + lightness + ) { + return shortenHsl(hue, saturation, lightness); + }) + .replace(/(^|[^='"])#([0-9a-f]{6})/gi, function( + match, + prefix, + color, + at, + inputValue + ) { + var suffix = inputValue[at + match.length]; + + if (suffix && HEX_VALUE_PATTERN.test(suffix)) { + return match; + } else if ( + color[0] == color[1] && + color[2] == color[3] && + color[4] == color[5] + ) { + return ( + prefix + + "#" + + color[0] + + color[2] + + color[4] + ).toLowerCase(); + } else { + return (prefix + "#" + color).toLowerCase(); + } + }) + .replace(/(^|[^='"])#([0-9a-f]{3})/gi, function( + match, + prefix, + color + ) { + return prefix + "#" + color.toLowerCase(); + }) + .replace(/(rgb|rgba|hsl|hsla)\(([^\)]+)\)/g, function( + match, + colorFunction, + colorDef + ) { + var tokens = colorDef.split(","); + var applies = + (colorFunction == "hsl" && tokens.length == 3) || + (colorFunction == "hsla" && tokens.length == 4) || + (colorFunction == "rgb" && + tokens.length == 3 && + colorDef.indexOf("%") > 0) || + (colorFunction == "rgba" && + tokens.length == 4 && + colorDef.indexOf("%") > 0); + + if (!applies) { + return match; + } + + if (tokens[1].indexOf("%") == -1) { + tokens[1] += "%"; + } + + if (tokens[2].indexOf("%") == -1) { + tokens[2] += "%"; + } + + return colorFunction + "(" + tokens.join(",") + ")"; + }); + + if ( + compatibility.colors.opacity && + name.indexOf("background") == -1 + ) { + value = value.replace(/(?:rgba|hsla)\(0,0%?,0%?,0\)/g, function( + match + ) { + if ( + split(value, ",") + .pop() + .indexOf("gradient(") > -1 + ) { + return match; + } + + return "transparent"; + }); + } + + return shortenHex(value); + } + + function optimizeFilter(property) { + if (property.value.length == 1) { + property.value[0][1] = property.value[0][1].replace( + /progid:DXImageTransform\.Microsoft\.(Alpha|Chroma)(\W)/, + function(match, filter, suffix) { + return filter.toLowerCase() + suffix; + } + ); + } + + property.value[0][1] = property.value[0][1] + .replace(/,(\S)/g, ", $1") + .replace(/ ?= ?/g, "="); + } + + function optimizeFontWeight(property, atIndex) { + var value = property.value[atIndex][1]; + + if (value == "normal") { + value = "400"; + } else if (value == "bold") { + value = "700"; + } + + property.value[atIndex][1] = value; + } + + function optimizeMultipleZeros(property) { + var values = property.value; + var spliceAt; + + if ( + values.length == 4 && + values[0][1] === "0" && + values[1][1] === "0" && + values[2][1] === "0" && + values[3][1] === "0" + ) { + if (property.name.indexOf("box-shadow") > -1) { + spliceAt = 2; + } else { + spliceAt = 1; + } + } + + if (spliceAt) { + property.value.splice(spliceAt); + property.dirty = true; + } + } + + function optimizeOutline(property) { + var values = property.value; + + if (values.length == 1 && values[0][1] == "none") { + values[0][1] = "0"; + } + } + + function optimizePixelLengths(_, value, compatibility) { + if (!WHOLE_PIXEL_VALUE.test(value)) { + return value; + } + + return value.replace(WHOLE_PIXEL_VALUE, function(match, val) { + var newValue; + var intVal = parseInt(val); + + if (intVal === 0) { + return match; + } + + if ( + compatibility.properties.shorterLengthUnits && + compatibility.units.pt && + (intVal * 3) % 4 === 0 + ) { + newValue = (intVal * 3) / 4 + "pt"; + } + + if ( + compatibility.properties.shorterLengthUnits && + compatibility.units.pc && + intVal % 16 === 0 + ) { + newValue = intVal / 16 + "pc"; + } + + if ( + compatibility.properties.shorterLengthUnits && + compatibility.units.in && + intVal % 96 === 0 + ) { + newValue = intVal / 96 + "in"; + } + + if (newValue) { + newValue = match.substring(0, match.indexOf(val)) + newValue; + } + + return newValue && newValue.length < match.length + ? newValue + : match; + }); + } + + function optimizePrecision(_, value, precisionOptions) { + if (!precisionOptions.enabled || value.indexOf(".") === -1) { + return value; + } + + return value + .replace(precisionOptions.decimalPointMatcher, "$1$2$3") + .replace(precisionOptions.zeroMatcher, function( + match, + integerPart, + fractionPart, + unit + ) { + var multiplier = precisionOptions.units[unit].multiplier; + var parsedInteger = parseInt(integerPart); + var integer = isNaN(parsedInteger) ? 0 : parsedInteger; + var fraction = parseFloat(fractionPart); + + return ( + Math.round((integer + fraction) * multiplier) / multiplier + + unit + ); + }); + } + + function optimizeTimeUnits(_, value) { + if (!TIME_VALUE.test(value)) return value; + + return value.replace(TIME_VALUE, function(match, val, unit) { + var newValue; + + if (unit == "ms") { + newValue = parseInt(val) / 1000 + "s"; + } else if (unit == "s") { + newValue = parseFloat(val) * 1000 + "ms"; + } + + return newValue.length < match.length ? newValue : match; + }); + } + + function optimizeUnits(name, value, unitsRegexp) { + if ( + /^(?:\-moz\-calc|\-webkit\-calc|calc|rgb|hsl|rgba|hsla)\(/.test( + value + ) + ) { + return value; + } + + if ( + name == "flex" || + name == "-ms-flex" || + name == "-webkit-flex" || + name == "flex-basis" || + name == "-webkit-flex-basis" + ) { + return value; + } + + if ( + value.indexOf("%") > 0 && + (name == "height" || + name == "max-height" || + name == "width" || + name == "max-width") + ) { + return value; + } + + return value + .replace(unitsRegexp, "$1" + "0" + "$2") + .replace(unitsRegexp, "$1" + "0" + "$2"); + } + + function optimizeWhitespace(name, value) { + if ( + name.indexOf("filter") > -1 || + value.indexOf(" ") == -1 || + value.indexOf("expression") === 0 + ) { + return value; + } + + if ( + value.indexOf(Marker.SINGLE_QUOTE) > -1 || + value.indexOf(Marker.DOUBLE_QUOTE) > -1 + ) { + return value; + } + + value = value.replace(/\s+/g, " "); + + if (value.indexOf("calc") > -1) { + value = value.replace(/\) ?\/ ?/g, ")/ "); + } + + return value + .replace(/(\(;?)\s+/g, "$1") + .replace(/\s+(;?\))/g, "$1") + .replace(/, /g, ","); + } + + function optimizeZeroDegUnit(_, value) { + if (value.indexOf("0deg") == -1) { + return value; + } + + return value.replace(/\(0deg\)/g, "(0)"); + } + + function optimizeZeroUnits(name, value) { + if (value.indexOf("0") == -1) { + return value; + } + + if (value.indexOf("-") > -1) { + value = value + .replace(/([^\w\d\-]|^)\-0([^\.]|$)/g, "$10$2") + .replace(/([^\w\d\-]|^)\-0([^\.]|$)/g, "$10$2"); + } + + return value + .replace(/(^|\s)0+([1-9])/g, "$1$2") + .replace(/(^|\D)\.0+(\D|$)/g, "$10$2") + .replace(/(^|\D)\.0+(\D|$)/g, "$10$2") + .replace(/\.([1-9]*)0+(\D|$)/g, function( + match, + nonZeroPart, + suffix + ) { + return (nonZeroPart.length > 0 ? "." : "") + nonZeroPart + suffix; + }) + .replace(/(^|\D)0\.(\d)/g, "$1.$2"); + } + + function removeQuotes(name, value) { + if ( + name == "content" || + name.indexOf("font-variation-settings") > -1 || + name.indexOf("font-feature-settings") > -1 || + name.indexOf("grid-") > -1 + ) { + return value; + } + + return QUOTED_BUT_SAFE_PATTERN.test(value) + ? value.substring(1, value.length - 1) + : value; + } + + function removeUrlQuotes(value) { + return /^url\(['"].+['"]\)$/.test(value) && + !/^url\(['"].*[\*\s\(\)'"].*['"]\)$/.test(value) && + !/^url\(['"]data:[^;]+;charset/.test(value) + ? value.replace(/["']/g, "") + : value; + } + + function transformValue( + propertyName, + propertyValue, + rule, + transformCallback + ) { + var selector = serializeRules(rule); + var transformedValue = transformCallback( + propertyName, + propertyValue, + selector + ); + + if (transformedValue === undefined) { + return propertyValue; + } else if (transformedValue === false) { + return IgnoreProperty; + } else { + return transformedValue; + } + } + + // + + function optimizeBody(rule, properties, context) { + var options = context.options; + var levelOptions = options.level[OptimizationLevel.One]; + var property, name, type, value; + var valueIsUrl; + var propertyToken; + var _properties = wrapForOptimizing(properties, true); + + propertyLoop: for (var i = 0, l = _properties.length; i < l; i++) { + property = _properties[i]; + name = property.name; + + if (!PROPERTY_NAME_PATTERN.test(name)) { + propertyToken = property.all[property.position]; + context.warnings.push( + "Invalid property name '" + + name + + "' at " + + formatPosition(propertyToken[1][2][0]) + + ". Ignoring." + ); + property.unused = true; + } + + if (property.value.length === 0) { + propertyToken = property.all[property.position]; + context.warnings.push( + "Empty property '" + + name + + "' at " + + formatPosition(propertyToken[1][2][0]) + + ". Ignoring." + ); + property.unused = true; + } + + if ( + property.hack && + (((property.hack[0] == Hack.ASTERISK || + property.hack[0] == Hack.UNDERSCORE) && + !options.compatibility.properties.iePrefixHack) || + (property.hack[0] == Hack.BACKSLASH && + !options.compatibility.properties.ieSuffixHack) || + (property.hack[0] == Hack.BANG && + !options.compatibility.properties.ieBangHack)) + ) { + property.unused = true; + } + + if ( + levelOptions.removeNegativePaddings && + name.indexOf("padding") === 0 && + (isNegative(property.value[0]) || + isNegative(property.value[1]) || + isNegative(property.value[2]) || + isNegative(property.value[3])) + ) { + property.unused = true; + } + + if ( + !options.compatibility.properties.ieFilters && + isLegacyFilter(property) + ) { + property.unused = true; + } + + if (property.unused) { + continue; + } + + if (property.block) { + optimizeBody(rule, property.value[0][1], context); + continue; + } + + if (VARIABLE_NAME_PATTERN.test(name)) { + continue; + } + + for (var j = 0, m = property.value.length; j < m; j++) { + type = property.value[j][0]; + value = property.value[j][1]; + valueIsUrl = isUrl(value); + + if (type == Token.PROPERTY_BLOCK) { + property.unused = true; + context.warnings.push( + "Invalid value token at " + + formatPosition(value[0][1][2][0]) + + ". Ignoring." + ); + break; + } + + if (valueIsUrl && !context.validator.isUrl(value)) { + property.unused = true; + context.warnings.push( + "Broken URL '" + + value + + "' at " + + formatPosition(property.value[j][2][0]) + + ". Ignoring." + ); + break; + } + + if (valueIsUrl) { + value = levelOptions.normalizeUrls + ? normalizeUrl(value) + : value; + value = !options.compatibility.properties.urlQuotes + ? removeUrlQuotes(value) + : value; + } else if (isQuoted(value)) { + value = levelOptions.removeQuotes + ? removeQuotes(name, value) + : value; + } else { + value = levelOptions.removeWhitespace + ? optimizeWhitespace(name, value) + : value; + value = optimizePrecision(name, value, options.precision); + value = optimizePixelLengths( + name, + value, + options.compatibility + ); + value = levelOptions.replaceTimeUnits + ? optimizeTimeUnits(name, value) + : value; + value = levelOptions.replaceZeroUnits + ? optimizeZeroUnits(name, value) + : value; + + if (options.compatibility.properties.zeroUnits) { + value = optimizeZeroDegUnit(name, value); + value = optimizeUnits(name, value, options.unitsRegexp); + } + + if (options.compatibility.properties.colors) { + value = optimizeColors(name, value, options.compatibility); + } + } + + value = transformValue(name, value, rule, levelOptions.transform); + + if (value === IgnoreProperty) { + property.unused = true; + continue propertyLoop; + } + + property.value[j][1] = value; + } + + if (levelOptions.replaceMultipleZeros) { + optimizeMultipleZeros(property); + } + + if (name == "background" && levelOptions.optimizeBackground) { + optimizeBackground(property); + } else if ( + name.indexOf("border") === 0 && + name.indexOf("radius") > 0 && + levelOptions.optimizeBorderRadius + ) { + optimizeBorderRadius(property); + } else if ( + name == "filter" && + levelOptions.optimizeFilter && + options.compatibility.properties.ieFilters + ) { + optimizeFilter(property); + } else if ( + name == "font-weight" && + levelOptions.optimizeFontWeight + ) { + optimizeFontWeight(property, 0); + } else if (name == "outline" && levelOptions.optimizeOutline) { + optimizeOutline(property); + } + } + + restoreFromOptimizing(_properties); + removeUnused(_properties); + removeComments(properties, options); + } + + function removeComments(tokens, options) { + var token; + var i; + + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + + if (token[0] != Token.COMMENT) { + continue; + } + + optimizeComment(token, options); + + if (token[1].length === 0) { + tokens.splice(i, 1); + i--; + } + } + } + + function optimizeComment(token, options) { + if ( + token[1][2] == Marker.EXCLAMATION && + (options.level[OptimizationLevel.One].specialComments == "all" || + options.commentsKept < + options.level[OptimizationLevel.One].specialComments) + ) { + options.commentsKept++; + return; + } + + token[1] = []; + } + + function cleanupCharsets(tokens) { + var hasCharset = false; + + for (var i = 0, l = tokens.length; i < l; i++) { + var token = tokens[i]; + + if (token[0] != Token.AT_RULE) continue; + + if (!CHARSET_REGEXP.test(token[1])) continue; + + if (hasCharset || token[1].indexOf(CHARSET_TOKEN) == -1) { + tokens.splice(i, 1); + i--; + l--; + } else { + hasCharset = true; + tokens.splice(i, 1); + tokens.unshift([ + Token.AT_RULE, + token[1].replace(CHARSET_REGEXP, CHARSET_TOKEN) + ]); + } + } + } + + function buildUnitRegexp(options) { + var units = ["px", "em", "ex", "cm", "mm", "in", "pt", "pc", "%"]; + var otherUnits = ["ch", "rem", "vh", "vm", "vmax", "vmin", "vw"]; + + otherUnits.forEach(function(unit) { + if (options.compatibility.units[unit]) { + units.push(unit); + } + }); + + return new RegExp( + "(^|\\s|\\(|,)0(?:" + units.join("|") + ")(\\W|$)", + "g" + ); + } + + function buildPrecisionOptions(roundingPrecision) { + var precisionOptions = { + matcher: null, + units: {} + }; + var optimizable = []; + var unit; + var value; + + for (unit in roundingPrecision) { + value = roundingPrecision[unit]; + + if (value != DEFAULT_ROUNDING_PRECISION) { + precisionOptions.units[unit] = {}; + precisionOptions.units[unit].value = value; + precisionOptions.units[unit].multiplier = Math.pow(10, value); + + optimizable.push(unit); + } + } + + if (optimizable.length > 0) { + precisionOptions.enabled = true; + precisionOptions.decimalPointMatcher = new RegExp( + "(\\d)\\.($|" + optimizable.join("|") + ")($|W)", + "g" + ); + precisionOptions.zeroMatcher = new RegExp( + "(\\d*)(\\.\\d+)(" + optimizable.join("|") + ")", + "g" + ); + } + + return precisionOptions; + } + + function isImport(token) { + return IMPORT_PREFIX_PATTERN.test(token[1]); + } + + function isLegacyFilter(property) { + var value; + + if (property.name == "filter" || property.name == "-ms-filter") { + value = property.value[0][1]; + + return ( + value.indexOf("progid") > -1 || + value.indexOf("alpha") === 0 || + value.indexOf("chroma") === 0 + ); + } else { + return false; + } + } + + function level1Optimize(tokens, context) { + var options = context.options; + var levelOptions = options.level[OptimizationLevel.One]; + var ie7Hack = options.compatibility.selectors.ie7Hack; + var adjacentSpace = options.compatibility.selectors.adjacentSpace; + var spaceAfterClosingBrace = + options.compatibility.properties.spaceAfterClosingBrace; + var format = options.format; + var mayHaveCharset = false; + var afterRules = false; + + options.unitsRegexp = options.unitsRegexp || buildUnitRegexp(options); + options.precision = + options.precision || + buildPrecisionOptions(levelOptions.roundingPrecision); + options.commentsKept = options.commentsKept || 0; + + for (var i = 0, l = tokens.length; i < l; i++) { + var token = tokens[i]; + + switch (token[0]) { + case Token.AT_RULE: + token[1] = isImport(token) && afterRules ? "" : token[1]; + token[1] = levelOptions.tidyAtRules + ? tidyAtRule(token[1]) + : token[1]; + mayHaveCharset = true; + break; + case Token.AT_RULE_BLOCK: + optimizeBody(token[1], token[2], context); + afterRules = true; + break; + case Token.NESTED_BLOCK: + token[1] = levelOptions.tidyBlockScopes + ? tidyBlock(token[1], spaceAfterClosingBrace) + : token[1]; + level1Optimize(token[2], context); + afterRules = true; + break; + case Token.COMMENT: + optimizeComment(token, options); + break; + case Token.RULE: + token[1] = levelOptions.tidySelectors + ? tidyRules( + token[1], + !ie7Hack, + adjacentSpace, + format, + context.warnings + ) + : token[1]; + token[1] = + token[1].length > 1 + ? sortSelectors( + token[1], + levelOptions.selectorsSortingMethod + ) + : token[1]; + optimizeBody(token[1], token[2], context); + afterRules = true; + break; + } + + if ( + (token[0] == Token.COMMENT && token[1].length === 0) || + (levelOptions.removeEmpty && + (token[1].length === 0 || (token[2] && token[2].length === 0))) + ) { + tokens.splice(i, 1); + i--; + l--; + } + } + + if (levelOptions.cleanupCharsets && mayHaveCharset) { + cleanupCharsets(tokens); + } + + return tokens; + } + + module.exports = level1Optimize; + }, + { + "../../options/optimization-level": 65, + "../../options/rounding-precision": 68, + "../../tokenizer/marker": 83, + "../../tokenizer/token": 84, + "../../utils/format-position": 87, + "../../utils/split": 96, + "../../writer/one-time": 98, + "../hack": 8, + "../remove-unused": 55, + "../restore-from-optimizing": 56, + "../wrap-for-optimizing": 58, + "./shorten-hex": 11, + "./shorten-hsl": 12, + "./shorten-rgb": 13, + "./sort-selectors": 14, + "./tidy-at-rule": 15, + "./tidy-block": 16, + "./tidy-rules": 17 + } + ], + 11: [ + function(require, module, exports) { + var COLORS = { + aliceblue: "#f0f8ff", + antiquewhite: "#faebd7", + aqua: "#0ff", + aquamarine: "#7fffd4", + azure: "#f0ffff", + beige: "#f5f5dc", + bisque: "#ffe4c4", + black: "#000", + blanchedalmond: "#ffebcd", + blue: "#00f", + blueviolet: "#8a2be2", + brown: "#a52a2a", + burlywood: "#deb887", + cadetblue: "#5f9ea0", + chartreuse: "#7fff00", + chocolate: "#d2691e", + coral: "#ff7f50", + cornflowerblue: "#6495ed", + cornsilk: "#fff8dc", + crimson: "#dc143c", + cyan: "#0ff", + darkblue: "#00008b", + darkcyan: "#008b8b", + darkgoldenrod: "#b8860b", + darkgray: "#a9a9a9", + darkgreen: "#006400", + darkgrey: "#a9a9a9", + darkkhaki: "#bdb76b", + darkmagenta: "#8b008b", + darkolivegreen: "#556b2f", + darkorange: "#ff8c00", + darkorchid: "#9932cc", + darkred: "#8b0000", + darksalmon: "#e9967a", + darkseagreen: "#8fbc8f", + darkslateblue: "#483d8b", + darkslategray: "#2f4f4f", + darkslategrey: "#2f4f4f", + darkturquoise: "#00ced1", + darkviolet: "#9400d3", + deeppink: "#ff1493", + deepskyblue: "#00bfff", + dimgray: "#696969", + dimgrey: "#696969", + dodgerblue: "#1e90ff", + firebrick: "#b22222", + floralwhite: "#fffaf0", + forestgreen: "#228b22", + fuchsia: "#f0f", + gainsboro: "#dcdcdc", + ghostwhite: "#f8f8ff", + gold: "#ffd700", + goldenrod: "#daa520", + gray: "#808080", + green: "#008000", + greenyellow: "#adff2f", + grey: "#808080", + honeydew: "#f0fff0", + hotpink: "#ff69b4", + indianred: "#cd5c5c", + indigo: "#4b0082", + ivory: "#fffff0", + khaki: "#f0e68c", + lavender: "#e6e6fa", + lavenderblush: "#fff0f5", + lawngreen: "#7cfc00", + lemonchiffon: "#fffacd", + lightblue: "#add8e6", + lightcoral: "#f08080", + lightcyan: "#e0ffff", + lightgoldenrodyellow: "#fafad2", + lightgray: "#d3d3d3", + lightgreen: "#90ee90", + lightgrey: "#d3d3d3", + lightpink: "#ffb6c1", + lightsalmon: "#ffa07a", + lightseagreen: "#20b2aa", + lightskyblue: "#87cefa", + lightslategray: "#778899", + lightslategrey: "#778899", + lightsteelblue: "#b0c4de", + lightyellow: "#ffffe0", + lime: "#0f0", + limegreen: "#32cd32", + linen: "#faf0e6", + magenta: "#ff00ff", + maroon: "#800000", + mediumaquamarine: "#66cdaa", + mediumblue: "#0000cd", + mediumorchid: "#ba55d3", + mediumpurple: "#9370db", + mediumseagreen: "#3cb371", + mediumslateblue: "#7b68ee", + mediumspringgreen: "#00fa9a", + mediumturquoise: "#48d1cc", + mediumvioletred: "#c71585", + midnightblue: "#191970", + mintcream: "#f5fffa", + mistyrose: "#ffe4e1", + moccasin: "#ffe4b5", + navajowhite: "#ffdead", + navy: "#000080", + oldlace: "#fdf5e6", + olive: "#808000", + olivedrab: "#6b8e23", + orange: "#ffa500", + orangered: "#ff4500", + orchid: "#da70d6", + palegoldenrod: "#eee8aa", + palegreen: "#98fb98", + paleturquoise: "#afeeee", + palevioletred: "#db7093", + papayawhip: "#ffefd5", + peachpuff: "#ffdab9", + peru: "#cd853f", + pink: "#ffc0cb", + plum: "#dda0dd", + powderblue: "#b0e0e6", + purple: "#800080", + rebeccapurple: "#663399", + red: "#f00", + rosybrown: "#bc8f8f", + royalblue: "#4169e1", + saddlebrown: "#8b4513", + salmon: "#fa8072", + sandybrown: "#f4a460", + seagreen: "#2e8b57", + seashell: "#fff5ee", + sienna: "#a0522d", + silver: "#c0c0c0", + skyblue: "#87ceeb", + slateblue: "#6a5acd", + slategray: "#708090", + slategrey: "#708090", + snow: "#fffafa", + springgreen: "#00ff7f", + steelblue: "#4682b4", + tan: "#d2b48c", + teal: "#008080", + thistle: "#d8bfd8", + tomato: "#ff6347", + turquoise: "#40e0d0", + violet: "#ee82ee", + wheat: "#f5deb3", + white: "#fff", + whitesmoke: "#f5f5f5", + yellow: "#ff0", + yellowgreen: "#9acd32" + }; + + var toHex = {}; + var toName = {}; + + for (var name in COLORS) { + var hex = COLORS[name]; + + if (name.length < hex.length) { + toName[hex] = name; + } else { + toHex[name] = hex; + } + } + + var toHexPattern = new RegExp( + "(^| |,|\\))(" + Object.keys(toHex).join("|") + ")( |,|\\)|$)", + "ig" + ); + var toNamePattern = new RegExp( + "(" + Object.keys(toName).join("|") + ")([^a-f0-9]|$)", + "ig" + ); + + function hexConverter(match, prefix, colorValue, suffix) { + return prefix + toHex[colorValue.toLowerCase()] + suffix; + } + + function nameConverter(match, colorValue, suffix) { + return toName[colorValue.toLowerCase()] + suffix; + } + + function shortenHex(value) { + var hasHex = value.indexOf("#") > -1; + var shortened = value.replace(toHexPattern, hexConverter); + + if (shortened != value) { + shortened = shortened.replace(toHexPattern, hexConverter); + } + + return hasHex + ? shortened.replace(toNamePattern, nameConverter) + : shortened; + } + + module.exports = shortenHex; + }, + {} + ], + 12: [ + function(require, module, exports) { + // HSL to RGB converter. Both methods adapted from: + // http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript + + function hslToRgb(h, s, l) { + var r, g, b; + + // normalize hue orientation b/w 0 and 360 degrees + h = h % 360; + if (h < 0) h += 360; + h = ~~h / 360; + + if (s < 0) s = 0; + else if (s > 100) s = 100; + s = ~~s / 100; + + if (l < 0) l = 0; + else if (l > 100) l = 100; + l = ~~l / 100; + + if (s === 0) { + r = g = b = l; // achromatic + } else { + var q = l < 0.5 ? l * (1 + s) : l + s - l * s; + var p = 2 * l - q; + r = hueToRgb(p, q, h + 1 / 3); + g = hueToRgb(p, q, h); + b = hueToRgb(p, q, h - 1 / 3); + } + + return [~~(r * 255), ~~(g * 255), ~~(b * 255)]; + } + + function hueToRgb(p, q, t) { + if (t < 0) t += 1; + if (t > 1) t -= 1; + if (t < 1 / 6) return p + (q - p) * 6 * t; + if (t < 1 / 2) return q; + if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; + return p; + } + + function shortenHsl(hue, saturation, lightness) { + var asRgb = hslToRgb(hue, saturation, lightness); + var redAsHex = asRgb[0].toString(16); + var greenAsHex = asRgb[1].toString(16); + var blueAsHex = asRgb[2].toString(16); + + return ( + "#" + + ((redAsHex.length == 1 ? "0" : "") + redAsHex) + + ((greenAsHex.length == 1 ? "0" : "") + greenAsHex) + + ((blueAsHex.length == 1 ? "0" : "") + blueAsHex) + ); + } + + module.exports = shortenHsl; + }, + {} + ], + 13: [ + function(require, module, exports) { + function shortenRgb(red, green, blue) { + var normalizedRed = Math.max(0, Math.min(parseInt(red), 255)); + var normalizedGreen = Math.max(0, Math.min(parseInt(green), 255)); + var normalizedBlue = Math.max(0, Math.min(parseInt(blue), 255)); + + // Credit: Asen http://jsbin.com/UPUmaGOc/2/edit?js,console + return ( + "#" + + ( + "00000" + + ( + (normalizedRed << 16) | + (normalizedGreen << 8) | + normalizedBlue + ).toString(16) + ).slice(-6) + ); + } + + module.exports = shortenRgb; + }, + {} + ], + 14: [ + function(require, module, exports) { + var naturalCompare = require("../../utils/natural-compare"); + + function naturalSorter(scope1, scope2) { + return naturalCompare(scope1[1], scope2[1]); + } + + function standardSorter(scope1, scope2) { + return scope1[1] > scope2[1] ? 1 : -1; + } + + function sortSelectors(selectors, method) { + switch (method) { + case "natural": + return selectors.sort(naturalSorter); + case "standard": + return selectors.sort(standardSorter); + case "none": + case false: + return selectors; + } + } + + module.exports = sortSelectors; + }, + { "../../utils/natural-compare": 94 } + ], + 15: [ + function(require, module, exports) { + function tidyAtRule(value) { + return value + .replace(/\s+/g, " ") + .replace(/url\(\s+/g, "url(") + .replace(/\s+\)/g, ")") + .trim(); + } + + module.exports = tidyAtRule; + }, + {} + ], + 16: [ + function(require, module, exports) { + var SUPPORTED_COMPACT_BLOCK_MATCHER = /^@media\W/; + + function tidyBlock(values, spaceAfterClosingBrace) { + var withoutSpaceAfterClosingBrace; + var i; + + for (i = values.length - 1; i >= 0; i--) { + withoutSpaceAfterClosingBrace = + !spaceAfterClosingBrace && + SUPPORTED_COMPACT_BLOCK_MATCHER.test(values[i][1]); + + values[i][1] = values[i][1] + .replace(/\n|\r\n/g, " ") + .replace(/\s+/g, " ") + .replace(/(,|:|\() /g, "$1") + .replace(/ \)/g, ")") + .replace(/'([a-zA-Z][a-zA-Z\d\-_]+)'/, "$1") + .replace(/"([a-zA-Z][a-zA-Z\d\-_]+)"/, "$1") + .replace(withoutSpaceAfterClosingBrace ? /\) /g : null, ")"); + } + + return values; + } + + module.exports = tidyBlock; + }, + {} + ], + 17: [ + function(require, module, exports) { + var Spaces = require("../../options/format").Spaces; + var Marker = require("../../tokenizer/marker"); + var formatPosition = require("../../utils/format-position"); + + var CASE_ATTRIBUTE_PATTERN = /[\s"'][iI]\s*\]/; + var CASE_RESTORE_PATTERN = /([\d\w])([iI])\]/g; + var DOUBLE_QUOTE_CASE_PATTERN = /="([a-zA-Z][a-zA-Z\d\-_]+)"([iI])/g; + var DOUBLE_QUOTE_PATTERN = /="([a-zA-Z][a-zA-Z\d\-_]+)"(\s|\])/g; + var HTML_COMMENT_PATTERN = /^(?:(?:)\s*)+/; + var SINGLE_QUOTE_CASE_PATTERN = /='([a-zA-Z][a-zA-Z\d\-_]+)'([iI])/g; + var SINGLE_QUOTE_PATTERN = /='([a-zA-Z][a-zA-Z\d\-_]+)'(\s|\])/g; + var RELATION_PATTERN = /[>\+~]/; + var WHITESPACE_PATTERN = /\s/; + + var ASTERISK_PLUS_HTML_HACK = "*+html "; + var ASTERISK_FIRST_CHILD_PLUS_HTML_HACK = "*:first-child+html "; + var LESS_THAN = "<"; + + function hasInvalidCharacters(value) { + var isEscaped; + var isInvalid = false; + var character; + var isQuote = false; + var i, l; + + for (i = 0, l = value.length; i < l; i++) { + character = value[i]; + + if (isEscaped) { + // continue as always + } else if ( + character == Marker.SINGLE_QUOTE || + character == Marker.DOUBLE_QUOTE + ) { + isQuote = !isQuote; + } else if ( + !isQuote && + (character == Marker.CLOSE_CURLY_BRACKET || + character == Marker.EXCLAMATION || + character == LESS_THAN || + character == Marker.SEMICOLON) + ) { + isInvalid = true; + break; + } else if ( + !isQuote && + i === 0 && + RELATION_PATTERN.test(character) + ) { + isInvalid = true; + break; + } + + isEscaped = character == Marker.BACK_SLASH; + } + + return isInvalid; + } + + function removeWhitespace(value, format) { + var stripped = []; + var character; + var isNewLineNix; + var isNewLineWin; + var isEscaped; + var wasEscaped; + var isQuoted; + var isSingleQuoted; + var isDoubleQuoted; + var isAttribute; + var isRelation; + var isWhitespace; + var roundBracketLevel = 0; + var wasRelation = false; + var wasWhitespace = false; + var withCaseAttribute = CASE_ATTRIBUTE_PATTERN.test(value); + var spaceAroundRelation = + format && format.spaces[Spaces.AroundSelectorRelation]; + var i, l; + + for (i = 0, l = value.length; i < l; i++) { + character = value[i]; + + isNewLineNix = character == Marker.NEW_LINE_NIX; + isNewLineWin = + character == Marker.NEW_LINE_NIX && + value[i - 1] == Marker.CARRIAGE_RETURN; + isQuoted = isSingleQuoted || isDoubleQuoted; + isRelation = + !isAttribute && + !isEscaped && + roundBracketLevel === 0 && + RELATION_PATTERN.test(character); + isWhitespace = WHITESPACE_PATTERN.test(character); + + if (wasEscaped && isQuoted && isNewLineWin) { + // swallow escaped new windows lines in comments + stripped.pop(); + stripped.pop(); + } else if (isEscaped && isQuoted && isNewLineNix) { + // swallow escaped new *nix lines in comments + stripped.pop(); + } else if (isEscaped) { + stripped.push(character); + } else if (character == Marker.OPEN_SQUARE_BRACKET && !isQuoted) { + stripped.push(character); + isAttribute = true; + } else if (character == Marker.CLOSE_SQUARE_BRACKET && !isQuoted) { + stripped.push(character); + isAttribute = false; + } else if (character == Marker.OPEN_ROUND_BRACKET && !isQuoted) { + stripped.push(character); + roundBracketLevel++; + } else if (character == Marker.CLOSE_ROUND_BRACKET && !isQuoted) { + stripped.push(character); + roundBracketLevel--; + } else if (character == Marker.SINGLE_QUOTE && !isQuoted) { + stripped.push(character); + isSingleQuoted = true; + } else if (character == Marker.DOUBLE_QUOTE && !isQuoted) { + stripped.push(character); + isDoubleQuoted = true; + } else if (character == Marker.SINGLE_QUOTE && isQuoted) { + stripped.push(character); + isSingleQuoted = false; + } else if (character == Marker.DOUBLE_QUOTE && isQuoted) { + stripped.push(character); + isDoubleQuoted = false; + } else if (isWhitespace && wasRelation && !spaceAroundRelation) { + continue; + } else if (!isWhitespace && wasRelation && spaceAroundRelation) { + stripped.push(Marker.SPACE); + stripped.push(character); + } else if ( + isWhitespace && + (isAttribute || roundBracketLevel > 0) && + !isQuoted + ) { + // skip space + } else if (isWhitespace && wasWhitespace && !isQuoted) { + // skip extra space + } else if ( + (isNewLineWin || isNewLineNix) && + (isAttribute || roundBracketLevel > 0) && + isQuoted + ) { + // skip newline + } else if (isRelation && wasWhitespace && !spaceAroundRelation) { + stripped.pop(); + stripped.push(character); + } else if (isRelation && !wasWhitespace && spaceAroundRelation) { + stripped.push(Marker.SPACE); + stripped.push(character); + } else if (isWhitespace) { + stripped.push(Marker.SPACE); + } else { + stripped.push(character); + } + + wasEscaped = isEscaped; + isEscaped = character == Marker.BACK_SLASH; + wasRelation = isRelation; + wasWhitespace = isWhitespace; + } + + return withCaseAttribute + ? stripped.join("").replace(CASE_RESTORE_PATTERN, "$1 $2]") + : stripped.join(""); + } + + function removeQuotes(value) { + if (value.indexOf("'") == -1 && value.indexOf('"') == -1) { + return value; + } + + return value + .replace(SINGLE_QUOTE_CASE_PATTERN, "=$1 $2") + .replace(SINGLE_QUOTE_PATTERN, "=$1$2") + .replace(DOUBLE_QUOTE_CASE_PATTERN, "=$1 $2") + .replace(DOUBLE_QUOTE_PATTERN, "=$1$2"); + } + + function tidyRules( + rules, + removeUnsupported, + adjacentSpace, + format, + warnings + ) { + var list = []; + var repeated = []; + + function removeHTMLComment(rule, match) { + warnings.push( + "HTML comment '" + + match + + "' at " + + formatPosition(rule[2][0]) + + ". Removing." + ); + return ""; + } + + for (var i = 0, l = rules.length; i < l; i++) { + var rule = rules[i]; + var reduced = rule[1]; + + reduced = reduced.replace( + HTML_COMMENT_PATTERN, + removeHTMLComment.bind(null, rule) + ); + + if (hasInvalidCharacters(reduced)) { + warnings.push( + "Invalid selector '" + + rule[1] + + "' at " + + formatPosition(rule[2][0]) + + ". Ignoring." + ); + continue; + } + + reduced = removeWhitespace(reduced, format); + reduced = removeQuotes(reduced); + + if (adjacentSpace && reduced.indexOf("nav") > 0) { + reduced = reduced.replace(/\+nav(\S|$)/, "+ nav$1"); + } + + if ( + removeUnsupported && + reduced.indexOf(ASTERISK_PLUS_HTML_HACK) > -1 + ) { + continue; + } + + if ( + removeUnsupported && + reduced.indexOf(ASTERISK_FIRST_CHILD_PLUS_HTML_HACK) > -1 + ) { + continue; + } + + if (reduced.indexOf("*") > -1) { + reduced = reduced + .replace(/\*([:#\.\[])/g, "$1") + .replace(/^(\:first\-child)?\+html/, "*$1+html"); + } + + if (repeated.indexOf(reduced) > -1) { + continue; + } + + rule[1] = reduced; + repeated.push(reduced); + list.push(rule); + } + + if (list.length == 1 && list[0][1].length === 0) { + warnings.push( + "Empty selector '" + + list[0][1] + + "' at " + + formatPosition(list[0][2][0]) + + ". Ignoring." + ); + list = []; + } + + return list; + } + + module.exports = tidyRules; + }, + { + "../../options/format": 61, + "../../tokenizer/marker": 83, + "../../utils/format-position": 87 + } + ], + 18: [ + function(require, module, exports) { + var InvalidPropertyError = require("./invalid-property-error"); + + var wrapSingle = require("../wrap-for-optimizing").single; + + var Token = require("../../tokenizer/token"); + var Marker = require("../../tokenizer/marker"); + + var formatPosition = require("../../utils/format-position"); + + function _anyIsInherit(values) { + var i, l; + + for (i = 0, l = values.length; i < l; i++) { + if (values[i][1] == "inherit") { + return true; + } + } + + return false; + } + + function _colorFilter(validator) { + return function(value) { + return ( + value[1] == "invert" || + validator.isColor(value[1]) || + validator.isPrefixed(value[1]) + ); + }; + } + + function _styleFilter(validator) { + return function(value) { + return ( + value[1] != "inherit" && + validator.isStyleKeyword(value[1]) && + !validator.isColorFunction(value[1]) + ); + }; + } + + function _wrapDefault(name, property, compactable) { + var descriptor = compactable[name]; + if (descriptor.doubleValues && descriptor.defaultValue.length == 2) { + return wrapSingle([ + Token.PROPERTY, + [Token.PROPERTY_NAME, name], + [Token.PROPERTY_VALUE, descriptor.defaultValue[0]], + [Token.PROPERTY_VALUE, descriptor.defaultValue[1]] + ]); + } else if ( + descriptor.doubleValues && + descriptor.defaultValue.length == 1 + ) { + return wrapSingle([ + Token.PROPERTY, + [Token.PROPERTY_NAME, name], + [Token.PROPERTY_VALUE, descriptor.defaultValue[0]] + ]); + } else { + return wrapSingle([ + Token.PROPERTY, + [Token.PROPERTY_NAME, name], + [Token.PROPERTY_VALUE, descriptor.defaultValue] + ]); + } + } + + function _widthFilter(validator) { + return function(value) { + return ( + value[1] != "inherit" && + (validator.isWidth(value[1]) || + (validator.isUnit(value[1]) && + !validator.isDynamicUnit(value[1]))) && + !validator.isStyleKeyword(value[1]) && + !validator.isColorFunction(value[1]) + ); + }; + } + + function animation(property, compactable, validator) { + var duration = _wrapDefault( + property.name + "-duration", + property, + compactable + ); + var timing = _wrapDefault( + property.name + "-timing-function", + property, + compactable + ); + var delay = _wrapDefault( + property.name + "-delay", + property, + compactable + ); + var iteration = _wrapDefault( + property.name + "-iteration-count", + property, + compactable + ); + var direction = _wrapDefault( + property.name + "-direction", + property, + compactable + ); + var fill = _wrapDefault( + property.name + "-fill-mode", + property, + compactable + ); + var play = _wrapDefault( + property.name + "-play-state", + property, + compactable + ); + var name = _wrapDefault( + property.name + "-name", + property, + compactable + ); + var components = [ + duration, + timing, + delay, + iteration, + direction, + fill, + play, + name + ]; + var values = property.value; + var value; + var durationSet = false; + var timingSet = false; + var delaySet = false; + var iterationSet = false; + var directionSet = false; + var fillSet = false; + var playSet = false; + var nameSet = false; + var i; + var l; + + if (property.value.length == 1 && property.value[0][1] == "inherit") { + duration.value = timing.value = delay.value = iteration.value = direction.value = fill.value = play.value = name.value = + property.value; + return components; + } + + if (values.length > 1 && _anyIsInherit(values)) { + throw new InvalidPropertyError( + "Invalid animation values at " + + formatPosition(values[0][2][0]) + + ". Ignoring." + ); + } + + for (i = 0, l = values.length; i < l; i++) { + value = values[i]; + + if (validator.isTime(value[1]) && !durationSet) { + duration.value = [value]; + durationSet = true; + } else if (validator.isTime(value[1]) && !delaySet) { + delay.value = [value]; + delaySet = true; + } else if ( + (validator.isGlobal(value[1]) || + validator.isTimingFunction(value[1])) && + !timingSet + ) { + timing.value = [value]; + timingSet = true; + } else if ( + (validator.isAnimationIterationCountKeyword(value[1]) || + validator.isPositiveNumber(value[1])) && + !iterationSet + ) { + iteration.value = [value]; + iterationSet = true; + } else if ( + validator.isAnimationDirectionKeyword(value[1]) && + !directionSet + ) { + direction.value = [value]; + directionSet = true; + } else if ( + validator.isAnimationFillModeKeyword(value[1]) && + !fillSet + ) { + fill.value = [value]; + fillSet = true; + } else if ( + validator.isAnimationPlayStateKeyword(value[1]) && + !playSet + ) { + play.value = [value]; + playSet = true; + } else if ( + (validator.isAnimationNameKeyword(value[1]) || + validator.isIdentifier(value[1])) && + !nameSet + ) { + name.value = [value]; + nameSet = true; + } else { + throw new InvalidPropertyError( + "Invalid animation value at " + + formatPosition(value[2][0]) + + ". Ignoring." + ); + } + } + + return components; + } + + function background(property, compactable, validator) { + var image = _wrapDefault("background-image", property, compactable); + var position = _wrapDefault( + "background-position", + property, + compactable + ); + var size = _wrapDefault("background-size", property, compactable); + var repeat = _wrapDefault("background-repeat", property, compactable); + var attachment = _wrapDefault( + "background-attachment", + property, + compactable + ); + var origin = _wrapDefault("background-origin", property, compactable); + var clip = _wrapDefault("background-clip", property, compactable); + var color = _wrapDefault("background-color", property, compactable); + var components = [ + image, + position, + size, + repeat, + attachment, + origin, + clip, + color + ]; + var values = property.value; + + var positionSet = false; + var clipSet = false; + var originSet = false; + var repeatSet = false; + + var anyValueSet = false; + + if (property.value.length == 1 && property.value[0][1] == "inherit") { + // NOTE: 'inherit' is not a valid value for background-attachment + color.value = image.value = repeat.value = position.value = size.value = origin.value = clip.value = + property.value; + return components; + } + + if (property.value.length == 1 && property.value[0][1] == "0 0") { + return components; + } + + for (var i = values.length - 1; i >= 0; i--) { + var value = values[i]; + + if (validator.isBackgroundAttachmentKeyword(value[1])) { + attachment.value = [value]; + anyValueSet = true; + } else if ( + validator.isBackgroundClipKeyword(value[1]) || + validator.isBackgroundOriginKeyword(value[1]) + ) { + if (clipSet) { + origin.value = [value]; + originSet = true; + } else { + clip.value = [value]; + clipSet = true; + } + anyValueSet = true; + } else if (validator.isBackgroundRepeatKeyword(value[1])) { + if (repeatSet) { + repeat.value.unshift(value); + } else { + repeat.value = [value]; + repeatSet = true; + } + anyValueSet = true; + } else if ( + validator.isBackgroundPositionKeyword(value[1]) || + validator.isBackgroundSizeKeyword(value[1]) || + validator.isUnit(value[1]) || + validator.isDynamicUnit(value[1]) + ) { + if (i > 0) { + var previousValue = values[i - 1]; + + if (previousValue[1] == Marker.FORWARD_SLASH) { + size.value = [value]; + } else if (i > 1 && values[i - 2][1] == Marker.FORWARD_SLASH) { + size.value = [previousValue, value]; + i -= 2; + } else { + if (!positionSet) position.value = []; + + position.value.unshift(value); + positionSet = true; + } + } else { + if (!positionSet) position.value = []; + + position.value.unshift(value); + positionSet = true; + } + anyValueSet = true; + } else if ( + (color.value[0][1] == compactable[color.name].defaultValue || + color.value[0][1] == "none") && + (validator.isColor(value[1]) || validator.isPrefixed(value[1])) + ) { + color.value = [value]; + anyValueSet = true; + } else if ( + validator.isUrl(value[1]) || + validator.isFunction(value[1]) + ) { + image.value = [value]; + anyValueSet = true; + } + } + + if (clipSet && !originSet) origin.value = clip.value.slice(0); + + if (!anyValueSet) { + throw new InvalidPropertyError( + "Invalid background value at " + + formatPosition(values[0][2][0]) + + ". Ignoring." + ); + } + + return components; + } + + function borderRadius(property, compactable) { + var values = property.value; + var splitAt = -1; + + for (var i = 0, l = values.length; i < l; i++) { + if (values[i][1] == Marker.FORWARD_SLASH) { + splitAt = i; + break; + } + } + + if (splitAt === 0 || splitAt === values.length - 1) { + throw new InvalidPropertyError( + "Invalid border-radius value at " + + formatPosition(values[0][2][0]) + + ". Ignoring." + ); + } + + var target = _wrapDefault(property.name, property, compactable); + target.value = + splitAt > -1 ? values.slice(0, splitAt) : values.slice(0); + target.components = fourValues(target, compactable); + + var remainder = _wrapDefault(property.name, property, compactable); + remainder.value = + splitAt > -1 ? values.slice(splitAt + 1) : values.slice(0); + remainder.components = fourValues(remainder, compactable); + + for (var j = 0; j < 4; j++) { + target.components[j].multiplex = true; + target.components[j].value = target.components[j].value.concat( + remainder.components[j].value + ); + } + + return target.components; + } + + function font(property, compactable, validator) { + var style = _wrapDefault("font-style", property, compactable); + var variant = _wrapDefault("font-variant", property, compactable); + var weight = _wrapDefault("font-weight", property, compactable); + var stretch = _wrapDefault("font-stretch", property, compactable); + var size = _wrapDefault("font-size", property, compactable); + var height = _wrapDefault("line-height", property, compactable); + var family = _wrapDefault("font-family", property, compactable); + var components = [ + style, + variant, + weight, + stretch, + size, + height, + family + ]; + var values = property.value; + var fuzzyMatched = 4; // style, variant, weight, and stretch + var index = 0; + var isStretchSet = false; + var isStretchValid; + var isStyleSet = false; + var isStyleValid; + var isVariantSet = false; + var isVariantValid; + var isWeightSet = false; + var isWeightValid; + var isSizeSet = false; + var appendableFamilyName = false; + + if (!values[index]) { + throw new InvalidPropertyError( + "Missing font values at " + + formatPosition(property.all[property.position][1][2][0]) + + ". Ignoring." + ); + } + + if (values.length == 1 && values[0][1] == "inherit") { + style.value = variant.value = weight.value = stretch.value = size.value = height.value = family.value = values; + return components; + } + + if ( + values.length == 1 && + (validator.isFontKeyword(values[0][1]) || + validator.isGlobal(values[0][1]) || + validator.isPrefixed(values[0][1])) + ) { + values[0][1] = Marker.INTERNAL + values[0][1]; + style.value = variant.value = weight.value = stretch.value = size.value = height.value = family.value = values; + return components; + } + + if ( + values.length < 2 || + !_anyIsFontSize(values, validator) || + !_anyIsFontFamily(values, validator) + ) { + throw new InvalidPropertyError( + "Invalid font values at " + + formatPosition(property.all[property.position][1][2][0]) + + ". Ignoring." + ); + } + + if (values.length > 1 && _anyIsInherit(values)) { + throw new InvalidPropertyError( + "Invalid font values at " + + formatPosition(values[0][2][0]) + + ". Ignoring." + ); + } + + // fuzzy match style, variant, weight, and stretch on first elements + while (index < fuzzyMatched) { + isStretchValid = + validator.isFontStretchKeyword(values[index][1]) || + validator.isGlobal(values[index][1]); + isStyleValid = + validator.isFontStyleKeyword(values[index][1]) || + validator.isGlobal(values[index][1]); + isVariantValid = + validator.isFontVariantKeyword(values[index][1]) || + validator.isGlobal(values[index][1]); + isWeightValid = + validator.isFontWeightKeyword(values[index][1]) || + validator.isGlobal(values[index][1]); + + if (isStyleValid && !isStyleSet) { + style.value = [values[index]]; + isStyleSet = true; + } else if (isVariantValid && !isVariantSet) { + variant.value = [values[index]]; + isVariantSet = true; + } else if (isWeightValid && !isWeightSet) { + weight.value = [values[index]]; + isWeightSet = true; + } else if (isStretchValid && !isStretchSet) { + stretch.value = [values[index]]; + isStretchSet = true; + } else if ( + (isStyleValid && isStyleSet) || + (isVariantValid && isVariantSet) || + (isWeightValid && isWeightSet) || + (isStretchValid && isStretchSet) + ) { + throw new InvalidPropertyError( + "Invalid font style / variant / weight / stretch value at " + + formatPosition(values[0][2][0]) + + ". Ignoring." + ); + } else { + break; + } + + index++; + } + + // now comes font-size ... + if ( + validator.isFontSizeKeyword(values[index][1]) || + (validator.isUnit(values[index][1]) && + !validator.isDynamicUnit(values[index][1])) + ) { + size.value = [values[index]]; + isSizeSet = true; + index++; + } else { + throw new InvalidPropertyError( + "Missing font size at " + + formatPosition(values[0][2][0]) + + ". Ignoring." + ); + } + + if (!values[index]) { + throw new InvalidPropertyError( + "Missing font family at " + + formatPosition(values[0][2][0]) + + ". Ignoring." + ); + } + + // ... and perhaps line-height + if ( + isSizeSet && + values[index] && + values[index][1] == Marker.FORWARD_SLASH && + values[index + 1] && + (validator.isLineHeightKeyword(values[index + 1][1]) || + validator.isUnit(values[index + 1][1]) || + validator.isNumber(values[index + 1][1])) + ) { + height.value = [values[index + 1]]; + index++; + index++; + } + + // ... and whatever comes next is font-family + family.value = []; + + while (values[index]) { + if (values[index][1] == Marker.COMMA) { + appendableFamilyName = false; + } else { + if (appendableFamilyName) { + family.value[family.value.length - 1][1] += + Marker.SPACE + values[index][1]; + } else { + family.value.push(values[index]); + } + + appendableFamilyName = true; + } + + index++; + } + + if (family.value.length === 0) { + throw new InvalidPropertyError( + "Missing font family at " + + formatPosition(values[0][2][0]) + + ". Ignoring." + ); + } + + return components; + } + + function _anyIsFontSize(values, validator) { + var value; + var i, l; + + for (i = 0, l = values.length; i < l; i++) { + value = values[i]; + + if ( + validator.isFontSizeKeyword(value[1]) || + (validator.isUnit(value[1]) && + !validator.isDynamicUnit(value[1])) || + validator.isFunction(value[1]) + ) { + return true; + } + } + + return false; + } + + function _anyIsFontFamily(values, validator) { + var value; + var i, l; + + for (i = 0, l = values.length; i < l; i++) { + value = values[i]; + + if (validator.isIdentifier(value[1])) { + return true; + } + } + + return false; + } + + function fourValues(property, compactable) { + var componentNames = compactable[property.name].components; + var components = []; + var value = property.value; + + if (value.length < 1) return []; + + if (value.length < 2) value[1] = value[0].slice(0); + if (value.length < 3) value[2] = value[0].slice(0); + if (value.length < 4) value[3] = value[1].slice(0); + + for (var i = componentNames.length - 1; i >= 0; i--) { + var component = wrapSingle([ + Token.PROPERTY, + [Token.PROPERTY_NAME, componentNames[i]] + ]); + component.value = [value[i]]; + components.unshift(component); + } + + return components; + } + + function multiplex(splitWith) { + return function(property, compactable, validator) { + var splitsAt = []; + var values = property.value; + var i, j, l, m; + + // find split commas + for (i = 0, l = values.length; i < l; i++) { + if (values[i][1] == ",") splitsAt.push(i); + } + + if (splitsAt.length === 0) + return splitWith(property, compactable, validator); + + var splitComponents = []; + + // split over commas, and into components + for (i = 0, l = splitsAt.length; i <= l; i++) { + var from = i === 0 ? 0 : splitsAt[i - 1] + 1; + var to = i < l ? splitsAt[i] : values.length; + + var _property = _wrapDefault( + property.name, + property, + compactable + ); + _property.value = values.slice(from, to); + + splitComponents.push( + splitWith(_property, compactable, validator) + ); + } + + var components = splitComponents[0]; + + // group component values from each split + for (i = 0, l = components.length; i < l; i++) { + components[i].multiplex = true; + + for (j = 1, m = splitComponents.length; j < m; j++) { + components[i].value.push([Token.PROPERTY_VALUE, Marker.COMMA]); + Array.prototype.push.apply( + components[i].value, + splitComponents[j][i].value + ); + } + } + + return components; + }; + } + + function listStyle(property, compactable, validator) { + var type = _wrapDefault("list-style-type", property, compactable); + var position = _wrapDefault( + "list-style-position", + property, + compactable + ); + var image = _wrapDefault("list-style-image", property, compactable); + var components = [type, position, image]; + + if (property.value.length == 1 && property.value[0][1] == "inherit") { + type.value = position.value = image.value = [property.value[0]]; + return components; + } + + var values = property.value.slice(0); + var total = values.length; + var index = 0; + + // `image` first... + for (index = 0, total = values.length; index < total; index++) { + if (validator.isUrl(values[index][1]) || values[index][1] == "0") { + image.value = [values[index]]; + values.splice(index, 1); + break; + } + } + + // ... then `position` + for (index = 0, total = values.length; index < total; index++) { + if (validator.isListStylePositionKeyword(values[index][1])) { + position.value = [values[index]]; + values.splice(index, 1); + break; + } + } + + // ... and what's left is a `type` + if ( + values.length > 0 && + (validator.isListStyleTypeKeyword(values[0][1]) || + validator.isIdentifier(values[0][1])) + ) { + type.value = [values[0]]; + } + + return components; + } + + function transition(property, compactable, validator) { + var prop = _wrapDefault( + property.name + "-property", + property, + compactable + ); + var duration = _wrapDefault( + property.name + "-duration", + property, + compactable + ); + var timing = _wrapDefault( + property.name + "-timing-function", + property, + compactable + ); + var delay = _wrapDefault( + property.name + "-delay", + property, + compactable + ); + var components = [prop, duration, timing, delay]; + var values = property.value; + var value; + var durationSet = false; + var delaySet = false; + var propSet = false; + var timingSet = false; + var i; + var l; + + if (property.value.length == 1 && property.value[0][1] == "inherit") { + prop.value = duration.value = timing.value = delay.value = + property.value; + return components; + } + + if (values.length > 1 && _anyIsInherit(values)) { + throw new InvalidPropertyError( + "Invalid animation values at " + + formatPosition(values[0][2][0]) + + ". Ignoring." + ); + } + + for (i = 0, l = values.length; i < l; i++) { + value = values[i]; + + if (validator.isTime(value[1]) && !durationSet) { + duration.value = [value]; + durationSet = true; + } else if (validator.isTime(value[1]) && !delaySet) { + delay.value = [value]; + delaySet = true; + } else if ( + (validator.isGlobal(value[1]) || + validator.isTimingFunction(value[1])) && + !timingSet + ) { + timing.value = [value]; + timingSet = true; + } else if (validator.isIdentifier(value[1]) && !propSet) { + prop.value = [value]; + propSet = true; + } else { + throw new InvalidPropertyError( + "Invalid animation value at " + + formatPosition(value[2][0]) + + ". Ignoring." + ); + } + } + + return components; + } + + function widthStyleColor(property, compactable, validator) { + var descriptor = compactable[property.name]; + var components = [ + _wrapDefault(descriptor.components[0], property, compactable), + _wrapDefault(descriptor.components[1], property, compactable), + _wrapDefault(descriptor.components[2], property, compactable) + ]; + var color, style, width; + + for (var i = 0; i < 3; i++) { + var component = components[i]; + + if (component.name.indexOf("color") > 0) color = component; + else if (component.name.indexOf("style") > 0) style = component; + else width = component; + } + + if ( + (property.value.length == 1 && property.value[0][1] == "inherit") || + (property.value.length == 3 && + property.value[0][1] == "inherit" && + property.value[1][1] == "inherit" && + property.value[2][1] == "inherit") + ) { + color.value = style.value = width.value = [property.value[0]]; + return components; + } + + var values = property.value.slice(0); + var match, matches; + + // NOTE: usually users don't follow the required order of parts in this shorthand, + // so we'll try to parse it caring as little about order as possible + + if (values.length > 0) { + matches = values.filter(_widthFilter(validator)); + match = + matches.length > 1 && + (matches[0][1] == "none" || matches[0][1] == "auto") + ? matches[1] + : matches[0]; + if (match) { + width.value = [match]; + values.splice(values.indexOf(match), 1); + } + } + + if (values.length > 0) { + match = values.filter(_styleFilter(validator))[0]; + if (match) { + style.value = [match]; + values.splice(values.indexOf(match), 1); + } + } + + if (values.length > 0) { + match = values.filter(_colorFilter(validator))[0]; + if (match) { + color.value = [match]; + values.splice(values.indexOf(match), 1); + } + } + + return components; + } + + module.exports = { + animation: animation, + background: background, + border: widthStyleColor, + borderRadius: borderRadius, + font: font, + fourValues: fourValues, + listStyle: listStyle, + multiplex: multiplex, + outline: widthStyleColor, + transition: transition + }; + }, + { + "../../tokenizer/marker": 83, + "../../tokenizer/token": 84, + "../../utils/format-position": 87, + "../wrap-for-optimizing": 58, + "./invalid-property-error": 23 + } + ], + 19: [ + function(require, module, exports) { + var understandable = require("./properties/understandable"); + + function animationIterationCount(validator, value1, value2) { + if ( + !understandable(validator, value1, value2, 0, true) && + !( + validator.isAnimationIterationCountKeyword(value2) || + validator.isPositiveNumber(value2) + ) + ) { + return false; + } else if ( + validator.isVariable(value1) && + validator.isVariable(value2) + ) { + return true; + } + + return ( + validator.isAnimationIterationCountKeyword(value2) || + validator.isPositiveNumber(value2) + ); + } + + function animationName(validator, value1, value2) { + if ( + !understandable(validator, value1, value2, 0, true) && + !( + validator.isAnimationNameKeyword(value2) || + validator.isIdentifier(value2) + ) + ) { + return false; + } else if ( + validator.isVariable(value1) && + validator.isVariable(value2) + ) { + return true; + } + + return ( + validator.isAnimationNameKeyword(value2) || + validator.isIdentifier(value2) + ); + } + + function areSameFunction(validator, value1, value2) { + if (!validator.isFunction(value1) || !validator.isFunction(value2)) { + return false; + } + + var function1Name = value1.substring(0, value1.indexOf("(")); + var function2Name = value2.substring(0, value2.indexOf("(")); + + return function1Name === function2Name; + } + + function backgroundPosition(validator, value1, value2) { + if ( + !understandable(validator, value1, value2, 0, true) && + !( + validator.isBackgroundPositionKeyword(value2) || + validator.isGlobal(value2) + ) + ) { + return false; + } else if ( + validator.isVariable(value1) && + validator.isVariable(value2) + ) { + return true; + } else if ( + validator.isBackgroundPositionKeyword(value2) || + validator.isGlobal(value2) + ) { + return true; + } + + return unit(validator, value1, value2); + } + + function backgroundSize(validator, value1, value2) { + if ( + !understandable(validator, value1, value2, 0, true) && + !( + validator.isBackgroundSizeKeyword(value2) || + validator.isGlobal(value2) + ) + ) { + return false; + } else if ( + validator.isVariable(value1) && + validator.isVariable(value2) + ) { + return true; + } else if ( + validator.isBackgroundSizeKeyword(value2) || + validator.isGlobal(value2) + ) { + return true; + } + + return unit(validator, value1, value2); + } + + function color(validator, value1, value2) { + if ( + !understandable(validator, value1, value2, 0, true) && + !validator.isColor(value2) + ) { + return false; + } else if ( + validator.isVariable(value1) && + validator.isVariable(value2) + ) { + return true; + } else if ( + !validator.colorOpacity && + (validator.isRgbColor(value1) || validator.isHslColor(value1)) + ) { + return false; + } else if ( + !validator.colorOpacity && + (validator.isRgbColor(value2) || validator.isHslColor(value2)) + ) { + return false; + } else if (validator.isColor(value1) && validator.isColor(value2)) { + return true; + } + + return sameFunctionOrValue(validator, value1, value2); + } + + function components(overrideCheckers) { + return function(validator, value1, value2, position) { + return overrideCheckers[position](validator, value1, value2); + }; + } + + function fontFamily(validator, value1, value2) { + return understandable(validator, value1, value2, 0, true); + } + + function image(validator, value1, value2) { + if ( + !understandable(validator, value1, value2, 0, true) && + !validator.isImage(value2) + ) { + return false; + } else if ( + validator.isVariable(value1) && + validator.isVariable(value2) + ) { + return true; + } else if (validator.isImage(value2)) { + return true; + } else if (validator.isImage(value1)) { + return false; + } + + return sameFunctionOrValue(validator, value1, value2); + } + + function keyword(propertyName) { + return function(validator, value1, value2) { + if ( + !understandable(validator, value1, value2, 0, true) && + !validator.isKeyword(propertyName)(value2) + ) { + return false; + } else if ( + validator.isVariable(value1) && + validator.isVariable(value2) + ) { + return true; + } + + return validator.isKeyword(propertyName)(value2); + }; + } + + function keywordWithGlobal(propertyName) { + return function(validator, value1, value2) { + if ( + !understandable(validator, value1, value2, 0, true) && + !( + validator.isKeyword(propertyName)(value2) || + validator.isGlobal(value2) + ) + ) { + return false; + } else if ( + validator.isVariable(value1) && + validator.isVariable(value2) + ) { + return true; + } + + return ( + validator.isKeyword(propertyName)(value2) || + validator.isGlobal(value2) + ); + }; + } + + function propertyName(validator, value1, value2) { + if ( + !understandable(validator, value1, value2, 0, true) && + !validator.isIdentifier(value2) + ) { + return false; + } else if ( + validator.isVariable(value1) && + validator.isVariable(value2) + ) { + return true; + } + + return validator.isIdentifier(value2); + } + + function sameFunctionOrValue(validator, value1, value2) { + return areSameFunction(validator, value1, value2) + ? true + : value1 === value2; + } + + function textShadow(validator, value1, value2) { + if ( + !understandable(validator, value1, value2, 0, true) && + !( + validator.isUnit(value2) || + validator.isColor(value2) || + validator.isGlobal(value2) + ) + ) { + return false; + } else if ( + validator.isVariable(value1) && + validator.isVariable(value2) + ) { + return true; + } + + return ( + validator.isUnit(value2) || + validator.isColor(value2) || + validator.isGlobal(value2) + ); + } + + function time(validator, value1, value2) { + if ( + !understandable(validator, value1, value2, 0, true) && + !validator.isTime(value2) + ) { + return false; + } else if ( + validator.isVariable(value1) && + validator.isVariable(value2) + ) { + return true; + } else if (validator.isTime(value1) && !validator.isTime(value2)) { + return false; + } else if (validator.isTime(value2)) { + return true; + } else if (validator.isTime(value1)) { + return false; + } else if ( + validator.isFunction(value1) && + !validator.isPrefixed(value1) && + validator.isFunction(value2) && + !validator.isPrefixed(value2) + ) { + return true; + } + + return sameFunctionOrValue(validator, value1, value2); + } + + function timingFunction(validator, value1, value2) { + if ( + !understandable(validator, value1, value2, 0, true) && + !(validator.isTimingFunction(value2) || validator.isGlobal(value2)) + ) { + return false; + } else if ( + validator.isVariable(value1) && + validator.isVariable(value2) + ) { + return true; + } + + return ( + validator.isTimingFunction(value2) || validator.isGlobal(value2) + ); + } + + function unit(validator, value1, value2) { + if ( + !understandable(validator, value1, value2, 0, true) && + !validator.isUnit(value2) + ) { + return false; + } else if ( + validator.isVariable(value1) && + validator.isVariable(value2) + ) { + return true; + } else if (validator.isUnit(value1) && !validator.isUnit(value2)) { + return false; + } else if (validator.isUnit(value2)) { + return true; + } else if (validator.isUnit(value1)) { + return false; + } else if ( + validator.isFunction(value1) && + !validator.isPrefixed(value1) && + validator.isFunction(value2) && + !validator.isPrefixed(value2) + ) { + return true; + } + + return sameFunctionOrValue(validator, value1, value2); + } + + function unitOrKeywordWithGlobal(propertyName) { + var byKeyword = keywordWithGlobal(propertyName); + + return function(validator, value1, value2) { + return ( + unit(validator, value1, value2) || + byKeyword(validator, value1, value2) + ); + }; + } + + function unitOrNumber(validator, value1, value2) { + if ( + !understandable(validator, value1, value2, 0, true) && + !(validator.isUnit(value2) || validator.isNumber(value2)) + ) { + return false; + } else if ( + validator.isVariable(value1) && + validator.isVariable(value2) + ) { + return true; + } else if ( + (validator.isUnit(value1) || validator.isNumber(value1)) && + !(validator.isUnit(value2) || validator.isNumber(value2)) + ) { + return false; + } else if (validator.isUnit(value2) || validator.isNumber(value2)) { + return true; + } else if (validator.isUnit(value1) || validator.isNumber(value1)) { + return false; + } else if ( + validator.isFunction(value1) && + !validator.isPrefixed(value1) && + validator.isFunction(value2) && + !validator.isPrefixed(value2) + ) { + return true; + } + + return sameFunctionOrValue(validator, value1, value2); + } + + function zIndex(validator, value1, value2) { + if ( + !understandable(validator, value1, value2, 0, true) && + !validator.isZIndex(value2) + ) { + return false; + } else if ( + validator.isVariable(value1) && + validator.isVariable(value2) + ) { + return true; + } + + return validator.isZIndex(value2); + } + + module.exports = { + generic: { + color: color, + components: components, + image: image, + propertyName: propertyName, + time: time, + timingFunction: timingFunction, + unit: unit, + unitOrNumber: unitOrNumber + }, + property: { + animationDirection: keywordWithGlobal("animation-direction"), + animationFillMode: keyword("animation-fill-mode"), + animationIterationCount: animationIterationCount, + animationName: animationName, + animationPlayState: keywordWithGlobal("animation-play-state"), + backgroundAttachment: keyword("background-attachment"), + backgroundClip: keywordWithGlobal("background-clip"), + backgroundOrigin: keyword("background-origin"), + backgroundPosition: backgroundPosition, + backgroundRepeat: keyword("background-repeat"), + backgroundSize: backgroundSize, + bottom: unitOrKeywordWithGlobal("bottom"), + borderCollapse: keyword("border-collapse"), + borderStyle: keywordWithGlobal("*-style"), + clear: keywordWithGlobal("clear"), + cursor: keywordWithGlobal("cursor"), + display: keywordWithGlobal("display"), + float: keywordWithGlobal("float"), + left: unitOrKeywordWithGlobal("left"), + fontFamily: fontFamily, + fontStretch: keywordWithGlobal("font-stretch"), + fontStyle: keywordWithGlobal("font-style"), + fontVariant: keywordWithGlobal("font-variant"), + fontWeight: keywordWithGlobal("font-weight"), + listStyleType: keywordWithGlobal("list-style-type"), + listStylePosition: keywordWithGlobal("list-style-position"), + outlineStyle: keywordWithGlobal("*-style"), + overflow: keywordWithGlobal("overflow"), + position: keywordWithGlobal("position"), + right: unitOrKeywordWithGlobal("right"), + textAlign: keywordWithGlobal("text-align"), + textDecoration: keywordWithGlobal("text-decoration"), + textOverflow: keywordWithGlobal("text-overflow"), + textShadow: textShadow, + top: unitOrKeywordWithGlobal("top"), + transform: sameFunctionOrValue, + verticalAlign: unitOrKeywordWithGlobal("vertical-align"), + visibility: keywordWithGlobal("visibility"), + whiteSpace: keywordWithGlobal("white-space"), + zIndex: zIndex + } + }; + }, + { "./properties/understandable": 40 } + ], + 20: [ + function(require, module, exports) { + var wrapSingle = require("../wrap-for-optimizing").single; + + var Token = require("../../tokenizer/token"); + + function deep(property) { + var cloned = shallow(property); + for (var i = property.components.length - 1; i >= 0; i--) { + var component = shallow(property.components[i]); + component.value = property.components[i].value.slice(0); + cloned.components.unshift(component); + } + + cloned.dirty = true; + cloned.value = property.value.slice(0); + + return cloned; + } + + function shallow(property) { + var cloned = wrapSingle([ + Token.PROPERTY, + [Token.PROPERTY_NAME, property.name] + ]); + cloned.important = property.important; + cloned.hack = property.hack; + cloned.unused = false; + return cloned; + } + + module.exports = { + deep: deep, + shallow: shallow + }; + }, + { "../../tokenizer/token": 84, "../wrap-for-optimizing": 58 } + ], + 21: [ + function(require, module, exports) { + // Contains the interpretation of CSS properties, as used by the property optimizer + + var breakUp = require("./break-up"); + var canOverride = require("./can-override"); + var restore = require("./restore"); + + var override = require("../../utils/override"); + + // Properties to process + // Extend this object in order to add support for more properties in the optimizer. + // + // Each key in this object represents a CSS property and should be an object. + // Such an object contains properties that describe how the represented CSS property should be handled. + // Possible options: + // + // * components: array (Only specify for shorthand properties.) + // Contains the names of the granular properties this shorthand compacts. + // + // * canOverride: function + // Returns whether two tokens of this property can be merged with each other. + // This property has no meaning for shorthands. + // + // * defaultValue: string + // Specifies the default value of the property according to the CSS standard. + // For shorthand, this is used when every component is set to its default value, therefore it should be the shortest possible default value of all the components. + // + // * shortestValue: string + // Specifies the shortest possible value the property can possibly have. + // (Falls back to defaultValue if unspecified.) + // + // * breakUp: function (Only specify for shorthand properties.) + // Breaks the shorthand up to its components. + // + // * restore: function (Only specify for shorthand properties.) + // Puts the shorthand together from its components. + // + var compactable = { + animation: { + canOverride: canOverride.generic.components([ + canOverride.generic.time, + canOverride.generic.timingFunction, + canOverride.generic.time, + canOverride.property.animationIterationCount, + canOverride.property.animationDirection, + canOverride.property.animationFillMode, + canOverride.property.animationPlayState, + canOverride.property.animationName + ]), + components: [ + "animation-duration", + "animation-timing-function", + "animation-delay", + "animation-iteration-count", + "animation-direction", + "animation-fill-mode", + "animation-play-state", + "animation-name" + ], + breakUp: breakUp.multiplex(breakUp.animation), + defaultValue: "none", + restore: restore.multiplex(restore.withoutDefaults), + shorthand: true, + vendorPrefixes: ["-moz-", "-o-", "-webkit-"] + }, + "animation-delay": { + canOverride: canOverride.generic.time, + componentOf: ["animation"], + defaultValue: "0s", + intoMultiplexMode: "real", + vendorPrefixes: ["-moz-", "-o-", "-webkit-"] + }, + "animation-direction": { + canOverride: canOverride.property.animationDirection, + componentOf: ["animation"], + defaultValue: "normal", + intoMultiplexMode: "real", + vendorPrefixes: ["-moz-", "-o-", "-webkit-"] + }, + "animation-duration": { + canOverride: canOverride.generic.time, + componentOf: ["animation"], + defaultValue: "0s", + intoMultiplexMode: "real", + keepUnlessDefault: "animation-delay", + vendorPrefixes: ["-moz-", "-o-", "-webkit-"] + }, + "animation-fill-mode": { + canOverride: canOverride.property.animationFillMode, + componentOf: ["animation"], + defaultValue: "none", + intoMultiplexMode: "real", + vendorPrefixes: ["-moz-", "-o-", "-webkit-"] + }, + "animation-iteration-count": { + canOverride: canOverride.property.animationIterationCount, + componentOf: ["animation"], + defaultValue: "1", + intoMultiplexMode: "real", + vendorPrefixes: ["-moz-", "-o-", "-webkit-"] + }, + "animation-name": { + canOverride: canOverride.property.animationName, + componentOf: ["animation"], + defaultValue: "none", + intoMultiplexMode: "real", + vendorPrefixes: ["-moz-", "-o-", "-webkit-"] + }, + "animation-play-state": { + canOverride: canOverride.property.animationPlayState, + componentOf: ["animation"], + defaultValue: "running", + intoMultiplexMode: "real", + vendorPrefixes: ["-moz-", "-o-", "-webkit-"] + }, + "animation-timing-function": { + canOverride: canOverride.generic.timingFunction, + componentOf: ["animation"], + defaultValue: "ease", + intoMultiplexMode: "real", + vendorPrefixes: ["-moz-", "-o-", "-webkit-"] + }, + background: { + canOverride: canOverride.generic.components([ + canOverride.generic.image, + canOverride.property.backgroundPosition, + canOverride.property.backgroundSize, + canOverride.property.backgroundRepeat, + canOverride.property.backgroundAttachment, + canOverride.property.backgroundOrigin, + canOverride.property.backgroundClip, + canOverride.generic.color + ]), + components: [ + "background-image", + "background-position", + "background-size", + "background-repeat", + "background-attachment", + "background-origin", + "background-clip", + "background-color" + ], + breakUp: breakUp.multiplex(breakUp.background), + defaultValue: "0 0", + restore: restore.multiplex(restore.background), + shortestValue: "0", + shorthand: true + }, + "background-attachment": { + canOverride: canOverride.property.backgroundAttachment, + componentOf: ["background"], + defaultValue: "scroll", + intoMultiplexMode: "real" + }, + "background-clip": { + canOverride: canOverride.property.backgroundClip, + componentOf: ["background"], + defaultValue: "border-box", + intoMultiplexMode: "real", + shortestValue: "border-box" + }, + "background-color": { + canOverride: canOverride.generic.color, + componentOf: ["background"], + defaultValue: "transparent", + intoMultiplexMode: "real", // otherwise real color will turn into default since color appears in last multiplex only + multiplexLastOnly: true, + nonMergeableValue: "none", + shortestValue: "red" + }, + "background-image": { + canOverride: canOverride.generic.image, + componentOf: ["background"], + defaultValue: "none", + intoMultiplexMode: "default" + }, + "background-origin": { + canOverride: canOverride.property.backgroundOrigin, + componentOf: ["background"], + defaultValue: "padding-box", + intoMultiplexMode: "real", + shortestValue: "border-box" + }, + "background-position": { + canOverride: canOverride.property.backgroundPosition, + componentOf: ["background"], + defaultValue: ["0", "0"], + doubleValues: true, + intoMultiplexMode: "real", + shortestValue: "0" + }, + "background-repeat": { + canOverride: canOverride.property.backgroundRepeat, + componentOf: ["background"], + defaultValue: ["repeat"], + doubleValues: true, + intoMultiplexMode: "real" + }, + "background-size": { + canOverride: canOverride.property.backgroundSize, + componentOf: ["background"], + defaultValue: ["auto"], + doubleValues: true, + intoMultiplexMode: "real", + shortestValue: "0 0" + }, + bottom: { + canOverride: canOverride.property.bottom, + defaultValue: "auto" + }, + border: { + breakUp: breakUp.border, + canOverride: canOverride.generic.components([ + canOverride.generic.unit, + canOverride.property.borderStyle, + canOverride.generic.color + ]), + components: ["border-width", "border-style", "border-color"], + defaultValue: "none", + overridesShorthands: [ + "border-bottom", + "border-left", + "border-right", + "border-top" + ], + restore: restore.withoutDefaults, + shorthand: true, + shorthandComponents: true + }, + "border-bottom": { + breakUp: breakUp.border, + canOverride: canOverride.generic.components([ + canOverride.generic.unit, + canOverride.property.borderStyle, + canOverride.generic.color + ]), + components: [ + "border-bottom-width", + "border-bottom-style", + "border-bottom-color" + ], + defaultValue: "none", + restore: restore.withoutDefaults, + shorthand: true + }, + "border-bottom-color": { + canOverride: canOverride.generic.color, + componentOf: ["border-bottom", "border-color"], + defaultValue: "none" + }, + "border-bottom-left-radius": { + canOverride: canOverride.generic.unit, + componentOf: ["border-radius"], + defaultValue: "0", + vendorPrefixes: ["-moz-", "-o-"] + }, + "border-bottom-right-radius": { + canOverride: canOverride.generic.unit, + componentOf: ["border-radius"], + defaultValue: "0", + vendorPrefixes: ["-moz-", "-o-"] + }, + "border-bottom-style": { + canOverride: canOverride.property.borderStyle, + componentOf: ["border-bottom", "border-style"], + defaultValue: "none" + }, + "border-bottom-width": { + canOverride: canOverride.generic.unit, + componentOf: ["border-bottom", "border-width"], + defaultValue: "medium", + oppositeTo: "border-top-width", + shortestValue: "0" + }, + "border-collapse": { + canOverride: canOverride.property.borderCollapse, + defaultValue: "separate" + }, + "border-color": { + breakUp: breakUp.fourValues, + canOverride: canOverride.generic.components([ + canOverride.generic.color, + canOverride.generic.color, + canOverride.generic.color, + canOverride.generic.color + ]), + componentOf: ["border"], + components: [ + "border-top-color", + "border-right-color", + "border-bottom-color", + "border-left-color" + ], + defaultValue: "none", + restore: restore.fourValues, + shortestValue: "red", + shorthand: true + }, + "border-left": { + breakUp: breakUp.border, + canOverride: canOverride.generic.components([ + canOverride.generic.unit, + canOverride.property.borderStyle, + canOverride.generic.color + ]), + components: [ + "border-left-width", + "border-left-style", + "border-left-color" + ], + defaultValue: "none", + restore: restore.withoutDefaults, + shorthand: true + }, + "border-left-color": { + canOverride: canOverride.generic.color, + componentOf: ["border-color", "border-left"], + defaultValue: "none" + }, + "border-left-style": { + canOverride: canOverride.property.borderStyle, + componentOf: ["border-left", "border-style"], + defaultValue: "none" + }, + "border-left-width": { + canOverride: canOverride.generic.unit, + componentOf: ["border-left", "border-width"], + defaultValue: "medium", + oppositeTo: "border-right-width", + shortestValue: "0" + }, + "border-radius": { + breakUp: breakUp.borderRadius, + canOverride: canOverride.generic.components([ + canOverride.generic.unit, + canOverride.generic.unit, + canOverride.generic.unit, + canOverride.generic.unit + ]), + components: [ + "border-top-left-radius", + "border-top-right-radius", + "border-bottom-right-radius", + "border-bottom-left-radius" + ], + defaultValue: "0", + restore: restore.borderRadius, + shorthand: true, + vendorPrefixes: ["-moz-", "-o-"] + }, + "border-right": { + breakUp: breakUp.border, + canOverride: canOverride.generic.components([ + canOverride.generic.unit, + canOverride.property.borderStyle, + canOverride.generic.color + ]), + components: [ + "border-right-width", + "border-right-style", + "border-right-color" + ], + defaultValue: "none", + restore: restore.withoutDefaults, + shorthand: true + }, + "border-right-color": { + canOverride: canOverride.generic.color, + componentOf: ["border-color", "border-right"], + defaultValue: "none" + }, + "border-right-style": { + canOverride: canOverride.property.borderStyle, + componentOf: ["border-right", "border-style"], + defaultValue: "none" + }, + "border-right-width": { + canOverride: canOverride.generic.unit, + componentOf: ["border-right", "border-width"], + defaultValue: "medium", + oppositeTo: "border-left-width", + shortestValue: "0" + }, + "border-style": { + breakUp: breakUp.fourValues, + canOverride: canOverride.generic.components([ + canOverride.property.borderStyle, + canOverride.property.borderStyle, + canOverride.property.borderStyle, + canOverride.property.borderStyle + ]), + componentOf: ["border"], + components: [ + "border-top-style", + "border-right-style", + "border-bottom-style", + "border-left-style" + ], + defaultValue: "none", + restore: restore.fourValues, + shorthand: true + }, + "border-top": { + breakUp: breakUp.border, + canOverride: canOverride.generic.components([ + canOverride.generic.unit, + canOverride.property.borderStyle, + canOverride.generic.color + ]), + components: [ + "border-top-width", + "border-top-style", + "border-top-color" + ], + defaultValue: "none", + restore: restore.withoutDefaults, + shorthand: true + }, + "border-top-color": { + canOverride: canOverride.generic.color, + componentOf: ["border-color", "border-top"], + defaultValue: "none" + }, + "border-top-left-radius": { + canOverride: canOverride.generic.unit, + componentOf: ["border-radius"], + defaultValue: "0", + vendorPrefixes: ["-moz-", "-o-"] + }, + "border-top-right-radius": { + canOverride: canOverride.generic.unit, + componentOf: ["border-radius"], + defaultValue: "0", + vendorPrefixes: ["-moz-", "-o-"] + }, + "border-top-style": { + canOverride: canOverride.property.borderStyle, + componentOf: ["border-style", "border-top"], + defaultValue: "none" + }, + "border-top-width": { + canOverride: canOverride.generic.unit, + componentOf: ["border-top", "border-width"], + defaultValue: "medium", + oppositeTo: "border-bottom-width", + shortestValue: "0" + }, + "border-width": { + breakUp: breakUp.fourValues, + canOverride: canOverride.generic.components([ + canOverride.generic.unit, + canOverride.generic.unit, + canOverride.generic.unit, + canOverride.generic.unit + ]), + componentOf: ["border"], + components: [ + "border-top-width", + "border-right-width", + "border-bottom-width", + "border-left-width" + ], + defaultValue: "medium", + restore: restore.fourValues, + shortestValue: "0", + shorthand: true + }, + clear: { + canOverride: canOverride.property.clear, + defaultValue: "none" + }, + color: { + canOverride: canOverride.generic.color, + defaultValue: "transparent", + shortestValue: "red" + }, + cursor: { + canOverride: canOverride.property.cursor, + defaultValue: "auto" + }, + display: { + canOverride: canOverride.property.display + }, + float: { + canOverride: canOverride.property.float, + defaultValue: "none" + }, + font: { + breakUp: breakUp.font, + canOverride: canOverride.generic.components([ + canOverride.property.fontStyle, + canOverride.property.fontVariant, + canOverride.property.fontWeight, + canOverride.property.fontStretch, + canOverride.generic.unit, + canOverride.generic.unit, + canOverride.property.fontFamily + ]), + components: [ + "font-style", + "font-variant", + "font-weight", + "font-stretch", + "font-size", + "line-height", + "font-family" + ], + restore: restore.font, + shorthand: true + }, + "font-family": { + canOverride: canOverride.property.fontFamily, + defaultValue: "user|agent|specific" + }, + "font-size": { + canOverride: canOverride.generic.unit, + defaultValue: "medium", + shortestValue: "0" + }, + "font-stretch": { + canOverride: canOverride.property.fontStretch, + defaultValue: "normal" + }, + "font-style": { + canOverride: canOverride.property.fontStyle, + defaultValue: "normal" + }, + "font-variant": { + canOverride: canOverride.property.fontVariant, + defaultValue: "normal" + }, + "font-weight": { + canOverride: canOverride.property.fontWeight, + defaultValue: "normal", + shortestValue: "400" + }, + height: { + canOverride: canOverride.generic.unit, + defaultValue: "auto", + shortestValue: "0" + }, + left: { + canOverride: canOverride.property.left, + defaultValue: "auto" + }, + "line-height": { + canOverride: canOverride.generic.unitOrNumber, + defaultValue: "normal", + shortestValue: "0" + }, + "list-style": { + canOverride: canOverride.generic.components([ + canOverride.property.listStyleType, + canOverride.property.listStylePosition, + canOverride.property.listStyleImage + ]), + components: [ + "list-style-type", + "list-style-position", + "list-style-image" + ], + breakUp: breakUp.listStyle, + restore: restore.withoutDefaults, + defaultValue: "outside", // can't use 'disc' because that'd override default 'decimal' for
    + shortestValue: "none", + shorthand: true + }, + "list-style-image": { + canOverride: canOverride.generic.image, + componentOf: ["list-style"], + defaultValue: "none" + }, + "list-style-position": { + canOverride: canOverride.property.listStylePosition, + componentOf: ["list-style"], + defaultValue: "outside", + shortestValue: "inside" + }, + "list-style-type": { + canOverride: canOverride.property.listStyleType, + componentOf: ["list-style"], + // NOTE: we can't tell the real default value here, it's 'disc' for
      and 'decimal' for
        + // this is a hack, but it doesn't matter because this value will be either overridden or + // it will disappear at the final step anyway + defaultValue: "decimal|disc", + shortestValue: "none" + }, + margin: { + breakUp: breakUp.fourValues, + canOverride: canOverride.generic.components([ + canOverride.generic.unit, + canOverride.generic.unit, + canOverride.generic.unit, + canOverride.generic.unit + ]), + components: [ + "margin-top", + "margin-right", + "margin-bottom", + "margin-left" + ], + defaultValue: "0", + restore: restore.fourValues, + shorthand: true + }, + "margin-bottom": { + canOverride: canOverride.generic.unit, + componentOf: ["margin"], + defaultValue: "0", + oppositeTo: "margin-top" + }, + "margin-left": { + canOverride: canOverride.generic.unit, + componentOf: ["margin"], + defaultValue: "0", + oppositeTo: "margin-right" + }, + "margin-right": { + canOverride: canOverride.generic.unit, + componentOf: ["margin"], + defaultValue: "0", + oppositeTo: "margin-left" + }, + "margin-top": { + canOverride: canOverride.generic.unit, + componentOf: ["margin"], + defaultValue: "0", + oppositeTo: "margin-bottom" + }, + outline: { + canOverride: canOverride.generic.components([ + canOverride.generic.color, + canOverride.property.outlineStyle, + canOverride.generic.unit + ]), + components: ["outline-color", "outline-style", "outline-width"], + breakUp: breakUp.outline, + restore: restore.withoutDefaults, + defaultValue: "0", + shorthand: true + }, + "outline-color": { + canOverride: canOverride.generic.color, + componentOf: ["outline"], + defaultValue: "invert", + shortestValue: "red" + }, + "outline-style": { + canOverride: canOverride.property.outlineStyle, + componentOf: ["outline"], + defaultValue: "none" + }, + "outline-width": { + canOverride: canOverride.generic.unit, + componentOf: ["outline"], + defaultValue: "medium", + shortestValue: "0" + }, + overflow: { + canOverride: canOverride.property.overflow, + defaultValue: "visible" + }, + "overflow-x": { + canOverride: canOverride.property.overflow, + defaultValue: "visible" + }, + "overflow-y": { + canOverride: canOverride.property.overflow, + defaultValue: "visible" + }, + padding: { + breakUp: breakUp.fourValues, + canOverride: canOverride.generic.components([ + canOverride.generic.unit, + canOverride.generic.unit, + canOverride.generic.unit, + canOverride.generic.unit + ]), + components: [ + "padding-top", + "padding-right", + "padding-bottom", + "padding-left" + ], + defaultValue: "0", + restore: restore.fourValues, + shorthand: true + }, + "padding-bottom": { + canOverride: canOverride.generic.unit, + componentOf: ["padding"], + defaultValue: "0", + oppositeTo: "padding-top" + }, + "padding-left": { + canOverride: canOverride.generic.unit, + componentOf: ["padding"], + defaultValue: "0", + oppositeTo: "padding-right" + }, + "padding-right": { + canOverride: canOverride.generic.unit, + componentOf: ["padding"], + defaultValue: "0", + oppositeTo: "padding-left" + }, + "padding-top": { + canOverride: canOverride.generic.unit, + componentOf: ["padding"], + defaultValue: "0", + oppositeTo: "padding-bottom" + }, + position: { + canOverride: canOverride.property.position, + defaultValue: "static" + }, + right: { + canOverride: canOverride.property.right, + defaultValue: "auto" + }, + "text-align": { + canOverride: canOverride.property.textAlign, + // NOTE: we can't tell the real default value here, as it depends on default text direction + // this is a hack, but it doesn't matter because this value will be either overridden or + // it will disappear anyway + defaultValue: "left|right" + }, + "text-decoration": { + canOverride: canOverride.property.textDecoration, + defaultValue: "none" + }, + "text-overflow": { + canOverride: canOverride.property.textOverflow, + defaultValue: "none" + }, + "text-shadow": { + canOverride: canOverride.property.textShadow, + defaultValue: "none" + }, + top: { + canOverride: canOverride.property.top, + defaultValue: "auto" + }, + transform: { + canOverride: canOverride.property.transform, + vendorPrefixes: ["-moz-", "-ms-", "-webkit-"] + }, + transition: { + breakUp: breakUp.multiplex(breakUp.transition), + canOverride: canOverride.generic.components([ + canOverride.property.transitionProperty, + canOverride.generic.time, + canOverride.generic.timingFunction, + canOverride.generic.time + ]), + components: [ + "transition-property", + "transition-duration", + "transition-timing-function", + "transition-delay" + ], + defaultValue: "none", + restore: restore.multiplex(restore.withoutDefaults), + shorthand: true, + vendorPrefixes: ["-moz-", "-o-", "-webkit-"] + }, + "transition-delay": { + canOverride: canOverride.generic.time, + componentOf: ["transition"], + defaultValue: "0s", + intoMultiplexMode: "real", + vendorPrefixes: ["-moz-", "-o-", "-webkit-"] + }, + "transition-duration": { + canOverride: canOverride.generic.time, + componentOf: ["transition"], + defaultValue: "0s", + intoMultiplexMode: "real", + vendorPrefixes: ["-moz-", "-o-", "-webkit-"] + }, + "transition-property": { + canOverride: canOverride.generic.propertyName, + componentOf: ["transition"], + defaultValue: "all", + intoMultiplexMode: "placeholder", + placeholderValue: "_", // it's a short value that won't match any property and still be a valid `transition-property` + vendorPrefixes: ["-moz-", "-o-", "-webkit-"] + }, + "transition-timing-function": { + canOverride: canOverride.generic.timingFunction, + componentOf: ["transition"], + defaultValue: "ease", + intoMultiplexMode: "real", + vendorPrefixes: ["-moz-", "-o-", "-webkit-"] + }, + "vertical-align": { + canOverride: canOverride.property.verticalAlign, + defaultValue: "baseline" + }, + visibility: { + canOverride: canOverride.property.visibility, + defaultValue: "visible" + }, + "white-space": { + canOverride: canOverride.property.whiteSpace, + defaultValue: "normal" + }, + width: { + canOverride: canOverride.generic.unit, + defaultValue: "auto", + shortestValue: "0" + }, + "z-index": { + canOverride: canOverride.property.zIndex, + defaultValue: "auto" + } + }; + + function cloneDescriptor(propertyName, prefix) { + var clonedDescriptor = override(compactable[propertyName], {}); + + if ("componentOf" in clonedDescriptor) { + clonedDescriptor.componentOf = clonedDescriptor.componentOf.map( + function(shorthandName) { + return prefix + shorthandName; + } + ); + } + + if ("components" in clonedDescriptor) { + clonedDescriptor.components = clonedDescriptor.components.map( + function(longhandName) { + return prefix + longhandName; + } + ); + } + + if ("keepUnlessDefault" in clonedDescriptor) { + clonedDescriptor.keepUnlessDefault = + prefix + clonedDescriptor.keepUnlessDefault; + } + + return clonedDescriptor; + } + + // generate vendor-prefixed properties + var vendorPrefixedCompactable = {}; + + for (var propertyName in compactable) { + var descriptor = compactable[propertyName]; + + if (!("vendorPrefixes" in descriptor)) { + continue; + } + + for (var i = 0; i < descriptor.vendorPrefixes.length; i++) { + var prefix = descriptor.vendorPrefixes[i]; + var clonedDescriptor = cloneDescriptor(propertyName, prefix); + delete clonedDescriptor.vendorPrefixes; + + vendorPrefixedCompactable[prefix + propertyName] = clonedDescriptor; + } + + delete descriptor.vendorPrefixes; + } + + module.exports = override(compactable, vendorPrefixedCompactable); + }, + { + "../../utils/override": 95, + "./break-up": 18, + "./can-override": 19, + "./restore": 49 + } + ], + 22: [ + function(require, module, exports) { + // This extractor is used in level 2 optimizations + // IMPORTANT: Mind Token class and this code is not related! + // Properties will be tokenized in one step, see #429 + + var Token = require("../../tokenizer/token"); + var serializeRules = require("../../writer/one-time").rules; + var serializeValue = require("../../writer/one-time").value; + + function extractProperties(token) { + var properties = []; + var inSpecificSelector; + var property; + var name; + var value; + var i, l; + + if (token[0] == Token.RULE) { + inSpecificSelector = !/[\.\+>~]/.test(serializeRules(token[1])); + + for (i = 0, l = token[2].length; i < l; i++) { + property = token[2][i]; + + if (property[0] != Token.PROPERTY) continue; + + name = property[1][1]; + if (name.length === 0) continue; + + if (name.indexOf("--") === 0) continue; + + value = serializeValue(property, i); + + properties.push([ + name, + value, + findNameRoot(name), + token[2][i], + name + ":" + value, + token[1], + inSpecificSelector + ]); + } + } else if (token[0] == Token.NESTED_BLOCK) { + for (i = 0, l = token[2].length; i < l; i++) { + properties = properties.concat(extractProperties(token[2][i])); + } + } + + return properties; + } + + function findNameRoot(name) { + if (name == "list-style") return name; + if (name.indexOf("-radius") > 0) return "border-radius"; + if ( + name == "border-collapse" || + name == "border-spacing" || + name == "border-image" + ) + return name; + if (name.indexOf("border-") === 0 && /^border\-\w+\-\w+$/.test(name)) + return name.match(/border\-\w+/)[0]; + if (name.indexOf("border-") === 0 && /^border\-\w+$/.test(name)) + return "border"; + if (name.indexOf("text-") === 0) return name; + if (name == "-chrome-") return name; + + return name + .replace(/^\-\w+\-/, "") + .match(/([a-zA-Z]+)/)[0] + .toLowerCase(); + } + + module.exports = extractProperties; + }, + { "../../tokenizer/token": 84, "../../writer/one-time": 98 } + ], + 23: [ + function(require, module, exports) { + function InvalidPropertyError(message) { + this.name = "InvalidPropertyError"; + this.message = message; + this.stack = new Error().stack; + } + + InvalidPropertyError.prototype = Object.create(Error.prototype); + InvalidPropertyError.prototype.constructor = InvalidPropertyError; + + module.exports = InvalidPropertyError; + }, + {} + ], + 24: [ + function(require, module, exports) { + var Marker = require("../../tokenizer/marker"); + var split = require("../../utils/split"); + + var DEEP_SELECTOR_PATTERN = /\/deep\//; + var DOUBLE_COLON_PATTERN = /^::/; + var NOT_PSEUDO = ":not"; + var PSEUDO_CLASSES_WITH_ARGUMENTS = [ + ":dir", + ":lang", + ":not", + ":nth-child", + ":nth-last-child", + ":nth-last-of-type", + ":nth-of-type" + ]; + var RELATION_PATTERN = /[>\+~]/; + var UNMIXABLE_PSEUDO_CLASSES = [ + ":after", + ":before", + ":first-letter", + ":first-line", + ":lang" + ]; + var UNMIXABLE_PSEUDO_ELEMENTS = [ + "::after", + "::before", + "::first-letter", + "::first-line" + ]; + + var Level = { + DOUBLE_QUOTE: "double-quote", + SINGLE_QUOTE: "single-quote", + ROOT: "root" + }; + + function isMergeable( + selector, + mergeablePseudoClasses, + mergeablePseudoElements, + multiplePseudoMerging + ) { + var singleSelectors = split(selector, Marker.COMMA); + var singleSelector; + var i, l; + + for (i = 0, l = singleSelectors.length; i < l; i++) { + singleSelector = singleSelectors[i]; + + if ( + singleSelector.length === 0 || + isDeepSelector(singleSelector) || + (singleSelector.indexOf(Marker.COLON) > -1 && + !areMergeable( + singleSelector, + extractPseudoFrom(singleSelector), + mergeablePseudoClasses, + mergeablePseudoElements, + multiplePseudoMerging + )) + ) { + return false; + } + } + + return true; + } + + function isDeepSelector(selector) { + return DEEP_SELECTOR_PATTERN.test(selector); + } + + function extractPseudoFrom(selector) { + var list = []; + var character; + var buffer = []; + var level = Level.ROOT; + var roundBracketLevel = 0; + var isQuoted; + var isEscaped; + var isPseudo = false; + var isRelation; + var wasColon = false; + var index; + var len; + + for (index = 0, len = selector.length; index < len; index++) { + character = selector[index]; + + isRelation = !isEscaped && RELATION_PATTERN.test(character); + isQuoted = + level == Level.DOUBLE_QUOTE || level == Level.SINGLE_QUOTE; + + if (isEscaped) { + buffer.push(character); + } else if ( + character == Marker.DOUBLE_QUOTE && + level == Level.ROOT + ) { + buffer.push(character); + level = Level.DOUBLE_QUOTE; + } else if ( + character == Marker.DOUBLE_QUOTE && + level == Level.DOUBLE_QUOTE + ) { + buffer.push(character); + level = Level.ROOT; + } else if ( + character == Marker.SINGLE_QUOTE && + level == Level.ROOT + ) { + buffer.push(character); + level = Level.SINGLE_QUOTE; + } else if ( + character == Marker.SINGLE_QUOTE && + level == Level.SINGLE_QUOTE + ) { + buffer.push(character); + level = Level.ROOT; + } else if (isQuoted) { + buffer.push(character); + } else if (character == Marker.OPEN_ROUND_BRACKET) { + buffer.push(character); + roundBracketLevel++; + } else if ( + character == Marker.CLOSE_ROUND_BRACKET && + roundBracketLevel == 1 && + isPseudo + ) { + buffer.push(character); + list.push(buffer.join("")); + roundBracketLevel--; + buffer = []; + isPseudo = false; + } else if (character == Marker.CLOSE_ROUND_BRACKET) { + buffer.push(character); + roundBracketLevel--; + } else if ( + character == Marker.COLON && + roundBracketLevel === 0 && + isPseudo && + !wasColon + ) { + list.push(buffer.join("")); + buffer = []; + buffer.push(character); + } else if ( + character == Marker.COLON && + roundBracketLevel === 0 && + !wasColon + ) { + buffer = []; + buffer.push(character); + isPseudo = true; + } else if ( + character == Marker.SPACE && + roundBracketLevel === 0 && + isPseudo + ) { + list.push(buffer.join("")); + buffer = []; + isPseudo = false; + } else if (isRelation && roundBracketLevel === 0 && isPseudo) { + list.push(buffer.join("")); + buffer = []; + isPseudo = false; + } else { + buffer.push(character); + } + + isEscaped = character == Marker.BACK_SLASH; + wasColon = character == Marker.COLON; + } + + if (buffer.length > 0 && isPseudo) { + list.push(buffer.join("")); + } + + return list; + } + + function areMergeable( + selector, + matches, + mergeablePseudoClasses, + mergeablePseudoElements, + multiplePseudoMerging + ) { + return ( + areAllowed( + matches, + mergeablePseudoClasses, + mergeablePseudoElements + ) && + needArguments(matches) && + (matches.length < 2 || + !someIncorrectlyChained(selector, matches)) && + (matches.length < 2 || + (multiplePseudoMerging && allMixable(matches))) + ); + } + + function areAllowed( + matches, + mergeablePseudoClasses, + mergeablePseudoElements + ) { + var match; + var name; + var i, l; + + for (i = 0, l = matches.length; i < l; i++) { + match = matches[i]; + name = + match.indexOf(Marker.OPEN_ROUND_BRACKET) > -1 + ? match.substring(0, match.indexOf(Marker.OPEN_ROUND_BRACKET)) + : match; + + if ( + mergeablePseudoClasses.indexOf(name) === -1 && + mergeablePseudoElements.indexOf(name) === -1 + ) { + return false; + } + } + + return true; + } + + function needArguments(matches) { + var match; + var name; + var bracketOpensAt; + var hasArguments; + var i, l; + + for (i = 0, l = matches.length; i < l; i++) { + match = matches[i]; + + bracketOpensAt = match.indexOf(Marker.OPEN_ROUND_BRACKET); + hasArguments = bracketOpensAt > -1; + name = hasArguments ? match.substring(0, bracketOpensAt) : match; + + if ( + hasArguments && + PSEUDO_CLASSES_WITH_ARGUMENTS.indexOf(name) == -1 + ) { + return false; + } + + if ( + !hasArguments && + PSEUDO_CLASSES_WITH_ARGUMENTS.indexOf(name) > -1 + ) { + return false; + } + } + + return true; + } + + function someIncorrectlyChained(selector, matches) { + var positionInSelector = 0; + var match; + var matchAt; + var nextMatch; + var nextMatchAt; + var name; + var nextName; + var areChained; + var i, l; + + for (i = 0, l = matches.length; i < l; i++) { + match = matches[i]; + nextMatch = matches[i + 1]; + + if (!nextMatch) { + break; + } + + matchAt = selector.indexOf(match, positionInSelector); + nextMatchAt = selector.indexOf(match, matchAt + 1); + positionInSelector = nextMatchAt; + areChained = matchAt + match.length == nextMatchAt; + + if (areChained) { + name = + match.indexOf(Marker.OPEN_ROUND_BRACKET) > -1 + ? match.substring(0, match.indexOf(Marker.OPEN_ROUND_BRACKET)) + : match; + nextName = + nextMatch.indexOf(Marker.OPEN_ROUND_BRACKET) > -1 + ? nextMatch.substring( + 0, + nextMatch.indexOf(Marker.OPEN_ROUND_BRACKET) + ) + : nextMatch; + + if (name != NOT_PSEUDO || nextName != NOT_PSEUDO) { + return true; + } + } + } + + return false; + } + + function allMixable(matches) { + var unmixableMatches = 0; + var match; + var i, l; + + for (i = 0, l = matches.length; i < l; i++) { + match = matches[i]; + + if (isPseudoElement(match)) { + unmixableMatches += + UNMIXABLE_PSEUDO_ELEMENTS.indexOf(match) > -1 ? 1 : 0; + } else { + unmixableMatches += + UNMIXABLE_PSEUDO_CLASSES.indexOf(match) > -1 ? 1 : 0; + } + + if (unmixableMatches > 1) { + return false; + } + } + + return true; + } + + function isPseudoElement(pseudo) { + return DOUBLE_COLON_PATTERN.test(pseudo); + } + + module.exports = isMergeable; + }, + { "../../tokenizer/marker": 83, "../../utils/split": 96 } + ], + 25: [ + function(require, module, exports) { + var isMergeable = require("./is-mergeable"); + + var optimizeProperties = require("./properties/optimize"); + + var sortSelectors = require("../level-1/sort-selectors"); + var tidyRules = require("../level-1/tidy-rules"); + + var OptimizationLevel = require("../../options/optimization-level") + .OptimizationLevel; + + var serializeBody = require("../../writer/one-time").body; + var serializeRules = require("../../writer/one-time").rules; + + var Token = require("../../tokenizer/token"); + + function mergeAdjacent(tokens, context) { + var lastToken = [null, [], []]; + var options = context.options; + var adjacentSpace = options.compatibility.selectors.adjacentSpace; + var selectorsSortingMethod = + options.level[OptimizationLevel.One].selectorsSortingMethod; + var mergeablePseudoClasses = + options.compatibility.selectors.mergeablePseudoClasses; + var mergeablePseudoElements = + options.compatibility.selectors.mergeablePseudoElements; + var mergeLimit = options.compatibility.selectors.mergeLimit; + var multiplePseudoMerging = + options.compatibility.selectors.multiplePseudoMerging; + + for (var i = 0, l = tokens.length; i < l; i++) { + var token = tokens[i]; + + if (token[0] != Token.RULE) { + lastToken = [null, [], []]; + continue; + } + + if ( + lastToken[0] == Token.RULE && + serializeRules(token[1]) == serializeRules(lastToken[1]) + ) { + Array.prototype.push.apply(lastToken[2], token[2]); + optimizeProperties(lastToken[2], true, true, context); + token[2] = []; + } else if ( + lastToken[0] == Token.RULE && + serializeBody(token[2]) == serializeBody(lastToken[2]) && + isMergeable( + serializeRules(token[1]), + mergeablePseudoClasses, + mergeablePseudoElements, + multiplePseudoMerging + ) && + isMergeable( + serializeRules(lastToken[1]), + mergeablePseudoClasses, + mergeablePseudoElements, + multiplePseudoMerging + ) && + lastToken[1].length < mergeLimit + ) { + lastToken[1] = tidyRules( + lastToken[1].concat(token[1]), + false, + adjacentSpace, + false, + context.warnings + ); + lastToken[1] = + lastToken.length > 1 + ? sortSelectors(lastToken[1], selectorsSortingMethod) + : lastToken[1]; + token[2] = []; + } else { + lastToken = token; + } + } + } + + module.exports = mergeAdjacent; + }, + { + "../../options/optimization-level": 65, + "../../tokenizer/token": 84, + "../../writer/one-time": 98, + "../level-1/sort-selectors": 14, + "../level-1/tidy-rules": 17, + "./is-mergeable": 24, + "./properties/optimize": 36 + } + ], + 26: [ + function(require, module, exports) { + var canReorder = require("./reorderable").canReorder; + var canReorderSingle = require("./reorderable").canReorderSingle; + var extractProperties = require("./extract-properties"); + var rulesOverlap = require("./rules-overlap"); + + var serializeRules = require("../../writer/one-time").rules; + var OptimizationLevel = require("../../options/optimization-level") + .OptimizationLevel; + var Token = require("../../tokenizer/token"); + + function mergeMediaQueries(tokens, context) { + var mergeSemantically = + context.options.level[OptimizationLevel.Two].mergeSemantically; + var specificityCache = context.cache.specificity; + var candidates = {}; + var reduced = []; + + for (var i = tokens.length - 1; i >= 0; i--) { + var token = tokens[i]; + if (token[0] != Token.NESTED_BLOCK) { + continue; + } + + var key = serializeRules(token[1]); + var candidate = candidates[key]; + if (!candidate) { + candidate = []; + candidates[key] = candidate; + } + + candidate.push(i); + } + + for (var name in candidates) { + var positions = candidates[name]; + + positionLoop: for (var j = positions.length - 1; j > 0; j--) { + var positionOne = positions[j]; + var tokenOne = tokens[positionOne]; + var positionTwo = positions[j - 1]; + var tokenTwo = tokens[positionTwo]; + + directionLoop: for ( + var direction = 1; + direction >= -1; + direction -= 2 + ) { + var topToBottom = direction == 1; + var from = topToBottom ? positionOne + 1 : positionTwo - 1; + var to = topToBottom ? positionTwo : positionOne; + var delta = topToBottom ? 1 : -1; + var source = topToBottom ? tokenOne : tokenTwo; + var target = topToBottom ? tokenTwo : tokenOne; + var movedProperties = extractProperties(source); + + while (from != to) { + var traversedProperties = extractProperties(tokens[from]); + from += delta; + + if ( + mergeSemantically && + allSameRulePropertiesCanBeReordered( + movedProperties, + traversedProperties, + specificityCache + ) + ) { + continue; + } + + if ( + !canReorder( + movedProperties, + traversedProperties, + specificityCache + ) + ) + continue directionLoop; + } + + target[2] = topToBottom + ? source[2].concat(target[2]) + : target[2].concat(source[2]); + source[2] = []; + + reduced.push(target); + continue positionLoop; + } + } + } + + return reduced; + } + + function allSameRulePropertiesCanBeReordered( + movedProperties, + traversedProperties, + specificityCache + ) { + var movedProperty; + var movedRule; + var traversedProperty; + var traversedRule; + var i, l; + var j, m; + + for (i = 0, l = movedProperties.length; i < l; i++) { + movedProperty = movedProperties[i]; + movedRule = movedProperty[5]; + + for (j = 0, m = traversedProperties.length; j < m; j++) { + traversedProperty = traversedProperties[j]; + traversedRule = traversedProperty[5]; + + if ( + rulesOverlap(movedRule, traversedRule, true) && + !canReorderSingle( + movedProperty, + traversedProperty, + specificityCache + ) + ) { + return false; + } + } + } + + return true; + } + + module.exports = mergeMediaQueries; + }, + { + "../../options/optimization-level": 65, + "../../tokenizer/token": 84, + "../../writer/one-time": 98, + "./extract-properties": 22, + "./reorderable": 47, + "./rules-overlap": 51 + } + ], + 27: [ + function(require, module, exports) { + var isMergeable = require("./is-mergeable"); + + var sortSelectors = require("../level-1/sort-selectors"); + var tidyRules = require("../level-1/tidy-rules"); + + var OptimizationLevel = require("../../options/optimization-level") + .OptimizationLevel; + + var serializeBody = require("../../writer/one-time").body; + var serializeRules = require("../../writer/one-time").rules; + + var Token = require("../../tokenizer/token"); + + function unsafeSelector(value) { + return /\.|\*| :/.test(value); + } + + function isBemElement(token) { + var asString = serializeRules(token[1]); + return asString.indexOf("__") > -1 || asString.indexOf("--") > -1; + } + + function withoutModifier(selector) { + return selector.replace(/--[^ ,>\+~:]+/g, ""); + } + + function removeAnyUnsafeElements(left, candidates) { + var leftSelector = withoutModifier(serializeRules(left[1])); + + for (var body in candidates) { + var right = candidates[body]; + var rightSelector = withoutModifier(serializeRules(right[1])); + + if ( + rightSelector.indexOf(leftSelector) > -1 || + leftSelector.indexOf(rightSelector) > -1 + ) + delete candidates[body]; + } + } + + function mergeNonAdjacentByBody(tokens, context) { + var options = context.options; + var mergeSemantically = + options.level[OptimizationLevel.Two].mergeSemantically; + var adjacentSpace = options.compatibility.selectors.adjacentSpace; + var selectorsSortingMethod = + options.level[OptimizationLevel.One].selectorsSortingMethod; + var mergeablePseudoClasses = + options.compatibility.selectors.mergeablePseudoClasses; + var mergeablePseudoElements = + options.compatibility.selectors.mergeablePseudoElements; + var multiplePseudoMerging = + options.compatibility.selectors.multiplePseudoMerging; + var candidates = {}; + + for (var i = tokens.length - 1; i >= 0; i--) { + var token = tokens[i]; + if (token[0] != Token.RULE) continue; + + if ( + token[2].length > 0 && + (!mergeSemantically && unsafeSelector(serializeRules(token[1]))) + ) + candidates = {}; + + if (token[2].length > 0 && mergeSemantically && isBemElement(token)) + removeAnyUnsafeElements(token, candidates); + + var candidateBody = serializeBody(token[2]); + var oldToken = candidates[candidateBody]; + if ( + oldToken && + isMergeable( + serializeRules(token[1]), + mergeablePseudoClasses, + mergeablePseudoElements, + multiplePseudoMerging + ) && + isMergeable( + serializeRules(oldToken[1]), + mergeablePseudoClasses, + mergeablePseudoElements, + multiplePseudoMerging + ) + ) { + if (token[2].length > 0) { + token[1] = tidyRules( + oldToken[1].concat(token[1]), + false, + adjacentSpace, + false, + context.warnings + ); + token[1] = + token[1].length > 1 + ? sortSelectors(token[1], selectorsSortingMethod) + : token[1]; + } else { + token[1] = oldToken[1].concat(token[1]); + } + + oldToken[2] = []; + candidates[candidateBody] = null; + } + + candidates[serializeBody(token[2])] = token; + } + } + + module.exports = mergeNonAdjacentByBody; + }, + { + "../../options/optimization-level": 65, + "../../tokenizer/token": 84, + "../../writer/one-time": 98, + "../level-1/sort-selectors": 14, + "../level-1/tidy-rules": 17, + "./is-mergeable": 24 + } + ], + 28: [ + function(require, module, exports) { + var canReorder = require("./reorderable").canReorder; + var extractProperties = require("./extract-properties"); + + var optimizeProperties = require("./properties/optimize"); + + var serializeRules = require("../../writer/one-time").rules; + + var Token = require("../../tokenizer/token"); + + function mergeNonAdjacentBySelector(tokens, context) { + var specificityCache = context.cache.specificity; + var allSelectors = {}; + var repeatedSelectors = []; + var i; + + for (i = tokens.length - 1; i >= 0; i--) { + if (tokens[i][0] != Token.RULE) continue; + if (tokens[i][2].length === 0) continue; + + var selector = serializeRules(tokens[i][1]); + allSelectors[selector] = [i].concat(allSelectors[selector] || []); + + if (allSelectors[selector].length == 2) + repeatedSelectors.push(selector); + } + + for (i = repeatedSelectors.length - 1; i >= 0; i--) { + var positions = allSelectors[repeatedSelectors[i]]; + + selectorIterator: for (var j = positions.length - 1; j > 0; j--) { + var positionOne = positions[j - 1]; + var tokenOne = tokens[positionOne]; + var positionTwo = positions[j]; + var tokenTwo = tokens[positionTwo]; + + directionIterator: for ( + var direction = 1; + direction >= -1; + direction -= 2 + ) { + var topToBottom = direction == 1; + var from = topToBottom ? positionOne + 1 : positionTwo - 1; + var to = topToBottom ? positionTwo : positionOne; + var delta = topToBottom ? 1 : -1; + var moved = topToBottom ? tokenOne : tokenTwo; + var target = topToBottom ? tokenTwo : tokenOne; + var movedProperties = extractProperties(moved); + + while (from != to) { + var traversedProperties = extractProperties(tokens[from]); + from += delta; + + // traversed then moved as we move selectors towards the start + var reorderable = topToBottom + ? canReorder( + movedProperties, + traversedProperties, + specificityCache + ) + : canReorder( + traversedProperties, + movedProperties, + specificityCache + ); + + if (!reorderable && !topToBottom) continue selectorIterator; + if (!reorderable && topToBottom) continue directionIterator; + } + + if (topToBottom) { + Array.prototype.push.apply(moved[2], target[2]); + target[2] = moved[2]; + } else { + Array.prototype.push.apply(target[2], moved[2]); + } + + optimizeProperties(target[2], true, true, context); + moved[2] = []; + } + } + } + } + + module.exports = mergeNonAdjacentBySelector; + }, + { + "../../tokenizer/token": 84, + "../../writer/one-time": 98, + "./extract-properties": 22, + "./properties/optimize": 36, + "./reorderable": 47 + } + ], + 29: [ + function(require, module, exports) { + var mergeAdjacent = require("./merge-adjacent"); + var mergeMediaQueries = require("./merge-media-queries"); + var mergeNonAdjacentByBody = require("./merge-non-adjacent-by-body"); + var mergeNonAdjacentBySelector = require("./merge-non-adjacent-by-selector"); + var reduceNonAdjacent = require("./reduce-non-adjacent"); + var removeDuplicateFontAtRules = require("./remove-duplicate-font-at-rules"); + var removeDuplicateMediaQueries = require("./remove-duplicate-media-queries"); + var removeDuplicates = require("./remove-duplicates"); + var removeUnusedAtRules = require("./remove-unused-at-rules"); + var restructure = require("./restructure"); + + var optimizeProperties = require("./properties/optimize"); + + var OptimizationLevel = require("../../options/optimization-level") + .OptimizationLevel; + + var Token = require("../../tokenizer/token"); + + function removeEmpty(tokens) { + for (var i = 0, l = tokens.length; i < l; i++) { + var token = tokens[i]; + var isEmpty = false; + + switch (token[0]) { + case Token.RULE: + isEmpty = token[1].length === 0 || token[2].length === 0; + break; + case Token.NESTED_BLOCK: + removeEmpty(token[2]); + isEmpty = token[2].length === 0; + break; + case Token.AT_RULE: + isEmpty = token[1].length === 0; + break; + case Token.AT_RULE_BLOCK: + isEmpty = token[2].length === 0; + } + + if (isEmpty) { + tokens.splice(i, 1); + i--; + l--; + } + } + } + + function recursivelyOptimizeBlocks(tokens, context) { + for (var i = 0, l = tokens.length; i < l; i++) { + var token = tokens[i]; + + if (token[0] == Token.NESTED_BLOCK) { + var isKeyframes = /@(-moz-|-o-|-webkit-)?keyframes/.test( + token[1][0][1] + ); + level2Optimize(token[2], context, !isKeyframes); + } + } + } + + function recursivelyOptimizeProperties(tokens, context) { + for (var i = 0, l = tokens.length; i < l; i++) { + var token = tokens[i]; + + switch (token[0]) { + case Token.RULE: + optimizeProperties(token[2], true, true, context); + break; + case Token.NESTED_BLOCK: + recursivelyOptimizeProperties(token[2], context); + } + } + } + + function level2Optimize(tokens, context, withRestructuring) { + var levelOptions = context.options.level[OptimizationLevel.Two]; + var reduced; + var i; + + recursivelyOptimizeBlocks(tokens, context); + recursivelyOptimizeProperties(tokens, context); + + if (levelOptions.removeDuplicateRules) { + removeDuplicates(tokens, context); + } + + if (levelOptions.mergeAdjacentRules) { + mergeAdjacent(tokens, context); + } + + if (levelOptions.reduceNonAdjacentRules) { + reduceNonAdjacent(tokens, context); + } + + if ( + levelOptions.mergeNonAdjacentRules && + levelOptions.mergeNonAdjacentRules != "body" + ) { + mergeNonAdjacentBySelector(tokens, context); + } + + if ( + levelOptions.mergeNonAdjacentRules && + levelOptions.mergeNonAdjacentRules != "selector" + ) { + mergeNonAdjacentByBody(tokens, context); + } + + if ( + levelOptions.restructureRules && + levelOptions.mergeAdjacentRules && + withRestructuring + ) { + restructure(tokens, context); + mergeAdjacent(tokens, context); + } + + if ( + levelOptions.restructureRules && + !levelOptions.mergeAdjacentRules && + withRestructuring + ) { + restructure(tokens, context); + } + + if (levelOptions.removeDuplicateFontRules) { + removeDuplicateFontAtRules(tokens, context); + } + + if (levelOptions.removeDuplicateMediaBlocks) { + removeDuplicateMediaQueries(tokens, context); + } + + if (levelOptions.removeUnusedAtRules) { + removeUnusedAtRules(tokens, context); + } + + if (levelOptions.mergeMedia) { + reduced = mergeMediaQueries(tokens, context); + for (i = reduced.length - 1; i >= 0; i--) { + level2Optimize(reduced[i][2], context, false); + } + } + + if (levelOptions.removeEmpty) { + removeEmpty(tokens); + } + + return tokens; + } + + module.exports = level2Optimize; + }, + { + "../../options/optimization-level": 65, + "../../tokenizer/token": 84, + "./merge-adjacent": 25, + "./merge-media-queries": 26, + "./merge-non-adjacent-by-body": 27, + "./merge-non-adjacent-by-selector": 28, + "./properties/optimize": 36, + "./reduce-non-adjacent": 42, + "./remove-duplicate-font-at-rules": 43, + "./remove-duplicate-media-queries": 44, + "./remove-duplicates": 45, + "./remove-unused-at-rules": 46, + "./restructure": 50 + } + ], + 30: [ + function(require, module, exports) { + var Marker = require("../../../tokenizer/marker"); + + function everyValuesPair(fn, left, right) { + var leftSize = left.value.length; + var rightSize = right.value.length; + var total = Math.max(leftSize, rightSize); + var lowerBound = Math.min(leftSize, rightSize) - 1; + var leftValue; + var rightValue; + var position; + + for (position = 0; position < total; position++) { + leftValue = + (left.value[position] && left.value[position][1]) || leftValue; + rightValue = + (right.value[position] && right.value[position][1]) || rightValue; + + if (leftValue == Marker.COMMA || rightValue == Marker.COMMA) { + continue; + } + + if (!fn(leftValue, rightValue, position, position <= lowerBound)) { + return false; + } + } + + return true; + } + + module.exports = everyValuesPair; + }, + { "../../../tokenizer/marker": 83 } + ], + 31: [ + function(require, module, exports) { + var compactable = require("../compactable"); + + function findComponentIn(shorthand, longhand) { + var comparator = nameComparator(longhand); + + return ( + findInDirectComponents(shorthand, comparator) || + findInSubComponents(shorthand, comparator) + ); + } + + function nameComparator(to) { + return function(property) { + return to.name === property.name; + }; + } + + function findInDirectComponents(shorthand, comparator) { + return shorthand.components.filter(comparator)[0]; + } + + function findInSubComponents(shorthand, comparator) { + var shorthandComponent; + var longhandMatch; + var i, l; + + if (!compactable[shorthand.name].shorthandComponents) { + return; + } + + for (i = 0, l = shorthand.components.length; i < l; i++) { + shorthandComponent = shorthand.components[i]; + longhandMatch = findInDirectComponents( + shorthandComponent, + comparator + ); + + if (longhandMatch) { + return longhandMatch; + } + } + + return; + } + + module.exports = findComponentIn; + }, + { "../compactable": 21 } + ], + 32: [ + function(require, module, exports) { + function hasInherit(property) { + for (var i = property.value.length - 1; i >= 0; i--) { + if (property.value[i][1] == "inherit") return true; + } + + return false; + } + + module.exports = hasInherit; + }, + {} + ], + 33: [ + function(require, module, exports) { + var compactable = require("../compactable"); + + function isComponentOf(property1, property2, shallow) { + return ( + isDirectComponentOf(property1, property2) || + (!shallow && + !!compactable[property1.name].shorthandComponents && + isSubComponentOf(property1, property2)) + ); + } + + function isDirectComponentOf(property1, property2) { + var descriptor = compactable[property1.name]; + + return ( + "components" in descriptor && + descriptor.components.indexOf(property2.name) > -1 + ); + } + + function isSubComponentOf(property1, property2) { + return property1.components.some(function(component) { + return isDirectComponentOf(component, property2); + }); + } + + module.exports = isComponentOf; + }, + { "../compactable": 21 } + ], + 34: [ + function(require, module, exports) { + var Marker = require("../../../tokenizer/marker"); + + function isMergeableShorthand(shorthand) { + if (shorthand.name != "font") { + return true; + } + + return shorthand.value[0][1].indexOf(Marker.INTERNAL) == -1; + } + + module.exports = isMergeableShorthand; + }, + { "../../../tokenizer/marker": 83 } + ], + 35: [ + function(require, module, exports) { + var everyValuesPair = require("./every-values-pair"); + var hasInherit = require("./has-inherit"); + var populateComponents = require("./populate-components"); + + var compactable = require("../compactable"); + var deepClone = require("../clone").deep; + var restoreWithComponents = require("../restore-with-components"); + + var restoreFromOptimizing = require("../../restore-from-optimizing"); + var wrapSingle = require("../../wrap-for-optimizing").single; + + var serializeBody = require("../../../writer/one-time").body; + var Token = require("../../../tokenizer/token"); + + function mergeIntoShorthands(properties, validator) { + var candidates = {}; + var descriptor; + var componentOf; + var property; + var i, l; + var j, m; + + // there is no shorthand property made up of less than 3 longhands + if (properties.length < 3) { + return; + } + + for (i = 0, l = properties.length; i < l; i++) { + property = properties[i]; + descriptor = compactable[property.name]; + + if (property.unused) { + continue; + } + + if (property.hack) { + continue; + } + + if (property.block) { + continue; + } + + invalidateOrCompact(properties, i, candidates, validator); + + if (descriptor && descriptor.componentOf) { + for (j = 0, m = descriptor.componentOf.length; j < m; j++) { + componentOf = descriptor.componentOf[j]; + + candidates[componentOf] = candidates[componentOf] || {}; + candidates[componentOf][property.name] = property; + } + } + } + + invalidateOrCompact(properties, i, candidates, validator); + } + + function invalidateOrCompact( + properties, + position, + candidates, + validator + ) { + var invalidatedBy = properties[position]; + var shorthandName; + var shorthandDescriptor; + var candidateComponents; + + for (shorthandName in candidates) { + if ( + undefined !== invalidatedBy && + shorthandName == invalidatedBy.name + ) { + continue; + } + + shorthandDescriptor = compactable[shorthandName]; + candidateComponents = candidates[shorthandName]; + if ( + invalidatedBy && + invalidates(candidates, shorthandName, invalidatedBy) + ) { + delete candidates[shorthandName]; + continue; + } + + if ( + shorthandDescriptor.components.length > + Object.keys(candidateComponents).length + ) { + continue; + } + + if (mixedImportance(candidateComponents)) { + continue; + } + + if (!overridable(candidateComponents, shorthandName, validator)) { + continue; + } + + if (!mergeable(candidateComponents)) { + continue; + } + + if (mixedInherit(candidateComponents)) { + replaceWithInheritBestFit( + properties, + candidateComponents, + shorthandName, + validator + ); + } else { + replaceWithShorthand( + properties, + candidateComponents, + shorthandName, + validator + ); + } + } + } + + function invalidates(candidates, shorthandName, invalidatedBy) { + var shorthandDescriptor = compactable[shorthandName]; + var invalidatedByDescriptor = compactable[invalidatedBy.name]; + var componentName; + + if ( + "overridesShorthands" in shorthandDescriptor && + shorthandDescriptor.overridesShorthands.indexOf( + invalidatedBy.name + ) > -1 + ) { + return true; + } + + if ( + invalidatedByDescriptor && + "componentOf" in invalidatedByDescriptor + ) { + for (componentName in candidates[shorthandName]) { + if ( + invalidatedByDescriptor.componentOf.indexOf(componentName) > -1 + ) { + return true; + } + } + } + + return false; + } + + function mixedImportance(components) { + var important; + var componentName; + + for (componentName in components) { + if ( + undefined !== important && + components[componentName].important != important + ) { + return true; + } + + important = components[componentName].important; + } + + return false; + } + + function overridable(components, shorthandName, validator) { + var descriptor = compactable[shorthandName]; + var newValuePlaceholder = [ + Token.PROPERTY, + [Token.PROPERTY_NAME, shorthandName], + [Token.PROPERTY_VALUE, descriptor.defaultValue] + ]; + var newProperty = wrapSingle(newValuePlaceholder); + var component; + var mayOverride; + var i, l; + + populateComponents([newProperty], validator, []); + + for (i = 0, l = descriptor.components.length; i < l; i++) { + component = components[descriptor.components[i]]; + mayOverride = compactable[component.name].canOverride; + + if ( + !everyValuesPair( + mayOverride.bind(null, validator), + newProperty.components[i], + component + ) + ) { + return false; + } + } + + return true; + } + + function mergeable(components) { + var lastCount = null; + var currentCount; + var componentName; + var component; + var descriptor; + var values; + + for (componentName in components) { + component = components[componentName]; + descriptor = compactable[componentName]; + + if (!("restore" in descriptor)) { + continue; + } + + restoreFromOptimizing( + [component.all[component.position]], + restoreWithComponents + ); + values = descriptor.restore(component, compactable); + + currentCount = values.length; + + if (lastCount !== null && currentCount !== lastCount) { + return false; + } + + lastCount = currentCount; + } + + return true; + } + + function mixedInherit(components) { + var componentName; + var lastValue = null; + var currentValue; + + for (componentName in components) { + currentValue = hasInherit(components[componentName]); + + if (lastValue !== null && lastValue !== currentValue) { + return true; + } + + lastValue = currentValue; + } + + return false; + } + + function replaceWithInheritBestFit( + properties, + candidateComponents, + shorthandName, + validator + ) { + var viaLonghands = buildSequenceWithInheritLonghands( + candidateComponents, + shorthandName, + validator + ); + var viaShorthand = buildSequenceWithInheritShorthand( + candidateComponents, + shorthandName, + validator + ); + var longhandTokensSequence = viaLonghands[0]; + var shorthandTokensSequence = viaShorthand[0]; + var isLonghandsShorter = + serializeBody(longhandTokensSequence).length < + serializeBody(shorthandTokensSequence).length; + var newTokensSequence = isLonghandsShorter + ? longhandTokensSequence + : shorthandTokensSequence; + var newProperty = isLonghandsShorter + ? viaLonghands[1] + : viaShorthand[1]; + var newComponents = isLonghandsShorter + ? viaLonghands[2] + : viaShorthand[2]; + var all = + candidateComponents[Object.keys(candidateComponents)[0]].all; + var componentName; + var oldComponent; + var newComponent; + var newToken; + + newProperty.position = all.length; + newProperty.shorthand = true; + newProperty.dirty = true; + newProperty.all = all; + newProperty.all.push(newTokensSequence[0]); + + properties.push(newProperty); + + for (componentName in candidateComponents) { + oldComponent = candidateComponents[componentName]; + oldComponent.unused = true; + + if (oldComponent.name in newComponents) { + newComponent = newComponents[oldComponent.name]; + newToken = findTokenIn(newTokensSequence, componentName); + + newComponent.position = all.length; + newComponent.all = all; + newComponent.all.push(newToken); + + properties.push(newComponent); + } + } + } + + function buildSequenceWithInheritLonghands( + components, + shorthandName, + validator + ) { + var tokensSequence = []; + var inheritComponents = {}; + var nonInheritComponents = {}; + var descriptor = compactable[shorthandName]; + var shorthandToken = [ + Token.PROPERTY, + [Token.PROPERTY_NAME, shorthandName], + [Token.PROPERTY_VALUE, descriptor.defaultValue] + ]; + var newProperty = wrapSingle(shorthandToken); + var component; + var longhandToken; + var newComponent; + var nameMetadata; + var i, l; + + populateComponents([newProperty], validator, []); + + for (i = 0, l = descriptor.components.length; i < l; i++) { + component = components[descriptor.components[i]]; + + if (hasInherit(component)) { + longhandToken = component.all[component.position].slice(0, 2); + Array.prototype.push.apply(longhandToken, component.value); + tokensSequence.push(longhandToken); + + newComponent = deepClone(component); + newComponent.value = inferComponentValue( + components, + newComponent.name + ); + + newProperty.components[i] = newComponent; + inheritComponents[component.name] = deepClone(component); + } else { + newComponent = deepClone(component); + newComponent.all = component.all; + newProperty.components[i] = newComponent; + + nonInheritComponents[component.name] = component; + } + } + + nameMetadata = joinMetadata(nonInheritComponents, 1); + shorthandToken[1].push(nameMetadata); + + restoreFromOptimizing([newProperty], restoreWithComponents); + + shorthandToken = shorthandToken.slice(0, 2); + Array.prototype.push.apply(shorthandToken, newProperty.value); + + tokensSequence.unshift(shorthandToken); + + return [tokensSequence, newProperty, inheritComponents]; + } + + function inferComponentValue(components, propertyName) { + var descriptor = compactable[propertyName]; + + if ("oppositeTo" in descriptor) { + return components[descriptor.oppositeTo].value; + } else { + return [[Token.PROPERTY_VALUE, descriptor.defaultValue]]; + } + } + + function joinMetadata(components, at) { + var metadata = []; + var component; + var originalValue; + var componentMetadata; + var componentName; + + for (componentName in components) { + component = components[componentName]; + originalValue = component.all[component.position]; + componentMetadata = originalValue[at][originalValue[at].length - 1]; + + Array.prototype.push.apply(metadata, componentMetadata); + } + + return metadata.sort(metadataSorter); + } + + function metadataSorter(metadata1, metadata2) { + var line1 = metadata1[0]; + var line2 = metadata2[0]; + var column1 = metadata1[1]; + var column2 = metadata2[1]; + + if (line1 < line2) { + return -1; + } else if (line1 === line2) { + return column1 < column2 ? -1 : 1; + } else { + return 1; + } + } + + function buildSequenceWithInheritShorthand( + components, + shorthandName, + validator + ) { + var tokensSequence = []; + var inheritComponents = {}; + var nonInheritComponents = {}; + var descriptor = compactable[shorthandName]; + var shorthandToken = [ + Token.PROPERTY, + [Token.PROPERTY_NAME, shorthandName], + [Token.PROPERTY_VALUE, "inherit"] + ]; + var newProperty = wrapSingle(shorthandToken); + var component; + var longhandToken; + var nameMetadata; + var valueMetadata; + var i, l; + + populateComponents([newProperty], validator, []); + + for (i = 0, l = descriptor.components.length; i < l; i++) { + component = components[descriptor.components[i]]; + + if (hasInherit(component)) { + inheritComponents[component.name] = component; + } else { + longhandToken = component.all[component.position].slice(0, 2); + Array.prototype.push.apply(longhandToken, component.value); + tokensSequence.push(longhandToken); + + nonInheritComponents[component.name] = deepClone(component); + } + } + + nameMetadata = joinMetadata(inheritComponents, 1); + shorthandToken[1].push(nameMetadata); + + valueMetadata = joinMetadata(inheritComponents, 2); + shorthandToken[2].push(valueMetadata); + + tokensSequence.unshift(shorthandToken); + + return [tokensSequence, newProperty, nonInheritComponents]; + } + + function findTokenIn(tokens, componentName) { + var i, l; + + for (i = 0, l = tokens.length; i < l; i++) { + if (tokens[i][1][1] == componentName) { + return tokens[i]; + } + } + } + + function replaceWithShorthand( + properties, + candidateComponents, + shorthandName, + validator + ) { + var descriptor = compactable[shorthandName]; + var nameMetadata; + var valueMetadata; + var newValuePlaceholder = [ + Token.PROPERTY, + [Token.PROPERTY_NAME, shorthandName], + [Token.PROPERTY_VALUE, descriptor.defaultValue] + ]; + var all; + + var newProperty = wrapSingle(newValuePlaceholder); + newProperty.shorthand = true; + newProperty.dirty = true; + + populateComponents([newProperty], validator, []); + + for (var i = 0, l = descriptor.components.length; i < l; i++) { + var component = candidateComponents[descriptor.components[i]]; + + newProperty.components[i] = deepClone(component); + newProperty.important = component.important; + + all = component.all; + } + + for (var componentName in candidateComponents) { + candidateComponents[componentName].unused = true; + } + + nameMetadata = joinMetadata(candidateComponents, 1); + newValuePlaceholder[1].push(nameMetadata); + + valueMetadata = joinMetadata(candidateComponents, 2); + newValuePlaceholder[2].push(valueMetadata); + + newProperty.position = all.length; + newProperty.all = all; + newProperty.all.push(newValuePlaceholder); + + properties.push(newProperty); + } + + module.exports = mergeIntoShorthands; + }, + { + "../../../tokenizer/token": 84, + "../../../writer/one-time": 98, + "../../restore-from-optimizing": 56, + "../../wrap-for-optimizing": 58, + "../clone": 20, + "../compactable": 21, + "../restore-with-components": 48, + "./every-values-pair": 30, + "./has-inherit": 32, + "./populate-components": 39 + } + ], + 36: [ + function(require, module, exports) { + var mergeIntoShorthands = require("./merge-into-shorthands"); + var overrideProperties = require("./override-properties"); + var populateComponents = require("./populate-components"); + + var restoreWithComponents = require("../restore-with-components"); + + var wrapForOptimizing = require("../../wrap-for-optimizing").all; + var removeUnused = require("../../remove-unused"); + var restoreFromOptimizing = require("../../restore-from-optimizing"); + + var OptimizationLevel = require("../../../options/optimization-level") + .OptimizationLevel; + + function optimizeProperties( + properties, + withOverriding, + withMerging, + context + ) { + var levelOptions = context.options.level[OptimizationLevel.Two]; + var _properties = wrapForOptimizing( + properties, + false, + levelOptions.skipProperties + ); + var _property; + var i, l; + + populateComponents(_properties, context.validator, context.warnings); + + for (i = 0, l = _properties.length; i < l; i++) { + _property = _properties[i]; + if (_property.block) { + optimizeProperties( + _property.value[0][1], + withOverriding, + withMerging, + context + ); + } + } + + if (withMerging && levelOptions.mergeIntoShorthands) { + mergeIntoShorthands(_properties, context.validator); + } + + if (withOverriding && levelOptions.overrideProperties) { + overrideProperties( + _properties, + withMerging, + context.options.compatibility, + context.validator + ); + } + + restoreFromOptimizing(_properties, restoreWithComponents); + removeUnused(_properties); + } + + module.exports = optimizeProperties; + }, + { + "../../../options/optimization-level": 65, + "../../remove-unused": 55, + "../../restore-from-optimizing": 56, + "../../wrap-for-optimizing": 58, + "../restore-with-components": 48, + "./merge-into-shorthands": 35, + "./override-properties": 37, + "./populate-components": 39 + } + ], + 37: [ + function(require, module, exports) { + var hasInherit = require("./has-inherit"); + var everyValuesPair = require("./every-values-pair"); + var findComponentIn = require("./find-component-in"); + var isComponentOf = require("./is-component-of"); + var isMergeableShorthand = require("./is-mergeable-shorthand"); + var overridesNonComponentShorthand = require("./overrides-non-component-shorthand"); + var sameVendorPrefixesIn = require("./vendor-prefixes").same; + + var compactable = require("../compactable"); + var deepClone = require("../clone").deep; + var restoreWithComponents = require("../restore-with-components"); + var shallowClone = require("../clone").shallow; + + var restoreFromOptimizing = require("../../restore-from-optimizing"); + + var Token = require("../../../tokenizer/token"); + var Marker = require("../../../tokenizer/marker"); + + var serializeProperty = require("../../../writer/one-time").property; + + function wouldBreakCompatibility(property, validator) { + for (var i = 0; i < property.components.length; i++) { + var component = property.components[i]; + var descriptor = compactable[component.name]; + var canOverride = + (descriptor && descriptor.canOverride) || canOverride.sameValue; + + var _component = shallowClone(component); + _component.value = [ + [Token.PROPERTY_VALUE, descriptor.defaultValue] + ]; + + if ( + !everyValuesPair( + canOverride.bind(null, validator), + _component, + component + ) + ) { + return true; + } + } + + return false; + } + + function overrideIntoMultiplex(property, by) { + by.unused = true; + + turnIntoMultiplex(by, multiplexSize(property)); + property.value = by.value; + } + + function overrideByMultiplex(property, by) { + by.unused = true; + property.multiplex = true; + property.value = by.value; + } + + function overrideSimple(property, by) { + by.unused = true; + property.value = by.value; + } + + function override(property, by) { + if (by.multiplex) overrideByMultiplex(property, by); + else if (property.multiplex) overrideIntoMultiplex(property, by); + else overrideSimple(property, by); + } + + function overrideShorthand(property, by) { + by.unused = true; + + for (var i = 0, l = property.components.length; i < l; i++) { + override( + property.components[i], + by.components[i], + property.multiplex + ); + } + } + + function turnIntoMultiplex(property, size) { + property.multiplex = true; + + if (compactable[property.name].shorthand) { + turnShorthandValueIntoMultiplex(property, size); + } else { + turnLonghandValueIntoMultiplex(property, size); + } + } + + function turnShorthandValueIntoMultiplex(property, size) { + var component; + var i, l; + + for (i = 0, l = property.components.length; i < l; i++) { + component = property.components[i]; + + if (!component.multiplex) { + turnLonghandValueIntoMultiplex(component, size); + } + } + } + + function turnLonghandValueIntoMultiplex(property, size) { + var descriptor = compactable[property.name]; + var withRealValue = descriptor.intoMultiplexMode == "real"; + var withValue = + descriptor.intoMultiplexMode == "real" + ? property.value.slice(0) + : descriptor.intoMultiplexMode == "placeholder" + ? descriptor.placeholderValue + : descriptor.defaultValue; + var i = multiplexSize(property); + var j; + var m = withValue.length; + + for (; i < size; i++) { + property.value.push([Token.PROPERTY_VALUE, Marker.COMMA]); + + if (Array.isArray(withValue)) { + for (j = 0; j < m; j++) { + property.value.push( + withRealValue + ? withValue[j] + : [Token.PROPERTY_VALUE, withValue[j]] + ); + } + } else { + property.value.push( + withRealValue ? withValue : [Token.PROPERTY_VALUE, withValue] + ); + } + } + } + + function multiplexSize(component) { + var size = 0; + + for (var i = 0, l = component.value.length; i < l; i++) { + if (component.value[i][1] == Marker.COMMA) size++; + } + + return size + 1; + } + + function lengthOf(property) { + var fakeAsArray = [ + Token.PROPERTY, + [Token.PROPERTY_NAME, property.name] + ].concat(property.value); + return serializeProperty([fakeAsArray], 0).length; + } + + function moreSameShorthands(properties, startAt, name) { + // Since we run the main loop in `compactOverrides` backwards, at this point some + // properties may not be marked as unused. + // We should consider reverting the order if possible + var count = 0; + + for (var i = startAt; i >= 0; i--) { + if (properties[i].name == name && !properties[i].unused) count++; + if (count > 1) break; + } + + return count > 1; + } + + function overridingFunction(shorthand, validator) { + for (var i = 0, l = shorthand.components.length; i < l; i++) { + if ( + !anyValue(validator.isUrl, shorthand.components[i]) && + anyValue(validator.isFunction, shorthand.components[i]) + ) { + return true; + } + } + + return false; + } + + function anyValue(fn, property) { + for (var i = 0, l = property.value.length; i < l; i++) { + if (property.value[i][1] == Marker.COMMA) continue; + + if (fn(property.value[i][1])) return true; + } + + return false; + } + + function wouldResultInLongerValue(left, right) { + if ( + (!left.multiplex && !right.multiplex) || + (left.multiplex && right.multiplex) + ) + return false; + + var multiplex = left.multiplex ? left : right; + var simple = left.multiplex ? right : left; + var component; + + var multiplexClone = deepClone(multiplex); + restoreFromOptimizing([multiplexClone], restoreWithComponents); + + var simpleClone = deepClone(simple); + restoreFromOptimizing([simpleClone], restoreWithComponents); + + var lengthBefore = + lengthOf(multiplexClone) + 1 + lengthOf(simpleClone); + + if (left.multiplex) { + component = findComponentIn(multiplexClone, simpleClone); + overrideIntoMultiplex(component, simpleClone); + } else { + component = findComponentIn(simpleClone, multiplexClone); + turnIntoMultiplex(simpleClone, multiplexSize(multiplexClone)); + overrideByMultiplex(component, multiplexClone); + } + + restoreFromOptimizing([simpleClone], restoreWithComponents); + + var lengthAfter = lengthOf(simpleClone); + + return lengthBefore <= lengthAfter; + } + + function isCompactable(property) { + return property.name in compactable; + } + + function noneOverrideHack(left, right) { + return ( + !left.multiplex && + (left.name == "background" || left.name == "background-image") && + right.multiplex && + (right.name == "background" || right.name == "background-image") && + anyLayerIsNone(right.value) + ); + } + + function anyLayerIsNone(values) { + var layers = intoLayers(values); + + for (var i = 0, l = layers.length; i < l; i++) { + if (layers[i].length == 1 && layers[i][0][1] == "none") return true; + } + + return false; + } + + function intoLayers(values) { + var layers = []; + + for (var i = 0, layer = [], l = values.length; i < l; i++) { + var value = values[i]; + if (value[1] == Marker.COMMA) { + layers.push(layer); + layer = []; + } else { + layer.push(value); + } + } + + layers.push(layer); + return layers; + } + + function overrideProperties( + properties, + withMerging, + compatibility, + validator + ) { + var mayOverride, right, left, component; + var overriddenComponents; + var overriddenComponent; + var overridingComponent; + var overridable; + var i, j, k; + + propertyLoop: for (i = properties.length - 1; i >= 0; i--) { + right = properties[i]; + + if (!isCompactable(right)) continue; + + if (right.block) continue; + + mayOverride = compactable[right.name].canOverride; + + traverseLoop: for (j = i - 1; j >= 0; j--) { + left = properties[j]; + + if (!isCompactable(left)) continue; + + if (left.block) continue; + + if (left.unused || right.unused) continue; + + if ( + (left.hack && !right.hack && !right.important) || + (!left.hack && !left.important && right.hack) + ) + continue; + + if ( + left.important == right.important && + left.hack[0] != right.hack[0] + ) + continue; + + if ( + left.important == right.important && + (left.hack[0] != right.hack[0] || + (left.hack[1] && left.hack[1] != right.hack[1])) + ) + continue; + + if (hasInherit(right)) continue; + + if (noneOverrideHack(left, right)) continue; + + if (right.shorthand && isComponentOf(right, left)) { + // maybe `left` can be overridden by `right` which is a shorthand? + if (!right.important && left.important) continue; + + if (!sameVendorPrefixesIn([left], right.components)) continue; + + if ( + !anyValue(validator.isFunction, left) && + overridingFunction(right, validator) + ) + continue; + + if (!isMergeableShorthand(right)) { + left.unused = true; + continue; + } + + component = findComponentIn(right, left); + mayOverride = compactable[left.name].canOverride; + if ( + everyValuesPair( + mayOverride.bind(null, validator), + left, + component + ) + ) { + left.unused = true; + } + } else if ( + right.shorthand && + overridesNonComponentShorthand(right, left) + ) { + // `right` is a shorthand while `left` can be overriden by it, think `border` and `border-top` + if (!right.important && left.important) { + continue; + } + + if (!sameVendorPrefixesIn([left], right.components)) { + continue; + } + + if ( + !anyValue(validator.isFunction, left) && + overridingFunction(right, validator) + ) { + continue; + } + + overriddenComponents = left.shorthand + ? left.components + : [left]; + + for (k = overriddenComponents.length - 1; k >= 0; k--) { + overriddenComponent = overriddenComponents[k]; + overridingComponent = findComponentIn( + right, + overriddenComponent + ); + mayOverride = + compactable[overriddenComponent.name].canOverride; + + if ( + !everyValuesPair( + mayOverride.bind(null, validator), + left, + overridingComponent + ) + ) { + continue traverseLoop; + } + } + + left.unused = true; + } else if ( + withMerging && + left.shorthand && + !right.shorthand && + isComponentOf(left, right, true) + ) { + // maybe `right` can be pulled into `left` which is a shorthand? + if (right.important && !left.important) continue; + + if (!right.important && left.important) { + right.unused = true; + continue; + } + + // Pending more clever algorithm in #527 + if (moreSameShorthands(properties, i - 1, left.name)) continue; + + if (overridingFunction(left, validator)) continue; + + if (!isMergeableShorthand(left)) continue; + + component = findComponentIn(left, right); + if ( + everyValuesPair( + mayOverride.bind(null, validator), + component, + right + ) + ) { + var disabledBackgroundMerging = + (!compatibility.properties.backgroundClipMerging && + component.name.indexOf("background-clip") > -1) || + (!compatibility.properties.backgroundOriginMerging && + component.name.indexOf("background-origin") > -1) || + (!compatibility.properties.backgroundSizeMerging && + component.name.indexOf("background-size") > -1); + var nonMergeableValue = + compactable[right.name].nonMergeableValue === + right.value[0][1]; + + if (disabledBackgroundMerging || nonMergeableValue) continue; + + if ( + !compatibility.properties.merging && + wouldBreakCompatibility(left, validator) + ) + continue; + + if ( + component.value[0][1] != right.value[0][1] && + (hasInherit(left) || hasInherit(right)) + ) + continue; + + if (wouldResultInLongerValue(left, right)) continue; + + if (!left.multiplex && right.multiplex) + turnIntoMultiplex(left, multiplexSize(right)); + + override(component, right); + left.dirty = true; + } + } else if ( + withMerging && + left.shorthand && + right.shorthand && + left.name == right.name + ) { + // merge if all components can be merged + + if (!left.multiplex && right.multiplex) continue; + + if (!right.important && left.important) { + right.unused = true; + continue propertyLoop; + } + + if (right.important && !left.important) { + left.unused = true; + continue; + } + + if (!isMergeableShorthand(right)) { + left.unused = true; + continue; + } + + for (k = left.components.length - 1; k >= 0; k--) { + var leftComponent = left.components[k]; + var rightComponent = right.components[k]; + + mayOverride = compactable[leftComponent.name].canOverride; + if ( + !everyValuesPair( + mayOverride.bind(null, validator), + leftComponent, + rightComponent + ) + ) + continue propertyLoop; + } + + overrideShorthand(left, right); + left.dirty = true; + } else if ( + withMerging && + left.shorthand && + right.shorthand && + isComponentOf(left, right) + ) { + // border is a shorthand but any of its components is a shorthand too + + if (!left.important && right.important) continue; + + component = findComponentIn(left, right); + mayOverride = compactable[right.name].canOverride; + if ( + !everyValuesPair( + mayOverride.bind(null, validator), + component, + right + ) + ) + continue; + + if (left.important && !right.important) { + right.unused = true; + continue; + } + + var rightRestored = compactable[right.name].restore( + right, + compactable + ); + if (rightRestored.length > 1) continue; + + component = findComponentIn(left, right); + override(component, right); + right.dirty = true; + } else if (left.name == right.name) { + // two non-shorthands should be merged based on understandability + overridable = true; + + if (right.shorthand) { + for ( + k = right.components.length - 1; + k >= 0 && overridable; + k-- + ) { + overriddenComponent = left.components[k]; + overridingComponent = right.components[k]; + mayOverride = + compactable[overridingComponent.name].canOverride; + + overridable = + overridable && + everyValuesPair( + mayOverride.bind(null, validator), + overriddenComponent, + overridingComponent + ); + } + } else { + mayOverride = compactable[right.name].canOverride; + overridable = everyValuesPair( + mayOverride.bind(null, validator), + left, + right + ); + } + + if (left.important && !right.important && overridable) { + right.unused = true; + continue; + } + + if (!left.important && right.important && overridable) { + left.unused = true; + continue; + } + + if (!overridable) { + continue; + } + + left.unused = true; + } + } + } + } + + module.exports = overrideProperties; + }, + { + "../../../tokenizer/marker": 83, + "../../../tokenizer/token": 84, + "../../../writer/one-time": 98, + "../../restore-from-optimizing": 56, + "../clone": 20, + "../compactable": 21, + "../restore-with-components": 48, + "./every-values-pair": 30, + "./find-component-in": 31, + "./has-inherit": 32, + "./is-component-of": 33, + "./is-mergeable-shorthand": 34, + "./overrides-non-component-shorthand": 38, + "./vendor-prefixes": 41 + } + ], + 38: [ + function(require, module, exports) { + var compactable = require("../compactable"); + + function overridesNonComponentShorthand(property1, property2) { + return ( + property1.name in compactable && + "overridesShorthands" in compactable[property1.name] && + compactable[property1.name].overridesShorthands.indexOf( + property2.name + ) > -1 + ); + } + + module.exports = overridesNonComponentShorthand; + }, + { "../compactable": 21 } + ], + 39: [ + function(require, module, exports) { + var compactable = require("../compactable"); + var InvalidPropertyError = require("../invalid-property-error"); + + function populateComponents(properties, validator, warnings) { + var component; + var j, m; + + for (var i = properties.length - 1; i >= 0; i--) { + var property = properties[i]; + var descriptor = compactable[property.name]; + + if (descriptor && descriptor.shorthand) { + property.shorthand = true; + property.dirty = true; + + try { + property.components = descriptor.breakUp( + property, + compactable, + validator + ); + + if (descriptor.shorthandComponents) { + for (j = 0, m = property.components.length; j < m; j++) { + component = property.components[j]; + component.components = compactable[component.name].breakUp( + component, + compactable, + validator + ); + } + } + } catch (e) { + if (e instanceof InvalidPropertyError) { + property.components = []; // this will set property.unused to true below + warnings.push(e.message); + } else { + throw e; + } + } + + if (property.components.length > 0) + property.multiplex = property.components[0].multiplex; + else property.unused = true; + } + } + } + + module.exports = populateComponents; + }, + { "../compactable": 21, "../invalid-property-error": 23 } + ], + 40: [ + function(require, module, exports) { + var sameVendorPrefixes = require("./vendor-prefixes").same; + + function understandable( + validator, + value1, + value2, + _position, + isPaired + ) { + if (!sameVendorPrefixes(value1, value2)) { + return false; + } + + if ( + isPaired && + validator.isVariable(value1) !== validator.isVariable(value2) + ) { + return false; + } + + return true; + } + + module.exports = understandable; + }, + { "./vendor-prefixes": 41 } + ], + 41: [ + function(require, module, exports) { + var VENDOR_PREFIX_PATTERN = /(?:^|\W)(\-\w+\-)/g; + + function unique(value) { + var prefixes = []; + var match; + + while ((match = VENDOR_PREFIX_PATTERN.exec(value)) !== null) { + if (prefixes.indexOf(match[0]) == -1) { + prefixes.push(match[0]); + } + } + + return prefixes; + } + + function same(value1, value2) { + return ( + unique(value1) + .sort() + .join(",") == + unique(value2) + .sort() + .join(",") + ); + } + + module.exports = { + unique: unique, + same: same + }; + }, + {} + ], + 42: [ + function(require, module, exports) { + var isMergeable = require("./is-mergeable"); + + var optimizeProperties = require("./properties/optimize"); + + var cloneArray = require("../../utils/clone-array"); + + var Token = require("../../tokenizer/token"); + + var serializeBody = require("../../writer/one-time").body; + var serializeRules = require("../../writer/one-time").rules; + + function reduceNonAdjacent(tokens, context) { + var options = context.options; + var mergeablePseudoClasses = + options.compatibility.selectors.mergeablePseudoClasses; + var mergeablePseudoElements = + options.compatibility.selectors.mergeablePseudoElements; + var multiplePseudoMerging = + options.compatibility.selectors.multiplePseudoMerging; + var candidates = {}; + var repeated = []; + + for (var i = tokens.length - 1; i >= 0; i--) { + var token = tokens[i]; + + if (token[0] != Token.RULE) { + continue; + } else if (token[2].length === 0) { + continue; + } + + var selectorAsString = serializeRules(token[1]); + var isComplexAndNotSpecial = + token[1].length > 1 && + isMergeable( + selectorAsString, + mergeablePseudoClasses, + mergeablePseudoElements, + multiplePseudoMerging + ); + var wrappedSelectors = wrappedSelectorsFrom(token[1]); + var selectors = isComplexAndNotSpecial + ? [selectorAsString].concat(wrappedSelectors) + : [selectorAsString]; + + for (var j = 0, m = selectors.length; j < m; j++) { + var selector = selectors[j]; + + if (!candidates[selector]) candidates[selector] = []; + else repeated.push(selector); + + candidates[selector].push({ + where: i, + list: wrappedSelectors, + isPartial: isComplexAndNotSpecial && j > 0, + isComplex: isComplexAndNotSpecial && j === 0 + }); + } + } + + reduceSimpleNonAdjacentCases( + tokens, + repeated, + candidates, + options, + context + ); + reduceComplexNonAdjacentCases(tokens, candidates, options, context); + } + + function wrappedSelectorsFrom(list) { + var wrapped = []; + + for (var i = 0; i < list.length; i++) { + wrapped.push([list[i][1]]); + } + + return wrapped; + } + + function reduceSimpleNonAdjacentCases( + tokens, + repeated, + candidates, + options, + context + ) { + function filterOut(idx, bodies) { + return data[idx].isPartial && bodies.length === 0; + } + + function reduceBody(token, newBody, processedCount, tokenIdx) { + if (!data[processedCount - tokenIdx - 1].isPartial) + token[2] = newBody; + } + + for (var i = 0, l = repeated.length; i < l; i++) { + var selector = repeated[i]; + var data = candidates[selector]; + + reduceSelector( + tokens, + data, + { + filterOut: filterOut, + callback: reduceBody + }, + options, + context + ); + } + } + + function reduceComplexNonAdjacentCases( + tokens, + candidates, + options, + context + ) { + var mergeablePseudoClasses = + options.compatibility.selectors.mergeablePseudoClasses; + var mergeablePseudoElements = + options.compatibility.selectors.mergeablePseudoElements; + var multiplePseudoMerging = + options.compatibility.selectors.multiplePseudoMerging; + var localContext = {}; + + function filterOut(idx) { + return localContext.data[idx].where < localContext.intoPosition; + } + + function collectReducedBodies( + token, + newBody, + processedCount, + tokenIdx + ) { + if (tokenIdx === 0) localContext.reducedBodies.push(newBody); + } + + allSelectors: for (var complexSelector in candidates) { + var into = candidates[complexSelector]; + if (!into[0].isComplex) continue; + + var intoPosition = into[into.length - 1].where; + var intoToken = tokens[intoPosition]; + var reducedBodies = []; + + var selectors = isMergeable( + complexSelector, + mergeablePseudoClasses, + mergeablePseudoElements, + multiplePseudoMerging + ) + ? into[0].list + : [complexSelector]; + + localContext.intoPosition = intoPosition; + localContext.reducedBodies = reducedBodies; + + for (var j = 0, m = selectors.length; j < m; j++) { + var selector = selectors[j]; + var data = candidates[selector]; + + if (data.length < 2) continue allSelectors; + + localContext.data = data; + + reduceSelector( + tokens, + data, + { + filterOut: filterOut, + callback: collectReducedBodies + }, + options, + context + ); + + if ( + serializeBody(reducedBodies[reducedBodies.length - 1]) != + serializeBody(reducedBodies[0]) + ) + continue allSelectors; + } + + intoToken[2] = reducedBodies[0]; + } + } + + function reduceSelector(tokens, data, context, options, outerContext) { + var bodies = []; + var bodiesAsList = []; + var processedTokens = []; + + for (var j = data.length - 1; j >= 0; j--) { + if (context.filterOut(j, bodies)) continue; + + var where = data[j].where; + var token = tokens[where]; + var clonedBody = cloneArray(token[2]); + + bodies = bodies.concat(clonedBody); + bodiesAsList.push(clonedBody); + processedTokens.push(where); + } + + optimizeProperties(bodies, true, false, outerContext); + + var processedCount = processedTokens.length; + var propertyIdx = bodies.length - 1; + var tokenIdx = processedCount - 1; + + while (tokenIdx >= 0) { + if ( + (tokenIdx === 0 || + (bodies[propertyIdx] && + bodiesAsList[tokenIdx].indexOf(bodies[propertyIdx]) > -1)) && + propertyIdx > -1 + ) { + propertyIdx--; + continue; + } + + var newBody = bodies.splice(propertyIdx + 1); + context.callback( + tokens[processedTokens[tokenIdx]], + newBody, + processedCount, + tokenIdx + ); + + tokenIdx--; + } + } + + module.exports = reduceNonAdjacent; + }, + { + "../../tokenizer/token": 84, + "../../utils/clone-array": 86, + "../../writer/one-time": 98, + "./is-mergeable": 24, + "./properties/optimize": 36 + } + ], + 43: [ + function(require, module, exports) { + var Token = require("../../tokenizer/token"); + + var serializeAll = require("../../writer/one-time").all; + + var FONT_FACE_SCOPE = "@font-face"; + + function removeDuplicateFontAtRules(tokens) { + var fontAtRules = []; + var token; + var key; + var i, l; + + for (i = 0, l = tokens.length; i < l; i++) { + token = tokens[i]; + + if ( + token[0] != Token.AT_RULE_BLOCK && + token[1][0][1] != FONT_FACE_SCOPE + ) { + continue; + } + + key = serializeAll([token]); + + if (fontAtRules.indexOf(key) > -1) { + token[2] = []; + } else { + fontAtRules.push(key); + } + } + } + + module.exports = removeDuplicateFontAtRules; + }, + { "../../tokenizer/token": 84, "../../writer/one-time": 98 } + ], + 44: [ + function(require, module, exports) { + var Token = require("../../tokenizer/token"); + + var serializeAll = require("../../writer/one-time").all; + var serializeRules = require("../../writer/one-time").rules; + + function removeDuplicateMediaQueries(tokens) { + var candidates = {}; + var candidate; + var token; + var key; + var i, l; + + for (i = 0, l = tokens.length; i < l; i++) { + token = tokens[i]; + if (token[0] != Token.NESTED_BLOCK) { + continue; + } + + key = serializeRules(token[1]) + "%" + serializeAll(token[2]); + candidate = candidates[key]; + + if (candidate) { + candidate[2] = []; + } + + candidates[key] = token; + } + } + + module.exports = removeDuplicateMediaQueries; + }, + { "../../tokenizer/token": 84, "../../writer/one-time": 98 } + ], + 45: [ + function(require, module, exports) { + var Token = require("../../tokenizer/token"); + + var serializeBody = require("../../writer/one-time").body; + var serializeRules = require("../../writer/one-time").rules; + + function removeDuplicates(tokens) { + var matched = {}; + var moreThanOnce = []; + var id, token; + var body, bodies; + + for (var i = 0, l = tokens.length; i < l; i++) { + token = tokens[i]; + if (token[0] != Token.RULE) continue; + + id = serializeRules(token[1]); + + if (matched[id] && matched[id].length == 1) moreThanOnce.push(id); + else matched[id] = matched[id] || []; + + matched[id].push(i); + } + + for (i = 0, l = moreThanOnce.length; i < l; i++) { + id = moreThanOnce[i]; + bodies = []; + + for (var j = matched[id].length - 1; j >= 0; j--) { + token = tokens[matched[id][j]]; + body = serializeBody(token[2]); + + if (bodies.indexOf(body) > -1) token[2] = []; + else bodies.push(body); + } + } + } + + module.exports = removeDuplicates; + }, + { "../../tokenizer/token": 84, "../../writer/one-time": 98 } + ], + 46: [ + function(require, module, exports) { + var populateComponents = require("./properties/populate-components"); + + var wrapForOptimizing = require("../wrap-for-optimizing").single; + var restoreFromOptimizing = require("../restore-from-optimizing"); + + var Token = require("../../tokenizer/token"); + + var animationNameRegex = /^(\-moz\-|\-o\-|\-webkit\-)?animation-name$/; + var animationRegex = /^(\-moz\-|\-o\-|\-webkit\-)?animation$/; + var keyframeRegex = /^@(\-moz\-|\-o\-|\-webkit\-)?keyframes /; + var importantRegex = /\s{0,31}!important$/; + var optionalMatchingQuotesRegex = /^(['"]?)(.*)\1$/; + + function normalize(value) { + return value + .replace(optionalMatchingQuotesRegex, "$2") + .replace(importantRegex, ""); + } + + function removeUnusedAtRules(tokens, context) { + removeUnusedAtRule( + tokens, + matchCounterStyle, + markCounterStylesAsUsed, + context + ); + removeUnusedAtRule( + tokens, + matchFontFace, + markFontFacesAsUsed, + context + ); + removeUnusedAtRule( + tokens, + matchKeyframe, + markKeyframesAsUsed, + context + ); + removeUnusedAtRule( + tokens, + matchNamespace, + markNamespacesAsUsed, + context + ); + } + + function removeUnusedAtRule( + tokens, + matchCallback, + markCallback, + context + ) { + var atRules = {}; + var atRule; + var atRuleTokens; + var atRuleToken; + var zeroAt; + var i, l; + + for (i = 0, l = tokens.length; i < l; i++) { + matchCallback(tokens[i], atRules); + } + + if (Object.keys(atRules).length === 0) { + return; + } + + markUsedAtRules(tokens, markCallback, atRules, context); + + for (atRule in atRules) { + atRuleTokens = atRules[atRule]; + + for (i = 0, l = atRuleTokens.length; i < l; i++) { + atRuleToken = atRuleTokens[i]; + zeroAt = atRuleToken[0] == Token.AT_RULE ? 1 : 2; + atRuleToken[zeroAt] = []; + } + } + } + + function markUsedAtRules(tokens, markCallback, atRules, context) { + var boundMarkCallback = markCallback(atRules); + var i, l; + + for (i = 0, l = tokens.length; i < l; i++) { + switch (tokens[i][0]) { + case Token.RULE: + boundMarkCallback(tokens[i], context); + break; + case Token.NESTED_BLOCK: + markUsedAtRules(tokens[i][2], markCallback, atRules, context); + } + } + } + + function matchCounterStyle(token, atRules) { + var match; + + if ( + token[0] == Token.AT_RULE_BLOCK && + token[1][0][1].indexOf("@counter-style") === 0 + ) { + match = token[1][0][1].split(" ")[1]; + atRules[match] = atRules[match] || []; + atRules[match].push(token); + } + } + + function markCounterStylesAsUsed(atRules) { + return function(token, context) { + var property; + var wrappedProperty; + var i, l; + + for (i = 0, l = token[2].length; i < l; i++) { + property = token[2][i]; + + if (property[1][1] == "list-style") { + wrappedProperty = wrapForOptimizing(property); + populateComponents( + [wrappedProperty], + context.validator, + context.warnings + ); + + if (wrappedProperty.components[0].value[0][1] in atRules) { + delete atRules[property[2][1]]; + } + + restoreFromOptimizing([wrappedProperty]); + } + + if ( + property[1][1] == "list-style-type" && + property[2][1] in atRules + ) { + delete atRules[property[2][1]]; + } + } + }; + } + + function matchFontFace(token, atRules) { + var property; + var match; + var i, l; + + if ( + token[0] == Token.AT_RULE_BLOCK && + token[1][0][1] == "@font-face" + ) { + for (i = 0, l = token[2].length; i < l; i++) { + property = token[2][i]; + + if (property[1][1] == "font-family") { + match = normalize(property[2][1].toLowerCase()); + atRules[match] = atRules[match] || []; + atRules[match].push(token); + break; + } + } + } + } + + function markFontFacesAsUsed(atRules) { + return function(token, context) { + var property; + var wrappedProperty; + var component; + var normalizedMatch; + var i, l; + var j, m; + + for (i = 0, l = token[2].length; i < l; i++) { + property = token[2][i]; + + if (property[1][1] == "font") { + wrappedProperty = wrapForOptimizing(property); + populateComponents( + [wrappedProperty], + context.validator, + context.warnings + ); + component = wrappedProperty.components[6]; + + for (j = 0, m = component.value.length; j < m; j++) { + normalizedMatch = normalize( + component.value[j][1].toLowerCase() + ); + + if (normalizedMatch in atRules) { + delete atRules[normalizedMatch]; + } + } + + restoreFromOptimizing([wrappedProperty]); + } + + if (property[1][1] == "font-family") { + for (j = 2, m = property.length; j < m; j++) { + normalizedMatch = normalize(property[j][1].toLowerCase()); + + if (normalizedMatch in atRules) { + delete atRules[normalizedMatch]; + } + } + } + } + }; + } + + function matchKeyframe(token, atRules) { + var match; + + if ( + token[0] == Token.NESTED_BLOCK && + keyframeRegex.test(token[1][0][1]) + ) { + match = token[1][0][1].split(" ")[1]; + atRules[match] = atRules[match] || []; + atRules[match].push(token); + } + } + + function markKeyframesAsUsed(atRules) { + return function(token, context) { + var property; + var wrappedProperty; + var component; + var i, l; + var j, m; + + for (i = 0, l = token[2].length; i < l; i++) { + property = token[2][i]; + + if (animationRegex.test(property[1][1])) { + wrappedProperty = wrapForOptimizing(property); + populateComponents( + [wrappedProperty], + context.validator, + context.warnings + ); + component = wrappedProperty.components[7]; + + for (j = 0, m = component.value.length; j < m; j++) { + if (component.value[j][1] in atRules) { + delete atRules[component.value[j][1]]; + } + } + + restoreFromOptimizing([wrappedProperty]); + } + + if (animationNameRegex.test(property[1][1])) { + for (j = 2, m = property.length; j < m; j++) { + if (property[j][1] in atRules) { + delete atRules[property[j][1]]; + } + } + } + } + }; + } + + function matchNamespace(token, atRules) { + var match; + + if ( + token[0] == Token.AT_RULE && + token[1].indexOf("@namespace") === 0 + ) { + match = token[1].split(" ")[1]; + atRules[match] = atRules[match] || []; + atRules[match].push(token); + } + } + + function markNamespacesAsUsed(atRules) { + var namespaceRegex = new RegExp( + Object.keys(atRules).join("\\||") + "\\|", + "g" + ); + + return function(token) { + var match; + var scope; + var normalizedMatch; + var i, l; + var j, m; + + for (i = 0, l = token[1].length; i < l; i++) { + scope = token[1][i]; + match = scope[1].match(namespaceRegex); + + for (j = 0, m = match.length; j < m; j++) { + normalizedMatch = match[j].substring(0, match[j].length - 1); + + if (normalizedMatch in atRules) { + delete atRules[normalizedMatch]; + } + } + } + }; + } + + module.exports = removeUnusedAtRules; + }, + { + "../../tokenizer/token": 84, + "../restore-from-optimizing": 56, + "../wrap-for-optimizing": 58, + "./properties/populate-components": 39 + } + ], + 47: [ + function(require, module, exports) { + // TODO: it'd be great to merge it with the other canReorder functionality + + var rulesOverlap = require("./rules-overlap"); + var specificitiesOverlap = require("./specificities-overlap"); + + var FLEX_PROPERTIES = /align\-items|box\-align|box\-pack|flex|justify/; + var BORDER_PROPERTIES = /^border\-(top|right|bottom|left|color|style|width|radius)/; + + function canReorder(left, right, cache) { + for (var i = right.length - 1; i >= 0; i--) { + for (var j = left.length - 1; j >= 0; j--) { + if (!canReorderSingle(left[j], right[i], cache)) return false; + } + } + + return true; + } + + function canReorderSingle(left, right, cache) { + var leftName = left[0]; + var leftValue = left[1]; + var leftNameRoot = left[2]; + var leftSelector = left[5]; + var leftInSpecificSelector = left[6]; + var rightName = right[0]; + var rightValue = right[1]; + var rightNameRoot = right[2]; + var rightSelector = right[5]; + var rightInSpecificSelector = right[6]; + + if ( + (leftName == "font" && rightName == "line-height") || + (rightName == "font" && leftName == "line-height") + ) + return false; + if (FLEX_PROPERTIES.test(leftName) && FLEX_PROPERTIES.test(rightName)) + return false; + if ( + leftNameRoot == rightNameRoot && + unprefixed(leftName) == unprefixed(rightName) && + vendorPrefixed(leftName) ^ vendorPrefixed(rightName) + ) + return false; + if ( + leftNameRoot == "border" && + BORDER_PROPERTIES.test(rightNameRoot) && + (leftName == "border" || + leftName == rightNameRoot || + (leftValue != rightValue && + sameBorderComponent(leftName, rightName))) + ) + return false; + if ( + rightNameRoot == "border" && + BORDER_PROPERTIES.test(leftNameRoot) && + (rightName == "border" || + rightName == leftNameRoot || + (leftValue != rightValue && + sameBorderComponent(leftName, rightName))) + ) + return false; + if ( + leftNameRoot == "border" && + rightNameRoot == "border" && + leftName != rightName && + ((isSideBorder(leftName) && isStyleBorder(rightName)) || + (isStyleBorder(leftName) && isSideBorder(rightName))) + ) + return false; + if (leftNameRoot != rightNameRoot) return true; + if ( + leftName == rightName && + leftNameRoot == rightNameRoot && + (leftValue == rightValue || + withDifferentVendorPrefix(leftValue, rightValue)) + ) + return true; + if ( + leftName != rightName && + leftNameRoot == rightNameRoot && + leftName != leftNameRoot && + rightName != rightNameRoot + ) + return true; + if ( + leftName != rightName && + leftNameRoot == rightNameRoot && + leftValue == rightValue + ) + return true; + if ( + rightInSpecificSelector && + leftInSpecificSelector && + !inheritable(leftNameRoot) && + !inheritable(rightNameRoot) && + !rulesOverlap(rightSelector, leftSelector, false) + ) + return true; + if (!specificitiesOverlap(leftSelector, rightSelector, cache)) + return true; + + return false; + } + + function vendorPrefixed(name) { + return /^\-(?:moz|webkit|ms|o)\-/.test(name); + } + + function unprefixed(name) { + return name.replace(/^\-(?:moz|webkit|ms|o)\-/, ""); + } + + function sameBorderComponent(name1, name2) { + return name1.split("-").pop() == name2.split("-").pop(); + } + + function isSideBorder(name) { + return ( + name == "border-top" || + name == "border-right" || + name == "border-bottom" || + name == "border-left" + ); + } + + function isStyleBorder(name) { + return ( + name == "border-color" || + name == "border-style" || + name == "border-width" + ); + } + + function withDifferentVendorPrefix(value1, value2) { + return ( + vendorPrefixed(value1) && + vendorPrefixed(value2) && + value1.split("-")[1] != value2.split("-")[2] + ); + } + + function inheritable(name) { + // According to http://www.w3.org/TR/CSS21/propidx.html + // Others will be catched by other, preceeding rules + return ( + name == "font" || name == "line-height" || name == "list-style" + ); + } + + module.exports = { + canReorder: canReorder, + canReorderSingle: canReorderSingle + }; + }, + { "./rules-overlap": 51, "./specificities-overlap": 52 } + ], + 48: [ + function(require, module, exports) { + var compactable = require("./compactable"); + + function restoreWithComponents(property) { + var descriptor = compactable[property.name]; + + if (descriptor && descriptor.shorthand) { + return descriptor.restore(property, compactable); + } else { + return property.value; + } + } + + module.exports = restoreWithComponents; + }, + { "./compactable": 21 } + ], + 49: [ + function(require, module, exports) { + var shallowClone = require("./clone").shallow; + + var Token = require("../../tokenizer/token"); + var Marker = require("../../tokenizer/marker"); + + function isInheritOnly(values) { + for (var i = 0, l = values.length; i < l; i++) { + var value = values[i][1]; + + if ( + value != "inherit" && + value != Marker.COMMA && + value != Marker.FORWARD_SLASH + ) + return false; + } + + return true; + } + + function background(property, compactable, lastInMultiplex) { + var components = property.components; + var restored = []; + var needsOne, needsBoth; + + function restoreValue(component) { + Array.prototype.unshift.apply(restored, component.value); + } + + function isDefaultValue(component) { + var descriptor = compactable[component.name]; + + if ( + descriptor.doubleValues && + descriptor.defaultValue.length == 1 + ) { + return ( + component.value[0][1] == descriptor.defaultValue[0] && + (component.value[1] + ? component.value[1][1] == descriptor.defaultValue[0] + : true) + ); + } else if ( + descriptor.doubleValues && + descriptor.defaultValue.length != 1 + ) { + return ( + component.value[0][1] == descriptor.defaultValue[0] && + (component.value[1] + ? component.value[1][1] + : component.value[0][1]) == descriptor.defaultValue[1] + ); + } else { + return component.value[0][1] == descriptor.defaultValue; + } + } + + for (var i = components.length - 1; i >= 0; i--) { + var component = components[i]; + var isDefault = isDefaultValue(component); + + if (component.name == "background-clip") { + var originComponent = components[i - 1]; + var isOriginDefault = isDefaultValue(originComponent); + + needsOne = component.value[0][1] == originComponent.value[0][1]; + + needsBoth = + !needsOne && + ((isOriginDefault && !isDefault) || + (!isOriginDefault && !isDefault) || + (!isOriginDefault && + isDefault && + component.value[0][1] != originComponent.value[0][1])); + + if (needsOne) { + restoreValue(originComponent); + } else if (needsBoth) { + restoreValue(component); + restoreValue(originComponent); + } + + i--; + } else if (component.name == "background-size") { + var positionComponent = components[i - 1]; + var isPositionDefault = isDefaultValue(positionComponent); + + needsOne = !isPositionDefault && isDefault; + + needsBoth = + !needsOne && + ((isPositionDefault && !isDefault) || + (!isPositionDefault && !isDefault)); + + if (needsOne) { + restoreValue(positionComponent); + } else if (needsBoth) { + restoreValue(component); + restored.unshift([Token.PROPERTY_VALUE, Marker.FORWARD_SLASH]); + restoreValue(positionComponent); + } else if (positionComponent.value.length == 1) { + restoreValue(positionComponent); + } + + i--; + } else { + if ( + isDefault || + (compactable[component.name].multiplexLastOnly && + !lastInMultiplex) + ) + continue; + + restoreValue(component); + } + } + + if ( + restored.length === 0 && + property.value.length == 1 && + property.value[0][1] == "0" + ) + restored.push(property.value[0]); + + if (restored.length === 0) + restored.push([ + Token.PROPERTY_VALUE, + compactable[property.name].defaultValue + ]); + + if (isInheritOnly(restored)) return [restored[0]]; + + return restored; + } + + function borderRadius(property, compactable) { + if (property.multiplex) { + var horizontal = shallowClone(property); + var vertical = shallowClone(property); + + for (var i = 0; i < 4; i++) { + var component = property.components[i]; + + var horizontalComponent = shallowClone(property); + horizontalComponent.value = [component.value[0]]; + horizontal.components.push(horizontalComponent); + + var verticalComponent = shallowClone(property); + // FIXME: only shorthand compactor (see breakup#borderRadius) knows that border radius + // longhands have two values, whereas tokenizer does not care about populating 2nd value + // if it's missing, hence this fallback + verticalComponent.value = [ + component.value[1] || component.value[0] + ]; + vertical.components.push(verticalComponent); + } + + var horizontalValues = fourValues(horizontal, compactable); + var verticalValues = fourValues(vertical, compactable); + + if ( + horizontalValues.length == verticalValues.length && + horizontalValues[0][1] == verticalValues[0][1] && + (horizontalValues.length > 1 + ? horizontalValues[1][1] == verticalValues[1][1] + : true) && + (horizontalValues.length > 2 + ? horizontalValues[2][1] == verticalValues[2][1] + : true) && + (horizontalValues.length > 3 + ? horizontalValues[3][1] == verticalValues[3][1] + : true) + ) { + return horizontalValues; + } else { + return horizontalValues + .concat([[Token.PROPERTY_VALUE, Marker.FORWARD_SLASH]]) + .concat(verticalValues); + } + } else { + return fourValues(property, compactable); + } + } + + function font(property, compactable) { + var components = property.components; + var restored = []; + var component; + var componentIndex = 0; + var fontFamilyIndex = 0; + + if (property.value[0][1].indexOf(Marker.INTERNAL) === 0) { + property.value[0][1] = property.value[0][1].substring( + Marker.INTERNAL.length + ); + return property.value; + } + + // first four components are optional + while (componentIndex < 4) { + component = components[componentIndex]; + + if ( + component.value[0][1] != compactable[component.name].defaultValue + ) { + Array.prototype.push.apply(restored, component.value); + } + + componentIndex++; + } + + // then comes font-size + Array.prototype.push.apply( + restored, + components[componentIndex].value + ); + componentIndex++; + + // then may come line-height + if ( + components[componentIndex].value[0][1] != + compactable[components[componentIndex].name].defaultValue + ) { + Array.prototype.push.apply(restored, [ + [Token.PROPERTY_VALUE, Marker.FORWARD_SLASH] + ]); + Array.prototype.push.apply( + restored, + components[componentIndex].value + ); + } + + componentIndex++; + + // then comes font-family + while (components[componentIndex].value[fontFamilyIndex]) { + restored.push(components[componentIndex].value[fontFamilyIndex]); + + if (components[componentIndex].value[fontFamilyIndex + 1]) { + restored.push([Token.PROPERTY_VALUE, Marker.COMMA]); + } + + fontFamilyIndex++; + } + + if (isInheritOnly(restored)) { + return [restored[0]]; + } + + return restored; + } + + function fourValues(property) { + var components = property.components; + var value1 = components[0].value[0]; + var value2 = components[1].value[0]; + var value3 = components[2].value[0]; + var value4 = components[3].value[0]; + + if ( + value1[1] == value2[1] && + value1[1] == value3[1] && + value1[1] == value4[1] + ) { + return [value1]; + } else if (value1[1] == value3[1] && value2[1] == value4[1]) { + return [value1, value2]; + } else if (value2[1] == value4[1]) { + return [value1, value2, value3]; + } else { + return [value1, value2, value3, value4]; + } + } + + function multiplex(restoreWith) { + return function(property, compactable) { + if (!property.multiplex) + return restoreWith(property, compactable, true); + + var multiplexSize = 0; + var restored = []; + var componentMultiplexSoFar = {}; + var i, l; + + // At this point we don't know what's the multiplex size, e.g. how many background layers are there + for (i = 0, l = property.components[0].value.length; i < l; i++) { + if (property.components[0].value[i][1] == Marker.COMMA) + multiplexSize++; + } + + for (i = 0; i <= multiplexSize; i++) { + var _property = shallowClone(property); + + // We split multiplex into parts and restore them one by one + for (var j = 0, m = property.components.length; j < m; j++) { + var componentToClone = property.components[j]; + var _component = shallowClone(componentToClone); + _property.components.push(_component); + + // The trick is some properties has more than one value, so we iterate over values looking for + // a multiplex separator - a comma + for ( + var k = componentMultiplexSoFar[_component.name] || 0, + n = componentToClone.value.length; + k < n; + k++ + ) { + if (componentToClone.value[k][1] == Marker.COMMA) { + componentMultiplexSoFar[_component.name] = k + 1; + break; + } + + _component.value.push(componentToClone.value[k]); + } + } + + // No we can restore shorthand value + var lastInMultiplex = i == multiplexSize; + var _restored = restoreWith( + _property, + compactable, + lastInMultiplex + ); + Array.prototype.push.apply(restored, _restored); + + if (i < multiplexSize) + restored.push([Token.PROPERTY_VALUE, Marker.COMMA]); + } + + return restored; + }; + } + + function withoutDefaults(property, compactable) { + var components = property.components; + var restored = []; + + for (var i = components.length - 1; i >= 0; i--) { + var component = components[i]; + var descriptor = compactable[component.name]; + + if ( + component.value[0][1] != descriptor.defaultValue || + ("keepUnlessDefault" in descriptor && + !isDefault( + components, + compactable, + descriptor.keepUnlessDefault + )) + ) { + restored.unshift(component.value[0]); + } + } + + if (restored.length === 0) + restored.push([ + Token.PROPERTY_VALUE, + compactable[property.name].defaultValue + ]); + + if (isInheritOnly(restored)) return [restored[0]]; + + return restored; + } + + function isDefault(components, compactable, propertyName) { + var component; + var i, l; + + for (i = 0, l = components.length; i < l; i++) { + component = components[i]; + + if ( + component.name == propertyName && + component.value[0][1] == compactable[propertyName].defaultValue + ) { + return true; + } + } + + return false; + } + + module.exports = { + background: background, + borderRadius: borderRadius, + font: font, + fourValues: fourValues, + multiplex: multiplex, + withoutDefaults: withoutDefaults + }; + }, + { + "../../tokenizer/marker": 83, + "../../tokenizer/token": 84, + "./clone": 20 + } + ], + 50: [ + function(require, module, exports) { + var canReorderSingle = require("./reorderable").canReorderSingle; + var extractProperties = require("./extract-properties"); + var isMergeable = require("./is-mergeable"); + var tidyRuleDuplicates = require("./tidy-rule-duplicates"); + + var Token = require("../../tokenizer/token"); + + var cloneArray = require("../../utils/clone-array"); + + var serializeBody = require("../../writer/one-time").body; + var serializeRules = require("../../writer/one-time").rules; + + function naturalSorter(a, b) { + return a > b ? 1 : -1; + } + + function cloneAndMergeSelectors(propertyA, propertyB) { + var cloned = cloneArray(propertyA); + cloned[5] = cloned[5].concat(propertyB[5]); + + return cloned; + } + + function restructure(tokens, context) { + var options = context.options; + var mergeablePseudoClasses = + options.compatibility.selectors.mergeablePseudoClasses; + var mergeablePseudoElements = + options.compatibility.selectors.mergeablePseudoElements; + var mergeLimit = options.compatibility.selectors.mergeLimit; + var multiplePseudoMerging = + options.compatibility.selectors.multiplePseudoMerging; + var specificityCache = context.cache.specificity; + var movableTokens = {}; + var movedProperties = []; + var multiPropertyMoveCache = {}; + var movedToBeDropped = []; + var maxCombinationsLevel = 2; + var ID_JOIN_CHARACTER = "%"; + + function sendToMultiPropertyMoveCache( + position, + movedProperty, + allFits + ) { + for (var i = allFits.length - 1; i >= 0; i--) { + var fit = allFits[i][0]; + var id = addToCache(movedProperty, fit); + + if ( + multiPropertyMoveCache[id].length > 1 && + processMultiPropertyMove(position, multiPropertyMoveCache[id]) + ) { + removeAllMatchingFromCache(id); + break; + } + } + } + + function addToCache(movedProperty, fit) { + var id = cacheId(fit); + multiPropertyMoveCache[id] = multiPropertyMoveCache[id] || []; + multiPropertyMoveCache[id].push([movedProperty, fit]); + return id; + } + + function removeAllMatchingFromCache(matchId) { + var matchSelectors = matchId.split(ID_JOIN_CHARACTER); + var forRemoval = []; + var i; + + for (var id in multiPropertyMoveCache) { + var selectors = id.split(ID_JOIN_CHARACTER); + for (i = selectors.length - 1; i >= 0; i--) { + if (matchSelectors.indexOf(selectors[i]) > -1) { + forRemoval.push(id); + break; + } + } + } + + for (i = forRemoval.length - 1; i >= 0; i--) { + delete multiPropertyMoveCache[forRemoval[i]]; + } + } + + function cacheId(cachedTokens) { + var id = []; + for (var i = 0, l = cachedTokens.length; i < l; i++) { + id.push(serializeRules(cachedTokens[i][1])); + } + return id.join(ID_JOIN_CHARACTER); + } + + function tokensToMerge(sourceTokens) { + var uniqueTokensWithBody = []; + var mergeableTokens = []; + + for (var i = sourceTokens.length - 1; i >= 0; i--) { + if ( + !isMergeable( + serializeRules(sourceTokens[i][1]), + mergeablePseudoClasses, + mergeablePseudoElements, + multiplePseudoMerging + ) + ) { + continue; + } + + mergeableTokens.unshift(sourceTokens[i]); + if ( + sourceTokens[i][2].length > 0 && + uniqueTokensWithBody.indexOf(sourceTokens[i]) == -1 + ) + uniqueTokensWithBody.push(sourceTokens[i]); + } + + return uniqueTokensWithBody.length > 1 ? mergeableTokens : []; + } + + function shortenIfPossible(position, movedProperty) { + var name = movedProperty[0]; + var value = movedProperty[1]; + var key = movedProperty[4]; + var valueSize = name.length + value.length + 1; + var allSelectors = []; + var qualifiedTokens = []; + + var mergeableTokens = tokensToMerge(movableTokens[key]); + if (mergeableTokens.length < 2) return; + + var allFits = findAllFits(mergeableTokens, valueSize, 1); + var bestFit = allFits[0]; + if (bestFit[1] > 0) + return sendToMultiPropertyMoveCache( + position, + movedProperty, + allFits + ); + + for (var i = bestFit[0].length - 1; i >= 0; i--) { + allSelectors = bestFit[0][i][1].concat(allSelectors); + qualifiedTokens.unshift(bestFit[0][i]); + } + + allSelectors = tidyRuleDuplicates(allSelectors); + dropAsNewTokenAt( + position, + [movedProperty], + allSelectors, + qualifiedTokens + ); + } + + function fitSorter(fit1, fit2) { + return fit1[1] > fit2[1] ? 1 : fit1[1] == fit2[1] ? 0 : -1; + } + + function findAllFits(mergeableTokens, propertySize, propertiesCount) { + var combinations = allCombinations( + mergeableTokens, + propertySize, + propertiesCount, + maxCombinationsLevel - 1 + ); + return combinations.sort(fitSorter); + } + + function allCombinations( + tokensVariant, + propertySize, + propertiesCount, + level + ) { + var differenceVariants = [ + [ + tokensVariant, + sizeDifference(tokensVariant, propertySize, propertiesCount) + ] + ]; + if (tokensVariant.length > 2 && level > 0) { + for (var i = tokensVariant.length - 1; i >= 0; i--) { + var subVariant = Array.prototype.slice.call(tokensVariant, 0); + subVariant.splice(i, 1); + differenceVariants = differenceVariants.concat( + allCombinations( + subVariant, + propertySize, + propertiesCount, + level - 1 + ) + ); + } + } + + return differenceVariants; + } + + function sizeDifference( + tokensVariant, + propertySize, + propertiesCount + ) { + var allSelectorsSize = 0; + for (var i = tokensVariant.length - 1; i >= 0; i--) { + allSelectorsSize += + tokensVariant[i][2].length > propertiesCount + ? serializeRules(tokensVariant[i][1]).length + : -1; + } + return ( + allSelectorsSize - (tokensVariant.length - 1) * propertySize + 1 + ); + } + + function dropAsNewTokenAt( + position, + properties, + allSelectors, + mergeableTokens + ) { + var i, j, k, m; + var allProperties = []; + + for (i = mergeableTokens.length - 1; i >= 0; i--) { + var mergeableToken = mergeableTokens[i]; + + for (j = mergeableToken[2].length - 1; j >= 0; j--) { + var mergeableProperty = mergeableToken[2][j]; + + for (k = 0, m = properties.length; k < m; k++) { + var property = properties[k]; + + var mergeablePropertyName = mergeableProperty[1][1]; + var propertyName = property[0]; + var propertyBody = property[4]; + if ( + mergeablePropertyName == propertyName && + serializeBody([mergeableProperty]) == propertyBody + ) { + mergeableToken[2].splice(j, 1); + break; + } + } + } + } + + for (i = properties.length - 1; i >= 0; i--) { + allProperties.unshift(properties[i][3]); + } + + var newToken = [Token.RULE, allSelectors, allProperties]; + tokens.splice(position, 0, newToken); + } + + function dropPropertiesAt(position, movedProperty) { + var key = movedProperty[4]; + var toMove = movableTokens[key]; + + if (toMove && toMove.length > 1) { + if (!shortenMultiMovesIfPossible(position, movedProperty)) + shortenIfPossible(position, movedProperty); + } + } + + function shortenMultiMovesIfPossible(position, movedProperty) { + var candidates = []; + var propertiesAndMergableTokens = []; + var key = movedProperty[4]; + var j, k; + + var mergeableTokens = tokensToMerge(movableTokens[key]); + if (mergeableTokens.length < 2) return; + + movableLoop: for (var value in movableTokens) { + var tokensList = movableTokens[value]; + + for (j = mergeableTokens.length - 1; j >= 0; j--) { + if (tokensList.indexOf(mergeableTokens[j]) == -1) + continue movableLoop; + } + + candidates.push(value); + } + + if (candidates.length < 2) return false; + + for (j = candidates.length - 1; j >= 0; j--) { + for (k = movedProperties.length - 1; k >= 0; k--) { + if (movedProperties[k][4] == candidates[j]) { + propertiesAndMergableTokens.unshift([ + movedProperties[k], + mergeableTokens + ]); + break; + } + } + } + + return processMultiPropertyMove( + position, + propertiesAndMergableTokens + ); + } + + function processMultiPropertyMove( + position, + propertiesAndMergableTokens + ) { + var valueSize = 0; + var properties = []; + var property; + + for (var i = propertiesAndMergableTokens.length - 1; i >= 0; i--) { + property = propertiesAndMergableTokens[i][0]; + var fullValue = property[4]; + valueSize += fullValue.length + (i > 0 ? 1 : 0); + + properties.push(property); + } + + var mergeableTokens = propertiesAndMergableTokens[0][1]; + var bestFit = findAllFits( + mergeableTokens, + valueSize, + properties.length + )[0]; + if (bestFit[1] > 0) return false; + + var allSelectors = []; + var qualifiedTokens = []; + for (i = bestFit[0].length - 1; i >= 0; i--) { + allSelectors = bestFit[0][i][1].concat(allSelectors); + qualifiedTokens.unshift(bestFit[0][i]); + } + + allSelectors = tidyRuleDuplicates(allSelectors); + dropAsNewTokenAt( + position, + properties, + allSelectors, + qualifiedTokens + ); + + for (i = properties.length - 1; i >= 0; i--) { + property = properties[i]; + var index = movedProperties.indexOf(property); + + delete movableTokens[property[4]]; + + if (index > -1 && movedToBeDropped.indexOf(index) == -1) + movedToBeDropped.push(index); + } + + return true; + } + + function boundToAnotherPropertyInCurrrentToken( + property, + movedProperty, + token + ) { + var propertyName = property[0]; + var movedPropertyName = movedProperty[0]; + if (propertyName != movedPropertyName) return false; + + var key = movedProperty[4]; + var toMove = movableTokens[key]; + return toMove && toMove.indexOf(token) > -1; + } + + for (var i = tokens.length - 1; i >= 0; i--) { + var token = tokens[i]; + var isRule; + var j, k, m; + var samePropertyAt; + + if (token[0] == Token.RULE) { + isRule = true; + } else if (token[0] == Token.NESTED_BLOCK) { + isRule = false; + } else { + continue; + } + + // We cache movedProperties.length as it may change in the loop + var movedCount = movedProperties.length; + + var properties = extractProperties(token); + movedToBeDropped = []; + + var unmovableInCurrentToken = []; + for (j = properties.length - 1; j >= 0; j--) { + for (k = j - 1; k >= 0; k--) { + if ( + !canReorderSingle( + properties[j], + properties[k], + specificityCache + ) + ) { + unmovableInCurrentToken.push(j); + break; + } + } + } + + for (j = properties.length - 1; j >= 0; j--) { + var property = properties[j]; + var movedSameProperty = false; + + for (k = 0; k < movedCount; k++) { + var movedProperty = movedProperties[k]; + + if ( + movedToBeDropped.indexOf(k) == -1 && + ((!canReorderSingle( + property, + movedProperty, + specificityCache + ) && + !boundToAnotherPropertyInCurrrentToken( + property, + movedProperty, + token + )) || + (movableTokens[movedProperty[4]] && + movableTokens[movedProperty[4]].length === mergeLimit)) + ) { + dropPropertiesAt(i + 1, movedProperty, token); + + if (movedToBeDropped.indexOf(k) == -1) { + movedToBeDropped.push(k); + delete movableTokens[movedProperty[4]]; + } + } + + if (!movedSameProperty) { + movedSameProperty = + property[0] == movedProperty[0] && + property[1] == movedProperty[1]; + + if (movedSameProperty) { + samePropertyAt = k; + } + } + } + + if (!isRule || unmovableInCurrentToken.indexOf(j) > -1) continue; + + var key = property[4]; + + if ( + movedSameProperty && + movedProperties[samePropertyAt][5].length + property[5].length > + mergeLimit + ) { + dropPropertiesAt(i + 1, movedProperties[samePropertyAt]); + movedProperties.splice(samePropertyAt, 1); + movableTokens[key] = [token]; + movedSameProperty = false; + } else { + movableTokens[key] = movableTokens[key] || []; + movableTokens[key].push(token); + } + + if (movedSameProperty) { + movedProperties[samePropertyAt] = cloneAndMergeSelectors( + movedProperties[samePropertyAt], + property + ); + } else { + movedProperties.push(property); + } + } + + movedToBeDropped = movedToBeDropped.sort(naturalSorter); + for (j = 0, m = movedToBeDropped.length; j < m; j++) { + var dropAt = movedToBeDropped[j] - j; + movedProperties.splice(dropAt, 1); + } + } + + var position = + tokens[0] && + tokens[0][0] == Token.AT_RULE && + tokens[0][1].indexOf("@charset") === 0 + ? 1 + : 0; + for (; position < tokens.length - 1; position++) { + var isImportRule = + tokens[position][0] === Token.AT_RULE && + tokens[position][1].indexOf("@import") === 0; + var isComment = tokens[position][0] === Token.COMMENT; + if (!(isImportRule || isComment)) break; + } + + for (i = 0; i < movedProperties.length; i++) { + dropPropertiesAt(position, movedProperties[i]); + } + } + + module.exports = restructure; + }, + { + "../../tokenizer/token": 84, + "../../utils/clone-array": 86, + "../../writer/one-time": 98, + "./extract-properties": 22, + "./is-mergeable": 24, + "./reorderable": 47, + "./tidy-rule-duplicates": 54 + } + ], + 51: [ + function(require, module, exports) { + var MODIFIER_PATTERN = /\-\-.+$/; + + function rulesOverlap(rule1, rule2, bemMode) { + var scope1; + var scope2; + var i, l; + var j, m; + + for (i = 0, l = rule1.length; i < l; i++) { + scope1 = rule1[i][1]; + + for (j = 0, m = rule2.length; j < m; j++) { + scope2 = rule2[j][1]; + + if (scope1 == scope2) { + return true; + } + + if ( + bemMode && + withoutModifiers(scope1) == withoutModifiers(scope2) + ) { + return true; + } + } + } + + return false; + } + + function withoutModifiers(scope) { + return scope.replace(MODIFIER_PATTERN, ""); + } + + module.exports = rulesOverlap; + }, + {} + ], + 52: [ + function(require, module, exports) { + var specificity = require("./specificity"); + + function specificitiesOverlap(selector1, selector2, cache) { + var specificity1; + var specificity2; + var i, l; + var j, m; + + for (i = 0, l = selector1.length; i < l; i++) { + specificity1 = findSpecificity(selector1[i][1], cache); + + for (j = 0, m = selector2.length; j < m; j++) { + specificity2 = findSpecificity(selector2[j][1], cache); + + if ( + specificity1[0] === specificity2[0] && + specificity1[1] === specificity2[1] && + specificity1[2] === specificity2[2] + ) { + return true; + } + } + } + + return false; + } + + function findSpecificity(selector, cache) { + var value; + + if (!(selector in cache)) { + cache[selector] = value = specificity(selector); + } + + return value || cache[selector]; + } + + module.exports = specificitiesOverlap; + }, + { "./specificity": 53 } + ], + 53: [ + function(require, module, exports) { + var Marker = require("../../tokenizer/marker"); + + var Selector = { + ADJACENT_SIBLING: "+", + DESCENDANT: ">", + DOT: ".", + HASH: "#", + NON_ADJACENT_SIBLING: "~", + PSEUDO: ":" + }; + + var LETTER_PATTERN = /[a-zA-Z]/; + var NOT_PREFIX = ":not("; + var SEPARATOR_PATTERN = /[\s,\(>~\+]/; + + function specificity(selector) { + var result = [0, 0, 0]; + var character; + var isEscaped; + var isSingleQuoted; + var isDoubleQuoted; + var roundBracketLevel = 0; + var couldIntroduceNewTypeSelector; + var withinNotPseudoClass = false; + var wasPseudoClass = false; + var i, l; + + for (i = 0, l = selector.length; i < l; i++) { + character = selector[i]; + + if (isEscaped) { + // noop + } else if ( + character == Marker.SINGLE_QUOTE && + !isDoubleQuoted && + !isSingleQuoted + ) { + isSingleQuoted = true; + } else if ( + character == Marker.SINGLE_QUOTE && + !isDoubleQuoted && + isSingleQuoted + ) { + isSingleQuoted = false; + } else if ( + character == Marker.DOUBLE_QUOTE && + !isDoubleQuoted && + !isSingleQuoted + ) { + isDoubleQuoted = true; + } else if ( + character == Marker.DOUBLE_QUOTE && + isDoubleQuoted && + !isSingleQuoted + ) { + isDoubleQuoted = false; + } else if (isSingleQuoted || isDoubleQuoted) { + continue; + } else if (roundBracketLevel > 0 && !withinNotPseudoClass) { + // noop + } else if (character == Marker.OPEN_ROUND_BRACKET) { + roundBracketLevel++; + } else if ( + character == Marker.CLOSE_ROUND_BRACKET && + roundBracketLevel == 1 + ) { + roundBracketLevel--; + withinNotPseudoClass = false; + } else if (character == Marker.CLOSE_ROUND_BRACKET) { + roundBracketLevel--; + } else if (character == Selector.HASH) { + result[0]++; + } else if ( + character == Selector.DOT || + character == Marker.OPEN_SQUARE_BRACKET + ) { + result[1]++; + } else if ( + character == Selector.PSEUDO && + !wasPseudoClass && + !isNotPseudoClass(selector, i) + ) { + result[1]++; + withinNotPseudoClass = false; + } else if (character == Selector.PSEUDO) { + withinNotPseudoClass = true; + } else if ( + (i === 0 || couldIntroduceNewTypeSelector) && + LETTER_PATTERN.test(character) + ) { + result[2]++; + } + + isEscaped = character == Marker.BACK_SLASH; + wasPseudoClass = character == Selector.PSEUDO; + couldIntroduceNewTypeSelector = + !isEscaped && SEPARATOR_PATTERN.test(character); + } + + return result; + } + + function isNotPseudoClass(selector, index) { + return selector.indexOf(NOT_PREFIX, index) === index; + } + + module.exports = specificity; + }, + { "../../tokenizer/marker": 83 } + ], + 54: [ + function(require, module, exports) { + function ruleSorter(s1, s2) { + return s1[1] > s2[1] ? 1 : -1; + } + + function tidyRuleDuplicates(rules) { + var list = []; + var repeated = []; + + for (var i = 0, l = rules.length; i < l; i++) { + var rule = rules[i]; + + if (repeated.indexOf(rule[1]) == -1) { + repeated.push(rule[1]); + list.push(rule); + } + } + + return list.sort(ruleSorter); + } + + module.exports = tidyRuleDuplicates; + }, + {} + ], + 55: [ + function(require, module, exports) { + function removeUnused(properties) { + for (var i = properties.length - 1; i >= 0; i--) { + var property = properties[i]; + + if (property.unused) { + property.all.splice(property.position, 1); + } + } + } + + module.exports = removeUnused; + }, + {} + ], + 56: [ + function(require, module, exports) { + var Hack = require("./hack"); + + var Marker = require("../tokenizer/marker"); + + var ASTERISK_HACK = "*"; + var BACKSLASH_HACK = "\\"; + var IMPORTANT_TOKEN = "!important"; + var UNDERSCORE_HACK = "_"; + var BANG_HACK = "!ie"; + + function restoreFromOptimizing(properties, restoreCallback) { + var property; + var restored; + var current; + var i; + + for (i = properties.length - 1; i >= 0; i--) { + property = properties[i]; + + if (property.unused) { + continue; + } + + if (!property.dirty && !property.important && !property.hack) { + continue; + } + + if (restoreCallback) { + restored = restoreCallback(property); + property.value = restored; + } else { + restored = property.value; + } + + if (property.important) { + restoreImportant(property); + } + + if (property.hack) { + restoreHack(property); + } + + if ("all" in property) { + current = property.all[property.position]; + current[1][1] = property.name; + + current.splice(2, current.length - 1); + Array.prototype.push.apply(current, restored); + } + } + } + + function restoreImportant(property) { + property.value[property.value.length - 1][1] += IMPORTANT_TOKEN; + } + + function restoreHack(property) { + if (property.hack[0] == Hack.UNDERSCORE) { + property.name = UNDERSCORE_HACK + property.name; + } else if (property.hack[0] == Hack.ASTERISK) { + property.name = ASTERISK_HACK + property.name; + } else if (property.hack[0] == Hack.BACKSLASH) { + property.value[property.value.length - 1][1] += + BACKSLASH_HACK + property.hack[1]; + } else if (property.hack[0] == Hack.BANG) { + property.value[property.value.length - 1][1] += + Marker.SPACE + BANG_HACK; + } + } + + module.exports = restoreFromOptimizing; + }, + { "../tokenizer/marker": 83, "./hack": 8 } + ], + 57: [ + function(require, module, exports) { + var functionNoVendorRegexStr = "[A-Z]+(\\-|[A-Z]|[0-9])+\\(.*?\\)"; + var functionVendorRegexStr = "\\-(\\-|[A-Z]|[0-9])+\\(.*?\\)"; + var variableRegexStr = "var\\(\\-\\-[^\\)]+\\)"; + var functionAnyRegexStr = + "(" + + variableRegexStr + + "|" + + functionNoVendorRegexStr + + "|" + + functionVendorRegexStr + + ")"; + + var calcRegex = new RegExp( + "^(\\-moz\\-|\\-webkit\\-)?calc\\([^\\)]+\\)$", + "i" + ); + var decimalRegex = /[0-9]/; + var functionAnyRegex = new RegExp("^" + functionAnyRegexStr + "$", "i"); + var hslColorRegex = /^hsl\(\s{0,31}[\-\.]?\d+\s{0,31},\s{0,31}\.?\d+%\s{0,31},\s{0,31}\.?\d+%\s{0,31}\)|hsla\(\s{0,31}[\-\.]?\d+\s{0,31},\s{0,31}\.?\d+%\s{0,31},\s{0,31}\.?\d+%\s{0,31},\s{0,31}\.?\d+\s{0,31}\)$/; + var identifierRegex = /^(\-[a-z0-9_][a-z0-9\-_]*|[a-z][a-z0-9\-_]*)$/i; + var namedEntityRegex = /^[a-z]+$/i; + var prefixRegex = /^-([a-z0-9]|-)*$/i; + var rgbColorRegex = /^rgb\(\s{0,31}[\d]{1,3}\s{0,31},\s{0,31}[\d]{1,3}\s{0,31},\s{0,31}[\d]{1,3}\s{0,31}\)|rgba\(\s{0,31}[\d]{1,3}\s{0,31},\s{0,31}[\d]{1,3}\s{0,31},\s{0,31}[\d]{1,3}\s{0,31},\s{0,31}[\.\d]+\s{0,31}\)$/; + var timingFunctionRegex = /^(cubic\-bezier|steps)\([^\)]+\)$/; + var validTimeUnits = ["ms", "s"]; + var urlRegex = /^url\([\s\S]+\)$/i; + var variableRegex = new RegExp("^" + variableRegexStr + "$", "i"); + + var eightValueColorRegex = /^#[0-9a-f]{8}$/i; + var fourValueColorRegex = /^#[0-9a-f]{4}$/i; + var sixValueColorRegex = /^#[0-9a-f]{6}$/i; + var threeValueColorRegex = /^#[0-9a-f]{3}$/i; + + var DECIMAL_DOT = "."; + var MINUS_SIGN = "-"; + var PLUS_SIGN = "+"; + + var Keywords = { + "^": ["inherit", "initial", "unset"], + "*-style": [ + "auto", + "dashed", + "dotted", + "double", + "groove", + "hidden", + "inset", + "none", + "outset", + "ridge", + "solid" + ], + "*-timing-function": [ + "ease", + "ease-in", + "ease-in-out", + "ease-out", + "linear", + "step-end", + "step-start" + ], + "animation-direction": [ + "alternate", + "alternate-reverse", + "normal", + "reverse" + ], + "animation-fill-mode": ["backwards", "both", "forwards", "none"], + "animation-iteration-count": ["infinite"], + "animation-name": ["none"], + "animation-play-state": ["paused", "running"], + "background-attachment": ["fixed", "inherit", "local", "scroll"], + "background-clip": [ + "border-box", + "content-box", + "inherit", + "padding-box", + "text" + ], + "background-origin": [ + "border-box", + "content-box", + "inherit", + "padding-box" + ], + "background-position": ["bottom", "center", "left", "right", "top"], + "background-repeat": [ + "no-repeat", + "inherit", + "repeat", + "repeat-x", + "repeat-y", + "round", + "space" + ], + "background-size": ["auto", "cover", "contain"], + "border-collapse": ["collapse", "inherit", "separate"], + bottom: ["auto"], + clear: ["both", "left", "none", "right"], + color: ["transparent"], + cursor: [ + "all-scroll", + "auto", + "col-resize", + "crosshair", + "default", + "e-resize", + "help", + "move", + "n-resize", + "ne-resize", + "no-drop", + "not-allowed", + "nw-resize", + "pointer", + "progress", + "row-resize", + "s-resize", + "se-resize", + "sw-resize", + "text", + "vertical-text", + "w-resize", + "wait" + ], + display: [ + "block", + "inline", + "inline-block", + "inline-table", + "list-item", + "none", + "table", + "table-caption", + "table-cell", + "table-column", + "table-column-group", + "table-footer-group", + "table-header-group", + "table-row", + "table-row-group" + ], + float: ["left", "none", "right"], + left: ["auto"], + font: [ + "caption", + "icon", + "menu", + "message-box", + "small-caption", + "status-bar", + "unset" + ], + "font-size": [ + "large", + "larger", + "medium", + "small", + "smaller", + "x-large", + "x-small", + "xx-large", + "xx-small" + ], + "font-stretch": [ + "condensed", + "expanded", + "extra-condensed", + "extra-expanded", + "normal", + "semi-condensed", + "semi-expanded", + "ultra-condensed", + "ultra-expanded" + ], + "font-style": ["italic", "normal", "oblique"], + "font-variant": ["normal", "small-caps"], + "font-weight": [ + "100", + "200", + "300", + "400", + "500", + "600", + "700", + "800", + "900", + "bold", + "bolder", + "lighter", + "normal" + ], + "line-height": ["normal"], + "list-style-position": ["inside", "outside"], + "list-style-type": [ + "armenian", + "circle", + "decimal", + "decimal-leading-zero", + "disc", + "decimal|disc", // this is the default value of list-style-type, see comment in compactable.js + "georgian", + "lower-alpha", + "lower-greek", + "lower-latin", + "lower-roman", + "none", + "square", + "upper-alpha", + "upper-latin", + "upper-roman" + ], + overflow: ["auto", "hidden", "scroll", "visible"], + position: ["absolute", "fixed", "relative", "static"], + right: ["auto"], + "text-align": [ + "center", + "justify", + "left", + "left|right", // this is the default value of list-style-type, see comment in compactable.js + "right" + ], + "text-decoration": ["line-through", "none", "overline", "underline"], + "text-overflow": ["clip", "ellipsis"], + top: ["auto"], + "vertical-align": [ + "baseline", + "bottom", + "middle", + "sub", + "super", + "text-bottom", + "text-top", + "top" + ], + visibility: ["collapse", "hidden", "visible"], + "white-space": ["normal", "nowrap", "pre"], + width: ["inherit", "initial", "medium", "thick", "thin"] + }; + + var Units = [ + "%", + "ch", + "cm", + "em", + "ex", + "in", + "mm", + "pc", + "pt", + "px", + "rem", + "vh", + "vm", + "vmax", + "vmin", + "vw" + ]; + + function isColor(value) { + return ( + value != "auto" && + (isKeyword("color")(value) || + isHexColor(value) || + isColorFunction(value) || + isNamedEntity(value)) + ); + } + + function isColorFunction(value) { + return isRgbColor(value) || isHslColor(value); + } + + function isDynamicUnit(value) { + return calcRegex.test(value); + } + + function isFunction(value) { + return functionAnyRegex.test(value); + } + + function isHexColor(value) { + return ( + threeValueColorRegex.test(value) || + fourValueColorRegex.test(value) || + sixValueColorRegex.test(value) || + eightValueColorRegex.test(value) + ); + } + + function isHslColor(value) { + return hslColorRegex.test(value); + } + + function isIdentifier(value) { + return identifierRegex.test(value); + } + + function isImage(value) { + return value == "none" || value == "inherit" || isUrl(value); + } + + function isKeyword(propertyName) { + return function(value) { + return Keywords[propertyName].indexOf(value) > -1; + }; + } + + function isNamedEntity(value) { + return namedEntityRegex.test(value); + } + + function isNumber(value) { + return scanForNumber(value) == value.length; + } + + function isRgbColor(value) { + return rgbColorRegex.test(value); + } + + function isPrefixed(value) { + return prefixRegex.test(value); + } + + function isPositiveNumber(value) { + return isNumber(value) && parseFloat(value) >= 0; + } + + function isVariable(value) { + return variableRegex.test(value); + } + + function isTime(value) { + var numberUpTo = scanForNumber(value); + + return ( + (numberUpTo == value.length && parseInt(value) === 0) || + (numberUpTo > -1 && + validTimeUnits.indexOf(value.slice(numberUpTo + 1)) > -1) + ); + } + + function isTimingFunction() { + var isTimingFunctionKeyword = isKeyword("*-timing-function"); + + return function(value) { + return ( + isTimingFunctionKeyword(value) || timingFunctionRegex.test(value) + ); + }; + } + + function isUnit(validUnits, value) { + var numberUpTo = scanForNumber(value); + + return ( + (numberUpTo == value.length && parseInt(value) === 0) || + (numberUpTo > -1 && + validUnits.indexOf(value.slice(numberUpTo + 1)) > -1) || + value == "auto" || + value == "inherit" + ); + } + + function isUrl(value) { + return urlRegex.test(value); + } + + function isZIndex(value) { + return value == "auto" || isNumber(value) || isKeyword("^")(value); + } + + function scanForNumber(value) { + var hasDot = false; + var hasSign = false; + var character; + var i, l; + + for (i = 0, l = value.length; i < l; i++) { + character = value[i]; + + if ( + i === 0 && + (character == PLUS_SIGN || character == MINUS_SIGN) + ) { + hasSign = true; + } else if ( + i > 0 && + hasSign && + (character == PLUS_SIGN || character == MINUS_SIGN) + ) { + return i - 1; + } else if (character == DECIMAL_DOT && !hasDot) { + hasDot = true; + } else if (character == DECIMAL_DOT && hasDot) { + return i - 1; + } else if (decimalRegex.test(character)) { + continue; + } else { + return i - 1; + } + } + + return i; + } + + function validator(compatibility) { + var validUnits = Units.slice(0).filter(function(value) { + return ( + !(value in compatibility.units) || + compatibility.units[value] === true + ); + }); + + return { + colorOpacity: compatibility.colors.opacity, + isAnimationDirectionKeyword: isKeyword("animation-direction"), + isAnimationFillModeKeyword: isKeyword("animation-fill-mode"), + isAnimationIterationCountKeyword: isKeyword( + "animation-iteration-count" + ), + isAnimationNameKeyword: isKeyword("animation-name"), + isAnimationPlayStateKeyword: isKeyword("animation-play-state"), + isTimingFunction: isTimingFunction(), + isBackgroundAttachmentKeyword: isKeyword("background-attachment"), + isBackgroundClipKeyword: isKeyword("background-clip"), + isBackgroundOriginKeyword: isKeyword("background-origin"), + isBackgroundPositionKeyword: isKeyword("background-position"), + isBackgroundRepeatKeyword: isKeyword("background-repeat"), + isBackgroundSizeKeyword: isKeyword("background-size"), + isColor: isColor, + isColorFunction: isColorFunction, + isDynamicUnit: isDynamicUnit, + isFontKeyword: isKeyword("font"), + isFontSizeKeyword: isKeyword("font-size"), + isFontStretchKeyword: isKeyword("font-stretch"), + isFontStyleKeyword: isKeyword("font-style"), + isFontVariantKeyword: isKeyword("font-variant"), + isFontWeightKeyword: isKeyword("font-weight"), + isFunction: isFunction, + isGlobal: isKeyword("^"), + isHslColor: isHslColor, + isIdentifier: isIdentifier, + isImage: isImage, + isKeyword: isKeyword, + isLineHeightKeyword: isKeyword("line-height"), + isListStylePositionKeyword: isKeyword("list-style-position"), + isListStyleTypeKeyword: isKeyword("list-style-type"), + isNumber: isNumber, + isPrefixed: isPrefixed, + isPositiveNumber: isPositiveNumber, + isRgbColor: isRgbColor, + isStyleKeyword: isKeyword("*-style"), + isTime: isTime, + isUnit: isUnit.bind(null, validUnits), + isUrl: isUrl, + isVariable: isVariable, + isWidth: isKeyword("width"), + isZIndex: isZIndex + }; + } + + module.exports = validator; + }, + {} + ], + 58: [ + function(require, module, exports) { + var Hack = require("./hack"); + + var Marker = require("../tokenizer/marker"); + var Token = require("../tokenizer/token"); + + var Match = { + ASTERISK: "*", + BACKSLASH: "\\", + BANG: "!", + BANG_SUFFIX_PATTERN: /!\w+$/, + IMPORTANT_TOKEN: "!important", + IMPORTANT_TOKEN_PATTERN: new RegExp("!important$", "i"), + IMPORTANT_WORD: "important", + IMPORTANT_WORD_PATTERN: new RegExp("important$", "i"), + SUFFIX_BANG_PATTERN: /!$/, + UNDERSCORE: "_", + VARIABLE_REFERENCE_PATTERN: /var\(--.+\)$/ + }; + + function wrapAll(properties, includeVariable, skipProperties) { + var wrapped = []; + var single; + var property; + var i; + + for (i = properties.length - 1; i >= 0; i--) { + property = properties[i]; + + if (property[0] != Token.PROPERTY) { + continue; + } + + if (!includeVariable && someVariableReferences(property)) { + continue; + } + + if (skipProperties && skipProperties.indexOf(property[1][1]) > -1) { + continue; + } + + single = wrapSingle(property); + single.all = properties; + single.position = i; + wrapped.unshift(single); + } + + return wrapped; + } + + function someVariableReferences(property) { + var i, l; + var value; + + // skipping `property` and property name tokens + for (i = 2, l = property.length; i < l; i++) { + value = property[i]; + + if (value[0] != Token.PROPERTY_VALUE) { + continue; + } + + if (isVariableReference(value[1])) { + return true; + } + } + + return false; + } + + function isVariableReference(value) { + return Match.VARIABLE_REFERENCE_PATTERN.test(value); + } + + function isMultiplex(property) { + var value; + var i, l; + + for (i = 3, l = property.length; i < l; i++) { + value = property[i]; + + if ( + value[0] == Token.PROPERTY_VALUE && + (value[1] == Marker.COMMA || value[1] == Marker.FORWARD_SLASH) + ) { + return true; + } + } + + return false; + } + + function hackFrom(property) { + var match = false; + var name = property[1][1]; + var lastValue = property[property.length - 1]; + + if (name[0] == Match.UNDERSCORE) { + match = [Hack.UNDERSCORE]; + } else if (name[0] == Match.ASTERISK) { + match = [Hack.ASTERISK]; + } else if ( + lastValue[1][0] == Match.BANG && + !lastValue[1].match(Match.IMPORTANT_WORD_PATTERN) + ) { + match = [Hack.BANG]; + } else if ( + lastValue[1].indexOf(Match.BANG) > 0 && + !lastValue[1].match(Match.IMPORTANT_WORD_PATTERN) && + Match.BANG_SUFFIX_PATTERN.test(lastValue[1]) + ) { + match = [Hack.BANG]; + } else if ( + lastValue[1].indexOf(Match.BACKSLASH) > 0 && + lastValue[1].indexOf(Match.BACKSLASH) == + lastValue[1].length - Match.BACKSLASH.length - 1 + ) { + match = [ + Hack.BACKSLASH, + lastValue[1].substring(lastValue[1].indexOf(Match.BACKSLASH) + 1) + ]; + } else if ( + lastValue[1].indexOf(Match.BACKSLASH) === 0 && + lastValue[1].length == 2 + ) { + match = [Hack.BACKSLASH, lastValue[1].substring(1)]; + } + + return match; + } + + function isImportant(property) { + if (property.length < 3) return false; + + var lastValue = property[property.length - 1]; + if (Match.IMPORTANT_TOKEN_PATTERN.test(lastValue[1])) { + return true; + } else if ( + Match.IMPORTANT_WORD_PATTERN.test(lastValue[1]) && + Match.SUFFIX_BANG_PATTERN.test(property[property.length - 2][1]) + ) { + return true; + } + + return false; + } + + function stripImportant(property) { + var lastValue = property[property.length - 1]; + var oneButLastValue = property[property.length - 2]; + + if (Match.IMPORTANT_TOKEN_PATTERN.test(lastValue[1])) { + lastValue[1] = lastValue[1].replace( + Match.IMPORTANT_TOKEN_PATTERN, + "" + ); + } else { + lastValue[1] = lastValue[1].replace( + Match.IMPORTANT_WORD_PATTERN, + "" + ); + oneButLastValue[1] = oneButLastValue[1].replace( + Match.SUFFIX_BANG_PATTERN, + "" + ); + } + + if (lastValue[1].length === 0) { + property.pop(); + } + + if (oneButLastValue[1].length === 0) { + property.pop(); + } + } + + function stripPrefixHack(property) { + property[1][1] = property[1][1].substring(1); + } + + function stripSuffixHack(property, hackFrom) { + var lastValue = property[property.length - 1]; + lastValue[1] = lastValue[1] + .substring( + 0, + lastValue[1].indexOf( + hackFrom[0] == Hack.BACKSLASH ? Match.BACKSLASH : Match.BANG + ) + ) + .trim(); + + if (lastValue[1].length === 0) { + property.pop(); + } + } + + function wrapSingle(property) { + var importantProperty = isImportant(property); + if (importantProperty) { + stripImportant(property); + } + + var whichHack = hackFrom(property); + if ( + whichHack[0] == Hack.ASTERISK || + whichHack[0] == Hack.UNDERSCORE + ) { + stripPrefixHack(property); + } else if ( + whichHack[0] == Hack.BACKSLASH || + whichHack[0] == Hack.BANG + ) { + stripSuffixHack(property, whichHack); + } + + return { + block: property[2] && property[2][0] == Token.PROPERTY_BLOCK, + components: [], + dirty: false, + hack: whichHack, + important: importantProperty, + name: property[1][1], + multiplex: property.length > 3 ? isMultiplex(property) : false, + position: 0, + shorthand: false, + unused: false, + value: property.slice(2) + }; + } + + module.exports = { + all: wrapAll, + single: wrapSingle + }; + }, + { "../tokenizer/marker": 83, "../tokenizer/token": 84, "./hack": 8 } + ], + 59: [ + function(require, module, exports) { + var DEFAULTS = { + "*": { + colors: { + opacity: true // rgba / hsla + }, + properties: { + backgroundClipMerging: true, // background-clip to shorthand + backgroundOriginMerging: true, // background-origin to shorthand + backgroundSizeMerging: true, // background-size to shorthand + colors: true, // any kind of color transformations, like `#ff00ff` to `#f0f` or `#fff` into `red` + ieBangHack: false, // !ie suffix hacks on IE<8 + ieFilters: false, // whether to preserve `filter` and `-ms-filter` properties + iePrefixHack: false, // underscore / asterisk prefix hacks on IE + ieSuffixHack: false, // \9 suffix hacks on IE6-9 + merging: true, // merging properties into one + shorterLengthUnits: false, // optimize pixel units into `pt`, `pc` or `in` units + spaceAfterClosingBrace: true, // 'url() no-repeat' to 'url()no-repeat' + urlQuotes: false, // whether to wrap content of `url()` into quotes or not + zeroUnits: true // 0[unit] -> 0 + }, + selectors: { + adjacentSpace: false, // div+ nav Android stock browser hack + ie7Hack: false, // *+html hack + mergeablePseudoClasses: [ + ":active", + ":after", + ":before", + ":empty", + ":checked", + ":disabled", + ":empty", + ":enabled", + ":first-child", + ":first-letter", + ":first-line", + ":first-of-type", + ":focus", + ":hover", + ":lang", + ":last-child", + ":last-of-type", + ":link", + ":not", + ":nth-child", + ":nth-last-child", + ":nth-last-of-type", + ":nth-of-type", + ":only-child", + ":only-of-type", + ":root", + ":target", + ":visited" + ], // selectors with these pseudo-classes can be merged as these are universally supported + mergeablePseudoElements: [ + "::after", + "::before", + "::first-letter", + "::first-line" + ], // selectors with these pseudo-elements can be merged as these are universally supported + mergeLimit: 8191, // number of rules that can be safely merged together + multiplePseudoMerging: true + }, + units: { + ch: true, + in: true, + pc: true, + pt: true, + rem: true, + vh: true, + vm: true, // vm is vmin on IE9+ see https://developer.mozilla.org/en-US/docs/Web/CSS/length + vmax: true, + vmin: true, + vw: true + } + } + }; + + DEFAULTS.ie11 = DEFAULTS["*"]; + + DEFAULTS.ie10 = DEFAULTS["*"]; + + DEFAULTS.ie9 = merge(DEFAULTS["*"], { + properties: { + ieFilters: true, + ieSuffixHack: true + } + }); + + DEFAULTS.ie8 = merge(DEFAULTS.ie9, { + colors: { + opacity: false + }, + properties: { + backgroundClipMerging: false, + backgroundOriginMerging: false, + backgroundSizeMerging: false, + iePrefixHack: true, + merging: false + }, + selectors: { + mergeablePseudoClasses: [ + ":after", + ":before", + ":first-child", + ":first-letter", + ":focus", + ":hover", + ":visited" + ], + mergeablePseudoElements: [] + }, + units: { + ch: false, + rem: false, + vh: false, + vm: false, + vmax: false, + vmin: false, + vw: false + } + }); + + DEFAULTS.ie7 = merge(DEFAULTS.ie8, { + properties: { + ieBangHack: true + }, + selectors: { + ie7Hack: true, + mergeablePseudoClasses: [ + ":first-child", + ":first-letter", + ":hover", + ":visited" + ] + } + }); + + function compatibilityFrom(source) { + return merge(DEFAULTS["*"], calculateSource(source)); + } + + function merge(source, target) { + for (var key in source) { + var value = source[key]; + + if (typeof value === "object" && !Array.isArray(value)) { + target[key] = merge(value, target[key] || {}); + } else { + target[key] = key in target ? target[key] : value; + } + } + + return target; + } + + function calculateSource(source) { + if (typeof source == "object") return source; + + if (!/[,\+\-]/.test(source)) return DEFAULTS[source] || DEFAULTS["*"]; + + var parts = source.split(","); + var template = + parts[0] in DEFAULTS ? DEFAULTS[parts.shift()] : DEFAULTS["*"]; + + source = {}; + + parts.forEach(function(part) { + var isAdd = part[0] == "+"; + var key = part.substring(1).split("."); + var group = key[0]; + var option = key[1]; + + source[group] = source[group] || {}; + source[group][option] = isAdd; + }); + + return merge(template, source); + } + + module.exports = compatibilityFrom; + }, + {} + ], + 60: [ + function(require, module, exports) { + var loadRemoteResource = require("../reader/load-remote-resource"); + + function fetchFrom(callback) { + return callback || loadRemoteResource; + } + + module.exports = fetchFrom; + }, + { "../reader/load-remote-resource": 74 } + ], + 61: [ + function(require, module, exports) { + var systemLineBreak = require("os").EOL; + + var override = require("../utils/override"); + + var Breaks = { + AfterAtRule: "afterAtRule", + AfterBlockBegins: "afterBlockBegins", + AfterBlockEnds: "afterBlockEnds", + AfterComment: "afterComment", + AfterProperty: "afterProperty", + AfterRuleBegins: "afterRuleBegins", + AfterRuleEnds: "afterRuleEnds", + BeforeBlockEnds: "beforeBlockEnds", + BetweenSelectors: "betweenSelectors" + }; + + var BreakWith = { + CarriageReturnLineFeed: "\r\n", + LineFeed: "\n", + System: systemLineBreak + }; + + var IndentWith = { + Space: " ", + Tab: "\t" + }; + + var Spaces = { + AroundSelectorRelation: "aroundSelectorRelation", + BeforeBlockBegins: "beforeBlockBegins", + BeforeValue: "beforeValue" + }; + + var DEFAULTS = { + breaks: breaks(false), + breakWith: BreakWith.System, + indentBy: 0, + indentWith: IndentWith.Space, + spaces: spaces(false), + wrapAt: false, + semicolonAfterLastProperty: false + }; + + var BEAUTIFY_ALIAS = "beautify"; + var KEEP_BREAKS_ALIAS = "keep-breaks"; + + var OPTION_SEPARATOR = ";"; + var OPTION_NAME_VALUE_SEPARATOR = ":"; + var HASH_VALUES_OPTION_SEPARATOR = ","; + var HASH_VALUES_NAME_VALUE_SEPARATOR = "="; + + var FALSE_KEYWORD_1 = "false"; + var FALSE_KEYWORD_2 = "off"; + var TRUE_KEYWORD_1 = "true"; + var TRUE_KEYWORD_2 = "on"; + + function breaks(value) { + var breakOptions = {}; + + breakOptions[Breaks.AfterAtRule] = value; + breakOptions[Breaks.AfterBlockBegins] = value; + breakOptions[Breaks.AfterBlockEnds] = value; + breakOptions[Breaks.AfterComment] = value; + breakOptions[Breaks.AfterProperty] = value; + breakOptions[Breaks.AfterRuleBegins] = value; + breakOptions[Breaks.AfterRuleEnds] = value; + breakOptions[Breaks.BeforeBlockEnds] = value; + breakOptions[Breaks.BetweenSelectors] = value; + + return breakOptions; + } + + function spaces(value) { + var spaceOptions = {}; + + spaceOptions[Spaces.AroundSelectorRelation] = value; + spaceOptions[Spaces.BeforeBlockBegins] = value; + spaceOptions[Spaces.BeforeValue] = value; + + return spaceOptions; + } + + function formatFrom(source) { + if (source === undefined || source === false) { + return false; + } + + if (typeof source == "object" && "breakWith" in source) { + source = override(source, { + breakWith: mapBreakWith(source.breakWith) + }); + } + + if (typeof source == "object" && "indentBy" in source) { + source = override(source, { indentBy: parseInt(source.indentBy) }); + } + + if (typeof source == "object" && "indentWith" in source) { + source = override(source, { + indentWith: mapIndentWith(source.indentWith) + }); + } + + if (typeof source == "object") { + return override(DEFAULTS, source); + } + + if (typeof source == "object") { + return override(DEFAULTS, source); + } + + if (typeof source == "string" && source == BEAUTIFY_ALIAS) { + return override(DEFAULTS, { + breaks: breaks(true), + indentBy: 2, + spaces: spaces(true) + }); + } + + if (typeof source == "string" && source == KEEP_BREAKS_ALIAS) { + return override(DEFAULTS, { + breaks: { + afterAtRule: true, + afterBlockBegins: true, + afterBlockEnds: true, + afterComment: true, + afterRuleEnds: true, + beforeBlockEnds: true + } + }); + } + + if (typeof source == "string") { + return override(DEFAULTS, toHash(source)); + } + + return DEFAULTS; + } + + function toHash(string) { + return string + .split(OPTION_SEPARATOR) + .reduce(function(accumulator, directive) { + var parts = directive.split(OPTION_NAME_VALUE_SEPARATOR); + var name = parts[0]; + var value = parts[1]; + + if (name == "breaks" || name == "spaces") { + accumulator[name] = hashValuesToHash(value); + } else if (name == "indentBy" || name == "wrapAt") { + accumulator[name] = parseInt(value); + } else if (name == "indentWith") { + accumulator[name] = mapIndentWith(value); + } else if (name == "breakWith") { + accumulator[name] = mapBreakWith(value); + } + + return accumulator; + }, {}); + } + + function hashValuesToHash(string) { + return string + .split(HASH_VALUES_OPTION_SEPARATOR) + .reduce(function(accumulator, directive) { + var parts = directive.split(HASH_VALUES_NAME_VALUE_SEPARATOR); + var name = parts[0]; + var value = parts[1]; + + accumulator[name] = normalizeValue(value); + + return accumulator; + }, {}); + } + + function normalizeValue(value) { + switch (value) { + case FALSE_KEYWORD_1: + case FALSE_KEYWORD_2: + return false; + case TRUE_KEYWORD_1: + case TRUE_KEYWORD_2: + return true; + default: + return value; + } + } + + function mapBreakWith(value) { + switch (value) { + case "windows": + case "crlf": + case BreakWith.CarriageReturnLineFeed: + return BreakWith.CarriageReturnLineFeed; + case "unix": + case "lf": + case BreakWith.LineFeed: + return BreakWith.LineFeed; + default: + return systemLineBreak; + } + } + + function mapIndentWith(value) { + switch (value) { + case "space": + return IndentWith.Space; + case "tab": + return IndentWith.Tab; + default: + return value; + } + } + + module.exports = { + Breaks: Breaks, + Spaces: Spaces, + formatFrom: formatFrom + }; + }, + { "../utils/override": 95, os: 109 } + ], + 62: [ + function(require, module, exports) { + (function(process) { + var url = require("url"); + + var override = require("../utils/override"); + + function inlineRequestFrom(option) { + return override( + /* jshint camelcase: false */ + proxyOptionsFrom( + process.env.HTTP_PROXY || process.env.http_proxy + ), + option || {} + ); + } + + function proxyOptionsFrom(httpProxy) { + return httpProxy + ? { + hostname: url.parse(httpProxy).hostname, + port: parseInt(url.parse(httpProxy).port) + } + : {}; + } + + module.exports = inlineRequestFrom; + }.call(this, require("_process"))); + }, + { "../utils/override": 95, _process: 112, url: 162 } + ], + 63: [ + function(require, module, exports) { + var DEFAULT_TIMEOUT = 5000; + + function inlineTimeoutFrom(option) { + return option || DEFAULT_TIMEOUT; + } + + module.exports = inlineTimeoutFrom; + }, + {} + ], + 64: [ + function(require, module, exports) { + function inlineOptionsFrom(rules) { + if (Array.isArray(rules)) { + return rules; + } + + if (rules === false) { + return ["none"]; + } + + return undefined === rules ? ["local"] : rules.split(","); + } + + module.exports = inlineOptionsFrom; + }, + {} + ], + 65: [ + function(require, module, exports) { + var roundingPrecisionFrom = require("./rounding-precision") + .roundingPrecisionFrom; + + var override = require("../utils/override"); + + var OptimizationLevel = { + Zero: "0", + One: "1", + Two: "2" + }; + + var DEFAULTS = {}; + + DEFAULTS[OptimizationLevel.Zero] = {}; + DEFAULTS[OptimizationLevel.One] = { + cleanupCharsets: true, + normalizeUrls: true, + optimizeBackground: true, + optimizeBorderRadius: true, + optimizeFilter: true, + optimizeFontWeight: true, + optimizeOutline: true, + removeEmpty: true, + removeNegativePaddings: true, + removeQuotes: true, + removeWhitespace: true, + replaceMultipleZeros: true, + replaceTimeUnits: true, + replaceZeroUnits: true, + roundingPrecision: roundingPrecisionFrom(undefined), + selectorsSortingMethod: "standard", + specialComments: "all", + tidyAtRules: true, + tidyBlockScopes: true, + tidySelectors: true, + transform: noop + }; + DEFAULTS[OptimizationLevel.Two] = { + mergeAdjacentRules: true, + mergeIntoShorthands: true, + mergeMedia: true, + mergeNonAdjacentRules: true, + mergeSemantically: false, + overrideProperties: true, + removeEmpty: true, + reduceNonAdjacentRules: true, + removeDuplicateFontRules: true, + removeDuplicateMediaBlocks: true, + removeDuplicateRules: true, + removeUnusedAtRules: false, + restructureRules: false, + skipProperties: [] + }; + + var ALL_KEYWORD_1 = "*"; + var ALL_KEYWORD_2 = "all"; + var FALSE_KEYWORD_1 = "false"; + var FALSE_KEYWORD_2 = "off"; + var TRUE_KEYWORD_1 = "true"; + var TRUE_KEYWORD_2 = "on"; + + var LIST_VALUE_SEPARATOR = ","; + var OPTION_SEPARATOR = ";"; + var OPTION_VALUE_SEPARATOR = ":"; + + function noop() {} + + function optimizationLevelFrom(source) { + var level = override(DEFAULTS, {}); + var Zero = OptimizationLevel.Zero; + var One = OptimizationLevel.One; + var Two = OptimizationLevel.Two; + + if (undefined === source) { + delete level[Two]; + return level; + } + + if (typeof source == "string") { + source = parseInt(source); + } + + if (typeof source == "number" && source === parseInt(Two)) { + return level; + } + + if (typeof source == "number" && source === parseInt(One)) { + delete level[Two]; + return level; + } + + if (typeof source == "number" && source === parseInt(Zero)) { + delete level[Two]; + delete level[One]; + return level; + } + + if (typeof source == "object") { + source = covertValuesToHashes(source); + } + + if (One in source && "roundingPrecision" in source[One]) { + source[One].roundingPrecision = roundingPrecisionFrom( + source[One].roundingPrecision + ); + } + + if ( + Two in source && + "skipProperties" in source[Two] && + typeof source[Two].skipProperties == "string" + ) { + source[Two].skipProperties = source[Two].skipProperties.split( + LIST_VALUE_SEPARATOR + ); + } + + if (Zero in source || One in source || Two in source) { + level[Zero] = override(level[Zero], source[Zero]); + } + + if (One in source && ALL_KEYWORD_1 in source[One]) { + level[One] = override( + level[One], + defaults(One, normalizeValue(source[One][ALL_KEYWORD_1])) + ); + delete source[One][ALL_KEYWORD_1]; + } + + if (One in source && ALL_KEYWORD_2 in source[One]) { + level[One] = override( + level[One], + defaults(One, normalizeValue(source[One][ALL_KEYWORD_2])) + ); + delete source[One][ALL_KEYWORD_2]; + } + + if (One in source || Two in source) { + level[One] = override(level[One], source[One]); + } else { + delete level[One]; + } + + if (Two in source && ALL_KEYWORD_1 in source[Two]) { + level[Two] = override( + level[Two], + defaults(Two, normalizeValue(source[Two][ALL_KEYWORD_1])) + ); + delete source[Two][ALL_KEYWORD_1]; + } + + if (Two in source && ALL_KEYWORD_2 in source[Two]) { + level[Two] = override( + level[Two], + defaults(Two, normalizeValue(source[Two][ALL_KEYWORD_2])) + ); + delete source[Two][ALL_KEYWORD_2]; + } + + if (Two in source) { + level[Two] = override(level[Two], source[Two]); + } else { + delete level[Two]; + } + + return level; + } + + function defaults(level, value) { + var options = override(DEFAULTS[level], {}); + var key; + + for (key in options) { + if (typeof options[key] == "boolean") { + options[key] = value; + } + } + + return options; + } + + function normalizeValue(value) { + switch (value) { + case FALSE_KEYWORD_1: + case FALSE_KEYWORD_2: + return false; + case TRUE_KEYWORD_1: + case TRUE_KEYWORD_2: + return true; + default: + return value; + } + } + + function covertValuesToHashes(source) { + var clonedSource = override(source, {}); + var level; + var i; + + for (i = 0; i <= 2; i++) { + level = "" + i; + + if ( + level in clonedSource && + (clonedSource[level] === undefined || + clonedSource[level] === false) + ) { + delete clonedSource[level]; + } + + if (level in clonedSource && clonedSource[level] === true) { + clonedSource[level] = {}; + } + + if ( + level in clonedSource && + typeof clonedSource[level] == "string" + ) { + clonedSource[level] = covertToHash(clonedSource[level], level); + } + } + + return clonedSource; + } + + function covertToHash(asString, level) { + return asString + .split(OPTION_SEPARATOR) + .reduce(function(accumulator, directive) { + var parts = directive.split(OPTION_VALUE_SEPARATOR); + var name = parts[0]; + var value = parts[1]; + var normalizedValue = normalizeValue(value); + + if (ALL_KEYWORD_1 == name || ALL_KEYWORD_2 == name) { + accumulator = override( + accumulator, + defaults(level, normalizedValue) + ); + } else { + accumulator[name] = normalizedValue; + } + + return accumulator; + }, {}); + } + + module.exports = { + OptimizationLevel: OptimizationLevel, + optimizationLevelFrom: optimizationLevelFrom + }; + }, + { "../utils/override": 95, "./rounding-precision": 68 } + ], + 66: [ + function(require, module, exports) { + (function(process) { + var path = require("path"); + + function rebaseToFrom(option) { + return option ? path.resolve(option) : process.cwd(); + } + + module.exports = rebaseToFrom; + }.call(this, require("_process"))); + }, + { _process: 112, path: 110 } + ], + 67: [ + function(require, module, exports) { + function rebaseFrom(rebaseOption) { + return undefined === rebaseOption ? true : !!rebaseOption; + } + + module.exports = rebaseFrom; + }, + {} + ], + 68: [ + function(require, module, exports) { + var override = require("../utils/override"); + + var INTEGER_PATTERN = /^\d+$/; + + var ALL_UNITS = ["*", "all"]; + var DEFAULT_PRECISION = "off"; // all precision changes are disabled + var DIRECTIVES_SEPARATOR = ","; // e.g. *=5,px=3 + var DIRECTIVE_VALUE_SEPARATOR = "="; // e.g. *=5 + + function roundingPrecisionFrom(source) { + return override( + defaults(DEFAULT_PRECISION), + buildPrecisionFrom(source) + ); + } + + function defaults(value) { + return { + ch: value, + cm: value, + em: value, + ex: value, + in: value, + mm: value, + pc: value, + pt: value, + px: value, + q: value, + rem: value, + vh: value, + vmax: value, + vmin: value, + vw: value, + "%": value + }; + } + + function buildPrecisionFrom(source) { + if (source === null || source === undefined) { + return {}; + } + + if (typeof source == "boolean") { + return {}; + } + + if (typeof source == "number" && source == -1) { + return defaults(DEFAULT_PRECISION); + } + + if (typeof source == "number") { + return defaults(source); + } + + if (typeof source == "string" && INTEGER_PATTERN.test(source)) { + return defaults(parseInt(source)); + } + + if (typeof source == "string" && source == DEFAULT_PRECISION) { + return defaults(DEFAULT_PRECISION); + } + + if (typeof source == "object") { + return source; + } + + return source + .split(DIRECTIVES_SEPARATOR) + .reduce(function(accumulator, directive) { + var directiveParts = directive.split(DIRECTIVE_VALUE_SEPARATOR); + var name = directiveParts[0]; + var value = parseInt(directiveParts[1]); + + if (isNaN(value) || value == -1) { + value = DEFAULT_PRECISION; + } + + if (ALL_UNITS.indexOf(name) > -1) { + accumulator = override(accumulator, defaults(value)); + } else { + accumulator[name] = value; + } + + return accumulator; + }, {}); + } + + module.exports = { + DEFAULT: DEFAULT_PRECISION, + roundingPrecisionFrom: roundingPrecisionFrom + }; + }, + { "../utils/override": 95 } + ], + 69: [ + function(require, module, exports) { + (function(global, Buffer) { + var fs = require("fs"); + var path = require("path"); + + var isAllowedResource = require("./is-allowed-resource"); + var matchDataUri = require("./match-data-uri"); + var rebaseLocalMap = require("./rebase-local-map"); + var rebaseRemoteMap = require("./rebase-remote-map"); + + var Token = require("../tokenizer/token"); + var hasProtocol = require("../utils/has-protocol"); + var isDataUriResource = require("../utils/is-data-uri-resource"); + var isRemoteResource = require("../utils/is-remote-resource"); + + var MAP_MARKER_PATTERN = /^\/\*# sourceMappingURL=(\S+) \*\/$/; + + function applySourceMaps(tokens, context, callback) { + var applyContext = { + callback: callback, + fetch: context.options.fetch, + index: 0, + inline: context.options.inline, + inlineRequest: context.options.inlineRequest, + inlineTimeout: context.options.inlineTimeout, + inputSourceMapTracker: context.inputSourceMapTracker, + localOnly: context.localOnly, + processedTokens: [], + rebaseTo: context.options.rebaseTo, + sourceTokens: tokens, + warnings: context.warnings + }; + + return context.options.sourceMap && tokens.length > 0 + ? doApplySourceMaps(applyContext) + : callback(tokens); + } + + function doApplySourceMaps(applyContext) { + var singleSourceTokens = []; + var lastSource = findTokenSource(applyContext.sourceTokens[0]); + var source; + var token; + var l; + + for ( + l = applyContext.sourceTokens.length; + applyContext.index < l; + applyContext.index++ + ) { + token = applyContext.sourceTokens[applyContext.index]; + source = findTokenSource(token); + + if (source != lastSource) { + singleSourceTokens = []; + lastSource = source; + } + + singleSourceTokens.push(token); + applyContext.processedTokens.push(token); + + if ( + token[0] == Token.COMMENT && + MAP_MARKER_PATTERN.test(token[1]) + ) { + return fetchAndApplySourceMap( + token[1], + source, + singleSourceTokens, + applyContext + ); + } + } + + return applyContext.callback(applyContext.processedTokens); + } + + function findTokenSource(token) { + var scope; + var metadata; + + if (token[0] == Token.AT_RULE || token[0] == Token.COMMENT) { + metadata = token[2][0]; + } else { + scope = token[1][0]; + metadata = scope[2][0]; + } + + return metadata[2]; + } + + function fetchAndApplySourceMap( + sourceMapComment, + source, + singleSourceTokens, + applyContext + ) { + return extractInputSourceMapFrom( + sourceMapComment, + applyContext, + function(inputSourceMap) { + if (inputSourceMap) { + applyContext.inputSourceMapTracker.track( + source, + inputSourceMap + ); + applySourceMapRecursively( + singleSourceTokens, + applyContext.inputSourceMapTracker + ); + } + + applyContext.index++; + return doApplySourceMaps(applyContext); + } + ); + } + + function extractInputSourceMapFrom( + sourceMapComment, + applyContext, + whenSourceMapReady + ) { + var uri = MAP_MARKER_PATTERN.exec(sourceMapComment)[1]; + var absoluteUri; + var sourceMap; + var rebasedMap; + + if (isDataUriResource(uri)) { + sourceMap = extractInputSourceMapFromDataUri(uri); + return whenSourceMapReady(sourceMap); + } else if (isRemoteResource(uri)) { + return loadInputSourceMapFromRemoteUri( + uri, + applyContext, + function(sourceMap) { + var parsedMap; + + if (sourceMap) { + parsedMap = JSON.parse(sourceMap); + rebasedMap = rebaseRemoteMap(parsedMap, uri); + whenSourceMapReady(rebasedMap); + } else { + whenSourceMapReady(null); + } + } + ); + } else { + // at this point `uri` is already rebased, see lib/reader/rebase.js#rebaseSourceMapComment + // it is rebased to be consistent with rebasing other URIs + // however here we need to resolve it back to read it from disk + absoluteUri = path.resolve(applyContext.rebaseTo, uri); + sourceMap = loadInputSourceMapFromLocalUri( + absoluteUri, + applyContext + ); + + if (sourceMap) { + rebasedMap = rebaseLocalMap( + sourceMap, + absoluteUri, + applyContext.rebaseTo + ); + return whenSourceMapReady(rebasedMap); + } else { + return whenSourceMapReady(null); + } + } + } + + function extractInputSourceMapFromDataUri(uri) { + var dataUriMatch = matchDataUri(uri); + var charset = dataUriMatch[2] + ? dataUriMatch[2].split(/[=;]/)[2] + : "us-ascii"; + var encoding = dataUriMatch[3] + ? dataUriMatch[3].split(";")[1] + : "utf8"; + var data = + encoding == "utf8" + ? global.unescape(dataUriMatch[4]) + : dataUriMatch[4]; + + var buffer = new Buffer(data, encoding); + buffer.charset = charset; + + return JSON.parse(buffer.toString()); + } + + function loadInputSourceMapFromRemoteUri( + uri, + applyContext, + whenLoaded + ) { + var isAllowed = isAllowedResource(uri, true, applyContext.inline); + var isRuntimeResource = !hasProtocol(uri); + + if (applyContext.localOnly) { + applyContext.warnings.push( + 'Cannot fetch remote resource from "' + + uri + + '" as no callback given.' + ); + return whenLoaded(null); + } else if (isRuntimeResource) { + applyContext.warnings.push( + 'Cannot fetch "' + uri + '" as no protocol given.' + ); + return whenLoaded(null); + } else if (!isAllowed) { + applyContext.warnings.push( + 'Cannot fetch "' + uri + '" as resource is not allowed.' + ); + return whenLoaded(null); + } + + applyContext.fetch( + uri, + applyContext.inlineRequest, + applyContext.inlineTimeout, + function(error, body) { + if (error) { + applyContext.warnings.push( + 'Missing source map at "' + uri + '" - ' + error + ); + return whenLoaded(null); + } + + whenLoaded(body); + } + ); + } + + function loadInputSourceMapFromLocalUri(uri, applyContext) { + var isAllowed = isAllowedResource(uri, false, applyContext.inline); + var sourceMap; + + if (!fs.existsSync(uri) || !fs.statSync(uri).isFile()) { + applyContext.warnings.push( + 'Ignoring local source map at "' + + uri + + '" as resource is missing.' + ); + return null; + } else if (!isAllowed) { + applyContext.warnings.push( + 'Cannot fetch "' + uri + '" as resource is not allowed.' + ); + return null; + } + + sourceMap = fs.readFileSync(uri, "utf-8"); + return JSON.parse(sourceMap); + } + + function applySourceMapRecursively(tokens, inputSourceMapTracker) { + var token; + var i, l; + + for (i = 0, l = tokens.length; i < l; i++) { + token = tokens[i]; + + switch (token[0]) { + case Token.AT_RULE: + applySourceMapTo(token, inputSourceMapTracker); + break; + case Token.AT_RULE_BLOCK: + applySourceMapRecursively(token[1], inputSourceMapTracker); + applySourceMapRecursively(token[2], inputSourceMapTracker); + break; + case Token.AT_RULE_BLOCK_SCOPE: + applySourceMapTo(token, inputSourceMapTracker); + break; + case Token.NESTED_BLOCK: + applySourceMapRecursively(token[1], inputSourceMapTracker); + applySourceMapRecursively(token[2], inputSourceMapTracker); + break; + case Token.NESTED_BLOCK_SCOPE: + applySourceMapTo(token, inputSourceMapTracker); + break; + case Token.COMMENT: + applySourceMapTo(token, inputSourceMapTracker); + break; + case Token.PROPERTY: + applySourceMapRecursively(token, inputSourceMapTracker); + break; + case Token.PROPERTY_BLOCK: + applySourceMapRecursively(token[1], inputSourceMapTracker); + break; + case Token.PROPERTY_NAME: + applySourceMapTo(token, inputSourceMapTracker); + break; + case Token.PROPERTY_VALUE: + applySourceMapTo(token, inputSourceMapTracker); + break; + case Token.RULE: + applySourceMapRecursively(token[1], inputSourceMapTracker); + applySourceMapRecursively(token[2], inputSourceMapTracker); + break; + case Token.RULE_SCOPE: + applySourceMapTo(token, inputSourceMapTracker); + } + } + + return tokens; + } + + function applySourceMapTo(token, inputSourceMapTracker) { + var value = token[1]; + var metadata = token[2]; + var newMetadata = []; + var i, l; + + for (i = 0, l = metadata.length; i < l; i++) { + newMetadata.push( + inputSourceMapTracker.originalPositionFor( + metadata[i], + value.length + ) + ); + } + + token[2] = newMetadata; + } + + module.exports = applySourceMaps; + }.call( + this, + typeof global !== "undefined" + ? global + : typeof self !== "undefined" + ? self + : typeof window !== "undefined" + ? window + : {}, + require("buffer").Buffer + )); + }, + { + "../tokenizer/token": 84, + "../utils/has-protocol": 88, + "../utils/is-data-uri-resource": 89, + "../utils/is-remote-resource": 93, + "./is-allowed-resource": 72, + "./match-data-uri": 75, + "./rebase-local-map": 78, + "./rebase-remote-map": 79, + buffer: 4, + fs: 3, + path: 110 + } + ], + 70: [ + function(require, module, exports) { + var split = require("../utils/split"); + + var BRACE_PREFIX = /^\(/; + var BRACE_SUFFIX = /\)$/; + var IMPORT_PREFIX_PATTERN = /^@import/i; + var QUOTE_PREFIX_PATTERN = /['"]\s*/; + var QUOTE_SUFFIX_PATTERN = /\s*['"]/; + var URL_PREFIX_PATTERN = /^url\(\s*/i; + var URL_SUFFIX_PATTERN = /\s*\)/i; + + function extractImportUrlAndMedia(atRuleValue) { + var uri; + var mediaQuery; + var stripped; + var parts; + + stripped = atRuleValue + .replace(IMPORT_PREFIX_PATTERN, "") + .trim() + .replace(URL_PREFIX_PATTERN, "(") + .replace(URL_SUFFIX_PATTERN, ")") + .replace(QUOTE_PREFIX_PATTERN, "") + .replace(QUOTE_SUFFIX_PATTERN, ""); + + parts = split(stripped, " "); + + uri = parts[0].replace(BRACE_PREFIX, "").replace(BRACE_SUFFIX, ""); + mediaQuery = parts.slice(1).join(" "); + + return [uri, mediaQuery]; + } + + module.exports = extractImportUrlAndMedia; + }, + { "../utils/split": 96 } + ], + 71: [ + function(require, module, exports) { + var SourceMapConsumer = require("source-map").SourceMapConsumer; + + function inputSourceMapTracker() { + var maps = {}; + + return { + all: all.bind(null, maps), + isTracking: isTracking.bind(null, maps), + originalPositionFor: originalPositionFor.bind(null, maps), + track: track.bind(null, maps) + }; + } + + function all(maps) { + return maps; + } + + function isTracking(maps, source) { + return source in maps; + } + + function originalPositionFor(maps, metadata, range, selectorFallbacks) { + var line = metadata[0]; + var column = metadata[1]; + var source = metadata[2]; + var position = { + line: line, + column: column + range + }; + var originalPosition; + + while (!originalPosition && position.column > column) { + position.column--; + originalPosition = maps[source].originalPositionFor(position); + } + + if (!originalPosition || originalPosition.column < 0) { + return metadata; + } + + if ( + originalPosition.line === null && + line > 1 && + selectorFallbacks > 0 + ) { + return originalPositionFor( + maps, + [line - 1, column, source], + range, + selectorFallbacks - 1 + ); + } + + return originalPosition.line !== null + ? toMetadata(originalPosition) + : metadata; + } + + function toMetadata(asHash) { + return [asHash.line, asHash.column, asHash.source]; + } + + function track(maps, source, data) { + maps[source] = new SourceMapConsumer(data); + } + + module.exports = inputSourceMapTracker; + }, + { "source-map": 155 } + ], + 72: [ + function(require, module, exports) { + var path = require("path"); + var url = require("url"); + + var isRemoteResource = require("../utils/is-remote-resource"); + var hasProtocol = require("../utils/has-protocol"); + + var HTTP_PROTOCOL = "http:"; + + function isAllowedResource(uri, isRemote, rules) { + var match; + var absoluteUri; + var allowed = isRemote ? false : true; + var rule; + var isNegated; + var normalizedRule; + var i; + + if (rules.length === 0) { + return false; + } + + if (isRemote && !hasProtocol(uri)) { + uri = HTTP_PROTOCOL + uri; + } + + match = isRemote ? url.parse(uri).host : uri; + + absoluteUri = isRemote ? uri : path.resolve(uri); + + for (i = 0; i < rules.length; i++) { + rule = rules[i]; + isNegated = rule[0] == "!"; + normalizedRule = rule.substring(1); + + if (isNegated && isRemote && isRemoteRule(normalizedRule)) { + allowed = + allowed && !isAllowedResource(uri, true, [normalizedRule]); + } else if ( + isNegated && + !isRemote && + !isRemoteRule(normalizedRule) + ) { + allowed = + allowed && !isAllowedResource(uri, false, [normalizedRule]); + } else if (isNegated) { + allowed = allowed && true; + } else if (rule == "all") { + allowed = true; + } else if (isRemote && rule == "local") { + allowed = allowed || false; + } else if (isRemote && rule == "remote") { + allowed = true; + } else if (!isRemote && rule == "remote") { + allowed = false; + } else if (!isRemote && rule == "local") { + allowed = true; + } else if (rule === match) { + allowed = true; + } else if (rule === uri) { + allowed = true; + } else if (isRemote && absoluteUri.indexOf(rule) === 0) { + allowed = true; + } else if ( + !isRemote && + absoluteUri.indexOf(path.resolve(rule)) === 0 + ) { + allowed = true; + } else if (isRemote != isRemoteRule(normalizedRule)) { + allowed = allowed && true; + } else { + allowed = false; + } + } + + return allowed; + } + + function isRemoteRule(rule) { + return ( + isRemoteResource(rule) || + url.parse(HTTP_PROTOCOL + "//" + rule).host == rule + ); + } + + module.exports = isAllowedResource; + }, + { + "../utils/has-protocol": 88, + "../utils/is-remote-resource": 93, + path: 110, + url: 162 + } + ], + 73: [ + function(require, module, exports) { + var fs = require("fs"); + var path = require("path"); + + var isAllowedResource = require("./is-allowed-resource"); + + var hasProtocol = require("../utils/has-protocol"); + var isRemoteResource = require("../utils/is-remote-resource"); + + function loadOriginalSources(context, callback) { + var loadContext = { + callback: callback, + fetch: context.options.fetch, + index: 0, + inline: context.options.inline, + inlineRequest: context.options.inlineRequest, + inlineTimeout: context.options.inlineTimeout, + localOnly: context.localOnly, + rebaseTo: context.options.rebaseTo, + sourcesContent: context.sourcesContent, + uriToSource: uriToSourceMapping( + context.inputSourceMapTracker.all() + ), + warnings: context.warnings + }; + + return context.options.sourceMap && + context.options.sourceMapInlineSources + ? doLoadOriginalSources(loadContext) + : callback(); + } + + function uriToSourceMapping(allSourceMapConsumers) { + var mapping = {}; + var consumer; + var uri; + var source; + var i, l; + + for (source in allSourceMapConsumers) { + consumer = allSourceMapConsumers[source]; + + for (i = 0, l = consumer.sources.length; i < l; i++) { + uri = consumer.sources[i]; + source = consumer.sourceContentFor(uri, true); + + mapping[uri] = source; + } + } + + return mapping; + } + + function doLoadOriginalSources(loadContext) { + var uris = Object.keys(loadContext.uriToSource); + var uri; + var source; + var total; + + for ( + total = uris.length; + loadContext.index < total; + loadContext.index++ + ) { + uri = uris[loadContext.index]; + source = loadContext.uriToSource[uri]; + + if (source) { + loadContext.sourcesContent[uri] = source; + } else { + return loadOriginalSource(uri, loadContext); + } + } + + return loadContext.callback(); + } + + function loadOriginalSource(uri, loadContext) { + var content; + + if (isRemoteResource(uri)) { + return loadOriginalSourceFromRemoteUri(uri, loadContext, function( + content + ) { + loadContext.index++; + loadContext.sourcesContent[uri] = content; + return doLoadOriginalSources(loadContext); + }); + } else { + content = loadOriginalSourceFromLocalUri(uri, loadContext); + loadContext.index++; + loadContext.sourcesContent[uri] = content; + return doLoadOriginalSources(loadContext); + } + } + + function loadOriginalSourceFromRemoteUri(uri, loadContext, whenLoaded) { + var isAllowed = isAllowedResource(uri, true, loadContext.inline); + var isRuntimeResource = !hasProtocol(uri); + + if (loadContext.localOnly) { + loadContext.warnings.push( + 'Cannot fetch remote resource from "' + + uri + + '" as no callback given.' + ); + return whenLoaded(null); + } else if (isRuntimeResource) { + loadContext.warnings.push( + 'Cannot fetch "' + uri + '" as no protocol given.' + ); + return whenLoaded(null); + } else if (!isAllowed) { + loadContext.warnings.push( + 'Cannot fetch "' + uri + '" as resource is not allowed.' + ); + return whenLoaded(null); + } + + loadContext.fetch( + uri, + loadContext.inlineRequest, + loadContext.inlineTimeout, + function(error, content) { + if (error) { + loadContext.warnings.push( + 'Missing original source at "' + uri + '" - ' + error + ); + } + + whenLoaded(content); + } + ); + } + + function loadOriginalSourceFromLocalUri(relativeUri, loadContext) { + var isAllowed = isAllowedResource( + relativeUri, + false, + loadContext.inline + ); + var absoluteUri = path.resolve(loadContext.rebaseTo, relativeUri); + + if ( + !fs.existsSync(absoluteUri) || + !fs.statSync(absoluteUri).isFile() + ) { + loadContext.warnings.push( + 'Ignoring local source map at "' + + absoluteUri + + '" as resource is missing.' + ); + return null; + } else if (!isAllowed) { + loadContext.warnings.push( + 'Cannot fetch "' + absoluteUri + '" as resource is not allowed.' + ); + return null; + } + + return fs.readFileSync(absoluteUri, "utf8"); + } + + module.exports = loadOriginalSources; + }, + { + "../utils/has-protocol": 88, + "../utils/is-remote-resource": 93, + "./is-allowed-resource": 72, + fs: 3, + path: 110 + } + ], + 74: [ + function(require, module, exports) { + var http = require("http"); + var https = require("https"); + var url = require("url"); + + var isHttpResource = require("../utils/is-http-resource"); + var isHttpsResource = require("../utils/is-https-resource"); + var override = require("../utils/override"); + + var HTTP_PROTOCOL = "http:"; + + function loadRemoteResource( + uri, + inlineRequest, + inlineTimeout, + callback + ) { + var proxyProtocol = inlineRequest.protocol || inlineRequest.hostname; + var errorHandled = false; + var requestOptions; + var fetch; + + requestOptions = override(url.parse(uri), inlineRequest || {}); + + if (inlineRequest.hostname !== undefined) { + // overwrite as we always expect a http proxy currently + requestOptions.protocol = inlineRequest.protocol || HTTP_PROTOCOL; + requestOptions.path = requestOptions.href; + } + + fetch = + (proxyProtocol && !isHttpsResource(proxyProtocol)) || + isHttpResource(uri) + ? http.get + : https.get; + + fetch(requestOptions, function(res) { + var chunks = []; + var movedUri; + + if (errorHandled) { + return; + } + + if (res.statusCode < 200 || res.statusCode > 399) { + return callback(res.statusCode, null); + } else if (res.statusCode > 299) { + movedUri = url.resolve(uri, res.headers.location); + return loadRemoteResource( + movedUri, + inlineRequest, + inlineTimeout, + callback + ); + } + + res.on("data", function(chunk) { + chunks.push(chunk.toString()); + }); + res.on("end", function() { + var body = chunks.join(""); + callback(null, body); + }); + }) + .on("error", function(res) { + if (errorHandled) { + return; + } + + errorHandled = true; + callback(res.message, null); + }) + .on("timeout", function() { + if (errorHandled) { + return; + } + + errorHandled = true; + callback("timeout", null); + }) + .setTimeout(inlineTimeout); + } + + module.exports = loadRemoteResource; + }, + { + "../utils/is-http-resource": 90, + "../utils/is-https-resource": 91, + "../utils/override": 95, + http: 156, + https: 104, + url: 162 + } + ], + 75: [ + function(require, module, exports) { + var DATA_URI_PATTERN = /^data:(\S*?)?(;charset=[^;]+)?(;[^,]+?)?,(.+)/; + + function matchDataUri(uri) { + return DATA_URI_PATTERN.exec(uri); + } + + module.exports = matchDataUri; + }, + {} + ], + 76: [ + function(require, module, exports) { + var UNIX_SEPARATOR = "/"; + var WINDOWS_SEPARATOR_PATTERN = /\\/g; + + function normalizePath(path) { + return path.replace(WINDOWS_SEPARATOR_PATTERN, UNIX_SEPARATOR); + } + + module.exports = normalizePath; + }, + {} + ], + 77: [ + function(require, module, exports) { + (function(Buffer, process) { + var fs = require("fs"); + var path = require("path"); + + var applySourceMaps = require("./apply-source-maps"); + var extractImportUrlAndMedia = require("./extract-import-url-and-media"); + var isAllowedResource = require("./is-allowed-resource"); + var loadOriginalSources = require("./load-original-sources"); + var normalizePath = require("./normalize-path"); + var rebase = require("./rebase"); + var rebaseLocalMap = require("./rebase-local-map"); + var rebaseRemoteMap = require("./rebase-remote-map"); + var restoreImport = require("./restore-import"); + + var tokenize = require("../tokenizer/tokenize"); + var Token = require("../tokenizer/token"); + var Marker = require("../tokenizer/marker"); + var hasProtocol = require("../utils/has-protocol"); + var isImport = require("../utils/is-import"); + var isRemoteResource = require("../utils/is-remote-resource"); + + var UNKNOWN_URI = "uri:unknown"; + + function readSources(input, context, callback) { + return doReadSources(input, context, function(tokens) { + return applySourceMaps(tokens, context, function() { + return loadOriginalSources(context, function() { + return callback(tokens); + }); + }); + }); + } + + function doReadSources(input, context, callback) { + if (typeof input == "string") { + return fromString(input, context, callback); + } else if (Buffer.isBuffer(input)) { + return fromString(input.toString(), context, callback); + } else if (Array.isArray(input)) { + return fromArray(input, context, callback); + } else if (typeof input == "object") { + return fromHash(input, context, callback); + } + } + + function fromString(input, context, callback) { + context.source = undefined; + context.sourcesContent[undefined] = input; + context.stats.originalSize += input.length; + + return fromStyles( + input, + context, + { inline: context.options.inline }, + callback + ); + } + + function fromArray(input, context, callback) { + var inputAsImports = input.reduce(function(accumulator, uriOrHash) { + if (typeof uriOrHash === "string") { + return addStringSource(uriOrHash, accumulator); + } else { + return addHashSource(uriOrHash, context, accumulator); + } + }, []); + + return fromStyles( + inputAsImports.join(""), + context, + { inline: ["all"] }, + callback + ); + } + + function fromHash(input, context, callback) { + var inputAsImports = addHashSource(input, context, []); + return fromStyles( + inputAsImports.join(""), + context, + { inline: ["all"] }, + callback + ); + } + + function addStringSource(input, imports) { + imports.push(restoreAsImport(normalizeUri(input))); + return imports; + } + + function addHashSource(input, context, imports) { + var uri; + var normalizedUri; + var source; + + for (uri in input) { + source = input[uri]; + normalizedUri = normalizeUri(uri); + + imports.push(restoreAsImport(normalizedUri)); + + context.sourcesContent[normalizedUri] = source.styles; + + if (source.sourceMap) { + trackSourceMap(source.sourceMap, normalizedUri, context); + } + } + + return imports; + } + + function normalizeUri(uri) { + var currentPath = path.resolve(""); + var absoluteUri; + var relativeToCurrentPath; + var normalizedUri; + + if (isRemoteResource(uri)) { + return uri; + } + + absoluteUri = path.isAbsolute(uri) ? uri : path.resolve(uri); + relativeToCurrentPath = path.relative(currentPath, absoluteUri); + normalizedUri = normalizePath(relativeToCurrentPath); + + return normalizedUri; + } + + function trackSourceMap(sourceMap, uri, context) { + var parsedMap = + typeof sourceMap == "string" ? JSON.parse(sourceMap) : sourceMap; + var rebasedMap = isRemoteResource(uri) + ? rebaseRemoteMap(parsedMap, uri) + : rebaseLocalMap( + parsedMap, + uri || UNKNOWN_URI, + context.options.rebaseTo + ); + + context.inputSourceMapTracker.track(uri, rebasedMap); + } + + function restoreAsImport(uri) { + return restoreImport("url(" + uri + ")", "") + Marker.SEMICOLON; + } + + function fromStyles(styles, context, parentInlinerContext, callback) { + var tokens; + var rebaseConfig = {}; + + if (!context.source) { + rebaseConfig.fromBase = path.resolve(""); + rebaseConfig.toBase = context.options.rebaseTo; + } else if (isRemoteResource(context.source)) { + rebaseConfig.fromBase = context.source; + rebaseConfig.toBase = context.source; + } else if (path.isAbsolute(context.source)) { + rebaseConfig.fromBase = path.dirname(context.source); + rebaseConfig.toBase = context.options.rebaseTo; + } else { + rebaseConfig.fromBase = path.dirname( + path.resolve(context.source) + ); + rebaseConfig.toBase = context.options.rebaseTo; + } + + tokens = tokenize(styles, context); + tokens = rebase( + tokens, + context.options.rebase, + context.validator, + rebaseConfig + ); + + return allowsAnyImports(parentInlinerContext.inline) + ? inline(tokens, context, parentInlinerContext, callback) + : callback(tokens); + } + + function allowsAnyImports(inline) { + return !(inline.length == 1 && inline[0] == "none"); + } + + function inline( + tokens, + externalContext, + parentInlinerContext, + callback + ) { + var inlinerContext = { + afterContent: false, + callback: callback, + errors: externalContext.errors, + externalContext: externalContext, + fetch: externalContext.options.fetch, + inlinedStylesheets: + parentInlinerContext.inlinedStylesheets || + externalContext.inlinedStylesheets, + inline: parentInlinerContext.inline, + inlineRequest: externalContext.options.inlineRequest, + inlineTimeout: externalContext.options.inlineTimeout, + isRemote: parentInlinerContext.isRemote || false, + localOnly: externalContext.localOnly, + outputTokens: [], + rebaseTo: externalContext.options.rebaseTo, + sourceTokens: tokens, + warnings: externalContext.warnings + }; + + return doInlineImports(inlinerContext); + } + + function doInlineImports(inlinerContext) { + var token; + var i, l; + + for (i = 0, l = inlinerContext.sourceTokens.length; i < l; i++) { + token = inlinerContext.sourceTokens[i]; + + if (token[0] == Token.AT_RULE && isImport(token[1])) { + inlinerContext.sourceTokens.splice(0, i); + return inlineStylesheet(token, inlinerContext); + } else if ( + token[0] == Token.AT_RULE || + token[0] == Token.COMMENT + ) { + inlinerContext.outputTokens.push(token); + } else { + inlinerContext.outputTokens.push(token); + inlinerContext.afterContent = true; + } + } + + inlinerContext.sourceTokens = []; + return inlinerContext.callback(inlinerContext.outputTokens); + } + + function inlineStylesheet(token, inlinerContext) { + var uriAndMediaQuery = extractImportUrlAndMedia(token[1]); + var uri = uriAndMediaQuery[0]; + var mediaQuery = uriAndMediaQuery[1]; + var metadata = token[2]; + + return isRemoteResource(uri) + ? inlineRemoteStylesheet( + uri, + mediaQuery, + metadata, + inlinerContext + ) + : inlineLocalStylesheet( + uri, + mediaQuery, + metadata, + inlinerContext + ); + } + + function inlineRemoteStylesheet( + uri, + mediaQuery, + metadata, + inlinerContext + ) { + var isAllowed = isAllowedResource(uri, true, inlinerContext.inline); + var originalUri = uri; + var isLoaded = uri in inlinerContext.externalContext.sourcesContent; + var isRuntimeResource = !hasProtocol(uri); + + if (inlinerContext.inlinedStylesheets.indexOf(uri) > -1) { + inlinerContext.warnings.push( + 'Ignoring remote @import of "' + + uri + + '" as it has already been imported.' + ); + inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice( + 1 + ); + return doInlineImports(inlinerContext); + } else if ( + inlinerContext.localOnly && + inlinerContext.afterContent + ) { + inlinerContext.warnings.push( + 'Ignoring remote @import of "' + + uri + + '" as no callback given and after other content.' + ); + inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice( + 1 + ); + return doInlineImports(inlinerContext); + } else if (isRuntimeResource) { + inlinerContext.warnings.push( + 'Skipping remote @import of "' + uri + '" as no protocol given.' + ); + inlinerContext.outputTokens = inlinerContext.outputTokens.concat( + inlinerContext.sourceTokens.slice(0, 1) + ); + inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice( + 1 + ); + return doInlineImports(inlinerContext); + } else if (inlinerContext.localOnly && !isLoaded) { + inlinerContext.warnings.push( + 'Skipping remote @import of "' + uri + '" as no callback given.' + ); + inlinerContext.outputTokens = inlinerContext.outputTokens.concat( + inlinerContext.sourceTokens.slice(0, 1) + ); + inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice( + 1 + ); + return doInlineImports(inlinerContext); + } else if (!isAllowed && inlinerContext.afterContent) { + inlinerContext.warnings.push( + 'Ignoring remote @import of "' + + uri + + '" as resource is not allowed and after other content.' + ); + inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice( + 1 + ); + return doInlineImports(inlinerContext); + } else if (!isAllowed) { + inlinerContext.warnings.push( + 'Skipping remote @import of "' + + uri + + '" as resource is not allowed.' + ); + inlinerContext.outputTokens = inlinerContext.outputTokens.concat( + inlinerContext.sourceTokens.slice(0, 1) + ); + inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice( + 1 + ); + return doInlineImports(inlinerContext); + } + + inlinerContext.inlinedStylesheets.push(uri); + + function whenLoaded(error, importedStyles) { + if (error) { + inlinerContext.errors.push( + 'Broken @import declaration of "' + uri + '" - ' + error + ); + + return process.nextTick(function() { + inlinerContext.outputTokens = inlinerContext.outputTokens.concat( + inlinerContext.sourceTokens.slice(0, 1) + ); + inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice( + 1 + ); + doInlineImports(inlinerContext); + }); + } + + inlinerContext.inline = + inlinerContext.externalContext.options.inline; + inlinerContext.isRemote = true; + + inlinerContext.externalContext.source = originalUri; + inlinerContext.externalContext.sourcesContent[ + uri + ] = importedStyles; + inlinerContext.externalContext.stats.originalSize += + importedStyles.length; + + return fromStyles( + importedStyles, + inlinerContext.externalContext, + inlinerContext, + function(importedTokens) { + importedTokens = wrapInMedia( + importedTokens, + mediaQuery, + metadata + ); + + inlinerContext.outputTokens = inlinerContext.outputTokens.concat( + importedTokens + ); + inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice( + 1 + ); + + return doInlineImports(inlinerContext); + } + ); + } + + return isLoaded + ? whenLoaded( + null, + inlinerContext.externalContext.sourcesContent[uri] + ) + : inlinerContext.fetch( + uri, + inlinerContext.inlineRequest, + inlinerContext.inlineTimeout, + whenLoaded + ); + } + + function inlineLocalStylesheet( + uri, + mediaQuery, + metadata, + inlinerContext + ) { + var currentPath = path.resolve(""); + var absoluteUri = path.isAbsolute(uri) + ? path.resolve( + currentPath, + uri[0] == "/" ? uri.substring(1) : uri + ) + : path.resolve(inlinerContext.rebaseTo, uri); + var relativeToCurrentPath = path.relative(currentPath, absoluteUri); + var importedStyles; + var isAllowed = isAllowedResource( + uri, + false, + inlinerContext.inline + ); + var normalizedPath = normalizePath(relativeToCurrentPath); + var isLoaded = + normalizedPath in inlinerContext.externalContext.sourcesContent; + + if (inlinerContext.inlinedStylesheets.indexOf(absoluteUri) > -1) { + inlinerContext.warnings.push( + 'Ignoring local @import of "' + + uri + + '" as it has already been imported.' + ); + } else if ( + !isLoaded && + (!fs.existsSync(absoluteUri) || + !fs.statSync(absoluteUri).isFile()) + ) { + inlinerContext.errors.push( + 'Ignoring local @import of "' + + uri + + '" as resource is missing.' + ); + } else if (!isAllowed && inlinerContext.afterContent) { + inlinerContext.warnings.push( + 'Ignoring local @import of "' + + uri + + '" as resource is not allowed and after other content.' + ); + } else if (inlinerContext.afterContent) { + inlinerContext.warnings.push( + 'Ignoring local @import of "' + + uri + + '" as after other content.' + ); + } else if (!isAllowed) { + inlinerContext.warnings.push( + 'Skipping local @import of "' + + uri + + '" as resource is not allowed.' + ); + inlinerContext.outputTokens = inlinerContext.outputTokens.concat( + inlinerContext.sourceTokens.slice(0, 1) + ); + } else { + importedStyles = isLoaded + ? inlinerContext.externalContext.sourcesContent[normalizedPath] + : fs.readFileSync(absoluteUri, "utf-8"); + + inlinerContext.inlinedStylesheets.push(absoluteUri); + inlinerContext.inline = + inlinerContext.externalContext.options.inline; + + inlinerContext.externalContext.source = normalizedPath; + inlinerContext.externalContext.sourcesContent[ + normalizedPath + ] = importedStyles; + inlinerContext.externalContext.stats.originalSize += + importedStyles.length; + + return fromStyles( + importedStyles, + inlinerContext.externalContext, + inlinerContext, + function(importedTokens) { + importedTokens = wrapInMedia( + importedTokens, + mediaQuery, + metadata + ); + + inlinerContext.outputTokens = inlinerContext.outputTokens.concat( + importedTokens + ); + inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice( + 1 + ); + + return doInlineImports(inlinerContext); + } + ); + } + + inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1); + + return doInlineImports(inlinerContext); + } + + function wrapInMedia(tokens, mediaQuery, metadata) { + if (mediaQuery) { + return [ + [ + Token.NESTED_BLOCK, + [ + [Token.NESTED_BLOCK_SCOPE, "@media " + mediaQuery, metadata] + ], + tokens + ] + ]; + } else { + return tokens; + } + } + + module.exports = readSources; + }.call( + this, + { isBuffer: require("../../../is-buffer/index.js") }, + require("_process") + )); + }, + { + "../../../is-buffer/index.js": 107, + "../tokenizer/marker": 83, + "../tokenizer/token": 84, + "../tokenizer/tokenize": 85, + "../utils/has-protocol": 88, + "../utils/is-import": 92, + "../utils/is-remote-resource": 93, + "./apply-source-maps": 69, + "./extract-import-url-and-media": 70, + "./is-allowed-resource": 72, + "./load-original-sources": 73, + "./normalize-path": 76, + "./rebase": 80, + "./rebase-local-map": 78, + "./rebase-remote-map": 79, + "./restore-import": 81, + _process: 112, + fs: 3, + path: 110 + } + ], + 78: [ + function(require, module, exports) { + var path = require("path"); + + function rebaseLocalMap(sourceMap, sourceUri, rebaseTo) { + var currentPath = path.resolve(""); + var absoluteUri = path.resolve(currentPath, sourceUri); + var absoluteUriDirectory = path.dirname(absoluteUri); + + sourceMap.sources = sourceMap.sources.map(function(source) { + return path.relative( + rebaseTo, + path.resolve(absoluteUriDirectory, source) + ); + }); + + return sourceMap; + } + + module.exports = rebaseLocalMap; + }, + { path: 110 } + ], + 79: [ + function(require, module, exports) { + var path = require("path"); + var url = require("url"); + + function rebaseRemoteMap(sourceMap, sourceUri) { + var sourceDirectory = path.dirname(sourceUri); + + sourceMap.sources = sourceMap.sources.map(function(source) { + return url.resolve(sourceDirectory, source); + }); + + return sourceMap; + } + + module.exports = rebaseRemoteMap; + }, + { path: 110, url: 162 } + ], + 80: [ + function(require, module, exports) { + var extractImportUrlAndMedia = require("./extract-import-url-and-media"); + var restoreImport = require("./restore-import"); + var rewriteUrl = require("./rewrite-url"); + + var Token = require("../tokenizer/token"); + var isImport = require("../utils/is-import"); + + var SOURCE_MAP_COMMENT_PATTERN = /^\/\*# sourceMappingURL=(\S+) \*\/$/; + + function rebase(tokens, rebaseAll, validator, rebaseConfig) { + return rebaseAll + ? rebaseEverything(tokens, validator, rebaseConfig) + : rebaseAtRules(tokens, validator, rebaseConfig); + } + + function rebaseEverything(tokens, validator, rebaseConfig) { + var token; + var i, l; + + for (i = 0, l = tokens.length; i < l; i++) { + token = tokens[i]; + + switch (token[0]) { + case Token.AT_RULE: + rebaseAtRule(token, validator, rebaseConfig); + break; + case Token.AT_RULE_BLOCK: + rebaseProperties(token[2], validator, rebaseConfig); + break; + case Token.COMMENT: + rebaseSourceMapComment(token, rebaseConfig); + break; + case Token.NESTED_BLOCK: + rebaseEverything(token[2], validator, rebaseConfig); + break; + case Token.RULE: + rebaseProperties(token[2], validator, rebaseConfig); + break; + } + } + + return tokens; + } + + function rebaseAtRules(tokens, validator, rebaseConfig) { + var token; + var i, l; + + for (i = 0, l = tokens.length; i < l; i++) { + token = tokens[i]; + + switch (token[0]) { + case Token.AT_RULE: + rebaseAtRule(token, validator, rebaseConfig); + break; + } + } + + return tokens; + } + + function rebaseAtRule(token, validator, rebaseConfig) { + if (!isImport(token[1])) { + return; + } + + var uriAndMediaQuery = extractImportUrlAndMedia(token[1]); + var newUrl = rewriteUrl(uriAndMediaQuery[0], rebaseConfig); + var mediaQuery = uriAndMediaQuery[1]; + + token[1] = restoreImport(newUrl, mediaQuery); + } + + function rebaseSourceMapComment(token, rebaseConfig) { + var matches = SOURCE_MAP_COMMENT_PATTERN.exec(token[1]); + + if (matches && matches[1].indexOf("data:") === -1) { + token[1] = token[1].replace( + matches[1], + rewriteUrl(matches[1], rebaseConfig, true) + ); + } + } + + function rebaseProperties(properties, validator, rebaseConfig) { + var property; + var value; + var i, l; + var j, m; + + for (i = 0, l = properties.length; i < l; i++) { + property = properties[i]; + + for ( + j = 2 /* 0 is Token.PROPERTY, 1 is name */, m = property.length; + j < m; + j++ + ) { + value = property[j][1]; + + if (validator.isUrl(value)) { + property[j][1] = rewriteUrl(value, rebaseConfig); + } + } + } + } + + module.exports = rebase; + }, + { + "../tokenizer/token": 84, + "../utils/is-import": 92, + "./extract-import-url-and-media": 70, + "./restore-import": 81, + "./rewrite-url": 82 + } + ], + 81: [ + function(require, module, exports) { + function restoreImport(uri, mediaQuery) { + return ("@import " + uri + " " + mediaQuery).trim(); + } + + module.exports = restoreImport; + }, + {} + ], + 82: [ + function(require, module, exports) { + (function(process) { + var path = require("path"); + var url = require("url"); + + var DOUBLE_QUOTE = '"'; + var SINGLE_QUOTE = "'"; + var URL_PREFIX = "url("; + var URL_SUFFIX = ")"; + + var QUOTE_PREFIX_PATTERN = /^["']/; + var QUOTE_SUFFIX_PATTERN = /["']$/; + var ROUND_BRACKETS_PATTERN = /[\(\)]/; + var URL_PREFIX_PATTERN = /^url\(/i; + var URL_SUFFIX_PATTERN = /\)$/; + var WHITESPACE_PATTERN = /\s/; + + var isWindows = process.platform == "win32"; + + function rebase(uri, rebaseConfig) { + if (!rebaseConfig) { + return uri; + } + + if (isAbsolute(uri) && !isRemote(rebaseConfig.toBase)) { + return uri; + } + + if (isRemote(uri) || isSVGMarker(uri) || isInternal(uri)) { + return uri; + } + + if (isData(uri)) { + return "'" + uri + "'"; + } + + if (isRemote(rebaseConfig.toBase)) { + return url.resolve(rebaseConfig.toBase, uri); + } + + return rebaseConfig.absolute + ? normalize(absolute(uri, rebaseConfig)) + : normalize(relative(uri, rebaseConfig)); + } + + function isAbsolute(uri) { + return path.isAbsolute(uri); + } + + function isSVGMarker(uri) { + return uri[0] == "#"; + } + + function isInternal(uri) { + return /^\w+:\w+/.test(uri); + } + + function isRemote(uri) { + return /^[^:]+?:\/\//.test(uri) || uri.indexOf("//") === 0; + } + + function isData(uri) { + return uri.indexOf("data:") === 0; + } + + function absolute(uri, rebaseConfig) { + return path + .resolve(path.join(rebaseConfig.fromBase || "", uri)) + .replace(rebaseConfig.toBase, ""); + } + + function relative(uri, rebaseConfig) { + return path.relative( + rebaseConfig.toBase, + path.join(rebaseConfig.fromBase || "", uri) + ); + } + + function normalize(uri) { + return isWindows ? uri.replace(/\\/g, "/") : uri; + } + + function quoteFor(unquotedUrl) { + if (unquotedUrl.indexOf(SINGLE_QUOTE) > -1) { + return DOUBLE_QUOTE; + } else if (unquotedUrl.indexOf(DOUBLE_QUOTE) > -1) { + return SINGLE_QUOTE; + } else if ( + hasWhitespace(unquotedUrl) || + hasRoundBrackets(unquotedUrl) + ) { + return SINGLE_QUOTE; + } else { + return ""; + } + } + + function hasWhitespace(url) { + return WHITESPACE_PATTERN.test(url); + } + + function hasRoundBrackets(url) { + return ROUND_BRACKETS_PATTERN.test(url); + } + + function rewriteUrl(originalUrl, rebaseConfig, pathOnly) { + var strippedUrl = originalUrl + .replace(URL_PREFIX_PATTERN, "") + .replace(URL_SUFFIX_PATTERN, "") + .trim(); + + var unquotedUrl = strippedUrl + .replace(QUOTE_PREFIX_PATTERN, "") + .replace(QUOTE_SUFFIX_PATTERN, "") + .trim(); + + var quote = + strippedUrl[0] == SINGLE_QUOTE || strippedUrl[0] == DOUBLE_QUOTE + ? strippedUrl[0] + : quoteFor(unquotedUrl); + + return pathOnly + ? rebase(unquotedUrl, rebaseConfig) + : URL_PREFIX + + quote + + rebase(unquotedUrl, rebaseConfig) + + quote + + URL_SUFFIX; + } + + module.exports = rewriteUrl; + }.call(this, require("_process"))); + }, + { _process: 112, path: 110, url: 162 } + ], + 83: [ + function(require, module, exports) { + var Marker = { + ASTERISK: "*", + AT: "@", + BACK_SLASH: "\\", + CARRIAGE_RETURN: "\r", + CLOSE_CURLY_BRACKET: "}", + CLOSE_ROUND_BRACKET: ")", + CLOSE_SQUARE_BRACKET: "]", + COLON: ":", + COMMA: ",", + DOUBLE_QUOTE: '"', + EXCLAMATION: "!", + FORWARD_SLASH: "/", + INTERNAL: "-clean-css-", + NEW_LINE_NIX: "\n", + OPEN_CURLY_BRACKET: "{", + OPEN_ROUND_BRACKET: "(", + OPEN_SQUARE_BRACKET: "[", + SEMICOLON: ";", + SINGLE_QUOTE: "'", + SPACE: " ", + TAB: "\t", + UNDERSCORE: "_" + }; + + module.exports = Marker; + }, + {} + ], + 84: [ + function(require, module, exports) { + var Token = { + AT_RULE: "at-rule", // e.g. `@import`, `@charset` + AT_RULE_BLOCK: "at-rule-block", // e.g. `@font-face{...}` + AT_RULE_BLOCK_SCOPE: "at-rule-block-scope", // e.g. `@font-face` + COMMENT: "comment", // e.g. `/* comment */` + NESTED_BLOCK: "nested-block", // e.g. `@media screen{...}`, `@keyframes animation {...}` + NESTED_BLOCK_SCOPE: "nested-block-scope", // e.g. `@media`, `@keyframes` + PROPERTY: "property", // e.g. `color:red` + PROPERTY_BLOCK: "property-block", // e.g. `--var:{color:red}` + PROPERTY_NAME: "property-name", // e.g. `color` + PROPERTY_VALUE: "property-value", // e.g. `red` + RAW: "raw", // e.g. anything between /* clean-css ignore:start */ and /* clean-css ignore:end */ comments + RULE: "rule", // e.g `div > a{...}` + RULE_SCOPE: "rule-scope" // e.g `div > a` + }; + + module.exports = Token; + }, + {} + ], + 85: [ + function(require, module, exports) { + var Marker = require("./marker"); + var Token = require("./token"); + + var formatPosition = require("../utils/format-position"); + + var Level = { + BLOCK: "block", + COMMENT: "comment", + DOUBLE_QUOTE: "double-quote", + RULE: "rule", + SINGLE_QUOTE: "single-quote" + }; + + var AT_RULES = ["@charset", "@import"]; + + var BLOCK_RULES = [ + "@-moz-document", + "@document", + "@-moz-keyframes", + "@-ms-keyframes", + "@-o-keyframes", + "@-webkit-keyframes", + "@keyframes", + "@media", + "@supports" + ]; + + var IGNORE_END_COMMENT_PATTERN = /\/\* clean\-css ignore:end \*\/$/; + var IGNORE_START_COMMENT_PATTERN = /^\/\* clean\-css ignore:start \*\//; + + var PAGE_MARGIN_BOXES = [ + "@bottom-center", + "@bottom-left", + "@bottom-left-corner", + "@bottom-right", + "@bottom-right-corner", + "@left-bottom", + "@left-middle", + "@left-top", + "@right-bottom", + "@right-middle", + "@right-top", + "@top-center", + "@top-left", + "@top-left-corner", + "@top-right", + "@top-right-corner" + ]; + + var EXTRA_PAGE_BOXES = [ + "@footnote", + "@footnotes", + "@left", + "@page-float-bottom", + "@page-float-top", + "@right" + ]; + + var REPEAT_PATTERN = /^\[\s{0,31}\d+\s{0,31}\]$/; + var RULE_WORD_SEPARATOR_PATTERN = /[\s\(]/; + var TAIL_BROKEN_VALUE_PATTERN = /[\s|\}]*$/; + + function tokenize(source, externalContext) { + var internalContext = { + level: Level.BLOCK, + position: { + source: externalContext.source || undefined, + line: 1, + column: 0, + index: 0 + } + }; + + return intoTokens(source, externalContext, internalContext, false); + } + + function intoTokens( + source, + externalContext, + internalContext, + isNested + ) { + var allTokens = []; + var newTokens = allTokens; + var lastToken; + var ruleToken; + var ruleTokens = []; + var propertyToken; + var metadata; + var metadatas = []; + var level = internalContext.level; + var levels = []; + var buffer = []; + var buffers = []; + var serializedBuffer; + var serializedBufferPart; + var roundBracketLevel = 0; + var isQuoted; + var isSpace; + var isNewLineNix; + var isNewLineWin; + var isCarriageReturn; + var isCommentStart; + var wasCommentStart = false; + var isCommentEnd; + var wasCommentEnd = false; + var isCommentEndMarker; + var isEscaped; + var wasEscaped = false; + var isRaw = false; + var seekingValue = false; + var seekingPropertyBlockClosing = false; + var position = internalContext.position; + var lastCommentStartAt; + + for (; position.index < source.length; position.index++) { + var character = source[position.index]; + + isQuoted = + level == Level.SINGLE_QUOTE || level == Level.DOUBLE_QUOTE; + isSpace = character == Marker.SPACE || character == Marker.TAB; + isNewLineNix = character == Marker.NEW_LINE_NIX; + isNewLineWin = + character == Marker.NEW_LINE_NIX && + source[position.index - 1] == Marker.CARRIAGE_RETURN; + isCarriageReturn = + character == Marker.CARRIAGE_RETURN && + source[position.index + 1] && + source[position.index + 1] != Marker.NEW_LINE_NIX; + isCommentStart = + !wasCommentEnd && + level != Level.COMMENT && + !isQuoted && + character == Marker.ASTERISK && + source[position.index - 1] == Marker.FORWARD_SLASH; + isCommentEndMarker = + !wasCommentStart && + !isQuoted && + character == Marker.FORWARD_SLASH && + source[position.index - 1] == Marker.ASTERISK; + isCommentEnd = level == Level.COMMENT && isCommentEndMarker; + roundBracketLevel = Math.max(roundBracketLevel, 0); + + metadata = + buffer.length === 0 + ? [position.line, position.column, position.source] + : metadata; + + if (isEscaped) { + // previous character was a backslash + buffer.push(character); + } else if (!isCommentEnd && level == Level.COMMENT) { + buffer.push(character); + } else if (!isCommentStart && !isCommentEnd && isRaw) { + buffer.push(character); + } else if ( + isCommentStart && + (level == Level.BLOCK || level == Level.RULE) && + buffer.length > 1 + ) { + // comment start within block preceded by some content, e.g. div/*<-- + metadatas.push(metadata); + buffer.push(character); + buffers.push(buffer.slice(0, buffer.length - 2)); + + buffer = buffer.slice(buffer.length - 2); + metadata = [position.line, position.column - 1, position.source]; + + levels.push(level); + level = Level.COMMENT; + } else if (isCommentStart) { + // comment start, e.g. /*<-- + levels.push(level); + level = Level.COMMENT; + buffer.push(character); + } else if (isCommentEnd && isIgnoreStartComment(buffer)) { + // ignore:start comment end, e.g. /* clean-css ignore:start */<-- + serializedBuffer = buffer.join("").trim() + character; + lastToken = [ + Token.COMMENT, + serializedBuffer, + [originalMetadata(metadata, serializedBuffer, externalContext)] + ]; + newTokens.push(lastToken); + + isRaw = true; + metadata = metadatas.pop() || null; + buffer = buffers.pop() || []; + } else if (isCommentEnd && isIgnoreEndComment(buffer)) { + // ignore:start comment end, e.g. /* clean-css ignore:end */<-- + serializedBuffer = buffer.join("") + character; + lastCommentStartAt = serializedBuffer.lastIndexOf( + Marker.FORWARD_SLASH + Marker.ASTERISK + ); + + serializedBufferPart = serializedBuffer.substring( + 0, + lastCommentStartAt + ); + lastToken = [ + Token.RAW, + serializedBufferPart, + [ + originalMetadata( + metadata, + serializedBufferPart, + externalContext + ) + ] + ]; + newTokens.push(lastToken); + + serializedBufferPart = serializedBuffer.substring( + lastCommentStartAt + ); + metadata = [ + position.line, + position.column - serializedBufferPart.length + 1, + position.source + ]; + lastToken = [ + Token.COMMENT, + serializedBufferPart, + [ + originalMetadata( + metadata, + serializedBufferPart, + externalContext + ) + ] + ]; + newTokens.push(lastToken); + + isRaw = false; + level = levels.pop(); + metadata = metadatas.pop() || null; + buffer = buffers.pop() || []; + } else if (isCommentEnd) { + // comment end, e.g. /* comment */<-- + serializedBuffer = buffer.join("").trim() + character; + lastToken = [ + Token.COMMENT, + serializedBuffer, + [originalMetadata(metadata, serializedBuffer, externalContext)] + ]; + newTokens.push(lastToken); + + level = levels.pop(); + metadata = metadatas.pop() || null; + buffer = buffers.pop() || []; + } else if ( + isCommentEndMarker && + source[position.index + 1] != Marker.ASTERISK + ) { + externalContext.warnings.push( + "Unexpected '*/' at " + + formatPosition([ + position.line, + position.column, + position.source + ]) + + "." + ); + buffer = []; + } else if (character == Marker.SINGLE_QUOTE && !isQuoted) { + // single quotation start, e.g. a[href^='https<-- + levels.push(level); + level = Level.SINGLE_QUOTE; + buffer.push(character); + } else if ( + character == Marker.SINGLE_QUOTE && + level == Level.SINGLE_QUOTE + ) { + // single quotation end, e.g. a[href^='https'<-- + level = levels.pop(); + buffer.push(character); + } else if (character == Marker.DOUBLE_QUOTE && !isQuoted) { + // double quotation start, e.g. a[href^="<-- + levels.push(level); + level = Level.DOUBLE_QUOTE; + buffer.push(character); + } else if ( + character == Marker.DOUBLE_QUOTE && + level == Level.DOUBLE_QUOTE + ) { + // double quotation end, e.g. a[href^="https"<-- + level = levels.pop(); + buffer.push(character); + } else if ( + !isCommentStart && + !isCommentEnd && + character != Marker.CLOSE_ROUND_BRACKET && + character != Marker.OPEN_ROUND_BRACKET && + level != Level.COMMENT && + !isQuoted && + roundBracketLevel > 0 + ) { + // character inside any function, e.g. hsla(.<-- + buffer.push(character); + } else if ( + character == Marker.OPEN_ROUND_BRACKET && + !isQuoted && + level != Level.COMMENT && + !seekingValue + ) { + // round open bracket, e.g. @import url(<-- + buffer.push(character); + + roundBracketLevel++; + } else if ( + character == Marker.CLOSE_ROUND_BRACKET && + !isQuoted && + level != Level.COMMENT && + !seekingValue + ) { + // round open bracket, e.g. @import url(test.css)<-- + buffer.push(character); + + roundBracketLevel--; + } else if ( + character == Marker.SEMICOLON && + level == Level.BLOCK && + buffer[0] == Marker.AT + ) { + // semicolon ending rule at block level, e.g. @import '...';<-- + serializedBuffer = buffer.join("").trim(); + allTokens.push([ + Token.AT_RULE, + serializedBuffer, + [originalMetadata(metadata, serializedBuffer, externalContext)] + ]); + + buffer = []; + } else if ( + character == Marker.COMMA && + level == Level.BLOCK && + ruleToken + ) { + // comma separator at block level, e.g. a,div,<-- + serializedBuffer = buffer.join("").trim(); + ruleToken[1].push([ + tokenScopeFrom(ruleToken[0]), + serializedBuffer, + [ + originalMetadata( + metadata, + serializedBuffer, + externalContext, + ruleToken[1].length + ) + ] + ]); + + buffer = []; + } else if ( + character == Marker.COMMA && + level == Level.BLOCK && + tokenTypeFrom(buffer) == Token.AT_RULE + ) { + // comma separator at block level, e.g. @import url(...) screen,<-- + // keep iterating as end semicolon will create the token + buffer.push(character); + } else if (character == Marker.COMMA && level == Level.BLOCK) { + // comma separator at block level, e.g. a,<-- + ruleToken = [tokenTypeFrom(buffer), [], []]; + serializedBuffer = buffer.join("").trim(); + ruleToken[1].push([ + tokenScopeFrom(ruleToken[0]), + serializedBuffer, + [ + originalMetadata( + metadata, + serializedBuffer, + externalContext, + 0 + ) + ] + ]); + + buffer = []; + } else if ( + character == Marker.OPEN_CURLY_BRACKET && + level == Level.BLOCK && + ruleToken && + ruleToken[0] == Token.NESTED_BLOCK + ) { + // open brace opening at-rule at block level, e.g. @media{<-- + serializedBuffer = buffer.join("").trim(); + ruleToken[1].push([ + Token.NESTED_BLOCK_SCOPE, + serializedBuffer, + [originalMetadata(metadata, serializedBuffer, externalContext)] + ]); + allTokens.push(ruleToken); + + levels.push(level); + position.column++; + position.index++; + buffer = []; + + ruleToken[2] = intoTokens( + source, + externalContext, + internalContext, + true + ); + ruleToken = null; + } else if ( + character == Marker.OPEN_CURLY_BRACKET && + level == Level.BLOCK && + tokenTypeFrom(buffer) == Token.NESTED_BLOCK + ) { + // open brace opening at-rule at block level, e.g. @media{<-- + serializedBuffer = buffer.join("").trim(); + ruleToken = ruleToken || [Token.NESTED_BLOCK, [], []]; + ruleToken[1].push([ + Token.NESTED_BLOCK_SCOPE, + serializedBuffer, + [originalMetadata(metadata, serializedBuffer, externalContext)] + ]); + allTokens.push(ruleToken); + + levels.push(level); + position.column++; + position.index++; + buffer = []; + + ruleToken[2] = intoTokens( + source, + externalContext, + internalContext, + true + ); + ruleToken = null; + } else if ( + character == Marker.OPEN_CURLY_BRACKET && + level == Level.BLOCK + ) { + // open brace opening rule at block level, e.g. div{<-- + serializedBuffer = buffer.join("").trim(); + ruleToken = ruleToken || [tokenTypeFrom(buffer), [], []]; + ruleToken[1].push([ + tokenScopeFrom(ruleToken[0]), + serializedBuffer, + [ + originalMetadata( + metadata, + serializedBuffer, + externalContext, + ruleToken[1].length + ) + ] + ]); + newTokens = ruleToken[2]; + allTokens.push(ruleToken); + + levels.push(level); + level = Level.RULE; + buffer = []; + } else if ( + character == Marker.OPEN_CURLY_BRACKET && + level == Level.RULE && + seekingValue + ) { + // open brace opening rule at rule level, e.g. div{--variable:{<-- + ruleTokens.push(ruleToken); + ruleToken = [Token.PROPERTY_BLOCK, []]; + propertyToken.push(ruleToken); + newTokens = ruleToken[1]; + + levels.push(level); + level = Level.RULE; + seekingValue = false; + } else if ( + character == Marker.OPEN_CURLY_BRACKET && + level == Level.RULE && + isPageMarginBox(buffer) + ) { + // open brace opening page-margin box at rule level, e.g. @page{@top-center{<-- + serializedBuffer = buffer.join("").trim(); + ruleTokens.push(ruleToken); + ruleToken = [Token.AT_RULE_BLOCK, [], []]; + ruleToken[1].push([ + Token.AT_RULE_BLOCK_SCOPE, + serializedBuffer, + [originalMetadata(metadata, serializedBuffer, externalContext)] + ]); + newTokens.push(ruleToken); + newTokens = ruleToken[2]; + + levels.push(level); + level = Level.RULE; + buffer = []; + } else if ( + character == Marker.COLON && + level == Level.RULE && + !seekingValue + ) { + // colon at rule level, e.g. a{color:<-- + serializedBuffer = buffer.join("").trim(); + propertyToken = [ + Token.PROPERTY, + [ + Token.PROPERTY_NAME, + serializedBuffer, + [ + originalMetadata( + metadata, + serializedBuffer, + externalContext + ) + ] + ] + ]; + newTokens.push(propertyToken); + + seekingValue = true; + buffer = []; + } else if ( + character == Marker.SEMICOLON && + level == Level.RULE && + propertyToken && + ruleTokens.length > 0 && + buffer.length > 0 && + buffer[0] == Marker.AT + ) { + // semicolon at rule level for at-rule, e.g. a{--color:{@apply(--other-color);<-- + serializedBuffer = buffer.join("").trim(); + ruleToken[1].push([ + Token.AT_RULE, + serializedBuffer, + [originalMetadata(metadata, serializedBuffer, externalContext)] + ]); + + buffer = []; + } else if ( + character == Marker.SEMICOLON && + level == Level.RULE && + propertyToken && + buffer.length > 0 + ) { + // semicolon at rule level, e.g. a{color:red;<-- + serializedBuffer = buffer.join("").trim(); + propertyToken.push([ + Token.PROPERTY_VALUE, + serializedBuffer, + [originalMetadata(metadata, serializedBuffer, externalContext)] + ]); + + propertyToken = null; + seekingValue = false; + buffer = []; + } else if ( + character == Marker.SEMICOLON && + level == Level.RULE && + propertyToken && + buffer.length === 0 + ) { + // semicolon after bracketed value at rule level, e.g. a{color:rgb(...);<-- + propertyToken = null; + seekingValue = false; + } else if ( + character == Marker.SEMICOLON && + level == Level.RULE && + buffer.length > 0 && + buffer[0] == Marker.AT + ) { + // semicolon for at-rule at rule level, e.g. a{@apply(--variable);<-- + serializedBuffer = buffer.join(""); + newTokens.push([ + Token.AT_RULE, + serializedBuffer, + [originalMetadata(metadata, serializedBuffer, externalContext)] + ]); + + seekingValue = false; + buffer = []; + } else if ( + character == Marker.SEMICOLON && + level == Level.RULE && + seekingPropertyBlockClosing + ) { + // close brace after a property block at rule level, e.g. a{--custom:{color:red;};<-- + seekingPropertyBlockClosing = false; + buffer = []; + } else if ( + character == Marker.SEMICOLON && + level == Level.RULE && + buffer.length === 0 + ) { + // stray semicolon at rule level, e.g. a{;<-- + // noop + } else if ( + character == Marker.CLOSE_CURLY_BRACKET && + level == Level.RULE && + propertyToken && + seekingValue && + buffer.length > 0 && + ruleTokens.length > 0 + ) { + // close brace at rule level, e.g. a{--color:{color:red}<-- + serializedBuffer = buffer.join(""); + propertyToken.push([ + Token.PROPERTY_VALUE, + serializedBuffer, + [originalMetadata(metadata, serializedBuffer, externalContext)] + ]); + propertyToken = null; + ruleToken = ruleTokens.pop(); + newTokens = ruleToken[2]; + + level = levels.pop(); + seekingValue = false; + buffer = []; + } else if ( + character == Marker.CLOSE_CURLY_BRACKET && + level == Level.RULE && + propertyToken && + buffer.length > 0 && + buffer[0] == Marker.AT && + ruleTokens.length > 0 + ) { + // close brace at rule level for at-rule, e.g. a{--color:{@apply(--other-color)}<-- + serializedBuffer = buffer.join(""); + ruleToken[1].push([ + Token.AT_RULE, + serializedBuffer, + [originalMetadata(metadata, serializedBuffer, externalContext)] + ]); + propertyToken = null; + ruleToken = ruleTokens.pop(); + newTokens = ruleToken[2]; + + level = levels.pop(); + seekingValue = false; + buffer = []; + } else if ( + character == Marker.CLOSE_CURLY_BRACKET && + level == Level.RULE && + propertyToken && + ruleTokens.length > 0 + ) { + // close brace at rule level after space, e.g. a{--color:{color:red }<-- + propertyToken = null; + ruleToken = ruleTokens.pop(); + newTokens = ruleToken[2]; + + level = levels.pop(); + seekingValue = false; + } else if ( + character == Marker.CLOSE_CURLY_BRACKET && + level == Level.RULE && + propertyToken && + buffer.length > 0 + ) { + // close brace at rule level, e.g. a{color:red}<-- + serializedBuffer = buffer.join(""); + propertyToken.push([ + Token.PROPERTY_VALUE, + serializedBuffer, + [originalMetadata(metadata, serializedBuffer, externalContext)] + ]); + propertyToken = null; + ruleToken = ruleTokens.pop(); + newTokens = allTokens; + + level = levels.pop(); + seekingValue = false; + buffer = []; + } else if ( + character == Marker.CLOSE_CURLY_BRACKET && + level == Level.RULE && + buffer.length > 0 && + buffer[0] == Marker.AT + ) { + // close brace after at-rule at rule level, e.g. a{@apply(--variable)}<-- + propertyToken = null; + ruleToken = null; + serializedBuffer = buffer.join("").trim(); + newTokens.push([ + Token.AT_RULE, + serializedBuffer, + [originalMetadata(metadata, serializedBuffer, externalContext)] + ]); + newTokens = allTokens; + + level = levels.pop(); + seekingValue = false; + buffer = []; + } else if ( + character == Marker.CLOSE_CURLY_BRACKET && + level == Level.RULE && + levels[levels.length - 1] == Level.RULE + ) { + // close brace after a property block at rule level, e.g. a{--custom:{color:red;}<-- + propertyToken = null; + ruleToken = ruleTokens.pop(); + newTokens = ruleToken[2]; + + level = levels.pop(); + seekingValue = false; + seekingPropertyBlockClosing = true; + buffer = []; + } else if ( + character == Marker.CLOSE_CURLY_BRACKET && + level == Level.RULE + ) { + // close brace after a rule, e.g. a{color:red;}<-- + propertyToken = null; + ruleToken = null; + newTokens = allTokens; + + level = levels.pop(); + seekingValue = false; + } else if ( + character == Marker.CLOSE_CURLY_BRACKET && + level == Level.BLOCK && + !isNested && + position.index <= source.length - 1 + ) { + // stray close brace at block level, e.g. a{color:red}color:blue}<-- + externalContext.warnings.push( + "Unexpected '}' at " + + formatPosition([ + position.line, + position.column, + position.source + ]) + + "." + ); + buffer.push(character); + } else if ( + character == Marker.CLOSE_CURLY_BRACKET && + level == Level.BLOCK + ) { + // close brace at block level, e.g. @media screen {...}<-- + break; + } else if ( + character == Marker.OPEN_ROUND_BRACKET && + level == Level.RULE && + seekingValue + ) { + // round open bracket, e.g. a{color:hsla(<-- + buffer.push(character); + roundBracketLevel++; + } else if ( + character == Marker.CLOSE_ROUND_BRACKET && + level == Level.RULE && + seekingValue && + roundBracketLevel == 1 + ) { + // round close bracket, e.g. a{color:hsla(0,0%,0%)<-- + buffer.push(character); + serializedBuffer = buffer.join("").trim(); + propertyToken.push([ + Token.PROPERTY_VALUE, + serializedBuffer, + [originalMetadata(metadata, serializedBuffer, externalContext)] + ]); + + roundBracketLevel--; + buffer = []; + } else if ( + character == Marker.CLOSE_ROUND_BRACKET && + level == Level.RULE && + seekingValue + ) { + // round close bracket within other brackets, e.g. a{width:calc((10rem / 2)<-- + buffer.push(character); + roundBracketLevel--; + } else if ( + character == Marker.FORWARD_SLASH && + source[position.index + 1] != Marker.ASTERISK && + level == Level.RULE && + seekingValue && + buffer.length > 0 + ) { + // forward slash within a property, e.g. a{background:url(image.png) 0 0/<-- + serializedBuffer = buffer.join("").trim(); + propertyToken.push([ + Token.PROPERTY_VALUE, + serializedBuffer, + [originalMetadata(metadata, serializedBuffer, externalContext)] + ]); + propertyToken.push([ + Token.PROPERTY_VALUE, + character, + [[position.line, position.column, position.source]] + ]); + + buffer = []; + } else if ( + character == Marker.FORWARD_SLASH && + source[position.index + 1] != Marker.ASTERISK && + level == Level.RULE && + seekingValue + ) { + // forward slash within a property after space, e.g. a{background:url(image.png) 0 0 /<-- + propertyToken.push([ + Token.PROPERTY_VALUE, + character, + [[position.line, position.column, position.source]] + ]); + + buffer = []; + } else if ( + character == Marker.COMMA && + level == Level.RULE && + seekingValue && + buffer.length > 0 + ) { + // comma within a property, e.g. a{background:url(image.png),<-- + serializedBuffer = buffer.join("").trim(); + propertyToken.push([ + Token.PROPERTY_VALUE, + serializedBuffer, + [originalMetadata(metadata, serializedBuffer, externalContext)] + ]); + propertyToken.push([ + Token.PROPERTY_VALUE, + character, + [[position.line, position.column, position.source]] + ]); + + buffer = []; + } else if ( + character == Marker.COMMA && + level == Level.RULE && + seekingValue + ) { + // comma within a property after space, e.g. a{background:url(image.png) ,<-- + propertyToken.push([ + Token.PROPERTY_VALUE, + character, + [[position.line, position.column, position.source]] + ]); + + buffer = []; + } else if ( + character == Marker.CLOSE_SQUARE_BRACKET && + propertyToken && + propertyToken.length > 1 && + buffer.length > 0 && + isRepeatToken(buffer) + ) { + buffer.push(character); + serializedBuffer = buffer.join("").trim(); + propertyToken[propertyToken.length - 1][1] += serializedBuffer; + + buffer = []; + } else if ( + (isSpace || (isNewLineNix && !isNewLineWin)) && + level == Level.RULE && + seekingValue && + propertyToken && + buffer.length > 0 + ) { + // space or *nix newline within property, e.g. a{margin:0 <-- + serializedBuffer = buffer.join("").trim(); + propertyToken.push([ + Token.PROPERTY_VALUE, + serializedBuffer, + [originalMetadata(metadata, serializedBuffer, externalContext)] + ]); + + buffer = []; + } else if ( + isNewLineWin && + level == Level.RULE && + seekingValue && + propertyToken && + buffer.length > 1 + ) { + // win newline within property, e.g. a{margin:0\r\n<-- + serializedBuffer = buffer.join("").trim(); + propertyToken.push([ + Token.PROPERTY_VALUE, + serializedBuffer, + [originalMetadata(metadata, serializedBuffer, externalContext)] + ]); + + buffer = []; + } else if (isNewLineWin && level == Level.RULE && seekingValue) { + // win newline + buffer = []; + } else if (buffer.length == 1 && isNewLineWin) { + // ignore windows newline which is composed of two characters + buffer.pop(); + } else if ( + buffer.length > 0 || + (!isSpace && !isNewLineNix && !isNewLineWin && !isCarriageReturn) + ) { + // any character + buffer.push(character); + } + + wasEscaped = isEscaped; + isEscaped = !wasEscaped && character == Marker.BACK_SLASH; + wasCommentStart = isCommentStart; + wasCommentEnd = isCommentEnd; + + position.line = + isNewLineWin || isNewLineNix || isCarriageReturn + ? position.line + 1 + : position.line; + position.column = + isNewLineWin || isNewLineNix || isCarriageReturn + ? 0 + : position.column + 1; + } + + if (seekingValue) { + externalContext.warnings.push( + "Missing '}' at " + + formatPosition([ + position.line, + position.column, + position.source + ]) + + "." + ); + } + + if (seekingValue && buffer.length > 0) { + serializedBuffer = buffer + .join("") + .replace(TAIL_BROKEN_VALUE_PATTERN, ""); + propertyToken.push([ + Token.PROPERTY_VALUE, + serializedBuffer, + [originalMetadata(metadata, serializedBuffer, externalContext)] + ]); + + buffer = []; + } + + if (buffer.length > 0) { + externalContext.warnings.push( + "Invalid character(s) '" + + buffer.join("") + + "' at " + + formatPosition(metadata) + + ". Ignoring." + ); + } + + return allTokens; + } + + function isIgnoreStartComment(buffer) { + return IGNORE_START_COMMENT_PATTERN.test( + buffer.join("") + Marker.FORWARD_SLASH + ); + } + + function isIgnoreEndComment(buffer) { + return IGNORE_END_COMMENT_PATTERN.test( + buffer.join("") + Marker.FORWARD_SLASH + ); + } + + function originalMetadata( + metadata, + value, + externalContext, + selectorFallbacks + ) { + var source = metadata[2]; + + return externalContext.inputSourceMapTracker.isTracking(source) + ? externalContext.inputSourceMapTracker.originalPositionFor( + metadata, + value.length, + selectorFallbacks + ) + : metadata; + } + + function tokenTypeFrom(buffer) { + var isAtRule = + buffer[0] == Marker.AT || buffer[0] == Marker.UNDERSCORE; + var ruleWord = buffer.join("").split(RULE_WORD_SEPARATOR_PATTERN)[0]; + + if (isAtRule && BLOCK_RULES.indexOf(ruleWord) > -1) { + return Token.NESTED_BLOCK; + } else if (isAtRule && AT_RULES.indexOf(ruleWord) > -1) { + return Token.AT_RULE; + } else if (isAtRule) { + return Token.AT_RULE_BLOCK; + } else { + return Token.RULE; + } + } + + function tokenScopeFrom(tokenType) { + if (tokenType == Token.RULE) { + return Token.RULE_SCOPE; + } else if (tokenType == Token.NESTED_BLOCK) { + return Token.NESTED_BLOCK_SCOPE; + } else if (tokenType == Token.AT_RULE_BLOCK) { + return Token.AT_RULE_BLOCK_SCOPE; + } + } + + function isPageMarginBox(buffer) { + var serializedBuffer = buffer.join("").trim(); + + return ( + PAGE_MARGIN_BOXES.indexOf(serializedBuffer) > -1 || + EXTRA_PAGE_BOXES.indexOf(serializedBuffer) > -1 + ); + } + + function isRepeatToken(buffer) { + return REPEAT_PATTERN.test( + buffer.join("") + Marker.CLOSE_SQUARE_BRACKET + ); + } + + module.exports = tokenize; + }, + { "../utils/format-position": 87, "./marker": 83, "./token": 84 } + ], + 86: [ + function(require, module, exports) { + function cloneArray(array) { + var cloned = array.slice(0); + + for (var i = 0, l = cloned.length; i < l; i++) { + if (Array.isArray(cloned[i])) cloned[i] = cloneArray(cloned[i]); + } + + return cloned; + } + + module.exports = cloneArray; + }, + {} + ], + 87: [ + function(require, module, exports) { + function formatPosition(metadata) { + var line = metadata[0]; + var column = metadata[1]; + var source = metadata[2]; + + return source + ? source + ":" + line + ":" + column + : line + ":" + column; + } + + module.exports = formatPosition; + }, + {} + ], + 88: [ + function(require, module, exports) { + var NO_PROTOCOL_RESOURCE_PATTERN = /^\/\//; + + function hasProtocol(uri) { + return !NO_PROTOCOL_RESOURCE_PATTERN.test(uri); + } + + module.exports = hasProtocol; + }, + {} + ], + 89: [ + function(require, module, exports) { + var DATA_URI_PATTERN = /^data:(\S*?)?(;charset=[^;]+)?(;[^,]+?)?,(.+)/; + + function isDataUriResource(uri) { + return DATA_URI_PATTERN.test(uri); + } + + module.exports = isDataUriResource; + }, + {} + ], + 90: [ + function(require, module, exports) { + var HTTP_RESOURCE_PATTERN = /^http:\/\//; + + function isHttpResource(uri) { + return HTTP_RESOURCE_PATTERN.test(uri); + } + + module.exports = isHttpResource; + }, + {} + ], + 91: [ + function(require, module, exports) { + var HTTPS_RESOURCE_PATTERN = /^https:\/\//; + + function isHttpsResource(uri) { + return HTTPS_RESOURCE_PATTERN.test(uri); + } + + module.exports = isHttpsResource; + }, + {} + ], + 92: [ + function(require, module, exports) { + var IMPORT_PREFIX_PATTERN = /^@import/i; + + function isImport(value) { + return IMPORT_PREFIX_PATTERN.test(value); + } + + module.exports = isImport; + }, + {} + ], + 93: [ + function(require, module, exports) { + var REMOTE_RESOURCE_PATTERN = /^(\w+:\/\/|\/\/)/; + + function isRemoteResource(uri) { + return REMOTE_RESOURCE_PATTERN.test(uri); + } + + module.exports = isRemoteResource; + }, + {} + ], + 94: [ + function(require, module, exports) { + // adapted from http://nedbatchelder.com/blog/200712.html#e20071211T054956 + + var NUMBER_PATTERN = /([0-9]+)/; + + function naturalCompare(value1, value2) { + var keys1 = ("" + value1).split(NUMBER_PATTERN).map(tryParseInt); + var keys2 = ("" + value2).split(NUMBER_PATTERN).map(tryParseInt); + var key1; + var key2; + var compareFirst = Math.min(keys1.length, keys2.length); + var i, l; + + for (i = 0, l = compareFirst; i < l; i++) { + key1 = keys1[i]; + key2 = keys2[i]; + + if (key1 != key2) { + return key1 > key2 ? 1 : -1; + } + } + + return keys1.length > keys2.length + ? 1 + : keys1.length == keys2.length + ? 0 + : -1; + } + + function tryParseInt(value) { + return "" + parseInt(value) == value ? parseInt(value) : value; + } + + module.exports = naturalCompare; + }, + {} + ], + 95: [ + function(require, module, exports) { + function override(source1, source2) { + var target = {}; + var key1; + var key2; + var item; + + for (key1 in source1) { + item = source1[key1]; + + if (Array.isArray(item)) { + target[key1] = item.slice(0); + } else if (typeof item == "object" && item !== null) { + target[key1] = override(item, {}); + } else { + target[key1] = item; + } + } + + for (key2 in source2) { + item = source2[key2]; + + if (key2 in target && Array.isArray(item)) { + target[key2] = item.slice(0); + } else if ( + key2 in target && + typeof item == "object" && + item !== null + ) { + target[key2] = override(target[key2], item); + } else { + target[key2] = item; + } + } + + return target; + } + + module.exports = override; + }, + {} + ], + 96: [ + function(require, module, exports) { + var Marker = require("../tokenizer/marker"); + + function split(value, separator) { + var openLevel = Marker.OPEN_ROUND_BRACKET; + var closeLevel = Marker.CLOSE_ROUND_BRACKET; + var level = 0; + var cursor = 0; + var lastStart = 0; + var lastValue; + var lastCharacter; + var len = value.length; + var parts = []; + + if (value.indexOf(separator) == -1) { + return [value]; + } + + if (value.indexOf(openLevel) == -1) { + return value.split(separator); + } + + while (cursor < len) { + if (value[cursor] == openLevel) { + level++; + } else if (value[cursor] == closeLevel) { + level--; + } + + if ( + level === 0 && + cursor > 0 && + cursor + 1 < len && + value[cursor] == separator + ) { + parts.push(value.substring(lastStart, cursor)); + lastStart = cursor + 1; + } + + cursor++; + } + + if (lastStart < cursor + 1) { + lastValue = value.substring(lastStart); + lastCharacter = lastValue[lastValue.length - 1]; + if (lastCharacter == separator) { + lastValue = lastValue.substring(0, lastValue.length - 1); + } + + parts.push(lastValue); + } + + return parts; + } + + module.exports = split; + }, + { "../tokenizer/marker": 83 } + ], + 97: [ + function(require, module, exports) { + var emptyCharacter = ""; + + var Breaks = require("../options/format").Breaks; + var Spaces = require("../options/format").Spaces; + + var Marker = require("../tokenizer/marker"); + var Token = require("../tokenizer/token"); + + function supportsAfterClosingBrace(token) { + return ( + token[1][1] == "background" || + token[1][1] == "transform" || + token[1][1] == "src" + ); + } + + function afterClosingBrace(token, valueIndex) { + return ( + token[valueIndex][1][token[valueIndex][1].length - 1] == + Marker.CLOSE_ROUND_BRACKET + ); + } + + function afterComma(token, valueIndex) { + return token[valueIndex][1] == Marker.COMMA; + } + + function afterSlash(token, valueIndex) { + return token[valueIndex][1] == Marker.FORWARD_SLASH; + } + + function beforeComma(token, valueIndex) { + return ( + token[valueIndex + 1] && token[valueIndex + 1][1] == Marker.COMMA + ); + } + + function beforeSlash(token, valueIndex) { + return ( + token[valueIndex + 1] && + token[valueIndex + 1][1] == Marker.FORWARD_SLASH + ); + } + + function inFilter(token) { + return token[1][1] == "filter" || token[1][1] == "-ms-filter"; + } + + function disallowsSpace(context, token, valueIndex) { + return ( + (!context.spaceAfterClosingBrace && + supportsAfterClosingBrace(token) && + afterClosingBrace(token, valueIndex)) || + beforeSlash(token, valueIndex) || + afterSlash(token, valueIndex) || + beforeComma(token, valueIndex) || + afterComma(token, valueIndex) + ); + } + + function rules(context, tokens) { + var store = context.store; + + for (var i = 0, l = tokens.length; i < l; i++) { + store(context, tokens[i]); + + if (i < l - 1) { + store(context, comma(context)); + } + } + } + + function body(context, tokens) { + var lastPropertyAt = lastPropertyIndex(tokens); + + for (var i = 0, l = tokens.length; i < l; i++) { + property(context, tokens, i, lastPropertyAt); + } + } + + function lastPropertyIndex(tokens) { + var index = tokens.length - 1; + + for (; index >= 0; index--) { + if (tokens[index][0] != Token.COMMENT) { + break; + } + } + + return index; + } + + function property(context, tokens, position, lastPropertyAt) { + var store = context.store; + var token = tokens[position]; + var isPropertyBlock = token[2][0] == Token.PROPERTY_BLOCK; + + var needsSemicolon; + if (context.format) { + if (context.format.semicolonAfterLastProperty || isPropertyBlock) { + needsSemicolon = true; + } else if (position < lastPropertyAt) { + needsSemicolon = true; + } else { + needsSemicolon = false; + } + } else { + needsSemicolon = position < lastPropertyAt || isPropertyBlock; + } + + var isLast = position === lastPropertyAt; + + switch (token[0]) { + case Token.AT_RULE: + store(context, token); + store(context, semicolon(context, Breaks.AfterProperty, false)); + break; + case Token.AT_RULE_BLOCK: + rules(context, token[1]); + store(context, openBrace(context, Breaks.AfterRuleBegins, true)); + body(context, token[2]); + store( + context, + closeBrace(context, Breaks.AfterRuleEnds, false, isLast) + ); + break; + case Token.COMMENT: + store(context, token); + break; + case Token.PROPERTY: + store(context, token[1]); + store(context, colon(context)); + value(context, token); + store( + context, + needsSemicolon + ? semicolon(context, Breaks.AfterProperty, isLast) + : emptyCharacter + ); + break; + case Token.RAW: + store(context, token); + } + } + + function value(context, token) { + var store = context.store; + var j, m; + + if (token[2][0] == Token.PROPERTY_BLOCK) { + store(context, openBrace(context, Breaks.AfterBlockBegins, false)); + body(context, token[2][1]); + store( + context, + closeBrace(context, Breaks.AfterBlockEnds, false, true) + ); + } else { + for (j = 2, m = token.length; j < m; j++) { + store(context, token[j]); + + if ( + j < m - 1 && + (inFilter(token) || !disallowsSpace(context, token, j)) + ) { + store(context, Marker.SPACE); + } + } + } + } + + function allowsBreak(context, where) { + return context.format && context.format.breaks[where]; + } + + function allowsSpace(context, where) { + return context.format && context.format.spaces[where]; + } + + function openBrace(context, where, needsPrefixSpace) { + if (context.format) { + context.indentBy += context.format.indentBy; + context.indentWith = context.format.indentWith.repeat( + context.indentBy + ); + return ( + (needsPrefixSpace && + allowsSpace(context, Spaces.BeforeBlockBegins) + ? Marker.SPACE + : emptyCharacter) + + Marker.OPEN_CURLY_BRACKET + + (allowsBreak(context, where) + ? context.format.breakWith + : emptyCharacter) + + context.indentWith + ); + } else { + return Marker.OPEN_CURLY_BRACKET; + } + } + + function closeBrace(context, where, beforeBlockEnd, isLast) { + if (context.format) { + context.indentBy -= context.format.indentBy; + context.indentWith = context.format.indentWith.repeat( + context.indentBy + ); + return ( + (allowsBreak(context, Breaks.AfterProperty) || + (beforeBlockEnd && allowsBreak(context, Breaks.BeforeBlockEnds)) + ? context.format.breakWith + : emptyCharacter) + + context.indentWith + + Marker.CLOSE_CURLY_BRACKET + + (isLast + ? emptyCharacter + : (allowsBreak(context, where) + ? context.format.breakWith + : emptyCharacter) + context.indentWith) + ); + } else { + return Marker.CLOSE_CURLY_BRACKET; + } + } + + function colon(context) { + return context.format + ? Marker.COLON + + (allowsSpace(context, Spaces.BeforeValue) + ? Marker.SPACE + : emptyCharacter) + : Marker.COLON; + } + + function semicolon(context, where, isLast) { + return context.format + ? Marker.SEMICOLON + + (isLast || !allowsBreak(context, where) + ? emptyCharacter + : context.format.breakWith + context.indentWith) + : Marker.SEMICOLON; + } + + function comma(context) { + return context.format + ? Marker.COMMA + + (allowsBreak(context, Breaks.BetweenSelectors) + ? context.format.breakWith + : emptyCharacter) + + context.indentWith + : Marker.COMMA; + } + + function all(context, tokens) { + var store = context.store; + var token; + var isLast; + var i, l; + + for (i = 0, l = tokens.length; i < l; i++) { + token = tokens[i]; + isLast = i == l - 1; + + switch (token[0]) { + case Token.AT_RULE: + store(context, token); + store(context, semicolon(context, Breaks.AfterAtRule, isLast)); + break; + case Token.AT_RULE_BLOCK: + rules(context, token[1]); + store( + context, + openBrace(context, Breaks.AfterRuleBegins, true) + ); + body(context, token[2]); + store( + context, + closeBrace(context, Breaks.AfterRuleEnds, false, isLast) + ); + break; + case Token.NESTED_BLOCK: + rules(context, token[1]); + store( + context, + openBrace(context, Breaks.AfterBlockBegins, true) + ); + all(context, token[2]); + store( + context, + closeBrace(context, Breaks.AfterBlockEnds, true, isLast) + ); + break; + case Token.COMMENT: + store(context, token); + store( + context, + allowsBreak(context, Breaks.AfterComment) + ? context.format.breakWith + : emptyCharacter + ); + break; + case Token.RAW: + store(context, token); + break; + case Token.RULE: + rules(context, token[1]); + store( + context, + openBrace(context, Breaks.AfterRuleBegins, true) + ); + body(context, token[2]); + store( + context, + closeBrace(context, Breaks.AfterRuleEnds, false, isLast) + ); + break; + } + } + } + + module.exports = { + all: all, + body: body, + property: property, + rules: rules, + value: value + }; + }, + { + "../options/format": 61, + "../tokenizer/marker": 83, + "../tokenizer/token": 84 + } + ], + 98: [ + function(require, module, exports) { + var helpers = require("./helpers"); + + function store(serializeContext, token) { + serializeContext.output.push( + typeof token == "string" ? token : token[1] + ); + } + + function context() { + var newContext = { + output: [], + store: store + }; + + return newContext; + } + + function all(tokens) { + var oneTimeContext = context(); + helpers.all(oneTimeContext, tokens); + return oneTimeContext.output.join(""); + } + + function body(tokens) { + var oneTimeContext = context(); + helpers.body(oneTimeContext, tokens); + return oneTimeContext.output.join(""); + } + + function property(tokens, position) { + var oneTimeContext = context(); + helpers.property(oneTimeContext, tokens, position, true); + return oneTimeContext.output.join(""); + } + + function rules(tokens) { + var oneTimeContext = context(); + helpers.rules(oneTimeContext, tokens); + return oneTimeContext.output.join(""); + } + + function value(tokens) { + var oneTimeContext = context(); + helpers.value(oneTimeContext, tokens); + return oneTimeContext.output.join(""); + } + + module.exports = { + all: all, + body: body, + property: property, + rules: rules, + value: value + }; + }, + { "./helpers": 97 } + ], + 99: [ + function(require, module, exports) { + var all = require("./helpers").all; + + function store(serializeContext, token) { + var value = typeof token == "string" ? token : token[1]; + var wrap = serializeContext.wrap; + + wrap(serializeContext, value); + track(serializeContext, value); + serializeContext.output.push(value); + } + + function wrap(serializeContext, value) { + if ( + serializeContext.column + value.length > + serializeContext.format.wrapAt + ) { + track(serializeContext, serializeContext.format.breakWith); + serializeContext.output.push(serializeContext.format.breakWith); + } + } + + function track(serializeContext, value) { + var parts = value.split("\n"); + + serializeContext.line += parts.length - 1; + serializeContext.column = + parts.length > 1 ? 0 : serializeContext.column + parts.pop().length; + } + + function serializeStyles(tokens, context) { + var serializeContext = { + column: 0, + format: context.options.format, + indentBy: 0, + indentWith: "", + line: 1, + output: [], + spaceAfterClosingBrace: + context.options.compatibility.properties.spaceAfterClosingBrace, + store: store, + wrap: context.options.format.wrapAt + ? wrap + : function() { + /* noop */ + } + }; + + all(serializeContext, tokens); + + return { + styles: serializeContext.output.join("") + }; + } + + module.exports = serializeStyles; + }, + { "./helpers": 97 } + ], + 100: [ + function(require, module, exports) { + (function(process) { + var SourceMapGenerator = require("source-map").SourceMapGenerator; + var all = require("./helpers").all; + + var isRemoteResource = require("../utils/is-remote-resource"); + + var isWindows = process.platform == "win32"; + + var NIX_SEPARATOR_PATTERN = /\//g; + var UNKNOWN_SOURCE = "$stdin"; + var WINDOWS_SEPARATOR = "\\"; + + function store(serializeContext, element) { + var fromString = typeof element == "string"; + var value = fromString ? element : element[1]; + var mappings = fromString ? null : element[2]; + var wrap = serializeContext.wrap; + + wrap(serializeContext, value); + track(serializeContext, value, mappings); + serializeContext.output.push(value); + } + + function wrap(serializeContext, value) { + if ( + serializeContext.column + value.length > + serializeContext.format.wrapAt + ) { + track(serializeContext, serializeContext.format.breakWith, false); + serializeContext.output.push(serializeContext.format.breakWith); + } + } + + function track(serializeContext, value, mappings) { + var parts = value.split("\n"); + + if (mappings) { + trackAllMappings(serializeContext, mappings); + } + + serializeContext.line += parts.length - 1; + serializeContext.column = + parts.length > 1 + ? 0 + : serializeContext.column + parts.pop().length; + } + + function trackAllMappings(serializeContext, mappings) { + for (var i = 0, l = mappings.length; i < l; i++) { + trackMapping(serializeContext, mappings[i]); + } + } + + function trackMapping(serializeContext, mapping) { + var line = mapping[0]; + var column = mapping[1]; + var originalSource = mapping[2]; + var source = originalSource; + var storedSource = source || UNKNOWN_SOURCE; + + if (isWindows && source && !isRemoteResource(source)) { + storedSource = source.replace( + NIX_SEPARATOR_PATTERN, + WINDOWS_SEPARATOR + ); + } + + serializeContext.outputMap.addMapping({ + generated: { + line: serializeContext.line, + column: serializeContext.column + }, + source: storedSource, + original: { + line: line, + column: column + } + }); + + if ( + serializeContext.inlineSources && + originalSource in serializeContext.sourcesContent + ) { + serializeContext.outputMap.setSourceContent( + storedSource, + serializeContext.sourcesContent[originalSource] + ); + } + } + + function serializeStylesAndSourceMap(tokens, context) { + var serializeContext = { + column: 0, + format: context.options.format, + indentBy: 0, + indentWith: "", + inlineSources: context.options.sourceMapInlineSources, + line: 1, + output: [], + outputMap: new SourceMapGenerator(), + sourcesContent: context.sourcesContent, + spaceAfterClosingBrace: + context.options.compatibility.properties.spaceAfterClosingBrace, + store: store, + wrap: context.options.format.wrapAt + ? wrap + : function() { + /* noop */ + } + }; + + all(serializeContext, tokens); + + return { + sourceMap: serializeContext.outputMap, + styles: serializeContext.output.join("") + }; + } + + module.exports = serializeStylesAndSourceMap; + }.call(this, require("_process"))); + }, + { + "../utils/is-remote-resource": 93, + "./helpers": 97, + _process: 112, + "source-map": 155 + } + ], + 101: [ + function(require, module, exports) { + (function(Buffer) { + // Copyright Joyent, Inc. and other Node contributors. + // + // Permission is hereby granted, free of charge, to any person obtaining a + // copy of this software and associated documentation files (the + // "Software"), to deal in the Software without restriction, including + // without limitation the rights to use, copy, modify, merge, publish, + // distribute, sublicense, and/or sell copies of the Software, and to permit + // persons to whom the Software is furnished to do so, subject to the + // following conditions: + // + // The above copyright notice and this permission notice shall be included + // in all copies or substantial portions of the Software. + // + // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + // USE OR OTHER DEALINGS IN THE SOFTWARE. + + // NOTE: These type checking functions intentionally don't use `instanceof` + // because it is fragile and can be easily faked with `Object.create()`. + + function isArray(arg) { + if (Array.isArray) { + return Array.isArray(arg); + } + return objectToString(arg) === "[object Array]"; + } + exports.isArray = isArray; + + function isBoolean(arg) { + return typeof arg === "boolean"; + } + exports.isBoolean = isBoolean; + + function isNull(arg) { + return arg === null; + } + exports.isNull = isNull; + + function isNullOrUndefined(arg) { + return arg == null; + } + exports.isNullOrUndefined = isNullOrUndefined; + + function isNumber(arg) { + return typeof arg === "number"; + } + exports.isNumber = isNumber; + + function isString(arg) { + return typeof arg === "string"; + } + exports.isString = isString; + + function isSymbol(arg) { + return typeof arg === "symbol"; + } + exports.isSymbol = isSymbol; + + function isUndefined(arg) { + return arg === void 0; + } + exports.isUndefined = isUndefined; + + function isRegExp(re) { + return objectToString(re) === "[object RegExp]"; + } + exports.isRegExp = isRegExp; + + function isObject(arg) { + return typeof arg === "object" && arg !== null; + } + exports.isObject = isObject; + + function isDate(d) { + return objectToString(d) === "[object Date]"; + } + exports.isDate = isDate; + + function isError(e) { + return objectToString(e) === "[object Error]" || e instanceof Error; + } + exports.isError = isError; + + function isFunction(arg) { + return typeof arg === "function"; + } + exports.isFunction = isFunction; + + function isPrimitive(arg) { + return ( + arg === null || + typeof arg === "boolean" || + typeof arg === "number" || + typeof arg === "string" || + typeof arg === "symbol" || // ES6 symbol + typeof arg === "undefined" + ); + } + exports.isPrimitive = isPrimitive; + + exports.isBuffer = Buffer.isBuffer; + + function objectToString(o) { + return Object.prototype.toString.call(o); + } + }.call(this, { isBuffer: require("../../is-buffer/index.js") })); + }, + { "../../is-buffer/index.js": 107 } + ], + 102: [ + function(require, module, exports) { + // Copyright Joyent, Inc. and other Node contributors. + // + // Permission is hereby granted, free of charge, to any person obtaining a + // copy of this software and associated documentation files (the + // "Software"), to deal in the Software without restriction, including + // without limitation the rights to use, copy, modify, merge, publish, + // distribute, sublicense, and/or sell copies of the Software, and to permit + // persons to whom the Software is furnished to do so, subject to the + // following conditions: + // + // The above copyright notice and this permission notice shall be included + // in all copies or substantial portions of the Software. + // + // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + // USE OR OTHER DEALINGS IN THE SOFTWARE. + + var objectCreate = Object.create || objectCreatePolyfill; + var objectKeys = Object.keys || objectKeysPolyfill; + var bind = Function.prototype.bind || functionBindPolyfill; + + function EventEmitter() { + if ( + !this._events || + !Object.prototype.hasOwnProperty.call(this, "_events") + ) { + this._events = objectCreate(null); + this._eventsCount = 0; + } + + this._maxListeners = this._maxListeners || undefined; + } + module.exports = EventEmitter; + + // Backwards-compat with node 0.10.x + EventEmitter.EventEmitter = EventEmitter; + + EventEmitter.prototype._events = undefined; + EventEmitter.prototype._maxListeners = undefined; + + // By default EventEmitters will print a warning if more than 10 listeners are + // added to it. This is a useful default which helps finding memory leaks. + var defaultMaxListeners = 10; + + var hasDefineProperty; + try { + var o = {}; + if (Object.defineProperty) + Object.defineProperty(o, "x", { value: 0 }); + hasDefineProperty = o.x === 0; + } catch (err) { + hasDefineProperty = false; + } + if (hasDefineProperty) { + Object.defineProperty(EventEmitter, "defaultMaxListeners", { + enumerable: true, + get: function() { + return defaultMaxListeners; + }, + set: function(arg) { + // check whether the input is a positive number (whose value is zero or + // greater and not a NaN). + if (typeof arg !== "number" || arg < 0 || arg !== arg) + throw new TypeError( + '"defaultMaxListeners" must be a positive number' + ); + defaultMaxListeners = arg; + } + }); + } else { + EventEmitter.defaultMaxListeners = defaultMaxListeners; + } + + // Obviously not all Emitters should be limited to 10. This function allows + // that to be increased. Set to zero for unlimited. + EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { + if (typeof n !== "number" || n < 0 || isNaN(n)) + throw new TypeError('"n" argument must be a positive number'); + this._maxListeners = n; + return this; + }; + + function $getMaxListeners(that) { + if (that._maxListeners === undefined) + return EventEmitter.defaultMaxListeners; + return that._maxListeners; + } + + EventEmitter.prototype.getMaxListeners = function getMaxListeners() { + return $getMaxListeners(this); + }; + + // These standalone emit* functions are used to optimize calling of event + // handlers for fast cases because emit() itself often has a variable number of + // arguments and can be deoptimized because of that. These functions always have + // the same number of arguments and thus do not get deoptimized, so the code + // inside them can execute faster. + function emitNone(handler, isFn, self) { + if (isFn) handler.call(self); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) listeners[i].call(self); + } + } + function emitOne(handler, isFn, self, arg1) { + if (isFn) handler.call(self, arg1); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) listeners[i].call(self, arg1); + } + } + function emitTwo(handler, isFn, self, arg1, arg2) { + if (isFn) handler.call(self, arg1, arg2); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) listeners[i].call(self, arg1, arg2); + } + } + function emitThree(handler, isFn, self, arg1, arg2, arg3) { + if (isFn) handler.call(self, arg1, arg2, arg3); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].call(self, arg1, arg2, arg3); + } + } + + function emitMany(handler, isFn, self, args) { + if (isFn) handler.apply(self, args); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) listeners[i].apply(self, args); + } + } + + EventEmitter.prototype.emit = function emit(type) { + var er, handler, len, args, i, events; + var doError = type === "error"; + + events = this._events; + if (events) doError = doError && events.error == null; + else if (!doError) return false; + + // If there is no 'error' event listener then throw. + if (doError) { + if (arguments.length > 1) er = arguments[1]; + if (er instanceof Error) { + throw er; // Unhandled 'error' event + } else { + // At least give some kind of context to the user + var err = new Error('Unhandled "error" event. (' + er + ")"); + err.context = er; + throw err; + } + return false; + } + + handler = events[type]; + + if (!handler) return false; + + var isFn = typeof handler === "function"; + len = arguments.length; + switch (len) { + // fast cases + case 1: + emitNone(handler, isFn, this); + break; + case 2: + emitOne(handler, isFn, this, arguments[1]); + break; + case 3: + emitTwo(handler, isFn, this, arguments[1], arguments[2]); + break; + case 4: + emitThree( + handler, + isFn, + this, + arguments[1], + arguments[2], + arguments[3] + ); + break; + // slower + default: + args = new Array(len - 1); + for (i = 1; i < len; i++) args[i - 1] = arguments[i]; + emitMany(handler, isFn, this, args); + } + + return true; + }; + + function _addListener(target, type, listener, prepend) { + var m; + var events; + var existing; + + if (typeof listener !== "function") + throw new TypeError('"listener" argument must be a function'); + + events = target._events; + if (!events) { + events = target._events = objectCreate(null); + target._eventsCount = 0; + } else { + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (events.newListener) { + target.emit( + "newListener", + type, + listener.listener ? listener.listener : listener + ); + + // Re-assign `events` because a newListener handler could have caused the + // this._events to be assigned to a new object + events = target._events; + } + existing = events[type]; + } + + if (!existing) { + // Optimize the case of one listener. Don't need the extra array object. + existing = events[type] = listener; + ++target._eventsCount; + } else { + if (typeof existing === "function") { + // Adding the second element, need to change to array. + existing = events[type] = prepend + ? [listener, existing] + : [existing, listener]; + } else { + // If we've already got an array, just append. + if (prepend) { + existing.unshift(listener); + } else { + existing.push(listener); + } + } + + // Check for listener leak + if (!existing.warned) { + m = $getMaxListeners(target); + if (m && m > 0 && existing.length > m) { + existing.warned = true; + var w = new Error( + "Possible EventEmitter memory leak detected. " + + existing.length + + ' "' + + String(type) + + '" listeners ' + + "added. Use emitter.setMaxListeners() to " + + "increase limit." + ); + w.name = "MaxListenersExceededWarning"; + w.emitter = target; + w.type = type; + w.count = existing.length; + if (typeof console === "object" && console.warn) { + console.warn("%s: %s", w.name, w.message); + } + } + } + } + + return target; + } + + EventEmitter.prototype.addListener = function addListener( + type, + listener + ) { + return _addListener(this, type, listener, false); + }; + + EventEmitter.prototype.on = EventEmitter.prototype.addListener; + + EventEmitter.prototype.prependListener = function prependListener( + type, + listener + ) { + return _addListener(this, type, listener, true); + }; + + function onceWrapper() { + if (!this.fired) { + this.target.removeListener(this.type, this.wrapFn); + this.fired = true; + switch (arguments.length) { + case 0: + return this.listener.call(this.target); + case 1: + return this.listener.call(this.target, arguments[0]); + case 2: + return this.listener.call( + this.target, + arguments[0], + arguments[1] + ); + case 3: + return this.listener.call( + this.target, + arguments[0], + arguments[1], + arguments[2] + ); + default: + var args = new Array(arguments.length); + for (var i = 0; i < args.length; ++i) args[i] = arguments[i]; + this.listener.apply(this.target, args); + } + } + } + + function _onceWrap(target, type, listener) { + var state = { + fired: false, + wrapFn: undefined, + target: target, + type: type, + listener: listener + }; + var wrapped = bind.call(onceWrapper, state); + wrapped.listener = listener; + state.wrapFn = wrapped; + return wrapped; + } + + EventEmitter.prototype.once = function once(type, listener) { + if (typeof listener !== "function") + throw new TypeError('"listener" argument must be a function'); + this.on(type, _onceWrap(this, type, listener)); + return this; + }; + + EventEmitter.prototype.prependOnceListener = function prependOnceListener( + type, + listener + ) { + if (typeof listener !== "function") + throw new TypeError('"listener" argument must be a function'); + this.prependListener(type, _onceWrap(this, type, listener)); + return this; + }; + + // Emits a 'removeListener' event if and only if the listener was removed. + EventEmitter.prototype.removeListener = function removeListener( + type, + listener + ) { + var list, events, position, i, originalListener; + + if (typeof listener !== "function") + throw new TypeError('"listener" argument must be a function'); + + events = this._events; + if (!events) return this; + + list = events[type]; + if (!list) return this; + + if (list === listener || list.listener === listener) { + if (--this._eventsCount === 0) this._events = objectCreate(null); + else { + delete events[type]; + if (events.removeListener) + this.emit("removeListener", type, list.listener || listener); + } + } else if (typeof list !== "function") { + position = -1; + + for (i = list.length - 1; i >= 0; i--) { + if (list[i] === listener || list[i].listener === listener) { + originalListener = list[i].listener; + position = i; + break; + } + } + + if (position < 0) return this; + + if (position === 0) list.shift(); + else spliceOne(list, position); + + if (list.length === 1) events[type] = list[0]; + + if (events.removeListener) + this.emit("removeListener", type, originalListener || listener); + } + + return this; + }; + + EventEmitter.prototype.removeAllListeners = function removeAllListeners( + type + ) { + var listeners, events, i; + + events = this._events; + if (!events) return this; + + // not listening for removeListener, no need to emit + if (!events.removeListener) { + if (arguments.length === 0) { + this._events = objectCreate(null); + this._eventsCount = 0; + } else if (events[type]) { + if (--this._eventsCount === 0) this._events = objectCreate(null); + else delete events[type]; + } + return this; + } + + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + var keys = objectKeys(events); + var key; + for (i = 0; i < keys.length; ++i) { + key = keys[i]; + if (key === "removeListener") continue; + this.removeAllListeners(key); + } + this.removeAllListeners("removeListener"); + this._events = objectCreate(null); + this._eventsCount = 0; + return this; + } + + listeners = events[type]; + + if (typeof listeners === "function") { + this.removeListener(type, listeners); + } else if (listeners) { + // LIFO order + for (i = listeners.length - 1; i >= 0; i--) { + this.removeListener(type, listeners[i]); + } + } + + return this; + }; + + function _listeners(target, type, unwrap) { + var events = target._events; + + if (!events) return []; + + var evlistener = events[type]; + if (!evlistener) return []; + + if (typeof evlistener === "function") + return unwrap ? [evlistener.listener || evlistener] : [evlistener]; + + return unwrap + ? unwrapListeners(evlistener) + : arrayClone(evlistener, evlistener.length); + } + + EventEmitter.prototype.listeners = function listeners(type) { + return _listeners(this, type, true); + }; + + EventEmitter.prototype.rawListeners = function rawListeners(type) { + return _listeners(this, type, false); + }; + + EventEmitter.listenerCount = function(emitter, type) { + if (typeof emitter.listenerCount === "function") { + return emitter.listenerCount(type); + } else { + return listenerCount.call(emitter, type); + } + }; + + EventEmitter.prototype.listenerCount = listenerCount; + function listenerCount(type) { + var events = this._events; + + if (events) { + var evlistener = events[type]; + + if (typeof evlistener === "function") { + return 1; + } else if (evlistener) { + return evlistener.length; + } + } + + return 0; + } + + EventEmitter.prototype.eventNames = function eventNames() { + return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : []; + }; + + // About 1.5x faster than the two-arg version of Array#splice(). + function spliceOne(list, index) { + for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) + list[i] = list[k]; + list.pop(); + } + + function arrayClone(arr, n) { + var copy = new Array(n); + for (var i = 0; i < n; ++i) copy[i] = arr[i]; + return copy; + } + + function unwrapListeners(arr) { + var ret = new Array(arr.length); + for (var i = 0; i < ret.length; ++i) { + ret[i] = arr[i].listener || arr[i]; + } + return ret; + } + + function objectCreatePolyfill(proto) { + var F = function() {}; + F.prototype = proto; + return new F(); + } + function objectKeysPolyfill(obj) { + var keys = []; + for (var k in obj) + if (Object.prototype.hasOwnProperty.call(obj, k)) { + keys.push(k); + } + return k; + } + function functionBindPolyfill(context) { + var fn = this; + return function() { + return fn.apply(context, arguments); + }; + } + }, + {} + ], + 103: [ + function(require, module, exports) { + (function(global) { + /*! https://mths.be/he v1.2.0 by @mathias | MIT license */ + (function(root) { + // Detect free variables `exports`. + var freeExports = typeof exports == "object" && exports; + + // Detect free variable `module`. + var freeModule = + typeof module == "object" && + module && + module.exports == freeExports && + module; + + // Detect free variable `global`, from Node.js or Browserified code, + // and use it as `root`. + var freeGlobal = typeof global == "object" && global; + if ( + freeGlobal.global === freeGlobal || + freeGlobal.window === freeGlobal + ) { + root = freeGlobal; + } + + /*--------------------------------------------------------------------------*/ + + // All astral symbols. + var regexAstralSymbols = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g; + // All ASCII symbols (not just printable ASCII) except those listed in the + // first column of the overrides table. + // https://html.spec.whatwg.org/multipage/syntax.html#table-charref-overrides + var regexAsciiWhitelist = /[\x01-\x7F]/g; + // All BMP symbols that are not ASCII newlines, printable ASCII symbols, or + // code points listed in the first column of the overrides table on + // https://html.spec.whatwg.org/multipage/syntax.html#table-charref-overrides. + var regexBmpWhitelist = /[\x01-\t\x0B\f\x0E-\x1F\x7F\x81\x8D\x8F\x90\x9D\xA0-\uFFFF]/g; + + var regexEncodeNonAscii = /<\u20D2|=\u20E5|>\u20D2|\u205F\u200A|\u219D\u0338|\u2202\u0338|\u2220\u20D2|\u2229\uFE00|\u222A\uFE00|\u223C\u20D2|\u223D\u0331|\u223E\u0333|\u2242\u0338|\u224B\u0338|\u224D\u20D2|\u224E\u0338|\u224F\u0338|\u2250\u0338|\u2261\u20E5|\u2264\u20D2|\u2265\u20D2|\u2266\u0338|\u2267\u0338|\u2268\uFE00|\u2269\uFE00|\u226A\u0338|\u226A\u20D2|\u226B\u0338|\u226B\u20D2|\u227F\u0338|\u2282\u20D2|\u2283\u20D2|\u228A\uFE00|\u228B\uFE00|\u228F\u0338|\u2290\u0338|\u2293\uFE00|\u2294\uFE00|\u22B4\u20D2|\u22B5\u20D2|\u22D8\u0338|\u22D9\u0338|\u22DA\uFE00|\u22DB\uFE00|\u22F5\u0338|\u22F9\u0338|\u2933\u0338|\u29CF\u0338|\u29D0\u0338|\u2A6D\u0338|\u2A70\u0338|\u2A7D\u0338|\u2A7E\u0338|\u2AA1\u0338|\u2AA2\u0338|\u2AAC\uFE00|\u2AAD\uFE00|\u2AAF\u0338|\u2AB0\u0338|\u2AC5\u0338|\u2AC6\u0338|\u2ACB\uFE00|\u2ACC\uFE00|\u2AFD\u20E5|[\xA0-\u0113\u0116-\u0122\u0124-\u012B\u012E-\u014D\u0150-\u017E\u0192\u01B5\u01F5\u0237\u02C6\u02C7\u02D8-\u02DD\u0311\u0391-\u03A1\u03A3-\u03A9\u03B1-\u03C9\u03D1\u03D2\u03D5\u03D6\u03DC\u03DD\u03F0\u03F1\u03F5\u03F6\u0401-\u040C\u040E-\u044F\u0451-\u045C\u045E\u045F\u2002-\u2005\u2007-\u2010\u2013-\u2016\u2018-\u201A\u201C-\u201E\u2020-\u2022\u2025\u2026\u2030-\u2035\u2039\u203A\u203E\u2041\u2043\u2044\u204F\u2057\u205F-\u2063\u20AC\u20DB\u20DC\u2102\u2105\u210A-\u2113\u2115-\u211E\u2122\u2124\u2127-\u2129\u212C\u212D\u212F-\u2131\u2133-\u2138\u2145-\u2148\u2153-\u215E\u2190-\u219B\u219D-\u21A7\u21A9-\u21AE\u21B0-\u21B3\u21B5-\u21B7\u21BA-\u21DB\u21DD\u21E4\u21E5\u21F5\u21FD-\u2205\u2207-\u2209\u220B\u220C\u220F-\u2214\u2216-\u2218\u221A\u221D-\u2238\u223A-\u2257\u2259\u225A\u225C\u225F-\u2262\u2264-\u228B\u228D-\u229B\u229D-\u22A5\u22A7-\u22B0\u22B2-\u22BB\u22BD-\u22DB\u22DE-\u22E3\u22E6-\u22F7\u22F9-\u22FE\u2305\u2306\u2308-\u2310\u2312\u2313\u2315\u2316\u231C-\u231F\u2322\u2323\u232D\u232E\u2336\u233D\u233F\u237C\u23B0\u23B1\u23B4-\u23B6\u23DC-\u23DF\u23E2\u23E7\u2423\u24C8\u2500\u2502\u250C\u2510\u2514\u2518\u251C\u2524\u252C\u2534\u253C\u2550-\u256C\u2580\u2584\u2588\u2591-\u2593\u25A1\u25AA\u25AB\u25AD\u25AE\u25B1\u25B3-\u25B5\u25B8\u25B9\u25BD-\u25BF\u25C2\u25C3\u25CA\u25CB\u25EC\u25EF\u25F8-\u25FC\u2605\u2606\u260E\u2640\u2642\u2660\u2663\u2665\u2666\u266A\u266D-\u266F\u2713\u2717\u2720\u2736\u2758\u2772\u2773\u27C8\u27C9\u27E6-\u27ED\u27F5-\u27FA\u27FC\u27FF\u2902-\u2905\u290C-\u2913\u2916\u2919-\u2920\u2923-\u292A\u2933\u2935-\u2939\u293C\u293D\u2945\u2948-\u294B\u294E-\u2976\u2978\u2979\u297B-\u297F\u2985\u2986\u298B-\u2996\u299A\u299C\u299D\u29A4-\u29B7\u29B9\u29BB\u29BC\u29BE-\u29C5\u29C9\u29CD-\u29D0\u29DC-\u29DE\u29E3-\u29E5\u29EB\u29F4\u29F6\u2A00-\u2A02\u2A04\u2A06\u2A0C\u2A0D\u2A10-\u2A17\u2A22-\u2A27\u2A29\u2A2A\u2A2D-\u2A31\u2A33-\u2A3C\u2A3F\u2A40\u2A42-\u2A4D\u2A50\u2A53-\u2A58\u2A5A-\u2A5D\u2A5F\u2A66\u2A6A\u2A6D-\u2A75\u2A77-\u2A9A\u2A9D-\u2AA2\u2AA4-\u2AB0\u2AB3-\u2AC8\u2ACB\u2ACC\u2ACF-\u2ADB\u2AE4\u2AE6-\u2AE9\u2AEB-\u2AF3\u2AFD\uFB00-\uFB04]|\uD835[\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDCCF\uDD04\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDD6B]/g; + var encodeMap = { + "\xAD": "shy", + "\u200C": "zwnj", + "\u200D": "zwj", + "\u200E": "lrm", + "\u2063": "ic", + "\u2062": "it", + "\u2061": "af", + "\u200F": "rlm", + "\u200B": "ZeroWidthSpace", + "\u2060": "NoBreak", + "\u0311": "DownBreve", + "\u20DB": "tdot", + "\u20DC": "DotDot", + "\t": "Tab", + "\n": "NewLine", + "\u2008": "puncsp", + "\u205F": "MediumSpace", + "\u2009": "thinsp", + "\u200A": "hairsp", + "\u2004": "emsp13", + "\u2002": "ensp", + "\u2005": "emsp14", + "\u2003": "emsp", + "\u2007": "numsp", + "\xA0": "nbsp", + "\u205F\u200A": "ThickSpace", + "\u203E": "oline", + _: "lowbar", + "\u2010": "dash", + "\u2013": "ndash", + "\u2014": "mdash", + "\u2015": "horbar", + ",": "comma", + ";": "semi", + "\u204F": "bsemi", + ":": "colon", + "\u2A74": "Colone", + "!": "excl", + "\xA1": "iexcl", + "?": "quest", + "\xBF": "iquest", + ".": "period", + "\u2025": "nldr", + "\u2026": "mldr", + "\xB7": "middot", + "'": "apos", + "\u2018": "lsquo", + "\u2019": "rsquo", + "\u201A": "sbquo", + "\u2039": "lsaquo", + "\u203A": "rsaquo", + '"': "quot", + "\u201C": "ldquo", + "\u201D": "rdquo", + "\u201E": "bdquo", + "\xAB": "laquo", + "\xBB": "raquo", + "(": "lpar", + ")": "rpar", + "[": "lsqb", + "]": "rsqb", + "{": "lcub", + "}": "rcub", + "\u2308": "lceil", + "\u2309": "rceil", + "\u230A": "lfloor", + "\u230B": "rfloor", + "\u2985": "lopar", + "\u2986": "ropar", + "\u298B": "lbrke", + "\u298C": "rbrke", + "\u298D": "lbrkslu", + "\u298E": "rbrksld", + "\u298F": "lbrksld", + "\u2990": "rbrkslu", + "\u2991": "langd", + "\u2992": "rangd", + "\u2993": "lparlt", + "\u2994": "rpargt", + "\u2995": "gtlPar", + "\u2996": "ltrPar", + "\u27E6": "lobrk", + "\u27E7": "robrk", + "\u27E8": "lang", + "\u27E9": "rang", + "\u27EA": "Lang", + "\u27EB": "Rang", + "\u27EC": "loang", + "\u27ED": "roang", + "\u2772": "lbbrk", + "\u2773": "rbbrk", + "\u2016": "Vert", + "\xA7": "sect", + "\xB6": "para", + "@": "commat", + "*": "ast", + "/": "sol", + undefined: null, + "&": "amp", + "#": "num", + "%": "percnt", + "\u2030": "permil", + "\u2031": "pertenk", + "\u2020": "dagger", + "\u2021": "Dagger", + "\u2022": "bull", + "\u2043": "hybull", + "\u2032": "prime", + "\u2033": "Prime", + "\u2034": "tprime", + "\u2057": "qprime", + "\u2035": "bprime", + "\u2041": "caret", + "`": "grave", + "\xB4": "acute", + "\u02DC": "tilde", + "^": "Hat", + "\xAF": "macr", + "\u02D8": "breve", + "\u02D9": "dot", + "\xA8": "die", + "\u02DA": "ring", + "\u02DD": "dblac", + "\xB8": "cedil", + "\u02DB": "ogon", + ˆ: "circ", + ˇ: "caron", + "\xB0": "deg", + "\xA9": "copy", + "\xAE": "reg", + "\u2117": "copysr", + "\u2118": "wp", + "\u211E": "rx", + "\u2127": "mho", + "\u2129": "iiota", + "\u2190": "larr", + "\u219A": "nlarr", + "\u2192": "rarr", + "\u219B": "nrarr", + "\u2191": "uarr", + "\u2193": "darr", + "\u2194": "harr", + "\u21AE": "nharr", + "\u2195": "varr", + "\u2196": "nwarr", + "\u2197": "nearr", + "\u2198": "searr", + "\u2199": "swarr", + "\u219D": "rarrw", + "\u219D\u0338": "nrarrw", + "\u219E": "Larr", + "\u219F": "Uarr", + "\u21A0": "Rarr", + "\u21A1": "Darr", + "\u21A2": "larrtl", + "\u21A3": "rarrtl", + "\u21A4": "mapstoleft", + "\u21A5": "mapstoup", + "\u21A6": "map", + "\u21A7": "mapstodown", + "\u21A9": "larrhk", + "\u21AA": "rarrhk", + "\u21AB": "larrlp", + "\u21AC": "rarrlp", + "\u21AD": "harrw", + "\u21B0": "lsh", + "\u21B1": "rsh", + "\u21B2": "ldsh", + "\u21B3": "rdsh", + "\u21B5": "crarr", + "\u21B6": "cularr", + "\u21B7": "curarr", + "\u21BA": "olarr", + "\u21BB": "orarr", + "\u21BC": "lharu", + "\u21BD": "lhard", + "\u21BE": "uharr", + "\u21BF": "uharl", + "\u21C0": "rharu", + "\u21C1": "rhard", + "\u21C2": "dharr", + "\u21C3": "dharl", + "\u21C4": "rlarr", + "\u21C5": "udarr", + "\u21C6": "lrarr", + "\u21C7": "llarr", + "\u21C8": "uuarr", + "\u21C9": "rrarr", + "\u21CA": "ddarr", + "\u21CB": "lrhar", + "\u21CC": "rlhar", + "\u21D0": "lArr", + "\u21CD": "nlArr", + "\u21D1": "uArr", + "\u21D2": "rArr", + "\u21CF": "nrArr", + "\u21D3": "dArr", + "\u21D4": "iff", + "\u21CE": "nhArr", + "\u21D5": "vArr", + "\u21D6": "nwArr", + "\u21D7": "neArr", + "\u21D8": "seArr", + "\u21D9": "swArr", + "\u21DA": "lAarr", + "\u21DB": "rAarr", + "\u21DD": "zigrarr", + "\u21E4": "larrb", + "\u21E5": "rarrb", + "\u21F5": "duarr", + "\u21FD": "loarr", + "\u21FE": "roarr", + "\u21FF": "hoarr", + "\u2200": "forall", + "\u2201": "comp", + "\u2202": "part", + "\u2202\u0338": "npart", + "\u2203": "exist", + "\u2204": "nexist", + "\u2205": "empty", + "\u2207": "Del", + "\u2208": "in", + "\u2209": "notin", + "\u220B": "ni", + "\u220C": "notni", + "\u03F6": "bepsi", + "\u220F": "prod", + "\u2210": "coprod", + "\u2211": "sum", + "+": "plus", + "\xB1": "pm", + "\xF7": "div", + "\xD7": "times", + "<": "lt", + "\u226E": "nlt", + "<\u20D2": "nvlt", + "=": "equals", + "\u2260": "ne", + "=\u20E5": "bne", + "\u2A75": "Equal", + ">": "gt", + "\u226F": "ngt", + ">\u20D2": "nvgt", + "\xAC": "not", + "|": "vert", + "\xA6": "brvbar", + "\u2212": "minus", + "\u2213": "mp", + "\u2214": "plusdo", + "\u2044": "frasl", + "\u2216": "setmn", + "\u2217": "lowast", + "\u2218": "compfn", + "\u221A": "Sqrt", + "\u221D": "prop", + "\u221E": "infin", + "\u221F": "angrt", + "\u2220": "ang", + "\u2220\u20D2": "nang", + "\u2221": "angmsd", + "\u2222": "angsph", + "\u2223": "mid", + "\u2224": "nmid", + "\u2225": "par", + "\u2226": "npar", + "\u2227": "and", + "\u2228": "or", + "\u2229": "cap", + "\u2229\uFE00": "caps", + "\u222A": "cup", + "\u222A\uFE00": "cups", + "\u222B": "int", + "\u222C": "Int", + "\u222D": "tint", + "\u2A0C": "qint", + "\u222E": "oint", + "\u222F": "Conint", + "\u2230": "Cconint", + "\u2231": "cwint", + "\u2232": "cwconint", + "\u2233": "awconint", + "\u2234": "there4", + "\u2235": "becaus", + "\u2236": "ratio", + "\u2237": "Colon", + "\u2238": "minusd", + "\u223A": "mDDot", + "\u223B": "homtht", + "\u223C": "sim", + "\u2241": "nsim", + "\u223C\u20D2": "nvsim", + "\u223D": "bsim", + "\u223D\u0331": "race", + "\u223E": "ac", + "\u223E\u0333": "acE", + "\u223F": "acd", + "\u2240": "wr", + "\u2242": "esim", + "\u2242\u0338": "nesim", + "\u2243": "sime", + "\u2244": "nsime", + "\u2245": "cong", + "\u2247": "ncong", + "\u2246": "simne", + "\u2248": "ap", + "\u2249": "nap", + "\u224A": "ape", + "\u224B": "apid", + "\u224B\u0338": "napid", + "\u224C": "bcong", + "\u224D": "CupCap", + "\u226D": "NotCupCap", + "\u224D\u20D2": "nvap", + "\u224E": "bump", + "\u224E\u0338": "nbump", + "\u224F": "bumpe", + "\u224F\u0338": "nbumpe", + "\u2250": "doteq", + "\u2250\u0338": "nedot", + "\u2251": "eDot", + "\u2252": "efDot", + "\u2253": "erDot", + "\u2254": "colone", + "\u2255": "ecolon", + "\u2256": "ecir", + "\u2257": "cire", + "\u2259": "wedgeq", + "\u225A": "veeeq", + "\u225C": "trie", + "\u225F": "equest", + "\u2261": "equiv", + "\u2262": "nequiv", + "\u2261\u20E5": "bnequiv", + "\u2264": "le", + "\u2270": "nle", + "\u2264\u20D2": "nvle", + "\u2265": "ge", + "\u2271": "nge", + "\u2265\u20D2": "nvge", + "\u2266": "lE", + "\u2266\u0338": "nlE", + "\u2267": "gE", + "\u2267\u0338": "ngE", + "\u2268\uFE00": "lvnE", + "\u2268": "lnE", + "\u2269": "gnE", + "\u2269\uFE00": "gvnE", + "\u226A": "ll", + "\u226A\u0338": "nLtv", + "\u226A\u20D2": "nLt", + "\u226B": "gg", + "\u226B\u0338": "nGtv", + "\u226B\u20D2": "nGt", + "\u226C": "twixt", + "\u2272": "lsim", + "\u2274": "nlsim", + "\u2273": "gsim", + "\u2275": "ngsim", + "\u2276": "lg", + "\u2278": "ntlg", + "\u2277": "gl", + "\u2279": "ntgl", + "\u227A": "pr", + "\u2280": "npr", + "\u227B": "sc", + "\u2281": "nsc", + "\u227C": "prcue", + "\u22E0": "nprcue", + "\u227D": "sccue", + "\u22E1": "nsccue", + "\u227E": "prsim", + "\u227F": "scsim", + "\u227F\u0338": "NotSucceedsTilde", + "\u2282": "sub", + "\u2284": "nsub", + "\u2282\u20D2": "vnsub", + "\u2283": "sup", + "\u2285": "nsup", + "\u2283\u20D2": "vnsup", + "\u2286": "sube", + "\u2288": "nsube", + "\u2287": "supe", + "\u2289": "nsupe", + "\u228A\uFE00": "vsubne", + "\u228A": "subne", + "\u228B\uFE00": "vsupne", + "\u228B": "supne", + "\u228D": "cupdot", + "\u228E": "uplus", + "\u228F": "sqsub", + "\u228F\u0338": "NotSquareSubset", + "\u2290": "sqsup", + "\u2290\u0338": "NotSquareSuperset", + "\u2291": "sqsube", + "\u22E2": "nsqsube", + "\u2292": "sqsupe", + "\u22E3": "nsqsupe", + "\u2293": "sqcap", + "\u2293\uFE00": "sqcaps", + "\u2294": "sqcup", + "\u2294\uFE00": "sqcups", + "\u2295": "oplus", + "\u2296": "ominus", + "\u2297": "otimes", + "\u2298": "osol", + "\u2299": "odot", + "\u229A": "ocir", + "\u229B": "oast", + "\u229D": "odash", + "\u229E": "plusb", + "\u229F": "minusb", + "\u22A0": "timesb", + "\u22A1": "sdotb", + "\u22A2": "vdash", + "\u22AC": "nvdash", + "\u22A3": "dashv", + "\u22A4": "top", + "\u22A5": "bot", + "\u22A7": "models", + "\u22A8": "vDash", + "\u22AD": "nvDash", + "\u22A9": "Vdash", + "\u22AE": "nVdash", + "\u22AA": "Vvdash", + "\u22AB": "VDash", + "\u22AF": "nVDash", + "\u22B0": "prurel", + "\u22B2": "vltri", + "\u22EA": "nltri", + "\u22B3": "vrtri", + "\u22EB": "nrtri", + "\u22B4": "ltrie", + "\u22EC": "nltrie", + "\u22B4\u20D2": "nvltrie", + "\u22B5": "rtrie", + "\u22ED": "nrtrie", + "\u22B5\u20D2": "nvrtrie", + "\u22B6": "origof", + "\u22B7": "imof", + "\u22B8": "mumap", + "\u22B9": "hercon", + "\u22BA": "intcal", + "\u22BB": "veebar", + "\u22BD": "barvee", + "\u22BE": "angrtvb", + "\u22BF": "lrtri", + "\u22C0": "Wedge", + "\u22C1": "Vee", + "\u22C2": "xcap", + "\u22C3": "xcup", + "\u22C4": "diam", + "\u22C5": "sdot", + "\u22C6": "Star", + "\u22C7": "divonx", + "\u22C8": "bowtie", + "\u22C9": "ltimes", + "\u22CA": "rtimes", + "\u22CB": "lthree", + "\u22CC": "rthree", + "\u22CD": "bsime", + "\u22CE": "cuvee", + "\u22CF": "cuwed", + "\u22D0": "Sub", + "\u22D1": "Sup", + "\u22D2": "Cap", + "\u22D3": "Cup", + "\u22D4": "fork", + "\u22D5": "epar", + "\u22D6": "ltdot", + "\u22D7": "gtdot", + "\u22D8": "Ll", + "\u22D8\u0338": "nLl", + "\u22D9": "Gg", + "\u22D9\u0338": "nGg", + "\u22DA\uFE00": "lesg", + "\u22DA": "leg", + "\u22DB": "gel", + "\u22DB\uFE00": "gesl", + "\u22DE": "cuepr", + "\u22DF": "cuesc", + "\u22E6": "lnsim", + "\u22E7": "gnsim", + "\u22E8": "prnsim", + "\u22E9": "scnsim", + "\u22EE": "vellip", + "\u22EF": "ctdot", + "\u22F0": "utdot", + "\u22F1": "dtdot", + "\u22F2": "disin", + "\u22F3": "isinsv", + "\u22F4": "isins", + "\u22F5": "isindot", + "\u22F5\u0338": "notindot", + "\u22F6": "notinvc", + "\u22F7": "notinvb", + "\u22F9": "isinE", + "\u22F9\u0338": "notinE", + "\u22FA": "nisd", + "\u22FB": "xnis", + "\u22FC": "nis", + "\u22FD": "notnivc", + "\u22FE": "notnivb", + "\u2305": "barwed", + "\u2306": "Barwed", + "\u230C": "drcrop", + "\u230D": "dlcrop", + "\u230E": "urcrop", + "\u230F": "ulcrop", + "\u2310": "bnot", + "\u2312": "profline", + "\u2313": "profsurf", + "\u2315": "telrec", + "\u2316": "target", + "\u231C": "ulcorn", + "\u231D": "urcorn", + "\u231E": "dlcorn", + "\u231F": "drcorn", + "\u2322": "frown", + "\u2323": "smile", + "\u232D": "cylcty", + "\u232E": "profalar", + "\u2336": "topbot", + "\u233D": "ovbar", + "\u233F": "solbar", + "\u237C": "angzarr", + "\u23B0": "lmoust", + "\u23B1": "rmoust", + "\u23B4": "tbrk", + "\u23B5": "bbrk", + "\u23B6": "bbrktbrk", + "\u23DC": "OverParenthesis", + "\u23DD": "UnderParenthesis", + "\u23DE": "OverBrace", + "\u23DF": "UnderBrace", + "\u23E2": "trpezium", + "\u23E7": "elinters", + "\u2423": "blank", + "\u2500": "boxh", + "\u2502": "boxv", + "\u250C": "boxdr", + "\u2510": "boxdl", + "\u2514": "boxur", + "\u2518": "boxul", + "\u251C": "boxvr", + "\u2524": "boxvl", + "\u252C": "boxhd", + "\u2534": "boxhu", + "\u253C": "boxvh", + "\u2550": "boxH", + "\u2551": "boxV", + "\u2552": "boxdR", + "\u2553": "boxDr", + "\u2554": "boxDR", + "\u2555": "boxdL", + "\u2556": "boxDl", + "\u2557": "boxDL", + "\u2558": "boxuR", + "\u2559": "boxUr", + "\u255A": "boxUR", + "\u255B": "boxuL", + "\u255C": "boxUl", + "\u255D": "boxUL", + "\u255E": "boxvR", + "\u255F": "boxVr", + "\u2560": "boxVR", + "\u2561": "boxvL", + "\u2562": "boxVl", + "\u2563": "boxVL", + "\u2564": "boxHd", + "\u2565": "boxhD", + "\u2566": "boxHD", + "\u2567": "boxHu", + "\u2568": "boxhU", + "\u2569": "boxHU", + "\u256A": "boxvH", + "\u256B": "boxVh", + "\u256C": "boxVH", + "\u2580": "uhblk", + "\u2584": "lhblk", + "\u2588": "block", + "\u2591": "blk14", + "\u2592": "blk12", + "\u2593": "blk34", + "\u25A1": "squ", + "\u25AA": "squf", + "\u25AB": "EmptyVerySmallSquare", + "\u25AD": "rect", + "\u25AE": "marker", + "\u25B1": "fltns", + "\u25B3": "xutri", + "\u25B4": "utrif", + "\u25B5": "utri", + "\u25B8": "rtrif", + "\u25B9": "rtri", + "\u25BD": "xdtri", + "\u25BE": "dtrif", + "\u25BF": "dtri", + "\u25C2": "ltrif", + "\u25C3": "ltri", + "\u25CA": "loz", + "\u25CB": "cir", + "\u25EC": "tridot", + "\u25EF": "xcirc", + "\u25F8": "ultri", + "\u25F9": "urtri", + "\u25FA": "lltri", + "\u25FB": "EmptySmallSquare", + "\u25FC": "FilledSmallSquare", + "\u2605": "starf", + "\u2606": "star", + "\u260E": "phone", + "\u2640": "female", + "\u2642": "male", + "\u2660": "spades", + "\u2663": "clubs", + "\u2665": "hearts", + "\u2666": "diams", + "\u266A": "sung", + "\u2713": "check", + "\u2717": "cross", + "\u2720": "malt", + "\u2736": "sext", + "\u2758": "VerticalSeparator", + "\u27C8": "bsolhsub", + "\u27C9": "suphsol", + "\u27F5": "xlarr", + "\u27F6": "xrarr", + "\u27F7": "xharr", + "\u27F8": "xlArr", + "\u27F9": "xrArr", + "\u27FA": "xhArr", + "\u27FC": "xmap", + "\u27FF": "dzigrarr", + "\u2902": "nvlArr", + "\u2903": "nvrArr", + "\u2904": "nvHarr", + "\u2905": "Map", + "\u290C": "lbarr", + "\u290D": "rbarr", + "\u290E": "lBarr", + "\u290F": "rBarr", + "\u2910": "RBarr", + "\u2911": "DDotrahd", + "\u2912": "UpArrowBar", + "\u2913": "DownArrowBar", + "\u2916": "Rarrtl", + "\u2919": "latail", + "\u291A": "ratail", + "\u291B": "lAtail", + "\u291C": "rAtail", + "\u291D": "larrfs", + "\u291E": "rarrfs", + "\u291F": "larrbfs", + "\u2920": "rarrbfs", + "\u2923": "nwarhk", + "\u2924": "nearhk", + "\u2925": "searhk", + "\u2926": "swarhk", + "\u2927": "nwnear", + "\u2928": "toea", + "\u2929": "tosa", + "\u292A": "swnwar", + "\u2933": "rarrc", + "\u2933\u0338": "nrarrc", + "\u2935": "cudarrr", + "\u2936": "ldca", + "\u2937": "rdca", + "\u2938": "cudarrl", + "\u2939": "larrpl", + "\u293C": "curarrm", + "\u293D": "cularrp", + "\u2945": "rarrpl", + "\u2948": "harrcir", + "\u2949": "Uarrocir", + "\u294A": "lurdshar", + "\u294B": "ldrushar", + "\u294E": "LeftRightVector", + "\u294F": "RightUpDownVector", + "\u2950": "DownLeftRightVector", + "\u2951": "LeftUpDownVector", + "\u2952": "LeftVectorBar", + "\u2953": "RightVectorBar", + "\u2954": "RightUpVectorBar", + "\u2955": "RightDownVectorBar", + "\u2956": "DownLeftVectorBar", + "\u2957": "DownRightVectorBar", + "\u2958": "LeftUpVectorBar", + "\u2959": "LeftDownVectorBar", + "\u295A": "LeftTeeVector", + "\u295B": "RightTeeVector", + "\u295C": "RightUpTeeVector", + "\u295D": "RightDownTeeVector", + "\u295E": "DownLeftTeeVector", + "\u295F": "DownRightTeeVector", + "\u2960": "LeftUpTeeVector", + "\u2961": "LeftDownTeeVector", + "\u2962": "lHar", + "\u2963": "uHar", + "\u2964": "rHar", + "\u2965": "dHar", + "\u2966": "luruhar", + "\u2967": "ldrdhar", + "\u2968": "ruluhar", + "\u2969": "rdldhar", + "\u296A": "lharul", + "\u296B": "llhard", + "\u296C": "rharul", + "\u296D": "lrhard", + "\u296E": "udhar", + "\u296F": "duhar", + "\u2970": "RoundImplies", + "\u2971": "erarr", + "\u2972": "simrarr", + "\u2973": "larrsim", + "\u2974": "rarrsim", + "\u2975": "rarrap", + "\u2976": "ltlarr", + "\u2978": "gtrarr", + "\u2979": "subrarr", + "\u297B": "suplarr", + "\u297C": "lfisht", + "\u297D": "rfisht", + "\u297E": "ufisht", + "\u297F": "dfisht", + "\u299A": "vzigzag", + "\u299C": "vangrt", + "\u299D": "angrtvbd", + "\u29A4": "ange", + "\u29A5": "range", + "\u29A6": "dwangle", + "\u29A7": "uwangle", + "\u29A8": "angmsdaa", + "\u29A9": "angmsdab", + "\u29AA": "angmsdac", + "\u29AB": "angmsdad", + "\u29AC": "angmsdae", + "\u29AD": "angmsdaf", + "\u29AE": "angmsdag", + "\u29AF": "angmsdah", + "\u29B0": "bemptyv", + "\u29B1": "demptyv", + "\u29B2": "cemptyv", + "\u29B3": "raemptyv", + "\u29B4": "laemptyv", + "\u29B5": "ohbar", + "\u29B6": "omid", + "\u29B7": "opar", + "\u29B9": "operp", + "\u29BB": "olcross", + "\u29BC": "odsold", + "\u29BE": "olcir", + "\u29BF": "ofcir", + "\u29C0": "olt", + "\u29C1": "ogt", + "\u29C2": "cirscir", + "\u29C3": "cirE", + "\u29C4": "solb", + "\u29C5": "bsolb", + "\u29C9": "boxbox", + "\u29CD": "trisb", + "\u29CE": "rtriltri", + "\u29CF": "LeftTriangleBar", + "\u29CF\u0338": "NotLeftTriangleBar", + "\u29D0": "RightTriangleBar", + "\u29D0\u0338": "NotRightTriangleBar", + "\u29DC": "iinfin", + "\u29DD": "infintie", + "\u29DE": "nvinfin", + "\u29E3": "eparsl", + "\u29E4": "smeparsl", + "\u29E5": "eqvparsl", + "\u29EB": "lozf", + "\u29F4": "RuleDelayed", + "\u29F6": "dsol", + "\u2A00": "xodot", + "\u2A01": "xoplus", + "\u2A02": "xotime", + "\u2A04": "xuplus", + "\u2A06": "xsqcup", + "\u2A0D": "fpartint", + "\u2A10": "cirfnint", + "\u2A11": "awint", + "\u2A12": "rppolint", + "\u2A13": "scpolint", + "\u2A14": "npolint", + "\u2A15": "pointint", + "\u2A16": "quatint", + "\u2A17": "intlarhk", + "\u2A22": "pluscir", + "\u2A23": "plusacir", + "\u2A24": "simplus", + "\u2A25": "plusdu", + "\u2A26": "plussim", + "\u2A27": "plustwo", + "\u2A29": "mcomma", + "\u2A2A": "minusdu", + "\u2A2D": "loplus", + "\u2A2E": "roplus", + "\u2A2F": "Cross", + "\u2A30": "timesd", + "\u2A31": "timesbar", + "\u2A33": "smashp", + "\u2A34": "lotimes", + "\u2A35": "rotimes", + "\u2A36": "otimesas", + "\u2A37": "Otimes", + "\u2A38": "odiv", + "\u2A39": "triplus", + "\u2A3A": "triminus", + "\u2A3B": "tritime", + "\u2A3C": "iprod", + "\u2A3F": "amalg", + "\u2A40": "capdot", + "\u2A42": "ncup", + "\u2A43": "ncap", + "\u2A44": "capand", + "\u2A45": "cupor", + "\u2A46": "cupcap", + "\u2A47": "capcup", + "\u2A48": "cupbrcap", + "\u2A49": "capbrcup", + "\u2A4A": "cupcup", + "\u2A4B": "capcap", + "\u2A4C": "ccups", + "\u2A4D": "ccaps", + "\u2A50": "ccupssm", + "\u2A53": "And", + "\u2A54": "Or", + "\u2A55": "andand", + "\u2A56": "oror", + "\u2A57": "orslope", + "\u2A58": "andslope", + "\u2A5A": "andv", + "\u2A5B": "orv", + "\u2A5C": "andd", + "\u2A5D": "ord", + "\u2A5F": "wedbar", + "\u2A66": "sdote", + "\u2A6A": "simdot", + "\u2A6D": "congdot", + "\u2A6D\u0338": "ncongdot", + "\u2A6E": "easter", + "\u2A6F": "apacir", + "\u2A70": "apE", + "\u2A70\u0338": "napE", + "\u2A71": "eplus", + "\u2A72": "pluse", + "\u2A73": "Esim", + "\u2A77": "eDDot", + "\u2A78": "equivDD", + "\u2A79": "ltcir", + "\u2A7A": "gtcir", + "\u2A7B": "ltquest", + "\u2A7C": "gtquest", + "\u2A7D": "les", + "\u2A7D\u0338": "nles", + "\u2A7E": "ges", + "\u2A7E\u0338": "nges", + "\u2A7F": "lesdot", + "\u2A80": "gesdot", + "\u2A81": "lesdoto", + "\u2A82": "gesdoto", + "\u2A83": "lesdotor", + "\u2A84": "gesdotol", + "\u2A85": "lap", + "\u2A86": "gap", + "\u2A87": "lne", + "\u2A88": "gne", + "\u2A89": "lnap", + "\u2A8A": "gnap", + "\u2A8B": "lEg", + "\u2A8C": "gEl", + "\u2A8D": "lsime", + "\u2A8E": "gsime", + "\u2A8F": "lsimg", + "\u2A90": "gsiml", + "\u2A91": "lgE", + "\u2A92": "glE", + "\u2A93": "lesges", + "\u2A94": "gesles", + "\u2A95": "els", + "\u2A96": "egs", + "\u2A97": "elsdot", + "\u2A98": "egsdot", + "\u2A99": "el", + "\u2A9A": "eg", + "\u2A9D": "siml", + "\u2A9E": "simg", + "\u2A9F": "simlE", + "\u2AA0": "simgE", + "\u2AA1": "LessLess", + "\u2AA1\u0338": "NotNestedLessLess", + "\u2AA2": "GreaterGreater", + "\u2AA2\u0338": "NotNestedGreaterGreater", + "\u2AA4": "glj", + "\u2AA5": "gla", + "\u2AA6": "ltcc", + "\u2AA7": "gtcc", + "\u2AA8": "lescc", + "\u2AA9": "gescc", + "\u2AAA": "smt", + "\u2AAB": "lat", + "\u2AAC": "smte", + "\u2AAC\uFE00": "smtes", + "\u2AAD": "late", + "\u2AAD\uFE00": "lates", + "\u2AAE": "bumpE", + "\u2AAF": "pre", + "\u2AAF\u0338": "npre", + "\u2AB0": "sce", + "\u2AB0\u0338": "nsce", + "\u2AB3": "prE", + "\u2AB4": "scE", + "\u2AB5": "prnE", + "\u2AB6": "scnE", + "\u2AB7": "prap", + "\u2AB8": "scap", + "\u2AB9": "prnap", + "\u2ABA": "scnap", + "\u2ABB": "Pr", + "\u2ABC": "Sc", + "\u2ABD": "subdot", + "\u2ABE": "supdot", + "\u2ABF": "subplus", + "\u2AC0": "supplus", + "\u2AC1": "submult", + "\u2AC2": "supmult", + "\u2AC3": "subedot", + "\u2AC4": "supedot", + "\u2AC5": "subE", + "\u2AC5\u0338": "nsubE", + "\u2AC6": "supE", + "\u2AC6\u0338": "nsupE", + "\u2AC7": "subsim", + "\u2AC8": "supsim", + "\u2ACB\uFE00": "vsubnE", + "\u2ACB": "subnE", + "\u2ACC\uFE00": "vsupnE", + "\u2ACC": "supnE", + "\u2ACF": "csub", + "\u2AD0": "csup", + "\u2AD1": "csube", + "\u2AD2": "csupe", + "\u2AD3": "subsup", + "\u2AD4": "supsub", + "\u2AD5": "subsub", + "\u2AD6": "supsup", + "\u2AD7": "suphsub", + "\u2AD8": "supdsub", + "\u2AD9": "forkv", + "\u2ADA": "topfork", + "\u2ADB": "mlcp", + "\u2AE4": "Dashv", + "\u2AE6": "Vdashl", + "\u2AE7": "Barv", + "\u2AE8": "vBar", + "\u2AE9": "vBarv", + "\u2AEB": "Vbar", + "\u2AEC": "Not", + "\u2AED": "bNot", + "\u2AEE": "rnmid", + "\u2AEF": "cirmid", + "\u2AF0": "midcir", + "\u2AF1": "topcir", + "\u2AF2": "nhpar", + "\u2AF3": "parsim", + "\u2AFD": "parsl", + "\u2AFD\u20E5": "nparsl", + "\u266D": "flat", + "\u266E": "natur", + "\u266F": "sharp", + "\xA4": "curren", + "\xA2": "cent", + $: "dollar", + "\xA3": "pound", + "\xA5": "yen", + "\u20AC": "euro", + "\xB9": "sup1", + "\xBD": "half", + "\u2153": "frac13", + "\xBC": "frac14", + "\u2155": "frac15", + "\u2159": "frac16", + "\u215B": "frac18", + "\xB2": "sup2", + "\u2154": "frac23", + "\u2156": "frac25", + "\xB3": "sup3", + "\xBE": "frac34", + "\u2157": "frac35", + "\u215C": "frac38", + "\u2158": "frac45", + "\u215A": "frac56", + "\u215D": "frac58", + "\u215E": "frac78", + "\uD835\uDCB6": "ascr", + "\uD835\uDD52": "aopf", + "\uD835\uDD1E": "afr", + "\uD835\uDD38": "Aopf", + "\uD835\uDD04": "Afr", + "\uD835\uDC9C": "Ascr", + ª: "ordf", + á: "aacute", + Á: "Aacute", + à: "agrave", + À: "Agrave", + ă: "abreve", + Ă: "Abreve", + â: "acirc", + Â: "Acirc", + å: "aring", + Å: "angst", + ä: "auml", + Ä: "Auml", + ã: "atilde", + Ã: "Atilde", + ą: "aogon", + Ą: "Aogon", + ā: "amacr", + Ā: "Amacr", + æ: "aelig", + Æ: "AElig", + "\uD835\uDCB7": "bscr", + "\uD835\uDD53": "bopf", + "\uD835\uDD1F": "bfr", + "\uD835\uDD39": "Bopf", + ℬ: "Bscr", + "\uD835\uDD05": "Bfr", + "\uD835\uDD20": "cfr", + "\uD835\uDCB8": "cscr", + "\uD835\uDD54": "copf", + ℭ: "Cfr", + "\uD835\uDC9E": "Cscr", + ℂ: "Copf", + ć: "cacute", + Ć: "Cacute", + ĉ: "ccirc", + Ĉ: "Ccirc", + č: "ccaron", + Č: "Ccaron", + ċ: "cdot", + Ċ: "Cdot", + ç: "ccedil", + Ç: "Ccedil", + "\u2105": "incare", + "\uD835\uDD21": "dfr", + ⅆ: "dd", + "\uD835\uDD55": "dopf", + "\uD835\uDCB9": "dscr", + "\uD835\uDC9F": "Dscr", + "\uD835\uDD07": "Dfr", + ⅅ: "DD", + "\uD835\uDD3B": "Dopf", + ď: "dcaron", + Ď: "Dcaron", + đ: "dstrok", + Đ: "Dstrok", + ð: "eth", + Ð: "ETH", + ⅇ: "ee", + ℯ: "escr", + "\uD835\uDD22": "efr", + "\uD835\uDD56": "eopf", + ℰ: "Escr", + "\uD835\uDD08": "Efr", + "\uD835\uDD3C": "Eopf", + é: "eacute", + É: "Eacute", + è: "egrave", + È: "Egrave", + ê: "ecirc", + Ê: "Ecirc", + ě: "ecaron", + Ě: "Ecaron", + ë: "euml", + Ë: "Euml", + ė: "edot", + Ė: "Edot", + ę: "eogon", + Ę: "Eogon", + ē: "emacr", + Ē: "Emacr", + "\uD835\uDD23": "ffr", + "\uD835\uDD57": "fopf", + "\uD835\uDCBB": "fscr", + "\uD835\uDD09": "Ffr", + "\uD835\uDD3D": "Fopf", + ℱ: "Fscr", + ff: "fflig", + ffi: "ffilig", + ffl: "ffllig", + fi: "filig", + fj: "fjlig", + fl: "fllig", + ƒ: "fnof", + ℊ: "gscr", + "\uD835\uDD58": "gopf", + "\uD835\uDD24": "gfr", + "\uD835\uDCA2": "Gscr", + "\uD835\uDD3E": "Gopf", + "\uD835\uDD0A": "Gfr", + ǵ: "gacute", + ğ: "gbreve", + Ğ: "Gbreve", + ĝ: "gcirc", + Ĝ: "Gcirc", + ġ: "gdot", + Ġ: "Gdot", + Ģ: "Gcedil", + "\uD835\uDD25": "hfr", + ℎ: "planckh", + "\uD835\uDCBD": "hscr", + "\uD835\uDD59": "hopf", + ℋ: "Hscr", + ℌ: "Hfr", + ℍ: "Hopf", + ĥ: "hcirc", + Ĥ: "Hcirc", + ℏ: "hbar", + ħ: "hstrok", + Ħ: "Hstrok", + "\uD835\uDD5A": "iopf", + "\uD835\uDD26": "ifr", + "\uD835\uDCBE": "iscr", + ⅈ: "ii", + "\uD835\uDD40": "Iopf", + ℐ: "Iscr", + ℑ: "Im", + í: "iacute", + Í: "Iacute", + ì: "igrave", + Ì: "Igrave", + î: "icirc", + Î: "Icirc", + ï: "iuml", + Ï: "Iuml", + ĩ: "itilde", + Ĩ: "Itilde", + İ: "Idot", + į: "iogon", + Į: "Iogon", + ī: "imacr", + Ī: "Imacr", + ij: "ijlig", + IJ: "IJlig", + ı: "imath", + "\uD835\uDCBF": "jscr", + "\uD835\uDD5B": "jopf", + "\uD835\uDD27": "jfr", + "\uD835\uDCA5": "Jscr", + "\uD835\uDD0D": "Jfr", + "\uD835\uDD41": "Jopf", + ĵ: "jcirc", + Ĵ: "Jcirc", + ȷ: "jmath", + "\uD835\uDD5C": "kopf", + "\uD835\uDCC0": "kscr", + "\uD835\uDD28": "kfr", + "\uD835\uDCA6": "Kscr", + "\uD835\uDD42": "Kopf", + "\uD835\uDD0E": "Kfr", + ķ: "kcedil", + Ķ: "Kcedil", + "\uD835\uDD29": "lfr", + "\uD835\uDCC1": "lscr", + ℓ: "ell", + "\uD835\uDD5D": "lopf", + ℒ: "Lscr", + "\uD835\uDD0F": "Lfr", + "\uD835\uDD43": "Lopf", + ĺ: "lacute", + Ĺ: "Lacute", + ľ: "lcaron", + Ľ: "Lcaron", + ļ: "lcedil", + Ļ: "Lcedil", + ł: "lstrok", + Ł: "Lstrok", + ŀ: "lmidot", + Ŀ: "Lmidot", + "\uD835\uDD2A": "mfr", + "\uD835\uDD5E": "mopf", + "\uD835\uDCC2": "mscr", + "\uD835\uDD10": "Mfr", + "\uD835\uDD44": "Mopf", + ℳ: "Mscr", + "\uD835\uDD2B": "nfr", + "\uD835\uDD5F": "nopf", + "\uD835\uDCC3": "nscr", + ℕ: "Nopf", + "\uD835\uDCA9": "Nscr", + "\uD835\uDD11": "Nfr", + ń: "nacute", + Ń: "Nacute", + ň: "ncaron", + Ň: "Ncaron", + ñ: "ntilde", + Ñ: "Ntilde", + ņ: "ncedil", + Ņ: "Ncedil", + "\u2116": "numero", + ŋ: "eng", + Ŋ: "ENG", + "\uD835\uDD60": "oopf", + "\uD835\uDD2C": "ofr", + ℴ: "oscr", + "\uD835\uDCAA": "Oscr", + "\uD835\uDD12": "Ofr", + "\uD835\uDD46": "Oopf", + º: "ordm", + ó: "oacute", + Ó: "Oacute", + ò: "ograve", + Ò: "Ograve", + ô: "ocirc", + Ô: "Ocirc", + ö: "ouml", + Ö: "Ouml", + ő: "odblac", + Ő: "Odblac", + õ: "otilde", + Õ: "Otilde", + ø: "oslash", + Ø: "Oslash", + ō: "omacr", + Ō: "Omacr", + œ: "oelig", + Œ: "OElig", + "\uD835\uDD2D": "pfr", + "\uD835\uDCC5": "pscr", + "\uD835\uDD61": "popf", + ℙ: "Popf", + "\uD835\uDD13": "Pfr", + "\uD835\uDCAB": "Pscr", + "\uD835\uDD62": "qopf", + "\uD835\uDD2E": "qfr", + "\uD835\uDCC6": "qscr", + "\uD835\uDCAC": "Qscr", + "\uD835\uDD14": "Qfr", + ℚ: "Qopf", + ĸ: "kgreen", + "\uD835\uDD2F": "rfr", + "\uD835\uDD63": "ropf", + "\uD835\uDCC7": "rscr", + ℛ: "Rscr", + ℜ: "Re", + ℝ: "Ropf", + ŕ: "racute", + Ŕ: "Racute", + ř: "rcaron", + Ř: "Rcaron", + ŗ: "rcedil", + Ŗ: "Rcedil", + "\uD835\uDD64": "sopf", + "\uD835\uDCC8": "sscr", + "\uD835\uDD30": "sfr", + "\uD835\uDD4A": "Sopf", + "\uD835\uDD16": "Sfr", + "\uD835\uDCAE": "Sscr", + "\u24C8": "oS", + ś: "sacute", + Ś: "Sacute", + ŝ: "scirc", + Ŝ: "Scirc", + š: "scaron", + Š: "Scaron", + ş: "scedil", + Ş: "Scedil", + ß: "szlig", + "\uD835\uDD31": "tfr", + "\uD835\uDCC9": "tscr", + "\uD835\uDD65": "topf", + "\uD835\uDCAF": "Tscr", + "\uD835\uDD17": "Tfr", + "\uD835\uDD4B": "Topf", + ť: "tcaron", + Ť: "Tcaron", + ţ: "tcedil", + Ţ: "Tcedil", + "\u2122": "trade", + ŧ: "tstrok", + Ŧ: "Tstrok", + "\uD835\uDCCA": "uscr", + "\uD835\uDD66": "uopf", + "\uD835\uDD32": "ufr", + "\uD835\uDD4C": "Uopf", + "\uD835\uDD18": "Ufr", + "\uD835\uDCB0": "Uscr", + ú: "uacute", + Ú: "Uacute", + ù: "ugrave", + Ù: "Ugrave", + ŭ: "ubreve", + Ŭ: "Ubreve", + û: "ucirc", + Û: "Ucirc", + ů: "uring", + Ů: "Uring", + ü: "uuml", + Ü: "Uuml", + ű: "udblac", + Ű: "Udblac", + ũ: "utilde", + Ũ: "Utilde", + ų: "uogon", + Ų: "Uogon", + ū: "umacr", + Ū: "Umacr", + "\uD835\uDD33": "vfr", + "\uD835\uDD67": "vopf", + "\uD835\uDCCB": "vscr", + "\uD835\uDD19": "Vfr", + "\uD835\uDD4D": "Vopf", + "\uD835\uDCB1": "Vscr", + "\uD835\uDD68": "wopf", + "\uD835\uDCCC": "wscr", + "\uD835\uDD34": "wfr", + "\uD835\uDCB2": "Wscr", + "\uD835\uDD4E": "Wopf", + "\uD835\uDD1A": "Wfr", + ŵ: "wcirc", + Ŵ: "Wcirc", + "\uD835\uDD35": "xfr", + "\uD835\uDCCD": "xscr", + "\uD835\uDD69": "xopf", + "\uD835\uDD4F": "Xopf", + "\uD835\uDD1B": "Xfr", + "\uD835\uDCB3": "Xscr", + "\uD835\uDD36": "yfr", + "\uD835\uDCCE": "yscr", + "\uD835\uDD6A": "yopf", + "\uD835\uDCB4": "Yscr", + "\uD835\uDD1C": "Yfr", + "\uD835\uDD50": "Yopf", + ý: "yacute", + Ý: "Yacute", + ŷ: "ycirc", + Ŷ: "Ycirc", + ÿ: "yuml", + Ÿ: "Yuml", + "\uD835\uDCCF": "zscr", + "\uD835\uDD37": "zfr", + "\uD835\uDD6B": "zopf", + ℨ: "Zfr", + ℤ: "Zopf", + "\uD835\uDCB5": "Zscr", + ź: "zacute", + Ź: "Zacute", + ž: "zcaron", + Ž: "Zcaron", + ż: "zdot", + Ż: "Zdot", + Ƶ: "imped", + þ: "thorn", + Þ: "THORN", + ʼn: "napos", + α: "alpha", + Α: "Alpha", + β: "beta", + Β: "Beta", + γ: "gamma", + Γ: "Gamma", + δ: "delta", + Δ: "Delta", + ε: "epsi", + ϵ: "epsiv", + Ε: "Epsilon", + ϝ: "gammad", + Ϝ: "Gammad", + ζ: "zeta", + Ζ: "Zeta", + η: "eta", + Η: "Eta", + θ: "theta", + ϑ: "thetav", + Θ: "Theta", + ι: "iota", + Ι: "Iota", + κ: "kappa", + ϰ: "kappav", + Κ: "Kappa", + λ: "lambda", + Λ: "Lambda", + μ: "mu", + µ: "micro", + Μ: "Mu", + ν: "nu", + Ν: "Nu", + ξ: "xi", + Ξ: "Xi", + ο: "omicron", + Ο: "Omicron", + π: "pi", + ϖ: "piv", + Π: "Pi", + ρ: "rho", + ϱ: "rhov", + Ρ: "Rho", + σ: "sigma", + Σ: "Sigma", + ς: "sigmaf", + τ: "tau", + Τ: "Tau", + υ: "upsi", + Υ: "Upsilon", + ϒ: "Upsi", + φ: "phi", + ϕ: "phiv", + Φ: "Phi", + χ: "chi", + Χ: "Chi", + ψ: "psi", + Ψ: "Psi", + ω: "omega", + Ω: "ohm", + а: "acy", + А: "Acy", + б: "bcy", + Б: "Bcy", + в: "vcy", + В: "Vcy", + г: "gcy", + Г: "Gcy", + ѓ: "gjcy", + Ѓ: "GJcy", + д: "dcy", + Д: "Dcy", + ђ: "djcy", + Ђ: "DJcy", + е: "iecy", + Е: "IEcy", + ё: "iocy", + Ё: "IOcy", + є: "jukcy", + Є: "Jukcy", + ж: "zhcy", + Ж: "ZHcy", + з: "zcy", + З: "Zcy", + ѕ: "dscy", + Ѕ: "DScy", + и: "icy", + И: "Icy", + і: "iukcy", + І: "Iukcy", + ї: "yicy", + Ї: "YIcy", + й: "jcy", + Й: "Jcy", + ј: "jsercy", + Ј: "Jsercy", + к: "kcy", + К: "Kcy", + ќ: "kjcy", + Ќ: "KJcy", + л: "lcy", + Л: "Lcy", + љ: "ljcy", + Љ: "LJcy", + м: "mcy", + М: "Mcy", + н: "ncy", + Н: "Ncy", + њ: "njcy", + Њ: "NJcy", + о: "ocy", + О: "Ocy", + п: "pcy", + П: "Pcy", + р: "rcy", + Р: "Rcy", + с: "scy", + С: "Scy", + т: "tcy", + Т: "Tcy", + ћ: "tshcy", + Ћ: "TSHcy", + у: "ucy", + У: "Ucy", + ў: "ubrcy", + Ў: "Ubrcy", + ф: "fcy", + Ф: "Fcy", + х: "khcy", + Х: "KHcy", + ц: "tscy", + Ц: "TScy", + ч: "chcy", + Ч: "CHcy", + џ: "dzcy", + Џ: "DZcy", + ш: "shcy", + Ш: "SHcy", + щ: "shchcy", + Щ: "SHCHcy", + ъ: "hardcy", + Ъ: "HARDcy", + ы: "ycy", + Ы: "Ycy", + ь: "softcy", + Ь: "SOFTcy", + э: "ecy", + Э: "Ecy", + ю: "yucy", + Ю: "YUcy", + я: "yacy", + Я: "YAcy", + ℵ: "aleph", + ℶ: "beth", + ℷ: "gimel", + ℸ: "daleth" + }; + + var regexEscape = /["&'<>`]/g; + var escapeMap = { + '"': """, + "&": "&", + "'": "'", + "<": "<", + // See https://mathiasbynens.be/notes/ambiguous-ampersands: in HTML, the + // following is not strictly necessary unless it’s part of a tag or an + // unquoted attribute value. We’re only escaping it to support those + // situations, and for XML support. + ">": ">", + // In Internet Explorer ≤ 8, the backtick character can be used + // to break out of (un)quoted attribute values or HTML comments. + // See http://html5sec.org/#102, http://html5sec.org/#108, and + // http://html5sec.org/#133. + "`": "`" + }; + + var regexInvalidEntity = /&#(?:[xX][^a-fA-F0-9]|[^0-9xX])/; + var regexInvalidRawCodePoint = /[\0-\x08\x0B\x0E-\x1F\x7F-\x9F\uFDD0-\uFDEF\uFFFE\uFFFF]|[\uD83F\uD87F\uD8BF\uD8FF\uD93F\uD97F\uD9BF\uD9FF\uDA3F\uDA7F\uDABF\uDAFF\uDB3F\uDB7F\uDBBF\uDBFF][\uDFFE\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/; + var regexDecode = /&(CounterClockwiseContourIntegral|DoubleLongLeftRightArrow|ClockwiseContourIntegral|NotNestedGreaterGreater|NotSquareSupersetEqual|DiacriticalDoubleAcute|NotRightTriangleEqual|NotSucceedsSlantEqual|NotPrecedesSlantEqual|CloseCurlyDoubleQuote|NegativeVeryThinSpace|DoubleContourIntegral|FilledVerySmallSquare|CapitalDifferentialD|OpenCurlyDoubleQuote|EmptyVerySmallSquare|NestedGreaterGreater|DoubleLongRightArrow|NotLeftTriangleEqual|NotGreaterSlantEqual|ReverseUpEquilibrium|DoubleLeftRightArrow|NotSquareSubsetEqual|NotDoubleVerticalBar|RightArrowLeftArrow|NotGreaterFullEqual|NotRightTriangleBar|SquareSupersetEqual|DownLeftRightVector|DoubleLongLeftArrow|leftrightsquigarrow|LeftArrowRightArrow|NegativeMediumSpace|blacktriangleright|RightDownVectorBar|PrecedesSlantEqual|RightDoubleBracket|SucceedsSlantEqual|NotLeftTriangleBar|RightTriangleEqual|SquareIntersection|RightDownTeeVector|ReverseEquilibrium|NegativeThickSpace|longleftrightarrow|Longleftrightarrow|LongLeftRightArrow|DownRightTeeVector|DownRightVectorBar|GreaterSlantEqual|SquareSubsetEqual|LeftDownVectorBar|LeftDoubleBracket|VerticalSeparator|rightleftharpoons|NotGreaterGreater|NotSquareSuperset|blacktriangleleft|blacktriangledown|NegativeThinSpace|LeftDownTeeVector|NotLessSlantEqual|leftrightharpoons|DoubleUpDownArrow|DoubleVerticalBar|LeftTriangleEqual|FilledSmallSquare|twoheadrightarrow|NotNestedLessLess|DownLeftTeeVector|DownLeftVectorBar|RightAngleBracket|NotTildeFullEqual|NotReverseElement|RightUpDownVector|DiacriticalTilde|NotSucceedsTilde|circlearrowright|NotPrecedesEqual|rightharpoondown|DoubleRightArrow|NotSucceedsEqual|NonBreakingSpace|NotRightTriangle|LessEqualGreater|RightUpTeeVector|LeftAngleBracket|GreaterFullEqual|DownArrowUpArrow|RightUpVectorBar|twoheadleftarrow|GreaterEqualLess|downharpoonright|RightTriangleBar|ntrianglerighteq|NotSupersetEqual|LeftUpDownVector|DiacriticalAcute|rightrightarrows|vartriangleright|UpArrowDownArrow|DiacriticalGrave|UnderParenthesis|EmptySmallSquare|LeftUpVectorBar|leftrightarrows|DownRightVector|downharpoonleft|trianglerighteq|ShortRightArrow|OverParenthesis|DoubleLeftArrow|DoubleDownArrow|NotSquareSubset|bigtriangledown|ntrianglelefteq|UpperRightArrow|curvearrowright|vartriangleleft|NotLeftTriangle|nleftrightarrow|LowerRightArrow|NotHumpDownHump|NotGreaterTilde|rightthreetimes|LeftUpTeeVector|NotGreaterEqual|straightepsilon|LeftTriangleBar|rightsquigarrow|ContourIntegral|rightleftarrows|CloseCurlyQuote|RightDownVector|LeftRightVector|nLeftrightarrow|leftharpoondown|circlearrowleft|SquareSuperset|OpenCurlyQuote|hookrightarrow|HorizontalLine|DiacriticalDot|NotLessGreater|ntriangleright|DoubleRightTee|InvisibleComma|InvisibleTimes|LowerLeftArrow|DownLeftVector|NotSubsetEqual|curvearrowleft|trianglelefteq|NotVerticalBar|TildeFullEqual|downdownarrows|NotGreaterLess|RightTeeVector|ZeroWidthSpace|looparrowright|LongRightArrow|doublebarwedge|ShortLeftArrow|ShortDownArrow|RightVectorBar|GreaterGreater|ReverseElement|rightharpoonup|LessSlantEqual|leftthreetimes|upharpoonright|rightarrowtail|LeftDownVector|Longrightarrow|NestedLessLess|UpperLeftArrow|nshortparallel|leftleftarrows|leftrightarrow|Leftrightarrow|LeftRightArrow|longrightarrow|upharpoonleft|RightArrowBar|ApplyFunction|LeftTeeVector|leftarrowtail|NotEqualTilde|varsubsetneqq|varsupsetneqq|RightTeeArrow|SucceedsEqual|SucceedsTilde|LeftVectorBar|SupersetEqual|hookleftarrow|DifferentialD|VerticalTilde|VeryThinSpace|blacktriangle|bigtriangleup|LessFullEqual|divideontimes|leftharpoonup|UpEquilibrium|ntriangleleft|RightTriangle|measuredangle|shortparallel|longleftarrow|Longleftarrow|LongLeftArrow|DoubleLeftTee|Poincareplane|PrecedesEqual|triangleright|DoubleUpArrow|RightUpVector|fallingdotseq|looparrowleft|PrecedesTilde|NotTildeEqual|NotTildeTilde|smallsetminus|Proportional|triangleleft|triangledown|UnderBracket|NotHumpEqual|exponentiale|ExponentialE|NotLessTilde|HilbertSpace|RightCeiling|blacklozenge|varsupsetneq|HumpDownHump|GreaterEqual|VerticalLine|LeftTeeArrow|NotLessEqual|DownTeeArrow|LeftTriangle|varsubsetneq|Intersection|NotCongruent|DownArrowBar|LeftUpVector|LeftArrowBar|risingdotseq|GreaterTilde|RoundImplies|SquareSubset|ShortUpArrow|NotSuperset|quaternions|precnapprox|backepsilon|preccurlyeq|OverBracket|blacksquare|MediumSpace|VerticalBar|circledcirc|circleddash|CircleMinus|CircleTimes|LessGreater|curlyeqprec|curlyeqsucc|diamondsuit|UpDownArrow|Updownarrow|RuleDelayed|Rrightarrow|updownarrow|RightVector|nRightarrow|nrightarrow|eqslantless|LeftCeiling|Equilibrium|SmallCircle|expectation|NotSucceeds|thickapprox|GreaterLess|SquareUnion|NotPrecedes|NotLessLess|straightphi|succnapprox|succcurlyeq|SubsetEqual|sqsupseteq|Proportion|Laplacetrf|ImaginaryI|supsetneqq|NotGreater|gtreqqless|NotElement|ThickSpace|TildeEqual|TildeTilde|Fouriertrf|rmoustache|EqualTilde|eqslantgtr|UnderBrace|LeftVector|UpArrowBar|nLeftarrow|nsubseteqq|subsetneqq|nsupseteqq|nleftarrow|succapprox|lessapprox|UpTeeArrow|upuparrows|curlywedge|lesseqqgtr|varepsilon|varnothing|RightFloor|complement|CirclePlus|sqsubseteq|Lleftarrow|circledast|RightArrow|Rightarrow|rightarrow|lmoustache|Bernoullis|precapprox|mapstoleft|mapstodown|longmapsto|dotsquare|downarrow|DoubleDot|nsubseteq|supsetneq|leftarrow|nsupseteq|subsetneq|ThinSpace|ngeqslant|subseteqq|HumpEqual|NotSubset|triangleq|NotCupCap|lesseqgtr|heartsuit|TripleDot|Leftarrow|Coproduct|Congruent|varpropto|complexes|gvertneqq|LeftArrow|LessTilde|supseteqq|MinusPlus|CircleDot|nleqslant|NotExists|gtreqless|nparallel|UnionPlus|LeftFloor|checkmark|CenterDot|centerdot|Mellintrf|gtrapprox|bigotimes|OverBrace|spadesuit|therefore|pitchfork|rationals|PlusMinus|Backslash|Therefore|DownBreve|backsimeq|backprime|DownArrow|nshortmid|Downarrow|lvertneqq|eqvparsl|imagline|imagpart|infintie|integers|Integral|intercal|LessLess|Uarrocir|intlarhk|sqsupset|angmsdaf|sqsubset|llcorner|vartheta|cupbrcap|lnapprox|Superset|SuchThat|succnsim|succneqq|angmsdag|biguplus|curlyvee|trpezium|Succeeds|NotTilde|bigwedge|angmsdah|angrtvbd|triminus|cwconint|fpartint|lrcorner|smeparsl|subseteq|urcorner|lurdshar|laemptyv|DDotrahd|approxeq|ldrushar|awconint|mapstoup|backcong|shortmid|triangle|geqslant|gesdotol|timesbar|circledR|circledS|setminus|multimap|naturals|scpolint|ncongdot|RightTee|boxminus|gnapprox|boxtimes|andslope|thicksim|angmsdaa|varsigma|cirfnint|rtriltri|angmsdab|rppolint|angmsdac|barwedge|drbkarow|clubsuit|thetasym|bsolhsub|capbrcup|dzigrarr|doteqdot|DotEqual|dotminus|UnderBar|NotEqual|realpart|otimesas|ulcorner|hksearow|hkswarow|parallel|PartialD|elinters|emptyset|plusacir|bbrktbrk|angmsdad|pointint|bigoplus|angmsdae|Precedes|bigsqcup|varkappa|notindot|supseteq|precneqq|precnsim|profalar|profline|profsurf|leqslant|lesdotor|raemptyv|subplus|notnivb|notnivc|subrarr|zigrarr|vzigzag|submult|subedot|Element|between|cirscir|larrbfs|larrsim|lotimes|lbrksld|lbrkslu|lozenge|ldrdhar|dbkarow|bigcirc|epsilon|simrarr|simplus|ltquest|Epsilon|luruhar|gtquest|maltese|npolint|eqcolon|npreceq|bigodot|ddagger|gtrless|bnequiv|harrcir|ddotseq|equivDD|backsim|demptyv|nsqsube|nsqsupe|Upsilon|nsubset|upsilon|minusdu|nsucceq|swarrow|nsupset|coloneq|searrow|boxplus|napprox|natural|asympeq|alefsym|congdot|nearrow|bigstar|diamond|supplus|tritime|LeftTee|nvinfin|triplus|NewLine|nvltrie|nvrtrie|nwarrow|nexists|Diamond|ruluhar|Implies|supmult|angzarr|suplarr|suphsub|questeq|because|digamma|Because|olcross|bemptyv|omicron|Omicron|rotimes|NoBreak|intprod|angrtvb|orderof|uwangle|suphsol|lesdoto|orslope|DownTee|realine|cudarrl|rdldhar|OverBar|supedot|lessdot|supdsub|topfork|succsim|rbrkslu|rbrksld|pertenk|cudarrr|isindot|planckh|lessgtr|pluscir|gesdoto|plussim|plustwo|lesssim|cularrp|rarrsim|Cayleys|notinva|notinvb|notinvc|UpArrow|Uparrow|uparrow|NotLess|dwangle|precsim|Product|curarrm|Cconint|dotplus|rarrbfs|ccupssm|Cedilla|cemptyv|notniva|quatint|frac35|frac38|frac45|frac56|frac58|frac78|tridot|xoplus|gacute|gammad|Gammad|lfisht|lfloor|bigcup|sqsupe|gbreve|Gbreve|lharul|sqsube|sqcups|Gcedil|apacir|llhard|lmidot|Lmidot|lmoust|andand|sqcaps|approx|Abreve|spades|circeq|tprime|divide|topcir|Assign|topbot|gesdot|divonx|xuplus|timesd|gesles|atilde|solbar|SOFTcy|loplus|timesb|lowast|lowbar|dlcorn|dlcrop|softcy|dollar|lparlt|thksim|lrhard|Atilde|lsaquo|smashp|bigvee|thinsp|wreath|bkarow|lsquor|lstrok|Lstrok|lthree|ltimes|ltlarr|DotDot|simdot|ltrPar|weierp|xsqcup|angmsd|sigmav|sigmaf|zeetrf|Zcaron|zcaron|mapsto|vsupne|thetav|cirmid|marker|mcomma|Zacute|vsubnE|there4|gtlPar|vsubne|bottom|gtrarr|SHCHcy|shchcy|midast|midcir|middot|minusb|minusd|gtrdot|bowtie|sfrown|mnplus|models|colone|seswar|Colone|mstpos|searhk|gtrsim|nacute|Nacute|boxbox|telrec|hairsp|Tcedil|nbumpe|scnsim|ncaron|Ncaron|ncedil|Ncedil|hamilt|Scedil|nearhk|hardcy|HARDcy|tcedil|Tcaron|commat|nequiv|nesear|tcaron|target|hearts|nexist|varrho|scedil|Scaron|scaron|hellip|Sacute|sacute|hercon|swnwar|compfn|rtimes|rthree|rsquor|rsaquo|zacute|wedgeq|homtht|barvee|barwed|Barwed|rpargt|horbar|conint|swarhk|roplus|nltrie|hslash|hstrok|Hstrok|rmoust|Conint|bprime|hybull|hyphen|iacute|Iacute|supsup|supsub|supsim|varphi|coprod|brvbar|agrave|Supset|supset|igrave|Igrave|notinE|Agrave|iiiint|iinfin|copysr|wedbar|Verbar|vangrt|becaus|incare|verbar|inodot|bullet|drcorn|intcal|drcrop|cularr|vellip|Utilde|bumpeq|cupcap|dstrok|Dstrok|CupCap|cupcup|cupdot|eacute|Eacute|supdot|iquest|easter|ecaron|Ecaron|ecolon|isinsv|utilde|itilde|Itilde|curarr|succeq|Bumpeq|cacute|ulcrop|nparsl|Cacute|nprcue|egrave|Egrave|nrarrc|nrarrw|subsup|subsub|nrtrie|jsercy|nsccue|Jsercy|kappav|kcedil|Kcedil|subsim|ulcorn|nsimeq|egsdot|veebar|kgreen|capand|elsdot|Subset|subset|curren|aacute|lacute|Lacute|emptyv|ntilde|Ntilde|lagran|lambda|Lambda|capcap|Ugrave|langle|subdot|emsp13|numero|emsp14|nvdash|nvDash|nVdash|nVDash|ugrave|ufisht|nvHarr|larrfs|nvlArr|larrhk|larrlp|larrpl|nvrArr|Udblac|nwarhk|larrtl|nwnear|oacute|Oacute|latail|lAtail|sstarf|lbrace|odblac|Odblac|lbrack|udblac|odsold|eparsl|lcaron|Lcaron|ograve|Ograve|lcedil|Lcedil|Aacute|ssmile|ssetmn|squarf|ldquor|capcup|ominus|cylcty|rharul|eqcirc|dagger|rfloor|rfisht|Dagger|daleth|equals|origof|capdot|equest|dcaron|Dcaron|rdquor|oslash|Oslash|otilde|Otilde|otimes|Otimes|urcrop|Ubreve|ubreve|Yacute|Uacute|uacute|Rcedil|rcedil|urcorn|parsim|Rcaron|Vdashl|rcaron|Tstrok|percnt|period|permil|Exists|yacute|rbrack|rbrace|phmmat|ccaron|Ccaron|planck|ccedil|plankv|tstrok|female|plusdo|plusdu|ffilig|plusmn|ffllig|Ccedil|rAtail|dfisht|bernou|ratail|Rarrtl|rarrtl|angsph|rarrpl|rarrlp|rarrhk|xwedge|xotime|forall|ForAll|Vvdash|vsupnE|preceq|bigcap|frac12|frac13|frac14|primes|rarrfs|prnsim|frac15|Square|frac16|square|lesdot|frac18|frac23|propto|prurel|rarrap|rangle|puncsp|frac25|Racute|qprime|racute|lesges|frac34|abreve|AElig|eqsim|utdot|setmn|urtri|Equal|Uring|seArr|uring|searr|dashv|Dashv|mumap|nabla|iogon|Iogon|sdote|sdotb|scsim|napid|napos|equiv|natur|Acirc|dblac|erarr|nbump|iprod|erDot|ucirc|awint|esdot|angrt|ncong|isinE|scnap|Scirc|scirc|ndash|isins|Ubrcy|nearr|neArr|isinv|nedot|ubrcy|acute|Ycirc|iukcy|Iukcy|xutri|nesim|caret|jcirc|Jcirc|caron|twixt|ddarr|sccue|exist|jmath|sbquo|ngeqq|angst|ccaps|lceil|ngsim|UpTee|delta|Delta|rtrif|nharr|nhArr|nhpar|rtrie|jukcy|Jukcy|kappa|rsquo|Kappa|nlarr|nlArr|TSHcy|rrarr|aogon|Aogon|fflig|xrarr|tshcy|ccirc|nleqq|filig|upsih|nless|dharl|nlsim|fjlig|ropar|nltri|dharr|robrk|roarr|fllig|fltns|roang|rnmid|subnE|subne|lAarr|trisb|Ccirc|acirc|ccups|blank|VDash|forkv|Vdash|langd|cedil|blk12|blk14|laquo|strns|diams|notin|vDash|larrb|blk34|block|disin|uplus|vdash|vBarv|aelig|starf|Wedge|check|xrArr|lates|lbarr|lBarr|notni|lbbrk|bcong|frasl|lbrke|frown|vrtri|vprop|vnsup|gamma|Gamma|wedge|xodot|bdquo|srarr|doteq|ldquo|boxdl|boxdL|gcirc|Gcirc|boxDl|boxDL|boxdr|boxdR|boxDr|TRADE|trade|rlhar|boxDR|vnsub|npart|vltri|rlarr|boxhd|boxhD|nprec|gescc|nrarr|nrArr|boxHd|boxHD|boxhu|boxhU|nrtri|boxHu|clubs|boxHU|times|colon|Colon|gimel|xlArr|Tilde|nsime|tilde|nsmid|nspar|THORN|thorn|xlarr|nsube|nsubE|thkap|xhArr|comma|nsucc|boxul|boxuL|nsupe|nsupE|gneqq|gnsim|boxUl|boxUL|grave|boxur|boxuR|boxUr|boxUR|lescc|angle|bepsi|boxvh|varpi|boxvH|numsp|Theta|gsime|gsiml|theta|boxVh|boxVH|boxvl|gtcir|gtdot|boxvL|boxVl|boxVL|crarr|cross|Cross|nvsim|boxvr|nwarr|nwArr|sqsup|dtdot|Uogon|lhard|lharu|dtrif|ocirc|Ocirc|lhblk|duarr|odash|sqsub|Hacek|sqcup|llarr|duhar|oelig|OElig|ofcir|boxvR|uogon|lltri|boxVr|csube|uuarr|ohbar|csupe|ctdot|olarr|olcir|harrw|oline|sqcap|omacr|Omacr|omega|Omega|boxVR|aleph|lneqq|lnsim|loang|loarr|rharu|lobrk|hcirc|operp|oplus|rhard|Hcirc|orarr|Union|order|ecirc|Ecirc|cuepr|szlig|cuesc|breve|reals|eDDot|Breve|hoarr|lopar|utrif|rdquo|Umacr|umacr|efDot|swArr|ultri|alpha|rceil|ovbar|swarr|Wcirc|wcirc|smtes|smile|bsemi|lrarr|aring|parsl|lrhar|bsime|uhblk|lrtri|cupor|Aring|uharr|uharl|slarr|rbrke|bsolb|lsime|rbbrk|RBarr|lsimg|phone|rBarr|rbarr|icirc|lsquo|Icirc|emacr|Emacr|ratio|simne|plusb|simlE|simgE|simeq|pluse|ltcir|ltdot|empty|xharr|xdtri|iexcl|Alpha|ltrie|rarrw|pound|ltrif|xcirc|bumpe|prcue|bumpE|asymp|amacr|cuvee|Sigma|sigma|iiint|udhar|iiota|ijlig|IJlig|supnE|imacr|Imacr|prime|Prime|image|prnap|eogon|Eogon|rarrc|mdash|mDDot|cuwed|imath|supne|imped|Amacr|udarr|prsim|micro|rarrb|cwint|raquo|infin|eplus|range|rangd|Ucirc|radic|minus|amalg|veeeq|rAarr|epsiv|ycirc|quest|sharp|quot|zwnj|Qscr|race|qscr|Qopf|qopf|qint|rang|Rang|Zscr|zscr|Zopf|zopf|rarr|rArr|Rarr|Pscr|pscr|prop|prod|prnE|prec|ZHcy|zhcy|prap|Zeta|zeta|Popf|popf|Zdot|plus|zdot|Yuml|yuml|phiv|YUcy|yucy|Yscr|yscr|perp|Yopf|yopf|part|para|YIcy|Ouml|rcub|yicy|YAcy|rdca|ouml|osol|Oscr|rdsh|yacy|real|oscr|xvee|andd|rect|andv|Xscr|oror|ordm|ordf|xscr|ange|aopf|Aopf|rHar|Xopf|opar|Oopf|xopf|xnis|rhov|oopf|omid|xmap|oint|apid|apos|ogon|ascr|Ascr|odot|odiv|xcup|xcap|ocir|oast|nvlt|nvle|nvgt|nvge|nvap|Wscr|wscr|auml|ntlg|ntgl|nsup|nsub|nsim|Nscr|nscr|nsce|Wopf|ring|npre|wopf|npar|Auml|Barv|bbrk|Nopf|nopf|nmid|nLtv|beta|ropf|Ropf|Beta|beth|nles|rpar|nleq|bnot|bNot|nldr|NJcy|rscr|Rscr|Vscr|vscr|rsqb|njcy|bopf|nisd|Bopf|rtri|Vopf|nGtv|ngtr|vopf|boxh|boxH|boxv|nges|ngeq|boxV|bscr|scap|Bscr|bsim|Vert|vert|bsol|bull|bump|caps|cdot|ncup|scnE|ncap|nbsp|napE|Cdot|cent|sdot|Vbar|nang|vBar|chcy|Mscr|mscr|sect|semi|CHcy|Mopf|mopf|sext|circ|cire|mldr|mlcp|cirE|comp|shcy|SHcy|vArr|varr|cong|copf|Copf|copy|COPY|malt|male|macr|lvnE|cscr|ltri|sime|ltcc|simg|Cscr|siml|csub|Uuml|lsqb|lsim|uuml|csup|Lscr|lscr|utri|smid|lpar|cups|smte|lozf|darr|Lopf|Uscr|solb|lopf|sopf|Sopf|lneq|uscr|spar|dArr|lnap|Darr|dash|Sqrt|LJcy|ljcy|lHar|dHar|Upsi|upsi|diam|lesg|djcy|DJcy|leqq|dopf|Dopf|dscr|Dscr|dscy|ldsh|ldca|squf|DScy|sscr|Sscr|dsol|lcub|late|star|Star|Uopf|Larr|lArr|larr|uopf|dtri|dzcy|sube|subE|Lang|lang|Kscr|kscr|Kopf|kopf|KJcy|kjcy|KHcy|khcy|DZcy|ecir|edot|eDot|Jscr|jscr|succ|Jopf|jopf|Edot|uHar|emsp|ensp|Iuml|iuml|eopf|isin|Iscr|iscr|Eopf|epar|sung|epsi|escr|sup1|sup2|sup3|Iota|iota|supe|supE|Iopf|iopf|IOcy|iocy|Escr|esim|Esim|imof|Uarr|QUOT|uArr|uarr|euml|IEcy|iecy|Idot|Euml|euro|excl|Hscr|hscr|Hopf|hopf|TScy|tscy|Tscr|hbar|tscr|flat|tbrk|fnof|hArr|harr|half|fopf|Fopf|tdot|gvnE|fork|trie|gtcc|fscr|Fscr|gdot|gsim|Gscr|gscr|Gopf|gopf|gneq|Gdot|tosa|gnap|Topf|topf|geqq|toea|GJcy|gjcy|tint|gesl|mid|Sfr|ggg|top|ges|gla|glE|glj|geq|gne|gEl|gel|gnE|Gcy|gcy|gap|Tfr|tfr|Tcy|tcy|Hat|Tau|Ffr|tau|Tab|hfr|Hfr|ffr|Fcy|fcy|icy|Icy|iff|ETH|eth|ifr|Ifr|Eta|eta|int|Int|Sup|sup|ucy|Ucy|Sum|sum|jcy|ENG|ufr|Ufr|eng|Jcy|jfr|els|ell|egs|Efr|efr|Jfr|uml|kcy|Kcy|Ecy|ecy|kfr|Kfr|lap|Sub|sub|lat|lcy|Lcy|leg|Dot|dot|lEg|leq|les|squ|div|die|lfr|Lfr|lgE|Dfr|dfr|Del|deg|Dcy|dcy|lne|lnE|sol|loz|smt|Cup|lrm|cup|lsh|Lsh|sim|shy|map|Map|mcy|Mcy|mfr|Mfr|mho|gfr|Gfr|sfr|cir|Chi|chi|nap|Cfr|vcy|Vcy|cfr|Scy|scy|ncy|Ncy|vee|Vee|Cap|cap|nfr|scE|sce|Nfr|nge|ngE|nGg|vfr|Vfr|ngt|bot|nGt|nis|niv|Rsh|rsh|nle|nlE|bne|Bfr|bfr|nLl|nlt|nLt|Bcy|bcy|not|Not|rlm|wfr|Wfr|npr|nsc|num|ocy|ast|Ocy|ofr|xfr|Xfr|Ofr|ogt|ohm|apE|olt|Rho|ape|rho|Rfr|rfr|ord|REG|ang|reg|orv|And|and|AMP|Rcy|amp|Afr|ycy|Ycy|yen|yfr|Yfr|rcy|par|pcy|Pcy|pfr|Pfr|phi|Phi|afr|Acy|acy|zcy|Zcy|piv|acE|acd|zfr|Zfr|pre|prE|psi|Psi|qfr|Qfr|zwj|Or|ge|Gg|gt|gg|el|oS|lt|Lt|LT|Re|lg|gl|eg|ne|Im|it|le|DD|wp|wr|nu|Nu|dd|lE|Sc|sc|pi|Pi|ee|af|ll|Ll|rx|gE|xi|pm|Xi|ic|pr|Pr|in|ni|mp|mu|ac|Mu|or|ap|Gt|GT|ii);|&(Aacute|Agrave|Atilde|Ccedil|Eacute|Egrave|Iacute|Igrave|Ntilde|Oacute|Ograve|Oslash|Otilde|Uacute|Ugrave|Yacute|aacute|agrave|atilde|brvbar|ccedil|curren|divide|eacute|egrave|frac12|frac14|frac34|iacute|igrave|iquest|middot|ntilde|oacute|ograve|oslash|otilde|plusmn|uacute|ugrave|yacute|AElig|Acirc|Aring|Ecirc|Icirc|Ocirc|THORN|Ucirc|acirc|acute|aelig|aring|cedil|ecirc|icirc|iexcl|laquo|micro|ocirc|pound|raquo|szlig|thorn|times|ucirc|Auml|COPY|Euml|Iuml|Ouml|QUOT|Uuml|auml|cent|copy|euml|iuml|macr|nbsp|ordf|ordm|ouml|para|quot|sect|sup1|sup2|sup3|uuml|yuml|AMP|ETH|REG|amp|deg|eth|not|reg|shy|uml|yen|GT|LT|gt|lt)(?!;)([=a-zA-Z0-9]?)|&#([0-9]+)(;?)|&#[xX]([a-fA-F0-9]+)(;?)|&([0-9a-zA-Z]+)/g; + var decodeMap = { + aacute: "\xE1", + Aacute: "\xC1", + abreve: "\u0103", + Abreve: "\u0102", + ac: "\u223E", + acd: "\u223F", + acE: "\u223E\u0333", + acirc: "\xE2", + Acirc: "\xC2", + acute: "\xB4", + acy: "\u0430", + Acy: "\u0410", + aelig: "\xE6", + AElig: "\xC6", + af: "\u2061", + afr: "\uD835\uDD1E", + Afr: "\uD835\uDD04", + agrave: "\xE0", + Agrave: "\xC0", + alefsym: "\u2135", + aleph: "\u2135", + alpha: "\u03B1", + Alpha: "\u0391", + amacr: "\u0101", + Amacr: "\u0100", + amalg: "\u2A3F", + amp: "&", + AMP: "&", + and: "\u2227", + And: "\u2A53", + andand: "\u2A55", + andd: "\u2A5C", + andslope: "\u2A58", + andv: "\u2A5A", + ang: "\u2220", + ange: "\u29A4", + angle: "\u2220", + angmsd: "\u2221", + angmsdaa: "\u29A8", + angmsdab: "\u29A9", + angmsdac: "\u29AA", + angmsdad: "\u29AB", + angmsdae: "\u29AC", + angmsdaf: "\u29AD", + angmsdag: "\u29AE", + angmsdah: "\u29AF", + angrt: "\u221F", + angrtvb: "\u22BE", + angrtvbd: "\u299D", + angsph: "\u2222", + angst: "\xC5", + angzarr: "\u237C", + aogon: "\u0105", + Aogon: "\u0104", + aopf: "\uD835\uDD52", + Aopf: "\uD835\uDD38", + ap: "\u2248", + apacir: "\u2A6F", + ape: "\u224A", + apE: "\u2A70", + apid: "\u224B", + apos: "'", + ApplyFunction: "\u2061", + approx: "\u2248", + approxeq: "\u224A", + aring: "\xE5", + Aring: "\xC5", + ascr: "\uD835\uDCB6", + Ascr: "\uD835\uDC9C", + Assign: "\u2254", + ast: "*", + asymp: "\u2248", + asympeq: "\u224D", + atilde: "\xE3", + Atilde: "\xC3", + auml: "\xE4", + Auml: "\xC4", + awconint: "\u2233", + awint: "\u2A11", + backcong: "\u224C", + backepsilon: "\u03F6", + backprime: "\u2035", + backsim: "\u223D", + backsimeq: "\u22CD", + Backslash: "\u2216", + Barv: "\u2AE7", + barvee: "\u22BD", + barwed: "\u2305", + Barwed: "\u2306", + barwedge: "\u2305", + bbrk: "\u23B5", + bbrktbrk: "\u23B6", + bcong: "\u224C", + bcy: "\u0431", + Bcy: "\u0411", + bdquo: "\u201E", + becaus: "\u2235", + because: "\u2235", + Because: "\u2235", + bemptyv: "\u29B0", + bepsi: "\u03F6", + bernou: "\u212C", + Bernoullis: "\u212C", + beta: "\u03B2", + Beta: "\u0392", + beth: "\u2136", + between: "\u226C", + bfr: "\uD835\uDD1F", + Bfr: "\uD835\uDD05", + bigcap: "\u22C2", + bigcirc: "\u25EF", + bigcup: "\u22C3", + bigodot: "\u2A00", + bigoplus: "\u2A01", + bigotimes: "\u2A02", + bigsqcup: "\u2A06", + bigstar: "\u2605", + bigtriangledown: "\u25BD", + bigtriangleup: "\u25B3", + biguplus: "\u2A04", + bigvee: "\u22C1", + bigwedge: "\u22C0", + bkarow: "\u290D", + blacklozenge: "\u29EB", + blacksquare: "\u25AA", + blacktriangle: "\u25B4", + blacktriangledown: "\u25BE", + blacktriangleleft: "\u25C2", + blacktriangleright: "\u25B8", + blank: "\u2423", + blk12: "\u2592", + blk14: "\u2591", + blk34: "\u2593", + block: "\u2588", + bne: "=\u20E5", + bnequiv: "\u2261\u20E5", + bnot: "\u2310", + bNot: "\u2AED", + bopf: "\uD835\uDD53", + Bopf: "\uD835\uDD39", + bot: "\u22A5", + bottom: "\u22A5", + bowtie: "\u22C8", + boxbox: "\u29C9", + boxdl: "\u2510", + boxdL: "\u2555", + boxDl: "\u2556", + boxDL: "\u2557", + boxdr: "\u250C", + boxdR: "\u2552", + boxDr: "\u2553", + boxDR: "\u2554", + boxh: "\u2500", + boxH: "\u2550", + boxhd: "\u252C", + boxhD: "\u2565", + boxHd: "\u2564", + boxHD: "\u2566", + boxhu: "\u2534", + boxhU: "\u2568", + boxHu: "\u2567", + boxHU: "\u2569", + boxminus: "\u229F", + boxplus: "\u229E", + boxtimes: "\u22A0", + boxul: "\u2518", + boxuL: "\u255B", + boxUl: "\u255C", + boxUL: "\u255D", + boxur: "\u2514", + boxuR: "\u2558", + boxUr: "\u2559", + boxUR: "\u255A", + boxv: "\u2502", + boxV: "\u2551", + boxvh: "\u253C", + boxvH: "\u256A", + boxVh: "\u256B", + boxVH: "\u256C", + boxvl: "\u2524", + boxvL: "\u2561", + boxVl: "\u2562", + boxVL: "\u2563", + boxvr: "\u251C", + boxvR: "\u255E", + boxVr: "\u255F", + boxVR: "\u2560", + bprime: "\u2035", + breve: "\u02D8", + Breve: "\u02D8", + brvbar: "\xA6", + bscr: "\uD835\uDCB7", + Bscr: "\u212C", + bsemi: "\u204F", + bsim: "\u223D", + bsime: "\u22CD", + bsol: "\\", + bsolb: "\u29C5", + bsolhsub: "\u27C8", + bull: "\u2022", + bullet: "\u2022", + bump: "\u224E", + bumpe: "\u224F", + bumpE: "\u2AAE", + bumpeq: "\u224F", + Bumpeq: "\u224E", + cacute: "\u0107", + Cacute: "\u0106", + cap: "\u2229", + Cap: "\u22D2", + capand: "\u2A44", + capbrcup: "\u2A49", + capcap: "\u2A4B", + capcup: "\u2A47", + capdot: "\u2A40", + CapitalDifferentialD: "\u2145", + caps: "\u2229\uFE00", + caret: "\u2041", + caron: "\u02C7", + Cayleys: "\u212D", + ccaps: "\u2A4D", + ccaron: "\u010D", + Ccaron: "\u010C", + ccedil: "\xE7", + Ccedil: "\xC7", + ccirc: "\u0109", + Ccirc: "\u0108", + Cconint: "\u2230", + ccups: "\u2A4C", + ccupssm: "\u2A50", + cdot: "\u010B", + Cdot: "\u010A", + cedil: "\xB8", + Cedilla: "\xB8", + cemptyv: "\u29B2", + cent: "\xA2", + centerdot: "\xB7", + CenterDot: "\xB7", + cfr: "\uD835\uDD20", + Cfr: "\u212D", + chcy: "\u0447", + CHcy: "\u0427", + check: "\u2713", + checkmark: "\u2713", + chi: "\u03C7", + Chi: "\u03A7", + cir: "\u25CB", + circ: "\u02C6", + circeq: "\u2257", + circlearrowleft: "\u21BA", + circlearrowright: "\u21BB", + circledast: "\u229B", + circledcirc: "\u229A", + circleddash: "\u229D", + CircleDot: "\u2299", + circledR: "\xAE", + circledS: "\u24C8", + CircleMinus: "\u2296", + CirclePlus: "\u2295", + CircleTimes: "\u2297", + cire: "\u2257", + cirE: "\u29C3", + cirfnint: "\u2A10", + cirmid: "\u2AEF", + cirscir: "\u29C2", + ClockwiseContourIntegral: "\u2232", + CloseCurlyDoubleQuote: "\u201D", + CloseCurlyQuote: "\u2019", + clubs: "\u2663", + clubsuit: "\u2663", + colon: ":", + Colon: "\u2237", + colone: "\u2254", + Colone: "\u2A74", + coloneq: "\u2254", + comma: ",", + commat: "@", + comp: "\u2201", + compfn: "\u2218", + complement: "\u2201", + complexes: "\u2102", + cong: "\u2245", + congdot: "\u2A6D", + Congruent: "\u2261", + conint: "\u222E", + Conint: "\u222F", + ContourIntegral: "\u222E", + copf: "\uD835\uDD54", + Copf: "\u2102", + coprod: "\u2210", + Coproduct: "\u2210", + copy: "\xA9", + COPY: "\xA9", + copysr: "\u2117", + CounterClockwiseContourIntegral: "\u2233", + crarr: "\u21B5", + cross: "\u2717", + Cross: "\u2A2F", + cscr: "\uD835\uDCB8", + Cscr: "\uD835\uDC9E", + csub: "\u2ACF", + csube: "\u2AD1", + csup: "\u2AD0", + csupe: "\u2AD2", + ctdot: "\u22EF", + cudarrl: "\u2938", + cudarrr: "\u2935", + cuepr: "\u22DE", + cuesc: "\u22DF", + cularr: "\u21B6", + cularrp: "\u293D", + cup: "\u222A", + Cup: "\u22D3", + cupbrcap: "\u2A48", + cupcap: "\u2A46", + CupCap: "\u224D", + cupcup: "\u2A4A", + cupdot: "\u228D", + cupor: "\u2A45", + cups: "\u222A\uFE00", + curarr: "\u21B7", + curarrm: "\u293C", + curlyeqprec: "\u22DE", + curlyeqsucc: "\u22DF", + curlyvee: "\u22CE", + curlywedge: "\u22CF", + curren: "\xA4", + curvearrowleft: "\u21B6", + curvearrowright: "\u21B7", + cuvee: "\u22CE", + cuwed: "\u22CF", + cwconint: "\u2232", + cwint: "\u2231", + cylcty: "\u232D", + dagger: "\u2020", + Dagger: "\u2021", + daleth: "\u2138", + darr: "\u2193", + dArr: "\u21D3", + Darr: "\u21A1", + dash: "\u2010", + dashv: "\u22A3", + Dashv: "\u2AE4", + dbkarow: "\u290F", + dblac: "\u02DD", + dcaron: "\u010F", + Dcaron: "\u010E", + dcy: "\u0434", + Dcy: "\u0414", + dd: "\u2146", + DD: "\u2145", + ddagger: "\u2021", + ddarr: "\u21CA", + DDotrahd: "\u2911", + ddotseq: "\u2A77", + deg: "\xB0", + Del: "\u2207", + delta: "\u03B4", + Delta: "\u0394", + demptyv: "\u29B1", + dfisht: "\u297F", + dfr: "\uD835\uDD21", + Dfr: "\uD835\uDD07", + dHar: "\u2965", + dharl: "\u21C3", + dharr: "\u21C2", + DiacriticalAcute: "\xB4", + DiacriticalDot: "\u02D9", + DiacriticalDoubleAcute: "\u02DD", + DiacriticalGrave: "`", + DiacriticalTilde: "\u02DC", + diam: "\u22C4", + diamond: "\u22C4", + Diamond: "\u22C4", + diamondsuit: "\u2666", + diams: "\u2666", + die: "\xA8", + DifferentialD: "\u2146", + digamma: "\u03DD", + disin: "\u22F2", + div: "\xF7", + divide: "\xF7", + divideontimes: "\u22C7", + divonx: "\u22C7", + djcy: "\u0452", + DJcy: "\u0402", + dlcorn: "\u231E", + dlcrop: "\u230D", + dollar: "$", + dopf: "\uD835\uDD55", + Dopf: "\uD835\uDD3B", + dot: "\u02D9", + Dot: "\xA8", + DotDot: "\u20DC", + doteq: "\u2250", + doteqdot: "\u2251", + DotEqual: "\u2250", + dotminus: "\u2238", + dotplus: "\u2214", + dotsquare: "\u22A1", + doublebarwedge: "\u2306", + DoubleContourIntegral: "\u222F", + DoubleDot: "\xA8", + DoubleDownArrow: "\u21D3", + DoubleLeftArrow: "\u21D0", + DoubleLeftRightArrow: "\u21D4", + DoubleLeftTee: "\u2AE4", + DoubleLongLeftArrow: "\u27F8", + DoubleLongLeftRightArrow: "\u27FA", + DoubleLongRightArrow: "\u27F9", + DoubleRightArrow: "\u21D2", + DoubleRightTee: "\u22A8", + DoubleUpArrow: "\u21D1", + DoubleUpDownArrow: "\u21D5", + DoubleVerticalBar: "\u2225", + downarrow: "\u2193", + Downarrow: "\u21D3", + DownArrow: "\u2193", + DownArrowBar: "\u2913", + DownArrowUpArrow: "\u21F5", + DownBreve: "\u0311", + downdownarrows: "\u21CA", + downharpoonleft: "\u21C3", + downharpoonright: "\u21C2", + DownLeftRightVector: "\u2950", + DownLeftTeeVector: "\u295E", + DownLeftVector: "\u21BD", + DownLeftVectorBar: "\u2956", + DownRightTeeVector: "\u295F", + DownRightVector: "\u21C1", + DownRightVectorBar: "\u2957", + DownTee: "\u22A4", + DownTeeArrow: "\u21A7", + drbkarow: "\u2910", + drcorn: "\u231F", + drcrop: "\u230C", + dscr: "\uD835\uDCB9", + Dscr: "\uD835\uDC9F", + dscy: "\u0455", + DScy: "\u0405", + dsol: "\u29F6", + dstrok: "\u0111", + Dstrok: "\u0110", + dtdot: "\u22F1", + dtri: "\u25BF", + dtrif: "\u25BE", + duarr: "\u21F5", + duhar: "\u296F", + dwangle: "\u29A6", + dzcy: "\u045F", + DZcy: "\u040F", + dzigrarr: "\u27FF", + eacute: "\xE9", + Eacute: "\xC9", + easter: "\u2A6E", + ecaron: "\u011B", + Ecaron: "\u011A", + ecir: "\u2256", + ecirc: "\xEA", + Ecirc: "\xCA", + ecolon: "\u2255", + ecy: "\u044D", + Ecy: "\u042D", + eDDot: "\u2A77", + edot: "\u0117", + eDot: "\u2251", + Edot: "\u0116", + ee: "\u2147", + efDot: "\u2252", + efr: "\uD835\uDD22", + Efr: "\uD835\uDD08", + eg: "\u2A9A", + egrave: "\xE8", + Egrave: "\xC8", + egs: "\u2A96", + egsdot: "\u2A98", + el: "\u2A99", + Element: "\u2208", + elinters: "\u23E7", + ell: "\u2113", + els: "\u2A95", + elsdot: "\u2A97", + emacr: "\u0113", + Emacr: "\u0112", + empty: "\u2205", + emptyset: "\u2205", + EmptySmallSquare: "\u25FB", + emptyv: "\u2205", + EmptyVerySmallSquare: "\u25AB", + emsp: "\u2003", + emsp13: "\u2004", + emsp14: "\u2005", + eng: "\u014B", + ENG: "\u014A", + ensp: "\u2002", + eogon: "\u0119", + Eogon: "\u0118", + eopf: "\uD835\uDD56", + Eopf: "\uD835\uDD3C", + epar: "\u22D5", + eparsl: "\u29E3", + eplus: "\u2A71", + epsi: "\u03B5", + epsilon: "\u03B5", + Epsilon: "\u0395", + epsiv: "\u03F5", + eqcirc: "\u2256", + eqcolon: "\u2255", + eqsim: "\u2242", + eqslantgtr: "\u2A96", + eqslantless: "\u2A95", + Equal: "\u2A75", + equals: "=", + EqualTilde: "\u2242", + equest: "\u225F", + Equilibrium: "\u21CC", + equiv: "\u2261", + equivDD: "\u2A78", + eqvparsl: "\u29E5", + erarr: "\u2971", + erDot: "\u2253", + escr: "\u212F", + Escr: "\u2130", + esdot: "\u2250", + esim: "\u2242", + Esim: "\u2A73", + eta: "\u03B7", + Eta: "\u0397", + eth: "\xF0", + ETH: "\xD0", + euml: "\xEB", + Euml: "\xCB", + euro: "\u20AC", + excl: "!", + exist: "\u2203", + Exists: "\u2203", + expectation: "\u2130", + exponentiale: "\u2147", + ExponentialE: "\u2147", + fallingdotseq: "\u2252", + fcy: "\u0444", + Fcy: "\u0424", + female: "\u2640", + ffilig: "\uFB03", + fflig: "\uFB00", + ffllig: "\uFB04", + ffr: "\uD835\uDD23", + Ffr: "\uD835\uDD09", + filig: "\uFB01", + FilledSmallSquare: "\u25FC", + FilledVerySmallSquare: "\u25AA", + fjlig: "fj", + flat: "\u266D", + fllig: "\uFB02", + fltns: "\u25B1", + fnof: "\u0192", + fopf: "\uD835\uDD57", + Fopf: "\uD835\uDD3D", + forall: "\u2200", + ForAll: "\u2200", + fork: "\u22D4", + forkv: "\u2AD9", + Fouriertrf: "\u2131", + fpartint: "\u2A0D", + frac12: "\xBD", + frac13: "\u2153", + frac14: "\xBC", + frac15: "\u2155", + frac16: "\u2159", + frac18: "\u215B", + frac23: "\u2154", + frac25: "\u2156", + frac34: "\xBE", + frac35: "\u2157", + frac38: "\u215C", + frac45: "\u2158", + frac56: "\u215A", + frac58: "\u215D", + frac78: "\u215E", + frasl: "\u2044", + frown: "\u2322", + fscr: "\uD835\uDCBB", + Fscr: "\u2131", + gacute: "\u01F5", + gamma: "\u03B3", + Gamma: "\u0393", + gammad: "\u03DD", + Gammad: "\u03DC", + gap: "\u2A86", + gbreve: "\u011F", + Gbreve: "\u011E", + Gcedil: "\u0122", + gcirc: "\u011D", + Gcirc: "\u011C", + gcy: "\u0433", + Gcy: "\u0413", + gdot: "\u0121", + Gdot: "\u0120", + ge: "\u2265", + gE: "\u2267", + gel: "\u22DB", + gEl: "\u2A8C", + geq: "\u2265", + geqq: "\u2267", + geqslant: "\u2A7E", + ges: "\u2A7E", + gescc: "\u2AA9", + gesdot: "\u2A80", + gesdoto: "\u2A82", + gesdotol: "\u2A84", + gesl: "\u22DB\uFE00", + gesles: "\u2A94", + gfr: "\uD835\uDD24", + Gfr: "\uD835\uDD0A", + gg: "\u226B", + Gg: "\u22D9", + ggg: "\u22D9", + gimel: "\u2137", + gjcy: "\u0453", + GJcy: "\u0403", + gl: "\u2277", + gla: "\u2AA5", + glE: "\u2A92", + glj: "\u2AA4", + gnap: "\u2A8A", + gnapprox: "\u2A8A", + gne: "\u2A88", + gnE: "\u2269", + gneq: "\u2A88", + gneqq: "\u2269", + gnsim: "\u22E7", + gopf: "\uD835\uDD58", + Gopf: "\uD835\uDD3E", + grave: "`", + GreaterEqual: "\u2265", + GreaterEqualLess: "\u22DB", + GreaterFullEqual: "\u2267", + GreaterGreater: "\u2AA2", + GreaterLess: "\u2277", + GreaterSlantEqual: "\u2A7E", + GreaterTilde: "\u2273", + gscr: "\u210A", + Gscr: "\uD835\uDCA2", + gsim: "\u2273", + gsime: "\u2A8E", + gsiml: "\u2A90", + gt: ">", + Gt: "\u226B", + GT: ">", + gtcc: "\u2AA7", + gtcir: "\u2A7A", + gtdot: "\u22D7", + gtlPar: "\u2995", + gtquest: "\u2A7C", + gtrapprox: "\u2A86", + gtrarr: "\u2978", + gtrdot: "\u22D7", + gtreqless: "\u22DB", + gtreqqless: "\u2A8C", + gtrless: "\u2277", + gtrsim: "\u2273", + gvertneqq: "\u2269\uFE00", + gvnE: "\u2269\uFE00", + Hacek: "\u02C7", + hairsp: "\u200A", + half: "\xBD", + hamilt: "\u210B", + hardcy: "\u044A", + HARDcy: "\u042A", + harr: "\u2194", + hArr: "\u21D4", + harrcir: "\u2948", + harrw: "\u21AD", + Hat: "^", + hbar: "\u210F", + hcirc: "\u0125", + Hcirc: "\u0124", + hearts: "\u2665", + heartsuit: "\u2665", + hellip: "\u2026", + hercon: "\u22B9", + hfr: "\uD835\uDD25", + Hfr: "\u210C", + HilbertSpace: "\u210B", + hksearow: "\u2925", + hkswarow: "\u2926", + hoarr: "\u21FF", + homtht: "\u223B", + hookleftarrow: "\u21A9", + hookrightarrow: "\u21AA", + hopf: "\uD835\uDD59", + Hopf: "\u210D", + horbar: "\u2015", + HorizontalLine: "\u2500", + hscr: "\uD835\uDCBD", + Hscr: "\u210B", + hslash: "\u210F", + hstrok: "\u0127", + Hstrok: "\u0126", + HumpDownHump: "\u224E", + HumpEqual: "\u224F", + hybull: "\u2043", + hyphen: "\u2010", + iacute: "\xED", + Iacute: "\xCD", + ic: "\u2063", + icirc: "\xEE", + Icirc: "\xCE", + icy: "\u0438", + Icy: "\u0418", + Idot: "\u0130", + iecy: "\u0435", + IEcy: "\u0415", + iexcl: "\xA1", + iff: "\u21D4", + ifr: "\uD835\uDD26", + Ifr: "\u2111", + igrave: "\xEC", + Igrave: "\xCC", + ii: "\u2148", + iiiint: "\u2A0C", + iiint: "\u222D", + iinfin: "\u29DC", + iiota: "\u2129", + ijlig: "\u0133", + IJlig: "\u0132", + Im: "\u2111", + imacr: "\u012B", + Imacr: "\u012A", + image: "\u2111", + ImaginaryI: "\u2148", + imagline: "\u2110", + imagpart: "\u2111", + imath: "\u0131", + imof: "\u22B7", + imped: "\u01B5", + Implies: "\u21D2", + in: "\u2208", + incare: "\u2105", + infin: "\u221E", + infintie: "\u29DD", + inodot: "\u0131", + int: "\u222B", + Int: "\u222C", + intcal: "\u22BA", + integers: "\u2124", + Integral: "\u222B", + intercal: "\u22BA", + Intersection: "\u22C2", + intlarhk: "\u2A17", + intprod: "\u2A3C", + InvisibleComma: "\u2063", + InvisibleTimes: "\u2062", + iocy: "\u0451", + IOcy: "\u0401", + iogon: "\u012F", + Iogon: "\u012E", + iopf: "\uD835\uDD5A", + Iopf: "\uD835\uDD40", + iota: "\u03B9", + Iota: "\u0399", + iprod: "\u2A3C", + iquest: "\xBF", + iscr: "\uD835\uDCBE", + Iscr: "\u2110", + isin: "\u2208", + isindot: "\u22F5", + isinE: "\u22F9", + isins: "\u22F4", + isinsv: "\u22F3", + isinv: "\u2208", + it: "\u2062", + itilde: "\u0129", + Itilde: "\u0128", + iukcy: "\u0456", + Iukcy: "\u0406", + iuml: "\xEF", + Iuml: "\xCF", + jcirc: "\u0135", + Jcirc: "\u0134", + jcy: "\u0439", + Jcy: "\u0419", + jfr: "\uD835\uDD27", + Jfr: "\uD835\uDD0D", + jmath: "\u0237", + jopf: "\uD835\uDD5B", + Jopf: "\uD835\uDD41", + jscr: "\uD835\uDCBF", + Jscr: "\uD835\uDCA5", + jsercy: "\u0458", + Jsercy: "\u0408", + jukcy: "\u0454", + Jukcy: "\u0404", + kappa: "\u03BA", + Kappa: "\u039A", + kappav: "\u03F0", + kcedil: "\u0137", + Kcedil: "\u0136", + kcy: "\u043A", + Kcy: "\u041A", + kfr: "\uD835\uDD28", + Kfr: "\uD835\uDD0E", + kgreen: "\u0138", + khcy: "\u0445", + KHcy: "\u0425", + kjcy: "\u045C", + KJcy: "\u040C", + kopf: "\uD835\uDD5C", + Kopf: "\uD835\uDD42", + kscr: "\uD835\uDCC0", + Kscr: "\uD835\uDCA6", + lAarr: "\u21DA", + lacute: "\u013A", + Lacute: "\u0139", + laemptyv: "\u29B4", + lagran: "\u2112", + lambda: "\u03BB", + Lambda: "\u039B", + lang: "\u27E8", + Lang: "\u27EA", + langd: "\u2991", + langle: "\u27E8", + lap: "\u2A85", + Laplacetrf: "\u2112", + laquo: "\xAB", + larr: "\u2190", + lArr: "\u21D0", + Larr: "\u219E", + larrb: "\u21E4", + larrbfs: "\u291F", + larrfs: "\u291D", + larrhk: "\u21A9", + larrlp: "\u21AB", + larrpl: "\u2939", + larrsim: "\u2973", + larrtl: "\u21A2", + lat: "\u2AAB", + latail: "\u2919", + lAtail: "\u291B", + late: "\u2AAD", + lates: "\u2AAD\uFE00", + lbarr: "\u290C", + lBarr: "\u290E", + lbbrk: "\u2772", + lbrace: "{", + lbrack: "[", + lbrke: "\u298B", + lbrksld: "\u298F", + lbrkslu: "\u298D", + lcaron: "\u013E", + Lcaron: "\u013D", + lcedil: "\u013C", + Lcedil: "\u013B", + lceil: "\u2308", + lcub: "{", + lcy: "\u043B", + Lcy: "\u041B", + ldca: "\u2936", + ldquo: "\u201C", + ldquor: "\u201E", + ldrdhar: "\u2967", + ldrushar: "\u294B", + ldsh: "\u21B2", + le: "\u2264", + lE: "\u2266", + LeftAngleBracket: "\u27E8", + leftarrow: "\u2190", + Leftarrow: "\u21D0", + LeftArrow: "\u2190", + LeftArrowBar: "\u21E4", + LeftArrowRightArrow: "\u21C6", + leftarrowtail: "\u21A2", + LeftCeiling: "\u2308", + LeftDoubleBracket: "\u27E6", + LeftDownTeeVector: "\u2961", + LeftDownVector: "\u21C3", + LeftDownVectorBar: "\u2959", + LeftFloor: "\u230A", + leftharpoondown: "\u21BD", + leftharpoonup: "\u21BC", + leftleftarrows: "\u21C7", + leftrightarrow: "\u2194", + Leftrightarrow: "\u21D4", + LeftRightArrow: "\u2194", + leftrightarrows: "\u21C6", + leftrightharpoons: "\u21CB", + leftrightsquigarrow: "\u21AD", + LeftRightVector: "\u294E", + LeftTee: "\u22A3", + LeftTeeArrow: "\u21A4", + LeftTeeVector: "\u295A", + leftthreetimes: "\u22CB", + LeftTriangle: "\u22B2", + LeftTriangleBar: "\u29CF", + LeftTriangleEqual: "\u22B4", + LeftUpDownVector: "\u2951", + LeftUpTeeVector: "\u2960", + LeftUpVector: "\u21BF", + LeftUpVectorBar: "\u2958", + LeftVector: "\u21BC", + LeftVectorBar: "\u2952", + leg: "\u22DA", + lEg: "\u2A8B", + leq: "\u2264", + leqq: "\u2266", + leqslant: "\u2A7D", + les: "\u2A7D", + lescc: "\u2AA8", + lesdot: "\u2A7F", + lesdoto: "\u2A81", + lesdotor: "\u2A83", + lesg: "\u22DA\uFE00", + lesges: "\u2A93", + lessapprox: "\u2A85", + lessdot: "\u22D6", + lesseqgtr: "\u22DA", + lesseqqgtr: "\u2A8B", + LessEqualGreater: "\u22DA", + LessFullEqual: "\u2266", + LessGreater: "\u2276", + lessgtr: "\u2276", + LessLess: "\u2AA1", + lesssim: "\u2272", + LessSlantEqual: "\u2A7D", + LessTilde: "\u2272", + lfisht: "\u297C", + lfloor: "\u230A", + lfr: "\uD835\uDD29", + Lfr: "\uD835\uDD0F", + lg: "\u2276", + lgE: "\u2A91", + lHar: "\u2962", + lhard: "\u21BD", + lharu: "\u21BC", + lharul: "\u296A", + lhblk: "\u2584", + ljcy: "\u0459", + LJcy: "\u0409", + ll: "\u226A", + Ll: "\u22D8", + llarr: "\u21C7", + llcorner: "\u231E", + Lleftarrow: "\u21DA", + llhard: "\u296B", + lltri: "\u25FA", + lmidot: "\u0140", + Lmidot: "\u013F", + lmoust: "\u23B0", + lmoustache: "\u23B0", + lnap: "\u2A89", + lnapprox: "\u2A89", + lne: "\u2A87", + lnE: "\u2268", + lneq: "\u2A87", + lneqq: "\u2268", + lnsim: "\u22E6", + loang: "\u27EC", + loarr: "\u21FD", + lobrk: "\u27E6", + longleftarrow: "\u27F5", + Longleftarrow: "\u27F8", + LongLeftArrow: "\u27F5", + longleftrightarrow: "\u27F7", + Longleftrightarrow: "\u27FA", + LongLeftRightArrow: "\u27F7", + longmapsto: "\u27FC", + longrightarrow: "\u27F6", + Longrightarrow: "\u27F9", + LongRightArrow: "\u27F6", + looparrowleft: "\u21AB", + looparrowright: "\u21AC", + lopar: "\u2985", + lopf: "\uD835\uDD5D", + Lopf: "\uD835\uDD43", + loplus: "\u2A2D", + lotimes: "\u2A34", + lowast: "\u2217", + lowbar: "_", + LowerLeftArrow: "\u2199", + LowerRightArrow: "\u2198", + loz: "\u25CA", + lozenge: "\u25CA", + lozf: "\u29EB", + lpar: "(", + lparlt: "\u2993", + lrarr: "\u21C6", + lrcorner: "\u231F", + lrhar: "\u21CB", + lrhard: "\u296D", + lrm: "\u200E", + lrtri: "\u22BF", + lsaquo: "\u2039", + lscr: "\uD835\uDCC1", + Lscr: "\u2112", + lsh: "\u21B0", + Lsh: "\u21B0", + lsim: "\u2272", + lsime: "\u2A8D", + lsimg: "\u2A8F", + lsqb: "[", + lsquo: "\u2018", + lsquor: "\u201A", + lstrok: "\u0142", + Lstrok: "\u0141", + lt: "<", + Lt: "\u226A", + LT: "<", + ltcc: "\u2AA6", + ltcir: "\u2A79", + ltdot: "\u22D6", + lthree: "\u22CB", + ltimes: "\u22C9", + ltlarr: "\u2976", + ltquest: "\u2A7B", + ltri: "\u25C3", + ltrie: "\u22B4", + ltrif: "\u25C2", + ltrPar: "\u2996", + lurdshar: "\u294A", + luruhar: "\u2966", + lvertneqq: "\u2268\uFE00", + lvnE: "\u2268\uFE00", + macr: "\xAF", + male: "\u2642", + malt: "\u2720", + maltese: "\u2720", + map: "\u21A6", + Map: "\u2905", + mapsto: "\u21A6", + mapstodown: "\u21A7", + mapstoleft: "\u21A4", + mapstoup: "\u21A5", + marker: "\u25AE", + mcomma: "\u2A29", + mcy: "\u043C", + Mcy: "\u041C", + mdash: "\u2014", + mDDot: "\u223A", + measuredangle: "\u2221", + MediumSpace: "\u205F", + Mellintrf: "\u2133", + mfr: "\uD835\uDD2A", + Mfr: "\uD835\uDD10", + mho: "\u2127", + micro: "\xB5", + mid: "\u2223", + midast: "*", + midcir: "\u2AF0", + middot: "\xB7", + minus: "\u2212", + minusb: "\u229F", + minusd: "\u2238", + minusdu: "\u2A2A", + MinusPlus: "\u2213", + mlcp: "\u2ADB", + mldr: "\u2026", + mnplus: "\u2213", + models: "\u22A7", + mopf: "\uD835\uDD5E", + Mopf: "\uD835\uDD44", + mp: "\u2213", + mscr: "\uD835\uDCC2", + Mscr: "\u2133", + mstpos: "\u223E", + mu: "\u03BC", + Mu: "\u039C", + multimap: "\u22B8", + mumap: "\u22B8", + nabla: "\u2207", + nacute: "\u0144", + Nacute: "\u0143", + nang: "\u2220\u20D2", + nap: "\u2249", + napE: "\u2A70\u0338", + napid: "\u224B\u0338", + napos: "\u0149", + napprox: "\u2249", + natur: "\u266E", + natural: "\u266E", + naturals: "\u2115", + nbsp: "\xA0", + nbump: "\u224E\u0338", + nbumpe: "\u224F\u0338", + ncap: "\u2A43", + ncaron: "\u0148", + Ncaron: "\u0147", + ncedil: "\u0146", + Ncedil: "\u0145", + ncong: "\u2247", + ncongdot: "\u2A6D\u0338", + ncup: "\u2A42", + ncy: "\u043D", + Ncy: "\u041D", + ndash: "\u2013", + ne: "\u2260", + nearhk: "\u2924", + nearr: "\u2197", + neArr: "\u21D7", + nearrow: "\u2197", + nedot: "\u2250\u0338", + NegativeMediumSpace: "\u200B", + NegativeThickSpace: "\u200B", + NegativeThinSpace: "\u200B", + NegativeVeryThinSpace: "\u200B", + nequiv: "\u2262", + nesear: "\u2928", + nesim: "\u2242\u0338", + NestedGreaterGreater: "\u226B", + NestedLessLess: "\u226A", + NewLine: "\n", + nexist: "\u2204", + nexists: "\u2204", + nfr: "\uD835\uDD2B", + Nfr: "\uD835\uDD11", + nge: "\u2271", + ngE: "\u2267\u0338", + ngeq: "\u2271", + ngeqq: "\u2267\u0338", + ngeqslant: "\u2A7E\u0338", + nges: "\u2A7E\u0338", + nGg: "\u22D9\u0338", + ngsim: "\u2275", + ngt: "\u226F", + nGt: "\u226B\u20D2", + ngtr: "\u226F", + nGtv: "\u226B\u0338", + nharr: "\u21AE", + nhArr: "\u21CE", + nhpar: "\u2AF2", + ni: "\u220B", + nis: "\u22FC", + nisd: "\u22FA", + niv: "\u220B", + njcy: "\u045A", + NJcy: "\u040A", + nlarr: "\u219A", + nlArr: "\u21CD", + nldr: "\u2025", + nle: "\u2270", + nlE: "\u2266\u0338", + nleftarrow: "\u219A", + nLeftarrow: "\u21CD", + nleftrightarrow: "\u21AE", + nLeftrightarrow: "\u21CE", + nleq: "\u2270", + nleqq: "\u2266\u0338", + nleqslant: "\u2A7D\u0338", + nles: "\u2A7D\u0338", + nless: "\u226E", + nLl: "\u22D8\u0338", + nlsim: "\u2274", + nlt: "\u226E", + nLt: "\u226A\u20D2", + nltri: "\u22EA", + nltrie: "\u22EC", + nLtv: "\u226A\u0338", + nmid: "\u2224", + NoBreak: "\u2060", + NonBreakingSpace: "\xA0", + nopf: "\uD835\uDD5F", + Nopf: "\u2115", + not: "\xAC", + Not: "\u2AEC", + NotCongruent: "\u2262", + NotCupCap: "\u226D", + NotDoubleVerticalBar: "\u2226", + NotElement: "\u2209", + NotEqual: "\u2260", + NotEqualTilde: "\u2242\u0338", + NotExists: "\u2204", + NotGreater: "\u226F", + NotGreaterEqual: "\u2271", + NotGreaterFullEqual: "\u2267\u0338", + NotGreaterGreater: "\u226B\u0338", + NotGreaterLess: "\u2279", + NotGreaterSlantEqual: "\u2A7E\u0338", + NotGreaterTilde: "\u2275", + NotHumpDownHump: "\u224E\u0338", + NotHumpEqual: "\u224F\u0338", + notin: "\u2209", + notindot: "\u22F5\u0338", + notinE: "\u22F9\u0338", + notinva: "\u2209", + notinvb: "\u22F7", + notinvc: "\u22F6", + NotLeftTriangle: "\u22EA", + NotLeftTriangleBar: "\u29CF\u0338", + NotLeftTriangleEqual: "\u22EC", + NotLess: "\u226E", + NotLessEqual: "\u2270", + NotLessGreater: "\u2278", + NotLessLess: "\u226A\u0338", + NotLessSlantEqual: "\u2A7D\u0338", + NotLessTilde: "\u2274", + NotNestedGreaterGreater: "\u2AA2\u0338", + NotNestedLessLess: "\u2AA1\u0338", + notni: "\u220C", + notniva: "\u220C", + notnivb: "\u22FE", + notnivc: "\u22FD", + NotPrecedes: "\u2280", + NotPrecedesEqual: "\u2AAF\u0338", + NotPrecedesSlantEqual: "\u22E0", + NotReverseElement: "\u220C", + NotRightTriangle: "\u22EB", + NotRightTriangleBar: "\u29D0\u0338", + NotRightTriangleEqual: "\u22ED", + NotSquareSubset: "\u228F\u0338", + NotSquareSubsetEqual: "\u22E2", + NotSquareSuperset: "\u2290\u0338", + NotSquareSupersetEqual: "\u22E3", + NotSubset: "\u2282\u20D2", + NotSubsetEqual: "\u2288", + NotSucceeds: "\u2281", + NotSucceedsEqual: "\u2AB0\u0338", + NotSucceedsSlantEqual: "\u22E1", + NotSucceedsTilde: "\u227F\u0338", + NotSuperset: "\u2283\u20D2", + NotSupersetEqual: "\u2289", + NotTilde: "\u2241", + NotTildeEqual: "\u2244", + NotTildeFullEqual: "\u2247", + NotTildeTilde: "\u2249", + NotVerticalBar: "\u2224", + npar: "\u2226", + nparallel: "\u2226", + nparsl: "\u2AFD\u20E5", + npart: "\u2202\u0338", + npolint: "\u2A14", + npr: "\u2280", + nprcue: "\u22E0", + npre: "\u2AAF\u0338", + nprec: "\u2280", + npreceq: "\u2AAF\u0338", + nrarr: "\u219B", + nrArr: "\u21CF", + nrarrc: "\u2933\u0338", + nrarrw: "\u219D\u0338", + nrightarrow: "\u219B", + nRightarrow: "\u21CF", + nrtri: "\u22EB", + nrtrie: "\u22ED", + nsc: "\u2281", + nsccue: "\u22E1", + nsce: "\u2AB0\u0338", + nscr: "\uD835\uDCC3", + Nscr: "\uD835\uDCA9", + nshortmid: "\u2224", + nshortparallel: "\u2226", + nsim: "\u2241", + nsime: "\u2244", + nsimeq: "\u2244", + nsmid: "\u2224", + nspar: "\u2226", + nsqsube: "\u22E2", + nsqsupe: "\u22E3", + nsub: "\u2284", + nsube: "\u2288", + nsubE: "\u2AC5\u0338", + nsubset: "\u2282\u20D2", + nsubseteq: "\u2288", + nsubseteqq: "\u2AC5\u0338", + nsucc: "\u2281", + nsucceq: "\u2AB0\u0338", + nsup: "\u2285", + nsupe: "\u2289", + nsupE: "\u2AC6\u0338", + nsupset: "\u2283\u20D2", + nsupseteq: "\u2289", + nsupseteqq: "\u2AC6\u0338", + ntgl: "\u2279", + ntilde: "\xF1", + Ntilde: "\xD1", + ntlg: "\u2278", + ntriangleleft: "\u22EA", + ntrianglelefteq: "\u22EC", + ntriangleright: "\u22EB", + ntrianglerighteq: "\u22ED", + nu: "\u03BD", + Nu: "\u039D", + num: "#", + numero: "\u2116", + numsp: "\u2007", + nvap: "\u224D\u20D2", + nvdash: "\u22AC", + nvDash: "\u22AD", + nVdash: "\u22AE", + nVDash: "\u22AF", + nvge: "\u2265\u20D2", + nvgt: ">\u20D2", + nvHarr: "\u2904", + nvinfin: "\u29DE", + nvlArr: "\u2902", + nvle: "\u2264\u20D2", + nvlt: "<\u20D2", + nvltrie: "\u22B4\u20D2", + nvrArr: "\u2903", + nvrtrie: "\u22B5\u20D2", + nvsim: "\u223C\u20D2", + nwarhk: "\u2923", + nwarr: "\u2196", + nwArr: "\u21D6", + nwarrow: "\u2196", + nwnear: "\u2927", + oacute: "\xF3", + Oacute: "\xD3", + oast: "\u229B", + ocir: "\u229A", + ocirc: "\xF4", + Ocirc: "\xD4", + ocy: "\u043E", + Ocy: "\u041E", + odash: "\u229D", + odblac: "\u0151", + Odblac: "\u0150", + odiv: "\u2A38", + odot: "\u2299", + odsold: "\u29BC", + oelig: "\u0153", + OElig: "\u0152", + ofcir: "\u29BF", + ofr: "\uD835\uDD2C", + Ofr: "\uD835\uDD12", + ogon: "\u02DB", + ograve: "\xF2", + Ograve: "\xD2", + ogt: "\u29C1", + ohbar: "\u29B5", + ohm: "\u03A9", + oint: "\u222E", + olarr: "\u21BA", + olcir: "\u29BE", + olcross: "\u29BB", + oline: "\u203E", + olt: "\u29C0", + omacr: "\u014D", + Omacr: "\u014C", + omega: "\u03C9", + Omega: "\u03A9", + omicron: "\u03BF", + Omicron: "\u039F", + omid: "\u29B6", + ominus: "\u2296", + oopf: "\uD835\uDD60", + Oopf: "\uD835\uDD46", + opar: "\u29B7", + OpenCurlyDoubleQuote: "\u201C", + OpenCurlyQuote: "\u2018", + operp: "\u29B9", + oplus: "\u2295", + or: "\u2228", + Or: "\u2A54", + orarr: "\u21BB", + ord: "\u2A5D", + order: "\u2134", + orderof: "\u2134", + ordf: "\xAA", + ordm: "\xBA", + origof: "\u22B6", + oror: "\u2A56", + orslope: "\u2A57", + orv: "\u2A5B", + oS: "\u24C8", + oscr: "\u2134", + Oscr: "\uD835\uDCAA", + oslash: "\xF8", + Oslash: "\xD8", + osol: "\u2298", + otilde: "\xF5", + Otilde: "\xD5", + otimes: "\u2297", + Otimes: "\u2A37", + otimesas: "\u2A36", + ouml: "\xF6", + Ouml: "\xD6", + ovbar: "\u233D", + OverBar: "\u203E", + OverBrace: "\u23DE", + OverBracket: "\u23B4", + OverParenthesis: "\u23DC", + par: "\u2225", + para: "\xB6", + parallel: "\u2225", + parsim: "\u2AF3", + parsl: "\u2AFD", + part: "\u2202", + PartialD: "\u2202", + pcy: "\u043F", + Pcy: "\u041F", + percnt: "%", + period: ".", + permil: "\u2030", + perp: "\u22A5", + pertenk: "\u2031", + pfr: "\uD835\uDD2D", + Pfr: "\uD835\uDD13", + phi: "\u03C6", + Phi: "\u03A6", + phiv: "\u03D5", + phmmat: "\u2133", + phone: "\u260E", + pi: "\u03C0", + Pi: "\u03A0", + pitchfork: "\u22D4", + piv: "\u03D6", + planck: "\u210F", + planckh: "\u210E", + plankv: "\u210F", + plus: "+", + plusacir: "\u2A23", + plusb: "\u229E", + pluscir: "\u2A22", + plusdo: "\u2214", + plusdu: "\u2A25", + pluse: "\u2A72", + PlusMinus: "\xB1", + plusmn: "\xB1", + plussim: "\u2A26", + plustwo: "\u2A27", + pm: "\xB1", + Poincareplane: "\u210C", + pointint: "\u2A15", + popf: "\uD835\uDD61", + Popf: "\u2119", + pound: "\xA3", + pr: "\u227A", + Pr: "\u2ABB", + prap: "\u2AB7", + prcue: "\u227C", + pre: "\u2AAF", + prE: "\u2AB3", + prec: "\u227A", + precapprox: "\u2AB7", + preccurlyeq: "\u227C", + Precedes: "\u227A", + PrecedesEqual: "\u2AAF", + PrecedesSlantEqual: "\u227C", + PrecedesTilde: "\u227E", + preceq: "\u2AAF", + precnapprox: "\u2AB9", + precneqq: "\u2AB5", + precnsim: "\u22E8", + precsim: "\u227E", + prime: "\u2032", + Prime: "\u2033", + primes: "\u2119", + prnap: "\u2AB9", + prnE: "\u2AB5", + prnsim: "\u22E8", + prod: "\u220F", + Product: "\u220F", + profalar: "\u232E", + profline: "\u2312", + profsurf: "\u2313", + prop: "\u221D", + Proportion: "\u2237", + Proportional: "\u221D", + propto: "\u221D", + prsim: "\u227E", + prurel: "\u22B0", + pscr: "\uD835\uDCC5", + Pscr: "\uD835\uDCAB", + psi: "\u03C8", + Psi: "\u03A8", + puncsp: "\u2008", + qfr: "\uD835\uDD2E", + Qfr: "\uD835\uDD14", + qint: "\u2A0C", + qopf: "\uD835\uDD62", + Qopf: "\u211A", + qprime: "\u2057", + qscr: "\uD835\uDCC6", + Qscr: "\uD835\uDCAC", + quaternions: "\u210D", + quatint: "\u2A16", + quest: "?", + questeq: "\u225F", + quot: '"', + QUOT: '"', + rAarr: "\u21DB", + race: "\u223D\u0331", + racute: "\u0155", + Racute: "\u0154", + radic: "\u221A", + raemptyv: "\u29B3", + rang: "\u27E9", + Rang: "\u27EB", + rangd: "\u2992", + range: "\u29A5", + rangle: "\u27E9", + raquo: "\xBB", + rarr: "\u2192", + rArr: "\u21D2", + Rarr: "\u21A0", + rarrap: "\u2975", + rarrb: "\u21E5", + rarrbfs: "\u2920", + rarrc: "\u2933", + rarrfs: "\u291E", + rarrhk: "\u21AA", + rarrlp: "\u21AC", + rarrpl: "\u2945", + rarrsim: "\u2974", + rarrtl: "\u21A3", + Rarrtl: "\u2916", + rarrw: "\u219D", + ratail: "\u291A", + rAtail: "\u291C", + ratio: "\u2236", + rationals: "\u211A", + rbarr: "\u290D", + rBarr: "\u290F", + RBarr: "\u2910", + rbbrk: "\u2773", + rbrace: "}", + rbrack: "]", + rbrke: "\u298C", + rbrksld: "\u298E", + rbrkslu: "\u2990", + rcaron: "\u0159", + Rcaron: "\u0158", + rcedil: "\u0157", + Rcedil: "\u0156", + rceil: "\u2309", + rcub: "}", + rcy: "\u0440", + Rcy: "\u0420", + rdca: "\u2937", + rdldhar: "\u2969", + rdquo: "\u201D", + rdquor: "\u201D", + rdsh: "\u21B3", + Re: "\u211C", + real: "\u211C", + realine: "\u211B", + realpart: "\u211C", + reals: "\u211D", + rect: "\u25AD", + reg: "\xAE", + REG: "\xAE", + ReverseElement: "\u220B", + ReverseEquilibrium: "\u21CB", + ReverseUpEquilibrium: "\u296F", + rfisht: "\u297D", + rfloor: "\u230B", + rfr: "\uD835\uDD2F", + Rfr: "\u211C", + rHar: "\u2964", + rhard: "\u21C1", + rharu: "\u21C0", + rharul: "\u296C", + rho: "\u03C1", + Rho: "\u03A1", + rhov: "\u03F1", + RightAngleBracket: "\u27E9", + rightarrow: "\u2192", + Rightarrow: "\u21D2", + RightArrow: "\u2192", + RightArrowBar: "\u21E5", + RightArrowLeftArrow: "\u21C4", + rightarrowtail: "\u21A3", + RightCeiling: "\u2309", + RightDoubleBracket: "\u27E7", + RightDownTeeVector: "\u295D", + RightDownVector: "\u21C2", + RightDownVectorBar: "\u2955", + RightFloor: "\u230B", + rightharpoondown: "\u21C1", + rightharpoonup: "\u21C0", + rightleftarrows: "\u21C4", + rightleftharpoons: "\u21CC", + rightrightarrows: "\u21C9", + rightsquigarrow: "\u219D", + RightTee: "\u22A2", + RightTeeArrow: "\u21A6", + RightTeeVector: "\u295B", + rightthreetimes: "\u22CC", + RightTriangle: "\u22B3", + RightTriangleBar: "\u29D0", + RightTriangleEqual: "\u22B5", + RightUpDownVector: "\u294F", + RightUpTeeVector: "\u295C", + RightUpVector: "\u21BE", + RightUpVectorBar: "\u2954", + RightVector: "\u21C0", + RightVectorBar: "\u2953", + ring: "\u02DA", + risingdotseq: "\u2253", + rlarr: "\u21C4", + rlhar: "\u21CC", + rlm: "\u200F", + rmoust: "\u23B1", + rmoustache: "\u23B1", + rnmid: "\u2AEE", + roang: "\u27ED", + roarr: "\u21FE", + robrk: "\u27E7", + ropar: "\u2986", + ropf: "\uD835\uDD63", + Ropf: "\u211D", + roplus: "\u2A2E", + rotimes: "\u2A35", + RoundImplies: "\u2970", + rpar: ")", + rpargt: "\u2994", + rppolint: "\u2A12", + rrarr: "\u21C9", + Rrightarrow: "\u21DB", + rsaquo: "\u203A", + rscr: "\uD835\uDCC7", + Rscr: "\u211B", + rsh: "\u21B1", + Rsh: "\u21B1", + rsqb: "]", + rsquo: "\u2019", + rsquor: "\u2019", + rthree: "\u22CC", + rtimes: "\u22CA", + rtri: "\u25B9", + rtrie: "\u22B5", + rtrif: "\u25B8", + rtriltri: "\u29CE", + RuleDelayed: "\u29F4", + ruluhar: "\u2968", + rx: "\u211E", + sacute: "\u015B", + Sacute: "\u015A", + sbquo: "\u201A", + sc: "\u227B", + Sc: "\u2ABC", + scap: "\u2AB8", + scaron: "\u0161", + Scaron: "\u0160", + sccue: "\u227D", + sce: "\u2AB0", + scE: "\u2AB4", + scedil: "\u015F", + Scedil: "\u015E", + scirc: "\u015D", + Scirc: "\u015C", + scnap: "\u2ABA", + scnE: "\u2AB6", + scnsim: "\u22E9", + scpolint: "\u2A13", + scsim: "\u227F", + scy: "\u0441", + Scy: "\u0421", + sdot: "\u22C5", + sdotb: "\u22A1", + sdote: "\u2A66", + searhk: "\u2925", + searr: "\u2198", + seArr: "\u21D8", + searrow: "\u2198", + sect: "\xA7", + semi: ";", + seswar: "\u2929", + setminus: "\u2216", + setmn: "\u2216", + sext: "\u2736", + sfr: "\uD835\uDD30", + Sfr: "\uD835\uDD16", + sfrown: "\u2322", + sharp: "\u266F", + shchcy: "\u0449", + SHCHcy: "\u0429", + shcy: "\u0448", + SHcy: "\u0428", + ShortDownArrow: "\u2193", + ShortLeftArrow: "\u2190", + shortmid: "\u2223", + shortparallel: "\u2225", + ShortRightArrow: "\u2192", + ShortUpArrow: "\u2191", + shy: "\xAD", + sigma: "\u03C3", + Sigma: "\u03A3", + sigmaf: "\u03C2", + sigmav: "\u03C2", + sim: "\u223C", + simdot: "\u2A6A", + sime: "\u2243", + simeq: "\u2243", + simg: "\u2A9E", + simgE: "\u2AA0", + siml: "\u2A9D", + simlE: "\u2A9F", + simne: "\u2246", + simplus: "\u2A24", + simrarr: "\u2972", + slarr: "\u2190", + SmallCircle: "\u2218", + smallsetminus: "\u2216", + smashp: "\u2A33", + smeparsl: "\u29E4", + smid: "\u2223", + smile: "\u2323", + smt: "\u2AAA", + smte: "\u2AAC", + smtes: "\u2AAC\uFE00", + softcy: "\u044C", + SOFTcy: "\u042C", + sol: "/", + solb: "\u29C4", + solbar: "\u233F", + sopf: "\uD835\uDD64", + Sopf: "\uD835\uDD4A", + spades: "\u2660", + spadesuit: "\u2660", + spar: "\u2225", + sqcap: "\u2293", + sqcaps: "\u2293\uFE00", + sqcup: "\u2294", + sqcups: "\u2294\uFE00", + Sqrt: "\u221A", + sqsub: "\u228F", + sqsube: "\u2291", + sqsubset: "\u228F", + sqsubseteq: "\u2291", + sqsup: "\u2290", + sqsupe: "\u2292", + sqsupset: "\u2290", + sqsupseteq: "\u2292", + squ: "\u25A1", + square: "\u25A1", + Square: "\u25A1", + SquareIntersection: "\u2293", + SquareSubset: "\u228F", + SquareSubsetEqual: "\u2291", + SquareSuperset: "\u2290", + SquareSupersetEqual: "\u2292", + SquareUnion: "\u2294", + squarf: "\u25AA", + squf: "\u25AA", + srarr: "\u2192", + sscr: "\uD835\uDCC8", + Sscr: "\uD835\uDCAE", + ssetmn: "\u2216", + ssmile: "\u2323", + sstarf: "\u22C6", + star: "\u2606", + Star: "\u22C6", + starf: "\u2605", + straightepsilon: "\u03F5", + straightphi: "\u03D5", + strns: "\xAF", + sub: "\u2282", + Sub: "\u22D0", + subdot: "\u2ABD", + sube: "\u2286", + subE: "\u2AC5", + subedot: "\u2AC3", + submult: "\u2AC1", + subne: "\u228A", + subnE: "\u2ACB", + subplus: "\u2ABF", + subrarr: "\u2979", + subset: "\u2282", + Subset: "\u22D0", + subseteq: "\u2286", + subseteqq: "\u2AC5", + SubsetEqual: "\u2286", + subsetneq: "\u228A", + subsetneqq: "\u2ACB", + subsim: "\u2AC7", + subsub: "\u2AD5", + subsup: "\u2AD3", + succ: "\u227B", + succapprox: "\u2AB8", + succcurlyeq: "\u227D", + Succeeds: "\u227B", + SucceedsEqual: "\u2AB0", + SucceedsSlantEqual: "\u227D", + SucceedsTilde: "\u227F", + succeq: "\u2AB0", + succnapprox: "\u2ABA", + succneqq: "\u2AB6", + succnsim: "\u22E9", + succsim: "\u227F", + SuchThat: "\u220B", + sum: "\u2211", + Sum: "\u2211", + sung: "\u266A", + sup: "\u2283", + Sup: "\u22D1", + sup1: "\xB9", + sup2: "\xB2", + sup3: "\xB3", + supdot: "\u2ABE", + supdsub: "\u2AD8", + supe: "\u2287", + supE: "\u2AC6", + supedot: "\u2AC4", + Superset: "\u2283", + SupersetEqual: "\u2287", + suphsol: "\u27C9", + suphsub: "\u2AD7", + suplarr: "\u297B", + supmult: "\u2AC2", + supne: "\u228B", + supnE: "\u2ACC", + supplus: "\u2AC0", + supset: "\u2283", + Supset: "\u22D1", + supseteq: "\u2287", + supseteqq: "\u2AC6", + supsetneq: "\u228B", + supsetneqq: "\u2ACC", + supsim: "\u2AC8", + supsub: "\u2AD4", + supsup: "\u2AD6", + swarhk: "\u2926", + swarr: "\u2199", + swArr: "\u21D9", + swarrow: "\u2199", + swnwar: "\u292A", + szlig: "\xDF", + Tab: "\t", + target: "\u2316", + tau: "\u03C4", + Tau: "\u03A4", + tbrk: "\u23B4", + tcaron: "\u0165", + Tcaron: "\u0164", + tcedil: "\u0163", + Tcedil: "\u0162", + tcy: "\u0442", + Tcy: "\u0422", + tdot: "\u20DB", + telrec: "\u2315", + tfr: "\uD835\uDD31", + Tfr: "\uD835\uDD17", + there4: "\u2234", + therefore: "\u2234", + Therefore: "\u2234", + theta: "\u03B8", + Theta: "\u0398", + thetasym: "\u03D1", + thetav: "\u03D1", + thickapprox: "\u2248", + thicksim: "\u223C", + ThickSpace: "\u205F\u200A", + thinsp: "\u2009", + ThinSpace: "\u2009", + thkap: "\u2248", + thksim: "\u223C", + thorn: "\xFE", + THORN: "\xDE", + tilde: "\u02DC", + Tilde: "\u223C", + TildeEqual: "\u2243", + TildeFullEqual: "\u2245", + TildeTilde: "\u2248", + times: "\xD7", + timesb: "\u22A0", + timesbar: "\u2A31", + timesd: "\u2A30", + tint: "\u222D", + toea: "\u2928", + top: "\u22A4", + topbot: "\u2336", + topcir: "\u2AF1", + topf: "\uD835\uDD65", + Topf: "\uD835\uDD4B", + topfork: "\u2ADA", + tosa: "\u2929", + tprime: "\u2034", + trade: "\u2122", + TRADE: "\u2122", + triangle: "\u25B5", + triangledown: "\u25BF", + triangleleft: "\u25C3", + trianglelefteq: "\u22B4", + triangleq: "\u225C", + triangleright: "\u25B9", + trianglerighteq: "\u22B5", + tridot: "\u25EC", + trie: "\u225C", + triminus: "\u2A3A", + TripleDot: "\u20DB", + triplus: "\u2A39", + trisb: "\u29CD", + tritime: "\u2A3B", + trpezium: "\u23E2", + tscr: "\uD835\uDCC9", + Tscr: "\uD835\uDCAF", + tscy: "\u0446", + TScy: "\u0426", + tshcy: "\u045B", + TSHcy: "\u040B", + tstrok: "\u0167", + Tstrok: "\u0166", + twixt: "\u226C", + twoheadleftarrow: "\u219E", + twoheadrightarrow: "\u21A0", + uacute: "\xFA", + Uacute: "\xDA", + uarr: "\u2191", + uArr: "\u21D1", + Uarr: "\u219F", + Uarrocir: "\u2949", + ubrcy: "\u045E", + Ubrcy: "\u040E", + ubreve: "\u016D", + Ubreve: "\u016C", + ucirc: "\xFB", + Ucirc: "\xDB", + ucy: "\u0443", + Ucy: "\u0423", + udarr: "\u21C5", + udblac: "\u0171", + Udblac: "\u0170", + udhar: "\u296E", + ufisht: "\u297E", + ufr: "\uD835\uDD32", + Ufr: "\uD835\uDD18", + ugrave: "\xF9", + Ugrave: "\xD9", + uHar: "\u2963", + uharl: "\u21BF", + uharr: "\u21BE", + uhblk: "\u2580", + ulcorn: "\u231C", + ulcorner: "\u231C", + ulcrop: "\u230F", + ultri: "\u25F8", + umacr: "\u016B", + Umacr: "\u016A", + uml: "\xA8", + UnderBar: "_", + UnderBrace: "\u23DF", + UnderBracket: "\u23B5", + UnderParenthesis: "\u23DD", + Union: "\u22C3", + UnionPlus: "\u228E", + uogon: "\u0173", + Uogon: "\u0172", + uopf: "\uD835\uDD66", + Uopf: "\uD835\uDD4C", + uparrow: "\u2191", + Uparrow: "\u21D1", + UpArrow: "\u2191", + UpArrowBar: "\u2912", + UpArrowDownArrow: "\u21C5", + updownarrow: "\u2195", + Updownarrow: "\u21D5", + UpDownArrow: "\u2195", + UpEquilibrium: "\u296E", + upharpoonleft: "\u21BF", + upharpoonright: "\u21BE", + uplus: "\u228E", + UpperLeftArrow: "\u2196", + UpperRightArrow: "\u2197", + upsi: "\u03C5", + Upsi: "\u03D2", + upsih: "\u03D2", + upsilon: "\u03C5", + Upsilon: "\u03A5", + UpTee: "\u22A5", + UpTeeArrow: "\u21A5", + upuparrows: "\u21C8", + urcorn: "\u231D", + urcorner: "\u231D", + urcrop: "\u230E", + uring: "\u016F", + Uring: "\u016E", + urtri: "\u25F9", + uscr: "\uD835\uDCCA", + Uscr: "\uD835\uDCB0", + utdot: "\u22F0", + utilde: "\u0169", + Utilde: "\u0168", + utri: "\u25B5", + utrif: "\u25B4", + uuarr: "\u21C8", + uuml: "\xFC", + Uuml: "\xDC", + uwangle: "\u29A7", + vangrt: "\u299C", + varepsilon: "\u03F5", + varkappa: "\u03F0", + varnothing: "\u2205", + varphi: "\u03D5", + varpi: "\u03D6", + varpropto: "\u221D", + varr: "\u2195", + vArr: "\u21D5", + varrho: "\u03F1", + varsigma: "\u03C2", + varsubsetneq: "\u228A\uFE00", + varsubsetneqq: "\u2ACB\uFE00", + varsupsetneq: "\u228B\uFE00", + varsupsetneqq: "\u2ACC\uFE00", + vartheta: "\u03D1", + vartriangleleft: "\u22B2", + vartriangleright: "\u22B3", + vBar: "\u2AE8", + Vbar: "\u2AEB", + vBarv: "\u2AE9", + vcy: "\u0432", + Vcy: "\u0412", + vdash: "\u22A2", + vDash: "\u22A8", + Vdash: "\u22A9", + VDash: "\u22AB", + Vdashl: "\u2AE6", + vee: "\u2228", + Vee: "\u22C1", + veebar: "\u22BB", + veeeq: "\u225A", + vellip: "\u22EE", + verbar: "|", + Verbar: "\u2016", + vert: "|", + Vert: "\u2016", + VerticalBar: "\u2223", + VerticalLine: "|", + VerticalSeparator: "\u2758", + VerticalTilde: "\u2240", + VeryThinSpace: "\u200A", + vfr: "\uD835\uDD33", + Vfr: "\uD835\uDD19", + vltri: "\u22B2", + vnsub: "\u2282\u20D2", + vnsup: "\u2283\u20D2", + vopf: "\uD835\uDD67", + Vopf: "\uD835\uDD4D", + vprop: "\u221D", + vrtri: "\u22B3", + vscr: "\uD835\uDCCB", + Vscr: "\uD835\uDCB1", + vsubne: "\u228A\uFE00", + vsubnE: "\u2ACB\uFE00", + vsupne: "\u228B\uFE00", + vsupnE: "\u2ACC\uFE00", + Vvdash: "\u22AA", + vzigzag: "\u299A", + wcirc: "\u0175", + Wcirc: "\u0174", + wedbar: "\u2A5F", + wedge: "\u2227", + Wedge: "\u22C0", + wedgeq: "\u2259", + weierp: "\u2118", + wfr: "\uD835\uDD34", + Wfr: "\uD835\uDD1A", + wopf: "\uD835\uDD68", + Wopf: "\uD835\uDD4E", + wp: "\u2118", + wr: "\u2240", + wreath: "\u2240", + wscr: "\uD835\uDCCC", + Wscr: "\uD835\uDCB2", + xcap: "\u22C2", + xcirc: "\u25EF", + xcup: "\u22C3", + xdtri: "\u25BD", + xfr: "\uD835\uDD35", + Xfr: "\uD835\uDD1B", + xharr: "\u27F7", + xhArr: "\u27FA", + xi: "\u03BE", + Xi: "\u039E", + xlarr: "\u27F5", + xlArr: "\u27F8", + xmap: "\u27FC", + xnis: "\u22FB", + xodot: "\u2A00", + xopf: "\uD835\uDD69", + Xopf: "\uD835\uDD4F", + xoplus: "\u2A01", + xotime: "\u2A02", + xrarr: "\u27F6", + xrArr: "\u27F9", + xscr: "\uD835\uDCCD", + Xscr: "\uD835\uDCB3", + xsqcup: "\u2A06", + xuplus: "\u2A04", + xutri: "\u25B3", + xvee: "\u22C1", + xwedge: "\u22C0", + yacute: "\xFD", + Yacute: "\xDD", + yacy: "\u044F", + YAcy: "\u042F", + ycirc: "\u0177", + Ycirc: "\u0176", + ycy: "\u044B", + Ycy: "\u042B", + yen: "\xA5", + yfr: "\uD835\uDD36", + Yfr: "\uD835\uDD1C", + yicy: "\u0457", + YIcy: "\u0407", + yopf: "\uD835\uDD6A", + Yopf: "\uD835\uDD50", + yscr: "\uD835\uDCCE", + Yscr: "\uD835\uDCB4", + yucy: "\u044E", + YUcy: "\u042E", + yuml: "\xFF", + Yuml: "\u0178", + zacute: "\u017A", + Zacute: "\u0179", + zcaron: "\u017E", + Zcaron: "\u017D", + zcy: "\u0437", + Zcy: "\u0417", + zdot: "\u017C", + Zdot: "\u017B", + zeetrf: "\u2128", + ZeroWidthSpace: "\u200B", + zeta: "\u03B6", + Zeta: "\u0396", + zfr: "\uD835\uDD37", + Zfr: "\u2128", + zhcy: "\u0436", + ZHcy: "\u0416", + zigrarr: "\u21DD", + zopf: "\uD835\uDD6B", + Zopf: "\u2124", + zscr: "\uD835\uDCCF", + Zscr: "\uD835\uDCB5", + zwj: "\u200D", + zwnj: "\u200C" + }; + var decodeMapLegacy = { + aacute: "\xE1", + Aacute: "\xC1", + acirc: "\xE2", + Acirc: "\xC2", + acute: "\xB4", + aelig: "\xE6", + AElig: "\xC6", + agrave: "\xE0", + Agrave: "\xC0", + amp: "&", + AMP: "&", + aring: "\xE5", + Aring: "\xC5", + atilde: "\xE3", + Atilde: "\xC3", + auml: "\xE4", + Auml: "\xC4", + brvbar: "\xA6", + ccedil: "\xE7", + Ccedil: "\xC7", + cedil: "\xB8", + cent: "\xA2", + copy: "\xA9", + COPY: "\xA9", + curren: "\xA4", + deg: "\xB0", + divide: "\xF7", + eacute: "\xE9", + Eacute: "\xC9", + ecirc: "\xEA", + Ecirc: "\xCA", + egrave: "\xE8", + Egrave: "\xC8", + eth: "\xF0", + ETH: "\xD0", + euml: "\xEB", + Euml: "\xCB", + frac12: "\xBD", + frac14: "\xBC", + frac34: "\xBE", + gt: ">", + GT: ">", + iacute: "\xED", + Iacute: "\xCD", + icirc: "\xEE", + Icirc: "\xCE", + iexcl: "\xA1", + igrave: "\xEC", + Igrave: "\xCC", + iquest: "\xBF", + iuml: "\xEF", + Iuml: "\xCF", + laquo: "\xAB", + lt: "<", + LT: "<", + macr: "\xAF", + micro: "\xB5", + middot: "\xB7", + nbsp: "\xA0", + not: "\xAC", + ntilde: "\xF1", + Ntilde: "\xD1", + oacute: "\xF3", + Oacute: "\xD3", + ocirc: "\xF4", + Ocirc: "\xD4", + ograve: "\xF2", + Ograve: "\xD2", + ordf: "\xAA", + ordm: "\xBA", + oslash: "\xF8", + Oslash: "\xD8", + otilde: "\xF5", + Otilde: "\xD5", + ouml: "\xF6", + Ouml: "\xD6", + para: "\xB6", + plusmn: "\xB1", + pound: "\xA3", + quot: '"', + QUOT: '"', + raquo: "\xBB", + reg: "\xAE", + REG: "\xAE", + sect: "\xA7", + shy: "\xAD", + sup1: "\xB9", + sup2: "\xB2", + sup3: "\xB3", + szlig: "\xDF", + thorn: "\xFE", + THORN: "\xDE", + times: "\xD7", + uacute: "\xFA", + Uacute: "\xDA", + ucirc: "\xFB", + Ucirc: "\xDB", + ugrave: "\xF9", + Ugrave: "\xD9", + uml: "\xA8", + uuml: "\xFC", + Uuml: "\xDC", + yacute: "\xFD", + Yacute: "\xDD", + yen: "\xA5", + yuml: "\xFF" + }; + var decodeMapNumeric = { + "0": "\uFFFD", + "128": "\u20AC", + "130": "\u201A", + "131": "\u0192", + "132": "\u201E", + "133": "\u2026", + "134": "\u2020", + "135": "\u2021", + "136": "\u02C6", + "137": "\u2030", + "138": "\u0160", + "139": "\u2039", + "140": "\u0152", + "142": "\u017D", + "145": "\u2018", + "146": "\u2019", + "147": "\u201C", + "148": "\u201D", + "149": "\u2022", + "150": "\u2013", + "151": "\u2014", + "152": "\u02DC", + "153": "\u2122", + "154": "\u0161", + "155": "\u203A", + "156": "\u0153", + "158": "\u017E", + "159": "\u0178" + }; + var invalidReferenceCodePoints = [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 11, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 64976, + 64977, + 64978, + 64979, + 64980, + 64981, + 64982, + 64983, + 64984, + 64985, + 64986, + 64987, + 64988, + 64989, + 64990, + 64991, + 64992, + 64993, + 64994, + 64995, + 64996, + 64997, + 64998, + 64999, + 65000, + 65001, + 65002, + 65003, + 65004, + 65005, + 65006, + 65007, + 65534, + 65535, + 131070, + 131071, + 196606, + 196607, + 262142, + 262143, + 327678, + 327679, + 393214, + 393215, + 458750, + 458751, + 524286, + 524287, + 589822, + 589823, + 655358, + 655359, + 720894, + 720895, + 786430, + 786431, + 851966, + 851967, + 917502, + 917503, + 983038, + 983039, + 1048574, + 1048575, + 1114110, + 1114111 + ]; + + /*--------------------------------------------------------------------------*/ + + var stringFromCharCode = String.fromCharCode; + + var object = {}; + var hasOwnProperty = object.hasOwnProperty; + var has = function(object, propertyName) { + return hasOwnProperty.call(object, propertyName); + }; + + var contains = function(array, value) { + var index = -1; + var length = array.length; + while (++index < length) { + if (array[index] == value) { + return true; + } + } + return false; + }; + + var merge = function(options, defaults) { + if (!options) { + return defaults; + } + var result = {}; + var key; + for (key in defaults) { + // A `hasOwnProperty` check is not needed here, since only recognized + // option names are used anyway. Any others are ignored. + result[key] = has(options, key) ? options[key] : defaults[key]; + } + return result; + }; + + // Modified version of `ucs2encode`; see https://mths.be/punycode. + var codePointToSymbol = function(codePoint, strict) { + var output = ""; + if ( + (codePoint >= 0xd800 && codePoint <= 0xdfff) || + codePoint > 0x10ffff + ) { + // See issue #4: + // “Otherwise, if the number is in the range 0xD800 to 0xDFFF or is + // greater than 0x10FFFF, then this is a parse error. Return a U+FFFD + // REPLACEMENT CHARACTER.” + if (strict) { + parseError( + "character reference outside the permissible Unicode range" + ); + } + return "\uFFFD"; + } + if (has(decodeMapNumeric, codePoint)) { + if (strict) { + parseError("disallowed character reference"); + } + return decodeMapNumeric[codePoint]; + } + if (strict && contains(invalidReferenceCodePoints, codePoint)) { + parseError("disallowed character reference"); + } + if (codePoint > 0xffff) { + codePoint -= 0x10000; + output += stringFromCharCode( + ((codePoint >>> 10) & 0x3ff) | 0xd800 + ); + codePoint = 0xdc00 | (codePoint & 0x3ff); + } + output += stringFromCharCode(codePoint); + return output; + }; + + var hexEscape = function(codePoint) { + return "&#x" + codePoint.toString(16).toUpperCase() + ";"; + }; + + var decEscape = function(codePoint) { + return "&#" + codePoint + ";"; + }; + + var parseError = function(message) { + throw Error("Parse error: " + message); + }; + + /*--------------------------------------------------------------------------*/ + + var encode = function(string, options) { + options = merge(options, encode.options); + var strict = options.strict; + if (strict && regexInvalidRawCodePoint.test(string)) { + parseError("forbidden code point"); + } + var encodeEverything = options.encodeEverything; + var useNamedReferences = options.useNamedReferences; + var allowUnsafeSymbols = options.allowUnsafeSymbols; + var escapeCodePoint = options.decimal ? decEscape : hexEscape; + + var escapeBmpSymbol = function(symbol) { + return escapeCodePoint(symbol.charCodeAt(0)); + }; + + if (encodeEverything) { + // Encode ASCII symbols. + string = string.replace(regexAsciiWhitelist, function(symbol) { + // Use named references if requested & possible. + if (useNamedReferences && has(encodeMap, symbol)) { + return "&" + encodeMap[symbol] + ";"; + } + return escapeBmpSymbol(symbol); + }); + // Shorten a few escapes that represent two symbols, of which at least one + // is within the ASCII range. + if (useNamedReferences) { + string = string + .replace(/>\u20D2/g, ">⃒") + .replace(/<\u20D2/g, "<⃒") + .replace(/fj/g, "fj"); + } + // Encode non-ASCII symbols. + if (useNamedReferences) { + // Encode non-ASCII symbols that can be replaced with a named reference. + string = string.replace(regexEncodeNonAscii, function( + string + ) { + // Note: there is no need to check `has(encodeMap, string)` here. + return "&" + encodeMap[string] + ";"; + }); + } + // Note: any remaining non-ASCII symbols are handled outside of the `if`. + } else if (useNamedReferences) { + // Apply named character references. + // Encode `<>"'&` using named character references. + if (!allowUnsafeSymbols) { + string = string.replace(regexEscape, function(string) { + return "&" + encodeMap[string] + ";"; // no need to check `has()` here + }); + } + // Shorten escapes that represent two symbols, of which at least one is + // `<>"'&`. + string = string + .replace(/>\u20D2/g, ">⃒") + .replace(/<\u20D2/g, "<⃒"); + // Encode non-ASCII symbols that can be replaced with a named reference. + string = string.replace(regexEncodeNonAscii, function(string) { + // Note: there is no need to check `has(encodeMap, string)` here. + return "&" + encodeMap[string] + ";"; + }); + } else if (!allowUnsafeSymbols) { + // Encode `<>"'&` using hexadecimal escapes, now that they’re not handled + // using named character references. + string = string.replace(regexEscape, escapeBmpSymbol); + } + return ( + string + // Encode astral symbols. + .replace(regexAstralSymbols, function($0) { + // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae + var high = $0.charCodeAt(0); + var low = $0.charCodeAt(1); + var codePoint = + (high - 0xd800) * 0x400 + low - 0xdc00 + 0x10000; + return escapeCodePoint(codePoint); + }) + // Encode any remaining BMP symbols that are not printable ASCII symbols + // using a hexadecimal escape. + .replace(regexBmpWhitelist, escapeBmpSymbol) + ); + }; + // Expose default options (so they can be overridden globally). + encode.options = { + allowUnsafeSymbols: false, + encodeEverything: false, + strict: false, + useNamedReferences: false, + decimal: false + }; + + var decode = function(html, options) { + options = merge(options, decode.options); + var strict = options.strict; + if (strict && regexInvalidEntity.test(html)) { + parseError("malformed character reference"); + } + return html.replace(regexDecode, function( + $0, + $1, + $2, + $3, + $4, + $5, + $6, + $7, + $8 + ) { + var codePoint; + var semicolon; + var decDigits; + var hexDigits; + var reference; + var next; + + if ($1) { + reference = $1; + // Note: there is no need to check `has(decodeMap, reference)`. + return decodeMap[reference]; + } + + if ($2) { + // Decode named character references without trailing `;`, e.g. `&`. + // This is only a parse error if it gets converted to `&`, or if it is + // followed by `=` in an attribute context. + reference = $2; + next = $3; + if (next && options.isAttributeValue) { + if (strict && next == "=") { + parseError("`&` did not start a character reference"); + } + return $0; + } else { + if (strict) { + parseError( + "named character reference was not terminated by a semicolon" + ); + } + // Note: there is no need to check `has(decodeMapLegacy, reference)`. + return decodeMapLegacy[reference] + (next || ""); + } + } + + if ($4) { + // Decode decimal escapes, e.g. `𝌆`. + decDigits = $4; + semicolon = $5; + if (strict && !semicolon) { + parseError( + "character reference was not terminated by a semicolon" + ); + } + codePoint = parseInt(decDigits, 10); + return codePointToSymbol(codePoint, strict); + } + + if ($6) { + // Decode hexadecimal escapes, e.g. `𝌆`. + hexDigits = $6; + semicolon = $7; + if (strict && !semicolon) { + parseError( + "character reference was not terminated by a semicolon" + ); + } + codePoint = parseInt(hexDigits, 16); + return codePointToSymbol(codePoint, strict); + } + + // If we’re still here, `if ($7)` is implied; it’s an ambiguous + // ampersand for sure. https://mths.be/notes/ambiguous-ampersands + if (strict) { + parseError( + "named character reference was not terminated by a semicolon" + ); + } + return $0; + }); + }; + // Expose default options (so they can be overridden globally). + decode.options = { + isAttributeValue: false, + strict: false + }; + + var escape = function(string) { + return string.replace(regexEscape, function($0) { + // Note: there is no need to check `has(escapeMap, $0)` here. + return escapeMap[$0]; + }); + }; + + /*--------------------------------------------------------------------------*/ + + var he = { + version: "1.2.0", + encode: encode, + decode: decode, + escape: escape, + unescape: decode + }; + + // Some AMD build optimizers, like r.js, check for specific condition patterns + // like the following: + if ( + typeof define == "function" && + typeof define.amd == "object" && + define.amd + ) { + define(function() { + return he; + }); + } else if (freeExports && !freeExports.nodeType) { + if (freeModule) { + // in Node.js, io.js, or RingoJS v0.8.0+ + freeModule.exports = he; + } else { + // in Narwhal or RingoJS v0.7.0- + for (var key in he) { + has(he, key) && (freeExports[key] = he[key]); + } + } + } else { + // in Rhino or a web browser + root.he = he; + } + })(this); + }.call( + this, + typeof global !== "undefined" + ? global + : typeof self !== "undefined" + ? self + : typeof window !== "undefined" + ? window + : {} + )); + }, + {} + ], + 104: [ + function(require, module, exports) { + var http = require("http"); + var url = require("url"); + + var https = module.exports; + + for (var key in http) { + if (http.hasOwnProperty(key)) https[key] = http[key]; + } + + https.request = function(params, cb) { + params = validateParams(params); + return http.request.call(this, params, cb); + }; + + https.get = function(params, cb) { + params = validateParams(params); + return http.get.call(this, params, cb); + }; + + function validateParams(params) { + if (typeof params === "string") { + params = url.parse(params); + } + if (!params.protocol) { + params.protocol = "https:"; + } + if (params.protocol !== "https:") { + throw new Error( + 'Protocol "' + + params.protocol + + '" not supported. Expected "https:"' + ); + } + return params; + } + }, + { http: 156, url: 162 } + ], + 105: [ + function(require, module, exports) { + exports.read = function(buffer, offset, isLE, mLen, nBytes) { + var e, m; + var eLen = nBytes * 8 - mLen - 1; + var eMax = (1 << eLen) - 1; + var eBias = eMax >> 1; + var nBits = -7; + var i = isLE ? nBytes - 1 : 0; + var d = isLE ? -1 : 1; + var s = buffer[offset + i]; + + i += d; + + e = s & ((1 << -nBits) - 1); + s >>= -nBits; + nBits += eLen; + for ( + ; + nBits > 0; + e = e * 256 + buffer[offset + i], i += d, nBits -= 8 + ) {} + + m = e & ((1 << -nBits) - 1); + e >>= -nBits; + nBits += mLen; + for ( + ; + nBits > 0; + m = m * 256 + buffer[offset + i], i += d, nBits -= 8 + ) {} + + if (e === 0) { + e = 1 - eBias; + } else if (e === eMax) { + return m ? NaN : (s ? -1 : 1) * Infinity; + } else { + m = m + Math.pow(2, mLen); + e = e - eBias; + } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen); + }; + + exports.write = function(buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c; + var eLen = nBytes * 8 - mLen - 1; + var eMax = (1 << eLen) - 1; + var eBias = eMax >> 1; + var rt = mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0; + var i = isLE ? 0 : nBytes - 1; + var d = isLE ? 1 : -1; + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0; + + value = Math.abs(value); + + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0; + e = eMax; + } else { + e = Math.floor(Math.log(value) / Math.LN2); + if (value * (c = Math.pow(2, -e)) < 1) { + e--; + c *= 2; + } + if (e + eBias >= 1) { + value += rt / c; + } else { + value += rt * Math.pow(2, 1 - eBias); + } + if (value * c >= 2) { + e++; + c /= 2; + } + + if (e + eBias >= eMax) { + m = 0; + e = eMax; + } else if (e + eBias >= 1) { + m = (value * c - 1) * Math.pow(2, mLen); + e = e + eBias; + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); + e = 0; + } + } + + for ( + ; + mLen >= 8; + buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8 + ) {} + + e = (e << mLen) | m; + eLen += mLen; + for ( + ; + eLen > 0; + buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8 + ) {} + + buffer[offset + i - d] |= s * 128; + }; + }, + {} + ], + 106: [ + function(require, module, exports) { + if (typeof Object.create === "function") { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor; + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; + } else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor; + var TempCtor = function() {}; + TempCtor.prototype = superCtor.prototype; + ctor.prototype = new TempCtor(); + ctor.prototype.constructor = ctor; + }; + } + }, + {} + ], + 107: [ + function(require, module, exports) { + /*! + * Determine if an object is a Buffer + * + * @author Feross Aboukhadijeh + * @license MIT + */ + + // The _isBuffer check is for Safari 5-7 support, because it's missing + // Object.prototype.constructor. Remove this eventually + module.exports = function(obj) { + return ( + obj != null && + (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer) + ); + }; + + function isBuffer(obj) { + return ( + !!obj.constructor && + typeof obj.constructor.isBuffer === "function" && + obj.constructor.isBuffer(obj) + ); + } + + // For Node v0.10 support. Remove this eventually. + function isSlowBuffer(obj) { + return ( + typeof obj.readFloatLE === "function" && + typeof obj.slice === "function" && + isBuffer(obj.slice(0, 0)) + ); + } + }, + {} + ], + 108: [ + function(require, module, exports) { + var toString = {}.toString; + + module.exports = + Array.isArray || + function(arr) { + return toString.call(arr) == "[object Array]"; + }; + }, + {} + ], + 109: [ + function(require, module, exports) { + exports.endianness = function() { + return "LE"; + }; + + exports.hostname = function() { + if (typeof location !== "undefined") { + return location.hostname; + } else return ""; + }; + + exports.loadavg = function() { + return []; + }; + + exports.uptime = function() { + return 0; + }; + + exports.freemem = function() { + return Number.MAX_VALUE; + }; + + exports.totalmem = function() { + return Number.MAX_VALUE; + }; + + exports.cpus = function() { + return []; + }; + + exports.type = function() { + return "Browser"; + }; + + exports.release = function() { + if (typeof navigator !== "undefined") { + return navigator.appVersion; + } + return ""; + }; + + exports.networkInterfaces = exports.getNetworkInterfaces = function() { + return {}; + }; + + exports.arch = function() { + return "javascript"; + }; + + exports.platform = function() { + return "browser"; + }; + + exports.tmpdir = exports.tmpDir = function() { + return "/tmp"; + }; + + exports.EOL = "\n"; + + exports.homedir = function() { + return "/"; + }; + }, + {} + ], + 110: [ + function(require, module, exports) { + (function(process) { + // .dirname, .basename, and .extname methods are extracted from Node.js v8.11.1, + // backported and transplited with Babel, with backwards-compat fixes + + // Copyright Joyent, Inc. and other Node contributors. + // + // Permission is hereby granted, free of charge, to any person obtaining a + // copy of this software and associated documentation files (the + // "Software"), to deal in the Software without restriction, including + // without limitation the rights to use, copy, modify, merge, publish, + // distribute, sublicense, and/or sell copies of the Software, and to permit + // persons to whom the Software is furnished to do so, subject to the + // following conditions: + // + // The above copyright notice and this permission notice shall be included + // in all copies or substantial portions of the Software. + // + // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + // USE OR OTHER DEALINGS IN THE SOFTWARE. + + // resolves . and .. elements in a path array with directory names there + // must be no slashes, empty elements, or device names (c:\) in the array + // (so also no leading and trailing slashes - it does not distinguish + // relative and absolute paths) + function normalizeArray(parts, allowAboveRoot) { + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + if (last === ".") { + parts.splice(i, 1); + } else if (last === "..") { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up--; up) { + parts.unshift(".."); + } + } + + return parts; + } + + // path.resolve([from ...], to) + // posix version + exports.resolve = function() { + var resolvedPath = "", + resolvedAbsolute = false; + + for ( + var i = arguments.length - 1; + i >= -1 && !resolvedAbsolute; + i-- + ) { + var path = i >= 0 ? arguments[i] : process.cwd(); + + // Skip empty and invalid entries + if (typeof path !== "string") { + throw new TypeError( + "Arguments to path.resolve must be strings" + ); + } else if (!path) { + continue; + } + + resolvedPath = path + "/" + resolvedPath; + resolvedAbsolute = path.charAt(0) === "/"; + } + + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + + // Normalize the path + resolvedPath = normalizeArray( + filter(resolvedPath.split("/"), function(p) { + return !!p; + }), + !resolvedAbsolute + ).join("/"); + + return (resolvedAbsolute ? "/" : "") + resolvedPath || "."; + }; + + // path.normalize(path) + // posix version + exports.normalize = function(path) { + var isAbsolute = exports.isAbsolute(path), + trailingSlash = substr(path, -1) === "/"; + + // Normalize the path + path = normalizeArray( + filter(path.split("/"), function(p) { + return !!p; + }), + !isAbsolute + ).join("/"); + + if (!path && !isAbsolute) { + path = "."; + } + if (path && trailingSlash) { + path += "/"; + } + + return (isAbsolute ? "/" : "") + path; + }; + + // posix version + exports.isAbsolute = function(path) { + return path.charAt(0) === "/"; + }; + + // posix version + exports.join = function() { + var paths = Array.prototype.slice.call(arguments, 0); + return exports.normalize( + filter(paths, function(p, index) { + if (typeof p !== "string") { + throw new TypeError("Arguments to path.join must be strings"); + } + return p; + }).join("/") + ); + }; + + // path.relative(from, to) + // posix version + exports.relative = function(from, to) { + from = exports.resolve(from).substr(1); + to = exports.resolve(to).substr(1); + + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== "") break; + } + + var end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== "") break; + } + + if (start > end) return []; + return arr.slice(start, end - start + 1); + } + + var fromParts = trim(from.split("/")); + var toParts = trim(to.split("/")); + + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push(".."); + } + + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + + return outputParts.join("/"); + }; + + exports.sep = "/"; + exports.delimiter = ":"; + + exports.dirname = function(path) { + if (typeof path !== "string") path = path + ""; + if (path.length === 0) return "."; + var code = path.charCodeAt(0); + var hasRoot = code === 47; /*/*/ + var end = -1; + var matchedSlash = true; + for (var i = path.length - 1; i >= 1; --i) { + code = path.charCodeAt(i); + if (code === 47 /*/*/) { + if (!matchedSlash) { + end = i; + break; + } + } else { + // We saw the first non-path separator + matchedSlash = false; + } + } + + if (end === -1) return hasRoot ? "/" : "."; + if (hasRoot && end === 1) { + // return '//'; + // Backwards-compat fix: + return "/"; + } + return path.slice(0, end); + }; + + function basename(path) { + if (typeof path !== "string") path = path + ""; + + var start = 0; + var end = -1; + var matchedSlash = true; + var i; + + for (i = path.length - 1; i >= 0; --i) { + if (path.charCodeAt(i) === 47 /*/*/) { + // If we reached a path separator that was not part of a set of path + // separators at the end of the string, stop now + if (!matchedSlash) { + start = i + 1; + break; + } + } else if (end === -1) { + // We saw the first non-path separator, mark this as the end of our + // path component + matchedSlash = false; + end = i + 1; + } + } + + if (end === -1) return ""; + return path.slice(start, end); + } + + // Uses a mixed approach for backwards-compatibility, as ext behavior changed + // in new Node.js versions, so only basename() above is backported here + exports.basename = function(path, ext) { + var f = basename(path); + if (ext && f.substr(-1 * ext.length) === ext) { + f = f.substr(0, f.length - ext.length); + } + return f; + }; + + exports.extname = function(path) { + if (typeof path !== "string") path = path + ""; + var startDot = -1; + var startPart = 0; + var end = -1; + var matchedSlash = true; + // Track the state of characters (if any) we see before our first dot and + // after any path separator we find + var preDotState = 0; + for (var i = path.length - 1; i >= 0; --i) { + var code = path.charCodeAt(i); + if (code === 47 /*/*/) { + // If we reached a path separator that was not part of a set of path + // separators at the end of the string, stop now + if (!matchedSlash) { + startPart = i + 1; + break; + } + continue; + } + if (end === -1) { + // We saw the first non-path separator, mark this as the end of our + // extension + matchedSlash = false; + end = i + 1; + } + if (code === 46 /*.*/) { + // If this is our first dot, mark it as the start of our extension + if (startDot === -1) startDot = i; + else if (preDotState !== 1) preDotState = 1; + } else if (startDot !== -1) { + // We saw a non-dot and non-path separator before our dot, so we should + // have a good chance at having a non-empty extension + preDotState = -1; + } + } + + if ( + startDot === -1 || + end === -1 || + // We saw a non-dot character immediately before the dot + preDotState === 0 || + // The (right-most) trimmed path component is exactly '..' + (preDotState === 1 && + startDot === end - 1 && + startDot === startPart + 1) + ) { + return ""; + } + return path.slice(startDot, end); + }; + + function filter(xs, f) { + if (xs.filter) return xs.filter(f); + var res = []; + for (var i = 0; i < xs.length; i++) { + if (f(xs[i], i, xs)) res.push(xs[i]); + } + return res; + } + + // String.prototype.substr - negative index don't work in IE8 + var substr = + "ab".substr(-1) === "b" + ? function(str, start, len) { + return str.substr(start, len); + } + : function(str, start, len) { + if (start < 0) start = str.length + start; + return str.substr(start, len); + }; + }.call(this, require("_process"))); + }, + { _process: 112 } + ], + 111: [ + function(require, module, exports) { + (function(process) { + "use strict"; + + if ( + !process.version || + process.version.indexOf("v0.") === 0 || + (process.version.indexOf("v1.") === 0 && + process.version.indexOf("v1.8.") !== 0) + ) { + module.exports = { nextTick: nextTick }; + } else { + module.exports = process; + } + + function nextTick(fn, arg1, arg2, arg3) { + if (typeof fn !== "function") { + throw new TypeError('"callback" argument must be a function'); + } + var len = arguments.length; + var args, i; + switch (len) { + case 0: + case 1: + return process.nextTick(fn); + case 2: + return process.nextTick(function afterTickOne() { + fn.call(null, arg1); + }); + case 3: + return process.nextTick(function afterTickTwo() { + fn.call(null, arg1, arg2); + }); + case 4: + return process.nextTick(function afterTickThree() { + fn.call(null, arg1, arg2, arg3); + }); + default: + args = new Array(len - 1); + i = 0; + while (i < args.length) { + args[i++] = arguments[i]; + } + return process.nextTick(function afterTick() { + fn.apply(null, args); + }); + } + } + }.call(this, require("_process"))); + }, + { _process: 112 } + ], + 112: [ + function(require, module, exports) { + // shim for using process in browser + var process = (module.exports = {}); + + // cached from whatever global is present so that test runners that stub it + // don't break things. But we need to wrap it in a try catch in case it is + // wrapped in strict mode code which doesn't define any globals. It's inside a + // function because try/catches deoptimize in certain engines. + + var cachedSetTimeout; + var cachedClearTimeout; + + function defaultSetTimout() { + throw new Error("setTimeout has not been defined"); + } + function defaultClearTimeout() { + throw new Error("clearTimeout has not been defined"); + } + (function() { + try { + if (typeof setTimeout === "function") { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === "function") { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } + })(); + function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ( + (cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && + setTimeout + ) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch (e) { + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch (e) { + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + } + function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ( + (cachedClearTimeout === defaultClearTimeout || + !cachedClearTimeout) && + clearTimeout + ) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e) { + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e) { + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + } + var queue = []; + var draining = false; + var currentQueue; + var queueIndex = -1; + + function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } + } + + function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while (len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); + } + + process.nextTick = function(fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } + }; + + // v8 likes predictible objects + function Item(fun, array) { + this.fun = fun; + this.array = array; + } + Item.prototype.run = function() { + this.fun.apply(null, this.array); + }; + process.title = "browser"; + process.browser = true; + process.env = {}; + process.argv = []; + process.version = ""; // empty string to avoid regexp issues + process.versions = {}; + + function noop() {} + + process.on = noop; + process.addListener = noop; + process.once = noop; + process.off = noop; + process.removeListener = noop; + process.removeAllListeners = noop; + process.emit = noop; + process.prependListener = noop; + process.prependOnceListener = noop; + + process.listeners = function(name) { + return []; + }; + + process.binding = function(name) { + throw new Error("process.binding is not supported"); + }; + + process.cwd = function() { + return "/"; + }; + process.chdir = function(dir) { + throw new Error("process.chdir is not supported"); + }; + process.umask = function() { + return 0; + }; + }, + {} + ], + 113: [ + function(require, module, exports) { + (function(global) { + /*! https://mths.be/punycode v1.4.1 by @mathias */ + (function(root) { + /** Detect free variables */ + var freeExports = + typeof exports == "object" && + exports && + !exports.nodeType && + exports; + var freeModule = + typeof module == "object" && module && !module.nodeType && module; + var freeGlobal = typeof global == "object" && global; + if ( + freeGlobal.global === freeGlobal || + freeGlobal.window === freeGlobal || + freeGlobal.self === freeGlobal + ) { + root = freeGlobal; + } + + /** + * The `punycode` object. + * @name punycode + * @type Object + */ + var punycode, + /** Highest positive signed 32-bit float value */ + maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1 + /** Bootstring parameters */ + base = 36, + tMin = 1, + tMax = 26, + skew = 38, + damp = 700, + initialBias = 72, + initialN = 128, // 0x80 + delimiter = "-", // '\x2D' + /** Regular expressions */ + regexPunycode = /^xn--/, + regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars + regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators + /** Error messages */ + errors = { + overflow: "Overflow: input needs wider integers to process", + "not-basic": "Illegal input >= 0x80 (not a basic code point)", + "invalid-input": "Invalid input" + }, + /** Convenience shortcuts */ + baseMinusTMin = base - tMin, + floor = Math.floor, + stringFromCharCode = String.fromCharCode, + /** Temporary variable */ + key; + + /*--------------------------------------------------------------------------*/ + + /** + * A generic error utility function. + * @private + * @param {String} type The error type. + * @returns {Error} Throws a `RangeError` with the applicable error message. + */ + function error(type) { + throw new RangeError(errors[type]); + } + + /** + * A generic `Array#map` utility function. + * @private + * @param {Array} array The array to iterate over. + * @param {Function} callback The function that gets called for every array + * item. + * @returns {Array} A new array of values returned by the callback function. + */ + function map(array, fn) { + var length = array.length; + var result = []; + while (length--) { + result[length] = fn(array[length]); + } + return result; + } + + /** + * A simple `Array#map`-like wrapper to work with domain name strings or email + * addresses. + * @private + * @param {String} domain The domain name or email address. + * @param {Function} callback The function that gets called for every + * character. + * @returns {Array} A new string of characters returned by the callback + * function. + */ + function mapDomain(string, fn) { + var parts = string.split("@"); + var result = ""; + if (parts.length > 1) { + // In email addresses, only the domain name should be punycoded. Leave + // the local part (i.e. everything up to `@`) intact. + result = parts[0] + "@"; + string = parts[1]; + } + // Avoid `split(regex)` for IE8 compatibility. See #17. + string = string.replace(regexSeparators, "\x2E"); + var labels = string.split("."); + var encoded = map(labels, fn).join("."); + return result + encoded; + } + + /** + * Creates an array containing the numeric code points of each Unicode + * character in the string. While JavaScript uses UCS-2 internally, + * this function will convert a pair of surrogate halves (each of which + * UCS-2 exposes as separate characters) into a single code point, + * matching UTF-16. + * @see `punycode.ucs2.encode` + * @see + * @memberOf punycode.ucs2 + * @name decode + * @param {String} string The Unicode input string (UCS-2). + * @returns {Array} The new array of code points. + */ + function ucs2decode(string) { + var output = [], + counter = 0, + length = string.length, + value, + extra; + while (counter < length) { + value = string.charCodeAt(counter++); + if (value >= 0xd800 && value <= 0xdbff && counter < length) { + // high surrogate, and there is a next character + extra = string.charCodeAt(counter++); + if ((extra & 0xfc00) == 0xdc00) { + // low surrogate + output.push( + ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000 + ); + } else { + // unmatched surrogate; only append this code unit, in case the next + // code unit is the high surrogate of a surrogate pair + output.push(value); + counter--; + } + } else { + output.push(value); + } + } + return output; + } + + /** + * Creates a string based on an array of numeric code points. + * @see `punycode.ucs2.decode` + * @memberOf punycode.ucs2 + * @name encode + * @param {Array} codePoints The array of numeric code points. + * @returns {String} The new Unicode string (UCS-2). + */ + function ucs2encode(array) { + return map(array, function(value) { + var output = ""; + if (value > 0xffff) { + value -= 0x10000; + output += stringFromCharCode( + ((value >>> 10) & 0x3ff) | 0xd800 + ); + value = 0xdc00 | (value & 0x3ff); + } + output += stringFromCharCode(value); + return output; + }).join(""); + } + + /** + * Converts a basic code point into a digit/integer. + * @see `digitToBasic()` + * @private + * @param {Number} codePoint The basic numeric code point value. + * @returns {Number} The numeric value of a basic code point (for use in + * representing integers) in the range `0` to `base - 1`, or `base` if + * the code point does not represent a value. + */ + function basicToDigit(codePoint) { + if (codePoint - 48 < 10) { + return codePoint - 22; + } + if (codePoint - 65 < 26) { + return codePoint - 65; + } + if (codePoint - 97 < 26) { + return codePoint - 97; + } + return base; + } + + /** + * Converts a digit/integer into a basic code point. + * @see `basicToDigit()` + * @private + * @param {Number} digit The numeric value of a basic code point. + * @returns {Number} The basic code point whose value (when used for + * representing integers) is `digit`, which needs to be in the range + * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is + * used; else, the lowercase form is used. The behavior is undefined + * if `flag` is non-zero and `digit` has no uppercase form. + */ + function digitToBasic(digit, flag) { + // 0..25 map to ASCII a..z or A..Z + // 26..35 map to ASCII 0..9 + return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); + } + + /** + * Bias adaptation function as per section 3.4 of RFC 3492. + * https://tools.ietf.org/html/rfc3492#section-3.4 + * @private + */ + function adapt(delta, numPoints, firstTime) { + var k = 0; + delta = firstTime ? floor(delta / damp) : delta >> 1; + delta += floor(delta / numPoints); + for ( + ; + /* no initialization */ delta > (baseMinusTMin * tMax) >> 1; + k += base + ) { + delta = floor(delta / baseMinusTMin); + } + return floor(k + ((baseMinusTMin + 1) * delta) / (delta + skew)); + } + + /** + * Converts a Punycode string of ASCII-only symbols to a string of Unicode + * symbols. + * @memberOf punycode + * @param {String} input The Punycode string of ASCII-only symbols. + * @returns {String} The resulting string of Unicode symbols. + */ + function decode(input) { + // Don't use UCS-2 + var output = [], + inputLength = input.length, + out, + i = 0, + n = initialN, + bias = initialBias, + basic, + j, + index, + oldi, + w, + k, + digit, + t, + /** Cached calculation results */ + baseMinusT; + + // Handle the basic code points: let `basic` be the number of input code + // points before the last delimiter, or `0` if there is none, then copy + // the first basic code points to the output. + + basic = input.lastIndexOf(delimiter); + if (basic < 0) { + basic = 0; + } + + for (j = 0; j < basic; ++j) { + // if it's not a basic code point + if (input.charCodeAt(j) >= 0x80) { + error("not-basic"); + } + output.push(input.charCodeAt(j)); + } + + // Main decoding loop: start just after the last delimiter if any basic code + // points were copied; start at the beginning otherwise. + + for ( + index = basic > 0 ? basic + 1 : 0; + index < inputLength /* no final expression */; + + ) { + // `index` is the index of the next character to be consumed. + // Decode a generalized variable-length integer into `delta`, + // which gets added to `i`. The overflow checking is easier + // if we increase `i` as we go, then subtract off its starting + // value at the end to obtain `delta`. + for ( + oldi = i, w = 1, k = base /* no condition */; + ; + k += base + ) { + if (index >= inputLength) { + error("invalid-input"); + } + + digit = basicToDigit(input.charCodeAt(index++)); + + if (digit >= base || digit > floor((maxInt - i) / w)) { + error("overflow"); + } + + i += digit * w; + t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias; + + if (digit < t) { + break; + } + + baseMinusT = base - t; + if (w > floor(maxInt / baseMinusT)) { + error("overflow"); + } + + w *= baseMinusT; + } + + out = output.length + 1; + bias = adapt(i - oldi, out, oldi == 0); + + // `i` was supposed to wrap around from `out` to `0`, + // incrementing `n` each time, so we'll fix that now: + if (floor(i / out) > maxInt - n) { + error("overflow"); + } + + n += floor(i / out); + i %= out; + + // Insert `n` at position `i` of the output + output.splice(i++, 0, n); + } + + return ucs2encode(output); + } + + /** + * Converts a string of Unicode symbols (e.g. a domain name label) to a + * Punycode string of ASCII-only symbols. + * @memberOf punycode + * @param {String} input The string of Unicode symbols. + * @returns {String} The resulting Punycode string of ASCII-only symbols. + */ + function encode(input) { + var n, + delta, + handledCPCount, + basicLength, + bias, + j, + m, + q, + k, + t, + currentValue, + output = [], + /** `inputLength` will hold the number of code points in `input`. */ + inputLength, + /** Cached calculation results */ + handledCPCountPlusOne, + baseMinusT, + qMinusT; + + // Convert the input in UCS-2 to Unicode + input = ucs2decode(input); + + // Cache the length + inputLength = input.length; + + // Initialize the state + n = initialN; + delta = 0; + bias = initialBias; + + // Handle the basic code points + for (j = 0; j < inputLength; ++j) { + currentValue = input[j]; + if (currentValue < 0x80) { + output.push(stringFromCharCode(currentValue)); + } + } + + handledCPCount = basicLength = output.length; + + // `handledCPCount` is the number of code points that have been handled; + // `basicLength` is the number of basic code points. + + // Finish the basic string - if it is not empty - with a delimiter + if (basicLength) { + output.push(delimiter); + } + + // Main encoding loop: + while (handledCPCount < inputLength) { + // All non-basic code points < n have been handled already. Find the next + // larger one: + for (m = maxInt, j = 0; j < inputLength; ++j) { + currentValue = input[j]; + if (currentValue >= n && currentValue < m) { + m = currentValue; + } + } + + // Increase `delta` enough to advance the decoder's state to , + // but guard against overflow + handledCPCountPlusOne = handledCPCount + 1; + if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { + error("overflow"); + } + + delta += (m - n) * handledCPCountPlusOne; + n = m; + + for (j = 0; j < inputLength; ++j) { + currentValue = input[j]; + + if (currentValue < n && ++delta > maxInt) { + error("overflow"); + } + + if (currentValue == n) { + // Represent delta as a generalized variable-length integer + for (q = delta, k = base /* no condition */; ; k += base) { + t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias; + if (q < t) { + break; + } + qMinusT = q - t; + baseMinusT = base - t; + output.push( + stringFromCharCode( + digitToBasic(t + (qMinusT % baseMinusT), 0) + ) + ); + q = floor(qMinusT / baseMinusT); + } + + output.push(stringFromCharCode(digitToBasic(q, 0))); + bias = adapt( + delta, + handledCPCountPlusOne, + handledCPCount == basicLength + ); + delta = 0; + ++handledCPCount; + } + } + + ++delta; + ++n; + } + return output.join(""); + } + + /** + * Converts a Punycode string representing a domain name or an email address + * to Unicode. Only the Punycoded parts of the input will be converted, i.e. + * it doesn't matter if you call it on a string that has already been + * converted to Unicode. + * @memberOf punycode + * @param {String} input The Punycoded domain name or email address to + * convert to Unicode. + * @returns {String} The Unicode representation of the given Punycode + * string. + */ + function toUnicode(input) { + return mapDomain(input, function(string) { + return regexPunycode.test(string) + ? decode(string.slice(4).toLowerCase()) + : string; + }); + } + + /** + * Converts a Unicode string representing a domain name or an email address to + * Punycode. Only the non-ASCII parts of the domain name will be converted, + * i.e. it doesn't matter if you call it with a domain that's already in + * ASCII. + * @memberOf punycode + * @param {String} input The domain name or email address to convert, as a + * Unicode string. + * @returns {String} The Punycode representation of the given domain name or + * email address. + */ + function toASCII(input) { + return mapDomain(input, function(string) { + return regexNonASCII.test(string) + ? "xn--" + encode(string) + : string; + }); + } + + /*--------------------------------------------------------------------------*/ + + /** Define the public API */ + punycode = { + /** + * A string representing the current Punycode.js version number. + * @memberOf punycode + * @type String + */ + version: "1.4.1", + /** + * An object of methods to convert from JavaScript's internal character + * representation (UCS-2) to Unicode code points, and back. + * @see + * @memberOf punycode + * @type Object + */ + ucs2: { + decode: ucs2decode, + encode: ucs2encode + }, + decode: decode, + encode: encode, + toASCII: toASCII, + toUnicode: toUnicode + }; + + /** Expose `punycode` */ + // Some AMD build optimizers, like r.js, check for specific condition patterns + // like the following: + if ( + typeof define == "function" && + typeof define.amd == "object" && + define.amd + ) { + define("punycode", function() { + return punycode; + }); + } else if (freeExports && freeModule) { + if (module.exports == freeExports) { + // in Node.js, io.js, or RingoJS v0.8.0+ + freeModule.exports = punycode; + } else { + // in Narwhal or RingoJS v0.7.0- + for (key in punycode) { + punycode.hasOwnProperty(key) && + (freeExports[key] = punycode[key]); + } + } + } else { + // in Rhino or a web browser + root.punycode = punycode; + } + })(this); + }.call( + this, + typeof global !== "undefined" + ? global + : typeof self !== "undefined" + ? self + : typeof window !== "undefined" + ? window + : {} + )); + }, + {} + ], + 114: [ + function(require, module, exports) { + // Copyright Joyent, Inc. and other Node contributors. + // + // Permission is hereby granted, free of charge, to any person obtaining a + // copy of this software and associated documentation files (the + // "Software"), to deal in the Software without restriction, including + // without limitation the rights to use, copy, modify, merge, publish, + // distribute, sublicense, and/or sell copies of the Software, and to permit + // persons to whom the Software is furnished to do so, subject to the + // following conditions: + // + // The above copyright notice and this permission notice shall be included + // in all copies or substantial portions of the Software. + // + // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + // USE OR OTHER DEALINGS IN THE SOFTWARE. + + "use strict"; + + // If obj.hasOwnProperty has been overridden, then calling + // obj.hasOwnProperty(prop) will break. + // See: https://github.com/joyent/node/issues/1707 + function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); + } + + module.exports = function(qs, sep, eq, options) { + sep = sep || "&"; + eq = eq || "="; + var obj = {}; + + if (typeof qs !== "string" || qs.length === 0) { + return obj; + } + + var regexp = /\+/g; + qs = qs.split(sep); + + var maxKeys = 1000; + if (options && typeof options.maxKeys === "number") { + maxKeys = options.maxKeys; + } + + var len = qs.length; + // maxKeys <= 0 means that we should not limit keys count + if (maxKeys > 0 && len > maxKeys) { + len = maxKeys; + } + + for (var i = 0; i < len; ++i) { + var x = qs[i].replace(regexp, "%20"), + idx = x.indexOf(eq), + kstr, + vstr, + k, + v; + + if (idx >= 0) { + kstr = x.substr(0, idx); + vstr = x.substr(idx + 1); + } else { + kstr = x; + vstr = ""; + } + + k = decodeURIComponent(kstr); + v = decodeURIComponent(vstr); + + if (!hasOwnProperty(obj, k)) { + obj[k] = v; + } else if (isArray(obj[k])) { + obj[k].push(v); + } else { + obj[k] = [obj[k], v]; + } + } + + return obj; + }; + + var isArray = + Array.isArray || + function(xs) { + return Object.prototype.toString.call(xs) === "[object Array]"; + }; + }, + {} + ], + 115: [ + function(require, module, exports) { + // Copyright Joyent, Inc. and other Node contributors. + // + // Permission is hereby granted, free of charge, to any person obtaining a + // copy of this software and associated documentation files (the + // "Software"), to deal in the Software without restriction, including + // without limitation the rights to use, copy, modify, merge, publish, + // distribute, sublicense, and/or sell copies of the Software, and to permit + // persons to whom the Software is furnished to do so, subject to the + // following conditions: + // + // The above copyright notice and this permission notice shall be included + // in all copies or substantial portions of the Software. + // + // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + // USE OR OTHER DEALINGS IN THE SOFTWARE. + + "use strict"; + + var stringifyPrimitive = function(v) { + switch (typeof v) { + case "string": + return v; + + case "boolean": + return v ? "true" : "false"; + + case "number": + return isFinite(v) ? v : ""; + + default: + return ""; + } + }; + + module.exports = function(obj, sep, eq, name) { + sep = sep || "&"; + eq = eq || "="; + if (obj === null) { + obj = undefined; + } + + if (typeof obj === "object") { + return map(objectKeys(obj), function(k) { + var ks = encodeURIComponent(stringifyPrimitive(k)) + eq; + if (isArray(obj[k])) { + return map(obj[k], function(v) { + return ks + encodeURIComponent(stringifyPrimitive(v)); + }).join(sep); + } else { + return ks + encodeURIComponent(stringifyPrimitive(obj[k])); + } + }).join(sep); + } + + if (!name) return ""; + return ( + encodeURIComponent(stringifyPrimitive(name)) + + eq + + encodeURIComponent(stringifyPrimitive(obj)) + ); + }; + + var isArray = + Array.isArray || + function(xs) { + return Object.prototype.toString.call(xs) === "[object Array]"; + }; + + function map(xs, f) { + if (xs.map) return xs.map(f); + var res = []; + for (var i = 0; i < xs.length; i++) { + res.push(f(xs[i], i)); + } + return res; + } + + var objectKeys = + Object.keys || + function(obj) { + var res = []; + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key); + } + return res; + }; + }, + {} + ], + 116: [ + function(require, module, exports) { + "use strict"; + + exports.decode = exports.parse = require("./decode"); + exports.encode = exports.stringify = require("./encode"); + }, + { "./decode": 114, "./encode": 115 } + ], + 117: [ + function(require, module, exports) { + // Copyright Joyent, Inc. and other Node contributors. + // + // Permission is hereby granted, free of charge, to any person obtaining a + // copy of this software and associated documentation files (the + // "Software"), to deal in the Software without restriction, including + // without limitation the rights to use, copy, modify, merge, publish, + // distribute, sublicense, and/or sell copies of the Software, and to permit + // persons to whom the Software is furnished to do so, subject to the + // following conditions: + // + // The above copyright notice and this permission notice shall be included + // in all copies or substantial portions of the Software. + // + // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + // USE OR OTHER DEALINGS IN THE SOFTWARE. + + // a duplex stream is just a stream that is both readable and writable. + // Since JS doesn't have multiple prototypal inheritance, this class + // prototypally inherits from Readable, and then parasitically from + // Writable. + + "use strict"; + + /**/ + + var pna = require("process-nextick-args"); + /**/ + + /**/ + var objectKeys = + Object.keys || + function(obj) { + var keys = []; + for (var key in obj) { + keys.push(key); + } + return keys; + }; + /**/ + + module.exports = Duplex; + + /**/ + var util = require("core-util-is"); + util.inherits = require("inherits"); + /**/ + + var Readable = require("./_stream_readable"); + var Writable = require("./_stream_writable"); + + util.inherits(Duplex, Readable); + + { + // avoid scope creep, the keys array can then be collected + var keys = objectKeys(Writable.prototype); + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) + Duplex.prototype[method] = Writable.prototype[method]; + } + } + + function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) this.readable = false; + + if (options && options.writable === false) this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) + this.allowHalfOpen = false; + + this.once("end", onend); + } + + Object.defineProperty(Duplex.prototype, "writableHighWaterMark", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function() { + return this._writableState.highWaterMark; + } + }); + + // the no-half-open enforcer + function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) return; + + // no more data can be written. + // But allow more writes to happen in this tick. + pna.nextTick(onEndNT, this); + } + + function onEndNT(self) { + self.end(); + } + + Object.defineProperty(Duplex.prototype, "destroyed", { + get: function() { + if ( + this._readableState === undefined || + this._writableState === undefined + ) { + return false; + } + return ( + this._readableState.destroyed && this._writableState.destroyed + ); + }, + set: function(value) { + // we ignore the value if the stream + // has not been initialized yet + if ( + this._readableState === undefined || + this._writableState === undefined + ) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } + }); + + Duplex.prototype._destroy = function(err, cb) { + this.push(null); + this.end(); + + pna.nextTick(cb, err); + }; + }, + { + "./_stream_readable": 119, + "./_stream_writable": 121, + "core-util-is": 101, + inherits: 106, + "process-nextick-args": 111 + } + ], + 118: [ + function(require, module, exports) { + // Copyright Joyent, Inc. and other Node contributors. + // + // Permission is hereby granted, free of charge, to any person obtaining a + // copy of this software and associated documentation files (the + // "Software"), to deal in the Software without restriction, including + // without limitation the rights to use, copy, modify, merge, publish, + // distribute, sublicense, and/or sell copies of the Software, and to permit + // persons to whom the Software is furnished to do so, subject to the + // following conditions: + // + // The above copyright notice and this permission notice shall be included + // in all copies or substantial portions of the Software. + // + // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + // USE OR OTHER DEALINGS IN THE SOFTWARE. + + // a passthrough stream. + // basically just the most minimal sort of Transform stream. + // Every written chunk gets output as-is. + + "use strict"; + + module.exports = PassThrough; + + var Transform = require("./_stream_transform"); + + /**/ + var util = require("core-util-is"); + util.inherits = require("inherits"); + /**/ + + util.inherits(PassThrough, Transform); + + function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + + Transform.call(this, options); + } + + PassThrough.prototype._transform = function(chunk, encoding, cb) { + cb(null, chunk); + }; + }, + { "./_stream_transform": 120, "core-util-is": 101, inherits: 106 } + ], + 119: [ + function(require, module, exports) { + (function(process, global) { + // Copyright Joyent, Inc. and other Node contributors. + // + // Permission is hereby granted, free of charge, to any person obtaining a + // copy of this software and associated documentation files (the + // "Software"), to deal in the Software without restriction, including + // without limitation the rights to use, copy, modify, merge, publish, + // distribute, sublicense, and/or sell copies of the Software, and to permit + // persons to whom the Software is furnished to do so, subject to the + // following conditions: + // + // The above copyright notice and this permission notice shall be included + // in all copies or substantial portions of the Software. + // + // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + // USE OR OTHER DEALINGS IN THE SOFTWARE. + + "use strict"; + + /**/ + + var pna = require("process-nextick-args"); + /**/ + + module.exports = Readable; + + /**/ + var isArray = require("isarray"); + /**/ + + /**/ + var Duplex; + /**/ + + Readable.ReadableState = ReadableState; + + /**/ + var EE = require("events").EventEmitter; + + var EElistenerCount = function(emitter, type) { + return emitter.listeners(type).length; + }; + /**/ + + /**/ + var Stream = require("./internal/streams/stream"); + /**/ + + /**/ + + var Buffer = require("safe-buffer").Buffer; + var OurUint8Array = global.Uint8Array || function() {}; + function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); + } + function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; + } + + /**/ + + /**/ + var util = require("core-util-is"); + util.inherits = require("inherits"); + /**/ + + /**/ + var debugUtil = require("util"); + var debug = void 0; + if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog("stream"); + } else { + debug = function() {}; + } + /**/ + + var BufferList = require("./internal/streams/BufferList"); + var destroyImpl = require("./internal/streams/destroy"); + var StringDecoder; + + util.inherits(Readable, Stream); + + var kProxyEvents = ["error", "close", "destroy", "pause", "resume"]; + + function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === "function") + return emitter.prependListener(event, fn); + + // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) + emitter.on(event, fn); + else if (isArray(emitter._events[event])) + emitter._events[event].unshift(fn); + else emitter._events[event] = [fn, emitter._events[event]]; + } + + function ReadableState(options, stream) { + Duplex = Duplex || require("./_stream_duplex"); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + if (isDuplex) + this.objectMode = this.objectMode || !!options.readableObjectMode; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + var readableHwm = options.readableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm; + else if (isDuplex && (readableHwm || readableHwm === 0)) + this.highWaterMark = readableHwm; + else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // a flag to be able to tell if the event 'readable'/'data' is emitted + // immediately, or on a later tick. We set this to true at first, because + // any actions that shouldn't happen until "later" should generally also + // not happen before the first read call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + + // has it been destroyed + this.destroyed = false; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || "utf8"; + + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + + // if true, a maybeReadMore has been scheduled + this.readingMore = false; + + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) + StringDecoder = require("string_decoder/").StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } + } + + function Readable(options) { + Duplex = Duplex || require("./_stream_duplex"); + + if (!(this instanceof Readable)) return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + if (options) { + if (typeof options.read === "function") this._read = options.read; + + if (typeof options.destroy === "function") + this._destroy = options.destroy; + } + + Stream.call(this); + } + + Object.defineProperty(Readable.prototype, "destroyed", { + get: function() { + if (this._readableState === undefined) { + return false; + } + return this._readableState.destroyed; + }, + set: function(value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._readableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + } + }); + + Readable.prototype.destroy = destroyImpl.destroy; + Readable.prototype._undestroy = destroyImpl.undestroy; + Readable.prototype._destroy = function(err, cb) { + this.push(null); + cb(err); + }; + + // Manually shove something into the read() buffer. + // This returns true if the highWaterMark has not been hit yet, + // similar to how Writable.write() returns true if you should + // write() some more. + Readable.prototype.push = function(chunk, encoding) { + var state = this._readableState; + var skipChunkCheck; + + if (!state.objectMode) { + if (typeof chunk === "string") { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = Buffer.from(chunk, encoding); + encoding = ""; + } + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } + + return readableAddChunk( + this, + chunk, + encoding, + false, + skipChunkCheck + ); + }; + + // Unshift should *always* be something directly out of read() + Readable.prototype.unshift = function(chunk) { + return readableAddChunk(this, chunk, null, true, false); + }; + + function readableAddChunk( + stream, + chunk, + encoding, + addToFront, + skipChunkCheck + ) { + var state = stream._readableState; + if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else { + var er; + if (!skipChunkCheck) er = chunkInvalid(state, chunk); + if (er) { + stream.emit("error", er); + } else if (state.objectMode || (chunk && chunk.length > 0)) { + if ( + typeof chunk !== "string" && + !state.objectMode && + Object.getPrototypeOf(chunk) !== Buffer.prototype + ) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (addToFront) { + if (state.endEmitted) + stream.emit( + "error", + new Error("stream.unshift() after end event") + ); + else addChunk(stream, state, chunk, true); + } else if (state.ended) { + stream.emit("error", new Error("stream.push() after EOF")); + } else { + state.reading = false; + if (state.decoder && !encoding) { + chunk = state.decoder.write(chunk); + if (state.objectMode || chunk.length !== 0) + addChunk(stream, state, chunk, false); + else maybeReadMore(stream, state); + } else { + addChunk(stream, state, chunk, false); + } + } + } else if (!addToFront) { + state.reading = false; + } + } + + return needMoreData(state); + } + + function addChunk(stream, state, chunk, addToFront) { + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit("data", chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk); + else state.buffer.push(chunk); + + if (state.needReadable) emitReadable(stream); + } + maybeReadMore(stream, state); + } + + function chunkInvalid(state, chunk) { + var er; + if ( + !_isUint8Array(chunk) && + typeof chunk !== "string" && + chunk !== undefined && + !state.objectMode + ) { + er = new TypeError("Invalid non-string/buffer chunk"); + } + return er; + } + + // if it's past the high water mark, we can push in some more. + // Also, if we have no data yet, we can stand some + // more bytes. This is to work around cases where hwm=0, + // such as the repl. Also, if the push() triggered a + // readable event, and the user called read(largeNumber) such that + // needReadable was set, then we ought to push more, so that another + // 'readable' event will be triggered. + function needMoreData(state) { + return ( + !state.ended && + (state.needReadable || + state.length < state.highWaterMark || + state.length === 0) + ); + } + + Readable.prototype.isPaused = function() { + return this._readableState.flowing === false; + }; + + // backwards compatibility. + Readable.prototype.setEncoding = function(enc) { + if (!StringDecoder) + StringDecoder = require("string_decoder/").StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; + }; + + // Don't raise the hwm > 8MB + var MAX_HWM = 0x800000; + function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; + } + + // This function is designed to be inlinable, so please take care when making + // changes to the function body. + function howMuchToRead(n, state) { + if (n <= 0 || (state.length === 0 && state.ended)) return 0; + if (state.objectMode) return 1; + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) + return state.buffer.head.data.length; + else return state.length; + } + // If we're asking for more than the current hwm, then raise the hwm. + if (n > state.highWaterMark) + state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; + // Don't have enough + if (!state.ended) { + state.needReadable = true; + return 0; + } + return state.length; + } + + // you can override either this method, or the async _read(n) below. + Readable.prototype.read = function(n) { + debug("read", n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + + if (n !== 0) state.emittedReadable = false; + + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if ( + n === 0 && + state.needReadable && + (state.length >= state.highWaterMark || state.ended) + ) { + debug("read: emitReadable", state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this); + else emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); + + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + debug("need readable", doRead); + + // if we currently have less than the highWaterMark, then also read some + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug("length less than watermark", doRead); + } + + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) { + doRead = false; + debug("reading or ended", doRead); + } else if (doRead) { + debug("do read"); + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (!state.reading) n = howMuchToRead(nOrig, state); + } + + var ret; + if (n > 0) ret = fromList(n, state); + else ret = null; + + if (ret === null) { + state.needReadable = true; + n = 0; + } else { + state.length -= n; + } + + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; + + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended) endReadable(this); + } + + if (ret !== null) this.emit("data", ret); + + return ret; + }; + + function onEofChunk(stream, state) { + if (state.ended) return; + if (state.decoder) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); + } + + // Don't emit readable right away in sync mode, because this can trigger + // another read() call => stack overflow. This way, it might trigger + // a nextTick recursion warning, but that's not so bad. + function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug("emitReadable", state.flowing); + state.emittedReadable = true; + if (state.sync) pna.nextTick(emitReadable_, stream); + else emitReadable_(stream); + } + } + + function emitReadable_(stream) { + debug("emit readable"); + stream.emit("readable"); + flow(stream); + } + + // at this point, the user has presumably seen the 'readable' event, + // and called read() to consume some data. that may have triggered + // in turn another _read(n) call, in which case reading = true if + // it's in progress. + // However, if we're not ended, or reading, and the length < hwm, + // then go ahead and try to read some more preemptively. + function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + pna.nextTick(maybeReadMore_, stream, state); + } + } + + function maybeReadMore_(stream, state) { + var len = state.length; + while ( + !state.reading && + !state.flowing && + !state.ended && + state.length < state.highWaterMark + ) { + debug("maybeReadMore read 0"); + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break; + else len = state.length; + } + state.readingMore = false; + } + + // abstract method. to be overridden in specific implementation classes. + // call cb(er, data) where data is <= n in length. + // for virtual (non-string, non-buffer) streams, "length" is somewhat + // arbitrary, and perhaps not very meaningful. + Readable.prototype._read = function(n) { + this.emit("error", new Error("_read() is not implemented")); + }; + + Readable.prototype.pipe = function(dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug("pipe count=%d opts=%j", state.pipesCount, pipeOpts); + + var doEnd = + (!pipeOpts || pipeOpts.end !== false) && + dest !== process.stdout && + dest !== process.stderr; + + var endFn = doEnd ? onend : unpipe; + if (state.endEmitted) pna.nextTick(endFn); + else src.once("end", endFn); + + dest.on("unpipe", onunpipe); + function onunpipe(readable, unpipeInfo) { + debug("onunpipe"); + if (readable === src) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + cleanup(); + } + } + } + + function onend() { + debug("onend"); + dest.end(); + } + + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on("drain", ondrain); + + var cleanedUp = false; + function cleanup() { + debug("cleanup"); + // cleanup event handlers once the pipe is broken + dest.removeListener("close", onclose); + dest.removeListener("finish", onfinish); + dest.removeListener("drain", ondrain); + dest.removeListener("error", onerror); + dest.removeListener("unpipe", onunpipe); + src.removeListener("end", onend); + src.removeListener("end", unpipe); + src.removeListener("data", ondata); + + cleanedUp = true; + + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if ( + state.awaitDrain && + (!dest._writableState || dest._writableState.needDrain) + ) + ondrain(); + } + + // If the user pushes more data while we're writing to dest then we'll end up + // in ondata again. However, we only want to increase awaitDrain once because + // dest will only emit one 'drain' event for the multiple writes. + // => Introduce a guard on increasing awaitDrain. + var increasedAwaitDrain = false; + src.on("data", ondata); + function ondata(chunk) { + debug("ondata"); + increasedAwaitDrain = false; + var ret = dest.write(chunk); + if (false === ret && !increasedAwaitDrain) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ( + ((state.pipesCount === 1 && state.pipes === dest) || + (state.pipesCount > 1 && + indexOf(state.pipes, dest) !== -1)) && + !cleanedUp + ) { + debug( + "false write response, pause", + src._readableState.awaitDrain + ); + src._readableState.awaitDrain++; + increasedAwaitDrain = true; + } + src.pause(); + } + } + + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + debug("onerror", er); + unpipe(); + dest.removeListener("error", onerror); + if (EElistenerCount(dest, "error") === 0) dest.emit("error", er); + } + + // Make sure our error handler is attached before userland ones. + prependListener(dest, "error", onerror); + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener("finish", onfinish); + unpipe(); + } + dest.once("close", onclose); + function onfinish() { + debug("onfinish"); + dest.removeListener("close", onclose); + unpipe(); + } + dest.once("finish", onfinish); + + function unpipe() { + debug("unpipe"); + src.unpipe(dest); + } + + // tell the dest that it's being piped to + dest.emit("pipe", src); + + // start the flow if it hasn't been started already. + if (!state.flowing) { + debug("pipe resume"); + src.resume(); + } + + return dest; + }; + + function pipeOnDrain(src) { + return function() { + var state = src._readableState; + debug("pipeOnDrain", state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + if (state.awaitDrain === 0 && EElistenerCount(src, "data")) { + state.flowing = true; + flow(src); + } + }; + } + + Readable.prototype.unpipe = function(dest) { + var state = this._readableState; + var unpipeInfo = { hasUnpiped: false }; + + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) return this; + + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + + if (!dest) dest = state.pipes; + + // got a match. + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit("unpipe", this, unpipeInfo); + return this; + } + + // slow case. multiple pipe destinations. + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var i = 0; i < len; i++) { + dests[i].emit("unpipe", this, unpipeInfo); + } + return this; + } + + // try to find the right one. + var index = indexOf(state.pipes, dest); + if (index === -1) return this; + + state.pipes.splice(index, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + + dest.emit("unpipe", this, unpipeInfo); + + return this; + }; + + // set up data events if they are asked for + // Ensure readable listeners eventually get something + Readable.prototype.on = function(ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + + if (ev === "data") { + // Start flowing on next tick if stream isn't explicitly paused + if (this._readableState.flowing !== false) this.resume(); + } else if (ev === "readable") { + var state = this._readableState; + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.emittedReadable = false; + if (!state.reading) { + pna.nextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this); + } + } + } + + return res; + }; + Readable.prototype.addListener = Readable.prototype.on; + + function nReadingNextTick(self) { + debug("readable nexttick read 0"); + self.read(0); + } + + // pause() and resume() are remnants of the legacy readable stream API + // If the user uses them, then switch into old mode. + Readable.prototype.resume = function() { + var state = this._readableState; + if (!state.flowing) { + debug("resume"); + state.flowing = true; + resume(this, state); + } + return this; + }; + + function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + pna.nextTick(resume_, stream, state); + } + } + + function resume_(stream, state) { + if (!state.reading) { + debug("resume read 0"); + stream.read(0); + } + + state.resumeScheduled = false; + state.awaitDrain = 0; + stream.emit("resume"); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); + } + + Readable.prototype.pause = function() { + debug("call pause flowing=%j", this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug("pause"); + this._readableState.flowing = false; + this.emit("pause"); + } + return this; + }; + + function flow(stream) { + var state = stream._readableState; + debug("flow", state.flowing); + while (state.flowing && stream.read() !== null) {} + } + + // wrap an old-style stream as the async data source. + // This is *not* part of the readable stream interface. + // It is an ugly unfortunate mess of history. + Readable.prototype.wrap = function(stream) { + var _this = this; + + var state = this._readableState; + var paused = false; + + stream.on("end", function() { + debug("wrapped end"); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) _this.push(chunk); + } + + _this.push(null); + }); + + stream.on("data", function(chunk) { + debug("wrapped data"); + if (state.decoder) chunk = state.decoder.write(chunk); + + // don't skip over falsy values in objectMode + if (state.objectMode && (chunk === null || chunk === undefined)) + return; + else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = _this.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === "function") { + this[i] = (function(method) { + return function() { + return stream[method].apply(stream, arguments); + }; + })(i); + } + } + + // proxy certain important events. + for (var n = 0; n < kProxyEvents.length; n++) { + stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + } + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + this._read = function(n) { + debug("wrapped _read", n); + if (paused) { + paused = false; + stream.resume(); + } + }; + + return this; + }; + + Object.defineProperty(Readable.prototype, "readableHighWaterMark", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function() { + return this._readableState.highWaterMark; + } + }); + + // exposed for testing purposes only. + Readable._fromList = fromList; + + // Pluck off n bytes from an array of buffers. + // Length is the combined lengths of all the buffers in the list. + // This function is designed to be inlinable, so please take care when making + // changes to the function body. + function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; + + var ret; + if (state.objectMode) ret = state.buffer.shift(); + else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join(""); + else if (state.buffer.length === 1) ret = state.buffer.head.data; + else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = fromListPartial(n, state.buffer, state.decoder); + } + + return ret; + } + + // Extracts only enough buffered data to satisfy the amount requested. + // This function is designed to be inlinable, so please take care when making + // changes to the function body. + function fromListPartial(n, list, hasStrings) { + var ret; + if (n < list.head.data.length) { + // slice is the same for buffers and strings + ret = list.head.data.slice(0, n); + list.head.data = list.head.data.slice(n); + } else if (n === list.head.data.length) { + // first chunk is a perfect match + ret = list.shift(); + } else { + // result spans more than one buffer + ret = hasStrings + ? copyFromBufferString(n, list) + : copyFromBuffer(n, list); + } + return ret; + } + + // Copies a specified amount of characters from the list of buffered data + // chunks. + // This function is designed to be inlinable, so please take care when making + // changes to the function body. + function copyFromBufferString(n, list) { + var p = list.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while ((p = p.next)) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str; + else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) list.head = p.next; + else list.head = list.tail = null; + } else { + list.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; + } + + // Copies a specified amount of bytes from the list of buffered data chunks. + // This function is designed to be inlinable, so please take care when making + // changes to the function body. + function copyFromBuffer(n, list) { + var ret = Buffer.allocUnsafe(n); + var p = list.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while ((p = p.next)) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) list.head = p.next; + else list.head = list.tail = null; + } else { + list.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; + } + + function endReadable(stream) { + var state = stream._readableState; + + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) + throw new Error('"endReadable()" called on non-empty stream'); + + if (!state.endEmitted) { + state.ended = true; + pna.nextTick(endReadableNT, state, stream); + } + } + + function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit("end"); + } + } + + function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; + } + }.call( + this, + require("_process"), + typeof global !== "undefined" + ? global + : typeof self !== "undefined" + ? self + : typeof window !== "undefined" + ? window + : {} + )); + }, + { + "./_stream_duplex": 117, + "./internal/streams/BufferList": 122, + "./internal/streams/destroy": 123, + "./internal/streams/stream": 124, + _process: 112, + "core-util-is": 101, + events: 102, + inherits: 106, + isarray: 108, + "process-nextick-args": 111, + "safe-buffer": 144, + "string_decoder/": 125, + util: 2 + } + ], + 120: [ + function(require, module, exports) { + // Copyright Joyent, Inc. and other Node contributors. + // + // Permission is hereby granted, free of charge, to any person obtaining a + // copy of this software and associated documentation files (the + // "Software"), to deal in the Software without restriction, including + // without limitation the rights to use, copy, modify, merge, publish, + // distribute, sublicense, and/or sell copies of the Software, and to permit + // persons to whom the Software is furnished to do so, subject to the + // following conditions: + // + // The above copyright notice and this permission notice shall be included + // in all copies or substantial portions of the Software. + // + // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + // USE OR OTHER DEALINGS IN THE SOFTWARE. + + // a transform stream is a readable/writable stream where you do + // something with the data. Sometimes it's called a "filter", + // but that's not a great name for it, since that implies a thing where + // some bits pass through, and others are simply ignored. (That would + // be a valid example of a transform, of course.) + // + // While the output is causally related to the input, it's not a + // necessarily symmetric or synchronous transformation. For example, + // a zlib stream might take multiple plain-text writes(), and then + // emit a single compressed chunk some time in the future. + // + // Here's how this works: + // + // The Transform stream has all the aspects of the readable and writable + // stream classes. When you write(chunk), that calls _write(chunk,cb) + // internally, and returns false if there's a lot of pending writes + // buffered up. When you call read(), that calls _read(n) until + // there's enough pending readable data buffered up. + // + // In a transform stream, the written data is placed in a buffer. When + // _read(n) is called, it transforms the queued up data, calling the + // buffered _write cb's as it consumes chunks. If consuming a single + // written chunk would result in multiple output chunks, then the first + // outputted bit calls the readcb, and subsequent chunks just go into + // the read buffer, and will cause it to emit 'readable' if necessary. + // + // This way, back-pressure is actually determined by the reading side, + // since _read has to be called to start processing a new chunk. However, + // a pathological inflate type of transform can cause excessive buffering + // here. For example, imagine a stream where every byte of input is + // interpreted as an integer from 0-255, and then results in that many + // bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in + // 1kb of data being output. In this case, you could write a very small + // amount of input, and end up with a very large amount of output. In + // such a pathological inflating mechanism, there'd be no way to tell + // the system to stop doing the transform. A single 4MB write could + // cause the system to run out of memory. + // + // However, even in such a pathological case, only a single written chunk + // would be consumed, and then the rest would wait (un-transformed) until + // the results of the previous transformed chunk were consumed. + + "use strict"; + + module.exports = Transform; + + var Duplex = require("./_stream_duplex"); + + /**/ + var util = require("core-util-is"); + util.inherits = require("inherits"); + /**/ + + util.inherits(Transform, Duplex); + + function afterTransform(er, data) { + var ts = this._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) { + return this.emit( + "error", + new Error("write callback called multiple times") + ); + } + + ts.writechunk = null; + ts.writecb = null; + + if (data != null) + // single equals check for both `null` and `undefined` + this.push(data); + + cb(er); + + var rs = this._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } + } + + function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + + Duplex.call(this, options); + + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null + }; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === "function") + this._transform = options.transform; + + if (typeof options.flush === "function") + this._flush = options.flush; + } + + // When the writable side finishes, then flush out anything remaining. + this.on("prefinish", prefinish); + } + + function prefinish() { + var _this = this; + + if (typeof this._flush === "function") { + this._flush(function(er, data) { + done(_this, er, data); + }); + } else { + done(this, null, null); + } + } + + Transform.prototype.push = function(chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); + }; + + // This is the part where you do stuff! + // override this function in implementation classes. + // 'chunk' is an input chunk. + // + // Call `push(newChunk)` to pass along transformed output + // to the readable side. You may call 'push' zero or more times. + // + // Call `cb(err)` when you are done with this chunk. If you pass + // an error, then that'll put the hurt on the whole operation. If you + // never call cb(), then you'll never get another chunk. + Transform.prototype._transform = function(chunk, encoding, cb) { + throw new Error("_transform() is not implemented"); + }; + + Transform.prototype._write = function(chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if ( + ts.needTransform || + rs.needReadable || + rs.length < rs.highWaterMark + ) + this._read(rs.highWaterMark); + } + }; + + // Doesn't matter what the args are here. + // _transform does all the work. + // That we got here means that the readable side wants more data. + Transform.prototype._read = function(n) { + var ts = this._transformState; + + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } + }; + + Transform.prototype._destroy = function(err, cb) { + var _this2 = this; + + Duplex.prototype._destroy.call(this, err, function(err2) { + cb(err2); + _this2.emit("close"); + }); + }; + + function done(stream, er, data) { + if (er) return stream.emit("error", er); + + if (data != null) + // single equals check for both `null` and `undefined` + stream.push(data); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + if (stream._writableState.length) + throw new Error("Calling transform done when ws.length != 0"); + + if (stream._transformState.transforming) + throw new Error("Calling transform done when still transforming"); + + return stream.push(null); + } + }, + { "./_stream_duplex": 117, "core-util-is": 101, inherits: 106 } + ], + 121: [ + function(require, module, exports) { + (function(process, global, setImmediate) { + // Copyright Joyent, Inc. and other Node contributors. + // + // Permission is hereby granted, free of charge, to any person obtaining a + // copy of this software and associated documentation files (the + // "Software"), to deal in the Software without restriction, including + // without limitation the rights to use, copy, modify, merge, publish, + // distribute, sublicense, and/or sell copies of the Software, and to permit + // persons to whom the Software is furnished to do so, subject to the + // following conditions: + // + // The above copyright notice and this permission notice shall be included + // in all copies or substantial portions of the Software. + // + // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + // USE OR OTHER DEALINGS IN THE SOFTWARE. + + // A bit simpler than readable streams. + // Implement an async ._write(chunk, encoding, cb), and it'll handle all + // the drain event emission and buffering. + + "use strict"; + + /**/ + + var pna = require("process-nextick-args"); + /**/ + + module.exports = Writable; + + /* */ + function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; + } + + // It seems a linked list but it is not + // there will be only 2 of these for each stream + function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + this.finish = function() { + onCorkedFinish(_this, state); + }; + } + /* */ + + /**/ + var asyncWrite = + !process.browser && + ["v0.10", "v0.9."].indexOf(process.version.slice(0, 5)) > -1 + ? setImmediate + : pna.nextTick; + /**/ + + /**/ + var Duplex; + /**/ + + Writable.WritableState = WritableState; + + /**/ + var util = require("core-util-is"); + util.inherits = require("inherits"); + /**/ + + /**/ + var internalUtil = { + deprecate: require("util-deprecate") + }; + /**/ + + /**/ + var Stream = require("./internal/streams/stream"); + /**/ + + /**/ + + var Buffer = require("safe-buffer").Buffer; + var OurUint8Array = global.Uint8Array || function() {}; + function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); + } + function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; + } + + /**/ + + var destroyImpl = require("./internal/streams/destroy"); + + util.inherits(Writable, Stream); + + function nop() {} + + function WritableState(options, stream) { + Duplex = Duplex || require("./_stream_duplex"); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + if (isDuplex) + this.objectMode = this.objectMode || !!options.writableObjectMode; + + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + var writableHwm = options.writableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm; + else if (isDuplex && (writableHwm || writableHwm === 0)) + this.highWaterMark = writableHwm; + else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // if _final has been called + this.finalCalled = false; + + // drain event flag. + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; + + // has it been destroyed + this.destroyed = false; + + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || "utf8"; + + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // a flag to see when we're in the middle of a write. + this.writing = false; + + // when true all writes will be buffered until .uncork() call + this.corked = 0; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // the callback that's passed to _write(chunk,cb) + this.onwrite = function(er) { + onwrite(stream, er); + }; + + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; + + // the amount that is being written when _write is called. + this.writelen = 0; + + this.bufferedRequest = null; + this.lastBufferedRequest = null; + + // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; + + // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + this.prefinished = false; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; + + // count buffered requests + this.bufferedRequestCount = 0; + + // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + this.corkedRequestsFree = new CorkedRequest(this); + } + + WritableState.prototype.getBuffer = function getBuffer() { + var current = this.bufferedRequest; + var out = []; + while (current) { + out.push(current); + current = current.next; + } + return out; + }; + + (function() { + try { + Object.defineProperty(WritableState.prototype, "buffer", { + get: internalUtil.deprecate( + function() { + return this.getBuffer(); + }, + "_writableState.buffer is deprecated. Use _writableState.getBuffer " + + "instead.", + "DEP0003" + ) + }); + } catch (_) {} + })(); + + // Test _writableState for inheritance to account for Duplex streams, + // whose prototype chain only points to Readable. + var realHasInstance; + if ( + typeof Symbol === "function" && + Symbol.hasInstance && + typeof Function.prototype[Symbol.hasInstance] === "function" + ) { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function(object) { + if (realHasInstance.call(this, object)) return true; + if (this !== Writable) return false; + + return object && object._writableState instanceof WritableState; + } + }); + } else { + realHasInstance = function(object) { + return object instanceof this; + }; + } + + function Writable(options) { + Duplex = Duplex || require("./_stream_duplex"); + + // Writable ctor is applied to Duplexes, too. + // `realHasInstance` is necessary because using plain `instanceof` + // would return false, as no `_writableState` property is attached. + + // Trying to use the custom `instanceof` for Writable here will also break the + // Node.js LazyTransform implementation, which has a non-trivial getter for + // `_writableState` that would lead to infinite recursion. + if ( + !realHasInstance.call(Writable, this) && + !(this instanceof Duplex) + ) { + return new Writable(options); + } + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + if (options) { + if (typeof options.write === "function") + this._write = options.write; + + if (typeof options.writev === "function") + this._writev = options.writev; + + if (typeof options.destroy === "function") + this._destroy = options.destroy; + + if (typeof options.final === "function") + this._final = options.final; + } + + Stream.call(this); + } + + // Otherwise people can pipe Writable streams, which is just wrong. + Writable.prototype.pipe = function() { + this.emit("error", new Error("Cannot pipe, not readable")); + }; + + function writeAfterEnd(stream, cb) { + var er = new Error("write after end"); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit("error", er); + pna.nextTick(cb, er); + } + + // Checks that a user-supplied chunk is valid, especially for the particular + // mode the stream is in. Currently this means that `null` is never accepted + // and undefined/non-string values are only allowed in object mode. + function validChunk(stream, state, chunk, cb) { + var valid = true; + var er = false; + + if (chunk === null) { + er = new TypeError("May not write null values to stream"); + } else if ( + typeof chunk !== "string" && + chunk !== undefined && + !state.objectMode + ) { + er = new TypeError("Invalid non-string/buffer chunk"); + } + if (er) { + stream.emit("error", er); + pna.nextTick(cb, er); + valid = false; + } + return valid; + } + + Writable.prototype.write = function(chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + var isBuf = !state.objectMode && _isUint8Array(chunk); + + if (isBuf && !Buffer.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (typeof encoding === "function") { + cb = encoding; + encoding = null; + } + + if (isBuf) encoding = "buffer"; + else if (!encoding) encoding = state.defaultEncoding; + + if (typeof cb !== "function") cb = nop; + + if (state.ended) writeAfterEnd(this, cb); + else if (isBuf || validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); + } + + return ret; + }; + + Writable.prototype.cork = function() { + var state = this._writableState; + + state.corked++; + }; + + Writable.prototype.uncork = function() { + var state = this._writableState; + + if (state.corked) { + state.corked--; + + if ( + !state.writing && + !state.corked && + !state.finished && + !state.bufferProcessing && + state.bufferedRequest + ) + clearBuffer(this, state); + } + }; + + Writable.prototype.setDefaultEncoding = function setDefaultEncoding( + encoding + ) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === "string") encoding = encoding.toLowerCase(); + if ( + !( + [ + "hex", + "utf8", + "utf-8", + "ascii", + "binary", + "base64", + "ucs2", + "ucs-2", + "utf16le", + "utf-16le", + "raw" + ].indexOf((encoding + "").toLowerCase()) > -1 + ) + ) + throw new TypeError("Unknown encoding: " + encoding); + this._writableState.defaultEncoding = encoding; + return this; + }; + + function decodeChunk(state, chunk, encoding) { + if ( + !state.objectMode && + state.decodeStrings !== false && + typeof chunk === "string" + ) { + chunk = Buffer.from(chunk, encoding); + } + return chunk; + } + + Object.defineProperty(Writable.prototype, "writableHighWaterMark", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function() { + return this._writableState.highWaterMark; + } + }); + + // if we're already writing something, then just put this + // in the queue, and wait our turn. Otherwise, call _write + // If we return false, then we need a drain event, so set that flag. + function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state, chunk, encoding); + if (chunk !== newChunk) { + isBuf = true; + encoding = "buffer"; + chunk = newChunk; + } + } + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = { + chunk: chunk, + encoding: encoding, + isBuf: isBuf, + callback: cb, + next: null + }; + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; + } + + function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) stream._writev(chunk, state.onwrite); + else stream._write(chunk, encoding, state.onwrite); + state.sync = false; + } + + function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + + if (sync) { + // defer the callback if we are being called synchronously + // to avoid piling up things on the stack + pna.nextTick(cb, er); + // this can emit finish, and it will always happen + // after error + pna.nextTick(finishMaybe, stream, state); + stream._writableState.errorEmitted = true; + stream.emit("error", er); + } else { + // the caller expect this to happen before if + // it is async + cb(er); + stream._writableState.errorEmitted = true; + stream.emit("error", er); + // this can emit finish, but finish must + // always follow error + finishMaybe(stream, state); + } + } + + function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; + } + + function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + + onwriteStateUpdate(state); + + if (er) onwriteError(stream, state, sync, er, cb); + else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state); + + if ( + !finished && + !state.corked && + !state.bufferProcessing && + state.bufferedRequest + ) { + clearBuffer(stream, state); + } + + if (sync) { + /**/ + asyncWrite(afterWrite, stream, state, finished, cb); + /**/ + } else { + afterWrite(stream, state, finished, cb); + } + } + } + + function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); + } + + // Must force callback to be called on nextTick, so that we don't + // emit 'drain' before the write() consumer gets the 'false' return + // value, and has a chance to attach a 'drain' listener. + function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit("drain"); + } + } + + // if there's something in the buffer waiting, then process it + function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + + var count = 0; + var allBuffers = true; + while (entry) { + buffer[count] = entry; + if (!entry.isBuf) allBuffers = false; + entry = entry.next; + count += 1; + } + buffer.allBuffers = allBuffers; + + doWrite( + stream, + state, + true, + state.length, + buffer, + "", + holder.finish + ); + + // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + state.pendingcb++; + state.lastBufferedRequest = null; + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + state.bufferedRequestCount = 0; + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + state.bufferedRequestCount--; + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequest = entry; + state.bufferProcessing = false; + } + + Writable.prototype._write = function(chunk, encoding, cb) { + cb(new Error("_write() is not implemented")); + }; + + Writable.prototype._writev = null; + + Writable.prototype.end = function(chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === "function") { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === "function") { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) + this.write(chunk, encoding); + + // .end() fully uncorks + if (state.corked) { + state.corked = 1; + this.uncork(); + } + + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) endWritable(this, state, cb); + }; + + function needFinish(state) { + return ( + state.ending && + state.length === 0 && + state.bufferedRequest === null && + !state.finished && + !state.writing + ); + } + function callFinal(stream, state) { + stream._final(function(err) { + state.pendingcb--; + if (err) { + stream.emit("error", err); + } + state.prefinished = true; + stream.emit("prefinish"); + finishMaybe(stream, state); + }); + } + function prefinish(stream, state) { + if (!state.prefinished && !state.finalCalled) { + if (typeof stream._final === "function") { + state.pendingcb++; + state.finalCalled = true; + pna.nextTick(callFinal, stream, state); + } else { + state.prefinished = true; + stream.emit("prefinish"); + } + } + } + + function finishMaybe(stream, state) { + var need = needFinish(state); + if (need) { + prefinish(stream, state); + if (state.pendingcb === 0) { + state.finished = true; + stream.emit("finish"); + } + } + return need; + } + + function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) pna.nextTick(cb); + else stream.once("finish", cb); + } + state.ended = true; + stream.writable = false; + } + + function onCorkedFinish(corkReq, state, err) { + var entry = corkReq.entry; + corkReq.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = corkReq; + } else { + state.corkedRequestsFree = corkReq; + } + } + + Object.defineProperty(Writable.prototype, "destroyed", { + get: function() { + if (this._writableState === undefined) { + return false; + } + return this._writableState.destroyed; + }, + set: function(value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._writableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._writableState.destroyed = value; + } + }); + + Writable.prototype.destroy = destroyImpl.destroy; + Writable.prototype._undestroy = destroyImpl.undestroy; + Writable.prototype._destroy = function(err, cb) { + this.end(); + cb(err); + }; + }.call( + this, + require("_process"), + typeof global !== "undefined" + ? global + : typeof self !== "undefined" + ? self + : typeof window !== "undefined" + ? window + : {}, + require("timers").setImmediate + )); + }, + { + "./_stream_duplex": 117, + "./internal/streams/destroy": 123, + "./internal/streams/stream": 124, + _process: 112, + "core-util-is": 101, + inherits: 106, + "process-nextick-args": 111, + "safe-buffer": 144, + timers: 160, + "util-deprecate": 164 + } + ], + 122: [ + function(require, module, exports) { + "use strict"; + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + var Buffer = require("safe-buffer").Buffer; + var util = require("util"); + + function copyBuffer(src, target, offset) { + src.copy(target, offset); + } + + module.exports = (function() { + function BufferList() { + _classCallCheck(this, BufferList); + + this.head = null; + this.tail = null; + this.length = 0; + } + + BufferList.prototype.push = function push(v) { + var entry = { data: v, next: null }; + if (this.length > 0) this.tail.next = entry; + else this.head = entry; + this.tail = entry; + ++this.length; + }; + + BufferList.prototype.unshift = function unshift(v) { + var entry = { data: v, next: this.head }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + }; + + BufferList.prototype.shift = function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null; + else this.head = this.head.next; + --this.length; + return ret; + }; + + BufferList.prototype.clear = function clear() { + this.head = this.tail = null; + this.length = 0; + }; + + BufferList.prototype.join = function join(s) { + if (this.length === 0) return ""; + var p = this.head; + var ret = "" + p.data; + while ((p = p.next)) { + ret += s + p.data; + } + return ret; + }; + + BufferList.prototype.concat = function concat(n) { + if (this.length === 0) return Buffer.alloc(0); + if (this.length === 1) return this.head.data; + var ret = Buffer.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + return ret; + }; + + return BufferList; + })(); + + if (util && util.inspect && util.inspect.custom) { + module.exports.prototype[util.inspect.custom] = function() { + var obj = util.inspect({ length: this.length }); + return this.constructor.name + " " + obj; + }; + } + }, + { "safe-buffer": 144, util: 2 } + ], + 123: [ + function(require, module, exports) { + "use strict"; + + /**/ + + var pna = require("process-nextick-args"); + /**/ + + // undocumented cb() API, needed for core, not for public API + function destroy(err, cb) { + var _this = this; + + var readableDestroyed = + this._readableState && this._readableState.destroyed; + var writableDestroyed = + this._writableState && this._writableState.destroyed; + + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if ( + err && + (!this._writableState || !this._writableState.errorEmitted) + ) { + pna.nextTick(emitErrorNT, this, err); + } + return this; + } + + // we set destroyed to true before firing error callbacks in order + // to make it re-entrance safe in case destroy() is called within callbacks + + if (this._readableState) { + this._readableState.destroyed = true; + } + + // if this is a duplex stream mark the writable part as destroyed as well + if (this._writableState) { + this._writableState.destroyed = true; + } + + this._destroy(err || null, function(err) { + if (!cb && err) { + pna.nextTick(emitErrorNT, _this, err); + if (_this._writableState) { + _this._writableState.errorEmitted = true; + } + } else if (cb) { + cb(err); + } + }); + + return this; + } + + function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } + + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } + } + + function emitErrorNT(self, err) { + self.emit("error", err); + } + + module.exports = { + destroy: destroy, + undestroy: undestroy + }; + }, + { "process-nextick-args": 111 } + ], + 124: [ + function(require, module, exports) { + module.exports = require("events").EventEmitter; + }, + { events: 102 } + ], + 125: [ + function(require, module, exports) { + // Copyright Joyent, Inc. and other Node contributors. + // + // Permission is hereby granted, free of charge, to any person obtaining a + // copy of this software and associated documentation files (the + // "Software"), to deal in the Software without restriction, including + // without limitation the rights to use, copy, modify, merge, publish, + // distribute, sublicense, and/or sell copies of the Software, and to permit + // persons to whom the Software is furnished to do so, subject to the + // following conditions: + // + // The above copyright notice and this permission notice shall be included + // in all copies or substantial portions of the Software. + // + // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + // USE OR OTHER DEALINGS IN THE SOFTWARE. + + "use strict"; + + /**/ + + var Buffer = require("safe-buffer").Buffer; + /**/ + + var isEncoding = + Buffer.isEncoding || + function(encoding) { + encoding = "" + encoding; + switch (encoding && encoding.toLowerCase()) { + case "hex": + case "utf8": + case "utf-8": + case "ascii": + case "binary": + case "base64": + case "ucs2": + case "ucs-2": + case "utf16le": + case "utf-16le": + case "raw": + return true; + default: + return false; + } + }; + + function _normalizeEncoding(enc) { + if (!enc) return "utf8"; + var retried; + while (true) { + switch (enc) { + case "utf8": + case "utf-8": + return "utf8"; + case "ucs2": + case "ucs-2": + case "utf16le": + case "utf-16le": + return "utf16le"; + case "latin1": + case "binary": + return "latin1"; + case "base64": + case "ascii": + case "hex": + return enc; + default: + if (retried) return; // undefined + enc = ("" + enc).toLowerCase(); + retried = true; + } + } + } + + // Do not cache `Buffer.isEncoding` when checking encoding names as some + // modules monkey-patch it to support additional encodings + function normalizeEncoding(enc) { + var nenc = _normalizeEncoding(enc); + if ( + typeof nenc !== "string" && + (Buffer.isEncoding === isEncoding || !isEncoding(enc)) + ) + throw new Error("Unknown encoding: " + enc); + return nenc || enc; + } + + // StringDecoder provides an interface for efficiently splitting a series of + // buffers into a series of JS strings without breaking apart multi-byte + // characters. + exports.StringDecoder = StringDecoder; + function StringDecoder(encoding) { + this.encoding = normalizeEncoding(encoding); + var nb; + switch (this.encoding) { + case "utf16le": + this.text = utf16Text; + this.end = utf16End; + nb = 4; + break; + case "utf8": + this.fillLast = utf8FillLast; + nb = 4; + break; + case "base64": + this.text = base64Text; + this.end = base64End; + nb = 3; + break; + default: + this.write = simpleWrite; + this.end = simpleEnd; + return; + } + this.lastNeed = 0; + this.lastTotal = 0; + this.lastChar = Buffer.allocUnsafe(nb); + } + + StringDecoder.prototype.write = function(buf) { + if (buf.length === 0) return ""; + var r; + var i; + if (this.lastNeed) { + r = this.fillLast(buf); + if (r === undefined) return ""; + i = this.lastNeed; + this.lastNeed = 0; + } else { + i = 0; + } + if (i < buf.length) + return r ? r + this.text(buf, i) : this.text(buf, i); + return r || ""; + }; + + StringDecoder.prototype.end = utf8End; + + // Returns only complete characters in a Buffer + StringDecoder.prototype.text = utf8Text; + + // Attempts to complete a partial non-UTF-8 character using bytes from a Buffer + StringDecoder.prototype.fillLast = function(buf) { + if (this.lastNeed <= buf.length) { + buf.copy( + this.lastChar, + this.lastTotal - this.lastNeed, + 0, + this.lastNeed + ); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy( + this.lastChar, + this.lastTotal - this.lastNeed, + 0, + buf.length + ); + this.lastNeed -= buf.length; + }; + + // Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a + // continuation byte. If an invalid byte is detected, -2 is returned. + function utf8CheckByte(byte) { + if (byte <= 0x7f) return 0; + else if (byte >> 5 === 0x06) return 2; + else if (byte >> 4 === 0x0e) return 3; + else if (byte >> 3 === 0x1e) return 4; + return byte >> 6 === 0x02 ? -1 : -2; + } + + // Checks at most 3 bytes at the end of a Buffer in order to detect an + // incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) + // needed to complete the UTF-8 character (if applicable) are returned. + function utf8CheckIncomplete(self, buf, i) { + var j = buf.length - 1; + if (j < i) return 0; + var nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 1; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 2; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) { + if (nb === 2) nb = 0; + else self.lastNeed = nb - 3; + } + return nb; + } + return 0; + } + + // Validates as many continuation bytes for a multi-byte UTF-8 character as + // needed or are available. If we see a non-continuation byte where we expect + // one, we "replace" the validated continuation bytes we've seen so far with + // a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding + // behavior. The continuation byte check is included three times in the case + // where all of the continuation bytes for a character exist in the same buffer. + // It is also done this way as a slight performance increase instead of using a + // loop. + function utf8CheckExtraBytes(self, buf, p) { + if ((buf[0] & 0xc0) !== 0x80) { + self.lastNeed = 0; + return "\ufffd"; + } + if (self.lastNeed > 1 && buf.length > 1) { + if ((buf[1] & 0xc0) !== 0x80) { + self.lastNeed = 1; + return "\ufffd"; + } + if (self.lastNeed > 2 && buf.length > 2) { + if ((buf[2] & 0xc0) !== 0x80) { + self.lastNeed = 2; + return "\ufffd"; + } + } + } + } + + // Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. + function utf8FillLast(buf) { + var p = this.lastTotal - this.lastNeed; + var r = utf8CheckExtraBytes(this, buf, p); + if (r !== undefined) return r; + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, p, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, p, 0, buf.length); + this.lastNeed -= buf.length; + } + + // Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a + // partial character, the character's bytes are buffered until the required + // number of bytes are available. + function utf8Text(buf, i) { + var total = utf8CheckIncomplete(this, buf, i); + if (!this.lastNeed) return buf.toString("utf8", i); + this.lastTotal = total; + var end = buf.length - (total - this.lastNeed); + buf.copy(this.lastChar, 0, end); + return buf.toString("utf8", i, end); + } + + // For UTF-8, a replacement character is added when ending on a partial + // character. + function utf8End(buf) { + var r = buf && buf.length ? this.write(buf) : ""; + if (this.lastNeed) return r + "\ufffd"; + return r; + } + + // UTF-16LE typically needs two bytes per character, but even if we have an even + // number of bytes available, we need to check if we end on a leading/high + // surrogate. In that case, we need to wait for the next two bytes in order to + // decode the last character properly. + function utf16Text(buf, i) { + if ((buf.length - i) % 2 === 0) { + var r = buf.toString("utf16le", i); + if (r) { + var c = r.charCodeAt(r.length - 1); + if (c >= 0xd800 && c <= 0xdbff) { + this.lastNeed = 2; + this.lastTotal = 4; + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + return r.slice(0, -1); + } + } + return r; + } + this.lastNeed = 1; + this.lastTotal = 2; + this.lastChar[0] = buf[buf.length - 1]; + return buf.toString("utf16le", i, buf.length - 1); + } + + // For UTF-16LE we do not explicitly append special replacement characters if we + // end on a partial character, we simply let v8 handle that. + function utf16End(buf) { + var r = buf && buf.length ? this.write(buf) : ""; + if (this.lastNeed) { + var end = this.lastTotal - this.lastNeed; + return r + this.lastChar.toString("utf16le", 0, end); + } + return r; + } + + function base64Text(buf, i) { + var n = (buf.length - i) % 3; + if (n === 0) return buf.toString("base64", i); + this.lastNeed = 3 - n; + this.lastTotal = 3; + if (n === 1) { + this.lastChar[0] = buf[buf.length - 1]; + } else { + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + } + return buf.toString("base64", i, buf.length - n); + } + + function base64End(buf) { + var r = buf && buf.length ? this.write(buf) : ""; + if (this.lastNeed) + return r + this.lastChar.toString("base64", 0, 3 - this.lastNeed); + return r; + } + + // Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) + function simpleWrite(buf) { + return buf.toString(this.encoding); + } + + function simpleEnd(buf) { + return buf && buf.length ? this.write(buf) : ""; + } + }, + { "safe-buffer": 144 } + ], + 126: [ + function(require, module, exports) { + exports = module.exports = require("./lib/_stream_readable.js"); + exports.Stream = exports; + exports.Readable = exports; + exports.Writable = require("./lib/_stream_writable.js"); + exports.Duplex = require("./lib/_stream_duplex.js"); + exports.Transform = require("./lib/_stream_transform.js"); + exports.PassThrough = require("./lib/_stream_passthrough.js"); + }, + { + "./lib/_stream_duplex.js": 117, + "./lib/_stream_passthrough.js": 118, + "./lib/_stream_readable.js": 119, + "./lib/_stream_transform.js": 120, + "./lib/_stream_writable.js": 121 + } + ], + 127: [ + function(require, module, exports) { + "use strict"; + + module.exports = { + // Output + ABSOLUTE: "absolute", + PATH_RELATIVE: "pathRelative", + ROOT_RELATIVE: "rootRelative", + SHORTEST: "shortest" + }; + }, + {} + ], + 128: [ + function(require, module, exports) { + "use strict"; + + var constants = require("./constants"); + + function formatAuth(urlObj, options) { + if ( + urlObj.auth && + !options.removeAuth && + (urlObj.extra.relation.maximumHost || + options.output === constants.ABSOLUTE) + ) { + return urlObj.auth + "@"; + } + + return ""; + } + + function formatHash(urlObj, options) { + return urlObj.hash ? urlObj.hash : ""; + } + + function formatHost(urlObj, options) { + if ( + urlObj.host.full && + (urlObj.extra.relation.maximumAuth || + options.output === constants.ABSOLUTE) + ) { + return urlObj.host.full; + } + + return ""; + } + + function formatPath(urlObj, options) { + var str = ""; + + var absolutePath = urlObj.path.absolute.string; + var relativePath = urlObj.path.relative.string; + var resource = showResource(urlObj, options); + + if ( + urlObj.extra.relation.maximumHost || + options.output === constants.ABSOLUTE || + options.output === constants.ROOT_RELATIVE + ) { + str = absolutePath; + } else if ( + (relativePath.length <= absolutePath.length && + options.output === constants.SHORTEST) || + options.output === constants.PATH_RELATIVE + ) { + str = relativePath; + + if (str === "") { + var query = + showQuery(urlObj, options) && !!getQuery(urlObj, options); + + if (urlObj.extra.relation.maximumPath && !resource) { + str = "./"; + } else if ( + urlObj.extra.relation.overridesQuery && + !resource && + !query + ) { + str = "./"; + } + } + } else { + str = absolutePath; + } + + if ( + str === "/" && + !resource && + options.removeRootTrailingSlash && + (!urlObj.extra.relation.minimumPort || + options.output === constants.ABSOLUTE) + ) { + str = ""; + } + + return str; + } + + function formatPort(urlObj, options) { + if ( + urlObj.port && + !urlObj.extra.portIsDefault && + urlObj.extra.relation.maximumHost + ) { + return ":" + urlObj.port; + } + + return ""; + } + + function formatQuery(urlObj, options) { + return showQuery(urlObj, options) ? getQuery(urlObj, options) : ""; + } + + function formatResource(urlObj, options) { + return showResource(urlObj, options) ? urlObj.resource : ""; + } + + function formatScheme(urlObj, options) { + var str = ""; + + if ( + urlObj.extra.relation.maximumHost || + options.output === constants.ABSOLUTE + ) { + if ( + !urlObj.extra.relation.minimumScheme || + !options.schemeRelative || + options.output === constants.ABSOLUTE + ) { + str += urlObj.scheme + "://"; + } else { + str += "//"; + } + } + + return str; + } + + function formatUrl(urlObj, options) { + var url = ""; + + url += formatScheme(urlObj, options); + url += formatAuth(urlObj, options); + url += formatHost(urlObj, options); + url += formatPort(urlObj, options); + url += formatPath(urlObj, options); + url += formatResource(urlObj, options); + url += formatQuery(urlObj, options); + url += formatHash(urlObj, options); + + return url; + } + + function getQuery(urlObj, options) { + var stripQuery = + options.removeEmptyQueries && urlObj.extra.relation.minimumPort; + + return urlObj.query.string[stripQuery ? "stripped" : "full"]; + } + + function showQuery(urlObj, options) { + return ( + !urlObj.extra.relation.minimumQuery || + options.output === constants.ABSOLUTE || + options.output === constants.ROOT_RELATIVE + ); + } + + function showResource(urlObj, options) { + var removeIndex = + options.removeDirectoryIndexes && urlObj.extra.resourceIsIndex; + var removeMatchingResource = + urlObj.extra.relation.minimumResource && + options.output !== constants.ABSOLUTE && + options.output !== constants.ROOT_RELATIVE; + + return !!urlObj.resource && !removeMatchingResource && !removeIndex; + } + + module.exports = formatUrl; + }, + { "./constants": 127 } + ], + 129: [ + function(require, module, exports) { + "use strict"; + + var constants = require("./constants"); + var formatUrl = require("./format"); + var getOptions = require("./options"); + var objUtils = require("./util/object"); + var parseUrl = require("./parse"); + var relateUrl = require("./relate"); + + function RelateUrl(from, options) { + this.options = getOptions(options, { + defaultPorts: { ftp: 21, http: 80, https: 443 }, + directoryIndexes: ["index.html"], + ignore_www: false, + output: RelateUrl.SHORTEST, + rejectedSchemes: ["data", "javascript", "mailto"], + removeAuth: false, + removeDirectoryIndexes: true, + removeEmptyQueries: false, + removeRootTrailingSlash: true, + schemeRelative: true, + site: undefined, + slashesDenoteHost: true + }); + + this.from = parseUrl.from(from, this.options, null); + } + + /* + Usage: instance=new RelateUrl(); instance.relate(); +*/ + RelateUrl.prototype.relate = function(from, to, options) { + // relate(to,options) + if (objUtils.isPlainObject(to)) { + options = to; + to = from; + from = null; + } + // relate(to) + else if (!to) { + to = from; + from = null; + } + + options = getOptions(options, this.options); + from = from || options.site; + from = parseUrl.from(from, options, this.from); + + if (!from || !from.href) { + throw new Error("from value not defined."); + } else if (from.extra.hrefInfo.minimumPathOnly) { + throw new Error( + "from value supplied is not absolute: " + from.href + ); + } + + to = parseUrl.to(to, options); + + if (to.valid === false) return to.href; + + to = relateUrl(from, to, options); + to = formatUrl(to, options); + + return to; + }; + + /* + Usage: RelateUrl.relate(); +*/ + RelateUrl.relate = function(from, to, options) { + return new RelateUrl().relate(from, to, options); + }; + + // Make constants accessible from API + objUtils.shallowMerge(RelateUrl, constants); + + module.exports = RelateUrl; + }, + { + "./constants": 127, + "./format": 128, + "./options": 130, + "./parse": 133, + "./relate": 140, + "./util/object": 142 + } + ], + 130: [ + function(require, module, exports) { + "use strict"; + + var objUtils = require("./util/object"); + + function getOptions(options, defaults) { + if (objUtils.isPlainObject(options)) { + var newOptions = {}; + + for (var i in defaults) { + if (defaults.hasOwnProperty(i)) { + if (options[i] !== undefined) { + newOptions[i] = mergeOption(options[i], defaults[i]); + } else { + newOptions[i] = defaults[i]; + } + } + } + + return newOptions; + } else { + return defaults; + } + } + + function mergeOption(newValues, defaultValues) { + if (defaultValues instanceof Object && newValues instanceof Object) { + if (defaultValues instanceof Array && newValues instanceof Array) { + return defaultValues.concat(newValues); + } else { + return objUtils.shallowMerge(newValues, defaultValues); + } + } + + return newValues; + } + + module.exports = getOptions; + }, + { "./util/object": 142 } + ], + 131: [ + function(require, module, exports) { + "use strict"; + + function parseHost(urlObj, options) { + // TWEAK :: condition only for speed optimization + if (options.ignore_www) { + var host = urlObj.host.full; + + if (host) { + var stripped = host; + + if (host.indexOf("www.") === 0) { + stripped = host.substr(4); + } + + urlObj.host.stripped = stripped; + } + } + } + + module.exports = parseHost; + }, + {} + ], + 132: [ + function(require, module, exports) { + "use strict"; + + function hrefInfo(urlObj) { + var minimumPathOnly = + !urlObj.scheme && !urlObj.auth && !urlObj.host.full && !urlObj.port; + var minimumResourceOnly = + minimumPathOnly && !urlObj.path.absolute.string; + var minimumQueryOnly = minimumResourceOnly && !urlObj.resource; + var minimumHashOnly = + minimumQueryOnly && !urlObj.query.string.full.length; + var empty = minimumHashOnly && !urlObj.hash; + + urlObj.extra.hrefInfo.minimumPathOnly = minimumPathOnly; + urlObj.extra.hrefInfo.minimumResourceOnly = minimumResourceOnly; + urlObj.extra.hrefInfo.minimumQueryOnly = minimumQueryOnly; + urlObj.extra.hrefInfo.minimumHashOnly = minimumHashOnly; + urlObj.extra.hrefInfo.empty = empty; + } + + module.exports = hrefInfo; + }, + {} + ], + 133: [ + function(require, module, exports) { + "use strict"; + + var hrefInfo = require("./hrefInfo"); + var parseHost = require("./host"); + var parsePath = require("./path"); + var parsePort = require("./port"); + var parseQuery = require("./query"); + var parseUrlString = require("./urlstring"); + var pathUtils = require("../util/path"); + + function parseFromUrl(url, options, fallback) { + if (url) { + var urlObj = parseUrl(url, options); + + // Because the following occurs in the relate stage for "to" URLs, + // such had to be mostly duplicated here + + var pathArray = pathUtils.resolveDotSegments( + urlObj.path.absolute.array + ); + + urlObj.path.absolute.array = pathArray; + urlObj.path.absolute.string = "/" + pathUtils.join(pathArray); + + return urlObj; + } else { + return fallback; + } + } + + function parseUrl(url, options) { + var urlObj = parseUrlString(url, options); + + if (urlObj.valid === false) return urlObj; + + parseHost(urlObj, options); + parsePort(urlObj, options); + parsePath(urlObj, options); + parseQuery(urlObj, options); + hrefInfo(urlObj); + + return urlObj; + } + + module.exports = { + from: parseFromUrl, + to: parseUrl + }; + }, + { + "../util/path": 143, + "./host": 131, + "./hrefInfo": 132, + "./path": 134, + "./port": 135, + "./query": 136, + "./urlstring": 137 + } + ], + 134: [ + function(require, module, exports) { + "use strict"; + + function isDirectoryIndex(resource, options) { + var verdict = false; + + options.directoryIndexes.every(function(index) { + if (index === resource) { + verdict = true; + return false; + } + + return true; + }); + + return verdict; + } + + function parsePath(urlObj, options) { + var path = urlObj.path.absolute.string; + + if (path) { + var lastSlash = path.lastIndexOf("/"); + + if (lastSlash > -1) { + if (++lastSlash < path.length) { + var resource = path.substr(lastSlash); + + if (resource !== "." && resource !== "..") { + urlObj.resource = resource; + path = path.substr(0, lastSlash); + } else { + path += "/"; + } + } + + urlObj.path.absolute.string = path; + urlObj.path.absolute.array = splitPath(path); + } else if (path === "." || path === "..") { + // "..?var", "..#anchor", etc ... not "..index.html" + path += "/"; + + urlObj.path.absolute.string = path; + urlObj.path.absolute.array = splitPath(path); + } else { + // Resource-only + urlObj.resource = path; + urlObj.path.absolute.string = null; + } + + urlObj.extra.resourceIsIndex = isDirectoryIndex( + urlObj.resource, + options + ); + } + // Else: query/hash-only or empty + } + + function splitPath(path) { + // TWEAK :: condition only for speed optimization + if (path !== "/") { + var cleaned = []; + + path.split("/").forEach(function(dir) { + // Cleanup -- splitting "/dir/" becomes ["","dir",""] + if (dir !== "") { + cleaned.push(dir); + } + }); + + return cleaned; + } else { + // Faster to skip the above block and just create an array + return []; + } + } + + module.exports = parsePath; + }, + {} + ], + 135: [ + function(require, module, exports) { + "use strict"; + + function parsePort(urlObj, options) { + var defaultPort = -1; + + for (var i in options.defaultPorts) { + if (i === urlObj.scheme && options.defaultPorts.hasOwnProperty(i)) { + defaultPort = options.defaultPorts[i]; + break; + } + } + + if (defaultPort > -1) { + // Force same type as urlObj.port + defaultPort = defaultPort.toString(); + + if (urlObj.port === null) { + urlObj.port = defaultPort; + } + + urlObj.extra.portIsDefault = urlObj.port === defaultPort; + } + } + + module.exports = parsePort; + }, + {} + ], + 136: [ + function(require, module, exports) { + "use strict"; + var hasOwnProperty = Object.prototype.hasOwnProperty; + + function parseQuery(urlObj, options) { + urlObj.query.string.full = stringify(urlObj.query.object, false); + + // TWEAK :: condition only for speed optimization + if (options.removeEmptyQueries) { + urlObj.query.string.stripped = stringify(urlObj.query.object, true); + } + } + + function stringify(queryObj, removeEmptyQueries) { + var count = 0; + var str = ""; + + for (var i in queryObj) { + if (i !== "" && hasOwnProperty.call(queryObj, i) === true) { + var value = queryObj[i]; + + if (value !== "" || !removeEmptyQueries) { + str += ++count === 1 ? "?" : "&"; + + i = encodeURIComponent(i); + + if (value !== "") { + str += + i + "=" + encodeURIComponent(value).replace(/%20/g, "+"); + } else { + str += i; + } + } + } + } + + return str; + } + + module.exports = parseQuery; + }, + {} + ], + 137: [ + function(require, module, exports) { + "use strict"; + + var _parseUrl = require("url").parse; + + /* + Customize the URL object that Node generates + because: + + * necessary data for later + * urlObj.host is useless + * urlObj.hostname is too long + * urlObj.path is useless + * urlObj.pathname is too long + * urlObj.protocol is inaccurate; should be called "scheme" + * urlObj.search is mostly useless +*/ + function clean(urlObj) { + var scheme = urlObj.protocol; + + if (scheme) { + // Remove ":" suffix + if (scheme.indexOf(":") === scheme.length - 1) { + scheme = scheme.substr(0, scheme.length - 1); + } + } + + urlObj.host = { + // TODO :: unescape(encodeURIComponent(s)) ? ... http://ecmanaut.blogspot.ca/2006/07/encoding-decoding-utf8-in-javascript.html + full: urlObj.hostname, + stripped: null + }; + + urlObj.path = { + absolute: { + array: null, + string: urlObj.pathname + }, + relative: { + array: null, + string: null + } + }; + + urlObj.query = { + object: urlObj.query, + string: { + full: null, + stripped: null + } + }; + + urlObj.extra = { + hrefInfo: { + minimumPathOnly: null, + minimumResourceOnly: null, + minimumQueryOnly: null, + minimumHashOnly: null, + empty: null, + + separatorOnlyQuery: urlObj.search === "?" + }, + portIsDefault: null, + relation: { + maximumScheme: null, + maximumAuth: null, + maximumHost: null, + maximumPort: null, + maximumPath: null, + maximumResource: null, + maximumQuery: null, + maximumHash: null, + + minimumScheme: null, + minimumAuth: null, + minimumHost: null, + minimumPort: null, + minimumPath: null, + minimumResource: null, + minimumQuery: null, + minimumHash: null, + + overridesQuery: null + }, + resourceIsIndex: null, + slashes: urlObj.slashes + }; + + urlObj.resource = null; + urlObj.scheme = scheme; + delete urlObj.hostname; + delete urlObj.pathname; + delete urlObj.protocol; + delete urlObj.search; + delete urlObj.slashes; + + return urlObj; + } + + function validScheme(url, options) { + var valid = true; + + options.rejectedSchemes.every(function(rejectedScheme) { + valid = !(url.indexOf(rejectedScheme + ":") === 0); + + // Break loop + return valid; + }); + + return valid; + } + + function parseUrlString(url, options) { + if (validScheme(url, options)) { + return clean(_parseUrl(url, true, options.slashesDenoteHost)); + } else { + return { href: url, valid: false }; + } + } + + module.exports = parseUrlString; + }, + { url: 162 } + ], + 138: [ + function(require, module, exports) { + "use strict"; + + var findRelation = require("./findRelation"); + var objUtils = require("../util/object"); + var pathUtils = require("../util/path"); + + function absolutize(urlObj, siteUrlObj, options) { + findRelation.upToPath(urlObj, siteUrlObj, options); + + // Fill in relative URLs + if (urlObj.extra.relation.minimumScheme) + urlObj.scheme = siteUrlObj.scheme; + if (urlObj.extra.relation.minimumAuth) urlObj.auth = siteUrlObj.auth; + if (urlObj.extra.relation.minimumHost) + urlObj.host = objUtils.clone(siteUrlObj.host); + if (urlObj.extra.relation.minimumPort) copyPort(urlObj, siteUrlObj); + if (urlObj.extra.relation.minimumScheme) copyPath(urlObj, siteUrlObj); + + // Check remaining relativeness now that path has been copied and/or resolved + findRelation.pathOn(urlObj, siteUrlObj, options); + + // Fill in relative URLs + if (urlObj.extra.relation.minimumResource) + copyResource(urlObj, siteUrlObj); + if (urlObj.extra.relation.minimumQuery) + urlObj.query = objUtils.clone(siteUrlObj.query); + if (urlObj.extra.relation.minimumHash) urlObj.hash = siteUrlObj.hash; + } + + /* + Get an absolute path that's relative to site url. +*/ + function copyPath(urlObj, siteUrlObj) { + if ( + urlObj.extra.relation.maximumHost || + !urlObj.extra.hrefInfo.minimumResourceOnly + ) { + var pathArray = urlObj.path.absolute.array; + var pathString = "/"; + + // If not erroneous URL + if (pathArray) { + // If is relative path + if ( + urlObj.extra.hrefInfo.minimumPathOnly && + urlObj.path.absolute.string.indexOf("/") !== 0 + ) { + // Append path to site path + pathArray = siteUrlObj.path.absolute.array.concat(pathArray); + } + + pathArray = pathUtils.resolveDotSegments(pathArray); + pathString += pathUtils.join(pathArray); + } else { + pathArray = []; + } + + urlObj.path.absolute.array = pathArray; + urlObj.path.absolute.string = pathString; + } else { + // Resource-, query- or hash-only or empty + urlObj.path = objUtils.clone(siteUrlObj.path); + } + } + + function copyPort(urlObj, siteUrlObj) { + urlObj.port = siteUrlObj.port; + + urlObj.extra.portIsDefault = siteUrlObj.extra.portIsDefault; + } + + function copyResource(urlObj, siteUrlObj) { + urlObj.resource = siteUrlObj.resource; + + urlObj.extra.resourceIsIndex = siteUrlObj.extra.resourceIsIndex; + } + + module.exports = absolutize; + }, + { "../util/object": 142, "../util/path": 143, "./findRelation": 139 } + ], + 139: [ + function(require, module, exports) { + "use strict"; + + function findRelation_upToPath(urlObj, siteUrlObj, options) { + // Path- or root-relative URL + var pathOnly = urlObj.extra.hrefInfo.minimumPathOnly; + + // Matching scheme, scheme-relative or path-only + var minimumScheme = + urlObj.scheme === siteUrlObj.scheme || !urlObj.scheme; + + // Matching auth, ignoring auth or path-only + var minimumAuth = + minimumScheme && + (urlObj.auth === siteUrlObj.auth || options.removeAuth || pathOnly); + + // Matching host or path-only + var www = options.ignore_www ? "stripped" : "full"; + var minimumHost = + minimumAuth && + (urlObj.host[www] === siteUrlObj.host[www] || pathOnly); + + // Matching port or path-only + var minimumPort = + minimumHost && (urlObj.port === siteUrlObj.port || pathOnly); + + urlObj.extra.relation.minimumScheme = minimumScheme; + urlObj.extra.relation.minimumAuth = minimumAuth; + urlObj.extra.relation.minimumHost = minimumHost; + urlObj.extra.relation.minimumPort = minimumPort; + + urlObj.extra.relation.maximumScheme = + !minimumScheme || (minimumScheme && !minimumAuth); + urlObj.extra.relation.maximumAuth = + !minimumScheme || (minimumScheme && !minimumHost); + urlObj.extra.relation.maximumHost = + !minimumScheme || (minimumScheme && !minimumPort); + } + + function findRelation_pathOn(urlObj, siteUrlObj, options) { + var queryOnly = urlObj.extra.hrefInfo.minimumQueryOnly; + var hashOnly = urlObj.extra.hrefInfo.minimumHashOnly; + var empty = urlObj.extra.hrefInfo.empty; // not required, but self-documenting + + // From upToPath() + var minimumPort = urlObj.extra.relation.minimumPort; + var minimumScheme = urlObj.extra.relation.minimumScheme; + + // Matching port and path + var minimumPath = + minimumPort && + urlObj.path.absolute.string === siteUrlObj.path.absolute.string; + + // Matching resource or query/hash-only or empty + var matchingResource = + urlObj.resource === siteUrlObj.resource || + (!urlObj.resource && siteUrlObj.extra.resourceIsIndex) || + (options.removeDirectoryIndexes && + urlObj.extra.resourceIsIndex && + !siteUrlObj.resource); + var minimumResource = + minimumPath && (matchingResource || queryOnly || hashOnly || empty); + + // Matching query or hash-only/empty + var query = options.removeEmptyQueries ? "stripped" : "full"; + var urlQuery = urlObj.query.string[query]; + var siteUrlQuery = siteUrlObj.query.string[query]; + var minimumQuery = + (minimumResource && !!urlQuery && urlQuery === siteUrlQuery) || + ((hashOnly || empty) && !urlObj.extra.hrefInfo.separatorOnlyQuery); + + var minimumHash = minimumQuery && urlObj.hash === siteUrlObj.hash; + + urlObj.extra.relation.minimumPath = minimumPath; + urlObj.extra.relation.minimumResource = minimumResource; + urlObj.extra.relation.minimumQuery = minimumQuery; + urlObj.extra.relation.minimumHash = minimumHash; + + urlObj.extra.relation.maximumPort = + !minimumScheme || (minimumScheme && !minimumPath); + urlObj.extra.relation.maximumPath = + !minimumScheme || (minimumScheme && !minimumResource); + urlObj.extra.relation.maximumResource = + !minimumScheme || (minimumScheme && !minimumQuery); + urlObj.extra.relation.maximumQuery = + !minimumScheme || (minimumScheme && !minimumHash); + urlObj.extra.relation.maximumHash = + !minimumScheme || (minimumScheme && !minimumHash); // there's nothing after hash, so it's the same as maximumQuery + + // Matching path and/or resource with existing but non-matching site query + urlObj.extra.relation.overridesQuery = + minimumPath && + urlObj.extra.relation.maximumResource && + !minimumQuery && + !!siteUrlQuery; + } + + module.exports = { + pathOn: findRelation_pathOn, + upToPath: findRelation_upToPath + }; + }, + {} + ], + 140: [ + function(require, module, exports) { + "use strict"; + + var absolutize = require("./absolutize"); + var relativize = require("./relativize"); + + function relateUrl(siteUrlObj, urlObj, options) { + absolutize(urlObj, siteUrlObj, options); + relativize(urlObj, siteUrlObj, options); + + return urlObj; + } + + module.exports = relateUrl; + }, + { "./absolutize": 138, "./relativize": 141 } + ], + 141: [ + function(require, module, exports) { + "use strict"; + + var pathUtils = require("../util/path"); + + /* + Get a path relative to the site path. +*/ + function relatePath(absolutePath, siteAbsolutePath) { + var relativePath = []; + + // At this point, it's related to the host/port + var related = true; + var parentIndex = -1; + + // Find parents + siteAbsolutePath.forEach(function(siteAbsoluteDir, i) { + if (related) { + if (absolutePath[i] !== siteAbsoluteDir) { + related = false; + } else { + parentIndex = i; + } + } + + if (!related) { + // Up one level + relativePath.push(".."); + } + }); + + // Form path + absolutePath.forEach(function(dir, i) { + if (i > parentIndex) { + relativePath.push(dir); + } + }); + + return relativePath; + } + + function relativize(urlObj, siteUrlObj, options) { + if (urlObj.extra.relation.minimumScheme) { + var pathArray = relatePath( + urlObj.path.absolute.array, + siteUrlObj.path.absolute.array + ); + + urlObj.path.relative.array = pathArray; + urlObj.path.relative.string = pathUtils.join(pathArray); + } + } + + module.exports = relativize; + }, + { "../util/path": 143 } + ], + 142: [ + function(require, module, exports) { + "use strict"; + + /* + Deep-clone an object. +*/ + function clone(obj) { + if (obj instanceof Object) { + var clonedObj = obj instanceof Array ? [] : {}; + + for (var i in obj) { + if (obj.hasOwnProperty(i)) { + clonedObj[i] = clone(obj[i]); + } + } + + return clonedObj; + } + + return obj; + } + + /* + https://github.com/jonschlinkert/is-plain-object +*/ + function isPlainObject(obj) { + return !!obj && typeof obj === "object" && obj.constructor === Object; + } + + /* + Shallow-merge two objects. +*/ + function shallowMerge(target, source) { + if (target instanceof Object && source instanceof Object) { + for (var i in source) { + if (source.hasOwnProperty(i)) { + target[i] = source[i]; + } + } + } + + return target; + } + + module.exports = { + clone: clone, + isPlainObject: isPlainObject, + shallowMerge: shallowMerge + }; + }, + {} + ], + 143: [ + function(require, module, exports) { + "use strict"; + + function joinPath(pathArray) { + if (pathArray.length > 0) { + return pathArray.join("/") + "/"; + } else { + return ""; + } + } + + function resolveDotSegments(pathArray) { + var pathAbsolute = []; + + pathArray.forEach(function(dir) { + if (dir !== "..") { + if (dir !== ".") { + pathAbsolute.push(dir); + } + } else { + // Remove parent + if (pathAbsolute.length > 0) { + pathAbsolute.splice(pathAbsolute.length - 1, 1); + } + } + }); + + return pathAbsolute; + } + + module.exports = { + join: joinPath, + resolveDotSegments: resolveDotSegments + }; + }, + {} + ], + 144: [ + function(require, module, exports) { + /* eslint-disable node/no-deprecated-api */ + var buffer = require("buffer"); + var Buffer = buffer.Buffer; + + // alternative to using Object.keys for old browsers + function copyProps(src, dst) { + for (var key in src) { + dst[key] = src[key]; + } + } + if ( + Buffer.from && + Buffer.alloc && + Buffer.allocUnsafe && + Buffer.allocUnsafeSlow + ) { + module.exports = buffer; + } else { + // Copy properties from require('buffer') + copyProps(buffer, exports); + exports.Buffer = SafeBuffer; + } + + function SafeBuffer(arg, encodingOrOffset, length) { + return Buffer(arg, encodingOrOffset, length); + } + + // Copy static methods from Buffer + copyProps(Buffer, SafeBuffer); + + SafeBuffer.from = function(arg, encodingOrOffset, length) { + if (typeof arg === "number") { + throw new TypeError("Argument must not be a number"); + } + return Buffer(arg, encodingOrOffset, length); + }; + + SafeBuffer.alloc = function(size, fill, encoding) { + if (typeof size !== "number") { + throw new TypeError("Argument must be a number"); + } + var buf = Buffer(size); + if (fill !== undefined) { + if (typeof encoding === "string") { + buf.fill(fill, encoding); + } else { + buf.fill(fill); + } + } else { + buf.fill(0); + } + return buf; + }; + + SafeBuffer.allocUnsafe = function(size) { + if (typeof size !== "number") { + throw new TypeError("Argument must be a number"); + } + return Buffer(size); + }; + + SafeBuffer.allocUnsafeSlow = function(size) { + if (typeof size !== "number") { + throw new TypeError("Argument must be a number"); + } + return buffer.SlowBuffer(size); + }; + }, + { buffer: 4 } + ], + 145: [ + function(require, module, exports) { + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var util = require("./util"); + var has = Object.prototype.hasOwnProperty; + var hasNativeMap = typeof Map !== "undefined"; + + /** + * A data structure which is a combination of an array and a set. Adding a new + * member is O(1), testing for membership is O(1), and finding the index of an + * element is O(1). Removing elements from the set is not supported. Only + * strings are supported for membership. + */ + function ArraySet() { + this._array = []; + this._set = hasNativeMap ? new Map() : Object.create(null); + } + + /** + * Static method for creating ArraySet instances from an existing array. + */ + ArraySet.fromArray = function ArraySet_fromArray( + aArray, + aAllowDuplicates + ) { + var set = new ArraySet(); + for (var i = 0, len = aArray.length; i < len; i++) { + set.add(aArray[i], aAllowDuplicates); + } + return set; + }; + + /** + * Return how many unique items are in this ArraySet. If duplicates have been + * added, than those do not count towards the size. + * + * @returns Number + */ + ArraySet.prototype.size = function ArraySet_size() { + return hasNativeMap + ? this._set.size + : Object.getOwnPropertyNames(this._set).length; + }; + + /** + * Add the given string to this set. + * + * @param String aStr + */ + ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { + var sStr = hasNativeMap ? aStr : util.toSetString(aStr); + var isDuplicate = hasNativeMap + ? this.has(aStr) + : has.call(this._set, sStr); + var idx = this._array.length; + if (!isDuplicate || aAllowDuplicates) { + this._array.push(aStr); + } + if (!isDuplicate) { + if (hasNativeMap) { + this._set.set(aStr, idx); + } else { + this._set[sStr] = idx; + } + } + }; + + /** + * Is the given string a member of this set? + * + * @param String aStr + */ + ArraySet.prototype.has = function ArraySet_has(aStr) { + if (hasNativeMap) { + return this._set.has(aStr); + } else { + var sStr = util.toSetString(aStr); + return has.call(this._set, sStr); + } + }; + + /** + * What is the index of the given string in the array? + * + * @param String aStr + */ + ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { + if (hasNativeMap) { + var idx = this._set.get(aStr); + if (idx >= 0) { + return idx; + } + } else { + var sStr = util.toSetString(aStr); + if (has.call(this._set, sStr)) { + return this._set[sStr]; + } + } + + throw new Error('"' + aStr + '" is not in the set.'); + }; + + /** + * What is the element at the given index? + * + * @param Number aIdx + */ + ArraySet.prototype.at = function ArraySet_at(aIdx) { + if (aIdx >= 0 && aIdx < this._array.length) { + return this._array[aIdx]; + } + throw new Error("No element indexed by " + aIdx); + }; + + /** + * Returns the array representation of this set (which has the proper indices + * indicated by indexOf). Note that this is a copy of the internal array used + * for storing the members so that no one can mess with internal state. + */ + ArraySet.prototype.toArray = function ArraySet_toArray() { + return this._array.slice(); + }; + + exports.ArraySet = ArraySet; + }, + { "./util": 154 } + ], + 146: [ + function(require, module, exports) { + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + * + * Based on the Base 64 VLQ implementation in Closure Compiler: + * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java + * + * Copyright 2011 The Closure Compiler Authors. All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + var base64 = require("./base64"); + + // A single base 64 digit can contain 6 bits of data. For the base 64 variable + // length quantities we use in the source map spec, the first bit is the sign, + // the next four bits are the actual value, and the 6th bit is the + // continuation bit. The continuation bit tells us whether there are more + // digits in this value following this digit. + // + // Continuation + // | Sign + // | | + // V V + // 101011 + + var VLQ_BASE_SHIFT = 5; + + // binary: 100000 + var VLQ_BASE = 1 << VLQ_BASE_SHIFT; + + // binary: 011111 + var VLQ_BASE_MASK = VLQ_BASE - 1; + + // binary: 100000 + var VLQ_CONTINUATION_BIT = VLQ_BASE; + + /** + * Converts from a two-complement value to a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) + * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) + */ + function toVLQSigned(aValue) { + return aValue < 0 ? (-aValue << 1) + 1 : (aValue << 1) + 0; + } + + /** + * Converts to a two-complement value from a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1 + * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2 + */ + function fromVLQSigned(aValue) { + var isNegative = (aValue & 1) === 1; + var shifted = aValue >> 1; + return isNegative ? -shifted : shifted; + } + + /** + * Returns the base 64 VLQ encoded value. + */ + exports.encode = function base64VLQ_encode(aValue) { + var encoded = ""; + var digit; + + var vlq = toVLQSigned(aValue); + + do { + digit = vlq & VLQ_BASE_MASK; + vlq >>>= VLQ_BASE_SHIFT; + if (vlq > 0) { + // There are still more digits in this value, so we must make sure the + // continuation bit is marked. + digit |= VLQ_CONTINUATION_BIT; + } + encoded += base64.encode(digit); + } while (vlq > 0); + + return encoded; + }; + + /** + * Decodes the next base 64 VLQ value from the given string and returns the + * value and the rest of the string via the out parameter. + */ + exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { + var strLen = aStr.length; + var result = 0; + var shift = 0; + var continuation, digit; + + do { + if (aIndex >= strLen) { + throw new Error("Expected more digits in base 64 VLQ value."); + } + + digit = base64.decode(aStr.charCodeAt(aIndex++)); + if (digit === -1) { + throw new Error( + "Invalid base64 digit: " + aStr.charAt(aIndex - 1) + ); + } + + continuation = !!(digit & VLQ_CONTINUATION_BIT); + digit &= VLQ_BASE_MASK; + result = result + (digit << shift); + shift += VLQ_BASE_SHIFT; + } while (continuation); + + aOutParam.value = fromVLQSigned(result); + aOutParam.rest = aIndex; + }; + }, + { "./base64": 147 } + ], + 147: [ + function(require, module, exports) { + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var intToCharMap = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split( + "" + ); + + /** + * Encode an integer in the range of 0 to 63 to a single base 64 digit. + */ + exports.encode = function(number) { + if (0 <= number && number < intToCharMap.length) { + return intToCharMap[number]; + } + throw new TypeError("Must be between 0 and 63: " + number); + }; + + /** + * Decode a single base 64 character code digit to an integer. Returns -1 on + * failure. + */ + exports.decode = function(charCode) { + var bigA = 65; // 'A' + var bigZ = 90; // 'Z' + + var littleA = 97; // 'a' + var littleZ = 122; // 'z' + + var zero = 48; // '0' + var nine = 57; // '9' + + var plus = 43; // '+' + var slash = 47; // '/' + + var littleOffset = 26; + var numberOffset = 52; + + // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ + if (bigA <= charCode && charCode <= bigZ) { + return charCode - bigA; + } + + // 26 - 51: abcdefghijklmnopqrstuvwxyz + if (littleA <= charCode && charCode <= littleZ) { + return charCode - littleA + littleOffset; + } + + // 52 - 61: 0123456789 + if (zero <= charCode && charCode <= nine) { + return charCode - zero + numberOffset; + } + + // 62: + + if (charCode == plus) { + return 62; + } + + // 63: / + if (charCode == slash) { + return 63; + } + + // Invalid base64 digit. + return -1; + }; + }, + {} + ], + 148: [ + function(require, module, exports) { + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + exports.GREATEST_LOWER_BOUND = 1; + exports.LEAST_UPPER_BOUND = 2; + + /** + * Recursive implementation of binary search. + * + * @param aLow Indices here and lower do not contain the needle. + * @param aHigh Indices here and higher do not contain the needle. + * @param aNeedle The element being searched for. + * @param aHaystack The non-empty array being searched. + * @param aCompare Function which takes two elements and returns -1, 0, or 1. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + */ + function recursiveSearch( + aLow, + aHigh, + aNeedle, + aHaystack, + aCompare, + aBias + ) { + // This function terminates when one of the following is true: + // + // 1. We find the exact element we are looking for. + // + // 2. We did not find the exact element, but we can return the index of + // the next-closest element. + // + // 3. We did not find the exact element, and there is no next-closest + // element than the one we are searching for, so we return -1. + var mid = Math.floor((aHigh - aLow) / 2) + aLow; + var cmp = aCompare(aNeedle, aHaystack[mid], true); + if (cmp === 0) { + // Found the element we are looking for. + return mid; + } else if (cmp > 0) { + // Our needle is greater than aHaystack[mid]. + if (aHigh - mid > 1) { + // The element is in the upper half. + return recursiveSearch( + mid, + aHigh, + aNeedle, + aHaystack, + aCompare, + aBias + ); + } + + // The exact needle element was not found in this haystack. Determine if + // we are in termination case (3) or (2) and return the appropriate thing. + if (aBias == exports.LEAST_UPPER_BOUND) { + return aHigh < aHaystack.length ? aHigh : -1; + } else { + return mid; + } + } else { + // Our needle is less than aHaystack[mid]. + if (mid - aLow > 1) { + // The element is in the lower half. + return recursiveSearch( + aLow, + mid, + aNeedle, + aHaystack, + aCompare, + aBias + ); + } + + // we are in termination case (3) or (2) and return the appropriate thing. + if (aBias == exports.LEAST_UPPER_BOUND) { + return mid; + } else { + return aLow < 0 ? -1 : aLow; + } + } + } + + /** + * This is an implementation of binary search which will always try and return + * the index of the closest element if there is no exact hit. This is because + * mappings between original and generated line/col pairs are single points, + * and there is an implicit region between each of them, so a miss just means + * that you aren't on the very start of a region. + * + * @param aNeedle The element you are looking for. + * @param aHaystack The array that is being searched. + * @param aCompare A function which takes the needle and an element in the + * array and returns -1, 0, or 1 depending on whether the needle is less + * than, equal to, or greater than the element, respectively. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'. + */ + exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { + if (aHaystack.length === 0) { + return -1; + } + + var index = recursiveSearch( + -1, + aHaystack.length, + aNeedle, + aHaystack, + aCompare, + aBias || exports.GREATEST_LOWER_BOUND + ); + if (index < 0) { + return -1; + } + + // We have found either the exact element, or the next-closest element than + // the one we are searching for. However, there may be more than one such + // element. Make sure we always return the smallest of these. + while (index - 1 >= 0) { + if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) { + break; + } + --index; + } + + return index; + }; + }, + {} + ], + 149: [ + function(require, module, exports) { + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2014 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var util = require("./util"); + + /** + * Determine whether mappingB is after mappingA with respect to generated + * position. + */ + function generatedPositionAfter(mappingA, mappingB) { + // Optimized for most common case + var lineA = mappingA.generatedLine; + var lineB = mappingB.generatedLine; + var columnA = mappingA.generatedColumn; + var columnB = mappingB.generatedColumn; + return ( + lineB > lineA || + (lineB == lineA && columnB >= columnA) || + util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0 + ); + } + + /** + * A data structure to provide a sorted view of accumulated mappings in a + * performance conscious manner. It trades a neglibable overhead in general + * case for a large speedup in case of mappings being added in order. + */ + function MappingList() { + this._array = []; + this._sorted = true; + // Serves as infimum + this._last = { generatedLine: -1, generatedColumn: 0 }; + } + + /** + * Iterate through internal items. This method takes the same arguments that + * `Array.prototype.forEach` takes. + * + * NOTE: The order of the mappings is NOT guaranteed. + */ + MappingList.prototype.unsortedForEach = function MappingList_forEach( + aCallback, + aThisArg + ) { + this._array.forEach(aCallback, aThisArg); + }; + + /** + * Add the given source mapping. + * + * @param Object aMapping + */ + MappingList.prototype.add = function MappingList_add(aMapping) { + if (generatedPositionAfter(this._last, aMapping)) { + this._last = aMapping; + this._array.push(aMapping); + } else { + this._sorted = false; + this._array.push(aMapping); + } + }; + + /** + * Returns the flat, sorted array of mappings. The mappings are sorted by + * generated position. + * + * WARNING: This method returns internal data without copying, for + * performance. The return value must NOT be mutated, and should be treated as + * an immutable borrow. If you want to take ownership, you must make your own + * copy. + */ + MappingList.prototype.toArray = function MappingList_toArray() { + if (!this._sorted) { + this._array.sort(util.compareByGeneratedPositionsInflated); + this._sorted = true; + } + return this._array; + }; + + exports.MappingList = MappingList; + }, + { "./util": 154 } + ], + 150: [ + function(require, module, exports) { + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + // It turns out that some (most?) JavaScript engines don't self-host + // `Array.prototype.sort`. This makes sense because C++ will likely remain + // faster than JS when doing raw CPU-intensive sorting. However, when using a + // custom comparator function, calling back and forth between the VM's C++ and + // JIT'd JS is rather slow *and* loses JIT type information, resulting in + // worse generated code for the comparator function than would be optimal. In + // fact, when sorting with a comparator, these costs outweigh the benefits of + // sorting in C++. By using our own JS-implemented Quick Sort (below), we get + // a ~3500ms mean speed-up in `bench/bench.html`. + + /** + * Swap the elements indexed by `x` and `y` in the array `ary`. + * + * @param {Array} ary + * The array. + * @param {Number} x + * The index of the first item. + * @param {Number} y + * The index of the second item. + */ + function swap(ary, x, y) { + var temp = ary[x]; + ary[x] = ary[y]; + ary[y] = temp; + } + + /** + * Returns a random integer within the range `low .. high` inclusive. + * + * @param {Number} low + * The lower bound on the range. + * @param {Number} high + * The upper bound on the range. + */ + function randomIntInRange(low, high) { + return Math.round(low + Math.random() * (high - low)); + } + + /** + * The Quick Sort algorithm. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + * @param {Number} p + * Start index of the array + * @param {Number} r + * End index of the array + */ + function doQuickSort(ary, comparator, p, r) { + // If our lower bound is less than our upper bound, we (1) partition the + // array into two pieces and (2) recurse on each half. If it is not, this is + // the empty array and our base case. + + if (p < r) { + // (1) Partitioning. + // + // The partitioning chooses a pivot between `p` and `r` and moves all + // elements that are less than or equal to the pivot to the before it, and + // all the elements that are greater than it after it. The effect is that + // once partition is done, the pivot is in the exact place it will be when + // the array is put in sorted order, and it will not need to be moved + // again. This runs in O(n) time. + + // Always choose a random pivot so that an input array which is reverse + // sorted does not cause O(n^2) running time. + var pivotIndex = randomIntInRange(p, r); + var i = p - 1; + + swap(ary, pivotIndex, r); + var pivot = ary[r]; + + // Immediately after `j` is incremented in this loop, the following hold + // true: + // + // * Every element in `ary[p .. i]` is less than or equal to the pivot. + // + // * Every element in `ary[i+1 .. j-1]` is greater than the pivot. + for (var j = p; j < r; j++) { + if (comparator(ary[j], pivot) <= 0) { + i += 1; + swap(ary, i, j); + } + } + + swap(ary, i + 1, j); + var q = i + 1; + + // (2) Recurse on each half. + + doQuickSort(ary, comparator, p, q - 1); + doQuickSort(ary, comparator, q + 1, r); + } + } + + /** + * Sort the given array in-place with the given comparator function. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + */ + exports.quickSort = function(ary, comparator) { + doQuickSort(ary, comparator, 0, ary.length - 1); + }; + }, + {} + ], + 151: [ + function(require, module, exports) { + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var util = require("./util"); + var binarySearch = require("./binary-search"); + var ArraySet = require("./array-set").ArraySet; + var base64VLQ = require("./base64-vlq"); + var quickSort = require("./quick-sort").quickSort; + + function SourceMapConsumer(aSourceMap, aSourceMapURL) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === "string") { + sourceMap = util.parseSourceMapInput(aSourceMap); + } + + return sourceMap.sections != null + ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL) + : new BasicSourceMapConsumer(sourceMap, aSourceMapURL); + } + + SourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) { + return BasicSourceMapConsumer.fromSourceMap( + aSourceMap, + aSourceMapURL + ); + }; + + /** + * The version of the source mapping spec that we are consuming. + */ + SourceMapConsumer.prototype._version = 3; + + // `__generatedMappings` and `__originalMappings` are arrays that hold the + // parsed mapping coordinates from the source map's "mappings" attribute. They + // are lazily instantiated, accessed via the `_generatedMappings` and + // `_originalMappings` getters respectively, and we only parse the mappings + // and create these arrays once queried for a source location. We jump through + // these hoops because there can be many thousands of mappings, and parsing + // them is expensive, so we only want to do it if we must. + // + // Each object in the arrays is of the form: + // + // { + // generatedLine: The line number in the generated code, + // generatedColumn: The column number in the generated code, + // source: The path to the original source file that generated this + // chunk of code, + // originalLine: The line number in the original source that + // corresponds to this chunk of generated code, + // originalColumn: The column number in the original source that + // corresponds to this chunk of generated code, + // name: The name of the original symbol which generated this chunk of + // code. + // } + // + // All properties except for `generatedLine` and `generatedColumn` can be + // `null`. + // + // `_generatedMappings` is ordered by the generated positions. + // + // `_originalMappings` is ordered by the original positions. + + SourceMapConsumer.prototype.__generatedMappings = null; + Object.defineProperty( + SourceMapConsumer.prototype, + "_generatedMappings", + { + configurable: true, + enumerable: true, + get: function() { + if (!this.__generatedMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__generatedMappings; + } + } + ); + + SourceMapConsumer.prototype.__originalMappings = null; + Object.defineProperty( + SourceMapConsumer.prototype, + "_originalMappings", + { + configurable: true, + enumerable: true, + get: function() { + if (!this.__originalMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__originalMappings; + } + } + ); + + SourceMapConsumer.prototype._charIsMappingSeparator = function SourceMapConsumer_charIsMappingSeparator( + aStr, + index + ) { + var c = aStr.charAt(index); + return c === ";" || c === ","; + }; + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + SourceMapConsumer.prototype._parseMappings = function SourceMapConsumer_parseMappings( + aStr, + aSourceRoot + ) { + throw new Error("Subclasses must implement _parseMappings"); + }; + + SourceMapConsumer.GENERATED_ORDER = 1; + SourceMapConsumer.ORIGINAL_ORDER = 2; + + SourceMapConsumer.GREATEST_LOWER_BOUND = 1; + SourceMapConsumer.LEAST_UPPER_BOUND = 2; + + /** + * Iterate over each mapping between an original source/line/column and a + * generated line/column in this source map. + * + * @param Function aCallback + * The function that is called with each mapping. + * @param Object aContext + * Optional. If specified, this object will be the value of `this` every + * time that `aCallback` is called. + * @param aOrder + * Either `SourceMapConsumer.GENERATED_ORDER` or + * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to + * iterate over the mappings sorted by the generated file's line/column + * order or the original's source/line/column order, respectively. Defaults to + * `SourceMapConsumer.GENERATED_ORDER`. + */ + SourceMapConsumer.prototype.eachMapping = function SourceMapConsumer_eachMapping( + aCallback, + aContext, + aOrder + ) { + var context = aContext || null; + var order = aOrder || SourceMapConsumer.GENERATED_ORDER; + + var mappings; + switch (order) { + case SourceMapConsumer.GENERATED_ORDER: + mappings = this._generatedMappings; + break; + case SourceMapConsumer.ORIGINAL_ORDER: + mappings = this._originalMappings; + break; + default: + throw new Error("Unknown order of iteration."); + } + + var sourceRoot = this.sourceRoot; + mappings + .map(function(mapping) { + var source = + mapping.source === null + ? null + : this._sources.at(mapping.source); + source = util.computeSourceURL( + sourceRoot, + source, + this._sourceMapURL + ); + return { + source: source, + generatedLine: mapping.generatedLine, + generatedColumn: mapping.generatedColumn, + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: + mapping.name === null ? null : this._names.at(mapping.name) + }; + }, this) + .forEach(aCallback, context); + }; + + /** + * Returns all generated line and column information for the original source, + * line, and column provided. If no column is provided, returns all mappings + * corresponding to a either the line we are searching for or the next + * closest line that has any mappings. Otherwise, returns all mappings + * corresponding to the given line and either the column we are searching for + * or the next closest column that has any offsets. + * + * The only argument is an object with the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. The line number is 1-based. + * - column: Optional. the column number in the original source. + * The column number is 0-based. + * + * and an array of objects is returned, each with the following properties: + * + * - line: The line number in the generated source, or null. The + * line number is 1-based. + * - column: The column number in the generated source, or null. + * The column number is 0-based. + */ + SourceMapConsumer.prototype.allGeneratedPositionsFor = function SourceMapConsumer_allGeneratedPositionsFor( + aArgs + ) { + var line = util.getArg(aArgs, "line"); + + // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping + // returns the index of the closest mapping less than the needle. By + // setting needle.originalColumn to 0, we thus find the last mapping for + // the given line, provided such a mapping exists. + var needle = { + source: util.getArg(aArgs, "source"), + originalLine: line, + originalColumn: util.getArg(aArgs, "column", 0) + }; + + needle.source = this._findSourceIndex(needle.source); + if (needle.source < 0) { + return []; + } + + var mappings = []; + + var index = this._findMapping( + needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions, + binarySearch.LEAST_UPPER_BOUND + ); + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (aArgs.column === undefined) { + var originalLine = mapping.originalLine; + + // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we found. Since + // mappings are sorted, this is guaranteed to find all mappings for + // the line we found. + while (mapping && mapping.originalLine === originalLine) { + mappings.push({ + line: util.getArg(mapping, "generatedLine", null), + column: util.getArg(mapping, "generatedColumn", null), + lastColumn: util.getArg(mapping, "lastGeneratedColumn", null) + }); + + mapping = this._originalMappings[++index]; + } + } else { + var originalColumn = mapping.originalColumn; + + // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we were searching for. + // Since mappings are sorted, this is guaranteed to find all mappings for + // the line we are searching for. + while ( + mapping && + mapping.originalLine === line && + mapping.originalColumn == originalColumn + ) { + mappings.push({ + line: util.getArg(mapping, "generatedLine", null), + column: util.getArg(mapping, "generatedColumn", null), + lastColumn: util.getArg(mapping, "lastGeneratedColumn", null) + }); + + mapping = this._originalMappings[++index]; + } + } + } + + return mappings; + }; + + exports.SourceMapConsumer = SourceMapConsumer; + + /** + * A BasicSourceMapConsumer instance represents a parsed source map which we can + * query for information about the original file positions by giving it a file + * position in the generated source. + * + * The first parameter is the raw source map (either as a JSON string, or + * already parsed to an object). According to the spec, source maps have the + * following attributes: + * + * - version: Which version of the source map spec this map is following. + * - sources: An array of URLs to the original source files. + * - names: An array of identifiers which can be referrenced by individual mappings. + * - sourceRoot: Optional. The URL root from which all sources are relative. + * - sourcesContent: Optional. An array of contents of the original source files. + * - mappings: A string of base64 VLQs which contain the actual mappings. + * - file: Optional. The generated file this source map is associated with. + * + * Here is an example source map, taken from the source map spec[0]: + * + * { + * version : 3, + * file: "out.js", + * sourceRoot : "", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AA,AB;;ABCDE;" + * } + * + * The second parameter, if given, is a string whose value is the URL + * at which the source map was found. This URL is used to compute the + * sources array. + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1# + */ + function BasicSourceMapConsumer(aSourceMap, aSourceMapURL) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === "string") { + sourceMap = util.parseSourceMapInput(aSourceMap); + } + + var version = util.getArg(sourceMap, "version"); + var sources = util.getArg(sourceMap, "sources"); + // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which + // requires the array) to play nice here. + var names = util.getArg(sourceMap, "names", []); + var sourceRoot = util.getArg(sourceMap, "sourceRoot", null); + var sourcesContent = util.getArg(sourceMap, "sourcesContent", null); + var mappings = util.getArg(sourceMap, "mappings"); + var file = util.getArg(sourceMap, "file", null); + + // Once again, Sass deviates from the spec and supplies the version as a + // string rather than a number, so we use loose equality checking here. + if (version != this._version) { + throw new Error("Unsupported version: " + version); + } + + if (sourceRoot) { + sourceRoot = util.normalize(sourceRoot); + } + + sources = sources + .map(String) + // Some source maps produce relative source paths like "./foo.js" instead of + // "foo.js". Normalize these first so that future comparisons will succeed. + // See bugzil.la/1090768. + .map(util.normalize) + // Always ensure that absolute sources are internally stored relative to + // the source root, if the source root is absolute. Not doing this would + // be particularly problematic when the source root is a prefix of the + // source (valid, but why??). See github issue #199 and bugzil.la/1188982. + .map(function(source) { + return sourceRoot && + util.isAbsolute(sourceRoot) && + util.isAbsolute(source) + ? util.relative(sourceRoot, source) + : source; + }); + + // Pass `true` below to allow duplicate names and sources. While source maps + // are intended to be compressed and deduplicated, the TypeScript compiler + // sometimes generates source maps with duplicates in them. See Github issue + // #72 and bugzil.la/889492. + this._names = ArraySet.fromArray(names.map(String), true); + this._sources = ArraySet.fromArray(sources, true); + + this._absoluteSources = this._sources.toArray().map(function(s) { + return util.computeSourceURL(sourceRoot, s, aSourceMapURL); + }); + + this.sourceRoot = sourceRoot; + this.sourcesContent = sourcesContent; + this._mappings = mappings; + this._sourceMapURL = aSourceMapURL; + this.file = file; + } + + BasicSourceMapConsumer.prototype = Object.create( + SourceMapConsumer.prototype + ); + BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer; + + /** + * Utility function to find the index of a source. Returns -1 if not + * found. + */ + BasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) { + var relativeSource = aSource; + if (this.sourceRoot != null) { + relativeSource = util.relative(this.sourceRoot, relativeSource); + } + + if (this._sources.has(relativeSource)) { + return this._sources.indexOf(relativeSource); + } + + // Maybe aSource is an absolute URL as returned by |sources|. In + // this case we can't simply undo the transform. + var i; + for (i = 0; i < this._absoluteSources.length; ++i) { + if (this._absoluteSources[i] == aSource) { + return i; + } + } + + return -1; + }; + + /** + * Create a BasicSourceMapConsumer from a SourceMapGenerator. + * + * @param SourceMapGenerator aSourceMap + * The source map that will be consumed. + * @param String aSourceMapURL + * The URL at which the source map can be found (optional) + * @returns BasicSourceMapConsumer + */ + BasicSourceMapConsumer.fromSourceMap = function SourceMapConsumer_fromSourceMap( + aSourceMap, + aSourceMapURL + ) { + var smc = Object.create(BasicSourceMapConsumer.prototype); + + var names = (smc._names = ArraySet.fromArray( + aSourceMap._names.toArray(), + true + )); + var sources = (smc._sources = ArraySet.fromArray( + aSourceMap._sources.toArray(), + true + )); + smc.sourceRoot = aSourceMap._sourceRoot; + smc.sourcesContent = aSourceMap._generateSourcesContent( + smc._sources.toArray(), + smc.sourceRoot + ); + smc.file = aSourceMap._file; + smc._sourceMapURL = aSourceMapURL; + smc._absoluteSources = smc._sources.toArray().map(function(s) { + return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL); + }); + + // Because we are modifying the entries (by converting string sources and + // names to indices into the sources and names ArraySets), we have to make + // a copy of the entry or else bad things happen. Shared mutable state + // strikes again! See github issue #191. + + var generatedMappings = aSourceMap._mappings.toArray().slice(); + var destGeneratedMappings = (smc.__generatedMappings = []); + var destOriginalMappings = (smc.__originalMappings = []); + + for (var i = 0, length = generatedMappings.length; i < length; i++) { + var srcMapping = generatedMappings[i]; + var destMapping = new Mapping(); + destMapping.generatedLine = srcMapping.generatedLine; + destMapping.generatedColumn = srcMapping.generatedColumn; + + if (srcMapping.source) { + destMapping.source = sources.indexOf(srcMapping.source); + destMapping.originalLine = srcMapping.originalLine; + destMapping.originalColumn = srcMapping.originalColumn; + + if (srcMapping.name) { + destMapping.name = names.indexOf(srcMapping.name); + } + + destOriginalMappings.push(destMapping); + } + + destGeneratedMappings.push(destMapping); + } + + quickSort(smc.__originalMappings, util.compareByOriginalPositions); + + return smc; + }; + + /** + * The version of the source mapping spec that we are consuming. + */ + BasicSourceMapConsumer.prototype._version = 3; + + /** + * The list of original sources. + */ + Object.defineProperty(BasicSourceMapConsumer.prototype, "sources", { + get: function() { + return this._absoluteSources.slice(); + } + }); + + /** + * Provide the JIT with a nice shape / hidden class. + */ + function Mapping() { + this.generatedLine = 0; + this.generatedColumn = 0; + this.source = null; + this.originalLine = null; + this.originalColumn = null; + this.name = null; + } + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + BasicSourceMapConsumer.prototype._parseMappings = function SourceMapConsumer_parseMappings( + aStr, + aSourceRoot + ) { + var generatedLine = 1; + var previousGeneratedColumn = 0; + var previousOriginalLine = 0; + var previousOriginalColumn = 0; + var previousSource = 0; + var previousName = 0; + var length = aStr.length; + var index = 0; + var cachedSegments = {}; + var temp = {}; + var originalMappings = []; + var generatedMappings = []; + var mapping, str, segment, end, value; + + while (index < length) { + if (aStr.charAt(index) === ";") { + generatedLine++; + index++; + previousGeneratedColumn = 0; + } else if (aStr.charAt(index) === ",") { + index++; + } else { + mapping = new Mapping(); + mapping.generatedLine = generatedLine; + + // Because each offset is encoded relative to the previous one, + // many segments often have the same encoding. We can exploit this + // fact by caching the parsed variable length fields of each segment, + // allowing us to avoid a second parse if we encounter the same + // segment again. + for (end = index; end < length; end++) { + if (this._charIsMappingSeparator(aStr, end)) { + break; + } + } + str = aStr.slice(index, end); + + segment = cachedSegments[str]; + if (segment) { + index += str.length; + } else { + segment = []; + while (index < end) { + base64VLQ.decode(aStr, index, temp); + value = temp.value; + index = temp.rest; + segment.push(value); + } + + if (segment.length === 2) { + throw new Error("Found a source, but no line and column"); + } + + if (segment.length === 3) { + throw new Error("Found a source and line, but no column"); + } + + cachedSegments[str] = segment; + } + + // Generated column. + mapping.generatedColumn = previousGeneratedColumn + segment[0]; + previousGeneratedColumn = mapping.generatedColumn; + + if (segment.length > 1) { + // Original source. + mapping.source = previousSource + segment[1]; + previousSource += segment[1]; + + // Original line. + mapping.originalLine = previousOriginalLine + segment[2]; + previousOriginalLine = mapping.originalLine; + // Lines are stored 0-based + mapping.originalLine += 1; + + // Original column. + mapping.originalColumn = previousOriginalColumn + segment[3]; + previousOriginalColumn = mapping.originalColumn; + + if (segment.length > 4) { + // Original name. + mapping.name = previousName + segment[4]; + previousName += segment[4]; + } + } + + generatedMappings.push(mapping); + if (typeof mapping.originalLine === "number") { + originalMappings.push(mapping); + } + } + } + + quickSort( + generatedMappings, + util.compareByGeneratedPositionsDeflated + ); + this.__generatedMappings = generatedMappings; + + quickSort(originalMappings, util.compareByOriginalPositions); + this.__originalMappings = originalMappings; + }; + + /** + * Find the mapping that best matches the hypothetical "needle" mapping that + * we are searching for in the given "haystack" of mappings. + */ + BasicSourceMapConsumer.prototype._findMapping = function SourceMapConsumer_findMapping( + aNeedle, + aMappings, + aLineName, + aColumnName, + aComparator, + aBias + ) { + // To return the position we are searching for, we must first find the + // mapping for the given position and then return the opposite position it + // points to. Because the mappings are sorted, we can use binary search to + // find the best mapping. + + if (aNeedle[aLineName] <= 0) { + throw new TypeError( + "Line must be greater than or equal to 1, got " + + aNeedle[aLineName] + ); + } + if (aNeedle[aColumnName] < 0) { + throw new TypeError( + "Column must be greater than or equal to 0, got " + + aNeedle[aColumnName] + ); + } + + return binarySearch.search(aNeedle, aMappings, aComparator, aBias); + }; + + /** + * Compute the last column for each generated mapping. The last column is + * inclusive. + */ + BasicSourceMapConsumer.prototype.computeColumnSpans = function SourceMapConsumer_computeColumnSpans() { + for (var index = 0; index < this._generatedMappings.length; ++index) { + var mapping = this._generatedMappings[index]; + + // Mappings do not contain a field for the last generated columnt. We + // can come up with an optimistic estimate, however, by assuming that + // mappings are contiguous (i.e. given two consecutive mappings, the + // first mapping ends where the second one starts). + if (index + 1 < this._generatedMappings.length) { + var nextMapping = this._generatedMappings[index + 1]; + + if (mapping.generatedLine === nextMapping.generatedLine) { + mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1; + continue; + } + } + + // The last mapping for each line spans the entire line. + mapping.lastGeneratedColumn = Infinity; + } + }; + + /** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. The line number + * is 1-based. + * - column: The column number in the generated source. The column + * number is 0-based. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. The + * line number is 1-based. + * - column: The column number in the original source, or null. The + * column number is 0-based. + * - name: The original identifier, or null. + */ + BasicSourceMapConsumer.prototype.originalPositionFor = function SourceMapConsumer_originalPositionFor( + aArgs + ) { + var needle = { + generatedLine: util.getArg(aArgs, "line"), + generatedColumn: util.getArg(aArgs, "column") + }; + + var index = this._findMapping( + needle, + this._generatedMappings, + "generatedLine", + "generatedColumn", + util.compareByGeneratedPositionsDeflated, + util.getArg(aArgs, "bias", SourceMapConsumer.GREATEST_LOWER_BOUND) + ); + + if (index >= 0) { + var mapping = this._generatedMappings[index]; + + if (mapping.generatedLine === needle.generatedLine) { + var source = util.getArg(mapping, "source", null); + if (source !== null) { + source = this._sources.at(source); + source = util.computeSourceURL( + this.sourceRoot, + source, + this._sourceMapURL + ); + } + var name = util.getArg(mapping, "name", null); + if (name !== null) { + name = this._names.at(name); + } + return { + source: source, + line: util.getArg(mapping, "originalLine", null), + column: util.getArg(mapping, "originalColumn", null), + name: name + }; + } + } + + return { + source: null, + line: null, + column: null, + name: null + }; + }; + + /** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ + BasicSourceMapConsumer.prototype.hasContentsOfAllSources = function BasicSourceMapConsumer_hasContentsOfAllSources() { + if (!this.sourcesContent) { + return false; + } + return ( + this.sourcesContent.length >= this._sources.size() && + !this.sourcesContent.some(function(sc) { + return sc == null; + }) + ); + }; + + /** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ + BasicSourceMapConsumer.prototype.sourceContentFor = function SourceMapConsumer_sourceContentFor( + aSource, + nullOnMissing + ) { + if (!this.sourcesContent) { + return null; + } + + var index = this._findSourceIndex(aSource); + if (index >= 0) { + return this.sourcesContent[index]; + } + + var relativeSource = aSource; + if (this.sourceRoot != null) { + relativeSource = util.relative(this.sourceRoot, relativeSource); + } + + var url; + if ( + this.sourceRoot != null && + (url = util.urlParse(this.sourceRoot)) + ) { + // XXX: file:// URIs and absolute paths lead to unexpected behavior for + // many users. We can help them out when they expect file:// URIs to + // behave like it would if they were running a local HTTP server. See + // https://bugzilla.mozilla.org/show_bug.cgi?id=885597. + var fileUriAbsPath = relativeSource.replace(/^file:\/\//, ""); + if (url.scheme == "file" && this._sources.has(fileUriAbsPath)) { + return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]; + } + + if ( + (!url.path || url.path == "/") && + this._sources.has("/" + relativeSource) + ) { + return this.sourcesContent[ + this._sources.indexOf("/" + relativeSource) + ]; + } + } + + // This function is used recursively from + // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we + // don't want to throw if we can't find the source - we just want to + // return null, so we provide a flag to exit gracefully. + if (nullOnMissing) { + return null; + } else { + throw new Error( + '"' + relativeSource + '" is not in the SourceMap.' + ); + } + }; + + /** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. The line number + * is 1-based. + * - column: The column number in the original source. The column + * number is 0-based. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. The + * line number is 1-based. + * - column: The column number in the generated source, or null. + * The column number is 0-based. + */ + BasicSourceMapConsumer.prototype.generatedPositionFor = function SourceMapConsumer_generatedPositionFor( + aArgs + ) { + var source = util.getArg(aArgs, "source"); + source = this._findSourceIndex(source); + if (source < 0) { + return { + line: null, + column: null, + lastColumn: null + }; + } + + var needle = { + source: source, + originalLine: util.getArg(aArgs, "line"), + originalColumn: util.getArg(aArgs, "column") + }; + + var index = this._findMapping( + needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions, + util.getArg(aArgs, "bias", SourceMapConsumer.GREATEST_LOWER_BOUND) + ); + + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (mapping.source === needle.source) { + return { + line: util.getArg(mapping, "generatedLine", null), + column: util.getArg(mapping, "generatedColumn", null), + lastColumn: util.getArg(mapping, "lastGeneratedColumn", null) + }; + } + } + + return { + line: null, + column: null, + lastColumn: null + }; + }; + + exports.BasicSourceMapConsumer = BasicSourceMapConsumer; + + /** + * An IndexedSourceMapConsumer instance represents a parsed source map which + * we can query for information. It differs from BasicSourceMapConsumer in + * that it takes "indexed" source maps (i.e. ones with a "sections" field) as + * input. + * + * The first parameter is a raw source map (either as a JSON string, or already + * parsed to an object). According to the spec for indexed source maps, they + * have the following attributes: + * + * - version: Which version of the source map spec this map is following. + * - file: Optional. The generated file this source map is associated with. + * - sections: A list of section definitions. + * + * Each value under the "sections" field has two fields: + * - offset: The offset into the original specified at which this section + * begins to apply, defined as an object with a "line" and "column" + * field. + * - map: A source map definition. This source map could also be indexed, + * but doesn't have to be. + * + * Instead of the "map" field, it's also possible to have a "url" field + * specifying a URL to retrieve a source map from, but that's currently + * unsupported. + * + * Here's an example source map, taken from the source map spec[0], but + * modified to omit a section which uses the "url" field. + * + * { + * version : 3, + * file: "app.js", + * sections: [{ + * offset: {line:100, column:10}, + * map: { + * version : 3, + * file: "section.js", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AAAA,E;;ABCDE;" + * } + * }], + * } + * + * The second parameter, if given, is a string whose value is the URL + * at which the source map was found. This URL is used to compute the + * sources array. + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt + */ + function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === "string") { + sourceMap = util.parseSourceMapInput(aSourceMap); + } + + var version = util.getArg(sourceMap, "version"); + var sections = util.getArg(sourceMap, "sections"); + + if (version != this._version) { + throw new Error("Unsupported version: " + version); + } + + this._sources = new ArraySet(); + this._names = new ArraySet(); + + var lastOffset = { + line: -1, + column: 0 + }; + this._sections = sections.map(function(s) { + if (s.url) { + // The url field will require support for asynchronicity. + // See https://github.com/mozilla/source-map/issues/16 + throw new Error( + "Support for url field in sections not implemented." + ); + } + var offset = util.getArg(s, "offset"); + var offsetLine = util.getArg(offset, "line"); + var offsetColumn = util.getArg(offset, "column"); + + if ( + offsetLine < lastOffset.line || + (offsetLine === lastOffset.line && + offsetColumn < lastOffset.column) + ) { + throw new Error( + "Section offsets must be ordered and non-overlapping." + ); + } + lastOffset = offset; + + return { + generatedOffset: { + // The offset fields are 0-based, but we use 1-based indices when + // encoding/decoding from VLQ. + generatedLine: offsetLine + 1, + generatedColumn: offsetColumn + 1 + }, + consumer: new SourceMapConsumer( + util.getArg(s, "map"), + aSourceMapURL + ) + }; + }); + } + + IndexedSourceMapConsumer.prototype = Object.create( + SourceMapConsumer.prototype + ); + IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer; + + /** + * The version of the source mapping spec that we are consuming. + */ + IndexedSourceMapConsumer.prototype._version = 3; + + /** + * The list of original sources. + */ + Object.defineProperty(IndexedSourceMapConsumer.prototype, "sources", { + get: function() { + var sources = []; + for (var i = 0; i < this._sections.length; i++) { + for ( + var j = 0; + j < this._sections[i].consumer.sources.length; + j++ + ) { + sources.push(this._sections[i].consumer.sources[j]); + } + } + return sources; + } + }); + + /** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. The line number + * is 1-based. + * - column: The column number in the generated source. The column + * number is 0-based. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. The + * line number is 1-based. + * - column: The column number in the original source, or null. The + * column number is 0-based. + * - name: The original identifier, or null. + */ + IndexedSourceMapConsumer.prototype.originalPositionFor = function IndexedSourceMapConsumer_originalPositionFor( + aArgs + ) { + var needle = { + generatedLine: util.getArg(aArgs, "line"), + generatedColumn: util.getArg(aArgs, "column") + }; + + // Find the section containing the generated position we're trying to map + // to an original position. + var sectionIndex = binarySearch.search( + needle, + this._sections, + function(needle, section) { + var cmp = + needle.generatedLine - section.generatedOffset.generatedLine; + if (cmp) { + return cmp; + } + + return ( + needle.generatedColumn - section.generatedOffset.generatedColumn + ); + } + ); + var section = this._sections[sectionIndex]; + + if (!section) { + return { + source: null, + line: null, + column: null, + name: null + }; + } + + return section.consumer.originalPositionFor({ + line: + needle.generatedLine - + (section.generatedOffset.generatedLine - 1), + column: + needle.generatedColumn - + (section.generatedOffset.generatedLine === needle.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + bias: aArgs.bias + }); + }; + + /** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ + IndexedSourceMapConsumer.prototype.hasContentsOfAllSources = function IndexedSourceMapConsumer_hasContentsOfAllSources() { + return this._sections.every(function(s) { + return s.consumer.hasContentsOfAllSources(); + }); + }; + + /** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ + IndexedSourceMapConsumer.prototype.sourceContentFor = function IndexedSourceMapConsumer_sourceContentFor( + aSource, + nullOnMissing + ) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + + var content = section.consumer.sourceContentFor(aSource, true); + if (content) { + return content; + } + } + if (nullOnMissing) { + return null; + } else { + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } + }; + + /** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. The line number + * is 1-based. + * - column: The column number in the original source. The column + * number is 0-based. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. The + * line number is 1-based. + * - column: The column number in the generated source, or null. + * The column number is 0-based. + */ + IndexedSourceMapConsumer.prototype.generatedPositionFor = function IndexedSourceMapConsumer_generatedPositionFor( + aArgs + ) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + + // Only consider this section if the requested source is in the list of + // sources of the consumer. + if ( + section.consumer._findSourceIndex( + util.getArg(aArgs, "source") + ) === -1 + ) { + continue; + } + var generatedPosition = section.consumer.generatedPositionFor( + aArgs + ); + if (generatedPosition) { + var ret = { + line: + generatedPosition.line + + (section.generatedOffset.generatedLine - 1), + column: + generatedPosition.column + + (section.generatedOffset.generatedLine === + generatedPosition.line + ? section.generatedOffset.generatedColumn - 1 + : 0) + }; + return ret; + } + } + + return { + line: null, + column: null + }; + }; + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + IndexedSourceMapConsumer.prototype._parseMappings = function IndexedSourceMapConsumer_parseMappings( + aStr, + aSourceRoot + ) { + this.__generatedMappings = []; + this.__originalMappings = []; + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + var sectionMappings = section.consumer._generatedMappings; + for (var j = 0; j < sectionMappings.length; j++) { + var mapping = sectionMappings[j]; + + var source = section.consumer._sources.at(mapping.source); + source = util.computeSourceURL( + section.consumer.sourceRoot, + source, + this._sourceMapURL + ); + this._sources.add(source); + source = this._sources.indexOf(source); + + var name = null; + if (mapping.name) { + name = section.consumer._names.at(mapping.name); + this._names.add(name); + name = this._names.indexOf(name); + } + + // The mappings coming from the consumer for the section have + // generated positions relative to the start of the section, so we + // need to offset them to be relative to the start of the concatenated + // generated file. + var adjustedMapping = { + source: source, + generatedLine: + mapping.generatedLine + + (section.generatedOffset.generatedLine - 1), + generatedColumn: + mapping.generatedColumn + + (section.generatedOffset.generatedLine === + mapping.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: name + }; + + this.__generatedMappings.push(adjustedMapping); + if (typeof adjustedMapping.originalLine === "number") { + this.__originalMappings.push(adjustedMapping); + } + } + } + + quickSort( + this.__generatedMappings, + util.compareByGeneratedPositionsDeflated + ); + quickSort(this.__originalMappings, util.compareByOriginalPositions); + }; + + exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer; + }, + { + "./array-set": 145, + "./base64-vlq": 146, + "./binary-search": 148, + "./quick-sort": 150, + "./util": 154 + } + ], + 152: [ + function(require, module, exports) { + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var base64VLQ = require("./base64-vlq"); + var util = require("./util"); + var ArraySet = require("./array-set").ArraySet; + var MappingList = require("./mapping-list").MappingList; + + /** + * An instance of the SourceMapGenerator represents a source map which is + * being built incrementally. You may pass an object with the following + * properties: + * + * - file: The filename of the generated source. + * - sourceRoot: A root for all relative URLs in this source map. + */ + function SourceMapGenerator(aArgs) { + if (!aArgs) { + aArgs = {}; + } + this._file = util.getArg(aArgs, "file", null); + this._sourceRoot = util.getArg(aArgs, "sourceRoot", null); + this._skipValidation = util.getArg(aArgs, "skipValidation", false); + this._sources = new ArraySet(); + this._names = new ArraySet(); + this._mappings = new MappingList(); + this._sourcesContents = null; + } + + SourceMapGenerator.prototype._version = 3; + + /** + * Creates a new SourceMapGenerator based on a SourceMapConsumer + * + * @param aSourceMapConsumer The SourceMap. + */ + SourceMapGenerator.fromSourceMap = function SourceMapGenerator_fromSourceMap( + aSourceMapConsumer + ) { + var sourceRoot = aSourceMapConsumer.sourceRoot; + var generator = new SourceMapGenerator({ + file: aSourceMapConsumer.file, + sourceRoot: sourceRoot + }); + aSourceMapConsumer.eachMapping(function(mapping) { + var newMapping = { + generated: { + line: mapping.generatedLine, + column: mapping.generatedColumn + } + }; + + if (mapping.source != null) { + newMapping.source = mapping.source; + if (sourceRoot != null) { + newMapping.source = util.relative( + sourceRoot, + newMapping.source + ); + } + + newMapping.original = { + line: mapping.originalLine, + column: mapping.originalColumn + }; + + if (mapping.name != null) { + newMapping.name = mapping.name; + } + } + + generator.addMapping(newMapping); + }); + aSourceMapConsumer.sources.forEach(function(sourceFile) { + var sourceRelative = sourceFile; + if (sourceRoot !== null) { + sourceRelative = util.relative(sourceRoot, sourceFile); + } + + if (!generator._sources.has(sourceRelative)) { + generator._sources.add(sourceRelative); + } + + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + generator.setSourceContent(sourceFile, content); + } + }); + return generator; + }; + + /** + * Add a single mapping from original source line and column to the generated + * source's line and column for this source map being created. The mapping + * object should have the following properties: + * + * - generated: An object with the generated line and column positions. + * - original: An object with the original line and column positions. + * - source: The original source file (relative to the sourceRoot). + * - name: An optional original token name for this mapping. + */ + SourceMapGenerator.prototype.addMapping = function SourceMapGenerator_addMapping( + aArgs + ) { + var generated = util.getArg(aArgs, "generated"); + var original = util.getArg(aArgs, "original", null); + var source = util.getArg(aArgs, "source", null); + var name = util.getArg(aArgs, "name", null); + + if (!this._skipValidation) { + this._validateMapping(generated, original, source, name); + } + + if (source != null) { + source = String(source); + if (!this._sources.has(source)) { + this._sources.add(source); + } + } + + if (name != null) { + name = String(name); + if (!this._names.has(name)) { + this._names.add(name); + } + } + + this._mappings.add({ + generatedLine: generated.line, + generatedColumn: generated.column, + originalLine: original != null && original.line, + originalColumn: original != null && original.column, + source: source, + name: name + }); + }; + + /** + * Set the source content for a source file. + */ + SourceMapGenerator.prototype.setSourceContent = function SourceMapGenerator_setSourceContent( + aSourceFile, + aSourceContent + ) { + var source = aSourceFile; + if (this._sourceRoot != null) { + source = util.relative(this._sourceRoot, source); + } + + if (aSourceContent != null) { + // Add the source content to the _sourcesContents map. + // Create a new _sourcesContents map if the property is null. + if (!this._sourcesContents) { + this._sourcesContents = Object.create(null); + } + this._sourcesContents[util.toSetString(source)] = aSourceContent; + } else if (this._sourcesContents) { + // Remove the source file from the _sourcesContents map. + // If the _sourcesContents map is empty, set the property to null. + delete this._sourcesContents[util.toSetString(source)]; + if (Object.keys(this._sourcesContents).length === 0) { + this._sourcesContents = null; + } + } + }; + + /** + * Applies the mappings of a sub-source-map for a specific source file to the + * source map being generated. Each mapping to the supplied source file is + * rewritten using the supplied source map. Note: The resolution for the + * resulting mappings is the minimium of this map and the supplied map. + * + * @param aSourceMapConsumer The source map to be applied. + * @param aSourceFile Optional. The filename of the source file. + * If omitted, SourceMapConsumer's file property will be used. + * @param aSourceMapPath Optional. The dirname of the path to the source map + * to be applied. If relative, it is relative to the SourceMapConsumer. + * This parameter is needed when the two source maps aren't in the same + * directory, and the source map to be applied contains relative source + * paths. If so, those relative source paths need to be rewritten + * relative to the SourceMapGenerator. + */ + SourceMapGenerator.prototype.applySourceMap = function SourceMapGenerator_applySourceMap( + aSourceMapConsumer, + aSourceFile, + aSourceMapPath + ) { + var sourceFile = aSourceFile; + // If aSourceFile is omitted, we will use the file property of the SourceMap + if (aSourceFile == null) { + if (aSourceMapConsumer.file == null) { + throw new Error( + "SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, " + + 'or the source map\'s "file" property. Both were omitted.' + ); + } + sourceFile = aSourceMapConsumer.file; + } + var sourceRoot = this._sourceRoot; + // Make "sourceFile" relative if an absolute Url is passed. + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + // Applying the SourceMap can add and remove items from the sources and + // the names array. + var newSources = new ArraySet(); + var newNames = new ArraySet(); + + // Find mappings for the "sourceFile" + this._mappings.unsortedForEach(function(mapping) { + if (mapping.source === sourceFile && mapping.originalLine != null) { + // Check if it can be mapped by the source map, then update the mapping. + var original = aSourceMapConsumer.originalPositionFor({ + line: mapping.originalLine, + column: mapping.originalColumn + }); + if (original.source != null) { + // Copy mapping + mapping.source = original.source; + if (aSourceMapPath != null) { + mapping.source = util.join(aSourceMapPath, mapping.source); + } + if (sourceRoot != null) { + mapping.source = util.relative(sourceRoot, mapping.source); + } + mapping.originalLine = original.line; + mapping.originalColumn = original.column; + if (original.name != null) { + mapping.name = original.name; + } + } + } + + var source = mapping.source; + if (source != null && !newSources.has(source)) { + newSources.add(source); + } + + var name = mapping.name; + if (name != null && !newNames.has(name)) { + newNames.add(name); + } + }, this); + this._sources = newSources; + this._names = newNames; + + // Copy sourcesContents of applied map. + aSourceMapConsumer.sources.forEach(function(sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aSourceMapPath != null) { + sourceFile = util.join(aSourceMapPath, sourceFile); + } + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + this.setSourceContent(sourceFile, content); + } + }, this); + }; + + /** + * A mapping can have one of the three levels of data: + * + * 1. Just the generated position. + * 2. The Generated position, original position, and original source. + * 3. Generated and original position, original source, as well as a name + * token. + * + * To maintain consistency, we validate that any new mapping being added falls + * in to one of these categories. + */ + SourceMapGenerator.prototype._validateMapping = function SourceMapGenerator_validateMapping( + aGenerated, + aOriginal, + aSource, + aName + ) { + // When aOriginal is truthy but has empty values for .line and .column, + // it is most likely a programmer error. In this case we throw a very + // specific error message to try to guide them the right way. + // For example: https://github.com/Polymer/polymer-bundler/pull/519 + if ( + aOriginal && + typeof aOriginal.line !== "number" && + typeof aOriginal.column !== "number" + ) { + throw new Error( + "original.line and original.column are not numbers -- you probably meant to omit " + + "the original mapping entirely and only map the generated position. If so, pass " + + "null for the original mapping instead of an object with empty or null values." + ); + } + + if ( + aGenerated && + "line" in aGenerated && + "column" in aGenerated && + aGenerated.line > 0 && + aGenerated.column >= 0 && + !aOriginal && + !aSource && + !aName + ) { + // Case 1. + return; + } else if ( + aGenerated && + "line" in aGenerated && + "column" in aGenerated && + aOriginal && + "line" in aOriginal && + "column" in aOriginal && + aGenerated.line > 0 && + aGenerated.column >= 0 && + aOriginal.line > 0 && + aOriginal.column >= 0 && + aSource + ) { + // Cases 2 and 3. + return; + } else { + throw new Error( + "Invalid mapping: " + + JSON.stringify({ + generated: aGenerated, + source: aSource, + original: aOriginal, + name: aName + }) + ); + } + }; + + /** + * Serialize the accumulated mappings in to the stream of base 64 VLQs + * specified by the source map format. + */ + SourceMapGenerator.prototype._serializeMappings = function SourceMapGenerator_serializeMappings() { + var previousGeneratedColumn = 0; + var previousGeneratedLine = 1; + var previousOriginalColumn = 0; + var previousOriginalLine = 0; + var previousName = 0; + var previousSource = 0; + var result = ""; + var next; + var mapping; + var nameIdx; + var sourceIdx; + + var mappings = this._mappings.toArray(); + for (var i = 0, len = mappings.length; i < len; i++) { + mapping = mappings[i]; + next = ""; + + if (mapping.generatedLine !== previousGeneratedLine) { + previousGeneratedColumn = 0; + while (mapping.generatedLine !== previousGeneratedLine) { + next += ";"; + previousGeneratedLine++; + } + } else { + if (i > 0) { + if ( + !util.compareByGeneratedPositionsInflated( + mapping, + mappings[i - 1] + ) + ) { + continue; + } + next += ","; + } + } + + next += base64VLQ.encode( + mapping.generatedColumn - previousGeneratedColumn + ); + previousGeneratedColumn = mapping.generatedColumn; + + if (mapping.source != null) { + sourceIdx = this._sources.indexOf(mapping.source); + next += base64VLQ.encode(sourceIdx - previousSource); + previousSource = sourceIdx; + + // lines are stored 0-based in SourceMap spec version 3 + next += base64VLQ.encode( + mapping.originalLine - 1 - previousOriginalLine + ); + previousOriginalLine = mapping.originalLine - 1; + + next += base64VLQ.encode( + mapping.originalColumn - previousOriginalColumn + ); + previousOriginalColumn = mapping.originalColumn; + + if (mapping.name != null) { + nameIdx = this._names.indexOf(mapping.name); + next += base64VLQ.encode(nameIdx - previousName); + previousName = nameIdx; + } + } + + result += next; + } + + return result; + }; + + SourceMapGenerator.prototype._generateSourcesContent = function SourceMapGenerator_generateSourcesContent( + aSources, + aSourceRoot + ) { + return aSources.map(function(source) { + if (!this._sourcesContents) { + return null; + } + if (aSourceRoot != null) { + source = util.relative(aSourceRoot, source); + } + var key = util.toSetString(source); + return Object.prototype.hasOwnProperty.call( + this._sourcesContents, + key + ) + ? this._sourcesContents[key] + : null; + }, this); + }; + + /** + * Externalize the source map. + */ + SourceMapGenerator.prototype.toJSON = function SourceMapGenerator_toJSON() { + var map = { + version: this._version, + sources: this._sources.toArray(), + names: this._names.toArray(), + mappings: this._serializeMappings() + }; + if (this._file != null) { + map.file = this._file; + } + if (this._sourceRoot != null) { + map.sourceRoot = this._sourceRoot; + } + if (this._sourcesContents) { + map.sourcesContent = this._generateSourcesContent( + map.sources, + map.sourceRoot + ); + } + + return map; + }; + + /** + * Render the source map being generated to a string. + */ + SourceMapGenerator.prototype.toString = function SourceMapGenerator_toString() { + return JSON.stringify(this.toJSON()); + }; + + exports.SourceMapGenerator = SourceMapGenerator; + }, + { + "./array-set": 145, + "./base64-vlq": 146, + "./mapping-list": 149, + "./util": 154 + } + ], + 153: [ + function(require, module, exports) { + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var SourceMapGenerator = require("./source-map-generator") + .SourceMapGenerator; + var util = require("./util"); + + // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other + // operating systems these days (capturing the result). + var REGEX_NEWLINE = /(\r?\n)/; + + // Newline character code for charCodeAt() comparisons + var NEWLINE_CODE = 10; + + // Private symbol for identifying `SourceNode`s when multiple versions of + // the source-map library are loaded. This MUST NOT CHANGE across + // versions! + var isSourceNode = "$$$isSourceNode$$$"; + + /** + * SourceNodes provide a way to abstract over interpolating/concatenating + * snippets of generated JavaScript source code while maintaining the line and + * column information associated with the original source code. + * + * @param aLine The original line number. + * @param aColumn The original column number. + * @param aSource The original source's filename. + * @param aChunks Optional. An array of strings which are snippets of + * generated JS, or other SourceNodes. + * @param aName The original identifier. + */ + function SourceNode(aLine, aColumn, aSource, aChunks, aName) { + this.children = []; + this.sourceContents = {}; + this.line = aLine == null ? null : aLine; + this.column = aColumn == null ? null : aColumn; + this.source = aSource == null ? null : aSource; + this.name = aName == null ? null : aName; + this[isSourceNode] = true; + if (aChunks != null) this.add(aChunks); + } + + /** + * Creates a SourceNode from generated code and a SourceMapConsumer. + * + * @param aGeneratedCode The generated code + * @param aSourceMapConsumer The SourceMap for the generated code + * @param aRelativePath Optional. The path that relative sources in the + * SourceMapConsumer should be relative to. + */ + SourceNode.fromStringWithSourceMap = function SourceNode_fromStringWithSourceMap( + aGeneratedCode, + aSourceMapConsumer, + aRelativePath + ) { + // The SourceNode we want to fill with the generated code + // and the SourceMap + var node = new SourceNode(); + + // All even indices of this array are one line of the generated code, + // while all odd indices are the newlines between two adjacent lines + // (since `REGEX_NEWLINE` captures its match). + // Processed fragments are accessed by calling `shiftNextLine`. + var remainingLines = aGeneratedCode.split(REGEX_NEWLINE); + var remainingLinesIndex = 0; + var shiftNextLine = function() { + var lineContents = getNextLine(); + // The last line of a file might not have a newline. + var newLine = getNextLine() || ""; + return lineContents + newLine; + + function getNextLine() { + return remainingLinesIndex < remainingLines.length + ? remainingLines[remainingLinesIndex++] + : undefined; + } + }; + + // We need to remember the position of "remainingLines" + var lastGeneratedLine = 1, + lastGeneratedColumn = 0; + + // The generate SourceNodes we need a code range. + // To extract it current and last mapping is used. + // Here we store the last mapping. + var lastMapping = null; + + aSourceMapConsumer.eachMapping(function(mapping) { + if (lastMapping !== null) { + // We add the code from "lastMapping" to "mapping": + // First check if there is a new line in between. + if (lastGeneratedLine < mapping.generatedLine) { + // Associate first line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + lastGeneratedLine++; + lastGeneratedColumn = 0; + // The remaining code is added without mapping + } else { + // There is no new line in between. + // Associate the code between "lastGeneratedColumn" and + // "mapping.generatedColumn" with "lastMapping" + var nextLine = remainingLines[remainingLinesIndex] || ""; + var code = nextLine.substr( + 0, + mapping.generatedColumn - lastGeneratedColumn + ); + remainingLines[remainingLinesIndex] = nextLine.substr( + mapping.generatedColumn - lastGeneratedColumn + ); + lastGeneratedColumn = mapping.generatedColumn; + addMappingWithCode(lastMapping, code); + // No more remaining code, continue + lastMapping = mapping; + return; + } + } + // We add the generated code until the first mapping + // to the SourceNode without any mapping. + // Each line is added as separate string. + while (lastGeneratedLine < mapping.generatedLine) { + node.add(shiftNextLine()); + lastGeneratedLine++; + } + if (lastGeneratedColumn < mapping.generatedColumn) { + var nextLine = remainingLines[remainingLinesIndex] || ""; + node.add(nextLine.substr(0, mapping.generatedColumn)); + remainingLines[remainingLinesIndex] = nextLine.substr( + mapping.generatedColumn + ); + lastGeneratedColumn = mapping.generatedColumn; + } + lastMapping = mapping; + }, this); + // We have processed all mappings. + if (remainingLinesIndex < remainingLines.length) { + if (lastMapping) { + // Associate the remaining code in the current line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + } + // and add the remaining lines without any mapping + node.add(remainingLines.splice(remainingLinesIndex).join("")); + } + + // Copy sourcesContent into SourceNode + aSourceMapConsumer.sources.forEach(function(sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aRelativePath != null) { + sourceFile = util.join(aRelativePath, sourceFile); + } + node.setSourceContent(sourceFile, content); + } + }); + + return node; + + function addMappingWithCode(mapping, code) { + if (mapping === null || mapping.source === undefined) { + node.add(code); + } else { + var source = aRelativePath + ? util.join(aRelativePath, mapping.source) + : mapping.source; + node.add( + new SourceNode( + mapping.originalLine, + mapping.originalColumn, + source, + code, + mapping.name + ) + ); + } + } + }; + + /** + * Add a chunk of generated JS to this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + SourceNode.prototype.add = function SourceNode_add(aChunk) { + if (Array.isArray(aChunk)) { + aChunk.forEach(function(chunk) { + this.add(chunk); + }, this); + } else if (aChunk[isSourceNode] || typeof aChunk === "string") { + if (aChunk) { + this.children.push(aChunk); + } + } else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + + aChunk + ); + } + return this; + }; + + /** + * Add a chunk of generated JS to the beginning of this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) { + if (Array.isArray(aChunk)) { + for (var i = aChunk.length - 1; i >= 0; i--) { + this.prepend(aChunk[i]); + } + } else if (aChunk[isSourceNode] || typeof aChunk === "string") { + this.children.unshift(aChunk); + } else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + + aChunk + ); + } + return this; + }; + + /** + * Walk over the tree of JS snippets in this node and its children. The + * walking function is called once for each snippet of JS and is passed that + * snippet and the its original associated source's line/column location. + * + * @param aFn The traversal function. + */ + SourceNode.prototype.walk = function SourceNode_walk(aFn) { + var chunk; + for (var i = 0, len = this.children.length; i < len; i++) { + chunk = this.children[i]; + if (chunk[isSourceNode]) { + chunk.walk(aFn); + } else { + if (chunk !== "") { + aFn(chunk, { + source: this.source, + line: this.line, + column: this.column, + name: this.name + }); + } + } + } + }; + + /** + * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between + * each of `this.children`. + * + * @param aSep The separator. + */ + SourceNode.prototype.join = function SourceNode_join(aSep) { + var newChildren; + var i; + var len = this.children.length; + if (len > 0) { + newChildren = []; + for (i = 0; i < len - 1; i++) { + newChildren.push(this.children[i]); + newChildren.push(aSep); + } + newChildren.push(this.children[i]); + this.children = newChildren; + } + return this; + }; + + /** + * Call String.prototype.replace on the very right-most source snippet. Useful + * for trimming whitespace from the end of a source node, etc. + * + * @param aPattern The pattern to replace. + * @param aReplacement The thing to replace the pattern with. + */ + SourceNode.prototype.replaceRight = function SourceNode_replaceRight( + aPattern, + aReplacement + ) { + var lastChild = this.children[this.children.length - 1]; + if (lastChild[isSourceNode]) { + lastChild.replaceRight(aPattern, aReplacement); + } else if (typeof lastChild === "string") { + this.children[this.children.length - 1] = lastChild.replace( + aPattern, + aReplacement + ); + } else { + this.children.push("".replace(aPattern, aReplacement)); + } + return this; + }; + + /** + * Set the source content for a source file. This will be added to the SourceMapGenerator + * in the sourcesContent field. + * + * @param aSourceFile The filename of the source file + * @param aSourceContent The content of the source file + */ + SourceNode.prototype.setSourceContent = function SourceNode_setSourceContent( + aSourceFile, + aSourceContent + ) { + this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent; + }; + + /** + * Walk over the tree of SourceNodes. The walking function is called for each + * source file content and is passed the filename and source content. + * + * @param aFn The traversal function. + */ + SourceNode.prototype.walkSourceContents = function SourceNode_walkSourceContents( + aFn + ) { + for (var i = 0, len = this.children.length; i < len; i++) { + if (this.children[i][isSourceNode]) { + this.children[i].walkSourceContents(aFn); + } + } + + var sources = Object.keys(this.sourceContents); + for (var i = 0, len = sources.length; i < len; i++) { + aFn( + util.fromSetString(sources[i]), + this.sourceContents[sources[i]] + ); + } + }; + + /** + * Return the string representation of this source node. Walks over the tree + * and concatenates all the various snippets together to one string. + */ + SourceNode.prototype.toString = function SourceNode_toString() { + var str = ""; + this.walk(function(chunk) { + str += chunk; + }); + return str; + }; + + /** + * Returns the string representation of this source node along with a source + * map. + */ + SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap( + aArgs + ) { + var generated = { + code: "", + line: 1, + column: 0 + }; + var map = new SourceMapGenerator(aArgs); + var sourceMappingActive = false; + var lastOriginalSource = null; + var lastOriginalLine = null; + var lastOriginalColumn = null; + var lastOriginalName = null; + this.walk(function(chunk, original) { + generated.code += chunk; + if ( + original.source !== null && + original.line !== null && + original.column !== null + ) { + if ( + lastOriginalSource !== original.source || + lastOriginalLine !== original.line || + lastOriginalColumn !== original.column || + lastOriginalName !== original.name + ) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + lastOriginalSource = original.source; + lastOriginalLine = original.line; + lastOriginalColumn = original.column; + lastOriginalName = original.name; + sourceMappingActive = true; + } else if (sourceMappingActive) { + map.addMapping({ + generated: { + line: generated.line, + column: generated.column + } + }); + lastOriginalSource = null; + sourceMappingActive = false; + } + for (var idx = 0, length = chunk.length; idx < length; idx++) { + if (chunk.charCodeAt(idx) === NEWLINE_CODE) { + generated.line++; + generated.column = 0; + // Mappings end at eol + if (idx + 1 === length) { + lastOriginalSource = null; + sourceMappingActive = false; + } else if (sourceMappingActive) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + } else { + generated.column++; + } + } + }); + this.walkSourceContents(function(sourceFile, sourceContent) { + map.setSourceContent(sourceFile, sourceContent); + }); + + return { code: generated.code, map: map }; + }; + + exports.SourceNode = SourceNode; + }, + { "./source-map-generator": 152, "./util": 154 } + ], + 154: [ + function(require, module, exports) { + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + /** + * This is a helper function for getting values from parameter/options + * objects. + * + * @param args The object we are extracting values from + * @param name The name of the property we are getting. + * @param defaultValue An optional value to return if the property is missing + * from the object. If this is not specified and the property is missing, an + * error will be thrown. + */ + function getArg(aArgs, aName, aDefaultValue) { + if (aName in aArgs) { + return aArgs[aName]; + } else if (arguments.length === 3) { + return aDefaultValue; + } else { + throw new Error('"' + aName + '" is a required argument.'); + } + } + exports.getArg = getArg; + + var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/; + var dataUrlRegexp = /^data:.+\,.+$/; + + function urlParse(aUrl) { + var match = aUrl.match(urlRegexp); + if (!match) { + return null; + } + return { + scheme: match[1], + auth: match[2], + host: match[3], + port: match[4], + path: match[5] + }; + } + exports.urlParse = urlParse; + + function urlGenerate(aParsedUrl) { + var url = ""; + if (aParsedUrl.scheme) { + url += aParsedUrl.scheme + ":"; + } + url += "//"; + if (aParsedUrl.auth) { + url += aParsedUrl.auth + "@"; + } + if (aParsedUrl.host) { + url += aParsedUrl.host; + } + if (aParsedUrl.port) { + url += ":" + aParsedUrl.port; + } + if (aParsedUrl.path) { + url += aParsedUrl.path; + } + return url; + } + exports.urlGenerate = urlGenerate; + + /** + * Normalizes a path, or the path portion of a URL: + * + * - Replaces consecutive slashes with one slash. + * - Removes unnecessary '.' parts. + * - Removes unnecessary '/..' parts. + * + * Based on code in the Node.js 'path' core module. + * + * @param aPath The path or url to normalize. + */ + function normalize(aPath) { + var path = aPath; + var url = urlParse(aPath); + if (url) { + if (!url.path) { + return aPath; + } + path = url.path; + } + var isAbsolute = exports.isAbsolute(path); + + var parts = path.split(/\/+/); + for (var part, up = 0, i = parts.length - 1; i >= 0; i--) { + part = parts[i]; + if (part === ".") { + parts.splice(i, 1); + } else if (part === "..") { + up++; + } else if (up > 0) { + if (part === "") { + // The first part is blank if the path is absolute. Trying to go + // above the root is a no-op. Therefore we can remove all '..' parts + // directly after the root. + parts.splice(i + 1, up); + up = 0; + } else { + parts.splice(i, 2); + up--; + } + } + } + path = parts.join("/"); + + if (path === "") { + path = isAbsolute ? "/" : "."; + } + + if (url) { + url.path = path; + return urlGenerate(url); + } + return path; + } + exports.normalize = normalize; + + /** + * Joins two paths/URLs. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be joined with the root. + * + * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a + * scheme-relative URL: Then the scheme of aRoot, if any, is prepended + * first. + * - Otherwise aPath is a path. If aRoot is a URL, then its path portion + * is updated with the result and aRoot is returned. Otherwise the result + * is returned. + * - If aPath is absolute, the result is aPath. + * - Otherwise the two paths are joined with a slash. + * - Joining for example 'http://' and 'www.example.com' is also supported. + */ + function join(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + if (aPath === "") { + aPath = "."; + } + var aPathUrl = urlParse(aPath); + var aRootUrl = urlParse(aRoot); + if (aRootUrl) { + aRoot = aRootUrl.path || "/"; + } + + // `join(foo, '//www.example.org')` + if (aPathUrl && !aPathUrl.scheme) { + if (aRootUrl) { + aPathUrl.scheme = aRootUrl.scheme; + } + return urlGenerate(aPathUrl); + } + + if (aPathUrl || aPath.match(dataUrlRegexp)) { + return aPath; + } + + // `join('http://', 'www.example.com')` + if (aRootUrl && !aRootUrl.host && !aRootUrl.path) { + aRootUrl.host = aPath; + return urlGenerate(aRootUrl); + } + + var joined = + aPath.charAt(0) === "/" + ? aPath + : normalize(aRoot.replace(/\/+$/, "") + "/" + aPath); + + if (aRootUrl) { + aRootUrl.path = joined; + return urlGenerate(aRootUrl); + } + return joined; + } + exports.join = join; + + exports.isAbsolute = function(aPath) { + return aPath.charAt(0) === "/" || urlRegexp.test(aPath); + }; + + /** + * Make a path relative to a URL or another path. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be made relative to aRoot. + */ + function relative(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + + aRoot = aRoot.replace(/\/$/, ""); + + // It is possible for the path to be above the root. In this case, simply + // checking whether the root is a prefix of the path won't work. Instead, we + // need to remove components from the root one by one, until either we find + // a prefix that fits, or we run out of components to remove. + var level = 0; + while (aPath.indexOf(aRoot + "/") !== 0) { + var index = aRoot.lastIndexOf("/"); + if (index < 0) { + return aPath; + } + + // If the only part of the root that is left is the scheme (i.e. http://, + // file:///, etc.), one or more slashes (/), or simply nothing at all, we + // have exhausted all components, so the path is not relative to the root. + aRoot = aRoot.slice(0, index); + if (aRoot.match(/^([^\/]+:\/)?\/*$/)) { + return aPath; + } + + ++level; + } + + // Make sure we add a "../" for each component we removed from the root. + return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1); + } + exports.relative = relative; + + var supportsNullProto = (function() { + var obj = Object.create(null); + return !("__proto__" in obj); + })(); + + function identity(s) { + return s; + } + + /** + * Because behavior goes wacky when you set `__proto__` on objects, we + * have to prefix all the strings in our set with an arbitrary character. + * + * See https://github.com/mozilla/source-map/pull/31 and + * https://github.com/mozilla/source-map/issues/30 + * + * @param String aStr + */ + function toSetString(aStr) { + if (isProtoString(aStr)) { + return "$" + aStr; + } + + return aStr; + } + exports.toSetString = supportsNullProto ? identity : toSetString; + + function fromSetString(aStr) { + if (isProtoString(aStr)) { + return aStr.slice(1); + } + + return aStr; + } + exports.fromSetString = supportsNullProto ? identity : fromSetString; + + function isProtoString(s) { + if (!s) { + return false; + } + + var length = s.length; + + if (length < 9 /* "__proto__".length */) { + return false; + } + + if ( + s.charCodeAt(length - 1) !== 95 /* '_' */ || + s.charCodeAt(length - 2) !== 95 /* '_' */ || + s.charCodeAt(length - 3) !== 111 /* 'o' */ || + s.charCodeAt(length - 4) !== 116 /* 't' */ || + s.charCodeAt(length - 5) !== 111 /* 'o' */ || + s.charCodeAt(length - 6) !== 114 /* 'r' */ || + s.charCodeAt(length - 7) !== 112 /* 'p' */ || + s.charCodeAt(length - 8) !== 95 /* '_' */ || + s.charCodeAt(length - 9) !== 95 /* '_' */ + ) { + return false; + } + + for (var i = length - 10; i >= 0; i--) { + if (s.charCodeAt(i) !== 36 /* '$' */) { + return false; + } + } + + return true; + } + + /** + * Comparator between two mappings where the original positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same original source/line/column, but different generated + * line and column the same. Useful when searching for a mapping with a + * stubbed out mapping. + */ + function compareByOriginalPositions( + mappingA, + mappingB, + onlyCompareOriginal + ) { + var cmp = strcmp(mappingA.source, mappingB.source); + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0 || onlyCompareOriginal) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + return strcmp(mappingA.name, mappingB.name); + } + exports.compareByOriginalPositions = compareByOriginalPositions; + + /** + * Comparator between two mappings with deflated source and name indices where + * the generated positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same generated line and column, but different + * source/name/original line and column the same. Useful when searching for a + * mapping with a stubbed out mapping. + */ + function compareByGeneratedPositionsDeflated( + mappingA, + mappingB, + onlyCompareGenerated + ) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0 || onlyCompareGenerated) { + return cmp; + } + + cmp = strcmp(mappingA.source, mappingB.source); + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + + return strcmp(mappingA.name, mappingB.name); + } + exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated; + + function strcmp(aStr1, aStr2) { + if (aStr1 === aStr2) { + return 0; + } + + if (aStr1 === null) { + return 1; // aStr2 !== null + } + + if (aStr2 === null) { + return -1; // aStr1 !== null + } + + if (aStr1 > aStr2) { + return 1; + } + + return -1; + } + + /** + * Comparator between two mappings with inflated source and name strings where + * the generated positions are compared. + */ + function compareByGeneratedPositionsInflated(mappingA, mappingB) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + + cmp = strcmp(mappingA.source, mappingB.source); + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + + return strcmp(mappingA.name, mappingB.name); + } + exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated; + + /** + * Strip any JSON XSSI avoidance prefix from the string (as documented + * in the source maps specification), and then parse the string as + * JSON. + */ + function parseSourceMapInput(str) { + return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, "")); + } + exports.parseSourceMapInput = parseSourceMapInput; + + /** + * Compute the URL of a source given the the source root, the source's + * URL, and the source map's URL. + */ + function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) { + sourceURL = sourceURL || ""; + + if (sourceRoot) { + // This follows what Chrome does. + if ( + sourceRoot[sourceRoot.length - 1] !== "/" && + sourceURL[0] !== "/" + ) { + sourceRoot += "/"; + } + // The spec says: + // Line 4: An optional source root, useful for relocating source + // files on a server or removing repeated values in the + // “sources” entry. This value is prepended to the individual + // entries in the “source” field. + sourceURL = sourceRoot + sourceURL; + } + + // Historically, SourceMapConsumer did not take the sourceMapURL as + // a parameter. This mode is still somewhat supported, which is why + // this code block is conditional. However, it's preferable to pass + // the source map URL to SourceMapConsumer, so that this function + // can implement the source URL resolution algorithm as outlined in + // the spec. This block is basically the equivalent of: + // new URL(sourceURL, sourceMapURL).toString() + // ... except it avoids using URL, which wasn't available in the + // older releases of node still supported by this library. + // + // The spec says: + // If the sources are not absolute URLs after prepending of the + // “sourceRoot”, the sources are resolved relative to the + // SourceMap (like resolving script src in a html document). + if (sourceMapURL) { + var parsed = urlParse(sourceMapURL); + if (!parsed) { + throw new Error("sourceMapURL could not be parsed"); + } + if (parsed.path) { + // Strip the last path component, but keep the "/". + var index = parsed.path.lastIndexOf("/"); + if (index >= 0) { + parsed.path = parsed.path.substring(0, index + 1); + } + } + sourceURL = join(urlGenerate(parsed), sourceURL); + } + + return normalize(sourceURL); + } + exports.computeSourceURL = computeSourceURL; + }, + {} + ], + 155: [ + function(require, module, exports) { + /* + * Copyright 2009-2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE.txt or: + * http://opensource.org/licenses/BSD-3-Clause + */ + exports.SourceMapGenerator = require("./lib/source-map-generator").SourceMapGenerator; + exports.SourceMapConsumer = require("./lib/source-map-consumer").SourceMapConsumer; + exports.SourceNode = require("./lib/source-node").SourceNode; + }, + { + "./lib/source-map-consumer": 151, + "./lib/source-map-generator": 152, + "./lib/source-node": 153 + } + ], + 156: [ + function(require, module, exports) { + (function(global) { + var ClientRequest = require("./lib/request"); + var response = require("./lib/response"); + var extend = require("xtend"); + var statusCodes = require("builtin-status-codes"); + var url = require("url"); + + var http = exports; + + http.request = function(opts, cb) { + if (typeof opts === "string") opts = url.parse(opts); + else opts = extend(opts); + + // Normally, the page is loaded from http or https, so not specifying a protocol + // will result in a (valid) protocol-relative url. However, this won't work if + // the protocol is something else, like 'file:' + var defaultProtocol = + global.location.protocol.search(/^https?:$/) === -1 + ? "http:" + : ""; + + var protocol = opts.protocol || defaultProtocol; + var host = opts.hostname || opts.host; + var port = opts.port; + var path = opts.path || "/"; + + // Necessary for IPv6 addresses + if (host && host.indexOf(":") !== -1) host = "[" + host + "]"; + + // This may be a relative url. The browser should always be able to interpret it correctly. + opts.url = + (host ? protocol + "//" + host : "") + + (port ? ":" + port : "") + + path; + opts.method = (opts.method || "GET").toUpperCase(); + opts.headers = opts.headers || {}; + + // Also valid opts.auth, opts.mode + + var req = new ClientRequest(opts); + if (cb) req.on("response", cb); + return req; + }; + + http.get = function get(opts, cb) { + var req = http.request(opts, cb); + req.end(); + return req; + }; + + http.ClientRequest = ClientRequest; + http.IncomingMessage = response.IncomingMessage; + + http.Agent = function() {}; + http.Agent.defaultMaxSockets = 4; + + http.globalAgent = new http.Agent(); + + http.STATUS_CODES = statusCodes; + + http.METHODS = [ + "CHECKOUT", + "CONNECT", + "COPY", + "DELETE", + "GET", + "HEAD", + "LOCK", + "M-SEARCH", + "MERGE", + "MKACTIVITY", + "MKCOL", + "MOVE", + "NOTIFY", + "OPTIONS", + "PATCH", + "POST", + "PROPFIND", + "PROPPATCH", + "PURGE", + "PUT", + "REPORT", + "SEARCH", + "SUBSCRIBE", + "TRACE", + "UNLOCK", + "UNSUBSCRIBE" + ]; + }.call( + this, + typeof global !== "undefined" + ? global + : typeof self !== "undefined" + ? self + : typeof window !== "undefined" + ? window + : {} + )); + }, + { + "./lib/request": 158, + "./lib/response": 159, + "builtin-status-codes": 5, + url: 162, + xtend: 165 + } + ], + 157: [ + function(require, module, exports) { + (function(global) { + exports.fetch = + isFunction(global.fetch) && isFunction(global.ReadableStream); + + exports.writableStream = isFunction(global.WritableStream); + + exports.abortController = isFunction(global.AbortController); + + exports.blobConstructor = false; + try { + new Blob([new ArrayBuffer(1)]); + exports.blobConstructor = true; + } catch (e) {} + + // The xhr request to example.com may violate some restrictive CSP configurations, + // so if we're running in a browser that supports `fetch`, avoid calling getXHR() + // and assume support for certain features below. + var xhr; + function getXHR() { + // Cache the xhr value + if (xhr !== undefined) return xhr; + + if (global.XMLHttpRequest) { + xhr = new global.XMLHttpRequest(); + // If XDomainRequest is available (ie only, where xhr might not work + // cross domain), use the page location. Otherwise use example.com + // Note: this doesn't actually make an http request. + try { + xhr.open( + "GET", + global.XDomainRequest ? "/" : "https://example.com" + ); + } catch (e) { + xhr = null; + } + } else { + // Service workers don't have XHR + xhr = null; + } + return xhr; + } + + function checkTypeSupport(type) { + var xhr = getXHR(); + if (!xhr) return false; + try { + xhr.responseType = type; + return xhr.responseType === type; + } catch (e) {} + return false; + } + + // For some strange reason, Safari 7.0 reports typeof global.ArrayBuffer === 'object'. + // Safari 7.1 appears to have fixed this bug. + var haveArrayBuffer = typeof global.ArrayBuffer !== "undefined"; + var haveSlice = + haveArrayBuffer && isFunction(global.ArrayBuffer.prototype.slice); + + // If fetch is supported, then arraybuffer will be supported too. Skip calling + // checkTypeSupport(), since that calls getXHR(). + exports.arraybuffer = + exports.fetch || + (haveArrayBuffer && checkTypeSupport("arraybuffer")); + + // These next two tests unavoidably show warnings in Chrome. Since fetch will always + // be used if it's available, just return false for these to avoid the warnings. + exports.msstream = + !exports.fetch && haveSlice && checkTypeSupport("ms-stream"); + exports.mozchunkedarraybuffer = + !exports.fetch && + haveArrayBuffer && + checkTypeSupport("moz-chunked-arraybuffer"); + + // If fetch is supported, then overrideMimeType will be supported too. Skip calling + // getXHR(). + exports.overrideMimeType = + exports.fetch || + (getXHR() ? isFunction(getXHR().overrideMimeType) : false); + + exports.vbArray = isFunction(global.VBArray); + + function isFunction(value) { + return typeof value === "function"; + } + + xhr = null; // Help gc + }.call( + this, + typeof global !== "undefined" + ? global + : typeof self !== "undefined" + ? self + : typeof window !== "undefined" + ? window + : {} + )); + }, + {} + ], + 158: [ + function(require, module, exports) { + (function(process, global, Buffer) { + var capability = require("./capability"); + var inherits = require("inherits"); + var response = require("./response"); + var stream = require("readable-stream"); + var toArrayBuffer = require("to-arraybuffer"); + + var IncomingMessage = response.IncomingMessage; + var rStates = response.readyStates; + + function decideMode(preferBinary, useFetch) { + if (capability.fetch && useFetch) { + return "fetch"; + } else if (capability.mozchunkedarraybuffer) { + return "moz-chunked-arraybuffer"; + } else if (capability.msstream) { + return "ms-stream"; + } else if (capability.arraybuffer && preferBinary) { + return "arraybuffer"; + } else if (capability.vbArray && preferBinary) { + return "text:vbarray"; + } else { + return "text"; + } + } + + var ClientRequest = (module.exports = function(opts) { + var self = this; + stream.Writable.call(self); + + self._opts = opts; + self._body = []; + self._headers = {}; + if (opts.auth) + self.setHeader( + "Authorization", + "Basic " + new Buffer(opts.auth).toString("base64") + ); + Object.keys(opts.headers).forEach(function(name) { + self.setHeader(name, opts.headers[name]); + }); + + var preferBinary; + var useFetch = true; + if ( + opts.mode === "disable-fetch" || + ("requestTimeout" in opts && !capability.abortController) + ) { + // If the use of XHR should be preferred. Not typically needed. + useFetch = false; + preferBinary = true; + } else if (opts.mode === "prefer-streaming") { + // If streaming is a high priority but binary compatibility and + // the accuracy of the 'content-type' header aren't + preferBinary = false; + } else if (opts.mode === "allow-wrong-content-type") { + // If streaming is more important than preserving the 'content-type' header + preferBinary = !capability.overrideMimeType; + } else if ( + !opts.mode || + opts.mode === "default" || + opts.mode === "prefer-fast" + ) { + // Use binary if text streaming may corrupt data or the content-type header, or for speed + preferBinary = true; + } else { + throw new Error("Invalid value for opts.mode"); + } + self._mode = decideMode(preferBinary, useFetch); + self._fetchTimer = null; + + self.on("finish", function() { + self._onFinish(); + }); + }); + + inherits(ClientRequest, stream.Writable); + + ClientRequest.prototype.setHeader = function(name, value) { + var self = this; + var lowerName = name.toLowerCase(); + // This check is not necessary, but it prevents warnings from browsers about setting unsafe + // headers. To be honest I'm not entirely sure hiding these warnings is a good thing, but + // http-browserify did it, so I will too. + if (unsafeHeaders.indexOf(lowerName) !== -1) return; + + self._headers[lowerName] = { + name: name, + value: value + }; + }; + + ClientRequest.prototype.getHeader = function(name) { + var header = this._headers[name.toLowerCase()]; + if (header) return header.value; + return null; + }; + + ClientRequest.prototype.removeHeader = function(name) { + var self = this; + delete self._headers[name.toLowerCase()]; + }; + + ClientRequest.prototype._onFinish = function() { + var self = this; + + if (self._destroyed) return; + var opts = self._opts; + + var headersObj = self._headers; + var body = null; + if (opts.method !== "GET" && opts.method !== "HEAD") { + if (capability.arraybuffer) { + body = toArrayBuffer(Buffer.concat(self._body)); + } else if (capability.blobConstructor) { + body = new global.Blob( + self._body.map(function(buffer) { + return toArrayBuffer(buffer); + }), + { + type: (headersObj["content-type"] || {}).value || "" + } + ); + } else { + // get utf8 string + body = Buffer.concat(self._body).toString(); + } + } + + // create flattened list of headers + var headersList = []; + Object.keys(headersObj).forEach(function(keyName) { + var name = headersObj[keyName].name; + var value = headersObj[keyName].value; + if (Array.isArray(value)) { + value.forEach(function(v) { + headersList.push([name, v]); + }); + } else { + headersList.push([name, value]); + } + }); + + if (self._mode === "fetch") { + var signal = null; + var fetchTimer = null; + if (capability.abortController) { + var controller = new AbortController(); + signal = controller.signal; + self._fetchAbortController = controller; + + if ("requestTimeout" in opts && opts.requestTimeout !== 0) { + self._fetchTimer = global.setTimeout(function() { + self.emit("requestTimeout"); + if (self._fetchAbortController) + self._fetchAbortController.abort(); + }, opts.requestTimeout); + } + } + + global + .fetch(self._opts.url, { + method: self._opts.method, + headers: headersList, + body: body || undefined, + mode: "cors", + credentials: opts.withCredentials ? "include" : "same-origin", + signal: signal + }) + .then( + function(response) { + self._fetchResponse = response; + self._connect(); + }, + function(reason) { + global.clearTimeout(self._fetchTimer); + if (!self._destroyed) self.emit("error", reason); + } + ); + } else { + var xhr = (self._xhr = new global.XMLHttpRequest()); + try { + xhr.open(self._opts.method, self._opts.url, true); + } catch (err) { + process.nextTick(function() { + self.emit("error", err); + }); + return; + } + + // Can't set responseType on really old browsers + if ("responseType" in xhr) + xhr.responseType = self._mode.split(":")[0]; + + if ("withCredentials" in xhr) + xhr.withCredentials = !!opts.withCredentials; + + if (self._mode === "text" && "overrideMimeType" in xhr) + xhr.overrideMimeType("text/plain; charset=x-user-defined"); + + if ("requestTimeout" in opts) { + xhr.timeout = opts.requestTimeout; + xhr.ontimeout = function() { + self.emit("requestTimeout"); + }; + } + + headersList.forEach(function(header) { + xhr.setRequestHeader(header[0], header[1]); + }); + + self._response = null; + xhr.onreadystatechange = function() { + switch (xhr.readyState) { + case rStates.LOADING: + case rStates.DONE: + self._onXHRProgress(); + break; + } + }; + // Necessary for streaming in Firefox, since xhr.response is ONLY defined + // in onprogress, not in onreadystatechange with xhr.readyState = 3 + if (self._mode === "moz-chunked-arraybuffer") { + xhr.onprogress = function() { + self._onXHRProgress(); + }; + } + + xhr.onerror = function() { + if (self._destroyed) return; + self.emit("error", new Error("XHR error")); + }; + + try { + xhr.send(body); + } catch (err) { + process.nextTick(function() { + self.emit("error", err); + }); + return; + } + } + }; + + /** + * Checks if xhr.status is readable and non-zero, indicating no error. + * Even though the spec says it should be available in readyState 3, + * accessing it throws an exception in IE8 + */ + function statusValid(xhr) { + try { + var status = xhr.status; + return status !== null && status !== 0; + } catch (e) { + return false; + } + } + + ClientRequest.prototype._onXHRProgress = function() { + var self = this; + + if (!statusValid(self._xhr) || self._destroyed) return; + + if (!self._response) self._connect(); + + self._response._onXHRProgress(); + }; + + ClientRequest.prototype._connect = function() { + var self = this; + + if (self._destroyed) return; + + self._response = new IncomingMessage( + self._xhr, + self._fetchResponse, + self._mode, + self._fetchTimer + ); + self._response.on("error", function(err) { + self.emit("error", err); + }); + + self.emit("response", self._response); + }; + + ClientRequest.prototype._write = function(chunk, encoding, cb) { + var self = this; + + self._body.push(chunk); + cb(); + }; + + ClientRequest.prototype.abort = ClientRequest.prototype.destroy = function() { + var self = this; + self._destroyed = true; + global.clearTimeout(self._fetchTimer); + if (self._response) self._response._destroyed = true; + if (self._xhr) self._xhr.abort(); + else if (self._fetchAbortController) + self._fetchAbortController.abort(); + }; + + ClientRequest.prototype.end = function(data, encoding, cb) { + var self = this; + if (typeof data === "function") { + cb = data; + data = undefined; + } + + stream.Writable.prototype.end.call(self, data, encoding, cb); + }; + + ClientRequest.prototype.flushHeaders = function() {}; + ClientRequest.prototype.setTimeout = function() {}; + ClientRequest.prototype.setNoDelay = function() {}; + ClientRequest.prototype.setSocketKeepAlive = function() {}; + + // Taken from http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader%28%29-method + var unsafeHeaders = [ + "accept-charset", + "accept-encoding", + "access-control-request-headers", + "access-control-request-method", + "connection", + "content-length", + "cookie", + "cookie2", + "date", + "dnt", + "expect", + "host", + "keep-alive", + "origin", + "referer", + "te", + "trailer", + "transfer-encoding", + "upgrade", + "via" + ]; + }.call( + this, + require("_process"), + typeof global !== "undefined" + ? global + : typeof self !== "undefined" + ? self + : typeof window !== "undefined" + ? window + : {}, + require("buffer").Buffer + )); + }, + { + "./capability": 157, + "./response": 159, + _process: 112, + buffer: 4, + inherits: 106, + "readable-stream": 126, + "to-arraybuffer": 161 + } + ], + 159: [ + function(require, module, exports) { + (function(process, global, Buffer) { + var capability = require("./capability"); + var inherits = require("inherits"); + var stream = require("readable-stream"); + + var rStates = (exports.readyStates = { + UNSENT: 0, + OPENED: 1, + HEADERS_RECEIVED: 2, + LOADING: 3, + DONE: 4 + }); + + var IncomingMessage = (exports.IncomingMessage = function( + xhr, + response, + mode, + fetchTimer + ) { + var self = this; + stream.Readable.call(self); + + self._mode = mode; + self.headers = {}; + self.rawHeaders = []; + self.trailers = {}; + self.rawTrailers = []; + + // Fake the 'close' event, but only once 'end' fires + self.on("end", function() { + // The nextTick is necessary to prevent the 'request' module from causing an infinite loop + process.nextTick(function() { + self.emit("close"); + }); + }); + + if (mode === "fetch") { + self._fetchResponse = response; + + self.url = response.url; + self.statusCode = response.status; + self.statusMessage = response.statusText; + + response.headers.forEach(function(header, key) { + self.headers[key.toLowerCase()] = header; + self.rawHeaders.push(key, header); + }); + + if (capability.writableStream) { + var writable = new WritableStream({ + write: function(chunk) { + return new Promise(function(resolve, reject) { + if (self._destroyed) { + reject(); + } else if (self.push(new Buffer(chunk))) { + resolve(); + } else { + self._resumeFetch = resolve; + } + }); + }, + close: function() { + global.clearTimeout(fetchTimer); + if (!self._destroyed) self.push(null); + }, + abort: function(err) { + if (!self._destroyed) self.emit("error", err); + } + }); + + try { + response.body.pipeTo(writable).catch(function(err) { + global.clearTimeout(fetchTimer); + if (!self._destroyed) self.emit("error", err); + }); + return; + } catch (e) {} // pipeTo method isn't defined. Can't find a better way to feature test this + } + // fallback for when writableStream or pipeTo aren't available + var reader = response.body.getReader(); + function read() { + reader + .read() + .then(function(result) { + if (self._destroyed) return; + if (result.done) { + global.clearTimeout(fetchTimer); + self.push(null); + return; + } + self.push(new Buffer(result.value)); + read(); + }) + .catch(function(err) { + global.clearTimeout(fetchTimer); + if (!self._destroyed) self.emit("error", err); + }); + } + read(); + } else { + self._xhr = xhr; + self._pos = 0; + + self.url = xhr.responseURL; + self.statusCode = xhr.status; + self.statusMessage = xhr.statusText; + var headers = xhr.getAllResponseHeaders().split(/\r?\n/); + headers.forEach(function(header) { + var matches = header.match(/^([^:]+):\s*(.*)/); + if (matches) { + var key = matches[1].toLowerCase(); + if (key === "set-cookie") { + if (self.headers[key] === undefined) { + self.headers[key] = []; + } + self.headers[key].push(matches[2]); + } else if (self.headers[key] !== undefined) { + self.headers[key] += ", " + matches[2]; + } else { + self.headers[key] = matches[2]; + } + self.rawHeaders.push(matches[1], matches[2]); + } + }); + + self._charset = "x-user-defined"; + if (!capability.overrideMimeType) { + var mimeType = self.rawHeaders["mime-type"]; + if (mimeType) { + var charsetMatch = mimeType.match(/;\s*charset=([^;])(;|$)/); + if (charsetMatch) { + self._charset = charsetMatch[1].toLowerCase(); + } + } + if (!self._charset) self._charset = "utf-8"; // best guess + } + } + }); + + inherits(IncomingMessage, stream.Readable); + + IncomingMessage.prototype._read = function() { + var self = this; + + var resolve = self._resumeFetch; + if (resolve) { + self._resumeFetch = null; + resolve(); + } + }; + + IncomingMessage.prototype._onXHRProgress = function() { + var self = this; + + var xhr = self._xhr; + + var response = null; + switch (self._mode) { + case "text:vbarray": // For IE9 + if (xhr.readyState !== rStates.DONE) break; + try { + // This fails in IE8 + response = new global.VBArray(xhr.responseBody).toArray(); + } catch (e) {} + if (response !== null) { + self.push(new Buffer(response)); + break; + } + // Falls through in IE8 + case "text": + try { + // This will fail when readyState = 3 in IE9. Switch mode and wait for readyState = 4 + response = xhr.responseText; + } catch (e) { + self._mode = "text:vbarray"; + break; + } + if (response.length > self._pos) { + var newData = response.substr(self._pos); + if (self._charset === "x-user-defined") { + var buffer = new Buffer(newData.length); + for (var i = 0; i < newData.length; i++) + buffer[i] = newData.charCodeAt(i) & 0xff; + + self.push(buffer); + } else { + self.push(newData, self._charset); + } + self._pos = response.length; + } + break; + case "arraybuffer": + if (xhr.readyState !== rStates.DONE || !xhr.response) break; + response = xhr.response; + self.push(new Buffer(new Uint8Array(response))); + break; + case "moz-chunked-arraybuffer": // take whole + response = xhr.response; + if (xhr.readyState !== rStates.LOADING || !response) break; + self.push(new Buffer(new Uint8Array(response))); + break; + case "ms-stream": + response = xhr.response; + if (xhr.readyState !== rStates.LOADING) break; + var reader = new global.MSStreamReader(); + reader.onprogress = function() { + if (reader.result.byteLength > self._pos) { + self.push( + new Buffer(new Uint8Array(reader.result.slice(self._pos))) + ); + self._pos = reader.result.byteLength; + } + }; + reader.onload = function() { + self.push(null); + }; + // reader.onerror = ??? // TODO: this + reader.readAsArrayBuffer(response); + break; + } + + // The ms-stream case handles end separately in reader.onload() + if ( + self._xhr.readyState === rStates.DONE && + self._mode !== "ms-stream" + ) { + self.push(null); + } + }; + }.call( + this, + require("_process"), + typeof global !== "undefined" + ? global + : typeof self !== "undefined" + ? self + : typeof window !== "undefined" + ? window + : {}, + require("buffer").Buffer + )); + }, + { + "./capability": 157, + _process: 112, + buffer: 4, + inherits: 106, + "readable-stream": 126 + } + ], + 160: [ + function(require, module, exports) { + (function(setImmediate, clearImmediate) { + var nextTick = require("process/browser.js").nextTick; + var apply = Function.prototype.apply; + var slice = Array.prototype.slice; + var immediateIds = {}; + var nextImmediateId = 0; + + // DOM APIs, for completeness + + exports.setTimeout = function() { + return new Timeout( + apply.call(setTimeout, window, arguments), + clearTimeout + ); + }; + exports.setInterval = function() { + return new Timeout( + apply.call(setInterval, window, arguments), + clearInterval + ); + }; + exports.clearTimeout = exports.clearInterval = function(timeout) { + timeout.close(); + }; + + function Timeout(id, clearFn) { + this._id = id; + this._clearFn = clearFn; + } + Timeout.prototype.unref = Timeout.prototype.ref = function() {}; + Timeout.prototype.close = function() { + this._clearFn.call(window, this._id); + }; + + // Does not start the time, just sets up the members needed. + exports.enroll = function(item, msecs) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = msecs; + }; + + exports.unenroll = function(item) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = -1; + }; + + exports._unrefActive = exports.active = function(item) { + clearTimeout(item._idleTimeoutId); + + var msecs = item._idleTimeout; + if (msecs >= 0) { + item._idleTimeoutId = setTimeout(function onTimeout() { + if (item._onTimeout) item._onTimeout(); + }, msecs); + } + }; + + // That's not how node.js implements it but the exposed api is the same. + exports.setImmediate = + typeof setImmediate === "function" + ? setImmediate + : function(fn) { + var id = nextImmediateId++; + var args = + arguments.length < 2 ? false : slice.call(arguments, 1); + + immediateIds[id] = true; + + nextTick(function onNextTick() { + if (immediateIds[id]) { + // fn.call() is faster so we optimize for the common use-case + // @see http://jsperf.com/call-apply-segu + if (args) { + fn.apply(null, args); + } else { + fn.call(null); + } + // Prevent ids from leaking + exports.clearImmediate(id); + } + }); + + return id; + }; + + exports.clearImmediate = + typeof clearImmediate === "function" + ? clearImmediate + : function(id) { + delete immediateIds[id]; + }; + }.call( + this, + require("timers").setImmediate, + require("timers").clearImmediate + )); + }, + { "process/browser.js": 112, timers: 160 } + ], + 161: [ + function(require, module, exports) { + var Buffer = require("buffer").Buffer; + + module.exports = function(buf) { + // If the buffer is backed by a Uint8Array, a faster version will work + if (buf instanceof Uint8Array) { + // If the buffer isn't a subarray, return the underlying ArrayBuffer + if ( + buf.byteOffset === 0 && + buf.byteLength === buf.buffer.byteLength + ) { + return buf.buffer; + } else if (typeof buf.buffer.slice === "function") { + // Otherwise we need to get a proper copy + return buf.buffer.slice( + buf.byteOffset, + buf.byteOffset + buf.byteLength + ); + } + } + + if (Buffer.isBuffer(buf)) { + // This is the slow version that will work with any Buffer + // implementation (even in old browsers) + var arrayCopy = new Uint8Array(buf.length); + var len = buf.length; + for (var i = 0; i < len; i++) { + arrayCopy[i] = buf[i]; + } + return arrayCopy.buffer; + } else { + throw new Error("Argument must be a Buffer"); + } + }; + }, + { buffer: 4 } + ], + 162: [ + function(require, module, exports) { + // Copyright Joyent, Inc. and other Node contributors. + // + // Permission is hereby granted, free of charge, to any person obtaining a + // copy of this software and associated documentation files (the + // "Software"), to deal in the Software without restriction, including + // without limitation the rights to use, copy, modify, merge, publish, + // distribute, sublicense, and/or sell copies of the Software, and to permit + // persons to whom the Software is furnished to do so, subject to the + // following conditions: + // + // The above copyright notice and this permission notice shall be included + // in all copies or substantial portions of the Software. + // + // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + // USE OR OTHER DEALINGS IN THE SOFTWARE. + + "use strict"; + + var punycode = require("punycode"); + var util = require("./util"); + + exports.parse = urlParse; + exports.resolve = urlResolve; + exports.resolveObject = urlResolveObject; + exports.format = urlFormat; + + exports.Url = Url; + + function Url() { + this.protocol = null; + this.slashes = null; + this.auth = null; + this.host = null; + this.port = null; + this.hostname = null; + this.hash = null; + this.search = null; + this.query = null; + this.pathname = null; + this.path = null; + this.href = null; + } + + // Reference: RFC 3986, RFC 1808, RFC 2396 + + // define these here so at least they only have to be + // compiled once on the first module load. + var protocolPattern = /^([a-z0-9.+-]+:)/i, + portPattern = /:[0-9]*$/, + // Special case for a simple path URL + simplePathPattern = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/, + // RFC 2396: characters reserved for delimiting URLs. + // We actually just auto-escape these. + delims = ["<", ">", '"', "`", " ", "\r", "\n", "\t"], + // RFC 2396: characters not allowed for various reasons. + unwise = ["{", "}", "|", "\\", "^", "`"].concat(delims), + // Allowed by RFCs, but cause of XSS attacks. Always escape these. + autoEscape = ["'"].concat(unwise), + // Characters that are never ever allowed in a hostname. + // Note that any invalid chars are also handled, but these + // are the ones that are *expected* to be seen, so we fast-path + // them. + nonHostChars = ["%", "/", "?", ";", "#"].concat(autoEscape), + hostEndingChars = ["/", "?", "#"], + hostnameMaxLen = 255, + hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/, + hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/, + // protocols that can allow "unsafe" and "unwise" chars. + unsafeProtocol = { + javascript: true, + "javascript:": true + }, + // protocols that never have a hostname. + hostlessProtocol = { + javascript: true, + "javascript:": true + }, + // protocols that always contain a // bit. + slashedProtocol = { + http: true, + https: true, + ftp: true, + gopher: true, + file: true, + "http:": true, + "https:": true, + "ftp:": true, + "gopher:": true, + "file:": true + }, + querystring = require("querystring"); + + function urlParse(url, parseQueryString, slashesDenoteHost) { + if (url && util.isObject(url) && url instanceof Url) return url; + + var u = new Url(); + u.parse(url, parseQueryString, slashesDenoteHost); + return u; + } + + Url.prototype.parse = function( + url, + parseQueryString, + slashesDenoteHost + ) { + if (!util.isString(url)) { + throw new TypeError( + "Parameter 'url' must be a string, not " + typeof url + ); + } + + // Copy chrome, IE, opera backslash-handling behavior. + // Back slashes before the query string get converted to forward slashes + // See: https://code.google.com/p/chromium/issues/detail?id=25916 + var queryIndex = url.indexOf("?"), + splitter = + queryIndex !== -1 && queryIndex < url.indexOf("#") ? "?" : "#", + uSplit = url.split(splitter), + slashRegex = /\\/g; + uSplit[0] = uSplit[0].replace(slashRegex, "/"); + url = uSplit.join(splitter); + + var rest = url; + + // trim before proceeding. + // This is to support parse stuff like " http://foo.com \n" + rest = rest.trim(); + + if (!slashesDenoteHost && url.split("#").length === 1) { + // Try fast path regexp + var simplePath = simplePathPattern.exec(rest); + if (simplePath) { + this.path = rest; + this.href = rest; + this.pathname = simplePath[1]; + if (simplePath[2]) { + this.search = simplePath[2]; + if (parseQueryString) { + this.query = querystring.parse(this.search.substr(1)); + } else { + this.query = this.search.substr(1); + } + } else if (parseQueryString) { + this.search = ""; + this.query = {}; + } + return this; + } + } + + var proto = protocolPattern.exec(rest); + if (proto) { + proto = proto[0]; + var lowerProto = proto.toLowerCase(); + this.protocol = lowerProto; + rest = rest.substr(proto.length); + } + + // figure out if it's got a host + // user@server is *always* interpreted as a hostname, and url + // resolution will treat //foo/bar as host=foo,path=bar because that's + // how the browser resolves relative URLs. + if ( + slashesDenoteHost || + proto || + rest.match(/^\/\/[^@\/]+@[^@\/]+/) + ) { + var slashes = rest.substr(0, 2) === "//"; + if (slashes && !(proto && hostlessProtocol[proto])) { + rest = rest.substr(2); + this.slashes = true; + } + } + + if ( + !hostlessProtocol[proto] && + (slashes || (proto && !slashedProtocol[proto])) + ) { + // there's a hostname. + // the first instance of /, ?, ;, or # ends the host. + // + // If there is an @ in the hostname, then non-host chars *are* allowed + // to the left of the last @ sign, unless some host-ending character + // comes *before* the @-sign. + // URLs are obnoxious. + // + // ex: + // http://a@b@c/ => user:a@b host:c + // http://a@b?@c => user:a host:c path:/?@c + + // v0.12 TODO(isaacs): This is not quite how Chrome does things. + // Review our test case against browsers more comprehensively. + + // find the first instance of any hostEndingChars + var hostEnd = -1; + for (var i = 0; i < hostEndingChars.length; i++) { + var hec = rest.indexOf(hostEndingChars[i]); + if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) + hostEnd = hec; + } + + // at this point, either we have an explicit point where the + // auth portion cannot go past, or the last @ char is the decider. + var auth, atSign; + if (hostEnd === -1) { + // atSign can be anywhere. + atSign = rest.lastIndexOf("@"); + } else { + // atSign must be in auth portion. + // http://a@b/c@d => host:b auth:a path:/c@d + atSign = rest.lastIndexOf("@", hostEnd); + } + + // Now we have a portion which is definitely the auth. + // Pull that off. + if (atSign !== -1) { + auth = rest.slice(0, atSign); + rest = rest.slice(atSign + 1); + this.auth = decodeURIComponent(auth); + } + + // the host is the remaining to the left of the first non-host char + hostEnd = -1; + for (var i = 0; i < nonHostChars.length; i++) { + var hec = rest.indexOf(nonHostChars[i]); + if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) + hostEnd = hec; + } + // if we still have not hit it, then the entire thing is a host. + if (hostEnd === -1) hostEnd = rest.length; + + this.host = rest.slice(0, hostEnd); + rest = rest.slice(hostEnd); + + // pull out port. + this.parseHost(); + + // we've indicated that there is a hostname, + // so even if it's empty, it has to be present. + this.hostname = this.hostname || ""; + + // if hostname begins with [ and ends with ] + // assume that it's an IPv6 address. + var ipv6Hostname = + this.hostname[0] === "[" && + this.hostname[this.hostname.length - 1] === "]"; + + // validate a little. + if (!ipv6Hostname) { + var hostparts = this.hostname.split(/\./); + for (var i = 0, l = hostparts.length; i < l; i++) { + var part = hostparts[i]; + if (!part) continue; + if (!part.match(hostnamePartPattern)) { + var newpart = ""; + for (var j = 0, k = part.length; j < k; j++) { + if (part.charCodeAt(j) > 127) { + // we replace non-ASCII char with a temporary placeholder + // we need this to make sure size of hostname is not + // broken by replacing non-ASCII by nothing + newpart += "x"; + } else { + newpart += part[j]; + } + } + // we test again with ASCII char only + if (!newpart.match(hostnamePartPattern)) { + var validParts = hostparts.slice(0, i); + var notHost = hostparts.slice(i + 1); + var bit = part.match(hostnamePartStart); + if (bit) { + validParts.push(bit[1]); + notHost.unshift(bit[2]); + } + if (notHost.length) { + rest = "/" + notHost.join(".") + rest; + } + this.hostname = validParts.join("."); + break; + } + } + } + } + + if (this.hostname.length > hostnameMaxLen) { + this.hostname = ""; + } else { + // hostnames are always lower case. + this.hostname = this.hostname.toLowerCase(); + } + + if (!ipv6Hostname) { + // IDNA Support: Returns a punycoded representation of "domain". + // It only converts parts of the domain name that + // have non-ASCII characters, i.e. it doesn't matter if + // you call it with a domain that already is ASCII-only. + this.hostname = punycode.toASCII(this.hostname); + } + + var p = this.port ? ":" + this.port : ""; + var h = this.hostname || ""; + this.host = h + p; + this.href += this.host; + + // strip [ and ] from the hostname + // the host field still retains them, though + if (ipv6Hostname) { + this.hostname = this.hostname.substr(1, this.hostname.length - 2); + if (rest[0] !== "/") { + rest = "/" + rest; + } + } + } + + // now rest is set to the post-host stuff. + // chop off any delim chars. + if (!unsafeProtocol[lowerProto]) { + // First, make 100% sure that any "autoEscape" chars get + // escaped, even if encodeURIComponent doesn't think they + // need to be. + for (var i = 0, l = autoEscape.length; i < l; i++) { + var ae = autoEscape[i]; + if (rest.indexOf(ae) === -1) continue; + var esc = encodeURIComponent(ae); + if (esc === ae) { + esc = escape(ae); + } + rest = rest.split(ae).join(esc); + } + } + + // chop off from the tail first. + var hash = rest.indexOf("#"); + if (hash !== -1) { + // got a fragment string. + this.hash = rest.substr(hash); + rest = rest.slice(0, hash); + } + var qm = rest.indexOf("?"); + if (qm !== -1) { + this.search = rest.substr(qm); + this.query = rest.substr(qm + 1); + if (parseQueryString) { + this.query = querystring.parse(this.query); + } + rest = rest.slice(0, qm); + } else if (parseQueryString) { + // no query string, but parseQueryString still requested + this.search = ""; + this.query = {}; + } + if (rest) this.pathname = rest; + if (slashedProtocol[lowerProto] && this.hostname && !this.pathname) { + this.pathname = "/"; + } + + //to support http.request + if (this.pathname || this.search) { + var p = this.pathname || ""; + var s = this.search || ""; + this.path = p + s; + } + + // finally, reconstruct the href based on what has been validated. + this.href = this.format(); + return this; + }; + + // format a parsed object into a url string + function urlFormat(obj) { + // ensure it's an object, and not a string url. + // If it's an obj, this is a no-op. + // this way, you can call url_format() on strings + // to clean up potentially wonky urls. + if (util.isString(obj)) obj = urlParse(obj); + if (!(obj instanceof Url)) return Url.prototype.format.call(obj); + return obj.format(); + } + + Url.prototype.format = function() { + var auth = this.auth || ""; + if (auth) { + auth = encodeURIComponent(auth); + auth = auth.replace(/%3A/i, ":"); + auth += "@"; + } + + var protocol = this.protocol || "", + pathname = this.pathname || "", + hash = this.hash || "", + host = false, + query = ""; + + if (this.host) { + host = auth + this.host; + } else if (this.hostname) { + host = + auth + + (this.hostname.indexOf(":") === -1 + ? this.hostname + : "[" + this.hostname + "]"); + if (this.port) { + host += ":" + this.port; + } + } + + if ( + this.query && + util.isObject(this.query) && + Object.keys(this.query).length + ) { + query = querystring.stringify(this.query); + } + + var search = this.search || (query && "?" + query) || ""; + + if (protocol && protocol.substr(-1) !== ":") protocol += ":"; + + // only the slashedProtocols get the //. Not mailto:, xmpp:, etc. + // unless they had them to begin with. + if ( + this.slashes || + ((!protocol || slashedProtocol[protocol]) && host !== false) + ) { + host = "//" + (host || ""); + if (pathname && pathname.charAt(0) !== "/") + pathname = "/" + pathname; + } else if (!host) { + host = ""; + } + + if (hash && hash.charAt(0) !== "#") hash = "#" + hash; + if (search && search.charAt(0) !== "?") search = "?" + search; + + pathname = pathname.replace(/[?#]/g, function(match) { + return encodeURIComponent(match); + }); + search = search.replace("#", "%23"); + + return protocol + host + pathname + search + hash; + }; + + function urlResolve(source, relative) { + return urlParse(source, false, true).resolve(relative); + } + + Url.prototype.resolve = function(relative) { + return this.resolveObject(urlParse(relative, false, true)).format(); + }; + + function urlResolveObject(source, relative) { + if (!source) return relative; + return urlParse(source, false, true).resolveObject(relative); + } + + Url.prototype.resolveObject = function(relative) { + if (util.isString(relative)) { + var rel = new Url(); + rel.parse(relative, false, true); + relative = rel; + } + + var result = new Url(); + var tkeys = Object.keys(this); + for (var tk = 0; tk < tkeys.length; tk++) { + var tkey = tkeys[tk]; + result[tkey] = this[tkey]; + } + + // hash is always overridden, no matter what. + // even href="" will remove it. + result.hash = relative.hash; + + // if the relative url is empty, then there's nothing left to do here. + if (relative.href === "") { + result.href = result.format(); + return result; + } + + // hrefs like //foo/bar always cut to the protocol. + if (relative.slashes && !relative.protocol) { + // take everything except the protocol from relative + var rkeys = Object.keys(relative); + for (var rk = 0; rk < rkeys.length; rk++) { + var rkey = rkeys[rk]; + if (rkey !== "protocol") result[rkey] = relative[rkey]; + } + + //urlParse appends trailing / to urls like http://www.example.com + if ( + slashedProtocol[result.protocol] && + result.hostname && + !result.pathname + ) { + result.path = result.pathname = "/"; + } + + result.href = result.format(); + return result; + } + + if (relative.protocol && relative.protocol !== result.protocol) { + // if it's a known url protocol, then changing + // the protocol does weird things + // first, if it's not file:, then we MUST have a host, + // and if there was a path + // to begin with, then we MUST have a path. + // if it is file:, then the host is dropped, + // because that's known to be hostless. + // anything else is assumed to be absolute. + if (!slashedProtocol[relative.protocol]) { + var keys = Object.keys(relative); + for (var v = 0; v < keys.length; v++) { + var k = keys[v]; + result[k] = relative[k]; + } + result.href = result.format(); + return result; + } + + result.protocol = relative.protocol; + if (!relative.host && !hostlessProtocol[relative.protocol]) { + var relPath = (relative.pathname || "").split("/"); + while (relPath.length && !(relative.host = relPath.shift())); + if (!relative.host) relative.host = ""; + if (!relative.hostname) relative.hostname = ""; + if (relPath[0] !== "") relPath.unshift(""); + if (relPath.length < 2) relPath.unshift(""); + result.pathname = relPath.join("/"); + } else { + result.pathname = relative.pathname; + } + result.search = relative.search; + result.query = relative.query; + result.host = relative.host || ""; + result.auth = relative.auth; + result.hostname = relative.hostname || relative.host; + result.port = relative.port; + // to support http.request + if (result.pathname || result.search) { + var p = result.pathname || ""; + var s = result.search || ""; + result.path = p + s; + } + result.slashes = result.slashes || relative.slashes; + result.href = result.format(); + return result; + } + + var isSourceAbs = + result.pathname && result.pathname.charAt(0) === "/", + isRelAbs = + relative.host || + (relative.pathname && relative.pathname.charAt(0) === "/"), + mustEndAbs = + isRelAbs || isSourceAbs || (result.host && relative.pathname), + removeAllDots = mustEndAbs, + srcPath = (result.pathname && result.pathname.split("/")) || [], + relPath = (relative.pathname && relative.pathname.split("/")) || [], + psychotic = result.protocol && !slashedProtocol[result.protocol]; + + // if the url is a non-slashed url, then relative + // links like ../.. should be able + // to crawl up to the hostname, as well. This is strange. + // result.protocol has already been set by now. + // Later on, put the first path part into the host field. + if (psychotic) { + result.hostname = ""; + result.port = null; + if (result.host) { + if (srcPath[0] === "") srcPath[0] = result.host; + else srcPath.unshift(result.host); + } + result.host = ""; + if (relative.protocol) { + relative.hostname = null; + relative.port = null; + if (relative.host) { + if (relPath[0] === "") relPath[0] = relative.host; + else relPath.unshift(relative.host); + } + relative.host = null; + } + mustEndAbs = mustEndAbs && (relPath[0] === "" || srcPath[0] === ""); + } + + if (isRelAbs) { + // it's absolute. + result.host = + relative.host || relative.host === "" + ? relative.host + : result.host; + result.hostname = + relative.hostname || relative.hostname === "" + ? relative.hostname + : result.hostname; + result.search = relative.search; + result.query = relative.query; + srcPath = relPath; + // fall through to the dot-handling below. + } else if (relPath.length) { + // it's relative + // throw away the existing file, and take the new path instead. + if (!srcPath) srcPath = []; + srcPath.pop(); + srcPath = srcPath.concat(relPath); + result.search = relative.search; + result.query = relative.query; + } else if (!util.isNullOrUndefined(relative.search)) { + // just pull out the search. + // like href='?foo'. + // Put this after the other two cases because it simplifies the booleans + if (psychotic) { + result.hostname = result.host = srcPath.shift(); + //occationaly the auth can get stuck only in host + //this especially happens in cases like + //url.resolveObject('mailto:local1@domain1', 'local2@domain2') + var authInHost = + result.host && result.host.indexOf("@") > 0 + ? result.host.split("@") + : false; + if (authInHost) { + result.auth = authInHost.shift(); + result.host = result.hostname = authInHost.shift(); + } + } + result.search = relative.search; + result.query = relative.query; + //to support http.request + if (!util.isNull(result.pathname) || !util.isNull(result.search)) { + result.path = + (result.pathname ? result.pathname : "") + + (result.search ? result.search : ""); + } + result.href = result.format(); + return result; + } + + if (!srcPath.length) { + // no path at all. easy. + // we've already handled the other stuff above. + result.pathname = null; + //to support http.request + if (result.search) { + result.path = "/" + result.search; + } else { + result.path = null; + } + result.href = result.format(); + return result; + } + + // if a url ENDs in . or .., then it must get a trailing slash. + // however, if it ends in anything else non-slashy, + // then it must NOT get a trailing slash. + var last = srcPath.slice(-1)[0]; + var hasTrailingSlash = + ((result.host || relative.host || srcPath.length > 1) && + (last === "." || last === "..")) || + last === ""; + + // strip single dots, resolve double dots to parent dir + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = srcPath.length; i >= 0; i--) { + last = srcPath[i]; + if (last === ".") { + srcPath.splice(i, 1); + } else if (last === "..") { + srcPath.splice(i, 1); + up++; + } else if (up) { + srcPath.splice(i, 1); + up--; + } + } + + // if the path is allowed to go above the root, restore leading ..s + if (!mustEndAbs && !removeAllDots) { + for (; up--; up) { + srcPath.unshift(".."); + } + } + + if ( + mustEndAbs && + srcPath[0] !== "" && + (!srcPath[0] || srcPath[0].charAt(0) !== "/") + ) { + srcPath.unshift(""); + } + + if (hasTrailingSlash && srcPath.join("/").substr(-1) !== "/") { + srcPath.push(""); + } + + var isAbsolute = + srcPath[0] === "" || (srcPath[0] && srcPath[0].charAt(0) === "/"); + + // put the host back + if (psychotic) { + result.hostname = result.host = isAbsolute + ? "" + : srcPath.length + ? srcPath.shift() + : ""; + //occationaly the auth can get stuck only in host + //this especially happens in cases like + //url.resolveObject('mailto:local1@domain1', 'local2@domain2') + var authInHost = + result.host && result.host.indexOf("@") > 0 + ? result.host.split("@") + : false; + if (authInHost) { + result.auth = authInHost.shift(); + result.host = result.hostname = authInHost.shift(); + } + } + + mustEndAbs = mustEndAbs || (result.host && srcPath.length); + + if (mustEndAbs && !isAbsolute) { + srcPath.unshift(""); + } + + if (!srcPath.length) { + result.pathname = null; + result.path = null; + } else { + result.pathname = srcPath.join("/"); + } + + //to support request.http + if (!util.isNull(result.pathname) || !util.isNull(result.search)) { + result.path = + (result.pathname ? result.pathname : "") + + (result.search ? result.search : ""); + } + result.auth = relative.auth || result.auth; + result.slashes = result.slashes || relative.slashes; + result.href = result.format(); + return result; + }; + + Url.prototype.parseHost = function() { + var host = this.host; + var port = portPattern.exec(host); + if (port) { + port = port[0]; + if (port !== ":") { + this.port = port.substr(1); + } + host = host.substr(0, host.length - port.length); + } + if (host) this.hostname = host; + }; + }, + { "./util": 163, punycode: 113, querystring: 116 } + ], + 163: [ + function(require, module, exports) { + "use strict"; + + module.exports = { + isString: function(arg) { + return typeof arg === "string"; + }, + isObject: function(arg) { + return typeof arg === "object" && arg !== null; + }, + isNull: function(arg) { + return arg === null; + }, + isNullOrUndefined: function(arg) { + return arg == null; + } + }; + }, + {} + ], + 164: [ + function(require, module, exports) { + (function(global) { + /** + * Module exports. + */ + + module.exports = deprecate; + + /** + * Mark that a method should not be used. + * Returns a modified function which warns once by default. + * + * If `localStorage.noDeprecation = true` is set, then it is a no-op. + * + * If `localStorage.throwDeprecation = true` is set, then deprecated functions + * will throw an Error when invoked. + * + * If `localStorage.traceDeprecation = true` is set, then deprecated functions + * will invoke `console.trace()` instead of `console.error()`. + * + * @param {Function} fn - the function to deprecate + * @param {String} msg - the string to print to the console when `fn` is invoked + * @returns {Function} a new "deprecated" version of `fn` + * @api public + */ + + function deprecate(fn, msg) { + if (config("noDeprecation")) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (config("throwDeprecation")) { + throw new Error(msg); + } else if (config("traceDeprecation")) { + console.trace(msg); + } else { + console.warn(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; + } + + /** + * Checks `localStorage` for boolean values for the given `name`. + * + * @param {String} name + * @returns {Boolean} + * @api private + */ + + function config(name) { + // accessing global.localStorage can trigger a DOMException in sandboxed iframes + try { + if (!global.localStorage) return false; + } catch (_) { + return false; + } + var val = global.localStorage[name]; + if (null == val) return false; + return String(val).toLowerCase() === "true"; + } + }.call( + this, + typeof global !== "undefined" + ? global + : typeof self !== "undefined" + ? self + : typeof window !== "undefined" + ? window + : {} + )); + }, + {} + ], + 165: [ + function(require, module, exports) { + module.exports = extend; + + var hasOwnProperty = Object.prototype.hasOwnProperty; + + function extend() { + var target = {}; + + for (var i = 0; i < arguments.length; i++) { + var source = arguments[i]; + + for (var key in source) { + if (hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + + return target; + } + }, + {} + ], + 166: [ + function(require, module, exports) { + /*! + * HTML Parser By John Resig (ejohn.org) + * Modified by Juriy "kangax" Zaytsev + * Original code by Erik Arvidsson, Mozilla Public License + * http://erik.eae.net/simplehtmlparser/simplehtmlparser.js + */ + + /* + * // Use like so: + * HTMLParser(htmlString, { + * start: function(tag, attrs, unary) {}, + * end: function(tag) {}, + * chars: function(text) {}, + * comment: function(text) {} + * }); + * + * // or to get an XML string: + * HTMLtoXML(htmlString); + * + * // or to get an XML DOM Document + * HTMLtoDOM(htmlString); + * + * // or to inject into an existing document/DOM node + * HTMLtoDOM(htmlString, document); + * HTMLtoDOM(htmlString, document.body); + * + */ + + /* global ActiveXObject, DOMDocument */ + + "use strict"; + + var createMapFromString = require("./utils").createMapFromString; + + function makeMap(values) { + return createMapFromString(values, true); + } + + // Regular Expressions for parsing tags and attributes + var singleAttrIdentifier = /([^\s"'<>/=]+)/, + singleAttrAssigns = [/=/], + singleAttrValues = [ + // attr value double quotes + /"([^"]*)"+/.source, + // attr value, single quotes + /'([^']*)'+/.source, + // attr value, no quotes + /([^ \t\n\f\r"'`=<>]+)/.source + ], + // https://www.w3.org/TR/1999/REC-xml-names-19990114/#NT-QName + qnameCapture = (function() { + // based on https://www.npmjs.com/package/ncname + var combiningChar = + "\\u0300-\\u0345\\u0360\\u0361\\u0483-\\u0486\\u0591-\\u05A1\\u05A3-\\u05B9\\u05BB-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u064B-\\u0652\\u0670\\u06D6-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0901-\\u0903\\u093C\\u093E-\\u094D\\u0951-\\u0954\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u0A02\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A70\\u0A71\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B43\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B82\\u0B83\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C01-\\u0C03\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C82\\u0C83\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0D02\\u0D03\\u0D3E-\\u0D43\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86-\\u0F8B\\u0F90-\\u0F95\\u0F97\\u0F99-\\u0FAD\\u0FB1-\\u0FB7\\u0FB9\\u20D0-\\u20DC\\u20E1\\u302A-\\u302F\\u3099\\u309A"; + var digit = + "0-9\\u0660-\\u0669\\u06F0-\\u06F9\\u0966-\\u096F\\u09E6-\\u09EF\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0BE7-\\u0BEF\\u0C66-\\u0C6F\\u0CE6-\\u0CEF\\u0D66-\\u0D6F\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F29"; + var extender = + "\\xB7\\u02D0\\u02D1\\u0387\\u0640\\u0E46\\u0EC6\\u3005\\u3031-\\u3035\\u309D\\u309E\\u30FC-\\u30FE"; + var letter = + "A-Za-z\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u0131\\u0134-\\u013E\\u0141-\\u0148\\u014A-\\u017E\\u0180-\\u01C3\\u01CD-\\u01F0\\u01F4\\u01F5\\u01FA-\\u0217\\u0250-\\u02A8\\u02BB-\\u02C1\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03CE\\u03D0-\\u03D6\\u03DA\\u03DC\\u03DE\\u03E0\\u03E2-\\u03F3\\u0401-\\u040C\\u040E-\\u044F\\u0451-\\u045C\\u045E-\\u0481\\u0490-\\u04C4\\u04C7\\u04C8\\u04CB\\u04CC\\u04D0-\\u04EB\\u04EE-\\u04F5\\u04F8\\u04F9\\u0531-\\u0556\\u0559\\u0561-\\u0586\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0621-\\u063A\\u0641-\\u064A\\u0671-\\u06B7\\u06BA-\\u06BE\\u06C0-\\u06CE\\u06D0-\\u06D3\\u06D5\\u06E5\\u06E6\\u0905-\\u0939\\u093D\\u0958-\\u0961\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8B\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AE0\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B36-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB5\\u0BB7-\\u0BB9\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CDE\\u0CE0\\u0CE1\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D28\\u0D2A-\\u0D39\\u0D60\\u0D61\\u0E01-\\u0E2E\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E45\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD\\u0EAE\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0F40-\\u0F47\\u0F49-\\u0F69\\u10A0-\\u10C5\\u10D0-\\u10F6\\u1100\\u1102\\u1103\\u1105-\\u1107\\u1109\\u110B\\u110C\\u110E-\\u1112\\u113C\\u113E\\u1140\\u114C\\u114E\\u1150\\u1154\\u1155\\u1159\\u115F-\\u1161\\u1163\\u1165\\u1167\\u1169\\u116D\\u116E\\u1172\\u1173\\u1175\\u119E\\u11A8\\u11AB\\u11AE\\u11AF\\u11B7\\u11B8\\u11BA\\u11BC-\\u11C2\\u11EB\\u11F0\\u11F9\\u1E00-\\u1E9B\\u1EA0-\\u1EF9\\u1F00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2126\\u212A\\u212B\\u212E\\u2180-\\u2182\\u3007\\u3021-\\u3029\\u3041-\\u3094\\u30A1-\\u30FA\\u3105-\\u312C\\u4E00-\\u9FA5\\uAC00-\\uD7A3"; + var ncname = + "[" + + letter + + "_][" + + letter + + digit + + "\\.\\-_" + + combiningChar + + extender + + "]*"; + return "((?:" + ncname + "\\:)?" + ncname + ")"; + })(), + startTagOpen = new RegExp("^<" + qnameCapture), + startTagClose = /^\s*(\/?)>/, + endTag = new RegExp("^<\\/" + qnameCapture + "[^>]*>"), + doctype = /^]+>/i; + + var IS_REGEX_CAPTURING_BROKEN = false; + "x".replace(/x(.)?/g, function(m, g) { + IS_REGEX_CAPTURING_BROKEN = g === ""; + }); + + // Empty Elements + var empty = makeMap( + "area,base,basefont,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr" + ); + + // Inline Elements + var inline = makeMap( + "a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,noscript,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,svg,textarea,tt,u,var" + ); + + // Elements that you can, intentionally, leave open + // (and which close themselves) + var closeSelf = makeMap( + "colgroup,dd,dt,li,option,p,td,tfoot,th,thead,tr,source" + ); + + // Attributes that have their values filled in disabled='disabled' + var fillAttrs = makeMap( + "checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected" + ); + + // Special Elements (can contain anything) + var special = makeMap("script,style"); + + // HTML5 tags https://html.spec.whatwg.org/multipage/indices.html#elements-3 + // Phrasing Content https://html.spec.whatwg.org/multipage/dom.html#phrasing-content + var nonPhrasing = makeMap( + "address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,ol,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track,ul" + ); + + var reCache = {}; + + function attrForHandler(handler) { + var pattern = + singleAttrIdentifier.source + + "(?:\\s*(" + + joinSingleAttrAssigns(handler) + + ")" + + "[ \\t\\n\\f\\r]*(?:" + + singleAttrValues.join("|") + + "))?"; + if (handler.customAttrSurround) { + var attrClauses = []; + for (var i = handler.customAttrSurround.length - 1; i >= 0; i--) { + attrClauses[i] = + "(?:" + + "(" + + handler.customAttrSurround[i][0].source + + ")\\s*" + + pattern + + "\\s*(" + + handler.customAttrSurround[i][1].source + + ")" + + ")"; + } + attrClauses.push("(?:" + pattern + ")"); + pattern = "(?:" + attrClauses.join("|") + ")"; + } + return new RegExp("^\\s*" + pattern); + } + + function joinSingleAttrAssigns(handler) { + return singleAttrAssigns + .concat(handler.customAttrAssign || []) + .map(function(assign) { + return "(?:" + assign.source + ")"; + }) + .join("|"); + } + + function HTMLParser(html, handler) { + var stack = [], + lastTag; + var attribute = attrForHandler(handler); + var last, prevTag, nextTag; + while (html) { + last = html; + // Make sure we're not in a script or style element + if (!lastTag || !special(lastTag)) { + var textEnd = html.indexOf("<"); + if (textEnd === 0) { + // Comment: + if (/^"); + + if (commentEnd >= 0) { + if (handler.comment) { + handler.comment(html.substring(4, commentEnd)); + } + html = html.substring(commentEnd + 3); + prevTag = ""; + continue; + } + } + + // https://en.wikipedia.org/wiki/Conditional_comment#Downlevel-revealed_conditional_comment + if (/^"); + + if (conditionalEnd >= 0) { + if (handler.comment) { + handler.comment( + html.substring(2, conditionalEnd + 1), + true /* non-standard */ + ); + } + html = html.substring(conditionalEnd + 2); + prevTag = ""; + continue; + } + } + + // Doctype: + var doctypeMatch = html.match(doctype); + if (doctypeMatch) { + if (handler.doctype) { + handler.doctype(doctypeMatch[0]); + } + html = html.substring(doctypeMatch[0].length); + prevTag = ""; + continue; + } + + // End tag: + var endTagMatch = html.match(endTag); + if (endTagMatch) { + html = html.substring(endTagMatch[0].length); + endTagMatch[0].replace(endTag, parseEndTag); + prevTag = "/" + endTagMatch[1].toLowerCase(); + continue; + } + + // Start tag: + var startTagMatch = parseStartTag(html); + if (startTagMatch) { + html = startTagMatch.rest; + handleStartTag(startTagMatch); + prevTag = startTagMatch.tagName.toLowerCase(); + continue; + } + + // Treat `<` as text + if (handler.continueOnParseError) { + textEnd = html.indexOf("<", 1); + } + } + + var text; + if (textEnd >= 0) { + text = html.substring(0, textEnd); + html = html.substring(textEnd); + } else { + text = html; + html = ""; + } + + // next tag + var nextTagMatch = parseStartTag(html); + if (nextTagMatch) { + nextTag = nextTagMatch.tagName; + } else { + nextTagMatch = html.match(endTag); + if (nextTagMatch) { + nextTag = "/" + nextTagMatch[1]; + } else { + nextTag = ""; + } + } + + if (handler.chars) { + handler.chars(text, prevTag, nextTag); + } + prevTag = ""; + } else { + var stackedTag = lastTag.toLowerCase(); + var reStackedTag = + reCache[stackedTag] || + (reCache[stackedTag] = new RegExp( + "([\\s\\S]*?)]*>", + "i" + )); + + html = html.replace(reStackedTag, function(all, text) { + if ( + stackedTag !== "script" && + stackedTag !== "style" && + stackedTag !== "noscript" + ) { + text = text + .replace(//g, "$1") + .replace(//g, "$1"); + } + + if (handler.chars) { + handler.chars(text); + } + + return ""; + }); + + parseEndTag("", stackedTag); + } + + if (html === last) { + throw new Error("Parse Error: " + html); + } + } + + if (!handler.partialMarkup) { + // Clean up any remaining tags + parseEndTag(); + } + + function parseStartTag(input) { + var start = input.match(startTagOpen); + if (start) { + var match = { + tagName: start[1], + attrs: [] + }; + input = input.slice(start[0].length); + var end, attr; + while ( + !(end = input.match(startTagClose)) && + (attr = input.match(attribute)) + ) { + input = input.slice(attr[0].length); + match.attrs.push(attr); + } + if (end) { + match.unarySlash = end[1]; + match.rest = input.slice(end[0].length); + return match; + } + } + } + + function closeIfFound(tagName) { + if (findTag(tagName) >= 0) { + parseEndTag("", tagName); + return true; + } + } + + function handleStartTag(match) { + var tagName = match.tagName; + var unarySlash = match.unarySlash; + + if (handler.html5) { + if (lastTag === "p" && nonPhrasing(tagName)) { + parseEndTag("", lastTag); + } else if (tagName === "tbody") { + closeIfFound("thead"); + } else if (tagName === "tfoot") { + if (!closeIfFound("tbody")) { + closeIfFound("thead"); + } + } + if (tagName === "col" && findTag("colgroup") < 0) { + lastTag = "colgroup"; + stack.push({ tag: lastTag, attrs: [] }); + if (handler.start) { + handler.start(lastTag, [], false, ""); + } + } + } + + if (!handler.html5 && !inline(tagName)) { + while (lastTag && inline(lastTag)) { + parseEndTag("", lastTag); + } + } + + if (closeSelf(tagName) && lastTag === tagName) { + parseEndTag("", tagName); + } + + var unary = + empty(tagName) || + (tagName === "html" && lastTag === "head") || + !!unarySlash; + + var attrs = match.attrs.map(function(args) { + var name, value, customOpen, customClose, customAssign, quote; + var ncp = 7; // number of captured parts, scalar + + // hackish work around FF bug https://bugzilla.mozilla.org/show_bug.cgi?id=369778 + if (IS_REGEX_CAPTURING_BROKEN && args[0].indexOf('""') === -1) { + if (args[3] === "") { + delete args[3]; + } + if (args[4] === "") { + delete args[4]; + } + if (args[5] === "") { + delete args[5]; + } + } + + function populate(index) { + customAssign = args[index]; + value = args[index + 1]; + if (typeof value !== "undefined") { + return '"'; + } + value = args[index + 2]; + if (typeof value !== "undefined") { + return "'"; + } + value = args[index + 3]; + if (typeof value === "undefined" && fillAttrs(name)) { + value = name; + } + return ""; + } + + var j = 1; + if (handler.customAttrSurround) { + for ( + var i = 0, l = handler.customAttrSurround.length; + i < l; + i++, j += ncp + ) { + name = args[j + 1]; + if (name) { + quote = populate(j + 2); + customOpen = args[j]; + customClose = args[j + 6]; + break; + } + } + } + + if (!name && (name = args[j])) { + quote = populate(j + 1); + } + + return { + name: name, + value: value, + customAssign: customAssign || "=", + customOpen: customOpen || "", + customClose: customClose || "", + quote: quote || "" + }; + }); + + if (!unary) { + stack.push({ tag: tagName, attrs: attrs }); + lastTag = tagName; + unarySlash = ""; + } + + if (handler.start) { + handler.start(tagName, attrs, unary, unarySlash); + } + } + + function findTag(tagName) { + var pos; + var needle = tagName.toLowerCase(); + for (pos = stack.length - 1; pos >= 0; pos--) { + if (stack[pos].tag.toLowerCase() === needle) { + break; + } + } + return pos; + } + + function parseEndTag(tag, tagName) { + var pos; + + // Find the closest opened tag of the same type + if (tagName) { + pos = findTag(tagName); + } + // If no tag name is provided, clean shop + else { + pos = 0; + } + + if (pos >= 0) { + // Close all the open elements, up the stack + for (var i = stack.length - 1; i >= pos; i--) { + if (handler.end) { + handler.end(stack[i].tag, stack[i].attrs, i > pos || !tag); + } + } + + // Remove the open elements from the stack + stack.length = pos; + lastTag = pos && stack[pos - 1].tag; + } else if (tagName.toLowerCase() === "br") { + if (handler.start) { + handler.start(tagName, [], true, ""); + } + } else if (tagName.toLowerCase() === "p") { + if (handler.start) { + handler.start(tagName, [], false, "", true); + } + if (handler.end) { + handler.end(tagName, []); + } + } + } + } + + exports.HTMLParser = HTMLParser; + exports.HTMLtoXML = function(html) { + var results = ""; + + new HTMLParser(html, { + start: function(tag, attrs, unary) { + results += "<" + tag; + + for (var i = 0, len = attrs.length; i < len; i++) { + results += + " " + + attrs[i].name + + '="' + + (attrs[i].value || "").replace(/"/g, """) + + '"'; + } + + results += (unary ? "/" : "") + ">"; + }, + end: function(tag) { + results += ""; + }, + chars: function(text) { + results += text; + }, + comment: function(text) { + results += ""; + }, + ignore: function(text) { + results += text; + } + }); + + return results; + }; + + exports.HTMLtoDOM = function(html, doc) { + // There can be only one of these elements + var one = { + html: true, + head: true, + body: true, + title: true + }; + + // Enforce a structure for the document + var structure = { + link: "head", + base: "head" + }; + + if (doc) { + doc = + doc.ownerDocument || + (doc.getOwnerDocument && doc.getOwnerDocument()) || + doc; + } else if (typeof DOMDocument !== "undefined") { + doc = new DOMDocument(); + } else if ( + typeof document !== "undefined" && + document.implementation && + document.implementation.createDocument + ) { + doc = document.implementation.createDocument("", "", null); + } else if (typeof ActiveX !== "undefined") { + doc = new ActiveXObject("Msxml.DOMDocument"); + } + + var elems = [], + documentElement = + doc.documentElement || + (doc.getDocumentElement && doc.getDocumentElement()); + + // If we're dealing with an empty document then we + // need to pre-populate it with the HTML document structure + if (!documentElement && doc.createElement) { + (function() { + var html = doc.createElement("html"); + var head = doc.createElement("head"); + head.appendChild(doc.createElement("title")); + html.appendChild(head); + html.appendChild(doc.createElement("body")); + doc.appendChild(html); + })(); + } + + // Find all the unique elements + if (doc.getElementsByTagName) { + for (var i in one) { + one[i] = doc.getElementsByTagName(i)[0]; + } + } + + // If we're working with a document, inject contents into + // the body element + var curParentNode = one.body; + + new HTMLParser(html, { + start: function(tagName, attrs, unary) { + // If it's a pre-built element, then we can ignore + // its construction + if (one[tagName]) { + curParentNode = one[tagName]; + return; + } + + var elem = doc.createElement(tagName); + + for (var attr in attrs) { + elem.setAttribute(attrs[attr].name, attrs[attr].value); + } + + if ( + structure[tagName] && + typeof one[structure[tagName]] !== "boolean" + ) { + one[structure[tagName]].appendChild(elem); + } else if (curParentNode && curParentNode.appendChild) { + curParentNode.appendChild(elem); + } + + if (!unary) { + elems.push(elem); + curParentNode = elem; + } + }, + end: function(/* tag */) { + elems.length -= 1; + + // Init the new parentNode + curParentNode = elems[elems.length - 1]; + }, + chars: function(text) { + curParentNode.appendChild(doc.createTextNode(text)); + }, + comment: function(/* text */) { + // create comment node + }, + ignore: function(/* text */) { + // What to do here? + } + }); + + return doc; + }; + }, + { "./utils": 168 } + ], + 167: [ + function(require, module, exports) { + "use strict"; + + function Sorter() {} + + Sorter.prototype.sort = function(tokens, fromIndex) { + fromIndex = fromIndex || 0; + for (var i = 0, len = this.keys.length; i < len; i++) { + var key = this.keys[i]; + var token = key.slice(1); + var index = tokens.indexOf(token, fromIndex); + if (index !== -1) { + do { + if (index !== fromIndex) { + tokens.splice(index, 1); + tokens.splice(fromIndex, 0, token); + } + fromIndex++; + } while ((index = tokens.indexOf(token, fromIndex)) !== -1); + return this[key].sort(tokens, fromIndex); + } + } + return tokens; + }; + + function TokenChain() {} + + TokenChain.prototype = { + add: function(tokens) { + var self = this; + tokens.forEach(function(token) { + var key = "$" + token; + if (!self[key]) { + self[key] = []; + self[key].processed = 0; + } + self[key].push(tokens); + }); + }, + createSorter: function() { + var self = this; + var sorter = new Sorter(); + sorter.keys = Object.keys(self) + .sort(function(j, k) { + var m = self[j].length; + var n = self[k].length; + return m < n ? 1 : m > n ? -1 : j < k ? -1 : j > k ? 1 : 0; + }) + .filter(function(key) { + if (self[key].processed < self[key].length) { + var token = key.slice(1); + var chain = new TokenChain(); + self[key].forEach(function(tokens) { + var index; + while ((index = tokens.indexOf(token)) !== -1) { + tokens.splice(index, 1); + } + tokens.forEach(function(token) { + self["$" + token].processed++; + }); + chain.add(tokens.slice(0)); + }); + sorter[key] = chain.createSorter(); + return true; + } + return false; + }); + return sorter; + } + }; + + module.exports = TokenChain; + }, + {} + ], + 168: [ + function(require, module, exports) { + "use strict"; + + function createMap(values, ignoreCase) { + var map = {}; + values.forEach(function(value) { + map[value] = 1; + }); + return ignoreCase + ? function(value) { + return map[value.toLowerCase()] === 1; + } + : function(value) { + return map[value] === 1; + }; + } + + exports.createMap = createMap; + exports.createMapFromString = function(values, ignoreCase) { + return createMap(values.split(/,/), ignoreCase); + }; + }, + {} + ], + "html-minifier": [ + function(require, module, exports) { + "use strict"; + + var CleanCSS = require("clean-css"); + var decode = require("he").decode; + var HTMLParser = require("./htmlparser").HTMLParser; + var RelateUrl = require("relateurl"); + var TokenChain = require("./tokenchain"); + var UglifyJS = require("uglify-js"); + var utils = require("./utils"); + + function trimWhitespace(str) { + return ( + str && str.replace(/^[ \n\r\t\f]+/, "").replace(/[ \n\r\t\f]+$/, "") + ); + } + + function collapseWhitespaceAll(str) { + // Non-breaking space is specifically handled inside the replacer function here: + return ( + str && + str.replace(/[ \n\r\t\f\xA0]+/g, function(spaces) { + return spaces === "\t" + ? "\t" + : spaces.replace(/(^|\xA0+)[^\xA0]+/g, "$1 "); + }) + ); + } + + function collapseWhitespace( + str, + options, + trimLeft, + trimRight, + collapseAll + ) { + var lineBreakBefore = "", + lineBreakAfter = ""; + + if (options.preserveLineBreaks) { + str = str + .replace(/^[ \n\r\t\f]*?[\n\r][ \n\r\t\f]*/, function() { + lineBreakBefore = "\n"; + return ""; + }) + .replace(/[ \n\r\t\f]*?[\n\r][ \n\r\t\f]*$/, function() { + lineBreakAfter = "\n"; + return ""; + }); + } + + if (trimLeft) { + // Non-breaking space is specifically handled inside the replacer function here: + str = str.replace(/^[ \n\r\t\f\xA0]+/, function(spaces) { + var conservative = + !lineBreakBefore && options.conservativeCollapse; + if (conservative && spaces === "\t") { + return "\t"; + } + return ( + spaces + .replace(/^[^\xA0]+/, "") + .replace(/(\xA0+)[^\xA0]+/g, "$1 ") || + (conservative ? " " : "") + ); + }); + } + + if (trimRight) { + // Non-breaking space is specifically handled inside the replacer function here: + str = str.replace(/[ \n\r\t\f\xA0]+$/, function(spaces) { + var conservative = + !lineBreakAfter && options.conservativeCollapse; + if (conservative && spaces === "\t") { + return "\t"; + } + return ( + spaces + .replace(/[^\xA0]+(\xA0+)/g, " $1") + .replace(/[^\xA0]+$/, "") || (conservative ? " " : "") + ); + }); + } + + if (collapseAll) { + // strip non space whitespace then compress spaces to one + str = collapseWhitespaceAll(str); + } + + return lineBreakBefore + str + lineBreakAfter; + } + + var createMapFromString = utils.createMapFromString; + // non-empty tags that will maintain whitespace around them + var inlineTags = createMapFromString( + "a,abbr,acronym,b,bdi,bdo,big,button,cite,code,del,dfn,em,font,i,ins,kbd,label,mark,math,nobr,object,q,rp,rt,rtc,ruby,s,samp,select,small,span,strike,strong,sub,sup,svg,textarea,time,tt,u,var" + ); + // non-empty tags that will maintain whitespace within them + var inlineTextTags = createMapFromString( + "a,abbr,acronym,b,big,del,em,font,i,ins,kbd,mark,nobr,rp,s,samp,small,span,strike,strong,sub,sup,time,tt,u,var" + ); + // self-closing tags that will maintain whitespace around them + var selfClosingInlineTags = createMapFromString( + "comment,img,input,wbr" + ); + + function collapseWhitespaceSmart(str, prevTag, nextTag, options) { + var trimLeft = prevTag && !selfClosingInlineTags(prevTag); + if (trimLeft && !options.collapseInlineTagWhitespace) { + trimLeft = + prevTag.charAt(0) === "/" + ? !inlineTags(prevTag.slice(1)) + : !inlineTextTags(prevTag); + } + var trimRight = nextTag && !selfClosingInlineTags(nextTag); + if (trimRight && !options.collapseInlineTagWhitespace) { + trimRight = + nextTag.charAt(0) === "/" + ? !inlineTextTags(nextTag.slice(1)) + : !inlineTags(nextTag); + } + return collapseWhitespace( + str, + options, + trimLeft, + trimRight, + prevTag && nextTag + ); + } + + function isConditionalComment(text) { + return /^\[if\s[^\]]+]|\[endif]$/.test(text); + } + + function isIgnoredComment(text, options) { + for ( + var i = 0, len = options.ignoreCustomComments.length; + i < len; + i++ + ) { + if (options.ignoreCustomComments[i].test(text)) { + return true; + } + } + return false; + } + + function isEventAttribute(attrName, options) { + var patterns = options.customEventAttributes; + if (patterns) { + for (var i = patterns.length; i--; ) { + if (patterns[i].test(attrName)) { + return true; + } + } + return false; + } + return /^on[a-z]{3,}$/.test(attrName); + } + + function canRemoveAttributeQuotes(value) { + // https://mathiasbynens.be/notes/unquoted-attribute-values + return /^[^ \t\n\f\r"'`=<>]+$/.test(value); + } + + function attributesInclude(attributes, attribute) { + for (var i = attributes.length; i--; ) { + if (attributes[i].name.toLowerCase() === attribute) { + return true; + } + } + return false; + } + + function isAttributeRedundant(tag, attrName, attrValue, attrs) { + attrValue = attrValue ? trimWhitespace(attrValue.toLowerCase()) : ""; + + return ( + (tag === "script" && + attrName === "language" && + attrValue === "javascript") || + (tag === "form" && attrName === "method" && attrValue === "get") || + (tag === "input" && attrName === "type" && attrValue === "text") || + (tag === "script" && + attrName === "charset" && + !attributesInclude(attrs, "src")) || + (tag === "a" && + attrName === "name" && + attributesInclude(attrs, "id")) || + (tag === "area" && attrName === "shape" && attrValue === "rect") + ); + } + + // https://mathiasbynens.be/demo/javascript-mime-type + // https://developer.mozilla.org/en/docs/Web/HTML/Element/script#attr-type + var executableScriptsMimetypes = utils.createMap([ + "text/javascript", + "text/ecmascript", + "text/jscript", + "application/javascript", + "application/x-javascript", + "application/ecmascript" + ]); + + function isScriptTypeAttribute(attrValue) { + attrValue = trimWhitespace(attrValue.split(/;/, 2)[0]).toLowerCase(); + return attrValue === "" || executableScriptsMimetypes(attrValue); + } + + function isExecutableScript(tag, attrs) { + if (tag !== "script") { + return false; + } + for (var i = 0, len = attrs.length; i < len; i++) { + var attrName = attrs[i].name.toLowerCase(); + if (attrName === "type") { + return isScriptTypeAttribute(attrs[i].value); + } + } + return true; + } + + function isStyleLinkTypeAttribute(attrValue) { + attrValue = trimWhitespace(attrValue).toLowerCase(); + return attrValue === "" || attrValue === "text/css"; + } + + function isStyleSheet(tag, attrs) { + if (tag !== "style") { + return false; + } + for (var i = 0, len = attrs.length; i < len; i++) { + var attrName = attrs[i].name.toLowerCase(); + if (attrName === "type") { + return isStyleLinkTypeAttribute(attrs[i].value); + } + } + return true; + } + + var isSimpleBoolean = createMapFromString( + "allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible" + ); + var isBooleanValue = createMapFromString("true,false"); + + function isBooleanAttribute(attrName, attrValue) { + return ( + isSimpleBoolean(attrName) || + (attrName === "draggable" && !isBooleanValue(attrValue)) + ); + } + + function isUriTypeAttribute(attrName, tag) { + return ( + (/^(?:a|area|link|base)$/.test(tag) && attrName === "href") || + (tag === "img" && /^(?:src|longdesc|usemap)$/.test(attrName)) || + (tag === "object" && + /^(?:classid|codebase|data|usemap)$/.test(attrName)) || + (tag === "q" && attrName === "cite") || + (tag === "blockquote" && attrName === "cite") || + ((tag === "ins" || tag === "del") && attrName === "cite") || + (tag === "form" && attrName === "action") || + (tag === "input" && + (attrName === "src" || attrName === "usemap")) || + (tag === "head" && attrName === "profile") || + (tag === "script" && (attrName === "src" || attrName === "for")) + ); + } + + function isNumberTypeAttribute(attrName, tag) { + return ( + (/^(?:a|area|object|button)$/.test(tag) && + attrName === "tabindex") || + (tag === "input" && + (attrName === "maxlength" || attrName === "tabindex")) || + (tag === "select" && + (attrName === "size" || attrName === "tabindex")) || + (tag === "textarea" && /^(?:rows|cols|tabindex)$/.test(attrName)) || + (tag === "colgroup" && attrName === "span") || + (tag === "col" && attrName === "span") || + ((tag === "th" || tag === "td") && + (attrName === "rowspan" || attrName === "colspan")) + ); + } + + function isLinkType(tag, attrs, value) { + if (tag !== "link") { + return false; + } + for (var i = 0, len = attrs.length; i < len; i++) { + if (attrs[i].name === "rel" && attrs[i].value === value) { + return true; + } + } + } + + function isMediaQuery(tag, attrs, attrName) { + return ( + attrName === "media" && + (isLinkType(tag, attrs, "stylesheet") || isStyleSheet(tag, attrs)) + ); + } + + var srcsetTags = createMapFromString("img,source"); + + function isSrcset(attrName, tag) { + return attrName === "srcset" && srcsetTags(tag); + } + + function cleanAttributeValue(tag, attrName, attrValue, options, attrs) { + if (isEventAttribute(attrName, options)) { + attrValue = trimWhitespace(attrValue).replace( + /^javascript:\s*/i, + "" + ); + return options.minifyJS(attrValue, true); + } else if (attrName === "class") { + attrValue = trimWhitespace(attrValue); + if (options.sortClassName) { + attrValue = options.sortClassName(attrValue); + } else { + attrValue = collapseWhitespaceAll(attrValue); + } + return attrValue; + } else if (isUriTypeAttribute(attrName, tag)) { + attrValue = trimWhitespace(attrValue); + return isLinkType(tag, attrs, "canonical") + ? attrValue + : options.minifyURLs(attrValue); + } else if (isNumberTypeAttribute(attrName, tag)) { + return trimWhitespace(attrValue); + } else if (attrName === "style") { + attrValue = trimWhitespace(attrValue); + if (attrValue) { + if ( + /;$/.test(attrValue) && + !/&#?[0-9a-zA-Z]+;$/.test(attrValue) + ) { + attrValue = attrValue.replace(/\s*;$/, ";"); + } + attrValue = options.minifyCSS(attrValue, "inline"); + } + return attrValue; + } else if (isSrcset(attrName, tag)) { + // https://html.spec.whatwg.org/multipage/embedded-content.html#attr-img-srcset + attrValue = trimWhitespace(attrValue) + .split(/\s+,\s*|\s*,\s+/) + .map(function(candidate) { + var url = candidate; + var descriptor = ""; + var match = candidate.match( + /\s+([1-9][0-9]*w|[0-9]+(?:\.[0-9]+)?x)$/ + ); + if (match) { + url = url.slice(0, -match[0].length); + var num = +match[1].slice(0, -1); + var suffix = match[1].slice(-1); + if (num !== 1 || suffix !== "x") { + descriptor = " " + num + suffix; + } + } + return options.minifyURLs(url) + descriptor; + }) + .join(", "); + } else if (isMetaViewport(tag, attrs) && attrName === "content") { + attrValue = attrValue + .replace(/\s+/g, "") + .replace(/[0-9]+\.[0-9]+/g, function(numString) { + // "0.90000" -> "0.9" + // "1.0" -> "1" + // "1.0001" -> "1.0001" (unchanged) + return (+numString).toString(); + }); + } else if ( + isContentSecurityPolicy(tag, attrs) && + attrName.toLowerCase() === "content" + ) { + return collapseWhitespaceAll(attrValue); + } else if ( + options.customAttrCollapse && + options.customAttrCollapse.test(attrName) + ) { + attrValue = attrValue.replace(/\n+|\r+|\s{2,}/g, ""); + } else if (tag === "script" && attrName === "type") { + attrValue = trimWhitespace(attrValue.replace(/\s*;\s*/g, ";")); + } else if (isMediaQuery(tag, attrs, attrName)) { + attrValue = trimWhitespace(attrValue); + return options.minifyCSS(attrValue, "media"); + } + return attrValue; + } + + function isMetaViewport(tag, attrs) { + if (tag !== "meta") { + return false; + } + for (var i = 0, len = attrs.length; i < len; i++) { + if (attrs[i].name === "name" && attrs[i].value === "viewport") { + return true; + } + } + } + + function isContentSecurityPolicy(tag, attrs) { + if (tag !== "meta") { + return false; + } + for (var i = 0, len = attrs.length; i < len; i++) { + if ( + attrs[i].name.toLowerCase() === "http-equiv" && + attrs[i].value.toLowerCase() === "content-security-policy" + ) { + return true; + } + } + } + + function ignoreCSS(id) { + return ( + "/* clean-css ignore:start */" + id + "/* clean-css ignore:end */" + ); + } + + // Wrap CSS declarations for CleanCSS > 3.x + // See https://github.com/jakubpawlowicz/clean-css/issues/418 + function wrapCSS(text, type) { + switch (type) { + case "inline": + return "*{" + text + "}"; + case "media": + return "@media " + text + "{a{top:0}}"; + default: + return text; + } + } + + function unwrapCSS(text, type) { + var matches; + switch (type) { + case "inline": + matches = text.match(/^\*\{([\s\S]*)\}$/); + break; + case "media": + matches = text.match(/^@media ([\s\S]*?)\s*{[\s\S]*}$/); + break; + } + return matches ? matches[1] : text; + } + + function cleanConditionalComment(comment, options) { + return options.processConditionalComments + ? comment.replace( + /^(\[if\s[^\]]+]>)([\s\S]*?)( -1 + ) { + return minify(text, options); + } + } + return text; + } + + // Tag omission rules from https://html.spec.whatwg.org/multipage/syntax.html#optional-tags + // with the following deviations: + // - retain if followed by