免Flash文件上传

无需调用Flash,从课程平台上传附件,不必为了传作业多装一个浏览器!

当前为 2021-12-18 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name             免Flash文件上传
// @namespace        https://greasyfork.org/zh-CN/users/605474
// @version          1.4.0
// @description      无需调用Flash,从课程平台上传附件,不必为了传作业多装一个浏览器!
// @author           ZiuChen <[email protected]>
// @source           https://github.com/ZiuChen/NO-FLASH-Upload
// @match            *://cc.bjtu.edu.cn:81/*
// @require          https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js
// @require          https://cdn.bootcdn.net/ajax/libs/jquery/1.7.2/jquery.min.js
// @require          https://cdn.bootcdn.net/ajax/libs/clipboard.js/2.0.8/clipboard.min.js
// @icon             https://gitee.com/ziuc/utool-filebed/raw/master/20210514-231824-0795.png
// @license          MIT
// @name:en          NO-FLASH-Upload
// @description:en   No need to call Flash, upload accessories from the course platform, do not have to install another browser for the homework!
// ==/UserScript==
/******/ (() => { // webpackBootstrap
/******/ 	"use strict";
/******/ 	var __webpack_modules__ = ({
/***/ "./node_modules/css-loader/dist/runtime/api.js":
/***/ ((module) => {
/*
  MIT License http://www.opensource.org/licenses/mit-license.php
  Author Tobias Koppers @sokra
*/
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 = "";
      var needLayer = typeof item[5] !== "undefined";
      if (item[4]) {
        content += "@supports (".concat(item[4], ") {");
      }
      if (item[2]) {
        content += "@media ".concat(item[2], " {");
      }
      if (needLayer) {
        content += "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {");
      }
      content += cssWithMappingToString(item);
      if (needLayer) {
        content += "}";
      }
      if (item[2]) {
        content += "}";
      }
      if (item[4]) {
        content += "}";
      }
      return content;
    }).join("");
  }; // import a list of modules into the list
  list.i = function i(modules, media, dedupe, supports, layer) {
    if (typeof modules === "string") {
      modules = [[null, modules, undefined]];
    }
    var alreadyImportedModules = {};
    if (dedupe) {
      for (var k = 0; k < this.length; k++) {
        var id = this[k][0];
        if (id != null) {
          alreadyImportedModules[id] = true;
        }
      }
    }
    for (var _k = 0; _k < modules.length; _k++) {
      var item = [].concat(modules[_k]);
      if (dedupe && alreadyImportedModules[item[0]]) {
        continue;
      }
      if (typeof layer !== "undefined") {
        if (typeof item[5] === "undefined") {
          item[5] = layer;
        } else {
          item[1] = "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {").concat(item[1], "}");
          item[5] = layer;
        }
      }
      if (media) {
        if (!item[2]) {
          item[2] = media;
        } else {
          item[1] = "@media ".concat(item[2], " {").concat(item[1], "}");
          item[2] = media;
        }
      }
      if (supports) {
        if (!item[4]) {
          item[4] = "".concat(supports);
        } else {
          item[1] = "@supports (".concat(item[4], ") {").concat(item[1], "}");
          item[4] = supports;
        }
      }
      list.push(item);
    }
  };
  return list;
};
/***/ }),
/***/ "./node_modules/css-loader/dist/runtime/noSourceMaps.js":
/***/ ((module) => {
module.exports = function (i) {
  return i[1];
};
/***/ }),
/***/ "./node_modules/css-loader/dist/cjs.js!./src/style/css/PopNotify.css":
/***/ ((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_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./node_modules/css-loader/dist/runtime/noSourceMaps.js");
/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("./node_modules/css-loader/dist/runtime/api.js");
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
// Imports
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
___CSS_LOADER_EXPORT___.push([module.id, "/**\r\n    PopNotify.css\r\n    @author CKylinMC\r\n    @version 1.1\r\n    @license MIT\r\n*/\r\n\r\ndiv.popNotifyUnitFrame {\r\n    cursor: pointer;\r\n    box-shadow: 0 3px 6px #80808085;\r\n    min-width: 300px;\r\n    position: fixed;\r\n    z-index: 9999;\r\n    width: max-content;\r\n    min-height: 60px;\r\n    height: fit-content;\r\n    text-align: left;\r\n    top: -100%;\r\n    right: -100%;\r\n    /* overflow: hidden; */\r\n    opacity: 1;\r\n    background: white;\r\n    border-radius: 6px;\r\n    /* animation: pnin forwards .3s cubic-bezier(0, 0.6, 0, 1); */\r\n    /* animation: pnin forwards .8s cubic-bezier(0.04, 1.01, 0.17, 1.04); */\r\n    animation: pnin forwards .8s cubic-bezier(0.1, 1, 0, 1.05);\r\n    transition: .3s;\r\n    /*padding: 6px 12px;*/\r\n    overflow: hidden;\r\n}\r\n\r\ndiv.popNotifyUnitFrame>*:not(i):nth-child(1) {\r\n    margin-bottom: 0;\r\n}\r\n\r\ndiv.popNotifyUnitFrame>*:not(i):nth-child(2) {\r\n    margin-top: 0;\r\n}\r\n\r\n.popNotifyUnitTitle,\r\n.popNotifyUnitContent {\r\n    transform: translateX(50px);\r\n    opacity: 0;\r\n    min-height: 30px;\r\n    height: fit-content;\r\n    margin: 6px 12px;\r\n    font-size: 1em;\r\n}\r\n\r\n.popNotifyUnitTitle {\r\n    font-weight: bold;\r\n    font-size: 1.5em;\r\n}\r\n\r\n.popNotifyUnitBar {\r\n    display: block;\r\n    position: absolute;\r\n    left: 0;\r\n    bottom: 0;\r\n    height: 3px;\r\n    width: 0%;\r\n    background: black;\r\n    animation-name: pnbar;\r\n    animation-timing-function: linear;\r\n}\r\n\r\n.popStyle-success {\r\n    background: rgb(172, 255, 223)!important;\r\n}\r\n\r\n.popStyle-success .popNotifyUnitTitle,\r\n.popStyle-success .popNotifyUnitContent {\r\n    color: rgb(0, 114, 70) !important;\r\n}\r\n\r\n.popStyle-success .popNotifyUnitBar {\r\n    background: rgb(0, 114, 70) !important;\r\n}\r\n\r\n.popStyle-info {\r\n    background: rgb(195, 226, 255) !important;\r\n}\r\n\r\n.popStyle-info .popNotifyUnitTitle,\r\n.popStyle-info .popNotifyUnitContent {\r\n    color: rgb(0, 80, 155) !important;\r\n}\r\n\r\n.popStyle-info .popNotifyUnitBar {\r\n    background: rgb(0, 80, 155) !important;\r\n}\r\n\r\n.popStyle-error {\r\n    background: rgb(255, 196, 196) !important;\r\n}\r\n\r\n.popStyle-error .popNotifyUnitTitle,\r\n.popStyle-error .popNotifyUnitContent {\r\n    color: rgb(255, 66, 66) !important;\r\n}\r\n\r\n.popStyle-error .popNotifyUnitBar {\r\n    background: rgb(255, 66, 66) !important;\r\n}\r\n\r\n.popStyle-warn {\r\n    background: rgb(255, 218, 139) !important;\r\n}\r\n\r\n.popStyle-warn .popNotifyUnitTitle,\r\n.popStyle-warn .popNotifyUnitContent {\r\n    color: rgb(177, 94, 0) !important;\r\n}\r\n\r\n.popStyle-warn .popNotifyUnitBar {\r\n    background: rgb(177, 94, 0) !important;\r\n}\r\n\r\n@keyframes pnin {\r\n    from {\r\n        opacity: 0;\r\n        right: -100%;\r\n    }\r\n    /* to {\r\n        opacity: 1;\r\n        right: 20px;\r\n    } */\r\n}\r\n\r\n@keyframes pnout {\r\n    to {\r\n        opacity: 0;\r\n        right: -100%;\r\n    }\r\n}\r\n\r\n@keyframes pntextin {\r\n    to {\r\n        opacity: 1;\r\n        transform: translateX(0);\r\n    }\r\n}\r\n\r\n@keyframes pnbar {\r\n    to {\r\n        width: 100%;\r\n    }\r\n}", ""]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
/***/ }),
/***/ "./node_modules/css-loader/dist/cjs.js!./src/style/css/reminderCSS.css":
/***/ ((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_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./node_modules/css-loader/dist/runtime/noSourceMaps.js");
/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("./node_modules/css-loader/dist/runtime/api.js");
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
// Imports
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
___CSS_LOADER_EXPORT___.push([module.id, ".top {\r\n    font-weight: bold;\r\n}\r\n\r\n.hwtName,\r\n.courseName {\r\n    font-size: 105%;\r\n    cursor: pointer;\r\n}\r\n\r\n.listwrap>.list {\r\n    overflow: auto;\r\n    height: 150px;\r\n}", ""]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
/***/ }),
/***/ "./node_modules/css-loader/dist/cjs.js!./src/style/css/upload-doms.css":
/***/ ((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_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./node_modules/css-loader/dist/runtime/noSourceMaps.js");
/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("./node_modules/css-loader/dist/runtime/api.js");
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
// Imports
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
___CSS_LOADER_EXPORT___.push([module.id, "/*\r\n    upload-doms.css\r\n    @author ZiuChen\r\n*/\r\n\r\nbody {\r\n    font-family: PingFang SC,HarmonyOS_Regular,Helvetica Neue,Microsoft YaHei,sans-serif!important;\r\n    font-weight: 400;\r\n    background-color: #F1F2F3;\r\n}\r\n\r\n#inputDiv {\r\n    height: 200px;\r\n    width: 560px;\r\n    margin-top: 20px;\r\n    margin-bottom: 10px;\r\n    box-shadow: 5px 5px 5px #888888;\r\n    cursor: pointer;\r\n    border: 4px solid;\r\n    border-radius: 10px;\r\n    border-color: #82b900;\r\n    background: #c6f062;\r\n}\r\n\r\n#currentFile {\r\n    display: none;\r\n}\r\n\r\n#filenames {\r\n    height: 200px;\r\n    overflow: auto;\r\n    margin-top: 10px;\r\n    margin-bottom: 10px;\r\n    border: 3px solid rgb(130, 185, 0);\r\n    box-shadow: 5px 5px 5px #888888;\r\n    border-radius: 10px;\r\n    -moz-user-select: none;\r\n\t-webkit-user-select: none;\r\n\t-ms-user-select: none;\r\n\tuser-select: none;\r\n}\r\n\r\n/* 滚动条 */\r\n#filenames::-webkit-scrollbar {\r\n    width: 12px;\r\n}\r\n/* 滚动槽 */\r\n#filenames::-webkit-scrollbar-track {\r\n    border-radius: 10px;\r\n}\r\n/* 滑块 */\r\n#filenames::-webkit-scrollbar-thumb {\r\n    border-radius: 10px;\r\n    background: rgba(0,0,0,0.1);\r\n}\r\n\r\n#filenames::-webkit-scrollbar-thumb:active {\r\n    border-radius: 10px;\r\n    background: rgba(0,0,0,0.4);\r\n}\r\n\r\n#buttonDiv {\r\n    margin-top: 20px;\r\n    margin-bottom: 10px;\r\n    text-align: center;\r\n    -moz-user-select: none;\r\n\t-webkit-user-select: none;\r\n\t-ms-user-select: none;\r\n\tuser-select: none;\r\n}\r\n\r\n#outerDiv {\r\n    font-size: 14px;\r\n    width: 590px;\r\n    margin: 0 auto;\r\n    margin-top: 5px;\r\n    margin-bottom: 5px;\r\n}\r\n\r\n#fileInfo {\r\n    text-align: left;\r\n    cursor: default;\r\n}\r\n\r\n#textShow {\r\n    margin-top: 80px;\r\n    font-size: 20px;\r\n    color: #424d55;\r\n    text-align: center;\r\n}\r\n\r\n#userTips {\r\n    color: #c0c1bb;\r\n    cursor: default;\r\n}\r\n\r\n#buttonDiv>a {\r\n    cursor: pointer;\r\n    padding-top: 5.5px;\r\n    padding-bottom: 5.5px;\r\n    padding-right: 12px;\r\n    padding-left: 12px;\r\n    margin-right: 12px;\r\n    margin-left: 12px;\r\n    border-radius: 5px;\r\n    box-shadow: 1px 1px 3px #888888;\r\n    background-color: #c6f062;\r\n    border: 2px solid;\r\n}\r\n\r\n.fileObjects {\r\n    cursor:default;\r\n    margin-top: 10px;\r\n    margin-bottom: 10px;\r\n    background-image: url(\"http://cc.bjtu.edu.cn:81/meol/styles/newstyle/course/new06/body_bg.jpg\");\r\n    background-repeat:no-repeat;\r\n    background-size: 0%;\r\n}", ""]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
/***/ }),
/***/ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js":
/***/ ((module) => {
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 indexByIdentifier = getIndexByIdentifier(identifier);
    var obj = {
      css: item[1],
      media: item[2],
      sourceMap: item[3],
      supports: item[4],
      layer: item[5]
    };
    if (indexByIdentifier !== -1) {
      stylesInDOM[indexByIdentifier].references++;
      stylesInDOM[indexByIdentifier].updater(obj);
    } else {
      var updater = addElementStyle(obj, options);
      options.byIndex = i;
      stylesInDOM.splice(i, 0, {
        identifier: identifier,
        updater: updater,
        references: 1
      });
    }
    identifiers.push(identifier);
  }
  return identifiers;
}
function addElementStyle(obj, options) {
  var api = options.domAPI(options);
  api.update(obj);
  var updater = function updater(newObj) {
    if (newObj) {
      if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {
        return;
      }
      api.update(obj = newObj);
    } else {
      api.remove();
    }
  };
  return updater;
}
module.exports = function (list, options) {
  options = options || {};
  list = list || [];
  var lastIdentifiers = modulesToDom(list, options);
  return function update(newList) {
    newList = newList || [];
    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;
  };
};
/***/ }),
/***/ "./node_modules/style-loader/dist/runtime/insertBySelector.js":
/***/ ((module) => {
var memo = {};
/* istanbul ignore next  */
function getTarget(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];
}
/* istanbul ignore next  */
function insertBySelector(insert, style) {
  var target = getTarget(insert);
  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);
}
module.exports = insertBySelector;
/***/ }),
/***/ "./node_modules/style-loader/dist/runtime/insertStyleElement.js":
/***/ ((module) => {
/* istanbul ignore next  */
function insertStyleElement(options) {
  var element = document.createElement("style");
  options.setAttributes(element, options.attributes);
  options.insert(element, options.options);
  return element;
}
module.exports = insertStyleElement;
/***/ }),
/***/ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js":
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
/* istanbul ignore next  */
function setAttributesWithoutAttributes(styleElement) {
  var nonce =  true ? __webpack_require__.nc : 0;
  if (nonce) {
    styleElement.setAttribute("nonce", nonce);
  }
}
module.exports = setAttributesWithoutAttributes;
/***/ }),
/***/ "./node_modules/style-loader/dist/runtime/styleDomAPI.js":
/***/ ((module) => {
/* istanbul ignore next  */
function apply(styleElement, options, obj) {
  var css = "";
  if (obj.supports) {
    css += "@supports (".concat(obj.supports, ") {");
  }
  if (obj.media) {
    css += "@media ".concat(obj.media, " {");
  }
  var needLayer = typeof obj.layer !== "undefined";
  if (needLayer) {
    css += "@layer".concat(obj.layer.length > 0 ? " ".concat(obj.layer) : "", " {");
  }
  css += obj.css;
  if (needLayer) {
    css += "}";
  }
  if (obj.media) {
    css += "}";
  }
  if (obj.supports) {
    css += "}";
  }
  var sourceMap = obj.sourceMap;
  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  */
  options.styleTagTransform(css, styleElement, options.options);
}
function removeStyleElement(styleElement) {
  // istanbul ignore if
  if (styleElement.parentNode === null) {
    return false;
  }
  styleElement.parentNode.removeChild(styleElement);
}
/* istanbul ignore next  */
function domAPI(options) {
  var styleElement = options.insertStyleElement(options);
  return {
    update: function update(obj) {
      apply(styleElement, options, obj);
    },
    remove: function remove() {
      removeStyleElement(styleElement);
    }
  };
}
module.exports = domAPI;
/***/ }),
/***/ "./node_modules/style-loader/dist/runtime/styleTagTransform.js":
/***/ ((module) => {
/* istanbul ignore next  */
function styleTagTransform(css, styleElement) {
  if (styleElement.styleSheet) {
    styleElement.styleSheet.cssText = css;
  } else {
    while (styleElement.firstChild) {
      styleElement.removeChild(styleElement.firstChild);
    }
    styleElement.appendChild(document.createTextNode(css));
  }
}
module.exports = styleTagTransform;
/***/ }),
/***/ "./package.json":
/***/ ((module) => {
module.exports = JSON.parse('{"name":"no-flash-upload","description":"一个北京交通大学课程平台附件上传脚本。","version":"1.3.9","author":{"name":"ZiuChen","email":"[email protected]"},"scripts":{"postversion":"git push --follow-tags","analize":"npm_config_report=true npm run build","build":"webpack --mode production --config config/webpack.config.production.cjs","dev":"webpack --mode development --config config/webpack.config.dev.cjs"},"repository":{"type":"git","url":"https://github.com/ZiuChen/NO-FLASH-Upload"},"private":true,"dependencies":{"axios":"0.24.0","axios-userscript-adapter":"0.1.8","jquery":"3.6.0"},"devDependencies":{"@babel/core":"7.16.0","@babel/preset-env":"7.16.0","@babel/preset-typescript":"7.16.0","@types/greasemonkey":"4.0.2","@typescript-eslint/eslint-plugin":"5.2.0","@typescript-eslint/parser":"5.2.0","babel-loader":"8.2.3","browserslist":"4.17.5","css-loader":"6.5.0","less":"4.1.2","less-loader":"10.2.0","style-loader":"3.3.1","typescript":"4.4.4","userscript-metadata-webpack-plugin":"0.1.1","webpack":"5.61.0","webpack-bundle-analyzer":"4.5.0","webpack-cli":"4.9.1","webpack-livereload-plugin":"3.0.2","webpack-merge":"5.8.0"}}');
/***/ })
/******/ 	});
/************************************************************************/
/******/ 	// The module cache
/******/ 	var __webpack_module_cache__ = {};
/******/ 	
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/ 		// Check if module is in cache
/******/ 		var cachedModule = __webpack_module_cache__[moduleId];
/******/ 		if (cachedModule !== undefined) {
/******/ 			return cachedModule.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.
(() => {
;// CONCATENATED MODULE: ./src/functions/append-tags/front-tags.js
let Tag1 =
/*html*/
`<li><a id="add_button" title="上传作业" onclick=location="http://cc.bjtu.edu.cn:81/meol/common/hw/student/hwtask.jsp?tagbug=client&strStyle=new06"><span>上传作业</span></a></li>`;
let Tag2 =
/*html*/
`<li><a id="add_button" title="下载资源" onclick=location="http://cc.bjtu.edu.cn:81/meol/common/script/listview.jsp?lid=${location.href.split('courseId=')[1]}&folderid=0"><span>下载资源</span></a></li>`;
/* harmony default export */ const front_tags = ({
  tag1: Tag1,
  tag2: Tag2
});
;// CONCATENATED MODULE: ./src/functions/append-tags/append-tags.js
function apppendTags() {
  $('#tmenu').append(front_tags.tag1, front_tags.tag2);
}
/* harmony default export */ const append_tags = (apppendTags);
;// CONCATENATED MODULE: ./src/functions/file-upload/tips-blow.js
let tips = {
  p1:
  /*html*/
  `<p>Tips:上传前点击文件前的图标可以删除该文件,文件上传后点击文件名获取文件下载链接。</p>`,
  p2:
  /*html*/
  `<p>感谢您使用此脚本,欢迎<a href="https://greasyfork.org/zh-CN/scripts/432056" target="blank">好评</a>并<a href="https://blog.csdn.net/Huuc6/article/details/120256435" target="blank">推荐</a>给身边同学,</p>`,
  p3:
  /*html*/
  `<p>如果喜欢这个脚本,可以选择<a href="https://gitee.com/ziuc/utool-filebed/raw/master/Buy me a coffee.png" target="blank">捐赠</a>,这将鼓励我持续维护这个脚本。</p>`
};
/* harmony default export */ const tips_blow = (tips);
;// CONCATENATED MODULE: ./src/functions/file-upload/upload-doms.js
let inputDiv =
/* html */
`<div id="inputDiv"><div id="inputArea"><div id="textShow"><p id="p1">📁文件上传📝</p><p id="p2" style="font-size: 15px">(支持拖拽上传文件)</p></div></div></div>`;
let inputTag =
/* html */
`<input id="currentFile" type="file" multiple="multiple"</input>`;
let fileInfoDiv =
/* html */
`<div id="fileInfo"><a>已选择文件:</a></div>`;
let filenamesDiv =
/* html */
`<div id="filenames"></div>`;
let uploadBtn =
/* html */
`<a id="uploadTrigger" title="上传">上传</a>`;
let emptyBtn =
/* html */
`<a id="emptyTrigger" title="清空">清空</a>`;
let buttonDiv =
/* html */
`<div id="buttonDiv">${uploadBtn}${emptyBtn}</div>`;
let usertipsDiv =
/* html */
`<div id="userTips"><details>${tips_blow.p1}${tips_blow.p2}${tips_blow.p3}<summary>更多信息</summary></details></div>`;
let uploadBox =
/* html */
`<tr><td><div id="outerDiv">${inputDiv}${inputTag}${fileInfoDiv}${filenamesDiv}${buttonDiv}${usertipsDiv}</div></td></tr>`;
/* harmony default export */ const upload_doms = ({
  box: uploadBox,
  uploadBtn: uploadBtn,
  emptyBtn: emptyBtn
});
// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js
var injectStylesIntoStyleTag = __webpack_require__("./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js");
var injectStylesIntoStyleTag_default = /*#__PURE__*/__webpack_require__.n(injectStylesIntoStyleTag);
// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/styleDomAPI.js
var styleDomAPI = __webpack_require__("./node_modules/style-loader/dist/runtime/styleDomAPI.js");
var styleDomAPI_default = /*#__PURE__*/__webpack_require__.n(styleDomAPI);
// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/insertBySelector.js
var insertBySelector = __webpack_require__("./node_modules/style-loader/dist/runtime/insertBySelector.js");
var insertBySelector_default = /*#__PURE__*/__webpack_require__.n(insertBySelector);
// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js
var setAttributesWithoutAttributes = __webpack_require__("./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js");
var setAttributesWithoutAttributes_default = /*#__PURE__*/__webpack_require__.n(setAttributesWithoutAttributes);
// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/insertStyleElement.js
var insertStyleElement = __webpack_require__("./node_modules/style-loader/dist/runtime/insertStyleElement.js");
var insertStyleElement_default = /*#__PURE__*/__webpack_require__.n(insertStyleElement);
// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/styleTagTransform.js
var styleTagTransform = __webpack_require__("./node_modules/style-loader/dist/runtime/styleTagTransform.js");
var styleTagTransform_default = /*#__PURE__*/__webpack_require__.n(styleTagTransform);
// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/style/css/PopNotify.css
var PopNotify = __webpack_require__("./node_modules/css-loader/dist/cjs.js!./src/style/css/PopNotify.css");
;// CONCATENATED MODULE: ./src/style/css/PopNotify.css
var options = {};
options.styleTagTransform = (styleTagTransform_default());
options.setAttributes = (setAttributesWithoutAttributes_default());
      options.insert = insertBySelector_default().bind(null, "head");
options.domAPI = (styleDomAPI_default());
options.insertStyleElement = (insertStyleElement_default());
var update = injectStylesIntoStyleTag_default()(PopNotify/* default */.Z, options);
       /* harmony default export */ const css_PopNotify = (PopNotify/* default */.Z && PopNotify/* default.locals */.Z.locals ? PopNotify/* default.locals */.Z.locals : undefined);
;// CONCATENATED MODULE: ./src/js/PopNotify.js
/**
 * PopNotify.js
 * @author CKylinMC
 * @version 1.1
 * @licence MIT
 */
function popNotifyUnit(title, content, onclick, timeout, style, autoshow) {
  this.constructor = function (title, content, onclick, timeout) {
    this.title = title;
    this.content = content;
    this.onclick = onclick instanceof Function ? onclick : this.close(this);
    this.timeout = timeout || 5000;
    this.id = "PNU_" + Math.floor(Math.random() * 1000000) + new Date().getMilliseconds().toString();
    this.posRight = 20;
    this.posTop = popNotify.getNextYPos();
    this.timer = null;
    this.style = style;
    this.showing = false;
    this.destoried = false; // window[this.id] = this;
    if (autoshow) this.show();
  };
  this.setPosRight = function (x) {
    // if (!this.showing) return;
    x = parseFloat(x);
    if (isNaN(x)) return;
    this.posRight = x;
    this.update();
  };
  this.setPosTop = function (y) {
    // if (!this.showing) return;
    y = parseFloat(y);
    if (isNaN(y)) return;
    this.posTop = y;
    this.update();
  };
  this.update = function () {
    let el = document.querySelector("#" + this.id);
    if (!el) return;
    el.style.top = this.posTop + "px";
    el.style.right = this.posRight + "px";
  };
  this.clicked = function (e, ev) {
    return function () {
      if (e.onclick(ev, e) !== false) e.destory();
    };
  };
  this.show = function () {
    if (this.timer) clearTimeout(this.timer);
    let el = document.querySelector("#" + this.id);
    if (el) el.remove();
    el = document.createElement("div");
    el.id = this.id;
    el.className = "popNotifyUnitFrame" + (this.style ? " popStyle-" + this.style : "");
    el.onclick = this.clicked(this);
    el.style.top = this.posTop + "px";
    el.style.right = this.posRight + "px";
    if (this.title != null) {
      let t = document.createElement("div");
      t.innerText = this.title;
      t.className = "popNotifyUnitTitle";
      t.style.animation = "pntextin .8s forwards .2s cubic-bezier(0, 0.6, 0, 1)";
      el.appendChild(t);
    }
    if (this.content != null) {
      let c = document.createElement("div");
      c.innerText = this.content;
      c.className = "popNotifyUnitContent";
      c.style.animation = "pntextin .8s forwards .3s cubic-bezier(0, 0.6, 0, 1)";
      el.appendChild(c);
    }
    let b = document.createElement("i");
    b.className = "popNotifyUnitBar";
    b.style.animationDuration = this.timeout / 1000 + "s";
    el.appendChild(b);
    this.timer = setTimeout(this.close(this), this.timeout);
    document.body.appendChild(el);
    this.showing = true;
  };
  this.close = function (e) {
    return function () {
      e.destory();
    };
  };
  this.destory = function (force) {
    if (this.destoried) return;
    this.destoried = true;
    this.showing = false;
    if (this.timer) clearTimeout(this.timer);
    let el = document.querySelector("#" + this.id);
    if (el) {
      if (force) return el.remove();
      el.style.animation = "none";
      el.style.animation = "pnout forwards .3s ease-in-out";
      setTimeout(this.remove(this), 310);
      popNotify.refresh();
    }
    popNotify.cleanUp(this);
  };
  this.remove = function (e) {
    return function () {
      let el = document.querySelector("#" + e.id);
      if (el) el.remove();
    };
  };
  this.el = function () {
    return document.querySelector("#" + this.id);
  };
  this.constructor(title, content, onclick, timeout);
}
var popNotify = {
  queue: [],
  closingAll: false,
  show: function () {
    let title = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
    let content = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
    let style = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
    let timeout = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 5;
    let onclick = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;
    this.notify(title, content, timeout * 1000, onclick, style);
  },
  success: function () {
    let title = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
    let content = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
    let timeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 5;
    let onclick = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
    this.show(title, content, "success", timeout, onclick);
  },
  info: function () {
    let title = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
    let content = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
    let timeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 5;
    let onclick = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
    this.show(title, content, "info", timeout, onclick);
  },
  warn: function () {
    let title = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
    let content = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
    let timeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 5;
    let onclick = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
    this.show(title, content, "warn", timeout, onclick);
  },
  error: function () {
    let title = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
    let content = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
    let timeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 5;
    let onclick = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
    this.show(title, content, "error", timeout, onclick);
  },
  notify: function (title, content, timeout, onclick, style) {
    let n = new popNotifyUnit(title, content, onclick, timeout, style, true);
    this.queue.push(n);
    this.refresh();
    return n;
  },
  cleanUp: function (obj) {
    if (this.closingAll) return;
    if (obj) this.queue.forEach((item, index) => {
      if (item === obj) this.queue.splice(index, 1);
    });else for (let i = 0; i < this.queue.length; i++) {
      if (this.queue[i].showing === false) {
        this.queue.splice(i, 1);
        i -= 1;
      }
    }
  },
  refresh: function () {
    let top = 20;
    let height = top;
    this.queue.forEach(item => {
      if (!item.showing) return;
      item.setPosTop(height);
      height += top + item.el().offsetHeight;
    });
  },
  getNextYPos: function () {
    let top = 20;
    let height = top;
    this.queue.forEach(item => {
      if (!item.showing) return;
      height += top + item.el().offsetHeight;
    });
    return height;
  },
  getObjById: function (id) {
    if (!id) return;
    let res = null;
    this.queue.forEach(item => {
      if (item.id === id) res = item;
    });
    return res;
  },
  getObjByElement: function (e) {
    if (!e) return;
    if (!e instanceof HTMLElement) return;
    let id = null;
    if (e.classList.contains("popNotifyUnitFrame")) {
      id = e.id;
    } else if (e.classList.contains("popNotifyUnitTitle") || e.classList.contains("popNotifyUnitContent")) {
      id = e.parentNode.id;
    }
    let res = null;
    this.queue.forEach(item => {
      if (item.id === id) res = item;
    });
    return res;
  },
  close: function (item) {
    let obj;
    if (item instanceof HTMLElement) {
      obj = this.getObjByElement(item);
    } else {
      obj = this.getObjById(item);
    }
    if (!obj) return;
    obj.destory();
  },
  closeAll: function () {
    this.closingAll = true;
    this.queue.forEach(item => item.destory());
    this.queue = [];
    this.closingAll = false;
  }
};
/* harmony default export */ const js_PopNotify = (popNotify);
// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/style/css/upload-doms.css
var css_upload_doms = __webpack_require__("./node_modules/css-loader/dist/cjs.js!./src/style/css/upload-doms.css");
;// CONCATENATED MODULE: ./src/style/css/upload-doms.css
var upload_doms_options = {};
upload_doms_options.styleTagTransform = (styleTagTransform_default());
upload_doms_options.setAttributes = (setAttributesWithoutAttributes_default());
      upload_doms_options.insert = insertBySelector_default().bind(null, "head");
upload_doms_options.domAPI = (styleDomAPI_default());
upload_doms_options.insertStyleElement = (insertStyleElement_default());
var upload_doms_update = injectStylesIntoStyleTag_default()(css_upload_doms/* default */.Z, upload_doms_options);
       /* harmony default export */ const style_css_upload_doms = (css_upload_doms/* default */.Z && css_upload_doms/* default.locals */.Z.locals ? css_upload_doms/* default.locals */.Z.locals : undefined);
;// CONCATENATED MODULE: ./src/functions/file-upload/file-uploader.js
function fileUploader() {
  if ($("span:contains('查看作业任务')").length == 0) {
    // 判断是否在作业页面
    return;
  }
  $('.infotable>tbody>tr:contains("请输入你的答案")').after(upload_doms.box);
  $('#filenames, #buttonDiv, #fileInfo').hide(); // 全局变量
  let onUpload = 0;
  let index = 0;
  let isAbort = 0;
  let alreadyLoaded = 0;
  let startTime = 0;
  let flag = 0;
  let filelist = []; // 信息显示部分
  let upldIconList = ['🕒', '⚡', '✅', '🕒', '⌛', '🔒', '✅']; // 所有icon统一管理
  let fileTypeIconList = ['📄', '⛺', '📚', '🎬', '📝', '📜', '🎵']; // 动效
  $('#inputDiv').mouseenter(function () {
    $('#inputDiv').css({
      'background-color': '#aad63d'
    });
    $('#textShow').css('color', '#ffffff');
  });
  $('#inputDiv').mouseleave(function () {
    $('#inputDiv').css({
      'background-color': '#c6f062'
    });
    $('#textShow').css('color', '#424d55');
  });
  function appendObjects(filelist) {
    // 缓存区更新前DOM操作
    $('#filenames, #buttonDiv, #fileInfo').show();
    $('#filenames, #buttonDiv').empty(); // 清空缓存区
    $('#inputDiv').hide(); // 隐藏上传框
    let sizeType = getSizeType(filelist);
    let nameType = getNameType(filelist);
    let fileType = getFileType(filelist);
    for (let i = 0; i < filelist.length; i++) {
      let item = {};
      item.file = filelist[i];
      item.sizeType = sizeType[i];
      item.initName = item.file.name;
      item.showName = nameType[i];
      item.fileTypeIcon = fileType[i].icon;
      item.fileTypeInfo = fileType[i].info;
      let fileObject =
      /*html*/
      `<div class="fileObjects" id="fileTh${i}"><a class="fileindex" id="fileindex${i}" title="${item.fileTypeInfo}" type="${item.file.type}" style="cursor:pointer; margin-left: 15px;">${item.fileTypeIcon}</a>&nbsp&nbsp|&nbsp&nbsp<a class="filename" id="filenameTH${i}" title="${item.initName}" data-clipboard-text="">${item.showName}<a class="fileSize">  (${item.sizeType.size}${item.sizeType.type})</a></a><a class="uploadSpeed" id="speedTh${i}" title="上传速度"></a><a class="timeRemain" id="timeRemainTh${i}"></a></div>`;
      $('#filenames').append(fileObject);
    } // 缓存区更新后DOM操作
    $('#buttonDiv').append(upload_doms.uploadBtn);
    $('#buttonDiv').append(upload_doms.emptyBtn); // 动效 (所有Object都已插入完毕)
    $('.fileObjects').mouseenter(function () {
      // 1.文字加粗 2.展示全名
      let prevName = $(this).find('.filename').html();
      $(this).find('.filename').css('font-weight', 'bold');
      $('.fileObjects').mouseleave(function () {
        $(this).find('.filename').css('font-weight', '');
        $(this).find('.filename').html(prevName);
      });
      if (onUpload == 1 && index == $(this).attr('id').split('fileTh')[1]) {
        // 文件已经开始上传且this为正在上传的文件, 此后的命令将不被执行
        return;
      }
      $(this).find('.filename').html($(this).find('.filename').attr('title'));
    });
    $('.fileindex').mouseenter(function () {
      if (onUpload == 1 || $(this).attr('title') == '[已上传]') {
        // 上传进程已开始/已经上传完 屏蔽按钮
        return;
      }
      let iconNow = $(this).html();
      let titleNow = $(this).attr('title');
      $(this).html('❌');
      $(this).attr('title', '删除');
      $('.fileindex').mouseleave(function () {
        if (onUpload == 1 || $(this).attr('title') == '[已上传]') {
          return;
        }
        $(this).html(iconNow);
        $(this).attr('title', titleNow);
      });
    });
  } // 文件选择前事件监听
  $('#inputDiv').click(() => {
    $('#currentFile').trigger('click');
  });
  $('#currentFile').change(function () {
    flag = 0;
    filelist = []; // 先执行清空 再push
    fileChangedByInput();
  });
  function fileChangedByInput() {
    if (flag == 0) {
      let filelistTMP = {};
      for (let i = 0; i < $('#currentFile')[0].files.length; i++) {
        filelistTMP = $('#currentFile')[0].files[i];
        filelist.push(filelistTMP);
        filelistTMP = {};
      }
    } // 缓存区更新
    appendObjects(filelist); // 文件更新后事件监听
    $('#emptyTrigger').click(function () {
      $('#currentFile').val('');
      $('#filenames, #buttonDiv').empty();
      $('#inputDiv').show();
      isAbort = 1;
      onUpload = 0;
      filelist = [];
      $('#filenames, #buttonDiv, #fileInfo').hide();
    });
    $('.fileindex').click(function () {
      if (onUpload == 1 || $(this).attr('title') == '[已上传]') {
        // 上传进程已开始/已经上传完 屏蔽按钮
        return;
      }
      let th = $(this).attr('id').split('fileindex')[1];
      filelist.splice(th, 1); // 缓存区更新
      appendObjects(filelist);
      flag = 1; // 执行change前,flag置1,不重新读文件
      fileChangedByInput();
      flag = 0; // 执行change后,flag置0,为下次重新读文件做准备
      if (filelist.length == 0) {
        // 点击的文件是最后一个文件,则直接执行清空
        $('#emptyTrigger').trigger('click');
      }
    }); // 上传按钮的监听要放在change中: change后才有#uploadtrigger
    $('#uploadTrigger').click(function () {
      $('#uploadTrigger').hide();
      if (onUpload == 1) {
        // 上传进程开始,屏蔽按钮
        return;
      } // 处理文件缓存区
      isAbort = 0; // 按上传之前按过清空,将isAbort置回0
      sendFileMsg();
      function sendFileMsg() {
        if (index >= filelist.length) {
          // 递归结束
          $('#currentFile').val(''); // <input>文件清空
          index = 0; // 递归条件置零
          onUpload = 0; // 上传开始标志位置0
          return; // 结束递归
        }
        let formData = new FormData();
        formData.append('Filename', filelist[index].name);
        formData.append('Filedata', filelist[index]);
        let xReq = new XMLHttpRequest();
        xReq.open('POST', 'http://cc.bjtu.edu.cn:81/meol/servlet/SerUpload');
        xReq.addEventListener("load", onSuccess);
        xReq.addEventListener("error", onError);
        xReq.upload.onloadstart = onStart;
        xReq.upload.onprogress = onProgress;
        xReq.upload.onabort = onAbort;
        xReq.send(formData);
        function onStart() {
          onUpload = 1; // 上传标志位置1
          startTime = new Date().getTime(); // 设置上传开始时间,用以计算时间速度
          alreadyLoaded = 0; // 设置上传开始时,已上传的文件大小为0
          // 上传开始,缓存区加入竖线
          // $('#speedTh'+index).prepend('&nbsp; | &nbsp;');
          if (filelist[index].size > 52428800) {
            // 大于50M文件 插入timeremain竖线
            $('#timeRemainTh' + index).before('&nbsp; | &nbsp;');
          }
        }
        function onProgress(evt) {
          if (isAbort == 1) {
            xReq.abort(); // 上传过程中随时检查,终止请求
          } // 进度计算
          let percentage = (evt.loaded * 100 / evt.total).toFixed(0); // 速度计算
          let nt = new Date().getTime(); // 获取当前时间
          let perTime = (nt - startTime) / 1000; // 计算出上次调用该方法时到现在的时间差,单位为s
          startTime = new Date().getTime(); //重新赋值,用以下次计算
          let perLoad = evt.loaded - alreadyLoaded; // 计算该分段上传的文件大小,单位b
          alreadyLoaded = evt.loaded; // 重新赋值,用以下次计算
          let speed = perLoad / perTime; // 单位 B/s
          let bspeed = speed;
          let Sunits = 'B/s';
          if (speed / 1024 > 1) {
            speed = speed / 1024;
            Sunits = 'KB/s';
          }
          if (speed / 1024 > 1) {
            speed = speed / 1024;
            Sunits = 'MB/s';
          }
          speed = speed.toFixed(1); // 时间计算 文件>20MB触发
          if (evt.total > 20971520) {
            let restTime = ((evt.total - evt.loaded) / bspeed).toFixed(0); // 实时更新文件缓存区
            $('#timeRemainTh' + index).html(upldIconList[0] + restTime + 's');
            $('#timeRemainTh' + index).attr('title', '剩余时间');
          } // 实时更新文件缓存区
          $('#fileTh' + index).css('background-size', percentage + '%');
          $('#speedTh' + index).html('&nbsp; | &nbsp;' + upldIconList[1] + speed + Sunits);
        }
        function onAbort() {
          isAbort = 0; // 终止条件置零
          index = 0; // 请求终止后index也必须归零,准备发起第二次上传请求
          onUpload = 0; // 上传标志位置0
        }
        function onSuccess() {
          // 插入编辑器操作
          let myiframe = document.getElementsByTagName('iframe')[1].contentDocument;
          let textArea = myiframe.getElementsByClassName('cke_show_borders');
          let constructor = '<p><a data-cke-saved-href="/meol/' + this.responseText + '" href="/meol/' + this.responseText + '">' + filelist[index].name + '</a></p>';
          if ($(textArea).find("p>br").length >= 1) {
            $(textArea).find("p")[0].remove();
          }
          $(textArea).append(constructor); // 处理缓存区操作
          let clipboard = new ClipboardJS('#filenameTH' + index); // 要用id做索引 否则会重复调用.on
          let fileURL = 'http://cc.bjtu.edu.cn:81/meol/' + this.responseText;
          $('#filenameTH' + index).attr("data-clipboard-text", fileURL);
          $('#filenameTH' + index).css('cursor', 'pointer');
          $('#fileindex' + index).html('<a>' + upldIconList[2] + '</a>');
          $('#fileindex' + index).attr('title', '[已上传]');
          $('#speedTh' + index).html('');
          $('#timeRemainTh' + index).remove();
          $('#fileTh' + index).css('background', '#ffffff');
          $('#fileTh' + index).css('font-color', '#e7e8e0');
          clipboard.on('success', function (evt) {
            js_PopNotify.show("成功", `【${$(evt.trigger).text()}】 文件链接已复制到剪切板`, "success");
            evt.clearSelection();
          }); // 递归操作
          index++;
          sendFileMsg();
        }
        function onError() {
          alert('Failed');
        }
      }
    });
  } // 拖拽上传功能
  let oBox = document.getElementById('inputDiv');
  let timer = null;
  document.ondragover = function () {
    clearTimeout(timer);
    timer = setTimeout(function () {
      // 文件放下后执行操作
      $('#p1').html('📁文件上传📝');
      $('#inputDiv').css('background-color', '#c6f062');
      $('#textShow').css('color', '#424d55');
    }, 200);
  }; // 进入子集的时候 会触发ondragover 频繁触发 不给ondrop机会
  oBox.ondragover = function () {
    return false;
  };
  oBox.ondragleave = function () {
    $('#p1').html('📌请将文件拖拽到此区域');
    $('#inputDiv').css('background-color', '#aad63d');
    $('#textShow').css('color', '#ffffff');
  };
  oBox.ondrop = function (ev) {
    $('#currentFile')[0].files = ev.dataTransfer.files;
    fileChangedByInput();
    return false;
  };
  function getSizeType(filelist) {
    let RtnsizeType = [];
    for (let item of filelist) {
      let sizeTypeTMP = {};
      if (item.size < 1024) {
        sizeTypeTMP.size = item.size.toFixed(2);
        sizeTypeTMP.type = 'B';
      } else if (item.size > 1024 && item.size < 1048576) {
        sizeTypeTMP.size = (item.size / 1024).toFixed(2);
        sizeTypeTMP.type = 'KB';
      } else if (item.size > 1048576 && item.size < 1073741824) {
        sizeTypeTMP.size = (item.size / 1048576).toFixed(2);
        sizeTypeTMP.type = 'MB';
      } else if (item.size > 1073741824) {
        js_PopNotify.show("警告", "你选择了大于1GB的文件,服务器存储资源有限,建议选择其他传输方式。", "warn");
        sizeTypeTMP.size = (item.size / 1073741824).toFixed(2);
        sizeTypeTMP.type = 'GB';
      }
      RtnsizeType.push(sizeTypeTMP);
    }
    return RtnsizeType;
  }
  function getNameType(filelist) {
    // 文件名显示长度限制
    let nameType = [];
    let limit;
    for (let item of filelist) {
      let splitName = item.name.split('.'); // 预防文件名中含.的情况
      let newName = splitName[0];
      for (let i = 1; i < splitName.length - 1; i++) {
        newName = newName + '.' + splitName[i];
      }
      limit = isChina(newName); // 即时生成limit限制
      if (newName.length > limit) {
        // 有后缀超长文件
        newName = newName.slice(0, limit) + '... .' + splitName.pop();
      } else if (newName.length == 0) {
        // 无后缀文件
        newName = splitName[0];
      } else {
        // 默认去掉了后缀 把后缀加回来
        newName = newName + '.' + splitName.pop();
      }
      nameType.push(newName);
    }
    function isChina(str) {
      if (escape(str).indexOf("%u") < 0) {
        return 35; // 不包含中文
      } else {
        return 20; // 包含中文
      }
    }
    return nameType;
  }
  function getFileType(filelist) {
    // 文件图标类型
    let fileType = [];
    for (let item of filelist) {
      let fileTypeTMP = {};
      if (item.type.indexOf('image') != -1) {
        fileTypeTMP.icon = fileTypeIconList[1];
        fileTypeTMP.info = '[图像]';
      } else if (item.type.indexOf('zip') != -1) {
        fileTypeTMP.icon = fileTypeIconList[2];
        fileTypeTMP.info = '[压缩文件]';
      } else if (item.type.indexOf('video') != -1) {
        fileTypeTMP.icon = fileTypeIconList[3];
        fileTypeTMP.info = '[视频]';
      } else if (item.type.indexOf('officedocument') != -1 || item.type.indexOf('excel') != -1 || item.type.indexOf('word') != -1 || item.type.indexOf('powerpoint') != -1) {
        fileTypeTMP.icon = fileTypeIconList[4];
        fileTypeTMP.info = '[文档]';
      } else if (item.type.indexOf('pdf') != -1) {
        fileTypeTMP.icon = fileTypeIconList[5];
        fileTypeTMP.info = '[文档]';
      } else if (item.type.indexOf('audio') != -1) {
        fileTypeTMP.icon = fileTypeIconList[6];
        fileTypeTMP.info = '[音频]';
      } else {
        fileTypeTMP.icon = fileTypeIconList[0];
        fileTypeTMP.info = '[文件]';
      }
      fileType.push(fileTypeTMP);
    }
    return fileType;
  }
}
/* harmony default export */ const file_uploader = (fileUploader);
;// CONCATENATED MODULE: ./src/functions/common/send-request.js
async function sendRequest(url, callBack, options) {
  let res = await fetch(url, options).then(response => {
    return response.blob();
  }).then(blob => {
    return new Promise(resolve => {
      let reader = new FileReader();
      reader.onload = () => {
        let htmlData = reader.result;
        htmlData = new window.DOMParser().parseFromString(htmlData, "text/html");
        resolve(htmlData);
      };
      reader.readAsText(blob, 'GBK');
    });
  }).then(response => {
    return callBack(response);
  }).catch(error => {
    console.error(error);
  });
  return res;
}
/* harmony default export */ const send_request = (sendRequest);
;// CONCATENATED MODULE: ./src/functions/send-request/get-info.js
const baseUrl = `http://cc.bjtu.edu.cn:81/meol`;
const userinfoUrl = `${baseUrl}/welcomepage/student/index.jsp`; // 个人信息leftBar
const reminderUrl = `${baseUrl}/welcomepage/student/interaction_reminder.jsp`; // 互动提醒reminder
const lessonUrl = `${baseUrl}/lesson/blen.student.lesson.list.jsp`; // 课程列表courselist
const hwtListUrl = `${baseUrl}/common/hw/student/hwtask.jsp`; // 课程作业hwtlist
async function getUserInfo() {
  let stuInfo = await send_request(userinfoUrl, obj => {
    return obj.querySelectorAll(".userinfobody>ul>li");
  }).then(res => {
    let obj = {
      name: '',
      loginTime: '',
      onlineTime: '',
      loginTimes: ''
    };
    res.forEach((item, index) => {
      obj[Object.keys(obj)[index]] = item.innerText.split(":")[1].trim();
    });
    return obj;
  }).catch(error => {
    console.log(error);
  });
  return stuInfo;
}
async function getRemindInfo() {
  let remindInfo = await send_request(reminderUrl, obj => {
    return obj.querySelectorAll("ul[id='reminder']>li>ul");
  }).then(res => {
    let obj = {
      notify: [],
      hwt: []
    };
    res.forEach((it, ind) => {
      it.querySelectorAll("li>a").forEach(item => {
        let classobj = {
          name: '',
          id: '',
          type: ''
        };
        classobj.name = item.innerText.trim();
        classobj.id = item.getAttribute("href").split("lid=")[1].split("&t=")[0];
        classobj.type = item.getAttribute("href").split("lid=")[1].split("&t=")[1];
        if (classobj.type === "hw") {
          obj["hwt"].push(classobj);
        } else if (classobj.type === "info") {
          obj["notify"].push(classobj);
        }
      });
    });
    return obj;
  }).catch(error => {
    console.log(error);
  });
  return remindInfo;
}
async function getLessonInfo() {
  let lessonInfo = await send_request(lessonUrl, obj => {
    return obj.querySelectorAll("tbody>tr");
  }).then(res => {
    let arry = [];
    res.forEach((item, index) => {
      if (index === 0) return;
      let obj = {
        id: '',
        name: '',
        academy: '',
        teacher: ''
      };
      obj.id = item.firstElementChild.firstElementChild.getAttribute("href").split("lid=")[1];
      obj.name = item.firstElementChild.firstElementChild.innerText.split("\n")[0].trim();
      obj.academy = item.children[1].innerText.split("\n")[0];
      obj.teacher = item.children[2].innerText.split("\n")[0];
      arry.push(obj);
    });
    return arry;
  }).catch(error => {
    console.log(error);
  });
  return lessonInfo;
}
async function getHwtInfo() {
  let hwtInfo = await send_request(hwtListUrl, obj => {
    return obj.querySelectorAll("tbody>tr");
  }).then(res => {
    let arry = [];
    res.forEach((item, index) => {
      if (index === 0) return;
      let obj = {
        hwtID: '',
        hwtName: '',
        date: '',
        DateObj: '',
        remainTime: '',
        able: false
      };
      obj.hwtID = item.querySelectorAll(".infolist")[0].getAttribute("href").split("hwtid=")[1];
      obj.hwtName = item.querySelectorAll(".infolist")[0].innerText.split("\n")[0].trim();
      obj.date = item.children[1].innerText.split("\n")[0];
      obj.DateObj = new Date(`${obj.date.split("年")[0]},${obj.date.split("年")[1].split("月")[0]},${obj.date.split("年")[1].split("月")[1].split("日")[0]},23:59:59`);
      obj.remainTime = parseInt((obj.DateObj.valueOf() - new Date().valueOf()) / (24 * 60 * 60 * 1000));
      obj.able = item.children[5].childElementCount !== 0;
      arry.push(obj);
    });
    return arry;
  }).catch(error => {
    console.log(error);
  });
  return hwtInfo;
}
/* harmony default export */ const get_info = ({
  getUserInfo: getUserInfo,
  getRemindInfo: getRemindInfo,
  getLessonInfo: getLessonInfo,
  getHwtInfo: getHwtInfo
});
;// CONCATENATED MODULE: ./src/functions/get-homework-more-info.js
const get_homework_more_info_baseUrl = `http://cc.bjtu.edu.cn:81/meol`;
const courseUrl = `${get_homework_more_info_baseUrl}/jpk/course/layout/newpage/index.jsp?courseId=`;
const taskanswerUrl = `${get_homework_more_info_baseUrl}/common/hw/student/taskanswer.jsp?hwtid=`; // 查看批阅结果taskanswer.jsp
const writeUrl = `${get_homework_more_info_baseUrl}/common/hw/student/write.jsp?hwtid=`; // 查看作业任务write.jsp
const onceSubmitInfo = "该作业不允许重复提交,确定提交作业吗?";
const hadSubmitTag =
/*html*/
`<a class="icon" title="已提交" style="cursor:default;"> 🟢 </a>`;
const notSubmitTag =
/*html*/
`<a class="icon" title="未提交" style="cursor:default;"> 🟠 </a>`;
const onceSubmitTag =
/*html*/
`<a class="icon" title="只允许提交一次" style="cursor:default;"> 🔒 </a>`;
const freeSubmitTag =
/*html*/
`<a class="icon" title="允许重复提交" style="cursor:default;"> 🔄 </a>`;
async function initializate(courseID) {
  let inPage = false;
  if (location.href.indexOf("hwtask.jsp") === -1) {
    inPage = false;
  } else {
    inPage = true;
  }
  if (inPage) {
    // dont initializate, get info directly
    let a = await appendSubmitInfo();
    let b = await appendOnceInfo();
    js_PopNotify.show(`成功`, "已加载作业信息", "success", 2.5);
  } else {
    // initializate, dont get info
    if (courseID === undefined) return;
    let init = await send_request(courseUrl + courseID, obj => {
      return obj; // nothing todo
    }).catch(error => {
      console.log(error);
    });
    return init;
  }
}
async function appendSubmitInfo() {
  let hwtList = await get_info.getHwtInfo();
  for (let it of hwtList) {
    // cant await in forEach
    // if (it.able == false) return
    let append = await send_request(taskanswerUrl + it.hwtID, obj => {
      return $(obj).find("tr:contains('回答的内容')+tr>td>input").length;
    }).then(res => {
      if (res === 1) {
        $(document.querySelectorAll(".infolist[href='hwtask.view.jsp?hwtid=" + it.hwtID + "']")[0]).before(hadSubmitTag);
      } else {
        $(document.querySelectorAll(".infolist[href='hwtask.view.jsp?hwtid=" + it.hwtID + "']")[0]).before(notSubmitTag);
      }
    }).catch(error => {
      console.log(error);
    }); // return append
  }
}
async function appendOnceInfo() {
  let hwtList = await get_info.getHwtInfo();
  for (let it of hwtList) {
    // cant await in forEach
    if (it.able == false) return;
    let append = await send_request(writeUrl + it.hwtID, obj => {
      return obj.querySelectorAll("script");
    }).then(res => {
      if (res[7].innerText.indexOf(onceSubmitInfo) !== -1) {
        $(document.querySelectorAll(".infolist[href='hwtask.view.jsp?hwtid=" + it.hwtID + "']")[0]).before(onceSubmitTag);
      } else {
        $(document.querySelectorAll(".infolist[href='hwtask.view.jsp?hwtid=" + it.hwtID + "']")[0]).before(freeSubmitTag);
      }
    }).catch(error => {
      console.log(error);
    }); // return append
  }
}
/* harmony default export */ const get_homework_more_info = (initializate);
// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/style/css/reminderCSS.css
var reminderCSS = __webpack_require__("./node_modules/css-loader/dist/cjs.js!./src/style/css/reminderCSS.css");
;// CONCATENATED MODULE: ./src/style/css/reminderCSS.css
var reminderCSS_options = {};
reminderCSS_options.styleTagTransform = (styleTagTransform_default());
reminderCSS_options.setAttributes = (setAttributesWithoutAttributes_default());
      reminderCSS_options.insert = insertBySelector_default().bind(null, "head");
reminderCSS_options.domAPI = (styleDomAPI_default());
reminderCSS_options.insertStyleElement = (insertStyleElement_default());
var reminderCSS_update = injectStylesIntoStyleTag_default()(reminderCSS/* default */.Z, reminderCSS_options);
       /* harmony default export */ const css_reminderCSS = (reminderCSS/* default */.Z && reminderCSS/* default.locals */.Z.locals ? reminderCSS/* default.locals */.Z.locals : undefined);
;// CONCATENATED MODULE: ./src/functions/get-reminder.js
const get_reminder_baseUrl = `http://cc.bjtu.edu.cn:81/meol`;
const hwtUrl = `${get_reminder_baseUrl}/common/hw/student/write.jsp?hwtid=`;
const hwtTagTemplate =
/*html*/
`<a onclick="return" class="hwtName"></a><span class="date"></span>`;
function sortByTime() {
  let liList = $(".listwrap>.list>ul>li");
  let remainList = [];
  for (let i = 0; i < liList.length; i++) {
    remainList.push($(liList[i]).find(".date").attr("remain"));
  }
  remainList.sort((a, b) => {
    return a - b;
  });
  remainList.forEach((it, ind) => {
    for (let i = 0; i < liList.length; i++) {
      if ($(liList[i]).find(".date").attr("remain") === it) {
        $(".listwrap>.list>ul").append(liList[i]);
      }
    }
  });
}
async function createHwtList(remindInfo) {
  $(".list>ul").empty();
  for (let courseItem of remindInfo.hwt) {
    // Async Trap: cannot async in forEach
    await get_homework_more_info(courseItem.id).then(async () => {
      await get_info.getHwtInfo().then(hwtList => {
        let ableHwtList = hwtList.filter(hwtItem => {
          return hwtItem.able == true && hwtItem.remainTime <= 15;
        });
        for (let hwtItem of ableHwtList) {
          let hwtTag = document.createElement("li");
          hwtTag.innerHTML = hwtTagTemplate;
          let Info = ``;
          if (hwtItem.remainTime === 0) {
            Info = `今日截止`;
          } else {
            Info = `[还有${hwtItem.remainTime}天截止]`;
          }
          $(hwtTag).find(".hwtName").text(`${Info} ${hwtItem.hwtName} [${courseItem.name}]`);
          $(hwtTag).find(".date").text(hwtItem.DateObj.toLocaleDateString());
          $(hwtTag).find(".date").attr("remain", `${hwtItem.remainTime}`);
          if (hwtItem.remainTime <= 3) {
            $(hwtTag).find("a").addClass("top");
          }
          $(hwtTag).click(() => {
            get_homework_more_info(courseItem.id).then(() => {
              window.open(`${hwtUrl}${hwtItem.hwtID}`, "_parent");
            });
          });
          $(".list>ul").append(hwtTag);
        }
      });
    });
  }
}
async function drawRed(remindInfo) {
  remindInfo.hwt.forEach(courseItem => {
    $(".courseList").find("a[href*='" + courseItem.id + "']").css("color", "#C00");
  });
}
async function getReminderNew() {
  if (location.href.indexOf('welcomepage/student/index.jsp') == -1) return;
  let remindInfo = await get_info.getRemindInfo().then(res => {
    createHwtList(res).then(() => {
      js_PopNotify.show("成功", "作业列表加载完毕", "success", 2.5);
      sortByTime();
    });
    drawRed(res);
  });
}
/* harmony default export */ const get_reminder = (getReminderNew);
;// CONCATENATED MODULE: ./src/functions/get-resources.js
function getResources() {
  if (location.href.indexOf('listview.jsp?') == -1) {
    return;
  }
  let fileLinks = [];
  for (let i = 0; i < $('tbody>tr').length; i++) {
    let href = $($('tbody>tr')[i]).find('td>a').attr('href');
    if (href && href.indexOf('listview.jsp?') != 0) {
      fileLinks.push('http://cc.bjtu.edu.cn:81/meol/common/script/download.jsp' + $($('tbody>tr')[i]).find('td>a').attr('href').split('download_preview.jsp')[1]);
    }
  }
  $('.subtitle').append(
  /*html*/
  `<a id="downloadAll" style="cursor: pointer">下载此目录下所有文件</a>`);
  $('#downloadAll').click(() => {
    if (fileLinks.length) {
      fileLinks.forEach(value => {
        window.open(value);
      });
    } else js_PopNotify.show("警告", "当前目录下无文件", "warn");
  });
}
/* harmony default export */ const get_resources = (getResources);
;// CONCATENATED MODULE: ./src/functions/only-once-commit.js
function judgeOnceSubmit() {
  if (location.href.indexOf("write.jsp") === -1) return;
  if ($("script:contains('该作业不允许重复提交,确定提交作业吗?')").length != 0) {
    let newspan = '<span>(只能提交一次)</span>';
    $('span:contains("查看作业任务")').after(newspan);
    js_PopNotify.show("警告", "注意,此作业只能提交一次,请检查无误后再提交!", "warn");
    return 1;
  } else return 0;
}
/* harmony default export */ const only_once_commit = (judgeOnceSubmit);
;// CONCATENATED MODULE: ./src/functions/check-update.js
const {
  version
} = __webpack_require__("./package.json");
async function getLastestVersion() {
  const GreasyUrl = "https://greasyfork.org/zh-CN/scripts/432056";
  let res = send_request(GreasyUrl, obj => {
    return obj.querySelectorAll('.script-show-version>span')[1].textContent;
  });
  return res;
}
async function checkVersion() {
  if (location.href.indexOf('welcomepage/student/index.jsp') == -1) {
    // 只发welcome页的一次请求
    return;
  }
  getLastestVersion().then(res => {
    let weightLastest = 0;
    let weightNow = 0;
    res.split('.').reverse().forEach((value, index) => {
      weightLastest += (index + 1) * value;
    });
    version.split('.').reverse().forEach((value, index) => {
      weightNow += (index + 1) * value;
    });
    if (weightLastest > weightNow) {
      console.log('need update');
      js_PopNotify.show(`有新版本[${res}]`, "点击安装新版本", "success", "90", () => {
        window.open(`https://greasyfork.org/zh-CN/scripts/432056`);
      });
    } else console.log('version Checked');
  });
}
/* harmony default export */ const check_update = (checkVersion);
;// CONCATENATED MODULE: ./src/index.js
append_tags();
file_uploader();
get_reminder();
get_resources();
get_homework_more_info();
only_once_commit();
check_update();
})();
/******/ })()
;