AtCoder Auto Pager

Support finding a page on AtCoder standings

// ==UserScript==
// @name         AtCoder Auto Pager
// @namespace    https://github.com/mihatsu-s/
// @version      1.1.0
// @description  Support finding a page on AtCoder standings
// @author       Mihatsu
// @license      MIT
// @supportURL   https://github.com/mihatsu-s/atcoder-auto-pager/issues
// @match        https://atcoder.jp/contests/*/standings
// @match        https://atcoder.jp/contests/*/standings?*
// @match        https://atcoder.jp/contests/*/standings/
// @match        https://atcoder.jp/contests/*/standings/?*
// @match        https://atcoder.jp/contests/*/standings/virtual
// @match        https://atcoder.jp/contests/*/standings/virtual?*
// @match        https://atcoder.jp/contests/*/standings/virtual/
// @match        https://atcoder.jp/contests/*/standings/virtual/?*
// @match        https://atcoder.jp/contests/*/results
// @match        https://atcoder.jp/contests/*/results?*
// @match        https://atcoder.jp/contests/*/results/
// @match        https://atcoder.jp/contests/*/results/?*
// @exclude      https://atcoder.jp/*/json
// ==/UserScript==

/******/ (() => { // webpackBootstrap
/******/ 	"use strict";
/******/ 	var __webpack_modules__ = ({

/***/ 426:
/***/ ((module, __webpack_exports__, __webpack_require__) => {

/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "Z": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(645);
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0__);
// Imports

var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0___default()(function(i){return i[1]});
// Module
___CSS_LOADER_EXPORT___.push([module.id, "#vue-standings thead th, #vue-results thead th {\n    vertical-align: middle;\n}\n\n.auto-pager-input {\n    width: 100%;\n    font-size: 80%;\n    font-weight: normal;\n    border: 1px solid #ccc;\n    border-radius: 2px;\n}\n\n.auto-pager-input.error {\n    background-color: #fcc;\n}\n\n.auto-pager-input.active {\n    background-color: #cfc;\n    border-color: #6c6;\n    color: #093;\n}\n\n.auto-pager-input.watching {\n    background-color: #cef;\n    border-color: #9bd;\n    color: #17f;\n}\n", ""]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);


/***/ }),

/***/ 645:
/***/ ((module) => {



/*
  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 (cssWithMappingToString) {
  var list = []; // return the list of modules as css string

  list.toString = function toString() {
    return this.map(function (item) {
      var content = cssWithMappingToString(item);

      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, dedupe) {
    if (typeof modules === "string") {
      // eslint-disable-next-line no-param-reassign
      modules = [[null, modules, ""]];
    }

    var alreadyImportedModules = {};

    if (dedupe) {
      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 = [].concat(modules[_i]);

      if (dedupe && alreadyImportedModules[item[0]]) {
        // eslint-disable-next-line no-continue
        continue;
      }

      if (mediaQuery) {
        if (!item[2]) {
          item[2] = mediaQuery;
        } else {
          item[2] = "".concat(mediaQuery, " and ").concat(item[2]);
        }
      }

      list.push(item);
    }
  };

  return list;
};

/***/ }),

/***/ 379:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {



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];
  };
}();

var stylesInDom = [];

function getIndexByIdentifier(identifier) {
  var result = -1;

  for (var i = 0; i < stylesInDom.length; i++) {
    if (stylesInDom[i].identifier === identifier) {
      result = i;
      break;
    }
  }

  return result;
}

function modulesToDom(list, options) {
  var idCountMap = {};
  var identifiers = [];

  for (var i = 0; i < list.length; i++) {
    var item = list[i];
    var id = options.base ? item[0] + options.base : item[0];
    var count = idCountMap[id] || 0;
    var identifier = "".concat(id, " ").concat(count);
    idCountMap[id] = count + 1;
    var index = getIndexByIdentifier(identifier);
    var obj = {
      css: item[1],
      media: item[2],
      sourceMap: item[3]
    };

    if (index !== -1) {
      stylesInDom[index].references++;
      stylesInDom[index].updater(obj);
    } else {
      stylesInDom.push({
        identifier: identifier,
        updater: addStyle(obj, options),
        references: 1
      });
    }

    identifiers.push(identifier);
  }

  return identifiers;
}

function insertStyleElement(options) {
  var style = document.createElement('style');
  var attributes = options.attributes || {};

  if (typeof attributes.nonce === 'undefined') {
    var nonce =  true ? __webpack_require__.nc : 0;

    if (nonce) {
      attributes.nonce = nonce;
    }
  }

  Object.keys(attributes).forEach(function (key) {
    style.setAttribute(key, 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.media ? "@media ".concat(obj.media, " {").concat(obj.css, "}") : 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);
  } else {
    style.removeAttribute('media');
  }

  if (sourceMap && typeof btoa !== 'undefined') {
    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 || {}; // 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();
  }

  list = list || [];
  var lastIdentifiers = modulesToDom(list, options);
  return function update(newList) {
    newList = newList || [];

    if (Object.prototype.toString.call(newList) !== '[object Array]') {
      return;
    }

    for (var i = 0; i < lastIdentifiers.length; i++) {
      var identifier = lastIdentifiers[i];
      var index = getIndexByIdentifier(identifier);
      stylesInDom[index].references--;
    }

    var newLastIdentifiers = modulesToDom(newList, options);

    for (var _i = 0; _i < lastIdentifiers.length; _i++) {
      var _identifier = lastIdentifiers[_i];

      var _index = getIndexByIdentifier(_identifier);

      if (stylesInDom[_index].references === 0) {
        stylesInDom[_index].updater();

        stylesInDom.splice(_index, 1);
      }
    }

    lastIdentifiers = newLastIdentifiers;
  };
};

/***/ })

