User:Jack who built the house/convenientDiscussions.js
Appearance
Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
!function(modules) {
var installedModules = {};
function __webpack_require__(moduleId) {
if (installedModules[moduleId]) return installedModules[moduleId].exports;
var module = installedModules[moduleId] = {
i: moduleId,
l: !1,
exports: {}
};
return modules[moduleId].call(module.exports, module, module.exports, __webpack_require__),
module.l = !0, module.exports;
}
__webpack_require__.m = modules, __webpack_require__.c = installedModules, __webpack_require__.d = function(exports, name, getter) {
__webpack_require__.o(exports, name) || Object.defineProperty(exports, name, {
enumerable: !0,
get: getter
});
}, __webpack_require__.r = function(exports) {
"undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(exports, Symbol.toStringTag, {
value: "Module"
}), Object.defineProperty(exports, "__esModule", {
value: !0
});
}, __webpack_require__.t = function(value, mode) {
if (1 & mode && (value = __webpack_require__(value)), 8 & mode) return value;
if (4 & mode && "object" == typeof value && value && value.__esModule) return value;
var ns = Object.create(null);
if (__webpack_require__.r(ns), Object.defineProperty(ns, "default", {
enumerable: !0,
value: value
}), 2 & mode && "string" != typeof value) for (var key in value) __webpack_require__.d(ns, key, function(key) {
return value[key];
}.bind(null, key));
return ns;
}, __webpack_require__.n = function(module) {
var getter = module && module.__esModule ? function() {
return module.default;
} : function() {
return module;
};
return __webpack_require__.d(getter, "a", getter), getter;
}, __webpack_require__.o = function(object, property) {
return Object.prototype.hasOwnProperty.call(object, property);
}, __webpack_require__.p = "", __webpack_require__(__webpack_require__.s = 29);
}([ function(module, exports) {
module.exports = function(receiver, privateMap) {
var descriptor = privateMap.get(receiver);
if (!descriptor) throw new TypeError("attempted to get private field on non-instance");
return descriptor.get ? descriptor.get.call(receiver) : descriptor.value;
};
}, function(module, exports) {
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg), value = info.value;
} catch (error) {
return void reject(error);
}
info.done ? resolve(value) : Promise.resolve(value).then(_next, _throw);
}
module.exports = function(fn) {
return function() {
var self = this, args = arguments;
return new Promise((function(resolve, reject) {
var gen = fn.apply(self, args);
function _next(value) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(void 0);
}));
};
};
}, function(module, exports) {
module.exports = function(receiver, privateMap, value) {
var descriptor = privateMap.get(receiver);
if (!descriptor) throw new TypeError("attempted to set private field on non-instance");
if (descriptor.set) descriptor.set.call(receiver, value); else {
if (!descriptor.writable) throw new TypeError("attempted to set read only private field");
descriptor.value = value;
}
return value;
};
}, function(module, exports, __webpack_require__) {
"use strict";
var memo, isOldIE = function() {
return void 0 === memo && (memo = Boolean(window && document && document.all && !window.atob)),
memo;
}, getTarget = function() {
var memo = {};
return function(target) {
if (void 0 === memo[target]) {
var styleTarget = document.querySelector(target);
if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) try {
styleTarget = styleTarget.contentDocument.head;
} catch (e) {
styleTarget = null;
}
memo[target] = styleTarget;
}
return memo[target];
};
}(), stylesInDom = [];
function getIndexByIdentifier(identifier) {
for (var result = -1, i = 0; i < stylesInDom.length; i++) if (stylesInDom[i].identifier === identifier) {
result = i;
break;
}
return result;
}
function modulesToDom(list, options) {
for (var idCountMap = {}, identifiers = [], i = 0; i < list.length; i++) {
var item = list[i], id = options.base ? item[0] + options.base : item[0], count = idCountMap[id] || 0, identifier = "".concat(id, " ").concat(count);
idCountMap[id] = count + 1;
var index = getIndexByIdentifier(identifier), obj = {
css: item[1],
media: item[2],
sourceMap: item[3]
};
-1 !== index ? (stylesInDom[index].references++, stylesInDom[index].updater(obj)) : stylesInDom.push({
identifier: identifier,
updater: addStyle(obj, options),
references: 1
}), identifiers.push(identifier);
}
return identifiers;
}
function insertStyleElement(options) {
var style = document.createElement("style"), attributes = options.attributes || {};
if (void 0 === attributes.nonce) {
var nonce = __webpack_require__.nc;
nonce && (attributes.nonce = nonce);
}
if (Object.keys(attributes).forEach((function(key) {
style.setAttribute(key, attributes[key]);
})), "function" == typeof options.insert) options.insert(style); else {
var target = getTarget(options.insert || "head");
if (!target) throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");
target.appendChild(style);
}
return style;
}
var textStore, replaceText = (textStore = [], function(index, replacement) {
return textStore[index] = replacement, textStore.filter(Boolean).join("\n");
});
function applyToSingletonTag(style, index, remove, obj) {
var css = remove ? "" : obj.media ? "@media ".concat(obj.media, " {").concat(obj.css, "}") : obj.css;
if (style.styleSheet) style.styleSheet.cssText = replaceText(index, css); else {
var cssNode = document.createTextNode(css), childNodes = style.childNodes;
childNodes[index] && style.removeChild(childNodes[index]), childNodes.length ? style.insertBefore(cssNode, childNodes[index]) : style.appendChild(cssNode);
}
}
function applyToTag(style, options, obj) {
var css = obj.css, media = obj.media, sourceMap = obj.sourceMap;
if (media ? style.setAttribute("media", media) : style.removeAttribute("media"),
sourceMap && btoa && (css += "\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), " */")),
style.styleSheet) style.styleSheet.cssText = css; else {
for (;style.firstChild; ) style.removeChild(style.firstChild);
style.appendChild(document.createTextNode(css));
}
}
var singleton = null, singletonCounter = 0;
function addStyle(obj, options) {
var style, update, remove;
if (options.singleton) {
var styleIndex = singletonCounter++;
style = singleton || (singleton = insertStyleElement(options)), update = applyToSingletonTag.bind(null, style, styleIndex, !1),
remove = applyToSingletonTag.bind(null, style, styleIndex, !0);
} else style = insertStyleElement(options), update = applyToTag.bind(null, style, options),
remove = function() {
!function(style) {
if (null === style.parentNode) return !1;
style.parentNode.removeChild(style);
}(style);
};
return update(obj), function(newObj) {
if (newObj) {
if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap) return;
update(obj = newObj);
} else remove();
};
}
module.exports = function(list, options) {
(options = options || {}).singleton || "boolean" == typeof options.singleton || (options.singleton = isOldIE());
var lastIdentifiers = modulesToDom(list = list || [], options);
return function(newList) {
if (newList = newList || [], "[object Array]" === Object.prototype.toString.call(newList)) {
for (var i = 0; i < lastIdentifiers.length; i++) {
var index = getIndexByIdentifier(lastIdentifiers[i]);
stylesInDom[index].references--;
}
for (var newLastIdentifiers = modulesToDom(newList, options), _i = 0; _i < lastIdentifiers.length; _i++) {
var _index = getIndexByIdentifier(lastIdentifiers[_i]);
0 === stylesInDom[_index].references && (stylesInDom[_index].updater(), stylesInDom.splice(_index, 1));
}
lastIdentifiers = newLastIdentifiers;
}
};
};
}, function(module, exports, __webpack_require__) {
"use strict";
module.exports = function(useSourceMap) {
var list = [];
return list.toString = function() {
return this.map((function(item) {
var content = function(item, useSourceMap) {
var content = item[1] || "", cssMapping = item[3];
if (!cssMapping) return content;
if (useSourceMap && "function" == typeof btoa) {
var sourceMapping = (sourceMap = cssMapping, base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))),
data = "sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(base64),
"/*# ".concat(data, " */")), sourceURLs = cssMapping.sources.map((function(source) {
return "/*# sourceURL=".concat(cssMapping.sourceRoot || "").concat(source, " */");
}));
return [ content ].concat(sourceURLs).concat([ sourceMapping ]).join("\n");
}
var sourceMap, base64, data;
return [ content ].join("\n");
}(item, useSourceMap);
return item[2] ? "@media ".concat(item[2], " {").concat(content, "}") : content;
})).join("");
}, list.i = function(modules, mediaQuery, dedupe) {
"string" == typeof modules && (modules = [ [ null, modules, "" ] ]);
var alreadyImportedModules = {};
if (dedupe) for (var i = 0; i < this.length; i++) {
var id = this[i][0];
null != id && (alreadyImportedModules[id] = !0);
}
for (var _i = 0; _i < modules.length; _i++) {
var item = [].concat(modules[_i]);
dedupe && alreadyImportedModules[item[0]] || (mediaQuery && (item[2] ? item[2] = "".concat(mediaQuery, " and ").concat(item[2]) : item[2] = mediaQuery),
list.push(item));
}
}, list;
};
}, function(module, exports, __webpack_require__) {
var __WEBPACK_AMD_DEFINE_RESULT__, LZString = function() {
var f = String.fromCharCode, keyStrBase64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", keyStrUriSafe = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$", baseReverseDic = {};
function getBaseValue(alphabet, character) {
if (!baseReverseDic[alphabet]) {
baseReverseDic[alphabet] = {};
for (var i = 0; i < alphabet.length; i++) baseReverseDic[alphabet][alphabet.charAt(i)] = i;
}
return baseReverseDic[alphabet][character];
}
var LZString = {
compressToBase64: function(input) {
if (null == input) return "";
var res = LZString._compress(input, 6, (function(a) {
return keyStrBase64.charAt(a);
}));
switch (res.length % 4) {
default:
case 0:
return res;
case 1:
return res + "===";
case 2:
return res + "==";
case 3:
return res + "=";
}
},
decompressFromBase64: function(input) {
return null == input ? "" : "" == input ? null : LZString._decompress(input.length, 32, (function(index) {
return getBaseValue(keyStrBase64, input.charAt(index));
}));
},
compressToUTF16: function(input) {
return null == input ? "" : LZString._compress(input, 15, (function(a) {
return f(a + 32);
})) + " ";
},
decompressFromUTF16: function(compressed) {
return null == compressed ? "" : "" == compressed ? null : LZString._decompress(compressed.length, 16384, (function(index) {
return compressed.charCodeAt(index) - 32;
}));
},
compressToUint8Array: function(uncompressed) {
for (var compressed = LZString.compress(uncompressed), buf = new Uint8Array(2 * compressed.length), i = 0, TotalLen = compressed.length; i < TotalLen; i++) {
var current_value = compressed.charCodeAt(i);
buf[2 * i] = current_value >>> 8, buf[2 * i + 1] = current_value % 256;
}
return buf;
},
decompressFromUint8Array: function(compressed) {
if (null == compressed) return LZString.decompress(compressed);
for (var buf = new Array(compressed.length / 2), i = 0, TotalLen = buf.length; i < TotalLen; i++) buf[i] = 256 * compressed[2 * i] + compressed[2 * i + 1];
var result = [];
return buf.forEach((function(c) {
result.push(f(c));
})), LZString.decompress(result.join(""));
},
compressToEncodedURIComponent: function(input) {
return null == input ? "" : LZString._compress(input, 6, (function(a) {
return keyStrUriSafe.charAt(a);
}));
},
decompressFromEncodedURIComponent: function(input) {
return null == input ? "" : "" == input ? null : (input = input.replace(/ /g, "+"),
LZString._decompress(input.length, 32, (function(index) {
return getBaseValue(keyStrUriSafe, input.charAt(index));
})));
},
compress: function(uncompressed) {
return LZString._compress(uncompressed, 16, (function(a) {
return f(a);
}));
},
_compress: function(uncompressed, bitsPerChar, getCharFromInt) {
if (null == uncompressed) return "";
var i, value, ii, context_dictionary = {}, context_dictionaryToCreate = {}, context_c = "", context_wc = "", context_w = "", context_enlargeIn = 2, context_dictSize = 3, context_numBits = 2, context_data = [], context_data_val = 0, context_data_position = 0;
for (ii = 0; ii < uncompressed.length; ii += 1) if (context_c = uncompressed.charAt(ii),
Object.prototype.hasOwnProperty.call(context_dictionary, context_c) || (context_dictionary[context_c] = context_dictSize++,
context_dictionaryToCreate[context_c] = !0), context_wc = context_w + context_c,
Object.prototype.hasOwnProperty.call(context_dictionary, context_wc)) context_w = context_wc; else {
if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate, context_w)) {
if (context_w.charCodeAt(0) < 256) {
for (i = 0; i < context_numBits; i++) context_data_val <<= 1, context_data_position == bitsPerChar - 1 ? (context_data_position = 0,
context_data.push(getCharFromInt(context_data_val)), context_data_val = 0) : context_data_position++;
for (value = context_w.charCodeAt(0), i = 0; i < 8; i++) context_data_val = context_data_val << 1 | 1 & value,
context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)),
context_data_val = 0) : context_data_position++, value >>= 1;
} else {
for (value = 1, i = 0; i < context_numBits; i++) context_data_val = context_data_val << 1 | value,
context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)),
context_data_val = 0) : context_data_position++, value = 0;
for (value = context_w.charCodeAt(0), i = 0; i < 16; i++) context_data_val = context_data_val << 1 | 1 & value,
context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)),
context_data_val = 0) : context_data_position++, value >>= 1;
}
0 == --context_enlargeIn && (context_enlargeIn = Math.pow(2, context_numBits), context_numBits++),
delete context_dictionaryToCreate[context_w];
} else for (value = context_dictionary[context_w], i = 0; i < context_numBits; i++) context_data_val = context_data_val << 1 | 1 & value,
context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)),
context_data_val = 0) : context_data_position++, value >>= 1;
0 == --context_enlargeIn && (context_enlargeIn = Math.pow(2, context_numBits), context_numBits++),
context_dictionary[context_wc] = context_dictSize++, context_w = String(context_c);
}
if ("" !== context_w) {
if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate, context_w)) {
if (context_w.charCodeAt(0) < 256) {
for (i = 0; i < context_numBits; i++) context_data_val <<= 1, context_data_position == bitsPerChar - 1 ? (context_data_position = 0,
context_data.push(getCharFromInt(context_data_val)), context_data_val = 0) : context_data_position++;
for (value = context_w.charCodeAt(0), i = 0; i < 8; i++) context_data_val = context_data_val << 1 | 1 & value,
context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)),
context_data_val = 0) : context_data_position++, value >>= 1;
} else {
for (value = 1, i = 0; i < context_numBits; i++) context_data_val = context_data_val << 1 | value,
context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)),
context_data_val = 0) : context_data_position++, value = 0;
for (value = context_w.charCodeAt(0), i = 0; i < 16; i++) context_data_val = context_data_val << 1 | 1 & value,
context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)),
context_data_val = 0) : context_data_position++, value >>= 1;
}
0 == --context_enlargeIn && (context_enlargeIn = Math.pow(2, context_numBits), context_numBits++),
delete context_dictionaryToCreate[context_w];
} else for (value = context_dictionary[context_w], i = 0; i < context_numBits; i++) context_data_val = context_data_val << 1 | 1 & value,
context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)),
context_data_val = 0) : context_data_position++, value >>= 1;
0 == --context_enlargeIn && (context_enlargeIn = Math.pow(2, context_numBits), context_numBits++);
}
for (value = 2, i = 0; i < context_numBits; i++) context_data_val = context_data_val << 1 | 1 & value,
context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)),
context_data_val = 0) : context_data_position++, value >>= 1;
for (;;) {
if (context_data_val <<= 1, context_data_position == bitsPerChar - 1) {
context_data.push(getCharFromInt(context_data_val));
break;
}
context_data_position++;
}
return context_data.join("");
},
decompress: function(compressed) {
return null == compressed ? "" : "" == compressed ? null : LZString._decompress(compressed.length, 32768, (function(index) {
return compressed.charCodeAt(index);
}));
},
_decompress: function(length, resetValue, getNextValue) {
var i, w, bits, resb, maxpower, power, c, dictionary = [], enlargeIn = 4, dictSize = 4, numBits = 3, entry = "", result = [], data = {
val: getNextValue(0),
position: resetValue,
index: 1
};
for (i = 0; i < 3; i += 1) dictionary[i] = i;
for (bits = 0, maxpower = Math.pow(2, 2), power = 1; power != maxpower; ) resb = data.val & data.position,
data.position >>= 1, 0 == data.position && (data.position = resetValue, data.val = getNextValue(data.index++)),
bits |= (resb > 0 ? 1 : 0) * power, power <<= 1;
switch (bits) {
case 0:
for (bits = 0, maxpower = Math.pow(2, 8), power = 1; power != maxpower; ) resb = data.val & data.position,
data.position >>= 1, 0 == data.position && (data.position = resetValue, data.val = getNextValue(data.index++)),
bits |= (resb > 0 ? 1 : 0) * power, power <<= 1;
c = f(bits);
break;
case 1:
for (bits = 0, maxpower = Math.pow(2, 16), power = 1; power != maxpower; ) resb = data.val & data.position,
data.position >>= 1, 0 == data.position && (data.position = resetValue, data.val = getNextValue(data.index++)),
bits |= (resb > 0 ? 1 : 0) * power, power <<= 1;
c = f(bits);
break;
case 2:
return "";
}
for (dictionary[3] = c, w = c, result.push(c); ;) {
if (data.index > length) return "";
for (bits = 0, maxpower = Math.pow(2, numBits), power = 1; power != maxpower; ) resb = data.val & data.position,
data.position >>= 1, 0 == data.position && (data.position = resetValue, data.val = getNextValue(data.index++)),
bits |= (resb > 0 ? 1 : 0) * power, power <<= 1;
switch (c = bits) {
case 0:
for (bits = 0, maxpower = Math.pow(2, 8), power = 1; power != maxpower; ) resb = data.val & data.position,
data.position >>= 1, 0 == data.position && (data.position = resetValue, data.val = getNextValue(data.index++)),
bits |= (resb > 0 ? 1 : 0) * power, power <<= 1;
dictionary[dictSize++] = f(bits), c = dictSize - 1, enlargeIn--;
break;
case 1:
for (bits = 0, maxpower = Math.pow(2, 16), power = 1; power != maxpower; ) resb = data.val & data.position,
data.position >>= 1, 0 == data.position && (data.position = resetValue, data.val = getNextValue(data.index++)),
bits |= (resb > 0 ? 1 : 0) * power, power <<= 1;
dictionary[dictSize++] = f(bits), c = dictSize - 1, enlargeIn--;
break;
case 2:
return result.join("");
}
if (0 == enlargeIn && (enlargeIn = Math.pow(2, numBits), numBits++), dictionary[c]) entry = dictionary[c]; else {
if (c !== dictSize) return null;
entry = w + w.charAt(0);
}
result.push(entry), dictionary[dictSize++] = w + entry.charAt(0), w = entry, 0 == --enlargeIn && (enlargeIn = Math.pow(2, numBits),
numBits++);
}
}
};
return LZString;
}();
void 0 === (__WEBPACK_AMD_DEFINE_RESULT__ = function() {
return LZString;
}.call(exports, __webpack_require__, exports, module)) || (module.exports = __WEBPACK_AMD_DEFINE_RESULT__);
}, function(module, exports, __webpack_require__) {
"use strict";
var KEBAB_REGEX = /[A-Z]/g;
exports.create = function(config) {
var assign = (config = config || {}).assign || Object.assign;
var renderer = assign({
raw: "",
pfx: "_",
client: "object" == typeof window,
assign: assign,
stringify: JSON.stringify,
kebab: function(prop) {
return prop.replace(KEBAB_REGEX, "-$&").toLowerCase();
},
decl: function(key, value) {
return (key = renderer.kebab(key)) + ":" + value + ";";
},
hash: function(obj) {
return function(str) {
for (var hash = 5381, i = str.length; i; ) hash = 33 * hash ^ str.charCodeAt(--i);
return "_" + (hash >>> 0).toString(36);
}(renderer.stringify(obj));
},
selector: function(parent, selector) {
return parent + (":" === selector[0] ? "" : " ") + selector;
},
putRaw: function(rawCssRule) {
renderer.raw += rawCssRule;
}
}, config);
return renderer.client && (renderer.sh || document.head.appendChild(renderer.sh = document.createElement("style")),
renderer.putRaw = function(rawCssRule) {
var sheet = renderer.sh.sheet;
try {
sheet.insertRule(rawCssRule, sheet.cssRules.length);
} catch (error) {}
}), renderer.put = function(selector, decls, atrule) {
var prop, value, str = "", postponed = [];
for (prop in decls) (value = decls[prop]) instanceof Object && !(value instanceof Array) ? postponed.push(prop) : str += renderer.decl(prop, value, selector, atrule);
str && (str = selector + "{" + str + "}", renderer.putRaw(atrule ? atrule + "{" + str + "}" : str));
for (var i = 0; i < postponed.length; i++) "@" === (prop = postponed[i])[0] && "@font-face" !== prop ? renderer.putAt(selector, decls[prop], prop) : renderer.put(renderer.selector(selector, prop), decls[prop], atrule);
}, renderer.putAt = renderer.put, renderer;
};
}, function(module, exports, __webpack_require__) {
var api = __webpack_require__(3), content = __webpack_require__(12);
"string" == typeof (content = content.__esModule ? content.default : content) && (content = [ [ module.i, content, "" ] ]);
var options = {
insert: "head",
singleton: !1
};
api(content, options);
module.exports = content.locals || {};
}, function(module, exports, __webpack_require__) {
"use strict";
module.exports = function(string, quoteStyle) {
var getHtmlTranslationTable = __webpack_require__(10), tmpStr = "", entity = "", symbol = "";
tmpStr = string.toString();
var hashMap = getHtmlTranslationTable("HTML_ENTITIES", quoteStyle);
if (!1 === hashMap) return !1;
for (symbol in delete hashMap["&"], hashMap["&"] = "&", hashMap) entity = hashMap[symbol],
tmpStr = tmpStr.split(entity).join(symbol);
return tmpStr = tmpStr.split("'").join("'");
};
}, function(module, exports, __webpack_require__) {
module.exports = function() {
return __webpack_require__(11)('!function(modules) {\n var installedModules = {};\n function __webpack_require__(moduleId) {\n if (installedModules[moduleId]) return installedModules[moduleId].exports;\n var module = installedModules[moduleId] = {\n i: moduleId,\n l: !1,\n exports: {}\n };\n return modules[moduleId].call(module.exports, module, module.exports, __webpack_require__), \n module.l = !0, module.exports;\n }\n __webpack_require__.m = modules, __webpack_require__.c = installedModules, __webpack_require__.d = function(exports, name, getter) {\n __webpack_require__.o(exports, name) || Object.defineProperty(exports, name, {\n enumerable: !0,\n get: getter\n });\n }, __webpack_require__.r = function(exports) {\n "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(exports, Symbol.toStringTag, {\n value: "Module"\n }), Object.defineProperty(exports, "__esModule", {\n value: !0\n });\n }, __webpack_require__.t = function(value, mode) {\n if (1 & mode && (value = __webpack_require__(value)), 8 & mode) return value;\n if (4 & mode && "object" == typeof value && value && value.__esModule) return value;\n var ns = Object.create(null);\n if (__webpack_require__.r(ns), Object.defineProperty(ns, "default", {\n enumerable: !0,\n value: value\n }), 2 & mode && "string" != typeof value) for (var key in value) __webpack_require__.d(ns, key, function(key) {\n return value[key];\n }.bind(null, key));\n return ns;\n }, __webpack_require__.n = function(module) {\n var getter = module && module.__esModule ? function() {\n return module.default;\n } : function() {\n return module;\n };\n return __webpack_require__.d(getter, "a", getter), getter;\n }, __webpack_require__.o = function(object, property) {\n return Object.prototype.hasOwnProperty.call(object, property);\n }, __webpack_require__.p = "", __webpack_require__(__webpack_require__.s = 29);\n}([ function(module, __webpack_exports__, __webpack_require__) {\n "use strict";\n const context = "undefined" == typeof window ? self : window;\n context.convenientDiscussions = context.convenientDiscussions || {}, "object" != typeof context.convenientDiscussions && (context.convenientDiscussions = {}), \n __webpack_exports__.a = context.convenientDiscussions;\n}, function(module, __webpack_exports__, __webpack_require__) {\n "use strict";\n __webpack_require__.d(__webpack_exports__, "e", (function() {\n return isInline;\n })), __webpack_require__.d(__webpack_exports__, "a", (function() {\n return defined;\n })), __webpack_require__.d(__webpack_exports__, "c", (function() {\n return flat;\n })), __webpack_require__.d(__webpack_exports__, "g", (function() {\n return underlinesToSpaces;\n })), __webpack_require__.d(__webpack_exports__, "f", (function() {\n return spacesToUnderlines;\n })), __webpack_require__.d(__webpack_exports__, "b", (function() {\n return firstCharToUpperCase;\n })), __webpack_require__.d(__webpack_exports__, "d", (function() {\n return getMessages;\n }));\n __webpack_require__(3);\n var _cd__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(0);\n function isInline(node, countTextNodesAsInline) {\n return !(!countTextNodesAsInline || node.nodeType !== Node.TEXT_NODE) || (node.nodeType !== Node.ELEMENT_NODE ? null : !!_cd__WEBPACK_IMPORTED_MODULE_1__.a.g.POPULAR_INLINE_ELEMENTS.includes(node.tagName) || !_cd__WEBPACK_IMPORTED_MODULE_1__.a.g.POPULAR_NOT_INLINE_ELEMENTS.includes(node.tagName) && ("undefined" != typeof window ? (console.warn("Expensive operation: isInline() called for the element:", node), \n "inline" === window.getComputedStyle(node).display) : null));\n }\n function defined(el) {\n return void 0 !== el;\n }\n function flat(arr) {\n return [].concat(...arr);\n }\n function underlinesToSpaces(s) {\n return s.replace(/_/g, " ");\n }\n function spacesToUnderlines(s) {\n return s.replace(/ /g, "_");\n }\n function firstCharToUpperCase(s) {\n return s.length ? s[0].toUpperCase() + s.slice(1) : "";\n }\n function getMessages(messages) {\n return messages.map(mw.msg);\n }\n}, function(module, exports) {\n module.exports = function(receiver, privateMap) {\n var descriptor = privateMap.get(receiver);\n if (!descriptor) throw new TypeError("attempted to get private field on non-instance");\n return descriptor.get ? descriptor.get.call(receiver) : descriptor.value;\n };\n}, function(module, __webpack_exports__, __webpack_require__) {\n "use strict";\n __webpack_require__.d(__webpack_exports__, "a", (function() {\n return CdError;\n }));\n class CdError extends Error {\n constructor(data) {\n let message;\n data ? (message = data.type, data.code && (message += "/".concat(data.code)), data.apiData && data.apiData.error && data.apiData.error.code && (message += "/".concat(data.apiData.error.code))) : message = "", \n super(message), this.name = "CdError", this.data = data;\n }\n }\n}, function(module, __webpack_exports__, __webpack_require__) {\n "use strict";\n __webpack_require__.d(__webpack_exports__, "b", (function() {\n return parseTimestamp;\n })), __webpack_require__.d(__webpack_exports__, "a", (function() {\n return generateCommentAnchor;\n })), __webpack_require__.d(__webpack_exports__, "c", (function() {\n return registerCommentAnchor;\n })), __webpack_require__.d(__webpack_exports__, "d", (function() {\n return resetCommentAnchors;\n }));\n var _cd__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0), _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1);\n let parseTimestampRegexp, parseTimestampRegexpNoTimezone;\n function parseTimestamp(timestamp, timezoneOffset) {\n parseTimestampRegexp || (parseTimestampRegexp = new RegExp("^([^]*)(".concat(_cd__WEBPACK_IMPORTED_MODULE_0__.a.g.TIMESTAMP_REGEXP.source, ")"))), \n parseTimestampRegexpNoTimezone || (parseTimestampRegexpNoTimezone = new RegExp("^([^]*)(".concat(_cd__WEBPACK_IMPORTED_MODULE_0__.a.g.TIMESTAMP_REGEXP_NO_TIMEZONE.source, ")")));\n const regexp = void 0 === timezoneOffset ? parseTimestampRegexp : parseTimestampRegexpNoTimezone, match = timestamp.match(regexp);\n if (!match) return null;\n let date = _cd__WEBPACK_IMPORTED_MODULE_0__.a.g.TIMESTAMP_PARSER(match, _cd__WEBPACK_IMPORTED_MODULE_0__.a.g.TIMESTAMP_MATCHING_GROUPS, _cd__WEBPACK_IMPORTED_MODULE_0__.a.g.DIGITS, _cd__WEBPACK_IMPORTED_MODULE_0__.a.g.LOCAL_TIMEZONE_OFFSET);\n return timezoneOffset && (date = new Date(date.getTime() - timezoneOffset * _cd__WEBPACK_IMPORTED_MODULE_0__.a.g.MILLISECONDS_IN_A_MINUTE)), \n {\n date: date,\n match: match\n };\n }\n function zeroPad(number, length) {\n return ("0000" + number).slice(-length);\n }\n function generateCommentAnchor(date, author, resolveCollisions = !1) {\n let year = date.getUTCFullYear(), month = date.getUTCMonth(), day = date.getUTCDate(), hours = date.getUTCHours(), minutes = date.getUTCMinutes(), anchor = zeroPad(year, 4) + zeroPad(month + 1, 2) + zeroPad(day, 2) + zeroPad(hours, 2) + zeroPad(minutes, 2) + (author ? "_" + Object(_util__WEBPACK_IMPORTED_MODULE_1__.f)(author) : "");\n if (resolveCollisions && commentAnchors.includes(anchor)) {\n let anchorNum = 2;\n const base = anchor;\n do {\n anchor = "".concat(base, "_").concat(anchorNum), anchorNum++;\n } while (commentAnchors.includes(anchor));\n }\n return anchor;\n }\n let commentAnchors = [];\n function registerCommentAnchor(anchor) {\n anchor && commentAnchors.push(anchor);\n }\n function resetCommentAnchors() {\n commentAnchors = [];\n }\n}, function(module, exports, __webpack_require__) {\n "use strict";\n function __export(m) {\n for (var p in m) exports.hasOwnProperty(p) || (exports[p] = m[p]);\n }\n var __importStar = this && this.__importStar || function(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (null != mod) for (var k in mod) Object.hasOwnProperty.call(mod, k) && (result[k] = mod[k]);\n return result.default = mod, result;\n };\n Object.defineProperty(exports, "__esModule", {\n value: !0\n });\n var Parser_1 = __webpack_require__(12);\n exports.Parser = Parser_1.Parser;\n var domhandler_1 = __webpack_require__(16);\n exports.DomHandler = domhandler_1.DomHandler, exports.DefaultHandler = domhandler_1.DomHandler, \n exports.parseDOM = function(data, options) {\n var handler = new domhandler_1.DomHandler(void 0, options);\n return new Parser_1.Parser(handler, options).end(data), handler.dom;\n }, exports.createDomStream = function(cb, options, elementCb) {\n var handler = new domhandler_1.DomHandler(cb, options, elementCb);\n return new Parser_1.Parser(handler, options);\n };\n var Tokenizer_1 = __webpack_require__(13);\n exports.Tokenizer = Tokenizer_1.default;\n var ElementType = __importStar(__webpack_require__(11));\n exports.ElementType = ElementType, exports.EVENTS = {\n attribute: 2,\n cdatastart: 0,\n cdataend: 0,\n text: 1,\n processinginstruction: 2,\n comment: 1,\n commentend: 0,\n closetag: 1,\n opentag: 2,\n opentagname: 1,\n error: 1,\n end: 0\n }, __export(__webpack_require__(17)), __export(__webpack_require__(41)), __export(__webpack_require__(42));\n var DomUtils = __importStar(__webpack_require__(18));\n exports.DomUtils = DomUtils;\n var FeedHandler_1 = __webpack_require__(17);\n exports.RssHandler = FeedHandler_1.FeedHandler;\n}, function(module, __webpack_exports__, __webpack_require__) {\n "use strict";\n __webpack_require__.d(__webpack_exports__, "c", (function() {\n return TreeWalker;\n })), __webpack_require__.d(__webpack_exports__, "b", (function() {\n return ElementsTreeWalker;\n })), __webpack_require__.d(__webpack_exports__, "a", (function() {\n return ElementsAndTextTreeWalker;\n }));\n var _cd__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);\n class TreeWalker {\n constructor(root, acceptNode, onlyElementNodes = !1, startNode = root) {\n this.acceptNode = acceptNode, this.root = root, this.currentNode = startNode, onlyElementNodes ? (this.firstChildProperty = "firstElementChild", \n this.lastChildProperty = "lastElementChild", this.previousSiblingProperty = "previousElementSibling", \n this.nextSiblingProperty = "nextElementSibling") : (this.firstChildProperty = "firstChild", \n this.lastChildProperty = "lastChild", this.previousSiblingProperty = "previousSibling", \n this.nextSiblingProperty = "nextSibling");\n }\n tryMove(property) {\n let node = this.currentNode;\n if (node === this.root && !property.includes("Child")) return null;\n do {\n node = node[property];\n } while (node && this.acceptNode && !this.acceptNode(node));\n return node && (this.currentNode = node), node || null;\n }\n parentNode() {\n return this.tryMove("parentNode");\n }\n firstChild() {\n return this.tryMove(this.firstChildProperty);\n }\n lastChild() {\n return this.tryMove(this.lastChildProperty);\n }\n previousSibling() {\n return this.tryMove(this.previousSiblingProperty);\n }\n nextSibling() {\n return this.tryMove(this.nextSiblingProperty);\n }\n nextNode() {\n let node = this.currentNode;\n do {\n if (node[this.firstChildProperty]) node = node[this.firstChildProperty]; else {\n for (;node && !node[this.nextSiblingProperty] && node.parentNode !== this.root; ) node = node.parentNode;\n node && (node = node[this.nextSiblingProperty]);\n }\n } while (node && this.acceptNode && !this.acceptNode(node));\n return node && (this.currentNode = node), node;\n }\n previousNode() {\n let node = this.currentNode;\n if (node !== this.root) {\n do {\n if (node[this.previousSiblingProperty]) for (node = node[this.previousSiblingProperty]; node[this.lastChildProperty]; ) node = node[this.lastChildProperty]; else node = node.parentNode;\n } while (node && this.acceptNode && !this.acceptNode(node));\n return node && (this.currentNode = node), node;\n }\n }\n }\n class ElementsTreeWalker extends TreeWalker {\n constructor(startNode) {\n super(_cd__WEBPACK_IMPORTED_MODULE_0__.a.g.rootElement, node => ![ "STYLE", "LINK" ].includes(node.tagName), !0), \n startNode && (this.currentNode = startNode);\n }\n }\n class ElementsAndTextTreeWalker extends TreeWalker {\n constructor(startNode) {\n super(_cd__WEBPACK_IMPORTED_MODULE_0__.a.g.rootElement, node => node.nodeType === Node.TEXT_NODE || node.nodeType === Node.ELEMENT_NODE && ![ "STYLE", "LINK" ].includes(node.tagName)), \n startNode && (this.currentNode = startNode);\n }\n }\n}, function(module, exports) {\n module.exports = function(receiver, privateMap, value) {\n var descriptor = privateMap.get(receiver);\n if (!descriptor) throw new TypeError("attempted to set private field on non-instance");\n if (descriptor.set) descriptor.set.call(receiver, value); else {\n if (!descriptor.writable) throw new TypeError("attempted to set read only private field");\n descriptor.value = value;\n }\n return value;\n };\n}, function(module, exports, __webpack_require__) {\n "use strict";\n Object.defineProperty(exports, "__esModule", {\n value: !0\n });\n var domelementtype_1 = __webpack_require__(11);\n exports.isTag = function(node) {\n return domelementtype_1.isTag(node);\n }, exports.isCDATA = function(node) {\n return "cdata" === node.type;\n }, exports.isText = function(node) {\n return "text" === node.type;\n }, exports.isComment = function(node) {\n return "comment" === node.type;\n }, exports.hasChildren = function(node) {\n return Object.prototype.hasOwnProperty.call(node, "children");\n };\n}, function(module) {\n module.exports = JSON.parse(\'{"Aacute":"\\xc1","aacute":"\\xe1","Abreve":"\\u0102","abreve":"\\u0103","ac":"\\u223e","acd":"\\u223f","acE":"\\u223e\\u0333","Acirc":"\\xc2","acirc":"\\xe2","acute":"\\xb4","Acy":"\\u0410","acy":"\\u0430","AElig":"\\xc6","aelig":"\\xe6","af":"\\u2061","Afr":"\\ud835\\udd04","afr":"\\ud835\\udd1e","Agrave":"\\xc0","agrave":"\\xe0","alefsym":"\\u2135","aleph":"\\u2135","Alpha":"\\u0391","alpha":"\\u03b1","Amacr":"\\u0100","amacr":"\\u0101","amalg":"\\u2a3f","amp":"&","AMP":"&","andand":"\\u2a55","And":"\\u2a53","and":"\\u2227","andd":"\\u2a5c","andslope":"\\u2a58","andv":"\\u2a5a","ang":"\\u2220","ange":"\\u29a4","angle":"\\u2220","angmsdaa":"\\u29a8","angmsdab":"\\u29a9","angmsdac":"\\u29aa","angmsdad":"\\u29ab","angmsdae":"\\u29ac","angmsdaf":"\\u29ad","angmsdag":"\\u29ae","angmsdah":"\\u29af","angmsd":"\\u2221","angrt":"\\u221f","angrtvb":"\\u22be","angrtvbd":"\\u299d","angsph":"\\u2222","angst":"\\xc5","angzarr":"\\u237c","Aogon":"\\u0104","aogon":"\\u0105","Aopf":"\\ud835\\udd38","aopf":"\\ud835\\udd52","apacir":"\\u2a6f","ap":"\\u2248","apE":"\\u2a70","ape":"\\u224a","apid":"\\u224b","apos":"\\\'","ApplyFunction":"\\u2061","approx":"\\u2248","approxeq":"\\u224a","Aring":"\\xc5","aring":"\\xe5","Ascr":"\\ud835\\udc9c","ascr":"\\ud835\\udcb6","Assign":"\\u2254","ast":"*","asymp":"\\u2248","asympeq":"\\u224d","Atilde":"\\xc3","atilde":"\\xe3","Auml":"\\xc4","auml":"\\xe4","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":"\\u0411","bcy":"\\u0431","bdquo":"\\u201e","becaus":"\\u2235","because":"\\u2235","Because":"\\u2235","bemptyv":"\\u29b0","bepsi":"\\u03f6","bernou":"\\u212c","Bernoullis":"\\u212c","Beta":"\\u0392","beta":"\\u03b2","beth":"\\u2136","between":"\\u226c","Bfr":"\\ud835\\udd05","bfr":"\\ud835\\udd1f","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":"\\u2aed","bnot":"\\u2310","Bopf":"\\ud835\\udd39","bopf":"\\ud835\\udd53","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":"\\u2564","boxhD":"\\u2565","boxHD":"\\u2566","boxhu":"\\u2534","boxHu":"\\u2567","boxhU":"\\u2568","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","bsolb":"\\u29c5","bsol":"\\\\\\\\","bsolhsub":"\\u27c8","bull":"\\u2022","bullet":"\\u2022","bump":"\\u224e","bumpE":"\\u2aae","bumpe":"\\u224f","Bumpeq":"\\u224e","bumpeq":"\\u224f","Cacute":"\\u0106","cacute":"\\u0107","capand":"\\u2a44","capbrcup":"\\u2a49","capcap":"\\u2a4b","cap":"\\u2229","Cap":"\\u22d2","capcup":"\\u2a47","capdot":"\\u2a40","CapitalDifferentialD":"\\u2145","caps":"\\u2229\\ufe00","caret":"\\u2041","caron":"\\u02c7","Cayleys":"\\u212d","ccaps":"\\u2a4d","Ccaron":"\\u010c","ccaron":"\\u010d","Ccedil":"\\xc7","ccedil":"\\xe7","Ccirc":"\\u0108","ccirc":"\\u0109","Cconint":"\\u2230","ccups":"\\u2a4c","ccupssm":"\\u2a50","Cdot":"\\u010a","cdot":"\\u010b","cedil":"\\xb8","Cedilla":"\\xb8","cemptyv":"\\u29b2","cent":"\\xa2","centerdot":"\\xb7","CenterDot":"\\xb7","cfr":"\\ud835\\udd20","Cfr":"\\u212d","CHcy":"\\u0427","chcy":"\\u0447","check":"\\u2713","checkmark":"\\u2713","Chi":"\\u03a7","chi":"\\u03c7","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","cir":"\\u25cb","cirE":"\\u29c3","cire":"\\u2257","cirfnint":"\\u2a10","cirmid":"\\u2aef","cirscir":"\\u29c2","ClockwiseContourIntegral":"\\u2232","CloseCurlyDoubleQuote":"\\u201d","CloseCurlyQuote":"\\u2019","clubs":"\\u2663","clubsuit":"\\u2663","colon":":","Colon":"\\u2237","Colone":"\\u2a74","colone":"\\u2254","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\\udc9e","cscr":"\\ud835\\udcb8","csub":"\\u2acf","csube":"\\u2ad1","csup":"\\u2ad0","csupe":"\\u2ad2","ctdot":"\\u22ef","cudarrl":"\\u2938","cudarrr":"\\u2935","cuepr":"\\u22de","cuesc":"\\u22df","cularr":"\\u21b6","cularrp":"\\u293d","cupbrcap":"\\u2a48","cupcap":"\\u2a46","CupCap":"\\u224d","cup":"\\u222a","Cup":"\\u22d3","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":"\\u21a1","dArr":"\\u21d3","dash":"\\u2010","Dashv":"\\u2ae4","dashv":"\\u22a3","dbkarow":"\\u290f","dblac":"\\u02dd","Dcaron":"\\u010e","dcaron":"\\u010f","Dcy":"\\u0414","dcy":"\\u0434","ddagger":"\\u2021","ddarr":"\\u21ca","DD":"\\u2145","dd":"\\u2146","DDotrahd":"\\u2911","ddotseq":"\\u2a77","deg":"\\xb0","Del":"\\u2207","Delta":"\\u0394","delta":"\\u03b4","demptyv":"\\u29b1","dfisht":"\\u297f","Dfr":"\\ud835\\udd07","dfr":"\\ud835\\udd21","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":"\\u0402","djcy":"\\u0452","dlcorn":"\\u231e","dlcrop":"\\u230d","dollar":"$","Dopf":"\\ud835\\udd3b","dopf":"\\ud835\\udd55","Dot":"\\xa8","dot":"\\u02d9","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","DownArrowBar":"\\u2913","downarrow":"\\u2193","DownArrow":"\\u2193","Downarrow":"\\u21d3","DownArrowUpArrow":"\\u21f5","DownBreve":"\\u0311","downdownarrows":"\\u21ca","downharpoonleft":"\\u21c3","downharpoonright":"\\u21c2","DownLeftRightVector":"\\u2950","DownLeftTeeVector":"\\u295e","DownLeftVectorBar":"\\u2956","DownLeftVector":"\\u21bd","DownRightTeeVector":"\\u295f","DownRightVectorBar":"\\u2957","DownRightVector":"\\u21c1","DownTeeArrow":"\\u21a7","DownTee":"\\u22a4","drbkarow":"\\u2910","drcorn":"\\u231f","drcrop":"\\u230c","Dscr":"\\ud835\\udc9f","dscr":"\\ud835\\udcb9","DScy":"\\u0405","dscy":"\\u0455","dsol":"\\u29f6","Dstrok":"\\u0110","dstrok":"\\u0111","dtdot":"\\u22f1","dtri":"\\u25bf","dtrif":"\\u25be","duarr":"\\u21f5","duhar":"\\u296f","dwangle":"\\u29a6","DZcy":"\\u040f","dzcy":"\\u045f","dzigrarr":"\\u27ff","Eacute":"\\xc9","eacute":"\\xe9","easter":"\\u2a6e","Ecaron":"\\u011a","ecaron":"\\u011b","Ecirc":"\\xca","ecirc":"\\xea","ecir":"\\u2256","ecolon":"\\u2255","Ecy":"\\u042d","ecy":"\\u044d","eDDot":"\\u2a77","Edot":"\\u0116","edot":"\\u0117","eDot":"\\u2251","ee":"\\u2147","efDot":"\\u2252","Efr":"\\ud835\\udd08","efr":"\\ud835\\udd22","eg":"\\u2a9a","Egrave":"\\xc8","egrave":"\\xe8","egs":"\\u2a96","egsdot":"\\u2a98","el":"\\u2a99","Element":"\\u2208","elinters":"\\u23e7","ell":"\\u2113","els":"\\u2a95","elsdot":"\\u2a97","Emacr":"\\u0112","emacr":"\\u0113","empty":"\\u2205","emptyset":"\\u2205","EmptySmallSquare":"\\u25fb","emptyv":"\\u2205","EmptyVerySmallSquare":"\\u25ab","emsp13":"\\u2004","emsp14":"\\u2005","emsp":"\\u2003","ENG":"\\u014a","eng":"\\u014b","ensp":"\\u2002","Eogon":"\\u0118","eogon":"\\u0119","Eopf":"\\ud835\\udd3c","eopf":"\\ud835\\udd56","epar":"\\u22d5","eparsl":"\\u29e3","eplus":"\\u2a71","epsi":"\\u03b5","Epsilon":"\\u0395","epsilon":"\\u03b5","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":"\\u2a73","esim":"\\u2242","Eta":"\\u0397","eta":"\\u03b7","ETH":"\\xd0","eth":"\\xf0","Euml":"\\xcb","euml":"\\xeb","euro":"\\u20ac","excl":"!","exist":"\\u2203","Exists":"\\u2203","expectation":"\\u2130","exponentiale":"\\u2147","ExponentialE":"\\u2147","fallingdotseq":"\\u2252","Fcy":"\\u0424","fcy":"\\u0444","female":"\\u2640","ffilig":"\\ufb03","fflig":"\\ufb00","ffllig":"\\ufb04","Ffr":"\\ud835\\udd09","ffr":"\\ud835\\udd23","filig":"\\ufb01","FilledSmallSquare":"\\u25fc","FilledVerySmallSquare":"\\u25aa","fjlig":"fj","flat":"\\u266d","fllig":"\\ufb02","fltns":"\\u25b1","fnof":"\\u0192","Fopf":"\\ud835\\udd3d","fopf":"\\ud835\\udd57","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":"\\u0393","gamma":"\\u03b3","Gammad":"\\u03dc","gammad":"\\u03dd","gap":"\\u2a86","Gbreve":"\\u011e","gbreve":"\\u011f","Gcedil":"\\u0122","Gcirc":"\\u011c","gcirc":"\\u011d","Gcy":"\\u0413","gcy":"\\u0433","Gdot":"\\u0120","gdot":"\\u0121","ge":"\\u2265","gE":"\\u2267","gEl":"\\u2a8c","gel":"\\u22db","geq":"\\u2265","geqq":"\\u2267","geqslant":"\\u2a7e","gescc":"\\u2aa9","ges":"\\u2a7e","gesdot":"\\u2a80","gesdoto":"\\u2a82","gesdotol":"\\u2a84","gesl":"\\u22db\\ufe00","gesles":"\\u2a94","Gfr":"\\ud835\\udd0a","gfr":"\\ud835\\udd24","gg":"\\u226b","Gg":"\\u22d9","ggg":"\\u22d9","gimel":"\\u2137","GJcy":"\\u0403","gjcy":"\\u0453","gla":"\\u2aa5","gl":"\\u2277","glE":"\\u2a92","glj":"\\u2aa4","gnap":"\\u2a8a","gnapprox":"\\u2a8a","gne":"\\u2a88","gnE":"\\u2269","gneq":"\\u2a88","gneqq":"\\u2269","gnsim":"\\u22e7","Gopf":"\\ud835\\udd3e","gopf":"\\ud835\\udd58","grave":"`","GreaterEqual":"\\u2265","GreaterEqualLess":"\\u22db","GreaterFullEqual":"\\u2267","GreaterGreater":"\\u2aa2","GreaterLess":"\\u2277","GreaterSlantEqual":"\\u2a7e","GreaterTilde":"\\u2273","Gscr":"\\ud835\\udca2","gscr":"\\u210a","gsim":"\\u2273","gsime":"\\u2a8e","gsiml":"\\u2a90","gtcc":"\\u2aa7","gtcir":"\\u2a7a","gt":">","GT":">","Gt":"\\u226b","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":"\\u042a","hardcy":"\\u044a","harrcir":"\\u2948","harr":"\\u2194","hArr":"\\u21d4","harrw":"\\u21ad","Hat":"^","hbar":"\\u210f","Hcirc":"\\u0124","hcirc":"\\u0125","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":"\\u0126","hstrok":"\\u0127","HumpDownHump":"\\u224e","HumpEqual":"\\u224f","hybull":"\\u2043","hyphen":"\\u2010","Iacute":"\\xcd","iacute":"\\xed","ic":"\\u2063","Icirc":"\\xce","icirc":"\\xee","Icy":"\\u0418","icy":"\\u0438","Idot":"\\u0130","IEcy":"\\u0415","iecy":"\\u0435","iexcl":"\\xa1","iff":"\\u21d4","ifr":"\\ud835\\udd26","Ifr":"\\u2111","Igrave":"\\xcc","igrave":"\\xec","ii":"\\u2148","iiiint":"\\u2a0c","iiint":"\\u222d","iinfin":"\\u29dc","iiota":"\\u2129","IJlig":"\\u0132","ijlig":"\\u0133","Imacr":"\\u012a","imacr":"\\u012b","image":"\\u2111","ImaginaryI":"\\u2148","imagline":"\\u2110","imagpart":"\\u2111","imath":"\\u0131","Im":"\\u2111","imof":"\\u22b7","imped":"\\u01b5","Implies":"\\u21d2","incare":"\\u2105","in":"\\u2208","infin":"\\u221e","infintie":"\\u29dd","inodot":"\\u0131","intcal":"\\u22ba","int":"\\u222b","Int":"\\u222c","integers":"\\u2124","Integral":"\\u222b","intercal":"\\u22ba","Intersection":"\\u22c2","intlarhk":"\\u2a17","intprod":"\\u2a3c","InvisibleComma":"\\u2063","InvisibleTimes":"\\u2062","IOcy":"\\u0401","iocy":"\\u0451","Iogon":"\\u012e","iogon":"\\u012f","Iopf":"\\ud835\\udd40","iopf":"\\ud835\\udd5a","Iota":"\\u0399","iota":"\\u03b9","iprod":"\\u2a3c","iquest":"\\xbf","iscr":"\\ud835\\udcbe","Iscr":"\\u2110","isin":"\\u2208","isindot":"\\u22f5","isinE":"\\u22f9","isins":"\\u22f4","isinsv":"\\u22f3","isinv":"\\u2208","it":"\\u2062","Itilde":"\\u0128","itilde":"\\u0129","Iukcy":"\\u0406","iukcy":"\\u0456","Iuml":"\\xcf","iuml":"\\xef","Jcirc":"\\u0134","jcirc":"\\u0135","Jcy":"\\u0419","jcy":"\\u0439","Jfr":"\\ud835\\udd0d","jfr":"\\ud835\\udd27","jmath":"\\u0237","Jopf":"\\ud835\\udd41","jopf":"\\ud835\\udd5b","Jscr":"\\ud835\\udca5","jscr":"\\ud835\\udcbf","Jsercy":"\\u0408","jsercy":"\\u0458","Jukcy":"\\u0404","jukcy":"\\u0454","Kappa":"\\u039a","kappa":"\\u03ba","kappav":"\\u03f0","Kcedil":"\\u0136","kcedil":"\\u0137","Kcy":"\\u041a","kcy":"\\u043a","Kfr":"\\ud835\\udd0e","kfr":"\\ud835\\udd28","kgreen":"\\u0138","KHcy":"\\u0425","khcy":"\\u0445","KJcy":"\\u040c","kjcy":"\\u045c","Kopf":"\\ud835\\udd42","kopf":"\\ud835\\udd5c","Kscr":"\\ud835\\udca6","kscr":"\\ud835\\udcc0","lAarr":"\\u21da","Lacute":"\\u0139","lacute":"\\u013a","laemptyv":"\\u29b4","lagran":"\\u2112","Lambda":"\\u039b","lambda":"\\u03bb","lang":"\\u27e8","Lang":"\\u27ea","langd":"\\u2991","langle":"\\u27e8","lap":"\\u2a85","Laplacetrf":"\\u2112","laquo":"\\xab","larrb":"\\u21e4","larrbfs":"\\u291f","larr":"\\u2190","Larr":"\\u219e","lArr":"\\u21d0","larrfs":"\\u291d","larrhk":"\\u21a9","larrlp":"\\u21ab","larrpl":"\\u2939","larrsim":"\\u2973","larrtl":"\\u21a2","latail":"\\u2919","lAtail":"\\u291b","lat":"\\u2aab","late":"\\u2aad","lates":"\\u2aad\\ufe00","lbarr":"\\u290c","lBarr":"\\u290e","lbbrk":"\\u2772","lbrace":"{","lbrack":"[","lbrke":"\\u298b","lbrksld":"\\u298f","lbrkslu":"\\u298d","Lcaron":"\\u013d","lcaron":"\\u013e","Lcedil":"\\u013b","lcedil":"\\u013c","lceil":"\\u2308","lcub":"{","Lcy":"\\u041b","lcy":"\\u043b","ldca":"\\u2936","ldquo":"\\u201c","ldquor":"\\u201e","ldrdhar":"\\u2967","ldrushar":"\\u294b","ldsh":"\\u21b2","le":"\\u2264","lE":"\\u2266","LeftAngleBracket":"\\u27e8","LeftArrowBar":"\\u21e4","leftarrow":"\\u2190","LeftArrow":"\\u2190","Leftarrow":"\\u21d0","LeftArrowRightArrow":"\\u21c6","leftarrowtail":"\\u21a2","LeftCeiling":"\\u2308","LeftDoubleBracket":"\\u27e6","LeftDownTeeVector":"\\u2961","LeftDownVectorBar":"\\u2959","LeftDownVector":"\\u21c3","LeftFloor":"\\u230a","leftharpoondown":"\\u21bd","leftharpoonup":"\\u21bc","leftleftarrows":"\\u21c7","leftrightarrow":"\\u2194","LeftRightArrow":"\\u2194","Leftrightarrow":"\\u21d4","leftrightarrows":"\\u21c6","leftrightharpoons":"\\u21cb","leftrightsquigarrow":"\\u21ad","LeftRightVector":"\\u294e","LeftTeeArrow":"\\u21a4","LeftTee":"\\u22a3","LeftTeeVector":"\\u295a","leftthreetimes":"\\u22cb","LeftTriangleBar":"\\u29cf","LeftTriangle":"\\u22b2","LeftTriangleEqual":"\\u22b4","LeftUpDownVector":"\\u2951","LeftUpTeeVector":"\\u2960","LeftUpVectorBar":"\\u2958","LeftUpVector":"\\u21bf","LeftVectorBar":"\\u2952","LeftVector":"\\u21bc","lEg":"\\u2a8b","leg":"\\u22da","leq":"\\u2264","leqq":"\\u2266","leqslant":"\\u2a7d","lescc":"\\u2aa8","les":"\\u2a7d","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\\udd0f","lfr":"\\ud835\\udd29","lg":"\\u2276","lgE":"\\u2a91","lHar":"\\u2962","lhard":"\\u21bd","lharu":"\\u21bc","lharul":"\\u296a","lhblk":"\\u2584","LJcy":"\\u0409","ljcy":"\\u0459","llarr":"\\u21c7","ll":"\\u226a","Ll":"\\u22d8","llcorner":"\\u231e","Lleftarrow":"\\u21da","llhard":"\\u296b","lltri":"\\u25fa","Lmidot":"\\u013f","lmidot":"\\u0140","lmoustache":"\\u23b0","lmoust":"\\u23b0","lnap":"\\u2a89","lnapprox":"\\u2a89","lne":"\\u2a87","lnE":"\\u2268","lneq":"\\u2a87","lneqq":"\\u2268","lnsim":"\\u22e6","loang":"\\u27ec","loarr":"\\u21fd","lobrk":"\\u27e6","longleftarrow":"\\u27f5","LongLeftArrow":"\\u27f5","Longleftarrow":"\\u27f8","longleftrightarrow":"\\u27f7","LongLeftRightArrow":"\\u27f7","Longleftrightarrow":"\\u27fa","longmapsto":"\\u27fc","longrightarrow":"\\u27f6","LongRightArrow":"\\u27f6","Longrightarrow":"\\u27f9","looparrowleft":"\\u21ab","looparrowright":"\\u21ac","lopar":"\\u2985","Lopf":"\\ud835\\udd43","lopf":"\\ud835\\udd5d","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":"\\u0141","lstrok":"\\u0142","ltcc":"\\u2aa6","ltcir":"\\u2a79","lt":"<","LT":"<","Lt":"\\u226a","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":"\\u2905","map":"\\u21a6","mapsto":"\\u21a6","mapstodown":"\\u21a7","mapstoleft":"\\u21a4","mapstoup":"\\u21a5","marker":"\\u25ae","mcomma":"\\u2a29","Mcy":"\\u041c","mcy":"\\u043c","mdash":"\\u2014","mDDot":"\\u223a","measuredangle":"\\u2221","MediumSpace":"\\u205f","Mellintrf":"\\u2133","Mfr":"\\ud835\\udd10","mfr":"\\ud835\\udd2a","mho":"\\u2127","micro":"\\xb5","midast":"*","midcir":"\\u2af0","mid":"\\u2223","middot":"\\xb7","minusb":"\\u229f","minus":"\\u2212","minusd":"\\u2238","minusdu":"\\u2a2a","MinusPlus":"\\u2213","mlcp":"\\u2adb","mldr":"\\u2026","mnplus":"\\u2213","models":"\\u22a7","Mopf":"\\ud835\\udd44","mopf":"\\ud835\\udd5e","mp":"\\u2213","mscr":"\\ud835\\udcc2","Mscr":"\\u2133","mstpos":"\\u223e","Mu":"\\u039c","mu":"\\u03bc","multimap":"\\u22b8","mumap":"\\u22b8","nabla":"\\u2207","Nacute":"\\u0143","nacute":"\\u0144","nang":"\\u2220\\u20d2","nap":"\\u2249","napE":"\\u2a70\\u0338","napid":"\\u224b\\u0338","napos":"\\u0149","napprox":"\\u2249","natural":"\\u266e","naturals":"\\u2115","natur":"\\u266e","nbsp":"\\xa0","nbump":"\\u224e\\u0338","nbumpe":"\\u224f\\u0338","ncap":"\\u2a43","Ncaron":"\\u0147","ncaron":"\\u0148","Ncedil":"\\u0145","ncedil":"\\u0146","ncong":"\\u2247","ncongdot":"\\u2a6d\\u0338","ncup":"\\u2a42","Ncy":"\\u041d","ncy":"\\u043d","ndash":"\\u2013","nearhk":"\\u2924","nearr":"\\u2197","neArr":"\\u21d7","nearrow":"\\u2197","ne":"\\u2260","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\\udd11","nfr":"\\ud835\\udd2b","ngE":"\\u2267\\u0338","nge":"\\u2271","ngeq":"\\u2271","ngeqq":"\\u2267\\u0338","ngeqslant":"\\u2a7e\\u0338","nges":"\\u2a7e\\u0338","nGg":"\\u22d9\\u0338","ngsim":"\\u2275","nGt":"\\u226b\\u20d2","ngt":"\\u226f","ngtr":"\\u226f","nGtv":"\\u226b\\u0338","nharr":"\\u21ae","nhArr":"\\u21ce","nhpar":"\\u2af2","ni":"\\u220b","nis":"\\u22fc","nisd":"\\u22fa","niv":"\\u220b","NJcy":"\\u040a","njcy":"\\u045a","nlarr":"\\u219a","nlArr":"\\u21cd","nldr":"\\u2025","nlE":"\\u2266\\u0338","nle":"\\u2270","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":"\\u226a\\u20d2","nlt":"\\u226e","nltri":"\\u22ea","nltrie":"\\u22ec","nLtv":"\\u226a\\u0338","nmid":"\\u2224","NoBreak":"\\u2060","NonBreakingSpace":"\\xa0","nopf":"\\ud835\\udd5f","Nopf":"\\u2115","Not":"\\u2aec","not":"\\xac","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","NotLeftTriangleBar":"\\u29cf\\u0338","NotLeftTriangle":"\\u22ea","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","NotRightTriangleBar":"\\u29d0\\u0338","NotRightTriangle":"\\u22eb","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","nparallel":"\\u2226","npar":"\\u2226","nparsl":"\\u2afd\\u20e5","npart":"\\u2202\\u0338","npolint":"\\u2a14","npr":"\\u2280","nprcue":"\\u22e0","nprec":"\\u2280","npreceq":"\\u2aaf\\u0338","npre":"\\u2aaf\\u0338","nrarrc":"\\u2933\\u0338","nrarr":"\\u219b","nrArr":"\\u21cf","nrarrw":"\\u219d\\u0338","nrightarrow":"\\u219b","nRightarrow":"\\u21cf","nrtri":"\\u22eb","nrtrie":"\\u22ed","nsc":"\\u2281","nsccue":"\\u22e1","nsce":"\\u2ab0\\u0338","Nscr":"\\ud835\\udca9","nscr":"\\ud835\\udcc3","nshortmid":"\\u2224","nshortparallel":"\\u2226","nsim":"\\u2241","nsime":"\\u2244","nsimeq":"\\u2244","nsmid":"\\u2224","nspar":"\\u2226","nsqsube":"\\u22e2","nsqsupe":"\\u22e3","nsub":"\\u2284","nsubE":"\\u2ac5\\u0338","nsube":"\\u2288","nsubset":"\\u2282\\u20d2","nsubseteq":"\\u2288","nsubseteqq":"\\u2ac5\\u0338","nsucc":"\\u2281","nsucceq":"\\u2ab0\\u0338","nsup":"\\u2285","nsupE":"\\u2ac6\\u0338","nsupe":"\\u2289","nsupset":"\\u2283\\u20d2","nsupseteq":"\\u2289","nsupseteqq":"\\u2ac6\\u0338","ntgl":"\\u2279","Ntilde":"\\xd1","ntilde":"\\xf1","ntlg":"\\u2278","ntriangleleft":"\\u22ea","ntrianglelefteq":"\\u22ec","ntriangleright":"\\u22eb","ntrianglerighteq":"\\u22ed","Nu":"\\u039d","nu":"\\u03bd","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":"\\xd3","oacute":"\\xf3","oast":"\\u229b","Ocirc":"\\xd4","ocirc":"\\xf4","ocir":"\\u229a","Ocy":"\\u041e","ocy":"\\u043e","odash":"\\u229d","Odblac":"\\u0150","odblac":"\\u0151","odiv":"\\u2a38","odot":"\\u2299","odsold":"\\u29bc","OElig":"\\u0152","oelig":"\\u0153","ofcir":"\\u29bf","Ofr":"\\ud835\\udd12","ofr":"\\ud835\\udd2c","ogon":"\\u02db","Ograve":"\\xd2","ograve":"\\xf2","ogt":"\\u29c1","ohbar":"\\u29b5","ohm":"\\u03a9","oint":"\\u222e","olarr":"\\u21ba","olcir":"\\u29be","olcross":"\\u29bb","oline":"\\u203e","olt":"\\u29c0","Omacr":"\\u014c","omacr":"\\u014d","Omega":"\\u03a9","omega":"\\u03c9","Omicron":"\\u039f","omicron":"\\u03bf","omid":"\\u29b6","ominus":"\\u2296","Oopf":"\\ud835\\udd46","oopf":"\\ud835\\udd60","opar":"\\u29b7","OpenCurlyDoubleQuote":"\\u201c","OpenCurlyQuote":"\\u2018","operp":"\\u29b9","oplus":"\\u2295","orarr":"\\u21bb","Or":"\\u2a54","or":"\\u2228","ord":"\\u2a5d","order":"\\u2134","orderof":"\\u2134","ordf":"\\xaa","ordm":"\\xba","origof":"\\u22b6","oror":"\\u2a56","orslope":"\\u2a57","orv":"\\u2a5b","oS":"\\u24c8","Oscr":"\\ud835\\udcaa","oscr":"\\u2134","Oslash":"\\xd8","oslash":"\\xf8","osol":"\\u2298","Otilde":"\\xd5","otilde":"\\xf5","otimesas":"\\u2a36","Otimes":"\\u2a37","otimes":"\\u2297","Ouml":"\\xd6","ouml":"\\xf6","ovbar":"\\u233d","OverBar":"\\u203e","OverBrace":"\\u23de","OverBracket":"\\u23b4","OverParenthesis":"\\u23dc","para":"\\xb6","parallel":"\\u2225","par":"\\u2225","parsim":"\\u2af3","parsl":"\\u2afd","part":"\\u2202","PartialD":"\\u2202","Pcy":"\\u041f","pcy":"\\u043f","percnt":"%","period":".","permil":"\\u2030","perp":"\\u22a5","pertenk":"\\u2031","Pfr":"\\ud835\\udd13","pfr":"\\ud835\\udd2d","Phi":"\\u03a6","phi":"\\u03c6","phiv":"\\u03d5","phmmat":"\\u2133","phone":"\\u260e","Pi":"\\u03a0","pi":"\\u03c0","pitchfork":"\\u22d4","piv":"\\u03d6","planck":"\\u210f","planckh":"\\u210e","plankv":"\\u210f","plusacir":"\\u2a23","plusb":"\\u229e","pluscir":"\\u2a22","plus":"+","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","prap":"\\u2ab7","Pr":"\\u2abb","pr":"\\u227a","prcue":"\\u227c","precapprox":"\\u2ab7","prec":"\\u227a","preccurlyeq":"\\u227c","Precedes":"\\u227a","PrecedesEqual":"\\u2aaf","PrecedesSlantEqual":"\\u227c","PrecedesTilde":"\\u227e","preceq":"\\u2aaf","precnapprox":"\\u2ab9","precneqq":"\\u2ab5","precnsim":"\\u22e8","pre":"\\u2aaf","prE":"\\u2ab3","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","Proportional":"\\u221d","Proportion":"\\u2237","propto":"\\u221d","prsim":"\\u227e","prurel":"\\u22b0","Pscr":"\\ud835\\udcab","pscr":"\\ud835\\udcc5","Psi":"\\u03a8","psi":"\\u03c8","puncsp":"\\u2008","Qfr":"\\ud835\\udd14","qfr":"\\ud835\\udd2e","qint":"\\u2a0c","qopf":"\\ud835\\udd62","Qopf":"\\u211a","qprime":"\\u2057","Qscr":"\\ud835\\udcac","qscr":"\\ud835\\udcc6","quaternions":"\\u210d","quatint":"\\u2a16","quest":"?","questeq":"\\u225f","quot":"\\\\"","QUOT":"\\\\"","rAarr":"\\u21db","race":"\\u223d\\u0331","Racute":"\\u0154","racute":"\\u0155","radic":"\\u221a","raemptyv":"\\u29b3","rang":"\\u27e9","Rang":"\\u27eb","rangd":"\\u2992","range":"\\u29a5","rangle":"\\u27e9","raquo":"\\xbb","rarrap":"\\u2975","rarrb":"\\u21e5","rarrbfs":"\\u2920","rarrc":"\\u2933","rarr":"\\u2192","Rarr":"\\u21a0","rArr":"\\u21d2","rarrfs":"\\u291e","rarrhk":"\\u21aa","rarrlp":"\\u21ac","rarrpl":"\\u2945","rarrsim":"\\u2974","Rarrtl":"\\u2916","rarrtl":"\\u21a3","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":"\\u0158","rcaron":"\\u0159","Rcedil":"\\u0156","rcedil":"\\u0157","rceil":"\\u2309","rcub":"}","Rcy":"\\u0420","rcy":"\\u0440","rdca":"\\u2937","rdldhar":"\\u2969","rdquo":"\\u201d","rdquor":"\\u201d","rdsh":"\\u21b3","real":"\\u211c","realine":"\\u211b","realpart":"\\u211c","reals":"\\u211d","Re":"\\u211c","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":"\\u03a1","rho":"\\u03c1","rhov":"\\u03f1","RightAngleBracket":"\\u27e9","RightArrowBar":"\\u21e5","rightarrow":"\\u2192","RightArrow":"\\u2192","Rightarrow":"\\u21d2","RightArrowLeftArrow":"\\u21c4","rightarrowtail":"\\u21a3","RightCeiling":"\\u2309","RightDoubleBracket":"\\u27e7","RightDownTeeVector":"\\u295d","RightDownVectorBar":"\\u2955","RightDownVector":"\\u21c2","RightFloor":"\\u230b","rightharpoondown":"\\u21c1","rightharpoonup":"\\u21c0","rightleftarrows":"\\u21c4","rightleftharpoons":"\\u21cc","rightrightarrows":"\\u21c9","rightsquigarrow":"\\u219d","RightTeeArrow":"\\u21a6","RightTee":"\\u22a2","RightTeeVector":"\\u295b","rightthreetimes":"\\u22cc","RightTriangleBar":"\\u29d0","RightTriangle":"\\u22b3","RightTriangleEqual":"\\u22b5","RightUpDownVector":"\\u294f","RightUpTeeVector":"\\u295c","RightUpVectorBar":"\\u2954","RightUpVector":"\\u21be","RightVectorBar":"\\u2953","RightVector":"\\u21c0","ring":"\\u02da","risingdotseq":"\\u2253","rlarr":"\\u21c4","rlhar":"\\u21cc","rlm":"\\u200f","rmoustache":"\\u23b1","rmoust":"\\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":"\\u015a","sacute":"\\u015b","sbquo":"\\u201a","scap":"\\u2ab8","Scaron":"\\u0160","scaron":"\\u0161","Sc":"\\u2abc","sc":"\\u227b","sccue":"\\u227d","sce":"\\u2ab0","scE":"\\u2ab4","Scedil":"\\u015e","scedil":"\\u015f","Scirc":"\\u015c","scirc":"\\u015d","scnap":"\\u2aba","scnE":"\\u2ab6","scnsim":"\\u22e9","scpolint":"\\u2a13","scsim":"\\u227f","Scy":"\\u0421","scy":"\\u0441","sdotb":"\\u22a1","sdot":"\\u22c5","sdote":"\\u2a66","searhk":"\\u2925","searr":"\\u2198","seArr":"\\u21d8","searrow":"\\u2198","sect":"\\xa7","semi":";","seswar":"\\u2929","setminus":"\\u2216","setmn":"\\u2216","sext":"\\u2736","Sfr":"\\ud835\\udd16","sfr":"\\ud835\\udd30","sfrown":"\\u2322","sharp":"\\u266f","SHCHcy":"\\u0429","shchcy":"\\u0449","SHcy":"\\u0428","shcy":"\\u0448","ShortDownArrow":"\\u2193","ShortLeftArrow":"\\u2190","shortmid":"\\u2223","shortparallel":"\\u2225","ShortRightArrow":"\\u2192","ShortUpArrow":"\\u2191","shy":"\\xad","Sigma":"\\u03a3","sigma":"\\u03c3","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":"\\u042c","softcy":"\\u044c","solbar":"\\u233f","solb":"\\u29c4","sol":"/","Sopf":"\\ud835\\udd4a","sopf":"\\ud835\\udd64","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","square":"\\u25a1","Square":"\\u25a1","SquareIntersection":"\\u2293","SquareSubset":"\\u228f","SquareSubsetEqual":"\\u2291","SquareSuperset":"\\u2290","SquareSupersetEqual":"\\u2292","SquareUnion":"\\u2294","squarf":"\\u25aa","squ":"\\u25a1","squf":"\\u25aa","srarr":"\\u2192","Sscr":"\\ud835\\udcae","sscr":"\\ud835\\udcc8","ssetmn":"\\u2216","ssmile":"\\u2323","sstarf":"\\u22c6","Star":"\\u22c6","star":"\\u2606","starf":"\\u2605","straightepsilon":"\\u03f5","straightphi":"\\u03d5","strns":"\\xaf","sub":"\\u2282","Sub":"\\u22d0","subdot":"\\u2abd","subE":"\\u2ac5","sube":"\\u2286","subedot":"\\u2ac3","submult":"\\u2ac1","subnE":"\\u2acb","subne":"\\u228a","subplus":"\\u2abf","subrarr":"\\u2979","subset":"\\u2282","Subset":"\\u22d0","subseteq":"\\u2286","subseteqq":"\\u2ac5","SubsetEqual":"\\u2286","subsetneq":"\\u228a","subsetneqq":"\\u2acb","subsim":"\\u2ac7","subsub":"\\u2ad5","subsup":"\\u2ad3","succapprox":"\\u2ab8","succ":"\\u227b","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","sup1":"\\xb9","sup2":"\\xb2","sup3":"\\xb3","sup":"\\u2283","Sup":"\\u22d1","supdot":"\\u2abe","supdsub":"\\u2ad8","supE":"\\u2ac6","supe":"\\u2287","supedot":"\\u2ac4","Superset":"\\u2283","SupersetEqual":"\\u2287","suphsol":"\\u27c9","suphsub":"\\u2ad7","suplarr":"\\u297b","supmult":"\\u2ac2","supnE":"\\u2acc","supne":"\\u228b","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":"\\u03a4","tau":"\\u03c4","tbrk":"\\u23b4","Tcaron":"\\u0164","tcaron":"\\u0165","Tcedil":"\\u0162","tcedil":"\\u0163","Tcy":"\\u0422","tcy":"\\u0442","tdot":"\\u20db","telrec":"\\u2315","Tfr":"\\ud835\\udd17","tfr":"\\ud835\\udd31","there4":"\\u2234","therefore":"\\u2234","Therefore":"\\u2234","Theta":"\\u0398","theta":"\\u03b8","thetasym":"\\u03d1","thetav":"\\u03d1","thickapprox":"\\u2248","thicksim":"\\u223c","ThickSpace":"\\u205f\\u200a","ThinSpace":"\\u2009","thinsp":"\\u2009","thkap":"\\u2248","thksim":"\\u223c","THORN":"\\xde","thorn":"\\xfe","tilde":"\\u02dc","Tilde":"\\u223c","TildeEqual":"\\u2243","TildeFullEqual":"\\u2245","TildeTilde":"\\u2248","timesbar":"\\u2a31","timesb":"\\u22a0","times":"\\xd7","timesd":"\\u2a30","tint":"\\u222d","toea":"\\u2928","topbot":"\\u2336","topcir":"\\u2af1","top":"\\u22a4","Topf":"\\ud835\\udd4b","topf":"\\ud835\\udd65","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\\udcaf","tscr":"\\ud835\\udcc9","TScy":"\\u0426","tscy":"\\u0446","TSHcy":"\\u040b","tshcy":"\\u045b","Tstrok":"\\u0166","tstrok":"\\u0167","twixt":"\\u226c","twoheadleftarrow":"\\u219e","twoheadrightarrow":"\\u21a0","Uacute":"\\xda","uacute":"\\xfa","uarr":"\\u2191","Uarr":"\\u219f","uArr":"\\u21d1","Uarrocir":"\\u2949","Ubrcy":"\\u040e","ubrcy":"\\u045e","Ubreve":"\\u016c","ubreve":"\\u016d","Ucirc":"\\xdb","ucirc":"\\xfb","Ucy":"\\u0423","ucy":"\\u0443","udarr":"\\u21c5","Udblac":"\\u0170","udblac":"\\u0171","udhar":"\\u296e","ufisht":"\\u297e","Ufr":"\\ud835\\udd18","ufr":"\\ud835\\udd32","Ugrave":"\\xd9","ugrave":"\\xf9","uHar":"\\u2963","uharl":"\\u21bf","uharr":"\\u21be","uhblk":"\\u2580","ulcorn":"\\u231c","ulcorner":"\\u231c","ulcrop":"\\u230f","ultri":"\\u25f8","Umacr":"\\u016a","umacr":"\\u016b","uml":"\\xa8","UnderBar":"_","UnderBrace":"\\u23df","UnderBracket":"\\u23b5","UnderParenthesis":"\\u23dd","Union":"\\u22c3","UnionPlus":"\\u228e","Uogon":"\\u0172","uogon":"\\u0173","Uopf":"\\ud835\\udd4c","uopf":"\\ud835\\udd66","UpArrowBar":"\\u2912","uparrow":"\\u2191","UpArrow":"\\u2191","Uparrow":"\\u21d1","UpArrowDownArrow":"\\u21c5","updownarrow":"\\u2195","UpDownArrow":"\\u2195","Updownarrow":"\\u21d5","UpEquilibrium":"\\u296e","upharpoonleft":"\\u21bf","upharpoonright":"\\u21be","uplus":"\\u228e","UpperLeftArrow":"\\u2196","UpperRightArrow":"\\u2197","upsi":"\\u03c5","Upsi":"\\u03d2","upsih":"\\u03d2","Upsilon":"\\u03a5","upsilon":"\\u03c5","UpTeeArrow":"\\u21a5","UpTee":"\\u22a5","upuparrows":"\\u21c8","urcorn":"\\u231d","urcorner":"\\u231d","urcrop":"\\u230e","Uring":"\\u016e","uring":"\\u016f","urtri":"\\u25f9","Uscr":"\\ud835\\udcb0","uscr":"\\ud835\\udcca","utdot":"\\u22f0","Utilde":"\\u0168","utilde":"\\u0169","utri":"\\u25b5","utrif":"\\u25b4","uuarr":"\\u21c8","Uuml":"\\xdc","uuml":"\\xfc","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":"\\u0412","vcy":"\\u0432","vdash":"\\u22a2","vDash":"\\u22a8","Vdash":"\\u22a9","VDash":"\\u22ab","Vdashl":"\\u2ae6","veebar":"\\u22bb","vee":"\\u2228","Vee":"\\u22c1","veeeq":"\\u225a","vellip":"\\u22ee","verbar":"|","Verbar":"\\u2016","vert":"|","Vert":"\\u2016","VerticalBar":"\\u2223","VerticalLine":"|","VerticalSeparator":"\\u2758","VerticalTilde":"\\u2240","VeryThinSpace":"\\u200a","Vfr":"\\ud835\\udd19","vfr":"\\ud835\\udd33","vltri":"\\u22b2","vnsub":"\\u2282\\u20d2","vnsup":"\\u2283\\u20d2","Vopf":"\\ud835\\udd4d","vopf":"\\ud835\\udd67","vprop":"\\u221d","vrtri":"\\u22b3","Vscr":"\\ud835\\udcb1","vscr":"\\ud835\\udccb","vsubnE":"\\u2acb\\ufe00","vsubne":"\\u228a\\ufe00","vsupnE":"\\u2acc\\ufe00","vsupne":"\\u228b\\ufe00","Vvdash":"\\u22aa","vzigzag":"\\u299a","Wcirc":"\\u0174","wcirc":"\\u0175","wedbar":"\\u2a5f","wedge":"\\u2227","Wedge":"\\u22c0","wedgeq":"\\u2259","weierp":"\\u2118","Wfr":"\\ud835\\udd1a","wfr":"\\ud835\\udd34","Wopf":"\\ud835\\udd4e","wopf":"\\ud835\\udd68","wp":"\\u2118","wr":"\\u2240","wreath":"\\u2240","Wscr":"\\ud835\\udcb2","wscr":"\\ud835\\udccc","xcap":"\\u22c2","xcirc":"\\u25ef","xcup":"\\u22c3","xdtri":"\\u25bd","Xfr":"\\ud835\\udd1b","xfr":"\\ud835\\udd35","xharr":"\\u27f7","xhArr":"\\u27fa","Xi":"\\u039e","xi":"\\u03be","xlarr":"\\u27f5","xlArr":"\\u27f8","xmap":"\\u27fc","xnis":"\\u22fb","xodot":"\\u2a00","Xopf":"\\ud835\\udd4f","xopf":"\\ud835\\udd69","xoplus":"\\u2a01","xotime":"\\u2a02","xrarr":"\\u27f6","xrArr":"\\u27f9","Xscr":"\\ud835\\udcb3","xscr":"\\ud835\\udccd","xsqcup":"\\u2a06","xuplus":"\\u2a04","xutri":"\\u25b3","xvee":"\\u22c1","xwedge":"\\u22c0","Yacute":"\\xdd","yacute":"\\xfd","YAcy":"\\u042f","yacy":"\\u044f","Ycirc":"\\u0176","ycirc":"\\u0177","Ycy":"\\u042b","ycy":"\\u044b","yen":"\\xa5","Yfr":"\\ud835\\udd1c","yfr":"\\ud835\\udd36","YIcy":"\\u0407","yicy":"\\u0457","Yopf":"\\ud835\\udd50","yopf":"\\ud835\\udd6a","Yscr":"\\ud835\\udcb4","yscr":"\\ud835\\udcce","YUcy":"\\u042e","yucy":"\\u044e","yuml":"\\xff","Yuml":"\\u0178","Zacute":"\\u0179","zacute":"\\u017a","Zcaron":"\\u017d","zcaron":"\\u017e","Zcy":"\\u0417","zcy":"\\u0437","Zdot":"\\u017b","zdot":"\\u017c","zeetrf":"\\u2128","ZeroWidthSpace":"\\u200b","Zeta":"\\u0396","zeta":"\\u03b6","zfr":"\\ud835\\udd37","Zfr":"\\u2128","ZHcy":"\\u0416","zhcy":"\\u0436","zigrarr":"\\u21dd","zopf":"\\ud835\\udd6b","Zopf":"\\u2124","Zscr":"\\ud835\\udcb5","zscr":"\\ud835\\udccf","zwj":"\\u200d","zwnj":"\\u200c"}\');\n}, function(module) {\n module.exports = JSON.parse(\'{"amp":"&","apos":"\\\'","gt":">","lt":"<","quot":"\\\\""}\');\n}, function(module, exports, __webpack_require__) {\n "use strict";\n Object.defineProperty(exports, "__esModule", {\n value: !0\n }), exports.isTag = function(elem) {\n return "tag" === elem.type || "script" === elem.type || "style" === elem.type;\n }, exports.Text = "text", exports.Directive = "directive", exports.Comment = "comment", \n exports.Script = "script", exports.Style = "style", exports.Tag = "tag", exports.CDATA = "cdata", \n exports.Doctype = "doctype";\n}, function(module, exports, __webpack_require__) {\n "use strict";\n var extendStatics, __extends = this && this.__extends || (extendStatics = function(d, b) {\n return (extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function(d, b) {\n d.__proto__ = b;\n } || function(d, b) {\n for (var p in b) b.hasOwnProperty(p) && (d[p] = b[p]);\n })(d, b);\n }, function(d, b) {\n function __() {\n this.constructor = d;\n }\n extendStatics(d, b), d.prototype = null === b ? Object.create(b) : (__.prototype = b.prototype, \n new __);\n }), __importDefault = this && this.__importDefault || function(mod) {\n return mod && mod.__esModule ? mod : {\n default: mod\n };\n };\n Object.defineProperty(exports, "__esModule", {\n value: !0\n });\n var Tokenizer_1 = __importDefault(__webpack_require__(13)), events_1 = __webpack_require__(31), formTags = new Set([ "input", "option", "optgroup", "select", "button", "datalist", "textarea" ]), pTag = new Set([ "p" ]), openImpliesClose = {\n tr: new Set([ "tr", "th", "td" ]),\n th: new Set([ "th" ]),\n td: new Set([ "thead", "th", "td" ]),\n body: new Set([ "head", "link", "script" ]),\n li: new Set([ "li" ]),\n p: pTag,\n h1: pTag,\n h2: pTag,\n h3: pTag,\n h4: pTag,\n h5: pTag,\n h6: pTag,\n select: formTags,\n input: formTags,\n output: formTags,\n button: formTags,\n datalist: formTags,\n textarea: formTags,\n option: new Set([ "option" ]),\n optgroup: new Set([ "optgroup", "option" ]),\n dd: new Set([ "dt", "dd" ]),\n dt: new Set([ "dt", "dd" ]),\n address: pTag,\n article: pTag,\n aside: pTag,\n blockquote: pTag,\n details: pTag,\n div: pTag,\n dl: pTag,\n fieldset: pTag,\n figcaption: pTag,\n figure: pTag,\n footer: pTag,\n form: pTag,\n header: pTag,\n hr: pTag,\n main: pTag,\n nav: pTag,\n ol: pTag,\n pre: pTag,\n section: pTag,\n table: pTag,\n ul: pTag,\n rt: new Set([ "rt", "rp" ]),\n rp: new Set([ "rt", "rp" ]),\n tbody: new Set([ "thead", "tbody" ]),\n tfoot: new Set([ "thead", "tbody" ])\n }, voidElements = new Set([ "area", "base", "basefont", "br", "col", "command", "embed", "frame", "hr", "img", "input", "isindex", "keygen", "link", "meta", "param", "source", "track", "wbr" ]), foreignContextElements = new Set([ "math", "svg" ]), htmlIntegrationElements = new Set([ "mi", "mo", "mn", "ms", "mtext", "annotation-xml", "foreignObject", "desc", "title" ]), reNameEnd = /\\s|\\//, Parser = function(_super) {\n function Parser(cbs, options) {\n var _this = _super.call(this) || this;\n return _this._tagname = "", _this._attribname = "", _this._attribvalue = "", _this._attribs = null, \n _this._stack = [], _this._foreignContext = [], _this.startIndex = 0, _this.endIndex = null, \n _this.parseChunk = Parser.prototype.write, _this.done = Parser.prototype.end, _this._options = options || {}, \n _this._cbs = cbs || {}, _this._tagname = "", _this._attribname = "", _this._attribvalue = "", \n _this._attribs = null, _this._stack = [], _this._foreignContext = [], _this.startIndex = 0, \n _this.endIndex = null, _this._lowerCaseTagNames = "lowerCaseTags" in _this._options ? !!_this._options.lowerCaseTags : !_this._options.xmlMode, \n _this._lowerCaseAttributeNames = "lowerCaseAttributeNames" in _this._options ? !!_this._options.lowerCaseAttributeNames : !_this._options.xmlMode, \n _this._tokenizer = new (_this._options.Tokenizer || Tokenizer_1.default)(_this._options, _this), \n _this._cbs.onparserinit && _this._cbs.onparserinit(_this), _this;\n }\n return __extends(Parser, _super), Parser.prototype._updatePosition = function(initialOffset) {\n null === this.endIndex ? this._tokenizer._sectionStart <= initialOffset ? this.startIndex = 0 : this.startIndex = this._tokenizer._sectionStart - initialOffset : this.startIndex = this.endIndex + 1, \n this.endIndex = this._tokenizer.getAbsoluteIndex();\n }, Parser.prototype.ontext = function(data) {\n this._updatePosition(1), this.endIndex--, this._cbs.ontext && this._cbs.ontext(data);\n }, Parser.prototype.onopentagname = function(name) {\n if (this._lowerCaseTagNames && (name = name.toLowerCase()), this._tagname = name, \n !this._options.xmlMode && Object.prototype.hasOwnProperty.call(openImpliesClose, name)) for (var el = void 0; openImpliesClose[name].has(el = this._stack[this._stack.length - 1]); this.onclosetag(el)) ;\n !this._options.xmlMode && voidElements.has(name) || (this._stack.push(name), foreignContextElements.has(name) ? this._foreignContext.push(!0) : htmlIntegrationElements.has(name) && this._foreignContext.push(!1)), \n this._cbs.onopentagname && this._cbs.onopentagname(name), this._cbs.onopentag && (this._attribs = {});\n }, Parser.prototype.onopentagend = function() {\n this._updatePosition(1), this._attribs && (this._cbs.onopentag && this._cbs.onopentag(this._tagname, this._attribs), \n this._attribs = null), !this._options.xmlMode && this._cbs.onclosetag && voidElements.has(this._tagname) && this._cbs.onclosetag(this._tagname), \n this._tagname = "";\n }, Parser.prototype.onclosetag = function(name) {\n if (this._updatePosition(1), this._lowerCaseTagNames && (name = name.toLowerCase()), \n (foreignContextElements.has(name) || htmlIntegrationElements.has(name)) && this._foreignContext.pop(), \n !this._stack.length || !this._options.xmlMode && voidElements.has(name)) this._options.xmlMode || "br" !== name && "p" !== name || (this.onopentagname(name), \n this._closeCurrentTag()); else {\n var pos = this._stack.lastIndexOf(name);\n if (-1 !== pos) if (this._cbs.onclosetag) for (pos = this._stack.length - pos; pos--; ) this._cbs.onclosetag(this._stack.pop()); else this._stack.length = pos; else "p" !== name || this._options.xmlMode || (this.onopentagname(name), \n this._closeCurrentTag());\n }\n }, Parser.prototype.onselfclosingtag = function() {\n this._options.xmlMode || this._options.recognizeSelfClosing || this._foreignContext[this._foreignContext.length - 1] ? this._closeCurrentTag() : this.onopentagend();\n }, Parser.prototype._closeCurrentTag = function() {\n var name = this._tagname;\n this.onopentagend(), this._stack[this._stack.length - 1] === name && (this._cbs.onclosetag && this._cbs.onclosetag(name), \n this._stack.pop());\n }, Parser.prototype.onattribname = function(name) {\n this._lowerCaseAttributeNames && (name = name.toLowerCase()), this._attribname = name;\n }, Parser.prototype.onattribdata = function(value) {\n this._attribvalue += value;\n }, Parser.prototype.onattribend = function() {\n this._cbs.onattribute && this._cbs.onattribute(this._attribname, this._attribvalue), \n this._attribs && !Object.prototype.hasOwnProperty.call(this._attribs, this._attribname) && (this._attribs[this._attribname] = this._attribvalue), \n this._attribname = "", this._attribvalue = "";\n }, Parser.prototype._getInstructionName = function(value) {\n var idx = value.search(reNameEnd), name = idx < 0 ? value : value.substr(0, idx);\n return this._lowerCaseTagNames && (name = name.toLowerCase()), name;\n }, Parser.prototype.ondeclaration = function(value) {\n if (this._cbs.onprocessinginstruction) {\n var name_1 = this._getInstructionName(value);\n this._cbs.onprocessinginstruction("!" + name_1, "!" + value);\n }\n }, Parser.prototype.onprocessinginstruction = function(value) {\n if (this._cbs.onprocessinginstruction) {\n var name_2 = this._getInstructionName(value);\n this._cbs.onprocessinginstruction("?" + name_2, "?" + value);\n }\n }, Parser.prototype.oncomment = function(value) {\n this._updatePosition(4), this._cbs.oncomment && this._cbs.oncomment(value), this._cbs.oncommentend && this._cbs.oncommentend();\n }, Parser.prototype.oncdata = function(value) {\n this._updatePosition(1), this._options.xmlMode || this._options.recognizeCDATA ? (this._cbs.oncdatastart && this._cbs.oncdatastart(), \n this._cbs.ontext && this._cbs.ontext(value), this._cbs.oncdataend && this._cbs.oncdataend()) : this.oncomment("[CDATA[" + value + "]]");\n }, Parser.prototype.onerror = function(err) {\n this._cbs.onerror && this._cbs.onerror(err);\n }, Parser.prototype.onend = function() {\n if (this._cbs.onclosetag) for (var i = this._stack.length; i > 0; this._cbs.onclosetag(this._stack[--i])) ;\n this._cbs.onend && this._cbs.onend();\n }, Parser.prototype.reset = function() {\n this._cbs.onreset && this._cbs.onreset(), this._tokenizer.reset(), this._tagname = "", \n this._attribname = "", this._attribs = null, this._stack = [], this._cbs.onparserinit && this._cbs.onparserinit(this);\n }, Parser.prototype.parseComplete = function(data) {\n this.reset(), this.end(data);\n }, Parser.prototype.write = function(chunk) {\n this._tokenizer.write(chunk);\n }, Parser.prototype.end = function(chunk) {\n this._tokenizer.end(chunk);\n }, Parser.prototype.pause = function() {\n this._tokenizer.pause();\n }, Parser.prototype.resume = function() {\n this._tokenizer.resume();\n }, Parser;\n }(events_1.EventEmitter);\n exports.Parser = Parser;\n}, function(module, exports, __webpack_require__) {\n "use strict";\n var __importDefault = this && this.__importDefault || function(mod) {\n return mod && mod.__esModule ? mod : {\n default: mod\n };\n };\n Object.defineProperty(exports, "__esModule", {\n value: !0\n });\n var decode_codepoint_1 = __importDefault(__webpack_require__(14)), entities_json_1 = __importDefault(__webpack_require__(9)), legacy_json_1 = __importDefault(__webpack_require__(15)), xml_json_1 = __importDefault(__webpack_require__(10));\n function whitespace(c) {\n return " " === c || "\\n" === c || "\\t" === c || "\\f" === c || "\\r" === c;\n }\n function ifElseState(upper, SUCCESS, FAILURE) {\n var lower = upper.toLowerCase();\n return upper === lower ? function(t, c) {\n c === lower ? t._state = SUCCESS : (t._state = FAILURE, t._index--);\n } : function(t, c) {\n c === lower || c === upper ? t._state = SUCCESS : (t._state = FAILURE, t._index--);\n };\n }\n function consumeSpecialNameChar(upper, NEXT_STATE) {\n var lower = upper.toLowerCase();\n return function(t, c) {\n c === lower || c === upper ? t._state = NEXT_STATE : (t._state = 3, t._index--);\n };\n }\n var stateBeforeCdata1 = ifElseState("C", 23, 16), stateBeforeCdata2 = ifElseState("D", 24, 16), stateBeforeCdata3 = ifElseState("A", 25, 16), stateBeforeCdata4 = ifElseState("T", 26, 16), stateBeforeCdata5 = ifElseState("A", 27, 16), stateBeforeScript1 = consumeSpecialNameChar("R", 34), stateBeforeScript2 = consumeSpecialNameChar("I", 35), stateBeforeScript3 = consumeSpecialNameChar("P", 36), stateBeforeScript4 = consumeSpecialNameChar("T", 37), stateAfterScript1 = ifElseState("R", 39, 1), stateAfterScript2 = ifElseState("I", 40, 1), stateAfterScript3 = ifElseState("P", 41, 1), stateAfterScript4 = ifElseState("T", 42, 1), stateBeforeStyle1 = consumeSpecialNameChar("Y", 44), stateBeforeStyle2 = consumeSpecialNameChar("L", 45), stateBeforeStyle3 = consumeSpecialNameChar("E", 46), stateAfterStyle1 = ifElseState("Y", 48, 1), stateAfterStyle2 = ifElseState("L", 49, 1), stateAfterStyle3 = ifElseState("E", 50, 1), stateBeforeEntity = ifElseState("#", 52, 53), stateBeforeNumericEntity = ifElseState("X", 55, 54), Tokenizer = function() {\n function Tokenizer(options, cbs) {\n this._state = 1, this._buffer = "", this._sectionStart = 0, this._index = 0, this._bufferOffset = 0, \n this._baseState = 1, this._special = 1, this._running = !0, this._ended = !1, this._cbs = cbs, \n this._xmlMode = !(!options || !options.xmlMode), this._decodeEntities = !(!options || !options.decodeEntities);\n }\n return Tokenizer.prototype.reset = function() {\n this._state = 1, this._buffer = "", this._sectionStart = 0, this._index = 0, this._bufferOffset = 0, \n this._baseState = 1, this._special = 1, this._running = !0, this._ended = !1;\n }, Tokenizer.prototype._stateText = function(c) {\n "<" === c ? (this._index > this._sectionStart && this._cbs.ontext(this._getSection()), \n this._state = 2, this._sectionStart = this._index) : this._decodeEntities && 1 === this._special && "&" === c && (this._index > this._sectionStart && this._cbs.ontext(this._getSection()), \n this._baseState = 1, this._state = 51, this._sectionStart = this._index);\n }, Tokenizer.prototype._stateBeforeTagName = function(c) {\n "/" === c ? this._state = 5 : "<" === c ? (this._cbs.ontext(this._getSection()), \n this._sectionStart = this._index) : ">" === c || 1 !== this._special || whitespace(c) ? this._state = 1 : "!" === c ? (this._state = 15, \n this._sectionStart = this._index + 1) : "?" === c ? (this._state = 17, this._sectionStart = this._index + 1) : (this._state = this._xmlMode || "s" !== c && "S" !== c ? 3 : 31, \n this._sectionStart = this._index);\n }, Tokenizer.prototype._stateInTagName = function(c) {\n ("/" === c || ">" === c || whitespace(c)) && (this._emitToken("onopentagname"), \n this._state = 8, this._index--);\n }, Tokenizer.prototype._stateBeforeClosingTagName = function(c) {\n whitespace(c) || (">" === c ? this._state = 1 : 1 !== this._special ? "s" === c || "S" === c ? this._state = 32 : (this._state = 1, \n this._index--) : (this._state = 6, this._sectionStart = this._index));\n }, Tokenizer.prototype._stateInClosingTagName = function(c) {\n (">" === c || whitespace(c)) && (this._emitToken("onclosetag"), this._state = 7, \n this._index--);\n }, Tokenizer.prototype._stateAfterClosingTagName = function(c) {\n ">" === c && (this._state = 1, this._sectionStart = this._index + 1);\n }, Tokenizer.prototype._stateBeforeAttributeName = function(c) {\n ">" === c ? (this._cbs.onopentagend(), this._state = 1, this._sectionStart = this._index + 1) : "/" === c ? this._state = 4 : whitespace(c) || (this._state = 9, \n this._sectionStart = this._index);\n }, Tokenizer.prototype._stateInSelfClosingTag = function(c) {\n ">" === c ? (this._cbs.onselfclosingtag(), this._state = 1, this._sectionStart = this._index + 1) : whitespace(c) || (this._state = 8, \n this._index--);\n }, Tokenizer.prototype._stateInAttributeName = function(c) {\n ("=" === c || "/" === c || ">" === c || whitespace(c)) && (this._cbs.onattribname(this._getSection()), \n this._sectionStart = -1, this._state = 10, this._index--);\n }, Tokenizer.prototype._stateAfterAttributeName = function(c) {\n "=" === c ? this._state = 11 : "/" === c || ">" === c ? (this._cbs.onattribend(), \n this._state = 8, this._index--) : whitespace(c) || (this._cbs.onattribend(), this._state = 9, \n this._sectionStart = this._index);\n }, Tokenizer.prototype._stateBeforeAttributeValue = function(c) {\n \'"\' === c ? (this._state = 12, this._sectionStart = this._index + 1) : "\'" === c ? (this._state = 13, \n this._sectionStart = this._index + 1) : whitespace(c) || (this._state = 14, this._sectionStart = this._index, \n this._index--);\n }, Tokenizer.prototype._stateInAttributeValueDoubleQuotes = function(c) {\n \'"\' === c ? (this._emitToken("onattribdata"), this._cbs.onattribend(), this._state = 8) : this._decodeEntities && "&" === c && (this._emitToken("onattribdata"), \n this._baseState = this._state, this._state = 51, this._sectionStart = this._index);\n }, Tokenizer.prototype._stateInAttributeValueSingleQuotes = function(c) {\n "\'" === c ? (this._emitToken("onattribdata"), this._cbs.onattribend(), this._state = 8) : this._decodeEntities && "&" === c && (this._emitToken("onattribdata"), \n this._baseState = this._state, this._state = 51, this._sectionStart = this._index);\n }, Tokenizer.prototype._stateInAttributeValueNoQuotes = function(c) {\n whitespace(c) || ">" === c ? (this._emitToken("onattribdata"), this._cbs.onattribend(), \n this._state = 8, this._index--) : this._decodeEntities && "&" === c && (this._emitToken("onattribdata"), \n this._baseState = this._state, this._state = 51, this._sectionStart = this._index);\n }, Tokenizer.prototype._stateBeforeDeclaration = function(c) {\n this._state = "[" === c ? 22 : "-" === c ? 18 : 16;\n }, Tokenizer.prototype._stateInDeclaration = function(c) {\n ">" === c && (this._cbs.ondeclaration(this._getSection()), this._state = 1, this._sectionStart = this._index + 1);\n }, Tokenizer.prototype._stateInProcessingInstruction = function(c) {\n ">" === c && (this._cbs.onprocessinginstruction(this._getSection()), this._state = 1, \n this._sectionStart = this._index + 1);\n }, Tokenizer.prototype._stateBeforeComment = function(c) {\n "-" === c ? (this._state = 19, this._sectionStart = this._index + 1) : this._state = 16;\n }, Tokenizer.prototype._stateInComment = function(c) {\n "-" === c && (this._state = 20);\n }, Tokenizer.prototype._stateAfterComment1 = function(c) {\n this._state = "-" === c ? 21 : 19;\n }, Tokenizer.prototype._stateAfterComment2 = function(c) {\n ">" === c ? (this._cbs.oncomment(this._buffer.substring(this._sectionStart, this._index - 2)), \n this._state = 1, this._sectionStart = this._index + 1) : "-" !== c && (this._state = 19);\n }, Tokenizer.prototype._stateBeforeCdata6 = function(c) {\n "[" === c ? (this._state = 28, this._sectionStart = this._index + 1) : (this._state = 16, \n this._index--);\n }, Tokenizer.prototype._stateInCdata = function(c) {\n "]" === c && (this._state = 29);\n }, Tokenizer.prototype._stateAfterCdata1 = function(c) {\n this._state = "]" === c ? 30 : 28;\n }, Tokenizer.prototype._stateAfterCdata2 = function(c) {\n ">" === c ? (this._cbs.oncdata(this._buffer.substring(this._sectionStart, this._index - 2)), \n this._state = 1, this._sectionStart = this._index + 1) : "]" !== c && (this._state = 28);\n }, Tokenizer.prototype._stateBeforeSpecial = function(c) {\n "c" === c || "C" === c ? this._state = 33 : "t" === c || "T" === c ? this._state = 43 : (this._state = 3, \n this._index--);\n }, Tokenizer.prototype._stateBeforeSpecialEnd = function(c) {\n 2 !== this._special || "c" !== c && "C" !== c ? 3 !== this._special || "t" !== c && "T" !== c ? this._state = 1 : this._state = 47 : this._state = 38;\n }, Tokenizer.prototype._stateBeforeScript5 = function(c) {\n ("/" === c || ">" === c || whitespace(c)) && (this._special = 2), this._state = 3, \n this._index--;\n }, Tokenizer.prototype._stateAfterScript5 = function(c) {\n ">" === c || whitespace(c) ? (this._special = 1, this._state = 6, this._sectionStart = this._index - 6, \n this._index--) : this._state = 1;\n }, Tokenizer.prototype._stateBeforeStyle4 = function(c) {\n ("/" === c || ">" === c || whitespace(c)) && (this._special = 3), this._state = 3, \n this._index--;\n }, Tokenizer.prototype._stateAfterStyle4 = function(c) {\n ">" === c || whitespace(c) ? (this._special = 1, this._state = 6, this._sectionStart = this._index - 5, \n this._index--) : this._state = 1;\n }, Tokenizer.prototype._parseNamedEntityStrict = function() {\n if (this._sectionStart + 1 < this._index) {\n var entity = this._buffer.substring(this._sectionStart + 1, this._index), map = this._xmlMode ? xml_json_1.default : entities_json_1.default;\n Object.prototype.hasOwnProperty.call(map, entity) && (this._emitPartial(map[entity]), \n this._sectionStart = this._index + 1);\n }\n }, Tokenizer.prototype._parseLegacyEntity = function() {\n var start = this._sectionStart + 1, limit = this._index - start;\n for (limit > 6 && (limit = 6); limit >= 2; ) {\n var entity = this._buffer.substr(start, limit);\n if (Object.prototype.hasOwnProperty.call(legacy_json_1.default, entity)) return this._emitPartial(legacy_json_1.default[entity]), \n void (this._sectionStart += limit + 1);\n limit--;\n }\n }, Tokenizer.prototype._stateInNamedEntity = function(c) {\n ";" === c ? (this._parseNamedEntityStrict(), this._sectionStart + 1 < this._index && !this._xmlMode && this._parseLegacyEntity(), \n this._state = this._baseState) : (c < "a" || c > "z") && (c < "A" || c > "Z") && (c < "0" || c > "9") && (this._xmlMode || this._sectionStart + 1 === this._index || (1 !== this._baseState ? "=" !== c && this._parseNamedEntityStrict() : this._parseLegacyEntity()), \n this._state = this._baseState, this._index--);\n }, Tokenizer.prototype._decodeNumericEntity = function(offset, base) {\n var sectionStart = this._sectionStart + offset;\n if (sectionStart !== this._index) {\n var entity = this._buffer.substring(sectionStart, this._index), parsed = parseInt(entity, base);\n this._emitPartial(decode_codepoint_1.default(parsed)), this._sectionStart = this._index;\n } else this._sectionStart--;\n this._state = this._baseState;\n }, Tokenizer.prototype._stateInNumericEntity = function(c) {\n ";" === c ? (this._decodeNumericEntity(2, 10), this._sectionStart++) : (c < "0" || c > "9") && (this._xmlMode ? this._state = this._baseState : this._decodeNumericEntity(2, 10), \n this._index--);\n }, Tokenizer.prototype._stateInHexEntity = function(c) {\n ";" === c ? (this._decodeNumericEntity(3, 16), this._sectionStart++) : (c < "a" || c > "f") && (c < "A" || c > "F") && (c < "0" || c > "9") && (this._xmlMode ? this._state = this._baseState : this._decodeNumericEntity(3, 16), \n this._index--);\n }, Tokenizer.prototype._cleanup = function() {\n this._sectionStart < 0 ? (this._buffer = "", this._bufferOffset += this._index, \n this._index = 0) : this._running && (1 === this._state ? (this._sectionStart !== this._index && this._cbs.ontext(this._buffer.substr(this._sectionStart)), \n this._buffer = "", this._bufferOffset += this._index, this._index = 0) : this._sectionStart === this._index ? (this._buffer = "", \n this._bufferOffset += this._index, this._index = 0) : (this._buffer = this._buffer.substr(this._sectionStart), \n this._index -= this._sectionStart, this._bufferOffset += this._sectionStart), this._sectionStart = 0);\n }, Tokenizer.prototype.write = function(chunk) {\n this._ended && this._cbs.onerror(Error(".write() after done!")), this._buffer += chunk, \n this._parse();\n }, Tokenizer.prototype._parse = function() {\n for (;this._index < this._buffer.length && this._running; ) {\n var c = this._buffer.charAt(this._index);\n 1 === this._state ? this._stateText(c) : 12 === this._state ? this._stateInAttributeValueDoubleQuotes(c) : 9 === this._state ? this._stateInAttributeName(c) : 19 === this._state ? this._stateInComment(c) : 8 === this._state ? this._stateBeforeAttributeName(c) : 3 === this._state ? this._stateInTagName(c) : 6 === this._state ? this._stateInClosingTagName(c) : 2 === this._state ? this._stateBeforeTagName(c) : 10 === this._state ? this._stateAfterAttributeName(c) : 13 === this._state ? this._stateInAttributeValueSingleQuotes(c) : 11 === this._state ? this._stateBeforeAttributeValue(c) : 5 === this._state ? this._stateBeforeClosingTagName(c) : 7 === this._state ? this._stateAfterClosingTagName(c) : 31 === this._state ? this._stateBeforeSpecial(c) : 20 === this._state ? this._stateAfterComment1(c) : 14 === this._state ? this._stateInAttributeValueNoQuotes(c) : 4 === this._state ? this._stateInSelfClosingTag(c) : 16 === this._state ? this._stateInDeclaration(c) : 15 === this._state ? this._stateBeforeDeclaration(c) : 21 === this._state ? this._stateAfterComment2(c) : 18 === this._state ? this._stateBeforeComment(c) : 32 === this._state ? this._stateBeforeSpecialEnd(c) : 38 === this._state ? stateAfterScript1(this, c) : 39 === this._state ? stateAfterScript2(this, c) : 40 === this._state ? stateAfterScript3(this, c) : 33 === this._state ? stateBeforeScript1(this, c) : 34 === this._state ? stateBeforeScript2(this, c) : 35 === this._state ? stateBeforeScript3(this, c) : 36 === this._state ? stateBeforeScript4(this, c) : 37 === this._state ? this._stateBeforeScript5(c) : 41 === this._state ? stateAfterScript4(this, c) : 42 === this._state ? this._stateAfterScript5(c) : 43 === this._state ? stateBeforeStyle1(this, c) : 28 === this._state ? this._stateInCdata(c) : 44 === this._state ? stateBeforeStyle2(this, c) : 45 === this._state ? stateBeforeStyle3(this, c) : 46 === this._state ? this._stateBeforeStyle4(c) : 47 === this._state ? stateAfterStyle1(this, c) : 48 === this._state ? stateAfterStyle2(this, c) : 49 === this._state ? stateAfterStyle3(this, c) : 50 === this._state ? this._stateAfterStyle4(c) : 17 === this._state ? this._stateInProcessingInstruction(c) : 53 === this._state ? this._stateInNamedEntity(c) : 22 === this._state ? stateBeforeCdata1(this, c) : 51 === this._state ? stateBeforeEntity(this, c) : 23 === this._state ? stateBeforeCdata2(this, c) : 24 === this._state ? stateBeforeCdata3(this, c) : 29 === this._state ? this._stateAfterCdata1(c) : 30 === this._state ? this._stateAfterCdata2(c) : 25 === this._state ? stateBeforeCdata4(this, c) : 26 === this._state ? stateBeforeCdata5(this, c) : 27 === this._state ? this._stateBeforeCdata6(c) : 55 === this._state ? this._stateInHexEntity(c) : 54 === this._state ? this._stateInNumericEntity(c) : 52 === this._state ? stateBeforeNumericEntity(this, c) : this._cbs.onerror(Error("unknown _state"), this._state), \n this._index++;\n }\n this._cleanup();\n }, Tokenizer.prototype.pause = function() {\n this._running = !1;\n }, Tokenizer.prototype.resume = function() {\n this._running = !0, this._index < this._buffer.length && this._parse(), this._ended && this._finish();\n }, Tokenizer.prototype.end = function(chunk) {\n this._ended && this._cbs.onerror(Error(".end() after done!")), chunk && this.write(chunk), \n this._ended = !0, this._running && this._finish();\n }, Tokenizer.prototype._finish = function() {\n this._sectionStart < this._index && this._handleTrailingData(), this._cbs.onend();\n }, Tokenizer.prototype._handleTrailingData = function() {\n var data = this._buffer.substr(this._sectionStart);\n 28 === this._state || 29 === this._state || 30 === this._state ? this._cbs.oncdata(data) : 19 === this._state || 20 === this._state || 21 === this._state ? this._cbs.oncomment(data) : 53 !== this._state || this._xmlMode ? 54 !== this._state || this._xmlMode ? 55 !== this._state || this._xmlMode ? 3 !== this._state && 8 !== this._state && 11 !== this._state && 10 !== this._state && 9 !== this._state && 13 !== this._state && 12 !== this._state && 14 !== this._state && 6 !== this._state && this._cbs.ontext(data) : (this._decodeNumericEntity(3, 16), \n this._sectionStart < this._index && (this._state = this._baseState, this._handleTrailingData())) : (this._decodeNumericEntity(2, 10), \n this._sectionStart < this._index && (this._state = this._baseState, this._handleTrailingData())) : (this._parseLegacyEntity(), \n this._sectionStart < this._index && (this._state = this._baseState, this._handleTrailingData()));\n }, Tokenizer.prototype.getAbsoluteIndex = function() {\n return this._bufferOffset + this._index;\n }, Tokenizer.prototype._getSection = function() {\n return this._buffer.substring(this._sectionStart, this._index);\n }, Tokenizer.prototype._emitToken = function(name) {\n this._cbs[name](this._getSection()), this._sectionStart = -1;\n }, Tokenizer.prototype._emitPartial = function(value) {\n 1 !== this._baseState ? this._cbs.onattribdata(value) : this._cbs.ontext(value);\n }, Tokenizer;\n }();\n exports.default = Tokenizer;\n}, function(module, exports, __webpack_require__) {\n "use strict";\n var __importDefault = this && this.__importDefault || function(mod) {\n return mod && mod.__esModule ? mod : {\n default: mod\n };\n };\n Object.defineProperty(exports, "__esModule", {\n value: !0\n });\n var decode_json_1 = __importDefault(__webpack_require__(30));\n exports.default = function(codePoint) {\n if (codePoint >= 55296 && codePoint <= 57343 || codePoint > 1114111) return "\\ufffd";\n codePoint in decode_json_1.default && (codePoint = decode_json_1.default[codePoint]);\n var output = "";\n return codePoint > 65535 && (codePoint -= 65536, output += String.fromCharCode(codePoint >>> 10 & 1023 | 55296), \n codePoint = 56320 | 1023 & codePoint), output += String.fromCharCode(codePoint);\n };\n}, function(module) {\n module.exports = JSON.parse(\'{"Aacute":"\\xc1","aacute":"\\xe1","Acirc":"\\xc2","acirc":"\\xe2","acute":"\\xb4","AElig":"\\xc6","aelig":"\\xe6","Agrave":"\\xc0","agrave":"\\xe0","amp":"&","AMP":"&","Aring":"\\xc5","aring":"\\xe5","Atilde":"\\xc3","atilde":"\\xe3","Auml":"\\xc4","auml":"\\xe4","brvbar":"\\xa6","Ccedil":"\\xc7","ccedil":"\\xe7","cedil":"\\xb8","cent":"\\xa2","copy":"\\xa9","COPY":"\\xa9","curren":"\\xa4","deg":"\\xb0","divide":"\\xf7","Eacute":"\\xc9","eacute":"\\xe9","Ecirc":"\\xca","ecirc":"\\xea","Egrave":"\\xc8","egrave":"\\xe8","ETH":"\\xd0","eth":"\\xf0","Euml":"\\xcb","euml":"\\xeb","frac12":"\\xbd","frac14":"\\xbc","frac34":"\\xbe","gt":">","GT":">","Iacute":"\\xcd","iacute":"\\xed","Icirc":"\\xce","icirc":"\\xee","iexcl":"\\xa1","Igrave":"\\xcc","igrave":"\\xec","iquest":"\\xbf","Iuml":"\\xcf","iuml":"\\xef","laquo":"\\xab","lt":"<","LT":"<","macr":"\\xaf","micro":"\\xb5","middot":"\\xb7","nbsp":"\\xa0","not":"\\xac","Ntilde":"\\xd1","ntilde":"\\xf1","Oacute":"\\xd3","oacute":"\\xf3","Ocirc":"\\xd4","ocirc":"\\xf4","Ograve":"\\xd2","ograve":"\\xf2","ordf":"\\xaa","ordm":"\\xba","Oslash":"\\xd8","oslash":"\\xf8","Otilde":"\\xd5","otilde":"\\xf5","Ouml":"\\xd6","ouml":"\\xf6","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":"\\xde","thorn":"\\xfe","times":"\\xd7","Uacute":"\\xda","uacute":"\\xfa","Ucirc":"\\xdb","ucirc":"\\xfb","Ugrave":"\\xd9","ugrave":"\\xf9","uml":"\\xa8","Uuml":"\\xdc","uuml":"\\xfc","Yacute":"\\xdd","yacute":"\\xfd","yen":"\\xa5","yuml":"\\xff"}\');\n}, function(module, exports, __webpack_require__) {\n "use strict";\n Object.defineProperty(exports, "__esModule", {\n value: !0\n });\n var node_1 = __webpack_require__(32);\n exports.Node = node_1.Node, exports.Element = node_1.Element, exports.DataNode = node_1.DataNode, \n exports.NodeWithChildren = node_1.NodeWithChildren;\n var reWhitespace = /\\s+/g, defaultOpts = {\n normalizeWhitespace: !1,\n withStartIndices: !1,\n withEndIndices: !1\n }, DomHandler = function() {\n function DomHandler(callback, options, elementCB) {\n this.dom = [], this._done = !1, this._tagStack = [], this._lastNode = null, this._parser = null, \n "function" == typeof options && (elementCB = options, options = defaultOpts), "object" == typeof callback && (options = callback, \n callback = void 0), this._callback = callback || null, this._options = options || defaultOpts, \n this._elementCB = elementCB || null;\n }\n return DomHandler.prototype.onparserinit = function(parser) {\n this._parser = parser;\n }, DomHandler.prototype.onreset = function() {\n this.dom = [], this._done = !1, this._tagStack = [], this._lastNode = null, this._parser = this._parser || null;\n }, DomHandler.prototype.onend = function() {\n this._done || (this._done = !0, this._parser = null, this.handleCallback(null));\n }, DomHandler.prototype.onerror = function(error) {\n this.handleCallback(error);\n }, DomHandler.prototype.onclosetag = function() {\n this._lastNode = null;\n var elem = this._tagStack.pop();\n elem && this._parser && (this._options.withEndIndices && (elem.endIndex = this._parser.endIndex), \n this._elementCB && this._elementCB(elem));\n }, DomHandler.prototype.onopentag = function(name, attribs) {\n var element = new node_1.Element(name, attribs);\n this.addNode(element), this._tagStack.push(element);\n }, DomHandler.prototype.ontext = function(data) {\n var normalize = this._options.normalizeWhitespace, _lastNode = this._lastNode;\n if (_lastNode && "text" === _lastNode.type) normalize ? _lastNode.data = (_lastNode.data + data).replace(reWhitespace, " ") : _lastNode.data += data; else {\n normalize && (data = data.replace(reWhitespace, " "));\n var node = new node_1.DataNode("text", data);\n this.addNode(node), this._lastNode = node;\n }\n }, DomHandler.prototype.oncomment = function(data) {\n if (this._lastNode && "comment" === this._lastNode.type) this._lastNode.data += data; else {\n var node = new node_1.DataNode("comment", data);\n this.addNode(node), this._lastNode = node;\n }\n }, DomHandler.prototype.oncommentend = function() {\n this._lastNode = null;\n }, DomHandler.prototype.oncdatastart = function() {\n var text = new node_1.DataNode("text", ""), node = new node_1.NodeWithChildren("cdata", [ text ]);\n this.addNode(node), text.parent = node, this._lastNode = text;\n }, DomHandler.prototype.oncdataend = function() {\n this._lastNode = null;\n }, DomHandler.prototype.onprocessinginstruction = function(name, data) {\n var node = new node_1.ProcessingInstruction(name, data);\n this.addNode(node);\n }, DomHandler.prototype.handleCallback = function(error) {\n if ("function" == typeof this._callback) this._callback(error, this.dom); else if (error) throw error;\n }, DomHandler.prototype.addNode = function(node) {\n var parent = this._tagStack[this._tagStack.length - 1], siblings = parent ? parent.children : this.dom, previousSibling = siblings[siblings.length - 1];\n this._parser && (this._options.withStartIndices && (node.startIndex = this._parser.startIndex), \n this._options.withEndIndices && (node.endIndex = this._parser.endIndex)), siblings.push(node), \n previousSibling && (node.prev = previousSibling, previousSibling.next = node), parent && (node.parent = parent), \n this._lastNode = null;\n }, DomHandler.prototype.addDataNode = function(node) {\n this.addNode(node), this._lastNode = node;\n }, DomHandler;\n }();\n exports.DomHandler = DomHandler, exports.default = DomHandler;\n}, function(module, exports, __webpack_require__) {\n "use strict";\n var extendStatics, __extends = this && this.__extends || (extendStatics = function(d, b) {\n return (extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function(d, b) {\n d.__proto__ = b;\n } || function(d, b) {\n for (var p in b) b.hasOwnProperty(p) && (d[p] = b[p]);\n })(d, b);\n }, function(d, b) {\n function __() {\n this.constructor = d;\n }\n extendStatics(d, b), d.prototype = null === b ? Object.create(b) : (__.prototype = b.prototype, \n new __);\n }), __importDefault = this && this.__importDefault || function(mod) {\n return mod && mod.__esModule ? mod : {\n default: mod\n };\n }, __importStar = this && this.__importStar || function(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (null != mod) for (var k in mod) Object.hasOwnProperty.call(mod, k) && (result[k] = mod[k]);\n return result.default = mod, result;\n };\n Object.defineProperty(exports, "__esModule", {\n value: !0\n });\n var domhandler_1 = __importDefault(__webpack_require__(16)), DomUtils = __importStar(__webpack_require__(18)), Parser_1 = __webpack_require__(12), FeedHandler = function(_super) {\n function FeedHandler(callback, options) {\n return "object" == typeof callback && null !== callback && (options = callback = void 0), \n _super.call(this, callback, options) || this;\n }\n return __extends(FeedHandler, _super), FeedHandler.prototype.onend = function() {\n var feed = {}, feedRoot = getOneElement(isValidFeed, this.dom);\n if (feedRoot) if ("feed" === feedRoot.name) {\n var childs = feedRoot.children;\n feed.type = "atom", addConditionally(feed, "id", "id", childs), addConditionally(feed, "title", "title", childs);\n var href = getAttribute("href", getOneElement("link", childs));\n href && (feed.link = href), addConditionally(feed, "description", "subtitle", childs), \n (updated = fetch("updated", childs)) && (feed.updated = new Date(updated)), addConditionally(feed, "author", "email", childs, !0), \n feed.items = getElements("entry", childs).map((function(item) {\n var entry = {}, children = item.children;\n addConditionally(entry, "id", "id", children), addConditionally(entry, "title", "title", children);\n var href = getAttribute("href", getOneElement("link", children));\n href && (entry.link = href);\n var description = fetch("summary", children) || fetch("content", children);\n description && (entry.description = description);\n var pubDate = fetch("updated", children);\n return pubDate && (entry.pubDate = new Date(pubDate)), entry;\n }));\n } else {\n var updated;\n childs = getOneElement("channel", feedRoot.children).children;\n feed.type = feedRoot.name.substr(0, 3), feed.id = "", addConditionally(feed, "title", "title", childs), \n addConditionally(feed, "link", "link", childs), addConditionally(feed, "description", "description", childs), \n (updated = fetch("lastBuildDate", childs)) && (feed.updated = new Date(updated)), \n addConditionally(feed, "author", "managingEditor", childs, !0), feed.items = getElements("item", feedRoot.children).map((function(item) {\n var entry = {}, children = item.children;\n addConditionally(entry, "id", "guid", children), addConditionally(entry, "title", "title", children), \n addConditionally(entry, "link", "link", children), addConditionally(entry, "description", "description", children);\n var pubDate = fetch("pubDate", children);\n return pubDate && (entry.pubDate = new Date(pubDate)), entry;\n }));\n }\n this.feed = feed, this.handleCallback(feedRoot ? null : Error("couldn\'t find root of feed"));\n }, FeedHandler;\n }(domhandler_1.default);\n function getElements(what, where) {\n return DomUtils.getElementsByTagName(what, where, !0);\n }\n function getOneElement(what, where) {\n return DomUtils.getElementsByTagName(what, where, !0, 1)[0];\n }\n function fetch(what, where, recurse) {\n return void 0 === recurse && (recurse = !1), DomUtils.getText(DomUtils.getElementsByTagName(what, where, recurse, 1)).trim();\n }\n function getAttribute(name, elem) {\n return elem ? elem.attribs[name] : null;\n }\n function addConditionally(obj, prop, what, where, recurse) {\n void 0 === recurse && (recurse = !1);\n var tmp = fetch(what, where, recurse);\n tmp && (obj[prop] = tmp);\n }\n function isValidFeed(value) {\n return "rss" === value || "feed" === value || "rdf:RDF" === value;\n }\n exports.FeedHandler = FeedHandler;\n var defaultOptions = {\n xmlMode: !0\n };\n exports.parseFeed = function(feed, options) {\n void 0 === options && (options = defaultOptions);\n var handler = new FeedHandler(options);\n return new Parser_1.Parser(handler, options).end(feed), handler.feed;\n };\n}, function(module, exports, __webpack_require__) {\n "use strict";\n function __export(m) {\n for (var p in m) exports.hasOwnProperty(p) || (exports[p] = m[p]);\n }\n Object.defineProperty(exports, "__esModule", {\n value: !0\n }), __export(__webpack_require__(33)), __export(__webpack_require__(37)), __export(__webpack_require__(38)), \n __export(__webpack_require__(21)), __export(__webpack_require__(39)), __export(__webpack_require__(40)), \n __export(__webpack_require__(8));\n}, function(module, exports, __webpack_require__) {\n "use strict";\n var __importDefault = this && this.__importDefault || function(mod) {\n return mod && mod.__esModule ? mod : {\n default: mod\n };\n };\n Object.defineProperty(exports, "__esModule", {\n value: !0\n });\n var entities_json_1 = __importDefault(__webpack_require__(9)), legacy_json_1 = __importDefault(__webpack_require__(15)), xml_json_1 = __importDefault(__webpack_require__(10)), decode_codepoint_1 = __importDefault(__webpack_require__(14));\n function getStrictDecoder(map) {\n var keys = Object.keys(map).join("|"), replace = getReplacer(map), re = new RegExp("&(?:" + (keys += "|#[xX][\\\\da-fA-F]+|#\\\\d+") + ");", "g");\n return function(str) {\n return String(str).replace(re, replace);\n };\n }\n exports.decodeXML = getStrictDecoder(xml_json_1.default), exports.decodeHTMLStrict = getStrictDecoder(entities_json_1.default);\n var sorter = function(a, b) {\n return a < b ? 1 : -1;\n };\n function getReplacer(map) {\n return function(str) {\n return "#" === str.charAt(1) ? "X" === str.charAt(2) || "x" === str.charAt(2) ? decode_codepoint_1.default(parseInt(str.substr(3), 16)) : decode_codepoint_1.default(parseInt(str.substr(2), 10)) : map[str.slice(1, -1)];\n };\n }\n exports.decodeHTML = function() {\n for (var legacy = Object.keys(legacy_json_1.default).sort(sorter), keys = Object.keys(entities_json_1.default).sort(sorter), i = 0, j = 0; i < keys.length; i++) legacy[j] === keys[i] ? (keys[i] += ";?", \n j++) : keys[i] += ";";\n var re = new RegExp("&(?:" + keys.join("|") + "|#[xX][\\\\da-fA-F]+;?|#\\\\d+;?)", "g"), replace = getReplacer(entities_json_1.default);\n function replacer(str) {\n return ";" !== str.substr(-1) && (str += ";"), replace(str);\n }\n return function(str) {\n return String(str).replace(re, replacer);\n };\n }();\n}, function(module, exports, __webpack_require__) {\n "use strict";\n var __importDefault = this && this.__importDefault || function(mod) {\n return mod && mod.__esModule ? mod : {\n default: mod\n };\n };\n Object.defineProperty(exports, "__esModule", {\n value: !0\n });\n var inverseXML = getInverseObj(__importDefault(__webpack_require__(10)).default), xmlReplacer = getInverseReplacer(inverseXML);\n exports.encodeXML = getInverse(inverseXML, xmlReplacer);\n var inverseHTML = getInverseObj(__importDefault(__webpack_require__(9)).default), htmlReplacer = getInverseReplacer(inverseHTML);\n function getInverseObj(obj) {\n return Object.keys(obj).sort().reduce((function(inverse, name) {\n return inverse[obj[name]] = "&" + name + ";", inverse;\n }), {});\n }\n function getInverseReplacer(inverse) {\n var single = [], multiple = [];\n return Object.keys(inverse).forEach((function(k) {\n return 1 === k.length ? single.push("\\\\" + k) : multiple.push(k);\n })), multiple.unshift("[" + single.join("") + "]"), new RegExp(multiple.join("|"), "g");\n }\n exports.encodeHTML = getInverse(inverseHTML, htmlReplacer);\n var reNonASCII = /[^\\0-\\x7F]/g, reAstralSymbols = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n function singleCharReplacer(c) {\n return "&#x" + c.charCodeAt(0).toString(16).toUpperCase() + ";";\n }\n function astralReplacer(c, _) {\n return "&#x" + (1024 * (c.charCodeAt(0) - 55296) + c.charCodeAt(1) - 56320 + 65536).toString(16).toUpperCase() + ";";\n }\n function getInverse(inverse, re) {\n return function(data) {\n return data.replace(re, (function(name) {\n return inverse[name];\n })).replace(reAstralSymbols, astralReplacer).replace(reNonASCII, singleCharReplacer);\n };\n }\n var reXmlChars = getInverseReplacer(inverseXML);\n exports.escape = function(data) {\n return data.replace(reXmlChars, singleCharReplacer).replace(reAstralSymbols, astralReplacer).replace(reNonASCII, singleCharReplacer);\n };\n}, function(module, exports, __webpack_require__) {\n "use strict";\n Object.defineProperty(exports, "__esModule", {\n value: !0\n });\n var tagtypes_1 = __webpack_require__(8);\n function find(test, elems, recurse, limit) {\n for (var result = [], i = 0; i < elems.length; i++) {\n var elem = elems[i];\n if (test(elem) && (result.push(elem), --limit <= 0)) break;\n if (recurse && tagtypes_1.hasChildren(elem) && elem.children.length > 0) {\n var children = find(test, elem.children, recurse, limit);\n if (result = result.concat(children), (limit -= children.length) <= 0) break;\n }\n }\n return result;\n }\n exports.filter = function(test, element, recurse, limit) {\n return void 0 === recurse && (recurse = !0), void 0 === limit && (limit = 1 / 0), \n Array.isArray(element) || (element = [ element ]), find(test, element, recurse, limit);\n }, exports.find = find, exports.findOneChild = function(test, elems) {\n for (var i = 0; i < elems.length; i++) if (test(elems[i])) return elems[i];\n return null;\n }, exports.findOne = function findOne(test, elems, recurse) {\n void 0 === recurse && (recurse = !0);\n for (var elem = null, i = 0; i < elems.length && !elem; i++) {\n var checked = elems[i];\n tagtypes_1.isTag(checked) && (test(checked) ? elem = checked : recurse && checked.children.length > 0 && (elem = findOne(test, checked.children)));\n }\n return elem;\n }, exports.existsOne = function existsOne(test, elems) {\n for (var i = 0; i < elems.length; i++) {\n var checked = elems[i];\n if (tagtypes_1.isTag(checked) && (test(checked) || checked.children.length > 0 && existsOne(test, checked.children))) return !0;\n }\n return !1;\n }, exports.findAll = function(test, rootElems) {\n for (var result = [], stack = rootElems.slice(); stack.length; ) {\n var elem = stack.shift();\n elem && tagtypes_1.isTag(elem) && (elem.children && elem.children.length > 0 && stack.unshift.apply(stack, elem.children), \n test(elem) && result.push(elem));\n }\n return result;\n };\n}, function(module, __webpack_exports__, __webpack_require__) {\n "use strict";\n __webpack_exports__.a = {\n LETTER_PATTERN: "A-Za-z\\\\u00AA\\\\u00B5\\\\u00BA\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0370-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0620-\\\\u064A\\\\u066E\\\\u066F\\\\u0671-\\\\u06D3\\\\u06D5\\\\u06E5\\\\u06E6\\\\u06EE\\\\u06EF\\\\u06FA-\\\\u06FC\\\\u06FF\\\\u0710\\\\u0712-\\\\u072F\\\\u074D-\\\\u07A5\\\\u07B1\\\\u07CA-\\\\u07EA\\\\u07F4\\\\u07F5\\\\u07FA\\\\u0800-\\\\u0815\\\\u081A\\\\u0824\\\\u0828\\\\u0840-\\\\u0858\\\\u08A0-\\\\u08B4\\\\u0904-\\\\u0939\\\\u093D\\\\u0950\\\\u0958-\\\\u0961\\\\u0971-\\\\u0980\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BD\\\\u09CE\\\\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-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABD\\\\u0AD0\\\\u0AE0\\\\u0AE1\\\\u0AF9\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3D\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B61\\\\u0B71\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BD0\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D\\\\u0C58-\\\\u0C5A\\\\u0C60\\\\u0C61\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBD\\\\u0CDE\\\\u0CE0\\\\u0CE1\\\\u0CF1\\\\u0CF2\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D\\\\u0D4E\\\\u0D5F-\\\\u0D61\\\\u0D7A-\\\\u0D7F\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0E01-\\\\u0E30\\\\u0E32\\\\u0E33\\\\u0E40-\\\\u0E46\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB0\\\\u0EB2\\\\u0EB3\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F40-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F88-\\\\u0F8C\\\\u1000-\\\\u102A\\\\u103F\\\\u1050-\\\\u1055\\\\u105A-\\\\u105D\\\\u1061\\\\u1065\\\\u1066\\\\u106E-\\\\u1070\\\\u1075-\\\\u1081\\\\u108E\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F5\\\\u13F8-\\\\u13FD\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16F1-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1711\\\\u1720-\\\\u1731\\\\u1740-\\\\u1751\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1780-\\\\u17B3\\\\u17D7\\\\u17DC\\\\u1820-\\\\u1877\\\\u1880-\\\\u18A8\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1950-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19B0-\\\\u19C9\\\\u1A00-\\\\u1A16\\\\u1A20-\\\\u1A54\\\\u1AA7\\\\u1B05-\\\\u1B33\\\\u1B45-\\\\u1B4B\\\\u1B83-\\\\u1BA0\\\\u1BAE\\\\u1BAF\\\\u1BBA-\\\\u1BE5\\\\u1C00-\\\\u1C23\\\\u1C4D-\\\\u1C4F\\\\u1C5A-\\\\u1C7D\\\\u1CE9-\\\\u1CEC\\\\u1CEE-\\\\u1CF1\\\\u1CF5\\\\u1CF6\\\\u1D00-\\\\u1DBF\\\\u1E00-\\\\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\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2183\\\\u2184\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CEE\\\\u2CF2\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D80-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2E2F\\\\u3005\\\\u3006\\\\u3031-\\\\u3035\\\\u303B\\\\u303C\\\\u3041-\\\\u3096\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FD5\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA61F\\\\uA62A\\\\uA62B\\\\uA640-\\\\uA66E\\\\uA67F-\\\\uA69D\\\\uA6A0-\\\\uA6E5\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA7AD\\\\uA7B0-\\\\uA7B7\\\\uA7F7-\\\\uA801\\\\uA803-\\\\uA805\\\\uA807-\\\\uA80A\\\\uA80C-\\\\uA822\\\\uA840-\\\\uA873\\\\uA882-\\\\uA8B3\\\\uA8F2-\\\\uA8F7\\\\uA8FB\\\\uA8FD\\\\uA90A-\\\\uA925\\\\uA930-\\\\uA946\\\\uA960-\\\\uA97C\\\\uA984-\\\\uA9B2\\\\uA9CF\\\\uA9E0-\\\\uA9E4\\\\uA9E6-\\\\uA9EF\\\\uA9FA-\\\\uA9FE\\\\uAA00-\\\\uAA28\\\\uAA40-\\\\uAA42\\\\uAA44-\\\\uAA4B\\\\uAA60-\\\\uAA76\\\\uAA7A\\\\uAA7E-\\\\uAAAF\\\\uAAB1\\\\uAAB5\\\\uAAB6\\\\uAAB9-\\\\uAABD\\\\uAAC0\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEA\\\\uAAF2-\\\\uAAF4\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB65\\\\uAB70-\\\\uABE2\\\\uAC00-\\\\uD7A3\\\\uD7B0-\\\\uD7C6\\\\uD7CB-\\\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D\\\\uFB1F-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF21-\\\\uFF3A\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC",\n COMMENT_UNDERLAY_FOCUSED_COLOR: "#eaf3ff",\n COMMENT_UNDERLAY_TARGET_COLOR: "#ffedb8",\n COMMENT_UNDERLAY_NEW_COLOR: "#e8ffd1",\n COMMENT_UNDERLAY_OWN_COLOR: "#f7ebff",\n COMMENT_UNDERLAY_SIDE_MARGIN: 5,\n HIGHLIGHT_NEW_COMMENTS_INTERVAL: 15,\n CHECK_FOR_NEW_COMMENTS_INTERVAL: 15,\n BACKGROUND_CHECK_FOR_NEW_COMMENTS_INTERVAL: 60,\n SECONDS_IN_A_DAY: 86400,\n MILLISECONDS_IN_A_MINUTE: 6e4,\n POPULAR_NOT_INLINE_ELEMENTS: [ "BLOCKQUOTE", "DD", "DIV", "DL", "FORM", "H2", "H3", "H4", "H5", "H6", "HR", "INPUT", "LI", "OL", "P", "PRE", "TABLE", "TBODY", "TR", "TH", "TD", "UL" ],\n POPULAR_INLINE_ELEMENTS: [ "A", "ABBR", "B", "BIG", "BR", "CITE", "CODE", "EM", "FONT", "I", "IMG", "KBD", "S", "SMALL", "SPAN", "STRIKE", "STRONG", "SUB", "SUP", "TT", "U", "VAR" ],\n UNHIGHLIGHTABLE_ELEMENTS_CLASSES: [ "mw-empty-elt", "tleft", "tright", "floatleft", "floatright" ],\n BAD_COMMENT_BEGINNINGS: [ /^\x3c!--[^]*?--\x3e *\\n*/, /^(?:----+|<hr>) *\\n*/, /^\\{\\|.*?\\|\\} *\\n*(?=[*:#])/ ],\n FLOATING_ELEMENTS_SELECTORS: [ ".cd-floating", ".tright", ".floatright", \'*[style*="float:right"]\', \'*[style*="float: right"]\', \'*[style*="float:left"]\', \'*[style*="float: left"]\' ],\n SIGN_CODE: "~~".concat("~~")\n };\n}, function(module, __webpack_exports__, __webpack_require__) {\n "use strict";\n __webpack_exports__.a = {\n init() {\n this.timerTotal = {}, this.timerStartTimestamps = {}, this.timerRunCount = {}, this.timerAllRunsTotal = {}, \n this.initCounters(), this.array = [], this.object = {};\n },\n initCounters() {\n this.counters = "undefined" == typeof Proxy ? {} : new Proxy({}, {\n get: (obj, prop) => prop in obj ? obj[prop] : 0\n });\n },\n startTimer(label) {\n this.timerStartTimestamps[label] = Date.now();\n },\n stopTimer(label) {\n if (void 0 === this.timerStartTimestamps[label]) return;\n void 0 === this.timerTotal[label] && (this.timerTotal[label] = 0);\n const thisTime = Date.now() - this.timerStartTimestamps[label];\n this.timerTotal[label] += thisTime, delete this.timerStartTimestamps[label], void 0 === this.timerAllRunsTotal[label] && (this.timerAllRunsTotal[label] = 0, \n this.timerRunCount[label] = 0), this.timerAllRunsTotal[label] += thisTime, this.timerRunCount[label]++;\n },\n resetTimer(label) {\n void 0 !== this.timerStartTimestamps[label] && this.stopTimer(label), delete this.timerTotal[label];\n },\n fullResetTimer(label) {\n this.resetTimer(label), delete this.timerAllRunsTotal[label], delete this.timerRunCount[label];\n },\n logAndResetTimer(label) {\n void 0 !== this.timerStartTimestamps[label] && this.stopTimer(label), void 0 !== this.timerTotal[label] && (console.debug("".concat(label, ": ").concat(this.timerTotal[label])), \n this.resetTimer(label));\n },\n logAndResetEverything(sort) {\n const timerLabels = Object.keys(this.timerTotal);\n sort && timerLabels.sort(), timerLabels.forEach(label => {\n this.logAndResetTimer(label);\n });\n const counterLabels = Object.keys(this.counters);\n sort && counterLabels.sort(), counterLabels.forEach(label => {\n console.debug("counter ".concat(label, ": ").concat(this.counters[label]));\n }), this.initCounters(), this.array.length && (console.debug("array: ", this.array), \n this.array = []), Object.keys(this.object).length && (console.debug("object: ", this.object), \n this.object = {});\n },\n averageTimerTime(label) {\n if (!this.timerAllRunsTotal[label]) return void console.error("No data for timer ".concat(label));\n const average = this.timerAllRunsTotal[label] / this.timerRunCount[label];\n console.debug("".concat(label, ": ").concat(average.toFixed(1), " average for ").concat(this.timerRunCount[label], " runs"));\n },\n incrementCounter(label) {\n this.counters[label]++;\n }\n };\n}, function(module, __webpack_exports__, __webpack_require__) {\n "use strict";\n __webpack_require__.d(__webpack_exports__, "a", (function() {\n return CommentSkeleton;\n }));\n var _babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2), _babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0___default = __webpack_require__.n(_babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0__), _babel_runtime_helpers_classPrivateFieldSet__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7), _babel_runtime_helpers_classPrivateFieldSet__WEBPACK_IMPORTED_MODULE_1___default = __webpack_require__.n(_babel_runtime_helpers_classPrivateFieldSet__WEBPACK_IMPORTED_MODULE_1__), _CdError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3), _cd__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(0);\n class CommentSkeleton {\n constructor(parser, signature) {\n _parser.set(this, {\n writable: !0,\n value: void 0\n }), _cachedSection.set(this, {\n writable: !0,\n value: void 0\n }), _babel_runtime_helpers_classPrivateFieldSet__WEBPACK_IMPORTED_MODULE_1___default()(this, _parser, parser);\n let parts = _babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0___default()(this, _parser).collectParts(signature.element);\n parts = _babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0___default()(this, _parser).removeNestedParts(parts), \n parts = _babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0___default()(this, _parser).encloseInlineParts(parts, signature.element), \n parts = _babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0___default()(this, _parser).filterParts(parts), \n parts.reverse(), parts = _babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0___default()(this, _parser).replaceListsWithItems(parts, signature.element), \n this.id = _cd__WEBPACK_IMPORTED_MODULE_3__.a.comments.length, this.date = signature.date || null, \n this.timestamp = signature.timestampText, this.authorName = signature.authorName, \n this.own = this.authorName === _cd__WEBPACK_IMPORTED_MODULE_3__.a.g.CURRENT_USER_NAME, \n this.anchor = signature.anchor, this.unsigned = signature.unsigned, this.parts = parts, \n this.elements = this.parts.map(part => part.node);\n if (this.highlightables = this.elements.filter(el => !/^H[1-6]$/.test(el.tagName) && !_cd__WEBPACK_IMPORTED_MODULE_3__.a.g.UNHIGHLIGHTABLE_ELEMENTS_CLASSES.some(name => el.classList.contains(name)) && !/float: *(?:left|right)/.test(el.getAttribute("style"))), \n !this.highlightables.length) throw new _CdError__WEBPACK_IMPORTED_MODULE_2__.a;\n if (this.addAttributes(), this.setLevels(), this.parts[0].isHeading ? (this.followsHeading = !0, \n 0 !== this.level && (this.parts.splice(0, 1), this.elements.splice(0, 1))) : this.followsHeading = !0, \n this.parts[0].isHeading) {\n this.isOpeningSection = !0;\n const headingLevelMatch = this.parts[0].node.tagName.match(/^H([1-6])$/);\n this.openingSectionOfLevel = headingLevelMatch && Number(headingLevelMatch[1]);\n } else this.isOpeningSection = !1;\n }\n addAttributes() {\n this.anchor && !this.elements[0].getAttribute("id") && this.elements[0].setAttribute("id", this.anchor), \n this.elements[0].classList.add("cd-commentPart-first"), this.elements[this.elements.length - 1].classList.add("cd-commentPart-last"), \n this.elements.forEach(el => {\n el.classList.add("cd-commentPart"), el.setAttribute("data-comment-id", String(this.id));\n });\n }\n setLevels() {\n const levelElements = {};\n levelElements.top = _babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0___default()(this, _parser).getLevelsUpTree(this.highlightables[0]), \n levelElements.bottom = this.highlightables.length > 1 ? _babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0___default()(this, _parser).getLevelsUpTree(this.highlightables[this.highlightables.length - 1]) : levelElements.top, \n this.level = Math.min(levelElements.top.length, levelElements.bottom.length);\n for (let i = 0; i < this.level; i++) levelElements.top[i] && levelElements.top[i].classList.add("cd-commentLevel", "cd-commentLevel-".concat(i + 1)), \n levelElements.bottom[i] && levelElements.bottom[i] !== levelElements.top[i] && levelElements.bottom[i].classList.add("cd-commentLevel", "cd-commentLevel-".concat(i + 1));\n }\n getSection() {\n return _cd__WEBPACK_IMPORTED_MODULE_3__.a.sections.slice().reverse().find(section => section.comments.includes(this)) || null;\n }\n get section() {\n return void 0 === _babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0___default()(this, _cachedSection) && _babel_runtime_helpers_classPrivateFieldSet__WEBPACK_IMPORTED_MODULE_1___default()(this, _cachedSection, this.getSection()), \n _babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0___default()(this, _cachedSection);\n }\n get sourcePage() {\n return this.section ? this.section.sourcePage : _cd__WEBPACK_IMPORTED_MODULE_3__.a.g.CURRENT_PAGE;\n }\n }\n var _parser = new WeakMap, _cachedSection = new WeakMap;\n}, function(module, __webpack_exports__, __webpack_require__) {\n "use strict";\n __webpack_require__.d(__webpack_exports__, "a", (function() {\n return SectionSkeleton;\n }));\n var _babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2), _babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0___default = __webpack_require__.n(_babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0__), _babel_runtime_helpers_classPrivateFieldSet__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7), _babel_runtime_helpers_classPrivateFieldSet__WEBPACK_IMPORTED_MODULE_1___default = __webpack_require__.n(_babel_runtime_helpers_classPrivateFieldSet__WEBPACK_IMPORTED_MODULE_1__), _CdError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3), _cd__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(0), _treeWalker__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(6);\n class SectionSkeleton {\n constructor(parser, headingElement) {\n if (_parser.set(this, {\n writable: !0,\n value: void 0\n }), _babel_runtime_helpers_classPrivateFieldSet__WEBPACK_IMPORTED_MODULE_1___default()(this, _parser, parser), \n this.headlineElement = _babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0___default()(this, _parser).context.getElementByClassName(headingElement, "mw-headline"), \n !this.headlineElement) throw new _CdError__WEBPACK_IMPORTED_MODULE_2__.a;\n this.anchor = this.headlineElement.getAttribute("id");\n const classesToFilter = [ "mw-headline-number", ..._cd__WEBPACK_IMPORTED_MODULE_3__.a.config.foreignElementsInHeadlinesClasses ], nodes = Array.from(this.headlineElement.childNodes).filter(node => node.nodeType !== Node.ELEMENT_NODE || !Array.from(node.classList).some(name => classesToFilter.includes(name)));\n this.headline = nodes.map(node => node.textContent).join("").trim();\n const levelMatch = headingElement.tagName.match(/^H([2-6])$/);\n this.level = levelMatch && Number(levelMatch[1]);\n const treeWalker = new _treeWalker__WEBPACK_IMPORTED_MODULE_4__.c(_cd__WEBPACK_IMPORTED_MODULE_3__.a.g.rootElement, node => ![ "STYLE", "LINK" ].includes(node.tagName) && !node.classList.contains("cd-sectionButtonContainer"), !0, headingElement), elements = [ headingElement ], levelRegexp = new RegExp("^H[1-".concat(this.level, "]$"));\n let firstCommentPart, lastCommentPart, hasSubsections = !1;\n for (;treeWalker.nextSibling() && !levelRegexp.test(treeWalker.currentNode.tagName); ) void 0 === this.lastElementInFirstChunk && /^H[3-6]$/.test(treeWalker.currentNode.tagName) && (hasSubsections = !0, \n this.lastElementInFirstChunk = elements[elements.length - 1]), elements.push(treeWalker.currentNode);\n if (this.lastElementInFirstChunk = this.lastElementInFirstChunk || elements[elements.length - 1], \n !elements.length) throw new _CdError__WEBPACK_IMPORTED_MODULE_2__.a;\n if (elements[1]) {\n for (treeWalker.currentNode = elements[elements.length - 1]; treeWalker.lastChild(); ) ;\n const lastNode = treeWalker.currentNode;\n treeWalker.currentNode = elements[1];\n do {\n treeWalker.currentNode.classList.contains("cd-commentPart") && (firstCommentPart = treeWalker.currentNode);\n } while (!firstCommentPart && treeWalker.currentNode !== lastNode && treeWalker.nextNode());\n treeWalker.currentNode = lastNode;\n do {\n treeWalker.currentNode.classList.contains("cd-commentPart") && (lastCommentPart = treeWalker.currentNode);\n } while (!lastCommentPart && treeWalker.currentNode !== elements[1] && treeWalker.previousNode());\n }\n if (firstCommentPart) {\n const firstCommentPartId = Number(firstCommentPart.getAttribute("data-comment-id")), lastCommentPartId = Number(lastCommentPart.getAttribute("data-comment-id"));\n if (this.comments = _cd__WEBPACK_IMPORTED_MODULE_3__.a.comments.slice(firstCommentPartId, lastCommentPartId + 1), \n hasSubsections) {\n const endIndex = this.comments.findIndex(comment => !(_babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0___default()(this, _parser).context.follows(this.lastElementInFirstChunk, comment.elements[0]) || this.lastElementInFirstChunk.contains(comment.elements[0])));\n this.commentsInFirstChunk = this.comments.slice(0, endIndex || 0);\n }\n }\n this.id = _cd__WEBPACK_IMPORTED_MODULE_3__.a.sections.length, this.comments = this.comments || [], \n this.commentsInFirstChunk = this.commentsInFirstChunk || this.comments, this.elements = elements;\n }\n }\n var _parser = new WeakMap;\n}, function(module, exports, __webpack_require__) {\n "use strict";\n module.exports = function(string, quoteStyle) {\n var getHtmlTranslationTable = __webpack_require__(44), tmpStr = "", entity = "", symbol = "";\n tmpStr = string.toString();\n var hashMap = getHtmlTranslationTable("HTML_ENTITIES", quoteStyle);\n if (!1 === hashMap) return !1;\n for (symbol in delete hashMap["&"], hashMap["&"] = "&", hashMap) entity = hashMap[symbol], \n tmpStr = tmpStr.split(entity).join(symbol);\n return tmpStr = tmpStr.split("'").join("\'");\n };\n}, function(module, __webpack_exports__, __webpack_require__) {\n "use strict";\n __webpack_require__.d(__webpack_exports__, "a", (function() {\n return Parser;\n }));\n var _cd__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0), _treeWalker__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6), _util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(1), _timestamp__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(4);\n function getUserNameFromLink(element) {\n const href = element.getAttribute("href");\n if (!href) return null;\n const pageName = function(url) {\n if ("undefined" == typeof mw || "/wiki/$1" === mw.config.get("wgArticlePath") && "/w/index.php" === mw.config.get("wgScript")) {\n url = url.replace(/^(?:https?:)?\\/\\/[^/]+/, "").replace(/^\\/wiki\\//, "").replace(/^\\/w\\/index.php\\?title=/, "").replace(/&action=edit.*/, "").replace(/#.*/, "").replace(/_/g, " ");\n try {\n url = decodeURIComponent(url);\n } catch (e) {\n return null;\n }\n return url;\n }\n {\n const uri = new mw.Uri(url), match = uri.path.match(_cd__WEBPACK_IMPORTED_MODULE_0__.a.g.ARTICLE_PATH_REGEXP);\n if (match) try {\n return decodeURIComponent(match[1]);\n } catch (e) {\n return null;\n }\n return uri.query.title ? uri.query.title : null;\n }\n }(href);\n if (!pageName) return null;\n let userName;\n const match = pageName.match(_cd__WEBPACK_IMPORTED_MODULE_0__.a.g.USER_NAMESPACES_REGEXP);\n return match ? userName = match[1] : pageName.startsWith(_cd__WEBPACK_IMPORTED_MODULE_0__.a.g.CONTRIBS_PAGE + "/") && (userName = pageName.replace(_cd__WEBPACK_IMPORTED_MODULE_0__.a.g.CONTRIBS_PAGE_LINK_REGEXP, "")), \n userName && Object(_util__WEBPACK_IMPORTED_MODULE_2__.b)(Object(_util__WEBPACK_IMPORTED_MODULE_2__.g)(userName.replace(/\\/.*/, ""))).trim();\n }\n class Parser {\n constructor(context) {\n this.context = context;\n }\n createComment(signature) {\n return new this.context.CommentClass(this, signature);\n }\n createSection(headingElement, watchedSectionsRequest) {\n return new this.context.SectionClass(this, headingElement, watchedSectionsRequest);\n }\n findTimestamps() {\n const blocksToExclude = [ ...Array.from(_cd__WEBPACK_IMPORTED_MODULE_0__.a.g.rootElement.getElementsByTagName("blockquote")), ...Object(_util__WEBPACK_IMPORTED_MODULE_2__.c)(_cd__WEBPACK_IMPORTED_MODULE_0__.a.config.elementsToExcludeClasses.map(className => Array.from(_cd__WEBPACK_IMPORTED_MODULE_0__.a.g.rootElement.getElementsByClassName(className)))) ];\n return this.context.getAllTextNodes().map(node => {\n const text = node.textContent, {date: date, match: match} = Object(_timestamp__WEBPACK_IMPORTED_MODULE_3__.b)(text) || {};\n if (date && !blocksToExclude.some(block => block.contains(node))) return {\n node: node,\n date: date,\n match: match\n };\n }).filter(_util__WEBPACK_IMPORTED_MODULE_2__.a).map(finding => {\n const {node: node, match: match, date: date} = finding, element = this.context.document.createElement("span");\n element.classList.add("cd-timestamp");\n const textNode = this.context.document.createTextNode(match[2]);\n element.appendChild(textNode);\n const remainedText = node.textContent.slice(match.index + match[0].length);\n let afterNode;\n return remainedText && (afterNode = this.context.document.createTextNode(remainedText)), \n node.textContent = node.textContent.slice(0, match.index + match[1].length), node.parentNode.insertBefore(element, node.nextSibling), \n afterNode && node.parentNode.insertBefore(afterNode, element.nextSibling), {\n element: element,\n date: date\n };\n });\n }\n findSignatures(timestamps) {\n const signatures = timestamps.map(timestamp => {\n const date = timestamp.date, timestampElement = timestamp.element, timestampText = timestamp.element.textContent;\n let unsignedElement, closestNotInlineAncestor;\n for (let el = timestamp.element; !closestNotInlineAncestor; el = el.parentNode) Object(_util__WEBPACK_IMPORTED_MODULE_2__.e)(el) ? el.classList.contains(_cd__WEBPACK_IMPORTED_MODULE_0__.a.config.unsignedClass) && (unsignedElement = el) : closestNotInlineAncestor = el;\n const unsigned = Boolean(unsignedElement);\n if (closestNotInlineAncestor) {\n const cniaChildren = Array.from(closestNotInlineAncestor[this.context.childElementsProperty]), treeWalker = new _treeWalker__WEBPACK_IMPORTED_MODULE_1__.b(timestamp.element);\n let found = !1;\n for (;!found && treeWalker.nextNode() && closestNotInlineAncestor.contains(treeWalker.currentNode) && (!cniaChildren.includes(treeWalker.currentNode) || Object(_util__WEBPACK_IMPORTED_MODULE_2__.e)(treeWalker.currentNode)); ) treeWalker.currentNode.classList.contains("cd-timestamp") && (found = !0);\n if (found) return;\n }\n const startElement = unsignedElement || timestamp.element, treeWalker = new _treeWalker__WEBPACK_IMPORTED_MODULE_1__.a(startElement);\n let authorName, firstSignatureElement, length = 0;\n const signatureNodes = [];\n unsignedElement ? firstSignatureElement = startElement : (signatureNodes.push(startElement), \n treeWalker.previousSibling());\n do {\n const node = treeWalker.currentNode;\n if (length += node.textContent.length, node.nodeType === Node.ELEMENT_NODE) {\n if (node.classList.contains("cd-timestamp")) break;\n let hasAuthorLinks = !1;\n if ("A" === node.tagName) {\n const userName = getUserNameFromLink(node);\n userName && (authorName || (authorName = userName), authorName === userName && (hasAuthorLinks = !0));\n } else {\n Array.from(node.getElementsByTagName("a")).some(link => {\n const userName = getUserNameFromLink(link);\n if (userName && (authorName || (authorName = userName), authorName === userName)) return hasAuthorLinks = !0, \n !0;\n });\n }\n hasAuthorLinks && (firstSignatureElement = node);\n }\n signatureNodes.push(node);\n } while (treeWalker.previousSibling() && length < _cd__WEBPACK_IMPORTED_MODULE_0__.a.config.signatureScanLimit);\n const firstSignatureElementIndex = signatureNodes.indexOf(firstSignatureElement);\n signatureNodes.splice(-1 === firstSignatureElementIndex ? 1 : firstSignatureElementIndex + 1);\n const anchor = Object(_timestamp__WEBPACK_IMPORTED_MODULE_3__.a)(timestamp.date, authorName, !0);\n Object(_timestamp__WEBPACK_IMPORTED_MODULE_3__.c)(anchor);\n const signatureContainer = startElement.parentNode, startElementNextSibling = startElement.nextSibling, element = this.context.document.createElement("span");\n if (element.classList.add("cd-signature"), signatureNodes.reverse().forEach(node => {\n element.appendChild(node);\n }), signatureContainer.insertBefore(element, startElementNextSibling), authorName) return {\n element: element,\n timestampElement: timestampElement,\n timestampText: timestampText,\n date: date,\n authorName: authorName,\n anchor: anchor,\n unsigned: unsigned\n };\n }).filter(_util__WEBPACK_IMPORTED_MODULE_2__.a);\n return _cd__WEBPACK_IMPORTED_MODULE_0__.a.config.unsignedClass && Array.from(_cd__WEBPACK_IMPORTED_MODULE_0__.a.g.rootElement.getElementsByClassName(_cd__WEBPACK_IMPORTED_MODULE_0__.a.config.unsignedClass)).forEach(element => {\n if (!this.context.getElementByClassName(element, "cd-timestamp")) {\n Array.from(element.getElementsByTagName("a")).some(link => {\n const authorName = getUserNameFromLink(link);\n if (authorName) {\n element.classList.add("cd-signature");\n const unsigned = !0;\n return signatures.push({\n element: element,\n authorName: authorName,\n unsigned: unsigned\n }), !0;\n }\n });\n }\n }), signatures.sort((sig1, sig2) => this.context.follows(sig1.element, sig2.element) ? 1 : -1), \n signatures;\n }\n collectParts(signatureElement) {\n const treeWalker = new _treeWalker__WEBPACK_IMPORTED_MODULE_1__.a(signatureElement);\n let firstForeignComponentAfter, parts = [];\n for (;!firstForeignComponentAfter; ) {\n for (;!treeWalker.currentNode.nextSibling && treeWalker.parentNode(); ) ;\n if (!treeWalker.nextSibling()) break;\n Object(_util__WEBPACK_IMPORTED_MODULE_2__.e)(treeWalker.currentNode, !0) || (firstForeignComponentAfter = treeWalker.currentNode);\n }\n if (firstForeignComponentAfter && signatureElement.parentNode.contains(firstForeignComponentAfter)) {\n for (treeWalker.currentNode = signatureElement; treeWalker.nextSibling() && Object(_util__WEBPACK_IMPORTED_MODULE_2__.e)(treeWalker.currentNode, !0); ) parts.push({\n node: treeWalker.currentNode,\n isTextNode: treeWalker.currentNode.nodeType === Node.TEXT_NODE,\n isHeading: !1,\n hasCurrentSignature: !1,\n hasForeignComponents: !1,\n lastStep: "start"\n });\n parts.reverse(), treeWalker.currentNode = signatureElement;\n } else treeWalker.currentNode = signatureElement.parentNode;\n parts.push({\n node: treeWalker.currentNode,\n isTextNode: !1,\n isHeading: !1,\n hasCurrentSignature: !0,\n hasForeignComponents: !1,\n lastStep: "start"\n });\n const timezoneRegexp = new RegExp(_cd__WEBPACK_IMPORTED_MODULE_0__.a.g.TIMEZONE_REGEXP.source + "\\\\s*$");\n for (let i = 0; i < 500; i++) {\n let lastStep;\n const previousPart = parts[parts.length - 1];\n if (!previousPart.isTextNode && !previousPart.hasCurrentSignature) {\n const text = previousPart.node.textContent;\n if (timezoneRegexp.test(text) || _cd__WEBPACK_IMPORTED_MODULE_0__.a.config.signatureEndingRegexp && _cd__WEBPACK_IMPORTED_MODULE_0__.a.config.signatureEndingRegexp.test(text)) {\n previousPart.hasForeignComponents = !0;\n break;\n }\n }\n if (!previousPart.hasCurrentSignature && previousPart.hasForeignComponents) {\n let previousNode, dived = !1;\n for (;(previousNode = treeWalker.currentNode) && treeWalker.lastChild(); ) {\n if (Object(_util__WEBPACK_IMPORTED_MODULE_2__.e)(treeWalker.currentNode, !0)) {\n treeWalker.currentNode = previousNode;\n break;\n }\n dived = !0;\n }\n if (!dived) break;\n lastStep = "dive";\n } else if (treeWalker.previousSibling()) lastStep = "back"; else {\n if (!treeWalker.parentNode()) break;\n lastStep = "up";\n }\n const node = treeWalker.currentNode, isTextNode = node.nodeType === Node.TEXT_NODE;\n if ("back" === lastStep && [ "OL", "UL" ].includes(previousPart.node.tagName) && !([ "DL", "OL", "UL" ].includes(node.tagName) || isTextNode && node.previousSibling && [ "DL", "OL", "UL" ].includes(node.previousSibling.tagName)) && previousPart.node[this.context.childElementsProperty].length && previousPart.node[this.context.childElementsProperty][0].contains(signatureElement)) break;\n let isHeading = null, hasCurrentSignature = null, hasForeignComponents = null;\n if (!isTextNode) {\n if (node.classList.contains("cd-commentPart") || "toc" === node.getAttribute("id") || "TD" === node.tagName || "HR" === node.tagName && node.previousElementSibling && this.context.getElementByClassName(node.previousElementSibling, "cd-signature") || _cd__WEBPACK_IMPORTED_MODULE_0__.a.config.customForeignComponentChecker && _cd__WEBPACK_IMPORTED_MODULE_0__.a.config.customForeignComponentChecker(node, this.context)) break;\n isHeading = /^H[1-6]$/.test(node.tagName), hasCurrentSignature = node.contains(signatureElement), \n hasForeignComponents = node.getElementsByClassName("cd-signature", Number(hasCurrentSignature) + 1).length - Number(hasCurrentSignature) > 0 || firstForeignComponentAfter && node.contains(firstForeignComponentAfter);\n }\n if (parts.push({\n node: node,\n isTextNode: isTextNode,\n isHeading: isHeading,\n hasCurrentSignature: hasCurrentSignature,\n hasForeignComponents: hasForeignComponents,\n lastStep: lastStep\n }), isHeading) break;\n }\n return parts;\n }\n removeNestedParts(parts) {\n for (let i = parts.length - 1; i >= 0; i--) {\n const part = parts[i];\n if ("up" === part.lastStep && !part.hasForeignComponents) {\n let nextDiveElementIndex = 0;\n for (let j = i - 1; j > 0; j--) if ("dive" === parts[j].lastStep) {\n nextDiveElementIndex = j;\n break;\n }\n parts.splice(nextDiveElementIndex, i - nextDiveElementIndex), i = nextDiveElementIndex;\n }\n }\n return parts;\n }\n encloseInlineParts(parts, signatureElement) {\n const sequencesToBeEnclosed = [];\n let start = null, encloseThis = !1;\n for (let i = 0; i <= parts.length; i++) {\n const part = parts[i];\n if (!part || null !== start && ![ "back", "start" ].includes(part.lastStep) || part.hasForeignComponents || part.isHeading) {\n if (null !== start) {\n if (encloseThis) {\n const end = i - 1;\n sequencesToBeEnclosed.push({\n start: start,\n end: end\n });\n }\n start = null, encloseThis = !1;\n }\n } else {\n if (null === start) {\n if (Object(_util__WEBPACK_IMPORTED_MODULE_2__.e)(part.node.parentNode)) {\n for (let j = i + 1; j < parts.length; j++) "up" !== parts[j].lastStep || (i = j - 1);\n break;\n }\n start = i;\n }\n !encloseThis && (part.isTextNode && part.node.textContent.trim() || Object(_util__WEBPACK_IMPORTED_MODULE_2__.e)(part.node)) && (encloseThis = !0);\n }\n }\n for (let i = sequencesToBeEnclosed.length - 1; i >= 0; i--) {\n const sequence = sequencesToBeEnclosed[i], wrapper = this.context.document.createElement("div"), nextSibling = parts[sequence.start].node.nextSibling, parent = parts[sequence.start].node.parentNode;\n for (let j = sequence.end; j >= sequence.start; j--) wrapper.appendChild(parts[j].node);\n parent.insertBefore(wrapper, nextSibling);\n const newNode = {\n node: wrapper,\n isTextNode: !1,\n isHeading: !1,\n hasCurrentSignature: wrapper.contains(signatureElement),\n hasForeignComponents: !1,\n lastStep: "replaced"\n };\n parts.splice(sequence.start, sequence.end - sequence.start + 1, newNode);\n }\n return parts;\n }\n filterParts(parts) {\n for (let i = (parts = parts.filter(part => !part.hasForeignComponents && !part.isTextNode)).length - 1; i > 0; i--) {\n const part = parts[i];\n if ("P" !== part.node.tagName || part.node.textContent.trim()) break;\n parts.splice(i, 1);\n }\n return parts;\n }\n replaceListsWithItems(parts, signatureElement) {\n const lastPart = parts[parts.length - 1];\n for (let i = parts.length - 1; i >= 0; i--) {\n const part = parts[i];\n if ([ "UL", "DL", "OL", "LI", "DD" ].includes(part.node.tagName) && ("up" === part.lastStep && (!parts[i - 1] || "back" !== parts[i - 1].lastStep) || ("DD" === lastPart.node.tagName || "DD" === lastPart.node.parentNode.tagName || "DL" === lastPart.node.tagName) && !parts.slice(i + 1).some(part => "P" === part.node.tagName))) {\n const partTextNoSpaces = part.node.textContent.replace(/\\s+/g, "");\n let children, current = [ part.node ];\n do {\n children = current.reduce((arr, element) => arr.concat(Array.from(element[this.context.childElementsProperty])), []);\n } while (children.length && children.every(child => [ "UL", "DL", "OL", "LI", "DD" ].includes(child.tagName)) && children.map(child => child.textContent).join("").replace(/\\s+/g, "") === partTextNoSpaces && (current = children));\n if (current.length > 1) {\n const newParts = current.map(el => ({\n node: el,\n isTextNode: !1,\n hasCurrentSignature: el.contains(signatureElement),\n hasForeignComponents: !1,\n lastStep: "replaced"\n }));\n parts.splice(i, 1, ...newParts);\n } else current[0] !== part.node && Object.assign(part, {\n node: current[0],\n lastStep: "replaced"\n });\n }\n }\n return parts;\n }\n getLevelsUpTree(initialElement) {\n const levelElements = [], treeWalker = new _treeWalker__WEBPACK_IMPORTED_MODULE_1__.b(initialElement);\n for (;treeWalker.parentNode(); ) {\n const el = treeWalker.currentNode;\n if ([ "UL", "DL", "OL" ].includes(el.tagName)) {\n if (el.classList.contains("cd-commentLevel")) {\n const match = el.getAttribute("class").match(/cd-commentLevel-(\\d+)/);\n return match && levelElements.unshift(...Array(Number(match[1]))), levelElements;\n }\n levelElements.unshift(el);\n }\n }\n return levelElements;\n }\n findHeadings() {\n const headings = [ ..._cd__WEBPACK_IMPORTED_MODULE_0__.a.g.rootElement.getElementsByTagName("h2"), ..._cd__WEBPACK_IMPORTED_MODULE_0__.a.g.rootElement.getElementsByTagName("h3"), ..._cd__WEBPACK_IMPORTED_MODULE_0__.a.g.rootElement.getElementsByTagName("h4"), ..._cd__WEBPACK_IMPORTED_MODULE_0__.a.g.rootElement.getElementsByTagName("h5"), ..._cd__WEBPACK_IMPORTED_MODULE_0__.a.g.rootElement.getElementsByTagName("h6") ];\n return headings.sort((heading1, heading2) => this.context.follows(heading1, heading2) ? 1 : -1), \n headings;\n }\n }\n}, function(module, __webpack_exports__, __webpack_require__) {\n "use strict";\n __webpack_require__.d(__webpack_exports__, "a", (function() {\n return getAllTextNodes;\n }));\n var lib = __webpack_require__(5), cd = __webpack_require__(0), html_entity_decode = __webpack_require__(26), html_entity_decode_default = __webpack_require__.n(html_entity_decode);\n __webpack_require__(7), __webpack_require__(2), __webpack_require__(1);\n new WeakMap, __webpack_require__(4);\n function decodeHtmlEntities(s) {\n if (-1 === s.indexOf("&")) return s;\n {\n let result = s;\n return -1 !== result.indexOf("&amp;") && (result = result.replace(/&amp;/g, "&amp;")), \n result = -1 === result.indexOf("&#") ? result : result.replace(/&#(\\d+);/g, (s, m1) => String.fromCharCode(m1)), \n -1 === result.indexOf("&") ? result : html_entity_decode_default()(result);\n }\n }\n function walkThroughSubtree(base, callback, checkSelf) {\n if (checkSelf && callback(base)) return !0;\n for (let n = base.firstChild; n; n = n.nextSibling) if (walkThroughSubtree(n, callback, !0)) return !0;\n }\n function getAllTextNodes() {\n let nodes = [];\n return walkThroughSubtree(cd.a.g.rootElement, node => {\n node.nodeType === Node.TEXT_NODE && nodes.push(node);\n }), nodes;\n }\n self.Node = {\n TEXT_NODE: 3,\n ELEMENT_NODE: 1\n };\n const dummyDom = Object(lib.parseDOM)("<a>a</a>"), Element = dummyDom[0].constructor, DataNode = dummyDom[0].childNodes[0].constructor, NodeConstructor = Object.getPrototypeOf(DataNode);\n Object.defineProperty(Element.prototype, "childElements", {\n get: function() {\n return this.childNodes.filter(node => node.nodeType === Node.ELEMENT_NODE);\n }\n }), Object.defineProperty(Element.prototype, "previousElementSibling", {\n get: function() {\n for (let n = this.previousSibling; n; n = n.previousSibling) if (n.nodeType === Node.ELEMENT_NODE) return n;\n return null;\n }\n }), Object.defineProperty(Element.prototype, "nextElementSibling", {\n get: function() {\n for (let n = this.nextSibling; n; n = n.nextSibling) if (n.nodeType === Node.ELEMENT_NODE) return n;\n return null;\n }\n }), Object.defineProperty(Element.prototype, "firstElementChild", {\n get: function() {\n let n;\n for (n = this.firstChild; n && n.nodeType !== Node.ELEMENT_NODE; n = n.nextSibling) ;\n return n || null;\n }\n }), Object.defineProperty(Element.prototype, "lastElementChild", {\n get: function() {\n let n;\n for (n = this.lastChild; n && n.nodeType !== Node.ELEMENT_NODE; n = n.previousSibling) ;\n return n || null;\n }\n }), Object.defineProperty(Element.prototype, "textContent", {\n get: function() {\n cd.a.debug.startTimer("textContent");\n let returnValue = "";\n return this.childNodes.forEach(node => {\n returnValue += node.textContent;\n }), cd.a.debug.stopTimer("textContent"), returnValue;\n }\n }), Object.defineProperty(Element.prototype, "outerHTML", {\n get: function() {\n return lib.DomUtils.getOuterHTML(this);\n }\n }), Element.prototype.getAttribute = function(name) {\n let value = this.attribs[name];\n return value && "string" == typeof value && -1 !== value.indexOf("&") && (value = value.replace(/&/g, "&").replace(/"/g, \'"\')), \n value;\n }, Element.prototype.setAttribute = function(name, value) {\n value && "string" == typeof value && (-1 !== value.indexOf("&") && (value = value.replace(/&/g, "&")), \n -1 !== value.indexOf(\'"\') && (value = value.replace(/"/g, """))), this.attribs[name] = value || "";\n }, Element.prototype.appendChild = function(node) {\n cd.a.debug.startTimer("appendChild"), node.parentNode && node.remove(), lib.DomUtils.appendChild(this, node), \n cd.a.debug.stopTimer("appendChild");\n }, Element.prototype.insertBefore = function(node, referenceNode) {\n cd.a.debug.startTimer("insertBefore"), referenceNode ? (node.parentNode && node.remove(), \n lib.DomUtils.prepend(referenceNode, node)) : this.appendChild(node), cd.a.debug.stopTimer("insertBefore");\n }, Element.prototype.removeChild = function(node) {\n node.parentNode === this && lib.DomUtils.removeElement(node);\n }, Element.prototype.contains = function(node) {\n if (cd.a.debug.startTimer("contains"), node === this) return !0;\n if (!this.childNodes.length) return !1;\n for (let n = node; n; n = n.parentNode) if (n === this) return !0;\n return cd.a.debug.stopTimer("contains"), !1;\n }, Element.prototype.follows = function(node) {\n if (cd.a.debug.startTimer("follows"), this.startIndex && node.startIndex) return this.startIndex > node.startIndex;\n if (this === node) return !1;\n const thisTree = [], nodeTree = [];\n let sharedParent, thisSharedParentChild, nodeSharedParentChild;\n for (let current = this; current; current = current.parentNode) {\n if (current === node) return !0;\n thisTree.unshift(current);\n }\n for (let current = node; current; current = current.parentNode) if (nodeTree.unshift(current), \n thisTree.includes(current)) {\n sharedParent = current, thisSharedParentChild = thisTree[thisTree.indexOf(current) + 1], \n nodeSharedParentChild = nodeTree[1];\n break;\n }\n const returnValue = !sharedParent || sharedParent.childNodes.indexOf(thisSharedParentChild) > sharedParent.childNodes.indexOf(nodeSharedParentChild);\n return cd.a.debug.stopTimer("follows"), returnValue;\n }, Object.defineProperty(Element.prototype, "tagName", {\n get: function() {\n return this.name.toUpperCase();\n }\n }), Object.defineProperty(Element.prototype, "classList", {\n get: function() {\n return this._classList || (this._classList = {\n list: [],\n movedFromClassAttr: !1,\n moveFromClassAttr(classAttr) {\n this.list = (classAttr || "").split(" "), this.movedFromClassAttr = !0;\n },\n add: (...names) => {\n names.forEach(name => {\n cd.a.debug.startTimer("addClass");\n let classAttr = this.getAttribute("class") || "";\n classAttr && (classAttr += " "), classAttr += name, this.setAttribute("class", classAttr), \n this._classList.movedFromClassAttr ? this._classList.list.push(name) : this._classList.moveFromClassAttr(classAttr), \n cd.a.debug.stopTimer("addClass");\n });\n },\n contains: name => {\n cd.a.debug.startTimer("containsClass");\n const classAttr = this.getAttribute("class");\n if (!classAttr) return cd.a.debug.stopTimer("containsClass"), !1;\n this._classList.movedFromClassAttr || this._classList.moveFromClassAttr(classAttr);\n const returnValue = Boolean(this._classList.list.length) && -1 !== this._classList.list.indexOf(name);\n return cd.a.debug.stopTimer("containsClass"), returnValue;\n }\n }), this._classList;\n }\n }), Element.prototype.getElementsByClassName = function(name, limit, our) {\n cd.a.debug.startTimer("getElementsByClassName");\n let nodes = [];\n return walkThroughSubtree(this, node => {\n if (node.nodeType === Node.ELEMENT_NODE) return !(node.nodeType !== Node.ELEMENT_NODE || !node.classList.contains(name, our) || (nodes.push(node), \n !limit || nodes.length !== limit)) || void 0;\n }), cd.a.debug.stopTimer("getElementsByClassName"), nodes;\n }, Element.prototype.getElementsByTagName = function(name) {\n cd.a.debug.startTimer("getElementsByTagName");\n const returnValue = lib.DomUtils.getElementsByTagName(name, this);\n return cd.a.debug.stopTimer("getElementsByTagName"), returnValue;\n }, Object.defineProperty(DataNode.prototype, "textContent", {\n get: function() {\n return decodeHtmlEntities(this.data);\n },\n set: function(value) {\n this.data = value;\n }\n }), NodeConstructor.prototype.remove = function() {\n lib.DomUtils.removeElement(this), this.prev = null, this.next = null;\n };\n class Document extends Element {\n constructor(dom) {\n super("body", {});\n for (const el of dom) this.appendChild(el);\n }\n createElement(name) {\n return new Element(name, {});\n }\n createTextNode(content) {\n return new DataNode("text", content);\n }\n }\n Document.prototype.getElementsByClassName = Element.prototype.getElementsByClassName, \n self.Document = Document;\n}, function(module, __webpack_exports__, __webpack_require__) {\n "use strict";\n __webpack_require__.r(__webpack_exports__);\n var _CdError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3), _CommentSkeleton__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(24), _Parser__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(27), _SectionSkeleton__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(25), _cd__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(0), _debug__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(23), _staticGlobals__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(22), _treeWalker__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(6), _htmlparser2Extended__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(28), _htmlparser2Extended__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(5), _htmlparser2Extended__WEBPACK_IMPORTED_MODULE_9___default = __webpack_require__.n(_htmlparser2Extended__WEBPACK_IMPORTED_MODULE_9__), _timestamp__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(4);\n self.cd = _cd__WEBPACK_IMPORTED_MODULE_4__.a, _cd__WEBPACK_IMPORTED_MODULE_4__.a.g = _staticGlobals__WEBPACK_IMPORTED_MODULE_6__.a, \n _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug = _debug__WEBPACK_IMPORTED_MODULE_5__.a, \n _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.init();\n const context = {\n CommentClass: _CommentSkeleton__WEBPACK_IMPORTED_MODULE_1__.a,\n SectionClass: _SectionSkeleton__WEBPACK_IMPORTED_MODULE_3__.a,\n childElementsProperty: "childElements",\n follows: (el1, el2) => el1.follows(el2),\n getAllTextNodes: _htmlparser2Extended__WEBPACK_IMPORTED_MODULE_8__.a,\n getElementByClassName: (node, className) => node.getElementsByClassName(className, 1)[0] || null\n };\n let alarmTimeout;\n function setAlarm(interval) {\n clearTimeout(alarmTimeout), alarmTimeout = setTimeout(() => {\n postMessage({\n type: "wakeUp"\n });\n }, interval);\n }\n function parse() {\n _cd__WEBPACK_IMPORTED_MODULE_4__.a.comments = [], _cd__WEBPACK_IMPORTED_MODULE_4__.a.sections = [], \n Object(_timestamp__WEBPACK_IMPORTED_MODULE_10__.d)(), _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.startTimer("processing comments");\n const parser = new _Parser__WEBPACK_IMPORTED_MODULE_2__.a(context);\n _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.startTimer("find timestamps");\n const timestamps = parser.findTimestamps();\n _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.stopTimer("find timestamps"), _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.startTimer("find signatures");\n const signatures = parser.findSignatures(timestamps);\n _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.stopTimer("find signatures"), signatures.forEach(signature => {\n try {\n const comment = parser.createComment(signature);\n void 0 !== comment.id && _cd__WEBPACK_IMPORTED_MODULE_4__.a.comments.push(comment);\n } catch (e) {\n e instanceof _CdError__WEBPACK_IMPORTED_MODULE_0__.a || console.error(e);\n }\n }), _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.stopTimer("processing comments"), _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.startTimer("processing sections"), \n parser.findHeadings().forEach(heading => {\n try {\n const section = parser.createSection(heading);\n void 0 !== section.id && _cd__WEBPACK_IMPORTED_MODULE_4__.a.sections.push(section);\n } catch (e) {\n e instanceof _CdError__WEBPACK_IMPORTED_MODULE_0__.a || console.error(e);\n }\n }), _cd__WEBPACK_IMPORTED_MODULE_4__.a.comments.forEach(comment => {\n if (comment.own && _cd__WEBPACK_IMPORTED_MODULE_4__.a.comments[comment.id + 1]) {\n if (_cd__WEBPACK_IMPORTED_MODULE_4__.a.g.specialElements.pageHasOutdents) {\n const treeWalker = new _treeWalker__WEBPACK_IMPORTED_MODULE_7__.b(comment.elements[comment.elements.length - 1]);\n let found;\n for (;!found && treeWalker.nextNode() && !treeWalker.currentNode.classList.contains("cd-commentPart"); ) found = treeWalker.currentNode.classList.contains("outdent-template");\n found && (_cd__WEBPACK_IMPORTED_MODULE_4__.a.comments[comment.id + 1].toMe = !0);\n }\n _cd__WEBPACK_IMPORTED_MODULE_4__.a.comments[comment.id + 1].toMe || _cd__WEBPACK_IMPORTED_MODULE_4__.a.comments.slice(comment.id + 1).some(otherComment => {\n if (!(otherComment.section === comment.section && otherComment.level > comment.level)) return !0;\n otherComment.level !== comment.level + 1 && otherComment.id !== comment.id + 1 || (otherComment.toMe = !0);\n });\n }\n comment.section && (comment.sectionHeadline = comment.section.headline, comment.sectionAnchor = comment.section.anchor, \n delete comment.section), delete comment.elements, delete comment.parts, delete comment.highlightables, \n delete comment.addAttributes, delete comment.setLevels, delete comment.getSection;\n }), _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.stopTimer("processing sections"), _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.startTimer("post message from the worker"), \n postMessage({\n type: "parse",\n comments: _cd__WEBPACK_IMPORTED_MODULE_4__.a.comments\n }), _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.stopTimer("post message from the worker"), \n _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.stopTimer("worker operations"), _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.logAndResetEverything();\n }\n function onMessageFromWindow(e) {\n const message = e.data;\n if ("setAlarm" === message.type && setAlarm(message.interval), "removeAlarm" === message.type && clearTimeout(alarmTimeout), \n "parse" === message.type) {\n _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.startTimer("worker operations"), Object.assign(_cd__WEBPACK_IMPORTED_MODULE_4__.a.g, message.g), \n _cd__WEBPACK_IMPORTED_MODULE_4__.a.config = message.config;\n let checker = _cd__WEBPACK_IMPORTED_MODULE_4__.a.config.customForeignComponentChecker;\n !checker || /^ *function +/.test(checker) || /^.+=>/.test(checker) || (checker = "function " + checker), \n _cd__WEBPACK_IMPORTED_MODULE_4__.a.config.customForeignComponentChecker = eval(checker), \n _cd__WEBPACK_IMPORTED_MODULE_4__.a.g.TIMESTAMP_PARSER = eval(_cd__WEBPACK_IMPORTED_MODULE_4__.a.g.TIMESTAMP_PARSER), \n _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.startTimer("parse html");\n const dom = Object(_htmlparser2Extended__WEBPACK_IMPORTED_MODULE_9__.parseDOM)(message.text, {\n withStartIndices: !0,\n withEndIndices: !0\n });\n _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.stopTimer("parse html"), _cd__WEBPACK_IMPORTED_MODULE_4__.a.g.rootElement = new Document(dom), \n context.document = _cd__WEBPACK_IMPORTED_MODULE_4__.a.g.rootElement, _cd__WEBPACK_IMPORTED_MODULE_4__.a.g.specialElements = {\n pageHasOutdents: Boolean(_cd__WEBPACK_IMPORTED_MODULE_4__.a.g.rootElement.getElementsByClassName("outdent-template", 1).length)\n }, parse();\n }\n }\n onmessage = onMessageFromWindow;\n}, function(module) {\n module.exports = JSON.parse(\'{"0":65533,"128":8364,"130":8218,"131":402,"132":8222,"133":8230,"134":8224,"135":8225,"136":710,"137":8240,"138":352,"139":8249,"140":338,"142":381,"145":8216,"146":8217,"147":8220,"148":8221,"149":8226,"150":8211,"151":8212,"152":732,"153":8482,"154":353,"155":8250,"156":339,"158":382,"159":376}\');\n}, function(module, exports, __webpack_require__) {\n "use strict";\n var ReflectOwnKeys, R = "object" == typeof Reflect ? Reflect : null, ReflectApply = R && "function" == typeof R.apply ? R.apply : function(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n };\n ReflectOwnKeys = R && "function" == typeof R.ownKeys ? R.ownKeys : Object.getOwnPropertySymbols ? function(target) {\n return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target));\n } : function(target) {\n return Object.getOwnPropertyNames(target);\n };\n var NumberIsNaN = Number.isNaN || function(value) {\n return value != value;\n };\n function EventEmitter() {\n EventEmitter.init.call(this);\n }\n module.exports = EventEmitter, EventEmitter.EventEmitter = EventEmitter, EventEmitter.prototype._events = void 0, \n EventEmitter.prototype._eventsCount = 0, EventEmitter.prototype._maxListeners = void 0;\n var defaultMaxListeners = 10;\n function checkListener(listener) {\n if ("function" != typeof listener) throw new TypeError(\'The "listener" argument must be of type Function. Received type \' + typeof listener);\n }\n function _getMaxListeners(that) {\n return void 0 === that._maxListeners ? EventEmitter.defaultMaxListeners : that._maxListeners;\n }\n function _addListener(target, type, listener, prepend) {\n var m, events, existing, warning;\n if (checkListener(listener), void 0 === (events = target._events) ? (events = target._events = Object.create(null), \n target._eventsCount = 0) : (void 0 !== events.newListener && (target.emit("newListener", type, listener.listener ? listener.listener : listener), \n events = target._events), existing = events[type]), void 0 === existing) existing = events[type] = listener, \n ++target._eventsCount; else if ("function" == typeof existing ? existing = events[type] = prepend ? [ listener, existing ] : [ existing, listener ] : prepend ? existing.unshift(listener) : existing.push(listener), \n (m = _getMaxListeners(target)) > 0 && existing.length > m && !existing.warned) {\n existing.warned = !0;\n var w = new Error("Possible EventEmitter memory leak detected. " + existing.length + " " + String(type) + " listeners added. Use emitter.setMaxListeners() to increase limit");\n w.name = "MaxListenersExceededWarning", w.emitter = target, w.type = type, w.count = existing.length, \n warning = w, console && console.warn && console.warn(warning);\n }\n return target;\n }\n function onceWrapper() {\n if (!this.fired) return this.target.removeListener(this.type, this.wrapFn), this.fired = !0, \n 0 === arguments.length ? this.listener.call(this.target) : this.listener.apply(this.target, arguments);\n }\n function _onceWrap(target, type, listener) {\n var state = {\n fired: !1,\n wrapFn: void 0,\n target: target,\n type: type,\n listener: listener\n }, wrapped = onceWrapper.bind(state);\n return wrapped.listener = listener, state.wrapFn = wrapped, wrapped;\n }\n function _listeners(target, type, unwrap) {\n var events = target._events;\n if (void 0 === events) return [];\n var evlistener = events[type];\n return void 0 === evlistener ? [] : "function" == typeof evlistener ? unwrap ? [ evlistener.listener || evlistener ] : [ evlistener ] : unwrap ? function(arr) {\n for (var ret = new Array(arr.length), i = 0; i < ret.length; ++i) ret[i] = arr[i].listener || arr[i];\n return ret;\n }(evlistener) : arrayClone(evlistener, evlistener.length);\n }\n function listenerCount(type) {\n var events = this._events;\n if (void 0 !== events) {\n var evlistener = events[type];\n if ("function" == typeof evlistener) return 1;\n if (void 0 !== evlistener) return evlistener.length;\n }\n return 0;\n }\n function arrayClone(arr, n) {\n for (var copy = new Array(n), i = 0; i < n; ++i) copy[i] = arr[i];\n return copy;\n }\n Object.defineProperty(EventEmitter, "defaultMaxListeners", {\n enumerable: !0,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if ("number" != typeof arg || arg < 0 || NumberIsNaN(arg)) throw new RangeError(\'The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received \' + arg + ".");\n defaultMaxListeners = arg;\n }\n }), EventEmitter.init = function() {\n void 0 !== this._events && this._events !== Object.getPrototypeOf(this)._events || (this._events = Object.create(null), \n this._eventsCount = 0), this._maxListeners = this._maxListeners || void 0;\n }, EventEmitter.prototype.setMaxListeners = function(n) {\n if ("number" != typeof n || n < 0 || NumberIsNaN(n)) throw new RangeError(\'The value of "n" is out of range. It must be a non-negative number. Received \' + n + ".");\n return this._maxListeners = n, this;\n }, EventEmitter.prototype.getMaxListeners = function() {\n return _getMaxListeners(this);\n }, EventEmitter.prototype.emit = function(type) {\n for (var args = [], i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = "error" === type, events = this._events;\n if (void 0 !== events) doError = doError && void 0 === events.error; else if (!doError) return !1;\n if (doError) {\n var er;\n if (args.length > 0 && (er = args[0]), er instanceof Error) throw er;\n var err = new Error("Unhandled error." + (er ? " (" + er.message + ")" : ""));\n throw err.context = er, err;\n }\n var handler = events[type];\n if (void 0 === handler) return !1;\n if ("function" == typeof handler) ReflectApply(handler, this, args); else {\n var len = handler.length, listeners = arrayClone(handler, len);\n for (i = 0; i < len; ++i) ReflectApply(listeners[i], this, args);\n }\n return !0;\n }, EventEmitter.prototype.addListener = function(type, listener) {\n return _addListener(this, type, listener, !1);\n }, EventEmitter.prototype.on = EventEmitter.prototype.addListener, EventEmitter.prototype.prependListener = function(type, listener) {\n return _addListener(this, type, listener, !0);\n }, EventEmitter.prototype.once = function(type, listener) {\n return checkListener(listener), this.on(type, _onceWrap(this, type, listener)), \n this;\n }, EventEmitter.prototype.prependOnceListener = function(type, listener) {\n return checkListener(listener), this.prependListener(type, _onceWrap(this, type, listener)), \n this;\n }, EventEmitter.prototype.removeListener = function(type, listener) {\n var list, events, position, i, originalListener;\n if (checkListener(listener), void 0 === (events = this._events)) return this;\n if (void 0 === (list = events[type])) return this;\n if (list === listener || list.listener === listener) 0 == --this._eventsCount ? this._events = Object.create(null) : (delete events[type], \n events.removeListener && this.emit("removeListener", type, list.listener || listener)); else if ("function" != typeof list) {\n for (position = -1, i = list.length - 1; i >= 0; i--) if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener, position = i;\n break;\n }\n if (position < 0) return this;\n 0 === position ? list.shift() : function(list, index) {\n for (;index + 1 < list.length; index++) list[index] = list[index + 1];\n list.pop();\n }(list, position), 1 === list.length && (events[type] = list[0]), void 0 !== events.removeListener && this.emit("removeListener", type, originalListener || listener);\n }\n return this;\n }, EventEmitter.prototype.off = EventEmitter.prototype.removeListener, EventEmitter.prototype.removeAllListeners = function(type) {\n var listeners, events, i;\n if (void 0 === (events = this._events)) return this;\n if (void 0 === events.removeListener) return 0 === arguments.length ? (this._events = Object.create(null), \n this._eventsCount = 0) : void 0 !== events[type] && (0 == --this._eventsCount ? this._events = Object.create(null) : delete events[type]), \n this;\n if (0 === arguments.length) {\n var key, keys = Object.keys(events);\n for (i = 0; i < keys.length; ++i) "removeListener" !== (key = keys[i]) && this.removeAllListeners(key);\n return this.removeAllListeners("removeListener"), this._events = Object.create(null), \n this._eventsCount = 0, this;\n }\n if ("function" == typeof (listeners = events[type])) this.removeListener(type, listeners); else if (void 0 !== listeners) for (i = listeners.length - 1; i >= 0; i--) this.removeListener(type, listeners[i]);\n return this;\n }, EventEmitter.prototype.listeners = function(type) {\n return _listeners(this, type, !0);\n }, EventEmitter.prototype.rawListeners = function(type) {\n return _listeners(this, type, !1);\n }, EventEmitter.listenerCount = function(emitter, type) {\n return "function" == typeof emitter.listenerCount ? emitter.listenerCount(type) : listenerCount.call(emitter, type);\n }, EventEmitter.prototype.listenerCount = listenerCount, EventEmitter.prototype.eventNames = function() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n };\n}, function(module, exports, __webpack_require__) {\n "use strict";\n var extendStatics, __extends = this && this.__extends || (extendStatics = function(d, b) {\n return (extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function(d, b) {\n d.__proto__ = b;\n } || function(d, b) {\n for (var p in b) b.hasOwnProperty(p) && (d[p] = b[p]);\n })(d, b);\n }, function(d, b) {\n function __() {\n this.constructor = d;\n }\n extendStatics(d, b), d.prototype = null === b ? Object.create(b) : (__.prototype = b.prototype, \n new __);\n });\n Object.defineProperty(exports, "__esModule", {\n value: !0\n });\n var nodeTypes = new Map([ [ "tag", 1 ], [ "script", 1 ], [ "style", 1 ], [ "directive", 1 ], [ "text", 3 ], [ "cdata", 4 ], [ "comment", 8 ] ]), Node = function() {\n function Node(type) {\n this.type = type, this.parent = null, this.prev = null, this.next = null, this.startIndex = null, \n this.endIndex = null;\n }\n return Object.defineProperty(Node.prototype, "nodeType", {\n get: function() {\n return nodeTypes.get(this.type) || 1;\n },\n enumerable: !0,\n configurable: !0\n }), Object.defineProperty(Node.prototype, "parentNode", {\n get: function() {\n return this.parent || null;\n },\n set: function(parent) {\n this.parent = parent;\n },\n enumerable: !0,\n configurable: !0\n }), Object.defineProperty(Node.prototype, "previousSibling", {\n get: function() {\n return this.prev || null;\n },\n set: function(prev) {\n this.prev = prev;\n },\n enumerable: !0,\n configurable: !0\n }), Object.defineProperty(Node.prototype, "nextSibling", {\n get: function() {\n return this.next || null;\n },\n set: function(next) {\n this.next = next;\n },\n enumerable: !0,\n configurable: !0\n }), Node;\n }();\n exports.Node = Node;\n var DataNode = function(_super) {\n function DataNode(type, data) {\n var _this = _super.call(this, type) || this;\n return _this.data = data, _this;\n }\n return __extends(DataNode, _super), Object.defineProperty(DataNode.prototype, "nodeValue", {\n get: function() {\n return this.data;\n },\n set: function(data) {\n this.data = data;\n },\n enumerable: !0,\n configurable: !0\n }), DataNode;\n }(Node);\n exports.DataNode = DataNode;\n var ProcessingInstruction = function(_super) {\n function ProcessingInstruction(name, data) {\n var _this = _super.call(this, "directive", data) || this;\n return _this.name = name, _this;\n }\n return __extends(ProcessingInstruction, _super), ProcessingInstruction;\n }(DataNode);\n exports.ProcessingInstruction = ProcessingInstruction;\n var NodeWithChildren = function(_super) {\n function NodeWithChildren(type, children) {\n var _this = _super.call(this, type) || this;\n return _this.children = children, _this;\n }\n return __extends(NodeWithChildren, _super), Object.defineProperty(NodeWithChildren.prototype, "firstChild", {\n get: function() {\n return this.children[0] || null;\n },\n enumerable: !0,\n configurable: !0\n }), Object.defineProperty(NodeWithChildren.prototype, "lastChild", {\n get: function() {\n return this.children[this.children.length - 1] || null;\n },\n enumerable: !0,\n configurable: !0\n }), Object.defineProperty(NodeWithChildren.prototype, "childNodes", {\n get: function() {\n return this.children;\n },\n set: function(children) {\n this.children = children;\n },\n enumerable: !0,\n configurable: !0\n }), NodeWithChildren;\n }(Node);\n exports.NodeWithChildren = NodeWithChildren;\n var Element = function(_super) {\n function Element(name, attribs) {\n var _this = _super.call(this, "script" === name ? "script" : "style" === name ? "style" : "tag", []) || this;\n return _this.name = name, _this.attribs = attribs, _this.attribs = attribs, _this;\n }\n return __extends(Element, _super), Object.defineProperty(Element.prototype, "tagName", {\n get: function() {\n return this.name;\n },\n set: function(name) {\n this.name = name;\n },\n enumerable: !0,\n configurable: !0\n }), Element;\n }(NodeWithChildren);\n exports.Element = Element;\n}, function(module, exports, __webpack_require__) {\n "use strict";\n var __importDefault = this && this.__importDefault || function(mod) {\n return mod && mod.__esModule ? mod : {\n default: mod\n };\n };\n Object.defineProperty(exports, "__esModule", {\n value: !0\n });\n var tagtypes_1 = __webpack_require__(8), dom_serializer_1 = __importDefault(__webpack_require__(34));\n exports.getOuterHTML = dom_serializer_1.default, exports.getInnerHTML = function(node, options) {\n return tagtypes_1.hasChildren(node) ? node.children.map((function(node) {\n return exports.getOuterHTML(node, options);\n })).join("") : "";\n }, exports.getText = function getText(node) {\n return Array.isArray(node) ? node.map(getText).join("") : tagtypes_1.isTag(node) ? "br" === node.name ? "\\n" : getText(node.children) : tagtypes_1.isCDATA(node) ? getText(node.children) : tagtypes_1.isText(node) ? node.data : "";\n };\n}, function(module, exports, __webpack_require__) {\n var ElementType = __webpack_require__(11), entities = __webpack_require__(35), foreignNames = __webpack_require__(36);\n foreignNames.elementNames.__proto__ = null, foreignNames.attributeNames.__proto__ = null;\n var unencodedElements = {\n __proto__: null,\n style: !0,\n script: !0,\n xmp: !0,\n iframe: !0,\n noembed: !0,\n noframes: !0,\n plaintext: !0,\n noscript: !0\n };\n var singleTag = {\n __proto__: null,\n area: !0,\n base: !0,\n basefont: !0,\n br: !0,\n col: !0,\n command: !0,\n embed: !0,\n frame: !0,\n hr: !0,\n img: !0,\n input: !0,\n isindex: !0,\n keygen: !0,\n link: !0,\n meta: !0,\n param: !0,\n source: !0,\n track: !0,\n wbr: !0\n }, render = module.exports = function(dom, opts) {\n Array.isArray(dom) || dom.cheerio || (dom = [ dom ]), opts = opts || {};\n for (var output = "", i = 0; i < dom.length; i++) {\n var elem = dom[i];\n "root" === elem.type ? output += render(elem.children, opts) : ElementType.isTag(elem) ? output += renderTag(elem, opts) : elem.type === ElementType.Directive ? output += renderDirective(elem) : elem.type === ElementType.Comment ? output += renderComment(elem) : elem.type === ElementType.CDATA ? output += renderCdata(elem) : output += renderText(elem, opts);\n }\n return output;\n }, foreignModeIntegrationPoints = [ "mi", "mo", "mn", "ms", "mtext", "annotation-xml", "foreignObject", "desc", "title" ];\n function renderTag(elem, opts) {\n "foreign" === opts.xmlMode && (elem.name = foreignNames.elementNames[elem.name] || elem.name, \n elem.parent && foreignModeIntegrationPoints.indexOf(elem.parent.name) >= 0 && (opts = Object.assign({}, opts, {\n xmlMode: !1\n }))), !opts.xmlMode && [ "svg", "math" ].indexOf(elem.name) >= 0 && (opts = Object.assign({}, opts, {\n xmlMode: "foreign"\n }));\n var tag = "<" + elem.name, attribs = function(attributes, opts) {\n if (attributes) {\n var value, output = "";\n for (var key in attributes) value = attributes[key], output && (output += " "), \n "foreign" === opts.xmlMode && (key = foreignNames.attributeNames[key] || key), output += key, \n (null !== value && "" !== value || opts.xmlMode) && (output += \'="\' + (opts.decodeEntities ? entities.encodeXML(value) : value.replace(/\\"/g, """)) + \'"\');\n return output;\n }\n }(elem.attribs, opts);\n return attribs && (tag += " " + attribs), !opts.xmlMode || elem.children && 0 !== elem.children.length ? (tag += ">", \n elem.children && (tag += render(elem.children, opts)), singleTag[elem.name] && !opts.xmlMode || (tag += "</" + elem.name + ">")) : tag += "/>", \n tag;\n }\n function renderDirective(elem) {\n return "<" + elem.data + ">";\n }\n function renderText(elem, opts) {\n var data = elem.data || "";\n return !opts.decodeEntities || elem.parent && elem.parent.name in unencodedElements || (data = entities.encodeXML(data)), \n data;\n }\n function renderCdata(elem) {\n return "<![CDATA[" + elem.children[0].data + "]]>";\n }\n function renderComment(elem) {\n return "\\x3c!--" + elem.data + "--\\x3e";\n }\n}, function(module, exports, __webpack_require__) {\n "use strict";\n Object.defineProperty(exports, "__esModule", {\n value: !0\n });\n var decode_1 = __webpack_require__(19), encode_1 = __webpack_require__(20);\n exports.decode = function(data, level) {\n return (!level || level <= 0 ? decode_1.decodeXML : decode_1.decodeHTML)(data);\n }, exports.decodeStrict = function(data, level) {\n return (!level || level <= 0 ? decode_1.decodeXML : decode_1.decodeHTMLStrict)(data);\n }, exports.encode = function(data, level) {\n return (!level || level <= 0 ? encode_1.encodeXML : encode_1.encodeHTML)(data);\n };\n var encode_2 = __webpack_require__(20);\n exports.encodeXML = encode_2.encodeXML, exports.encodeHTML = encode_2.encodeHTML, \n exports.escape = encode_2.escape, exports.encodeHTML4 = encode_2.encodeHTML, exports.encodeHTML5 = encode_2.encodeHTML;\n var decode_2 = __webpack_require__(19);\n exports.decodeXML = decode_2.decodeXML, exports.decodeHTML = decode_2.decodeHTML, \n exports.decodeHTMLStrict = decode_2.decodeHTMLStrict, exports.decodeHTML4 = decode_2.decodeHTML, \n exports.decodeHTML5 = decode_2.decodeHTML, exports.decodeHTML4Strict = decode_2.decodeHTMLStrict, \n exports.decodeHTML5Strict = decode_2.decodeHTMLStrict, exports.decodeXMLStrict = decode_2.decodeXML;\n}, function(module) {\n module.exports = JSON.parse(\'{"elementNames":{"altglyph":"altGlyph","altglyphdef":"altGlyphDef","altglyphitem":"altGlyphItem","animatecolor":"animateColor","animatemotion":"animateMotion","animatetransform":"animateTransform","clippath":"clipPath","feblend":"feBlend","fecolormatrix":"feColorMatrix","fecomponenttransfer":"feComponentTransfer","fecomposite":"feComposite","feconvolvematrix":"feConvolveMatrix","fediffuselighting":"feDiffuseLighting","fedisplacementmap":"feDisplacementMap","fedistantlight":"feDistantLight","fedropshadow":"feDropShadow","feflood":"feFlood","fefunca":"feFuncA","fefuncb":"feFuncB","fefuncg":"feFuncG","fefuncr":"feFuncR","fegaussianblur":"feGaussianBlur","feimage":"feImage","femerge":"feMerge","femergenode":"feMergeNode","femorphology":"feMorphology","feoffset":"feOffset","fepointlight":"fePointLight","fespecularlighting":"feSpecularLighting","fespotlight":"feSpotLight","fetile":"feTile","feturbulence":"feTurbulence","foreignobject":"foreignObject","glyphref":"glyphRef","lineargradient":"linearGradient","radialgradient":"radialGradient","textpath":"textPath"},"attributeNames":{"definitionurl":"definitionURL","attributename":"attributeName","attributetype":"attributeType","basefrequency":"baseFrequency","baseprofile":"baseProfile","calcmode":"calcMode","clippathunits":"clipPathUnits","diffuseconstant":"diffuseConstant","edgemode":"edgeMode","filterunits":"filterUnits","glyphref":"glyphRef","gradienttransform":"gradientTransform","gradientunits":"gradientUnits","kernelmatrix":"kernelMatrix","kernelunitlength":"kernelUnitLength","keypoints":"keyPoints","keysplines":"keySplines","keytimes":"keyTimes","lengthadjust":"lengthAdjust","limitingconeangle":"limitingConeAngle","markerheight":"markerHeight","markerunits":"markerUnits","markerwidth":"markerWidth","maskcontentunits":"maskContentUnits","maskunits":"maskUnits","numoctaves":"numOctaves","pathlength":"pathLength","patterncontentunits":"patternContentUnits","patterntransform":"patternTransform","patternunits":"patternUnits","pointsatx":"pointsAtX","pointsaty":"pointsAtY","pointsatz":"pointsAtZ","preservealpha":"preserveAlpha","preserveaspectratio":"preserveAspectRatio","primitiveunits":"primitiveUnits","refx":"refX","refy":"refY","repeatcount":"repeatCount","repeatdur":"repeatDur","requiredextensions":"requiredExtensions","requiredfeatures":"requiredFeatures","specularconstant":"specularConstant","specularexponent":"specularExponent","spreadmethod":"spreadMethod","startoffset":"startOffset","stddeviation":"stdDeviation","stitchtiles":"stitchTiles","surfacescale":"surfaceScale","systemlanguage":"systemLanguage","tablevalues":"tableValues","targetx":"targetX","targety":"targetY","textlength":"textLength","viewbox":"viewBox","viewtarget":"viewTarget","xchannelselector":"xChannelSelector","ychannelselector":"yChannelSelector","zoomandpan":"zoomAndPan"}}\');\n}, function(module, exports, __webpack_require__) {\n "use strict";\n function getChildren(elem) {\n return elem.children || null;\n }\n function getParent(elem) {\n return elem.parent || null;\n }\n function getAttributeValue(elem, name) {\n return elem.attribs && elem.attribs[name];\n }\n Object.defineProperty(exports, "__esModule", {\n value: !0\n }), exports.getChildren = getChildren, exports.getParent = getParent, exports.getSiblings = function(elem) {\n var parent = getParent(elem);\n return parent ? getChildren(parent) : [ elem ];\n }, exports.getAttributeValue = getAttributeValue, exports.hasAttrib = function(elem, name) {\n return !!getAttributeValue(elem, name);\n }, exports.getName = function(elem) {\n return elem.name;\n };\n}, function(module, exports, __webpack_require__) {\n "use strict";\n Object.defineProperty(exports, "__esModule", {\n value: !0\n }), exports.removeElement = function(elem) {\n if (elem.prev && (elem.prev.next = elem.next), elem.next && (elem.next.prev = elem.prev), \n elem.parent) {\n var childs = elem.parent.children;\n childs.splice(childs.lastIndexOf(elem), 1);\n }\n }, exports.replaceElement = function(elem, replacement) {\n var prev = replacement.prev = elem.prev;\n prev && (prev.next = replacement);\n var next = replacement.next = elem.next;\n next && (next.prev = replacement);\n var parent = replacement.parent = elem.parent;\n if (parent) {\n var childs = parent.children;\n childs[childs.lastIndexOf(elem)] = replacement;\n }\n }, exports.appendChild = function(elem, child) {\n if (child.parent = elem, 1 !== elem.children.push(child)) {\n var sibling = elem.children[elem.children.length - 2];\n sibling.next = child, child.prev = sibling, child.next = null;\n }\n }, exports.append = function(elem, next) {\n var parent = elem.parent, currNext = elem.next;\n if (next.next = currNext, next.prev = elem, elem.next = next, next.parent = parent, \n currNext) {\n if (currNext.prev = next, parent) {\n var childs = parent.children;\n childs.splice(childs.lastIndexOf(currNext), 0, next);\n }\n } else parent && parent.children.push(next);\n }, exports.prepend = function(elem, prev) {\n var parent = elem.parent;\n if (parent) {\n var childs = parent.children;\n childs.splice(childs.lastIndexOf(elem), 0, prev);\n }\n elem.prev && (elem.prev.next = prev), prev.parent = parent, prev.prev = elem.prev, \n prev.next = elem, elem.prev = prev;\n };\n}, function(module, exports, __webpack_require__) {\n "use strict";\n Object.defineProperty(exports, "__esModule", {\n value: !0\n });\n var querying_1 = __webpack_require__(21), tagtypes_1 = __webpack_require__(8);\n function isTextNode(node) {\n return "text" === node.type;\n }\n var Checks = {\n tag_name: function(name) {\n return "function" == typeof name ? function(elem) {\n return tagtypes_1.isTag(elem) && name(elem.name);\n } : "*" === name ? tagtypes_1.isTag : function(elem) {\n return tagtypes_1.isTag(elem) && elem.name === name;\n };\n },\n tag_type: function(type) {\n return "function" == typeof type ? function(elem) {\n return type(elem.type);\n } : function(elem) {\n return elem.type === type;\n };\n },\n tag_contains: function(data) {\n return "function" == typeof data ? function(elem) {\n return isTextNode(elem) && data(elem.data);\n } : function(elem) {\n return isTextNode(elem) && elem.data === data;\n };\n }\n };\n function getAttribCheck(attrib, value) {\n return "function" == typeof value ? function(elem) {\n return tagtypes_1.isTag(elem) && value(elem.attribs[attrib]);\n } : function(elem) {\n return tagtypes_1.isTag(elem) && elem.attribs[attrib] === value;\n };\n }\n function combineFuncs(a, b) {\n return function(elem) {\n return a(elem) || b(elem);\n };\n }\n function compileTest(options) {\n var funcs = Object.keys(options).map((function(key) {\n var value = options[key];\n return key in Checks ? Checks[key](value) : getAttribCheck(key, value);\n }));\n return 0 === funcs.length ? null : funcs.reduce(combineFuncs);\n }\n exports.testElement = function(options, element) {\n var test = compileTest(options);\n return !test || test(element);\n }, exports.getElements = function(options, element, recurse, limit) {\n void 0 === limit && (limit = 1 / 0);\n var test = compileTest(options);\n return test ? querying_1.filter(test, element, recurse, limit) : [];\n }, exports.getElementById = function(id, element, recurse) {\n return void 0 === recurse && (recurse = !0), Array.isArray(element) || (element = [ element ]), \n querying_1.findOne(getAttribCheck("id", id), element, recurse);\n }, exports.getElementsByTagName = function(name, element, recurse, limit) {\n return void 0 === limit && (limit = 1 / 0), querying_1.filter(Checks.tag_name(name), element, recurse, limit);\n }, exports.getElementsByTagType = function(type, element, recurse, limit) {\n return void 0 === recurse && (recurse = !0), void 0 === limit && (limit = 1 / 0), \n querying_1.filter(Checks.tag_type(type), element, recurse, limit);\n };\n}, function(module, exports, __webpack_require__) {\n "use strict";\n Object.defineProperty(exports, "__esModule", {\n value: !0\n });\n var tagtypes_1 = __webpack_require__(8);\n function compareDocumentPosition(nodeA, nodeB) {\n var aParents = [], bParents = [];\n if (nodeA === nodeB) return 0;\n for (var current = tagtypes_1.hasChildren(nodeA) ? nodeA : nodeA.parent; current; ) aParents.unshift(current), \n current = current.parent;\n for (current = tagtypes_1.hasChildren(nodeB) ? nodeB : nodeB.parent; current; ) bParents.unshift(current), \n current = current.parent;\n for (var idx = 0; aParents[idx] === bParents[idx]; ) idx++;\n if (0 === idx) return 1;\n var sharedParent = aParents[idx - 1], siblings = sharedParent.children, aSibling = aParents[idx], bSibling = bParents[idx];\n return siblings.indexOf(aSibling) > siblings.indexOf(bSibling) ? sharedParent === nodeB ? 20 : 4 : sharedParent === nodeA ? 10 : 2;\n }\n exports.removeSubsets = function(nodes) {\n for (var idx = nodes.length; --idx >= 0; ) {\n var node = nodes[idx];\n if (idx > 0 && nodes.lastIndexOf(node, idx - 1) >= 0) nodes.splice(idx, 1); else for (var ancestor = node.parent; ancestor; ancestor = ancestor.parent) if (nodes.indexOf(ancestor) > -1) {\n nodes.splice(idx, 1);\n break;\n }\n }\n return nodes;\n }, exports.compareDocumentPosition = compareDocumentPosition, exports.uniqueSort = function(nodes) {\n return (nodes = nodes.filter((function(node, i, arr) {\n return !arr.includes(node, i + 1);\n }))).sort((function(a, b) {\n var relative = compareDocumentPosition(a, b);\n return 2 & relative ? -1 : 4 & relative ? 1 : 0;\n })), nodes;\n };\n}, function(module, exports) {}, function(module, exports, __webpack_require__) {\n "use strict";\n var extendStatics, __extends = this && this.__extends || (extendStatics = function(d, b) {\n return (extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function(d, b) {\n d.__proto__ = b;\n } || function(d, b) {\n for (var p in b) b.hasOwnProperty(p) && (d[p] = b[p]);\n })(d, b);\n }, function(d, b) {\n function __() {\n this.constructor = d;\n }\n extendStatics(d, b), d.prototype = null === b ? Object.create(b) : (__.prototype = b.prototype, \n new __);\n }), __importDefault = this && this.__importDefault || function(mod) {\n return mod && mod.__esModule ? mod : {\n default: mod\n };\n };\n Object.defineProperty(exports, "__esModule", {\n value: !0\n });\n var CollectingHandler = function(_super) {\n function CollectingHandler(cbs) {\n void 0 === cbs && (cbs = {});\n var _this = _super.call(this, (function(name) {\n for (var _a, args = [], _i = 1; _i < arguments.length; _i++) args[_i - 1] = arguments[_i];\n _this.events.push([ name ].concat(args)), _this._cbs[name] && (_a = _this._cbs)[name].apply(_a, args);\n })) || this;\n return _this._cbs = cbs, _this.events = [], _this;\n }\n return __extends(CollectingHandler, _super), CollectingHandler.prototype.onreset = function() {\n this.events = [], this._cbs.onreset && this._cbs.onreset();\n }, CollectingHandler.prototype.restart = function() {\n var _a;\n this._cbs.onreset && this._cbs.onreset();\n for (var i = 0; i < this.events.length; i++) {\n var _b = this.events[i], name_1 = _b[0], args = _b.slice(1);\n this._cbs[name_1] && (_a = this._cbs)[name_1].apply(_a, args);\n }\n }, CollectingHandler;\n }(__importDefault(__webpack_require__(43)).default);\n exports.CollectingHandler = CollectingHandler;\n}, function(module, exports, __webpack_require__) {\n "use strict";\n Object.defineProperty(exports, "__esModule", {\n value: !0\n });\n var MultiplexHandler = function() {\n function MultiplexHandler(func) {\n this._func = func;\n }\n return MultiplexHandler.prototype.onattribute = function(name, value) {\n this._func("onattribute", name, value);\n }, MultiplexHandler.prototype.oncdatastart = function() {\n this._func("oncdatastart");\n }, MultiplexHandler.prototype.oncdataend = function() {\n this._func("oncdataend");\n }, MultiplexHandler.prototype.ontext = function(text) {\n this._func("ontext", text);\n }, MultiplexHandler.prototype.onprocessinginstruction = function(name, value) {\n this._func("onprocessinginstruction", name, value);\n }, MultiplexHandler.prototype.oncomment = function(comment) {\n this._func("oncomment", comment);\n }, MultiplexHandler.prototype.oncommentend = function() {\n this._func("oncommentend");\n }, MultiplexHandler.prototype.onclosetag = function(name) {\n this._func("onclosetag", name);\n }, MultiplexHandler.prototype.onopentag = function(name, attribs) {\n this._func("onopentag", name, attribs);\n }, MultiplexHandler.prototype.onopentagname = function(name) {\n this._func("onopentagname", name);\n }, MultiplexHandler.prototype.onerror = function(error) {\n this._func("onerror", error);\n }, MultiplexHandler.prototype.onend = function() {\n this._func("onend");\n }, MultiplexHandler.prototype.onparserinit = function(parser) {\n this._func("onparserinit", parser);\n }, MultiplexHandler.prototype.onreset = function() {\n this._func("onreset");\n }, MultiplexHandler;\n }();\n exports.default = MultiplexHandler;\n}, function(module, exports, __webpack_require__) {\n "use strict";\n module.exports = function(table, quoteStyle) {\n var decimal, useTable, useQuoteStyle, entities = {}, hashMap = {}, constMappingTable = {}, constMappingQuoteStyle = {};\n if (constMappingTable[0] = "HTML_SPECIALCHARS", constMappingTable[1] = "HTML_ENTITIES", \n constMappingQuoteStyle[0] = "ENT_NOQUOTES", constMappingQuoteStyle[2] = "ENT_COMPAT", \n constMappingQuoteStyle[3] = "ENT_QUOTES", useTable = isNaN(table) ? table ? table.toUpperCase() : "HTML_SPECIALCHARS" : constMappingTable[table], \n useQuoteStyle = isNaN(quoteStyle) ? quoteStyle ? quoteStyle.toUpperCase() : "ENT_COMPAT" : constMappingQuoteStyle[quoteStyle], \n "HTML_SPECIALCHARS" !== useTable && "HTML_ENTITIES" !== useTable) throw new Error("Table: " + useTable + " not supported");\n for (decimal in entities[38] = "&", "HTML_ENTITIES" === useTable && (entities[160] = " ", \n entities[161] = "¡", entities[162] = "¢", entities[163] = "£", \n entities[164] = "¤", entities[165] = "¥", entities[166] = "¦", \n entities[167] = "§", entities[168] = "¨", entities[169] = "©", entities[170] = "ª", \n entities[171] = "«", entities[172] = "¬", entities[173] = "­", entities[174] = "®", \n entities[175] = "¯", entities[176] = "°", entities[177] = "±", entities[178] = "²", \n entities[179] = "³", entities[180] = "´", entities[181] = "µ", \n entities[182] = "¶", entities[183] = "·", entities[184] = "¸", \n entities[185] = "¹", entities[186] = "º", entities[187] = "»", entities[188] = "¼", \n entities[189] = "½", entities[190] = "¾", entities[191] = "¿", \n entities[192] = "À", entities[193] = "Á", entities[194] = "Â", \n entities[195] = "Ã", entities[196] = "Ä", entities[197] = "Å", \n entities[198] = "Æ", entities[199] = "Ç", entities[200] = "È", \n entities[201] = "É", entities[202] = "Ê", entities[203] = "Ë", \n entities[204] = "Ì", entities[205] = "Í", entities[206] = "Î", \n entities[207] = "Ï", entities[208] = "Ð", entities[209] = "Ñ", entities[210] = "Ò", \n entities[211] = "Ó", entities[212] = "Ô", entities[213] = "Õ", \n entities[214] = "Ö", entities[215] = "×", entities[216] = "Ø", \n entities[217] = "Ù", entities[218] = "Ú", entities[219] = "Û", \n entities[220] = "Ü", entities[221] = "Ý", entities[222] = "Þ", \n entities[223] = "ß", entities[224] = "à", entities[225] = "á", \n entities[226] = "â", entities[227] = "ã", entities[228] = "ä", \n entities[229] = "å", entities[230] = "æ", entities[231] = "ç", \n entities[232] = "è", entities[233] = "é", entities[234] = "ê", \n entities[235] = "ë", entities[236] = "ì", entities[237] = "í", \n entities[238] = "î", entities[239] = "ï", entities[240] = "ð", entities[241] = "ñ", \n entities[242] = "ò", entities[243] = "ó", entities[244] = "ô", \n entities[245] = "õ", entities[246] = "ö", entities[247] = "÷", \n entities[248] = "ø", entities[249] = "ù", entities[250] = "ú", \n entities[251] = "û", entities[252] = "ü", entities[253] = "ý", \n entities[254] = "þ", entities[255] = "ÿ"), "ENT_NOQUOTES" !== useQuoteStyle && (entities[34] = """), \n "ENT_QUOTES" === useQuoteStyle && (entities[39] = "'"), entities[60] = "<", \n entities[62] = ">", entities) entities.hasOwnProperty(decimal) && (hashMap[String.fromCharCode(decimal)] = entities[decimal]);\n return hashMap;\n };\n} ]);', null);
};
}, function(module, exports, __webpack_require__) {
"use strict";
module.exports = function(table, quoteStyle) {
var decimal, useTable, useQuoteStyle, entities = {}, hashMap = {}, constMappingTable = {}, constMappingQuoteStyle = {};
if (constMappingTable[0] = "HTML_SPECIALCHARS", constMappingTable[1] = "HTML_ENTITIES",
constMappingQuoteStyle[0] = "ENT_NOQUOTES", constMappingQuoteStyle[2] = "ENT_COMPAT",
constMappingQuoteStyle[3] = "ENT_QUOTES", useTable = isNaN(table) ? table ? table.toUpperCase() : "HTML_SPECIALCHARS" : constMappingTable[table],
useQuoteStyle = isNaN(quoteStyle) ? quoteStyle ? quoteStyle.toUpperCase() : "ENT_COMPAT" : constMappingQuoteStyle[quoteStyle],
"HTML_SPECIALCHARS" !== useTable && "HTML_ENTITIES" !== useTable) throw new Error("Table: " + useTable + " not supported");
for (decimal in entities[38] = "&", "HTML_ENTITIES" === useTable && (entities[160] = " ",
entities[161] = "¡", entities[162] = "¢", entities[163] = "£",
entities[164] = "¤", entities[165] = "¥", entities[166] = "¦",
entities[167] = "§", entities[168] = "¨", entities[169] = "©", entities[170] = "ª",
entities[171] = "«", entities[172] = "¬", entities[173] = "­", entities[174] = "®",
entities[175] = "¯", entities[176] = "°", entities[177] = "±", entities[178] = "²",
entities[179] = "³", entities[180] = "´", entities[181] = "µ",
entities[182] = "¶", entities[183] = "·", entities[184] = "¸",
entities[185] = "¹", entities[186] = "º", entities[187] = "»", entities[188] = "¼",
entities[189] = "½", entities[190] = "¾", entities[191] = "¿",
entities[192] = "À", entities[193] = "Á", entities[194] = "Â",
entities[195] = "Ã", entities[196] = "Ä", entities[197] = "Å",
entities[198] = "Æ", entities[199] = "Ç", entities[200] = "È",
entities[201] = "É", entities[202] = "Ê", entities[203] = "Ë",
entities[204] = "Ì", entities[205] = "Í", entities[206] = "Î",
entities[207] = "Ï", entities[208] = "Ð", entities[209] = "Ñ", entities[210] = "Ò",
entities[211] = "Ó", entities[212] = "Ô", entities[213] = "Õ",
entities[214] = "Ö", entities[215] = "×", entities[216] = "Ø",
entities[217] = "Ù", entities[218] = "Ú", entities[219] = "Û",
entities[220] = "Ü", entities[221] = "Ý", entities[222] = "Þ",
entities[223] = "ß", entities[224] = "à", entities[225] = "á",
entities[226] = "â", entities[227] = "ã", entities[228] = "ä",
entities[229] = "å", entities[230] = "æ", entities[231] = "ç",
entities[232] = "è", entities[233] = "é", entities[234] = "ê",
entities[235] = "ë", entities[236] = "ì", entities[237] = "í",
entities[238] = "î", entities[239] = "ï", entities[240] = "ð", entities[241] = "ñ",
entities[242] = "ò", entities[243] = "ó", entities[244] = "ô",
entities[245] = "õ", entities[246] = "ö", entities[247] = "÷",
entities[248] = "ø", entities[249] = "ù", entities[250] = "ú",
entities[251] = "û", entities[252] = "ü", entities[253] = "ý",
entities[254] = "þ", entities[255] = "ÿ"), "ENT_NOQUOTES" !== useQuoteStyle && (entities[34] = """),
"ENT_QUOTES" === useQuoteStyle && (entities[39] = "'"), entities[60] = "<",
entities[62] = ">", entities) entities.hasOwnProperty(decimal) && (hashMap[String.fromCharCode(decimal)] = entities[decimal]);
return hashMap;
};
}, function(module, exports, __webpack_require__) {
"use strict";
var URL = window.URL || window.webkitURL;
module.exports = function(content, url) {
try {
try {
var blob;
try {
(blob = new (window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder)).append(content),
blob = blob.getBlob();
} catch (e) {
blob = new Blob([ content ]);
}
return new Worker(URL.createObjectURL(blob));
} catch (e) {
return new Worker("data:application/javascript," + encodeURIComponent(content));
}
} catch (e) {
if (!url) throw Error("Inline worker is not supported");
return new Worker(url);
}
};
}, function(module, exports, __webpack_require__) {
(exports = __webpack_require__(4)(!1)).push([ module.i, "a:not([href]) {\n cursor: pointer;\n}\n", "" ]),
module.exports = exports;
}, function(module, exports, __webpack_require__) {
var api = __webpack_require__(3), content = __webpack_require__(14);
"string" == typeof (content = content.__esModule ? content.default : content) && (content = [ [ module.i, content, "" ] ]);
var options = {
insert: "head",
singleton: !1
};
api(content, options);
module.exports = content.locals || {};
}, function(module, exports, __webpack_require__) {
(exports = __webpack_require__(4)(!1)).push([ module.i, ".cd-commentPart-first {\n margin-top: 0.5em;\n}\n.cd-commentPart-last {\n margin-bottom: 0.5em;\n}\nol > li.cd-commentPart-first {\n margin-top: 0;\n}\nol > li.cd-commentPart-last {\n margin-bottom: 0.1em;\n}\n.cd-commentLevel.cd-commentLevel:not(ol) {\n list-style-type: none;\n list-style-image: none;\n padding-left: 1em;\n margin: 0 0 0 1em;\n border-left: 1px solid #c8ccd1;\n}\ndl.cd-commentLevel > dd {\n margin-left: 0;\n}\n.cd-button-pending.cd-button-pending.cd-button-pending .oo-ui-buttonElement-button {\n cursor: wait;\n}\n", "" ]),
module.exports = exports;
}, function(module, exports, __webpack_require__) {
var api = __webpack_require__(3), content = __webpack_require__(16);
"string" == typeof (content = content.__esModule ? content.default : content) && (content = [ [ module.i, content, "" ] ]);
var options = {
insert: "head",
singleton: !1
};
api(content, options);
module.exports = content.locals || {};
}, function(module, exports, __webpack_require__) {
(exports = __webpack_require__(4)(!1)).push([ module.i, '.cd-commentForm.cd-commentForm {\n display: flow-root;\n -ms-display: grid;\n margin: 0.5em 0;\n}\n.cd-commentForm.cd-commentForm.cd-commentLevel {\n margin-top: 0.5em;\n}\n.cd-commentForm.cd-commentForm-addSection,\n.cd-commentForm.cd-commentForm-addSubsection,\n.cd-commentForm.cd-commentForm-replyInSection:not(.cd-commentForm-inNumberedList),\n.cd-commentForm.cd-commentForm-sectionOpeningComment {\n margin-top: 1em;\n}\n.cd-commentForm .cd-headlineInput {\n margin-bottom: 0.25em;\n}\n.cd-commentForm .oo-ui-textInputWidget {\n max-width: none;\n}\n.cd-commentForm .cd-summaryInput {\n margin-top: 0.25em;\n}\n.cd-commentForm .cd-checkboxesContainer {\n margin-top: 0.5em;\n}\n.cd-commentForm .cd-checkboxesContainer .oo-ui-fieldLayout {\n margin-right: 1em;\n}\n.cd-commentForm .cd-checkboxesContainer .oo-ui-fieldLayout:last-child {\n margin-right: 0;\n}\n.cd-commentForm .cd-buttonsContainer {\n margin-top: 0.5em;\n display: flow-root;\n -ms-display: grid;\n}\n.cd-commentForm .cd-leftButtonsContainer {\n float: left;\n}\n.cd-commentForm .cd-rightButtonsContainer {\n float: right;\n}\n.cd-commentForm .cd-rightButtonsContainer > .oo-ui-buttonWidget:last-child {\n margin-right: -0.3125em;\n}\n.cd-commentForm .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {\n vertical-align: middle;\n}\n.cd-commentForm .cd-scriptSettingsButton {\n margin: -1em 0 0;\n}\n.cd-commentForm table.diff {\n margin-bottom: 0.5em;\n}\n.cd-commentForm + .cd-commentLevel,\n.cd-commentForm + dd > .cd-commentLevel:first-child,\n.cd-commentForm + li > .cd-commentLevel:first-child {\n padding-top: 0.1px;\n}\n.cd-commentForm + .cd-commentForm {\n padding-top: 0.5em;\n}\n.cd-commentForm .wikiEditor-ui-left {\n float: none;\n}\n.cd-commentForm .wikiEditor-ui-toolbar .group .tool-select .options {\n z-index: 1;\n}\n.cd-commentForm-innerWrapper {\n margin-bottom: 0;\n display: flow-root;\n -ms-display: grid;\n}\n.cd-commentForm-signature {\n opacity: 0.67;\n}\n.cd-commentForm-dummyElement {\n height: 0;\n}\nol > li.cd-commentForm.cd-commentForm {\n display: list-item;\n -ms-display: list-item;\n}\n.cd-replyWrapper,\n.cd-sectionButtonContainer .cd-commentForm.cd-commentForm {\n margin-top: 0.5em;\n}\n.cd-commentInput {\n margin-top: 1px;\n border: 1px solid #a2a9b1;\n}\n.cd-commentInput .wikiEditor-ui .wikiEditor-ui-top {\n border-color: #a2a9b1;\n}\n.cd-commentInput .wikiEditor-ui .wikiEditor-ui-view {\n border: 0;\n}\n.cd-commentInput.oo-ui-textInputWidget .oo-ui-inputWidget-input.oo-ui-inputWidget-input {\n width: calc(100% + 2px);\n margin: -1px;\n position: relative;\n}\nbody:not(.skin-monobook) .cd-commentInput.oo-ui-textInputWidget .oo-ui-inputWidget-input.oo-ui-inputWidget-input {\n border: 1px solid #a2a9b1;\n box-shadow: none;\n}\nbody:not(.skin-monobook) .cd-commentInput.oo-ui-textInputWidget .oo-ui-inputWidget-input.oo-ui-inputWidget-input:focus {\n outline: 2px solid #36c;\n outline-offset: -2px;\n}\n.cd-previewArea {\n margin-top: 0.5em;\n padding: 0.5em 0.75em;\n background-color: #f8f9fa;\n}\n.cd-previewArea > .mw-parser-output > *:first-child {\n margin-top: 0;\n}\n.cd-previewArea > .mw-parser-output > *:last-child {\n margin-bottom: 0;\n}\n.cd-previewArea .mw-editsection {\n display: none;\n}\n.cd-previewArea:empty {\n margin: 0;\n padding: 0;\n}\n.cd-previewArea-above {\n margin-top: 0;\n margin-bottom: 0.5em;\n width: calc(100% - 1.5em);\n}\n.cd-previewArea-indentedComment > .mw-parser-output > dl:first-child {\n margin-bottom: 0;\n}\n.cd-previewArea-indentedComment > .mw-parser-output > dl:first-child > dd {\n margin-left: 0;\n margin-bottom: 0;\n}\n.cd-previewArea-indentedComment > .mw-parser-output > dl:first-child + p {\n margin-top: 0;\n}\n.cd-messageArea {\n width: 100%;\n}\n.cd-previewArea,\n.cd-messageArea {\n position: relative;\n clear: both;\n}\n.cd-previewArea .cd-closeButton,\n.cd-messageArea .cd-closeButton {\n background-color: #f8f9fa;\n}\n.cd-previewArea:hover .cd-closeButton,\n.cd-messageArea:hover .cd-closeButton {\n opacity: 1;\n}\n.cd-previewArea-above,\n.cd-messageArea {\n float: left;\n}\n.cd-previewArea-above + *,\n.cd-messageArea + * {\n clear: both;\n}\n.cd-commentForm-blockLabel {\n color: #72777d;\n margin-bottom: 0.5em;\n}\n.cd-closeButton {\n position: absolute;\n z-index: 1;\n top: 0;\n right: 0;\n width: 20px;\n height: 20px;\n background-image: url(https://upload.wikimedia.org/wikipedia/commons/1/18/OOjs_UI_icon_close-ltr.svg);\n background-position: center center;\n background-repeat: no-repeat;\n opacity: 0;\n transition: opacity 0.2s ease-in;\n}\n.cd-message {\n margin-bottom: 0.5em;\n}\n.cd-popupsOverlay {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 5;\n font-size: 14px;\n}\n.cd-insertButtons {\n background-color: #f8f9fa;\n border-color: #a2a9b1;\n border-width: 0 1px 1px;\n border-style: solid;\n font-size: 0.928571em;\n line-height: 1.384616em;\n}\n.cd-insertButtons::after {\n display: block;\n content: "";\n clear: both;\n}\n.cd-insertButtons:empty {\n border: 0;\n}\n.cd-insertButtons-item {\n color: #222;\n padding: 2px 0.5em 3px;\n white-space: nowrap;\n display: block;\n float: left;\n}\n.cd-insertButtons-item:hover,\n.cd-insertButtons-item:focus {\n text-decoration: none;\n color: #222;\n background-color: rgba(0, 23, 70, 0.086);\n}\n.cd-toolbarPlaceholder {\n background-color: #f8f9fa;\n border-color: #a2a9b1;\n border-width: 1px 1px 0;\n border-style: solid;\n height: 32px;\n margin: 1px 0 -1px;\n}\n.cd-commentForm-disabled .wikiEditor-ui-top,\n.cd-commentForm-disabled .cd-insertButtons {\n pointer-events: none;\n}\n', "" ]),
module.exports = exports;
}, function(module, exports, __webpack_require__) {
var api = __webpack_require__(3), content = __webpack_require__(18);
"string" == typeof (content = content.__esModule ? content.default : content) && (content = [ [ module.i, content, "" ] ]);
var options = {
insert: "head",
singleton: !1
};
api(content, options);
module.exports = content.locals || {};
}, function(module, exports, __webpack_require__) {
(exports = __webpack_require__(4)(!1)).push([ module.i, '.cd-sectionLinkWrapper::before {\n content: " | ";\n color: #54595d;\n}\n.cd-sectionLink-pending.cd-sectionLink-pending {\n opacity: 0.5;\n cursor: wait;\n text-decoration: none;\n}\n.cd-sectionButtonContainer {\n margin-top: 0.5em;\n}\n.cd-replyWrapper:not(.cd-commentForm) {\n margin-left: -1px;\n}\n.cd-sectionButton {\n padding-top: 0;\n padding-bottom: 0;\n}\nol .cd-sectionButton {\n margin-top: -2px;\n}\n', "" ]),
module.exports = exports;
}, function(module, exports, __webpack_require__) {
var api = __webpack_require__(3), content = __webpack_require__(20);
"string" == typeof (content = content.__esModule ? content.default : content) && (content = [ [ module.i, content, "" ] ]);
var options = {
insert: "head",
singleton: !1
};
api(content, options);
module.exports = content.locals || {};
}, function(module, exports, __webpack_require__) {
(exports = __webpack_require__(4)(!1)).push([ module.i, ".cd-commentUnderlay {\n position: absolute;\n z-index: -1;\n}\n.cd-commentUnderlay-focused.cd-commentUnderlay-focused {\n background-color: var(--cd-comment-underlay-focused-color);\n}\n.cd-commentUnderlay-target.cd-commentUnderlay-target {\n background-color: var(--cd-comment-underlay-target-color);\n}\n.cd-commentUnderlay-new {\n background-color: var(--cd-comment-underlay-new-color);\n}\n.cd-commentUnderlay-own {\n background-color: var(--cd-comment-underlay-own-color);\n}\n.cd-commentOverlay {\n position: absolute;\n display: none;\n pointer-events: none;\n}\n.cd-commentOverlay-focused {\n display: block;\n}\n.cd-commentOverlay-innerWrapper {\n position: absolute;\n z-index: 1;\n bottom: 0;\n right: 0;\n font-size: 14px;\n line-height: normal;\n pointer-events: all;\n}\n.cd-commentOverlay-gradient {\n width: 1.4em;\n display: inline-block;\n padding: 0 1px 4px;\n line-height: 1.28571429em;\n -moz-user-select: none;\n -webkit-user-select: none;\n user-select: none;\n}\n.cd-commentOverlay-content {\n display: inline-block;\n padding: 0 0.5em 2px;\n background-color: var(--cd-comment-underlay-focused-color);\n}\n.cd-commentOverlay-content .oo-ui-buttonWidget {\n margin-right: 0;\n}\n.cd-commentOverlay-content .cd-commentButton:not(:first-child) {\n margin-left: 1em;\n}\n.cd-commentOverlay .cd-button.oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover,\n.cd-commentOverlay .cd-button.oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active {\n background-color: transparent;\n}\n.cd-commentLayersContainerParent {\n position: relative;\n z-index: 0;\n}\n", "" ]),
module.exports = exports;
}, function(module, exports, __webpack_require__) {
var api = __webpack_require__(3), content = __webpack_require__(22);
"string" == typeof (content = content.__esModule ? content.default : content) && (content = [ [ module.i, content, "" ] ]);
var options = {
insert: "head",
singleton: !1
};
api(content, options);
module.exports = content.locals || {};
}, function(module, exports, __webpack_require__) {
(exports = __webpack_require__(4)(!1)).push([ module.i, '#cd-navPanel {\n position: fixed;\n top: 44%;\n left: 0;\n z-index: 5;\n width: 32px;\n background-color: #fff;\n border: 1px solid #a2a9b1;\n border-left: 0;\n opacity: 0.695;\n font-size: 13px;\n line-height: 1.2;\n color: #000;\n -moz-user-select: none;\n -webkit-user-select: none;\n user-select: none;\n}\n#cd-navPanel:hover {\n opacity: 1;\n}\n#cd-navPanel-refreshButton {\n padding: 4px;\n width: 24px;\n height: 24px;\n background-image: url(https://upload.wikimedia.org/wikipedia/commons/1/17/OOjs_UI_icon_reload.svg);\n background-size: 20px 20px;\n}\n#cd-navPanel-refreshButton:not(:empty) {\n background-image: none;\n display: flex;\n justify-content: center;\n align-items: center;\n font-weight: bold;\n}\n#cd-navPanel-previousButton {\n background-image: url(https://upload.wikimedia.org/wikipedia/commons/1/10/OOjs_UI_icon_collapse.svg);\n background-size: 14px 14px;\n}\n#cd-navPanel-nextButton {\n background-image: url(https://upload.wikimedia.org/wikipedia/commons/9/90/OOjs_UI_icon_expand.svg);\n background-size: 14px 14px;\n}\n#cd-navPanel-firstUnseenButton {\n height: 15px;\n padding: 7px 0;\n}\n#cd-navPanel-commentFormButton {\n background-image: url(https://upload.wikimedia.org/wikipedia/commons/a/ac/OOjs_UI_icon_ongoingConversation-ltr.svg);\n background-size: 16px 16px;\n}\n.cd-navPanel-button {\n display: block;\n text-align: center;\n background-position: center center;\n background-repeat: no-repeat;\n cursor: pointer;\n}\n.cd-navPanel-button:hover {\n background-color: #f3f4f5;\n}\n.cd-navPanel-button:not(:first-child) {\n position: relative;\n height: 29px;\n margin-top: 1px;\n}\n.cd-navPanel-button:not(:first-child)::before {\n position: absolute;\n top: -1px;\n left: 4px;\n margin: 0 auto 1px;\n width: 24px;\n height: 0;\n border-top: 1px solid #a2a9b1;\n content: "";\n}\n.cd-navPanel-refreshButton-interesting {\n color: #7d00cc;\n}\n', "" ]),
module.exports = exports;
}, function(module, exports, __webpack_require__) {
var api = __webpack_require__(3), content = __webpack_require__(24);
"string" == typeof (content = content.__esModule ? content.default : content) && (content = [ [ module.i, content, "" ] ]);
var options = {
insert: "head",
singleton: !1
};
api(content, options);
module.exports = content.locals || {};
}, function(module, exports, __webpack_require__) {
(exports = __webpack_require__(4)(!1)).push([ module.i, ".skin-monobook .cd-commentUnderlay {\n z-index: -1;\n}\n.skin-monobook .cd-commentOverlay-innerWrapper {\n z-index: 2;\n}\n.skin-monobook .cd-commentButton.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {\n line-height: 1.172em;\n}\n.skin-monobook .cd-commentInput {\n border: 1px solid #ccc;\n}\n.skin-monobook .cd-commentInput .wikiEditor-ui .wikiEditor-ui-top {\n border-color: #ccc;\n}\n.skin-monobook .cd-insertButtons {\n border-color: #ccc;\n}\n.skin-monobook .cd-toolbarPlaceholder {\n border-color: #ccc;\n}\n.skin-timeless .mw-body-content,\n.skin-modern #mw-content-text {\n position: relative;\n}\n.skin-minerva #mw-content-text dl {\n margin-left: 0;\n}\n.skin-minerva #mw-content-text dd {\n margin-left: 1em;\n}\n", "" ]),
module.exports = exports;
}, function(module, exports, __webpack_require__) {
var api = __webpack_require__(3), content = __webpack_require__(26);
"string" == typeof (content = content.__esModule ? content.default : content) && (content = [ [ module.i, content, "" ] ]);
var options = {
insert: "head",
singleton: !1
};
api(content, options);
module.exports = content.locals || {};
}, function(module, exports, __webpack_require__) {
(exports = __webpack_require__(4)(!1)).push([ module.i, ".cd-commentButton.oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button,\n.cd-sectionButton.oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button {\n padding: 0;\n}\n.cd-commentButton.oo-ui-buttonElement-frameless.oo-ui-labelElement:first-child,\n.cd-sectionButton.oo-ui-buttonElement-frameless.oo-ui-labelElement:first-child {\n margin-left: 0;\n}\n.cd-button.oo-ui-buttonElement > .oo-ui-buttonElement-button {\n min-height: unset;\n}\nol > .cd-replyWrapper:not(.cd-replyWrapper-hasCommentForm) {\n list-style-type: none;\n}\n.action-view .cd-hidden:not(#cd-notExistingClass) {\n display: none;\n}\np.cd-shown {\n display: block !important;\n}\n.cd-destructiveText {\n color: #d33;\n}\n.cd-loadingPopup {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 1.5em;\n z-index: 111;\n margin: 0 auto;\n padding: 17px 17px 11px 17px;\n background-color: #fff;\n border: 1px solid #c8ccd1;\n}\n.cd-loadingPopup-logo {\n display: block;\n margin: 0 auto;\n}\n.cd-spaceBeforeSectionMenu {\n height: 0;\n float: right;\n}\n.cd-notification-restoreCommentForms {\n display: inline-block;\n position: relative;\n padding: 0.25em;\n margin: -0.25em;\n}\n", "" ]),
module.exports = exports;
}, function(module, exports, __webpack_require__) {
var api = __webpack_require__(3), content = __webpack_require__(28);
"string" == typeof (content = content.__esModule ? content.default : content) && (content = [ [ module.i, content, "" ] ]);
var options = {
insert: "head",
singleton: !1
};
api(content, options);
module.exports = content.locals || {};
}, function(module, exports, __webpack_require__) {
(exports = __webpack_require__(4)(!1)).push([ module.i, ".cd-commentLink-interesting a {\n font-weight: bold;\n}\n.cd-watchlistMenu {\n display: inline-block;\n border: 1px solid #a2a9b1;\n border-radius: 2px;\n padding: 0 0.5em 0.5em;\n vertical-align: top;\n margin: -10px 1em 0 0.5em;\n}\n#mw-watchlist-options .cd-watchlistMenu {\n float: right;\n}\n.cd-watchlistMenu-legend {\n padding: 0 0.5em;\n}\n.cd-watchlistMenu-button {\n margin-right: 0;\n}\n.cd-watchlistMenu-button-switchInteresting {\n margin-bottom: -2px;\n}\n.cd-editWatchedSections-input {\n margin: 1px 0;\n}\n.cd-editWatchedSections-input textarea {\n resize: none;\n}\n", "" ]),
module.exports = exports;
}, function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
var nano_css = __webpack_require__(6), asyncToGenerator = __webpack_require__(1), asyncToGenerator_default = __webpack_require__.n(asyncToGenerator), classPrivateFieldGet = __webpack_require__(0), classPrivateFieldGet_default = __webpack_require__.n(classPrivateFieldGet), classPrivateFieldSet = __webpack_require__(2), classPrivateFieldSet_default = __webpack_require__.n(classPrivateFieldSet);
class CdError extends Error {
constructor(data) {
let message;
data ? (message = data.type, data.code && (message += "/".concat(data.code)), data.apiData && data.apiData.error && data.apiData.error.code && (message += "/".concat(data.apiData.error.code))) : message = "",
super(message), this.name = "CdError", this.data = data;
}
}
const context = "undefined" == typeof window ? self : window;
context.convenientDiscussions = context.convenientDiscussions || {}, "object" != typeof context.convenientDiscussions && (context.convenientDiscussions = {});
var cd = context.convenientDiscussions;
class TreeWalker {
constructor(root, acceptNode, onlyElementNodes = !1, startNode = root) {
this.acceptNode = acceptNode, this.root = root, this.currentNode = startNode, onlyElementNodes ? (this.firstChildProperty = "firstElementChild",
this.lastChildProperty = "lastElementChild", this.previousSiblingProperty = "previousElementSibling",
this.nextSiblingProperty = "nextElementSibling") : (this.firstChildProperty = "firstChild",
this.lastChildProperty = "lastChild", this.previousSiblingProperty = "previousSibling",
this.nextSiblingProperty = "nextSibling");
}
tryMove(property) {
let node = this.currentNode;
if (node === this.root && !property.includes("Child")) return null;
do {
node = node[property];
} while (node && this.acceptNode && !this.acceptNode(node));
return node && (this.currentNode = node), node || null;
}
parentNode() {
return this.tryMove("parentNode");
}
firstChild() {
return this.tryMove(this.firstChildProperty);
}
lastChild() {
return this.tryMove(this.lastChildProperty);
}
previousSibling() {
return this.tryMove(this.previousSiblingProperty);
}
nextSibling() {
return this.tryMove(this.nextSiblingProperty);
}
nextNode() {
let node = this.currentNode;
do {
if (node[this.firstChildProperty]) node = node[this.firstChildProperty]; else {
for (;node && !node[this.nextSiblingProperty] && node.parentNode !== this.root; ) node = node.parentNode;
node && (node = node[this.nextSiblingProperty]);
}
} while (node && this.acceptNode && !this.acceptNode(node));
return node && (this.currentNode = node), node;
}
previousNode() {
let node = this.currentNode;
if (node !== this.root) {
do {
if (node[this.previousSiblingProperty]) for (node = node[this.previousSiblingProperty]; node[this.lastChildProperty]; ) node = node[this.lastChildProperty]; else node = node.parentNode;
} while (node && this.acceptNode && !this.acceptNode(node));
return node && (this.currentNode = node), node;
}
}
}
class treeWalker_ElementsTreeWalker extends TreeWalker {
constructor(startNode) {
super(cd.g.rootElement, node => ![ "STYLE", "LINK" ].includes(node.tagName), !0),
startNode && (this.currentNode = startNode);
}
}
class treeWalker_ElementsAndTextTreeWalker extends TreeWalker {
constructor(startNode) {
super(cd.g.rootElement, node => node.nodeType === Node.TEXT_NODE || node.nodeType === Node.ELEMENT_NODE && ![ "STYLE", "LINK" ].includes(node.tagName)),
startNode && (this.currentNode = startNode);
}
}
var _parser = new WeakMap;
function removeDuplicates(arr) {
return arr && "object" == typeof arr ? arr.filter((value, i) => arr.indexOf(value) === i) : null;
}
function isInline(node, countTextNodesAsInline) {
return !(!countTextNodesAsInline || node.nodeType !== Node.TEXT_NODE) || (node.nodeType !== Node.ELEMENT_NODE ? null : !!cd.g.POPULAR_INLINE_ELEMENTS.includes(node.tagName) || !cd.g.POPULAR_NOT_INLINE_ELEMENTS.includes(node.tagName) && ("undefined" != typeof window ? (console.warn("Expensive operation: isInline() called for the element:", node),
"inline" === window.getComputedStyle(node).display) : null));
}
function caseInsensitiveFirstCharPattern(s) {
const firstChar = s[0];
return (firstChar.toUpperCase() !== firstChar.toLowerCase() ? "[" + firstChar.toUpperCase() + firstChar.toLowerCase() + "]" : mw.util.escapeRegExp(firstChar)) + mw.util.escapeRegExp(s.slice(1));
}
function isTalkNamespace(namespaceNumber) {
return namespaceNumber % 2 == 1 || cd.config.customTalkNamespaces.includes(namespaceNumber);
}
function isProbablyTalkPage(page, namespaceNumber) {
if (void 0 === namespaceNumber) {
namespaceNumber = new mw.Title.newFromText(page).namespace;
}
return isTalkNamespace(namespaceNumber) && (namespaceNumber % 2 == 1 || !cd.config.pageWhiteListRegexp || cd.config.pageWhiteListRegexp.test(page)) && (!cd.config.pageBlackListRegexp || !cd.config.pageBlackListRegexp.test(page));
}
function isCommentEdit(summary) {
return summary && (summary.includes("".concat(cd.s("es-edit"), " ").concat(cd.s("es-reply-genitive"))) || summary.includes("".concat(cd.s("es-edit"), " ").concat(cd.s("es-addition-genitive"))));
}
function isUndo(summary) {
return summary && cd.config.undoTexts.some(text => summary.includes(text));
}
function defined(el) {
return void 0 !== el;
}
function notNull(el) {
return null != el;
}
function reorderArray(arr, startIndex, reverse = !1) {
return reverse ? arr.slice(startIndex + 1).concat(arr.slice(0, startIndex + 1)).reverse() : arr.slice(startIndex).concat(arr.slice(0, startIndex));
}
function handleApiReject(code, data) {
throw new CdError("http" === code ? {
type: "network"
} : {
type: "api",
code: "error",
apiData: data
});
}
function underlinesToSpaces(s) {
return s.replace(/_/g, " ");
}
function spacesToUnderlines(s) {
return s.replace(/ /g, "_");
}
function animateLink(html, className, callback) {
const $link = html instanceof $ ? html : cd.util.wrapInElement(html);
return $link.find(".".concat(className)).on("click", callback), $link;
}
function firstCharToUpperCase(s) {
return s.length ? s[0].toUpperCase() + s.slice(1) : "";
}
function util_getMessages(messages) {
return messages.map(mw.msg);
}
function isInputFocused() {
return $(":focus:input").length || $(":focus").prop("isContentEditable");
}
var commentLayers = {
underlays: [],
layersContainers: [],
redrawIfNecessary(removeUnhighlighted = !1) {
if (!this.underlays.length || document.hidden) return;
const comments = [], rootBottom = cd.g.$root.get(0).getBoundingClientRect().bottom + window.pageYOffset;
let floatingRects, notMovedCount = 0;
cd.comments.slice().reverse().some(comment => {
const shouldBeHighlighted = comment.newness || comment.own && cd.settings.highlightOwnComments;
if ((removeUnhighlighted || comment.positions && comment.positions.bottom > rootBottom) && !shouldBeHighlighted && comment.$underlay) comment.removeLayers(); else if (shouldBeHighlighted && !comment.editForm) {
floatingRects = floatingRects || cd.g.specialElements.floating.map(el => el.getBoundingClientRect());
const isMoved = comment.configureLayers(!1, floatingRects);
if (isMoved) notMovedCount = 0, comments.push(comment); else if (!1 === isMoved && (notMovedCount++,
2 === notMovedCount)) return !0;
}
}), comments.forEach(comment => {
comment.updateLayersPositions();
});
},
reset() {
this.underlays = [], this.layersContainers.forEach(container => {
container.innerHTML = "";
});
}
}, userRegistry = {
users: {},
getUser(name) {
if (name.includes("#") && (name = name.slice(0, name.indexOf("#"))), name = underlinesToSpaces(firstCharToUpperCase(name)).trim(),
!this.users[name]) {
const options = name === cd.g.CURRENT_USER_NAME ? {
gender: cd.g.CURRENT_USER_GENDER
} : {};
this.users[name] = new userRegistry_User(name, options);
}
return this.users[name];
}
};
class userRegistry_User {
constructor(name, options = {}) {
_cachedRegistered.set(this, {
writable: !0,
value: void 0
}), this.name = name, this.options = new mw.Map, Object.keys(options).forEach(name => {
this[name] = options[name];
});
}
get registered() {
return void 0 === classPrivateFieldGet_default()(this, _cachedRegistered) && classPrivateFieldSet_default()(this, _cachedRegistered, !mw.util.isIPAddress(this.name)),
classPrivateFieldGet_default()(this, _cachedRegistered);
}
set gender(value) {
this.options.set("gender", value);
}
get gender() {
return this.options.get("gender");
}
}
var _cachedRegistered = new WeakMap, lz_string = __webpack_require__(5), lz_string_default = __webpack_require__.n(lz_string);
function packVisits(visits) {
return Object.keys(visits).map(key => "".concat(key, ",").concat(visits[key].join(","), "\n")).join("").trim();
}
function getSettings() {
return _getSettings.apply(this, arguments);
}
function _getSettings() {
return (_getSettings = asyncToGenerator_default()((function*(reuse = !1) {
const {options: options} = yield getUserInfo(reuse);
let settings;
try {
settings = JSON.parse(options[cd.g.SETTINGS_OPTION_FULL_NAME]) || {};
} catch (e) {
settings = cd.settings;
}
return settings;
}))).apply(this, arguments);
}
function setSettings(_x) {
return _setSettings.apply(this, arguments);
}
function _setSettings() {
return (_setSettings = asyncToGenerator_default()((function*(settings) {
yield setOption(cd.g.SETTINGS_OPTION_FULL_NAME, JSON.stringify(settings || cd.settings));
}))).apply(this, arguments);
}
function getVisits() {
return _getVisits.apply(this, arguments);
}
function _getVisits() {
return (_getVisits = asyncToGenerator_default()((function*(reuse = !1) {
const visits = yield cd.g.firstRun && null === mw.user.options.get(cd.g.VISITS_OPTION_FULL_NAME) ? Promise.resolve({}) : getUserInfo(reuse).then(options => options.visits), articleId = mw.config.get("wgArticleId");
let thisPageVisits;
return articleId && (visits[articleId] = visits[articleId] || [], thisPageVisits = visits[articleId]),
cd.g.visits = visits, cd.g.thisPageVisits = thisPageVisits, {
visits: visits,
thisPageVisits: thisPageVisits
};
}))).apply(this, arguments);
}
function cleanUpVisits(originalVisits) {
const visits = Object.assign({}, originalVisits), timestamps = Object.keys(visits).reduce((acc, key) => acc.concat(visits[key]), []);
timestamps.sort();
const boundary = timestamps[Math.floor(timestamps.length / 10)];
return Object.keys(visits).forEach(key => {
visits[key] = visits[key].filter(visit => visit >= boundary), visits[key].length || delete visits[key];
}), visits;
}
function setVisits(_x2) {
return _setVisits.apply(this, arguments);
}
function _setVisits() {
return (_setVisits = asyncToGenerator_default()((function*(visits) {
if (!visits) return;
const visitsString = packVisits(visits), visitsStringCompressed = lz_string_default.a.compressToEncodedURIComponent(visitsString);
try {
yield setOption(cd.g.VISITS_OPTION_FULL_NAME, visitsStringCompressed);
} catch (e) {
if (e instanceof CdError) {
const {type: type, code: code} = e.data;
"internal" === type && "sizeLimit" === code ? setVisits(cleanUpVisits(visits)) : console.error(e);
} else console.error(e);
}
}))).apply(this, arguments);
}
function getWatchedSections() {
return _getWatchedSections.apply(this, arguments);
}
function _getWatchedSections() {
return (_getWatchedSections = asyncToGenerator_default()((function*(reuse = !1, keptData = {}, noTimers = !1) {
const watchedSections = yield cd.g.firstRun && null === mw.user.options.get(cd.g.WATCHED_SECTIONS_OPTION_FULL_NAME) ? Promise.resolve({}) : getUserInfo(reuse).then(options => options.watchedSections), articleId = mw.config.get("wgArticleId");
let thisPageWatchedSections;
return articleId && (watchedSections[articleId] = watchedSections[articleId] || [],
thisPageWatchedSections = watchedSections[articleId], keptData.justWatchedSection && (thisPageWatchedSections.includes(keptData.justWatchedSection) || thisPageWatchedSections.push(keptData.justWatchedSection)),
keptData.justUnwatchedSection && thisPageWatchedSections.includes(keptData.justUnwatchedSection) && thisPageWatchedSections.splice(thisPageWatchedSections.indexOf(keptData.justUnwatchedSection), 1)),
{
watchedSections: watchedSections,
thisPageWatchedSections: thisPageWatchedSections
};
}))).apply(this, arguments);
}
function setWatchedSections(watchedSections) {
const watchedSectionsString = function(watchedSections) {
return Object.keys(watchedSections).filter(pageId => watchedSections[pageId].length).map(key => " ".concat(key, " ").concat(watchedSections[key].join("\n"), "\n")).join("").trim();
}(watchedSections), watchedSectionsStringCompressed = lz_string_default.a.compressToEncodedURIComponent(watchedSectionsString);
setOption(cd.g.WATCHED_SECTIONS_OPTION_FULL_NAME, watchedSectionsStringCompressed);
}
function makeRequestNoTimers(params, method = "get") {
return new Promise((resolve, reject) => {
cd.g.api[method](params, {
success: resp => {
resp.error ? reject("api", resp) : resolve(resp);
},
error: (jqXHR, textStatus) => {
reject("http", textStatus);
}
});
});
}
function getCurrentPageData() {
return _getCurrentPageData.apply(this, arguments);
}
function _getCurrentPageData() {
return (_getCurrentPageData = asyncToGenerator_default()((function*(markAsRead = !1, noTimers = !1) {
const params = {
action: "parse",
page: cd.g.CURRENT_PAGE,
prop: [ "text", "revid", "modules", "jsconfigvars" ],
formatversion: 2
}, request = noTimers ? makeRequestNoTimers(params).catch(handleApiReject) : cd.g.api.get(params).catch(handleApiReject);
markAsRead && $.get(mw.util.getUrl(cd.g.CURRENT_PAGE));
const resp = yield request;
if (void 0 === resp.parse) throw new CdError({
type: "api",
code: "noData"
});
return resp.parse;
}))).apply(this, arguments);
}
function parseCode(_x, _x2) {
return _parseCode.apply(this, arguments);
}
function _parseCode() {
return (_parseCode = asyncToGenerator_default()((function*(code, options) {
const defaultOptions = {
action: "parse",
text: code,
prop: [ "text", "modules" ],
pst: !0,
disablelimitreport: !0,
formatversion: 2
};
return cd.g.api.post(Object.assign({}, defaultOptions, options)).then(resp => {
const html = resp && resp.parse && resp.parse.text;
if (!html) throw new CdError({
type: "api",
code: "noData"
});
return mw.loader.load(resp.parse.modules), mw.loader.load(resp.parse.modulestyles),
{
html: html,
parsedSummary: resp.parse.parsedsummary
};
}, handleApiReject);
}))).apply(this, arguments);
}
function getLastRevision(_x3) {
return _getLastRevision.apply(this, arguments);
}
function _getLastRevision() {
return (_getLastRevision = asyncToGenerator_default()((function*(title) {
if (!mw.config.get("wgArticleId")) return {
code: ""
};
const resp = yield cd.g.api.get({
action: "query",
titles: title.toString(),
prop: "revisions",
rvprop: [ "ids", "content" ],
redirects: !0,
curtimestamp: !0,
formatversion: 2
}).catch(handleApiReject), query = resp.query, page = query && query.pages && query.pages[0], revision = page && page.revisions && page.revisions[0];
if (!query || !page) throw new CdError({
type: "api",
code: "noData"
});
if (page.missing) throw new CdError({
type: "api",
code: "missing"
});
if (page.invalid) throw new CdError({
type: "api",
code: "invalid"
});
if (!revision) throw new CdError({
type: "api",
code: "noData"
});
return {
code: revision.content,
revisionId: revision.revid,
redirectTarget: query.redirects && query.redirects[0] && query.redirects[0].to,
queryTimestamp: resp.curtimestamp
};
}))).apply(this, arguments);
}
let keptUserInfoRequest;
function getUserInfo(reuse = !1) {
if (reuse && keptUserInfoRequest) return keptUserInfoRequest;
return keptUserInfoRequest = makeRequestNoTimers({
action: "query",
meta: "userinfo",
uiprop: [ "options", "rights" ],
formatversion: 2
}).then(resp => {
const userinfo = resp && resp.query && resp.query.userinfo, options = userinfo && userinfo.options, rights = userinfo && userinfo.rights;
if (!options || !rights) throw new CdError({
type: "api",
code: "noData"
});
const visitsCompressed = options[cd.g.VISITS_OPTION_FULL_NAME], visits = function(visitsString) {
const visits = {}, regexp = /^(\d+), *(.+)$/gm;
let match;
for (;match = regexp.exec(visitsString); ) visits[match[1]] = match[2].split(",");
return visits;
}(visitsCompressed ? lz_string_default.a.decompressFromEncodedURIComponent(visitsCompressed) : ""), watchedSectionsCompressed = options[cd.g.WATCHED_SECTIONS_OPTION_FULL_NAME], watchedSections = function(watchedSectionsString) {
const watchedSections = {}, pages = watchedSectionsString.split(/(?:^|\n )(\d+) /).slice(1);
let pageId;
for (let i = 0, isPageId = !0; i < pages.length; i++, isPageId = !isPageId) isPageId ? pageId = pages[i] : watchedSections[pageId] = pages[i].split("\n");
return watchedSections;
}(watchedSectionsCompressed ? lz_string_default.a.decompressFromEncodedURIComponent(watchedSectionsCompressed) : "");
return cd.g.CURRENT_USER_RIGHTS = rights, {
options: options,
visits: visits,
watchedSections: watchedSections,
rights: rights
};
}, handleApiReject), keptUserInfoRequest;
}
function getPageTitles(_x4) {
return _getPageTitles.apply(this, arguments);
}
function _getPageTitles() {
return (_getPageTitles = asyncToGenerator_default()((function*(pageIds) {
const allPages = [], limit = cd.g.CURRENT_USER_RIGHTS && cd.g.CURRENT_USER_RIGHTS.includes("apihighlimits") ? 500 : 50;
let nextPageIds;
for (;nextPageIds = pageIds.splice(0, limit).join("|"); ) {
const resp = yield cd.g.api.post({
action: "query",
pageids: nextPageIds,
formatversion: 2
}).catch(handleApiReject);
if (resp.error) throw new CdError({
type: "api",
code: "error",
apiData: resp
});
const query = resp && resp.query, pages = query && query.pages;
if (!pages) throw new CdError({
type: "api",
code: "noData"
});
allPages.push(...pages);
}
return allPages;
}))).apply(this, arguments);
}
function getPageIds(_x5) {
return _getPageIds.apply(this, arguments);
}
function _getPageIds() {
return (_getPageIds = asyncToGenerator_default()((function*(pageTitles) {
const allPages = [], allNormalized = [], allRedirects = [], limit = cd.g.CURRENT_USER_RIGHTS && cd.g.CURRENT_USER_RIGHTS.includes("apihighlimits") ? 500 : 50;
let nextPageTitles;
for (;nextPageTitles = pageTitles.splice(0, limit).join("|"); ) {
const resp = yield cd.g.api.post({
action: "query",
titles: nextPageTitles,
redirects: !0,
formatversion: 2
}).catch(handleApiReject);
if (resp.error) throw new CdError({
type: "api",
code: "error",
apiData: resp
});
const query = resp && resp.query, pages = query && query.pages;
if (!pages) throw new CdError({
type: "api",
code: "noData"
});
const normalized = query.normalized || [], redirects = query.redirects || [];
allNormalized.push(...normalized), allRedirects.push(...redirects), allPages.push(...pages);
}
return {
pages: allPages,
normalized: allNormalized,
redirects: allRedirects
};
}))).apply(this, arguments);
}
function setOption(_x6, _x7) {
return _setOption.apply(this, arguments);
}
function _setOption() {
return (_setOption = asyncToGenerator_default()((function*(name, value) {
if (value.length > 65535) throw new CdError({
type: "internal",
code: "sizeLimit"
});
const resp = yield cd.g.api.postWithToken("csrf", {
action: "options",
optionname: name,
optionvalue: value
}).catch(handleApiReject);
if (!resp || "success" !== resp.options) throw new CdError({
type: "api",
code: "noSuccess"
});
}))).apply(this, arguments);
}
function getUserGenders(_x8) {
return _getUserGenders.apply(this, arguments);
}
function _getUserGenders() {
return (_getUserGenders = asyncToGenerator_default()((function*(users, noTimers = !1) {
const usersToRequest = users.filter(user => !user.gender).map(user => user.name), limit = cd.g.CURRENT_USER_RIGHTS && cd.g.CURRENT_USER_RIGHTS.includes("apihighlimits") ? 500 : 50;
let nextUsers;
for (;nextUsers = usersToRequest.splice(0, limit).join("|"); ) {
const params = {
action: "query",
list: "users",
ususers: nextUsers,
usprop: "gender",
formatversion: 2
}, request = noTimers ? makeRequestNoTimers(params, "post").catch(handleApiReject) : cd.g.api.post(params).catch(handleApiReject), resp = yield request, users = resp && resp.query && resp.query.users;
if (!users) throw new CdError({
type: "api",
code: "noData"
});
users.forEach(user => {
userRegistry.getUser(user.name).gender = user.gender;
});
}
}))).apply(this, arguments);
}
var jqueryExtensions = {
cdRemoveNonElementNodes: function() {
return this.filter((function() {
return this.nodeType === Node.ELEMENT_NODE;
}));
},
cdScrollTo(alignment = "top", smooth = !0, callback) {
cd.g.autoScrollInProgress = !0;
let offset, $elements = this.cdRemoveNonElementNodes();
const offsetTop = $elements.first().offset().top, offsetLast = $elements.last().offset().top + $elements.last().height();
return offset = "center" === alignment ? Math.min(offsetTop, offsetTop + .5 * (offsetLast - offsetTop) - .5 * $(window).height()) : "bottom" === alignment ? offsetLast - $(window).height() : offsetTop,
smooth ? $("body, html").animate({
scrollTop: offset
}, {
complete: () => {
cd.g.autoScrollInProgress = !1, js_navPanel.isMounted() && (js_navPanel.registerSeenComments(),
js_navPanel.updateCommentFormButton()), callback && callback();
}
}) : (window.scrollTo(0, offset), cd.g.autoScrollInProgress = !1, js_navPanel.isMounted() && (js_navPanel.registerSeenComments(),
js_navPanel.updateCommentFormButton())), this;
},
cdIsInViewport(partially = !1) {
const $elements = this.cdRemoveNonElementNodes(), wasHidden = $elements.get().every(el => "none" === el.style.display);
wasHidden && $elements.show();
const elementTop = $elements.first().offset().top, elementBottom = $elements.last().offset().top + $elements.last().height();
wasHidden && $elements.hide();
const viewportTop = $(window).scrollTop(), viewportBottom = viewportTop + $(window).height();
return partially ? elementBottom > viewportTop && elementTop < viewportBottom : elementTop >= viewportTop && elementBottom <= viewportBottom;
},
cdScrollIntoView(alignment) {
return this.cdIsInViewport() || this.cdScrollTo(alignment), this;
},
cdGetText() {
let text;
const dummyElement = document.createElement("div");
return Array.from(this.get(0).childNodes).forEach(node => {
dummyElement.appendChild(node.cloneNode(!0));
}), document.body.appendChild(dummyElement), text = dummyElement.innerText, document.body.removeChild(dummyElement),
text;
},
cdAddCloseButton() {
if (this.find(".cd-closeButton").length) return this;
const $closeButton = $("<a>").attr("title", cd.s("cf-block-close")).addClass("cd-closeButton").on("click", () => {
this.empty();
});
return this.prepend($closeButton), this;
}
};
let parseTimestampRegexp, parseTimestampRegexpNoTimezone;
function parseTimestamp(timestamp, timezoneOffset) {
parseTimestampRegexp || (parseTimestampRegexp = new RegExp("^([^]*)(".concat(cd.g.TIMESTAMP_REGEXP.source, ")"))),
parseTimestampRegexpNoTimezone || (parseTimestampRegexpNoTimezone = new RegExp("^([^]*)(".concat(cd.g.TIMESTAMP_REGEXP_NO_TIMEZONE.source, ")")));
const regexp = void 0 === timezoneOffset ? parseTimestampRegexp : parseTimestampRegexpNoTimezone, match = timestamp.match(regexp);
if (!match) return null;
let date = cd.g.TIMESTAMP_PARSER(match, cd.g.TIMESTAMP_MATCHING_GROUPS, cd.g.DIGITS, cd.g.LOCAL_TIMEZONE_OFFSET);
return timezoneOffset && (date = new Date(date.getTime() - timezoneOffset * cd.g.MILLISECONDS_IN_A_MINUTE)),
{
date: date,
match: match
};
}
function zeroPad(number, length) {
return ("0000" + number).slice(-length);
}
function formatDate(date) {
const format = cd.g.DATE_FORMAT;
let s = "";
for (let p = 0; p < format.length; p++) {
let code = format[p];
switch ("x" === code && p < format.length - 1 && (code += format[++p]), "xk" === code && p < format.length - 1 && (code += format[++p]),
code) {
case "xx":
s += "x";
break;
case "xg":
s += util_getMessages([ "january-gen", "february-gen", "march-gen", "april-gen", "may-gen", "june-gen", "july-gen", "august-gen", "september-gen", "october-gen", "november-gen", "december-gen" ])[date.getUTCMonth()];
break;
case "d":
s += zeroPad(date.getUTCDate(), 2);
break;
case "D":
s += util_getMessages([ "sun", "mon", "tue", "wed", "thu", "fri", "sat" ])[date.getUTCDay()];
break;
case "j":
s += date.getUTCDate();
break;
case "l":
s += util_getMessages([ "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday" ])[date.getDay()];
break;
case "F":
s += util_getMessages([ "january", "february", "march", "april", "may_long", "june", "july", "august", "september", "october", "november", "december" ])[date.getUTCMonth()];
break;
case "M":
s += util_getMessages([ "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec" ])[date.getUTCMonth()];
break;
case "n":
s += date.getUTCMonth() + 1;
break;
case "Y":
s += date.getUTCFullYear();
break;
case "xkY":
s += date.getUTCFullYear() + 543;
break;
case "G":
s += date.getUTCHours();
break;
case "H":
s += zeroPad(date.getUTCHours(), 2);
break;
case "i":
s += zeroPad(date.getUTCMinutes(), 2);
break;
case "\\":
p < format.length - 1 ? s += format[++p] : s += "\\";
break;
case '"':
if (p < format.length - 1) {
const endQuote = format.indexOf('"', p + 1);
-1 === endQuote ? s += '"' : (s += format.substr(p + 1, endQuote - p - 1), p = endQuote);
} else s += '"';
break;
default:
s += format[p];
}
}
return s;
}
function generateCommentAnchor(date, author, resolveCollisions = !1) {
let year = date.getUTCFullYear(), month = date.getUTCMonth(), day = date.getUTCDate(), hours = date.getUTCHours(), minutes = date.getUTCMinutes(), anchor = zeroPad(year, 4) + zeroPad(month + 1, 2) + zeroPad(day, 2) + zeroPad(hours, 2) + zeroPad(minutes, 2) + (author ? "_" + spacesToUnderlines(author) : "");
if (resolveCollisions && commentAnchors.includes(anchor)) {
let anchorNum = 2;
const base = anchor;
do {
anchor = "".concat(base, "_").concat(anchorNum), anchorNum++;
} while (commentAnchors.includes(anchor));
}
return anchor;
}
let commentAnchors = [];
function registerCommentAnchor(anchor) {
anchor && commentAnchors.push(anchor);
}
function resetCommentAnchors() {
commentAnchors = [];
}
function parseCommentAnchor(commentAnchor) {
const match = commentAnchor.match(/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})_(.+)$/);
if (!match) return null;
const year = Number(match[1]), month = Number(match[2]) - 1, day = Number(match[3]), hours = Number(match[4]), minutes = Number(match[5]), author = match[6];
return {
date: new Date(Date.UTC(year, month, day, hours, minutes)),
author: author
};
}
function getUserNameFromLink(element) {
const href = element.getAttribute("href");
if (!href) return null;
const pageName = function(url) {
if ("undefined" == typeof mw || "/wiki/$1" === mw.config.get("wgArticlePath") && "/w/index.php" === mw.config.get("wgScript")) {
url = url.replace(/^(?:https?:)?\/\/[^/]+/, "").replace(/^\/wiki\//, "").replace(/^\/w\/index.php\?title=/, "").replace(/&action=edit.*/, "").replace(/#.*/, "").replace(/_/g, " ");
try {
url = decodeURIComponent(url);
} catch (e) {
return null;
}
return url;
}
{
const uri = new mw.Uri(url), match = uri.path.match(cd.g.ARTICLE_PATH_REGEXP);
if (match) try {
return decodeURIComponent(match[1]);
} catch (e) {
return null;
}
return uri.query.title ? uri.query.title : null;
}
}(href);
if (!pageName) return null;
let userName;
const match = pageName.match(cd.g.USER_NAMESPACES_REGEXP);
return match ? userName = match[1] : pageName.startsWith(cd.g.CONTRIBS_PAGE + "/") && (userName = pageName.replace(cd.g.CONTRIBS_PAGE_LINK_REGEXP, "")),
userName && firstCharToUpperCase(underlinesToSpaces(userName.replace(/\/.*/, ""))).trim();
}
class Parser_Parser {
constructor(context) {
this.context = context;
}
createComment(signature) {
return new this.context.CommentClass(this, signature);
}
createSection(headingElement, watchedSectionsRequest) {
return new this.context.SectionClass(this, headingElement, watchedSectionsRequest);
}
findTimestamps() {
const blocksToExclude = [ ...Array.from(cd.g.rootElement.getElementsByTagName("blockquote")), ...(arr = cd.config.elementsToExcludeClasses.map(className => Array.from(cd.g.rootElement.getElementsByClassName(className))),
[].concat(...arr)) ];
var arr;
return this.context.getAllTextNodes().map(node => {
const text = node.textContent, {date: date, match: match} = parseTimestamp(text) || {};
if (date && !blocksToExclude.some(block => block.contains(node))) return {
node: node,
date: date,
match: match
};
}).filter(defined).map(finding => {
const {node: node, match: match, date: date} = finding, element = this.context.document.createElement("span");
element.classList.add("cd-timestamp");
const textNode = this.context.document.createTextNode(match[2]);
element.appendChild(textNode);
const remainedText = node.textContent.slice(match.index + match[0].length);
let afterNode;
return remainedText && (afterNode = this.context.document.createTextNode(remainedText)),
node.textContent = node.textContent.slice(0, match.index + match[1].length), node.parentNode.insertBefore(element, node.nextSibling),
afterNode && node.parentNode.insertBefore(afterNode, element.nextSibling), {
element: element,
date: date
};
});
}
findSignatures(timestamps) {
const signatures = timestamps.map(timestamp => {
const date = timestamp.date, timestampElement = timestamp.element, timestampText = timestamp.element.textContent;
let unsignedElement, closestNotInlineAncestor;
for (let el = timestamp.element; !closestNotInlineAncestor; el = el.parentNode) isInline(el) ? el.classList.contains(cd.config.unsignedClass) && (unsignedElement = el) : closestNotInlineAncestor = el;
const unsigned = Boolean(unsignedElement);
if (closestNotInlineAncestor) {
const cniaChildren = Array.from(closestNotInlineAncestor[this.context.childElementsProperty]), treeWalker = new treeWalker_ElementsTreeWalker(timestamp.element);
let found = !1;
for (;!found && treeWalker.nextNode() && closestNotInlineAncestor.contains(treeWalker.currentNode) && (!cniaChildren.includes(treeWalker.currentNode) || isInline(treeWalker.currentNode)); ) treeWalker.currentNode.classList.contains("cd-timestamp") && (found = !0);
if (found) return;
}
const startElement = unsignedElement || timestamp.element, treeWalker = new treeWalker_ElementsAndTextTreeWalker(startElement);
let authorName, firstSignatureElement, length = 0;
const signatureNodes = [];
unsignedElement ? firstSignatureElement = startElement : (signatureNodes.push(startElement),
treeWalker.previousSibling());
do {
const node = treeWalker.currentNode;
if (length += node.textContent.length, node.nodeType === Node.ELEMENT_NODE) {
if (node.classList.contains("cd-timestamp")) break;
let hasAuthorLinks = !1;
if ("A" === node.tagName) {
const userName = getUserNameFromLink(node);
userName && (authorName || (authorName = userName), authorName === userName && (hasAuthorLinks = !0));
} else {
Array.from(node.getElementsByTagName("a")).some(link => {
const userName = getUserNameFromLink(link);
if (userName && (authorName || (authorName = userName), authorName === userName)) return hasAuthorLinks = !0,
!0;
});
}
hasAuthorLinks && (firstSignatureElement = node);
}
signatureNodes.push(node);
} while (treeWalker.previousSibling() && length < cd.config.signatureScanLimit);
const firstSignatureElementIndex = signatureNodes.indexOf(firstSignatureElement);
signatureNodes.splice(-1 === firstSignatureElementIndex ? 1 : firstSignatureElementIndex + 1);
const anchor = generateCommentAnchor(timestamp.date, authorName, !0);
registerCommentAnchor(anchor);
const signatureContainer = startElement.parentNode, startElementNextSibling = startElement.nextSibling, element = this.context.document.createElement("span");
if (element.classList.add("cd-signature"), signatureNodes.reverse().forEach(node => {
element.appendChild(node);
}), signatureContainer.insertBefore(element, startElementNextSibling), authorName) return {
element: element,
timestampElement: timestampElement,
timestampText: timestampText,
date: date,
authorName: authorName,
anchor: anchor,
unsigned: unsigned
};
}).filter(defined);
return cd.config.unsignedClass && Array.from(cd.g.rootElement.getElementsByClassName(cd.config.unsignedClass)).forEach(element => {
if (!this.context.getElementByClassName(element, "cd-timestamp")) {
Array.from(element.getElementsByTagName("a")).some(link => {
const authorName = getUserNameFromLink(link);
if (authorName) {
element.classList.add("cd-signature");
const unsigned = !0;
return signatures.push({
element: element,
authorName: authorName,
unsigned: unsigned
}), !0;
}
});
}
}), signatures.sort((sig1, sig2) => this.context.follows(sig1.element, sig2.element) ? 1 : -1),
signatures;
}
collectParts(signatureElement) {
const treeWalker = new treeWalker_ElementsAndTextTreeWalker(signatureElement);
let firstForeignComponentAfter, parts = [];
for (;!firstForeignComponentAfter; ) {
for (;!treeWalker.currentNode.nextSibling && treeWalker.parentNode(); ) ;
if (!treeWalker.nextSibling()) break;
isInline(treeWalker.currentNode, !0) || (firstForeignComponentAfter = treeWalker.currentNode);
}
if (firstForeignComponentAfter && signatureElement.parentNode.contains(firstForeignComponentAfter)) {
for (treeWalker.currentNode = signatureElement; treeWalker.nextSibling() && isInline(treeWalker.currentNode, !0); ) parts.push({
node: treeWalker.currentNode,
isTextNode: treeWalker.currentNode.nodeType === Node.TEXT_NODE,
isHeading: !1,
hasCurrentSignature: !1,
hasForeignComponents: !1,
lastStep: "start"
});
parts.reverse(), treeWalker.currentNode = signatureElement;
} else treeWalker.currentNode = signatureElement.parentNode;
parts.push({
node: treeWalker.currentNode,
isTextNode: !1,
isHeading: !1,
hasCurrentSignature: !0,
hasForeignComponents: !1,
lastStep: "start"
});
const timezoneRegexp = new RegExp(cd.g.TIMEZONE_REGEXP.source + "\\s*$");
for (let i = 0; i < 500; i++) {
let lastStep;
const previousPart = parts[parts.length - 1];
if (!previousPart.isTextNode && !previousPart.hasCurrentSignature) {
const text = previousPart.node.textContent;
if (timezoneRegexp.test(text) || cd.config.signatureEndingRegexp && cd.config.signatureEndingRegexp.test(text)) {
previousPart.hasForeignComponents = !0;
break;
}
}
if (!previousPart.hasCurrentSignature && previousPart.hasForeignComponents) {
let previousNode, dived = !1;
for (;(previousNode = treeWalker.currentNode) && treeWalker.lastChild(); ) {
if (isInline(treeWalker.currentNode, !0)) {
treeWalker.currentNode = previousNode;
break;
}
dived = !0;
}
if (!dived) break;
lastStep = "dive";
} else if (treeWalker.previousSibling()) lastStep = "back"; else {
if (!treeWalker.parentNode()) break;
lastStep = "up";
}
const node = treeWalker.currentNode, isTextNode = node.nodeType === Node.TEXT_NODE;
if ("back" === lastStep && [ "OL", "UL" ].includes(previousPart.node.tagName) && !([ "DL", "OL", "UL" ].includes(node.tagName) || isTextNode && node.previousSibling && [ "DL", "OL", "UL" ].includes(node.previousSibling.tagName)) && previousPart.node[this.context.childElementsProperty].length && previousPart.node[this.context.childElementsProperty][0].contains(signatureElement)) break;
let isHeading = null, hasCurrentSignature = null, hasForeignComponents = null;
if (!isTextNode) {
if (node.classList.contains("cd-commentPart") || "toc" === node.getAttribute("id") || "TD" === node.tagName || "HR" === node.tagName && node.previousElementSibling && this.context.getElementByClassName(node.previousElementSibling, "cd-signature") || cd.config.customForeignComponentChecker && cd.config.customForeignComponentChecker(node, this.context)) break;
isHeading = /^H[1-6]$/.test(node.tagName), hasCurrentSignature = node.contains(signatureElement),
hasForeignComponents = node.getElementsByClassName("cd-signature", Number(hasCurrentSignature) + 1).length - Number(hasCurrentSignature) > 0 || firstForeignComponentAfter && node.contains(firstForeignComponentAfter);
}
if (parts.push({
node: node,
isTextNode: isTextNode,
isHeading: isHeading,
hasCurrentSignature: hasCurrentSignature,
hasForeignComponents: hasForeignComponents,
lastStep: lastStep
}), isHeading) break;
}
return parts;
}
removeNestedParts(parts) {
for (let i = parts.length - 1; i >= 0; i--) {
const part = parts[i];
if ("up" === part.lastStep && !part.hasForeignComponents) {
let nextDiveElementIndex = 0;
for (let j = i - 1; j > 0; j--) if ("dive" === parts[j].lastStep) {
nextDiveElementIndex = j;
break;
}
parts.splice(nextDiveElementIndex, i - nextDiveElementIndex), i = nextDiveElementIndex;
}
}
return parts;
}
encloseInlineParts(parts, signatureElement) {
const sequencesToBeEnclosed = [];
let start = null, encloseThis = !1;
for (let i = 0; i <= parts.length; i++) {
const part = parts[i];
if (!part || null !== start && ![ "back", "start" ].includes(part.lastStep) || part.hasForeignComponents || part.isHeading) {
if (null !== start) {
if (encloseThis) {
const end = i - 1;
sequencesToBeEnclosed.push({
start: start,
end: end
});
}
start = null, encloseThis = !1;
}
} else {
if (null === start) {
if (isInline(part.node.parentNode)) {
for (let j = i + 1; j < parts.length; j++) "up" !== parts[j].lastStep || (i = j - 1);
break;
}
start = i;
}
!encloseThis && (part.isTextNode && part.node.textContent.trim() || isInline(part.node)) && (encloseThis = !0);
}
}
for (let i = sequencesToBeEnclosed.length - 1; i >= 0; i--) {
const sequence = sequencesToBeEnclosed[i], wrapper = this.context.document.createElement("div"), nextSibling = parts[sequence.start].node.nextSibling, parent = parts[sequence.start].node.parentNode;
for (let j = sequence.end; j >= sequence.start; j--) wrapper.appendChild(parts[j].node);
parent.insertBefore(wrapper, nextSibling);
const newNode = {
node: wrapper,
isTextNode: !1,
isHeading: !1,
hasCurrentSignature: wrapper.contains(signatureElement),
hasForeignComponents: !1,
lastStep: "replaced"
};
parts.splice(sequence.start, sequence.end - sequence.start + 1, newNode);
}
return parts;
}
filterParts(parts) {
for (let i = (parts = parts.filter(part => !part.hasForeignComponents && !part.isTextNode)).length - 1; i > 0; i--) {
const part = parts[i];
if ("P" !== part.node.tagName || part.node.textContent.trim()) break;
parts.splice(i, 1);
}
return parts;
}
replaceListsWithItems(parts, signatureElement) {
const lastPart = parts[parts.length - 1];
for (let i = parts.length - 1; i >= 0; i--) {
const part = parts[i];
if ([ "UL", "DL", "OL", "LI", "DD" ].includes(part.node.tagName) && ("up" === part.lastStep && (!parts[i - 1] || "back" !== parts[i - 1].lastStep) || ("DD" === lastPart.node.tagName || "DD" === lastPart.node.parentNode.tagName || "DL" === lastPart.node.tagName) && !parts.slice(i + 1).some(part => "P" === part.node.tagName))) {
const partTextNoSpaces = part.node.textContent.replace(/\s+/g, "");
let children, current = [ part.node ];
do {
children = current.reduce((arr, element) => arr.concat(Array.from(element[this.context.childElementsProperty])), []);
} while (children.length && children.every(child => [ "UL", "DL", "OL", "LI", "DD" ].includes(child.tagName)) && children.map(child => child.textContent).join("").replace(/\s+/g, "") === partTextNoSpaces && (current = children));
if (current.length > 1) {
const newParts = current.map(el => ({
node: el,
isTextNode: !1,
hasCurrentSignature: el.contains(signatureElement),
hasForeignComponents: !1,
lastStep: "replaced"
}));
parts.splice(i, 1, ...newParts);
} else current[0] !== part.node && Object.assign(part, {
node: current[0],
lastStep: "replaced"
});
}
}
return parts;
}
getLevelsUpTree(initialElement) {
const levelElements = [], treeWalker = new treeWalker_ElementsTreeWalker(initialElement);
for (;treeWalker.parentNode(); ) {
const el = treeWalker.currentNode;
if ([ "UL", "DL", "OL" ].includes(el.tagName)) {
if (el.classList.contains("cd-commentLevel")) {
const match = el.getAttribute("class").match(/cd-commentLevel-(\d+)/);
return match && levelElements.unshift(...Array(Number(match[1]))), levelElements;
}
levelElements.unshift(el);
}
}
return levelElements;
}
findHeadings() {
const headings = [ ...cd.g.rootElement.getElementsByTagName("h2"), ...cd.g.rootElement.getElementsByTagName("h3"), ...cd.g.rootElement.getElementsByTagName("h4"), ...cd.g.rootElement.getElementsByTagName("h5"), ...cd.g.rootElement.getElementsByTagName("h6") ];
return headings.sort((heading1, heading2) => this.context.follows(heading1, heading2) ? 1 : -1),
headings;
}
}
function windowGetAllTextNodes() {
const result = document.evaluate(".//descendant::text()", cd.g.rootElement, null, XPathResult.ANY_TYPE, null), textNodes = [];
let node;
for (;node = result.iterateNext(); ) textNodes.push(node);
return textNodes;
}
function findSpecialElements() {
const floatingElementsSelector = [ ...cd.g.FLOATING_ELEMENTS_SELECTORS, ...cd.config.customFloatingElementsSelectors ].join(", "), floating = cd.g.$root.find(floatingElementsSelector).get().filter(el => !el.classList.contains("cd-ignoreFloating"));
floating.forEach(el => {
const style = window.getComputedStyle(el);
el.setAttribute("data-margin-top", parseFloat(style.marginTop)), el.setAttribute("data-margin-bottom", parseFloat(style.marginBottom));
});
const closedDiscussionsSelector = cd.config.closedDiscussionsClasses.map(name => ".".concat(name)).join(", ");
return {
floating: floating,
closedDiscussions: cd.g.$root.find(closedDiscussionsSelector).get(),
pageHasOutdents: Boolean(cd.g.$root.find(".outdent-template").length)
};
}
function changeElementType(element, newType, firstVisibleElementData) {
const newElement = document.createElement(newType);
for (;element.firstChild; ) newElement.appendChild(element.firstChild);
Array.from(element.attributes).forEach(attribute => {
newElement.setAttribute(attribute.name, attribute.value);
}), element.parentNode.replaceChild(newElement, element);
let commentId = element.getAttribute("data-comment-id");
if (null !== commentId) {
commentId = Number(commentId);
const comment = cd.comments[commentId];
comment.elements.splice(comment.elements.indexOf(element), 1, newElement), comment.highlightables.includes(element) && (comment.highlightables.splice(comment.highlightables.indexOf(element), 1, newElement),
comment.bindEvents(newElement));
}
return element === firstVisibleElementData.element && (firstVisibleElementData.element = newElement),
newElement;
}
function mergeAdjacentCommentLevels(firstVisibleElementData) {
const levels = cd.g.rootElement.querySelectorAll(".cd-commentLevel:not(ol) + .cd-commentLevel:not(ol)");
if (!levels.length) return;
const isOrHasCommentLevel = el => el.classList.contains("cd-commentLevel") && "OL" !== el.tagName || el.querySelector(".cd-commentLevel:not(ol)");
Array.from(levels).forEach(bottomElement => {
const topElement = bottomElement.previousElementSibling;
if (!topElement) return;
let currentTopElement = topElement, currentBottomElement = bottomElement;
do {
const topTag = currentTopElement.tagName, bottomInnerTags = {};
let firstMoved;
if ("UL" === topTag ? bottomInnerTags.DD = "LI" : "DL" === topTag && (bottomInnerTags.LI = "DD"),
isOrHasCommentLevel(currentTopElement)) {
for (;currentBottomElement.childNodes.length; ) {
let child = currentBottomElement.firstChild;
if (child.nodeType === Node.ELEMENT_NODE) bottomInnerTags[child.tagName] && (child = changeElementType(child, bottomInnerTags[child.tagName], firstVisibleElementData)),
void 0 === firstMoved && (firstMoved = child); else if (void 0 === firstMoved && child.textContent.trim()) {
firstMoved = null;
const newChild = document.createElement("span");
newChild.appendChild(child), child = newChild;
}
currentTopElement.appendChild(child);
}
currentBottomElement.parentNode.removeChild(currentBottomElement);
}
currentBottomElement = firstMoved, currentTopElement = firstMoved && firstMoved.previousElementSibling;
} while (currentTopElement && currentBottomElement && isOrHasCommentLevel(currentBottomElement));
});
}
function prepare(_x) {
return _prepare.apply(this, arguments);
}
function _prepare() {
return (_prepare = asyncToGenerator_default()((function*({messagesRequest: messagesRequest}) {
cd.g.$root = cd.g.$content.children(".mw-parser-output"), cd.g.$root.length || (cd.g.$root = cd.g.$content),
cd.g.rootElement = cd.g.$root.get(0), cd.comments = [], cd.sections = [], cd.g.firstRun ? yield init({
messagesRequest: messagesRequest
}) : (resetCommentAnchors(), commentLayers.reset());
}))).apply(this, arguments);
}
function getFirstVisibleElementData() {
let element, top;
if (0 !== window.pageYOffset && cd.g.rootElement.getBoundingClientRect().top <= 0) {
const treeWalker = new treeWalker_ElementsTreeWalker(cd.g.rootElement.firstElementChild);
for (;;) {
if (!isInline(treeWalker.currentNode.tagName)) {
const rect = treeWalker.currentNode.getBoundingClientRect();
if (rect.bottom >= 0 && 0 !== rect.height) {
if (element = treeWalker.currentNode, top = rect.top, treeWalker.firstChild()) continue;
break;
}
}
if (!treeWalker.nextSibling()) break;
}
}
return {
element: element,
top: top
};
}
function processComments(parser, firstVisibleElementData) {
const timestamps = parser.findTimestamps();
parser.findSignatures(timestamps).forEach(signature => {
try {
const comment = parser.createComment(signature);
comment.highlightables.length && cd.comments.push(comment);
} catch (e) {
e instanceof CdError || console.error(e);
}
}), function(firstVisibleElementData) {
mergeAdjacentCommentLevels(firstVisibleElementData), mergeAdjacentCommentLevels(firstVisibleElementData),
cd.g.rootElement.querySelector(".cd-commentLevel:not(ol) + .cd-commentLevel:not(ol)") && console.warn(".cd-commentLevel adjacencies have left."),
$("dl").has("dt").each((i, element) => {
Array.from(element.classList).filter(className => className.startsWith("cd-commentLevel")).forEach(className => element.classList.remove(className));
});
}(firstVisibleElementData), mw.hook("convenientDiscussions.commentsReady").fire(cd.comments);
}
function processSections(parser, watchedSectionsRequest) {
parser.findHeadings().forEach(heading => {
try {
const section = parser.createSection(heading, watchedSectionsRequest);
void 0 !== section.id && cd.sections.push(section);
} catch (e) {
e instanceof CdError || console.error(e);
}
}), cd.sections.forEach((section, i) => {
section.isLastSection = i === cd.sections.length - 1;
}), cd.sections.forEach((section, i) => {
if (section.subsections = [], cd.sections.slice(i + 1).some(otherSection => {
if (!(otherSection.level > section.level)) return !0;
section.subsections.push(otherSection), 2 === section.level && (otherSection.baseSection = section);
}), section.level > 2 && cd.sections.slice(0, i).reverse().some(otherSection => {
if (otherSection.level < section.level) return section.parent = otherSection, !0;
}), !section.frozen && 2 === section.level) {
const targetSection = section.subsections.length ? section.subsections[section.subsections.length - 1] : section;
targetSection.$replyButtonLink && targetSection.$replyButtonLink.on("mouseenter", section.replyButtonHoverHandler).on("mouseleave", section.replyButtonUnhoverHandler);
}
});
const $space = $("<span>").addClass("cd-spaceBeforeSectionMenu").text(" ");
$(".mw-headline").each((function() {
$(this).append($space.clone());
})), mw.hook("convenientDiscussions.sectionsReady").fire(cd.sections);
}
function connectToAddTopicLinks() {
$(cd.g.ADD_TOPIC_SELECTORS).off("click.cd").on("click.cd", (function(e) {
const href = $(this).attr("href");
if (e.ctrlKey || e.shiftKey || mw.util.getParamValue("preload", href)) return;
e.preventDefault();
const editintro = mw.util.getParamValue("editintro", href);
cd.g.addSectionForm ? (cd.g.addSectionForm.$element.cdScrollIntoView("center"),
cd.g.addSectionForm.headlineInput.focus()) : cd.g.addSectionForm = new CommentForm_CommentForm({
mode: "addSection",
$addSectionLink: $(this),
scrollIntoView: !0,
editintro: editintro
});
})).attr("title", cd.s("addtopicbutton-tooltip"));
}
function processFragment(_x2, _x3) {
return _processFragment.apply(this, arguments);
}
function _processFragment() {
return (_processFragment = asyncToGenerator_default()((function*(keptCommentAnchor, keptSectionAnchor) {
let fragment, decodedFragment, escapedFragment, escapedDecodedFragment, commentAnchor, date, author, comment;
if (cd.g.firstRun) {
fragment = location.hash.slice(1);
try {
decodedFragment = decodeURIComponent(fragment);
} catch (e) {
console.error(e);
}
escapedFragment = $.escapeSelector(fragment), escapedDecodedFragment = decodedFragment && $.escapeSelector(decodedFragment),
/^\d{12}_.+$/.test(fragment) && (commentAnchor = decodedFragment);
} else commentAnchor = keptCommentAnchor;
if (commentAnchor) {
if (({date: date, author: author} = parseCommentAnchor(commentAnchor) || {}), comment = Comment_Comment.getCommentByAnchor(commentAnchor),
!keptCommentAnchor && !comment) {
let commentAnchorToCheck;
for (let gap = 1; !comment && gap <= 5; gap++) {
commentAnchorToCheck = generateCommentAnchor(new Date(date.getTime() - cd.g.MILLISECONDS_IN_A_MINUTE * gap), author),
comment = Comment_Comment.getCommentByAnchor(commentAnchorToCheck);
}
}
comment && setTimeout(() => {
comment.scrollToAndHighlightTarget(!1);
}, 0);
}
if (keptSectionAnchor) {
const section = Section_Section.getSectionByAnchor(keptSectionAnchor);
section && section.$elements.first().cdScrollTo("top", !1);
}
if (cd.g.firstRun) {
const fragmentHasNoTarget = decodedFragment && !comment && !cd.config.idleFragments.includes(decodedFragment) && !decodedFragment.startsWith("/media/") && !$(":target").length && !$('a[name="'.concat(escapedDecodedFragment, '"]')).length && !$('*[id="'.concat(escapedDecodedFragment, '"]')).length && !$('a[name="'.concat(escapedFragment, '"]')).length && !$('*[id="'.concat(escapedFragment, '"]')).length;
decodedFragment && fragmentHasNoTarget && cd.g.isPageActive && (yield notFound(decodedFragment, date));
}
}))).apply(this, arguments);
}
function highlightOwnComments() {
if (!cd.settings.highlightOwnComments) return;
const myComments = cd.comments.filter(comment => comment.own), floatingRects = myComments.length ? cd.g.specialElements.floating.map(el => el.getBoundingClientRect()) : void 0;
myComments.forEach(comment => {
comment.configureLayers(!1, floatingRects);
}), myComments.forEach(comment => {
comment.addLayers();
});
}
function confirmDesktopNotifications() {
return _confirmDesktopNotifications.apply(this, arguments);
}
function _confirmDesktopNotifications() {
return (_confirmDesktopNotifications = asyncToGenerator_default()((function*() {
"unknown" === cd.settings.desktopNotifications && "denied" !== Notification.permission && getSettings(!0).then(settings => {
if ("unknown" === settings.desktopNotifications) {
const actions = [ {
label: cd.s("dn-confirm-yes"),
action: "accept",
flags: "primary"
}, {
label: cd.s("dn-confirm-no"),
action: "reject"
} ];
confirmDialog(cd.s("dn-confirm"), {
size: "medium",
actions: actions
}).then(action => {
let promise;
"accept" === action ? "default" === Notification.permission ? (OO.ui.alert(cd.s("dn-grantpermission")),
Notification.requestPermission(permission => {
"granted" === permission ? (cd.settings.desktopNotifications = settings.desktopNotifications = "all",
promise = setSettings(settings)) : "denied" === permission && (cd.settings.desktopNotifications = settings.desktopNotifications = "none",
promise = setSettings(settings));
})) : "granted" === Notification.permission && (cd.settings.desktopNotifications = settings.desktopNotifications = "all",
promise = setSettings(settings)) : "reject" === action && (cd.settings.desktopNotifications = settings.desktopNotifications = "none",
promise = setSettings(settings)), promise && promise.catch(e => {
mw.notify(cd.s("error-settings-save"), {
type: "error"
}), console.warn(e);
});
});
}
}), "unknown" !== cd.settings.desktopNotifications && "default" === Notification.permission && (yield OO.ui.alert(cd.s("dn-grantpermission-again"), {
title: cd.s("script-name")
}), Notification.requestPermission());
}))).apply(this, arguments);
}
function debugLog() {
const timePerComment = (cd.debug.timerTotal["main code"] + cd.debug.timerTotal["final code and rendering"]) / cd.comments.length;
cd.debug.logAndResetTimer("total time"), console.debug("number of comments: ".concat(cd.comments.length)),
console.debug("per comment: ".concat(timePerComment.toFixed(2))), cd.debug.logAndResetEverything();
}
function processPage() {
return _processPage.apply(this, arguments);
}
function _processPage() {
return (_processPage = asyncToGenerator_default()((function*(keptData = {}) {
cd.debug.stopTimer(cd.g.firstRun ? "loading data" : "laying out HTML"), cd.debug.startTimer("preparations"),
yield prepare(keptData);
const firstVisibleElementData = cd.g.firstRun ? getFirstVisibleElementData() : {};
let watchedSectionsRequest;
cd.debug.stopTimer("preparations"), cd.debug.startTimer("main code"), cd.g.IS_ARCHIVE_PAGE = Boolean(cd.config.archivePathRegexp && cd.config.archivePathRegexp.test(cd.g.CURRENT_PAGE)),
cd.g.isPageActive = !(!mw.config.get("wgArticleId") || cd.g.IS_ARCHIVE_PAGE || (mw.util.getParamValue("diff") || mw.util.getParamValue("oldid")) && mw.config.get("wgRevisionId") !== mw.config.get("wgCurRevisionId")),
cd.g.editWatchedSections = editWatchedSections, cd.g.settingsDialog = settingsDialog,
mw.config.get("wgArticleId") && (watchedSectionsRequest = getWatchedSections(!0, keptData),
watchedSectionsRequest.catch(e => {
console.warn("Couldn't load the settings from the server.", e);
}));
const visitsRequest = cd.g.isPageActive ? getVisits(!0) : void 0;
cd.g.specialElements = findSpecialElements(), cd.config.customBeforeParse && cd.config.customBeforeParse(),
cd.debug.startTimer("process comments");
const parser = new Parser_Parser({
CommentClass: Comment_Comment,
SectionClass: Section_Section,
childElementsProperty: "children",
document: document,
follows: (el1, el2) => el1.compareDocumentPosition(el2) & Node.DOCUMENT_POSITION_PRECEDING,
getAllTextNodes: windowGetAllTextNodes,
getElementByClassName: (node, className) => node.querySelector(".".concat(className))
});
try {
processComments(parser, firstVisibleElementData);
} catch (e) {
console.error(e);
}
if (cd.debug.stopTimer("process comments"), cd.debug.startTimer("process sections"),
processSections(parser, watchedSectionsRequest), cd.debug.stopTimer("process sections"),
connectToAddTopicLinks(), cd.debug.stopTimer("main code"), cd.debug.startTimer("final code and rendering"),
firstVisibleElementData.element || keptData.scrollPosition) {
const y = firstVisibleElementData.element ? window.pageYOffset + firstVisibleElementData.element.getBoundingClientRect().top - firstVisibleElementData.top : keptData.scrollPosition;
window.scrollTo(0, y);
}
highlightOwnComments(), processFragment(keptData.commentAnchor, keptData.sectionAnchor),
cd.g.isPageActive && (cd.g.firstRun || keptData.wasPageCreated ? js_navPanel.mount() : js_navPanel.reset(),
js_navPanel.processVisits(visitsRequest, keptData.unseenCommentAnchors), restoreCommentForms()),
cd.g.firstRun && ($(document).on("mousemove mouseover", highlightFocused), $(window).on("resize orientationchange", windowResizeHandler),
addPreventUnloadCondition("commentForms", () => (saveSession(!0), mw.user.options.get("useeditwarning") && (CommentForm_CommentForm.getLastActiveAlteredCommentForm() || alwaysConfirmLeavingPage && cd.commentForms.length)))),
(cd.g.firstRun && cd.g.isPageActive || keptData.wasPageCreated) && ($(document).on("keydown", globalKeyDownHandler).on("scroll resize orientationchange", () => {
js_navPanel.registerSeenComments(), js_navPanel.updateCommentFormButton();
}), setInterval(() => {
commentLayers.redrawIfNecessary();
}, 1e3), setTimeout(() => {
new MutationObserver(records => {
records.every(record => /^cd-comment(Underlay|Overlay|Layers)/.test(record.target.className)) || commentLayers.redrawIfNecessary();
}).observe(cd.g.$content.get(0), {
attributes: !0,
childList: !0,
subtree: !0
});
}, 500));
let alwaysConfirmLeavingPage = !1;
mw.user.options.get("editondblclick") && mw.loader.using("mediawiki.action.view.dblClickEdit").then(() => {
$("#ca-edit").off("click"), alwaysConfirmLeavingPage = !0;
}), mw.user.options.get("editsectiononrightclick") && mw.loader.using("mediawiki.action.view.rightClickEdit").then(() => {
$(".mw-editsection a").off("click"), alwaysConfirmLeavingPage = !0;
}), cd.g.firstRun && confirmDesktopNotifications(), mw.hook("convenientDiscussions.pageReady").fire(cd),
removeLoadingOverlay(), cd.g.firstRun = !1, cd.g.rootElement.getBoundingClientRect(),
cd.debug.stopTimer("final code and rendering"), cd.debug.stopTimer("total time"),
debugLog();
}))).apply(this, arguments);
}
/**
* Timestamp regexp generator, timestamp parser generator, date formats, digits, and timezones.
*
* The code is based on {@link
* https://gerrit.wikimedia.org/r/#/c/mediawiki/core/+/539305/3/signaturedetector.js}.
*
* @module dateFormat
* @author Bartosz Dziewoński <matma.rex@gmail.com>
* @license GPL v2
*/ const DATE_FORMATS = {
ab: "H:i, j xg Y",
abs: "j F Y H.i",
ace: "j F Y H.i",
"ady-cyrl": "H:i, j F Y",
"aeb-arab": "H:i\u060c j xg Y",
"aeb-latn": "H:i, j F Y",
af: "H:i, j F Y",
ais: "H:i, j F Y",
ak: "H:i, j F Y",
aln: "j F Y H:i",
ami: "H:i, j F Y",
am: "H:i, j F Y",
ang: "H:i, j F Y",
an: "H:i j M Y",
anp: "H:i, j F Y",
arc: "H:i, j F Y",
ar: "H:i\u060c j xg Y",
arn: "H:i j M Y",
arq: "H:i\u060c j xg Y",
ary: "H:i, j F Y",
arz: "H:i\u060c j xg Y",
ase: "H:i, j F Y",
as: "H:i, j F Y",
ast: "H:i j M Y",
atj: "j F Y \xe0 H:i",
av: "H:i, j xg Y",
avk: "H:i, j F Y",
awa: "H:i, j F Y",
ay: "H:i j M Y",
azb: "j xg Y\u060c \u0633\u0627\u0639\u062a H:i",
az: "H:i, j F Y",
ba: "H:i, j xg Y",
ban: "j F Y H.i",
bar: "H:i, j. M Y",
"bbc-latn": "j F Y H.i",
bcc: "j xg Y\u060c \u0633\u0627\u0639\u062a H:i",
bcl: "H:i, j F Y",
be: "H:i, j xg Y",
"be-tarask": "H:i, j xg Y",
bg: "H:i, j F Y",
bgn: "j xg Y\u060c \u0633\u0627\u0639\u062a H:i",
bho: "H:i, j F Y",
bi: "H:i, j F Y",
bjn: "j F Y H.i",
bm: "j F Y \xe0 H:i",
bn: "H:i, j F Y",
bo: "H:i, j F Y",
bpy: "H:i, j F Y",
bqi: "j xg Y\u060c \u0633\u0627\u0639\u062a H:i",
brh: "H:i, j F Y",
br: 'j M Y "da" H:i',
bs: "H:i, j F Y",
btm: "j F Y H.i",
bto: "H:i, j F Y",
bug: "j F Y H.i",
bxr: "H:i, j xg Y",
ca: "H:i, j M Y",
"cbk-zam": "H:i j M Y",
cdo: 'Y "ni\xe8ng" n "ngu\u014fk" j "h\xf4\u0324" (D) H:i',
ceb: "H:i, j F Y",
ce: "Y, j F, H:i",
ch: "H:i, j F Y",
chr: "H:i, j F Y",
chy: "H:i, j F Y",
ckb: "H:i\u060c j\u06cc xg Y",
co: "H:i, j M Y",
cps: "H:i, j F Y",
"crh-cyrl": 'H:i, Y "\u0441." xg j',
"crh-latn": 'H:i, Y "s." xg j',
cr: "H:i, j F Y",
csb: "H:i, j M Y",
cs: "j. n. Y, H:i",
cu: "H:i, xg j \u0447\u0438\u0441\u043b\u0430, Y",
cv: "H:i, j xg Y",
cy: "H:i, j F Y",
da: "j. M Y, H:i",
"de-at": "H:i, j. M Y",
"de-ch": "H:i, j. M Y",
"de-formal": "H:i, j. M Y",
de: "H:i, j. M Y",
din: "H:i, j F Y",
diq: "H:i, j F Y",
dsb: "j. xg Y, H:i",
dtp: "H:i, j F Y",
dty: "H:i, j F Y",
dv: "H:i, j F Y",
dz: "H:i, j F Y",
ee: "H:i, j F Y",
egl: "H:i, j M Y",
el: "H:i, j xg Y",
eml: "H:i, j M Y",
"en-ca": "H:i, j F Y",
"en-gb": "H:i, j F Y",
en: "H:i, j F Y",
eo: "H:i, j M. Y",
"es-formal": "H:i j M Y",
es: "H:i j M Y",
et: 'j. F Y, "kell" H:i',
eu: "H:i, j F Y",
exif: "H:i, j F Y",
ext: "H:i j M Y",
fa: "j xg Y\u060c \u0633\u0627\u0639\u062a H:i",
ff: "j F Y \xe0 H:i",
fi: 'j. F"ta" Y "kello" H.i',
fit: 'j. F"ta" Y "kello" H.i',
fj: "H:i, j F Y",
fo: 'j. M Y "kl." H:i',
frc: "j F Y \xe0 H:i",
fr: "j F Y \xe0 H:i",
frp: 'j F Y "a" H:i',
frr: "H:i, j. M Y",
fur: 'j "di" M Y "a lis" H:i',
fy: "j M Y, H.i",
gag: "H.i, j F Y",
ga: "H:i, j F Y",
"gan-hans": "Y\u5e74n\u6708j\u65e5 (D) H:i",
"gan-hant": "Y\u5e74n\u6708j\u65e5 (D) H:i",
gan: "Y\u5e74n\u6708j\u65e5 (D) H:i",
gcr: "j F Y \xe0 H:i",
gd: "H:i, j F Y",
gl: 'j \\d\\e F \\d\\e Y "\xe1s" H:i',
glk: "j xg Y\u060c \u0633\u0627\u0639\u062a H:i",
gn: "H:i j M Y",
gom: "H:i, j F Y",
"gom-deva": "H:i, j F Y",
"gom-latn": "H:i, j F Y",
gor: "j F Y H.i",
got: "H:i, j F Y",
grc: "H:i, j xg Y",
gsw: "H:i, j. M Y",
gu: "H:i, j F Y",
gv: "H:i, j F Y",
ha: "H:i, j F Y",
hak: "H:i, j F Y",
haw: "H:i, j F Y",
he: "H:i, j xg Y",
"hif-latn": "H:i, j F Y",
hi: "H:i, j F Y",
hil: "H:i, j F Y",
hr: "H:i, j. F Y.",
hrx: "H:i, j. M Y",
hsb: "j. xg Y, H:i",
ht: "j F Y \xe0 H:i",
"hu-formal": "Y. F j., H:i",
hu: "Y. F j., H:i",
hy: "H:i, j xg Y",
hyw: "H:i, j xg Y",
ia: "H:i, j F Y",
id: "j F Y H.i",
ie: "H:i, j F Y",
ig: "H:i, j F Y",
ii: "Y\u5e74n\u6708j\u65e5 (D) H:i",
"ike-cans": "H:i, j F Y",
"ike-latn": "H:i, j F Y",
ik: "H:i, j F Y",
ilo: "H:i, j F Y",
inh: "H:i, j xg Y",
io: "H:i, j M. Y",
is: 'j. F Y "kl." H:i',
it: "H:i, j M Y",
ja: "Y\u5e74n\u6708j\u65e5 (D) H:i",
jam: "H:i, j F Y",
jbo: "H:i, j F Y",
jut: "j. M Y, H:i",
jv: "j F Y H.i",
kaa: 'H:i, Y "j." xg j',
kab: "H:i, j F Y",
ka: "H:i, j F Y",
"kbd-cyrl": "H:i, j F Y",
kbp: "j F Y \xe0 H:i",
kg: "H:i, j F Y",
khw: "H:i\u060c j xg Y\u0621",
ki: "H:i, j F Y",
kiu: "H.i, j F Y",
kjp: ' H:i"\u104a" j F Y',
"kk-arab": 'H:i\u060c Y "\u062c." xg j',
"kk-cyrl": 'H:i, Y "\u0436." xg j',
kk: 'H:i, Y "\u0436." xg j',
"kk-latn": 'H:i, Y "j." xg j',
kl: "j. M Y, H:i",
km: "\u1798\u17c4\u1784H:i l \u1791d F \u1786\u17d2\u1793\u17b6Y",
kn: "H:i, j F Y",
krc: "H:i, j xg Y",
kri: "H:i, j F Y",
krj: "H:i, j F Y",
krl: 'j. F"ta" Y "kello" H.i',
"ks-arab": "H:i, j F Y",
"ks-deva": "H:i, j F Y",
ksh: "H:i, j. M Y",
ks: "H:i, j F Y",
"ku-arab": "H:i\u060c j\u06cc xg Y",
"ku-latn": "H:i, j F Y",
kum: "H:i, j xg Y",
kv: "H:i, j xg Y",
kw: "H:i, j F Y",
ky: "H:i, j F Y",
lad: "H:i j M Y",
la: "H:i, j xg Y",
lbe: "H:i, j xg Y",
lb: "H:i, j. M Y",
lez: "H:i, j xg Y",
lfn: "H:i, j F Y",
lg: "H:i, j F Y",
lij: "H:i, j M Y",
li: "j M Y H:i",
liv: 'j. F Y, "kell" H:i',
lki: "j xg Y\u060c \u0633\u0627\u0639\u062a H:i",
lmo: "H:i, j M Y",
ln: "j F Y \xe0 H:i",
lo: "H:i, j F Y",
loz: "H:i, j F Y",
lrc: "j xg Y\u060c \u0633\u0627\u0639\u062a H:i",
ltg: 'Y". gada" j. F", plkst." H.i',
lt: "H:i, j F Y",
lus: "H:i, j F Y",
luz: "j xg Y\u060c \u0633\u0627\u0639\u062a H:i",
lv: 'Y". gada" j. F", plkst." H.i',
lzh: "Y\u5e74n\u6708j\u65e5 \uff08D\uff09 H\u6642i\u5206",
lzz: "H.i, j F Y",
mai: "H:i, j F Y",
"map-bms": "j F Y H.i",
mdf: "H:i, j xg Y",
mg: "j F Y \xe0 H:i",
mhr: "H:i, j xg Y",
mi: "H:i, j F Y",
min: "j F Y H.i",
mk: "H:i, j F Y",
ml: "H:i, j F Y",
mni: "H:i, j F Y",
mn: "H:i, j F Y",
mnw: ' H:i"\u104a" j F Y',
mo: "j F Y H:i",
mrj: "H:i, j xg Y",
mr: "H:i, j F Y",
ms: "H:i, j F Y",
mt: "H:i, j F Y",
mwl: "H\\hi\\m\\i\\n \\d\\e j \\d\\e F \\d\\e Y",
my: ' H:i"\u104a" j F Y',
myv: "H:i, j xg Y",
mzn: "j xg Y\u060c \u0633\u0627\u0639\u062a H:i",
nah: "H:i j M Y",
na: "H:i, j F Y",
nan: 'Y-"n\xee" n-"goe\u030dh" j-"ji\u030dt" (D) H:i',
nap: "H:i, j M Y",
nb: 'j. M Y "kl." H:i',
nds: "H:i, j. M Y",
"nds-nl": "H:i, j M Y",
ne: "H:i, j F Y",
new: "H:i, j F Y",
niu: "H:i, j F Y",
"nl-informal": "j M Y H:i",
nl: "j M Y H:i",
nn: 'j. F Y "kl." H:i',
nov: "H:i, j F Y",
nqo: "H:i, j F Y",
nrm: "j F Y \xe0 H:i",
nso: "H:i, j F Y",
nv: "H:i, j F Y",
ny: "H:i, j F Y",
nys: "H:i, j F Y",
oc: 'j F "de" Y "a" H.i',
olo: 'j. F"ta" Y "kello" H.i',
om: "H:i, j F Y",
or: "H:i, j F Y",
os: "H:i, j xg Y",
pag: "H:i, j F Y",
pa: "H:i, j F Y",
pam: "H:i, j F Y",
pap: "H:i, j F Y",
pcd: "j F Y \xe0 H:i",
pdc: "H:i, j. M Y",
pdt: "H:i, j. M Y",
pfl: "H:i, j. M Y",
pih: "H:i, j F Y",
pi: "H:i, j F Y",
pl: "H:i, j M Y",
pms: "H:i, j M Y",
pnb: "H:i, j F Y",
pnt: "H:i, j xg Y",
prg: "H:i, j F Y",
ps: "H:i, j F Y",
"pt-br": 'H"h"i"min" "de" j "de" F "de" Y',
pt: "H\\hi\\m\\i\\n \\d\\e j \\d\\e F \\d\\e Y",
qqq: "H:i, j F Y",
qug: "H:i j M Y",
qu: "H:i j M Y",
rgn: "H:i, j M Y",
rif: "H:i, j F Y",
rm: "H:i, j F Y",
rmy: "j F Y H:i",
"roa-tara": "H:i, j M Y",
ro: "j F Y H:i",
rue: "H:i, j xg Y",
ru: "H:i, j xg Y",
rup: "j F Y H:i",
"ruq-cyrl": "H:i, j F Y",
"ruq-latn": "j F Y H:i",
rw: "H:i, j F Y",
sah: "H:i, j xg Y",
sa: "H:i, j F Y",
sat: "H:i, j F Y",
sc: "H:i, j M Y",
scn: "H:i, j M Y",
sco: "H:i, j F Y",
sdc: "H:i, j F Y",
sdh: "j xg Y\u060c \u0633\u0627\u0639\u062a H:i",
sd: "H:i, j F Y",
sei: "H:i, j F Y",
se: 'xg j "b." Y "dii." G.i',
ses: "j F Y \xe0 H:i",
sg: "j F Y \xe0 H:i",
sgs: "H:i, j F Y",
shi: "H:i, j F Y",
sh: "H:i, j F Y",
shn: "H:i, j F Y",
"shy-latn": "H:i, j F Y",
si: "H:i, j F Y",
sk: "H:i, j. F Y",
"skr-arab": "H:i\u060c j xg Y\u0621",
sli: "H:i, j. M Y",
sl: "H:i, j. F Y",
sma: "H:i, j F Y",
sm: "H:i, j F Y",
sn: "H:i, j F Y",
so: "H:i, j F Y",
sq: "j F Y H:i",
"sr-ec": "H:i, j. F Y.",
"sr-el": "H:i, j. F Y.",
srn: "j M Y H:i",
ss: "H:i, j F Y",
st: "H:i, j F Y",
stq: "H:i, j. M Y",
sty: "H:i, j xg Y",
su: "j F Y H.i",
sv: 'j F Y "kl." H.i',
sw: "H:i, j F Y",
szl: "H:i, j M Y",
ta: "H:i, j F Y",
tay: "H:i, j F Y",
tcy: "H:i, j F Y",
te: "H:i, j F Y",
tet: "H\\hi\\m\\i\\n \\d\\e j \\d\\e F \\d\\e Y",
"tg-cyrl": "H:i, j xg Y",
"tg-latn": "H:i, j F Y",
th: "H:i, j F xkY",
ti: "H:i, j F Y",
tk: "H:i, j F Y",
tl: "H:i, j F Y",
tly: "H:i, j F Y",
tn: "H:i, j F Y",
to: "H:i, j F Y",
tpi: "H:i, j F Y",
tr: "H.i, j F Y",
tru: "H:i, j F Y",
trv: "H:i, j F Y",
ts: "H:i, j F Y",
"tt-cyrl": "j M Y, H:i",
"tt-latn": "j M Y, H:i",
tw: "H:i, j F Y",
ty: "j F Y \xe0 H:i",
tyv: "H:i, j xg Y",
tzm: "H:i, j F Y",
udm: "H:i, j xg Y",
"ug-arab": "H:i, j F Y",
"ug-latn": "H:i, j F Y",
uk: "H:i, j xg Y",
ur: "H:i\u060c j xg Y\u0621",
uz: "H:i, j-F Y",
vec: "H:i, j M Y",
ve: "H:i, j F Y",
vep: 'j. F Y, "kell" H:i',
vi: 'H:i, "ng\xe0y" j "th\xe1ng" n "n\u0103m" Y',
vls: "j M Y H:i",
vmf: "H:i, j. M Y",
vo: 'H:i, Y F j"id"',
vot: 'j. F"ta" Y "kello" H.i',
vro: 'j. F Y, "kell" H:i',
wa: "j F Y \xe0 H:i",
war: "H:i, j F Y",
wo: "j F Y \xe0 H:i",
wuu: "Y\u5e74n\u6708j\u53f7 (D) H:i",
xal: "H:i, j xg Y",
xh: "H:i, j F Y",
xmf: "H:i, j F Y",
xsy: "H:i, j F Y",
yi: "H:i, j xg Y",
yo: "H:i, j F Y",
yue: "Y\u5e74n\u6708j\u865f (D) H:i",
za: "Y\u5e74n\u6708j\u65e5 (D) H:i",
zea: "j M Y H:i",
zgh: "H:i, j F Y",
"zh-hans": "Y\u5e74n\u6708j\u65e5 (D) H:i",
"zh-hant": "Y\u5e74n\u6708j\u65e5 (D) H:i",
"zh-hk": "Y\u5e74n\u6708j\u65e5 (D) H:i",
zh: "Y\u5e74n\u6708j\u65e5 (D) H:i",
"zh-sg": "Y\u5e74n\u6708j\u65e5 (D) H:i",
"zh-tw": "Y\u5e74n\u6708j\u65e5 (D) H:i",
zu: "H:i, j F Y"
}, DIGITS = {
"aeb-arab": "\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669",
anp: "\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f",
ar: "\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669",
as: "\u09e6\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef",
azb: "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9",
bcc: "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9",
bgn: "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9",
bho: "\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f",
bn: "\u09e6\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef",
bo: "\u0f20\u0f21\u0f22\u0f23\u0f24\u0f25\u0f26\u0f27\u0f28\u0f29",
bpy: "\u09e6\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef",
bqi: "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9",
ckb: "\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669",
dty: "\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f",
dz: "\u0f20\u0f21\u0f22\u0f23\u0f24\u0f25\u0f26\u0f27\u0f28\u0f29",
fa: "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9",
glk: "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9",
"gom-deva": "\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f",
gu: "\u0ae6\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef",
hi: "\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f",
kjp: "\u1040\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049",
"kk-arab": "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9",
km: "\u17e0\u17e1\u17e2\u17e3\u17e4\u17e5\u17e6\u17e7\u17e8\u17e9",
kn: "\u0ce6\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef",
"ks-arab": "\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669",
"ks-deva": "\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f",
ks: "\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669",
"ku-arab": "\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669",
lki: "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9",
lo: "\u0ed0\u0ed1\u0ed2\u0ed3\u0ed4\u0ed5\u0ed6\u0ed7\u0ed8\u0ed9",
lrc: "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9",
luz: "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9",
lzh: "\u3007\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d",
mai: "\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f",
mni: "\uabf0\uabf1\uabf2\uabf3\uabf4\uabf5\uabf6\uabf7\uabf8\uabf9",
mnw: "\u1040\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049",
mr: "\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f",
my: "\u1040\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049",
mzn: "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9",
ne: "\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f",
new: "\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f",
nqo: "\u07c0\u07c1\u07c2\u07c3\u07c4\u07c5\u07c6\u07c7\u07c8\u07c9",
or: "\u0b66\u0b67\u0b68\u0b69\u0b6a\u0b6b\u0b6c\u0b6d\u0b6e\u0b6f",
pi: "\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f",
ps: "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9",
sa: "\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f",
sat: "\u1c50\u1c51\u1c52\u1c53\u1c54\u1c55\u1c56\u1c57\u1c58\u1c59",
sdh: "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9",
"skr-arab": "\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669",
tcy: "\u0ce6\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef"
}, TIMEZONES = [ "acdt", "acst", "act", "acwdt", "acwst", "addt", "adt", "aedt", "aest", "aft", "ahdt", "ahst", "akdt", "akst", "amst", "amt", "ant", "apt", "arst", "art", "ast", "awdt", "awst", "awt", "azomt", "azost", "azot", "bdst", "bdt", "beat", "beaut", "bmt", "bnt", "bortst", "bort", "bost", "bot", "brst", "brt", "bst", "btt", "burt", "cant", "capt", "cast", "cat", "cawt", "cct", "cddt", "cdt", "cemt", "cest", "cet", "cgst", "cgt", "chadt", "chast", "chdt", "chost", "chot", "chut", "ckhst", "ckt", "clst", "clt", "cmt", "cost", "cot", "cpt", "cst", "cut", "cvst", "cvt", "cwt", "cxt", "chst", "dact", "dmt", "easst", "east", "eat", "ect", "eddt", "edt", "eest", "eet", "egst", "egt", "ehdt", "emt", "ept", "est", "ewt", "ffmt", "fjst", "fjt", "fkst", "fkt", "fmt", "fnst", "fnt", "galt", "gamt", "gbgt", "gft", "ghst", "gilt", "gmt", "gst", "gyt", "hdt", "hkst", "hkt", "hmt", "hovst", "hovt", "hst", "ict", "iddt", "idt", "ihst", "imt", "iot", "irdt", "irst", "isst", "ist", "javt", "jcst", "jdt", "jmt", "jst", "jwst", "kart", "kdt", "kmt", "kost", "kst", "kwat", "lhdt", "lhst", "lint", "lkt", "lrt", "lst", "madmt", "madst", "madt", "malst", "malt", "mart", "mddt", "mdst", "mdt", "mest", "met", "mht", "mist", "mmt", "most", "mot", "mpt", "msd", "msk", "mst", "must", "mut", "mvt", "mwt", "myt", "ncst", "nct", "nddt", "ndt", "negt", "nest", "net", "nfst", "nft", "nmt", "npt", "nrt", "nst", "nut", "nwt", "nzdt", "nzmt", "nzst", "pddt", "pdt", "pest", "pet", "pgt", "phot", "phst", "pht", "pkst", "pkt", "plmt", "pmdt", "pmmt", "pmst", "pmt", "pnt", "pont", "ppmt", "ppt", "pst", "pwt", "pyst", "pyt", "qmt", "ret", "rmt", "sast", "sbt", "sct", "sdmt", "sdt", "set", "sgt", "sjmt", "smt", "srt", "sst", "swat", "taht", "tbmt", "tkt", "tlt", "tmt", "tost", "tot", "tvt", "uct", "ulast", "ulat", "utc", "uyhst", "uyst", "uyt", "vet", "vust", "vut", "wakt", "warst", "wart", "wast", "wat", "wemt", "west", "wet", "wft", "wgst", "wgt", "wib", "wita", "wit", "wmt", "wsdt", "wsst", "xjt", "yddt", "ydt", "ypt", "yst", "ywt", "a", "b", "c", "d", "e", "f", "g", "h", "i", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" ];
function loadMessages() {
const requests = [];
mw.messages.set(cd.config.messages), cd.g.CONTRIBS_PAGE = cd.config.contribsPage,
cd.g.LOCAL_TIMEZONE_OFFSET = cd.config.localTimezoneOffset;
const messageNames = [ "sun", "mon", "tue", "wed", "thu", "fri", "sat", "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec", "january", "february", "march", "april", "may_long", "june", "july", "august", "september", "october", "november", "december", "january-gen", "february-gen", "march-gen", "april-gen", "may-gen", "june-gen", "july-gen", "august-gen", "september-gen", "october-gen", "november-gen", "december-gen", "parentheses", "parentheses-start", "parentheses-end" ], messagesRequests = [];
for (let i = 0; i < messageNames.length; i += 50) {
const nextNames = messageNames.slice(i, i + 50);
messagesRequests.push(cd.g.api.loadMessagesIfMissing(nextNames, {
amlang: mw.config.get("wgContentLanguage")
}));
}
if (Promise.all(messagesRequests).then(() => {
cd.g.MESSAGES = {}, messageNames.forEach(name => {
cd.g.MESSAGES[name] = mw.msg(name);
});
}), requests.push(...messagesRequests), !Object.keys(cd.config.messages).some(name => name.startsWith("timezone-"))) {
const request = cd.g.api.loadMessages(void 0, {
amlang: mw.config.get("wgContentLanguage"),
amincludelocal: 1,
amfilter: "timezone-"
});
requests.push(request);
}
if (!cd.g.CONTRIBS_PAGE || null === cd.g.LOCAL_TIMEZONE_OFFSET) {
const request = cd.g.api.get({
action: "query",
meta: "siteinfo",
siprop: [ "specialpagealiases", "general" ]
}).then(resp => {
resp.query.specialpagealiases.some(alias => {
if ("Contributions" === alias.realname) return cd.g.CONTRIBS_PAGE = mw.config.get("wgFormattedNamespaces")[-1] + ":" + alias.aliases[0],
!0;
}), cd.g.LOCAL_TIMEZONE_OFFSET = resp.query.general.timeoffset;
});
requests.push(request);
}
return Promise.all(requests);
}
function setLocalTimestampRegexps() {
const mainPartPattern = function(format, digits) {
const regexpAlternateGroup = arr => "(" + arr.map(mw.util.escapeRegExp).join("|") + ")";
let s = "\\b";
for (let p = 0; p < format.length; p++) {
let num = !1, code = format[p];
switch ("x" === code && p < format.length - 1 && (code += format[++p]), "xk" === code && p < format.length - 1 && (code += format[++p]),
code) {
case "xx":
s += "x";
break;
case "xg":
s += regexpAlternateGroup(util_getMessages([ "january-gen", "february-gen", "march-gen", "april-gen", "may-gen", "june-gen", "july-gen", "august-gen", "september-gen", "october-gen", "november-gen", "december-gen" ]));
break;
case "d":
num = "2";
break;
case "D":
s += regexpAlternateGroup(util_getMessages([ "sun", "mon", "tue", "wed", "thu", "fri", "sat" ]));
break;
case "j":
num = "1,2";
break;
case "l":
s += regexpAlternateGroup(util_getMessages([ "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday" ]));
break;
case "F":
s += regexpAlternateGroup(util_getMessages([ "january", "february", "march", "april", "may_long", "june", "july", "august", "september", "october", "november", "december" ]));
break;
case "M":
s += regexpAlternateGroup(util_getMessages([ "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec" ]));
break;
case "n":
num = "1,2";
break;
case "Y":
case "xkY":
num = "4";
break;
case "G":
num = "1,2";
break;
case "H":
case "i":
num = "2";
break;
case "\\":
p < format.length - 1 ? s += format[++p] : s += "\\";
break;
case '"':
if (p < format.length - 1) {
const endQuote = format.indexOf('"', p + 1);
-1 === endQuote ? s += '"' : (s += format.substr(p + 1, endQuote - p - 1), p = endQuote);
} else s += '"';
break;
default:
s += format[p];
}
!1 !== num && (s += "(" + (digits + "{" + num + "}") + ")");
}
return s;
}(cd.g.DATE_FORMAT, cd.g.DIGITS ? "[" + cd.g.DIGITS + "]" : "\\d"), timezones = Object.keys(cd.config.messages).filter(name => name.startsWith("timezone-")).map(name => name.slice(9)), timezonePattern = "\\((?:" + (timezones.length ? timezones : TIMEZONES).map(abbr => {
const message = mw.message("timezone-" + abbr);
return message.exists() ? message.text() : abbr;
}).map(mw.util.escapeRegExp).join("|").toUpperCase() + ")\\)", pattern = mainPartPattern + " " + timezonePattern;
cd.g.TIMESTAMP_REGEXP = new RegExp(pattern), cd.g.TIMESTAMP_REGEXP_NO_TIMEZONE = new RegExp(mainPartPattern),
cd.g.TIMEZONE_REGEXP = new RegExp(timezonePattern, "g");
}
function initTimestampParsingTools() {
!function() {
const langCode = mw.config.get("wgContentLanguage");
cd.g.DATE_FORMAT = DATE_FORMATS[langCode], cd.g.DIGITS = mw.config.get("wgTranslateNumerals") ? DIGITS[langCode] : null;
}(), setLocalTimestampRegexps(), function() {
const format = cd.g.DATE_FORMAT, matchingGroups = [];
for (let p = 0; p < format.length; p++) {
let code = format[p];
switch ("x" === code && p < format.length - 1 && (code += format[++p]), "xk" === code && p < format.length - 1 && (code += format[++p]),
code) {
case "xx":
break;
case "xg":
case "d":
case "j":
case "D":
case "l":
case "F":
case "M":
case "n":
case "Y":
case "xkY":
case "G":
case "H":
case "i":
matchingGroups.push(code);
break;
case "\\":
p < format.length - 1 && ++p;
break;
case '"':
if (p < format.length - 1) {
const endQuote = format.indexOf('"', p + 1);
-1 !== endQuote && (p = endQuote);
}
}
}
cd.g.TIMESTAMP_PARSER = (match, matchingGroups, digits, timezoneOffset) => {
const untransformDigits = text => digits ? text.replace(new RegExp("[" + digits + "]", "g"), m => digits.indexOf(m)) : text, getMessages = messages => messages.map(name => cd.g.MESSAGES[name]);
let year = 0, monthIdx = 0, day = 0, hour = 0, minute = 0;
for (let i = 0; i < matchingGroups.length; i++) {
const code = matchingGroups[i], text = match[i + 3];
switch (code) {
case "xg":
monthIdx = getMessages([ "january-gen", "february-gen", "march-gen", "april-gen", "may-gen", "june-gen", "july-gen", "august-gen", "september-gen", "october-gen", "november-gen", "december-gen" ]).indexOf(text);
break;
case "d":
case "j":
day = Number(untransformDigits(text));
break;
case "D":
case "l":
break;
case "F":
monthIdx = getMessages([ "january", "february", "march", "april", "may_long", "june", "july", "august", "september", "october", "november", "december" ]).indexOf(text);
break;
case "M":
monthIdx = getMessages([ "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec" ]).indexOf(text);
break;
case "n":
monthIdx = Number(untransformDigits(text)) - 1;
break;
case "Y":
year = Number(untransformDigits(text));
break;
case "xkY":
year = Number(untransformDigits(text)) - 543;
break;
case "G":
case "H":
hour = Number(untransformDigits(text));
break;
case "i":
minute = Number(untransformDigits(text));
break;
default:
throw "Not implemented";
}
}
return new Date(Date.UTC(year, monthIdx, day, hour, minute) - 60 * timezoneOffset * 1e3);
}, cd.g.TIMESTAMP_MATCHING_GROUPS = matchingGroups;
}();
}
function initSettings() {
cd.settings = cd.settings || {}, cd.defaultSettings = {
allowEditOthersComments: !1,
alwaysExpandSettings: !1,
autopreview: !0,
desktopNotifications: "unknown",
defaultCommentLinkType: cd.config.defaultCommentLinkType || "diff",
defaultSectionLinkType: "wikilink",
highlightOwnComments: !0,
insertButtonsChanged: !1,
insertButtons: cd.config.defaultInsertButtons || [],
mySignature: cd.g.SIGN_CODE,
notifications: "all",
notificationsBlacklist: [],
showLoadingOverlay: !0,
showToolbar: !0,
watchSectionOnReply: !0
};
const aliases = {
desktopNotifications: [ "browserNotifications" ]
};
let nativeSettings;
try {
nativeSettings = JSON.parse(mw.user.options.get(cd.g.SETTINGS_OPTION_FULL_NAME)) || {};
} catch (e) {
nativeSettings = {};
}
Object.keys(cd.defaultSettings).forEach(name => {
const settingName = "cd" + firstCharToUpperCase(name);
settingName in window && (cd.settings[name] = window[settingName]), void 0 !== nativeSettings[name] && typeof nativeSettings[name] == typeof cd.defaultSettings[name] && (cd.settings[name] = nativeSettings[name]),
(aliases[name] || []).forEach(alias => {
void 0 !== nativeSettings[alias] && typeof nativeSettings[alias] == typeof cd.defaultSettings[name] && (cd.settings[name] = nativeSettings[alias]);
});
}), cd.settings.insertButtonsChanged || JSON.stringify(nativeSettings.insertButtons) === JSON.stringify(cd.config.defaultInsertButtons) || (cd.settings.insertButtons = cd.config.defaultInsertButtons),
cd.settings = Object.assign({}, cd.defaultSettings, cd.settings), JSON.stringify(cd.settings) !== mw.user.options.get(cd.g.SETTINGS_OPTION_FULL_NAME) && setSettings().catch(e => {
console.warn("Couldn't save the settings to the server.", e);
});
}
function initTalkPageCss() {
const focusedColor = window.getComputedStyle(document.documentElement).getPropertyValue("--cd-comment-underlay-focused-color"), bodyBackgroundColor = $("#content").length ? window.getComputedStyle($("#content").get(0)).backgroundColor : "white";
document.documentElement.style.setProperty("--cd-comment-underlay-focused-transparent-color", function(color) {
const dummyElement = document.createElement("span");
return dummyElement.style.color = color, (color = dummyElement.style.color).includes("rgba") ? color.replace(/\d+(?=\))/, "0") : color.replace(/rgb/, "rgba").replace(/\)/, ", 0)");
}(focusedColor || cd.g.COMMENT_UNDERLAY_FOCUSED_COLOR)), cd.g.nanoCss.put(":root", {
"--cd-comment-underlay-focused-color": cd.g.COMMENT_UNDERLAY_FOCUSED_COLOR,
"--cd-comment-underlay-target-color": cd.g.COMMENT_UNDERLAY_TARGET_COLOR,
"--cd-comment-underlay-new-color": cd.g.COMMENT_UNDERLAY_NEW_COLOR,
"--cd-comment-underlay-own-color": cd.g.COMMENT_UNDERLAY_OWN_COLOR
}), cd.g.nanoCss.put(".cd-commentOverlay-gradient", {
backgroundImage: "linear-gradient(to left, var(--cd-comment-underlay-focused-color), var(--cd-comment-underlay-focused-transparent-color))"
}), cd.g.nanoCss.put(".cd-messageArea .cd-closeButton", {
backgroundColor: bodyBackgroundColor
});
}
function init(_x) {
return _init.apply(this, arguments);
}
function _init() {
return (_init = asyncToGenerator_default()((function*({messagesRequest: messagesRequest}) {
cd.g.api = cd.g.api || new mw.Api, (yield messagesRequest) || loadMessages(), initSettings(),
initTimestampParsingTools(), cd.config.tagName ? (cd.g.SUMMARY_POSTFIX = "", cd.g.SUMMARY_LENGTH_LIMIT = mw.config.get("wgCommentCodePointLimit")) : (cd.g.SUMMARY_POSTFIX = " ([[".concat(cd.config.helpWikilink, "|").concat(cd.s("script-name-short"), "]])"),
cd.g.SUMMARY_LENGTH_LIMIT = mw.config.get("wgCommentCodePointLimit") - cd.g.SUMMARY_POSTFIX.length),
cd.g.CONTRIBS_PAGE_LINK_REGEXP = new RegExp("^".concat(cd.g.CONTRIBS_PAGE, "/")),
cd.g.CURRENT_USER_GENDER = mw.user.options.get("gender"), cd.g.QQX_MODE = "qqx" === mw.util.getParamValue("uselang"),
cd.g.GENDER_AFFECTS_USER_STRING = cd.s("user-male-dative") !== cd.s("user-female-dative") || cd.s("user-male-dative") !== cd.s("user-unknown-dative") || cd.s("user-male-genitive") !== cd.s("user-female-genitive") || cd.s("user-male-genitive") !== cd.s("user-unknown-genitive"),
cd.g.dontHandleScroll = !1, cd.g.autoScrollInProgress = !1, cd.commentForms = [];
const namespaceIds = mw.config.get("wgNamespaceIds"), userNamespaces = Object.keys(namespaceIds).filter(key => [ 2, 3 ].includes(namespaceIds[key])), userNamespacesPattern = underlinesToSpaces(userNamespaces.join("|"));
cd.g.USER_NAMESPACES_REGEXP = new RegExp("(?:^|:)(?:".concat(userNamespacesPattern, "):(.+)"), "i");
const anySpace = s => s.replace(/:/g, " : ").replace(/[ _]/g, "[ _]*"), userNamespacesPatternAnySpace = anySpace(userNamespaces.join("|")), contributionsPageAnySpace = anySpace(cd.g.CONTRIBS_PAGE);
if (cd.g.CAPTURE_USER_NAME_PATTERN = "\\[\\[[ _]*:?(?:\\w*:){0,2}(?:(?:".concat(userNamespacesPatternAnySpace, ")[ _]*:[ _]*|") + "(?:Special[ _]*:[ _]*Contributions|".concat(contributionsPageAnySpace, ")\\/[ _]*)([^|\\]/]+)(/)?"),
cd.config.unsignedTemplates.length) {
const unsignedTemplatesPattern = cd.config.unsignedTemplates.map(caseInsensitiveFirstCharPattern).join("|");
cd.g.UNSIGNED_TEMPLATES_REGEXP = new RegExp("(\\{\\{ *(?:".concat(unsignedTemplatesPattern, ") *\\|[ \\u200E]*([^}|]+?)[ \\u200E]*(?:\\|[ \\u200E]*([^}]+?)[ \\u200E]*)?\\}\\}).*\\n"), "g");
}
const currentUserSignature = mw.user.options.get("nickname"), authorInSignatureMatch = currentUserSignature.match(new RegExp("\\s*".concat(cd.g.CAPTURE_USER_NAME_PATTERN), "i"));
if (authorInSignatureMatch) {
const textBeforeSignature = cd.settings.mySignature !== cd.defaultSettings.mySignature && cd.settings.mySignature.includes("~~".concat("~")) ? mw.util.escapeRegExp(cd.settings.mySignature.slice(0, cd.settings.mySignature.indexOf("~~".concat("~")))) : "", signatureBeginning = mw.util.escapeRegExp(currentUserSignature.slice(0, authorInSignatureMatch.index));
cd.g.CURRENT_USER_SIGNATURE_PREFIX_REGEXP = new RegExp(textBeforeSignature + signatureBeginning + "$");
}
const pniePattern = cd.g.POPULAR_NOT_INLINE_ELEMENTS.join("|");
cd.g.PNIE_PATTERN = "(?:".concat(pniePattern, ")");
const commentAntipatternsPatternParts = [];
if (cd.config.elementsToExcludeClasses.length || cd.config.templatesToExclude.length || cd.config.commentAntipatterns.length) {
if (cd.config.elementsToExcludeClasses) {
const elementsToExcludeClassesPattern = cd.config.elementsToExcludeClasses.join("\\b|\\b");
commentAntipatternsPatternParts.push("class=(['\"])[^'\"\\n]*(?:\\b".concat(elementsToExcludeClassesPattern, "\\b)[^'\"\\n]*\\1"));
}
if (cd.config.templatesToExclude.length) {
const templatesToExcludePattern = cd.config.templatesToExclude.map(caseInsensitiveFirstCharPattern).join("|");
commentAntipatternsPatternParts.push("\\{\\{ *(?:".concat(templatesToExcludePattern, ") *(?:\\||\\}\\})"));
}
cd.config.commentAntipatterns && commentAntipatternsPatternParts.push(...cd.config.commentAntipatterns);
const commentAntipatternPattern = commentAntipatternsPatternParts.join("|");
cd.g.COMMENT_ANTIPATTERNS_REGEXP = new RegExp("^.*(?:".concat(commentAntipatternPattern, ").*$"), "mg");
}
cd.g.ARTICLE_PATH_REGEXP = new RegExp(mw.util.escapeRegExp(mw.config.get("wgArticlePath")).replace(mw.util.escapeRegExp("$1"), "(.*)"));
const quoteBeginnings = [ "<blockquote>", "<q>" ], quoteEndings = [ "</blockquote>", "</q>" ];
cd.config.pairQuoteTemplates.forEach(template => {
quoteBeginnings.push("{{".concat(template[0])), quoteEndings.push("{{".concat(template[1]));
});
const quoteBeginningsPattern = quoteBeginnings.map(mw.util.escapeRegExp).join("|"), quoteEndingsPattern = quoteEndings.map(mw.util.escapeRegExp).join("|");
cd.g.QUOTE_REGEXP = new RegExp("(".concat(quoteBeginningsPattern, ")([^]*?)(").concat(quoteEndingsPattern, ")"), "ig"),
cd.g.UNHIGHLIGHTABLE_ELEMENTS_CLASSES = cd.g.UNHIGHLIGHTABLE_ELEMENTS_CLASSES.concat(cd.config.customUnhighlightableElementsClasses);
const fileNamespacesPatternAnySpace = anySpace(Object.keys(namespaceIds).filter(key => 6 === namespaceIds[key]).join("|"));
cd.g.FILE_PREFIX_PATTERN = "(?:".concat(fileNamespacesPatternAnySpace, "):"), cd.g.BAD_COMMENT_BEGINNINGS = cd.g.BAD_COMMENT_BEGINNINGS.concat([ new RegExp("^\\[\\[".concat(cd.g.FILE_PREFIX_PATTERN, ".+\\n*(?=[*:#])")) ]).concat(cd.config.customBadCommentBeginnings),
cd.g.ADD_TOPIC_SELECTORS = [ "#ca-addsection a" ].concat(cd.config.customAddTopicLinkSelectors).join(", "),
createWindowManager(), cd.g.COMMENT_ELEMENT_PROTOTYPES = {}, cd.g.SECTION_ELEMENT_PROTOTYPES = {},
cd.g.COMMENT_ELEMENT_PROTOTYPES.goToParentButton = new OO.ui.ButtonWidget({
label: cd.s("cm-gotoparent"),
title: cd.s("cm-gotoparent-tooltip"),
framed: !1,
classes: [ "cd-button", "cd-commentButton" ]
}).$element.get(0);
const defaultTypeProperty = "cm-copylink-tooltip-".concat(cd.settings.defaultCommentLinkType.toLowerCase());
cd.g.COMMENT_ELEMENT_PROTOTYPES.linkButton = new OO.ui.ButtonWidget({
label: cd.s("cm-copylink"),
title: cd.s("cm-copylink-tooltip", cd.s(defaultTypeProperty)),
framed: !1,
classes: [ "cd-button", "cd-commentButton" ]
}).$element.get(0), cd.g.COMMENT_ELEMENT_PROTOTYPES.pendingLinkButton = new OO.ui.ButtonWidget({
label: cd.s("cm-copylink"),
title: cd.s("cm-copylink-tooltip", cd.s(defaultTypeProperty)),
framed: !1,
disabled: !0,
classes: [ "cd-button", "cd-commentButton", "cd-button-pending" ]
}).$element.get(0), cd.g.COMMENT_ELEMENT_PROTOTYPES.thankButton = new OO.ui.ButtonWidget({
label: cd.s("cm-thank"),
title: cd.s("cm-thank-tooltip"),
framed: !1,
classes: [ "cd-button", "cd-commentButton" ]
}).$element.get(0), cd.g.COMMENT_ELEMENT_PROTOTYPES.pendingThankButton = new OO.ui.ButtonWidget({
label: cd.s("cm-thank"),
title: cd.s("cm-thank-tooltip"),
framed: !1,
disabled: !0,
classes: [ "cd-button", "cd-commentButton", "cd-button-pending" ]
}).$element.get(0), cd.g.COMMENT_ELEMENT_PROTOTYPES.disabledThankButton = new OO.ui.ButtonWidget({
label: cd.s("cm-thank"),
title: cd.s("cm-thank-disabled-tooltip"),
framed: !1,
disabled: !0,
classes: [ "cd-button", "cd-commentButton" ]
}).$element.get(0), cd.g.COMMENT_ELEMENT_PROTOTYPES.editButton = new OO.ui.ButtonWidget({
label: cd.s("cm-edit"),
framed: !1,
classes: [ "cd-button", "cd-commentButton" ]
}).$element.get(0), cd.g.COMMENT_ELEMENT_PROTOTYPES.replyButton = new OO.ui.ButtonWidget({
label: cd.s("cm-reply"),
framed: !1,
classes: [ "cd-button", "cd-commentButton" ]
}).$element.get(0), cd.g.SECTION_ELEMENT_PROTOTYPES.replyButton = new OO.ui.ButtonWidget({
label: cd.s("section-reply"),
framed: !1,
classes: [ "cd-button", "cd-sectionButton" ]
}).$element.get(0), cd.g.SECTION_ELEMENT_PROTOTYPES.addSubsectionButton = new OO.ui.ButtonWidget({
label: cd.s("section-addsubsection"),
framed: !1,
classes: [ "cd-button", "cd-sectionButton" ]
}).$element.get(0), cd.g.COMMENT_ELEMENT_PROTOTYPES.underlay = document.createElement("div"),
cd.g.COMMENT_ELEMENT_PROTOTYPES.underlay.className = "cd-commentUnderlay", cd.g.COMMENT_ELEMENT_PROTOTYPES.overlay = document.createElement("div"),
cd.g.COMMENT_ELEMENT_PROTOTYPES.overlay.className = "cd-commentOverlay";
const overlayInnerWrapper = document.createElement("div");
overlayInnerWrapper.className = "cd-commentOverlay-innerWrapper", cd.g.COMMENT_ELEMENT_PROTOTYPES.overlay.appendChild(overlayInnerWrapper);
const overlayGradient = document.createElement("div");
overlayGradient.textContent = "\xa0", overlayGradient.className = "cd-commentOverlay-gradient",
overlayInnerWrapper.appendChild(overlayGradient);
const overlayContent = document.createElement("div");
overlayContent.className = "cd-commentOverlay-content", overlayInnerWrapper.appendChild(overlayContent),
$.fn.extend(jqueryExtensions);
}))).apply(this, arguments);
}
function getUnseenCommentAnchors() {
return cd.comments.filter(comment => "unseen" === comment.newness).map(comment => comment.anchor);
}
function updatePageContent(_x2, _x3) {
return _updatePageContent.apply(this, arguments);
}
function _updatePageContent() {
return (_updatePageContent = asyncToGenerator_default()((function*(html, keptData) {
cd.debug.stopTimer("getting HTML"), cd.debug.startTimer("laying out HTML"), cd.g.$content.children(".mw-parser-output").remove(),
cd.g.$content.append(html);
try {
yield processPage(Object.assign({}, keptData, {
unseenCommentAnchors: getUnseenCommentAnchors()
}));
} catch (e) {
mw.notify(cd.s("error-reloadpage"), {
type: "error"
}), removeLoadingOverlay(), console.error(e);
}
mw.hook("wikipage.content").fire(cd.g.$content);
}))).apply(this, arguments);
}
let $loadingPopup, newCount, unseenCount;
function isShowLoadingOverlaySettingOff() {
return cd.settings && !1 === cd.settings.showLoadingOverlay || !cd.settings && void 0 !== window.cdShowLoadingOverlay && !1 === window.cdShowLoadingOverlay;
}
function setLoadingOverlay() {
isShowLoadingOverlaySettingOff() || ($loadingPopup ? $loadingPopup.show() : ($loadingPopup = $("<div>").addClass("cd-loadingPopup"),
$("<img>").addClass("cd-loadingPopup-logo").attr("src", cd.config.logoDataUrl).appendTo($loadingPopup),
$(document.body).append($loadingPopup)));
}
function removeLoadingOverlay() {
$loadingPopup && !isShowLoadingOverlaySettingOff() && $loadingPopup.hide();
}
function reloadPage() {
return _reloadPage.apply(this, arguments);
}
function _reloadPage() {
return (_reloadPage = asyncToGenerator_default()((function*(keptData = {}) {
let pageData;
saveSession(), keptData.scrollPosition = window.pageYOffset, js_navPanel.closeAllNotifications(),
cd.debug.init(), cd.debug.startTimer("total time"), cd.debug.startTimer("getting HTML"),
setLoadingOverlay(), getUserInfo();
try {
pageData = yield getCurrentPageData(!0);
} catch (e) {
if (removeLoadingOverlay(), keptData.commentAnchor) throw e;
return mw.notify(cd.s("error-reloadpage"), {
type: "error"
}), void console.warn(e);
}
cd.commentForms.forEach(commentForm => {
commentForm.$element.detach();
}), mw.config.set({
wgRevisionId: pageData.revid,
wgCurRevisionId: pageData.revid
}), mw.loader.load(pageData.modules), mw.loader.load(pageData.modulestyles), mw.config.set(pageData.jsconfigvars),
updatePageTitle(0, !1), updatePageContent(pageData.text, keptData);
}))).apply(this, arguments);
}
function saveSession(warnedLeave) {
const forms = cd.commentForms.map(commentForm => {
let targetData;
const target = commentForm.target;
return commentForm.target instanceof Comment_Comment ? targetData = {
anchor: target.anchor
} : target instanceof Section_Section && (targetData = {
headline: target.headline,
firstCommentAnchor: target.comments[0] && target.comments[0].anchor,
index: target.id
}), {
mode: commentForm.mode,
targetData: targetData,
addSectionLinkHref: commentForm.$addSectionLink && commentForm.$addSectionLink.attr("href"),
headline: commentForm.headlineInput && commentForm.headlineInput.getValue(),
comment: commentForm.commentInput.getValue(),
summary: commentForm.summaryInput.getValue(),
minor: commentForm.minorCheckbox && commentForm.minorCheckbox.isSelected(),
watch: commentForm.watchCheckbox && commentForm.watchCheckbox.isSelected(),
watchSection: commentForm.watchSectionCheckbox && commentForm.watchSectionCheckbox.isSelected(),
ping: commentForm.pingCheckbox && commentForm.pingCheckbox.isSelected(),
small: commentForm.smallCheckbox && commentForm.smallCheckbox.isSelected(),
noSignature: commentForm.noSignatureCheckbox && commentForm.noSignatureCheckbox.isSelected(),
delete: commentForm.deleteCheckbox && commentForm.deleteCheckbox.isSelected(),
originalHeadline: commentForm.originalHeadline,
originalComment: commentForm.originalComment,
summaryAltered: commentForm.summaryAltered,
lastFocused: commentForm.lastFocused
};
}), commentFormsData = forms.length ? {
forms: forms,
saveUnixTime: Date.now(),
warnedLeave: warnedLeave
} : {}, commentFormsDataAllPagesJson = localStorage.getItem("convenientDiscussions-commentForms");
let commentFormsDataAllPages;
try {
commentFormsDataAllPages = commentFormsDataAllPagesJson && JSON.parse(commentFormsDataAllPagesJson) || {};
} catch (e) {
console.error(e), commentFormsDataAllPages = {};
}
commentFormsDataAllPages[mw.config.get("wgPageName")] = commentFormsData, localStorage.setItem("convenientDiscussions-commentForms", JSON.stringify(commentFormsDataAllPages));
}
function restoreCommentFormsFromData(commentFormsData) {
const restored = [], rescue = [];
commentFormsData.forms.forEach(data => {
const property = CommentForm_CommentForm.modeToProperty(data.mode);
if (data.targetData && data.targetData.anchor) {
const comment = Comment_Comment.getCommentByAnchor(data.targetData.anchor);
comment && !comment["".concat(property, "Form")] ? (comment[property](data), restored.push(comment["".concat(property, "Form")])) : rescue.push(data);
} else if (data.targetData && data.targetData.headline) {
const section = Section_Section.search({
headline: data.targetData.headline,
firstCommentAnchor: data.targetData.firstCommentAnchor,
index: data.targetData.index
});
section && !section["".concat(property, "Form")] ? (section[property](data), restored.push(section["".concat(property, "Form")])) : rescue.push(data);
} else if ("addSection" === data.mode) if (cd.g.addSectionForm) rescue.push(data); else {
const $fakeA = $("<a>").attr("href", data.addSectionLinkHref);
cd.g.addSectionForm = new CommentForm_CommentForm({
mode: data.mode,
$addSectionLink: $fakeA,
dataToRestore: data
}), restored.push(cd.g.addSectionForm);
}
}), restored.length && (restored.slice().sort(lastFocused)[0].commentInput.focus(),
saveSession()), rescue.length && rescueCommentFormsContent(rescue);
}
function restoreCommentForms() {
if (cd.g.firstRun) {
const commentFormsDataAllPagesJson = localStorage.getItem("convenientDiscussions-commentForms");
if (commentFormsDataAllPagesJson) {
let commentFormsDataAllPages;
try {
commentFormsDataAllPages = JSON.parse(commentFormsDataAllPagesJson) || {};
} catch (e) {
return void console.error(e);
}
data = commentFormsDataAllPages, Object.keys(data).forEach(key => {
(!data[key].forms || !data[key].forms.length || data[key].saveUnixTime < Date.now() - 1e3 * cd.g.SECONDS_IN_A_DAY * 30) && delete data[key];
}), commentFormsDataAllPages = data, localStorage.setItem("convenientDiscussions-commentForms", JSON.stringify(commentFormsDataAllPages));
const commentFormsData = commentFormsDataAllPages[mw.config.get("wgPageName")] || {};
if (commentFormsData.forms) if (commentFormsData.warnedLeave) {
const $text = animateLink(cd.s("restore-suggestion-text"), "cd-notification-restoreCommentForms", asyncToGenerator_default()((function*() {
cd.util.isPageOverlayOn() || (notification.close(), restoreCommentFormsFromData(commentFormsData));
}))), notification = mw.notification.notify($text, {
autoHide: !1
});
} else restoreCommentFormsFromData(commentFormsData), mw.notify(cd.s("restore-restored-text"), {
title: cd.s("restore-restored-title")
});
}
} else {
const rescue = [];
cd.commentForms.forEach(commentForm => {
commentForm.checkCodeRequest = null;
const target = commentForm.target;
if (target instanceof Comment_Comment) {
if (target.anchor) {
const comment = Comment_Comment.getCommentByAnchor(target.anchor);
comment ? (commentForm.setTargets(comment), comment[CommentForm_CommentForm.modeToProperty(commentForm.mode)](commentForm),
commentForm.addToPage()) : rescue.push({
headline: commentForm.headlineInput && commentForm.headlineInput.getValue(),
comment: commentForm.commentInput.getValue(),
summary: commentForm.summaryInput.getValue()
});
}
} else if (target instanceof Section_Section) {
const section = Section_Section.search({
headline: target.headline,
firstCommentAnchor: target.comments[0] && target.comments[0].anchor,
index: target.id
});
section ? (commentForm.setTargets(section), section[CommentForm_CommentForm.modeToProperty(commentForm.mode)](commentForm),
commentForm.addToPage()) : rescue.push({
headline: commentForm.headlineInput && commentForm.headlineInput.getValue(),
comment: commentForm.commentInput.getValue(),
summary: commentForm.summaryInput.getValue()
});
} else "addSection" === commentForm.mode && commentForm.addToPage();
}), rescue.length && rescueCommentFormsContent(rescue);
}
var data;
saveSession(), js_navPanel.updateCommentFormButton();
}
let relevantNewCommentAnchor, $navPanel, $refreshButton, $previousButton, $nextButton, $firstUnseenButton, $commentFormButton, lastFirstTimeSeenCommentId = null, newRevisions = [], notifiedAbout = [], navPanel_notifications = [], isBackgroundCheckArranged = !1;
function setAlarmViaWorker(interval) {
cd.g.worker.postMessage({
type: "setAlarm",
interval: interval
});
}
function removeAlarmViaWorker() {
cd.g.worker.postMessage({
type: "removeAlarm"
});
}
function checkForNewComments() {
return _checkForNewComments.apply(this, arguments);
}
function _checkForNewComments() {
return (_checkForNewComments = asyncToGenerator_default()((function*() {
if (!cd.g.worker) return;
if (document.hidden && !isBackgroundCheckArranged) {
const callback = () => {
$(document).off("visibilitychange", callback), isBackgroundCheckArranged = !1, removeAlarmViaWorker(),
checkForNewComments();
};
return $(document).on("visibilitychange", callback), setAlarmViaWorker(1e3 * Math.abs(cd.g.BACKGROUND_CHECK_FOR_NEW_COMMENTS_INTERVAL - cd.g.CHECK_FOR_NEW_COMMENTS_INTERVAL)),
void (isBackgroundCheckArranged = !0);
}
isBackgroundCheckArranged = !1;
const rvstartid = newRevisions.length ? newRevisions[newRevisions.length - 1] : mw.config.get("wgRevisionId");
try {
const revisionsResp = yield makeRequestNoTimers({
action: "query",
titles: cd.g.CURRENT_PAGE,
prop: "revisions",
rvprop: [ "ids", "flags", "size", "comment" ],
rvdir: "newer",
rvstartid: rvstartid,
rvlimit: 500,
redirects: !0,
formatversion: 2
}).catch(handleApiReject), revisions = revisionsResp && revisionsResp.query && revisionsResp.query.pages && revisionsResp.query.pages[0] && revisionsResp.query.pages[0].revisions;
if (!revisions) throw new CdError({
type: "api",
code: "noData"
});
const addedNewRevisions = revisions.filter((revision, i) => 0 !== i && !revision.minor && Math.abs(revision.size - revisions[i - 1].size) >= cd.config.bytesToDeemComment && !isCommentEdit(revision.comment)).map(revision => revision.revid);
if (newRevisions.push(...addedNewRevisions), newRevisions = removeDuplicates(newRevisions),
addedNewRevisions.length) {
const {text: text} = (yield getCurrentPageData(!1, !0)) || {};
void 0 === text ? console.error("No page text.") : cd.g.worker.postMessage({
type: "parse",
text: text,
g: {
TIMESTAMP_REGEXP: cd.g.TIMESTAMP_REGEXP,
TIMESTAMP_REGEXP_NO_TIMEZONE: cd.g.TIMESTAMP_REGEXP_NO_TIMEZONE,
TIMESTAMP_PARSER: cd.g.TIMESTAMP_PARSER.toString(),
TIMESTAMP_MATCHING_GROUPS: cd.g.TIMESTAMP_MATCHING_GROUPS,
TIMEZONE_REGEXP: cd.g.TIMEZONE_REGEXP,
DIGITS: cd.g.DIGITS,
LOCAL_TIMEZONE_OFFSET: cd.g.LOCAL_TIMEZONE_OFFSET,
MESSAGES: cd.g.MESSAGES,
CONTRIBS_PAGE: cd.g.CONTRIBS_PAGE,
CONTRIBS_PAGE_LINK_REGEXP: cd.g.CONTRIBS_PAGE_LINK_REGEXP,
ARTICLE_PATH_REGEXP: cd.g.ARTICLE_PATH_REGEXP,
USER_NAMESPACES_REGEXP: cd.g.USER_NAMESPACES_REGEXP,
UNHIGHLIGHTABLE_ELEMENTS_CLASSES: cd.g.UNHIGHLIGHTABLE_ELEMENTS_CLASSES,
CURRENT_USER_NAME: cd.g.CURRENT_USER_NAME,
CURRENT_USER_GENDER: cd.g.CURRENT_USER_GENDER,
CURRENT_NAMESPACE_NUMBER: cd.g.CURRENT_NAMESPACE_NUMBER
},
config: {
customFloatingElementsSelectors: cd.config.customFloatingElementsSelectors,
closedDiscussionsClasses: cd.config.closedDiscussionsClasses,
elementsToExcludeClasses: cd.config.elementsToExcludeClasses,
signatureScanLimit: cd.config.signatureScanLimit,
foreignElementsInHeadlinesClasses: cd.config.foreignElementsInHeadlinesClasses,
customForeignComponentChecker: cd.config.customForeignComponentChecker ? cd.config.customForeignComponentChecker.toString() : cd.config.customForeignComponentChecker
}
});
}
} catch (e) {
console.warn(e);
}
document.hidden ? (setAlarmViaWorker(1e3 * cd.g.BACKGROUND_CHECK_FOR_NEW_COMMENTS_INTERVAL),
isBackgroundCheckArranged = !0) : setAlarmViaWorker(1e3 * cd.g.CHECK_FOR_NEW_COMMENTS_INTERVAL);
}))).apply(this, arguments);
}
function updateRefreshButton(newComments, areThereInteresting) {
const newCommentsBySection = {};
let tooltipText;
newComments.forEach(comment => {
newCommentsBySection[comment.sectionAnchor] || (newCommentsBySection[comment.sectionAnchor] = []),
newCommentsBySection[comment.sectionAnchor].push(comment);
}), newComments.length ? (tooltipText = "".concat(cd.s("navpanel-newcomments-count", newComments.length), " (R)"),
Object.keys(newCommentsBySection).forEach(anchor => {
const headline = newCommentsBySection[anchor][0].sectionHeadline ? cd.s("navpanel-newcomments-insection", newCommentsBySection[anchor][0].sectionHeadline) : mw.msg("parentheses", cd.s("navpanel-newcomments-outsideofsections"));
tooltipText += "\n\n".concat(headline), newCommentsBySection[anchor].forEach(comment => {
tooltipText += "\n", comment.toMe && (tooltipText += "".concat(cd.s("navpanel-newcomments-toyou"), " "));
const author = comment.author.name || cd.s("navpanel-newcomments-unknownauthor"), date = comment.date ? cd.util.formatDate(comment.date) : cd.s("navpanel-newcomments-unknowndate");
tooltipText += "".concat(author, ", ").concat(date);
});
})) : tooltipText = "".concat(cd.s("navpanel-refresh"), " (R)"), $refreshButton.text(newComments.length ? "+".concat(newComments.length) : "").attr("title", tooltipText),
areThereInteresting ? $refreshButton.addClass("cd-navPanel-refreshButton-interesting") : $refreshButton.removeClass("cd-navPanel-refreshButton-interesting");
}
function updatePageTitle(newCommentsCount, areThereInteresting) {
const interestingMark = areThereInteresting ? "*" : "", s = newCommentsCount ? "(".concat(newCommentsCount).concat(interestingMark, ") ") : "";
document.title = document.title.replace(/^(?:\(\d+\*?\) )?/, s);
}
function addSectionNotifications(newComments) {
$(".cd-refreshButtonContainer").remove(), removeDuplicates(newComments.map(comment => comment.sectionAnchor)).forEach(anchor => {
const section = Section_Section.getSectionByAnchor(anchor);
if (!section) return;
const button = new OO.ui.ButtonWidget({
label: "".concat(cd.s("section-newcomments"), ". ").concat(cd.s("navpanel-refresh-tooltip"), "."),
framed: !1,
classes: [ "cd-button", "cd-sectionButton" ]
});
button.on("click", () => {
reloadPage({
commentAnchor: newComments.find(comment => comment.sectionAnchor === anchor).anchor
});
});
const $lastElement = section.$replyButton ? section.$replyButton.closest("ul, ol") : section.$elements[section.$elements.length - 1];
$("<div>").addClass("cd-refreshButtonContainer").addClass("cd-sectionButtonContainer").append(button.$element).insertAfter($lastElement);
});
}
function sendNotifications(_x, _x2) {
return _sendNotifications.apply(this, arguments);
}
function _sendNotifications() {
return (_sendNotifications = asyncToGenerator_default()((function*(comments, thisPageWatchedSections) {
const notifyAbout = comments.filter(comment => !notifiedAbout.some(commentNotifiedAbout => commentNotifiedAbout.anchor === comment.anchor));
let notifyAboutDesktop = [];
"all" === cd.settings.desktopNotifications ? notifyAboutDesktop = notifyAbout : "toMe" === cd.settings.desktopNotifications && (notifyAboutDesktop = notifyAbout.filter(comment => comment.toMe));
let notifyAboutOrdinary = [];
"all" === cd.settings.notifications ? notifyAboutOrdinary = notifyAbout : "toMe" === cd.settings.notifications && (notifyAboutOrdinary = notifyAbout.filter(comment => comment.toMe)),
"none" !== cd.settings.notifications && notifyAboutOrdinary.length && navPanel_notifications.slice().reverse().some(notification => !notification.notification.isOpen || (notifyAboutOrdinary.push(...notification.comments),
!1));
const authors = removeDuplicates(notifyAboutOrdinary.concat(notifyAboutDesktop)).map(comment => comment.author).filter(defined);
if (yield getUserGenders(authors, !0), notifyAboutOrdinary.length) {
let html, href;
if (1 === notifyAboutOrdinary.length) {
const comment = notifyAboutOrdinary[0];
if (href = mw.util.getUrl("".concat(cd.g.CURRENT_PAGE).concat(comment.anchor ? "#".concat(comment.anchor) : "")),
comment.toMe) {
const formsDataWillNotBeLost = cd.commentForms.some(commentForm => commentForm.isAltered()) ? " " + mw.msg("parentheses", cd.s("notification-formdata")) : "", where = comment.watchedSectionHeadline ? " " + cd.s("notification-part-insection", comment.watchedSectionHeadline) : " " + cd.s("notification-part-onthispage");
html = cd.s("notification-toyou", comment.author.name, comment.author, where, href, formsDataWillNotBeLost);
} else {
const formsDataWillNotBeLost = cd.commentForms.some(commentForm => commentForm.isAltered()) ? " " + mw.msg("parentheses", cd.s("notification-formdata")) : "";
html = cd.s("notification-insection", comment.author.name, comment.author, comment.watchedSectionHeadline, href, formsDataWillNotBeLost);
}
} else {
const section = notifyAboutOrdinary.every(comment => comment.watchedSectionHeadline === notifyAboutOrdinary[0].watchedSectionHeadline) ? notifyAboutOrdinary[0].watchedSectionHeadline : void 0;
href = mw.util.getUrl("".concat(cd.g.CURRENT_PAGE).concat(section ? "#".concat(section) : ""));
const where = section ? " " + cd.s("notification-part-insection", section) : " " + cd.s("notification-part-onthispage");
let mayBeInterestingString = cd.s("notification-newcomments-maybeinteresting");
mayBeInterestingString.startsWith(",") || (mayBeInterestingString = " " + mayBeInterestingString);
const mayBeInteresting = section && thisPageWatchedSections.includes(section) ? "" : mayBeInterestingString, formsDataWillNotBeLost = cd.commentForms.some(commentForm => commentForm.isAltered()) ? " " + mw.msg("parentheses", cd.s("notification-formdata")) : "";
html = cd.s("notification-newcomments", notifyAboutOrdinary.length, where, mayBeInteresting, href, formsDataWillNotBeLost);
}
navPanel.closeAllNotifications();
const $body = animateLink(html, "cd-notification-reloadPage", e => {
e.preventDefault(), reloadPage({
commentAnchor: notifyAboutOrdinary[0].anchor
}), notification.close();
}), notification = mw.notification.notify($body);
navPanel_notifications.push({
notification: notification,
comments: notifyAboutOrdinary
});
}
if (!document.hasFocus() && "granted" === Notification.permission && notifyAboutDesktop.length) {
let body, tag = "convenient-discussions-";
const comment = notifyAboutDesktop[0];
if (1 === notifyAboutDesktop.length) if (tag += comment.anchor, comment.toMe) {
const where = comment.sectionHeadline ? " " + cd.s("notification-part-insection", comment.sectionHeadline) : "";
body = cd.s("notification-toyou-desktop", comment.author.name, comment.author, where, cd.g.CURRENT_PAGE);
} else body = cd.s("notification-insection-desktop", comment.author.name, comment.author, comment.sectionHeadline, cd.g.CURRENT_PAGE); else {
const section = notifyAboutDesktop.every(comment => comment.watchedSectionHeadline === notifyAboutDesktop[0].watchedSectionHeadline) ? notifyAboutDesktop[0].watchedSectionHeadline : void 0, where = section ? " " + cd.s("notification-part-insection", section) : "";
let mayBeInterestingString = cd.s("notification-newcomments-maybeinteresting");
mayBeInterestingString.startsWith(",") || (mayBeInterestingString = " " + mayBeInterestingString);
const mayBeInteresting = section && thisPageWatchedSections.includes(section) ? "" : mayBeInterestingString;
body = cd.s("notification-newcomments-desktop", notifyAboutDesktop.length, where, cd.g.CURRENT_PAGE, mayBeInteresting),
tag += notifyAboutDesktop[notifyAboutDesktop.length - 1].anchor;
}
new Notification(mw.config.get("wgSiteName"), {
body: body,
tag: tag
}).onclick = () => {
parent.focus(), window.focus(), reloadPage({
commentAnchor: comment.anchor
});
};
}
notifiedAbout.push(...notifyAbout);
}))).apply(this, arguments);
}
function navPanel_processComments(_x3) {
return _processComments.apply(this, arguments);
}
function _processComments() {
return (_processComments = asyncToGenerator_default()((function*(comments) {
let thisPageWatchedSections;
try {
({thisPageWatchedSections: thisPageWatchedSections} = (yield getWatchedSections(!0)) || {});
} catch (e) {
console.warn("Couldn't load the settings from the server.");
}
comments.forEach(comment => {
comment.author = userRegistry.getUser(comment.authorName), delete comment.authorName;
});
const newComments = comments.filter(comment => comment.anchor && !Comment_Comment.getCommentByAnchor(comment.anchor)), interestingNewComments = newComments.filter(comment => {
if (comment.own || cd.settings.notificationsBlacklist.includes(comment.author.name) || !thisPageWatchedSections) return !1;
if (comment.toMe) return !0;
const sections = Section_Section.getSectionsByHeadline(comment.sectionHeadline);
for (const section of sections) {
const watchedAncestor = section.getWatchedAncestor(!0);
if (watchedAncestor) return comment.watchedSectionHeadline = watchedAncestor.headline,
!0;
}
});
interestingNewComments[0] ? relevantNewCommentAnchor = interestingNewComments[0].anchor : newComments[0] && (relevantNewCommentAnchor = newComments[0].anchor),
updateRefreshButton(newComments, interestingNewComments.length), updatePageTitle(newComments.length, interestingNewComments.length),
addSectionNotifications(newComments), sendNotifications(interestingNewComments, thisPageWatchedSections);
}))).apply(this, arguments);
}
function onMessageFromWorker(_x4) {
return _onMessageFromWorker.apply(this, arguments);
}
function _onMessageFromWorker() {
return (_onMessageFromWorker = asyncToGenerator_default()((function*(e) {
const message = e.data;
if ("wakeUp" === message.type && checkForNewComments(), "parse" === message.type) {
const {comments: comments} = message;
navPanel_processComments(comments);
}
}))).apply(this, arguments);
}
const navPanel = {
mouseOverNavPanel: !1,
mount() {
var _this = this;
return asyncToGenerator_default()((function*() {
$navPanel = $("<div>").attr("id", "cd-navPanel").on("mouseenter", () => {
_this.isMouseOver = !0;
}).on("mouseleave", () => {
_this.isMouseOver = !1;
}).appendTo(document.body), $refreshButton = $("<div>").addClass("cd-navPanel-button").attr("id", "cd-navPanel-refreshButton").attr("title", "".concat(cd.s("navpanel-refresh"), " (R)")).on("click", () => {
_this.refreshClick();
}).appendTo($navPanel), $previousButton = $("<div>").addClass("cd-navPanel-button").attr("id", "cd-navPanel-previousButton").attr("title", "".concat(cd.s("navpanel-previous"), " (W)")).on("click", () => {
_this.goToPreviousNewComment();
}).hide().appendTo($navPanel), $nextButton = $("<div>").addClass("cd-navPanel-button").attr("id", "cd-navPanel-nextButton").attr("title", "".concat(cd.s("navpanel-next"), " (S)")).on("click", () => {
_this.goToNextNewComment();
}).hide().appendTo($navPanel), $firstUnseenButton = $("<div>").addClass("cd-navPanel-button").attr("id", "cd-navPanel-firstUnseenButton").attr("title", "".concat(cd.s("navpanel-firstunseen"), " (F)")).on("click", () => {
_this.goToFirstUnseenComment();
}).hide().appendTo($navPanel), $commentFormButton = $("<div>").addClass("cd-navPanel-button").attr("id", "cd-navPanel-commentFormButton").attr("title", cd.s("navpanel-commentform")).on("click", () => {
_this.goToNextCommentForm();
}).hide().appendTo($navPanel), cd.g.worker && (cd.g.worker.onmessage = onMessageFromWorker,
setAlarmViaWorker(1e3 * cd.g.CHECK_FOR_NEW_COMMENTS_INTERVAL));
}))();
},
isMounted: () => Boolean($navPanel),
processVisits(visitsRequest, memorizedUnseenCommentAnchors = []) {
var _this2 = this;
return asyncToGenerator_default()((function*() {
let visits, thisPageVisits;
try {
({visits: visits, thisPageVisits: thisPageVisits} = yield visitsRequest);
} catch (e) {
return void console.warn("Couldn't load the settings from the server.", e);
}
cd.g.visits = visits, cd.g.thisPageVisits = thisPageVisits;
const currentUnixTime = Math.floor(Date.now() / 1e3);
for (let i = thisPageVisits.length - 1; i >= 0; i--) if (thisPageVisits[i] < currentUnixTime - 60 * cd.g.HIGHLIGHT_NEW_COMMENTS_INTERVAL) {
thisPageVisits.splice(0, i);
break;
}
if (thisPageVisits.length) {
const newComments = cd.comments.filter(comment => {
if (comment.newness = null, !comment.date) return !1;
const isUnseen = memorizedUnseenCommentAnchors.some(anchor => anchor === comment.anchor), commentUnixTime = Math.floor(comment.date.getTime() / 1e3);
return commentUnixTime > thisPageVisits[0] && (comment.newness = commentUnixTime > thisPageVisits[thisPageVisits.length - 1] && !comment.own || isUnseen ? "unseen" : "new",
!0);
}), floatingRects = newComments.length ? cd.g.specialElements.floating.map(el => el.getBoundingClientRect()) : void 0;
newComments.forEach(comment => {
comment.configureLayers(!1, floatingRects);
}), newComments.forEach(comment => {
comment.addLayers();
});
}
thisPageVisits.push(String(currentUnixTime)), setVisits(visits), _this2.fill(),
_this2.registerSeenComments(), mw.hook("convenientDiscussions.newCommentsMarked").fire(cd);
}))();
},
reset() {
lastFirstTimeSeenCommentId = null, newRevisions = [], notifiedAbout = [], relevantNewCommentAnchor = null,
removeAlarmViaWorker(), setAlarmViaWorker(1e3 * cd.g.CHECK_FOR_NEW_COMMENTS_INTERVAL),
isBackgroundCheckArranged = !1, $refreshButton.empty().attr("title", "".concat(cd.s("navpanel-refresh"), " (R)")),
$previousButton.hide(), $nextButton.hide(), $firstUnseenButton.hide(), $commentFormButton.hide();
},
fill() {
newCount = cd.comments.filter(comment => comment.newness).length, unseenCount = cd.comments.filter(comment => "unseen" === comment.newness).length,
newCount && ($nextButton.show(), $previousButton.show(), unseenCount && ($firstUnseenButton.show(),
this.updateFirstUnseenButton()));
},
areAllCommentsSeen: () => 0 === unseenCount,
decrementUnseenCommentCount() {
unseenCount--;
},
updateFirstUnseenButton() {
unseenCount ? $firstUnseenButton.text(unseenCount) : $firstUnseenButton.hide();
},
refreshClick() {
reloadPage({
commentAnchor: relevantNewCommentAnchor
});
},
closeAllNotifications() {
navPanel_notifications.forEach(notification => {
notification.notification.$notification.hide(), notification.notification.close();
}), navPanel_notifications = [];
},
goToPreviousNewComment() {
if (cd.g.autoScrollInProgress) return;
const foundComment = Comment_Comment.findInViewport("backward");
if (!foundComment) return;
const comment = reorderArray(cd.comments, foundComment.id, !0).find(comment => comment.newness && !1 === comment.isInViewport(!0));
comment && comment.$elements.cdScrollTo("center", !0, () => {
comment.registerSeen("backward", !0), this.updateFirstUnseenButton();
});
},
goToNextNewComment() {
if (cd.g.autoScrollInProgress) return;
const foundComment = Comment_Comment.findInViewport("forward");
if (!foundComment) return;
const comment = reorderArray(cd.comments, foundComment.id).find(comment => comment.newness && !1 === comment.isInViewport(!0));
comment && comment.$elements.cdScrollTo("center", !0, () => {
comment.registerSeen("forward", !0), this.updateFirstUnseenButton();
});
},
goToFirstUnseenComment() {
if (!cd.g.autoScrollInProgress && unseenCount) {
const comment = cd.comments.slice(lastFirstTimeSeenCommentId || 0).find(comment => "unseen" === comment.newness);
comment && (comment.$elements.cdScrollTo("center", !0, () => {
comment.registerSeen("forward", !0), this.updateFirstUnseenButton();
}), lastFirstTimeSeenCommentId = comment.id);
}
},
goToNextCommentForm() {
const commentForm = cd.commentForms.filter(commentForm => !commentForm.$element.cdIsInViewport(!0)).sort((commentForm1, commentForm2) => {
const top1 = commentForm1.$element.get(0).getBoundingClientRect().top, top2 = commentForm2.$element.get(0).getBoundingClientRect().top;
return top2 > 0 && top1 < 0 || top1 > top2 ? 1 : top1 > 0 && top2 < 0 || top2 > top1 ? -1 : 0;
})[0];
commentForm && (commentForm.$element.cdScrollIntoView("center"), commentForm.commentInput.focus());
},
registerSeenComments() {
!unseenCount || cd.g.dontHandleScroll || cd.g.autoScrollInProgress || (cd.g.dontHandleScroll = !0,
setTimeout(() => {
cd.g.dontHandleScroll = !1;
const foundComment = Comment_Comment.findInViewport();
if (!foundComment) return;
const registerSeenIfInViewport = comment => {
const isInViewport = comment.isInViewport(!0);
if (isInViewport) comment.registerSeen(); else if (!1 === isInViewport) return !0;
};
cd.comments.slice(0, foundComment.id).reverse().some(registerSeenIfInViewport),
cd.comments.slice(foundComment.id).some(registerSeenIfInViewport), this.updateFirstUnseenButton();
}, 300));
},
updateCommentFormButton() {
cd.g.autoScrollInProgress || (cd.commentForms.some(commentForm => !commentForm.$element.cdIsInViewport(!0)) ? $commentFormButton.show() : $commentFormButton.hide());
}
};
var js_navPanel = navPanel;
const beforeUnloadHandlers = {};
function windowResizeHandler() {
commentLayers.redrawIfNecessary(!0), js_navPanel.isMounted() && js_navPanel.updateCommentFormButton(),
cd.commentForms.forEach(commentForm => {
commentForm.adjustLabels();
});
}
function addPreventUnloadCondition(name, condition) {
beforeUnloadHandlers[name] = e => {
if (condition()) return e.preventDefault(), e.returnValue = "", "";
}, $(window).on("beforeunload", beforeUnloadHandlers[name]);
}
function removePreventUnloadCondition(name) {
beforeUnloadHandlers[name] && $(window).off("beforeunload", beforeUnloadHandlers[name]);
}
function globalKeyDownHandler(e) {
if (!cd.util.isPageOverlayOn()) {
if (e.ctrlKey && !e.shiftKey && e.altKey && 81 === e.keyCode || !e.ctrlKey && !e.shiftKey && !e.altKey && 81 === e.keyCode && !isInputFocused()) {
e.preventDefault();
const commentForm = CommentForm_CommentForm.getLastActiveCommentForm();
commentForm && commentForm.quote(!e.ctrlKey);
}
js_navPanel.isMounted() && (e.ctrlKey || e.shiftKey || e.altKey || 82 !== e.keyCode || isInputFocused() || js_navPanel.refreshClick(),
e.ctrlKey || e.shiftKey || e.altKey || 87 !== e.keyCode || isInputFocused() || js_navPanel.goToPreviousNewComment(),
e.ctrlKey || e.shiftKey || e.altKey || 83 !== e.keyCode || isInputFocused() || js_navPanel.goToNextNewComment(),
e.ctrlKey || e.shiftKey || e.altKey || 70 !== e.keyCode || isInputFocused() || js_navPanel.goToFirstUnseenComment());
}
}
function highlightFocused(e) {
if (cd.util.isPageOverlayOn() || cd.g.dontHandleScroll || cd.g.autoScrollInProgress) return;
const contentLeft = cd.g.rootElement.getBoundingClientRect().left;
e.pageX < contentLeft - cd.g.COMMENT_UNDERLAY_SIDE_MARGIN ? commentLayers.underlays.filter(underlay => underlay.classList.contains("cd-commentUnderlay-focused")).forEach(underlay => {
underlay.cdTarget.unhighlightFocused();
}) : cd.comments.filter(comment => comment.$underlay).forEach(comment => {
const underlay = comment.$underlay.get(0);
if (!underlay.classList.contains("cd-commentUnderlay")) return;
const top = Number(underlay.style.top.replace("px", "")), left = Number(underlay.style.left.replace("px", "")), width = Number(underlay.style.width.replace("px", "")), height = Number(underlay.style.height.replace("px", "")), layersContainerOffset = comment.getLayersContainerOffset();
!js_navPanel.isMouseOver && e.pageY >= top + layersContainerOffset.top && e.pageY <= top + height + layersContainerOffset.top && e.pageX >= left + layersContainerOffset.left && e.pageX <= left + width + layersContainerOffset.left ? underlay.classList.contains("cd-commentUnderlay-focused") || underlay.cdTarget.highlightFocused() : underlay.classList.contains("cd-commentUnderlay-focused") && underlay.cdTarget.unhighlightFocused();
});
}
function checkboxField({value: value, selected: selected, label: label, help: help, tabIndex: tabIndex, title: title}) {
const checkbox = new OO.ui.CheckboxInputWidget({
value: value,
selected: selected,
tabIndex: tabIndex
});
return [ new OO.ui.FieldLayout(checkbox, {
label: label,
align: "inline",
help: help,
helpInline: !0,
title: title
}), checkbox ];
}
function radioField({label: label, selected: selected, help: help, options: options}) {
const items = options.map(config => new OO.ui.RadioOptionWidget(config)), select = new OO.ui.RadioSelectWidget({
items: items
}), field = new OO.ui.FieldLayout(select, {
label: label,
align: "top",
help: help,
helpInline: !0
});
return select.selectItemByData(selected), [ field, select, ...items ];
}
var html_entity_decode = __webpack_require__(8), html_entity_decode_default = __webpack_require__.n(html_entity_decode);
function hideHtmlComments(code) {
return code.replace(/(<!--)([^]*?)(-->)/g, (s, m1, m2, m3) => m1 + " ".repeat(m2.length) + m3);
}
function findFirstTimestamp(code) {
const signatures = extractSignatures(code);
return signatures.length ? signatures[0].timestamp : null;
}
function removeWikiMarkup(code) {
return code.replace(/<!--[^]*?-->/g, "").replace(/\[\[:?(?:[^|[\]<>\n]+\|)?(.+?)\]\]/g, "$1").replace(/\{\{:?(?:[^|{}<>\n]+)(?:\|(.+?))?\}\}/g, "$1").replace(/\[https?:\/\/[^[\]<>"\n ]+ *([^\]]*)\]/g, "$1").replace(/'''(.+?)'''/g, "$1").replace(/''(.+?)''/g, "$1").replace(/<br ?\/?>/g, " ").replace(/<\w+(?: [\w ]+?=[^<>]+?| ?\/?)>/g, "").replace(/<\/\w+ ?>/g, "").replace(/ {2,}/g, " ").trim();
}
function normalizeCode(text) {
return text.replace(/</g, "<").replace(/>/g, ">").replace(/[/g, "[").replace(/]/g, "]").replace(/{/g, "{").replace(/|/g, "|").replace(/}/g, "}").replace(/\s+/g, " ");
}
function encodeWikilink(link) {
return link.replace(/</g, "<").replace(/>/g, ">").replace(/\[/g, "[").replace(/\]/g, "]").replace(/\{/g, "{").replace(/\|/g, "|").replace(/\}/g, "}").replace(/\s+/g, " ");
}
function extractSignatures(code, generateCommentAnchors) {
const adjustedCode = hideHtmlComments(code).replace(cd.g.QUOTE_REGEXP, (s, m1, m2, m3) => m1 + " ".repeat(m2.length) + m3).replace(cd.g.COMMENT_ANTIPATTERNS_REGEXP, s => " ".repeat(s.length)), timestampRegexp = new RegExp("^((.*)(".concat(cd.g.TIMESTAMP_REGEXP.source, ")(?:\\}\\}|</small>)?).*(?:\n*|$)"), "igm"), signatureRegexp = new RegExp("^((.*)(".concat(cd.g.CAPTURE_USER_NAME_PATTERN, ".{1,").concat(250, "}((").concat(cd.g.TIMESTAMP_REGEXP.source, ")(?:\\}\\}|</small>)?)).*)(?:\n*|$)"), "igm"), authorLinkRegexp = new RegExp(cd.g.CAPTURE_USER_NAME_PATTERN, "ig");
let timestampMatch, signatures = [];
for (;timestampMatch = timestampRegexp.exec(adjustedCode); ) {
const line = timestampMatch[0];
signatureRegexp.lastIndex = 0;
const authorTimestampMatch = signatureRegexp.exec(line);
let author, timestamp, signatureStartIndex, signatureEndIndex, nextCommentStartIndex, dirtySignature;
if (authorTimestampMatch) {
let authorLinkMatch;
author = userRegistry.getUser(decodeHtmlEntities(authorTimestampMatch[4])), timestamp = authorTimestampMatch[7],
signatureStartIndex = timestampMatch.index + authorTimestampMatch[2].length, signatureEndIndex = timestampMatch.index + authorTimestampMatch[1].length,
nextCommentStartIndex = timestampMatch.index + authorTimestampMatch[0].length, dirtySignature = authorTimestampMatch[3],
authorLinkRegexp.lastIndex = 0;
const commentEndingStartIndex = Math.max(0, authorTimestampMatch[0].length - authorTimestampMatch[6].length - 250), commentEnding = authorTimestampMatch[0].slice(commentEndingStartIndex);
for (;authorLinkMatch = authorLinkRegexp.exec(commentEnding); ) {
if (authorLinkMatch[2]) continue;
if (userRegistry.getUser(decodeHtmlEntities(authorLinkMatch[1])) === author) {
signatureStartIndex = timestampMatch.index + commentEndingStartIndex + authorLinkMatch.index,
dirtySignature = code.slice(signatureStartIndex, signatureEndIndex);
break;
}
}
} else timestamp = timestampMatch[3], signatureStartIndex = timestampMatch.index + timestampMatch[2].length,
signatureEndIndex = timestampMatch.index + timestampMatch[1].length, nextCommentStartIndex = timestampMatch.index + timestampMatch[0].length,
dirtySignature = timestamp;
signatures.push({
author: author,
timestamp: timestamp,
signatureStartIndex: signatureStartIndex,
signatureEndIndex: signatureEndIndex,
dirtySignature: dirtySignature,
nextCommentStartIndex: nextCommentStartIndex
});
}
if (cd.g.UNSIGNED_TEMPLATES_REGEXP) {
let match;
for (;match = cd.g.UNSIGNED_TEMPLATES_REGEXP.exec(adjustedCode); ) {
let author, timestamp;
cd.g.TIMESTAMP_REGEXP_NO_TIMEZONE.test(match[2]) ? (timestamp = match[2], author = match[3]) : cd.g.TIMESTAMP_REGEXP_NO_TIMEZONE.test(match[3]) ? (timestamp = match[3],
author = match[2]) : author = match[2], author = userRegistry.getUser(decodeHtmlEntities(author)),
signatures.push({
author: author,
timestamp: timestamp,
signatureStartIndex: match.index,
signatureEndIndex: match.index + match[1].length,
dirtySignature: match[1],
nextCommentStartIndex: match.index + match[0].length
});
}
signatures.sort((sig1, sig2) => sig1.signatureStartIndex > sig2.signatureStartIndex ? 1 : -1);
}
return signatures.forEach((sig, i) => {
sig.commentStartIndex = 0 === i ? 0 : signatures[i - 1].nextCommentStartIndex;
}), signatures = signatures.filter(sig => sig.author), generateCommentAnchors && resetCommentAnchors(),
signatures.forEach((sig, i) => {
const {date: date} = sig.timestamp && parseTimestamp(sig.timestamp) || {};
if (sig.id = i, sig.date = date, delete sig.nextCommentStartIndex, generateCommentAnchors) {
const anchor = date ? generateCommentAnchor(date, sig.author.name, !0) : void 0;
sig.anchor = anchor, registerCommentAnchor(anchor);
}
}), signatures;
}
function decodeHtmlEntities(s) {
if (-1 === s.indexOf("&")) return s;
{
let result = s;
return -1 !== result.indexOf("&amp;") && (result = result.replace(/&amp;/g, "&amp;")),
result = -1 === result.indexOf("&#") ? result : result.replace(/&#(\d+);/g, (s, m1) => String.fromCharCode(m1)),
-1 === result.indexOf("&") ? result : html_entity_decode_default()(result);
}
}
function hideSensitiveCode(code, callback) {
const hidden = [], hide = (re, isTable) => {
code = code.replace(re, s => (callback && callback(isTable), (isTable ? "\x03" : "\x01") + hidden.push(s) + (isTable ? "\x04" : "\x02")));
};
return (() => {
hide(/\{\{([^{]\{?)+?\}\}/g);
let pos = 0;
const stack = [];
let template, left, right;
for (;left = code.indexOf("{{", pos), right = code.indexOf("}}", pos), -1 !== left || -1 !== right || stack.length; ) if (-1 !== left && (left < right || -1 === right)) stack.push(left),
pos = left + 2; else {
if (left = stack.pop(), void 0 === left) {
if (-1 === right) {
pos += 2;
continue;
}
left = 0;
}
-1 === right && (right = code.length), right += 2, template = code.substring(left, right),
code = code.substring(0, left) + "\x01" + hidden.push(template) + "\x02" + code.substr(right),
pos = right - template.length;
}
})(), hide(/^\{\|[^]*?\n\|\}/gm, !0), ((...args) => {
args.forEach(arg => {
hide(new RegExp("<".concat(arg, "( [^>]+)?>[\\s\\S]+?<\\/").concat(arg, ">"), "gi"));
});
})("nowiki", "pre", "source", "syntaxhighlight"), {
code: code,
hidden: hidden
};
}
function unhideSensitiveCode(code, hidden) {
for (;code.match(/(?:\x01|\x03)\d+(?:\x02|\x04)/); ) code = code.replace(/(?:\x01|\x03)(\d+)(?:\x02|\x04)/g, (s, num) => hidden[num - 1]);
return code;
}
function createWindowManager() {
cd.g.windowManager || (cd.g.windowManager = new OO.ui.WindowManager, $(document.body).append(cd.g.windowManager.$element));
}
function getSelectedItemData(select) {
const selectedItem = select.findSelectedItem();
return selectedItem && selectedItem.getData();
}
function isUnsaved(dialog) {
const saveButton = dialog.actions.get({
actions: "save"
})[0];
return saveButton && !saveButton.isDisabled();
}
function confirmCloseDialog(_x, _x2) {
return _confirmCloseDialog.apply(this, arguments);
}
function _confirmCloseDialog() {
return (_confirmCloseDialog = asyncToGenerator_default()((function*(dialog, dialogCode) {
isUnsaved(dialog) && !(yield confirmDestructive("".concat(dialogCode, "-close-confirm"))) || (dialog.close({
action: "close"
}), removePreventUnloadCondition("dialog"));
}))).apply(this, arguments);
}
function handleError(dialog, e, messageName, recoverable) {
e instanceof CdError ? dialog.showErrors(new OO.ui.Error(cd.s(messageName), {
recoverable: recoverable
})) : dialog.showErrors(new OO.ui.Error(cd.s("error-javascript"), {
recoverable: !1
})), console.warn(e), recoverable || dialog.$errors.find(".oo-ui-buttonElement-button").on("click", () => {
dialog.close();
}), dialog.actions.setAbilities({
close: !0
}), cd.g.windowManager.updateWindowSize(dialog), dialog.popPending();
}
function settingsDialog() {
return _settingsDialog.apply(this, arguments);
}
function _settingsDialog() {
return (_settingsDialog = asyncToGenerator_default()((function*() {
if (cd.util.isPageOverlayOn()) return;
function SettingsDialog() {
SettingsDialog.parent.call(this);
}
OO.inheritClass(SettingsDialog, OO.ui.ProcessDialog), SettingsDialog.static.name = "settingsDialog",
SettingsDialog.static.title = cd.s("sd-title"), SettingsDialog.static.actions = [ {
action: "close",
modes: [ "settings", "reload", "dataRemoved" ],
flags: [ "safe", "close" ],
disabled: !0
}, {
action: "save",
modes: [ "settings" ],
label: cd.s("sd-save"),
flags: [ "primary", "progressive" ],
disabled: !0
}, {
action: "reset",
modes: [ "settings" ],
label: cd.s("sd-reset"),
flags: [ "destructive" ],
disabled: !0
}, {
action: "reload",
modes: [ "reload" ],
label: cd.s("sd-reload"),
flags: [ "primary", "progressive" ]
} ], SettingsDialog.static.size = "large", SettingsDialog.prototype.getBodyHeight = function() {
return 600;
}, SettingsDialog.prototype.initialize = asyncToGenerator_default()((function*() {
SettingsDialog.parent.prototype.initialize.apply(this, arguments), this.pushPending();
const $loading = $("<div>").text(cd.s("loading-ellipsis"));
this.loadingPanel = new OO.ui.PanelLayout({
padded: !0,
expanded: !1
}), this.loadingPanel.$element.append($loading), this.settingsPanel = new OO.ui.PanelLayout({
padded: !1,
expanded: !0
});
const $settingsSaved = $("<p>").html(cd.s("sd-saved"));
this.reloadPanel = new OO.ui.PanelLayout({
padded: !0,
expanded: !1
}), this.reloadPanel.$element.append($settingsSaved);
const $dataRemoved = $("<p>").html(cd.s("sd-dataremoved"));
this.dataRemovedPanel = new OO.ui.PanelLayout({
padded: !0,
expanded: !1
}), this.dataRemovedPanel.$element.append($dataRemoved), this.stackLayout = new OO.ui.StackLayout({
items: [ this.loadingPanel, this.settingsPanel, this.reloadPanel, this.dataRemovedPanel ]
}), this.$body.append(this.stackLayout.$element);
})), SettingsDialog.prototype.getSetupProcess = function(data) {
return SettingsDialog.parent.prototype.getSetupProcess.call(this, data).next(() => {
this.stackLayout.setItem(this.loadingPanel), this.actions.setMode("settings");
});
}, SettingsDialog.prototype.getReadyProcess = function(data) {
var _this = this;
return SettingsDialog.parent.prototype.getReadyProcess.call(this, data).next(asyncToGenerator_default()((function*() {
let settings;
try {
[settings] = yield Promise.all(preparationRequests);
} catch (e) {
return void handleError(_this, e, "error-settings-load", !1);
}
_this.settings = Object.assign({}, cd.settings, settings), cd.g.settingsForm = _this,
_this.renderForm(_this.settings), _this.stackLayout.setItem(_this.settingsPanel),
_this.bookletLayout.setPage("general"), _this.actions.setAbilities({
close: !0
}), cd.g.windowManager.updateWindowSize(_this), _this.popPending(), addPreventUnloadCondition("dialog", () => isUnsaved(dialog));
})));
}, SettingsDialog.prototype.getActionProcess = function(action) {
var _this2 = this;
return "save" === action ? new OO.ui.Process(asyncToGenerator_default()((function*() {
_this2.pushPending();
const settings = {};
settings.allowEditOthersComments = _this2.allowEditOthersCommentsCheckbox.isSelected(),
settings.alwaysExpandSettings = _this2.alwaysExpandSettingsCheckbox.isSelected(),
settings.autopreview = _this2.autopreviewCheckbox.isSelected(), settings.desktopNotifications = getSelectedItemData(_this2.desktopNotificationsSelect) || "unknown",
settings.defaultCommentLinkType = getSelectedItemData(_this2.defaultCommentLinkTypeSelect),
settings.defaultSectionLinkType = getSelectedItemData(_this2.defaultSectionLinkTypeSelect),
settings.highlightOwnComments = _this2.highlightOwnCommentsCheckbox.isSelected(),
settings.insertButtons = _this2.processInsertButtons(), settings.mySignature = _this2.mySignatureInput.getValue(),
settings.notifications = getSelectedItemData(_this2.notificationsSelect), settings.notificationsBlacklist = _this2.notificationsBlacklistMultiselect.getValue(),
settings.showToolbar = _this2.showToolbarCheckbox.isSelected(), settings.watchSectionOnReply = _this2.watchSectionOnReplyCheckbox.isSelected(),
settings.insertButtonsChanged = JSON.stringify(settings.insertButtons) !== JSON.stringify(cd.defaultSettings.insertButtons);
try {
yield setSettings(settings);
} catch (e) {
return void handleError(_this2, e, "error-settings-save", !0);
}
_this2.stackLayout.setItem(_this2.reloadPanel), _this2.actions.setMode("reload"),
_this2.popPending();
}))) : "reload" === action ? new OO.ui.Process(() => {
this.close({
action: action
}), location.reload();
}) : "close" === action ? new OO.ui.Process(asyncToGenerator_default()((function*() {
yield confirmCloseDialog(_this2, "sd");
}))) : "reset" === action ? new OO.ui.Process(asyncToGenerator_default()((function*() {
(yield OO.ui.confirm(cd.s("sd-reset-confirm"))) && _this2.renderForm(cd.defaultSettings);
}))) : SettingsDialog.parent.prototype.getActionProcess.call(this, action);
}, SettingsDialog.prototype.renderForm = function(settings) {
[this.allowEditOthersCommentsField, this.allowEditOthersCommentsCheckbox] = checkboxField({
value: "allowEditOthersComments",
selected: settings.allowEditOthersComments,
label: cd.s("sd-alloweditotherscomments")
}), [this.alwaysExpandSettingsField, this.alwaysExpandSettingsCheckbox] = checkboxField({
value: "alwaysExpandSettings",
selected: settings.alwaysExpandSettings,
label: cd.s("sd-alwaysexpandsettings")
}), [this.autopreviewField, this.autopreviewCheckbox] = checkboxField({
value: "autopreview",
selected: settings.autopreview,
label: cd.s("sd-autopreview")
}), [this.desktopNotificationsField, this.desktopNotificationsSelect, this.desktopNotificationsRadioAll, this.desktopNotificationsRadioNone, this.desktopNotificationsRadioToMe] = radioField({
options: [ {
label: cd.s("sd-desktopnotifications-radio-all"),
data: "all"
}, {
label: cd.s("sd-desktopnotifications-radio-tome"),
data: "toMe"
}, {
label: cd.s("sd-desktopnotifications-radio-none"),
data: "none"
} ],
selected: settings.desktopNotifications,
label: cd.s("sd-desktopnotifications"),
help: cd.s("sd-desktopnotifications-help", location.host)
});
let defaultCommentLinkTypeHelp = cd.s("sd-defaultcommentlinktype-help");
"diff" === cd.config.defaultCommentLinkType && (defaultCommentLinkTypeHelp += " ".concat(cd.s("sd-defaultcommentlinktype-help-notdifflinks"))),
[this.defaultCommentLinkTypeField, this.defaultCommentLinkTypeSelect, this.defaultCommentLinkTypeRadioWikilink, this.defaultCommentLinkTypeRadioLink] = radioField({
options: [ {
label: cd.s("sd-defaultcommentlinktype-radio-diff"),
data: "diff"
}, {
label: cd.s("sd-defaultcommentlinktype-radio-wikilink"),
data: "wikilink"
}, {
label: cd.s("sd-defaultcommentlinktype-radio-link"),
data: "link"
} ],
selected: settings.defaultCommentLinkType,
label: cd.s("sd-defaultcommentlinktype", cd.s("cm-copylink")),
help: defaultCommentLinkTypeHelp
}), [this.defaultSectionLinkTypeField, this.defaultSectionLinkTypeSelect, this.defaultSectionLinkTypeRadioWikilink, this.defaultSectionLinkTypeRadioLink] = radioField({
options: [ {
label: cd.s("sd-defaultsectionlinktype-radio-wikilink"),
data: "wikilink"
}, {
label: cd.s("sd-defaultsectionlinktype-radio-link"),
data: "link"
} ],
selected: settings.defaultSectionLinkType,
label: cd.s("sd-defaultsectionlinktype"),
help: cd.s("sd-defaultsectionlinktype-help")
}), [this.highlightOwnCommentsField, this.highlightOwnCommentsCheckbox] = checkboxField({
value: "highlightOwnComments",
selected: settings.highlightOwnComments,
label: cd.s("sd-highlightowncomments")
});
const insertButtonsSelected = settings.insertButtons.map(button => Array.isArray(button) ? button.join(";") : button);
function GeneralPageLayout(name, config) {
GeneralPageLayout.super.call(this, name, config), this.$element.append(dialog.highlightOwnCommentsField.$element, dialog.allowEditOthersCommentsField.$element, dialog.defaultCommentLinkTypeField.$element, dialog.defaultSectionLinkTypeField.$element);
}
function CommentFormPageLayout(name, config) {
CommentFormPageLayout.super.call(this, name, config), this.$element.append(dialog.autopreviewField.$element, dialog.watchSectionOnReplyField.$element, dialog.showToolbarField.$element, dialog.alwaysExpandSettingsField.$element, dialog.insertButtonsField.$element, dialog.mySignatureField.$element);
}
function NotificationsPageLayout(name, config) {
NotificationsPageLayout.super.call(this, name, config), this.$element.append(dialog.notificationsField.$element, dialog.desktopNotificationsField.$element, dialog.notificationsBlacklistField.$element);
}
function RemoveDataPageLayout(name, config) {
RemoveDataPageLayout.super.call(this, name, config), this.$element.append(dialog.removeDataField.$element);
}
this.insertButtonsMultiselect = new OO.ui.TagMultiselectWidget({
placeholder: cd.s("sd-insertbuttons-multiselect-placeholder"),
allowArbitrary: !0,
inputPosition: "outline",
tagLimit: 100,
selected: insertButtonsSelected
}), this.insertButtonsField = new OO.ui.FieldLayout(this.insertButtonsMultiselect, {
label: cd.s("sd-insertbuttons"),
align: "top",
help: cd.util.wrapInElement(cd.s("sd-insertbuttons-help")),
helpInline: !0
}), this.mySignatureInput = new OO.ui.TextInputWidget({
value: settings.mySignature,
maxlength: 100,
validate: /~~\~~/
}), this.mySignatureField = new OO.ui.FieldLayout(this.mySignatureInput, {
label: cd.s("sd-mysignature"),
align: "top",
help: cd.util.wrapInElement(cd.s("sd-mysignature-help", cd.g.SIGN_CODE)),
helpInline: !0
}), [this.notificationsField, this.notificationsSelect, this.notificationsRadioAll, this.notificationsRadioNone, this.notificationsRadioToMe] = radioField({
options: [ {
label: cd.s("sd-notifications-radio-all"),
data: "all"
}, {
label: cd.s("sd-notifications-radio-tome"),
data: "toMe"
}, {
label: cd.s("sd-notifications-radio-none"),
data: "none"
} ],
selected: settings.notifications,
label: cd.s("sd-notifications"),
help: cd.s("sd-notifications-help")
}), this.notificationsBlacklistMultiselect = new mw.widgets.UsersMultiselectWidget({
placeholder: cd.s("sd-notificationsblacklist-multiselect-placeholder"),
tagLimit: 100,
selected: settings.notificationsBlacklist
}), this.notificationsBlacklistField = new OO.ui.FieldLayout(this.notificationsBlacklistMultiselect, {
label: cd.s("sd-notificationsblacklist"),
align: "top"
}), [this.showToolbarField, this.showToolbarCheckbox] = checkboxField({
value: "showToolbar",
selected: settings.showToolbar,
label: cd.s("sd-showtoolbar")
}), [this.watchSectionOnReplyField, this.watchSectionOnReplyCheckbox] = checkboxField({
value: "watchSectionOnReply",
selected: settings.watchSectionOnReply,
label: cd.s("sd-watchsectiononreply")
}), this.insertButtonsMultiselect.connect(this, {
change: "updateActionsAvailability"
}), this.allowEditOthersCommentsCheckbox.connect(this, {
change: "updateActionsAvailability"
}), this.alwaysExpandSettingsCheckbox.connect(this, {
change: "updateActionsAvailability"
}), this.autopreviewCheckbox.connect(this, {
change: "updateActionsAvailability"
}), this.desktopNotificationsSelect.connect(this, {
select: "updateActionsAvailability",
choose: "changeDesktopNotifications"
}), this.defaultCommentLinkTypeSelect.connect(this, {
select: "updateActionsAvailability"
}), this.defaultSectionLinkTypeSelect.connect(this, {
select: "updateActionsAvailability"
}), this.highlightOwnCommentsCheckbox.connect(this, {
change: "updateActionsAvailability"
}), this.mySignatureInput.connect(this, {
change: "updateActionsAvailability"
}), this.notificationsSelect.connect(this, {
select: "updateActionsAvailability"
}), this.notificationsBlacklistMultiselect.connect(this, {
change: "updateActionsAvailability"
}), this.showToolbarCheckbox.connect(this, {
change: "updateActionsAvailability"
}), this.watchSectionOnReplyCheckbox.connect(this, {
change: "updateActionsAvailability"
}), this.removeDataButton = new OO.ui.ButtonInputWidget({
label: cd.s("sd-removedata"),
flags: [ "destructive" ]
}), this.removeDataButton.connect(this, {
click: "removeData"
}), this.removeDataField = new OO.ui.FieldLayout(this.removeDataButton, {
label: cd.s("sd-removedata-description"),
align: "top",
help: cd.util.wrapInElement(cd.s("sd-removedata-help")),
helpInline: !0
}), OO.inheritClass(GeneralPageLayout, OO.ui.PageLayout), GeneralPageLayout.prototype.setupOutlineItem = function(outlineItem) {
GeneralPageLayout.super.prototype.setupOutlineItem.call(this, outlineItem), this.outlineItem.setLabel(cd.s("sd-page-talkpage"));
}, OO.inheritClass(CommentFormPageLayout, OO.ui.PageLayout), CommentFormPageLayout.prototype.setupOutlineItem = function() {
this.outlineItem.setLabel(cd.s("sd-page-commentform"));
}, OO.inheritClass(NotificationsPageLayout, OO.ui.PageLayout), NotificationsPageLayout.prototype.setupOutlineItem = function() {
this.outlineItem.setLabel(cd.s("sd-page-notifications"));
}, OO.inheritClass(RemoveDataPageLayout, OO.ui.PageLayout), RemoveDataPageLayout.prototype.setupOutlineItem = function() {
this.outlineItem.setLabel(cd.s("sd-page-dataremoval"));
};
const generalPage = new GeneralPageLayout("general"), commentFormPage = new CommentFormPageLayout("commentForm"), notificationsPage = new NotificationsPageLayout("notifications"), removeDataPage = new RemoveDataPageLayout("removeData");
this.bookletLayout = new OO.ui.BookletLayout({
outlined: !0
}), this.bookletLayout.addPages([ generalPage, commentFormPage, notificationsPage, removeDataPage ]),
this.settingsPanel.$element.empty().append(this.bookletLayout.$element), this.updateActionsAvailability();
}, SettingsDialog.prototype.processInsertButtons = function() {
return this.insertButtonsMultiselect.getValue().map(value => {
let [, text, displayedText] = value.match(/^(.*?[^\\])(?:;(.+))?$/) || [];
if (text && text.replace(/^ +$/, "")) return [ text, displayedText ].filter(defined);
}).filter(defined);
}, SettingsDialog.prototype.updateActionsAvailability = asyncToGenerator_default()((function*() {
const insertButtonsJson = JSON.stringify(this.processInsertButtons());
this.insertButtonsMultiselect.toggleValid(insertButtonsJson.length <= 1e4);
const notificationsBlacklistJson = JSON.stringify(this.notificationsBlacklistMultiselect.getValue());
this.notificationsBlacklistMultiselect.toggleValid(notificationsBlacklistJson.length <= 1e4);
const desktopNotifications = getSelectedItemData(this.desktopNotificationsSelect) || "unknown", defaultCommentLinkType = getSelectedItemData(this.defaultCommentLinkTypeSelect), defaultSectionLinkType = getSelectedItemData(this.defaultSectionLinkTypeSelect), notifications = getSelectedItemData(this.notificationsSelect);
let save = insertButtonsJson !== JSON.stringify(this.settings.insertButtons) || this.allowEditOthersCommentsCheckbox.isSelected() !== this.settings.allowEditOthersComments || this.alwaysExpandSettingsCheckbox.isSelected() !== this.settings.alwaysExpandSettings || this.autopreviewCheckbox.isSelected() !== this.settings.autopreview || desktopNotifications !== this.settings.desktopNotifications || defaultCommentLinkType !== this.settings.defaultCommentLinkType || defaultSectionLinkType !== this.settings.defaultSectionLinkType || this.highlightOwnCommentsCheckbox.isSelected() !== this.settings.highlightOwnComments || this.mySignatureInput.getValue() !== this.settings.mySignature || notifications !== this.settings.notifications || notificationsBlacklistJson !== JSON.stringify(this.settings.notificationsBlacklist) || this.showToolbarCheckbox.isSelected() !== this.settings.showToolbar || this.watchSectionOnReplyCheckbox.isSelected() !== this.settings.watchSectionOnReply;
save = save && this.insertButtonsMultiselect.isValid();
try {
yield this.mySignatureInput.getValidity();
} catch (e) {
save = !1;
}
const reset = this.allowEditOthersCommentsCheckbox.isSelected() !== cd.defaultSettings.allowEditOthersComments || this.alwaysExpandSettingsCheckbox.isSelected() !== cd.defaultSettings.alwaysExpandSettings || this.autopreviewCheckbox.isSelected() !== cd.defaultSettings.autopreview || desktopNotifications !== cd.defaultSettings.desktopNotifications || defaultCommentLinkType !== cd.defaultSettings.defaultCommentLinkType || defaultSectionLinkType !== cd.defaultSettings.defaultSectionLinkType || this.highlightOwnCommentsCheckbox.isSelected() !== cd.defaultSettings.highlightOwnComments || insertButtonsJson !== JSON.stringify(cd.defaultSettings.insertButtons) || this.mySignatureInput.getValue() !== cd.defaultSettings.mySignature || notifications !== cd.defaultSettings.notifications || notificationsBlacklistJson !== JSON.stringify(cd.defaultSettings.notificationsBlacklist) || this.showToolbarCheckbox.isSelected() !== cd.defaultSettings.showToolbar || this.watchSectionOnReplyCheckbox.isSelected() !== cd.defaultSettings.watchSectionOnReply;
this.actions.setAbilities({
save: save,
reset: reset
});
})), SettingsDialog.prototype.changeDesktopNotifications = function(option) {
"none" !== option.data && "granted" !== Notification.permission && (OO.ui.alert(cd.s("dn-grantpermission")),
Notification.requestPermission(permission => {
"granted" !== permission && this.desktopNotificationsSelect.selectItemByData("none");
}));
}, SettingsDialog.prototype.removeData = asyncToGenerator_default()((function*() {
if (yield confirmDestructive("sd-removedata-confirm", {
size: "medium"
})) {
try {
this.pushPending();
const resp = yield cd.g.api.postWithToken("csrf", {
action: "options",
change: "".concat(cd.g.SETTINGS_OPTION_FULL_NAME, "|").concat(cd.g.VISITS_OPTION_FULL_NAME, "|").concat(cd.g.WATCHED_SECTIONS_OPTION_FULL_NAME)
}).catch(handleApiReject);
if (!resp || "success" !== resp.options) throw new CdError({
type: "api",
code: "noSuccess"
});
} catch (e) {
return void handleError(this, e, "sd-error-removedata", !1);
}
localStorage.removeItem("convenientDiscussions-commentForms"), this.stackLayout.setItem(this.dataRemovedPanel),
this.actions.setMode("dataRemoved"), this.popPending();
}
}));
const preparationRequests = [ getSettings(), mw.loader.using("mediawiki.widgets.UsersMultiselectWidget") ];
createWindowManager();
const dialog = new SettingsDialog;
cd.g.windowManager.addWindows([ dialog ]), cd.g.windowManager.openWindow(dialog).closed.then(() => {
cd.g.windowManager.clearWindows();
});
}))).apply(this, arguments);
}
function editWatchedSections() {
return _editWatchedSections.apply(this, arguments);
}
function _editWatchedSections() {
return (_editWatchedSections = asyncToGenerator_default()((function*() {
if (cd.util.isPageOverlayOn()) return;
function EditWatchedSectionsDialog() {
EditWatchedSectionsDialog.parent.call(this);
}
OO.inheritClass(EditWatchedSectionsDialog, OO.ui.ProcessDialog), EditWatchedSectionsDialog.static.name = "editWatchedSectionsDialog",
EditWatchedSectionsDialog.static.title = cd.s("ewsd-title"), EditWatchedSectionsDialog.static.actions = [ {
action: "close",
modes: [ "edit", "saved" ],
flags: [ "safe", "close" ],
disabled: !0
}, {
action: "save",
modes: [ "edit" ],
label: cd.s("ewsd-save"),
flags: [ "primary", "progressive" ],
disabled: !0
} ], EditWatchedSectionsDialog.static.size = "large", EditWatchedSectionsDialog.prototype.getBodyHeight = function() {
return this.$errorItems ? this.$errors[0].scrollHeight : this.$body[0].scrollHeight;
}, EditWatchedSectionsDialog.prototype.initialize = asyncToGenerator_default()((function*() {
EditWatchedSectionsDialog.parent.prototype.initialize.apply(this, arguments), this.pushPending();
const $loading = $("<div>").text(cd.s("loading-ellipsis"));
this.loadingPanel = new OO.ui.PanelLayout({
padded: !0,
expanded: !1
}), this.loadingPanel.$element.append($loading), this.sectionsPanel = new OO.ui.PanelLayout({
padded: !1,
expanded: !1
});
const $watchedSectionsSaved = $("<p>").html(cd.s("ewsd-saved"));
this.savedPanel = new OO.ui.PanelLayout({
padded: !0,
expanded: !1
}), this.savedPanel.$element.append($watchedSectionsSaved), this.stackLayout = new OO.ui.StackLayout({
items: [ this.loadingPanel, this.sectionsPanel, this.savedPanel ]
}), this.$body.append(this.stackLayout.$element);
})), EditWatchedSectionsDialog.prototype.getSetupProcess = function(data) {
return EditWatchedSectionsDialog.parent.prototype.getSetupProcess.call(this, data).next(() => {
this.stackLayout.setItem(this.loadingPanel), this.actions.setMode("edit");
});
}, EditWatchedSectionsDialog.prototype.getReadyProcess = function(data) {
var _this3 = this;
return EditWatchedSectionsDialog.parent.prototype.getReadyProcess.call(this, data).next(asyncToGenerator_default()((function*() {
let watchedSections, pages;
try {
({watchedSections: watchedSections} = yield watchedSectionsRequest), pages = yield getPageTitles(Object.keys(watchedSections).filter(pageId => watchedSections[pageId].length));
} catch (e) {
return void handleError(_this3, e, "ewsd-error-processing", !1);
}
pages.sort((page1, page2) => page1.title > page2.title ? 1 : -1);
const value = pages.filter(page => page.title).map(page => watchedSections[page.pageid].map(section => "".concat(page.title, "#").concat(section)).join("\n")).join("\n");
_this3.input = new OO.ui.MultilineTextInputWidget({
value: value,
rows: 30,
classes: [ "cd-editWatchedSections-input" ]
}), _this3.input.on("change", newValue => {
_this3.actions.setAbilities({
save: newValue !== value
});
}), _this3.sectionsPanel.$element.append(_this3.input.$element), _this3.stackLayout.setItem(_this3.sectionsPanel),
_this3.input.focus(), _this3.actions.setAbilities({
close: !0
}), dialog.$body.css("overflow", "hidden"), setTimeout(() => {
dialog.$body.css("overflow", "");
}, 500), cd.g.windowManager.updateWindowSize(_this3), _this3.popPending(), addPreventUnloadCondition("dialog", () => isUnsaved(dialog));
})));
}, EditWatchedSectionsDialog.prototype.getActionProcess = function(action) {
var _this4 = this;
return "save" === action ? new OO.ui.Process(asyncToGenerator_default()((function*() {
_this4.pushPending();
const sections = {}, pageTitles = [];
let normalized, redirects, pages;
_this4.input.getValue().split("\n").forEach(section => {
const match = section.match(/^(.+?)#(.+)$/);
if (match) {
const pageTitle = match[1].trim(), sectionTitle = match[2].trim();
sections[pageTitle] || (sections[pageTitle] = [], pageTitles.push(pageTitle)), sections[pageTitle].push(sectionTitle);
}
});
try {
({normalized: normalized, redirects: redirects, pages: pages} = (yield getPageIds(pageTitles)) || {});
} catch (e) {
return void handleError(_this4, e, "ewsd-error-processing", !0);
}
normalized.concat(redirects).filter(page => sections[page.from]).forEach(page => {
sections[page.to] || (sections[page.to] = []), sections[page.to].push(...sections[page.from]),
delete sections[page.from];
});
const titleToId = {};
pages.filter(page => void 0 !== page.pageid).forEach(page => {
titleToId[page.title] = page.pageid;
});
const newWatchedSections = {};
Object.keys(sections).filter(key => titleToId[key]).forEach(key => {
newWatchedSections[titleToId[key]] = removeDuplicates(sections[key]);
});
try {
yield setWatchedSections(newWatchedSections);
} catch (e) {
if (e instanceof CdError) {
const {type: type, code: code, apiData: apiData} = e.data;
"internal" === type && "sizeLimit" === code ? _this4.showErrors(new OO.ui.Error(cd.s("ewsd-error-maxsize"), {
recoverable: !1
})) : _this4.showErrors(new OO.ui.Error(cd.s("ewsd-error-processing"), {
recoverable: !0
})), console.warn(type, code, apiData);
} else _this4.showErrors(new OO.ui.Error(cd.s("error-javascript"), {
recoverable: !1
})), console.warn(e);
return void _this4.popPending();
}
_this4.stackLayout.setItem(_this4.savedPanel), _this4.actions.setMode("saved"),
_this4.popPending();
}))) : "close" === action ? new OO.ui.Process(asyncToGenerator_default()((function*() {
yield confirmCloseDialog(_this4, "ewsd");
}))) : EditWatchedSectionsDialog.parent.prototype.getActionProcess.call(this, action);
};
const watchedSectionsRequest = getWatchedSections();
createWindowManager();
const dialog = new EditWatchedSectionsDialog;
cd.g.windowManager.addWindows([ dialog ]), cd.g.windowManager.openWindow(dialog).closed.then(() => {
cd.g.windowManager.clearWindows();
});
}))).apply(this, arguments);
}
function copyLinkToClipboardAndNotify(text) {
const $textarea = $("<textarea>").val(text).appendTo(document.body).select(), successful = document.execCommand("copy");
$textarea.remove(), successful ? text.startsWith("http") ? mw.notify(cd.util.wrapInElement(cd.s("copylink-copied-url", text))) : mw.notify(cd.s("copylink-copied")) : mw.notify(cd.s("copylink-error"), {
type: "error"
});
}
function copyLink(_x3, _x4, _x5) {
return _copyLink.apply(this, arguments);
}
function _copyLink() {
return (_copyLink = asyncToGenerator_default()((function*(object, chooseLink, finallyCallback) {
if (object.linkBeingCopied) return void (finallyCallback && finallyCallback());
object.linkBeingCopied = !0;
let anchor = object instanceof Comment_Comment ? object.anchor : underlinesToSpaces(object.anchor);
anchor = encodeWikilink(anchor);
const wikilink = "[[".concat(cd.g.CURRENT_PAGE, "#").concat(anchor, "]]");
let decodedCurrentPageUrl;
try {
decodedCurrentPageUrl = decodeURI(mw.util.getUrl(cd.g.CURRENT_PAGE));
} catch (e) {
return console.error(e), object.linkBeingCopied = !1, void (finallyCallback && finallyCallback());
}
const anchorWithUnderlines = spacesToUnderlines(anchor), url = "https:".concat(mw.config.get("wgServer")).concat(decodedCurrentPageUrl, "#").concat(anchorWithUnderlines);
if (chooseLink) {
let diffInput, diffField, wikilinkFieldHelp;
if (object instanceof Comment_Comment) {
let diffLink, value;
try {
value = diffLink = yield object.getDiffLink(object);
} catch (e) {
if (e instanceof CdError) {
const {type: type} = e.data;
"api" === type ? value = cd.s("cld-diff-error") : "network" === type && (value = cd.s("cld-diff-error-network"));
} else value = cd.s("cld-diff-error-unknown");
}
diffInput = new OO.ui.TextInputWidget({
value: value || cd.s("cld-diff-error"),
disabled: !diffLink
});
const diffButton = new OO.ui.ButtonWidget({
label: cd.s("cld-copy"),
icon: "articles",
disabled: !diffLink
});
diffButton.on("click", () => {
copyLinkToClipboardAndNotify(diffInput.getValue()), dialog.close();
}), diffField = new OO.ui.ActionFieldLayout(diffInput, diffButton, {
align: "top",
label: cd.s("cld-diff")
});
}
object instanceof Comment_Comment && "diff" === cd.config.defaultCommentLinkType && (wikilinkFieldHelp = cd.s("cld-wikilink-help-comment"));
const wikilinkInput = new OO.ui.TextInputWidget({
value: wikilink
}), wikilinkButton = new OO.ui.ButtonWidget({
label: cd.s("cld-copy"),
icon: "articles"
});
wikilinkButton.on("click", () => {
copyLinkToClipboardAndNotify(wikilinkInput.getValue()), dialog.close();
});
const wikilinkField = new OO.ui.ActionFieldLayout(wikilinkInput, wikilinkButton, {
align: "top",
label: cd.s("cld-wikilink"),
help: wikilinkFieldHelp,
helpInline: !0
}), anchorWikilinkInput = new OO.ui.TextInputWidget({
value: "[[#".concat(anchor, "]]")
}), anchorWikilinkButton = new OO.ui.ButtonWidget({
label: cd.s("cld-copy"),
icon: "articles"
});
anchorWikilinkButton.on("click", () => {
copyLinkToClipboardAndNotify(anchorWikilinkInput.getValue()), dialog.close();
});
const anchorWikilinkField = new OO.ui.ActionFieldLayout(anchorWikilinkInput, anchorWikilinkButton, {
align: "top",
label: cd.s("cld-currentpagewikilink")
}), linkInput = new OO.ui.TextInputWidget({
value: url
}), linkButton = new OO.ui.ButtonWidget({
label: cd.s("cld-copy"),
icon: "articles"
});
linkButton.on("click", () => {
copyLinkToClipboardAndNotify(linkInput.getValue()), dialog.close();
});
const linkField = new OO.ui.ActionFieldLayout(linkInput, linkButton, {
align: "top",
label: cd.s("cld-link")
}), $message = $("<div>").append(diffField && diffField.$element).append(wikilinkField.$element).append(anchorWikilinkField.$element).append(linkField.$element), dialog = new OO.ui.MessageDialog;
cd.g.windowManager.addWindows([ dialog ]), cd.g.windowManager.openWindow(dialog, {
message: $message,
actions: [ {
label: cd.s("cld-close"),
action: "close"
} ],
size: "large"
}).closed.then(() => {
cd.g.windowManager.clearWindows(), object.linkBeingCopied = !1;
});
} else {
let link;
switch (cd.settings[object instanceof Comment_Comment ? "defaultCommentLinkType" : "defaultSectionLinkType"]) {
case "diff":
if (!(object instanceof Comment_Comment)) {
link = wikilink;
break;
}
try {
link = yield object.getDiffLink(object);
} catch (e) {
let text;
if (e instanceof CdError) {
const {type: type} = e.data;
if ("network" === type) text = cd.s("copylink-error-diffnotfound-network"); else {
const url = mw.util.getUrl(this.sourcePage, {
action: "history"
});
text = cd.util.wrapInElement(cd.s("copylink-error-diffnotfound", url));
}
} else text = cd.s("copylink-error-diffnotfound-unknown");
return mw.notify(text, {
type: "error"
}), object.linkBeingCopied = !1, void (finallyCallback && finallyCallback());
}
break;
case "link":
link = url;
break;
default:
link = wikilink;
}
copyLinkToClipboardAndNotify(link), object.linkBeingCopied = !1;
}
finallyCallback && finallyCallback();
}))).apply(this, arguments);
}
function rescueCommentFormsContent(content) {
const text = content.map(data => {
let text = void 0 !== data.headline ? "".concat(cd.s("cf-headline"), ": ").concat(data.headline, "\n\n") : "";
return text += "".concat(data.comment, "\n\n").concat(cd.s("cf-summary-placeholder"), ": ").concat(data.summary),
text;
}).join("\n\n----\n"), input = new OO.ui.MultilineTextInputWidget({
value: text,
rows: 20
}), field = new OO.ui.FieldLayout(input, {
align: "top",
label: cd.s("rd-intro")
}), dialog = new OO.ui.MessageDialog;
cd.g.windowManager.addWindows([ dialog ]), cd.g.windowManager.openWindow(dialog, {
message: field.$element,
actions: [ {
label: cd.s("rd-close"),
action: "close"
} ],
size: "large"
}).closed.then(() => {
cd.g.windowManager.clearWindows();
});
}
function confirmDialog(_x6) {
return _confirmDialog.apply(this, arguments);
}
function _confirmDialog() {
return (_confirmDialog = asyncToGenerator_default()((function*(message, options = {}) {
const defaultOptions = {
message: message,
actions: [ {
action: "accept",
label: OO.ui.deferMsg("ooui-dialog-message-accept"),
flags: "primary"
}, {
action: "reject",
label: OO.ui.deferMsg("ooui-dialog-message-reject"),
flags: "safe"
} ]
}, dialog = new OO.ui.MessageDialog;
cd.g.windowManager.addWindows([ dialog ]);
const windowInstance = cd.g.windowManager.openWindow(dialog, Object.assign({}, defaultOptions, options)), data = yield windowInstance.closed;
return cd.g.windowManager.clearWindows(), data && data.action;
}))).apply(this, arguments);
}
function confirmDestructive(messageName, options = {}) {
const defaultOptions = {
actions: [ {
label: cd.s("".concat(messageName, "-yes")),
action: "accept",
flags: [ "primary", "destructive" ]
}, {
label: cd.s("".concat(messageName, "-no")),
action: "reject",
flags: "safe"
} ]
};
return OO.ui.confirm(cd.s(messageName), Object.assign({}, defaultOptions, options));
}
function notFound(_x7, _x8) {
return _notFound.apply(this, arguments);
}
function _notFound() {
return (_notFound = asyncToGenerator_default()((function*(decodedFragment, date) {
const title = $("<span>").addClass("cd-destructiveText").html(date ? cd.s("deadanchor-comment-title") : cd.s("deadanchor-section-title"));
let message = date ? cd.s("deadanchor-comment-text") : cd.s("deadanchor-section-text");
if (!cd.config.pagesWithoutArchivesRegexp || !cd.config.pagesWithoutArchivesRegexp.test(cd.g.CURRENT_PAGE)) {
if (message += " " + cd.s("deadanchor-searchinarchive"), yield OO.ui.confirm(message, {
title: title
})) {
let text;
text = date ? cd.util.formatDate(date) : decodedFragment.replace(/_/g, " ").replace(/"/g, "").trim();
const archivePrefix = cd.config.getArchivePrefix ? cd.config.getArchivePrefix(mw.config.get("wgTitle")) : mw.config.get("wgTitle"), searchQuery = '"'.concat(text, '" prefix:') + mw.config.get("wgFormattedNamespaces")[cd.g.CURRENT_NAMESPACE_NUMBER] + ":".concat(archivePrefix), url = mw.util.getUrl("Special:Search", {
profile: "default",
fulltext: "Search",
search: searchQuery
});
location.assign(mw.config.get("wgServer") + url);
}
} else OO.ui.alert(message, {
title: title
});
}))).apply(this, arguments);
}
class Section_Section extends class {
constructor(parser, headingElement) {
if (_parser.set(this, {
writable: !0,
value: void 0
}), classPrivateFieldSet_default()(this, _parser, parser), this.headlineElement = classPrivateFieldGet_default()(this, _parser).context.getElementByClassName(headingElement, "mw-headline"),
!this.headlineElement) throw new CdError;
this.anchor = this.headlineElement.getAttribute("id");
const classesToFilter = [ "mw-headline-number", ...cd.config.foreignElementsInHeadlinesClasses ], nodes = Array.from(this.headlineElement.childNodes).filter(node => node.nodeType !== Node.ELEMENT_NODE || !Array.from(node.classList).some(name => classesToFilter.includes(name)));
this.headline = nodes.map(node => node.textContent).join("").trim();
const levelMatch = headingElement.tagName.match(/^H([2-6])$/);
this.level = levelMatch && Number(levelMatch[1]);
const treeWalker = new TreeWalker(cd.g.rootElement, node => ![ "STYLE", "LINK" ].includes(node.tagName) && !node.classList.contains("cd-sectionButtonContainer"), !0, headingElement), elements = [ headingElement ], levelRegexp = new RegExp("^H[1-".concat(this.level, "]$"));
let firstCommentPart, lastCommentPart, hasSubsections = !1;
for (;treeWalker.nextSibling() && !levelRegexp.test(treeWalker.currentNode.tagName); ) void 0 === this.lastElementInFirstChunk && /^H[3-6]$/.test(treeWalker.currentNode.tagName) && (hasSubsections = !0,
this.lastElementInFirstChunk = elements[elements.length - 1]), elements.push(treeWalker.currentNode);
if (this.lastElementInFirstChunk = this.lastElementInFirstChunk || elements[elements.length - 1],
!elements.length) throw new CdError;
if (elements[1]) {
for (treeWalker.currentNode = elements[elements.length - 1]; treeWalker.lastChild(); ) ;
const lastNode = treeWalker.currentNode;
treeWalker.currentNode = elements[1];
do {
treeWalker.currentNode.classList.contains("cd-commentPart") && (firstCommentPart = treeWalker.currentNode);
} while (!firstCommentPart && treeWalker.currentNode !== lastNode && treeWalker.nextNode());
treeWalker.currentNode = lastNode;
do {
treeWalker.currentNode.classList.contains("cd-commentPart") && (lastCommentPart = treeWalker.currentNode);
} while (!lastCommentPart && treeWalker.currentNode !== elements[1] && treeWalker.previousNode());
}
if (firstCommentPart) {
const firstCommentPartId = Number(firstCommentPart.getAttribute("data-comment-id")), lastCommentPartId = Number(lastCommentPart.getAttribute("data-comment-id"));
if (this.comments = cd.comments.slice(firstCommentPartId, lastCommentPartId + 1),
hasSubsections) {
const endIndex = this.comments.findIndex(comment => !(classPrivateFieldGet_default()(this, _parser).context.follows(this.lastElementInFirstChunk, comment.elements[0]) || this.lastElementInFirstChunk.contains(comment.elements[0])));
this.commentsInFirstChunk = this.comments.slice(0, endIndex || 0);
}
}
this.id = cd.sections.length, this.comments = this.comments || [], this.commentsInFirstChunk = this.commentsInFirstChunk || this.comments,
this.elements = elements;
}
} {
constructor(parser, headingElement, watchedSectionsRequest) {
if (super(parser, headingElement), _elementPrototypes.set(this, {
writable: !0,
value: void 0
}), _closingBracketElement.set(this, {
writable: !0,
value: void 0
}), _editSectionElement.set(this, {
writable: !0,
value: void 0
}), _cached$elements.set(this, {
writable: !0,
value: void 0
}), _showAddSubsectionButtonTimeout.set(this, {
writable: !0,
value: void 0
}), _hideAddSubsectionButtonTimeout.set(this, {
writable: !0,
value: void 0
}), classPrivateFieldSet_default()(this, _elementPrototypes, cd.g.SECTION_ELEMENT_PROTOTYPES),
this.$headline = $(this.headlineElement), classPrivateFieldSet_default()(this, _editSectionElement, headingElement.querySelector(".mw-editsection")),
classPrivateFieldGet_default()(this, _editSectionElement)) {
classPrivateFieldSet_default()(this, _closingBracketElement, classPrivateFieldGet_default()(this, _editSectionElement).lastElementChild),
classPrivateFieldGet_default()(this, _closingBracketElement) && classPrivateFieldGet_default()(this, _closingBracketElement).classList && classPrivateFieldGet_default()(this, _closingBracketElement).classList.contains("mw-editsection-bracket") || classPrivateFieldSet_default()(this, _closingBracketElement, null),
this.sourcePage = cd.g.CURRENT_PAGE;
const editLink = classPrivateFieldGet_default()(this, _editSectionElement).querySelector('a[href*="&action=edit"], a[href*="&veaction=editsource"]');
if (editLink) {
const editLinkUrl = new URL(editLink.href);
if (editLinkUrl) {
editLinkUrl.searchParams.get("section").startsWith("T-") && (this.sourcePage = underlinesToSpaces(editLinkUrl.searchParams.get("title")));
}
} else console.error("Edit link not found.", this);
if (this.$heading = $(headingElement), this.frozen = !cd.g.isPageActive || cd.g.specialElements.closedDiscussions.some(el => el.contains(headingElement)),
!this.frozen) {
classPrivateFieldSet_default()(this, _showAddSubsectionButtonTimeout, void 0), classPrivateFieldSet_default()(this, _hideAddSubsectionButtonTimeout, void 0),
this.addAddSubsectionButton();
const replyButton = classPrivateFieldGet_default()(this, _elementPrototypes).replyButton.cloneNode(!0);
replyButton.firstChild.onclick = () => {
this.addReply();
};
const isVotePlaceholder = "OL" === this.lastElementInFirstChunk.tagName && 1 === this.lastElementInFirstChunk.childElementCount && this.lastElementInFirstChunk.children[0].classList.contains("mw-empty-elt");
let tag, createUl = !1;
if (this.lastElementInFirstChunk.classList.contains("cd-commentLevel")) {
const tagName = this.lastElementInFirstChunk.tagName;
"UL" === tagName || "OL" === tagName && (1 === this.lastElementInFirstChunk.querySelectorAll("ol > li").length || this.lastElementInFirstChunk.querySelectorAll("ol > li > .cd-signature").length > 1) ? tag = "li" : "DL" === tagName ? tag = "dd" : (tag = "li",
createUl = !0);
} else tag = "li", isVotePlaceholder || (createUl = !0);
const replyWrapper = document.createElement(tag);
let replyContainer;
if (replyWrapper.className = "cd-replyWrapper", replyWrapper.appendChild(replyButton),
createUl) {
const replyContainer = document.createElement("ul");
replyContainer.className = "cd-commentLevel cd-sectionButtonContainer", replyContainer.appendChild(replyWrapper),
this.lastElementInFirstChunk.parentElement.insertBefore(replyContainer, this.lastElementInFirstChunk.nextElementSibling);
} else this.lastElementInFirstChunk.appendChild(replyWrapper);
this.$replyButton = $(replyButton), this.$replyButtonLink = $(replyButton.firstChild),
this.$replyWrapper = $(replyWrapper), this.$replyContainer = replyContainer ? $(replyContainer) : void 0,
this.comments.length && this.comments[0].isOpeningSection && this.comments[0].openingSectionOfLevel === this.level && (this.comments[0].own || cd.settings.allowEditOthersComments) && this.comments[0].actionable && this.addMenuItem({
label: cd.s("sm-editopeningcomment"),
tooltip: cd.s("sm-editopeningcomment-tooltip"),
func: () => {
this.comments[0].edit();
},
class: "cd-sectionLink-editOpeningComment"
}), this.addMenuItem({
label: cd.s("sm-addsubsection"),
tooltip: cd.s("sm-addsubsection-tooltip"),
func: () => {
this.addSubsection();
},
class: "cd-sectionLink-addSubsection"
}), 2 === this.level && this.addMenuItem({
label: cd.s("sm-move"),
tooltip: cd.s("sm-move-tooltip"),
func: () => {
this.move();
},
class: "cd-sectionLink-moveSection"
}), watchedSectionsRequest && watchedSectionsRequest.then(({thisPageWatchedSections: thisPageWatchedSections}) => {
this.headline && (this.watched = thisPageWatchedSections.includes(this.headline),
this.addMenuItem({
label: cd.s("sm-unwatch"),
tooltip: cd.s("sm-unwatch-tooltip"),
func: () => {
this.unwatch();
},
class: "cd-sectionLink-unwatch",
visible: this.watched
}), this.addMenuItem({
label: cd.s("sm-watch"),
tooltip: cd.s("sm-watch-tooltip"),
func: () => {
this.watch();
},
class: "cd-sectionLink-watch",
visible: !this.watched
}));
const targetString = "sm-copylink-tooltip-".concat(cd.settings.defaultSectionLinkType.toLowerCase());
this.addMenuItem({
label: cd.s("sm-copylink"),
func: this.copyLink.bind(this),
class: "cd-sectionLink-copyLink",
tooltip: cd.s("sm-copylink-tooltip", cd.s(targetString)),
href: "".concat(mw.util.getUrl(cd.g.CURRENT_PAGE), "#").concat(this.anchor)
});
}, () => {});
}
}
}
addAddSubsectionButton() {
if (2 !== this.level) return;
const addSubsectionButton = classPrivateFieldGet_default()(this, _elementPrototypes).addSubsectionButton.cloneNode(!0), labelContainer = addSubsectionButton.querySelector(".oo-ui-labelElement-label");
if (!labelContainer) return;
labelContainer.innerHTML = "", labelContainer.appendChild(document.createTextNode(cd.s("section-addsubsection-to", this.headline))),
addSubsectionButton.firstChild.onclick = () => {
this.addSubsection();
};
const addSubsectionButtonContainer = document.createElement("div");
addSubsectionButtonContainer.className = "cd-sectionButtonContainer cd-addSubsectionButtonContainer",
addSubsectionButtonContainer.style.display = "none", addSubsectionButtonContainer.appendChild(addSubsectionButton);
const lastElement = this.elements[this.elements.length - 1];
lastElement.parentElement.insertBefore(addSubsectionButtonContainer, lastElement.nextElementSibling),
this.$addSubsectionButtonContainer = $(addSubsectionButtonContainer);
const deferAddSubsectionButtonHide = () => {
classPrivateFieldGet_default()(this, _hideAddSubsectionButtonTimeout) || classPrivateFieldSet_default()(this, _hideAddSubsectionButtonTimeout, setTimeout(() => {
this.$addSubsectionButtonContainer.hide();
}, 1e3));
};
addSubsectionButton.firstChild.onmouseenter = () => {
clearTimeout(classPrivateFieldGet_default()(this, _hideAddSubsectionButtonTimeout)),
classPrivateFieldSet_default()(this, _hideAddSubsectionButtonTimeout, null);
}, addSubsectionButton.firstChild.onmouseleave = () => {
deferAddSubsectionButtonHide();
}, this.replyButtonHoverHandler = () => {
this.addSubsectionForm || (clearTimeout(classPrivateFieldGet_default()(this, _hideAddSubsectionButtonTimeout)),
classPrivateFieldSet_default()(this, _hideAddSubsectionButtonTimeout, null), this.showAddSubsectionButtonTimeout || (this.showAddSubsectionButtonTimeout = setTimeout(() => {
this.$addSubsectionButtonContainer.show();
}, 1e3)));
}, this.replyButtonUnhoverHandler = () => {
this.addSubsectionForm || (clearTimeout(this.showAddSubsectionButtonTimeout), this.showAddSubsectionButtonTimeout = null,
deferAddSubsectionButtonHide());
};
}
addReply(dataToRestore) {
this.addReplyForm || (this.addReplyForm = dataToRestore instanceof CommentForm_CommentForm ? dataToRestore : new CommentForm_CommentForm({
mode: "replyInSection",
target: this,
dataToRestore: dataToRestore
})), this.$replyButton.hide();
const baseSection = 2 === this.level ? this : this.baseSection;
baseSection && baseSection.$addSubsectionButtonContainer && (baseSection.$addSubsectionButtonContainer.hide(),
clearTimeout(baseSection.showAddSubsectionButtonTimeout), baseSection.showAddSubsectionButtonTimeout = null);
}
addSubsection(dataToRestore) {
this.addSubsectionForm ? (this.addSubsectionForm.$element.cdScrollIntoView("center"),
this.addSubsectionForm.headlineInput.focus()) : this.addSubsectionForm = dataToRestore instanceof CommentForm_CommentForm ? dataToRestore : new CommentForm_CommentForm({
mode: "addSubsection",
target: this,
dataToRestore: dataToRestore,
scrollIntoView: !0
}), this.$addSubsectionButtonContainer && this.$addSubsectionButtonContainer.hide();
}
move() {
var _this = this;
return asyncToGenerator_default()((function*() {
function MoveSectionDialog() {
MoveSectionDialog.parent.call(this);
}
OO.inheritClass(MoveSectionDialog, OO.ui.ProcessDialog), MoveSectionDialog.static.name = "moveSectionDialog",
MoveSectionDialog.static.title = cd.s("msd-title"), MoveSectionDialog.static.actions = [ {
action: "close",
modes: [ "move", "reload" ],
flags: [ "safe", "close" ],
disabled: !0
}, {
action: "move",
modes: [ "move" ],
label: cd.s("msd-move"),
flags: [ "primary", "progressive" ],
disabled: !0
}, {
action: "reload",
modes: [ "reload" ],
label: cd.s("msd-reload"),
flags: [ "primary", "progressive" ]
} ], MoveSectionDialog.prototype.onTitleInputChange = asyncToGenerator_default()((function*() {
let move = !0;
try {
yield this.titleInput.getValidity();
} catch (e) {
move = !1;
}
this.actions.setAbilities({
move: move
});
})), MoveSectionDialog.prototype.areNewTopicsOnTop = function() {
var _ref2 = asyncToGenerator_default()((function*(title, code) {
let newTopicsOnTop;
cd.config.areNewTopicsOnTop && (newTopicsOnTop = cd.config.areNewTopicsOnTop(title.toText(), code));
const adjustedCode = hideHtmlComments(code), sectionHeadingRegexp = /^==[^=].*?==[ \t]*(?:<!--[^]*?-->[ \t]*)*\n/gm;
let firstSectionIndex, sectionHeadingMatch, previousDate, higherLowerDifference = 0;
for (;(sectionHeadingMatch = sectionHeadingRegexp.exec(adjustedCode)) && (void 0 === newTopicsOnTop || !1 !== newTopicsOnTop && void 0 === firstSectionIndex) && (void 0 === firstSectionIndex && (firstSectionIndex = sectionHeadingMatch.index),
void 0 === newTopicsOnTop); ) {
const timestamp = findFirstTimestamp(code.slice(sectionHeadingMatch.index)), {date: date} = timestamp && parseTimestamp(timestamp) || {};
date && (previousDate && (higherLowerDifference += date > previousDate ? -1 : 1),
previousDate = date), Math.abs(higherLowerDifference) > 5 && (newTopicsOnTop = higherLowerDifference > 0);
}
return void 0 === newTopicsOnTop && (newTopicsOnTop = 0 === higherLowerDifference ? !(title.namespace % 2 == 1) : higherLowerDifference > 0),
{
newTopicsOnTop: newTopicsOnTop,
firstSectionIndex: firstSectionIndex
};
}));
return function(_x, _x2) {
return _ref2.apply(this, arguments);
};
}(), MoveSectionDialog.prototype.loadSourcePage = asyncToGenerator_default()((function*() {
let page;
try {
page = yield getLastRevision(section.sourcePage);
} catch (e) {
if (!(e instanceof CdError)) throw [ cd.s("error-javascript"), !1 ];
{
const {type: type, code: code} = e.data;
if ("api" === type) throw "missing" === code ? [ cd.s("msd-error-sourcepagedeleted"), !0 ] : [ "".concat(cd.s("error-api"), ": ").concat(code, "."), !0 ];
if ("network" === type) throw [ cd.s("error-network"), !0 ];
}
}
const code = page.code;
try {
section.locateInCode(code);
} catch (e) {
if (e instanceof CdError) {
const {code: code} = e.data;
let message;
throw message = "couldntLocateSection" === code ? cd.s("error-locatesection") : cd.s("error-unknown"),
[ message, !0 ];
}
throw [ cd.s("error-javascript"), !1 ];
}
return {
code: code,
timestamp: page.timestamp,
queryTimestamp: page.queryTimestamp,
sectionInCode: section.inCode,
wikilink: "".concat(section.sourcePage, "#").concat(section.headline)
};
})), MoveSectionDialog.prototype.loadTargetPage = function() {
var _ref4 = asyncToGenerator_default()((function*(targetTitle) {
let page;
try {
page = yield getLastRevision(targetTitle);
} catch (e) {
if (!(e instanceof CdError)) throw [ cd.s("error-javascript"), !1 ];
{
const {type: type, code: code} = e.data;
if ("api" === type) throw "missing" === code ? [ cd.s("msd-error-targetpagedoesntexist"), !0 ] : "invalid" === code ? [ cd.s("msd-error-invalidpagename"), !1 ] : [ "".concat(cd.s("error-api"), ": ").concat(code, "."), !0 ];
if ("network" === type) throw [ cd.s("error-network"), !0 ];
}
}
const {code: code, timestamp: timestamp, queryTimestamp: queryTimestamp} = page, title = page.redirectTarget || targetTitle, {newTopicsOnTop: newTopicsOnTop, firstSectionIndex: firstSectionIndex} = this.areNewTopicsOnTop(title, code), wikilink = "".concat(title.toText(), "#").concat(section.headline);
return {
code: code,
timestamp: timestamp,
queryTimestamp: queryTimestamp,
title: title,
newTopicsOnTop: newTopicsOnTop,
firstSectionIndex: firstSectionIndex,
wikilink: wikilink,
sectionUrl: mw.util.getUrl(wikilink)
};
}));
return function(_x3) {
return _ref4.apply(this, arguments);
};
}(), MoveSectionDialog.prototype.saveTargetPage = function() {
var _ref5 = asyncToGenerator_default()((function*(sourcePage, targetPage) {
const endWithTwoNewLines = code => code.replace(/([^\n])\n?$/, "$1\n\n"), targetPageCode = cd.config.getMoveTargetPageCode ? cd.config.getMoveTargetPageCode(sourcePage.wikilink, cd.settings.mySignature) : void 0, targetPageNewSectionCode = endWithTwoNewLines(sourcePage.sectionInCode.code.slice(0, sourcePage.sectionInCode.contentStartIndex - sourcePage.sectionInCode.startIndex) + (targetPageCode ? targetPageCode + "\n" : "") + sourcePage.sectionInCode.code.slice(sourcePage.sectionInCode.contentStartIndex - sourcePage.sectionInCode.startIndex));
let targetPageNewCode;
targetPage.newTopicsOnTop ? (void 0 === targetPage.firstSectionIndex && (targetPage.firstSectionIndex = targetPage.code.length),
targetPageNewCode = endWithTwoNewLines(targetPage.code.slice(0, targetPage.firstSectionIndex)) + targetPageNewSectionCode + targetPage.code.slice(targetPage.firstSectionIndex)) : targetPageNewCode = targetPage.code + "\n\n" + targetPageNewSectionCode;
const summaryEnding = this.summaryEndingInput.getValue(), text = cd.s("es-move-from", sourcePage.wikilink) + (summaryEnding ? ": ".concat(summaryEnding) : "");
let editTargetPageData;
try {
editTargetPageData = yield cd.g.api.postWithToken("csrf", {
action: "edit",
title: targetPage.title.toString(),
text: targetPageNewCode,
summary: cd.util.buildEditSummary({
text: text,
section: section.headline
}),
tags: cd.config.tagName,
baserevid: targetPage.revisionId,
starttimestamp: targetPage.queryTimestamp,
formatversion: 2
}).catch(handleApiReject);
} catch (e) {
throw [ cd.s("msd-error-editingtargetpage"), !0 ];
}
const error = editTargetPageData.error;
if (error) throw "editconflict" === error.code ? [ cd.s("msd-error-editconflict"), !0 ] : [ error.code + ": " + error.info, !0 ];
}));
return function(_x4, _x5) {
return _ref5.apply(this, arguments);
};
}(), MoveSectionDialog.prototype.saveSourcePage = function() {
var _ref6 = asyncToGenerator_default()((function*(sourcePage, targetPage) {
const timestamp = findFirstTimestamp(sourcePage.sectionInCode.code) || cd.g.SIGN_CODE + "~", sourcePageCode = cd.config.getMoveSourcePageCode ? cd.config.getMoveSourcePageCode(targetPage.wikilink, cd.settings.mySignature, timestamp) : void 0, sourcePageNewSectionCode = sourcePageCode ? sourcePage.sectionInCode.code.slice(0, sourcePage.sectionInCode.contentStartIndex - sourcePage.sectionInCode.startIndex) + sourcePageCode + "\n\n" : "", newSourcePageCode = sourcePage.code.slice(0, sourcePage.sectionInCode.startIndex) + sourcePageNewSectionCode + sourcePage.code.slice(sourcePage.sectionInCode.endIndex), summaryEnding = this.summaryEndingInput.getValue(), text = cd.s("es-move-to", targetPage.wikilink) + (summaryEnding ? ": ".concat(summaryEnding) : "");
try {
yield cd.g.api.postWithToken("csrf", {
action: "edit",
title: section.sourcePage,
text: newSourcePageCode,
summary: cd.util.buildEditSummary({
text: text,
section: section.headline
}),
tags: cd.config.tagName,
baserevid: sourcePage.revisionId,
starttimestamp: sourcePage.queryTimestamp,
formatversion: 2
}).catch(handleApiReject);
} catch (e) {
throw [ cd.s("msd-error-editingsourcepage"), !1 ];
}
}));
return function(_x6, _x7) {
return _ref6.apply(this, arguments);
};
}(), MoveSectionDialog.prototype.abort = function(html, recoverable) {
const $body = animateLink(html, "cd-message-reloadPage", () => {
cd.g.windowManager.clearWindows(), reloadPage();
});
this.showErrors(new OO.ui.Error($body, {
recoverable: recoverable
})), recoverable || this.$errors.find(".oo-ui-buttonElement-button").on("click", () => {
this.close();
}), this.actions.setAbilities({
close: !0,
move: recoverable
}), cd.g.windowManager.updateWindowSize(this), this.popPending();
}, MoveSectionDialog.prototype.getBodyHeight = function() {
return this.$errorItems ? this.$errors[0].scrollHeight : this.$body[0].scrollHeight;
}, MoveSectionDialog.prototype.initialize = function() {
MoveSectionDialog.parent.prototype.initialize.apply(this, arguments), this.pushPending();
const $loading = $("<div>").text(cd.s("loading-ellipsis"));
this.loadingPanel = new OO.ui.PanelLayout({
padded: !0,
expanded: !1
}), this.loadingPanel.$element.append($loading), this.movePanel = new OO.ui.PanelLayout({
padded: !0,
expanded: !1
}), this.reloadPanel = new OO.ui.PanelLayout({
padded: !0,
expanded: !1
}), this.stackLayout = new OO.ui.StackLayout({
items: [ this.loadingPanel, this.movePanel, this.reloadPanel ]
}), this.$body.append(this.stackLayout.$element);
}, MoveSectionDialog.prototype.getSetupProcess = function(data) {
return MoveSectionDialog.parent.prototype.getSetupProcess.call(this, data).next(() => {
this.stackLayout.setItem(this.loadingPanel), this.actions.setMode("move");
});
}, MoveSectionDialog.prototype.getReadyProcess = function(data) {
var _this2 = this;
return MoveSectionDialog.parent.prototype.getReadyProcess.call(this, data).next(asyncToGenerator_default()((function*() {
let page;
try {
[page] = yield Promise.all(preparationRequests);
} catch (e) {
return void _this2.abort(cd.s("cf-error-getpagecode"), !1);
}
try {
section.locateInCode(page.code);
} catch (e) {
if (e instanceof CdError) {
const {data: data} = e.data, message = "couldntLocateSection" === data ? cd.s("error-locatesection") : cd.s("error-unknown");
_this2.abort(message, !1);
} else _this2.abort(cd.s("error-javascript"), !1);
return;
}
const sectionCode = section.inCode.code;
_this2.titleInput = new mw.widgets.TitleInputWidget({
$overlay: _this2.$overlay,
excludeCurrentPage: !0,
validate: () => {
let title = _this2.titleInput.getMWTitle();
return title && title.toText() !== section.sourcePage && isTalkNamespace(title.namespace);
}
}), _this2.titleField = new OO.ui.FieldLayout(_this2.titleInput, {
label: cd.s("msd-targetpage"),
align: "top"
}), _this2.titleInput.connect(_this2, {
change: "onTitleInputChange"
}), _this2.titleInput.connect(_this2, {
enter: () => {
_this2.actions.get({
actions: "move"
})[0].isDisabled() || _this2.executeAction("move");
}
});
let $sectionCodeNote = $("<div>");
$("<pre>").text(sectionCode.slice(0, 300) + (sectionCode.length >= 300 ? "..." : "")).appendTo($sectionCodeNote),
$("<p>").css("font-size", "85%").text(cd.s("msd-bottom")).appendTo($sectionCodeNote),
_this2.summaryEndingInput = new OO.ui.TextInputWidget({
maxLength: 250
}), _this2.summaryEndingField = new OO.ui.FieldLayout(_this2.summaryEndingInput, {
label: cd.s("msd-summaryending"),
align: "top"
}), _this2.movePanel.$element.append(_this2.titleField.$element, $sectionCodeNote, _this2.summaryEndingField.$element),
_this2.stackLayout.setItem(_this2.movePanel), _this2.titleInput.focus(), _this2.actions.setAbilities({
close: !0
}), dialog.$body.css("overflow", "hidden"), setTimeout(() => {
dialog.$body.css("overflow", "");
}, 500), cd.g.windowManager.updateWindowSize(_this2), _this2.popPending();
})));
}, MoveSectionDialog.prototype.getActionProcess = function(action) {
var _this3 = this;
return "move" === action ? new OO.ui.Process(asyncToGenerator_default()((function*() {
_this3.pushPending(), _this3.titleInput.$input.blur();
const targetPageTitle = _this3.titleInput.getMWTitle();
if (!targetPageTitle || targetPageTitle.toText() === section.sourcePage || !isTalkNamespace(targetPageTitle.namespace)) return void _this3.abort(cd.s("msd-error-wrongpage"), !1);
let sourcePage, targetPage;
try {
[sourcePage, targetPage] = yield Promise.all([ _this3.loadSourcePage(), _this3.loadTargetPage(targetPageTitle) ]),
yield _this3.saveTargetPage(sourcePage, targetPage), yield _this3.saveSourcePage(sourcePage, targetPage);
} catch (e) {
return void _this3.abort(...e);
}
_this3.reloadPanel.$element.html(cd.s("msd-moved", targetPage.sectionUrl)), _this3.stackLayout.setItem(_this3.reloadPanel),
_this3.actions.setMode("reload"), _this3.popPending();
}))) : "reload" === action ? new OO.ui.Process(() => {
this.close({
action: action
}), reloadPage({
sectionAnchor: section.anchor
});
}) : "close" === action ? new OO.ui.Process(() => {
this.close();
}) : MoveSectionDialog.parent.prototype.getActionProcess.call(this, action);
};
const section = _this, preparationRequests = [ getLastRevision(_this.sourcePage), mw.loader.using("mediawiki.widgets") ], dialog = new MoveSectionDialog;
cd.g.windowManager.addWindows([ dialog ]), cd.g.windowManager.openWindow(dialog).closed.then(() => {
cd.g.windowManager.clearWindows();
});
}))();
}
updateWatchMenuItems() {
this.watched ? (this.$heading.find(".cd-sectionLink-unwatch").parent().show(), this.$heading.find(".cd-sectionLink-watch").parent().hide()) : (this.$heading.find(".cd-sectionLink-watch").parent().show(),
this.$heading.find(".cd-sectionLink-unwatch").parent().hide());
}
watch(silent = !1) {
let $link;
if (!silent) {
if ($link = this.$heading.find(".cd-sectionLink-watch"), $link.hasClass("cd-sectionLink-pending")) return;
$link.addClass("cd-sectionLink-pending");
}
Section_Section.watchSection(this.headline, {
silent: silent,
successCallback: () => {
this.watched = !0, $link && $link.removeClass("cd-sectionLink-pending"), Section_Section.getSectionsByHeadline(this.headline).forEach(section => {
section.updateWatchMenuItems();
});
},
errorCallback: () => {
$link && $link.removeClass("cd-sectionLink-pending");
}
});
}
unwatch(silent = !1) {
let $link;
if (!silent) {
if ($link = this.$heading.find(".cd-sectionLink-unwatch"), $link.hasClass("cd-sectionLink-pending")) return;
$link.addClass("cd-sectionLink-pending");
}
const watchedAncestor = this.getWatchedAncestor();
Section_Section.unwatchSection(this.headline, {
silent: silent,
successCallback: () => {
this.watched = !1, $link && $link.removeClass("cd-sectionLink-pending"), Section_Section.getSectionsByHeadline(this.headline).forEach(section => {
section.updateWatchMenuItems();
});
},
errorCallback: () => {
$link && $link.removeClass("cd-sectionLink-pending");
},
watchedAncestorHeadline: watchedAncestor && watchedAncestor.headline
});
}
copyLink(e) {
e.preventDefault(), copyLink(this, e.shiftKey);
}
locateInCode(pageCode) {
this.inCode = null;
const searchInput = {
firstComment: this.comments[0],
headline: normalizeCode(this.headline),
pageCode: pageCode,
adjustedPageCode: hideHtmlComments(pageCode)
};
cd.debug.startTimer("locate section");
const matches = this.searchInCode(searchInput);
let bestMatch;
if (cd.debug.stopTimer("locate section"), matches.forEach(match => {
(!bestMatch || match.score > bestMatch.score) && (bestMatch = match);
}), !bestMatch) throw new CdError({
type: "parse",
code: "couldntLocateSection"
});
this.inCode = bestMatch;
}
getWatchedAncestor(includeCurrent) {
for (let otherSection = includeCurrent ? this : this.parent; otherSection; otherSection = otherSection.parent) if (otherSection.watched) return otherSection;
return null;
}
getCode() {
var _this4 = this;
return asyncToGenerator_default()((function*() {
try {
const page = yield getLastRevision(_this4.sourcePage);
_this4.locateInCode(page.code);
} catch (e) {
throw e instanceof CdError ? new CdError(Object.assign({}, {
message: cd.s("cf-error-getpagecode")
}, e.data)) : e;
}
}))();
}
addMenuItem({label: label, href: href, func: func, class: className, tooltip: tooltip, visible: visible = !0}) {
if (classPrivateFieldGet_default()(this, _closingBracketElement)) {
const wrapper = document.createElement("span");
wrapper.className = "cd-sectionLinkWrapper", visible || (wrapper.style.display = "none");
const a = document.createElement("a");
a.textContent = label, href && (a.href = href), func && (a.onclick = func), a.className = "cd-sectionLink",
className && (a.className += " " + className), tooltip && (a.title = tooltip), wrapper.appendChild(a),
classPrivateFieldGet_default()(this, _editSectionElement).insertBefore(wrapper, classPrivateFieldGet_default()(this, _closingBracketElement));
}
}
get $elements() {
return void 0 === classPrivateFieldGet_default()(this, _cached$elements) && classPrivateFieldSet_default()(this, _cached$elements, $(this.elements)),
classPrivateFieldGet_default()(this, _cached$elements);
}
set $elements(value) {
classPrivateFieldSet_default()(this, _cached$elements, value), this.elements = value.get();
}
searchInCode({firstComment: firstComment, headline: headline, pageCode: pageCode, adjustedPageCode: adjustedPageCode}) {
const sectionHeadingRegexp = /^((=+)(.*?)\2[ \t]*(?:<!--[^]*?-->[ \t]*)*)\n/gm, matches = [], headlines = [];
let sectionHeadingMatch, sectionIndex = 0;
for (;sectionHeadingMatch = sectionHeadingRegexp.exec(adjustedPageCode); ) {
const thisHeadline = normalizeCode(removeWikiMarkup(sectionHeadingMatch[3])), headlineMatched = thisHeadline === headline;
let numberOfPreviousHeadlinesToCheck = 3;
const previousHeadlinesInCode = headlines.slice(-numberOfPreviousHeadlinesToCheck).reverse(), previousHeadlinesMatched = cd.sections.slice(Math.max(0, this.id - numberOfPreviousHeadlinesToCheck), this.id).reverse().map(section => section.headline).every((headline, i) => normalizeCode(headline) === previousHeadlinesInCode[i]);
headlines.push(thisHeadline);
const sectionIndexMatched = this.id === sectionIndex;
sectionIndex++;
const fullHeadingMatch = sectionHeadingMatch[1], equalSigns = sectionHeadingMatch[2], equalSignsPattern = "={1,".concat(equalSigns.length, "}"), codeFromSection = pageCode.slice(sectionHeadingMatch.index), adjustedCodeFromSection = adjustedPageCode.slice(sectionHeadingMatch.index), sectionMatch = adjustedCodeFromSection.match("(" + mw.util.escapeRegExp(fullHeadingMatch) + "[^]*?\n)" + equalSignsPattern + "[^=].*?=+[ \t]*(?:\x3c!--[^]*?--\x3e[ \t]*)*\n") || codeFromSection.match("(" + mw.util.escapeRegExp(fullHeadingMatch) + "[^]*$)"), firstChunkMatch = adjustedCodeFromSection.match("(" + mw.util.escapeRegExp(fullHeadingMatch) + "[^]*?\n)\n*={1,6}[^=].*?=+[ \t]*(?:\x3c!--[^]*?--\x3e[ \t]*)*\n") || codeFromSection.match("(" + mw.util.escapeRegExp(fullHeadingMatch) + "[^]*$)"), code = sectionMatch && codeFromSection.substr(sectionMatch.index, sectionMatch[1].length), firstChunkCode = firstChunkMatch && codeFromSection.substr(firstChunkMatch.index, firstChunkMatch[1].length);
if (!code || !firstChunkCode) {
console.log("Couldn't read the \"".concat(thisHeadline, '" section contents.'));
continue;
}
const signatures = extractSignatures(code);
let firstCommentMatched;
firstCommentMatched = signatures.length ? Boolean(firstComment) && (signatures[0].timestamp === firstComment.timestamp || signatures[0].author === firstComment.author) : !this.comments.length;
const score = 1 * headlineMatched + 1 * firstCommentMatched + .5 * sectionIndexMatched + .25 * previousHeadlinesMatched;
if (score <= 1) continue;
const startIndex = sectionHeadingMatch.index, endIndex = startIndex + code.length, contentStartIndex = sectionHeadingMatch.index + sectionHeadingMatch[0].length, firstChunkEndIndex = startIndex + firstChunkCode.length;
let firstChunkContentEndIndex = firstChunkEndIndex, contentEndIndex = endIndex;
if (cd.config.keepInSectionEnding.forEach(regexp => {
const firstChunkMatch = firstChunkCode.match(regexp);
firstChunkMatch && (firstChunkContentEndIndex -= firstChunkMatch[0].length - 1);
const codeMatch = code.match(regexp);
codeMatch && (contentEndIndex -= codeMatch[0].length - 1);
}), !this.comments.length) {
const match = firstChunkCode.match(/\n(# *\n+)$/);
match && (firstChunkContentEndIndex -= match[1].length);
}
if (matches.push({
headlineMatched: headlineMatched,
firstCommentMatched: firstCommentMatched,
sectionIndexMatched: sectionIndexMatched,
previousHeadlinesMatched: previousHeadlinesMatched,
score: score,
startIndex: startIndex,
endIndex: endIndex,
code: code,
contentStartIndex: contentStartIndex,
contentEndIndex: contentEndIndex,
firstChunkEndIndex: firstChunkEndIndex,
firstChunkContentEndIndex: firstChunkContentEndIndex,
firstChunkCode: firstChunkCode
}), 2.75 === score) break;
}
return matches;
}
static watchSection(headline, {silent: silent = !1, successCallback: successCallback, errorCallback: errorCallback}) {
return asyncToGenerator_default()((function*() {
if (!headline) return;
let watchedSections, thisPageWatchedSections;
try {
({watchedSections: watchedSections, thisPageWatchedSections: thisPageWatchedSections} = yield getWatchedSections());
} catch (e) {
return mw.notify(cd.s("section-watch-error-load"), {
type: "error"
}), void (errorCallback && errorCallback());
}
thisPageWatchedSections.includes(headline) || thisPageWatchedSections.push(headline);
try {
yield setWatchedSections(watchedSections);
} catch (e) {
if (e instanceof CdError) {
const {type: type, code: code} = e.data;
if ("internal" === type && "sizeLimit" === code) {
const $body = animateLink(cd.s("section-watch-error-maxsize"), "cd-notification-editWatchedSections", e => {
e.preventDefault(), editWatchedSections();
});
mw.notify($body, {
type: "error"
});
} else mw.notify(cd.s("section-watch-error-save"), {
type: "error"
});
} else mw.notify(cd.s("section-watch-error-save"), {
type: "error"
});
return void (errorCallback && errorCallback());
}
if (!silent) {
let text = cd.s("section-watch-success", headline);
$("#ca-watch").length && (text += " ".concat(cd.s("section-watch-pagenotwatched"))),
mw.notify(cd.util.wrapInElement(text));
}
successCallback && successCallback();
}))();
}
static unwatchSection(headline, {silent: silent = !1, successCallback: successCallback, errorCallback: errorCallback, watchedAncestorHeadline: watchedAncestorHeadline}) {
return asyncToGenerator_default()((function*() {
if (!headline) return;
let watchedSections, thisPageWatchedSections;
try {
({watchedSections: watchedSections, thisPageWatchedSections: thisPageWatchedSections} = yield getWatchedSections());
} catch (e) {
return mw.notify(cd.s("section-watch-error-load"), {
type: "error"
}), void (errorCallback && errorCallback());
}
thisPageWatchedSections.includes(headline) && thisPageWatchedSections.splice(thisPageWatchedSections.indexOf(headline), 1),
thisPageWatchedSections.length || delete watchedSections[mw.config.get("wgArticleId")];
try {
yield setWatchedSections(watchedSections);
} catch (e) {
return mw.notify(cd.s("section-watch-error-save"), {
type: "error"
}), void (errorCallback && errorCallback());
}
let text = cd.s("section-unwatch-success", headline);
watchedAncestorHeadline && (text += " ".concat(cd.s("section-unwatch-stillwatched", watchedAncestorHeadline))),
silent && !watchedAncestorHeadline || mw.notify(cd.util.wrapInElement(text)), successCallback && successCallback();
}))();
}
static getSectionByAnchor(anchor) {
return cd.sections && anchor && cd.sections.find(section => section.anchor === anchor) || null;
}
static getSectionsByHeadline(headline) {
return cd.sections.filter(section => section.headline === headline);
}
static search({headline: headline, firstCommentAnchor: firstCommentAnchor, index: index}) {
const matches = [ ...cd.sections.filter(section => section.headline === headline), ...cd.sections.filter(section => section.comments[0] && section.comments[0].anchor === firstCommentAnchor) ];
cd.sections[index] && matches.push(cd.sections[index]);
const scores = {};
matches.forEach(match => {
scores[match.id] || (scores[match.id] = 0), scores[match.id]++;
});
const bestMatchId = Object.keys(scores).reduce((bestMatchId, matchId) => scores[matchId] >= 2 && (null === bestMatchId || scores[matchId] > scores[bestMatchId]) ? matchId : bestMatchId, null);
return null !== bestMatchId ? cd.sections[bestMatchId] : null;
}
}
var _elementPrototypes = new WeakMap, _closingBracketElement = new WeakMap, _editSectionElement = new WeakMap, _cached$elements = new WeakMap, _showAddSubsectionButtonTimeout = new WeakMap, _hideAddSubsectionButtonTimeout = new WeakMap;
let commentFormsCounter = 0;
function lastFocused(commentForm1, commentForm2) {
const lastFocused1 = commentForm1.lastFocused || new Date(0), lastFocused2 = commentForm2.lastFocused || new Date(0);
return lastFocused2 > lastFocused1 ? 1 : lastFocused2 < lastFocused1 ? -1 : 0;
}
class CommentForm_CommentForm {
constructor({mode: mode, target: target, $addSectionLink: $addSectionLink, dataToRestore: dataToRestore, scrollIntoView: scrollIntoView, editintro: editintro}) {
_sectionHeadline.set(this, {
writable: !0,
value: void 0
}), _standardButtonsTotalWidth.set(this, {
writable: !0,
value: void 0
}), _standardSubmitButtonLabel.set(this, {
writable: !0,
value: void 0
}), _shortSubmitButtonLabel.set(this, {
writable: !0,
value: void 0
}), _lastPreviewTimestamp.set(this, {
writable: !0,
value: void 0
}), _previewTimeout.set(this, {
writable: !0,
value: void 0
}), _genderRequestCallbackList.set(this, {
writable: !0,
value: void 0
}), _dontAutopreview.set(this, {
writable: !0,
value: void 0
}), _editingSectionOpeningComment.set(this, {
writable: !0,
value: void 0
}), _headlineInputPurpose.set(this, {
writable: !0,
value: void 0
}), this.mode = mode, this.setTargets(target), this.$addSectionLink = $addSectionLink,
this.target instanceof Comment_Comment ? classPrivateFieldSet_default()(this, _sectionHeadline, this.target.section && this.target.section.headline) : this.target instanceof Section_Section && classPrivateFieldSet_default()(this, _sectionHeadline, this.target.headline),
this.id = commentFormsCounter++, "edit" !== this.mode || dataToRestore || (this.textLoaded = !1),
this.summaryAltered = !!dataToRestore && dataToRestore.summaryAltered, editintro && parseCode("{{".concat(editintro, "}}"), {
title: cd.g.CURRENT_PAGE
}).then(result => {
this.$messageArea.append(result.html).cdAddCloseButton();
}), this.createContents(dataToRestore), this.addEvents(), this.addToPage(), this.willCommentBeIndented = [ "reply", "replyInSection" ].includes(this.mode),
this.operations = [], cd.commentForms.push(this), dataToRestore ? (this.originalComment = dataToRestore.originalComment,
this.originalHeadline = dataToRestore.originalHeadline, dataToRestore.lastFocused && (this.lastFocused = new Date(dataToRestore.lastFocused))) : "edit" === this.mode ? (this.pushPending(!0),
this.target.getCode(!0).then(({commentText: commentText, headline: headline}) => {
this.commentInput.setValue(commentText), this.smallCheckbox && this.smallCheckbox.setSelected(this.target.inCode.inSmallFont),
this.originalComment = commentText, this.headlineInput && (this.headlineInput.setValue(headline),
this.originalHeadline = headline), this.willCommentBeIndented = this.target.inCode.indentationChars,
this.popPending(!0), this.textLoaded = !0, saveSession(), this.commentInput.focus();
}, e => {
e instanceof CdError ? this.handleError(Object.assign({}, e.data, {
retryFunc: this.retryLoad
})) : this.handleError({
type: "javascript",
logMessage: e
});
})) : (this.originalComment = "", this.headlineInput && (this.originalHeadline = ""),
this.target ? this.checkCode() : saveSession(), scrollIntoView && this.$element.cdScrollIntoView("center"),
this[this.headlineInput ? "headlineInput" : "commentInput"].focus()), mw.hook("convenientDiscussions.commentFormCreated").fire(this);
}
checkCode() {
if (!this.checkCodeRequest) {
const deferred = $.Deferred();
this.checkCodeRequest = deferred.then(() => {
saveSession();
}, e => {
e instanceof CdError ? this.handleError(Object.assign({}, e.data)) : this.handleError({
type: "javascript",
logMessage: e
});
}), this.target.getCode(this).then(() => {
deferred.resolve();
}, e => {
deferred.reject(e);
});
}
return this.checkCodeRequest;
}
retryLoad() {
this.$element.hide(), this.destroy(), this.target[CommentForm_CommentForm.modeToProperty(this.mode)]();
}
setTargets(target) {
this.target = target, this.target instanceof Comment_Comment ? this.targetSection = this.target.section : this.target instanceof Section_Section && (this.targetSection = this.target),
this.targetPage = this.targetSection ? this.targetSection.sourcePage : cd.g.CURRENT_PAGE,
target instanceof Comment_Comment ? this.targetComment = target : target instanceof Section_Section && target.commentsInFirstChunk[0] && target.commentsInFirstChunk[0].isOpeningSection && (this.targetComment = target.commentsInFirstChunk[0]);
}
addToolbar() {
const $toolbarPlaceholder = $("<div>").addClass("cd-toolbarPlaceholder").insertBefore(this.commentInput.$element), modules = [ "ext.wikiEditor" ];
cd.config.customCommentFormModules.filter(module => !module.checkFunc || module.checkFunc()).forEach(module => {
modules.push(module.name);
}), mw.loader.using(modules).then(() => {
$toolbarPlaceholder.hide();
const $textarea = this.commentInput.$input;
$textarea.wikiEditor("addModule", mw.loader.moduleRegistry["ext.wikiEditor"].packageExports["jquery.wikiEditor.toolbar.config.js"]);
const dialogsConfig = mw.loader.moduleRegistry["ext.wikiEditor"].packageExports["jquery.wikiEditor.dialogs.config.js"];
dialogsConfig.replaceIcons($textarea), $textarea.wikiEditor("addModule", dialogsConfig.getDefaultConfig()),
this.commentInput.$element.find('.tool[rel="redirect"], .tool[rel="signature"], .tool[rel="gallery"], .tool[rel="reference"], .option[rel="heading-2"]').remove(),
$textarea.wikiEditor("addToToolbar", {
section: "main",
groups: {
"convenient-discussions": {
tools: {
quote: {
label: cd.s("cf-quote-tooltip"),
type: "button",
icon: "https://upload.wikimedia.org/wikipedia/commons/c/c0/OOjs_UI_icon_quotes-ltr.svg",
action: {
type: "callback",
execute: () => {
this.quote();
}
}
}
}
}
}
}), this.commentInput.$element.find(".group-convenient-discussions").insertBefore(this.commentInput.$element.find(".section-main .group-insert")),
mw.hook("convenientDiscussions.commentFormReady").fire(this);
});
}
addInsertButton(text, displayedText) {
let [, pre, post] = text.match(/^(.*?(?:^|[^\\]))(?:\+(.*))?$/) || [];
if (!pre) return;
post = post || "", displayedText || (displayedText = pre + post);
const $a = $("<a>").text(displayedText).addClass("cd-insertButtons-item").on("click", e => {
e.preventDefault(), this.commentInput.$input.textSelection("encapsulateSelection", {
pre: pre,
peri: "",
post: post
});
});
this.$insertButtons.append($a, " ");
}
createContents(dataToRestore) {
this.target ? this.isInNumberedList = this.target instanceof Comment_Comment ? this.target.$elements.last().parent().is("ol") : this.target.$replyWrapper.parent().is("ol") : this.isInNumberedList = !1;
let tag = "div";
if ([ "reply", "edit" ].includes(this.mode)) {
const $lastElementOfTarget = this.target.$elements.last();
$lastElementOfTarget.is("li") ? this.isInNumberedList && "edit" !== this.mode || (tag = "li") : $lastElementOfTarget.is("dd") ? tag = "dd" : "reply" === this.mode && (tag = "ul");
}
if (classPrivateFieldSet_default()(this, _editingSectionOpeningComment, "edit" === this.mode && this.target.isOpeningSection),
this.$element = $(document.createElement(tag)).addClass("cd-commentForm").addClass("cd-commentForm-".concat(this.mode)),
this.isInNumberedList && this.$element.addClass("cd-commentForm-inNumberedList"),
classPrivateFieldGet_default()(this, _editingSectionOpeningComment) && this.$element.addClass("cd-commentForm-sectionOpeningComment"),
"addSubsection" === this.mode && this.$element.addClass("cd-commentForm-addSubsection-".concat(this.target.level)),
"reply" === this.mode) {
const $list = "ul" === tag ? this.$element : $("<ul>").appendTo(this.$element);
this.$innerWrapper = $("<li>").addClass("cd-commentForm-innerWrapper").appendTo($list),
$list.addClass("cd-commentLevel");
} else this.$innerWrapper = $("<div>").addClass("cd-commentForm-innerWrapper").appendTo(this.$element);
this.$messageArea = $("<div>").addClass("cd-messageArea"), ([ "addSection", "addSubsection" ].includes(this.mode) || classPrivateFieldGet_default()(this, _editingSectionOpeningComment)) && ("addSubsection" === this.mode ? classPrivateFieldSet_default()(this, _headlineInputPurpose, cd.s("cf-headline-subsection", this.targetSection.headline)) : "edit" === this.mode && this.target.section.level > 2 ? classPrivateFieldSet_default()(this, _headlineInputPurpose, cd.s("cf-headline-subsection", this.targetSection.parent.headline)) : classPrivateFieldSet_default()(this, _headlineInputPurpose, cd.s("cf-headline-topic")),
this.headlineInput = new OO.ui.TextInputWidget({
value: dataToRestore ? dataToRestore.headline : "",
placeholder: classPrivateFieldGet_default()(this, _headlineInputPurpose),
classes: [ "cd-headlineInput" ],
tabIndex: String(this.id) + "11"
}));
let commentInputPlaceholder, rowNumber = this.headlineInput ? 5 : 3;
if ("firefox" === $.client.profile().name && (rowNumber -= 1), !cd.config.commentInputEmptyPlaceholder) if ("replyInSection" === this.mode || "reply" === this.mode && this.target.isOpeningSection) commentInputPlaceholder = cd.s("cf-comment-placeholder-replytosection", this.targetSection.headline); else if ("reply" === this.mode) {
const ending = this.formUserName(this.target, {
returnUnknown: !1,
callback: () => {
this.commentInput.$input.attr("placeholder", cd.s("cf-comment-placeholder-replytocomment", this.formUserName(this.target)));
}
});
ending && (commentInputPlaceholder = cd.s("cf-comment-placeholder-replytocomment", ending));
} else "addSection" === this.mode ? commentInputPlaceholder = cd.s("cf-comment-placeholder-addsection") : "addSubsection" === this.mode && (commentInputPlaceholder = cd.s("cf-comment-placeholder-addsubsection"));
this.commentInput = new OO.ui.MultilineTextInputWidget({
value: dataToRestore ? dataToRestore.comment : "",
placeholder: commentInputPlaceholder,
autosize: !0,
rows: rowNumber,
maxRows: 30,
classes: [ "cd-commentInput" ],
tabIndex: String(this.id) + "12"
}), this.$settings = $("<div>").addClass("cd-commentFormSettings"), this.summaryInput = new OO.ui.TextInputWidget({
value: dataToRestore ? dataToRestore.summary : "",
maxLength: cd.g.SUMMARY_LENGTH_LIMIT,
placeholder: cd.s("cf-summary-placeholder"),
classes: [ "cd-summaryInput" ],
tabIndex: String(this.id) + "13"
}), this.summaryInput.$input.codePointLimit(cd.g.SUMMARY_LENGTH_LIMIT), mw.widgets.visibleCodePointLimit(this.summaryInput, cd.g.SUMMARY_LENGTH_LIMIT),
this.updateAutoSummary(!dataToRestore), this.$summaryPreview = $("<div>").addClass("cd-summaryPreview"),
"edit" === this.mode && ([this.minorField, this.minorCheckbox] = checkboxField({
value: "minor",
selected: !dataToRestore || dataToRestore.minor,
label: cd.s("cf-minor"),
tabIndex: String(this.id) + "20"
}));
const watchCheckboxSelected = cd.settings.watchSectionOnReply && "edit" !== this.mode || $("#ca-unwatch").length || mw.user.options.get(mw.config.get("wgArticleId") ? "watchdefault" : "watchcreations");
if ([this.watchField, this.watchCheckbox] = checkboxField({
value: "watch",
selected: dataToRestore ? dataToRestore.watch : watchCheckboxSelected,
label: cd.s("cf-watch"),
tabIndex: String(this.id) + "21"
}), this.targetSection || "addSection" === this.mode) {
const label = "addSubsection" !== this.mode && (this.targetSection && this.targetSection.level <= 2 || "addSection" === this.mode) ? cd.s("cf-watchsection-topic") : cd.s("cf-watchsection-subsection"), selected = cd.settings.watchSectionOnReply && "edit" !== this.mode || this.targetSection && this.targetSection.watched;
[this.watchSectionField, this.watchSectionCheckbox] = checkboxField({
value: "watchSection",
selected: dataToRestore ? dataToRestore.watchSection : selected,
label: label,
tabIndex: String(this.id) + "22",
title: cd.s("cf-watchsection-tooltip")
});
}
if (![ "addSection", "addSubsection", "edit" ].includes(this.mode) && this.targetComment && !this.targetComment.own && cd.config.pingTemplate && ([this.pingField, this.pingCheckbox] = checkboxField({
value: "ping",
selected: !!dataToRestore && dataToRestore.ping,
label: this.targetComment.isOpeningSection ? cd.s("cf-ping-sectionauthor") : cd.s("cf-ping-commentauthor"),
tabIndex: String(this.id) + "23"
}), this.targetComment.author.registered ? this.pingField.setTitle(cd.s("cf-ping-tooltip")) : (this.pingCheckbox.setDisabled(!0),
this.pingCheckbox.setTitle(cd.s("cf-ping-tooltip-unreg")), this.pingField.setTitle(cd.s("cf-ping-tooltip-unreg")))),
this.headlineInput || ([this.smallField, this.smallCheckbox] = checkboxField({
value: "small",
selected: !!dataToRestore && dataToRestore.small,
label: cd.s("cf-small"),
tabIndex: String(this.id) + "24"
})), this.headlineInput && ([this.noSignatureField, this.noSignatureCheckbox] = checkboxField({
value: "noSignature",
selected: !!dataToRestore && dataToRestore.noSignature,
label: cd.s("cf-nosignature"),
tabIndex: String(this.id) + "25"
})), "edit" === this.mode && (!this.target.isOpeningSection || this.target.section && 1 === this.target.section.comments.length)) {
const hasReplies = this.target.isOpeningSection ? void 0 : !this.target.section || this.target.section.comments.slice(this.target.section.comments.indexOf(this.target)).some(comment => comment.parent === this.target);
if (this.target.isOpeningSection || !hasReplies) {
const selected = !!dataToRestore && dataToRestore.delete;
[this.deleteField, this.deleteCheckbox] = checkboxField({
value: "delete",
selected: selected,
label: cd.s("cf-delete"),
tabIndex: String(this.id) + "26"
});
}
}
switch (this.scriptSettingsButton = new OO.ui.ButtonWidget({
framed: !1,
icon: "settings",
label: cd.s("cf-settings-tooltip"),
invisibleLabel: !0,
title: cd.s("cf-settings-tooltip"),
classes: [ "cd-button", "cd-scriptSettingsButton" ],
tabIndex: String(this.id) + "27"
}), this.horizontalLayout = new OO.ui.HorizontalLayout({
classes: [ "cd-checkboxesContainer" ]
}), this.horizontalLayout.addItems([ this.minorField, this.watchField, this.watchSectionField, this.pingField, this.smallField, this.noSignatureField, this.deleteField, this.scriptSettingsButton ].filter(defined)),
this.$buttonsContainer = $("<div>").addClass("cd-buttonsContainer"), this.$leftButtonsContainer = $("<div>").addClass("cd-leftButtonsContainer"),
this.$rightButtonsContainer = $("<div>").addClass("cd-rightButtonsContainer"), this.mode) {
case "edit":
classPrivateFieldSet_default()(this, _standardSubmitButtonLabel, cd.s("cf-save")),
classPrivateFieldSet_default()(this, _shortSubmitButtonLabel, cd.s("cf-save"));
break;
case "addSection":
classPrivateFieldSet_default()(this, _standardSubmitButtonLabel, cd.s("cf-addtopic")),
classPrivateFieldSet_default()(this, _shortSubmitButtonLabel, cd.s("cf-addtopic-short"));
break;
case "addSubsection":
classPrivateFieldSet_default()(this, _standardSubmitButtonLabel, cd.s("cf-addsubsection")),
classPrivateFieldSet_default()(this, _shortSubmitButtonLabel, cd.s("cf-addsubsection-short"));
break;
default:
classPrivateFieldSet_default()(this, _standardSubmitButtonLabel, cd.s("cf-reply")),
classPrivateFieldSet_default()(this, _shortSubmitButtonLabel, cd.s("cf-reply-short"));
}
this.settingsButton = new OO.ui.ButtonWidget({
label: cd.s("cf-settings"),
framed: !1,
classes: [ "cd-button", "cd-settingsButton" ],
tabIndex: String(this.id) + "30"
}), cd.g.$popupsOverlay || (cd.g.$popupsOverlay = $("<div>").addClass("cd-popupsOverlay").appendTo(document.body)),
this.helpPopupButton = new OO.ui.PopupButtonWidget({
label: cd.s("cf-help"),
framed: !1,
classes: [ "cd-button" ],
popup: {
head: !0,
$content: cd.util.wrapInElement(cd.s("cf-help-content"), "div"),
padded: !0,
align: "center"
},
$overlay: cd.g.$popupsOverlay,
tabIndex: String(this.id) + "31"
}), this.cancelButton = new OO.ui.ButtonWidget({
label: cd.s("cf-cancel"),
flags: "destructive",
framed: !1,
classes: [ "cd-button", "cd-cancelButton" ],
tabIndex: String(this.id) + "32"
}), this.viewChangesButton = new OO.ui.ButtonWidget({
label: cd.s("cf-viewchanges"),
classes: [ "cd-viewChangesButton" ],
tabIndex: String(this.id) + "33"
}), cd.settings.autopreview || (this.previewButton = new OO.ui.ButtonWidget({
label: cd.s("cf-preview"),
classes: [ "cd-previewButton" ],
tabIndex: String(this.id) + "34"
})), this.submitButton = new OO.ui.ButtonInputWidget({
type: "submit",
label: classPrivateFieldGet_default()(this, _standardSubmitButtonLabel),
flags: [ "progressive", "primary" ],
classes: [ "cd-submitButton" ],
tabIndex: String(this.id) + "35"
}), this.deleteCheckbox && this.deleteCheckbox.isSelected() && this.updateFormOnDeleteCheckboxChange(!0),
this.$settings.append(this.summaryInput.$element, this.$summaryPreview, this.horizontalLayout.$element),
this.$leftButtonsContainer.append(this.settingsButton.$element, this.helpPopupButton.$element),
this.$rightButtonsContainer.append(...[ this.cancelButton.$element, this.viewChangesButton && this.viewChangesButton.$element, this.previewButton && this.previewButton.$element, this.submitButton.$element ].filter(defined)),
this.$buttonsContainer.append(this.$leftButtonsContainer, this.$rightButtonsContainer),
this.$form = $("<form>"), this.$form.append(...[ this.headlineInput && this.headlineInput.$element, this.commentInput.$element, this.$settings, this.$buttonsContainer ].filter(defined)),
this.$innerWrapper.append(this.$messageArea, this.$form), "edit" === this.mode || cd.settings.alwaysExpandSettings || this.$settings.hide(),
this.$previewArea = $("<div>").addClass("cd-previewArea"), cd.settings.autopreview ? this.$previewArea.addClass("cd-previewArea-below").appendTo(this.$innerWrapper) : this.$previewArea.addClass("cd-previewArea-above").prependTo(this.$innerWrapper),
this.target && this.isInNumberedList && "webkit" !== $.client.profile().layout && $("<div>").html(" ").addClass("cd-commentForm-dummyElement").prependTo(this.$innerWrapper),
cd.settings.showToolbar && this.addToolbar(), cd.settings.insertButtons.length && (this.$insertButtons = $("<div>").addClass("cd-insertButtons").insertAfter(this.commentInput.$element),
cd.settings.insertButtons.forEach(button => {
let text, displayedText;
Array.isArray(button) ? (text = button[0], displayedText = button[1]) : text = button,
this.addInsertButton(text, displayedText);
}));
}
addToPage() {
switch (mw.config.get("wgArticleId") || cd.g.$root.empty(), this.mode) {
case "reply":
this.$element.insertAfter(this.target.$elements.last());
break;
case "edit":
this.target.isOpeningSection ? this.$element.insertAfter(this.target.$elements.last()) : this.$element.insertBefore(this.target.$elements.first());
break;
case "replyInSection":
this.$element.appendTo(this.target.$replyWrapper), this.target.$replyWrapper.addClass("cd-replyWrapper-hasCommentForm");
break;
case "addSection":
this.newTopicOnTop = this.$addSectionLink && this.$addSectionLink.is('[href*="section=0"]'),
this.newTopicOnTop && cd.sections[0] ? this.$element.insertBefore(cd.sections[0].$heading) : this.$element.appendTo(cd.g.$root);
break;
case "addSubsection":
{
const headingLevelRegexp = new RegExp("\\bcd-commentForm-addSubsection-[".concat(this.target.level, "-6]\\b"));
let $target, $tested = this.target.$elements.last();
do {
$target = $tested, $tested = $tested.next();
} while ($tested.is(".cd-sectionButtonContainer") || $tested.length && $tested.get(0).className.match(headingLevelRegexp));
this.$element.insertAfter($target);
break;
}
}
this.adjustLabels();
}
addEvents() {
const saveSessionEventHandler = () => {
saveSession();
}, preview = () => {
this.preview();
}, previewFalse = () => {
this.preview(!1);
}, textReactions = [ {
pattern: new RegExp(cd.g.SIGN_CODE + "\\s*$"),
message: cd.s("cf-reaction-signature", cd.g.SIGN_CODE),
class: "signatureNotNeeded",
type: "notice"
}, {
pattern: /<pre/,
message: cd.s("cf-reaction-pre"),
class: "dontUsePre",
type: "warning"
} ].concat(cd.config.customTextReactions);
this.$form.on("submit", e => {
e.preventDefault(), this.submit();
}).on("keydown", e => {
!e.ctrlKey || e.shiftKey || e.altKey || 13 !== e.keyCode || this.submit(), e.ctrlKey || e.shiftKey || e.altKey || 27 !== e.keyCode || this.cancel();
}).on("focusin", () => {
this.lastFocused = new Date;
}), this.headlineInput && this.headlineInput.on("change", headline => {
this.updateAutoSummary(!0, !0), headline.includes("{{") ? this.showMessage(cd.s("cf-reaction-templateinheadline"), "warning", "templateInHeadline") : this.hideMessage("templateInHeadline");
}).on("change", preview).on("change", saveSessionEventHandler), this.commentInput.on("change", text => {
this.updateAutoSummary(!0, !0), textReactions.forEach(reaction => {
reaction.pattern.test(text) && ("function" != typeof reaction.checkFunc || reaction.checkFunc()) ? this.showMessage(reaction.message, reaction.type, reaction.class) : this.hideMessage(reaction.class);
});
}).on("change", preview).on("change", saveSessionEventHandler), this.summaryInput.on("change", () => {
classPrivateFieldGet_default()(this, _dontAutopreview) || preview();
}).on("change", saveSessionEventHandler), this.summaryInput.$element.on("keypress", () => {
this.summaryAltered = !0, classPrivateFieldSet_default()(this, _dontAutopreview, !1);
}), this.minorCheckbox && this.minorCheckbox.on("change", saveSessionEventHandler),
this.watchCheckbox.on("change", saveSessionEventHandler), this.watchSectionCheckbox && this.watchSectionCheckbox.on("change", saveSessionEventHandler),
this.pingCheckbox && this.pingCheckbox.on("change", previewFalse).on("change", saveSessionEventHandler),
this.smallCheckbox && this.smallCheckbox.on("change", previewFalse).on("change", saveSessionEventHandler),
this.noSignatureCheckbox && this.noSignatureCheckbox.on("change", previewFalse).on("change", saveSessionEventHandler),
this.deleteCheckbox && this.deleteCheckbox.on("change", selected => {
this.updateAutoSummary(), this.updateFormOnDeleteCheckboxChange(selected);
}).on("change", selected => {
selected && cd.settings.autopreview && this.$previewArea.empty();
}).on("change", saveSessionEventHandler), this.scriptSettingsButton.on("click", () => {
settingsDialog();
}), this.settingsButton.on("click", () => {
this.toggleSettings();
}), this.cancelButton.on("click", () => {
this.cancel();
}), this.viewChangesButton.on("click", () => {
this.viewChanges();
}), this.previewButton && this.previewButton.on("click", () => {
this.preview(!0, !1);
});
}
toggleSettings() {
this.$settings.is(":hidden") ? this.$settings.show() : this.$settings.hide();
}
adjustLabels() {
let formWidth = this.$innerWrapper.width();
this.$element.hasClass("cd-commentForm-short") ? formWidth >= classPrivateFieldGet_default()(this, _standardButtonsTotalWidth) + 7 && (this.$element.removeClass("cd-commentForm-short"),
this.submitButton.setLabel(classPrivateFieldGet_default()(this, _standardSubmitButtonLabel)),
this.previewButton && this.previewButton.setLabel(cd.s("cf-preview")), this.viewChangesButton && this.viewChangesButton.setLabel(cd.s("cf-viewchanges")),
this.cancelButton.setLabel(cd.s("cf-cancel"))) : (classPrivateFieldSet_default()(this, _standardButtonsTotalWidth, this.submitButton.$element.outerWidth(!0) + (this.previewButton ? this.previewButton.$element.outerWidth(!0) : 0) + (this.viewChangesButton ? this.viewChangesButton.$element.outerWidth(!0) : 0) + this.settingsButton.$element.outerWidth(!0) + this.helpPopupButton.$element.outerWidth(!0) + this.cancelButton.$element.outerWidth(!0)),
formWidth < classPrivateFieldGet_default()(this, _standardButtonsTotalWidth) + 7 && (this.$element.addClass("cd-commentForm-short"),
this.submitButton.setLabel(classPrivateFieldGet_default()(this, _shortSubmitButtonLabel)),
this.previewButton && this.previewButton.setLabel(cd.s("cf-preview-short")), this.viewChangesButton && this.viewChangesButton.setLabel(cd.s("cf-viewchanges-short")),
this.cancelButton.setLabel(cd.s("cf-cancel-short"))));
}
pushPending(blockButtons = !1) {
this.commentInput.pushPending(), this.summaryInput.pushPending(), this.headlineInput && this.headlineInput.pushPending(),
blockButtons && (this.submitButton.setDisabled(!0), this.previewButton && this.previewButton.setDisabled(!0),
this.viewChangesButton && this.viewChangesButton.setDisabled(!0), this.cancelButton.setDisabled(!0));
}
popPending(unblockButtons = !1) {
this.commentInput.popPending(), this.summaryInput.popPending(), this.headlineInput && this.headlineInput.popPending(),
unblockButtons && (this.submitButton.setDisabled(!1), this.previewButton && this.previewButton.setDisabled(!1),
this.viewChangesButton && this.viewChangesButton.setDisabled(!1), this.cancelButton.setDisabled(!1));
}
showMessage(html, type = "notice", className) {
if (this.destroyed || className && this.$messageArea.children(".cd-message-".concat(className)).length) return;
const $label = html instanceof $ ? html : cd.util.wrapInElement(html), classes = [ "cd-message" ];
className && classes.push("cd-message-".concat(className));
const message = new OO.ui.MessageWidget({
type: type,
inline: !0,
label: $label,
classes: classes
});
this.$messageArea.append(message.$element).cdAddCloseButton().cdScrollIntoView("top");
}
hideMessage(className) {
const $info = this.$messageArea.children(".cd-message-".concat(className));
$info.length && $info.remove();
}
abort({message: message, messageType: messageType = "error", logMessage: logMessage, retryFunc: retryFunc, tearDown: tearDown = !1, isRawMessage: isRawMessage = !1, currentOperation: currentOperation}) {
if (currentOperation && this.closeOperation(currentOperation), !this.destroyed) {
if (logMessage && console.warn(logMessage), currentOperation && "preview" === currentOperation.type && cd.settings.autopreview || (isRawMessage ? this.$messageArea.append(message) : this.showMessage(message, messageType)),
retryFunc || tearDown) {
this.$innerWrapper.children(":not(.cd-messageArea)").remove();
const cancelLink = new OO.ui.ButtonWidget({
label: cd.s("cf-error-cancel"),
framed: !1
});
cancelLink.on("click", () => {
this.cancel(!1);
});
const $div = $("<div>").append(cancelLink.$element).appendTo(this.$messageArea);
if (retryFunc) {
const retryLink = new OO.ui.ButtonWidget({
label: cd.s("cf-error-tryagain"),
framed: !1
});
retryLink.on("click", () => {
this.$messageArea.empty(), retryFunc.call(this);
}), $div.append(retryLink.$element);
}
}
this.$messageArea.cdScrollIntoView("top");
}
}
unknownApiErrorText(errorCode, errorInfo) {
return asyncToGenerator_default()((function*() {
let text;
if (errorCode && (text = "".concat(cd.s("error-api"), ": ").concat(errorCode, ". "),
errorInfo)) try {
const {html: html} = yield parseCode(errorInfo);
text += html;
} catch (e) {
text += errorInfo;
}
return text;
}))();
}
handleError({type: type, code: code, apiData: apiData, message: message, messageType: messageType, logMessage: logMessage, retryFunc: retryFunc, tearDown: tearDown = !1, isRawMessage: isRawMessage = !1, currentOperation: currentOperation}) {
var _this = this;
return asyncToGenerator_default()((function*() {
switch (type) {
case "parse":
{
switch (code) {
case "couldntLocateComment":
message = cd.s("error-locatecomment");
break;
case "couldntLocateSection":
message = cd.s("error-locatesection");
break;
case "numberedList":
message = cd.s("cf-error-numberedlist");
break;
case "findPlace":
message = "".concat(cd.s("cf-error-findplace"), ".");
break;
case "findPlace-unexpectedHeading":
message = "".concat(cd.s("cf-error-findplace"), " (").concat(cd.s("cf-error-findplace-unexpectedheading"), ").");
break;
case "delete-repliesToComment":
message = cd.s("cf-error-delete-repliestocomment");
break;
case "delete-repliesInSection":
message = cd.s("cf-error-delete-repliesinsection");
}
const $message = animateLink(message, "cd-message-reloadPage", asyncToGenerator_default()((function*() {
_this.reloadPage({}, null, !0);
})));
_this.abort({
message: $message,
messageType: messageType,
retryFunc: retryFunc,
tearDown: tearDown,
isRawMessage: isRawMessage,
currentOperation: currentOperation
});
break;
}
case "api":
{
switch (code) {
case "missing":
message = cd.s("cf-error-pagedoesntexist");
break;
case "error":
{
const {code: errorCode, info: errorInfo} = apiData.error;
switch (errorCode) {
case "missingtitle":
message = cd.s("cf-error-pagedoesntexist");
break;
default:
message = yield _this.unknownApiErrorText(errorCode, errorInfo);
}
break;
}
}
const $message = cd.util.wrapInElement(message);
$message.find(".mw-parser-output").css("display", "inline"), _this.abort({
message: $message,
messageType: messageType,
isRawMessage: isRawMessage,
logMessage: logMessage || [ code, apiData ],
retryFunc: retryFunc,
tearDown: tearDown,
currentOperation: currentOperation
});
break;
}
case "network":
message = (message ? "".concat(message, " ") : "") + cd.s("error-network"), _this.abort({
message: message,
isRawMessage: isRawMessage,
logMessage: logMessage,
retryFunc: retryFunc,
tearDown: tearDown,
currentOperation: currentOperation
});
break;
case "javascript":
_this.abort({
message: cd.s("error-javascript"),
logMessage: logMessage,
tearDown: tearDown,
currentOperation: currentOperation
});
}
}))();
}
commentTextToCode(action) {
let indentationChars, replyIndentationChars, text = this.commentInput.getValue();
this.target instanceof Comment_Comment && (indentationChars = this.target.inCode.indentationChars,
replyIndentationChars = this.target.inCode.replyIndentationChars), indentationChars = indentationChars || "",
"reply" === this.mode ? indentationChars = replyIndentationChars : "replyInSection" === this.mode && (indentationChars = this.target.inCode.lastCommentFirstIndentationChar || cd.config.defaultIndentationChar);
const isZeroLevel = "preview" === action || [ "addSection", "addSubsection" ].includes(this.mode) || "edit" === this.mode && !indentationChars, newLineIndentationChars = indentationChars.replace(/\*/g, ":");
let hidden, code = text.trim(), useColonsForNewLines = /^[:*#]/.test(code), hasTable = !1;
({code: code, hidden: hidden} = hideSensitiveCode(code, isTable => {
isTable && this.willCommentBeIndented && (useColonsForNewLines = !0, hasTable = !0);
}));
let signature, implicitSmall = !1;
if (this.smallCheckbox && (code = code.replace(/^<small>([^]*)<\/small>$/i, (s, m1) => (implicitSmall = !0,
m1))), code = code.replace(/^ +[\s\uFEFF\xA0]+[^\s\uFEFF\xA0]/gm, s => / [^\s\uFEFF\xA0]$/.test(s) ? s : s.replace(/^ +/gm, "")),
signature = this.noSignatureCheckbox && this.noSignatureCheckbox.isSelected() ? "" : "edit" === this.mode ? this.target.inCode.signature : cd.settings.mySignature,
!signature || "edit" === this.mode && /^[ \t]*\n/.test(signature) || !/\n[:*#].*$/.test(code) || (code += "\n",
"edit" === this.mode && (signature = signature.replace(/^\s+/, ""))), isZeroLevel || (code = code.replace(/\n([:*#]+)/g, (s, m1) => (useColonsForNewLines = !0,
"\n" + newLineIndentationChars + m1)), useColonsForNewLines && indentationChars && (code = code.replace(/\n(?![:#\x03])/g, () => {
if ("#" === newLineIndentationChars) throw new CdError({
type: "parse",
code: "numberedList"
});
return "\n".concat(newLineIndentationChars) + (cd.config.spaceAfterIndentationChar ? " " : "");
}))), this.willCommentBeIndented) {
code = code.replace(/^ +/gm, "");
const replacement = cd.config.paragraphTemplates.length ? "$1{{".concat(cd.config.paragraphTemplates[0], "}}") : "$1<br><br>";
code = code.replace(/^((?![:*#= ]).+)\n\n(?![:*#=])/gm, replacement);
}
const entireLineRegexp = new RegExp("^(?:\\x01.*?\\x02 *|\\[\\[".concat(cd.g.FILE_PREFIX_PATTERN, ".+\\]\\]\\s*)$"), "im"), thisLineEndingRegexp = new RegExp("(?:<".concat(cd.g.PNIE_PATTERN, "(?: [\\w ]+?=[^<>]+?| ?\\/?)>|<\\/").concat(cd.g.PNIE_PATTERN, ">)|\\x04$"), "i"), nextLineBeginningRegexp = new RegExp("^(?:<\\/".concat(cd.g.PNIE_PATTERN, ">|<").concat(cd.g.PNIE_PATTERN, ")"), "i");
if (code = code.replace(/^((?![:*#= ]).+)\n(?![\n:*#= \x03])(?=(.*))/gm, (s, m1, m2) => m1 + (entireLineRegexp.test(m1) || entireLineRegexp.test(m2) || thisLineEndingRegexp.test(m1) || nextLineBeginningRegexp.test(m2) ? "" : "<br>") + (this.willCommentBeIndented ? "" : "\n")),
code = code.replace(/\s*~{3,}$/, ""), this.pingCheckbox && this.pingCheckbox.isSelected()) {
let separator;
separator = /^[:*#]/.test(code) ? "\n" + (isZeroLevel ? "" : newLineIndentationChars) : " ",
code = "{{" + cd.config.pingTemplate + "|" + this.targetComment.author.name + (code ? "" : "|p=.") + "}}" + separator + code;
}
if (!isZeroLevel && /^#/gm.test(code) && (indentationChars = newLineIndentationChars),
this.headlineInput) {
let level;
level = "addSection" === this.mode ? 2 : "addSubsection" === this.mode ? this.target.level + 1 : this.target.inCode.headingLevel;
const equalSigns = "=".repeat(level);
classPrivateFieldGet_default()(this, _editingSectionOpeningComment) && /^\n/.test(this.target.inCode.code) && (code = "\n" + code),
code = "".concat(equalSigns, " ").concat(this.headlineInput.getValue().trim(), " ").concat(equalSigns, "\n").concat(code);
}
if ("preview" === action && signature && (signature = '<span class="cd-commentForm-signature">'.concat(signature, "</span>")),
/^\s/.test(signature) || !code || /[\s>]$/.test(code) || (code += " "), /(?:^|\n) .*$/.test(code) && (code += "\n"),
code += signature, this.smallCheckbox && (this.smallCheckbox.isSelected() || implicitSmall)) {
const indentation = newLineIndentationChars + (/^[:*#]/.test(code) || !cd.config.spaceAfterIndentationChar ? "" : " "), before = /^[:*# ]/.test(code) ? "\n".concat(indentation) : "";
code = cd.config.blockSmallTemplate && !/^[:*#]/m.test(code) ? "{{".concat(cd.config.blockSmallTemplate, "|1=").concat(code, "}}") : "<small>".concat(before).concat(code, "</small>");
}
let imitateList;
return "edit" !== this.mode && (code += "\n"), "submit" === action && ("reply" !== this.mode && "replyInSection" !== this.mode || (code = indentationChars + (indentationChars && !/^[:*#]/.test(code) && cd.config.spaceAfterIndentationChar ? " " : "") + code),
this.willCommentBeIndented && "edit" === this.mode && /^[:*]/.test(this.target.inCode.code) && !/^[:*]/.test(code) && (code = " " + code),
"addSubsection" === this.mode && (code += "\n")), "preview" === action && this.willCommentBeIndented && this.commentInput.getValue().trim() && !hasTable ? (code = code.replace(/^/gm, ":"),
imitateList = !0) : imitateList = !1, code = unhideSensitiveCode(code, hidden),
cd.config.customCodeTransformations && (code = cd.config.customCodeTransformations(code, this)),
{
code: code,
imitateList: imitateList
};
}
tryPrepareNewPageCode(action) {
var _this2 = this;
return asyncToGenerator_default()((function*() {
let page, newPageCode;
try {
page = yield getLastRevision(_this2.targetPage);
} catch (e) {
return void (e instanceof CdError ? _this2.handleError(Object.assign({}, {
message: cd.s("cf-error-getpagecode")
}, e.data)) : _this2.handleError({
type: "javascript",
logMessage: e
}));
}
try {
newPageCode = _this2.prepareNewPageCode(page.code, action);
} catch (e) {
return void (e instanceof CdError ? _this2.handleError(e.data) : _this2.handleError({
type: "javascript",
logMessage: e
}));
}
return {
page: page,
newPageCode: newPageCode
};
}))();
}
prepareNewPageCode(pageCode, action) {
let targetInCode, currentIndex;
if (pageCode += "\n", this.target && (this.target.locateInCode(pageCode), targetInCode = this.target.inCode,
"edit" === this.mode && (this.willCommentBeIndented = this.target.inCode.indentationChars)),
"reply" === this.mode) {
currentIndex = targetInCode.endIndex;
const succeedingText = pageCode.slice(currentIndex), properPlaceMatch = new RegExp("^([^]*?(?:" + mw.util.escapeRegExp(targetInCode.signature) + "|" + cd.g.TIMESTAMP_REGEXP.source + ".*)\\n)\\n*" + (targetInCode.indentationChars.length > 0 ? "[:*#]{0,".concat(targetInCode.indentationChars.length, "}") : "") + "(?![:*#\\n])").exec(succeedingText);
if (!properPlaceMatch) throw new CdError({
type: "parse",
code: "findPlace"
});
const textBeforeInsertion = properPlaceMatch[1], changedIndentationCharsMatch = textBeforeInsertion.match(/\n([:*#]{2,}).*\n$/), changedIndentationChars = changedIndentationCharsMatch && changedIndentationCharsMatch[1];
changedIndentationChars && (changedIndentationChars.length > targetInCode.indentationChars.length ? targetInCode.replyIndentationChars = changedIndentationChars.slice(0, targetInCode.replyIndentationChars.length).replace(/:$/, cd.config.defaultIndentationChar) : targetInCode.indentationChars = changedIndentationChars.slice(0, targetInCode.indentationChars.length).replace(/:$/, cd.config.defaultIndentationChar));
const adjustedTextBeforeInsertion = textBeforeInsertion.replace(/<!--[^]*?-->/g, "");
if (/\n(=+).*?\1[ \t]*\n/.test(adjustedTextBeforeInsertion)) throw new CdError({
type: "parse",
code: "findPlace-unexpectedHeading"
});
currentIndex += textBeforeInsertion.length;
}
"replyInSection" === this.mode && this.isInNumberedList && /\n#.*\n+$/.test(targetInCode.firstChunkCode) && (targetInCode.lastCommentFirstIndentationChar = "#");
const isDelete = this.deleteCheckbox && this.deleteCheckbox.isSelected();
let commentCode, newPageCode, before;
if (!isDelete) try {
({code: commentCode} = this.commentTextToCode("submit"));
} catch (e) {
return void (e instanceof CdError ? this.handleError(e.data) : this.handleError({
type: "javascript",
logMessage: e
}));
}
switch (this.mode) {
case "reply":
before = pageCode.slice(0, currentIndex), newPageCode = before + commentCode + pageCode.slice(currentIndex);
break;
case "edit":
if (isDelete) {
let startIndex, endIndex;
if (this.target.isOpeningSection && void 0 !== targetInCode.headingStartIndex) {
this.target.section.locateInCode(pageCode);
const targetInCode = this.target.section.inCode;
if (extractSignatures(targetInCode.code).length > 1) throw new CdError({
type: "parse",
code: "delete-repliesInSection"
});
({startIndex: startIndex, contentEndIndex: endIndex} = targetInCode);
} else {
endIndex = targetInCode.endIndex + targetInCode.dirtySignature.length + 1;
const succeedingText = pageCode.slice(targetInCode.endIndex);
if (new RegExp("^.+\\n+[:*#]{".concat(targetInCode.indentationChars.length + 1, ",}")).exec(succeedingText)) throw new CdError({
type: "parse",
code: "delete-repliesToComment"
});
startIndex = targetInCode.lineStartIndex;
}
newPageCode = pageCode.slice(0, startIndex) + pageCode.slice(endIndex);
} else {
const startIndex = this.target.isOpeningSection && void 0 !== targetInCode.headingStartIndex ? targetInCode.headingStartIndex : targetInCode.startIndex;
before = pageCode.slice(0, startIndex), newPageCode = before + commentCode + pageCode.slice(targetInCode.endIndex + targetInCode.dirtySignature.length);
}
break;
case "replyInSection":
before = pageCode.slice(0, targetInCode.firstChunkContentEndIndex), newPageCode = before + commentCode + pageCode.slice(targetInCode.firstChunkContentEndIndex);
break;
case "addSection":
if (this.newTopicOnTop) {
const firstSectionIndex = hideHtmlComments(pageCode).search(/^(=+).*?\1/m);
before = pageCode.slice(0, firstSectionIndex), newPageCode = before + commentCode + "\n" + pageCode.slice(firstSectionIndex);
} else before = (pageCode + "\n").trimStart(), newPageCode = before + commentCode;
break;
case "addSubsection":
before = pageCode.slice(0, targetInCode.contentEndIndex).replace(/([^\n])\n$/, "$1\n\n"),
newPageCode = before + commentCode + pageCode.slice(targetInCode.contentEndIndex);
}
return "submit" !== action || isDelete || extractSignatures(before, !0), newPageCode;
}
registerOperation(operation) {
this.operations.push(operation), operation.closed = !1, "preview" === operation.type && cd.settings.autopreview || (this.$messageArea.empty(),
this.pushPending("submit" === operation.type));
}
closeOperationIfNecessary(operation, condition) {
if (operation.closed) return !0;
const otherOperationIndex = function(arr, callback) {
for (let i = arr.length - 1; i >= 0; i--) if (callback(arr[i])) return i;
return null;
}(this.operations, op => operation !== op && [ "preview", "viewChanges" ].includes(op.type) && !op.delayed);
return !!(null !== otherOperationIndex && otherOperationIndex > this.operations.indexOf(operation) || condition) && (this.closeOperation(operation),
!0);
}
closeOperation(operation) {
operation.closed = !0, "preview" === operation.type && cd.settings.autopreview || this.popPending("submit" === operation.type);
}
unregisterOperation(operation) {
this.operations.includes(operation) && this.operations.splice(this.operations.indexOf(operation), 1);
}
isBeingSubmitted() {
return this.operations.some(op => "submit" === op.type && !op.closed);
}
preview(maySummaryHaveChanged = !0, auto = !0, operation) {
var _this3 = this;
return asyncToGenerator_default()((function*() {
if (!1 === _this3.textLoaded || _this3.target && !_this3.target.inCode && _this3.checkCodeRequest && "resolved" === _this3.checkCodeRequest.state() || _this3.isBeingSubmitted() || auto && !cd.settings.autopreview) return void (operation && _this3.closeOperation(operation));
let currentOperation;
if (operation ? currentOperation = operation : (currentOperation = {
type: "preview"
}, _this3.registerOperation(currentOperation)), auto) {
const isTooEarly = Date.now() - classPrivateFieldGet_default()(_this3, _lastPreviewTimestamp) < 1e3;
if (isTooEarly || _this3.operations.some(op => !op.closed && "preview" === op.type && op !== currentOperation)) return void (classPrivateFieldGet_default()(_this3, _previewTimeout) ? _this3.unregisterOperation(currentOperation) : (currentOperation.delayed = !0,
classPrivateFieldSet_default()(_this3, _previewTimeout, setTimeout(() => {
classPrivateFieldSet_default()(_this3, _previewTimeout, null), _this3.preview(maySummaryHaveChanged, !0, currentOperation);
}, isTooEarly ? 1e3 - (Date.now() - classPrivateFieldGet_default()(_this3, _lastPreviewTimestamp)) : 100))));
classPrivateFieldSet_default()(_this3, _lastPreviewTimestamp, Date.now());
}
if (_this3.closeOperationIfNecessary(currentOperation)) return;
if (_this3.target && !_this3.target.inCode && (yield _this3.checkCode(), _this3.closeOperationIfNecessary(currentOperation, !_this3.target.inCode))) return;
const emptyPreview = !(_this3.commentInput.getValue().trim() || _this3.headlineInput && _this3.headlineInput.getValue().trim());
if (emptyPreview && !maySummaryHaveChanged) return void _this3.closeOperation(currentOperation);
const {code: commentCode, imitateList: imitateList} = _this3.commentTextToCode("preview");
let html, parsedSummary;
try {
({html: html, parsedSummary: parsedSummary} = yield parseCode(commentCode, {
title: _this3.targetPage,
summary: cd.util.buildEditSummary({
text: _this3.summaryInput.getValue()
})
}));
} catch (e) {
return void (e instanceof CdError ? _this3.handleError(Object.assign({}, e.data, {
message: cd.s("cf-error-preview"),
currentOperation: currentOperation
})) : _this3.handleError({
type: "javascript",
logMessage: e,
currentOperation: currentOperation
}));
}
if (!_this3.closeOperationIfNecessary(currentOperation)) {
if (html) {
if (auto && emptyPreview || _this3.deleteCheckbox && _this3.deleteCheckbox.isSelected()) _this3.$previewArea.empty(); else {
const $label = $("<div>").addClass("cd-commentForm-blockLabel").text(cd.s("cf-block-preview"));
_this3.$previewArea.html(html).prepend($label).cdAddCloseButton(), imitateList ? _this3.$previewArea.addClass("cd-previewArea-indentedComment") : _this3.$previewArea.removeClass("cd-previewArea-indentedComment");
}
const $parsedSummary = parsedSummary && cd.util.wrapInElement(parsedSummary);
$parsedSummary.length && _this3.$element.find(".cd-summaryPreview").html("".concat(cd.s("cf-summary-preview"), ': <span class="comment">').concat($parsedSummary.html(), "</span>")),
auto || mw.hook("wikipage.content").fire(_this3.$previewArea);
}
_this3.$previewArea.hasClass("cd-previewArea-above") && _this3.$previewArea.cdScrollIntoView("top"),
_this3.closeOperation(currentOperation);
}
}))();
}
viewChanges() {
var _this4 = this;
return asyncToGenerator_default()((function*() {
if (_this4.isBeingSubmitted()) return;
const currentOperation = {
type: "viewChanges"
};
_this4.registerOperation(currentOperation);
const {page: page, newPageCode: newPageCode} = (yield _this4.tryPrepareNewPageCode("viewChanges")) || {};
if (_this4.closeOperationIfNecessary(currentOperation, void 0 === newPageCode)) return;
let resp;
mw.loader.load("mediawiki.diff.styles");
try {
const options = {
action: "compare",
toslots: "main",
"totext-main": newPageCode,
prop: "diff",
formatversion: 2
};
mw.config.get("wgArticleId") ? options.fromrev = page.revisionId : (options.fromslots = "main",
options["fromtext-main"] = ""), resp = yield cd.g.api.post(options).catch(handleApiReject);
} catch (e) {
return void (e instanceof CdError ? _this4.handleError(Object.assign({}, e.data, {
message: cd.s("cf-error-viewchanges"),
currentOperation: currentOperation
})) : _this4.handleError({
type: "javascript",
logMessage: e,
currentOperation: currentOperation
}));
}
if (_this4.closeOperationIfNecessary(currentOperation)) return;
let html = resp && resp.compare && resp.compare.body;
if (html) {
html = cd.util.wrapDiffBody(html);
const $label = $("<div>").addClass("cd-commentForm-blockLabel").text(cd.s("cf-block-viewchanges"));
_this4.$previewArea.html(html).prepend($label).cdAddCloseButton();
} else _this4.$previewArea.empty(), void 0 !== html && _this4.showMessage(cd.s("cf-message-nochanges"));
_this4.$previewArea.cdScrollIntoView(_this4.$previewArea.hasClass("cd-previewArea-above") ? "top" : "bottom"),
_this4.closeOperation(currentOperation);
}))();
}
reloadPage(keptData, currentOperation, confirmClose = !1) {
var _this5 = this;
return asyncToGenerator_default()((function*() {
if (!confirmClose || (yield _this5.confirmClose())) {
_this5.forget(!1);
try {
yield reloadPage(keptData);
} catch (e) {
e instanceof CdError ? _this5.handleError(Object.assign({}, e.data, {
message: cd.s("error-reloadpage"),
retryFunc: () => {
_this5.reloadPage(keptData);
},
tearDown: !0,
currentOperation: currentOperation
})) : _this5.handleError({
type: "javascript",
logMessage: e,
tearDown: !0,
currentOperation: currentOperation
}), removeLoadingOverlay();
}
}
}))();
}
runChecks({isDelete: isDelete}) {
var _this6 = this;
return asyncToGenerator_default()((function*() {
const checks = [ {
condition: _this6.headlineInput && "" === _this6.headlineInput.getValue(),
confirmation: (_confirmation = asyncToGenerator_default()((function*() {
const headingPurpose = classPrivateFieldGet_default()(_this6, _headlineInputPurpose) === cd.s("cf-headline-topic") ? cd.s("cf-headline-topic-lowercase") : cd.s("cf-headline-subsection-lowercase");
return yield OO.ui.confirm(cd.s("cf-confirm-noheadline", headingPurpose));
})), function() {
return _confirmation.apply(this, arguments);
})
}, {
condition: !(_this6.commentInput.getValue().trim() || cd.config.noConfirmPostEmptyCommentPageRegexp && cd.config.noConfirmPostEmptyCommentPageRegexp.test(cd.g.CURRENT_PAGE)),
confirmation: (_confirmation2 = asyncToGenerator_default()((function*() {
return yield OO.ui.confirm(cd.s("cf-confirm-empty"));
})), function() {
return _confirmation2.apply(this, arguments);
})
}, {
condition: _this6.commentInput.getValue().trim().length > cd.config.longCommentThreshold,
confirmation: (_confirmation3 = asyncToGenerator_default()((function*() {
return yield OO.ui.confirm(cd.s("cf-confirm-long", cd.config.longCommentThreshold));
})), function() {
return _confirmation3.apply(this, arguments);
})
}, {
condition: /^==[^=]/m.test(_this6.commentInput.getValue()) && "edit" !== _this6.mode,
confirmation: (_confirmation4 = asyncToGenerator_default()((function*() {
return yield OO.ui.confirm(cd.s("cf-confirm-secondlevelheading"));
})), function() {
return _confirmation4.apply(this, arguments);
})
}, {
condition: isDelete,
confirmation: (_confirmation5 = asyncToGenerator_default()((function*() {
return yield confirmDestructive("cf-confirm-delete");
})), function() {
return _confirmation5.apply(this, arguments);
})
} ];
var _confirmation5, _confirmation4, _confirmation3, _confirmation2, _confirmation;
for (const check of checks) if (check.condition && !(yield check.confirmation())) return _this6.commentInput.focus(),
!1;
return !0;
}))();
}
tryEditPage(page, newPageCode, currentOperation) {
var _this7 = this;
return asyncToGenerator_default()((function*() {
let resp;
try {
resp = yield cd.g.api.postWithToken("csrf", {
action: "edit",
title: _this7.targetPage,
text: newPageCode,
summary: cd.util.buildEditSummary({
text: _this7.summaryInput.getValue()
}),
tags: cd.config.tagName,
baserevid: page.revisionId,
starttimestamp: page.queryTimestamp,
minor: _this7.minorCheckbox && _this7.minorCheckbox.isSelected(),
watchlist: _this7.watchCheckbox.isSelected() ? "watch" : "unwatch",
formatversion: 2
}).catch(handleApiReject);
} catch (e) {
if (e instanceof CdError) {
const {type: type, apiData: apiData} = e.data;
if ("network" === type) _this7.handleError({
type: type,
message: cd.s("cf-error-couldntedit"),
currentOperation: currentOperation
}); else {
const error = apiData && apiData.error;
let message, messageType, logMessage, isRawMessage = !1;
if (error) {
switch (error.code) {
case "spamblacklist":
message = cd.s("cf-error-spamblacklist", error.spamblacklist.matches[0]);
break;
case "titleblacklist":
message = cd.s("cf-error-titleblacklist");
break;
case "abusefilter-warning":
case "abusefilter-disallowed":
yield cd.g.api.loadMessagesIfMissing([ error.code ]), ({html: message} = (yield parseCode(mw.message(error.code, error.abusefilter.description).plain())) || {}),
message ? isRawMessage = !0 : message = cd.s("cf-error-abusefilter", error.abusefilter.description);
break;
case "editconflict":
message = cd.s("cf-error-editconflict"), messageType = "notice", _this7.submit();
break;
case "blocked":
message = cd.s("cf-error-blocked");
break;
case "missingtitle":
message = cd.s("cf-error-pagedeleted");
break;
default:
message = cd.s("cf-error-pagenotedited") + " " + (yield _this7.unknownApiErrorText(error.code, error.info));
}
logMessage = [ error.code, apiData ];
} else logMessage = apiData;
_this7.handleError({
type: type,
message: message,
messageType: messageType,
isRawMessage: isRawMessage,
logMessage: logMessage,
currentOperation: currentOperation
});
}
} else _this7.handleError({
type: "javascript",
logMessage: e,
currentOperation: currentOperation
});
return null;
}
return resp;
}))();
}
submit() {
var _this8 = this;
return asyncToGenerator_default()((function*() {
const isDelete = _this8.deleteCheckbox && _this8.deleteCheckbox.isSelected();
if (!(yield _this8.runChecks({
isDelete: isDelete
}))) return;
const currentOperation = {
type: "submit"
};
_this8.registerOperation(currentOperation);
const {page: page, newPageCode: newPageCode} = (yield _this8.tryPrepareNewPageCode("submit")) || {};
if (void 0 === newPageCode) return void _this8.closeOperation(currentOperation);
let watchSectionAfterGettingArticleId, keptData = {};
if (_this8.watchSectionCheckbox) if (_this8.watchSectionCheckbox.isSelected()) {
const isHeadlineAltered = classPrivateFieldGet_default()(_this8, _editingSectionOpeningComment) && _this8.headlineInput.getValue() !== _this8.originalHeadline;
if ("addSection" === _this8.mode || "addSubsection" === _this8.mode || isHeadlineAltered) {
const headline = removeWikiMarkup(_this8.headlineInput.getValue());
if (mw.config.get("wgArticleId")) {
if (Section_Section.watchSection(headline, !0), isHeadlineAltered) {
const originalHeadline = removeWikiMarkup(_this8.originalHeadline);
Section_Section.unwatchSection(originalHeadline, !0);
}
} else watchSectionAfterGettingArticleId = headline;
keptData.justWatchedSection = headline;
} else {
const section = _this8.targetSection;
section && !section.watched && (section.watch(!0), keptData.justWatchedSection = section.headline);
}
} else {
const section = _this8.targetSection;
section && section.watched && (section.unwatch(!0), keptData.justUnwatchedSection = section.headline);
}
const resp = yield _this8.tryEditPage(page, newPageCode, currentOperation);
resp && (_this8.watchCheckbox.isSelected() && $("#ca-watch").length && $("#ca-watch").attr("id", "cd-unwatch"),
!_this8.watchCheckbox.isSelected() && $("#ca-unwatch").length && $("#ca-unwatch").attr("id", "cd-watch"),
mw.config.get("wgArticleId") || (mw.config.set("wgArticleId", resp.edit.pageid),
keptData.wasPageCreated = !0, watchSectionAfterGettingArticleId && Section_Section.watchSection(watchSectionAfterGettingArticleId, !0)),
isDelete || (keptData.commentAnchor = "edit" === _this8.mode ? _this8.target.anchor : generateCommentAnchor(new Date(resp.edit.newtimestamp), cd.g.CURRENT_USER_NAME, !0)),
_this8.reloadPage(keptData, currentOperation));
}))();
}
confirmClose() {
var _this9 = this;
return asyncToGenerator_default()((function*() {
return !_this9.isAltered() || (yield confirmDestructive("cf-confirm-close"));
}))();
}
cancel(confirmClose = !0) {
var _this10 = this;
return asyncToGenerator_default()((function*() {
if (!_this10.beingCancelled && !_this10.isBeingSubmitted()) {
if (_this10.beingCancelled = !0, confirmClose && !(yield _this10.confirmClose())) return _this10.commentInput.focus(),
void (_this10.beingCancelled = !1);
_this10.destroy(), _this10.beingCancelled = !1, "reply" === _this10.mode ? _this10.target.scrollIntoView("top") : "replyInSection" === _this10.mode ? (_this10.target.$replyButton.show(),
_this10.target.$replyWrapper.removeClass("cd-replyWrapper-hasCommentForm")) : "edit" === _this10.mode && (_this10.target.$elements.removeClass("cd-hidden"),
_this10.target.scrollIntoView("top"), _this10.target.configureLayers());
}
}))();
}
destroy() {
this.operations.filter(op => !op.closed).forEach(this.closeOperation.bind(this)),
this.forget(), this.$element.remove(), this.destroyed = !0;
}
forget(removeCommentProperty = !0) {
this.target && removeCommentProperty && delete this.target[CommentForm_CommentForm.modeToProperty(this.mode) + "Form"],
cd.commentForms.includes(this) && cd.commentForms.splice(cd.commentForms.indexOf(this), 1),
"addSection" === this.mode && (cd.g.addSectionForm = null), saveSession();
}
isAltered() {
return void 0 !== this.originalComment && this.originalComment !== this.commentInput.getValue() || this.autoSummary !== this.summaryInput.getValue() || this.headlineInput && void 0 !== this.originalHeadline && this.originalHeadline !== this.headlineInput.getValue();
}
formUserName(targetComment, {genitive: genitive = !1, returnUnknown: returnUnknown = !0, callback: callback = (() => {})} = {}) {
let toUser;
if (null === targetComment.author.gender && cd.g.GENDER_AFFECTS_USER_STRING) if (targetComment.author.registered) {
if (classPrivateFieldSet_default()(this, _genderRequestCallbackList, classPrivateFieldGet_default()(this, _genderRequestCallbackList) || []),
callback && (!this.genderRequest || !classPrivateFieldGet_default()(this, _genderRequestCallbackList).includes(callback))) {
let errorCallback;
this.genderRequest || (this.genderRequest = getUserGenders([ targetComment.author ]),
errorCallback = e => {
console.warn("Couldn't find out the gender of user ".concat(targetComment.author.name, "."), e);
}), classPrivateFieldGet_default()(this, _genderRequestCallbackList).includes(callback) || (this.genderRequest.then(callback, errorCallback),
classPrivateFieldGet_default()(this, _genderRequestCallbackList).push(callback));
}
returnUnknown && (toUser = genitive ? cd.s("user-unknown-genitive") : cd.s("user-unknown-dative"));
} else toUser = genitive ? cd.s("user-unknown-genitive") : cd.s("user-unknown-dative"); else toUser = "male" === targetComment.author.gender ? genitive ? cd.s("user-male-genitive") : cd.s("user-male-dative") : "female" === targetComment.author.gender ? genitive ? cd.s("user-female-genitive") : cd.s("user-female-dative") : genitive ? cd.s("user-unknown-genitive") : cd.s("user-unknown-dative");
return void 0 === toUser ? "" : "".concat(toUser, " ").concat(targetComment.author.name).trim();
}
updateAutoSummary(set = !0, dontAutopreview = !1) {
if (this.summaryAltered) return;
classPrivateFieldSet_default()(this, _dontAutopreview, dontAutopreview);
const text = this.autoText(), section = this.headlineInput && "addSubsection" !== this.mode ? removeWikiMarkup(this.headlineInput.getValue()) : classPrivateFieldGet_default()(this, _sectionHeadline);
let optionalText;
if ([ "reply", "replyInSection" ].includes(this.mode)) {
const commentText = this.commentInput.getValue().trim().replace(/\s+/g, " ");
commentText && commentText.length <= cd.config.summaryCommentTextLengthLimit && (optionalText = ": ".concat(commentText, " (-)"));
} else if ("addSubsection" === this.mode) {
const subsection = removeWikiMarkup(this.headlineInput.getValue());
subsection && (optionalText = ": /* ".concat(subsection, " */"));
}
this.autoSummary = cd.util.buildEditSummary({
text: text,
section: section,
optionalText: optionalText,
addPostfix: !1
}), set && this.summaryInput.setValue(this.autoSummary);
}
autoText() {
const callback = this.updateAutoSummary.bind(this);
switch (this.mode) {
case "reply":
if (this.target.isOpeningSection) return cd.s("es-reply");
{
const userName = this.formUserName(this.target, {
callback: callback
});
return this.target.own ? cd.s("es-addition") : cd.s("es-reply-to", userName).replace(/ +/g, " ");
}
case "edit":
{
const editOrDeleteText = (action, topicGenitive, subsectionGenitive) => {
let object;
if (this.target.own) if (this.target.parent) if (0 === this.target.parent.level) object = cd.s("es-reply-genitive"); else {
const userName = this.formUserName(this.target.parent, {
callback: callback
});
object = this.target.parent.own ? cd.s("es-addition") : cd.s("es-reply-by-genitive", userName);
} else object = this.target.isOpeningSection ? this.target.section.level <= 2 ? cd.s("es-topic-genitive") : cd.s("es-subsection-genitive") : cd.s("es-comment-genitive"); else if (this.target.isOpeningSection) object = this.target.section.level <= 2 ? topicGenitive : subsectionGenitive; else {
const userName = this.formUserName(this.target, {
callback: callback,
genitive: !0
});
object = cd.s("es-comment-by-genitive", userName);
}
return cd.s("es-action-to", action, object);
};
return this.deleteCheckbox && this.deleteCheckbox.isSelected() ? editOrDeleteText(cd.s("es-delete"), cd.s("es-topic-genitive"), cd.s("es-subsection-genitive")) : editOrDeleteText(cd.s("es-edit"), cd.s("es-topic-openingcomment-genitive"), cd.s("es-subsection-openingcomment-genitive"));
}
case "replyInSection":
return cd.s("es-reply");
case "addSection":
{
let newTopicSummary;
if (this.$addSectionLink) {
const summary = new mw.Uri(this.$addSectionLink.attr("href")).query.summary;
newTopicSummary = summary && summary.replace(/^.+?\*\/ */, "");
}
return newTopicSummary || cd.s("es-new-topic");
}
case "addSubsection":
return cd.s("es-new-subsection");
}
}
updateFormOnDeleteCheckboxChange(selected) {
selected ? (this.initialMinorCheckboxSelected = this.minorCheckbox.isSelected(),
this.minorCheckbox.setSelected(!1), this.commentInput.setDisabled(!0), this.headlineInput && this.headlineInput.setDisabled(!0),
this.minorCheckbox.setDisabled(!0), this.smallCheckbox && this.smallCheckbox.setDisabled(!0),
this.noSignatureCheckbox && this.noSignatureCheckbox.setDisabled(!0), this.$element.addClass("cd-commentForm-disabled"),
classPrivateFieldSet_default()(this, _standardSubmitButtonLabel, cd.s("cf-delete-button")),
classPrivateFieldSet_default()(this, _shortSubmitButtonLabel, cd.s("cf-delete-button-short")),
this.submitButton.clearFlags().setFlags([ "destructive", "primary" ]).setLabel(this.$element.hasClass("cd-commentForm-short") ? classPrivateFieldGet_default()(this, _standardSubmitButtonLabel) : classPrivateFieldGet_default()(this, _shortSubmitButtonLabel))) : (this.minorCheckbox.setSelected(this.initialMinorCheckboxSelected),
this.commentInput.setDisabled(!1), this.headlineInput && this.headlineInput.setDisabled(!1),
this.minorCheckbox.setDisabled(!1), this.smallCheckbox && this.smallCheckbox.setDisabled(!1),
this.noSignatureCheckbox && this.noSignatureCheckbox.setDisabled(!1), this.$element.removeClass("cd-commentForm-disabled"),
classPrivateFieldSet_default()(this, _standardSubmitButtonLabel, cd.s("cf-save")),
classPrivateFieldSet_default()(this, _shortSubmitButtonLabel, cd.s("cf-save-short")),
this.submitButton.clearFlags().setFlags([ "progressive", "primary" ]).setLabel(this.$element.hasClass("cd-commentForm-short") ? classPrivateFieldGet_default()(this, _standardSubmitButtonLabel) : classPrivateFieldGet_default()(this, _shortSubmitButtonLabel)));
}
quote(ignoreEmptySelection = !1) {
const selectionText = isInputFocused() ? document.activeElement.value.substring(document.activeElement.selectionStart, document.activeElement.selectionEnd) : window.getSelection().toString().trim();
if (selectionText || !ignoreEmptySelection) {
const isCommentInputFocused = this.commentInput.$input.is(":focus"), range = this.commentInput.getRange(), cursorIndex = range.to, rangeStart = Math.min(range.to, range.from), rangeEnd = Math.max(range.to, range.from), value = this.commentInput.getValue(), quotePre = cd.config.quoteFormatting[0], quotePost = cd.config.quoteFormatting[1], quotation = quotePre + (selectionText || cd.s("cf-quote-placeholder")) + quotePost, newRangeStart = (isCommentInputFocused ? rangeStart : cursorIndex) + (selectionText ? quotation.length : quotePre.length), newRangeEnd = selectionText ? newRangeStart : newRangeStart + cd.s("cf-quote-placeholder").length, newValue = isCommentInputFocused ? value.slice(0, rangeStart) + quotation + value.slice(rangeEnd) : value.slice(0, cursorIndex) + quotation + value.slice(cursorIndex);
this.commentInput.setValue(newValue), this.commentInput.selectRange(newRangeStart, newRangeEnd);
}
}
static modeToProperty(mode) {
return "replyInSection" === mode ? "addReply" : mode;
}
static getLastActiveCommentForm() {
return cd.commentForms.slice().sort(lastFocused)[0] || null;
}
static getLastActiveAlteredCommentForm() {
return cd.commentForms.slice().sort(lastFocused).find(commentForm => commentForm.isAltered()) || null;
}
}
var _sectionHeadline = new WeakMap, _standardButtonsTotalWidth = new WeakMap, _standardSubmitButtonLabel = new WeakMap, _shortSubmitButtonLabel = new WeakMap, _lastPreviewTimestamp = new WeakMap, _previewTimeout = new WeakMap, _genderRequestCallbackList = new WeakMap, _dontAutopreview = new WeakMap, _editingSectionOpeningComment = new WeakMap, _headlineInputPurpose = new WeakMap;
var CommentSkeleton_parser = new WeakMap, _cachedSection = new WeakMap;
function calculateWordsOverlap(s1, s2) {
const regexp = new RegExp("[".concat(cd.g.LETTER_PATTERN, "]{3,}"), "g"), words1 = removeDuplicates(s1.match(regexp)), words2 = removeDuplicates(s2.match(regexp));
if (!words1 || !words2) return 0;
let total = words2.length, overlap = 0;
return words1.forEach(word1 => {
words2.some(word2 => word2 === word1) ? overlap++ : total++;
}), overlap / total;
}
class Comment_Comment extends class {
constructor(parser, signature) {
CommentSkeleton_parser.set(this, {
writable: !0,
value: void 0
}), _cachedSection.set(this, {
writable: !0,
value: void 0
}), classPrivateFieldSet_default()(this, CommentSkeleton_parser, parser);
let parts = classPrivateFieldGet_default()(this, CommentSkeleton_parser).collectParts(signature.element);
parts = classPrivateFieldGet_default()(this, CommentSkeleton_parser).removeNestedParts(parts),
parts = classPrivateFieldGet_default()(this, CommentSkeleton_parser).encloseInlineParts(parts, signature.element),
parts = classPrivateFieldGet_default()(this, CommentSkeleton_parser).filterParts(parts),
parts.reverse(), parts = classPrivateFieldGet_default()(this, CommentSkeleton_parser).replaceListsWithItems(parts, signature.element),
this.id = cd.comments.length, this.date = signature.date || null, this.timestamp = signature.timestampText,
this.authorName = signature.authorName, this.own = this.authorName === cd.g.CURRENT_USER_NAME,
this.anchor = signature.anchor, this.unsigned = signature.unsigned, this.parts = parts,
this.elements = this.parts.map(part => part.node);
if (this.highlightables = this.elements.filter(el => !/^H[1-6]$/.test(el.tagName) && !cd.g.UNHIGHLIGHTABLE_ELEMENTS_CLASSES.some(name => el.classList.contains(name)) && !/float: *(?:left|right)/.test(el.getAttribute("style"))),
!this.highlightables.length) throw new CdError;
if (this.addAttributes(), this.setLevels(), this.parts[0].isHeading ? (this.followsHeading = !0,
0 !== this.level && (this.parts.splice(0, 1), this.elements.splice(0, 1))) : this.followsHeading = !0,
this.parts[0].isHeading) {
this.isOpeningSection = !0;
const headingLevelMatch = this.parts[0].node.tagName.match(/^H([1-6])$/);
this.openingSectionOfLevel = headingLevelMatch && Number(headingLevelMatch[1]);
} else this.isOpeningSection = !1;
}
addAttributes() {
this.anchor && !this.elements[0].getAttribute("id") && this.elements[0].setAttribute("id", this.anchor),
this.elements[0].classList.add("cd-commentPart-first"), this.elements[this.elements.length - 1].classList.add("cd-commentPart-last"),
this.elements.forEach(el => {
el.classList.add("cd-commentPart"), el.setAttribute("data-comment-id", String(this.id));
});
}
setLevels() {
const levelElements = {};
levelElements.top = classPrivateFieldGet_default()(this, CommentSkeleton_parser).getLevelsUpTree(this.highlightables[0]),
levelElements.bottom = this.highlightables.length > 1 ? classPrivateFieldGet_default()(this, CommentSkeleton_parser).getLevelsUpTree(this.highlightables[this.highlightables.length - 1]) : levelElements.top,
this.level = Math.min(levelElements.top.length, levelElements.bottom.length);
for (let i = 0; i < this.level; i++) levelElements.top[i] && levelElements.top[i].classList.add("cd-commentLevel", "cd-commentLevel-".concat(i + 1)),
levelElements.bottom[i] && levelElements.bottom[i] !== levelElements.top[i] && levelElements.bottom[i].classList.add("cd-commentLevel", "cd-commentLevel-".concat(i + 1));
}
getSection() {
return cd.sections.slice().reverse().find(section => section.comments.includes(this)) || null;
}
get section() {
return void 0 === classPrivateFieldGet_default()(this, _cachedSection) && classPrivateFieldSet_default()(this, _cachedSection, this.getSection()),
classPrivateFieldGet_default()(this, _cachedSection);
}
get sourcePage() {
return this.section ? this.section.sourcePage : cd.g.CURRENT_PAGE;
}
} {
constructor(parser, signature) {
super(parser, signature), Comment_elementPrototypes.set(this, {
writable: !0,
value: void 0
}), _firstWidth.set(this, {
writable: !0,
value: void 0
}), _underlay.set(this, {
writable: !0,
value: void 0
}), _layersTop.set(this, {
writable: !0,
value: void 0
}), _layersLeft.set(this, {
writable: !0,
value: void 0
}), _layersWidth.set(this, {
writable: !0,
value: void 0
}), _layersHeight.set(this, {
writable: !0,
value: void 0
}), _overlay.set(this, {
writable: !0,
value: void 0
}), _overlayInnerWrapper.set(this, {
writable: !0,
value: void 0
}), _overlayContent.set(this, {
writable: !0,
value: void 0
}), _overlayGradient.set(this, {
writable: !0,
value: void 0
}), _unhighlightTimeout.set(this, {
writable: !0,
value: void 0
}), Comment_cached$elements.set(this, {
writable: !0,
value: void 0
}), _cachedCommentText.set(this, {
writable: !0,
value: void 0
}), _cachedParent.set(this, {
writable: !0,
value: void 0
}), _cachedUnderlayContainer.set(this, {
writable: !0,
value: void 0
}), classPrivateFieldSet_default()(this, Comment_elementPrototypes, cd.g.COMMENT_ELEMENT_PROTOTYPES),
this.author = userRegistry.getUser(this.authorName), delete this.authorName, this.signatureElement = signature.element,
this.timestampElement = signature.timestampElement;
const frozen = !cd.g.isPageActive || cd.g.specialElements.closedDiscussions.some(el => el.contains(this.elements[0]));
this.actionable = !frozen, this.highlightables.forEach(el => {
this.bindEvents(el);
});
}
bindEvents(el) {
el.onmouseenter = this.highlightFocused.bind(this), el.onmouseleave = this.unhighlightFocused.bind(this),
el.ontouchstart = this.highlightFocused.bind(this);
}
getPositions(config = {}) {
if (void 0 === config.considerFloating && (config.considerFloating = !1), this.positions = null,
this.editForm) return;
let rectTop = config.rectTop || this.highlightables[0].getBoundingClientRect(), rectBottom = config.rectBottom || (1 === this.elements.length ? rectTop : this.highlightables[this.highlightables.length - 1].getBoundingClientRect());
if (0 === rectTop.left) return;
const top = window.pageYOffset + rectTop.top, bottom = window.pageYOffset + rectBottom.bottom;
if (config.considerFloating) {
const intersectsFloating = (config.floatingRects || cd.g.specialElements.floating.map(el => {
const nativeRect = el.getBoundingClientRect();
return {
top: nativeRect.top - Number(el.getAttribute("data-margin-top")),
bottom: nativeRect.bottom + Number(el.getAttribute("data-margin-bottom"))
};
})).some(rect => {
const floatingTop = window.pageYOffset + rect.top, floatingBottom = window.pageYOffset + rect.bottom;
return bottom > floatingTop && bottom < floatingBottom + cd.g.REGULAR_LINE_HEIGHT;
}), initialOverflows = [];
if (intersectsFloating) for (let i = 0; i < this.elements.length; i++) initialOverflows[i] = this.elements[i].style.overflow,
this.elements[i].style.overflow = "hidden";
if (rectTop = this.highlightables[0].getBoundingClientRect(), rectBottom = 1 === this.elements.length ? rectTop : this.highlightables[this.highlightables.length - 1].getBoundingClientRect(),
intersectsFloating) for (let i = 0; i < this.elements.length; i++) this.elements[i].style.overflow = initialOverflows[i];
}
const left = window.pageXOffset + Math.min(rectTop.left, rectBottom.left), right = window.pageXOffset + Math.max(rectTop.right, rectBottom.right), downplayedBottom = bottom - top > window.innerHeight - 200 ? top + (window.innerHeight - 200) : bottom;
this.positions = {
top: top,
bottom: bottom,
left: left,
right: right,
downplayedBottom: downplayedBottom
};
}
calculateLayersPositions(config = {}) {
if (this.getPositions(Object.assign({}, config, {
considerFloating: !0
})), !this.positions) return null;
classPrivateFieldSet_default()(this, _firstWidth, this.highlightables[0].offsetWidth);
const layersContainerOffset = this.getLayersContainerOffset();
return {
underlayTop: -layersContainerOffset.top + this.positions.top,
underlayLeft: -layersContainerOffset.left + this.positions.left - cd.g.COMMENT_UNDERLAY_SIDE_MARGIN,
underlayWidth: this.positions.right - this.positions.left + 2 * cd.g.COMMENT_UNDERLAY_SIDE_MARGIN,
underlayHeight: this.positions.bottom - this.positions.top
};
}
createLayers() {
if (classPrivateFieldSet_default()(this, _underlay, classPrivateFieldGet_default()(this, Comment_elementPrototypes).underlay.cloneNode(!0)),
this.newness && classPrivateFieldGet_default()(this, _underlay).classList.add("cd-commentUnderlay-new"),
cd.settings.highlightOwnComments && this.own && classPrivateFieldGet_default()(this, _underlay).classList.add("cd-commentUnderlay-own"),
classPrivateFieldGet_default()(this, _underlay).cdTarget = this, commentLayers.underlays.push(classPrivateFieldGet_default()(this, _underlay)),
classPrivateFieldSet_default()(this, _overlay, classPrivateFieldGet_default()(this, Comment_elementPrototypes).overlay.cloneNode(!0)),
classPrivateFieldSet_default()(this, _overlayInnerWrapper, classPrivateFieldGet_default()(this, _overlay).firstChild),
classPrivateFieldGet_default()(this, _overlayInnerWrapper).oncontextmenu = e => {
e.preventDefault(), classPrivateFieldGet_default()(this, _overlay).style.display = "none";
}, classPrivateFieldSet_default()(this, _overlayGradient, classPrivateFieldGet_default()(this, _overlayInnerWrapper).firstChild),
classPrivateFieldSet_default()(this, _overlayContent, classPrivateFieldGet_default()(this, _overlayInnerWrapper).lastChild),
this.parent && (this.goToParentButton = classPrivateFieldGet_default()(this, Comment_elementPrototypes).goToParentButton.cloneNode(!0),
this.goToParentButton.firstChild.onclick = () => {
this.goToParent();
}, classPrivateFieldGet_default()(this, _overlayContent).appendChild(this.goToParentButton)),
!this.anchor || cd.g.IS_ARCHIVE_PAGE && "diff" === cd.settings.defaultCommentLinkType || (this.linkButton = classPrivateFieldGet_default()(this, Comment_elementPrototypes).linkButton.cloneNode(!0),
this.linkButton.firstChild.onclick = this.copyLink.bind(this), classPrivateFieldGet_default()(this, _overlayContent).appendChild(this.linkButton)),
this.author.registered && this.date && !this.own && !cd.g.IS_ARCHIVE_PAGE && (this.thankButton = classPrivateFieldGet_default()(this, Comment_elementPrototypes).thankButton.cloneNode(!0),
this.thankButton.firstChild.onclick = () => {
this.thank();
}, classPrivateFieldGet_default()(this, _overlayContent).appendChild(this.thankButton)),
this.actionable) (this.own || cd.settings.allowEditOthersComments) && (this.editButton = classPrivateFieldGet_default()(this, Comment_elementPrototypes).editButton.cloneNode(!0),
this.editButton.firstChild.onclick = () => {
this.edit();
}, classPrivateFieldGet_default()(this, _overlayContent).appendChild(this.editButton)),
this.replyButton = classPrivateFieldGet_default()(this, Comment_elementPrototypes).replyButton.cloneNode(!0),
this.replyButton.firstChild.onclick = () => {
this.replyForm ? this.replyForm.cancel() : this.reply();
}, classPrivateFieldGet_default()(this, _overlayContent).appendChild(this.replyButton); else {
const treeWalker = new treeWalker_ElementsTreeWalker(this.elements[this.elements.length - 1]);
for (;treeWalker.parentNode(); ) {
const backgroundColor = window.getComputedStyle(treeWalker.currentNode).backgroundColor;
if (backgroundColor.includes("rgb(")) {
this.backgroundColor = backgroundColor;
break;
}
}
}
this.$underlay = $(classPrivateFieldGet_default()(this, _underlay)), this.$overlay = $(classPrivateFieldGet_default()(this, _overlay)),
this.$overlayContent = $(classPrivateFieldGet_default()(this, _overlayContent)),
this.$overlayGradient = $(classPrivateFieldGet_default()(this, _overlayGradient));
}
configureLayers(doSet = !0, floatingRects) {
if (this.editForm) return null;
const config = {
doSet: doSet,
floatingRects: floatingRects
};
config.rectTop = this.highlightables[0].getBoundingClientRect(), config.rectBottom = 1 === this.elements.length ? config.rectTop : this.highlightables[this.highlightables.length - 1].getBoundingClientRect();
const layersContainerOffset = this.getLayersContainerOffset(), isMoved = classPrivateFieldGet_default()(this, _underlay) && (-layersContainerOffset.top + window.pageYOffset + config.rectTop.top !== classPrivateFieldGet_default()(this, _layersTop) || config.rectBottom.bottom - config.rectTop.top !== classPrivateFieldGet_default()(this, _layersHeight) || this.highlightables[0].offsetWidth !== classPrivateFieldGet_default()(this, _firstWidth));
if (!classPrivateFieldGet_default()(this, _underlay) || isMoved) {
const positions = this.calculateLayersPositions(config);
positions && (classPrivateFieldSet_default()(this, _layersTop, positions.underlayTop),
classPrivateFieldSet_default()(this, _layersLeft, positions.underlayLeft), classPrivateFieldSet_default()(this, _layersWidth, positions.underlayWidth),
classPrivateFieldSet_default()(this, _layersHeight, positions.underlayHeight));
}
return void 0 === classPrivateFieldGet_default()(this, _layersLeft) ? null : classPrivateFieldGet_default()(this, _underlay) ? (this.newness && !classPrivateFieldGet_default()(this, _underlay).classList.contains("cd-commentUnderlay-new") && classPrivateFieldGet_default()(this, _underlay).classList.add("cd-commentUnderlay-new"),
isMoved && config.doSet && this.updateLayersPositions(), isMoved) : (this.createLayers(),
config.doSet && this.addLayers(), !1);
}
addLayers() {
classPrivateFieldGet_default()(this, _underlay) && (this.updateLayersPositions(),
this.getLayersContainer().appendChild(classPrivateFieldGet_default()(this, _underlay)),
this.getLayersContainer().appendChild(classPrivateFieldGet_default()(this, _overlay)));
}
updateLayersPositions() {
classPrivateFieldGet_default()(this, _underlay).style.top = classPrivateFieldGet_default()(this, _overlay).style.top = classPrivateFieldGet_default()(this, _layersTop) + "px",
classPrivateFieldGet_default()(this, _underlay).style.left = classPrivateFieldGet_default()(this, _overlay).style.left = classPrivateFieldGet_default()(this, _layersLeft) + "px",
classPrivateFieldGet_default()(this, _underlay).style.width = classPrivateFieldGet_default()(this, _overlay).style.width = classPrivateFieldGet_default()(this, _layersWidth) + "px",
classPrivateFieldGet_default()(this, _underlay).style.height = classPrivateFieldGet_default()(this, _overlay).style.height = classPrivateFieldGet_default()(this, _layersHeight) + "px";
}
highlightFocused() {
cd.util.isPageOverlayOn() || !this.configureLayers() && classPrivateFieldGet_default()(this, _underlay) && (classPrivateFieldGet_default()(this, _underlay).classList.add("cd-commentUnderlay-focused"),
classPrivateFieldGet_default()(this, _overlay).classList.add("cd-commentOverlay-focused"));
}
unhighlightFocused() {
classPrivateFieldGet_default()(this, _underlay) && (classPrivateFieldGet_default()(this, _underlay).classList.remove("cd-commentUnderlay-focused"),
classPrivateFieldGet_default()(this, _overlay).classList.remove("cd-commentOverlay-focused"),
classPrivateFieldGet_default()(this, _overlay).style.display = "");
}
highlightTarget() {
if (this.configureLayers(), !this.$underlay) return;
const $elementsToAnimate = this.$underlay.add(this.$overlayContent).add(this.$overlayGradient).css("background-image", "none").css("background-color", "");
let initialColor = window.getComputedStyle(this.$underlay.get(0)).backgroundColor;
"rgba(0, 0, 0, 0)" === initialColor && this.backgroundColor && (initialColor = this.backgroundColor),
this.$underlay.addClass("cd-commentUnderlay-target");
const targetColor = window.getComputedStyle(this.$underlay.get(0)).backgroundColor;
this.$underlay.removeClass("cd-commentUnderlay-target"), $elementsToAnimate.stop().css("background-color", targetColor),
clearTimeout(classPrivateFieldGet_default()(this, _unhighlightTimeout)), classPrivateFieldSet_default()(this, _unhighlightTimeout, setTimeout(() => {
this.newness && (initialColor = cd.g.COMMENT_UNDERLAY_NEW_COLOR), $elementsToAnimate.animate({
backgroundColor: initialColor
}, 400, "swing", (function() {
$(this).css("background-image", "").css("background-color", "");
}));
}, 1500));
}
scrollIntoView(alignment) {
(this.editForm ? this.editForm.$element : this.$elements).cdScrollIntoView(alignment);
}
scrollToAndHighlightTarget(smooth = !0) {
(this.editForm ? this.editForm.$element : this.$elements).cdScrollTo(this.isOpeningSection || this.editForm ? "top" : "center", smooth),
this.highlightTarget();
}
replaceButton(button, replacement, buttonName) {
classPrivateFieldGet_default()(this, _overlayContent).insertBefore(replacement, button),
button.parentNode.removeChild(button), this[buttonName + "Button"] = replacement;
}
goToParent() {
if (!this.parent) return void console.error("This comment has no parent.");
this.parent.scrollToAndHighlightTarget("center");
const goToChildButton = new OO.ui.ButtonWidget({
label: cd.s("cm-gotochild"),
title: cd.s("cm-gotochild-tooltip"),
framed: !1,
classes: [ "cd-button", "cd-commentButton" ]
});
goToChildButton.on("click", () => {
this.parent.goToChild();
}), this.parent.$underlay || this.parent.configureLayers(), this.parent.goToChildButton && this.parent.goToChildButton.$element.remove(),
this.parent.$overlayContent.prepend(goToChildButton.$element), this.parent.goToChildButton = goToChildButton,
this.parent.childToScrollBackTo = this;
}
goToChild() {
this.childToScrollBackTo ? this.childToScrollBackTo.scrollToAndHighlightTarget("center") : console.error("This comment has no child from which the user has navigated earlier.");
}
copyLink(e) {
const linkButton = this.linkButton;
this.replaceButton(this.linkButton, classPrivateFieldGet_default()(this, Comment_elementPrototypes).pendingLinkButton.cloneNode(!0), "link"),
copyLink(this, e.shiftKey, () => {
this.replaceButton(this.linkButton, linkButton, "link");
});
}
findAddingEdit(singleTimestamp = !1, requestGender = !1) {
var _this = this;
return asyncToGenerator_default()((function*() {
if (singleTimestamp && _this.addingEditOneTimestamp) return _this.addingEditOneTimestamp;
if (!singleTimestamp && _this.addingEdit) return _this.addingEdit;
const rvstart = new Date(_this.date.getTime() - 2 * cd.g.MILLISECONDS_IN_A_MINUTE).toISOString(), rvend = new Date(_this.date.getTime() + 2 * cd.g.MILLISECONDS_IN_A_MINUTE).toISOString(), revisionsRequest = cd.g.api.get({
action: "query",
titles: _this.sourcePage,
prop: "revisions",
rvprop: [ "ids", "flags", "comment", "timestamp" ],
rvdir: "newer",
rvstart: rvstart,
rvend: rvend,
rvuser: _this.author.name,
rvlimit: 500,
redirects: !0,
formatversion: 2
}).catch(handleApiReject);
let [revisionsResp] = yield Promise.all([ revisionsRequest, requestGender && _this.author.registered ? getUserGenders([ _this.author ]) : void 0 ].filter(defined));
const revisions = revisionsResp && revisionsResp.query && revisionsResp.query.pages && revisionsResp.query.pages[0] && revisionsResp.query.pages[0].revisions;
if (!revisions) throw new CdError({
type: "api",
code: "noData"
});
const compareRequests = revisions.map(revision => cd.g.api.get({
action: "compare",
fromtitle: _this.sourcePage,
fromrev: revision.revid,
torelative: "prev",
prop: "diff|diffsize",
formatversion: 2
}).catch(handleApiReject)), compareData = yield Promise.all(compareRequests), regexp = /<td colspan="2" class="diff-empty"> <\/td>\s*<td class="diff-marker">\+<\/td>\s*<td class="diff-addedline"><div>(?!=)(.+?)<\/div><\/td>\s*<\/tr>/g, thisTextAndSignature = _this.getText(!1) + " ".concat(_this.signatureElement.innerText);
let bestMatch;
if (compareData.map((data, i) => {
const body = data && data.compare && data.compare.body;
if (!body) return null;
let match, text = "", bestDiffPartOverlap = 0;
for (;match = regexp.exec(body); ) {
const diffPartText = removeWikiMarkup(decodeHtmlEntities(match[1])), diffPartOverlap = calculateWordsOverlap(diffPartText, thisTextAndSignature);
diffPartOverlap > .66 && (!bestDiffPartOverlap || diffPartOverlap > bestDiffPartOverlap) && (bestDiffPartOverlap = diffPartOverlap),
text += diffPartText + "\n";
}
if (text = text.trim(), !text) return null;
revisions[i].diffBody = body;
const timestamp = new Date(revisions[i].timestamp).getTime(), thisCommentTimestamp = _this.date.getTime() + 3e4, overlap = calculateWordsOverlap(text, thisTextAndSignature), timezoneMatch = text.match(cd.g.TIMEZONE_REGEXP);
return {
revision: revisions[i],
overlap: Math.max(bestDiffPartOverlap, overlap),
dateProximity: Math.abs(thisCommentTimestamp - timestamp),
minor: revisions[i].minor,
moreThanOneTimestamp: text.includes("\n") && timezoneMatch && timezoneMatch.length > 1
};
}).filter(notNull).forEach(match => {
match.overlap < .66 || ((!bestMatch || match.overlap > bestMatch.overlap) && (bestMatch = match),
bestMatch && match.overlap === bestMatch.overlap && (match.dateProximity > bestMatch.dateProximity && (bestMatch = match),
match.dateProximity === bestMatch.dateProximity && !match.minor && bestMatch.minor && (bestMatch = match)));
}), singleTimestamp && bestMatch && bestMatch.moreThanOneTimestamp) throw new CdError({
type: "parse",
code: "moreThanOneTimestamp",
data: {
edit: bestMatch.revision
}
});
if (!bestMatch) throw new CdError({
type: "parse"
});
const result = bestMatch.revision;
return singleTimestamp ? _this.addingEditOneTimestamp = result : _this.addingEdit = result,
result;
}))();
}
getDiffLink() {
var _this2 = this;
return asyncToGenerator_default()((function*() {
const edit = yield _this2.findAddingEdit(), urlEnding = decodeURI(mw.util.getUrl(cd.g.CURRENT_PAGE, {
diff: edit.revid
}));
return "https:".concat(mw.config.get("wgServer")).concat(urlEnding);
}))();
}
thank() {
var _this3 = this;
return asyncToGenerator_default()((function*() {
const thankButton = _this3.thankButton;
_this3.replaceButton(_this3.thankButton, classPrivateFieldGet_default()(_this3, Comment_elementPrototypes).pendingThankButton.cloneNode(!0), "thank");
const thankFail = e => {
const {type: type, code: code, data: data} = e.data;
let text;
switch (type) {
case "parse":
if ("moreThanOneTimestamp" === code) {
const url = mw.util.getUrl(_this3.sourcePage, {
diff: data.edit.revid
});
return text = cd.util.wrapInElement(cd.s("thank-error-multipletimestamps", url)),
void OO.ui.alert(text);
}
{
const url = mw.util.getUrl(_this3.sourcePage, {
action: "history"
});
text = cd.s("thank-error-diffnotfound", url);
}
break;
case "api":
default:
if ("noData" === code) {
const url = mw.util.getUrl(_this3.sourcePage, {
action: "history"
});
text = cd.s("thank-error-diffnotfound", url);
} else text = cd.s("thank-error"), console.warn(e);
break;
case "network":
text = cd.s("thank-error-network");
}
mw.notify(cd.util.wrapInElement(text), {
type: "error"
}), _this3.replaceButton(_this3.thankButton, thankButton, "thank");
};
let edit;
try {
edit = yield _this3.findAddingEdit(!0, cd.g.GENDER_AFFECTS_USER_STRING);
} catch (e) {
return void thankFail(e);
}
mw.loader.load("mediawiki.diff.styles");
const url = mw.util.getUrl(_this3.sourcePage, {
diff: edit.revid
}), $question = cd.util.wrapInElement(cd.s("thank-confirm", _this3.author.name, _this3.author, url), "div"), $text = $("<div>").append($question, cd.util.wrapDiffBody(edit.diffBody));
if (yield OO.ui.confirm($text, {
size: "larger"
})) {
try {
yield cd.g.api.postWithEditToken({
action: "thank",
rev: edit.revid,
source: cd.config.scriptCodeName
}).catch(handleApiReject);
} catch (e) {
return void thankFail(e);
}
mw.notify(cd.s("thank-success")), _this3.replaceButton(_this3.thankButton, classPrivateFieldGet_default()(_this3, Comment_elementPrototypes).disabledThankButton.cloneNode(!0), "thank");
} else _this3.replaceButton(_this3.thankButton, thankButton, "thank");
}))();
}
locateInCode(pageCode) {
this.inCode = null, cd.debug.startTimer("locate comment");
const matches = this.searchInCode(pageCode);
let bestMatch;
if (matches.forEach(match => {
(match.overlap > .66 || 0 === this.id && match.previousCommentsMatched && match.headlineMatched) && (!bestMatch || match.overlap > bestMatch.overlap || !bestMatch.headlineMatched && match.headlineMatched || bestMatch.headlineMatched === match.headlineMatched && !bestMatch.previousCommentMatched && match.previousCommentMatched) && (bestMatch = match);
}), bestMatch || (bestMatch = matches.find(match => 0 !== this.id && match.previousCommentsMatched)),
!bestMatch) throw new CdError({
type: "parse",
code: "couldntLocateComment"
});
this.inCode = this.adjustCommentCodeData({
lineStartIndex: bestMatch.lineStartIndex,
startIndex: bestMatch.commentStartIndex,
endIndex: bestMatch.signatureStartIndex,
code: bestMatch.commentCode,
dirtySignature: bestMatch.dirtySignature,
indentationChars: bestMatch.indentationChars,
headingStartIndex: bestMatch.headingStartIndex,
headingLevel: bestMatch.headingLevel,
headlineCode: bestMatch.headlineCode
}), cd.debug.stopTimer("locate comment");
}
reply(dataToRestore) {
this.replyForm || (this.replyForm = dataToRestore instanceof CommentForm_CommentForm ? dataToRestore : new CommentForm_CommentForm({
mode: "reply",
target: this,
dataToRestore: dataToRestore
}));
}
edit(dataToRestore) {
this.editForm || (this.editForm = dataToRestore instanceof CommentForm_CommentForm ? dataToRestore : new CommentForm_CommentForm({
mode: "edit",
target: this,
dataToRestore: dataToRestore
})), this.$elements.addClass("cd-hidden"), this.removeLayers();
}
codeToText() {
if (!this.inCode) return void console.error("The Comment.prototype.inCode property should contain an object with the comment code data.");
let hidden, {code: code, indentationChars: indentationChars} = this.inCode;
if (void 0 === code || void 0 === indentationChars) return void console.error('No "code" or "indentationChars" property is set for Comment.prototype.inCode.');
({code: code, hidden: hidden} = hideSensitiveCode(code));
let text = code;
if (0 === this.level && (text = text.replace(/^(.*[^}|>\n\x02\x04] *)\n(?![{|<:*# \n\x01\x03])/gm, (s, m1) => m1 + (/^[:*# ]/.test(m1) || /(?:\x02|<\w+(?: [\w ]+?=[^<>]+?| ?\/?)>|<\/\w+ ?>)$/.test(m1) ? "\n" : " "))),
text = text.replace(/^(?![:*# ]).*<br[ \n]*\/?>.*$/gim, s => s.replace(/<br[ \n]*\/?>\n? */gi, () => "\n")).replace(/\n([:*#]*[:*])([ \t]*)/g, (s, m1, m2) => "\n" + (m1.length >= indentationChars.length ? m1.slice(indentationChars.length) + (m1.length > indentationChars.length ? m2 : "") : m1 + m2)),
text = unhideSensitiveCode(text, hidden), cd.config.paragraphTemplates.length) {
const pattern = cd.config.paragraphTemplates.map(caseInsensitiveFirstCharPattern).join("|"), regexp = new RegExp("^((?!:|\\*|#).*)\\{\\{(?:".concat(pattern, ")\\}\\}"), "gm");
text = text.replace(regexp, "$1\n\n");
}
return text.trim();
}
getCode() {
var _this4 = this;
return asyncToGenerator_default()((function*() {
try {
const page = yield getLastRevision(_this4.sourcePage);
_this4.locateInCode(page.code);
} catch (e) {
throw e instanceof CdError ? new CdError(Object.assign({}, {
message: cd.s("cf-error-getpagecode")
}, e.data)) : e;
}
return {
commentText: _this4.codeToText(),
headline: _this4.inCode.headlineCode
};
}))();
}
registerSeen(registerAllInDirection, highlight = !1) {
if ("unseen" === this.newness && (this.newness = "new", js_navPanel.decrementUnseenCommentCount(),
highlight && this.highlightTarget()), registerAllInDirection && !js_navPanel.areAllCommentsSeen()) {
const nextComment = cd.comments[this.id + ("forward" === registerAllInDirection ? 1 : -1)];
nextComment && nextComment.isInViewport(!0) && nextComment.registerSeen(registerAllInDirection, highlight);
}
}
isInViewport(updatePositions = !1, partially = !1) {
const viewportTop = window.pageYOffset, viewportBottom = viewportTop + window.innerHeight;
return !updatePositions && this.positions || this.getPositions(), this.positions ? partially ? this.positions.downplayedBottom > viewportTop && this.positions.top < viewportBottom : this.positions.top >= viewportTop && this.positions.downplayedBottom <= viewportBottom : null;
}
removeLayers() {
classPrivateFieldGet_default()(this, _underlay) && (commentLayers.underlays.splice(commentLayers.underlays.indexOf(classPrivateFieldGet_default()(this, _underlay)), 1),
classPrivateFieldGet_default()(this, _underlay).parentElement.removeChild(classPrivateFieldGet_default()(this, _underlay)),
classPrivateFieldSet_default()(this, _underlay, null), this.$underlay = null, classPrivateFieldGet_default()(this, _overlay).parentElement.removeChild(classPrivateFieldGet_default()(this, _overlay)),
classPrivateFieldSet_default()(this, _overlay, null), this.$overlay = null);
}
get $elements() {
return void 0 === classPrivateFieldGet_default()(this, Comment_cached$elements) && classPrivateFieldSet_default()(this, Comment_cached$elements, $(this.elements)),
classPrivateFieldGet_default()(this, Comment_cached$elements);
}
get text() {
return void 0 === classPrivateFieldGet_default()(this, _cachedCommentText) && classPrivateFieldSet_default()(this, _cachedCommentText, this.getText()),
classPrivateFieldGet_default()(this, _cachedCommentText);
}
get parent() {
return void 0 === classPrivateFieldGet_default()(this, _cachedParent) && classPrivateFieldSet_default()(this, _cachedParent, this.getParent()),
classPrivateFieldGet_default()(this, _cachedParent);
}
getParent() {
let level = this.level;
if (cd.g.specialElements.pageHasOutdents) {
const treeWalker = new treeWalker_ElementsTreeWalker(this.elements[0]);
let found;
for (;!found && treeWalker.previousNode() && !treeWalker.currentNode.classList.contains("cd-commentPart"); ) found = treeWalker.currentNode.classList.contains("outdent-template");
if (found && cd.comments[this.id - 1]) return cd.comments[this.id - 1];
}
return 0 === level ? null : cd.comments.slice(0, this.id).reverse().find(comment => comment.section === this.section && comment.level < level) || null;
}
getText(doCleanUp = !0) {
const $clone = this.$elements.not("h1, h2, h3, h4, h5, h6").clone().removeClass("cd-hidden"), $dummy = $("<div>").append($clone), selector = [ ".cd-signature", cd.config.unsignedClass ? ".".concat(cd.config.unsignedClass) : void 0 ].filter(defined).join(", ");
$dummy.find(selector).remove();
let text = $dummy.cdGetText();
return doCleanUp && (cd.config.signatureEndingRegexp && (text = text.replace(cd.config.signatureEndingRegexp, "")),
cd.config.signaturePrefixRegexp && (text = text.replace(cd.config.signaturePrefixRegexp, ""))),
text;
}
adjustCommentBeginning(commentCode, commentStartIndex) {
let indentationChars = "", lineStartIndex = commentStartIndex;
const headingMatch = commentCode.match(/(^[^]*(?:^|\n))(=+)(.*?)\2[ \t]*(?:<!--[^]*?-->[ \t]*)*\n/);
let headingStartIndex, headingLevel, headlineCode;
if (headingMatch && (headingStartIndex = commentStartIndex + headingMatch[1].length,
headingLevel = headingMatch[2].length, headlineCode = headingMatch[3].trim(), commentStartIndex += headingMatch[0].length,
commentCode = commentCode.slice(headingMatch[0].length)), cd.config.signatureEndingRegexp) {
const regexp = new RegExp(cd.config.signatureEndingRegexp.source, "m"), linesRegexp = /^(.+)\n/gm;
let line, indent;
for (;line = linesRegexp.exec(commentCode); ) if (regexp.test(removeWikiMarkup(line[1]))) {
const testIndent = line.index + line[0].length;
if (testIndent === commentCode.length) break;
indent = testIndent;
}
indent && (commentCode = commentCode.slice(indent), lineStartIndex += indent, commentStartIndex += indent);
}
if (this.level > 0) {
const replaceIndentationChars = (s, m1, m2) => (indentationChars = m2, lineStartIndex += m1.length,
commentStartIndex += s.length, ""), indentationCharsPattern = cd.config.customIndentationCharsPattern || "\\n*([:*#]*) *";
commentCode = commentCode.replace(new RegExp("^()".concat(indentationCharsPattern)), replaceIndentationChars),
"" === indentationChars && (commentCode = commentCode.replace(new RegExp("(^[^]*?(?:^|\n))".concat(indentationCharsPattern, "(?![^]*\\n[^:*#])")), replaceIndentationChars));
}
return cd.g.BAD_COMMENT_BEGINNINGS.forEach(pattern => {
"^" !== pattern.source[0] && console.debug('Regexps in cd.config.customBadCommentBeginnings should have "^" as the first character.');
const match = commentCode.match(pattern);
match && (commentStartIndex += match[0].length, commentCode = commentCode.slice(match[0].length));
}), {
commentCode: commentCode,
lineStartIndex: lineStartIndex,
commentStartIndex: commentStartIndex,
headingMatch: headingMatch,
headingStartIndex: headingStartIndex,
headingLevel: headingLevel,
headlineCode: headlineCode,
indentationChars: indentationChars
};
}
adjustCommentCodeData(originalData) {
const data = Object.assign({}, originalData), movePartToSignature = s => (data.dirtySignature = s + data.dirtySignature,
data.endIndex -= s.length, "");
this.own && cd.g.CURRENT_USER_SIGNATURE_PREFIX_REGEXP && (data.code = data.code.replace(cd.g.CURRENT_USER_SIGNATURE_PREFIX_REGEXP, movePartToSignature));
const tagRegexp = /(<(?:small|span|sup|sub)(?: [\w ]+?=[^<>]+?)?> *)+$/i;
var code;
data.code = (code = data.code, [ cd.config.signaturePrefixRegexp, tagRegexp, cd.config.signaturePrefixRegexp, tagRegexp, /<small class="autosigned">.*$/, /<!-- *Template:Unsigned.*$/, cd.config.signaturePrefixRegexp ].forEach(regexp => {
code = code.replace(regexp, movePartToSignature);
}), code);
const smallWrappers = [ {
start: /^<small>/,
end: /<\/small>[ \u00A0\t]*$/
} ];
if (cd.config.blockSmallTemplate && smallWrappers.push({
start: new RegExp("^(?:\\{\\{".concat(cd.config.blockSmallTemplate, "\\|1=)")),
end: /\}\}[ \u00A0\t]*$/
}), data.signature = data.dirtySignature, data.inSmallFont = !1, smallWrappers.some(wrapper => {
if (wrapper.start.test(data.code) && wrapper.end.test(data.signature)) return data.inSmallFont = !0,
data.code = data.code.replace(wrapper.start, ""), data.signature = data.signature.replace(wrapper.end, ""),
!0;
}), data.replyIndentationChars = data.indentationChars, !this.isOpeningSection) {
const match = data.code.match(/\n([:*#]*[:*]).*$/);
if (match && (data.replyIndentationChars = match[1], data.replyIndentationChars.length < data.indentationChars.length)) {
const prefix = data.indentationChars.slice(data.replyIndentationChars.length) + " ";
data.code = prefix + data.code, data.indentationChars = data.indentationChars.slice(0, data.replyIndentationChars.length),
data.startIndex -= prefix.length;
}
}
return data.replyIndentationChars += cd.config.defaultIndentationChar, data;
}
searchInCode(pageCode) {
const signatures = extractSignatures(pageCode), matches = signatures.filter(sig => sig.author === this.author && (this.timestamp === sig.timestamp || this.timestamp && this.timestamp.startsWith(sig.timestamp)));
const previousComments = cd.comments.slice(Math.max(0, this.id - 2), this.id).reverse();
return matches.forEach(match => {
if (match.commentCode = pageCode.slice(match.commentStartIndex, match.signatureStartIndex),
previousComments.length) for (let i = 0; i < previousComments.length; i++) {
const signature = signatures[match.id - 1 - i];
if (match.previousCommentsMatched = signature && signature.timestamp === previousComments[i].timestamp && signature.author === previousComments[i].author,
0 === i && (match.previousCommentMatched = match.previousCommentsMatched), !match.previousCommentsMatched) break;
} else match.previousCommentsMatched = 0 === match.id, match.previousCommentMatched = 0 === match.id;
Object.assign(match, this.adjustCommentBeginning(match.commentCode, match.commentStartIndex)),
match.headlineMatched = this.followsHeading ? match.headingMatch && this.section && this.section.headline && normalizeCode(removeWikiMarkup(match.headlineCode)) === normalizeCode(this.section.headline) : !match.headingMatch;
const commentCodeToCompare = removeWikiMarkup(match.commentCode);
match.overlap = calculateWordsOverlap(this.text, commentCodeToCompare);
}), matches;
}
getLayersContainer() {
if (void 0 === classPrivateFieldGet_default()(this, _cachedUnderlayContainer)) {
let offsetParent;
const treeWalker = new TreeWalker(document.body, null, !0, this.elements[0]);
for (;treeWalker.parentNode(); ) {
let style = treeWalker.currentNode.cdStyle;
if (style || (style = window.getComputedStyle(treeWalker.currentNode), treeWalker.currentNode.cdStyle = style),
[ "absolute", "relative" ].includes(style.position)) {
offsetParent = treeWalker.currentNode;
break;
}
if (style.backgroundColor.includes("rgb(")) {
offsetParent = treeWalker.currentNode, offsetParent.classList.add("cd-commentLayersContainerParent");
break;
}
}
offsetParent || (offsetParent = document.body);
let container = offsetParent.firstElementChild;
container.classList.contains("cd-commentLayersContainer") || (container = document.createElement("div"),
container.classList.add("cd-commentLayersContainer"), offsetParent.insertBefore(container, offsetParent.firstChild)),
classPrivateFieldSet_default()(this, _cachedUnderlayContainer, container), commentLayers.layersContainers.includes(container) || commentLayers.layersContainers.push(container);
}
return classPrivateFieldGet_default()(this, _cachedUnderlayContainer);
}
getLayersContainerOffset() {
let offsetParent, el = this.getLayersContainer(), top = 0, left = 0;
for (;offsetParent = el.offsetParent; ) top += offsetParent.offsetTop, left += offsetParent.offsetLeft,
el = offsetParent;
return {
top: top,
left: left
};
}
static findInViewport(findClosestDirection) {
const viewportTop = window.pageYOffset, viewportBottom = viewportTop + window.innerHeight, isVisible = comment => (comment.getPositions(),
comment.positions), findVisible = (direction, startIndex = 0) => reorderArray(cd.comments, startIndex, "backward" === direction).find(isVisible) || null, firstVisibleComment = findVisible("forward"), lastVisibleComment = findVisible("backward", cd.comments.length - 1);
if (!firstVisibleComment) return null;
let foundComment, searchArea = {
top: firstVisibleComment,
bottom: lastVisibleComment
}, currentComment = searchArea.top;
const findClosest = (direction, searchArea, reverse = !1) => "forward" === direction ? findVisible(direction, reverse ? searchArea.top.id : searchArea.bottom.id) : "backward" === direction ? findVisible(direction, reverse ? searchArea.bottom.id : searchArea.top.id) : null;
for (let i = 0; i < cd.comments.length; i++) {
if (currentComment.isInViewport(!0)) {
foundComment = currentComment;
break;
}
if (currentComment.positions && currentComment === firstVisibleComment && viewportBottom < currentComment.positions.downplayedBottom || currentComment === lastVisibleComment && viewportTop > currentComment.positions.top) {
foundComment = findClosest(findClosestDirection, searchArea, !0);
break;
}
if (searchArea.top === searchArea.bottom) {
foundComment = findClosest(findClosestDirection, searchArea);
break;
}
if (currentComment.positions) if (currentComment === firstVisibleComment) currentComment = searchArea.bottom; else {
if (searchArea[viewportTop > currentComment.positions.top ? "top" : "bottom"] = currentComment,
searchArea.bottom.id - searchArea.top.id <= 1) {
foundComment = findClosest(findClosestDirection, searchArea);
break;
}
const higherTop = searchArea.top.positions.top, proportion = (viewportTop - higherTop) / (searchArea.bottom.positions.downplayedBottom - viewportBottom + (viewportTop - higherTop));
(proportion < 0 || proportion >= 1) && console.warn("The proportion shouldn't be more than 0 or less or equal to 1.", "proportion", proportion, "searchArea", searchArea),
currentComment = cd.comments[Math.round((searchArea.bottom.id - searchArea.top.id - 1) * proportion + searchArea.top.id + .5)];
} else currentComment = cd.comments[searchArea.top.id + 1], searchArea.top = currentComment;
}
return foundComment || null;
}
static getCommentByAnchor(anchor) {
return cd.comments && anchor && cd.comments.find(comment => comment.anchor === anchor) || null;
}
}
var Comment_elementPrototypes = new WeakMap, _firstWidth = new WeakMap, _underlay = new WeakMap, _layersTop = new WeakMap, _layersLeft = new WeakMap, _layersWidth = new WeakMap, _layersHeight = new WeakMap, _overlay = new WeakMap, _overlayInnerWrapper = new WeakMap, _overlayContent = new WeakMap, _overlayGradient = new WeakMap, _unhighlightTimeout = new WeakMap, Comment_cached$elements = new WeakMap, _cachedCommentText = new WeakMap, _cachedParent = new WeakMap, _cachedUnderlayContainer = new WeakMap, worker = __webpack_require__(9), worker_default = __webpack_require__.n(worker);
let colonMoved, goToCommentToYou, goToCommentWatchedSection, currentUserRegexp, $wrapperRegularPrototype, $wrapperInterestingPrototype, commentLinks_watchedSections, commentLinks_thisPageWatchedSections, switchInterestingButton, processDiffFirstRun = !0;
function commentLinks_prepare(_x) {
return js_commentLinks_prepare.apply(this, arguments);
}
function js_commentLinks_prepare() {
return (js_commentLinks_prepare = asyncToGenerator_default()((function*({messagesRequest: messagesRequest}) {
cd.g.api = cd.g.api || new mw.Api;
const watchedSectionsRequest = getWatchedSections(!0).catch(e => {
console.warn("Couldn't load the settings from the server.", e);
});
let watchedSectionsResult;
messagesRequest = messagesRequest || loadMessages();
try {
[watchedSectionsResult] = yield Promise.all([ watchedSectionsRequest, messagesRequest ]);
} catch (e) {
throw [ "Couldn't load the messages required for the script.", e ];
}
({watchedSections: commentLinks_watchedSections, thisPageWatchedSections: commentLinks_thisPageWatchedSections} = watchedSectionsResult || {}),
initTimestampParsingTools(), cd.g.nanoCss = Object(nano_css.create)(), cd.g.nanoCss.put(".cd-commentLink-innerWrapper", {
"::before": {
content: '"'.concat(mw.msg("parentheses-start"), '"')
},
"::after": {
content: '"'.concat(mw.msg("parentheses-end"), '"')
}
}), cd.g.QQX_MODE = "qqx" === mw.util.getParamValue("uselang"), colonMoved = ": ".concat(cd.s("es-move")),
goToCommentToYou = "".concat(cd.s("lp-comment-tooltip"), " ").concat(mw.msg("parentheses", cd.s("lp-comment-toyou"))),
goToCommentWatchedSection = "".concat(cd.s("lp-comment-tooltip"), " ").concat(mw.msg("parentheses", cd.s("lp-comment-watchedsection")));
const $aRegularPrototype = $("<a>").text(cd.s("lp-comment")).attr("title", cd.s("lp-comment-tooltip")), $spanRegularPrototype = $("<span>").addClass("cd-commentLink-innerWrapper").append($aRegularPrototype);
$wrapperRegularPrototype = $("<span>").addClass("cd-commentLink").append($spanRegularPrototype)[cd.g.IS_DIFF_PAGE ? "append" : "prepend"](document.createTextNode(" ")),
$wrapperInterestingPrototype = $wrapperRegularPrototype.clone().addClass("cd-commentLink-interesting");
const currentUserNamePattern = caseInsensitiveFirstCharPattern(cd.g.CURRENT_USER_NAME).replace(/ /g, "[ _]");
currentUserRegexp = new RegExp("(?:^|[^".concat(cd.g.LETTER_PATTERN, "])").concat(currentUserNamePattern, "(?![").concat(cd.g.LETTER_PATTERN, "])"));
}))).apply(this, arguments);
}
function addWatchlistMenu() {
mw.hook("wikipage.content").add(() => {
switchInterestingButton && switchInterestingButton.setFlags({
progressive: !1
});
});
const $menu = $("<fieldset>").addClass("cd-watchlistMenu"), $legend = $("<legend>").addClass("cd-watchlistMenu-legend").appendTo($menu);
$("<a>").attr("href", mw.util.getUrl(cd.config.helpWikilink)).html(cd.s("script-name-short")).appendTo($legend),
switchInterestingButton = new OO.ui.ButtonWidget({
framed: !1,
icon: "speechBubble",
label: cd.s("wl-button-switchinteresting-tooltip"),
invisibleLabel: !0,
title: cd.s("wl-button-switchinteresting-tooltip"),
classes: [ "cd-watchlistMenu-button", "cd-watchlistMenu-button-switchInteresting" ],
disabled: !commentLinks_watchedSections
}), switchInterestingButton.on("click", () => {
!function() {
const isEnhanced = !$(".mw-changeslist").find("ul.special").length, $collapsibles = cd.g.$content.find(".mw-changeslist .mw-collapsible:not(.mw-changeslist-legend)"), $lines = cd.g.$content.find(".mw-changeslist-line:not(.mw-collapsible)");
switchInterestingButton.hasFlag("progressive") ? (isEnhanced ? $lines.filter("table").show() : $lines.not(":has(.cd-commentLink-interesting)").show(),
$collapsibles.not(":has(.cd-commentLink-interesting)").find(".mw-rcfilters-ui-highlights-enhanced-toplevel").show(),
$collapsibles.not(".mw-collapsed").find(".mw-enhancedchanges-arrow").click()) : ($collapsibles.not(".mw-collapsed").find(".mw-enhancedchanges-arrow").click(),
$collapsibles.has(".cd-commentLink-interesting").find(".mw-enhancedchanges-arrow").click(),
$collapsibles.not(":has(.cd-commentLink-interesting)").find(".mw-rcfilters-ui-highlights-enhanced-toplevel").hide(),
$lines.not(":has(.cd-commentLink-interesting)").hide()), switchInterestingButton.setFlags({
progressive: !switchInterestingButton.hasFlag("progressive")
});
}();
}), switchInterestingButton.$element.appendTo($menu);
const editWatchedSectionsButton = new OO.ui.ButtonWidget({
framed: !1,
icon: "listBullet",
label: cd.s("wl-button-editwatchedsections-tooltip"),
invisibleLabel: !0,
title: cd.s("wl-button-editwatchedsections-tooltip"),
classes: [ "cd-watchlistMenu-button", "cd-watchlistMenu-button-editWatchedSections" ]
});
editWatchedSectionsButton.on("click", editWatchedSections), editWatchedSectionsButton.$element.appendTo($menu);
const scriptSettingsButton = new OO.ui.ButtonWidget({
framed: !1,
icon: "settings",
label: cd.s("wl-button-scriptsettings-tooltip"),
invisibleLabel: !0,
title: cd.s("wl-button-scriptsettings-tooltip"),
classes: [ "cd-watchlistMenu-button", "cd-watchlistMenu-button-scriptSettings" ]
});
scriptSettingsButton.on("click", () => {
settingsDialog();
}), scriptSettingsButton.$element.appendTo($menu), cd.g.$content.find(".mw-rcfilters-ui-changesLimitAndDateButtonWidget").prepend($menu),
cd.g.$content.find("#mw-watchlist-options .mw-changeslist-legend").after($menu);
}
function extractAuthor(line) {
const authorElement = line.querySelector(".mw-userlink");
if (!authorElement) return null;
let author = authorElement.textContent;
return "MediaWiki message delivery" === author ? null : (mw.util.isIPv6Address(author) && (author = author.toUpperCase()),
author);
}
function processWatchlist($content) {
"Watchlist" !== mw.config.get("wgCanonicalSpecialPageName") || cd.g.$content.find(".cd-watchlistMenu").length || (initSettings(),
mw.user.options.get("wlenhancedfilters-disable") ? addWatchlistMenu() : mw.hook("structuredChangeFilters.ui.initialized").add(() => {
addWatchlistMenu();
}), $(".mw-rcfilters-ui-filterWrapperWidget-showNewChanges a").on("click", asyncToGenerator_default()((function*() {
try {
({watchedSections: commentLinks_watchedSections} = yield getWatchedSections());
} catch (e) {
console.warn("Couldn't load the settings from the server.", e);
}
})))), $content.get(0).querySelectorAll(".mw-changeslist-line:not(.mw-collapsible)").forEach(line => {
const nsMatch = line.className.match(/mw-changeslist-ns(\d+)/), nsNumber = nsMatch && Number(nsMatch[1]);
if (null === nsNumber) return;
const linkElement = ("TR" === line.tagName ? line.parentElement : line).querySelector(".mw-changeslist-title");
if (!linkElement) return;
if (!isProbablyTalkPage(linkElement.textContent, nsNumber)) return;
if (line.querySelector(".minoredit")) return;
const summaryElement = line.querySelector(".comment"), summary = summaryElement && summaryElement.textContent;
if (summary && (isCommentEdit(summary) || isUndo(summary) || summary.includes(colonMoved))) return;
const bytesAddedElement = line.querySelector(".mw-plusminus-pos");
if (!bytesAddedElement) return;
if ("STRONG" !== bytesAddedElement.tagName) {
const bytesAddedMatch = bytesAddedElement.textContent.match(/\d+/), bytesAdded = bytesAddedMatch && Number(bytesAddedMatch[0]);
if (!bytesAdded || bytesAdded < cd.config.bytesToDeemComment) return;
}
let timestamp = line.getAttribute("data-mw-ts");
if (timestamp = timestamp && timestamp.slice(0, 12), !timestamp) return;
const author = extractAuthor(line);
if (!author) return;
const anchor = timestamp + "_" + spacesToUnderlines(author), link = linkElement.href;
if (!link) return;
let wrapper;
if (summary && currentUserRegexp.test(" ".concat(summary, " "))) wrapper = $wrapperInterestingPrototype.get(0).cloneNode(!0),
wrapper.lastChild.lastChild.title = goToCommentToYou; else {
let watched = !1;
if (summary) {
const curLink = line.querySelector(".mw-changeslist-diff-cur") || line.querySelector(".mw-changeslist-history"), curIdMatch = curLink && curLink.href && curLink.href.match(/[&?]curid=(\d+)/), curId = curIdMatch && Number(curIdMatch[1]);
if (curId) {
const thisPageWatchedSections = commentLinks_watchedSections && commentLinks_watchedSections[curId] || [];
if (thisPageWatchedSections.length) {
for (let j = 0; j < thisPageWatchedSections.length; j++) if (summary.includes("\u2192\u200e" + thisPageWatchedSections[j])) {
watched = !0;
break;
}
watched && (wrapper = $wrapperInterestingPrototype.get(0).cloneNode(!0), wrapper.lastChild.lastChild.title = goToCommentWatchedSection);
}
}
}
watched || (wrapper = $wrapperRegularPrototype.get(0).cloneNode(!0));
}
wrapper.lastChild.lastChild.href = "".concat(link, "#").concat(anchor);
const destination = line.querySelector(".mw-usertoollinks");
destination && destination.parentElement.insertBefore(wrapper, destination.nextSibling);
});
}
function processContributions($content) {
const timezone = mw.user.options.get("timecorrection"), timezoneParts = timezone && timezone.split("|"), timezoneOffset = timezoneParts && Number(timezoneParts[1]);
if (null == timezoneOffset || isNaN(timezoneOffset)) return;
const list = $content.get(0).querySelector(".mw-contributions-list");
Array.from(list.children).forEach(line => {
const linkElement = line.querySelector(".mw-contributions-title");
if (!linkElement) return;
if (!isProbablyTalkPage(linkElement.textContent)) return;
const link = linkElement.href;
if (!link) return;
if (line.querySelector(".minoredit")) return;
const summaryElement = line.querySelector(".comment"), summary = summaryElement && summaryElement.textContent;
if (summary && (isCommentEdit(summary) || isUndo(summary) || summary.includes(colonMoved))) return;
const bytesAddedElement = line.querySelector(".mw-plusminus-pos");
if (!bytesAddedElement) return;
if ("STRONG" !== bytesAddedElement.tagName) {
const bytesAddedMatch = bytesAddedElement.textContent.match(/\d+/), bytesAdded = bytesAddedMatch && Number(bytesAddedMatch[0]);
if (!bytesAdded || bytesAdded < cd.config.bytesToDeemComment) return;
}
const dateElement = line.querySelector(".mw-changeslist-date");
if (!dateElement) return;
const {date: date} = parseTimestamp(dateElement.textContent, timezoneOffset) || {};
if (!date) return;
const anchor = generateCommentAnchor(date, mw.config.get("wgRelevantUserName"));
let wrapper;
summary && currentUserRegexp.test(" ".concat(summary, " ")) ? (wrapper = $wrapperInterestingPrototype.get(0).cloneNode(!0),
wrapper.lastChild.lastChild.title = goToCommentToYou) : wrapper = $wrapperRegularPrototype.get(0).cloneNode(!0),
wrapper.lastChild.lastChild.href = "".concat(link, "#").concat(anchor), linkElement.nextSibling && (linkElement.nextSibling.textContent = linkElement.nextSibling.textContent.replace(/^\s/, "")),
linkElement.parentElement.insertBefore(wrapper, linkElement.nextSibling);
});
}
function processHistory($content) {
const timezone = mw.user.options.get("timecorrection"), timezoneParts = timezone && timezone.split("|"), timezoneOffset = timezoneParts && Number(timezoneParts[1]);
if (null == timezoneOffset || isNaN(timezoneOffset)) return;
const list = $content.get(0).querySelector("#pagehistory"), lines = Array.from(list.children), link = mw.util.getUrl(cd.g.CURRENT_PAGE);
lines.forEach(line => {
if (line.querySelector(".minoredit")) return;
const summaryElement = line.querySelector(".comment"), summary = summaryElement && summaryElement.textContent;
if (summary && (isCommentEdit(summary) || isUndo(summary) || summary.includes(colonMoved))) return;
const bytesAddedElement = line.querySelector(".mw-plusminus-pos");
if (!bytesAddedElement) return;
if ("STRONG" !== bytesAddedElement.tagName) {
const bytesAddedMatch = bytesAddedElement.textContent.match(/\d+/), bytesAdded = bytesAddedMatch && Number(bytesAddedMatch[0]);
if (!bytesAdded || bytesAdded < cd.config.bytesToDeemComment) return;
}
const dateElement = line.querySelector(".mw-changeslist-date");
if (!dateElement) return;
const {date: date} = parseTimestamp(dateElement.textContent, timezoneOffset) || {};
if (!date) return;
const author = extractAuthor(line);
if (!author) return;
const anchor = generateCommentAnchor(date, author);
let wrapper;
if (summary && currentUserRegexp.test(" ".concat(summary, " "))) wrapper = $wrapperInterestingPrototype.get(0).cloneNode(!0),
wrapper.lastChild.lastChild.title = goToCommentToYou; else {
let watched = !1;
if (summary) {
const thisPageWatchedSections = commentLinks_watchedSections && commentLinks_watchedSections[mw.config.get("wgArticleId")] || [];
if (thisPageWatchedSections.length) {
for (let j = 0; j < thisPageWatchedSections.length; j++) if (summary.includes("\u2192\u200e" + thisPageWatchedSections[j])) {
watched = !0;
break;
}
watched && (wrapper = $wrapperInterestingPrototype.get(0).cloneNode(!0), wrapper.lastChild.lastChild.title = goToCommentWatchedSection);
}
}
watched || (wrapper = $wrapperRegularPrototype.get(0).cloneNode(!0));
}
wrapper.lastChild.lastChild.href = "".concat(link, "#").concat(anchor);
const separators = line.querySelectorAll(".mw-changeslist-separator"), destination = separators && separators[separators.length - 1];
destination && destination.parentElement.insertBefore(wrapper, destination.nextSibling);
});
}
function processDiff() {
return _processDiff.apply(this, arguments);
}
function _processDiff() {
return (_processDiff = asyncToGenerator_default()((function*() {
if (!processDiffFirstRun) return;
const timezone = mw.user.options.get("timecorrection"), timezoneParts = timezone && timezone.split("|"), timezoneOffset = timezoneParts && Number(timezoneParts[1]);
null == timezoneOffset || isNaN(timezoneOffset) || ([ document.querySelector(".diff-otitle"), document.querySelector(".diff-ntitle") ].filter(notNull).forEach(area => {
if (area.querySelector(".minoredit")) return;
const summaryElement = area.querySelector(".comment"), summary = summaryElement && summaryElement.textContent;
if (summary && (isCommentEdit(summary) || isUndo(summary) || summary.includes(colonMoved) || summary.includes("Archiving"))) return;
const dateElement = area.querySelector("#mw-diff-otitle1 a, #mw-diff-ntitle1 a");
if (!dateElement) return;
const {date: date} = parseTimestamp(dateElement.textContent, timezoneOffset) || {};
if (!date) return;
const author = extractAuthor(area);
if (!author) return;
const anchor = generateCommentAnchor(date, author);
let comment = Comment_Comment.getCommentByAnchor(anchor);
if (!comment) {
let commentAnchorToCheck;
for (let gap = 1; !comment && gap <= 5; gap++) {
commentAnchorToCheck = generateCommentAnchor(new Date(date.getTime() - cd.g.MILLISECONDS_IN_A_MINUTE * gap), author),
comment = Comment_Comment.getCommentByAnchor(commentAnchorToCheck);
}
}
if (comment) {
let wrapper;
if (summary && currentUserRegexp.test(" ".concat(summary, " "))) wrapper = $wrapperInterestingPrototype.get(0).cloneNode(!0),
wrapper.firstChild.lastChild.title = goToCommentToYou; else {
let watched = !1;
if (summary && commentLinks_thisPageWatchedSections.length) {
for (let j = 0; j < commentLinks_thisPageWatchedSections.length; j++) if (summary.includes("\u2192\u200e" + commentLinks_thisPageWatchedSections[j])) {
watched = !0;
break;
}
watched && (wrapper = $wrapperInterestingPrototype.get(0).cloneNode(!0), wrapper.firstChild.lastChild.title = goToCommentWatchedSection);
}
watched || (wrapper = $wrapperRegularPrototype.get(0).cloneNode(!0));
}
wrapper.firstChild.lastChild.href = "#".concat(anchor), wrapper.onclick = function(e) {
e.preventDefault(), comment.scrollToAndHighlightTarget(!1);
};
const destination = area.querySelector("#mw-diff-otitle3, #mw-diff-ntitle3");
if (!destination) return;
destination.insertBefore(wrapper, destination.firstChild);
}
}), mw.hook("convenientDiscussions.commentLinksCreated").fire(cd), processDiffFirstRun = !1);
}))).apply(this, arguments);
}
function addCommentLinks(_x2) {
return _addCommentLinks.apply(this, arguments);
}
function _addCommentLinks() {
return (_addCommentLinks = asyncToGenerator_default()((function*($content) {
$content.parent().length && ([ "Recentchanges", "Watchlist" ].includes(mw.config.get("wgCanonicalSpecialPageName")) ? processWatchlist($content) : "Contributions" === mw.config.get("wgCanonicalSpecialPageName") ? processContributions($content) : "history" === mw.config.get("wgAction") && isProbablyTalkPage(cd.g.CURRENT_PAGE, cd.g.CURRENT_NAMESPACE_NUMBER) && processHistory($content),
mw.hook("convenientDiscussions.commentLinksCreated").fire(cd));
}))).apply(this, arguments);
}
function _commentLinks() {
return (_commentLinks = asyncToGenerator_default()((function*({messagesRequest: messagesRequest}) {
try {
yield commentLinks_prepare({
messagesRequest: messagesRequest
});
} catch (e) {
return void console.warn(...e);
}
cd.g.IS_DIFF_PAGE ? mw.hook("convenientDiscussions.pageReady").add(processDiff) : mw.hook("wikipage.content").add(addCommentLinks);
}))).apply(this, arguments);
}
var debug = {
init() {
this.timerTotal = {}, this.timerStartTimestamps = {}, this.timerRunCount = {}, this.timerAllRunsTotal = {},
this.initCounters(), this.array = [], this.object = {};
},
initCounters() {
this.counters = "undefined" == typeof Proxy ? {} : new Proxy({}, {
get: (obj, prop) => prop in obj ? obj[prop] : 0
});
},
startTimer(label) {
this.timerStartTimestamps[label] = Date.now();
},
stopTimer(label) {
if (void 0 === this.timerStartTimestamps[label]) return;
void 0 === this.timerTotal[label] && (this.timerTotal[label] = 0);
const thisTime = Date.now() - this.timerStartTimestamps[label];
this.timerTotal[label] += thisTime, delete this.timerStartTimestamps[label], void 0 === this.timerAllRunsTotal[label] && (this.timerAllRunsTotal[label] = 0,
this.timerRunCount[label] = 0), this.timerAllRunsTotal[label] += thisTime, this.timerRunCount[label]++;
},
resetTimer(label) {
void 0 !== this.timerStartTimestamps[label] && this.stopTimer(label), delete this.timerTotal[label];
},
fullResetTimer(label) {
this.resetTimer(label), delete this.timerAllRunsTotal[label], delete this.timerRunCount[label];
},
logAndResetTimer(label) {
void 0 !== this.timerStartTimestamps[label] && this.stopTimer(label), void 0 !== this.timerTotal[label] && (console.debug("".concat(label, ": ").concat(this.timerTotal[label])),
this.resetTimer(label));
},
logAndResetEverything(sort) {
const timerLabels = Object.keys(this.timerTotal);
sort && timerLabels.sort(), timerLabels.forEach(label => {
this.logAndResetTimer(label);
});
const counterLabels = Object.keys(this.counters);
sort && counterLabels.sort(), counterLabels.forEach(label => {
console.debug("counter ".concat(label, ": ").concat(this.counters[label]));
}), this.initCounters(), this.array.length && (console.debug("array: ", this.array),
this.array = []), Object.keys(this.object).length && (console.debug("object: ", this.object),
this.object = {});
},
averageTimerTime(label) {
if (!this.timerAllRunsTotal[label]) return void console.error("No data for timer ".concat(label));
const average = this.timerAllRunsTotal[label] / this.timerRunCount[label];
console.debug("".concat(label, ": ").concat(average.toFixed(1), " average for ").concat(this.timerRunCount[label], " runs"));
},
incrementCounter(label) {
this.counters[label]++;
}
}, defaultConfig = {
messages: {},
contribsPage: null,
localTimezoneOffset: null,
customTalkNamespaces: null,
pageWhiteListRegexp: null,
pageBlackListRegexp: null,
archivePathRegexp: null,
pagesWithoutArchivesRegexp: null,
idleFragments: [],
defaultIndentationChar: ":",
spaceAfterIndentationChar: !0,
signaturePrefixRegexp: /(?:\s+>+)?(?:\xb7|-|\u2013|\u2014|~|\/|\u2192|\u21d2|\s|—|–|→|·| | )*'*$/,
signatureEndingRegexp: null,
tagName: null,
scriptCodeName: "convenient-discussions",
optionsPrefix: "convenientDiscussions",
helpWikilink: "mw:User:JWBTH/CD",
unsignedTemplates: [],
unsignedClass: "autosigned",
pairQuoteTemplates: [],
blockSmallTemplate: null,
paragraphTemplates: [],
pingTemplate: "ping",
quoteFormatting: [ "> ''", "''\n" ],
elementsToExcludeClasses: [],
templatesToExclude: [],
commentAntipatterns: [],
customBadCommentBeginnings: [],
keepInSectionEnding: [ /\n+(?:<!--[^]*?-->\s*)+$/ ],
signatureScanLimit: 80,
foreignElementsInHeadlinesClasses: [],
customFloatingElementsSelectors: [],
closedDiscussionsClasses: [],
customUnhighlightableElementsClasses: [],
customAddTopicLinkSelectors: [],
defaultInsertButtons: [ [ "{{ping|+}}" ], [ "{{tl|+}}" ], [ "{{+}}" ], [ "[[+]]" ], [ "<+></>", "</>" ], [ "<blockquote>+</blockquote>", "<blockquote />" ], [ "<code>+</code>", "<code />" ], [ "<nowiki>+</nowiki>", "<nowiki />" ], [ '<syntaxhighlight lang="+"></syntaxhighlight>', "<syntaxhighlight />" ], [ "<small>+</small>", "<small />" ] ],
logoDataUrl: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUQAAAAoCAYAAACGq4NTAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAT10lEQVR42u2deXwURdrHvz1JSEIiYAiEcClXQEFFPAAVJeAtgrd4rYIrnoDvrqKsimE55N3Xa5WFdfF2d1UQxINVWRRkBaMcwSiKHC+CEIgJhCMhIVfvH/U0qdT0TCaTGQkf+vf55CN9TPdTVU/96rmqtQBysx46t2mr5W8lpOS08cUWW4QIG5gfC1/EEjISwT6uig0d4MqRV/A9Hjx48NBI4Bt7u31uecUxi5q2/k96fcgQwAKuqISzK0P/TSlY62LIWGmxZtZsOnlD4MGDh0ZDiF1KeKsw95G4/NwJYT3AAq6sJykCFPmI+6UJf/eGwIMHD42GEI8rpQ1A/pqJ5Oc+1iBSPKeqfr8r9HGKNwQePHhoNIQYX80hNzl/zR/Jz300bFK8ogLOrgcpVkCcNwRHJCygB3Cc1xW1EA+cAhzrdQUAzYHeQMKRIrBfOiR/zSQA0k6eDMDBfRll5SUddia2+KF9bGJebJ2WYrnFMSRt35RQXLXFR4dyG6uRtPUY4DLgYqAzkALsAbYCnwLvAYWeDoekM+8CQ+R4OjD6CG1LS2BmkOvFwC/AOuATYEeQezsCi0W3SoERwNtHsZ5cBrwFJAM/AxcBPzT6lf7jy23b7UKbUx8lMWX1D3l7+p6cmZVVuTwrK6VN+vzNCSlrmgV74O6Nd0zvNX7WaICX3iNzmcWnpZY7Kba0KZ8+lPhfwZoZDTwKtKpD+Z8GJivj1UMAXAnMM871AXIOs1zpQCKwF9gV4m/ay2QNBTbwETABWOVy/S/APdpxIdBafnc04gfxIhzMAa5r9C5zoAs7cyaTvel3N2VmZVUCnJWVtbuksN/zwR52cH+XcocMAW4fxuLONrmHsX0JwGzgz3WQIbKSTZBVzUNgNHU5l3SYZboayAM2AY9EcWG9FPgKeEiOg/VLYrD5dRTqSdMj0mXWkV16fq2IYDVW8AG2fX6rYacDrUrXJhcE/dlf5zHs8zjmAyTZVHeo5seOlQwbcQ0bGti+mcA1Luc3AFvEbT6J2rFML/MdHPOBb6XfEFfyy8Ms06URfNZnmoWZBHQHumjXY4BpQBNgknb+OeAqoJlYhZOAqqNYT6YCM2RROAD86UgQOijBdSrlH1nYPoCVWVmpyanZ9wa7P77Zhvi1U0Y96RyvnjBu8IDqyr5n1UMtSix862I4YXUTvn3jY9Ib6NrdZpz7BjgdyAAuAE4TV+v/gHLgSVR8zEOQIQL6Sv9eJGR0uCf+gAg+6xFx7a5DxcG6Av2B74z7soBM7TgHOAEYLiGE/z3K9eQFVELlBllUlh7xFuLJ++i141qKn4qz86oqprRNTMlJrOuBLTJe/P2Gmf1utSsTypqmzmjniy22rqpQS+aXMaELVmgRv72U14W4wsHjxvFPosBFxvldwDjgD0BlkH7qJ1ZRM4kPrRKCdYsRnS0uUwWQDRxEZR4vQAXfdwELge2aOzZIc8MK5NlubtvpqOydI3uOcb2P/KWInMtQSQETvYA2In8OsBuVJR0kClwBfO5CBD5pX7EcnxNE2U8ReVNF1myX5yFE0k5btArEas+Ua1XSDjNOGS9k1U071xE4XyPvSFiv2cC5wEpU0sTph2miF7a08URpZ6r073cuoYVMsTh9qPjlEoIn806UBShV2vOttEnX1cGa7lShkjs6BmnGj41KIppj2l/GKwnIB5YDGwPI1Fl0IB3YLzJlGzJlAGnSth7y3u0Bwi3nSp8koJJYyyT84TYPB2pjmy3PbS9tbINKkn6MSpgGCqOdJzoeK6GWxdJm6tx0l15GYnoZXYpyHyEhtphWvabVEWipJik1O9WcxVdLmqI+pLjLx+lhKnAvGVxz5S8K8ptAZDhKyLWty7XvgN8B/zbOvwGHduE8KYo/BRWndHBQSPhpGdQJohgOrkBlvnWMAF4y2uSQxHmojG8vFzk/BX4ri4KD8cCN8u8vxMV7Eehg/PZV6QMn0dTEaG8BKnmgox8qydDHRZZlwEhgvXZuLHCnRohjgFc08nEwW6z+UpnAn+NfunW1/AGsDdAf4aAIeBCYq507U/Rsjcjzvnbtn8BN2vFo6ePmLnr3GvCAMYlPkz7s6yLLVrl/jhwv1AivxNAzgAXUlL5UyBii6c2LYgmbWALcJ/2IkPIsYBj+MdTtos+vy/FdwP9o1++Q9ziIAx4D7kdVgLiFLsZo73bikLrujZT+v09CGfpY3WaMB8CtMh9TjfPVqIqA++sV9N2x+gkKvnsoLG1ySPGM+tQpWrUGrj443zguD9MVni6mf9sgxPuRdHQgjEUldZJdrJungKFy/LJx/UaXZ92i/btKiBdx7xYFmfyDZcVvF+D62TJpOrhcuw34Yz36bIhMpD5B3rXchex0q3JRgOvXSXjDsWp+7TrW98Ui0nFJCL8bJTHG5gGsntu1BcGx6JYGIEPHCp4t49oQnCT62zXA9YHAM1rsdIEs1G5VI+3qmCs6mogV91gAMnT64EvgrDrc8rEGGSLe2NtiBTq4RhbZ1AChwxuA3we0EEt92BuS/V2t3I3T6FPWubRD+vzEUHo8Nn5XWmLq1ykOKV4v7vPKmKgq7vHG8Y9iVdQHNwL3GqQ6V0z5MyR+5ijKC2K+/+jynDhZgRaiShEuE3fCwTiZaLOBZ4EWcv5SIc2D2up8jva7j8Xy7CwDHatZCNO0eOnDooDpYo1eH2C9ihWX8Av5nf6u+8S6OVCXQ4FKSjmlVGWoYPpK4GSxaBNR9X/TCZwMiROra6mQ/CDt2m9lIq0Qq2ugZhE61u6HTuQlwnpVCeQKqTvoFoItoG8B2y/HhWJh3iLW1Z/lejOxLvWs7BrRvUTgWnnnQhfXuL54QJ7p4BlUFj1D5EoXCw7R9zONfp4pJD8MuFA8qbwQ3jvJGNMiaV+BLDC95fwxYgVniF676UmpjHeeWOSpmms8RpvDEzQiLxNZtwGnAr+R508JSIgJ1Vg7E3j86ZesOQ3p8fXPD/xZ4lnopAiwOXpFCS2N4z1hPMPc3H2nuI8O/qqt6vFCbLcHeNZlQmCIhbNFs276CmGVCimOkvPJMtk/0Vxofbxe1pS6qeGavSL//kCe+4TmTqZIvNDERFSiwCH5tdoKmyxKuryOPhtrWEEPiWXkyLJHiNCxrNqLUpp4Wtpli8qsEBfS6eszpV+mS/t0QlxBdBMaZt/VVc7VQtqpy+eQ3z8k5GJpIZsREntzsFrc8XI5zpI45HJZaBtqIZohnDKNtPQF2fQ+/kJNidpM495gSKF2Ib8tlm6OpoeLpc2IxXm7pkc69oku/Kjp2CLt+jmaBdhTO7+Omqz3P0VPY4AKX7Blrec+Xhl9k90s3N7+ZsrdU5PTPm/vZp9eXwEnVjQ5GCWlNS2Z+tZAZRjm9m7pONOd1nF5AFcCsZAORR4kBqS7TCkB3OZh2r+v0v5dKO4LmsvtWDAbhDycP313RYxYt25YZbjjZvFx6xD6baih6GsNWX4x7u8fRBZbe86KMGSJFpJcJmUwlBrx6UwJdQyQqVBlXDet5uc0MnRigAupSWo1BPuMEM5n4lomaiQZqJ3PyaLV3uXeYBhsWKVmsuwgqlwnkF5hWNu6V/Z1AD2pNvqrN/COyBIj1ysAfO+lBZa8XRlJPSvZfO8ddkZ9e/q7qaOeadnl1fFY7oX6PuDive2bRElp843jri5xhroIUcdGQykdN7zasBRC3cNq7oRxZPtKXDKdEC2xuvR40WuiOIlGXDAW+I8QsPP3qvGu1BBlLA8gY7A1tItxvMiQZfavJEs0Ycbb6nIRy6i9s8cCbpZwwFbUDip9we5h2hVRbMubLgvUHHFd/0btveofGPHTVuLtbBWL7qIw55bbdj4zVNe9gfMKF4PmatHPPFTCs9khQnw/CCkef4CUwQWsm3yL/dmYUXZmMGly7s9qsXby3RM3zOxXkNLtb/f7YkrrmEGWBdCmuEd1hAc62zhujsqmhQrToiwO0PllxrnkCMiuE1hbsawupnZm8JUwiSFQ6UMkYIUhzzaOLJyESmjoCCWON8bwEg7ZHOKarnAmpIvu7Y9ie2ZpumRawXfI4ux4FNvFnS9xGfeBEhJ6PEJza28dVnk4GI97eVhrCRWsAVrHAswXQhyaH6AFVVin7yGTPWSefaVdtS+WA6UxHKjwsd9XTZNE204+tftEX+ueU1tYvvJ6S9p58yW+05qtY1Xk1v2l0tHJRoxsSYhxl90hWDJJLoO7KwKyv0HNTgjHhepkkP1aTZlKNRekFJVQCrQXuzKKE6xaXPk07V2dcA+GR1uWaGGicVwYIiHmoxIx1wmpnGcsHieKpThOdE/Xt3Tca/IiNWYjxeO4U8I++pxphoqVO/HbueKW3oXKypofeJ6Ayu6ua+Dcah2FebUHlci5Sto8mNpVCp2AqYdiiPPT4IMQIjPNK4npUMYxGSWk9dxP1xNK6Hj8ASulaM3jLXatvyNMWWMYXgF9IrffoZjaNU+gAqyzcP8UUVsZbCeRstogzu74J2rM+Nf3QSZ/fVBI7fqpQagMnoOXjPv1wuNEVDa3KMBftAko23DfzziMskQSsagg/JXG+WmEXr1QjsrADxbL8FnjulOmZBafn1/PkEICIdQXG/gcVVXRWizDEiPepucafkZVCzjF2TlGJKx3He8yLeV++Mfezbm1IkLjWCUhgUtkoZlkjkGtpMq7beDDtDBfZVvkrXiewh/vCf0nVU0r9J68IbKkOBX/zzWNlJjFVFR93V2obNn3snJMlJV6Nypw7SBe4iWOoh3r0plvRnAC6qQ3gJrarhL8PyllxkZmGHGodFTWdTlE/YO8pizPCkHrK/8kIfF+EXqnmUBzymDC1eRBqNKWa1GlJxNRBfgPunghz4X4zA5iGbbULMaHDUve2TRgVnWM1iw0UFUJn1G7bnGrETcbrhH5A0a4BYM8b0PtBnI8jBeNRXavZhxciKqYcAhsOf4JkN119MVyQ95u1C7g7oqqVoj03EqTMUjXrM4sam/WKPJbSeaJGg3JD5MUv1bJ19TuM+q8/eDejG/Urp/apAiwuuHuc4EoxgLDDThe4gmBMBxVMD1eYiOORTkCle36f1Eg/Zk/Ac9HkFgWitJ0NFbnOS6W1euoWqtTNQX7lpptV101Ip+PqjHcFSVCfAdVn+aUO3QUa3uTuMjdNDflXbGKdjTwneuN4yFiZTcXS2NlPZ83JYR7VghhhvKZuCao4ueeqEztO6jY6QDDZftQ65eVMk6gKhC+lHherMQxfahdTRtRu5AWUDtZ8Zos7O0IHtd+RoyCKnnGGpkfg13kypQ4oSWyLJTfjTBIfVkd/VEhoQH9q1JPoeodC1DlPTqBL9ZkCBc+6df+YlTMAzaLB6MnQhe4mtbz0gAbhvwSPVIsLz6+Yt+eE26WPmptkqJtQV7DPy27VEjtLQJX4+tYhio7KBXluEliek6ssKWL67xNiHJvhGM7r4tSE8RddhTsClHWEzTLoIfLvYupu0ykoXJfKwTQW7NYMgKMTVEE3rkGFVPV68ycMZolSl8ZofaVocqtHiX0MpMLJUboxORGutzzCTVfWXL68FNqduvEGVaisxA4X4P6k+hqa20addfcxJ/x36zQCpXtdsZoKP7lLT9rxsNYzTI82bD8HbnvCTFs9LbE7KZoC34H/HdKrRQDpaHflOxPza6fJGrv+NIt1xkB6xDntYEPw632ElLctf5ufye+PKV6f95F60u23NC77+TJmwHimu4YbtL5jeWQUZEQiTrFVTJZ7kOVpJhO+UFZ7W6WVXun3g1ieb3hQng7ZWU7Fd3MjRxeNuKY64OsvltRBaoT8f/g6UEhwmEyGaP98dudqO1Wf5BV2CTvL2TCD8c/Sx9uXGioPFfHFlThc0NQKv25UFzmrvLf+ujlh2JdvedCFltQRcGXG3r5k4zn8y6LxmYh5L6a67kTlaj5wsWSvUA8iAMuHlRvVNLE9Af3onZfnU5NVcINqCLyXIOgKsWFH0j9viU6TebbRy56sFH6eQD+tavhYJno5GwXg2C7zJvBQJnV9hE7MPvaPJw31YrqZ4xyJoy7oFWPFz7xxe31swcry1ts7HjTnm4RfmWCrKQpohQF+Ne5uSFWXJBjxSXbTuP9GnJbaWOxTJrywyhLushyQMilLIrvSpO/LRG22COFOAkjJAsJ7QxR7zqJ3uaHQBBOH+wQ3Q4FlqYzu2WcglVjtEAVZFfKvQ1NJsajah7jQ2xjQxArsreQ99SqIw1GiOPzpljToiVVbtb4Hr74neObd3j/5pj4Xb4AhLy67XV+roIHDx48RI0t3ZaLx7ZPsaa1zbKbUqHY/+odcFlBmG+xbNr1vZuWGS9oJ5/wet+DBw+NCr4AZDjZPD83HRY0IKa4/auZ7Fp/p9fjHjx4ODII0STDPBXvORSEn9sG/tUqzDfZFnnZMyjadKvX6x48eGjchGjZTPCzDLOsaoytSe+kh0+KNj62LXuZok2/8XregwcPjZYQH98+1ZrkeoPNgxgbsOemw6LU8F5o42Pbco8UPXjw0BgJ0SYrb4oV8BPx26ZauVU2/VH1VMWK1ODNtg0gRTtGkeLmm21vCDx48NBYYB3Olw8caMc+cFvmE32SljwQwJz0ym48ePDwq7vMhwVLlliVQxYsfnh1ycAnvaHw4MHDUU2IAMyxqjxS9ODBg0eIJinuH/iUNyQePHg4ugnRIcWPFj+0qnjA096wePDg4egmRCHFy/+1dJxHih48ePDg4Fo75qNXznkqb7bf/wrTgwcPHo4+nDbKjpv38oVjvJ7w4MHDr4X/AvfYW5jJb2uQAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIwLTA1LTIyVDE3OjQwOjUyKzAwOjAw7lDVDQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMC0wNS0yMlQxNzo0MDo1MiswMDowMJ8NbbEAAAAASUVORK5CYII=",
logoWidth: "324px",
logoHeight: "40px",
longCommentThreshold: 1e4,
bytesToDeemComment: 50,
summaryCommentTextLengthLimit: 50,
noConfirmPostEmptyCommentPageRegexp: null,
customIndentationCharsPattern: null,
undoTexts: [],
customTextReactions: [],
customCommentFormModules: [],
defaultCommentLinkType: "diff",
commentInputEmptyPlaceholder: !1,
getArchivePrefix: null,
transformSummary: null,
customCodeTransformations: null,
customBeforeParse: null,
customForeignComponentChecker: null,
areNewTopicsOnTop: null,
getMoveSourcePageCode: function(targetPageWikilink, signature, timestamp) {
return cd.s("move-sourcepagecode", targetPageWikilink, signature, timestamp);
},
getMoveTargetPageCode: function(targetPageWikilink, signature) {
return cd.s("move-targetpagecode", targetPageWikilink, signature);
}
}, staticGlobals = {
LETTER_PATTERN: "A-Za-z\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B4\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\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-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\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\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AD\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC",
COMMENT_UNDERLAY_FOCUSED_COLOR: "#eaf3ff",
COMMENT_UNDERLAY_TARGET_COLOR: "#ffedb8",
COMMENT_UNDERLAY_NEW_COLOR: "#e8ffd1",
COMMENT_UNDERLAY_OWN_COLOR: "#f7ebff",
COMMENT_UNDERLAY_SIDE_MARGIN: 5,
HIGHLIGHT_NEW_COMMENTS_INTERVAL: 15,
CHECK_FOR_NEW_COMMENTS_INTERVAL: 15,
BACKGROUND_CHECK_FOR_NEW_COMMENTS_INTERVAL: 60,
SECONDS_IN_A_DAY: 86400,
MILLISECONDS_IN_A_MINUTE: 6e4,
POPULAR_NOT_INLINE_ELEMENTS: [ "BLOCKQUOTE", "DD", "DIV", "DL", "FORM", "H2", "H3", "H4", "H5", "H6", "HR", "INPUT", "LI", "OL", "P", "PRE", "TABLE", "TBODY", "TR", "TH", "TD", "UL" ],
POPULAR_INLINE_ELEMENTS: [ "A", "ABBR", "B", "BIG", "BR", "CITE", "CODE", "EM", "FONT", "I", "IMG", "KBD", "S", "SMALL", "SPAN", "STRIKE", "STRONG", "SUB", "SUP", "TT", "U", "VAR" ],
UNHIGHLIGHTABLE_ELEMENTS_CLASSES: [ "mw-empty-elt", "tleft", "tright", "floatleft", "floatright" ],
BAD_COMMENT_BEGINNINGS: [ /^<!--[^]*?--> *\n*/, /^(?:----+|<hr>) *\n*/, /^\{\|.*?\|\} *\n*(?=[*:#])/ ],
FLOATING_ELEMENTS_SELECTORS: [ ".cd-floating", ".tright", ".floatright", '*[style*="float:right"]', '*[style*="float: right"]', '*[style*="float:left"]', '*[style*="float: left"]' ],
SIGN_CODE: "~~".concat("~~")
}, globalUtil = {
wrapInElement: (html, tagName = "span") => $($.parseHTML(html)).wrapAll("<".concat(tagName, ">")).parent(),
buildEditSummary(options) {
void 0 === options.addPostfix && (options.addPostfix = !0);
let wasOptionalTextAdded, text = (options.section ? "/* ".concat(options.section, " */ ") : "") + options.text.trim();
if (options.optionalText) {
let projectedText = text + options.optionalText;
cd.config.transformSummary && (projectedText = cd.config.transformSummary(projectedText)),
projectedText.length <= cd.g.SUMMARY_LENGTH_LIMIT && (text = projectedText, wasOptionalTextAdded = !0);
}
return wasOptionalTextAdded || (cd.config.transformSummary && (text = cd.config.transformSummary(text)),
text.length > cd.g.SUMMARY_LENGTH_LIMIT && (text = text.slice(0, cd.g.SUMMARY_LENGTH_LIMIT - 1) + "\u2026")),
options.addPostfix && (text += cd.g.SUMMARY_POSTFIX), text;
},
isPageOverlayOn: () => document.body.classList.contains("oo-ui-windowManager-modal-active") || Boolean($loadingPopup && $loadingPopup[0] && "block" === $loadingPopup[0].style.display),
wrapDiffBody: body => '<table class="diff"><col class="diff-marker"><col class="diff-content"><col class="diff-marker"><col class="diff-content">' + body + "</table>"
};
function app_s(name, ...params) {
if (!name) return null;
const fullName = "convenientdiscussions-".concat(name);
if (cd.g.QQX_MODE || "string" != typeof mw.messages.get(fullName)) {
const paramsString = params.length ? ": ".concat(params.join(", ")) : "";
return "(".concat(fullName).concat(paramsString, ")");
}
return mw.message(fullName, ...params).toString();
}
function go() {
Object.keys(cd.strings).forEach(name => {
mw.messages.set("convenientdiscussions-".concat(name), cd.strings[name]);
}), cd.g.SETTINGS_OPTION_FULL_NAME = "userjs-".concat(cd.config.optionsPrefix, "-settings"),
cd.g.VISITS_OPTION_FULL_NAME = "userjs-".concat(cd.config.optionsPrefix, "-visits");
const watchedSectionsOptionName = "ru.wikipedia.org" === location.host ? "watchedTopics" : "watchedSections";
if (cd.g.WATCHED_SECTIONS_OPTION_FULL_NAME = "userjs-".concat(cd.config.optionsPrefix, "-").concat(watchedSectionsOptionName),
cd.g.IS_DIFF_PAGE = mw.config.get("wgIsArticle") && /[?&]diff=[^&]/.test(location.search),
cd.g.CURRENT_PAGE = underlinesToSpaces(mw.config.get("wgPageName")), cd.g.CURRENT_NAMESPACE_NUMBER = mw.config.get("wgNamespaceNumber"),
cd.g.CURRENT_USER_NAME = mw.config.get("wgUserName"), cd.g.$content = $("#mw-content-text"),
cd.config.customTalkNamespaces || (cd.config.customTalkNamespaces = mw.config.get("wgExtraSignatureNamespaces"),
cd.config.customTalkNamespaces.includes(0) && cd.config.customTalkNamespaces.splice(cd.config.customTalkNamespaces.indexOf(0))),
mw.config.get("wgIsArticle") && (isProbablyTalkPage(cd.g.CURRENT_PAGE, cd.g.CURRENT_NAMESPACE_NUMBER) || cd.g.$content.find(".cd-talkPage").length)) {
let messagesRequest;
cd.g.firstRun = !0, cd.g.nanoCss = Object(nano_css.create)(), cd.g.nanoCss.put(".cd-loadingPopup", {
width: cd.config.logoWidth
}), cd.g.nanoCss.put(".cd-loadingPopup-logo", {
width: cd.config.logoWidth,
height: cd.config.logoHeight
}), setLoadingOverlay(), cd.debug.stopTimer("start"), cd.debug.startTimer("loading data"),
cd.g.worker = new worker_default.a, "ready" === mw.loader.getState("mediawiki.api") && (cd.g.api = new mw.Api,
messagesRequest = loadMessages(), getUserInfo().catch(e => {
console.warn(e);
}));
const modulesRequest = $.when(...[ mw.loader.using([ "jquery.color", "jquery.client", "mediawiki.Title", "mediawiki.api", "mediawiki.cookie", "mediawiki.jqueryMsg", "mediawiki.notification", "mediawiki.user", "mediawiki.util", "mediawiki.widgets.visibleLengthLimit", "oojs", "oojs-ui", "oojs-ui.styles.icons-alerts", "oojs-ui.styles.icons-content", "oojs-ui.styles.icons-interactions", "user.options" ]), messagesRequest ].filter(defined)).then(() => {
try {
processPage({
messagesRequest: messagesRequest
});
} catch (e) {
mw.notify(cd.s("error-processpage"), {
type: "error"
}), removeLoadingOverlay(), console.error(e);
}
}, e => {
mw.notify(cd.s("error-loaddata"), {
type: "error"
}), removeLoadingOverlay(), console.warn(e);
});
setTimeout(() => {
"resolved" !== modulesRequest.state() && (removeLoadingOverlay(), console.warn('The promise is in the "pending" state for 10 seconds; removing the loading overlay.'));
}, 1e4), cd.g.REGULAR_LINE_HEIGHT = parseFloat(window.getComputedStyle(cd.g.$content.get(0)).lineHeight),
initTalkPageCss(), __webpack_require__(7), __webpack_require__(13), __webpack_require__(15),
__webpack_require__(17), __webpack_require__(19), __webpack_require__(21), __webpack_require__(23),
__webpack_require__(25);
}
if ([ "Watchlist", "Contributions", "Recentchanges" ].includes(mw.config.get("wgCanonicalSpecialPageName")) || "history" === mw.config.get("wgAction") && isProbablyTalkPage(cd.g.CURRENT_PAGE, cd.g.CURRENT_NAMESPACE_NUMBER) || cd.g.IS_DIFF_PAGE) {
let messagesRequest;
"ready" === mw.loader.getState("mediawiki.api") && (cd.g.api = new mw.Api, messagesRequest = loadMessages(),
getUserInfo().catch(e => {
console.warn(e);
})), mw.loader.using([ "user.options", "mediawiki.Title", "mediawiki.api", "mediawiki.jqueryMsg", "mediawiki.util", "mediawiki.user", "oojs", "oojs-ui", "oojs-ui.styles.icons-interactions", "oojs-ui.styles.icons-editing-list", "oojs-ui.styles.icons-alerts" ]).then(() => {
!function(_x3) {
_commentLinks.apply(this, arguments);
}({
messagesRequest: messagesRequest
}), __webpack_require__(7), __webpack_require__(27);
}, e => {
console.warn(e);
});
}
}
$((function() {
if (!location.host.endsWith(".m.wikipedia.org") && !$(".flow-board-page").length) if (cd.running) console.warn("One instance of Convenient Discussions is already running."); else if (cd.running = !0,
cd.config = Object.assign(defaultConfig, cd.config), cd.debug = debug, cd.g = staticGlobals,
cd.s = app_s, cd.util = globalUtil, cd.getCommentByAnchor = Comment_Comment.getCommentByAnchor,
cd.getSectionByAnchor = Section_Section.getSectionByAnchor, cd.getSectionsByHeadline = Section_Section.getSectionsByHeadline,
cd.getLastActiveCommentForm = CommentForm_CommentForm.getLastActiveCommentForm,
cd.getLastActiveAlteredCommentForm = CommentForm_CommentForm.getLastActiveAlteredCommentForm,
cd.util.parseCommentAnchor = parseCommentAnchor, cd.util.formatDate = formatDate,
cd.util.setVisits = setVisits, cd.debug.init(), cd.debug.startTimer("total time"),
cd.debug.startTimer("start"), mw.hook("convenientDiscussions.launched").fire(cd),
cd.strings) go(); else {
let match = location.host.match(/^([a-z-]+)\.(?:wikipedia|wikibooks|wikinews|wikiquote|wikisource|wikiversity|wikivoyage|wiktionary)\.org$/);
match || (match = location.host.match(/^([a-z]{2})\.wikimedia\.org$/)), function loadStrings(lang) {
mw.loader.getScript("https://www.mediawiki.org/w/index.php?title=User:Jack_who_built_the_house/convenientDiscussions/strings-".concat(lang, ".js&action=raw&ctype=text/javascript")).then(() => {
cd.strings ? go() : "en" !== lang ? loadStrings("en") : console.warn("Convenient Discussions can't run: localization strings couldn't be found.");
}, e => {
console.warn(e);
});
}(match ? match[1] : "en");
}
}));
} ]);