MediaWiki:Gadget-ondemand-criteriaCheck.js
JS-код ниже относится к скрытому гаджету «Автоматическая проверка соответствия критериям на выборах, в голосованиях, при присвоении флагов и в иных случаях» (править описание). Он вызывается по умолчанию на страницах в категории Википедия:Страницы с гаджетом по требованию criteriaCheck.
После сохранения или недавних изменений очистите кэш браузера.
// См. https://ru.wikipedia.org/wiki/Википедия:Глобальный_код/Автоматическая_проверка_соответствия_критериям
/******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 15);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {
module.exports = __webpack_require__(7);
/***/ }),
/* 1 */
/***/ (function(module, exports) {
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _asyncToGenerator(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(undefined);
});
};
}
module.exports = _asyncToGenerator;
/***/ }),
/* 2 */
/***/ (function(module, exports, __webpack_require__) {
var arrayWithoutHoles = __webpack_require__(12);
var iterableToArray = __webpack_require__(13);
var nonIterableSpread = __webpack_require__(14);
function _toConsumableArray(arr) {
return arrayWithoutHoles(arr) || iterableToArray(arr) || nonIterableSpread();
}
module.exports = _toConsumableArray;
/***/ }),
/* 3 */,
/* 4 */
/***/ (function(module, exports) {
function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof2(obj); }
function _typeof(obj) {
if (typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol") {
module.exports = _typeof = function _typeof(obj) {
return _typeof2(obj);
};
} else {
module.exports = _typeof = function _typeof(obj) {
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : _typeof2(obj);
};
}
return _typeof(obj);
}
module.exports = _typeof;
/***/ }),
/* 5 */
/***/ (function(module, exports) {
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
module.exports = _classCallCheck;
/***/ }),
/* 6 */
/***/ (function(module, exports) {
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
module.exports = _createClass;
/***/ }),
/* 7 */
/***/ (function(module, exports, __webpack_require__) {
/**
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
var runtime = (function (exports) {
"use strict";
var Op = Object.prototype;
var hasOwn = Op.hasOwnProperty;
var undefined; // More compressible than void 0.
var $Symbol = typeof Symbol === "function" ? Symbol : {};
var iteratorSymbol = $Symbol.iterator || "@@iterator";
var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
function wrap(innerFn, outerFn, self, tryLocsList) {
// If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
var generator = Object.create(protoGenerator.prototype);
var context = new Context(tryLocsList || []);
// The ._invoke method unifies the implementations of the .next,
// .throw, and .return methods.
generator._invoke = makeInvokeMethod(innerFn, self, context);
return generator;
}
exports.wrap = wrap;
// Try/catch helper to minimize deoptimizations. Returns a completion
// record like context.tryEntries[i].completion. This interface could
// have been (and was previously) designed to take a closure to be
// invoked without arguments, but in all the cases we care about we
// already have an existing method we want to call, so there's no need
// to create a new function object. We can even get away with assuming
// the method takes exactly one argument, since that happens to be true
// in every case, so we don't have to touch the arguments object. The
// only additional allocation required is the completion record, which
// has a stable shape and so hopefully should be cheap to allocate.
function tryCatch(fn, obj, arg) {
try {
return { type: "normal", arg: fn.call(obj, arg) };
} catch (err) {
return { type: "throw", arg: err };
}
}
var GenStateSuspendedStart = "suspendedStart";
var GenStateSuspendedYield = "suspendedYield";
var GenStateExecuting = "executing";
var GenStateCompleted = "completed";
// Returning this object from the innerFn has the same effect as
// breaking out of the dispatch switch statement.
var ContinueSentinel = {};
// Dummy constructor functions that we use as the .constructor and
// .constructor.prototype properties for functions that return Generator
// objects. For full spec compliance, you may wish to configure your
// minifier not to mangle the names of these two functions.
function Generator() {}
function GeneratorFunction() {}
function GeneratorFunctionPrototype() {}
// This is a polyfill for %IteratorPrototype% for environments that
// don't natively support it.
var IteratorPrototype = {};
IteratorPrototype[iteratorSymbol] = function () {
return this;
};
var getProto = Object.getPrototypeOf;
var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
if (NativeIteratorPrototype &&
NativeIteratorPrototype !== Op &&
hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
// This environment has a native %IteratorPrototype%; use it instead
// of the polyfill.
IteratorPrototype = NativeIteratorPrototype;
}
var Gp = GeneratorFunctionPrototype.prototype =
Generator.prototype = Object.create(IteratorPrototype);
GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
GeneratorFunctionPrototype.constructor = GeneratorFunction;
GeneratorFunctionPrototype[toStringTagSymbol] =
GeneratorFunction.displayName = "GeneratorFunction";
// Helper for defining the .next, .throw, and .return methods of the
// Iterator interface in terms of a single ._invoke method.
function defineIteratorMethods(prototype) {
["next", "throw", "return"].forEach(function(method) {
prototype[method] = function(arg) {
return this._invoke(method, arg);
};
});
}
exports.isGeneratorFunction = function(genFun) {
var ctor = typeof genFun === "function" && genFun.constructor;
return ctor
? ctor === GeneratorFunction ||
// For the native GeneratorFunction constructor, the best we can
// do is to check its .name property.
(ctor.displayName || ctor.name) === "GeneratorFunction"
: false;
};
exports.mark = function(genFun) {
if (Object.setPrototypeOf) {
Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
} else {
genFun.__proto__ = GeneratorFunctionPrototype;
if (!(toStringTagSymbol in genFun)) {
genFun[toStringTagSymbol] = "GeneratorFunction";
}
}
genFun.prototype = Object.create(Gp);
return genFun;
};
// Within the body of any async function, `await x` is transformed to
// `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
// `hasOwn.call(value, "__await")` to determine if the yielded value is
// meant to be awaited.
exports.awrap = function(arg) {
return { __await: arg };
};
function AsyncIterator(generator) {
function invoke(method, arg, resolve, reject) {
var record = tryCatch(generator[method], generator, arg);
if (record.type === "throw") {
reject(record.arg);
} else {
var result = record.arg;
var value = result.value;
if (value &&
typeof value === "object" &&
hasOwn.call(value, "__await")) {
return Promise.resolve(value.__await).then(function(value) {
invoke("next", value, resolve, reject);
}, function(err) {
invoke("throw", err, resolve, reject);
});
}
return Promise.resolve(value).then(function(unwrapped) {
// When a yielded Promise is resolved, its final value becomes
// the .value of the Promise<{value,done}> result for the
// current iteration.
result.value = unwrapped;
resolve(result);
}, function(error) {
// If a rejected Promise was yielded, throw the rejection back
// into the async generator function so it can be handled there.
return invoke("throw", error, resolve, reject);
});
}
}
var previousPromise;
function enqueue(method, arg) {
function callInvokeWithMethodAndArg() {
return new Promise(function(resolve, reject) {
invoke(method, arg, resolve, reject);
});
}
return previousPromise =
// If enqueue has been called before, then we want to wait until
// all previous Promises have been resolved before calling invoke,
// so that results are always delivered in the correct order. If
// enqueue has not been called before, then it is important to
// call invoke immediately, without waiting on a callback to fire,
// so that the async generator function has the opportunity to do
// any necessary setup in a predictable way. This predictability
// is why the Promise constructor synchronously invokes its
// executor callback, and why async functions synchronously
// execute code before the first await. Since we implement simple
// async functions in terms of async generators, it is especially
// important to get this right, even though it requires care.
previousPromise ? previousPromise.then(
callInvokeWithMethodAndArg,
// Avoid propagating failures to Promises returned by later
// invocations of the iterator.
callInvokeWithMethodAndArg
) : callInvokeWithMethodAndArg();
}
// Define the unified helper method that is used to implement .next,
// .throw, and .return (see defineIteratorMethods).
this._invoke = enqueue;
}
defineIteratorMethods(AsyncIterator.prototype);
AsyncIterator.prototype[asyncIteratorSymbol] = function () {
return this;
};
exports.AsyncIterator = AsyncIterator;
// Note that simple async functions are implemented on top of
// AsyncIterator objects; they just return a Promise for the value of
// the final result produced by the iterator.
exports.async = function(innerFn, outerFn, self, tryLocsList) {
var iter = new AsyncIterator(
wrap(innerFn, outerFn, self, tryLocsList)
);
return exports.isGeneratorFunction(outerFn)
? iter // If outerFn is a generator, return the full iterator.
: iter.next().then(function(result) {
return result.done ? result.value : iter.next();
});
};
function makeInvokeMethod(innerFn, self, context) {
var state = GenStateSuspendedStart;
return function invoke(method, arg) {
if (state === GenStateExecuting) {
throw new Error("Generator is already running");
}
if (state === GenStateCompleted) {
if (method === "throw") {
throw arg;
}
// Be forgiving, per 25.3.3.3.3 of the spec:
// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
return doneResult();
}
context.method = method;
context.arg = arg;
while (true) {
var delegate = context.delegate;
if (delegate) {
var delegateResult = maybeInvokeDelegate(delegate, context);
if (delegateResult) {
if (delegateResult === ContinueSentinel) continue;
return delegateResult;
}
}
if (context.method === "next") {
// Setting context._sent for legacy support of Babel's
// function.sent implementation.
context.sent = context._sent = context.arg;
} else if (context.method === "throw") {
if (state === GenStateSuspendedStart) {
state = GenStateCompleted;
throw context.arg;
}
context.dispatchException(context.arg);
} else if (context.method === "return") {
context.abrupt("return", context.arg);
}
state = GenStateExecuting;
var record = tryCatch(innerFn, self, context);
if (record.type === "normal") {
// If an exception is thrown from innerFn, we leave state ===
// GenStateExecuting and loop back for another invocation.
state = context.done
? GenStateCompleted
: GenStateSuspendedYield;
if (record.arg === ContinueSentinel) {
continue;
}
return {
value: record.arg,
done: context.done
};
} else if (record.type === "throw") {
state = GenStateCompleted;
// Dispatch the exception by looping back around to the
// context.dispatchException(context.arg) call above.
context.method = "throw";
context.arg = record.arg;
}
}
};
}
// Call delegate.iterator[context.method](context.arg) and handle the
// result, either by returning a { value, done } result from the
// delegate iterator, or by modifying context.method and context.arg,
// setting context.delegate to null, and returning the ContinueSentinel.
function maybeInvokeDelegate(delegate, context) {
var method = delegate.iterator[context.method];
if (method === undefined) {
// A .throw or .return when the delegate iterator has no .throw
// method always terminates the yield* loop.
context.delegate = null;
if (context.method === "throw") {
// Note: ["return"] must be used for ES3 parsing compatibility.
if (delegate.iterator["return"]) {
// If the delegate iterator has a return method, give it a
// chance to clean up.
context.method = "return";
context.arg = undefined;
maybeInvokeDelegate(delegate, context);
if (context.method === "throw") {
// If maybeInvokeDelegate(context) changed context.method from
// "return" to "throw", let that override the TypeError below.
return ContinueSentinel;
}
}
context.method = "throw";
context.arg = new TypeError(
"The iterator does not provide a 'throw' method");
}
return ContinueSentinel;
}
var record = tryCatch(method, delegate.iterator, context.arg);
if (record.type === "throw") {
context.method = "throw";
context.arg = record.arg;
context.delegate = null;
return ContinueSentinel;
}
var info = record.arg;
if (! info) {
context.method = "throw";
context.arg = new TypeError("iterator result is not an object");
context.delegate = null;
return ContinueSentinel;
}
if (info.done) {
// Assign the result of the finished delegate to the temporary
// variable specified by delegate.resultName (see delegateYield).
context[delegate.resultName] = info.value;
// Resume execution at the desired location (see delegateYield).
context.next = delegate.nextLoc;
// If context.method was "throw" but the delegate handled the
// exception, let the outer generator proceed normally. If
// context.method was "next", forget context.arg since it has been
// "consumed" by the delegate iterator. If context.method was
// "return", allow the original .return call to continue in the
// outer generator.
if (context.method !== "return") {
context.method = "next";
context.arg = undefined;
}
} else {
// Re-yield the result returned by the delegate method.
return info;
}
// The delegate iterator is finished, so forget it and continue with
// the outer generator.
context.delegate = null;
return ContinueSentinel;
}
// Define Generator.prototype.{next,throw,return} in terms of the
// unified ._invoke helper method.
defineIteratorMethods(Gp);
Gp[toStringTagSymbol] = "Generator";
// A Generator should always return itself as the iterator object when the
// @@iterator function is called on it. Some browsers' implementations of the
// iterator prototype chain incorrectly implement this, causing the Generator
// object to not be returned from this call. This ensures that doesn't happen.
// See https://github.com/facebook/regenerator/issues/274 for more details.
Gp[iteratorSymbol] = function() {
return this;
};
Gp.toString = function() {
return "[object Generator]";
};
function pushTryEntry(locs) {
var entry = { tryLoc: locs[0] };
if (1 in locs) {
entry.catchLoc = locs[1];
}
if (2 in locs) {
entry.finallyLoc = locs[2];
entry.afterLoc = locs[3];
}
this.tryEntries.push(entry);
}
function resetTryEntry(entry) {
var record = entry.completion || {};
record.type = "normal";
delete record.arg;
entry.completion = record;
}
function Context(tryLocsList) {
// The root entry object (effectively a try statement without a catch
// or a finally block) gives us a place to store values thrown from
// locations where there is no enclosing try statement.
this.tryEntries = [{ tryLoc: "root" }];
tryLocsList.forEach(pushTryEntry, this);
this.reset(true);
}
exports.keys = function(object) {
var keys = [];
for (var key in object) {
keys.push(key);
}
keys.reverse();
// Rather than returning an object with a next method, we keep
// things simple and return the next function itself.
return function next() {
while (keys.length) {
var key = keys.pop();
if (key in object) {
next.value = key;
next.done = false;
return next;
}
}
// To avoid creating an additional object, we just hang the .value
// and .done properties off the next function object itself. This
// also ensures that the minifier will not anonymize the function.
next.done = true;
return next;
};
};
function values(iterable) {
if (iterable) {
var iteratorMethod = iterable[iteratorSymbol];
if (iteratorMethod) {
return iteratorMethod.call(iterable);
}
if (typeof iterable.next === "function") {
return iterable;
}
if (!isNaN(iterable.length)) {
var i = -1, next = function next() {
while (++i < iterable.length) {
if (hasOwn.call(iterable, i)) {
next.value = iterable[i];
next.done = false;
return next;
}
}
next.value = undefined;
next.done = true;
return next;
};
return next.next = next;
}
}
// Return an iterator with no values.
return { next: doneResult };
}
exports.values = values;
function doneResult() {
return { value: undefined, done: true };
}
Context.prototype = {
constructor: Context,
reset: function(skipTempReset) {
this.prev = 0;
this.next = 0;
// Resetting context._sent for legacy support of Babel's
// function.sent implementation.
this.sent = this._sent = undefined;
this.done = false;
this.delegate = null;
this.method = "next";
this.arg = undefined;
this.tryEntries.forEach(resetTryEntry);
if (!skipTempReset) {
for (var name in this) {
// Not sure about the optimal order of these conditions:
if (name.charAt(0) === "t" &&
hasOwn.call(this, name) &&
!isNaN(+name.slice(1))) {
this[name] = undefined;
}
}
}
},
stop: function() {
this.done = true;
var rootEntry = this.tryEntries[0];
var rootRecord = rootEntry.completion;
if (rootRecord.type === "throw") {
throw rootRecord.arg;
}
return this.rval;
},
dispatchException: function(exception) {
if (this.done) {
throw exception;
}
var context = this;
function handle(loc, caught) {
record.type = "throw";
record.arg = exception;
context.next = loc;
if (caught) {
// If the dispatched exception was caught by a catch block,
// then let that catch block handle the exception normally.
context.method = "next";
context.arg = undefined;
}
return !! caught;
}
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
var entry = this.tryEntries[i];
var record = entry.completion;
if (entry.tryLoc === "root") {
// Exception thrown outside of any try block that could handle
// it, so set the completion value of the entire function to
// throw the exception.
return handle("end");
}
if (entry.tryLoc <= this.prev) {
var hasCatch = hasOwn.call(entry, "catchLoc");
var hasFinally = hasOwn.call(entry, "finallyLoc");
if (hasCatch && hasFinally) {
if (this.prev < entry.catchLoc) {
return handle(entry.catchLoc, true);
} else if (this.prev < entry.finallyLoc) {
return handle(entry.finallyLoc);
}
} else if (hasCatch) {
if (this.prev < entry.catchLoc) {
return handle(entry.catchLoc, true);
}
} else if (hasFinally) {
if (this.prev < entry.finallyLoc) {
return handle(entry.finallyLoc);
}
} else {
throw new Error("try statement without catch or finally");
}
}
}
},
abrupt: function(type, arg) {
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
var entry = this.tryEntries[i];
if (entry.tryLoc <= this.prev &&
hasOwn.call(entry, "finallyLoc") &&
this.prev < entry.finallyLoc) {
var finallyEntry = entry;
break;
}
}
if (finallyEntry &&
(type === "break" ||
type === "continue") &&
finallyEntry.tryLoc <= arg &&
arg <= finallyEntry.finallyLoc) {
// Ignore the finally entry if control is not jumping to a
// location outside the try/catch block.
finallyEntry = null;
}
var record = finallyEntry ? finallyEntry.completion : {};
record.type = type;
record.arg = arg;
if (finallyEntry) {
this.method = "next";
this.next = finallyEntry.finallyLoc;
return ContinueSentinel;
}
return this.complete(record);
},
complete: function(record, afterLoc) {
if (record.type === "throw") {
throw record.arg;
}
if (record.type === "break" ||
record.type === "continue") {
this.next = record.arg;
} else if (record.type === "return") {
this.rval = this.arg = record.arg;
this.method = "return";
this.next = "end";
} else if (record.type === "normal" && afterLoc) {
this.next = afterLoc;
}
return ContinueSentinel;
},
finish: function(finallyLoc) {
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
var entry = this.tryEntries[i];
if (entry.finallyLoc === finallyLoc) {
this.complete(entry.completion, entry.afterLoc);
resetTryEntry(entry);
return ContinueSentinel;
}
}
},
"catch": function(tryLoc) {
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
var entry = this.tryEntries[i];
if (entry.tryLoc === tryLoc) {
var record = entry.completion;
if (record.type === "throw") {
var thrown = record.arg;
resetTryEntry(entry);
}
return thrown;
}
}
// The context.catch method must only be called with a location
// argument that corresponds to a known catch block.
throw new Error("illegal catch attempt");
},
delegateYield: function(iterable, resultName, nextLoc) {
this.delegate = {
iterator: values(iterable),
resultName: resultName,
nextLoc: nextLoc
};
if (this.method === "next") {
// Deliberately forget the last sent value so that we don't
// accidentally pass it on to the delegate.
this.arg = undefined;
}
return ContinueSentinel;
}
};
// Regardless of whether this script is executing as a CommonJS module
// or not, return the runtime object so that we can declare the variable
// regeneratorRuntime in the outer scope, which allows this module to be
// injected easily by `bin/regenerator --include-runtime script.js`.
return exports;
}(
// If this script is executing as a CommonJS module, use module.exports
// as the regeneratorRuntime namespace. Otherwise create a new empty
// object. Either way, the resulting object will be used to initialize
// the regeneratorRuntime variable at the top of this file.
true ? module.exports : undefined
));
try {
regeneratorRuntime = runtime;
} catch (accidentalStrictMode) {
// This module should not be running in strict mode, so the above
// assignment should always work unless something is misconfigured. Just
// in case runtime.js accidentally runs in strict mode, we can escape
// strict mode using a global Function call. This could conceivably fail
// if a Content Security Policy forbids using Function, but in that case
// the proper solution is to fix the accidental strict mode problem. If
// you've misconfigured your bundler to force strict mode and applied a
// CSP to forbid Function, and you're not willing to fix either of those
// problems, please detail your unique predicament in a GitHub issue.
Function("r", "regeneratorRuntime = r")(runtime);
}
/***/ }),
/* 8 */
/***/ (function(module, exports, __webpack_require__) {
var content = __webpack_require__(9);
if (typeof content === 'string') {
content = [[module.i, content, '']];
}
var options = {}
options.insert = "head";
options.singleton = false;
var update = __webpack_require__(11)(content, options);
if (content.locals) {
module.exports = content.locals;
}
/***/ }),
/* 9 */
/***/ (function(module, exports, __webpack_require__) {
exports = module.exports = __webpack_require__(10)(false);
// Module
exports.push([module.i, ".criteriaCheck-message-withText {\r\n display: flex;\r\n}\r\n\r\n.criteriaCheck-message-accented {\r\n font-weight: bold;\r\n}\r\n\r\n.criteriaCheck-message-big {\r\n font-weight: normal;\r\n margin: 0.5em 0;\r\n}\r\n\r\n.criteriaCheck-message-big + .criteriaCheck-message-big {\r\n margin-top: -0.25em;\r\n}\r\n\r\n.criteriaCheck-message-big {\r\n font-size: 120%;\r\n}\r\n\r\n.criteriaCheck-buttonsBlock {\r\n margin: 0.5em 0;\r\n}\r\n\r\n.criteriaCheck-button {\r\n margin-right: 0.5em;\r\n}\r\n\r\n.criteriaCheck-icon {\r\n display: inline-block;\r\n width: 20px;\r\n height: 20px;\r\n background-position: center center;\r\n background-size: 20px 20px;\r\n background-repeat: no-repeat;\r\n margin-right: 0.5em;\r\n vertical-align: top;\r\n}\r\n\r\n.criteriaCheck-message-withText .criteriaCheck-icon {\r\n flex-shrink: 0;\r\n}\r\n\r\n.criteriaCheck-icon + .criteriaCheck-icon {\r\n margin-left: -0.5em;\r\n}\r\n\r\n.criteriaCheck-message-big .criteriaCheck-icon {\r\n width: 24px;\r\n height: 24px;\r\n background-size: 24px 24px;\r\n}\r\n\r\n.criteriaCheck-icon-check {\r\n background-image: url(\"https://upload.wikimedia.org/wikipedia/commons/f/f6/OOjs_UI_icon_check-constructive.svg\");\r\n}\r\n\r\n.criteriaCheck-icon-close {\r\n background-image: url(\"https://upload.wikimedia.org/wikipedia/commons/7/77/OOjs_UI_icon_close-ltr-destructive.svg\");\r\n}\r\n\r\n.criteriaCheck-icon-help {\r\n background-image: url(\"https://upload.wikimedia.org/wikipedia/commons/b/b2/OOjs_UI_icon_help-ltr.svg\");\r\n}\r\n\r\n.criteriaCheck-icon-error {\r\n background-image: url(\"https://upload.wikimedia.org/wikipedia/commons/4/4e/OOjs_UI_icon_error-destructive.svg\");\r\n}\r\n\r\n.criteriaCheck-icon-loading {\r\n background-image: url(\"https://upload.wikimedia.org/wikipedia/commons/d/de/Ajax-loader.gif\");\r\n}\r\n\r\n.criteriaCheck-icon-warning {\r\n background-image: url(\"https://upload.wikimedia.org/wikipedia/commons/3/3b/OOjs_UI_icon_alert-warning.svg\");\r\n}\r\n\r\n.criteriaCheck-sandbox {\r\n display: none;\r\n}", ""]);
/***/ }),
/* 10 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
// css base code, injected by the css-loader
// eslint-disable-next-line func-names
module.exports = function (useSourceMap) {
var list = []; // return the list of modules as css string
list.toString = function toString() {
return this.map(function (item) {
var content = cssWithMappingToString(item, useSourceMap);
if (item[2]) {
return "@media ".concat(item[2], "{").concat(content, "}");
}
return content;
}).join('');
}; // import a list of modules into the list
// eslint-disable-next-line func-names
list.i = function (modules, mediaQuery) {
if (typeof modules === 'string') {
// eslint-disable-next-line no-param-reassign
modules = [[null, modules, '']];
}
var alreadyImportedModules = {};
for (var i = 0; i < this.length; i++) {
// eslint-disable-next-line prefer-destructuring
var id = this[i][0];
if (id != null) {
alreadyImportedModules[id] = true;
}
}
for (var _i = 0; _i < modules.length; _i++) {
var item = modules[_i]; // skip already imported module
// this implementation is not 100% perfect for weird media query combinations
// when a module is imported multiple times with different media queries.
// I hope this will never occur (Hey this way we have smaller bundles)
if (item[0] == null || !alreadyImportedModules[item[0]]) {
if (mediaQuery && !item[2]) {
item[2] = mediaQuery;
} else if (mediaQuery) {
item[2] = "(".concat(item[2], ") and (").concat(mediaQuery, ")");
}
list.push(item);
}
}
};
return list;
};
function cssWithMappingToString(item, useSourceMap) {
var content = item[1] || ''; // eslint-disable-next-line prefer-destructuring
var cssMapping = item[3];
if (!cssMapping) {
return content;
}
if (useSourceMap && typeof btoa === 'function') {
var sourceMapping = toComment(cssMapping);
var sourceURLs = cssMapping.sources.map(function (source) {
return "/*# sourceURL=".concat(cssMapping.sourceRoot).concat(source, " */");
});
return [content].concat(sourceURLs).concat([sourceMapping]).join('\n');
}
return [content].join('\n');
} // Adapted from convert-source-map (MIT)
function toComment(sourceMap) {
// eslint-disable-next-line no-undef
var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));
var data = "sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(base64);
return "/*# ".concat(data, " */");
}
/***/ }),
/* 11 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var stylesInDom = {};
var isOldIE = function isOldIE() {
var memo;
return function memorize() {
if (typeof memo === 'undefined') {
// Test for IE <= 9 as proposed by Browserhacks
// @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805
// Tests for existence of standard globals is to allow style-loader
// to operate correctly into non-standard environments
// @see https://github.com/webpack-contrib/style-loader/issues/177
memo = Boolean(window && document && document.all && !window.atob);
}
return memo;
};
}();
var getTarget = function getTarget() {
var memo = {};
return function memorize(target) {
if (typeof memo[target] === 'undefined') {
var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself
if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {
try {
// This will throw an exception if access to iframe is blocked
// due to cross-origin restrictions
styleTarget = styleTarget.contentDocument.head;
} catch (e) {
// istanbul ignore next
styleTarget = null;
}
}
memo[target] = styleTarget;
}
return memo[target];
};
}();
function listToStyles(list, options) {
var styles = [];
var newStyles = {};
for (var i = 0; i < list.length; i++) {
var item = list[i];
var id = options.base ? item[0] + options.base : item[0];
var css = item[1];
var media = item[2];
var sourceMap = item[3];
var part = {
css: css,
media: media,
sourceMap: sourceMap
};
if (!newStyles[id]) {
styles.push(newStyles[id] = {
id: id,
parts: [part]
});
} else {
newStyles[id].parts.push(part);
}
}
return styles;
}
function addStylesToDom(styles, options) {
for (var i = 0; i < styles.length; i++) {
var item = styles[i];
var domStyle = stylesInDom[item.id];
var j = 0;
if (domStyle) {
domStyle.refs++;
for (; j < domStyle.parts.length; j++) {
domStyle.parts[j](item.parts[j]);
}
for (; j < item.parts.length; j++) {
domStyle.parts.push(addStyle(item.parts[j], options));
}
} else {
var parts = [];
for (; j < item.parts.length; j++) {
parts.push(addStyle(item.parts[j], options));
}
stylesInDom[item.id] = {
id: item.id,
refs: 1,
parts: parts
};
}
}
}
function insertStyleElement(options) {
var style = document.createElement('style');
if (typeof options.attributes.nonce === 'undefined') {
var nonce = true ? __webpack_require__.nc : undefined;
if (nonce) {
options.attributes.nonce = nonce;
}
}
Object.keys(options.attributes).forEach(function (key) {
style.setAttribute(key, options.attributes[key]);
});
if (typeof options.insert === 'function') {
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;
}
function removeStyleElement(style) {
// istanbul ignore if
if (style.parentNode === null) {
return false;
}
style.parentNode.removeChild(style);
}
/* istanbul ignore next */
var replaceText = function replaceText() {
var textStore = [];
return function replace(index, replacement) {
textStore[index] = replacement;
return textStore.filter(Boolean).join('\n');
};
}();
function applyToSingletonTag(style, index, remove, obj) {
var css = remove ? '' : obj.css; // For old IE
/* istanbul ignore if */
if (style.styleSheet) {
style.styleSheet.cssText = replaceText(index, css);
} else {
var cssNode = document.createTextNode(css);
var childNodes = style.childNodes;
if (childNodes[index]) {
style.removeChild(childNodes[index]);
}
if (childNodes.length) {
style.insertBefore(cssNode, childNodes[index]);
} else {
style.appendChild(cssNode);
}
}
}
function applyToTag(style, options, obj) {
var css = obj.css;
var media = obj.media;
var sourceMap = obj.sourceMap;
if (media) {
style.setAttribute('media', media);
}
if (sourceMap && btoa) {
css += "\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), " */");
} // For old IE
/* istanbul ignore if */
if (style.styleSheet) {
style.styleSheet.cssText = css;
} else {
while (style.firstChild) {
style.removeChild(style.firstChild);
}
style.appendChild(document.createTextNode(css));
}
}
var singleton = null;
var singletonCounter = 0;
function addStyle(obj, options) {
var style;
var update;
var remove;
if (options.singleton) {
var styleIndex = singletonCounter++;
style = singleton || (singleton = insertStyleElement(options));
update = applyToSingletonTag.bind(null, style, styleIndex, false);
remove = applyToSingletonTag.bind(null, style, styleIndex, true);
} else {
style = insertStyleElement(options);
update = applyToTag.bind(null, style, options);
remove = function remove() {
removeStyleElement(style);
};
}
update(obj);
return function updateStyle(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 || {};
options.attributes = typeof options.attributes === 'object' ? options.attributes : {}; // Force single-tag solution on IE6-9, which has a hard limit on the # of <style>
// tags it will allow on a page
if (!options.singleton && typeof options.singleton !== 'boolean') {
options.singleton = isOldIE();
}
var styles = listToStyles(list, options);
addStylesToDom(styles, options);
return function update(newList) {
var mayRemove = [];
for (var i = 0; i < styles.length; i++) {
var item = styles[i];
var domStyle = stylesInDom[item.id];
if (domStyle) {
domStyle.refs--;
mayRemove.push(domStyle);
}
}
if (newList) {
var newStyles = listToStyles(newList, options);
addStylesToDom(newStyles, options);
}
for (var _i = 0; _i < mayRemove.length; _i++) {
var _domStyle = mayRemove[_i];
if (_domStyle.refs === 0) {
for (var j = 0; j < _domStyle.parts.length; j++) {
_domStyle.parts[j]();
}
delete stylesInDom[_domStyle.id];
}
}
};
};
/***/ }),
/* 12 */
/***/ (function(module, exports) {
function _arrayWithoutHoles(arr) {
if (Array.isArray(arr)) {
for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) {
arr2[i] = arr[i];
}
return arr2;
}
}
module.exports = _arrayWithoutHoles;
/***/ }),
/* 13 */
/***/ (function(module, exports) {
function _iterableToArray(iter) {
if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter);
}
module.exports = _iterableToArray;
/***/ }),
/* 14 */
/***/ (function(module, exports) {
function _nonIterableSpread() {
throw new TypeError("Invalid attempt to spread non-iterable instance");
}
module.exports = _nonIterableSpread;
/***/ }),
/* 15 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
// EXTERNAL MODULE: ./node_modules/@babel/runtime/regenerator/index.js
var regenerator = __webpack_require__(0);
var regenerator_default = /*#__PURE__*/__webpack_require__.n(regenerator);
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/asyncToGenerator.js
var asyncToGenerator = __webpack_require__(1);
var asyncToGenerator_default = /*#__PURE__*/__webpack_require__.n(asyncToGenerator);
// EXTERNAL MODULE: ./src/style.css
var style = __webpack_require__(8);
// CONCATENATED MODULE: ./src/cc.js
window.criteriaCheck = {};
/* harmony default export */ var cc = (window.criteriaCheck);
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/toConsumableArray.js
var toConsumableArray = __webpack_require__(2);
var toConsumableArray_default = /*#__PURE__*/__webpack_require__.n(toConsumableArray);
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/typeof.js
var helpers_typeof = __webpack_require__(4);
var typeof_default = /*#__PURE__*/__webpack_require__.n(helpers_typeof);
// CONCATENATED MODULE: ./node_modules/date-fns/esm/_lib/toInteger/index.js
function toInteger(dirtyNumber) {
if (dirtyNumber === null || dirtyNumber === true || dirtyNumber === false) {
return NaN;
}
var number = Number(dirtyNumber);
if (isNaN(number)) {
return number;
}
return number < 0 ? Math.ceil(number) : Math.floor(number);
}
// CONCATENATED MODULE: ./node_modules/date-fns/esm/toDate/index.js
/**
* @name toDate
* @category Common Helpers
* @summary Convert the given argument to an instance of Date.
*
* @description
* Convert the given argument to an instance of Date.
*
* If the argument is an instance of Date, the function returns its clone.
*
* If the argument is a number, it is treated as a timestamp.
*
* If the argument is none of the above, the function returns Invalid Date.
*
* **Note**: *all* Date arguments passed to any *date-fns* function is processed by `toDate`.
*
* @param {Date|Number} argument - the value to convert
* @returns {Date} the parsed date in the local time zone
* @throws {TypeError} 1 argument required
*
* @example
* // Clone the date:
* const result = toDate(new Date(2014, 1, 11, 11, 30, 30))
* //=> Tue Feb 11 2014 11:30:30
*
* @example
* // Convert the timestamp to date:
* const result = toDate(1392098430000)
* //=> Tue Feb 11 2014 11:30:30
*/
function toDate(argument) {
if (arguments.length < 1) {
throw new TypeError('1 argument required, but only ' + arguments.length + ' present');
}
var argStr = Object.prototype.toString.call(argument); // Clone the date
if (argument instanceof Date || typeof argument === 'object' && argStr === '[object Date]') {
// Prevent the date to lose the milliseconds when passed to new Date() in IE10
return new Date(argument.getTime());
} else if (typeof argument === 'number' || argStr === '[object Number]') {
return new Date(argument);
} else {
if ((typeof argument === 'string' || argStr === '[object String]') && typeof console !== 'undefined') {
// eslint-disable-next-line no-console
console.warn("Starting with v2.0.0-beta.1 date-fns doesn't accept strings as arguments. Please use `parseISO` to parse strings. See: https://git.io/fjule"); // eslint-disable-next-line no-console
console.warn(new Error().stack);
}
return new Date(NaN);
}
}
// CONCATENATED MODULE: ./node_modules/date-fns/esm/addDays/index.js
/**
* @name addDays
* @category Day Helpers
* @summary Add the specified number of days to the given date.
*
* @description
* Add the specified number of days to the given date.
*
* ### v2.0.0 breaking changes:
*
* - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).
*
* @param {Date|Number} date - the date to be changed
* @param {Number} amount - the amount of days to be added
* @returns {Date} the new date with the days added
* @throws {TypeError} 2 arguments required
*
* @example
* // Add 10 days to 1 September 2014:
* var result = addDays(new Date(2014, 8, 1), 10)
* //=> Thu Sep 11 2014 00:00:00
*/
function addDays(dirtyDate, dirtyAmount) {
if (arguments.length < 2) {
throw new TypeError('2 arguments required, but only ' + arguments.length + ' present');
}
var date = toDate(dirtyDate);
var amount = toInteger(dirtyAmount);
date.setDate(date.getDate() + amount);
return date;
}
// CONCATENATED MODULE: ./node_modules/date-fns/esm/subDays/index.js
/**
* @name subDays
* @category Day Helpers
* @summary Subtract the specified number of days from the given date.
*
* @description
* Subtract the specified number of days from the given date.
*
* ### v2.0.0 breaking changes:
*
* - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).
*
* @param {Date|Number} date - the date to be changed
* @param {Number} amount - the amount of days to be subtracted
* @returns {Date} the new date with the days subtracted
* @throws {TypeError} 2 arguments required
*
* @example
* // Subtract 10 days from 1 September 2014:
* var result = subDays(new Date(2014, 8, 1), 10)
* //=> Fri Aug 22 2014 00:00:00
*/
function subDays(dirtyDate, dirtyAmount) {
if (arguments.length < 2) {
throw new TypeError('2 arguments required, but only ' + arguments.length + ' present');
}
var amount = toInteger(dirtyAmount);
return addDays(dirtyDate, -amount);
}
// CONCATENATED MODULE: ./node_modules/date-fns/esm/getDaysInMonth/index.js
/**
* @name getDaysInMonth
* @category Month Helpers
* @summary Get the number of days in a month of the given date.
*
* @description
* Get the number of days in a month of the given date.
*
* ### v2.0.0 breaking changes:
*
* - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).
*
* @param {Date|Number} date - the given date
* @returns {Number} the number of days in a month
* @throws {TypeError} 1 argument required
*
* @example
* // How many days are in February 2000?
* var result = getDaysInMonth(new Date(2000, 1))
* //=> 29
*/
function getDaysInMonth(dirtyDate) {
if (arguments.length < 1) {
throw new TypeError('1 argument required, but only ' + arguments.length + ' present');
}
var date = toDate(dirtyDate);
var year = date.getFullYear();
var monthIndex = date.getMonth();
var lastDayOfMonth = new Date(0);
lastDayOfMonth.setFullYear(year, monthIndex + 1, 0);
lastDayOfMonth.setHours(0, 0, 0, 0);
return lastDayOfMonth.getDate();
}
// CONCATENATED MODULE: ./node_modules/date-fns/esm/addMonths/index.js
/**
* @name addMonths
* @category Month Helpers
* @summary Add the specified number of months to the given date.
*
* @description
* Add the specified number of months to the given date.
*
* ### v2.0.0 breaking changes:
*
* - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).
*
* @param {Date|Number} date - the date to be changed
* @param {Number} amount - the amount of months to be added
* @returns {Date} the new date with the months added
* @throws {TypeError} 2 arguments required
*
* @example
* // Add 5 months to 1 September 2014:
* var result = addMonths(new Date(2014, 8, 1), 5)
* //=> Sun Feb 01 2015 00:00:00
*/
function addMonths(dirtyDate, dirtyAmount) {
if (arguments.length < 2) {
throw new TypeError('2 arguments required, but only ' + arguments.length + ' present');
}
var date = toDate(dirtyDate);
var amount = toInteger(dirtyAmount);
var desiredMonth = date.getMonth() + amount;
var dateWithDesiredMonth = new Date(0);
dateWithDesiredMonth.setFullYear(date.getFullYear(), desiredMonth, 1);
dateWithDesiredMonth.setHours(0, 0, 0, 0);
var daysInMonth = getDaysInMonth(dateWithDesiredMonth); // Set the last day of the new month
// if the original date was the last day of the longer month
date.setMonth(desiredMonth, Math.min(daysInMonth, date.getDate()));
return date;
}
// CONCATENATED MODULE: ./node_modules/date-fns/esm/subMonths/index.js
/**
* @name subMonths
* @category Month Helpers
* @summary Subtract the specified number of months from the given date.
*
* @description
* Subtract the specified number of months from the given date.
*
* ### v2.0.0 breaking changes:
*
* - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).
*
* @param {Date|Number} date - the date to be changed
* @param {Number} amount - the amount of months to be subtracted
* @returns {Date} the new date with the months subtracted
* @throws {TypeError} 2 arguments required
*
* @example
* // Subtract 5 months from 1 February 2015:
* var result = subMonths(new Date(2015, 1, 1), 5)
* //=> Mon Sep 01 2014 00:00:00
*/
function subMonths(dirtyDate, dirtyAmount) {
if (arguments.length < 2) {
throw new TypeError('2 arguments required, but only ' + arguments.length + ' present');
}
var amount = toInteger(dirtyAmount);
return addMonths(dirtyDate, -amount);
}
// CONCATENATED MODULE: ./node_modules/date-fns/esm/addYears/index.js
/**
* @name addYears
* @category Year Helpers
* @summary Add the specified number of years to the given date.
*
* @description
* Add the specified number of years to the given date.
*
* ### v2.0.0 breaking changes:
*
* - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).
*
* @param {Date|Number} date - the date to be changed
* @param {Number} amount - the amount of years to be added
* @returns {Date} the new date with the years added
* @throws {TypeError} 2 arguments required
*
* @example
* // Add 5 years to 1 September 2014:
* var result = addYears(new Date(2014, 8, 1), 5)
* //=> Sun Sep 01 2019 00:00:00
*/
function addYears(dirtyDate, dirtyAmount) {
if (arguments.length < 2) {
throw new TypeError('2 arguments required, but only ' + arguments.length + ' present');
}
var amount = toInteger(dirtyAmount);
return addMonths(dirtyDate, amount * 12);
}
// CONCATENATED MODULE: ./node_modules/date-fns/esm/subYears/index.js
/**
* @name subYears
* @category Year Helpers
* @summary Subtract the specified number of years from the given date.
*
* @description
* Subtract the specified number of years from the given date.
*
* ### v2.0.0 breaking changes:
*
* - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).
*
* @param {Date|Number} date - the date to be changed
* @param {Number} amount - the amount of years to be subtracted
* @returns {Date} the new date with the years subtracted
* @throws {TypeError} 2 arguments required
*
* @example
* // Subtract 5 years from 1 September 2014:
* var result = subYears(new Date(2014, 8, 1), 5)
* //=> Tue Sep 01 2009 00:00:00
*/
function subYears(dirtyDate, dirtyAmount) {
if (arguments.length < 2) {
throw new TypeError('2 arguments required, but only ' + arguments.length + ' present');
}
var amount = toInteger(dirtyAmount);
return addYears(dirtyDate, -amount);
}
// CONCATENATED MODULE: ./node_modules/date-fns/esm/addMilliseconds/index.js
/**
* @name addMilliseconds
* @category Millisecond Helpers
* @summary Add the specified number of milliseconds to the given date.
*
* @description
* Add the specified number of milliseconds to the given date.
*
* ### v2.0.0 breaking changes:
*
* - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).
*
* @param {Date|Number} date - the date to be changed
* @param {Number} amount - the amount of milliseconds to be added
* @returns {Date} the new date with the milliseconds added
* @throws {TypeError} 2 arguments required
*
* @example
* // Add 750 milliseconds to 10 July 2014 12:45:30.000:
* var result = addMilliseconds(new Date(2014, 6, 10, 12, 45, 30, 0), 750)
* //=> Thu Jul 10 2014 12:45:30.750
*/
function addMilliseconds(dirtyDate, dirtyAmount) {
if (arguments.length < 2) {
throw new TypeError('2 arguments required, but only ' + arguments.length + ' present');
}
var timestamp = toDate(dirtyDate).getTime();
var amount = toInteger(dirtyAmount);
return new Date(timestamp + amount);
}
// CONCATENATED MODULE: ./node_modules/date-fns/esm/addSeconds/index.js
/**
* @name addSeconds
* @category Second Helpers
* @summary Add the specified number of seconds to the given date.
*
* @description
* Add the specified number of seconds to the given date.
*
* ### v2.0.0 breaking changes:
*
* - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).
*
* @param {Date|Number} date - the date to be changed
* @param {Number} amount - the amount of seconds to be added
* @returns {Date} the new date with the seconds added
* @throws {TypeError} 2 arguments required
*
* @example
* // Add 30 seconds to 10 July 2014 12:45:00:
* var result = addSeconds(new Date(2014, 6, 10, 12, 45, 0), 30)
* //=> Thu Jul 10 2014 12:45:30
*/
function addSeconds(dirtyDate, dirtyAmount) {
if (arguments.length < 2) {
throw new TypeError('2 arguments required, but only ' + arguments.length + ' present');
}
var amount = toInteger(dirtyAmount);
return addMilliseconds(dirtyDate, amount * 1000);
}
// CONCATENATED MODULE: ./node_modules/date-fns/esm/subSeconds/index.js
/**
* @name subSeconds
* @category Second Helpers
* @summary Subtract the specified number of seconds from the given date.
*
* @description
* Subtract the specified number of seconds from the given date.
*
* ### v2.0.0 breaking changes:
*
* - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).
*
* @param {Date|Number} date - the date to be changed
* @param {Number} amount - the amount of seconds to be subtracted
* @returns {Date} the new date with the seconds subtracted
* @throws {TypeError} 2 arguments required
*
* @example
* // Subtract 30 seconds from 10 July 2014 12:45:00:
* var result = subSeconds(new Date(2014, 6, 10, 12, 45, 0), 30)
* //=> Thu Jul 10 2014 12:44:30
*/
function subSeconds(dirtyDate, dirtyAmount) {
if (arguments.length < 2) {
throw new TypeError('2 arguments required, but only ' + arguments.length + ' present');
}
var amount = toInteger(dirtyAmount);
return addSeconds(dirtyDate, -amount);
}
// CONCATENATED MODULE: ./src/util.js
// Чтобы сделать возможным автоматическую генерации кода вызова этих функций без использования eval
// (см. https://stackoverflow.com/questions/9464921/dynamically-call-local-function-in-javascript)
var dateFns = {
subDays: subDays,
subMonths: subMonths,
subYears: subYears
};
var captureUserRegexp = /(?:Участник:|Участница:|Обсуждение_участника:|Обсуждение_участницы:|Служебная:Вклад\/)([^#\/]+)/;
/* harmony default export */ var util = ({
prepareDate: function prepareDate(date, isPeriodEnd) {
if (!date) return;
var addOneDay = false;
if (typeof_default()(date) !== 'object') {
if (date.indexOf(':') !== -1) {
date += 'Z';
} else if (isPeriodEnd) {
addOneDay = true;
}
date = new Date(date);
}
if (addOneDay) {
date = addDays(date, 1);
}
return isPeriodEnd ? subSeconds(date, 1) : date;
},
ddmmyyyyToYyyymmdd: function ddmmyyyyToYyyymmdd(ddmmyyyy) {
var date = ddmmyyyy.match(/(\d{2})-(\d{2})-(\d{4})/);
return date && "".concat(date[3], "-").concat(date[2], "-").concat(date[1]);
},
getMonthNumber: function getMonthNumber(mesyats) {
var month = ['января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'].indexOf(mesyats) + 1;
return month || null;
},
plural: function plural(count, one, two, five) {
var cases = [five, one, two, two, two, five]; // 0, 1, 2, 3, 4, 5
return count % 100 > 4 && count % 100 < 20 ? five : cases[Math.min(count % 10, 5)];
},
getLastMatch: function getLastMatch(s, regexp) {
if (!regexp.global) {
console.error('Функция работает только с регулярными выражениями с флагом global.');
return;
}
var matches;
var lastMatch;
while (matches = regexp.exec(s)) {
lastMatch = matches;
}
return lastMatch;
},
filterUserLinks: function filterUserLinks() {
return decodeURIComponent($(this).attr('href')).match(captureUserRegexp);
},
getUserNameFromLink: function getUserNameFromLink($link) {
var userMatches = decodeURIComponent($link.attr('href')).match(captureUserRegexp);
return userMatches && userMatches[1].replace(/&action=edit.*/, '').replace(/_/g, ' ');
},
removeDuplicates: function removeDuplicates(array) {
return toConsumableArray_default()(new Set(array));
},
isntVotePage: function isntVotePage(entry) {
var title = entry.title;
var isAdminElection = title.startsWith('Википедия:Заявки на статус администратора/') && title !== 'Википедия:Заявки на статус администратора/Шаблон' && title !== 'Википедия:Заявки на статус администратора/Шаблон требований к голосующим' && title !== 'Википедия:Заявки на статус администратора/styles.css';
var isBureaucratElection = title.startsWith('Википедия:Заявки на статус администратора/') && title !== 'Википедия:Заявки на статус администратора/Шаблон' && title !== 'Википедия:Заявки на статус администратора/Шаблон требований к голосующим' && title !== 'Википедия:Заявки на статус администратора/styles.css';
var isConfirmation = title.startsWith('Википедия:Конфирмации/') && title !== 'Википедия:Конфирмации/Шаблон';
var isArbcomElection = title.startsWith('Википедия:Выборы арбитров/');
return !(isAdminElection || isBureaucratElection || isConfirmation || isArbcomElection);
},
isntAutomaticAction: function isntAutomaticAction(event) {
var notCountedActions = ['approve-a', 'approve-ia', 'approve2-a', 'approve2-ia', 'autopatrol', 'autopromote', 'delete_redir', 'hit', 'move', 'move_prot', 'move_redir', 'renameuser', 'thank'];
return !(notCountedActions.indexOf(event.action) !== -1 || event.type === 'create' && event.action === 'create' || event.type === 'newusers');
},
createSubFunc: function createSubFunc(value, unit) {
var ending;
switch (unit) {
case 'day':
ending = 'days';
break;
case 'month':
ending = 'months';
break;
case 'year':
ending = 'years';
break;
case 'days':
case 'years':
case 'days':
ending = unit;
}
if (!ending) return;
return function (date) {
return dateFns['sub' + ending[0].toUpperCase() + ending.slice(1)].call(null, date, value);
};
},
calcOptimalLimit: function calcOptimalLimit(neededEditCount) {
return Math.round(Math.max(neededEditCount, 200) * 1.2);
},
otherThanMeets: function otherThanMeets(result) {
return result.conclusion !== 'meets';
}
});
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/classCallCheck.js
var classCallCheck = __webpack_require__(5);
var classCallCheck_default = /*#__PURE__*/__webpack_require__.n(classCallCheck);
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/createClass.js
var createClass = __webpack_require__(6);
var createClass_default = /*#__PURE__*/__webpack_require__.n(createClass);
// CONCATENATED MODULE: ./src/User.js
var isCurrentUserSysop = mw.config.get('wgUserGroups').indexOf('sysop') !== -1;
var User_User =
/*#__PURE__*/
function () {
function User(name) {
classCallCheck_default()(this, User);
this.name = name;
if (cc.admin && cc.admin.isRelevantPage()) {
this.nameWhenVoted = name;
this.votes = [];
}
}
createClass_default()(User, [{
key: "changeName",
value: function changeName(newName) {
this.name = newName;
this.missing = null;
this.infoRequest = null;
}
}, {
key: "checkOne",
value: function () {
var _checkOne = asyncToGenerator_default()(
/*#__PURE__*/
regenerator_default.a.mark(function _callee(criterion) {
var entry, options, result;
return regenerator_default.a.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (cc.apiRateLimit) {
_context.next = 8;
break;
}
_context.t0 = cc.currentUser;
if (!_context.t0) {
_context.next = 6;
break;
}
_context.next = 5;
return cc.currentUser.getUserInfo();
case 5:
_context.t0 = _context.sent;
case 6:
entry = _context.t0;
cc.apiRateLimit = entry && entry.rights && entry.rights.indexOf('apihighlimits') !== -1 ? 5000 : 500;
case 8:
options = Object.assign({}, criterion);
delete options.type;
delete options.text;
if (!criterion.needsManualCheck) {
_context.next = 15;
break;
}
result = {
result: 'needsManualCheck'
};
_context.next = 32;
break;
case 15:
if (!this.missing) {
_context.next = 19;
break;
}
result = {
result: 'userMissing'
};
_context.next = 32;
break;
case 19:
if (!this[criterion.type]) {
_context.next = 25;
break;
}
_context.next = 22;
return this[criterion.type](options);
case 22:
result = _context.sent;
_context.next = 32;
break;
case 25:
if (!cc.customHandlers[criterion.type]) {
_context.next = 31;
break;
}
_context.next = 28;
return cc.customHandlers[criterion.type](this, options);
case 28:
result = _context.sent;
_context.next = 32;
break;
case 31:
throw new Error("\u041D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D \u0442\u0438\u043F \u043A\u0440\u0438\u0442\u0435\u0440\u0438\u044F ".concat(criterion.type, "."));
case 32:
result.user = this;
result.criterion = criterion;
return _context.abrupt("return", result);
case 35:
case "end":
return _context.stop();
}
}
}, _callee, this);
}));
function checkOne(_x) {
return _checkOne.apply(this, arguments);
}
return checkOne;
}()
}, {
key: "check",
value: function () {
var _check = asyncToGenerator_default()(
/*#__PURE__*/
regenerator_default.a.mark(function _callee2(criteria) {
var _this = this;
var results, dataRename, entry, newUserName, renameDate, dataMove, entryMove, newUserNameMove, renameDateMove;
return regenerator_default.a.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
if (!Array.isArray(criteria)) {
criteria = [criteria];
}
case 1:
if (false) {}
_context2.next = 4;
return Promise.all(criteria.map(function (criterion) {
return _this.checkOne(criterion);
}));
case 4:
results = _context2.sent;
if (!(!this.missing && !results.some(function (result) {
return ['notMeets', 'notEnoughRights'].indexOf(result.result) !== -1;
}))) {
_context2.next = 7;
break;
}
return _context2.abrupt("break", 34);
case 7:
_context2.next = 9;
return new mw.Api().get({
action: 'query',
list: 'logevents',
letype: 'renameuser',
letitle: 'Участник:' + this.name,
formatversion: 2
});
case 9:
dataRename = _context2.sent;
entry = dataRename && dataRename.query && dataRename.query.logevents && dataRename.query.logevents[0];
newUserName = entry && entry.params && entry.params.newuser;
renameDate = entry && entry.timestamp && new Date(entry.timestamp);
if (!(newUserName && (!this.votes || !this.votes.length || renameDate > this.votes[0].date))) {
_context2.next = 17;
break;
}
this.changeName(newUserName);
_context2.next = 32;
break;
case 17:
if (!this.missing) {
_context2.next = 31;
break;
}
_context2.next = 20;
return new mw.Api().get({
action: 'query',
list: 'logevents',
letype: 'move',
letitle: 'Участник:' + this.name,
formatversion: 2
});
case 20:
dataMove = _context2.sent;
entryMove = dataMove && dataMove.query && dataMove.query.logevents && dataMove.query.logevents[0];
newUserNameMove = entryMove && entryMove.comment && // Не всегда умещается, см. https://ru.wikipedia.org/w/index.php?title=Участник:Hausratte&action=history
entryMove.comment.indexOf('Автоматическое переим') !== -1 && entryMove.ns && entryMove.ns === 2 && entryMove.params && entryMove.params.target_title && entryMove.params.target_title.slice(entryMove.params.target_title.indexOf(':') + 1);
renameDateMove = entryMove && entryMove.timestamp && new Date(entryMove.timestamp);
if (!(newUserNameMove && (!this.votes || !this.votes.length || renameDateMove > this.votes[0].date))) {
_context2.next = 28;
break;
}
this.changeName(newUserNameMove);
_context2.next = 29;
break;
case 28:
return _context2.abrupt("break", 34);
case 29:
_context2.next = 32;
break;
case 31:
return _context2.abrupt("break", 34);
case 32:
_context2.next = 1;
break;
case 34:
return _context2.abrupt("return", results);
case 35:
case "end":
return _context2.stop();
}
}
}, _callee2, this);
}));
function check(_x2) {
return _check.apply(this, arguments);
}
return check;
}()
}, {
key: "getUserInfo",
value: function getUserInfo() {
var _this2 = this;
if (this.infoRequest) {
return this.infoRequest;
} else {
this.infoRequest = new mw.Api().get({
action: 'query',
list: 'users',
ususers: this.name,
usprop: 'registration|editcount|groups|rights',
formatversion: 2
}).then(function (data) {
var entry = data && data.query && data.query.users && data.query.users[0];
if (entry && entry.missing) {
// Если критериев, требующих получения списка users, нет, это свойство останется
// незаполненным
_this2.missing = true;
}
return entry;
});
return this.infoRequest;
}
}
}, {
key: "requestContribs",
value: function () {
var _requestContribs = asyncToGenerator_default()(
/*#__PURE__*/
regenerator_default.a.mark(function _callee3(options, enoughEditCount) {
var contribs, uccontinue, doContinue, uclimit, data, entries;
return regenerator_default.a.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
contribs = [];
case 1:
uclimit = void 0;
if (enoughEditCount) {
uclimit = Math.min(cc.apiRateLimit, options.filterVotes ? cc.util.calcOptimalLimit(enoughEditCount - contribs.length) : enoughEditCount - contribs.length);
} else {
uclimit = cc.apiRateLimit;
}
_context3.next = 5;
return new mw.Api().get({
list: 'usercontribs',
ucprop: 'title|timestamp',
ucuser: this.name,
ucnamespace: options.ns,
ucstart: options.periodStart && options.periodStart.toISOString(),
ucend: options.periodEnd && options.periodEnd.toISOString(),
ucdir: 'newer',
uclimit: uclimit,
uccontinue: uccontinue,
formatversion: 2
});
case 5:
data = _context3.sent;
entries = data && data.query && data.query.usercontribs;
if (entries) {
_context3.next = 9;
break;
}
return _context3.abrupt("break", 15);
case 9:
if (options.filterVotes) {
entries = entries.filter(cc.util.isntVotePage);
}
contribs.push.apply(contribs, toConsumableArray_default()(entries));
uccontinue = data && data["continue"] && data["continue"].uccontinue;
doContinue = uccontinue && (!enoughEditCount || contribs.length < enoughEditCount);
if (options.filterVotes && uclimit < cc.apiRateLimit && doContinue) {
console.info("\u041D\u0435\u043E\u043F\u0442\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0440\u0430\u0441\u0447\u0451\u0442 \u0432 \u0444\u0443\u043D\u043A\u0446\u0438\u0438 calcOptimalLimit: \u0437\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043E ".concat(uclimit, ", \u043D\u0430\u0448\u043B\u043E\u0441\u044C ").concat(entries.length, ", \u043F\u0440\u0438\u0448\u043B\u043E\u0441\u044C \u0437\u0430\u043F\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044C \u0435\u0449\u0451 \u0437\u0430\u043F\u0438\u0441\u0438. \u0423\u0447\u0430\u0441\u0442\u043D\u0438\u043A ").concat(this.name, "."), entries);
}
case 14:
if (doContinue) {
_context3.next = 1;
break;
}
case 15:
return _context3.abrupt("return", contribs);
case 16:
case "end":
return _context3.stop();
}
}
}, _callee3, this);
}));
function requestContribs(_x3, _x4) {
return _requestContribs.apply(this, arguments);
}
return requestContribs;
}()
}, {
key: "requestDeletedContribs",
value: function () {
var _requestDeletedContribs = asyncToGenerator_default()(
/*#__PURE__*/
regenerator_default.a.mark(function _callee4(options, enoughEditCount) {
var deletedContribs, adrcontinue, doContinue, adrlimit, data, entries, revisions, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, entry;
return regenerator_default.a.wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
deletedContribs = [];
case 1:
adrlimit = void 0;
if (enoughEditCount) {
adrlimit = Math.min(cc.apiRateLimit, options.filterVotes ? cc.util.calcOptimalLimit(enoughEditCount - deletedContribs.length) : enoughEditCount - deletedContribs.length);
} else {
adrlimit = cc.apiRateLimit;
}
_context4.next = 5;
return new mw.Api().get({
action: 'query',
list: 'alldeletedrevisions',
adrprop: 'timestamp',
adruser: this.name,
adrstart: options.periodStart && options.periodStart.toISOString(),
adrend: options.periodEnd && options.periodEnd.toISOString(),
adrdir: 'newer',
adrlimit: adrlimit,
adrcontinue: adrcontinue,
formatversion: 2
});
case 5:
data = _context4.sent;
entries = data && data.query && data.query.alldeletedrevisions;
if (entries) {
_context4.next = 9;
break;
}
return _context4.abrupt("break", 35);
case 9:
if (options.filterVotes) {
entries = entries.filter(cc.util.isntVotePage);
}
revisions = [];
_iteratorNormalCompletion = true;
_didIteratorError = false;
_iteratorError = undefined;
_context4.prev = 14;
for (_iterator = entries[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
entry = _step.value;
revisions.push.apply(revisions, toConsumableArray_default()(entry.revisions));
}
_context4.next = 22;
break;
case 18:
_context4.prev = 18;
_context4.t0 = _context4["catch"](14);
_didIteratorError = true;
_iteratorError = _context4.t0;
case 22:
_context4.prev = 22;
_context4.prev = 23;
if (!_iteratorNormalCompletion && _iterator["return"] != null) {
_iterator["return"]();
}
case 25:
_context4.prev = 25;
if (!_didIteratorError) {
_context4.next = 28;
break;
}
throw _iteratorError;
case 28:
return _context4.finish(25);
case 29:
return _context4.finish(22);
case 30:
deletedContribs.push.apply(deletedContribs, revisions);
adrcontinue = data && data["continue"] && data["continue"].adrcontinue;
doContinue = adrcontinue && (!enoughEditCount || deletedContribs.length < enoughEditCount);
if (options.filterVotes && adrlimit < cc.apiRateLimit && doContinue) {
console.info("\u041D\u0435\u043E\u043F\u0442\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0440\u0430\u0441\u0447\u0451\u0442 \u0432 \u0444\u0443\u043D\u043A\u0446\u0438\u0438 calcOptimalLimit: \u0437\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043E ".concat(adrlimit, ", \u043D\u0430\u0448\u043B\u043E\u0441\u044C ").concat(revisions.length, ", \u043F\u0440\u0438\u0448\u043B\u043E\u0441\u044C \u0437\u0430\u043F\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044C \u0435\u0449\u0451 \u0437\u0430\u043F\u0438\u0441\u0438. \u0423\u0447\u0430\u0441\u0442\u043D\u0438\u043A ").concat(this.name, "."), entries);
}
case 34:
if (doContinue) {
_context4.next = 1;
break;
}
case 35:
return _context4.abrupt("return", deletedContribs);
case 36:
case "end":
return _context4.stop();
}
}
}, _callee4, this, [[14, 18, 22, 30], [23,, 25, 29]]);
}));
function requestDeletedContribs(_x5, _x6) {
return _requestDeletedContribs.apply(this, arguments);
}
return requestDeletedContribs;
}()
}, {
key: "collectActions",
value: function () {
var _collectActions = asyncToGenerator_default()(
/*#__PURE__*/
regenerator_default.a.mark(function _callee5(options, enoughActionCount) {
var actions, contribs, deletedContribs, lecontinue, data, entries;
return regenerator_default.a.wrap(function _callee5$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
actions = [];
if (options.deleted == undefined) {
options.deleted = true;
}
_context5.next = 4;
return this.requestContribs(options, enoughActionCount);
case 4:
contribs = _context5.sent;
actions.push.apply(actions, toConsumableArray_default()(contribs));
if (!(options.deleted && isCurrentUserSysop && (!enoughActionCount || actions.length < enoughActionCount))) {
_context5.next = 11;
break;
}
_context5.next = 9;
return this.requestDeletedContribs(options, enoughActionCount && enoughActionCount - actions.length);
case 9:
deletedContribs = _context5.sent;
actions.push.apply(actions, toConsumableArray_default()(deletedContribs));
case 11:
if (!(!enoughActionCount || actions.length < enoughActionCount)) {
_context5.next = 22;
break;
}
case 12:
_context5.next = 14;
return new mw.Api().get({
action: 'query',
list: 'logevents',
leprop: 'timestamp|type',
leuser: this.name,
lestart: options.periodStart && options.periodStart.toISOString(),
leend: options.periodEnd && options.periodEnd.toISOString(),
ledir: 'newer',
lelimit: cc.apiRateLimit,
lecontinue: lecontinue,
formatversion: 2
});
case 14:
data = _context5.sent;
entries = data && data.query && data.query.logevents;
if (entries) {
_context5.next = 18;
break;
}
return _context5.abrupt("break", 22);
case 18:
entries = entries.filter(cc.util.isntAutomaticAction);
actions.push.apply(actions, toConsumableArray_default()(entries));
lecontinue = data && data["continue"] && data["continue"].lecontinue;
case 21:
if (lecontinue && (!enoughActionCount || actions.length < enoughActionCount)) {
_context5.next = 12;
break;
}
case 22:
actions.sort(function (a, b) {
if (a.timestamp > b.timestamp) {
return 1;
} else if (a.timestamp < b.timestamp) {
return -1;
} else {
return 0;
}
});
return _context5.abrupt("return", actions);
case 24:
case "end":
return _context5.stop();
}
}
}, _callee5, this);
}));
function collectActions(_x7, _x8) {
return _collectActions.apply(this, arguments);
}
return collectActions;
}()
/* Функции типов критериев */
}, {
key: "editCountNotLess",
value: function () {
var _editCountNotLess = asyncToGenerator_default()(
/*#__PURE__*/
regenerator_default.a.mark(function _callee6(options) {
var safeValue, edits, deletedContribs;
return regenerator_default.a.wrap(function _callee6$(_context6) {
while (1) {
switch (_context6.prev = _context6.next) {
case 0:
options.periodStart = cc.util.prepareDate(options.periodStart);
options.periodEnd = cc.util.prepareDate(options.periodEnd, true);
options.meaningful = Boolean(Number(options.meaningful));
options.deleted = Boolean(Number(options.deleted));
if (options.meaningful && options.margin == undefined) {
options.margin = 0.5;
}
if (options.margin == undefined) {
options.margin = 0;
}
safeValue = Math.round(options.value * (1 + options.margin));
_context6.next = 9;
return this.requestContribs(options, safeValue);
case 9:
edits = _context6.sent;
if (!(edits.length >= safeValue)) {
_context6.next = 14;
break;
}
return _context6.abrupt("return", {
result: 'meets',
editCount: edits.length
});
case 14:
if (!(options.deleted && isCurrentUserSysop)) {
_context6.next = 19;
break;
}
_context6.next = 17;
return this.requestDeletedContribs(options, safeValue - edits.length);
case 17:
deletedContribs = _context6.sent;
edits.push.apply(edits, toConsumableArray_default()(deletedContribs));
case 19:
if (!(edits.length >= safeValue)) {
_context6.next = 23;
break;
}
return _context6.abrupt("return", {
result: 'meets',
editCount: edits.length,
edits: edits
});
case 23:
if (!(edits.length >= options.value)) {
_context6.next = 27;
break;
}
return _context6.abrupt("return", {
result: !options.deleted || isCurrentUserSysop ? 'possiblyMeets' : 'notEnoughRights',
editCount: edits.length,
edits: edits
});
case 27:
return _context6.abrupt("return", {
result: !options.deleted || isCurrentUserSysop ? 'notMeets' : 'notEnoughRights',
editCount: edits.length,
edits: edits
});
case 28:
case "end":
return _context6.stop();
}
}
}, _callee6, this);
}));
function editCountNotLess(_x9) {
return _editCountNotLess.apply(this, arguments);
}
return editCountNotLess;
}()
}, {
key: "registrationDateNotLater",
value: function () {
var _registrationDateNotLater = asyncToGenerator_default()(
/*#__PURE__*/
regenerator_default.a.mark(function _callee7(options) {
var entry, registrationDate, overallEditCount, dataUc;
return regenerator_default.a.wrap(function _callee7$(_context7) {
while (1) {
switch (_context7.prev = _context7.next) {
case 0:
options.value = cc.util.prepareDate(options.value, true);
_context7.next = 3;
return this.getUserInfo();
case 3:
entry = _context7.sent;
if (!this.missing) {
_context7.next = 6;
break;
}
return _context7.abrupt("return", {
result: 'userMissing'
});
case 6:
registrationDate = entry && entry.registration && new Date(entry.registration);
overallEditCount = entry && entry.editcount; // У зарегистрировавшихся до 2 декабря 2005 года нет даты регистрации
if (!(entry && !entry.registration)) {
_context7.next = 13;
break;
}
_context7.next = 11;
return new mw.Api().get({
action: 'query',
list: 'usercontribs',
ucuser: this.name,
ucdir: 'newer',
uclimit: 1,
formatversion: 2
});
case 11:
dataUc = _context7.sent;
registrationDate = dataUc && dataUc.query && dataUc.query.usercontribs && dataUc.query.usercontribs[0] && dataUc.query.usercontribs[0].timestamp && new Date(dataUc.query.usercontribs[0].timestamp);
case 13:
return _context7.abrupt("return", {
result: registrationDate <= options.value ? 'meets' : 'notMeets',
registrationDate: registrationDate,
overallEditCount: overallEditCount
});
case 14:
case "end":
return _context7.stop();
}
}
}, _callee7, this);
}));
function registrationDateNotLater(_x10) {
return _registrationDateNotLater.apply(this, arguments);
}
return registrationDateNotLater;
}()
}, {
key: "editsBetweenDates",
value: function () {
var _editsBetweenDates = asyncToGenerator_default()(
/*#__PURE__*/
regenerator_default.a.mark(function _callee8(options) {
var data;
return regenerator_default.a.wrap(function _callee8$(_context8) {
while (1) {
switch (_context8.prev = _context8.next) {
case 0:
options.periodStart = cc.util.prepareDate(options.periodStart);
options.periodEnd = cc.util.prepareDate(options.periodEnd, true);
_context8.next = 4;
return new mw.Api().get({
action: 'query',
list: 'usercontribs',
ucuser: this.name,
ucstart: options.periodStart.toISOString(),
ucend: options.periodEnd.toISOString(),
ucdir: 'newer',
uclimit: 1,
formatversion: 2
});
case 4:
data = _context8.sent;
if (!(data && data.query && data.query.usercontribs && data.query.usercontribs.length)) {
_context8.next = 9;
break;
}
return _context8.abrupt("return", {
result: 'meets'
});
case 9:
return _context8.abrupt("return", {
result: 'notMeets'
});
case 10:
case "end":
return _context8.stop();
}
}
}, _callee8, this);
}));
function editsBetweenDates(_x11) {
return _editsBetweenDates.apply(this, arguments);
}
return editsBetweenDates;
}()
}, {
key: "hadFlagFor",
value: function () {
var _hadFlagFor = asyncToGenerator_default()(
/*#__PURE__*/
regenerator_default.a.mark(function _callee9(options) {
var lecontinue, entries, data, logEvents, multiplierMin, multiplierMax, neededPeriodMin, neededPeriodMax, periodsCount, result, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, flag, period, lastEndedHavingFlag, lastStartedHavingFlag, i, entry, newGroups, startedHavingFlag, endedHavingFlag, laterEntry, laterNewGroups, subFunc;
return regenerator_default.a.wrap(function _callee9$(_context9) {
while (1) {
switch (_context9.prev = _context9.next) {
case 0:
options.referenceDate = cc.util.prepareDate(options.referenceDate, true);
if (!options.flags) {
options.flags = options.flag && [options.flag];
}
entries = [];
case 3:
_context9.next = 5;
return new mw.Api().get({
action: 'query',
list: 'logevents',
letype: 'rights',
letitle: 'Участник:' + this.name,
leend: options.referenceDate && options.referenceDate.toISOString(),
lelimit: cc.apiRateLimit,
ledir: 'newer',
formatversion: 2
});
case 5:
data = _context9.sent;
logEvents = data && data.query && data.query.logevents;
if (logEvents) {
_context9.next = 9;
break;
}
return _context9.abrupt("break", 12);
case 9:
entries.push.apply(entries, toConsumableArray_default()(logEvents));
lecontinue = data && data["continue"] && data["continue"].lecontinue;
case 11:
if (lecontinue) {
_context9.next = 3;
break;
}
case 12:
_context9.t0 = options.unit;
_context9.next = _context9.t0 === 'year' ? 15 : _context9.t0 === 'years' ? 15 : _context9.t0 === 'month' ? 18 : _context9.t0 === 'months' ? 18 : _context9.t0 === 'day' ? 21 : _context9.t0 === 'days' ? 21 : 22;
break;
case 15:
multiplierMin = 1000 * 60 * 60 * 24 * 365;
multiplierMax = 1000 * 60 * 60 * 24 * 366;
return _context9.abrupt("break", 22);
case 18:
multiplierMin = 1000 * 60 * 60 * 24 * 28;
multiplierMax = 1000 * 60 * 60 * 24 * 31;
return _context9.abrupt("break", 22);
case 21:
multiplierMin = multiplierMax = 1000 * 60 * 60 * 24;
case 22:
neededPeriodMin = multiplierMin * options.value;
neededPeriodMax = multiplierMax * options.value;
periodsCount = 0;
_iteratorNormalCompletion2 = true;
_didIteratorError2 = false;
_iteratorError2 = undefined;
_context9.prev = 28;
_iterator2 = options.flags[Symbol.iterator]();
case 30:
if (_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done) {
_context9.next = 72;
break;
}
flag = _step2.value;
period = 0;
lastEndedHavingFlag = void 0;
lastStartedHavingFlag = void 0;
i = 0;
case 36:
if (!(i < entries.length)) {
_context9.next = 58;
break;
}
entry = entries[i];
newGroups = entry.params && entry.params.newgroups;
if (!(newGroups && newGroups.indexOf(flag) !== -1)) {
_context9.next = 55;
break;
}
startedHavingFlag = new Date(entry.timestamp);
lastStartedHavingFlag = startedHavingFlag;
endedHavingFlag = void 0;
i++;
case 44:
if (!(i < entries.length)) {
_context9.next = 53;
break;
}
laterEntry = entries[i];
laterNewGroups = laterEntry.params && laterEntry.params.newgroups;
if (!(laterNewGroups && !(laterNewGroups.indexOf(flag) !== -1))) {
_context9.next = 50;
break;
}
lastEndedHavingFlag = endedHavingFlag = new Date(entries[i].timestamp);
return _context9.abrupt("break", 53);
case 50:
i++;
_context9.next = 44;
break;
case 53:
period += (endedHavingFlag ? endedHavingFlag.getTime() : Date.now()) - startedHavingFlag.getTime();
periodsCount++;
case 55:
i++;
_context9.next = 36;
break;
case 58:
if (!(period >= neededPeriodMax)) {
_context9.next = 62;
break;
}
return _context9.abrupt("return", {
result: 'meets',
flag: flag,
period: period
});
case 62:
if (!(periodsCount === 1)) {
_context9.next = 68;
break;
}
// Если период всего один, вычисляем по классическим правилам для дат (например, 1 месяц
// назад для 31 марта — 28 февраля в невисокосном году)
subFunc = cc.util.createSubFunc(options.value, options.unit);
if (!(subFunc(lastEndedHavingFlag) > lastStartedHavingFlag)) {
_context9.next = 66;
break;
}
return _context9.abrupt("return", {
result: 'meets',
flag: flag,
period: period
});
case 66:
_context9.next = 69;
break;
case 68:
if (period >= neededPeriodMin) {
// Если периодов несколько и трактовка количества месяцев/лет может отличаться, оставляем
// выводы на усмотрение бюрократам
result = {
result: 'possiblyMeets',
flag: flag,
period: period
};
}
case 69:
_iteratorNormalCompletion2 = true;
_context9.next = 30;
break;
case 72:
_context9.next = 78;
break;
case 74:
_context9.prev = 74;
_context9.t1 = _context9["catch"](28);
_didIteratorError2 = true;
_iteratorError2 = _context9.t1;
case 78:
_context9.prev = 78;
_context9.prev = 79;
if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) {
_iterator2["return"]();
}
case 81:
_context9.prev = 81;
if (!_didIteratorError2) {
_context9.next = 84;
break;
}
throw _iteratorError2;
case 84:
return _context9.finish(81);
case 85:
return _context9.finish(78);
case 86:
return _context9.abrupt("return", result || {
result: 'notMeets'
});
case 87:
case "end":
return _context9.stop();
}
}
}, _callee9, this, [[28, 74, 78, 86], [79,, 81, 85]]);
}));
function hadFlagFor(_x12) {
return _hadFlagFor.apply(this, arguments);
}
return hadFlagFor;
}()
}, {
key: "notLostFlagInLast",
value: function () {
var _notLostFlagInLast = asyncToGenerator_default()(
/*#__PURE__*/
regenerator_default.a.mark(function _callee10(options) {
var subFunc, lecontinue, entries, data, logEvents, _iteratorNormalCompletion3, _didIteratorError3, _iteratorError3, _iterator3, _step3, flag, _iteratorNormalCompletion4, _didIteratorError4, _iteratorError4, _iterator4, _step4, entry, oldGroups, newGroups;
return regenerator_default.a.wrap(function _callee10$(_context10) {
while (1) {
switch (_context10.prev = _context10.next) {
case 0:
options.referenceDate = cc.util.prepareDate(options.referenceDate || new Date());
subFunc = cc.util.createSubFunc(options.value, options.unit);
if (!options.flags) {
options.flags = options.flag && [options.flag];
}
entries = [];
case 4:
_context10.next = 6;
return new mw.Api().get({
action: 'query',
list: 'logevents',
letype: 'rights',
letitle: 'Участник:' + this.name,
lestart: subFunc(options.referenceDate).toISOString(),
leend: options.referenceDate.toISOString(),
lelimit: cc.apiRateLimit,
ledir: 'newer',
formatversion: 2
});
case 6:
data = _context10.sent;
logEvents = data && data.query && data.query.logevents;
if (logEvents) {
_context10.next = 10;
break;
}
return _context10.abrupt("break", 13);
case 10:
entries.push.apply(entries, toConsumableArray_default()(logEvents));
lecontinue = data && data["continue"] && data["continue"].lecontinue;
case 12:
if (lecontinue) {
_context10.next = 4;
break;
}
case 13:
_iteratorNormalCompletion3 = true;
_didIteratorError3 = false;
_iteratorError3 = undefined;
_context10.prev = 16;
_iterator3 = options.flags[Symbol.iterator]();
case 18:
if (_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done) {
_context10.next = 51;
break;
}
flag = _step3.value;
_iteratorNormalCompletion4 = true;
_didIteratorError4 = false;
_iteratorError4 = undefined;
_context10.prev = 23;
_iterator4 = entries[Symbol.iterator]();
case 25:
if (_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done) {
_context10.next = 34;
break;
}
entry = _step4.value;
oldGroups = entry.params && entry.params.oldgroups;
newGroups = entry.params && entry.params.newgroups;
if (!(oldGroups && newGroups && oldGroups.indexOf(flag) !== -1 && !(newGroups.indexOf(flag) !== -1))) {
_context10.next = 31;
break;
}
return _context10.abrupt("return", {
result: 'notMeets',
flag: flag,
lostFlagTimestamp: entry.timestamp
});
case 31:
_iteratorNormalCompletion4 = true;
_context10.next = 25;
break;
case 34:
_context10.next = 40;
break;
case 36:
_context10.prev = 36;
_context10.t0 = _context10["catch"](23);
_didIteratorError4 = true;
_iteratorError4 = _context10.t0;
case 40:
_context10.prev = 40;
_context10.prev = 41;
if (!_iteratorNormalCompletion4 && _iterator4["return"] != null) {
_iterator4["return"]();
}
case 43:
_context10.prev = 43;
if (!_didIteratorError4) {
_context10.next = 46;
break;
}
throw _iteratorError4;
case 46:
return _context10.finish(43);
case 47:
return _context10.finish(40);
case 48:
_iteratorNormalCompletion3 = true;
_context10.next = 18;
break;
case 51:
_context10.next = 57;
break;
case 53:
_context10.prev = 53;
_context10.t1 = _context10["catch"](16);
_didIteratorError3 = true;
_iteratorError3 = _context10.t1;
case 57:
_context10.prev = 57;
_context10.prev = 58;
if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) {
_iterator3["return"]();
}
case 60:
_context10.prev = 60;
if (!_didIteratorError3) {
_context10.next = 63;
break;
}
throw _iteratorError3;
case 63:
return _context10.finish(60);
case 64:
return _context10.finish(57);
case 65:
return _context10.abrupt("return", {
result: 'meets'
});
case 66:
case "end":
return _context10.stop();
}
}
}, _callee10, this, [[16, 53, 57, 65], [23, 36, 40, 48], [41,, 43, 47], [58,, 60, 64]]);
}));
function notLostFlagInLast(_x13) {
return _notLostFlagInLast.apply(this, arguments);
}
return notLostFlagInLast;
}()
}, {
key: "notInactiveFor",
value: function () {
var _notInactiveFor = asyncToGenerator_default()(
/*#__PURE__*/
regenerator_default.a.mark(function _callee11(options) {
var subFunc, actions, i, previousDate, currentDate;
return regenerator_default.a.wrap(function _callee11$(_context11) {
while (1) {
switch (_context11.prev = _context11.next) {
case 0:
options.periodStart = cc.util.prepareDate(options.periodStart);
options.periodEnd = cc.util.prepareDate(options.periodEnd, true);
subFunc = cc.util.createSubFunc(options.value, options.unit);
_context11.next = 5;
return this.collectActions(options);
case 5:
actions = _context11.sent;
i = 0;
case 7:
if (!(i <= actions.length)) {
_context11.next = 15;
break;
}
previousDate = i === 0 ? options.periodStart : new Date(actions[i - 1].timestamp);
currentDate = i === actions.length ? options.periodEnd : new Date(actions[i].timestamp);
if (!(subFunc(currentDate) > previousDate)) {
_context11.next = 12;
break;
}
return _context11.abrupt("return", {
result: isCurrentUserSysop ? 'notMeets' : 'notEnoughRights',
inactivityPeriodStart: previousDate,
inactivityPeriodEnd: currentDate
});
case 12:
i++;
_context11.next = 7;
break;
case 15:
return _context11.abrupt("return", {
result: 'meets'
});
case 16:
case "end":
return _context11.stop();
}
}
}, _callee11, this);
}));
function notInactiveFor(_x14) {
return _notInactiveFor.apply(this, arguments);
}
return notInactiveFor;
}()
}, {
key: "actionCountNotLess",
value: function () {
var _actionCountNotLess = asyncToGenerator_default()(
/*#__PURE__*/
regenerator_default.a.mark(function _callee12(options) {
var actions;
return regenerator_default.a.wrap(function _callee12$(_context12) {
while (1) {
switch (_context12.prev = _context12.next) {
case 0:
options.periodStart = cc.util.prepareDate(options.periodStart);
options.periodEnd = cc.util.prepareDate(options.periodEnd, true);
_context12.next = 4;
return this.collectActions(options, options.value);
case 4:
actions = _context12.sent;
if (!(actions.length < options.value)) {
_context12.next = 9;
break;
}
return _context12.abrupt("return", {
result: isCurrentUserSysop ? 'notMeets' : 'notEnoughRights',
actionCount: actions.length,
actions: actions
});
case 9:
return _context12.abrupt("return", {
result: 'meets',
actionCount: actions.length,
actions: actions
});
case 10:
case "end":
return _context12.stop();
}
}
}, _callee12, this);
}));
function actionCountNotLess(_x15) {
return _actionCountNotLess.apply(this, arguments);
}
return actionCountNotLess;
}()
}, {
key: "noActiveBlockBetweenDates",
value: function () {
var _noActiveBlockBetweenDates = asyncToGenerator_default()(
/*#__PURE__*/
regenerator_default.a.mark(function _callee13(options) {
var data, entry, partiallyBlockedInSpecifiedNs;
return regenerator_default.a.wrap(function _callee13$(_context13) {
while (1) {
switch (_context13.prev = _context13.next) {
case 0:
options.periodStart = cc.util.prepareDate(options.periodStart);
options.periodEnd = cc.util.prepareDate(options.periodEnd, true);
_context13.next = 4;
return new mw.Api().get({
action: 'query',
list: 'blocks',
bkprop: 'timestamp|expiry|restrictions',
bkuser: this.name,
formatversion: 2
});
case 4:
data = _context13.sent;
entry = data && data.query && data.query.blocks && data.query.blocks[0];
if (entry) {
_context13.next = 8;
break;
}
return _context13.abrupt("return");
case 8:
partiallyBlockedInSpecifiedNs = false;
if (options.ns && entry.restrictions && entry.restrictions.namespaces && entry.restrictions.namespaces.indexOf(options.ns) !== -1) {
partiallyBlockedInSpecifiedNs = true;
}
if (!(new Date(entry.timestamp) <= options.periodStart && (entry.expiry === 'infinity' || new Date(entry.expiry) > options.periodEnd) && (!entry.restrictions || Array.isArray(entry.restrictions) && !entry.restrictions.length || partiallyBlockedInSpecifiedNs))) {
_context13.next = 14;
break;
}
return _context13.abrupt("return", {
result: 'notMeets'
});
case 14:
return _context13.abrupt("return", {
result: 'meets'
});
case 15:
case "end":
return _context13.stop();
}
}
}, _callee13, this);
}));
function noActiveBlockBetweenDates(_x16) {
return _noActiveBlockBetweenDates.apply(this, arguments);
}
return noActiveBlockBetweenDates;
}()
}]);
return User;
}();
// CONCATENATED MODULE: ./src/applications/admin.js
function extractVotes() {
return $('#За').closest('h3').nextUntil('h3:has([id^="Вопросы"])').filter('ol').children('li').map(function (i, li) {
var date;
var $li = $(li);
var $el = $li.clone();
$el.find('li, dd').remove();
var text = $el.text();
var matches = cc.util.getLastMatch(text, /(\b\d?\d):(\d\d), (\d\d?) ([а-я]+) (\d\d\d\d) \(UTC\)/g);
if (matches) {
var hours = matches[1];
var minutes = matches[2];
var day = matches[3];
var month = cc.util.getMonthNumber(matches[4]);
var year = matches[5];
if (!month) return;
date = new Date("".concat(year, "-").concat(month, "-").concat(day, " ").concat(hours, ":").concat(minutes, "Z"));
}
var $userLinks = $el.find('a').filter(cc.util.filterUserLinks);
var usersInMsg = $userLinks.map(function (i, el) {
return cc.util.getUserNameFromLink($(el));
}).get();
var authorName = usersInMsg[usersInMsg.length - 1];
if (!authorName) return;
var author = cc.getUser(authorName);
var vote = {
$el: $li,
author: author,
date: date,
confusingAuthor: cc.util.removeDuplicates(usersInMsg).length > 1 && (!/\(UTC\)\s*/.test(text) || text.indexOf('(UTC)') !== text.lastIndexOf('(UTC)') || $userLinks.closest('small').length),
anchor: "vote".concat(i)
};
author.votes.push(vote);
return vote;
}).get();
}
function updateButtonsBlock() {
$buttonsBlock.children().detach();
$(buttons).map(function (i, el) {
return el.hide ? null : el.$element[0];
}).appendTo($buttonsBlock);
}
function showButton(id) {
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = buttons[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var button = _step.value;
if (id === button.bindings.click[0].method.name) {
button.hide = false;
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator["return"] != null) {
_iterator["return"]();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
updateButtonsBlock();
}
function hideButton(id) {
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = buttons[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var button = _step2.value;
if (id === button.bindings.click[0].method.name) {
button.hide = true;
}
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) {
_iterator2["return"]();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
updateButtonsBlock();
}
var $criteriaBox;
var buttons;
var $buttonsBlock;
var rawCriteria = false;
var candidate;
var voterCriteria;
var candidateCriteria;
var admin_votingPeriod;
var votingPeriodOk;
var resultsTable;
var _isRelevantPage;
/* harmony default export */ var admin = ({
getAdminCandidateCriteria: function getAdminCandidateCriteria(votingPeriod) {
return [{
text: 'стаж регистрации в русскоязычном разделе Википедии не менее 6 месяцев',
type: 'registrationDateNotLater',
// Прибавляем один день согласно тому, как считается разница в критериях для голосующих и на
// выборах в АК
value: addDays(subMonths(votingPeriod.startTimeless, 6), 1)
}, {
text: 'не менее 1000 правок',
type: 'editCountNotLess',
value: 1000,
periodEnd: votingPeriod.start
}, {
text: 'не баллотировавшийся в администраторы в последние 3 месяца',
needsManualCheck: true
}, {
text: 'не лишённый полномочий администратора в последние 3 месяца',
type: 'notLostFlagInLast',
flag: 'sysop',
value: 3,
unit: 'month',
referenceDate: votingPeriod.startTimeless
}];
},
getBureaucratCandidateCriteria: function getBureaucratCandidateCriteria(votingPeriod) {
return [{
text: 'стаж регистрации в русскоязычном разделе Википедии не менее 2 лет',
type: 'registrationDateNotLater',
// Прибавляем один день согласно тому, как считается разница в критериях для голосующих и на
// выборах в АК
value: addDays(subYears(votingPeriod.startTimeless, 2), 1)
}, {
text: 'не менее 2000 правок',
type: 'editCountNotLess',
value: 2000,
periodEnd: votingPeriod.start
}, {
text: 'выполнявший обязанности администратора Википедии либо арбитра в течение не менее полугода до момента выдвижения',
type: 'hadFlagFor',
flags: ['sysop', 'arbcom'],
value: 6,
unit: 'month',
referenceDate: votingPeriod.startTimeless
}, {
text: 'не имевший за последний год периодов неактивности в русской Википедии длительностью более 3 месяцев',
type: 'notInactiveFor',
value: 3,
unit: 'month',
periodStart: subYears(votingPeriod.startTimeless, 1),
periodEnd: votingPeriod.startTimeless
}, {
text: 'не имевший за последние полгода до момента выдвижения взысканий, наложенных Арбитражным комитетом по итогам рассмотрения исков против кандидата',
needsManualCheck: true,
comment: '(См. [[Арбитраж:Решения]].)'
}, {
text: 'не баллотировавшийся в бюрократы в последние 3 месяца',
needsManualCheck: true
}, {
text: 'не лишённый полномочий бюрократа в последние 3 месяца',
type: 'notLostFlagInLast',
flag: 'bureaucrat',
value: 3,
unit: 'month',
referenceDate: votingPeriod.startTimeless
}];
},
isRelevantPage: function isRelevantPage() {
if (typeof _isRelevantPage === 'undefined') {
_isRelevantPage = Boolean($('.criteriaCheck-adminElection, .criteriaCheck-bureaucratElection, .criteriaCheck-confirmation').length);
}
return _isRelevantPage;
},
main: function main() {
// Данные по голосующим
$criteriaBox = $('.criteriaCheck-criteria');
voterCriteria = cc.extractCriteria($criteriaBox);
if (!$criteriaBox.length) {
$criteriaBox = $('#Требования_к_голосующим').closest('h3').next('div');
$criteriaBox.addClass('criteriaCheck-criteria');
}
var criteria4End;
if (!voterCriteria.length) {
rawCriteria = true;
var $criteria = $criteriaBox.find('li');
var criteria1Text = $criteria.eq(0).text().replace(/[,;.]$/, '');
var criteria1Matches = criteria1Text.match(/(\d+) прав/);
var criteria1Value = criteria1Matches && Number(criteria1Matches[1]);
var criteria2Text = $criteria.eq(1).text().replace(/[,;.]$/, '');
var criteria2Matches = criteria2Text.match(/\d{2}-\d{2}-\d{4}/);
var criteria2Value = criteria2Matches && cc.util.ddmmyyyyToYyyymmdd(criteria2Matches[0]);
var criteria3Text = $criteria.eq(2).text().replace(/[,;.]$/, '');
var criteria3Matches = criteria3Text.match(/(\d{2}-\d{2}-\d{4}) по (\d{2}-\d{2}-\d{4})/);
var criteria3Start = criteria3Matches && cc.util.ddmmyyyyToYyyymmdd(criteria3Matches[1]);
var criteria3End = criteria3Matches && cc.util.ddmmyyyyToYyyymmdd(criteria3Matches[2]);
var criteria4Text = $criteria.eq(3).text().replace(/[,;.]$/, '');
var criteria4Matches = criteria4Text.match(/(\d{2}-\d{2}-\d{4}) по (\d{2}-\d{2}-\d{4})/);
var criteria4Start = criteria4Matches && cc.util.ddmmyyyyToYyyymmdd(criteria4Matches[1]);
criteria4End = criteria4Matches && cc.util.ddmmyyyyToYyyymmdd(criteria4Matches[2]);
voterCriteria = [{
text: criteria1Text,
type: 'editCountNotLess',
ns: 0,
value: criteria1Value,
periodEnd: criteria4End,
meaningful: true
}, {
text: criteria2Text,
type: 'registrationDateNotLater',
value: criteria2Value
}, {
text: criteria3Text,
type: 'editsBetweenDates',
periodStart: criteria3Start,
periodEnd: criteria3End
}, {
text: criteria4Text,
type: 'editsBetweenDates',
periodStart: criteria4Start,
periodEnd: criteria4End
}];
}
var deriveDates = function deriveDates(votingPeriod) {
if (!votingPeriod.start) return;
votingPeriod.startTimeless = cc.util.prepareDate(votingPeriod.start.replace(/ [0-9:]+$/g, ''));
votingPeriod.start = cc.util.prepareDate(votingPeriod.start);
if (!votingPeriod.start) return;
votingPeriod.end = cc.util.prepareDate(votingPeriod.end, true);
return votingPeriod;
};
admin_votingPeriod = Object.assign({}, $('.criteriaCheck-votingPeriod').data());
admin_votingPeriod = deriveDates(admin_votingPeriod);
if (!admin_votingPeriod && // Удостоверяемся, что критерий тот, который нам нужен
voterCriteria.length === 4 && voterCriteria[3].type === 'editsBetweenDates' && voterCriteria[3].periodEnd) {
admin_votingPeriod = deriveDates({
start: voterCriteria[3].periodEnd
});
}
votingPeriodOk = admin_votingPeriod && admin_votingPeriod.start && admin_votingPeriod.end; // Данные по кандидату
candidate = $criteriaBox.length && cc.getUser(cc.util.getUserNameFromLink($('h2').find('a').filter(cc.util.filterUserLinks).first()));
if (admin_votingPeriod) {
if ($('.criteriaCheck-adminElection').length) {
candidateCriteria = cc.admin.getAdminCandidateCriteria(admin_votingPeriod);
}
if ($('.criteriaCheck-bureaucratElection').length) {
candidateCriteria = cc.admin.getBureaucratCandidateCriteria(admin_votingPeriod);
}
} // Парсим таблицу результатов
resultsTable = {
supportVotesCount: Number($('.criteriaCheck-supportVotesCount').text()),
opposeVotesCount: Number($('.criteriaCheck-opposeVotesCount').text()),
neutralVotesCount: Number($('.criteriaCheck-neutralVotesCount').text()),
supportPercent: Number($('.criteriaCheck-supportPercent').text().replace(/[^0-9,.]/g, '').replace(/,/, '.'))
};
resultsTable.totalVotes = resultsTable.supportVotesCount + resultsTable.opposeVotesCount + resultsTable.neutralVotesCount; // Выводим в глобальный объект на случай, если какой-то скрипт захочет воспользоваться данными
cc.admin.candidate = candidate;
cc.admin.voterCriteria = voterCriteria;
cc.admin.candidateCriteria = candidateCriteria;
cc.admin.votingPeriod = admin_votingPeriod;
cc.admin.resultsTable = resultsTable; // Создаём блок ссылок
$buttonsBlock = $('<div>').addClass('criteriaCheck-buttonsBlock');
buttons = [];
if (mw.config.get('wgUserName')) {
var $button = new OO.ui.ButtonWidget({
label: 'Проверить, соответствую ли я требованиям',
classes: ['criteriaCheck-button']
});
$button.on('click', cc.admin.checkMe);
buttons.push($button);
}
if (mw.config.get('wgUserGroups').indexOf('bureaucrat') !== -1 || cc.currentUser === candidate) {
var _$button = new OO.ui.ButtonWidget({
label: 'Проверить все голоса',
classes: ['criteriaCheck-button']
});
_$button.on('click', cc.admin.checkAll);
buttons.push(_$button);
}
if (candidateCriteria && (mw.config.get('wgUserGroups').indexOf('bureaucrat') !== -1 || cc.currentUser === candidate)) {
var _$button2 = new OO.ui.ButtonWidget({
label: 'Проверить соответствие кандидата требованиям для выдвижения',
classes: ['criteriaCheck-button']
});
_$button2.on('click', cc.admin.checkCandidate);
buttons.push(_$button2);
}
;
updateButtonsBlock();
$buttonsBlock.appendTo($criteriaBox);
},
checkMe: function () {
var _checkMe = asyncToGenerator_default()(
/*#__PURE__*/
regenerator_default.a.mark(function _callee() {
var $checkingMessage, summary, message, text, _iteratorNormalCompletion3, _didIteratorError3, _iteratorError3, _iterator3, _step3, result, _text, currentDate;
return regenerator_default.a.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
hideButton('checkMe');
$checkingMessage = cc.createMessage({
icon: 'loading',
text: 'Проверяем…',
big: true
}).appendTo($criteriaBox);
message = {
icons: [],
texts: []
};
_context.prev = 3;
_context.t0 = cc;
_context.next = 7;
return cc.currentUser.check(voterCriteria);
case 7:
_context.t1 = _context.sent;
summary = _context.t0.summarize.call(_context.t0, _context.t1);
_context.next = 16;
break;
case 11:
_context.prev = 11;
_context.t2 = _context["catch"](3);
console.error(_context.t2);
message = {
icons: ['error'],
texts: ['Не удалось завершить проверку. См. подробности в консоли (F12 → Консоль). ']
};
showButton('checkMe');
case 16:
if (!summary) {
_context.next = 48;
break;
}
if (!(summary.conclusion === 'meets')) {
_context.next = 21;
break;
}
message = {
icons: ['check'],
texts: ['Ура, вы соответствуете требованиям и можете голосовать. ']
};
_context.next = 48;
break;
case 21:
if (!(summary.conclusion === 'notMeets')) {
_context.next = 27;
break;
}
text = "\u041A \u0441\u043E\u0436\u0430\u043B\u0435\u043D\u0438\u044E, \u0432\u044B \u043D\u0435 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442\u0435 \u0442\u0440\u0435\u0431\u043E\u0432\u0430\u043D\u0438\u044E: <em>".concat(summary.firstFailedResult.criterion.text, "</em>. ");
if (summary.firstFailedResult.criterion.type === 'editCountNotLess') {
text += "\u0423 \u0432\u0430\u0441 \u0442\u043E\u043B\u044C\u043A\u043E ".concat(summary.firstFailedResult.editCount, " \u043F\u0440\u0430\u0432\u043E\u043A. ");
}
message = {
icons: ['close'],
texts: [text]
};
_context.next = 48;
break;
case 27:
if (!(summary.conclusion === 'possiblyMeets')) {
_context.next = 48;
break;
}
message.icons = ['help'];
_iteratorNormalCompletion3 = true;
_didIteratorError3 = false;
_iteratorError3 = undefined;
_context.prev = 32;
for (_iterator3 = summary.results.filter(cc.util.otherThanMeets)[Symbol.iterator](); !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
result = _step3.value;
_text = "\u0412\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u043D\u0435 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043E\u0432\u0430\u0442\u044C \u0442\u0440\u0435\u0431\u043E\u0432\u0430\u043D\u0438\u044E: <em>".concat(result.criterion.text, "</em>. ");
if (result.criterion.type === 'editCountNotLess') {
_text += "У вас " + result.editCount + " правок, но, согласно [[Википедия:Правила выборов администраторов и бюрократов#Кто может голосовать на выборах бюрократов и администраторов|правилам]], незначительные правки не учитываются при подсчёте. Требуется ручной подсчёт. ";
}
message.texts.push(_text);
}
_context.next = 40;
break;
case 36:
_context.prev = 36;
_context.t3 = _context["catch"](32);
_didIteratorError3 = true;
_iteratorError3 = _context.t3;
case 40:
_context.prev = 40;
_context.prev = 41;
if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) {
_iterator3["return"]();
}
case 43:
_context.prev = 43;
if (!_didIteratorError3) {
_context.next = 46;
break;
}
throw _iteratorError3;
case 46:
return _context.finish(43);
case 47:
return _context.finish(40);
case 48:
currentDate = new Date();
if (votingPeriodOk && (currentDate < admin_votingPeriod.start || currentDate > admin_votingPeriod.end || $criteriaBox.closest('.ruwiki-closedDiscussion').length)) {
message.texts[message.texts.length - 1] += currentDate < admin_votingPeriod.start ? 'Однако, голосование ещё не началось. ' : 'Однако, голосование уже закончилось. ';
}
message.big = true;
$checkingMessage.remove();
$criteriaBox.append(cc.createMessage(message));
case 53:
case "end":
return _context.stop();
}
}
}, _callee, null, [[3, 11], [32, 36, 40, 48], [41,, 43, 47]]);
}));
function checkMe() {
return _checkMe.apply(this, arguments);
}
return checkMe;
}(),
checkAll: function () {
var _checkAll = asyncToGenerator_default()(
/*#__PURE__*/
regenerator_default.a.mark(function _callee2() {
var $criteriaBoxMessage, $checkedPercent, votes, votesSummary, i, vote, $target, $message, message, category, badTiming, fitsOtherCriteria, j, summary, logLink, _text2, _iteratorNormalCompletion4, _didIteratorError4, _iteratorError4, _iterator4, _step4, result, _text3, _logLink, formUserList, text, icons, userList, _userList, _userList2;
return regenerator_default.a.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
hideButton('checkAll');
$('.criteriaCheck-message').filter(function () {
return !$(this).closest($criteriaBox).length;
}).remove();
$criteriaBoxMessage = cc.createMessage({
icon: 'loading',
text: 'Проверяем все голоса (<span class="criteriaCheck-checkedPercent">0</span>%)…',
big: true
}).appendTo($criteriaBox);
$checkedPercent = $criteriaBoxMessage.find('.criteriaCheck-checkedPercent');
votes = extractVotes();
cc.admin.votes = votes;
votesSummary = {
meets: [],
notMeets: [],
possiblyMeets: [],
error: []
};
i = 0;
case 8:
if (!(i < votes.length)) {
_context2.next = 96;
break;
}
$checkedPercent.text(Math.round(i / votes.length * 100));
vote = votes[i];
$target = vote.$el.contents().first().is('p, div') ? vote.$el.contents().first() : vote.$el;
$message = cc.createMessage({
icon: 'loading'
});
$target.prepend($message);
message = {
icons: [],
texts: []
};
category = void 0;
badTiming = false;
fitsOtherCriteria = true;
if (votingPeriodOk && vote.date && (vote.date < admin_votingPeriod.start || vote.date > admin_votingPeriod.end)) {
badTiming = true;
category = 'notMeets';
message = {
icons: ['close'],
texts: [vote.date < admin_votingPeriod.start ? 'Голос подан до начала голосования.' : 'Голос подан после окончания голосования.']
};
}
j = 0;
case 20:
if (!(j < i)) {
_context2.next = 28;
break;
}
if (!(votes[j].author.name === vote.author.name)) {
_context2.next = 25;
break;
}
category = 'notMeets';
message = {
icons: ['close'],
texts: [vote.author.nameWhenVoted + ' уже голосовал.']
};
return _context2.abrupt("break", 28);
case 25:
j++;
_context2.next = 20;
break;
case 28:
summary = void 0;
if (category) {
_context2.next = 43;
break;
}
_context2.prev = 30;
_context2.t0 = cc;
_context2.next = 34;
return vote.author.check(voterCriteria);
case 34:
_context2.t1 = _context2.sent;
summary = _context2.t0.summarize.call(_context2.t0, _context2.t1);
_context2.next = 43;
break;
case 38:
_context2.prev = 38;
_context2.t2 = _context2["catch"](30);
console.error(_context2.t2);
category = 'error';
message = {
icons: ['error'],
texts: ['Не удалось завершить проверку. См. подробности в консоли (F12 → Консоль).']
};
case 43:
if (!summary) {
_context2.next = 83;
break;
}
category = summary.conclusion;
if (!(summary.conclusion === 'meets')) {
_context2.next = 49;
break;
}
message = {
icons: ['check'],
texts: []
};
_context2.next = 83;
break;
case 49:
if (!(summary.conclusion === 'userMissing' || summary.warnings.indexOf('0edits') !== -1)) {
_context2.next = 56;
break;
}
category = 'possiblyMeets';
logLink = mw.util.getUrl('Служебная:Журналы', {
page: 'Участник:' + vote.author.name
});
message = {
icons: ['help'],
texts: [summary.conclusion === 'userMissing' ? "Участник " + vote.author.name + " не найден. Скорее всего, он был переименован, но в [" + logLink + " журнале] не найдено записи об этом. Необходима ручная проверка. " : "У участника " + vote.author.name + " всего 0 правок. Скорее всего, он был переименован, но в [" + logLink + " журнале] не найдено записи об этом. Необходима ручная проверка. "]
};
fitsOtherCriteria = false;
_context2.next = 83;
break;
case 56:
if (!(summary.conclusion === 'notMeets')) {
_context2.next = 62;
break;
}
_text2 = "\u0423\u0447\u0430\u0441\u0442\u043D\u0438\u043A \u043D\u0435 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u0440\u0435\u0431\u043E\u0432\u0430\u043D\u0438\u044E: <em>".concat(summary.firstFailedResult.criterion.text, "</em>. ");
if (summary.firstFailedResult.criterion.type === 'editCountNotLess') {
_text2 += "\u0423 \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0430 \u0442\u043E\u043B\u044C\u043A\u043E ".concat(summary.firstFailedResult.editCount, " \u043F\u0440\u0430\u0432\u043E\u043A. ");
}
message = {
icons: ['close'],
texts: [_text2]
};
_context2.next = 83;
break;
case 62:
if (!(summary.conclusion === 'possiblyMeets')) {
_context2.next = 83;
break;
}
message.icons = ['help'];
_iteratorNormalCompletion4 = true;
_didIteratorError4 = false;
_iteratorError4 = undefined;
_context2.prev = 67;
for (_iterator4 = summary.results.filter(cc.util.otherThanMeets)[Symbol.iterator](); !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
result = _step4.value;
_text3 = "\u0423\u0447\u0430\u0441\u0442\u043D\u0438\u043A \u043C\u043E\u0436\u0435\u0442 \u043D\u0435 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043E\u0432\u0430\u0442\u044C \u0442\u0440\u0435\u0431\u043E\u0432\u0430\u043D\u0438\u044E: <em>".concat(result.criterion.text, "</em>. ");
if (result.criterion.type === 'editCountNotLess') {
_text3 += "\u0423 \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0430 ".concat(result.editCount, " \u043F\u0440\u0430\u0432\u043E\u043A. ");
}
_text3 += 'Необходима ручная проверка. '; // Если встретятся 2 и больше possiblyMeets или будет сомнение, что критерии проверены для
// того участника (если в реплике больше одной ссылки на участника; см., например,
// [[Википедия:Заявки на статус бюрократа/Deinocheirus]]), текст и во втором случае иконки
// должны накапливаться.
message.texts.push(_text3);
}
_context2.next = 75;
break;
case 71:
_context2.prev = 71;
_context2.t3 = _context2["catch"](67);
_didIteratorError4 = true;
_iteratorError4 = _context2.t3;
case 75:
_context2.prev = 75;
_context2.prev = 76;
if (!_iteratorNormalCompletion4 && _iterator4["return"] != null) {
_iterator4["return"]();
}
case 78:
_context2.prev = 78;
if (!_didIteratorError4) {
_context2.next = 81;
break;
}
throw _iteratorError4;
case 81:
return _context2.finish(78);
case 82:
return _context2.finish(75);
case 83:
if (vote.confusingAuthor && !badTiming) {
category = 'possiblyMeets';
message.icons.push('help');
message.texts.push("\u0418\u0437-\u0437\u0430 \u0441\u0442\u0440\u0430\u043D\u043D\u043E\u0439 \u0440\u0430\u0437\u043C\u0435\u0442\u043A\u0438 \u0441\u043A\u0440\u0438\u043F\u0442 \u043C\u043E\u0433 \u043F\u0435\u0440\u0435\u043F\u0443\u0442\u0430\u0442\u044C, \u043A\u0442\u043E \u0430\u0432\u0442\u043E\u0440 \u044D\u0442\u043E\u0433\u043E \u0433\u043E\u043B\u043E\u0441\u0430 (\u043E\u043D \u0434\u0443\u043C\u0430\u0435\u0442, \u0447\u0442\u043E \u044D\u0442\u043E ".concat(vote.author.nameWhenVoted, "). "));
fitsOtherCriteria = false;
}
if (vote.author.name !== vote.author.nameWhenVoted) {
_logLink = mw.util.getUrl('Служебная:Журналы', {
page: 'Участник:' + vote.author.nameWhenVoted
});
message.texts.push("Соответствие требованиям определялось для учётной записи " + vote.author.name + ", в которую [" + logLink + " была переименована] учётная запись " + vote.author.nameWhenVoted + ".");
}
if (votingPeriodOk && !vote.date) {
if (category === 'meets' || category === 'possiblyMeets') {
message.texts.push('Не удалось определить время голоса. Необходимо проверить, подан ли голос вовремя. ');
if (!vote.confusingAuthor) {
category = 'possiblyMeets';
message.icons = ['help'];
}
}
}
if (category === 'possiblyMeets' && fitsOtherCriteria) {
message.texts[message.texts.length - 1] += 'Остальным требованиям участник соответствует. ';
}
message.icons = cc.util.removeDuplicates(message.icons);
message.accented = true;
vote.summary = summary;
votesSummary[category].push(vote);
$message.remove();
$target.prepend(cc.createMessage(message, vote.anchor));
case 93:
i++;
_context2.next = 8;
break;
case 96:
$checkedPercent.text('100');
cc.admin.votesSummary = votesSummary;
formUserList = function formUserList(votes) {
return votes.reduce(function (s, vote) {
return s + "[[#" + vote.anchor + "|" + vote.author.nameWhenVoted + "]], ";
}, '').slice(0, -2);
};
text = 'Проверка завершена. ';
if (votes.length) {
if (rawCriteria) {
text += 'Не были найдены метаданные о требованиях, поэтому они извлекались прямо из текста, что могло привести к ошибкам (к примеру, неизвестно время начала голосования, поэтому все правки в день начала включались при определении соответствия 1-му и 4-му требованию). ';
}
if (!votingPeriodOk) {
text += 'Не были найдены корректные метаданные о дате начала и конца голосования, поэтому время подачи голосов не проверялось. ';
}
} else {
text += 'Никто ещё не голосовал. ';
}
icons = [];
if (votesSummary.error.length) {
icons.push('error');
userList = formUserList(votesSummary.error);
text += "\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C ".concat(votesSummary.error.length, " ").concat(cc.util.plural(votesSummary.error.length, 'голос', 'голоса', 'голосов'), ": ").concat(userList, ". ");
showButton('checkAll');
}
if (votesSummary.notMeets.length) {
icons.push('close');
_userList = formUserList(votesSummary.notMeets);
text += "".concat(votesSummary.notMeets.length, " ").concat(cc.util.plural(votesSummary.notMeets.length, 'голос', 'голоса', 'голосов'), " \u043D\u0435 ").concat(cc.util.plural(votesSummary.notMeets.length, 'соответствует', 'соответствуют', 'соответствуют'), " \u043F\u0440\u0430\u0432\u0438\u043B\u0430\u043C: ").concat(_userList, ". ");
}
if (votesSummary.possiblyMeets.length) {
icons.push('help');
_userList2 = formUserList(votesSummary.possiblyMeets);
text += "\u041D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u0430 \u0440\u0443\u0447\u043D\u0430\u044F \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 ".concat(votesSummary.possiblyMeets.length, " ").concat(cc.util.plural(votesSummary.possiblyMeets.length, 'голоса', 'голосов', 'голосов'), ": ").concat(_userList2, ". ");
}
if (votesSummary.meets.length) {
icons.push('check');
text += "".concat(votesSummary.meets.length, " ").concat(cc.util.plural(votesSummary.meets.length, 'голос соответствует', 'голоса соответствуют', 'голосов соответствуют'), " \u043F\u0440\u0430\u0432\u0438\u043B\u0430\u043C. ");
}
$criteriaBoxMessage.remove();
$criteriaBox.append(cc.createMessage({
text: text,
icons: icons,
big: true
}));
if (votes.length && (resultsTable.totalVotes === votes.length || !resultsTable.totalVotes && resultsTable.totalVotes !== 0)) {
$criteriaBox.append(cc.createMessage({
text: 'Так как участники не всегда корректно используют вики-разметку, нет гарантии, что скрипт верно извлёк все голоса. Пожалуйста, убедитесь, что все голоса были проверены: пройдитесь по списку голосов и удостоверьтесь, что у каждого голоса стоит отметка. ',
icon: 'warning'
}));
} else if (resultsTable.totalVotes || resultsTable.totalVotes === 0) {
$criteriaBox.append(cc.createMessage({
text: "<b>\u0427\u0438\u0441\u043B\u043E \u0433\u043E\u043B\u043E\u0441\u043E\u0432 \u0441\u043E\u0433\u043B\u0430\u0441\u043D\u043E \u0442\u0430\u0431\u043B\u0438\u0446\u0435 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 (".concat(resultsTable.totalVotes, ") \u043D\u0435 \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u0435\u0442 \u0441 \u0447\u0438\u0441\u043B\u043E\u043C \u0433\u043E\u043B\u043E\u0441\u043E\u0432 \u0441 \u0442\u043E\u0447\u043A\u0438 \u0437\u0440\u0435\u043D\u0438\u044F \u0441\u043A\u0440\u0438\u043F\u0442\u0430 (").concat(votes.length, ").</b> ") + (resultsTable.totalVotes > votes.length ? 'Пожалуйста, пройдитесь по списку голосов, найдите недостающие голоса и проверьте их вручную. ' : 'Пожалуйста, пройдитесь по списку голосов и удостоверьтесь в том, что отметки на них стоят корректно. '),
icon: 'warning'
}));
}
case 109:
case "end":
return _context2.stop();
}
}
}, _callee2, null, [[30, 38], [67, 71, 75, 83], [76,, 78, 82]]);
}));
function checkAll() {
return _checkAll.apply(this, arguments);
}
return checkAll;
}(),
checkCandidate: function () {
var _checkCandidate = asyncToGenerator_default()(
/*#__PURE__*/
regenerator_default.a.mark(function _callee3() {
var $checkingMessage, summary, message, fitsOtherCriteria, text, _iteratorNormalCompletion5, _didIteratorError5, _iteratorError5, _iterator5, _step5, result, _text4, _text5, _text6, distance;
return regenerator_default.a.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
hideButton('checkCandidate');
$checkingMessage = cc.createMessage({
icon: 'loading',
text: 'Проверяем кандидата…',
big: true
}).appendTo($criteriaBox);
message = {
icons: [],
texts: []
};
fitsOtherCriteria = true;
_context3.prev = 4;
_context3.t0 = cc;
_context3.next = 8;
return candidate.check(candidateCriteria);
case 8:
_context3.t1 = _context3.sent;
summary = _context3.t0.summarize.call(_context3.t0, _context3.t1);
_context3.next = 17;
break;
case 12:
_context3.prev = 12;
_context3.t2 = _context3["catch"](4);
console.error(_context3.t2);
message = {
icons: ['error'],
texts: ['Не удалось завершить проверку. См. подробности в консоли (F12 → Консоль). ']
};
showButton('checkCandidate');
case 17:
if (!summary) {
_context3.next = 51;
break;
}
if (!(summary.conclusion === 'meets')) {
_context3.next = 22;
break;
}
message = {
icons: ['check'],
texts: []
};
_context3.next = 49;
break;
case 22:
if (!(summary.conclusion === 'notMeets')) {
_context3.next = 28;
break;
}
text = "\u041A\u0430\u043D\u0434\u0438\u0434\u0430\u0442 \u043D\u0435 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u0440\u0435\u0431\u043E\u0432\u0430\u043D\u0438\u044E: <em>".concat(summary.firstFailedResult.criterion.text, "</em>. ");
if (summary.firstFailedResult.criterion.type === 'editCountNotLess') {
text += "\u0423 \u043D\u0435\u0433\u043E \u0442\u043E\u043B\u044C\u043A\u043E ".concat(summary.firstFailedResult.editCount, " \u043F\u0440\u0430\u0432\u043E\u043A. ");
}
message = {
icons: ['close'],
texts: [text]
};
_context3.next = 49;
break;
case 28:
if (!(summary.conclusion === 'possiblyMeets')) {
_context3.next = 49;
break;
}
message.icons = ['help'];
_iteratorNormalCompletion5 = true;
_didIteratorError5 = false;
_iteratorError5 = undefined;
_context3.prev = 33;
for (_iterator5 = summary.results.filter(cc.util.otherThanMeets)[Symbol.iterator](); !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
result = _step5.value;
if (result.result === 'notEnoughRights') {
_text4 = "\u0423 \u0432\u0430\u0441 \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E \u043F\u0440\u0430\u0432, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u0432\u0441\u0435 \u0434\u0430\u043D\u043D\u044B\u0435, \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u044B\u0435 \u0434\u043B\u044F \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044F \u0442\u0440\u0435\u0431\u043E\u0432\u0430\u043D\u0438\u044E: <em>".concat(result.criterion.text, "</em>. \u0421\u043E\u0433\u043B\u0430\u0441\u043D\u043E \u0442\u0435\u043C \u0434\u0430\u043D\u043D\u044B\u043C, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C, \u043A\u0430\u043D\u0434\u0438\u0434\u0430\u0442 \u043D\u0435 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u0440\u0435\u0431\u043E\u0432\u0430\u043D\u0438\u044F\u043C. ");
message.texts.push(_text4);
fitsOtherCriteria = false;
} else if (result.result === 'needsManualCheck') {
_text5 = "\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u0440\u0443\u0447\u043D\u0430\u044F \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044F \u0442\u0440\u0435\u0431\u043E\u0432\u0430\u043D\u0438\u044E: <em>".concat(result.criterion.text, "</em>. ");
if (result.criterion.comment) {
_text5 += result.criterion.comment + ' ';
}
message.texts.push(_text5);
} else if (result.result === 'possiblyMeets') {
_text6 = "\u041A\u0430\u043D\u0434\u0438\u0434\u0430\u0442 \u043C\u043E\u0436\u0435\u0442 \u043D\u0435 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043E\u0432\u0430\u0442\u044C \u0442\u0440\u0435\u0431\u043E\u0432\u0430\u043D\u0438\u044E: <em>".concat(result.criterion.text, "</em>. ");
if (result.criterion.type === 'hadFlagFor') {
distance = period % (1000 * 60 * 60 * 24);
_text6 += "\u041A\u0430\u043D\u0434\u0430\u0434\u0430\u0442 \u043E\u0431\u043B\u0430\u0434\u0430\u043B \u0444\u043B\u0430\u0433\u043E\u043C ".concat(result.flag, " \u0432 \u0442\u0435\u0447\u0435\u043D\u0438\u0435 ").concat(plural(distance, 'дня', 'дней', 'дней'), ". ");
}
message.texts.push(_text6);
}
}
_context3.next = 41;
break;
case 37:
_context3.prev = 37;
_context3.t3 = _context3["catch"](33);
_didIteratorError5 = true;
_iteratorError5 = _context3.t3;
case 41:
_context3.prev = 41;
_context3.prev = 42;
if (!_iteratorNormalCompletion5 && _iterator5["return"] != null) {
_iterator5["return"]();
}
case 44:
_context3.prev = 44;
if (!_didIteratorError5) {
_context3.next = 47;
break;
}
throw _iteratorError5;
case 47:
return _context3.finish(44);
case 48:
return _context3.finish(41);
case 49:
if (summary.result === 'meets') {
message.texts.push('Кандидат соответствует требованиям для выдвижения. ');
}
if (summary.conclusion === 'possiblyMeets' && fitsOtherCriteria) {
message.texts[message.texts.length - 1] += 'Остальным требованиям кандидат соответствует. ';
}
case 51:
message.big = true;
$checkingMessage.remove();
$criteriaBox.append(cc.createMessage(message));
case 54:
case "end":
return _context3.stop();
}
}
}, _callee3, null, [[4, 12], [33, 37, 41, 49], [42,, 44, 48]]);
}));
function checkCandidate() {
return _checkCandidate.apply(this, arguments);
}
return checkCandidate;
}()
});
// CONCATENATED MODULE: ./src/applications/arbcom.js
/* harmony default export */ var arbcom = ({
getVoterCriteria: function getVoterCriteria(nominationStartDate) {
return [{
text: 'стаж не менее трёх месяцев',
type: 'registrationDateNotLater',
// addDays, потому что трактовка с датой невключительно закреплена на основных страницах
// выборов
value: addDays(subMonths(nominationStartDate, 3), 1)
}, {
text: 'не менее 500 действий к началу выдвижения кандидатов',
type: 'actionCountNotLess',
value: 500,
periodEnd: nominationStartDate,
filterVotes: true
}, {
text: 'не менее 100 действий за последние полгода до начала выдвижения кандидатов',
type: 'actionCountNotLess',
value: 100,
periodStart: subMonths(nominationStartDate, 6),
periodEnd: nominationStartDate,
filterVotes: true
}];
},
getCandidateCriteria: function getCandidateCriteria(nominationStartDate) {
return [{
text: 'с момента регистрации в русской Википедии до момента начала номинации кандидатов прошло не менее 8 месяцев',
type: 'registrationDateNotLater',
// addDays, потому что эта трактовка закреплена на основных страницах выборов
value: addDays(subMonths(nominationStartDate, 8), 1)
}, {
text: 'сделал в русской Википедии не менее 2000 правок до момента начала номинации',
type: 'editCountNotLess',
value: 2000,
periodEnd: nominationStartDate
}, {
text: 'Кандидатом в арбитры не может быть бессрочно заблокированный участник, а также участник, имеющий на момент начала выдвижения кандидатур блокировку, срок действия которой истекает после окончания процедуры обсуждения кандидатур арбитров',
type: 'noActiveBlockBetweenDates',
ns: 4,
periodStart: nominationStartDate,
periodEnd: addDays(nominationStartDate, 10)
}];
},
extractVoters: function () {
var _extractVoters = asyncToGenerator_default()(
/*#__PURE__*/
regenerator_default.a.mark(function _callee(election) {
var response, text, content, $sandbox, $userLinks, voters;
return regenerator_default.a.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (election) {
_context.next = 2;
break;
}
return _context.abrupt("return");
case 2:
election = encodeURI(election.replace(/ /g, '_'));
_context.next = 5;
return fetch("https://ru.wikipedia.org/wiki/%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F:%D0%92%D1%8B%D0%B1%D0%BE%D1%80%D1%8B_%D0%B0%D1%80%D0%B1%D0%B8%D1%82%D1%80%D0%BE%D0%B2/".concat(election, "/%D0%93%D0%BE%D0%BB%D0%BE%D1%81%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5/*"), {
credentials: 'omit'
});
case 5:
response = _context.sent;
_context.next = 8;
return response.text();
case 8:
text = _context.sent;
content = text.replace(/^[\s\S]+id="mw-content-text"[^>]+>/, '').replace(/<\/div><noscript>[\s\S]+$/, '');
$sandbox = $('<div>').addClass('criteriaCheck-sandbox').append(content).appendTo('body');
$userLinks = $sandbox.find('.mw-parser-output table:has(td[id]) a').filter(cc.util.filterUserLinks);
voters = cc.util.removeDuplicates($userLinks.map(function (i, el) {
return cc.util.getUserNameFromLink($(el));
}).get());
$sandbox.remove();
return _context.abrupt("return", voters);
case 15:
case "end":
return _context.stop();
}
}
}, _callee);
}));
function extractVoters(_x) {
return _extractVoters.apply(this, arguments);
}
return extractVoters;
}()
});
// CONCATENATED MODULE: ./src/index.js
mw.loader.using(['mediawiki.api', 'mediawiki.util', 'oojs', 'oojs-ui']).done(function () {
cc.util = util;
cc.admin = admin;
cc.arbcom = arbcom;
cc.customHandlers = [];
cc.createMessage = function (message, anchor) {
function parseText(text) {
mw.messages.set('criteriaCheck-temp', text);
return mw.message('criteriaCheck-temp').parse();
}
if (!message.icons) {
message.icons = message.icon ? [message.icon] : [];
}
var $icons = message.icons.map(function (icon) {
return $('<span>').addClass('criteriaCheck-icon').addClass('criteriaCheck-icon-' + icon);
});
if (!message.texts) {
message.texts = message.text ? [message.text] : [];
}
var text = message.texts.length === 1 ? message.texts[0] : message.texts.reduce(function (s, text, i) {
return "".concat(s).concat(i + 1, ". ").concat(text, " ");
}, '');
var $el = $(text ? '<div>' : '<span>').addClass('criteriaCheck-message').attr('id', anchor).append($icons);
if (text) {
text = parseText(text);
var $text = $('<span>').append(text);
$el.addClass('criteriaCheck-message-withText').append($text);
}
if (message.accented) {
$el.addClass('criteriaCheck-message-accented');
}
if (message.big) {
$el.addClass('criteriaCheck-message-big');
}
return $el;
};
cc.getUser = function (name) {
if (!name) return;
cc.users = cc.users || [];
if (!cc.users[name]) {
cc.users[name] = new User_User(name);
}
return cc.users[name];
};
cc.extractCriteria = function ($container) {
return $container.find('[data-criterion]').map(function () {
var data = Object.assign({}, $(this).data());
data.text = $(this).text().replace(/[,;.]$/, '');
data.type = data.criterion;
delete data.criterion;
return data;
}).get();
};
cc.summarize = function (results) {
var details = [];
var conclusion = 'meets';
var warnings = [];
var summary = {};
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = results[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var result = _step.value;
if (result.result === 'userMissing') {
conclusion = 'userMissing';
break;
} else if (result.result === 'notMeets') {
conclusion = 'notMeets';
summary.firstFailedResult = result;
} else if (['possiblyMeets', 'notEnoughRights', 'needsManualCheck'].indexOf(result.result) !== -1 && conclusion !== 'notMeets') {
conclusion = 'possiblyMeets';
}
if (['notEnoughRights', 'needsManualCheck'].indexOf(result.result) !== -1) {
warnings.push(result.result);
}
if (result.overallEditCount === 0) {
warnings.push('0edits');
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator["return"] != null) {
_iterator["return"]();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
warnings = cc.util.removeDuplicates(warnings);
if (conclusion !== 'userMissing') {
summary.results = results;
summary.warnings = warnings;
}
summary.conclusion = conclusion;
summary.user = results && results[0].user;
return summary;
};
cc.check =
/*#__PURE__*/
function () {
var _ref = asyncToGenerator_default()(
/*#__PURE__*/
regenerator_default.a.mark(function _callee(userNames, criteria, callback) {
var doSummarize,
results,
_iteratorNormalCompletion2,
_didIteratorError2,
_iteratorError2,
_iterator2,
_step2,
userName,
result,
_args = arguments;
return regenerator_default.a.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
doSummarize = _args.length > 3 && _args[3] !== undefined ? _args[3] : true;
if (typeof userNames === 'string') {
userNames = [userNames];
}
results = [];
_iteratorNormalCompletion2 = true;
_didIteratorError2 = false;
_iteratorError2 = undefined;
_context.prev = 6;
_iterator2 = userNames[Symbol.iterator]();
case 8:
if (_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done) {
_context.next = 19;
break;
}
userName = _step2.value;
_context.next = 12;
return cc.getUser(userName).check(criteria);
case 12:
result = _context.sent;
if (doSummarize) {
result = cc.summarize(result);
}
results.push(result);
if (callback) {
callback(result);
}
case 16:
_iteratorNormalCompletion2 = true;
_context.next = 8;
break;
case 19:
_context.next = 25;
break;
case 21:
_context.prev = 21;
_context.t0 = _context["catch"](6);
_didIteratorError2 = true;
_iteratorError2 = _context.t0;
case 25:
_context.prev = 25;
_context.prev = 26;
if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) {
_iterator2["return"]();
}
case 28:
_context.prev = 28;
if (!_didIteratorError2) {
_context.next = 31;
break;
}
throw _iteratorError2;
case 31:
return _context.finish(28);
case 32:
return _context.finish(25);
case 33:
return _context.abrupt("return", results);
case 34:
case "end":
return _context.stop();
}
}
}, _callee, null, [[6, 21, 25, 33], [26,, 28, 32]]);
}));
return function (_x, _x2, _x3) {
return _ref.apply(this, arguments);
};
}();
cc.addHandler = function (criterionType, handler) {
cc.customHandlers[criterionType] = handler;
};
cc.currentUser = cc.getUser(mw.config.get('wgUserName'));
if (cc.admin.isRelevantPage()) {
cc.admin.main();
} // Предзагружаем иконки
var $div = $('<div>').css({
position: 'absolute',
top: -10000
}).append(cc.createMessage({
icons: ['check', 'close', 'help', 'error', 'loading', 'warning']
})).appendTo('body');
setTimeout(function () {
$div.remove();
}, 1);
});
/***/ })
/******/ ]);