/******/ 	});
/************************************************************************/
/******/ 	// The module cache
/******/ 	var __webpack_module_cache__ = {};
/******/ 	
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/ 		// Check if module is in cache
/******/ 		if(__webpack_module_cache__[moduleId]) {
/******/ 			return __webpack_module_cache__[moduleId].exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = __webpack_module_cache__[moduleId] = {
/******/ 			id: moduleId,
/******/ 			// no module.loaded needed
/******/ 			exports: {}
/******/ 		};
/******/ 	
/******/ 		// Execute the module function
/******/ 		__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/ 	
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/ 	
/************************************************************************/
/******/ 	/* webpack/runtime/compat get default export */
/******/ 	(() => {
/******/ 		// getDefaultExport function for compatibility with non-harmony modules
/******/ 		__webpack_require__.n = (module) => {
/******/ 			var getter = module && module.__esModule ?
/******/ 				() => (module['default']) :
/******/ 				() => (module);
/******/ 			__webpack_require__.d(getter, { a: getter });
/******/ 			return getter;
/******/ 		};
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/define property getters */
/******/ 	(() => {
/******/ 		// define getter functions for harmony exports
/******/ 		__webpack_require__.d = (exports, definition) => {
/******/ 			for(var key in definition) {
/******/ 				if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ 					Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ 				}
/******/ 			}
/******/ 		};
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/hasOwnProperty shorthand */
/******/ 	(() => {
/******/ 		__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ 	})();
/******/ 	
/************************************************************************/
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
(() => {

// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js
var injectStylesIntoStyleTag = __webpack_require__(379);
var injectStylesIntoStyleTag_default = /*#__PURE__*/__webpack_require__.n(injectStylesIntoStyleTag);
// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/style.css
var style = __webpack_require__(426);
;// CONCATENATED MODULE: ./src/style.css

            

var options = {};

options.insert = "head";
options.singleton = false;

var update = injectStylesIntoStyleTag_default()(style/* default */.Z, options);



/* harmony default export */ const src_style = (style/* default.locals */.Z.locals || {});
;// CONCATENATED MODULE: ./src/lib/dom-util.ts
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
function sleep(time) {
    return new Promise(resolve => {
        setTimeout(resolve, time);
    });
}
function asyncQuerySelector(selectors) {
    return __awaiter(this, void 0, void 0, function* () {
        while (true) {
            const result = document.querySelector(selectors);
            if (result)
                return result;
            yield sleep(200);
        }
    });
}
function waitForVueJsNextTick() {
    return new Promise(resolve => {
        Vue.nextTick(resolve);
    });
}

;// CONCATENATED MODULE: ./src/lib/general-util.ts
function observeProperties(obj, propertyNames, callback, interval = 100) {
    function getValues() {
        return propertyNames.map(key => obj[key]);
    }
    function arrayEquals(a, b) {
        if (a.length !== b.length)
            return false;
        for (let i = 0, imax = a.length; i < imax; ++i) {
            if (a[i] !== b[i])
                return false;
        }
        return true;
    }
    let previousValue = getValues();
    setInterval(() => {
        const currentValue = getValues();
        if (!arrayEquals(currentValue, previousValue)) {
            callback();
            previousValue = currentValue;
        }
    }, interval);
}

;// CONCATENATED MODULE: ./src/feature/text-to-ordering-target.ts
function textToNumber(text) {
    let value = NaN;
    if (!text.match(/^,|,$|,,|\..*,|[eE].*,|,.*[eE]/)) {
        value = Number(text.replace(/,/g, ""));
    }
    if (isNaN(value)) {
        throw new Error(`Cannot convert '${text}' to a number.`);
    }
    return value;
}
function mmssToSeconds(text) {
    const parts = text.split(":").map(Number);
    if (parts.length !== 2
        || !isFinite(parts[1]) || parts[1] < 0 || parts[1] >= 60
        || !isFinite(parts[0]) || parts[0] % 1 !== 0) {
        throw new Error(`Cannot interpret '${text} as a time'`);
    }
    return parts[0] * 60 + parts[1];
}
/**
 * @returns a value treated as a first entry in the default compareFn
 */
function veryFirstStandingsEntry(desc) {
    return {
        Rank: desc ? Infinity : -Infinity,
        Rating: desc ? -Infinity : Infinity,
        OldRating: desc ? -Infinity : Infinity,
        TotalResult: {
            Count: 1,
            Score: desc ? -Infinity : Infinity,
            Elapsed: desc ? Infinity : -Infinity,
        },
        TaskResults: {},
    };
}
/**
 * @returns a value treated as a first entry in the default compareFn
 */
function veryFirstResultsEntry(desc) {
    return {
        Rank: desc ? Infinity : -Infinity,
        Place: desc ? Infinity : -Infinity,
        Performance: desc ? -Infinity : Infinity,
        OldRating: desc ? -Infinity : Infinity,
        Difference: desc ? -Infinity : Infinity,
        NewRating: desc ? -Infinity : Infinity,
        Rating: desc ? -Infinity : Infinity,
    };
}
var TextToOrderingTarget;
(function (TextToOrderingTarget) {
    let Standings;
    (function (Standings) {
        function numeric(key) {
            return function (text, desc) {
                const res = veryFirstStandingsEntry(desc);
                res[key] = textToNumber(text);
                return res;
            };
        }
        Standings.numeric = numeric;
        /**
         * @param taskAlphabet Set null for the total score
         */
        function score(taskAlphabet) {
            return function (text, desc, showInLogScale, taskInfo) {
                // set default value
                let elapsed = desc ? -Infinity : Infinity; // most bottom
                let point = 0;
                if (taskAlphabet !== null && taskAlphabet in taskInfo) {
                    point = taskInfo[taskAlphabet].maximumScore;
                }
                else {
                    // sum of all tasks point
                    for (const alphabet in taskInfo) {
                        point += taskInfo[alphabet].maximumScore;
                    }
                }
                const parts = text.split(/\s/).filter(s => !!s);
                // read a time
                try {
                    elapsed = mmssToSeconds(parts[parts.length - 1]) * 1e9;
                    parts.pop();
                }
                catch (_a) { }
                // read a point
                if (parts.length === 1) {
                    point = 0;
                    let pointText = parts[0];
                    try {
                        point = textToNumber(pointText);
                        if (showInLogScale) {
                            point = 100 * Math.exp(point * LOG_BASE);
                        }
                        else {
                            point *= 100;
                        }
                    }
                    catch (e) {
                        if (taskAlphabet === null) {
                            // convert task alphabets to point
                            function testTaskExistance(alphabet) {
                                if (!(alphabet in taskInfo)) {
                                    throw new Error(`Task '${alphabet}' does not exist`);
                                }
                            }
                            function addTaskPoint(alphabet) {
                                testTaskExistance(alphabet);
                                point += taskInfo[alphabet].maximumScore;
                            }
                            pointText = pointText.toUpperCase();
                            if (pointText[0] === "-") {
                                const firstTaskAlphabet = Object.keys(taskInfo).sort()[0];
                                pointText = firstTaskAlphabet + pointText;
                            }
                            if (pointText[pointText.length - 1] === "-") {
                                const lastTaskAlphabet = Object.keys(taskInfo).sort((a, b) => a < b ? 1 : a > b ? -1 : 0)[0];
                                pointText += lastTaskAlphabet;
                            }
                            for (let i = 0, imax = pointText.length; i < imax; ++i) {
                                if (pointText[i + 1] === "-") {
                                    testTaskExistance(pointText[i]);
                                    testTaskExistance(pointText[i + 2]);
                                    for (let j = pointText.charCodeAt(i), jmax = pointText.charCodeAt(i + 2); j <= jmax; ++j) {
                                        addTaskPoint(String.fromCharCode(j));
                                    }
                                    i += 2;
                                }
                                else {
                                    addTaskPoint(pointText[i]);
                                }
                            }
                        }
                        else {
                            throw e;
                        }
                    }
                }
                else if (parts.length >= 2) {
                    throw new Error(`'${text}' is not a score specifier (format: '[point] [time]')`);
                }
                const res = veryFirstStandingsEntry(desc);
                if (taskAlphabet === null) {
                    res.TotalResult = {
                        Count: 1,
                        Score: point,
                        Elapsed: elapsed,
                    };
                }
                else {
                    res.TaskResults[taskInfo[taskAlphabet].screenName] = {
                        Count: 1,
                        Score: point,
                        Elapsed: elapsed,
                    };
                }
                return res;
            };
        }
        Standings.score = score;
    })(Standings = TextToOrderingTarget.Standings || (TextToOrderingTarget.Standings = {}));
    ;
    let Results;
    (function (Results) {
        function numeric(key) {
            return function (text, desc) {
                const res = veryFirstResultsEntry(desc);
                res[key] = textToNumber(text);
                return res;
            };
        }
        Results.numeric = numeric;
    })(Results = TextToOrderingTarget.Results || (TextToOrderingTarget.Results = {}));
    ;
})(TextToOrderingTarget || (TextToOrderingTarget = {}));

;// CONCATENATED MODULE: ./src/feature/pager/base.ts
class Pager {
    constructor(paginationFn, orderFn) {
        this.paginationFn = paginationFn;
        this.orderFn = orderFn;
    }
    convertTargetText(fn, ...args) {
        try {
            return fn(...args);
        }
        catch (e) {
            throw new TargetTextConvertionError(e);
        }
    }
}
class TargetTextConvertionError extends Error {
}

;// CONCATENATED MODULE: ./src/lib/math-util.ts
function binarySearch(array, compareFn, target) {
    const test = arguments.length >= 3 ?
        (n) => compareFn(array[n], target) >= 0 :
        (n) => compareFn(array[n]);
    let low = 0, high = array.length;
    if (test(0))
        return 0;
    while (high - low > 1) {
        const mid = (high + low) >> 1;
        if (test(mid)) {
            high = mid;
        }
        else {
            low = mid;
        }
    }
    return high;
}
function linearPrediction(x1, y1, x2, y2, x) {
    return y1 + (y2 - y1) * (x - x1) / (x2 - x1);
}

;// CONCATENATED MODULE: ./src/lib/atcoder/info-reader.ts
function readTaskScore(pageSource) {
    const match = pageSource.match(/(?:配点|Score).*<var>(\d+)<\/var>/);
    if (match) {
        const score = Number(match[1]);
        if (!isNaN(score)) {
            return score;
        }
    }
    throw new Error("Cannot read the score point");
}
function readRatedRange(pageSource) {
    const match = pageSource.match(/>[\s\r\n]*(?:Rated対象|Rated Range)[\s\r\n]*:([^<>]*)</);
    if (match) {
        const text = match[1].replace(/[\s\r\n]/g, "").toLowerCase();
        if (text === "-") {
            return [-Infinity, -Infinity];
        }
        else if (text === "all") {
            return [-Infinity, Infinity];
        }
        const parts = text.split(/-|~/);
        if (parts.length === 2) {
            const parsed = [
                parts[0] === "" ? -Infinity : Number(parts[0]),
                parts[1] === "" ? Infinity : Number(parts[1])
            ];
            if (!isNaN(parsed[0]) && !isNaN(parsed[1])) {
                return parsed;
            }
        }
    }
    throw new Error("Cannot read the rated range");
}

;// CONCATENATED MODULE: ./src/lib/atcoder/time.ts
function internalTimeToJsDate(internalTime) {
    return internalTime.toDate();
}

;// CONCATENATED MODULE: ./src/lib/net-util.ts
var net_util_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
class FetchResponseError extends Error {
    constructor(res) {
        super();
        this.res = res;
    }
}
function fetchText(input, init) {
    return net_util_awaiter(this, void 0, void 0, function* () {
        const res = yield fetch(input, init);
        if (res.status !== 200) {
            throw new FetchResponseError(res);
        }
        return yield res.text();
    });
}

;// CONCATENATED MODULE: ./src/feature/get-task-info.ts
var get_task_info_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};



let cache = null;
let previousStandings = null;
let maximumScoreRecord = {};
function getAndRecordMaximumScore(taskAlphabet, taskScreenName) {
    return get_task_info_awaiter(this, void 0, void 0, function* () {
        maximumScoreRecord[taskAlphabet] = null;
        const url = location.href.replace(/(?<=\/contests\/[^\/]*\/).*$/, "tasks/" + taskScreenName);
        try {
            const score = readTaskScore(yield fetchText(url)) * 100;
            maximumScoreRecord[taskAlphabet] = score;
            if (cache) {
                cache[taskAlphabet].maximumScore = score;
            }
        }
        catch (e) {
            console.error(`Cannot get the score point from ${url}`);
        }
    });
}
let contestStartTimerEnabled = false;
function generateTaskInfo(standings) {
    const started = contestIsStarted();
    if (!started) {
        if (!contestStartTimerEnabled) {
            contestStartTimerEnabled = true;
            const timerId = setInterval(() => {
                if (contestIsStarted()) {
                    for (const task of standings.TaskInfo) {
                        getAndRecordMaximumScore(task.Assignment, task.TaskScreenName);
                    }
                    clearInterval(timerId);
                }
            }, 1000);
        }
    }
    const result = {};
    for (const info of standings.TaskInfo) {
        const alphabet = info.Assignment;
        const screenName = info.TaskScreenName;
        let maximumScore = 0;
        if (started) {
            if (alphabet in maximumScoreRecord && maximumScoreRecord[alphabet] !== null) {
                maximumScore = maximumScoreRecord[alphabet];
            }
            else {
                if (!(alphabet in maximumScoreRecord)) {
                    // Do not wait (request only)
                    getAndRecordMaximumScore(alphabet, screenName);
                }
                for (const entry of standings.StandingsData) {
                    const taskResults = entry.TaskResults;
                    if (screenName in taskResults) {
                        maximumScore = Math.max(maximumScore, taskResults[screenName].Score);
                    }
                }
            }
        }
        result[alphabet] = { screenName, maximumScore };
    }
    return result;
}
function getTaskInfo() {
    const currentStandings = vueStandings.standings;
    // Check if standings has been updated
    if (cache && currentStandings === previousStandings)
        return cache;
    previousStandings = currentStandings;
    return cache = generateTaskInfo(currentStandings);
}
;
function contestIsStarted() {
    return internalTimeToJsDate(getServerTime()).getTime() >= internalTimeToJsDate(startTime).getTime();
}

;// CONCATENATED MODULE: ./src/feature/pager/standings-order.ts
var standings_order_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};



class StandingsOrderPager extends Pager {
    constructor(paginationFn, orderFn, orderBy, textToOrderingTarget) {
        super(paginationFn, orderFn);
        this.paginationFn = paginationFn;
        this.orderFn = orderFn;
        this.orderBy = orderBy;
        this.textToOrderingTarget = textToOrderingTarget;
    }
    exec(text) {
        return standings_order_awaiter(this, void 0, void 0, function* () {
            const target = this.convertTargetText(this.textToOrderingTarget, text, vueStandings.desc, vueStandings.showInLogScale, getTaskInfo());
            this.orderFn(this.orderBy); // Do not wait for DOM updated
            const array = vueStandings.orderedStandings;
            if (array.length === 0)
                return;
            const index = Math.min(binarySearch(array, vueStandings.comp, target), array.length - 1);
            yield this.paginationFn(Math.floor(index / vueStandings.perPage) + 1);
        });
    }
}
class TaskInfo {
}

;// CONCATENATED MODULE: ./src/feature/pager/results-order.ts
var results_order_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};


class ResultsOrderPager extends Pager {
    constructor(paginationFn, orderFn, orderBy, textToOrderingTarget) {
        super(paginationFn, orderFn);
        this.paginationFn = paginationFn;
        this.orderFn = orderFn;
        this.orderBy = orderBy;
        this.textToOrderingTarget = textToOrderingTarget;
    }
    exec(text) {
        return results_order_awaiter(this, void 0, void 0, function* () {
            const target = this.convertTargetText(this.textToOrderingTarget, text, vueResults.desc);
            this.orderFn(this.orderBy); // Do not wait for DOM updated
            const array = vueResults.orderedResults;
            if (array.length === 0)
                return;
            const index = Math.min(binarySearch(array, vueResults.comp, target), array.length - 1);
            yield this.paginationFn(Math.floor(index / vueResults.perPage) + 1);
        });
    }
}

;// CONCATENATED MODULE: ./src/feature/rank-to-rated-rank.ts
var rank_to_rated_rank_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};


let rank_to_rated_rank_cache = null;
let rank_to_rated_rank_previousStandings = null;
function getRankToRatedRankMap() {
    const currentStandings = vueStandings.standings;
    // Check if standings has been updated
    if (rank_to_rated_rank_cache && currentStandings === rank_to_rated_rank_previousStandings)
        return rank_to_rated_rank_cache;
    rank_to_rated_rank_previousStandings = currentStandings;
    return rank_to_rated_rank_cache = generateRankToRatedRankMap(currentStandings);
}
function generateRankToRatedRankMap(standings) {
    const data = standings.StandingsData;
    const res0 = calculateRatedRanks(data, e => e.IsRated && e.TotalResult.Count > 0);
    if (res0.ratedNum === 0 && ratedRange !== null) {
        const res1 = calculateRatedRanks(data, e => ratedRange[0] <= e.OldRating && e.OldRating <= ratedRange[1] && e.TotalResult.Count > 0);
        return res1.map;
    }
    else {
        return res0.map;
    }
}
function calculateRatedRanks(data, ratedFn) {
    const size = data.length;
    const result = Array(size);
    let ratedRank = 0;
    let ratedNumOfCurrentRank = 0;
    let unrateds = [];
    let _ratedAdded = 0;
    for (let i = 0; i < size; ++i) {
        const rank = data[i].Rank;
        if (ratedFn(data[i])) {
            ratedNumOfCurrentRank += 1;
        }
        else {
            unrateds.push(rank);
        }
        if (i === size - 1 || data[i + 1].Rank !== rank) {
            if (i === size - 1 && ratedNumOfCurrentRank === 0) {
                ratedNumOfCurrentRank = 1;
                _ratedAdded = 1;
            }
            if (ratedNumOfCurrentRank > 0) {
                result[rank] = ((ratedRank + 1) + (ratedRank + ratedNumOfCurrentRank)) / 2;
                const unratedsNum = unrateds.filter(r => r !== rank).length;
                function unratedSubRankToRatedRank(subRank) {
                    return ratedRank;
                    // return ratedRank + subRank / (unratedsNum + 1);
                }
                let unratedSubRank = 0;
                let unratedNumOfCurrentSubRank = 0;
                for (let j = 0; j < unratedsNum; ++j) {
                    const rank = unrateds[j];
                    unratedNumOfCurrentSubRank += 1;
                    if (j === unratedsNum - 1 || unrateds[j + 1] !== rank) {
                        const subRank = ((unratedSubRank + 1) + (unratedSubRank + unratedNumOfCurrentSubRank)) / 2;
                        result[rank] = unratedSubRankToRatedRank(subRank);
                        unratedSubRank += unratedNumOfCurrentSubRank;
                        unratedNumOfCurrentSubRank = 0;
                    }
                }
                unrateds = [];
                ratedRank += ratedNumOfCurrentRank;
                ratedNumOfCurrentRank = 0;
            }
        }
    }
    return {
        map: result,
        ratedNum: ratedRank - _ratedAdded
    };
}
let ratedRange = null;
(() => rank_to_rated_rank_awaiter(void 0, void 0, void 0, function* () {
    const contestUrl = location.href.replace(/(?<=\/contests\/[^\/]+)\/.*$/g, "");
    try {
        ratedRange = readRatedRange(yield fetchText(contestUrl));
    }
    catch (e) {
        console.error(`Cannot get the rated range from ${contestUrl}`);
    }
}))();

;// CONCATENATED MODULE: ./src/feature/pager/ac-predictor.ts
var ac_predictor_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};




// Get ac-predictor's internal function
let predictor_onRankInput = null;
let predictor_onPerfInput = null;
const addEventListener_raw = HTMLInputElement.prototype.addEventListener;
HTMLInputElement.prototype.addEventListener =
    function (type, fn, ...args) {
        if (type === "keyup") {
            if (this.id === "predictor-input-rank") {
                predictor_onRankInput = fn;
            }
            else if (this.id === "predictor-input-perf") {
                predictor_onPerfInput = fn;
            }
        }
        addEventListener_raw.call(this, type, fn, ...args);
    };
class AcPredictorPager extends Pager {
    constructor(paginationFn, orderFn, headerRow, beforePaginationFn) {
        super(paginationFn, orderFn);
        this.paginationFn = paginationFn;
        this.orderFn = orderFn;
        this.headerRow = headerRow;
        this.beforePaginationFn = beforePaginationFn;
    }
    exec(text) {
        return ac_predictor_awaiter(this, void 0, void 0, function* () {
            const target = this.convertTargetText(textToNumber, text);
            yield this.orderFn("rank");
            if (predictor_onRankInput && predictor_onPerfInput) {
                yield this.paginateBasedOnPredictor(target);
            }
            else {
                yield this.paginateBasedOnDOM(target);
            }
        });
    }
    paginateBasedOnDOM(target) {
        return ac_predictor_awaiter(this, void 0, void 0, function* () {
            if (vueStandings.pages === 0)
                return;
            const desc = vueStandings.desc;
            if (!desc)
                target *= -1;
            let columnNumber = -1;
            this.headerRow.querySelectorAll("th").forEach((th, i) => {
                if (th.textContent.replace(/\s/g, "") === "perf") {
                    columnNumber = i;
                }
            });
            if (columnNumber < 0)
                throw new Error('Cannot find perf column');
            const tbody = this.headerRow.parentElement.parentElement.querySelector("tbody");
            // Search page binarily
            let low = null;
            let high = null;
            while (true) {
                let [v0, v1] = this.readCurrentPagePerf(tbody, columnNumber);
                if (!desc) {
                    v0 *= -1;
                    v1 *= -1;
                }
                if (v0 < target && target <= v1) {
                    break;
                }
                else if (target <= v0) {
                    // too high
                    if (vueStandings.page === 1)
                        break;
                    high = { page: vueStandings.page, value: (v0 + v1) / 2 };
                }
                else {
                    // too low
                    if (vueStandings.page === vueStandings.pages)
                        break;
                    low = { page: vueStandings.page, value: (v0 + v1) / 2 };
                }
                let nextPage;
                let endNext = false;
                if (high && low) {
                    if (high.page - low.page <= 1) {
                        // goal
                        nextPage = high.page;
                        endNext = true;
                    }
                    else if ( /* v0 !== v1 */false) {}
                    else {
                        // Use midpoint
                        nextPage = Math.ceil((high.page + low.page) / 2);
                    }
                    if (nextPage >= high.page) {
                        nextPage = high.page - 1;
                    }
                    else if (nextPage <= low.page) {
                        nextPage = low.page + 1;
                    }
                }
                else if (high) {
                    nextPage = 1;
                }
                else if (low) {
                    nextPage = vueStandings.pages;
                }
                yield this.paginationFn(nextPage);
                if (endNext)
                    break;
            }
        });
    }
    readPerfFromTableCell(cell) {
        if (!cell)
            return 0;
        const text = cell.textContent.replace(/\s/g, "");
        const value = Number(text);
        return isNaN(value) ? 0 : value;
    }
    readCurrentPagePerf(tbody, perfColumnIndex) {
        const rows = [];
        let infoRowIndex = -1;
        let warningRowIndex = -1;
        tbody.childNodes.forEach(node => {
            if (node instanceof HTMLTableRowElement
                && !node.classList.contains("standings-fa")
                && !node.classList.contains("standings-statistics")) {
                rows.push(node);
                if (node.classList.contains("info"))
                    infoRowIndex = rows.length - 1;
                if (node.classList.contains("warning"))
                    warningRowIndex = rows.length - 1;
            }
        });
        if (rows.length > vueStandings.perPage || vueStandings.page === vueStandings.pages) {
            if (infoRowIndex < 0 && warningRowIndex >= 0) {
                rows.splice(warningRowIndex, 1);
            }
            else if (infoRowIndex >= 0) {
                rows.splice(infoRowIndex, 1);
            }
        }
        return [rows[0], rows[rows.length - 1]].map(row => this.readPerfFromTableCell(row.children[perfColumnIndex]));
    }
    paginateBasedOnPredictor(target) {
        return ac_predictor_awaiter(this, void 0, void 0, function* () {
            const standings = vueStandings.orderedStandings;
            if (standings.length === 0)
                return;
            const desc = vueStandings.desc;
            const ratedRankMap = getRankToRatedRankMap();
            const maxPerf = this.rankToPerf(1);
            const index = binarySearch(standings, entry => {
                const ratedRank = ratedRankMap[entry.EntireRank];
                const perf = entry.TotalResult.Count === 0
                    ? -Infinity
                    : Math.round(this.positivizeRating(Math.min(this.rankToPerf(ratedRank), maxPerf)));
                return desc ? (perf >= target) : (perf <= target);
            });
            yield this.paginationFn(Math.floor(index / vueStandings.perPage) + 1);
        });
    }
    rankToPerf(rank) {
        if (this.beforePaginationFn) {
            this.beforePaginationFn();
        }
        const predictorElements = [
            "predictor-input-rank",
            "predictor-input-perf",
            "predictor-input-rate",
        ].map(s => this.headerRow.ownerDocument.getElementById(s));
        const temp = predictorElements.map(e => e.value);
        predictorElements[0].value = rank.toString();
        predictor_onRankInput();
        const result = Number(predictorElements[1].value);
        temp.forEach((v, i) => {
            predictorElements[i].value = v;
        });
        return result;
    }
    perfToRank(perf) {
        if (this.beforePaginationFn) {
            this.beforePaginationFn();
        }
        const predictorElements = [
            "predictor-input-rank",
            "predictor-input-perf",
            "predictor-input-rate",
        ].map(s => this.headerRow.ownerDocument.getElementById(s));
        const temp = predictorElements.map(e => e.value);
        predictorElements[1].value = perf.toString();
        predictor_onPerfInput();
        const result = Number(predictorElements[0].value);
        temp.forEach((v, i) => {
            predictorElements[i].value = v;
        });
        return result;
    }
    positivizeRating(rating) {
        if (rating >= 400.0)
            return rating;
        return 400.0 * Math.exp((rating - 400.0) / 400.0);
    }
    unpositivizeRating(rating) {
        if (rating >= 400.0)
            return rating;
        return 400.0 + 400.0 * Math.log(rating / 400.0);
    }
}

;// CONCATENATED MODULE: ./src/index.ts
var src_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};









var CLASS_NAMES;
(function (CLASS_NAMES) {
    CLASS_NAMES.input = "auto-pager-input";
    CLASS_NAMES.active = "active";
    CLASS_NAMES.error = "error";
    CLASS_NAMES.watching = "watching";
})(CLASS_NAMES || (CLASS_NAMES = {}));
(() => src_awaiter(void 0, void 0, void 0, function* () {
    function getPagerFromHeaderCell(headerCell) {
        const title = headerCell.textContent.replace(/\s/g, "");
        if (tableType === "results") {
            let rule = null;
            if (title === "順位" || title === "Rank") {
                rule = {
                    orderBy: "Place",
                    converter: TextToOrderingTarget.Results.numeric("Place"),
                };
            }
            if (title === "パフォーマンス" || title === "Performance") {
                rule = {
                    orderBy: "Performance",
                    converter: TextToOrderingTarget.Results.numeric("Performance"),
                };
            }
            if (title === "旧Rating" || title === "OldRating") {
                rule = {
                    orderBy: "OldRating",
                    converter: TextToOrderingTarget.Results.numeric("OldRating"),
                };
            }
            if (title === "差分" || title === "Diff") {
                rule = {
                    orderBy: "Difference",
                    converter: TextToOrderingTarget.Results.numeric("Difference"),
                };
            }
            if (title === "新Rating" || title === "NewRating") {
                rule = {
                    orderBy: "NewRating",
                    converter: TextToOrderingTarget.Results.numeric("NewRating"),
                };
            }
            if (rule) {
                return new ResultsOrderPager(goToPage, changeOrder, rule.orderBy, rule.converter);
            }
        }
        else {
            let rule = null;
            if (title === "順位" || title === "Rank") {
                rule = {
                    orderBy: "rank",
                    converter: TextToOrderingTarget.Standings.numeric("Rank"),
                };
            }
            if (title === "得点" || title === "Score") {
                rule = {
                    orderBy: "score",
                    converter: TextToOrderingTarget.Standings.score(null),
                };
            }
            const taskInfo = getTaskInfo();
            if (title in taskInfo) {
                rule = {
                    orderBy: "task-" + taskInfo[title].screenName,
                    converter: TextToOrderingTarget.Standings.score(title),
                };
            }
            if (rule) {
                return new StandingsOrderPager(goToPage, changeOrder, rule.orderBy, rule.converter);
            }
            if (title === "perf") {
                return new AcPredictorPager(goToPage, changeOrder, headerRow, () => {
                    if (perfColumnInputElement) {
                        keepPerfInputState(perfColumnInputElement);
                    }
                });
            }
        }
        return null;
    }
    function addInputElementToHeaderCell(headerCell) {
        const document = headerCell.ownerDocument;
        const div = document.createElement("div");
        const input = document.createElement("input");
        div.append(input);
        headerCell.append(div);
        input.classList.add(CLASS_NAMES.input);
        input.addEventListener("click", e => {
            e.stopPropagation();
        });
        return input;
    }
    function columnInit(headerCell) {
        const pager = getPagerFromHeaderCell(headerCell);
        if (pager === null)
            return;
        const input = addInputElementToHeaderCell(headerCell);
        input.addEventListener("input", () => src_awaiter(this, void 0, void 0, function* () {
            input.classList.remove(CLASS_NAMES.active);
            input.classList.remove(CLASS_NAMES.error);
            if (watching && watching.element === input) {
                input.classList.remove(CLASS_NAMES.watching);
                watching = null;
            }
        }));
        input.addEventListener("keypress", (e) => src_awaiter(this, void 0, void 0, function* () {
            if (e.code === "Enter") {
                yield execPagerFromInputElement(input, pager, tableType === "standings" && e.ctrlKey);
            }
        }));
        if (pager instanceof AcPredictorPager) {
            perfColumnInputElement = input;
            if (__perfInputState) {
                input.focus();
                input.value = __perfInputState.value;
                input.selectionStart = __perfInputState.selectionStart;
                input.selectionEnd = __perfInputState.selectionEnd;
                input.classList.add(CLASS_NAMES.active);
                setTimeout(() => {
                    __perfInputState = null;
                }, 0);
            }
            if (watching && watching.perf !== null) {
                input.classList.add(CLASS_NAMES.watching);
                input.value = watching.perf.value;
                watching = {
                    element: input,
                    pager: watching.perf.pager,
                    perf: watching.perf,
                };
            }
        }
    }
    function execPagerFromInputElement(input, pager, watch = false) {
        return src_awaiter(this, void 0, void 0, function* () {
            if (input.value.replace(/\s/g, "") === "")
                return;
            input.classList.remove(CLASS_NAMES.error);
            input.classList.add(CLASS_NAMES.active);
            input.classList.remove(CLASS_NAMES.watching);
            const preWatching = watching;
            if (watch) {
                input.classList.add(CLASS_NAMES.watching);
                watching = {
                    element: input,
                    pager,
                    perf: pager instanceof AcPredictorPager ? { value: input.value, pager } : null,
                };
            }
            else if (watching && watching.element === input) {
                watching = null;
            }
            try {
                yield pager.exec(input.value);
            }
            catch (e) {
                input.classList.remove(CLASS_NAMES.active);
                input.classList.remove(CLASS_NAMES.watching);
                input.classList.add(CLASS_NAMES.error);
                if (watch)
                    watching = preWatching;
                if (e instanceof TargetTextConvertionError) {
                    // TODO: Show error message
                    // console.error(e);
                }
                else {
                    throw e;
                }
            }
        });
    }
    function goToPage(page) {
        return src_awaiter(this, void 0, void 0, function* () {
            if (page === vueObject.page)
                return;
            if (document.activeElement === perfColumnInputElement) {
                keepPerfInputState(perfColumnInputElement);
            }
            vueObject.page = page;
            vueObject.watchIndex = -1;
            yield waitForVueJsNextTick();
        });
    }
    function changeOrder(orderBy, desc = null) {
        return src_awaiter(this, void 0, void 0, function* () {
            if (orderBy === vueObject.orderBy) {
                if (desc === null || desc === vueObject.desc)
                    return;
            }
            else {
                if (desc === null)
                    desc = false;
            }
            if (document.activeElement === perfColumnInputElement) {
                keepPerfInputState(perfColumnInputElement);
            }
            vueObject.orderBy = orderBy;
            if (desc !== null)
                vueObject.desc = desc;
            yield waitForVueJsNextTick();
        });
    }
    let watching = null;
    let perfColumnInputElement = null;
    let __perfInputState = null;
    function keepPerfInputState(input) {
        __perfInputState = {
            value: input.value,
            selectionStart: input.selectionStart,
            selectionEnd: input.selectionEnd,
        };
    }
    function resetPagers() {
        for (const input of headerRow.querySelectorAll("." + CLASS_NAMES.input)) {
            if (headerRow.ownerDocument.activeElement === input)
                continue;
            input.classList.remove(CLASS_NAMES.active);
            input.classList.remove(CLASS_NAMES.error);
            input.classList.remove(CLASS_NAMES.watching);
            input.value = "";
        }
        if (watching && watching.element !== headerRow.ownerDocument.activeElement) {
            watching = null;
        }
    }
    // main
    const headerRow = (yield asyncQuerySelector("#vue-standings thead tr, #vue-results thead tr"));
    const tableType = typeof vueStandings === "undefined" ? "results" : "standings";
    const vueObject = tableType === "standings" ? vueStandings : vueResults;
    // Launch auto-pager for each column
    headerRow.querySelectorAll("th").forEach(columnInit);
    new MutationObserver(mutations => {
        for (const mutation of mutations) {
            for (const node of mutation.addedNodes) {
                if (node instanceof HTMLElement)
                    columnInit(node);
            }
        }
    }).observe(headerRow, { childList: true });
    // Detect pagination
    observeProperties(vueObject, ["page", "orderBy", "desc"], () => {
        resetPagers();
    });
    if (tableType === "standings") {
        // Detect updating
        observeProperties(vueStandings, ["standings"], () => {
            if (watching) {
                execPagerFromInputElement(watching.element, watching.pager, true);
            }
        });
    }
}))();

})();

/******/ })()
;